]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ks/t7508-indent-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 10 Jul 2017 20:59:03 +0000 (13:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Jul 2017 20:59:03 +0000 (13:59 -0700)
Cosmetic update to a test.

* ks/t7508-indent-fix:
  t7508: fix a broken indentation

810 files changed:
.gitattributes
.github/CONTRIBUTING.md [new file with mode: 0644]
.github/PULL_REQUEST_TEMPLATE.md [new file with mode: 0644]
.gitignore
.mailmap
.travis.yml
Documentation/CodingGuidelines
Documentation/Makefile
Documentation/RelNotes/2.11.0.txt [new file with mode: 0644]
Documentation/RelNotes/2.11.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.11.2.txt [new file with mode: 0644]
Documentation/RelNotes/2.12.0.txt [new file with mode: 0644]
Documentation/RelNotes/2.12.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.12.2.txt [new file with mode: 0644]
Documentation/RelNotes/2.12.3.txt [new file with mode: 0644]
Documentation/RelNotes/2.13.0.txt [new file with mode: 0644]
Documentation/RelNotes/2.13.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.13.2.txt [new file with mode: 0644]
Documentation/SubmittingPatches
Documentation/asciidoctor-extensions.rb [new file with mode: 0644]
Documentation/blame-options.txt
Documentation/cat-texi.perl
Documentation/config.txt
Documentation/date-formats.txt
Documentation/diff-config.txt
Documentation/diff-format.txt
Documentation/diff-generate-patch.txt
Documentation/diff-heuristic-options.txt [new file with mode: 0644]
Documentation/diff-options.txt
Documentation/fetch-options.txt
Documentation/git-annotate.txt
Documentation/git-apply.txt
Documentation/git-archimport.txt
Documentation/git-bisect-lk2009.txt
Documentation/git-bisect.txt
Documentation/git-blame.txt
Documentation/git-branch.txt
Documentation/git-cat-file.txt
Documentation/git-check-ref-format.txt
Documentation/git-checkout.txt
Documentation/git-clone.txt
Documentation/git-commit.txt
Documentation/git-count-objects.txt
Documentation/git-credential-cache.txt
Documentation/git-describe.txt
Documentation/git-diff.txt
Documentation/git-difftool.txt
Documentation/git-fetch-pack.txt
Documentation/git-fetch.txt
Documentation/git-filter-branch.txt
Documentation/git-for-each-ref.txt
Documentation/git-format-patch.txt
Documentation/git-gc.txt
Documentation/git-grep.txt
Documentation/git-gui.txt
Documentation/git-index-pack.txt
Documentation/git-init.txt
Documentation/git-interpret-trailers.txt
Documentation/git-ls-files.txt
Documentation/git-ls-tree.txt
Documentation/git-merge.txt
Documentation/git-mergetool.txt
Documentation/git-name-rev.txt
Documentation/git-p4.txt
Documentation/git-pull.txt
Documentation/git-push.txt
Documentation/git-read-tree.txt
Documentation/git-rebase.txt
Documentation/git-receive-pack.txt
Documentation/git-relink.txt [deleted file]
Documentation/git-reset.txt
Documentation/git-rev-parse.txt
Documentation/git-rm.txt
Documentation/git-send-email.txt
Documentation/git-send-pack.txt
Documentation/git-shortlog.txt
Documentation/git-stash.txt
Documentation/git-status.txt
Documentation/git-submodule.txt
Documentation/git-svn.txt
Documentation/git-tag.txt
Documentation/git-tools.txt
Documentation/git-unpack-objects.txt
Documentation/git-update-index.txt
Documentation/git-verify-tag.txt
Documentation/git-worktree.txt
Documentation/git.txt
Documentation/gitattributes.txt
Documentation/gitcore-tutorial.txt
Documentation/gitcredentials.txt
Documentation/gitcvs-migration.txt
Documentation/gitdiffcore.txt
Documentation/giteveryday.txt
Documentation/gitglossary.txt
Documentation/githooks.txt
Documentation/gitk.txt
Documentation/gitmodules.txt
Documentation/gitnamespaces.txt
Documentation/gitremote-helpers.txt
Documentation/gitrepository-layout.txt
Documentation/gittutorial-2.txt
Documentation/gittutorial.txt
Documentation/gitweb.conf.txt
Documentation/gitweb.txt
Documentation/gitworkflows.txt
Documentation/glossary-content.txt
Documentation/howto/rebuild-from-update-hook.txt
Documentation/pretty-formats.txt
Documentation/rev-list-options.txt
Documentation/revisions.txt
Documentation/technical/api-directory-listing.txt
Documentation/technical/api-gitattributes.txt
Documentation/technical/api-hashmap.txt
Documentation/technical/api-in-core-index.txt [deleted file]
Documentation/technical/api-oid-array.txt [moved from Documentation/technical/api-sha1-array.txt with 51% similarity]
Documentation/technical/api-parse-options.txt
Documentation/technical/api-setup.txt
Documentation/technical/api-submodule-config.txt
Documentation/technical/pack-protocol.txt
Documentation/technical/protocol-capabilities.txt
Documentation/texi.xsl [new file with mode: 0644]
Documentation/transfer-data-leaks.txt [new file with mode: 0644]
Documentation/user-manual.txt
GIT-VERSION-GEN
Makefile
README.md
RelNotes
abspath.c
alias.c
apply.c [new file with mode: 0644]
apply.h [new file with mode: 0644]
archive-zip.c
archive.c
archive.h
attr.c
attr.h
bisect.c
branch.c
branch.h
builtin.h
builtin/add.c
builtin/am.c
builtin/apply.c
builtin/archive.c
builtin/blame.c
builtin/branch.c
builtin/bundle.c
builtin/cat-file.c
builtin/check-attr.c
builtin/checkout-index.c
builtin/checkout.c
builtin/clean.c
builtin/clone.c
builtin/commit-tree.c
builtin/commit.c
builtin/config.c
builtin/count-objects.c
builtin/describe.c
builtin/diff-tree.c
builtin/diff.c
builtin/difftool.c [new file with mode: 0644]
builtin/fast-export.c
builtin/fetch-pack.c
builtin/fetch.c
builtin/fmt-merge-msg.c
builtin/for-each-ref.c
builtin/fsck.c
builtin/gc.c
builtin/grep.c
builtin/hash-object.c
builtin/help.c
builtin/index-pack.c
builtin/init-db.c
builtin/log.c
builtin/ls-files.c
builtin/ls-remote.c
builtin/ls-tree.c
builtin/mailinfo.c
builtin/mailsplit.c
builtin/merge-base.c
builtin/merge-file.c
builtin/merge-index.c
builtin/merge-recursive.c
builtin/merge.c
builtin/mktree.c
builtin/mv.c
builtin/name-rev.c
builtin/notes.c
builtin/pack-objects.c
builtin/pack-redundant.c
builtin/pack-refs.c
builtin/patch-id.c
builtin/prune-packed.c
builtin/prune.c
builtin/pull.c
builtin/push.c
builtin/read-tree.c
builtin/rebase--helper.c [new file with mode: 0644]
builtin/receive-pack.c
builtin/reflog.c
builtin/remote-ext.c
builtin/remote.c
builtin/repack.c
builtin/replace.c
builtin/reset.c
builtin/rev-list.c
builtin/rev-parse.c
builtin/revert.c
builtin/rm.c
builtin/send-pack.c
builtin/shortlog.c
builtin/show-branch.c
builtin/show-ref.c
builtin/stripspace.c
builtin/submodule--helper.c
builtin/symbolic-ref.c
builtin/tag.c
builtin/unpack-objects.c
builtin/update-index.c
builtin/update-ref.c
builtin/upload-archive.c
builtin/verify-tag.c
builtin/worktree.c
bulk-checkin.c
cache-tree.c
cache.h
ci/run-linux32-build.sh [new file with mode: 0755]
ci/run-windows-build.sh [new file with mode: 0755]
ci/test-documentation.sh
color.c
combine-diff.c
command-list.txt
commit.c
commit.h
common-main.c
compat/mingw.c
compat/mingw.h
compat/qsort_s.c [new file with mode: 0644]
compat/winansi.c
config.c
config.mak.uname
configure.ac
connect.c
connected.c
connected.h
contrib/coccinelle/array.cocci
contrib/coccinelle/free.cocci
contrib/coccinelle/qsort.cocci [new file with mode: 0644]
contrib/coccinelle/strbuf.cocci
contrib/coccinelle/swap.cocci [new file with mode: 0644]
contrib/coccinelle/xstrdup_or_null.cocci
contrib/completion/.gitattributes [new file with mode: 0644]
contrib/completion/git-completion.bash
contrib/completion/git-completion.zsh
contrib/completion/git-prompt.sh
contrib/convert-objects/convert-objects.c [deleted file]
contrib/convert-objects/git-convert-objects.txt [deleted file]
contrib/credential/libsecret/Makefile [new file with mode: 0644]
contrib/credential/libsecret/git-credential-libsecret.c [new file with mode: 0644]
contrib/diff-highlight/.gitignore [new file with mode: 0644]
contrib/diff-highlight/DiffHighlight.pm [moved from contrib/diff-highlight/diff-highlight with 91% similarity, mode: 0644]
contrib/diff-highlight/Makefile
contrib/diff-highlight/README
contrib/diff-highlight/diff-highlight.perl [new file with mode: 0644]
contrib/examples/git-difftool.perl [moved from git-difftool.perl with 86% similarity]
contrib/git-resurrect.sh
contrib/gitview/gitview [deleted file]
contrib/gitview/gitview.txt [deleted file]
contrib/long-running-filter/example.pl [new file with mode: 0755]
contrib/persistent-https/README
contrib/remote-helpers/git-remote-bzr
contrib/remote-helpers/git-remote-hg
contrib/update-unicode/.gitignore [new file with mode: 0644]
contrib/update-unicode/README [new file with mode: 0644]
contrib/update-unicode/update_unicode.sh [new file with mode: 0755]
contrib/workdir/.gitattributes [new file with mode: 0644]
convert.c
credential-cache--daemon.c
credential-cache.c
credential-store.c
daemon.c
diff-lib.c
diff-no-index.c
diff.c
diff.h
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
dir.c
dir.h
entry.c
environment.c
ewah/ewah_io.c
exec_cmd.c
fast-import.c
fetch-pack.c
fetch-pack.h
fsck.c
fsck.h
git-add--interactive.perl
git-compat-util.h
git-filter-branch.sh
git-gui/.gitattributes
git-gui/GIT-VERSION-GEN
git-gui/Makefile
git-gui/git-gui.sh
git-gui/lib/blame.tcl
git-gui/lib/branch_checkout.tcl
git-gui/lib/branch_create.tcl
git-gui/lib/branch_delete.tcl
git-gui/lib/branch_rename.tcl
git-gui/lib/browser.tcl
git-gui/lib/commit.tcl
git-gui/lib/database.tcl
git-gui/lib/diff.tcl
git-gui/lib/error.tcl
git-gui/lib/index.tcl
git-gui/lib/merge.tcl
git-gui/lib/option.tcl
git-gui/lib/remote.tcl
git-gui/lib/remote_add.tcl
git-gui/lib/remote_branch_delete.tcl
git-gui/lib/shortcut.tcl
git-gui/lib/themed.tcl
git-gui/lib/tools.tcl
git-gui/lib/tools_dlg.tcl
git-gui/lib/transport.tcl
git-gui/po/bg.po
git-gui/po/glossary/pt_pt.po [new file with mode: 0644]
git-gui/po/pt_pt.po [new file with mode: 0644]
git-gui/po/ru.po
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py
git-rebase--interactive.sh
git-rebase.sh
git-relink.perl [deleted file]
git-request-pull.sh
git-send-email.perl
git-sh-setup.sh
git-stash.sh
git-submodule.sh
git-svn.perl
git.c
gitk-git/Makefile
gitk-git/gitk
gitk-git/po/bg.po
gitk-git/po/ca.po
gitk-git/po/de.po
gitk-git/po/es.po
gitk-git/po/fr.po
gitk-git/po/hu.po
gitk-git/po/it.po
gitk-git/po/ja.po
gitk-git/po/pt_br.po
gitk-git/po/pt_pt.po [new file with mode: 0644]
gitk-git/po/ru.po
gitk-git/po/sv.po
gitk-git/po/vi.po
gitweb/gitweb.perl
gpg-interface.c
gpg-interface.h
graph.c
graph.h
grep.c
grep.h
hash.h [new file with mode: 0644]
hashmap.c
hashmap.h
help.c
hex.c
http-backend.c
http-push.c
http-walker.c
http.c
http.h
ident.c
imap-send.c
line-log.c
line-range.c
ll-merge.c
lockfile.c
lockfile.h
log-tree.c
log-tree.h
mailinfo.c
mailinfo.h
merge-recursive.c
merge.c
mergetools/araxis
mergetools/bc
mergetools/codecompare
mergetools/deltawalker
mergetools/diffmerge
mergetools/diffuse
mergetools/ecmerge
mergetools/emerge
mergetools/examdiff
mergetools/kdiff3
mergetools/kompare
mergetools/meld
mergetools/opendiff
mergetools/p4merge
mergetools/tkdiff
mergetools/tortoisemerge
mergetools/vimdiff
mergetools/winmerge
mergetools/xxdiff
name-hash.c
notes-merge.c
notes-utils.c
notes.c
object.c
object.h
oidset.c [new file with mode: 0644]
oidset.h [new file with mode: 0644]
pack-bitmap-write.c
pack-bitmap.c
pack-check.c
pack-objects.h
pack-revindex.c
pack-write.c
pack.h
pager.c
parse-options-cb.c
parse-options.c
parse-options.h
patch-ids.c
patch-ids.h
path.c
pathspec.c
pathspec.h
perl/Git.pm
perl/Git/I18N.pm
perl/Git/SVN.pm
perl/Git/SVN/Editor.pm
perl/Git/SVN/Fetcher.pm
perl/Git/SVN/Migration.pm
perl/Git/SVN/Ra.pm
pkt-line.c
pkt-line.h
po/TEAMS
po/bg.po
po/ca.po
po/de.po
po/fr.po
po/git.pot
po/ko.po
po/pt_PT.po
po/ru.po
po/sv.po
po/vi.po
po/zh_CN.po
preload-index.c
pretty.c
prio-queue.c
progress.c
reachable.c
read-cache.c
ref-filter.c
ref-filter.h
reflog-walk.c
refs.c
refs.h
refs/files-backend.c
refs/ref-cache.c [new file with mode: 0644]
refs/ref-cache.h [new file with mode: 0644]
refs/refs-internal.h
remote-curl.c
remote.c
remote.h
rerere.c
resolve-undo.c
revision.c
revision.h
run-command.c
run-command.h
send-pack.c
send-pack.h
sequencer.c
sequencer.h
server-info.c
setup.c
sh-i18n--envsubst.c
sha1-array.c
sha1-array.h
sha1_file.c
sha1_name.c
sha1dc/.gitattributes [new file with mode: 0644]
sha1dc/LICENSE.txt [new file with mode: 0644]
sha1dc/sha1.c [new file with mode: 0644]
sha1dc/sha1.h [new file with mode: 0644]
sha1dc/ubc_check.c [new file with mode: 0644]
sha1dc/ubc_check.h [new file with mode: 0644]
sha1dc_git.c [new file with mode: 0644]
sha1dc_git.h [new file with mode: 0644]
shallow.c
shortlog.h
split-index.c
split-index.h
strbuf.c
strbuf.h
streaming.c
streaming.h
string-list.c
string-list.h
submodule-config.c
submodule-config.h
submodule.c
submodule.h
t/.gitattributes
t/Makefile
t/README
t/gitweb-lib.sh
t/helper/.gitignore
t/helper/test-config.c
t/helper/test-dump-cache-tree.c
t/helper/test-dump-split-index.c
t/helper/test-dump-untracked-cache.c
t/helper/test-lazy-init-name-hash.c [new file with mode: 0644]
t/helper/test-online-cpus.c [new file with mode: 0644]
t/helper/test-read-cache.c
t/helper/test-ref-store.c [new file with mode: 0644]
t/helper/test-scrap-cache-tree.c
t/helper/test-sha1-array.c
t/helper/test-strcmp-offset.c [new file with mode: 0644]
t/helper/test-string-list.c
t/interop/.gitignore [new file with mode: 0644]
t/interop/Makefile [new file with mode: 0644]
t/interop/README [new file with mode: 0644]
t/interop/i0000-basic.sh [new file with mode: 0755]
t/interop/i5500-git-daemon.sh [new file with mode: 0755]
t/interop/interop-lib.sh [new file with mode: 0644]
t/lib-git-daemon.sh
t/lib-httpd/apache.conf
t/lib-proto-disable.sh
t/lib-submodule-update.sh
t/perf/aggregate.perl
t/perf/p0000-perf-lib-sanity.sh
t/perf/p0001-rev-list.sh
t/perf/p0003-delta-base-cache.sh [new file with mode: 0755]
t/perf/p0004-lazy-init-name-hash.sh [new file with mode: 0755]
t/perf/p0005-status.sh [new file with mode: 0755]
t/perf/p0006-read-tree-checkout.sh [new file with mode: 0755]
t/perf/p0071-sort.sh [new file with mode: 0755]
t/perf/p5302-pack-index.sh
t/perf/p5310-pack-bitmaps.sh
t/perf/p7000-filter-branch.sh
t/perf/perf-lib.sh
t/perf/repos/.gitignore [new file with mode: 0644]
t/perf/repos/inflate-repo.sh [new file with mode: 0755]
t/perf/repos/many-files.sh [new file with mode: 0755]
t/perf/run
t/t0001-init.sh
t/t0003-attributes.sh
t/t0012-help.sh [new file with mode: 0755]
t/t0013-sha1dc.sh [new file with mode: 0755]
t/t0013/shattered-1.pdf [new file with mode: 0644]
t/t0020-crlf.sh
t/t0021-conversion.sh
t/t0021/rot13-filter.pl [new file with mode: 0644]
t/t0025-crlf-auto.sh [deleted file]
t/t0027-auto-crlf.sh
t/t0030-stripspace.sh
t/t0060-path-utils.sh
t/t0061-run-command.sh
t/t0065-strcmp-offset.sh [new file with mode: 0755]
t/t0100-previous.sh
t/t0202/test.pl
t/t0203-gettext-setlocale-sanity.sh
t/t0301-credential-cache.sh
t/t1000-read-tree-m-3way.sh
t/t1001-read-tree-m-2way.sh
t/t1007-hash-object.sh
t/t1013-read-tree-submodule.sh
t/t1050-large.sh
t/t1060-object-corruption.sh
t/t1300-repo-config.sh
t/t1301-shared-repo.sh
t/t1302-repo-version.sh
t/t1305-config-include.sh
t/t1308-config-set.sh
t/t1309-early-config.sh [new file with mode: 0755]
t/t1400-update-ref.sh
t/t1403-show-ref.sh
t/t1405-main-ref-store.sh [new file with mode: 0755]
t/t1406-submodule-ref-store.sh [new file with mode: 0755]
t/t1430-bad-ref-name.sh
t/t1450-fsck.sh
t/t1500-rev-parse.sh
t/t1501-work-tree.sh
t/t1507-rev-parse-upstream.sh
t/t1512-rev-parse-disambiguation.sh
t/t1514-rev-parse-push.sh
t/t1700-split-index.sh
t/t2013-checkout-submodule.sh
t/t2025-worktree-add.sh
t/t2027-worktree-list.sh
t/t2203-add-intent.sh
t/t3007-ls-files-recurse-submodules.sh [new file with mode: 0755]
t/t3008-ls-files-lazy-init-name-hash.sh [new file with mode: 0755]
t/t3030-merge-recursive.sh
t/t3070-wildmatch.sh
t/t3200-branch.sh
t/t3201-branch-contains.sh
t/t3203-branch-output.sh
t/t3204-branch-name-interpretation.sh [new file with mode: 0755]
t/t3310-notes-merge-manual-resolve.sh
t/t3320-notes-merge-worktrees.sh
t/t3404-rebase-interactive.sh
t/t3407-rebase-abort.sh
t/t3415-rebase-autosquash.sh
t/t3420-rebase-autostash.sh
t/t3426-rebase-submodule.sh
t/t3428-rebase-signoff.sh [new file with mode: 0755]
t/t3429-rebase-edit-todo.sh [new file with mode: 0755]
t/t3501-revert-cherry-pick.sh
t/t3502-cherry-pick-merge.sh
t/t3510-cherry-pick-sequence.sh
t/t3511-cherry-pick-x.sh
t/t3600-rm.sh
t/t3700-add.sh
t/t3701-add-interactive.sh
t/t3900-i18n-commit.sh
t/t3901-i18n-patch.sh
t/t3901/8859-1.txt [moved from t/t3901-8859-1.txt with 100% similarity]
t/t3901/utf8.txt [moved from t/t3901-utf8.txt with 100% similarity]
t/t3903-stash.sh
t/t3904-stash-patch.sh
t/t3905-stash-include-untracked.sh
t/t4005-diff-rename-2.sh
t/t4012-diff-binary.sh
t/t4013-diff-various.sh
t/t4013/diff.diff_--line-prefix=abc_master_master^_side [new file with mode: 0644]
t/t4013/diff.diff_--line-prefix_--cached_--_file0 [new file with mode: 0644]
t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir [new file with mode: 0644]
t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir [new file with mode: 0644]
t/t4013/diff.diff_--no-index_--raw_dir2_dir [new file with mode: 0644]
t/t4013/diff.diff_--raw_--abbrev=4_initial [new file with mode: 0644]
t/t4013/diff.diff_--raw_--no-abbrev_initial [new file with mode: 0644]
t/t4013/diff.diff_--raw_initial [new file with mode: 0644]
t/t4014-format-patch.sh
t/t4015-diff-whitespace.sh
t/t4021-format-patch-numbered.sh
t/t4026-color.sh
t/t4032-diff-inter-hunk-context.sh
t/t4035-diff-quiet.sh
t/t4038-diff-combined.sh
t/t4053-diff-no-index.sh
t/t4059-diff-submodule-not-initialized.sh [new file with mode: 0755]
t/t4060-diff-submodule-option-diff-format.sh [new file with mode: 0755]
t/t4061-diff-indent.sh [new file with mode: 0755]
t/t4062-diff-pickaxe.sh
t/t4063-diff-blobs.sh [new file with mode: 0755]
t/t4129-apply-samemode.sh
t/t4133-apply-filenames.sh
t/t4136-apply-check.sh
t/t4150-am.sh
t/t4201-shortlog.sh
t/t4202-log.sh
t/t4204-patch-id.sh
t/t4205-log-pretty-formats.sh
t/t4211-line-log.sh
t/t4254-am-corrupt.sh
t/t5000-tar-tree.sh
t/t5003-archive-zip.sh
t/t5100-mailinfo.sh
t/t5100/info0018 [new file with mode: 0644]
t/t5100/info0018--no-inbody-headers [new file with mode: 0644]
t/t5100/msg0015
t/t5100/msg0018 [new file with mode: 0644]
t/t5100/msg0018--no-inbody-headers [new file with mode: 0644]
t/t5100/patch0018 [new file with mode: 0644]
t/t5100/patch0018--no-inbody-headers [new file with mode: 0644]
t/t5100/sample.mbox
t/t5300-pack-object.sh
t/t5310-pack-bitmaps.sh
t/t5313-pack-bounds-checks.sh
t/t5314-pack-cycle-detection.sh [new file with mode: 0755]
t/t5315-pack-objects-compression.sh [new file with mode: 0755]
t/t5316-pack-delta-depth.sh [new file with mode: 0755]
t/t5400-send-pack.sh
t/t5500-fetch-pack.sh
t/t5504-fetch-receive-strict.sh
t/t5505-remote.sh
t/t5509-fetch-push-namespaces.sh
t/t5512-ls-remote.sh
t/t5516-fetch-push.sh
t/t5520-pull.sh
t/t5528-push-default.sh
t/t5531-deep-submodule-push.sh
t/t5533-push-cas.sh
t/t5534-push-signed.sh
t/t5539-fetch-http-shallow.sh
t/t5545-push-options.sh
t/t5546-receive-limits.sh [new file with mode: 0755]
t/t5547-push-quarantine.sh [new file with mode: 0755]
t/t5550-http-fetch-dumb.sh
t/t5551-http-fetch-smart.sh
t/t5580-clone-push-unc.sh [new file with mode: 0755]
t/t5601-clone.sh
t/t5611-clone-config.sh
t/t5613-info-alternate.sh
t/t5615-alternate-env.sh [new file with mode: 0755]
t/t5802-connect-helper.sh
t/t5812-proto-disable-http.sh
t/t6000-rev-list-misc.sh
t/t6007-rev-list-cherry-pick-file.sh
t/t6030-bisect-porcelain.sh
t/t6040-tracking-info.sh
t/t6045-merge-rename-delete.sh [new file with mode: 0755]
t/t6101-rev-parse-parents.sh
t/t6120-describe.sh
t/t6132-pathspec-exclude.sh
t/t6134-pathspec-in-submodule.sh [new file with mode: 0755]
t/t6135-pathspec-with-attrs.sh [new file with mode: 0755]
t/t6300-for-each-ref.sh
t/t6302-for-each-ref-filter.sh
t/t6500-gc.sh
t/t6501-freshen-objects.sh
t/t7003-filter-branch.sh
t/t7004-tag.sh
t/t7006-pager.sh
t/t7030-verify-tag.sh
t/t7060-wtstatus.sh
t/t7061-wtstatus-ignore.sh
t/t7064-wtstatus-pv2.sh [new file with mode: 0755]
t/t7300-clean.sh
t/t7400-submodule-basic.sh
t/t7406-submodule-update.sh
t/t7408-submodule-reference.sh
t/t7411-submodule-config.sh
t/t7412-submodule-absorbgitdirs.sh [new file with mode: 0755]
t/t7413-submodule-is-active.sh [new file with mode: 0755]
t/t7501-commit.sh
t/t7504-commit-msg-hook.sh
t/t7506-status-submodule.sh
t/t7508-status.sh
t/t7509-commit.sh
t/t7510-signed-commit.sh
t/t7512-status-help.sh
t/t7513-interpret-trailers.sh
t/t7518-ident-corner-cases.sh [new file with mode: 0755]
t/t7600-merge.sh
t/t7609-merge-co-error-msgs.sh
t/t7610-mergetool.sh
t/t7800-difftool.sh
t/t7810-grep.sh
t/t7814-grep-recurse-submodules.sh [new file with mode: 0755]
t/t8002-blame.sh
t/t8003-blame-corner-cases.sh
t/t8010-cat-file-filters.sh [new file with mode: 0755]
t/t8011-blame-split-file.sh [new file with mode: 0755]
t/t9001-send-email.sh
t/t9100-git-svn-basic.sh
t/t9117-git-svn-init-clone.sh
t/t9200-git-cvsexportcommit.sh
t/t9301-fast-import-notes.sh
t/t9303-fast-import-compression.sh [new file with mode: 0755]
t/t9350-fast-export.sh
t/t9500-gitweb-standalone-no-errors.sh
t/t9600-cvsimport.sh
t/t9800-git-p4-basic.sh
t/t9806-git-p4-options.sh
t/t9807-git-p4-submit.sh
t/t9813-git-p4-preserve-users.sh
t/t9814-git-p4-rename.sh
t/t9822-git-p4-path-encoding.sh
t/t9824-git-p4-git-lfs.sh
t/t9830-git-p4-symlink-dir.sh [new file with mode: 0755]
t/t9902-completion.sh
t/test-lib-functions.sh
t/test-lib.sh
tag.c
tempfile.c
tmp-objdir.c [new file with mode: 0644]
tmp-objdir.h [new file with mode: 0644]
trailer.c
trailer.h
transport-helper.c
transport.c
transport.h
tree-walk.c
tree-walk.h
tree.c
unicode_width.h
unpack-trees.c
unpack-trees.h
update_unicode.sh [deleted file]
upload-pack.c
urlmatch.c
urlmatch.h
usage.c
userdiff.c
utf8.c
versioncmp.c
worktree.c
worktree.h
wrapper.c
write_or_die.c
ws.c
wt-status.c
wt-status.h
xdiff-interface.c
xdiff-interface.h
xdiff/xdiff.h
xdiff/xdiffi.c
xdiff/xemit.c
xdiff/xutils.c

index 320e33c327c6f597bcfd255b13876f21b0b2d8aa..8ce9c6b8888fe6c12949d30e3e8b461cb67bb43f 100644 (file)
@@ -1,3 +1,9 @@
 * whitespace=!indent,trail,space
 *.[ch] whitespace=indent,trail,space diff=cpp
-*.sh whitespace=indent,trail,space
+*.sh whitespace=indent,trail,space eol=lf
+*.perl eol=lf
+*.pm eol=lf
+/Documentation/git-*.txt eol=lf
+/command-list.txt eol=lf
+/GIT-VERSION-GEN eol=lf
+/mergetools/* eol=lf
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..64e605a
--- /dev/null
@@ -0,0 +1,19 @@
+## Contributing to Git
+
+Thanks for taking the time to contribute to Git! Please be advised that the
+Git community does not use github.com for their contributions. Instead, we use
+a mailing list (git@vger.kernel.org) for code submissions, code
+reviews, and bug reports.
+
+Nevertheless, you can use [submitGit](http://submitgit.herokuapp.com/) to
+conveniently send your Pull Requests commits to our mailing list.
+
+Please read ["A note from the maintainer"](https://git.kernel.org/pub/scm/git/git.git/plain/MaintNotes?h=todo)
+to learn how the Git project is managed, and how you can work with it.
+In addition, we highly recommend you to read [our submission guidelines](../Documentation/SubmittingPatches).
+
+If you prefer video, then [this talk](https://www.youtube.com/watch?v=Q7i_qQW__q4&feature=youtu.be&t=6m4s)
+might be useful to you as the presenter walks you through the contribution
+process by example.
+
+Your friendly Git community!
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644 (file)
index 0000000..adba13e
--- /dev/null
@@ -0,0 +1,7 @@
+Thanks for taking the time to contribute to Git! Please be advised that the
+Git community does not use github.com for their contributions. Instead, we use
+a mailing list (git@vger.kernel.org) for code submissions, code reviews, and
+bug reports. Nevertheless, you can use submitGit to conveniently send your Pull
+Requests commits to our mailing list.
+
+Please read the "guidelines for contributing" linked above!
index 05cb58a3d4ef47295fa8ef02add44a0f0dd90d1f..833ef3b0b783b8180d0dad1ce336713bddf09b26 100644 (file)
 /git-read-tree
 /git-rebase
 /git-rebase--am
+/git-rebase--helper
 /git-rebase--interactive
 /git-rebase--merge
 /git-receive-pack
 /git-reflog
-/git-relink
 /git-remote
 /git-remote-http
 /git-remote-https
 /config.mak.autogen
 /config.mak.append
 /configure
-/unicode
 /tags
 /TAGS
 /cscope*
index 9cc33e925de8adc562daf9b176135aba7b5e4d9b..ab85e0d16d6383b13954220a0b41202bd68d5d73 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -151,7 +151,8 @@ Matthias Kestenholz <matthias@spinlock.ch> <mk@spinlock.ch>
 Matthias Urlichs <matthias@urlichs.de> <smurf@kiste.(none)>
 Matthias Urlichs <matthias@urlichs.de> <smurf@smurf.noris.de>
 Michael Coleman <tutufan@gmail.com>
-Michael J Gruber <git@drmicha.warpmail.net> <michaeljgruber+gmane@fastmail.fm>
+Michael J Gruber <git@grubix.eu> <michaeljgruber+gmane@fastmail.fm>
+Michael J Gruber <git@grubix.eu> <git@drmicha.warpmail.net>
 Michael S. Tsirkin <mst@kernel.org> <mst@redhat.com>
 Michael S. Tsirkin <mst@kernel.org> <mst@mellanox.co.il>
 Michael S. Tsirkin <mst@kernel.org> <mst@dev.mellanox.co.il>
@@ -177,6 +178,7 @@ Paolo Bonzini <bonzini@gnu.org> <paolo.bonzini@lu.unisi.ch>
 Pascal Obry <pascal@obry.net> <pascal.obry@gmail.com>
 Pascal Obry <pascal@obry.net> <pascal.obry@wanadoo.fr>
 Pat Notz <patnotz@gmail.com> <pknotz@sandia.gov>
+Patrick Steinhardt <ps@pks.im> <patrick.steinhardt@elego.de>
 Paul Mackerras <paulus@samba.org> <paulus@dorrigo.(none)>
 Paul Mackerras <paulus@samba.org> <paulus@pogo.(none)>
 Peter Baumann <waste.manager@gmx.de> <Peter.B.Baumann@stud.informatik.uni-erlangen.de>
@@ -192,6 +194,8 @@ Philippe Bruhat <book@cpan.org>
 Ralf Thielow <ralf.thielow@gmail.com> <ralf.thielow@googlemail.com>
 Ramsay Jones <ramsay@ramsayjones.plus.com> <ramsay@ramsay1.demon.co.uk>
 René Scharfe <l.s.r@web.de> <rene.scharfe@lsrfire.ath.cx>
+Richard Hansen <rhansen@rhansen.org> <hansenr@google.com>
+Richard Hansen <rhansen@rhansen.org> <rhansen@bbn.com>
 Robert Fitzsimons <robfitz@273k.net>
 Robert Shearman <robertshearman@gmail.com> <rob@codeweavers.com>
 Robert Zeh <robert.a.zeh@gmail.com>
@@ -223,6 +227,7 @@ Steven Walter <stevenrwalter@gmail.com> <swalter@lexmark.com>
 Steven Walter <stevenrwalter@gmail.com> <swalter@lpdev.prtdev.lexmark.com>
 Sven Verdoolaege <skimo@kotnet.org> <Sven.Verdoolaege@cs.kuleuven.ac.be>
 Sven Verdoolaege <skimo@kotnet.org> <skimo@liacs.nl>
+SZEDER Gábor <szeder.dev@gmail.com> <szeder@ira.uka.de>
 Tay Ray Chuan <rctay89@gmail.com>
 Ted Percival <ted@midg3t.net> <ted.percival@quest.com>
 Theodore Ts'o <tytso@mit.edu>
index 0b2ea5c3e2daa057cb88763f1943f6a250d019d9..278943d14a244b6b748078ff9ee18a17f58e7b45 100644 (file)
@@ -27,8 +27,8 @@ env:
     # The Linux build installs the defined dependency versions below.
     # The OS X build installs the latest available versions. Keep that
     # in mind when you encounter a broken OS X build!
-    - LINUX_P4_VERSION="16.1"
-    - LINUX_GIT_LFS_VERSION="1.2.0"
+    - LINUX_P4_VERSION="16.2"
+    - LINUX_GIT_LFS_VERSION="1.5.2"
     - DEFAULT_TEST_TARGET=prove
     - GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save"
     - GIT_TEST_OPTS="--verbose-log"
@@ -39,16 +39,67 @@ env:
 
 matrix:
   include:
+    - env: GETTEXT_POISON=YesPlease
+      os: linux
+      compiler:
+      addons:
+      before_install:
+    - env: Windows
+      os: linux
+      compiler:
+      addons:
+      before_install:
+      before_script:
+      script:
+        - >
+          test "$TRAVIS_REPO_SLUG" != "git/git" ||
+          ci/run-windows-build.sh $TRAVIS_BRANCH $(git rev-parse HEAD)
+      after_failure:
+    - env: Linux32
+      os: linux
+      compiler:
+      services:
+        - docker
+      before_install:
+        - docker pull daald/ubuntu32:xenial
+      before_script:
+      script:
+        - >
+          docker run
+          --interactive
+          --env DEVELOPER
+          --env DEFAULT_TEST_TARGET
+          --env GIT_PROVE_OPTS
+          --env GIT_TEST_OPTS
+          --env GIT_TEST_CLONE_2GB
+          --volume "${PWD}:/usr/src/git"
+          daald/ubuntu32:xenial
+          /usr/src/git/ci/run-linux32-build.sh $(id -u $USER)
+        # Use the following command to debug the docker build locally:
+        # $ docker run -itv "${PWD}:/usr/src/git" --entrypoint /bin/bash daald/ubuntu32:xenial
+        # root@container:/# /usr/src/git/ci/run-linux32-build.sh
+    - env: Static Analysis
+      os: linux
+      compiler:
+      addons:
+        apt:
+          packages:
+          - coccinelle
+      before_install:
+      script:
+        # "before_script" that builds Git is inherited from base job
+        - make coccicheck
+      after_failure:
     - env: Documentation
       os: linux
-      compiler: clang
+      compiler:
       addons:
         apt:
           packages:
           - asciidoc
           - xmlto
       before_install:
-      before_script:
+      before_script: gem install asciidoctor
       script: ci/test-documentation.sh
       after_failure:
 
@@ -75,20 +126,12 @@ before_install:
       popd
       ;;
     osx)
-      brew_force_set_latest_binary_hash () {
-        FORMULA=$1
-        SHA=$(brew fetch --force $FORMULA 2>&1 | grep ^SHA256: | cut -d ' ' -f 2)
-        sed -E -i.bak "s/sha256 \"[0-9a-f]{64}\"/sha256 \"$SHA\"/g" \
-          "$(brew --repository homebrew/homebrew-binary)/$FORMULA.rb"
-      }
       brew update --quiet
-      brew tap homebrew/binary --quiet
-      brew_force_set_latest_binary_hash perforce
-      brew_force_set_latest_binary_hash perforce-server
       # Uncomment this if you want to run perf tests:
       # brew install gnu-time
-      brew install git-lfs perforce-server perforce gettext
+      brew install git-lfs gettext
       brew link --force gettext
+      brew install caskroom/cask/perforce
       ;;
     esac;
     echo "$(tput setaf 6)Perforce Server Version$(tput sgr0)";
@@ -97,12 +140,14 @@ before_install:
     p4 -V | grep Rev.;
     echo "$(tput setaf 6)Git-LFS Version$(tput sgr0)";
     git-lfs version;
-    mkdir -p $HOME/travis-cache;
-    ln -s $HOME/travis-cache/.prove t/.prove;
 
 before_script: make --jobs=2
 
-script: make --quiet test
+script:
+  - >
+    mkdir -p $HOME/travis-cache;
+    ln -s $HOME/travis-cache/.prove t/.prove;
+    make --quiet test;
 
 after_failure:
   - >
index 4cd95da6b1e436c8764d51f17ea0446ca3bad73d..c4cb5ff0d477938b8fd49749c3589c5afbb04221 100644 (file)
@@ -24,7 +24,7 @@ code.  For Git in general, a few rough rules are:
 
    "Once it _is_ in the tree, it's not really worth the patch noise to
    go and fix it up."
-   Cf. http://article.gmane.org/gmane.linux.kernel/943020
+   Cf. http://lkml.iu.edu/hypermail/linux/kernel/1001.3/01069.html
 
 Make your code readable and sensible, and don't try to be clever.
 
@@ -206,11 +206,38 @@ For C programs:
                x = 1;
        }
 
-   is frowned upon.  A gray area is when the statement extends
-   over a few lines, and/or you have a lengthy comment atop of
-   it.  Also, like in the Linux kernel, if there is a long list
-   of "else if" statements, it can make sense to add braces to
-   single line blocks.
+   is frowned upon. But there are a few exceptions:
+
+       - When the statement extends over a few lines (e.g., a while loop
+         with an embedded conditional, or a comment). E.g.:
+
+               while (foo) {
+                       if (x)
+                               one();
+                       else
+                               two();
+               }
+
+               if (foo) {
+                       /*
+                        * This one requires some explanation,
+                        * so we're better off with braces to make
+                        * it obvious that the indentation is correct.
+                        */
+                       doit();
+               }
+
+       - When there are multiple arms to a conditional and some of them
+         require braces, enclose even a single line block in braces for
+         consistency. E.g.:
+
+               if (foo) {
+                       doit();
+               } else {
+                       one();
+                       two();
+                       three();
+               }
 
  - We try to avoid assignments in the condition of an "if" statement.
 
@@ -229,12 +256,12 @@ For C programs:
 
    Note however that a comment that explains a translatable string to
    translators uses a convention of starting with a magic token
-   "TRANSLATORS: " immediately after the opening delimiter, even when
-   it spans multiple lines.  We do not add an asterisk at the beginning
-   of each line, either.  E.g.
+   "TRANSLATORS: ", e.g.
 
-       /* TRANSLATORS: here is a comment that explains the string
-          to be translated, that follows immediately after it */
+       /*
+        * TRANSLATORS: here is a comment that explains the string to
+        * be translated, that follows immediately after it.
+        */
        _("Here is a translatable string explained by the above.");
 
  - Double negation is often harder to understand than no negation
index b43d66eae6e154b229aa1477b8454ce2918ba8b9..b5be2e2d3f5c8ade04fa81ddb5b24a8747838cdc 100644 (file)
@@ -120,6 +120,7 @@ INSTALL_INFO = install-info
 DOCBOOK2X_TEXI = docbook2x-texi
 DBLATEX = dblatex
 ASCIIDOC_DBLATEX_DIR = /etc/asciidoc/dblatex
+DBLATEX_COMMON = -p $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.xsl -s $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.sty
 ifndef PERL_PATH
        PERL_PATH = /usr/bin/perl
 endif
@@ -173,6 +174,16 @@ ifdef GNU_ROFF
 XMLTO_EXTRA += -m manpage-quote-apos.xsl
 endif
 
+ifdef USE_ASCIIDOCTOR
+ASCIIDOC = asciidoctor
+ASCIIDOC_CONF =
+ASCIIDOC_HTML = xhtml5
+ASCIIDOC_DOCBOOK = docbook45
+ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
+ASCIIDOC_EXTRA += -alitdd='&\#x2d;&\#x2d;'
+DBLATEX_COMMON =
+endif
+
 SHELL_PATH ?= $(SHELL)
 # Shell quote;
 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
@@ -337,7 +348,7 @@ manpage-base-url.xsl: manpage-base-url.xsl.in
 
 user-manual.xml: user-manual.txt user-manual.conf
        $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-       $(TXT_TO_XML) -d article -o $@+ $< && \
+       $(TXT_TO_XML) -d book -o $@+ $< && \
        mv $@+ $@
 
 technical/api-index.txt: technical/api-index-skel.txt \
@@ -368,13 +379,14 @@ user-manual.texi: user-manual.xml
 
 user-manual.pdf: user-manual.xml
        $(QUIET_DBLATEX)$(RM) $@+ $@ && \
-       $(DBLATEX) -o $@+ -p $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.xsl -s $(ASCIIDOC_DBLATEX_DIR)/asciidoc-dblatex.sty $< && \
+       $(DBLATEX) -o $@+ $(DBLATEX_COMMON) $< && \
        mv $@+ $@
 
-gitman.texi: $(MAN_XML) cat-texi.perl
+gitman.texi: $(MAN_XML) cat-texi.perl texi.xsl
        $(QUIET_DB2TEXI)$(RM) $@+ $@ && \
-       ($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \
-               --to-stdout $(xml) &&) true) > $@++ && \
+       ($(foreach xml,$(sort $(MAN_XML)),xsltproc -o $(xml)+ texi.xsl $(xml) && \
+               $(DOCBOOK2X_TEXI) --encoding=UTF-8 --to-stdout $(xml)+ && \
+               rm $(xml)+ &&) true) > $@++ && \
        $(PERL_PATH) cat-texi.perl $@ <$@++ >$@+ && \
        rm $@++ && \
        mv $@+ $@
diff --git a/Documentation/RelNotes/2.11.0.txt b/Documentation/RelNotes/2.11.0.txt
new file mode 100644 (file)
index 0000000..b7b7dd3
--- /dev/null
@@ -0,0 +1,593 @@
+Git 2.11 Release Notes
+======================
+
+Backward compatibility notes.
+
+ * An empty string used as a pathspec element has always meant
+   'everything matches', but it is too easy to write a script that
+   finds a path to remove in $path and run 'git rm "$paht"' by
+   mistake (when the user meant to give "$path"), which ends up
+   removing everything.  This release starts warning about the
+   use of an empty string that is used for 'everything matches' and
+   asks users to use a more explicit '.' for that instead.
+
+   The hope is that existing users will not mind this change, and
+   eventually the warning can be turned into a hard error, upgrading
+   the deprecation into removal of this (mis)feature.
+
+ * The historical argument order "git merge <msg> HEAD <commit>..."
+   has been deprecated for quite some time, and will be removed in the
+   next release (not this one).
+
+ * The default abbreviation length, which has historically been 7, now
+   scales as the repository grows, using the approximate number of
+   objects in the repository and a bit of math around the birthday
+   paradox.  The logic suggests to use 12 hexdigits for the Linux
+   kernel, and 9 to 10 for Git itself.
+
+
+Updates since v2.10
+-------------------
+
+UI, Workflows & Features
+
+ * Comes with new version of git-gui, now at its 0.21.0 tag.
+
+ * "git format-patch --cover-letter HEAD^" to format a single patch
+   with a separate cover letter now numbers the output as [PATCH 0/1]
+   and [PATCH 1/1] by default.
+
+ * An incoming "git push" that attempts to push too many bytes can now
+   be rejected by setting a new configuration variable at the receiving
+   end.
+
+ * "git nosuchcommand --help" said "No manual entry for gitnosuchcommand",
+   which was not intuitive, given that "git nosuchcommand" said "git:
+   'nosuchcommand' is not a git command".
+
+ * "git clone --recurse-submodules --reference $path $URL" is a way to
+   reduce network transfer cost by borrowing objects in an existing
+   $path repository when cloning the superproject from $URL; it
+   learned to also peek into $path for presence of corresponding
+   repositories of submodules and borrow objects from there when able.
+
+ * The "git diff --submodule={short,log}" mechanism has been enhanced
+   to allow "--submodule=diff" to show the patch between the submodule
+   commits bound to the superproject.
+
+ * Even though "git hash-objects", which is a tool to take an
+   on-filesystem data stream and put it into the Git object store,
+   can perform "outside-world-to-Git" conversions (e.g.
+   end-of-line conversions and application of the clean-filter), and
+   it has had this feature on by default from very early days, its reverse
+   operation "git cat-file", which takes an object from the Git object
+   store and externalizes it for consumption by the outside world,
+   lacked an equivalent mechanism to run the "Git-to-outside-world"
+   conversion.  The command learned the "--filters" option to do so.
+
+ * Output from "git diff" can be made easier to read by intelligently selecting
+   which lines are common and which lines are added/deleted
+   when the lines before and after the changed section
+   are the same.  A command line option (--indent-heuristic) and a
+   configuration variable (diff.indentHeuristic) are added to help with the
+   experiment to find good heuristics.
+
+ * In some projects, it is common to use "[RFC PATCH]" as the subject
+   prefix for a patch meant for discussion rather than application.  A
+   new format-patch option "--rfc" is a short-hand for "--subject-prefix=RFC PATCH"
+   to help the participants of such projects.
+
+ * "git add --chmod={+,-}x <pathspec>" only changed the
+   executable bit for paths that are either new or modified. This has
+   been corrected to change the executable bit for all paths that match
+   the given pathspec.
+
+ * When "git format-patch --stdout" output is placed as an in-body
+   header and it uses RFC2822 header folding, "git am" fails to
+   put the header line back into a single logical line.  The
+   underlying "git mailinfo" was taught to handle this properly.
+
+ * "gitweb" can spawn "highlight" to show blob contents with
+   (programming) language-specific syntax highlighting, but only
+   when the language is known.  "highlight" can however be told
+   to guess the language itself by giving it "--force" option, which
+   has been enabled.
+
+ * "git gui" l10n to Portuguese.
+
+ * When given an abbreviated object name that is not (or more
+   realistically, "no longer") unique, we gave a fatal error
+   "ambiguous argument".  This error is now accompanied by a hint that
+   lists the objects beginning with the given prefix.  During the
+   course of development of this new feature, numerous minor bugs were
+   uncovered and corrected, the most notable one of which is that we
+   gave "short SHA1 xxxx is ambiguous." twice without good reason.
+
+ * "git log rev^..rev" is an often-used revision range specification
+   to show what was done on a side branch merged at rev.  This has
+   gained a short-hand "rev^-1".  In general "rev^-$n" is the same as
+   "^rev^$n rev", i.e. what has happened on other branches while the
+   history leading to nth parent was looking the other way.
+
+ * In recent versions of cURL, GSSAPI credential delegation is
+   disabled by default due to CVE-2011-2192; introduce a http.delegation
+   configuration variable to selectively allow enabling this.
+   (merge 26a7b23429 ps/http-gssapi-cred-delegation later to maint).
+
+ * "git mergetool" learned to honor "-O<orderfile>" to control the
+   order of paths to present to the end user.
+
+ * "git diff/log --ws-error-highlight=<kind>" lacked the corresponding
+   configuration variable (diff.wsErrorHighlight) to set it by default.
+
+ * "git ls-files" learned the "--recurse-submodules" option
+   to get a listing of tracked files across submodules (i.e. this
+   only works with the "--cached" option, not for listing untracked or
+   ignored files).  This would be a useful tool to sit on the upstream
+   side of a pipe that is read with xargs to work on all working tree
+   files from the top-level superproject.
+
+ * A new credential helper that talks via "libsecret" with
+   implementations of XDG Secret Service API has been added to
+   contrib/credential/.
+
+ * The GPG verification status shown by the "%G?" pretty format specifier
+   was not rich enough to differentiate a signature made by an expired
+   key, a signature made by a revoked key, etc.  New output letters
+   have been assigned to express them.
+
+ * In addition to purely abbreviated commit object names, "gitweb"
+   learned to turn "git describe" output (e.g. v2.9.3-599-g2376d31787)
+   into clickable links in its output.
+
+ * "git commit" created an empty commit when invoked with an index
+   consisting solely of intend-to-add paths (added with "git add -N").
+   It now requires the "--allow-empty" option to create such a commit.
+   The same logic prevented "git status" from showing such paths as "new files" in the
+   "Changes not staged for commit" section.
+
+ * The smudge/clean filter API spawns an external process
+   to filter the contents of each path that has a filter defined.  A
+   new type of "process" filter API has been added to allow the first
+   request to run the filter for a path to spawn a single process, and
+   all filtering is served by this single process for multiple
+   paths, reducing the process creation overhead.
+
+ * The user always has to say "stash@{$N}" when naming a single
+   element in the default location of the stash, i.e. reflogs in
+   refs/stash.  The "git stash" command learned to accept "git stash
+   apply 4" as a short-hand for "git stash apply stash@{4}".
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * The delta-base-cache mechanism has been a key to the performance in
+   a repository with a tightly packed packfile, but it did not scale
+   well even with a larger value of core.deltaBaseCacheLimit.
+
+ * Enhance "git status --porcelain" output by collecting more data on
+   the state of the index and the working tree files, which may
+   further be used to teach git-prompt (in contrib/) to make fewer
+   calls to git.
+
+ * Extract a small helper out of the function that reads the authors
+   script file "git am" internally uses.
+   (merge a77598e jc/am-read-author-file later to maint).
+
+ * Lift calls to exit(2) and die() higher in the callchain in
+   sequencer.c files so that more helper functions in it can be used
+   by callers that want to handle error conditions themselves.
+
+ * "git am" has been taught to make an internal call to "git apply"'s
+   innards without spawning the latter as a separate process.
+
+ * The ref-store abstraction was introduced to the refs API so that we
+   can plug in different backends to store references.
+
+ * The "unsigned char sha1[20]" to "struct object_id" conversion
+   continues.  Notable changes in this round includes that ce->sha1,
+   i.e. the object name recorded in the cache_entry, turns into an
+   object_id.
+
+ * JGit can show a fake ref "capabilities^{}" to "git fetch" when it
+   does not advertise any refs, but "git fetch" was not prepared to
+   see such an advertisement.  When the other side disconnects without
+   giving any ref advertisement, we used to say "there may not be a
+   repository at that URL", but we may have seen other advertisements
+   like "shallow" and ".have" in which case we definitely know that a
+   repository is there.  The code to detect this case has also been
+   updated.
+
+ * Some codepaths in "git pack-objects" were not ready to use an
+   existing pack bitmap; now they are and as a result they have
+   become faster.
+
+ * The codepath in "git fsck" to detect malformed tree objects has
+   been updated not to die but keep going after detecting them.
+
+ * We call "qsort(array, nelem, sizeof(array[0]), fn)", and most of
+   the time third parameter is redundant.  A new QSORT() macro lets us
+   omit it.
+
+ * "git pack-objects" in a repository with many packfiles used to
+   spend a lot of time looking for/at objects in them; the accesses to
+   the packfiles are now optimized by checking the most-recently-used
+   packfile first.
+   (merge c9af708b1a jk/pack-objects-optim-mru later to maint).
+
+ * Codepaths involved in interacting alternate object stores have
+   been cleaned up.
+
+ * In order for the receiving end of "git push" to inspect the
+   received history and decide to reject the push, the objects sent
+   from the sending end need to be made available to the hook and
+   the mechanism for the connectivity check, and this was done
+   traditionally by storing the objects in the receiving repository
+   and letting "git gc" expire them.  Instead, store the newly
+   received objects in a temporary area, and make them available by
+   reusing the alternate object store mechanism to them only while we
+   decide if we accept the check, and once we decide, either migrate
+   them to the repository or purge them immediately.
+
+ * The require_clean_work_tree() helper was recreated in C when "git
+   pull" was rewritten from shell; the helper is now made available to
+   other callers in preparation for upcoming "rebase -i" work.
+
+ * "git upload-pack" had its code cleaned-up and performance improved
+   by reducing use of timestamp-ordered commit-list, which was
+   replaced with a priority queue.
+
+ * "git diff --no-index" codepath has been updated not to try to peek
+   into a .git/ directory that happens to be under the current
+   directory, when we know we are operating outside any repository.
+
+ * Update of the sequencer codebase to make it reusable to reimplement
+   "rebase -i" continues.
+
+ * Git generally does not explicitly close file descriptors that were
+   open in the parent process when spawning a child process, but most
+   of the time the child does not want to access them. As Windows does
+   not allow removing or renaming a file that has a file descriptor
+   open, a slow-to-exit child can even break the parent process by
+   holding onto them.  Use O_CLOEXEC flag to open files in various
+   codepaths.
+
+ * Update "interpret-trailers" machinery and teach it that people in
+   the real world write all sorts of cruft in the "trailer" that was
+   originally designed to have the neat-o "Mail-Header: like thing"
+   and nothing else.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.10
+-----------------
+
+Unless otherwise noted, all the fixes since v2.9 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * Clarify various ways to specify the "revision ranges" in the
+   documentation.
+
+ * "diff-highlight" script (in contrib/) learned to work better with
+   "git log -p --graph" output.
+
+ * The test framework left the number of tests and success/failure
+   count in the t/test-results directory, keyed by the name of the
+   test script plus the process ID.  The latter however turned out not
+   to serve any useful purpose.  The process ID part of the filename
+   has been removed.
+
+ * Having a submodule whose ".git" repository is somehow corrupt
+   caused a few commands that recurse into submodules to loop forever.
+
+ * "git symbolic-ref -d HEAD" happily removes the symbolic ref, but
+   the resulting repository becomes an invalid one.  Teach the command
+   to forbid removal of HEAD.
+
+ * A test spawned a short-lived background process, which sometimes
+   prevented the test directory from getting removed at the end of the
+   script on some platforms.
+
+ * Update a few tests that used to use GIT_CURL_VERBOSE to use the
+   newer GIT_TRACE_CURL.
+
+ * "git pack-objects --include-tag" was taught that when we know that
+   we are sending an object C, we want a tag B that directly points at
+   C but also a tag A that points at the tag B.  We used to miss the
+   intermediate tag B in some cases.
+
+ * Update Japanese translation for "git-gui".
+
+ * "git fetch http::/site/path" did not die correctly and segfaulted
+   instead.
+
+ * "git commit-tree" stopped reading commit.gpgsign configuration
+   variable that was meant for Porcelain "git commit" in Git 2.9; we
+   forgot to update "git gui" to look at the configuration to match
+   this change.
+
+ * "git add --chmod={+,-}x" added recently lacked documentation, which has
+   been corrected.
+
+ * "git log --cherry-pick" used to include merge commits as candidates
+   to be matched up with other commits, resulting a lot of wasted time.
+   The patch-id generation logic has been updated to ignore merges and
+   avoid the wastage.
+
+ * The http transport (with curl-multi option, which is the default
+   these days) failed to remove curl-easy handle from a curlm session,
+   which led to unnecessary API failures.
+
+ * There were numerous corner cases in which the configuration files
+   are read and used or not read at all depending on the directory a
+   Git command was run, leading to inconsistent behaviour.  The code
+   to set-up repository access at the beginning of a Git process has
+   been updated to fix them.
+   (merge 4d0efa1 jk/setup-sequence-update later to maint).
+
+ * "git diff -W" output needs to extend the context backward to
+   include the header line of the current function and also forward to
+   include the body of the entire current function up to the header
+   line of the next one.  This process may have to merge two adjacent
+   hunks, but the code forgot to do so in some cases.
+
+ * Performance tests done via "t/perf" did not use the right
+   build configuration if the user relied on autoconf generated
+   configuration.
+
+ * "git format-patch --base=..." feature that was recently added
+   showed the base commit information after the "-- " e-mail signature
+   line, which turned out to be inconvenient.  The base information
+   has been moved above the signature line.
+
+ * More i18n.
+
+ * Even when "git pull --rebase=preserve" (and the underlying "git
+   rebase --preserve") can complete without creating any new commits
+   (i.e. fast-forwards), it still insisted on having usable ident
+   information (read: user.email is set correctly), which was less
+   than nice.  As the underlying commands used inside "git rebase"
+   would fail with a more meaningful error message and advice text
+   when the bogus ident matters, this extra check was removed.
+
+ * "git gc --aggressive" used to limit the delta-chain length to 250,
+   which is way too deep for gaining additional space savings and is
+   detrimental for runtime performance.  The limit has been reduced to
+   50.
+
+ * Documentation for individual configuration variables to control use
+   of color (like `color.grep`) said that their default value is
+   'false', instead of saying their default is taken from `color.ui`.
+   When we updated the default value for color.ui from 'false' to
+   'auto' quite a while ago, all of them broke.  This has been
+   corrected.
+
+ * The pretty-format specifier "%C(auto)" used by the "log" family of
+   commands to enable coloring of the output is taught to also issue a
+   color-reset sequence to the output.
+
+ * A shell script example in check-ref-format documentation has been
+   fixed.
+
+ * "git checkout <word>" does not follow the usual disambiguation
+   rules when the <word> can be both a rev and a path, to allow
+   checking out a branch 'foo' in a project that happens to have a
+   file 'foo' in the working tree without having to disambiguate.
+   This was poorly documented and the check was incorrect when the
+   command was run from a subdirectory.
+
+ * Some codepaths in "git diff" used regexec(3) on a buffer that was
+   mmap(2)ed, which may not have a terminating NUL, leading to a read
+   beyond the end of the mapped region.  This was fixed by introducing
+   a regexec_buf() helper that takes a <ptr,len> pair with REG_STARTEND
+   extension.
+
+ * The procedure to build Git on Mac OS X for Travis CI hardcoded the
+   internal directory structure we assumed HomeBrew uses, which was a
+   no-no.  The procedure has been updated to ask HomeBrew things we
+   need to know to fix this.
+
+ * When "git rebase -i" is given a broken instruction, it told the
+   user to fix it with "--edit-todo", but didn't say what the step
+   after that was (i.e. "--continue").
+
+ * Documentation around tools to import from CVS was fairly outdated.
+
+ * "git clone --recurse-submodules" lost the progress eye-candy in
+   a recent update, which has been corrected.
+
+ * A low-level function verify_packfile() was meant to show errors
+   that were detected without dying itself, but under some conditions
+   it didn't and died instead, which has been fixed.
+
+ * When "git fetch" tries to find where the history of the repository
+   it runs in has diverged from what the other side has, it has a
+   mechanism to avoid digging too deep into irrelevant side branches.
+   This however did not work well over the "smart-http" transport due
+   to a design bug, which has been fixed.
+
+ * In the codepath that comes up with the hostname to be used in an
+   e-mail when the user didn't tell us, we looked at the ai_canonname
+   field in struct addrinfo without making sure it is not NULL first.
+
+ * "git worktree", even though it used the default_abbrev setting that
+   ought to be affected by the core.abbrev configuration variable, ignored
+   the variable setting.  The command has been taught to read the
+   default set of configuration variables to correct this.
+
+ * "git init" tried to record core.worktree in the repository's
+   'config' file when the GIT_WORK_TREE environment variable was set and
+   it was different from where GIT_DIR appears as ".git" at its top,
+   but the logic was faulty when .git is a "gitdir:" file that points
+   at the real place, causing trouble in working trees that are
+   managed by "git worktree".  This has been corrected.
+
+ * Codepaths that read from an on-disk loose object were too loose in
+   validating that they are reading a proper object file and
+   sometimes read past the data they read from the disk, which has
+   been corrected.  H/t to Gustavo Grieco for reporting.
+
+ * The original command line syntax for "git merge", which was "git
+   merge <msg> HEAD <parent>...", has been deprecated for quite some
+   time, and "git gui" was the last in-tree user of the syntax.  This
+   is finally fixed, so that we can move forward with the deprecation.
+
+ * An author name that has a backslash-quoted double quote in the
+   human readable part ("My \"double quoted\" name"), was not unquoted
+   correctly while applying a patch from a piece of e-mail.
+
+ * Doc update to clarify what "log -3 --reverse" does.
+
+ * Almost everybody uses DEFAULT_ABBREV to refer to the default
+   setting for the abbreviation, but "git blame" peeked into
+   underlying variable bypassing the macro for no good reason.
+
+ * The "graph" API used in "git log --graph" miscounted the number of
+   output columns consumed so far when drawing a padding line, which
+   has been fixed; this did not affect any existing code as nobody
+   tried to write anything after the padding on such a line, though.
+
+ * The code that parses the format parameter of the for-each-ref command
+   has seen a micro-optimization.
+
+ * When we started to use cURL to talk to an imap server, we forgot to explicitly add
+   imap(s):// before the destination.  To some folks, that didn't work
+   and the library tried to make HTTP(s) requests instead.
+
+ * The ./configure script generated from configure.ac was taught how
+   to detect support of SSL by libcurl better.
+
+ * The command-line completion script (in contrib/) learned to
+   complete "git cmd ^mas<HT>" to complete the negative end of
+   reference to "git cmd ^master".
+   (merge 49416ad22a cp/completion-negative-refs later to maint).
+
+ * The existing "git fetch --depth=<n>" option was hard to use
+   correctly when making the history of an existing shallow clone
+   deeper.  A new option, "--deepen=<n>", has been added to make this
+   easier to use.  "git clone" also learned "--shallow-since=<date>"
+   and "--shallow-exclude=<tag>" options to make it easier to specify
+   "I am interested only in the recent N months worth of history" and
+   "Give me only the history since that version".
+   (merge cccf74e2da nd/shallow-deepen later to maint).
+
+ * "git blame --reverse OLD path" is now DWIMmed to show how lines
+   in path in an old revision OLD have survived up to the current
+   commit.
+   (merge e1d09701a4 jc/blame-reverse later to maint).
+
+ * The http.emptyauth configuration variable is a way to allow an empty username to
+   pass when attempting to authenticate using mechanisms like
+   Kerberos.  We took an unspecified (NULL) username and sent ":"
+   (i.e. no username, no password) to CURLOPT_USERPWD, but did not do
+   the same when the username is explicitly set to an empty string.
+
+ * "git clone" of a local repository can be done at the filesystem
+   level, but the codepath did not check errors while copying and
+   adjusting the file that lists alternate object stores.
+
+ * Documentation for "git commit" was updated to clarify that "commit
+   -p <paths>" adds to the current contents of the index to come up
+   with what to commit.
+
+ * A stray symbolic link in the $GIT_DIR/refs/ directory could make name
+   resolution loop forever, which has been corrected.
+
+ * The "submodule.<name>.path" stored in .gitmodules is never copied
+   to .git/config and such a key in .git/config has no meaning, but
+   the documentation described it next to submodule.<name>.url
+   as if both belong to .git/config.  This has been fixed.
+
+ * In a worktree created via "git
+   worktree", "git checkout" attempts to protect users from confusion
+   by refusing to check out a branch that is already checked out in
+   another worktree.  However, this also prevented checking out a
+   branch which is designated as the primary branch of a bare
+   repository, in a worktree that is connected to the bare
+   repository.  The check has been corrected to allow it.
+
+ * "git rebase" immediately after "git clone" failed to find the fork
+   point from the upstream.
+
+ * When fetching from a remote that has many tags that are irrelevant
+   to branches we are following, we used to waste way too many cycles
+   checking if the object pointed at by a tag (that we are not
+   going to fetch!) exists in our repository too carefully.
+
+ * Protect our code from over-eager compilers.
+
+ * Recent git allows submodule.<name>.branch to use a special token
+   "." instead of the branch name; the documentation has been updated
+   to describe it.
+
+ * "git send-email" attempts to pick up valid e-mails from the
+   trailers, but people in the real world write non-addresses there, like
+   "Cc: Stable <add@re.ss> # 4.8+", which broke the output depending
+   on the availability and vintage of the Mail::Address perl module.
+   (merge dcfafc5214 mm/send-email-cc-cruft-after-address later to maint).
+
+ * The Travis CI configuration we ship ran the tests with the --verbose
+   option but this risks non-TAP output that happens to be "ok" to be
+   misinterpreted as TAP signalling a test that passed.  This resulted
+   in unnecessary failures.  This has been corrected by introducing a
+   new mode to run our tests in the test harness to send the verbose
+   output separately to the log file.
+
+ * Some AsciiDoc formatters mishandle a displayed illustration with
+   tabs in it.  Adjust a few of them in merge-base documentation to
+   work around them.
+
+ * Fixed a minor regression in "git submodule" that was introduced
+   when more helper functions were reimplemented in C.
+   (merge 77b63ac31e sb/submodule-ignore-trailing-slash later to maint).
+
+ * The code that we have used for the past 10+ years to cycle
+   4-element ring buffers turns out to be not quite portable in
+   theoretical world.
+   (merge bb84735c80 rs/ring-buffer-wraparound later to maint).
+
+ * "git daemon" used fixed-length buffers to turn URLs to the
+   repository the client asked for into the server side directory
+   paths, using snprintf() to avoid overflowing these buffers, but
+   allowed possibly truncated paths to the directory.  This has been
+   tightened to reject such a request that causes an overlong path to be
+   served.
+   (merge 6bdb0083be jk/daemon-path-ok-check-truncation later to maint).
+
+ * Recent update to git-sh-setup (a library of shell functions that
+   are used by our in-tree scripted Porcelain commands) included
+   another shell library git-sh-i18n without specifying where it is,
+   relying on the $PATH.  This has been fixed to be more explicit by
+   prefixing with $(git --exec-path) output.
+   (merge 1073094f30 ak/sh-setup-dot-source-i18n-fix later to maint).
+
+ * Fix for a racy false-positive test failure.
+   (merge fdf4f6c79b as/merge-attr-sleep later to maint).
+
+ * Portability update and workaround for builds on recent Mac OS X.
+   (merge a296bc0132 ls/macos-update later to maint).
+
+ * Using a %(HEAD) placeholder in "for-each-ref --format=" option
+   caused the command to segfault when on an unborn branch.
+   (merge 84679d470d jc/for-each-ref-head-segfault-fix later to maint).
+
+ * "git rebase -i" did not work well with the core.commentchar
+   configuration variable for two reasons, both of which have been
+   fixed.
+   (merge 882cd23777 js/rebase-i-commentchar-fix later to maint).
+
+ * Other minor doc, test and build updates and code cleanups.
+   (merge 5c238e29a8 jk/common-main later to maint).
+   (merge 5a5749e45b ak/pre-receive-hook-template-modefix later to maint).
+   (merge 6d834ac8f1 jk/rebase-config-insn-fmt-docfix later to maint).
+   (merge de9f7fa3b0 rs/commit-pptr-simplify later to maint).
+   (merge 4259d693fc sc/fmt-merge-msg-doc-markup-fix later to maint).
+   (merge 28fab7b23d nd/test-helpers later to maint).
+   (merge c2bb0c1d1e rs/cocci later to maint).
+   (merge 3285b7badb ps/common-info-doc later to maint).
+   (merge 2b090822e8 nd/worktree-lock later to maint).
+   (merge 4bd488ea7c jk/create-branch-remove-unused-param later to maint).
+   (merge 974e0044d6 tk/diffcore-delta-remove-unused later to maint).
diff --git a/Documentation/RelNotes/2.11.1.txt b/Documentation/RelNotes/2.11.1.txt
new file mode 100644 (file)
index 0000000..9cd14c8
--- /dev/null
@@ -0,0 +1,168 @@
+Git v2.11.1 Release Notes
+=========================
+
+Fixes since v2.11
+-----------------
+
+ * The default Travis-CI configuration specifies newer P4 and GitLFS.
+
+ * The character width table has been updated to match Unicode 9.0
+
+ * Update the isatty() emulation for Windows by updating the previous
+   hack that depended on internals of (older) MSVC runtime.
+
+ * "git rev-parse --symbolic" failed with a more recent notation like
+   "HEAD^-1" and "HEAD^!".
+
+ * An empty directory in a working tree that can simply be nuked used
+   to interfere while merging or cherry-picking a change to create a
+   submodule directory there, which has been fixed..
+
+ * The code in "git push" to compute if any commit being pushed in the
+   superproject binds a commit in a submodule that hasn't been pushed
+   out was overly inefficient, making it unusable even for a small
+   project that does not have any submodule but have a reasonable
+   number of refs.
+
+ * "git push --dry-run --recurse-submodule=on-demand" wasn't
+   "--dry-run" in the submodules.
+
+ * The output from "git worktree list" was made in readdir() order,
+   and was unstable.
+
+ * mergetool.<tool>.trustExitCode configuration variable did not apply
+   to built-in tools, but now it does.
+
+ * "git p4" LFS support was broken when LFS stores an empty blob.
+
+ * Fix a corner case in merge-recursive regression that crept in
+   during 2.10 development cycle.
+
+ * Update the error messages from the dumb-http client when it fails
+   to obtain loose objects; we used to give sensible error message
+   only upon 404 but we now forbid unexpected redirects that needs to
+   be reported with something sensible.
+
+ * When diff.renames configuration is on (and with Git 2.9 and later,
+   it is enabled by default, which made it worse), "git stash"
+   misbehaved if a file is removed and another file with a very
+   similar content is added.
+
+ * "git diff --no-index" did not take "--no-abbrev" option.
+
+ * "git difftool --dir-diff" had a minor regression when started from
+   a subdirectory, which has been fixed.
+
+ * "git commit --allow-empty --only" (no pathspec) with dirty index
+   ought to be an acceptable way to create a new commit that does not
+   change any paths, but it was forbidden, perhaps because nobody
+   needed it so far.
+
+ * A pathname that begins with "//" or "\\" on Windows is special but
+   path normalization logic was unaware of it.
+
+ * "git pull --rebase", when there is no new commits on our side since
+   we forked from the upstream, should be able to fast-forward without
+   invoking "git rebase", but it didn't.
+
+ * The way to specify hotkeys to "xxdiff" that is used by "git
+   mergetool" has been modernized to match recent versions of xxdiff.
+
+ * Unlike "git am --abort", "git cherry-pick --abort" moved HEAD back
+   to where cherry-pick started while picking multiple changes, when
+   the cherry-pick stopped to ask for help from the user, and the user
+   did "git reset --hard" to a different commit in order to re-attempt
+   the operation.
+
+ * Code cleanup in shallow boundary computation.
+
+ * A recent update to receive-pack to make it easier to drop garbage
+   objects made it clear that GIT_ALTERNATE_OBJECT_DIRECTORIES cannot
+   have a pathname with a colon in it (no surprise!), and this in turn
+   made it impossible to push into a repository at such a path.  This
+   has been fixed by introducing a quoting mechanism used when
+   appending such a path to the colon-separated list.
+
+ * The function usage_msg_opt() has been updated to say "fatal:"
+   before the custom message programs give, when they want to die
+   with a message about wrong command line options followed by the
+   standard usage string.
+
+ * "git index-pack --stdin" needs an access to an existing repository,
+   but "git index-pack file.pack" to generate an .idx file that
+   corresponds to a packfile does not.
+
+ * Fix for NDEBUG builds.
+
+ * A lazy "git push" without refspec did not internally use a fully
+   specified refspec to perform 'current', 'simple', or 'upstream'
+   push, causing unnecessary "ambiguous ref" errors.
+
+ * "git p4" misbehaved when swapping a directory and a symbolic link.
+
+ * Even though an fix was attempted in Git 2.9.3 days, but running
+   "git difftool --dir-diff" from a subdirectory never worked. This
+   has been fixed.
+
+ * "git p4" that tracks multile p4 paths imported a single changelist
+   that touches files in these multiple paths as one commit, followed
+   by many empty commits.  This has been fixed.
+
+ * A potential but unlikely buffer overflow in Windows port has been
+   fixed.
+
+ * When the http server gives an incomplete response to a smart-http
+   rpc call, it could lead to client waiting for a full response that
+   will never come.  Teach the client side to notice this condition
+   and abort the transfer.
+
+ * Some platforms no longer understand "latin-1" that is still seen in
+   the wild in e-mail headers; replace them with "iso-8859-1" that is
+   more widely known when conversion fails from/to it.
+
+ * Update the procedure to generate "tags" for developer support.
+
+ * Update the definition of the MacOSX test environment used by
+   TravisCI.
+
+ * A few git-svn updates.
+
+ * Compression setting for producing packfiles were spread across
+   three codepaths, one of which did not honor any configuration.
+   Unify these so that all of them honor core.compression and
+   pack.compression variables the same way.
+
+ * "git fast-import" sometimes mishandled while rebalancing notes
+   tree, which has been fixed.
+
+ * Recent update to the default abbreviation length that auto-scales
+   lacked documentation update, which has been corrected.
+
+ * Leakage of lockfiles in the config subsystem has been fixed.
+
+ * It is natural that "git gc --auto" may not attempt to pack
+   everything into a single pack, and there is no point in warning
+   when the user has configured the system to use the pack bitmap,
+   leading to disabling further "gc".
+
+ * "git archive" did not read the standard configuration files, and
+   failed to notice a file that is marked as binary via the userdiff
+   driver configuration.
+
+ * "git blame --porcelain" misidentified the "previous" <commit, path>
+   pair (aka "source") when contents came from two or more files.
+
+ * "git rebase -i" with a recent update started showing an incorrect
+   count when squashing more than 10 commits.
+
+ * "git <cmd> @{push}" on a detached HEAD used to segfault; it has
+   been corrected to error out with a message.
+
+ * Tighten a test to avoid mistaking an extended ERE regexp engine as
+   a PRE regexp engine.
+
+ * Typing ^C to pager, which usually does not kill it, killed Git and
+   took the pager down as a collateral damage in certain process-tree
+   structure.  This has been fixed.
+
+Also contains various documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.11.2.txt b/Documentation/RelNotes/2.11.2.txt
new file mode 100644 (file)
index 0000000..7428851
--- /dev/null
@@ -0,0 +1,12 @@
+Git v2.11.2 Release Notes
+=========================
+
+Fixes since v2.11.1
+-------------------
+
+ * "git-shell" rejects a request to serve a repository whose name
+   begins with a dash, which makes it no longer possible to get it
+   confused into spawning service programs like "git-upload-pack" with
+   an option like "--help", which in turn would spawn an interactive
+   pager, instead of working with the repository user asked to access
+   (i.e. the one whose name is "--help").
diff --git a/Documentation/RelNotes/2.12.0.txt b/Documentation/RelNotes/2.12.0.txt
new file mode 100644 (file)
index 0000000..2915480
--- /dev/null
@@ -0,0 +1,500 @@
+Git 2.12 Release Notes
+======================
+
+Backward compatibility notes.
+
+ * Use of an empty string that is used for 'everything matches' is
+   still warned and Git asks users to use a more explicit '.' for that
+   instead.  The hope is that existing users will not mind this
+   change, and eventually the warning can be turned into a hard error,
+   upgrading the deprecation into removal of this (mis)feature.  That
+   is not scheduled to happen in the upcoming release (yet).
+
+ * The historical argument order "git merge <msg> HEAD <commit>..."
+   has been deprecated for quite some time, and will be removed in a
+   future release.
+
+ * An ancient script "git relink" has been removed.
+
+
+Updates since v2.11
+-------------------
+
+UI, Workflows & Features
+
+ * Various updates to "git p4".
+
+ * "git p4" didn't interact with the internal of .git directory
+   correctly in the modern "git-worktree"-enabled world.
+
+ * "git branch --list" and friends learned "--ignore-case" option to
+   optionally sort branches and tags case insensitively.
+
+ * In addition to %(subject), %(body), "log --pretty=format:..."
+   learned a new placeholder %(trailers).
+
+ * "git rebase" learned "--quit" option, which allows a user to
+   remove the metadata left by an earlier "git rebase" that was
+   manually aborted without using "git rebase --abort".
+
+ * "git clone --reference $there --recurse-submodules $super" has been
+   taught to guess repositories usable as references for submodules of
+   $super that are embedded in $there while making a clone of the
+   superproject borrow objects from $there; extend the mechanism to
+   also allow submodules of these submodules to borrow repositories
+   embedded in these clones of the submodules embedded in the clone of
+   the superproject.
+
+ * Porcelain scripts written in Perl are getting internationalized.
+
+ * "git merge --continue" has been added as a synonym to "git commit"
+   to conclude a merge that has stopped due to conflicts.
+
+ * Finer-grained control of what protocols are allowed for transports
+   during clone/fetch/push have been enabled via a new configuration
+   mechanism.
+
+ * "git shortlog" learned "--committer" option to group commits by
+   committer, instead of author.
+
+ * GitLFS integration with "git p4" has been updated.
+
+ * The isatty() emulation for Windows has been updated to eradicate
+   the previous hack that depended on internals of (older) MSVC
+   runtime.
+
+ * Some platforms no longer understand "latin-1" that is still seen in
+   the wild in e-mail headers; replace them with "iso-8859-1" that is
+   more widely known when conversion fails from/to it.
+
+ * "git grep" has been taught to optionally recurse into submodules.
+
+ * "git rm" used to refuse to remove a submodule when it has its own
+   git repository embedded in its working tree.  It learned to move
+   the repository away to $GIT_DIR/modules/ of the superproject
+   instead, and allow the submodule to be deleted (as long as there
+   will be no loss of local modifications, that is).
+
+ * A recent updates to "git p4" was not usable for older p4 but it
+   could be made to work with minimum changes.  Do so.
+
+ * "git diff" learned diff.interHunkContext configuration variable
+   that gives the default value for its --inter-hunk-context option.
+
+ * The prereleaseSuffix feature of version comparison that is used in
+   "git tag -l" did not correctly when two or more prereleases for the
+   same release were present (e.g. when 2.0, 2.0-beta1, and 2.0-beta2
+   are there and the code needs to compare 2.0-beta1 and 2.0-beta2).
+
+ * "git submodule push" learned "--recurse-submodules=only option to
+   push submodules out without pushing the top-level superproject.
+
+ * "git tag" and "git verify-tag" learned to put GPG verification
+   status in their "--format=<placeholders>" output format.
+
+ * An ancient repository conversion tool left in contrib/ has been
+   removed.
+
+ * "git show-ref HEAD" used with "--verify" because the user is not
+   interested in seeing refs/remotes/origin/HEAD, and used with
+   "--head" because the user does not want HEAD to be filtered out,
+   i.e. "git show-ref --head --verify HEAD", did not work as expected.
+
+ * "git submodule add" used to be confused and refused to add a
+   locally created repository; users can now use "--force" option
+   to add them.
+   (merge 619acfc78c sb/submodule-add-force later to maint).
+
+ * Some people feel the default set of colors used by "git log --graph"
+   rather limiting.  A mechanism to customize the set of colors has
+   been introduced.
+
+ * "git read-tree" and its underlying unpack_trees() machinery learned
+   to report problematic paths prefixed with the --super-prefix option.
+
+ * When a submodule "A", which has another submodule "B" nested within
+   it, is "absorbed" into the top-level superproject, the inner
+   submodule "B" used to be left in a strange state.  The logic to
+   adjust the .git pointers in these submodules has been corrected.
+
+ * The user can specify a custom update method that is run when
+   "submodule update" updates an already checked out submodule.  This
+   was ignored when checking the submodule out for the first time and
+   we instead always just checked out the commit that is bound to the
+   path in the superproject's index.
+
+ * The command line completion (in contrib/) learned that
+   "git diff --submodule=" can take "diff" as a recently added option.
+
+ * The "core.logAllRefUpdates" that used to be boolean has been
+   enhanced to take 'always' as well, to record ref updates to refs
+   other than the ones that are expected to be updated (i.e. branches,
+   remote-tracking branches and notes).
+
+ * Comes with more command line completion (in contrib/) for recently
+   introduced options.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * Commands that operate on a log message and add lines to the trailer
+   blocks, such as "format-patch -s", "cherry-pick (-x|-s)", and
+   "commit -s", have been taught to use the logic of and share the
+   code with "git interpret-trailer".
+
+ * The default Travis-CI configuration specifies newer P4 and GitLFS.
+
+ * The "fast hash" that had disastrous performance issues in some
+   corner cases has been retired from the internal diff.
+
+ * The character width table has been updated to match Unicode 9.0
+
+ * Update the procedure to generate "tags" for developer support.
+
+ * The codeflow of setting NOATIME and CLOEXEC on file descriptors Git
+   opens has been simplified.
+
+ * "git diff" and its family had two experimental heuristics to shift
+   the contents of a hunk to make the patch easier to read.  One of
+   them turns out to be better than the other, so leave only the
+   "--indent-heuristic" option and remove the other one.
+
+ * A new submodule helper "git submodule embedgitdirs" to make it
+   easier to move embedded .git/ directory for submodules in a
+   superproject to .git/modules/ (and point the latter with the former
+   that is turned into a "gitdir:" file) has been added.
+
+ * "git push \\server\share\dir" has recently regressed and then
+   fixed.  A test has retroactively been added for this breakage.
+
+ * Build updates for Cygwin.
+
+ * The implementation of "real_path()" was to go there with chdir(2)
+   and call getcwd(3), but this obviously wouldn't be usable in a
+   threaded environment.  Rewrite it to manually resolve relative
+   paths including symbolic links in path components.
+
+ * Adjust documentation to help AsciiDoctor render better while not
+   breaking the rendering done by AsciiDoc.
+
+ * The sequencer machinery has been further enhanced so that a later
+   set of patches can start using it to reimplement "rebase -i".
+
+ * Update the definition of the MacOSX test environment used by
+   TravisCI.
+
+ * Rewrite a scripted porcelain "git difftool" in C.
+
+ * "make -C t failed" will now run only the tests that failed in the
+   previous run.  This is usable only when prove is not use, and gives
+   a useless error message when run after "make clean", but otherwise
+   is serviceable.
+
+ * "uchar [40]" to "struct object_id" conversion continues.
+
+
+Also contains various documentation updates and code clean-ups.
+
+Fixes since v2.10
+-----------------
+
+Unless otherwise noted, all the fixes since v2.9 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * We often decide if a session is interactive by checking if the
+   standard I/O streams are connected to a TTY, but isatty() that
+   comes with Windows incorrectly returned true if it is used on NUL
+   (i.e. an equivalent to /dev/null).  This has been fixed.
+
+ * "git svn" did not work well with path components that are "0", and
+   some configuration variable it uses were not documented.
+
+ * "git rev-parse --symbolic" failed with a more recent notation like
+   "HEAD^-1" and "HEAD^!".
+
+ * An empty directory in a working tree that can simply be nuked used
+   to interfere while merging or cherry-picking a change to create a
+   submodule directory there, which has been fixed..
+
+ * The code in "git push" to compute if any commit being pushed in the
+   superproject binds a commit in a submodule that hasn't been pushed
+   out was overly inefficient, making it unusable even for a small
+   project that does not have any submodule but have a reasonable
+   number of refs.
+
+ * "git push --dry-run --recurse-submodule=on-demand" wasn't
+   "--dry-run" in the submodules.
+
+ * The output from "git worktree list" was made in readdir() order,
+   and was unstable.
+
+ * mergetool.<tool>.trustExitCode configuration variable did not apply
+   to built-in tools, but now it does.
+
+ * "git p4" LFS support was broken when LFS stores an empty blob.
+
+ * A corner case in merge-recursive regression that crept in
+   during 2.10 development cycle has been fixed.
+
+ * Transport with dumb http can be fooled into following foreign URLs
+   that the end user does not intend to, especially with the server
+   side redirects and http-alternates mechanism, which can lead to
+   security issues.  Tighten the redirection and make it more obvious
+   to the end user when it happens.
+
+ * Update the error messages from the dumb-http client when it fails
+   to obtain loose objects; we used to give sensible error message
+   only upon 404 but we now forbid unexpected redirects that needs to
+   be reported with something sensible.
+
+ * When diff.renames configuration is on (and with Git 2.9 and later,
+   it is enabled by default, which made it worse), "git stash"
+   misbehaved if a file is removed and another file with a very
+   similar content is added.
+
+ * "git diff --no-index" did not take "--no-abbrev" option.
+
+ * "git difftool --dir-diff" had a minor regression when started from
+   a subdirectory, which has been fixed.
+
+ * "git commit --allow-empty --only" (no pathspec) with dirty index
+   ought to be an acceptable way to create a new commit that does not
+   change any paths, but it was forbidden, perhaps because nobody
+   needed it so far.
+
+ * Git 2.11 had a minor regression in "merge --ff-only" that competed
+   with another process that simultanously attempted to update the
+   index. We used to explain what went wrong with an error message,
+   but the new code silently failed.  The error message has been
+   resurrected.
+
+ * A pathname that begins with "//" or "\\" on Windows is special but
+   path normalization logic was unaware of it.
+
+ * "git pull --rebase", when there is no new commits on our side since
+   we forked from the upstream, should be able to fast-forward without
+   invoking "git rebase", but it didn't.
+
+ * The way to specify hotkeys to "xxdiff" that is used by "git
+   mergetool" has been modernized to match recent versions of xxdiff.
+
+ * Unlike "git am --abort", "git cherry-pick --abort" moved HEAD back
+   to where cherry-pick started while picking multiple changes, when
+   the cherry-pick stopped to ask for help from the user, and the user
+   did "git reset --hard" to a different commit in order to re-attempt
+   the operation.
+
+ * Code cleanup in shallow boundary computation.
+
+ * A recent update to receive-pack to make it easier to drop garbage
+   objects made it clear that GIT_ALTERNATE_OBJECT_DIRECTORIES cannot
+   have a pathname with a colon in it (no surprise!), and this in turn
+   made it impossible to push into a repository at such a path.  This
+   has been fixed by introducing a quoting mechanism used when
+   appending such a path to the colon-separated list.
+
+ * The function usage_msg_opt() has been updated to say "fatal:"
+   before the custom message programs give, when they want to die
+   with a message about wrong command line options followed by the
+   standard usage string.
+
+ * "git index-pack --stdin" needs an access to an existing repository,
+   but "git index-pack file.pack" to generate an .idx file that
+   corresponds to a packfile does not.
+
+ * Fix for NDEBUG builds.
+
+ * A lazy "git push" without refspec did not internally use a fully
+   specified refspec to perform 'current', 'simple', or 'upstream'
+   push, causing unnecessary "ambiguous ref" errors.
+
+ * "git p4" misbehaved when swapping a directory and a symbolic link.
+
+ * Even though an fix was attempted in Git 2.9.3 days, but running
+   "git difftool --dir-diff" from a subdirectory never worked. This
+   has been fixed.
+
+ * "git p4" that tracks multile p4 paths imported a single changelist
+   that touches files in these multiple paths as one commit, followed
+   by many empty commits.  This has been fixed.
+
+ * A potential but unlikely buffer overflow in Windows port has been
+   fixed.
+
+ * When the http server gives an incomplete response to a smart-http
+   rpc call, it could lead to client waiting for a full response that
+   will never come.  Teach the client side to notice this condition
+   and abort the transfer.
+
+ * Compression setting for producing packfiles were spread across
+   three codepaths, one of which did not honor any configuration.
+   Unify these so that all of them honor core.compression and
+   pack.compression variables the same way.
+
+ * "git fast-import" sometimes mishandled while rebalancing notes
+   tree, which has been fixed.
+
+ * Recent update to the default abbreviation length that auto-scales
+   lacked documentation update, which has been corrected.
+
+ * Leakage of lockfiles in the config subsystem has been fixed.
+
+ * It is natural that "git gc --auto" may not attempt to pack
+   everything into a single pack, and there is no point in warning
+   when the user has configured the system to use the pack bitmap,
+   leading to disabling further "gc".
+
+ * "git archive" did not read the standard configuration files, and
+   failed to notice a file that is marked as binary via the userdiff
+   driver configuration.
+
+ * "git blame --porcelain" misidentified the "previous" <commit, path>
+   pair (aka "source") when contents came from two or more files.
+
+ * "git rebase -i" with a recent update started showing an incorrect
+   count when squashing more than 10 commits.
+
+ * "git <cmd> @{push}" on a detached HEAD used to segfault; it has
+   been corrected to error out with a message.
+
+ * Running "git add a/b" when "a" is a submodule correctly errored
+   out, but without a meaningful error message.
+   (merge 2d81c48fa7 sb/pathspec-errors later to maint).
+
+ * Typing ^C to pager, which usually does not kill it, killed Git and
+   took the pager down as a collateral damage in certain process-tree
+   structure.  This has been fixed.
+
+ * "git mergetool" without any pathspec on the command line that is
+   run from a subdirectory became no-op in Git v2.11 by mistake, which
+   has been fixed.
+
+ * Retire long unused/unmaintained gitview from the contrib/ area.
+   (merge 3120925c25 sb/remove-gitview later to maint).
+
+ * Tighten a test to avoid mistaking an extended ERE regexp engine as
+   a PRE regexp engine.
+
+ * An error message with an ASCII control character like '\r' in it
+   can alter the message to hide its early part, which is problematic
+   when a remote side gives such an error message that the local side
+   will relay with a "remote: " prefix.
+   (merge f290089879 jk/vreport-sanitize later to maint).
+
+ * "git fsck" inspects loose objects more carefully now.
+   (merge cce044df7f jk/loose-object-fsck later to maint).
+
+ * A crashing bug introduced in v2.11 timeframe has been found (it is
+   triggerable only in fast-import) and fixed.
+   (merge abd5a00268 jk/clear-delta-base-cache-fix later to maint).
+
+ * With an anticipatory tweak for remotes defined in ~/.gitconfig
+   (e.g. "remote.origin.prune" set to true, even though there may or
+   may not actually be "origin" remote defined in a particular Git
+   repository), "git remote rename" and other commands misinterpreted
+   and behaved as if such a non-existing remote actually existed.
+   (merge e459b073fb js/remote-rename-with-half-configured-remote later to maint).
+
+ * A few codepaths had to rely on a global variable when sorting
+   elements of an array because sort(3) API does not allow extra data
+   to be passed to the comparison function.  Use qsort_s() when
+   natively available, and a fallback implementation of it when not,
+   to eliminate the need, which is a prerequisite for making the
+   codepath reentrant.
+
+ * "git fsck --connectivity-check" was not working at all.
+   (merge a2b22854bd jk/fsck-connectivity-check-fix later to maint).
+
+ * After starting "git rebase -i", which first opens the user's editor
+   to edit the series of patches to apply, but before saving the
+   contents of that file, "git status" failed to show the current
+   state (i.e. you are in an interactive rebase session, but you have
+   applied no steps yet) correctly.
+   (merge df9ded4984 js/status-pre-rebase-i later to maint).
+
+ * Test tweak for FreeBSD where /usr/bin/unzip is unsuitable to run
+   our tests but /usr/local/bin/unzip is usable.
+   (merge d98b2c5fce js/unzip-in-usr-bin-workaround later to maint).
+
+ * "git p4" did not work well with multiple git-p4.mapUser entries on
+   Windows.
+   (merge c3c2b05776 gv/mingw-p4-mapuser later to maint).
+
+ * "git help" enumerates executable files in $PATH; the implementation
+   of "is this file executable?" on Windows has been optimized.
+   (merge c755015f79 hv/mingw-help-is-executable later to maint).
+
+ * Test tweaks for those who have default ACL in their git source tree
+   that interfere with the umask test.
+   (merge d549d21307 mm/reset-facl-before-umask-test later to maint).
+
+ * Names of the various hook scripts must be spelled exactly, but on
+   Windows, an .exe binary must be named with .exe suffix; notice
+   $GIT_DIR/hooks/<hookname>.exe as a valid <hookname> hook.
+   (merge 235be51fbe js/mingw-hooks-with-exe-suffix later to maint).
+
+ * Asciidoctor, an alternative reimplementation of AsciiDoc, still
+   needs some changes to work with documents meant to be formatted
+   with AsciiDoc.  "make USE_ASCIIDOCTOR=YesPlease" to use it out of
+   the box to document our pages is getting closer to reality.
+
+ * Correct command line completion (in contrib/) on "git svn"
+   (merge 2cbad17642 ew/complete-svn-authorship-options later to maint).
+
+ * Incorrect usage help message for "git worktree prune" has been fixed.
+   (merge 2488dcab22 ps/worktree-prune-help-fix later to maint).
+
+ * Adjust a perf test to new world order where commands that do
+   require a repository are really strict about having a repository.
+   (merge c86000c1a7 rs/p5302-create-repositories-before-tests later to maint).
+
+ * "git log --graph" did not work well with "--name-only", even though
+   other forms of "diff" output were handled correctly.
+   (merge f5022b5fed jk/log-graph-name-only later to maint).
+
+ * The push-options given via the "--push-options" option were not
+   passed through to external remote helpers such as "smart HTTP" that
+   are invoked via the transport helper.
+
+ * The documentation explained what "git stash" does to the working
+   tree (after stashing away the local changes) in terms of "reset
+   --hard", which was exposing an unnecessary implementation detail.
+   (merge 20a7e06172 tg/stash-doc-cleanup later to maint).
+
+ * When "git p4" imports changelist that removes paths, it failed to
+   convert pathnames when the p4 used encoding different from the one
+   used on the Git side.  This has been corrected.
+   (merge a8b05162e8 ls/p4-path-encoding later to maint).
+
+ * A new coccinelle rule that catches a check of !pointer before the
+   pointer is free(3)d, which most likely is a bug.
+   (merge ec6cd14c7a rs/cocci-check-free-only-null later to maint).
+
+ * "ls-files" run with pathspec has been micro-optimized to avoid
+   having to memmove(3) unnecessary bytes.
+   (merge 96f6d3f61a rs/ls-files-partial-optim later to maint).
+
+ * A hotfix for a topic already in 'master'.
+   (merge a4d92d579f js/mingw-isatty later to maint).
+
+ * Other minor doc, test and build updates and code cleanups.
+   (merge f2627d9b19 sb/submodule-config-cleanup later to maint).
+   (merge 384f1a167b sb/unpack-trees-cleanup later to maint).
+   (merge 874444b704 rh/diff-orderfile-doc later to maint).
+   (merge eafd5d9483 cw/doc-sign-off later to maint).
+   (merge 0aaad415bc rs/absolute-pathdup later to maint).
+   (merge 4432dd6b5b rs/receive-pack-cleanup later to maint).
+   (merge 540a398e9c sg/mailmap-self later to maint).
+   (merge 209df269a6 nd/rev-list-all-includes-HEAD-doc later to maint).
+   (merge 941b9c5270 sb/doc-unify-bottom later to maint).
+   (merge 2aaf37b62c jk/doc-remote-helpers-markup-fix later to maint).
+   (merge e91461b332 jk/doc-submodule-markup-fix later to maint).
+   (merge 8ab9740d9f dp/submodule-doc-markup-fix later to maint).
+   (merge 0838cbc22f jk/tempfile-ferror-fclose-confusion later to maint).
+   (merge 115a40add6 dr/doc-check-ref-format-normalize later to maint).
+   (merge 133f0a299d gp/document-dotfiles-in-templates-are-not-copied later to maint).
+   (merge 2b35a9f4c7 bc/blame-doc-fix later to maint).
+   (merge 7e82388024 ps/doc-gc-aggressive-depth-update later to maint).
+   (merge 9993a7c5f1 bc/worktree-doc-fix-detached later to maint).
+   (merge e519eccdf4 rt/align-add-i-help-text later to maint).
diff --git a/Documentation/RelNotes/2.12.1.txt b/Documentation/RelNotes/2.12.1.txt
new file mode 100644 (file)
index 0000000..a74f7db
--- /dev/null
@@ -0,0 +1,41 @@
+Git v2.12.1 Release Notes
+=========================
+
+Fixes since v2.12
+-----------------
+
+ * Reduce authentication round-trip over HTTP when the server supports
+   just a single authentication method.  This also improves the
+   behaviour when Git is misconfigured to enable http.emptyAuth
+   against a server that does not authenticate without a username
+   (i.e. not using Kerberos etc., which makes http.emptyAuth
+   pointless).
+
+ * Windows port wants to use OpenSSL's implementation of SHA-1
+   routines, so let them.
+
+ * Add 32-bit Linux variant to the set of platforms to be tested with
+   Travis CI.
+
+ * When a redirected http transport gets an error during the
+   redirected request, we ignored the error we got from the server,
+   and ended up giving a not-so-useful error message.
+
+ * The patch subcommand of "git add -i" was meant to have paths
+   selection prompt just like other subcommand, unlike "git add -p"
+   directly jumps to hunk selection.  Recently, this was broken and
+   "add -i" lost the paths selection dialog, but it now has been
+   fixed.
+
+ * Git v2.12 was shipped with an embarrassing breakage where various
+   operations that verify paths given from the user stopped dying when
+   seeing an issue, and instead later triggering segfault.
+
+ * The code to parse "git log -L..." command line was buggy when there
+   are many ranges specified with -L; overrun of the allocated buffer
+   has been fixed.
+
+ * The command-line parsing of "git log -L" copied internal data
+   structures using incorrect size on ILP32 systems.
+
+Also contains various documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.12.2.txt b/Documentation/RelNotes/2.12.2.txt
new file mode 100644 (file)
index 0000000..4419397
--- /dev/null
@@ -0,0 +1,83 @@
+Git v2.12.2 Release Notes
+=========================
+
+Fixes since v2.12.1
+-------------------
+
+ * "git status --porcelain" is supposed to give a stable output, but a
+   few strings were left as translatable by mistake.
+
+ * "Dumb http" transport used to misparse a nonsense http-alternates
+   response, which has been fixed.
+
+ * "git diff --quiet" relies on the size field in diff_filespec to be
+   correctly populated, but diff_populate_filespec() helper function
+   made an incorrect short-cut when asked only to populate the size
+   field for paths that need to go through convert_to_git() (e.g. CRLF
+   conversion).
+
+ * There is no need for Python only to give a few messages to the
+   standard error stream, but we somehow did.
+
+ * A leak in a codepath to read from a packed object in (rare) cases
+   has been plugged.
+
+ * "git upload-pack", which is a counter-part of "git fetch", did not
+   report a request for a ref that was not advertised as invalid.
+   This is generally not a problem (because "git fetch" will stop
+   before making such a request), but is the right thing to do.
+
+ * A "gc.log" file left by a backgrounded "gc --auto" disables further
+   automatic gc; it has been taught to run at least once a day (by
+   default) by ignoring a stale "gc.log" file that is too old.
+
+ * "git remote rm X", when a branch has remote X configured as the
+   value of its branch.*.remote, tried to remove branch.*.remote and
+   branch.*.merge and failed if either is unset.
+
+ * A caller of tempfile API that uses stdio interface to write to
+   files may ignore errors while writing, which is detected when
+   tempfile is closed (with a call to ferror()).  By that time, the
+   original errno that may have told us what went wrong is likely to
+   be long gone and was overwritten by an irrelevant value.
+   close_tempfile() now resets errno to EIO to make errno at least
+   predictable.
+
+ * "git show-branch" expected there were only very short branch names
+   in the repository and used a fixed-length buffer to hold them
+   without checking for overflow.
+
+ * The code that parses header fields in the commit object has been
+   updated for (micro)performance and code hygiene.
+
+ * A test that creates a confusing branch whose name is HEAD has been
+   corrected not to do so.
+
+ * "Cc:" on the trailer part does not have to conform to RFC strictly,
+   unlike in the e-mail header.  "git send-email" has been updated to
+   ignore anything after '>' when picking addresses, to allow non-address
+   cruft like " # stable 4.4" after the address.
+
+ * "git push" had a handful of codepaths that could lead to a deadlock
+   when unexpected error happened, which has been fixed.
+
+ * Code to read submodule.<name>.ignore config did not state the
+   variable name correctly when giving an error message diagnosing
+   misconfiguration.
+
+ * "git ls-remote" and "git archive --remote" are designed to work
+   without being in a directory under Git's control.  However, recent
+   updates revealed that we randomly look into a directory called
+   .git/ without actually doing necessary set-up when working in a
+   repository.  Stop doing so.
+
+ * The code to parse the command line "git grep <patterns>... <rev>
+   [[--] <pathspec>...]" has been cleaned up, and a handful of bugs
+   have been fixed (e.g. we used to check "--" if it is a rev).
+
+ * The code to parse "git -c VAR=VAL cmd" and set configuration
+   variable for the duration of cmd had two small bugs, which have
+   been fixed.
+   This supersedes jc/config-case-cmdline topic that has been discarded.
+
+Also contains various documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.12.3.txt b/Documentation/RelNotes/2.12.3.txt
new file mode 100644 (file)
index 0000000..ebca846
--- /dev/null
@@ -0,0 +1,64 @@
+Git v2.12.3 Release Notes
+=========================
+
+Fixes since v2.12.2
+-------------------
+
+ * The "parse_config_key()" API function has been cleaned up.
+
+ * An helper function to make it easier to append the result from
+   real_path() to a strbuf has been added.
+
+ * The t/perf performance test suite was not prepared to test not so
+   old versions of Git, but now it covers versions of Git that are not
+   so ancient.
+
+ * Picking two versions of Git and running tests to make sure the
+   older one and the newer one interoperate happily has now become
+   possible.
+
+ * Teach the "debug" helper used in the test framework that allows a
+   command to run under "gdb" to make the session interactive.
+
+ * "git repack --depth=<n>" for a long time busted the specified depth
+   when reusing delta from existing packs.  This has been corrected.
+
+ * user.email that consists of only cruft chars should consistently
+   error out, but didn't.
+
+ * A few tests were run conditionally under (rare) conditions where
+   they cannot be run (like running cvs tests under 'root' account).
+
+ * "git branch @" created refs/heads/@ as a branch, and in general the
+   code that handled @{-1} and @{upstream} was a bit too loose in
+   disambiguating.
+
+ * "git fetch" that requests a commit by object name, when the other
+   side does not allow such an request, failed without much
+   explanation.
+
+ * "git filter-branch --prune-empty" drops a single-parent commit that
+   becomes a no-op, but did not drop a root commit whose tree is empty.
+
+ * Recent versions of Git treats http alternates (used in dumb http
+   transport) just like HTTP redirects and requires the client to
+   enable following it, due to security concerns.  But we forgot to
+   give a warning when we decide not to honor the alternates.
+
+ * NO_PTHREADS build has been broken for some time; now fixed.
+
+ * Fix for potential segv introduced in v2.11.0 and later (also
+   v2.10.2).
+
+ * A few unterminated here documents in tests were fixed, which in
+   turn revealed incorrect expectations the tests make. These tests
+   have been updated.
+
+ * "git-shell" rejects a request to serve a repository whose name
+   begins with a dash, which makes it no longer possible to get it
+   confused into spawning service programs like "git-upload-pack" with
+   an option like "--help", which in turn would spawn an interactive
+   pager, instead of working with the repository user asked to access
+   (i.e. the one whose name is "--help").
+
+Also contains various documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.13.0.txt b/Documentation/RelNotes/2.13.0.txt
new file mode 100644 (file)
index 0000000..aa99d4b
--- /dev/null
@@ -0,0 +1,618 @@
+Git 2.13 Release Notes
+======================
+
+Backward compatibility notes.
+
+ * Use of an empty string as a pathspec element that is used for
+   'everything matches' is still warned and Git asks users to use a
+   more explicit '.' for that instead.  The hope is that existing
+   users will not mind this change, and eventually the warning can be
+   turned into a hard error, upgrading the deprecation into removal of
+   this (mis)feature.  That is not scheduled to happen in the upcoming
+   release (yet).
+
+ * The historical argument order "git merge <msg> HEAD <commit>..."
+   has been deprecated for quite some time, and is now removed.
+
+ * The default location "~/.git-credential-cache/socket" for the
+   socket used to communicate with the credential-cache daemon has
+   been moved to "~/.cache/git/credential/socket".
+
+ * Git now avoids blindly falling back to ".git" when the setup
+   sequence said we are _not_ in Git repository.  A corner case that
+   happens to work right now may be broken by a call to die("BUG").
+   We've tried hard to locate such cases and fixed them, but there
+   might still be cases that need to be addressed--bug reports are
+   greatly appreciated.
+
+
+Updates since v2.12
+-------------------
+
+UI, Workflows & Features
+
+ * "git describe" and "git name-rev" have been taught to take more
+   than one refname patterns to restrict the set of refs to base their
+   naming output on, and also learned to take negative patterns to
+   name refs not to be used for naming via their "--exclude" option.
+
+ * Deletion of a branch "foo/bar" could remove .git/refs/heads/foo
+   once there no longer is any other branch whose name begins with
+   "foo/", but we didn't do so so far.  Now we do.
+
+ * When "git merge" detects a path that is renamed in one history
+   while the other history deleted (or modified) it, it now reports
+   both paths to help the user understand what is going on in the two
+   histories being merged.
+
+ * The <url> part in "http.<url>.<variable>" configuration variable
+   can now be spelled with '*' that serves as wildcard.
+   E.g. "http.https://*.example.com.proxy" can be used to specify the
+   proxy used for https://a.example.com, https://b.example.com, etc.,
+   i.e. any host in the example.com domain.
+
+ * "git tag" did not leave useful message when adding a new entry to
+   reflog; this was left unnoticed for a long time because refs/tags/*
+   doesn't keep reflog by default.
+
+ * The "negative" pathspec feature was somewhat more cumbersome to use
+   than necessary in that its short-hand used "!" which needed to be
+   escaped from shells, and it required "exclude from what?" specified.
+
+ * The command line options for ssh invocation needs to be tweaked for
+   some implementations of SSH (e.g. PuTTY plink wants "-P <port>"
+   while OpenSSH wants "-p <port>" to specify port to connect to), and
+   the variant was guessed when GIT_SSH environment variable is used
+   to specify it.  The logic to guess now applies to the command
+   specified by the newer GIT_SSH_COMMAND and also core.sshcommand
+   configuration variable, and comes with an escape hatch for users to
+   deal with misdetected cases.
+
+ * The "--git-path", "--git-common-dir", and "--shared-index-path"
+   options of "git rev-parse" did not produce usable output.  They are
+   now updated to show the path to the correct file, relative to where
+   the caller is.
+
+ * "git diff -W" has been taught to handle the case where a new
+   function is added at the end of the file better.
+
+ * "git update-ref -d" and other operations to delete references did
+   not leave any entry in HEAD's reflog when the reference being
+   deleted was the current branch.  This is not a problem in practice
+   because you do not want to delete the branch you are currently on,
+   but caused renaming of the current branch to something else not to
+   be logged in a useful way.
+
+ * "Cc:" on the trailer part does not have to conform to RFC strictly,
+   unlike in the e-mail header.  "git send-email" has been updated to
+   ignore anything after '>' when picking addresses, to allow non-address
+   cruft like " # stable 4.4" after the address.
+
+ * When "git submodule init" decides that the submodule in the working
+   tree is its upstream, it now gives a warning as it is not a very
+   common setup.
+
+ * "git stash push" takes a pathspec so that the local changes can be
+   stashed away only partially.
+
+ * Documentation for "git ls-files" did not refer to core.quotePath.
+
+ * The experimental "split index" feature has gained a few
+   configuration variables to make it easier to use.
+
+ * From a working tree of a repository, a new option of "rev-parse"
+   lets you ask if the repository is used as a submodule of another
+   project, and where the root level of the working tree of that
+   project (i.e. your superproject) is.
+
+ * The pathspec mechanism learned to further limit the paths that
+   match the pattern to those that have specified attributes attached
+   via the gitattributes mechanism.
+
+ * Our source code has used the SHA1_HEADER cpp macro after "#include"
+   in the C code to switch among the SHA-1 implementations. Instead,
+   list the exact header file names and switch among implementations
+   using "#ifdef BLK_SHA1/#include "block-sha1/sha1.h"/.../#endif";
+   this helps some IDE tools.
+
+ * The start-up sequence of "git" needs to figure out some configured
+   settings before it finds and set itself up in the location of the
+   repository and was quite messy due to its "chicken-and-egg" nature.
+   The code has been restructured.
+
+ * The command line prompt (in contrib/) learned a new 'tag' style
+   that can be specified with GIT_PS1_DESCRIBE_STYLE, to describe a
+   detached HEAD with "git describe --tags".
+
+ * The configuration file learned a new "includeIf.<condition>.path"
+   that includes the contents of the given path only when the
+   condition holds.  This allows you to say "include this work-related
+   bit only in the repositories under my ~/work/ directory".
+
+ * Recent update to "rebase -i" started showing a message that is not
+   a warning with "warning:" prefix by mistake.  This has been fixed.
+
+ * Recently we started passing the "--push-options" through the
+   external remote helper interface; now the "smart HTTP" remote
+   helper understands what to do with the passed information.
+
+ * "git describe --dirty" dies when it cannot be determined if the
+   state in the working tree matches that of HEAD (e.g. broken
+   repository or broken submodule).  The command learned a new option
+   "git describe --broken" to give "$name-broken" (where $name is the
+   description of HEAD) in such a case.
+
+ * "git checkout" is taught the "--recurse-submodules" option.
+
+ * Recent enhancement to "git stash push" command to support pathspec
+   to allow only a subset of working tree changes to be stashed away
+   was found to be too chatty and exposed the internal implementation
+   detail (e.g. when it uses reset to match the index to HEAD before
+   doing other things, output from reset seeped out).  These, and
+   other chattyness has been fixed.
+
+ * "git merge <message> HEAD <commit>" syntax that has been deprecated
+   since October 2007 has been removed.
+
+ * The refs completion for large number of refs has been sped up,
+   partly by giving up disambiguating ambiguous refs and partly by
+   eliminating most of the shell processing between 'git for-each-ref'
+   and 'ls-remote' and Bash's completion facility.
+
+ * On many keyboards, typing "@{" involves holding down SHIFT key and
+   one can easily end up with "@{Up..." when typing "@{upstream}".  As
+   the upstream/push keywords do not appear anywhere else in the syntax,
+   we can safely accept them case insensitively without introducing
+   ambiguity or confusion to solve this.
+
+ * "git tag/branch/for-each-ref" family of commands long allowed to
+   filter the refs by "--contains X" (show only the refs that are
+   descendants of X), "--merged X" (show only the refs that are
+   ancestors of X), "--no-merged X" (show only the refs that are not
+   ancestors of X).  One curious omission, "--no-contains X" (show
+   only the refs that are not descendants of X) has been added to
+   them.
+
+ * The default behaviour of "git log" in an interactive session has
+   been changed to enable "--decorate".
+
+ * The output from "git status --short" has been extended to show
+   various kinds of dirtyness in submodules differently; instead of to
+   "M" for modified, 'm' and '?' can be shown to signal changes only
+   to the working tree of the submodule but not the commit that is
+   checked out.
+
+ * Allow the http.postbuffer configuration variable to be set to a
+   size that can be expressed in size_t, which can be larger than
+   ulong on some platforms.
+
+ * "git rebase" learns "--signoff" option.
+
+ * The completion script (in contrib/) learned to complete "git push
+   --delete b<TAB>" to complete branch name to be deleted.
+
+ * "git worktree add --lock" allows to lock a worktree immediately
+   after it's created. This helps prevent a race between "git worktree
+   add; git worktree lock" and "git worktree prune".
+
+ * Completion for "git checkout <branch>" that auto-creates the branch
+   out of a remote tracking branch can now be disabled, as this
+   completion often gets in the way when completing to checkout an
+   existing local branch that happens to share the same prefix with
+   bunch of remote tracking branches.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * The code to list branches in "git branch" has been consolidated
+   with the more generic ref-filter API.
+
+ * Resource usage while enumerating refs from alternate object store
+   has been optimized to help receiving end of "push" that hosts a
+   repository with many "forks".
+
+ * The gitattributes machinery is being taught to work better in a
+   multi-threaded environment.
+
+ * "git rebase -i" starts using the recently updated "sequencer" code.
+
+ * Code and design clean-up for the refs API.
+
+ * The preload-index code has been taught not to bother with the index
+   entries that are paths that are not checked out by "sparse checkout".
+
+ * Some warning() messages from "git clean" were updated to show the
+   errno from failed system calls.
+
+ * The "parse_config_key()" API function has been cleaned up.
+
+ * A test that creates a confusing branch whose name is HEAD has been
+   corrected not to do so.
+
+ * The code that parses header fields in the commit object has been
+   updated for (micro)performance and code hygiene.
+
+ * An helper function to make it easier to append the result from
+   real_path() to a strbuf has been added.
+
+ * Reduce authentication round-trip over HTTP when the server supports
+   just a single authentication method.  This also improves the
+   behaviour when Git is misconfigured to enable http.emptyAuth
+   against a server that does not authenticate without a username
+   (i.e. not using Kerberos etc., which makes http.emptyAuth
+   pointless).
+
+ * Windows port wants to use OpenSSL's implementation of SHA-1
+   routines, so let them.
+
+ * The t/perf performance test suite was not prepared to test not so
+   old versions of Git, but now it covers versions of Git that are not
+   so ancient.
+
+ * Add 32-bit Linux variant to the set of platforms to be tested with
+   Travis CI.
+
+ * "git branch --list" takes the "--abbrev" and "--no-abbrev" options
+   to control the output of the object name in its "-v"(erbose)
+   output, but a recent update started ignoring them; fix it before
+   the breakage reaches to any released version.
+
+ * Picking two versions of Git and running tests to make sure the
+   older one and the newer one interoperate happily has now become
+   possible.
+
+ * "git tag --contains" used to (ab)use the object bits to keep track
+   of the state of object reachability without clearing them after
+   use; this has been cleaned up and made to use the newer commit-slab
+   facility.
+
+ * The "debug" helper used in the test framework learned to run
+   a command under "gdb" interactively.
+
+ * The "detect attempt to create collisions" variant of SHA-1
+   implementation by Marc Stevens (CWI) and Dan Shumow (Microsoft)
+   has been integrated and made the default.
+
+ * The test framework learned to detect unterminated here documents.
+
+ * The name-hash used for detecting paths that are different only in
+   cases (which matter on case insensitive filesystems) has been
+   optimized to take advantage of multi-threading when it makes sense.
+
+ * An earlier version of sha1dc/sha1.c that was merged to 'master'
+   compiled incorrectly on Windows, which has been fixed.
+
+ * "what URL do we want to update this submodule?" and "are we
+   interested in this submodule?" are split into two distinct
+   concepts, and then the way used to express the latter got extended,
+   paving a way to make it easier to manage a project with many
+   submodules and make it possible to later extend use of multiple
+   worktrees for a project with submodules.
+
+ * Some debugging output from "git describe" were marked for l10n,
+   but some weren't.  Mark missing ones for l10n.
+
+ * Define a new task in .travis.yml that triggers a test session on
+   Windows run elsewhere.
+
+ * Conversion from uchar[20] to struct object_id continues.
+
+ * The "submodule" specific field in the ref_store structure is
+   replaced with a more generic "gitdir" that can later be used also
+   when dealing with ref_store that represents the set of refs visible
+   from the other worktrees.
+
+ * The string-list API used a custom reallocation strategy that was
+   very inefficient, instead of using the usual ALLOC_GROW() macro,
+   which has been fixed.
+   (merge 950a234cbd jh/string-list-micro-optim later to maint).
+
+ * In a 2- and 3-way merge of trees, more than one source trees often
+   end up sharing an identical subtree; optimize by not reading the
+   same tree multiple times in such a case.
+   (merge d12a8cf0af jh/unpack-trees-micro-optim later to maint).
+
+ * The index file has a trailing SHA-1 checksum to detect file
+   corruption, and historically we checked it every time the index
+   file is used.  Omit the validation during normal use, and instead
+   verify only in "git fsck".
+
+ * Having a git command on the upstream side of a pipe in a test
+   script will hide the exit status from the command, which may cause
+   us to fail to notice a breakage; rewrite tests in a script to avoid
+   this issue.
+
+ * Travis CI learns to run coccicheck.
+
+ * "git checkout" that handles a lot of paths has been optimized by
+   reducing the number of unnecessary checks of paths in the
+   has_dir_name() function.
+
+ * The internals of the refs API around the cached refs has been
+   streamlined.
+
+ * Output from perf tests have been updated to align their titles.
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.12
+-----------------
+
+Unless otherwise noted, all the fixes since v2.12 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * "git repack --depth=<n>" for a long time busted the specified depth
+   when reusing delta from existing packs.  This has been corrected.
+
+ * The code to parse the command line "git grep <patterns>... <rev>
+   [[--] <pathspec>...]" has been cleaned up, and a handful of bugs
+   have been fixed (e.g. we used to check "--" if it is a rev).
+
+ * "git ls-remote" and "git archive --remote" are designed to work
+   without being in a directory under Git's control.  However, recent
+   updates revealed that we randomly look into a directory called
+   .git/ without actually doing necessary set-up when working in a
+   repository.  Stop doing so.
+
+ * "git show-branch" expected there were only very short branch names
+   in the repository and used a fixed-length buffer to hold them
+   without checking for overflow.
+
+ * A caller of tempfile API that uses stdio interface to write to
+   files may ignore errors while writing, which is detected when
+   tempfile is closed (with a call to ferror()).  By that time, the
+   original errno that may have told us what went wrong is likely to
+   be long gone and was overwritten by an irrelevant value.
+   close_tempfile() now resets errno to EIO to make errno at least
+   predictable.
+
+ * "git remote rm X", when a branch has remote X configured as the
+   value of its branch.*.remote, tried to remove branch.*.remote and
+   branch.*.merge and failed if either is unset.
+
+ * A "gc.log" file left by a backgrounded "gc --auto" disables further
+   automatic gc; it has been taught to run at least once a day (by
+   default) by ignoring a stale "gc.log" file that is too old.
+
+ * The code to parse "git -c VAR=VAL cmd" and set configuration
+   variable for the duration of cmd had two small bugs, which have
+   been fixed.
+
+ * user.email that consists of only cruft chars should consistently
+   error out, but didn't.
+
+ * "git upload-pack", which is a counter-part of "git fetch", did not
+   report a request for a ref that was not advertised as invalid.
+   This is generally not a problem (because "git fetch" will stop
+   before making such a request), but is the right thing to do.
+
+ * A leak in a codepath to read from a packed object in (rare) cases
+   has been plugged.
+
+ * When a redirected http transport gets an error during the
+   redirected request, we ignored the error we got from the server,
+   and ended up giving a not-so-useful error message.
+
+ * The patch subcommand of "git add -i" was meant to have paths
+   selection prompt just like other subcommand, unlike "git add -p"
+   directly jumps to hunk selection.  Recently, this was broken and
+   "add -i" lost the paths selection dialog, but it now has been
+   fixed.
+
+ * Git v2.12 was shipped with an embarrassing breakage where various
+   operations that verify paths given from the user stopped dying when
+   seeing an issue, and instead later triggering segfault.
+
+ * There is no need for Python only to give a few messages to the
+   standard error stream, but we somehow did.
+
+ * The code to parse "git log -L..." command line was buggy when there
+   are many ranges specified with -L; overrun of the allocated buffer
+   has been fixed.
+
+ * The command-line parsing of "git log -L" copied internal data
+   structures using incorrect size on ILP32 systems.
+
+ * "git diff --quiet" relies on the size field in diff_filespec to be
+   correctly populated, but diff_populate_filespec() helper function
+   made an incorrect short-cut when asked only to populate the size
+   field for paths that need to go through convert_to_git() (e.g. CRLF
+   conversion).
+
+ * A few tests were run conditionally under (rare) conditions where
+   they cannot be run (like running cvs tests under 'root' account).
+
+ * "git branch @" created refs/heads/@ as a branch, and in general the
+   code that handled @{-1} and @{upstream} was a bit too loose in
+   disambiguating.
+
+ * "git fetch" that requests a commit by object name, when the other
+   side does not allow such an request, failed without much
+   explanation.
+
+ * "git filter-branch --prune-empty" drops a single-parent commit that
+   becomes a no-op, but did not drop a root commit whose tree is empty.
+
+ * Recent versions of Git treats http alternates (used in dumb http
+   transport) just like HTTP redirects and requires the client to
+   enable following it, due to security concerns.  But we forgot to
+   give a warning when we decide not to honor the alternates.
+
+ * "git push" had a handful of codepaths that could lead to a deadlock
+   when unexpected error happened, which has been fixed.
+
+ * "Dumb http" transport used to misparse a nonsense http-alternates
+   response, which has been fixed.
+
+ * "git add -p <pathspec>" unnecessarily expanded the pathspec to a
+   list of individual files that matches the pathspec by running "git
+   ls-files <pathspec>", before feeding it to "git diff-index" to see
+   which paths have changes, because historically the pathspec
+   language supported by "diff-index" was weaker.  These days they are
+   equivalent and there is no reason to internally expand it.  This
+   helps both performance and avoids command line argument limit on
+   some platforms.
+   (merge 7288e12cce jk/add-i-use-pathspecs later to maint).
+
+ * "git status --porcelain" is supposed to give a stable output, but a
+   few strings were left as translatable by mistake.
+
+ * "git revert -m 0 $merge_commit" complained that reverting a merge
+   needs to say relative to which parent the reversion needs to
+   happen, as if "-m 0" weren't given.  The correct diagnosis is that
+   "-m 0" does not refer to the first parent ("-m 1" does).  This has
+   been fixed.
+
+ * Code to read submodule.<name>.ignore config did not state the
+   variable name correctly when giving an error message diagnosing
+   misconfiguration.
+
+ * Fix for NO_PTHREADS build.
+
+ * Fix for potential segv introduced in v2.11.0 and later (also
+   v2.10.2) to "git log --pickaxe-regex -S".
+
+ * A few unterminated here documents in tests were fixed, which in
+   turn revealed incorrect expectations the tests make. These tests
+   have been updated.
+
+ * Fix for NO_PTHREADS option.
+   (merge 2225e1ea20 bw/grep-recurse-submodules later to maint).
+
+ * Git now avoids blindly falling back to ".git" when the setup
+   sequence said we are _not_ in Git repository.  A corner case that
+   happens to work right now may be broken by a call to die("BUG").
+   (merge b1ef400eec jk/no-looking-at-dotgit-outside-repo-final later to maint).
+
+ * A few commands that recently learned the "--recurse-submodule"
+   option misbehaved when started from a subdirectory of the
+   superproject.
+   (merge b2dfeb7c00 bw/recurse-submodules-relative-fix later to maint).
+
+ * FreeBSD implementation of getcwd(3) behaved differently when an
+   intermediate directory is unreadable/unsearchable depending on the
+   length of the buffer provided, which our strbuf_getcwd() was not
+   aware of.  strbuf_getcwd() has been taught to cope with it better.
+   (merge a54e938e5b rs/freebsd-getcwd-workaround later to maint).
+
+ * A recent update to "rebase -i" stopped running hooks for the "git
+   commit" command during "reword" action, which has been fixed.
+
+ * Removing an entry from a notes tree and then looking another note
+   entry from the resulting tree using the internal notes API
+   functions did not work as expected.  No in-tree users of the API
+   has such access pattern, but it still is worth fixing.
+
+ * "git receive-pack" could have been forced to die by attempting
+   allocate an unreasonably large amount of memory with a crafted push
+   certificate; this has been fixed.
+   (merge f2214dede9 bc/push-cert-receive-fix later to maint).
+
+ * Update error handling for codepath that deals with corrupt loose
+   objects.
+   (merge 51054177b3 jk/loose-object-info-report-error later to maint).
+
+ * "git diff --submodule=diff" learned to work better in a project
+   with a submodule that in turn has its own submodules.
+   (merge 17b254cda6 sb/show-diff-for-submodule-in-diff-fix later to maint).
+
+ * Update the build dependency so that an update to /usr/bin/perl
+   etc. result in recomputation of perl.mak file.
+   (merge c59c4939c2 ab/regen-perl-mak-with-different-perl later to maint).
+
+ * "git push --recurse-submodules --push-option=<string>" learned to
+   propagate the push option recursively down to pushes in submodules.
+
+ * If a patch e-mail had its first paragraph after an in-body header
+   indented (even after a blank line after the in-body header line),
+   the indented line was mistook as a continuation of the in-body
+   header.  This has been fixed.
+   (merge fd1062e52e lt/mailinfo-in-body-header-continuation later to maint).
+
+ * Clean up fallouts from recent tightening of the set-up sequence,
+   where Git barfs when repository information is accessed without
+   first ensuring that it was started in a repository.
+   (merge bccb22cbb1 jk/no-looking-at-dotgit-outside-repo later to maint).
+
+ * "git p4" used "name-rev HEAD" when it wants to learn what branch is
+   checked out; it should use "symbolic-ref HEAD".
+   (merge eff451101d ld/p4-current-branch-fix later to maint).
+
+ * "http.proxy" set to an empty string is used to disable the usage of
+   proxy.  We broke this early last year.
+   (merge ae51d91105 sr/http-proxy-configuration-fix later to maint).
+
+ * $GIT_DIR may in some cases be normalized with all symlinks resolved
+   while "gitdir" path expansion in the pattern does not receive the
+   same treatment, leading to incorrect mismatch.  This has been fixed.
+
+ * "git submodule" script does not work well with strange pathnames.
+   Protect it from a path with slashes in them, at least.
+
+ * "git fetch-pack" was not prepared to accept ERR packet that the
+   upload-pack can send with a human-readable error message.  It
+   showed the packet contents with ERR prefix, so there was no data
+   loss, but it was redundant to say "ERR" in an error message.
+   (merge 8e2c7bef03 jt/fetch-pack-error-reporting later to maint).
+
+ * "ls-files --recurse-submodules" did not quite work well in a
+   project with nested submodules.
+
+ * gethostname(2) may not NUL terminate the buffer if hostname does
+   not fit; unfortunately there is no easy way to see if our buffer
+   was too small, but at least this will make sure we will not end up
+   using garbage past the end of the buffer.
+   (merge 5781a9a270 dt/xgethostname-nul-termination later to maint).
+
+ * A recent update broke "git add -p ../foo" from a subdirectory.
+
+ * While handy, "git_path()" is a dangerous function to use as a
+   callsite that uses it safely one day can be broken by changes
+   to other code that calls it.  Reduction of its use continues.
+   (merge 16d2676c9e jk/war-on-git-path later to maint).
+
+ * The split-index code configuration code used an unsafe git_path()
+   function without copying its result out.
+
+ * Many stale HTTP(s) links have been updated in our documentation.
+   (merge 613416f0be jk/update-links-in-docs later to maint).
+
+ * "git-shell" rejects a request to serve a repository whose name
+   begins with a dash, which makes it no longer possible to get it
+   confused into spawning service programs like "git-upload-pack" with
+   an option like "--help", which in turn would spawn an interactive
+   pager, instead of working with the repository user asked to access
+   (i.e. the one whose name is "--help").
+
+ * Other minor doc, test and build updates and code cleanups.
+   (merge df2a6e38b7 jk/pager-in-use later to maint).
+   (merge 75ec4a6cb0 ab/branch-list-doc later to maint).
+   (merge 3e5b36c637 sg/skip-prefix-in-prettify-refname later to maint).
+   (merge 2c5e2865cc jk/fast-import-cleanup later to maint).
+   (merge 4473060bc2 ab/test-readme-updates later to maint).
+   (merge 48a96972fd ab/doc-submitting later to maint).
+   (merge f5c2bc2b96 jk/make-coccicheck-detect-errors later to maint).
+   (merge c105f563d1 cc/untracked later to maint).
+   (merge 8668976b53 jc/unused-symbols later to maint).
+   (merge fba275dc93 jc/bs-t-is-not-a-tab-for-sed later to maint).
+   (merge be6ed145de mm/ls-files-s-doc later to maint).
+   (merge 60b091c679 qp/bisect-docfix later to maint).
+   (merge 47242cd103 ah/diff-files-ours-theirs-doc later to maint).
+   (merge 35ad44cbd8 sb/submodule-rm-absorb later to maint).
+   (merge 0301f1fd92 va/i18n-perl-scripts later to maint).
+   (merge 733e064d98 vn/revision-shorthand-for-side-branch-log later to maint).
+   (merge 85999743e7 tb/doc-eol-normalization later to maint).
+   (merge 0747fb49fd jk/loose-object-fsck later to maint).
+   (merge d8f4481c4f jk/quarantine-received-objects later to maint).
+   (merge 7ba1ceef95 xy/format-patch-base later to maint).
+   (merge fa1912c89a rs/misc-cppcheck-fixes later to maint).
+   (merge f17d642d3b ab/push-cas-doc-n-test later to maint).
+   (merge 61e282425a ss/gitmodules-ignore-doc later to maint).
+   (merge 8d3047cd5b ss/submodule-shallow-doc later to maint).
+   (merge 1f9e18b772 jk/prio-queue-avoid-swap-with-self later to maint).
+   (merge 627fde1025 jk/submodule-init-segv-fix later to maint).
+   (merge d395745d81 rg/doc-pull-typofix later to maint).
+   (merge 01e60a9a22 rg/doc-submittingpatches-wordfix later to maint).
+   (merge 501d3cd7b8 sr/hooks-cwd-doc later to maint).
diff --git a/Documentation/RelNotes/2.13.1.txt b/Documentation/RelNotes/2.13.1.txt
new file mode 100644 (file)
index 0000000..ed7cd97
--- /dev/null
@@ -0,0 +1,114 @@
+Git v2.13.1 Release Notes
+=========================
+
+Fixes since v2.13
+-----------------
+
+ * The Web interface to gmane news archive is long gone, even though
+   the articles are still accessible via NTTP.  Replace the links with
+   ones to public-inbox.org.  Because their message identification is
+   based on the actual message-id, it is likely that it will be easier
+   to migrate away from it if/when necessary.
+
+ * Update tests to pass under GETTEXT_POISON (a mechanism to ensure
+   that output strings that should not be translated are not
+   translated by mistake), and tell TravisCI to run them.
+
+ * Setting "log.decorate=false" in the configuration file did not take
+   effect in v2.13, which has been corrected.
+
+ * An earlier update to test 7400 needed to be skipped on CYGWIN.
+
+ * Git sometimes gives an advice in a rhetorical question that does
+   not require an answer, which can confuse new users and non native
+   speakers.  Attempt to rephrase them.
+
+ * "git read-tree -m" (no tree-ish) gave a nonsense suggestion "use
+   --empty if you want to clear the index".  With "-m", such a request
+   will still fail anyway, as you'd need to name at least one tree-ish
+   to be merged.
+
+ * The codepath in "git am" that is used when running "git rebase"
+   leaked memory held for the log message of the commits being rebased.
+
+ * "pack-objects" can stream a slice of an existing packfile out when
+   the pack bitmap can tell that the reachable objects are all needed
+   in the output, without inspecting individual objects.  This
+   strategy however would not work well when "--local" and other
+   options are in use, and need to be disabled.
+
+ * Clarify documentation for include.path and includeIf.<condition>.path
+   configuration variables.
+
+ * Tag objects, which are not reachable from any ref, that point at
+   missing objects were mishandled by "git gc" and friends (they
+   should silently be ignored instead)
+
+ * A few http:// links that are redirected to https:// in the
+   documentation have been updated to https:// links.
+
+ * Make sure our tests would pass when the sources are checked out
+   with "platform native" line ending convention by default on
+   Windows.  Some "text" files out tests use and the test scripts
+   themselves that are meant to be run with /bin/sh, ought to be
+   checked out with eol=LF even on Windows.
+
+ * Fix memory leaks pointed out by Coverity (and people).
+
+ * The receive-pack program now makes sure that the push certificate
+   records the same set of push options used for pushing.
+
+ * "git cherry-pick" and other uses of the sequencer machinery
+   mishandled a trailer block whose last line is an incomplete line.
+   This has been fixed so that an additional sign-off etc. are added
+   after completing the existing incomplete line.
+
+ * The shell completion script (in contrib/) learned "git stash" has
+   a new "push" subcommand.
+
+ * Travis CI gained a task to format the documentation with both
+   AsciiDoc and AsciiDoctor.
+
+ * Update the C style recommendation for notes for translators, as
+   recent versions of gettext tools can work with our style of
+   multi-line comments.
+
+ * "git clone --config var=val" is a way to populate the
+   per-repository configuration file of the new repository, but it did
+   not work well when val is an empty string.  This has been fixed.
+
+ * A few codepaths in "checkout" and "am" working on an unborn branch
+   tried to access an uninitialized piece of memory.
+
+ * "git for-each-ref --format=..." with %(HEAD) in the format used to
+   resolve the HEAD symref as many times as it had processed refs,
+   which was wasteful, and "git branch" shared the same problem.
+
+ * "git interpret-trailers", when used as GIT_EDITOR for "git commit
+   -v", looked for and appended to a trailer block at the very end,
+   i.e. at the end of the "diff" output.  The command has been
+   corrected to pay attention to the cut-mark line "commit -v" adds to
+   the buffer---the real trailer block should appear just before it.
+
+ * A test allowed both "git push" and "git receive-pack" on the other
+   end write their traces into the same file.  This is OK on platforms
+   that allows atomically appending to a file opened with O_APPEND,
+   but on other platforms led to a mangled output, causing
+   intermittent test failures.  This has been fixed by disabling
+   traces from "receive-pack" in the test.
+
+ * "foo\bar\baz" in "git fetch foo\bar\baz", even though there is no
+   slashes in it, cannot be a nickname for a remote on Windows, as
+   that is likely to be a pathname on a local filesystem.
+
+ * The "collision detecting" SHA-1 implementation shipped with 2.13
+   was quite broken on some big-endian platforms and/or platforms that
+   do not like unaligned fetches.  Update to the upstream code which
+   has already fixed these issues.
+
+ * "git am -h" triggered a BUG().
+
+ * The interaction of "url.*.insteadOf" and custom URL scheme's
+   whitelisting is now documented better.
+
+Also contains various documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.13.2.txt b/Documentation/RelNotes/2.13.2.txt
new file mode 100644 (file)
index 0000000..8c2b200
--- /dev/null
@@ -0,0 +1,54 @@
+Git v2.13.2 Release Notes
+=========================
+
+Fixes since v2.13.1
+-------------------
+
+ * The "collision detecting" SHA-1 implementation shipped with 2.13.1
+   was still broken on some platforms.  Update to the upstream code
+   again to take their fix.
+
+ * "git checkout --recurse-submodules" did not quite work with a
+   submodule that itself has submodules.
+
+ * Introduce the BUG() macro to improve die("BUG: ...").
+
+ * The "run-command" API implementation has been made more robust
+   against dead-locking in a threaded environment.
+
+ * A recent update to t5545-push-options.sh started skipping all the
+   tests in the script when a web server testing is disabled or
+   unavailable, not just the ones that require a web server.  Non HTTP
+   tests have been salvaged to always run in this script.
+
+ * "git clean -d" used to clean directories that has ignored files,
+   even though the command should not lose ignored ones without "-x".
+   "git status --ignored"  did not list ignored and untracked files
+   without "-uall".  These have been corrected.
+
+ * The timestamp of the index file is now taken after the file is
+   closed, to help Windows, on which a stale timestamp is reported by
+   fstat() on a file that is opened for writing and data was written
+   but not yet closed.
+
+ * "git pull --rebase --autostash" didn't auto-stash when the local history
+   fast-forwards to the upstream.
+
+ * "git describe --contains" penalized light-weight tags so much that
+   they were almost never considered.  Instead, give them about the
+   same chance to be considered as an annotated tag that is the same
+   age as the underlying commit would.
+
+ * The result from "git diff" that compares two blobs, e.g. "git diff
+   $commit1:$path $commit2:$path", used to be shown with the full
+   object name as given on the command line, but it is more natural to
+   use the $path in the output and use it to look up .gitattributes.
+
+ * A flaky test has been corrected.
+
+ * Help contributors that visit us at GitHub.
+
+ * "git stash push <pathspec>" did not work from a subdirectory at all.
+   Bugfix for a topic in v2.13
+
+Also contains various documentation updates and code clean-ups.
index 08352deaae4763791b70bd172682c1fe5380f7b4..558d465b656a0b606a480e0205443fdc8b0d23fe 100644 (file)
@@ -51,7 +51,7 @@ If your description starts to get too long, that's a sign that you
 probably need to split up your commit to finer grained pieces.
 That being said, patches which plainly describe the things that
 help reviewers check the patch, and future maintainers understand
-the code, are the most beautiful patches.  Descriptions that summarise
+the code, are the most beautiful patches.  Descriptions that summarize
 the point in the subject well, and describe the motivation for the
 change, the approach taken by the change, and if relevant how this
 differs substantially from the prior version, are all good things
@@ -87,7 +87,7 @@ patches separate from other documentation changes.
 Oh, another thing.  We are picky about whitespaces.  Make sure your
 changes do not trigger errors with the sample pre-commit hook shipped
 in templates/hooks--pre-commit.  To help ensure this does not happen,
-run git diff --check on your changes before you commit.
+run "git diff --check" on your changes before you commit.
 
 
 (2) Describe your changes well.
@@ -98,18 +98,23 @@ should skip the full stop.  It is also conventional in most cases to
 prefix the first line with "area: " where the area is a filename or
 identifier for the general area of the code being modified, e.g.
 
-  . archive: ustar header checksum is computed unsigned
-  . git-cherry-pick.txt: clarify the use of revision range notation
+  . doc: clarify distinction between sign-off and pgp-signing
+  . githooks.txt: improve the intro section
 
 If in doubt which identifier to use, run "git log --no-merges" on the
 files you are modifying to see the current conventions.
 
+It's customary to start the remainder of the first line after "area: "
+with a lower-case letter. E.g. "doc: clarify...", not "doc:
+Clarify...", or "githooks.txt: improve...", not "githooks.txt:
+Improve...".
+
 The body should provide a meaningful commit message, which:
 
-  . explains the problem the change tries to solve, iow, what is wrong
+  . explains the problem the change tries to solve, i.e. what is wrong
     with the current code without the change.
 
-  . justifies the way the change solves the problem, iow, why the
+  . justifies the way the change solves the problem, i.e. why the
     result with the change is better.
 
   . alternate solutions considered but discarded, if any.
@@ -117,7 +122,7 @@ The body should provide a meaningful commit message, which:
 Describe your changes in imperative mood, e.g. "make xyzzy do frotz"
 instead of "[This patch] makes xyzzy do frotz" or "[I] changed xyzzy
 to do frotz", as if you are giving orders to the codebase to change
-its behaviour.  Try to make sure your explanation can be understood
+its behavior.  Try to make sure your explanation can be understood
 without external resources. Instead of giving a URL to a mailing list
 archive, summarize the relevant points of the discussion.
 
@@ -129,8 +134,9 @@ with the subject enclosed in a pair of double-quotes, like this:
     noticed that ...
 
 The "Copy commit summary" command of gitk can be used to obtain this
-format.
+format, or this invocation of "git show":
 
+    git show -s --date=short --pretty='format:%h ("%s", %ad)' <commit>
 
 (3) Generate your patch using Git tools out of your commits.
 
@@ -216,12 +222,11 @@ that it will be postponed.
 Exception:  If your mailer is mangling patches then someone may ask
 you to re-send them using MIME, that is OK.
 
-Do not PGP sign your patch, at least for now.  Most likely, your
-maintainer or other people on the list would not have your PGP
-key and would not bother obtaining it anyway.  Your patch is not
-judged by who you are; a good patch from an unknown origin has a
-far better chance of being accepted than a patch from a known,
-respected origin that is done poorly or does incorrect things.
+Do not PGP sign your patch. Most likely, your maintainer or other people on the
+list would not have your PGP key and would not bother obtaining it anyway.
+Your patch is not judged by who you are; a good patch from an unknown origin
+has a far better chance of being accepted than a patch from a known, respected
+origin that is done poorly or does incorrect things.
 
 If you really really really really want to do a PGP signed
 patch, format it as "multipart/signed", not a text/plain message
@@ -246,7 +251,7 @@ patch.
      *2* The mailing list: git@vger.kernel.org
 
 
-(5) Sign your work
+(5) Certify your work by adding your "Signed-off-by: " line
 
 To improve tracking of who did what, we've borrowed the
 "sign-off" procedure from the Linux kernel project on patches
@@ -256,7 +261,7 @@ smaller project it is a good discipline to follow it.
 The sign-off is a simple line at the end of the explanation for
 the patch, which certifies that you wrote it or otherwise have
 the right to pass it on as a open-source patch.  The rules are
-pretty simple: if you can certify the below:
+pretty simple: if you can certify the below D-C-O:
 
         Developer's Certificate of Origin 1.1
 
diff --git a/Documentation/asciidoctor-extensions.rb b/Documentation/asciidoctor-extensions.rb
new file mode 100644 (file)
index 0000000..ec83b49
--- /dev/null
@@ -0,0 +1,28 @@
+require 'asciidoctor'
+require 'asciidoctor/extensions'
+
+module Git
+  module Documentation
+    class LinkGitProcessor < Asciidoctor::Extensions::InlineMacroProcessor
+      use_dsl
+
+      named :chrome
+
+      def process(parent, target, attrs)
+        if parent.document.basebackend? 'html'
+          prefix = parent.document.attr('git-relative-html-prefix')
+          %(<a href="#{prefix}#{target}.html">#{target}(#{attrs[1]})</a>\n)
+        elsif parent.document.basebackend? 'docbook'
+          "<citerefentry>\n" \
+            "<refentrytitle>#{target}</refentrytitle>" \
+            "<manvolnum>#{attrs[1]}</manvolnum>\n" \
+          "</citerefentry>\n"
+        end
+      end
+    end
+  end
+end
+
+Asciidoctor::Extensions.register do
+  inline_macro Git::Documentation::LinkGitProcessor, :linkgit
+end
index 02cb6845cd96194b655c9898189c4d5f24ca6a92..dc41957afab25d08cf6fc530cde97b91bed8e06e 100644 (file)
@@ -28,12 +28,13 @@ include::line-range-format.txt[]
 -S <revs-file>::
        Use revisions from revs-file instead of calling linkgit:git-rev-list[1].
 
---reverse::
+--reverse <rev>..<rev>::
        Walk history forward instead of backward. Instead of showing
        the revision in which a line appeared, this shows the last
        revision in which a line has existed. This requires a range of
        revision like START..END where the path to blame exists in
-       START.
+       START.  `git blame --reverse START` is taken as `git blame
+       --reverse START..HEAD` for convenience.
 
 -p::
 --porcelain::
@@ -76,7 +77,7 @@ include::line-range-format.txt[]
        terminal. Can't use `--progress` together with `--porcelain`
        or `--incremental`.
 
--M|<num>|::
+-M[<num>]::
        Detect moved or copied lines within a file. When a commit
        moves or copies a block of lines (e.g. the original file
        has A and then B, and the commit changes it to B and then
@@ -92,7 +93,7 @@ alphanumeric characters that Git must detect as moving/copying
 within a file for it to associate those lines with the parent
 commit. The default value is 20.
 
--C|<num>|::
+-C[<num>]::
        In addition to `-M`, detect lines moved or copied from other
        files that were modified in the same commit.  This is
        useful when you reorganize your program and move code
index 87437f8a95768595e040b8c4c1d48e5c29ada087..14d2f834151712fa84e13209a65f0f7121b49dd7 100755 (executable)
@@ -1,9 +1,12 @@
 #!/usr/bin/perl -w
 
+use strict;
+use warnings;
+
 my @menu = ();
 my $output = $ARGV[0];
 
-open TMP, '>', "$output.tmp";
+open my $tmp, '>', "$output.tmp";
 
 while (<STDIN>) {
        next if (/^\\input texinfo/../\@node Top/);
@@ -11,13 +14,13 @@ while (<STDIN>) {
        if (s/^\@top (.*)/\@node $1,,,Top/) {
                push @menu, $1;
        }
-       s/\(\@pxref{\[(URLS|REMOTES)\]}\)//;
+       s/\(\@pxref\{\[(URLS|REMOTES)\]}\)//;
        s/\@anchor\{[^{}]*\}//g;
-       print TMP;
+       print $tmp $_;
 }
-close TMP;
+close $tmp;
 
-printf '\input texinfo
+print '\input texinfo
 @setfilename gitman.info
 @documentencoding UTF-8
 @dircategory Development
@@ -28,16 +31,16 @@ printf '\input texinfo
 @top Git Manual Pages
 @documentlanguage en
 @menu
-', $menu[0];
+';
 
 for (@menu) {
        print "* ${_}::\n";
 }
 print "\@end menu\n";
-open TMP, '<', "$output.tmp";
-while (<TMP>) {
+open $tmp, '<', "$output.tmp";
+while (<$tmp>) {
        print;
 }
-close TMP;
+close $tmp;
 print "\@bye\n";
 unlink "$output.tmp";
index cbae7a65b60dd027479addbc912b883bc9c5fdd7..a6a589a7353ca7051a94c74b794627a84d60f86c 100644 (file)
@@ -79,18 +79,74 @@ escape sequences) are invalid.
 Includes
 ~~~~~~~~
 
-You can include one config file from another by setting the special
-`include.path` variable to the name of the file to be included. The
-variable takes a pathname as its value, and is subject to tilde
-expansion.
+The `include` and `includeIf` sections allow you to include config
+directives from another source. These sections behave identically to
+each other with the exception that `includeIf` sections may be ignored
+if their condition does not evaluate to true; see "Conditional includes"
+below.
 
-The
-included file is expanded immediately, as if its contents had been
-found at the location of the include directive. If the value of the
-`include.path` variable is a relative path, the path is considered to be
-relative to the configuration file in which the include directive was
-found.  See below for examples.
+You can include a config file from another by setting the special
+`include.path` (or `includeIf.*.path`) variable to the name of the file
+to be included. The variable takes a pathname as its value, and is
+subject to tilde expansion. These variables can be given multiple times.
 
+The contents of the included file are inserted immediately, as if they
+had been found at the location of the include directive. If the value of the
+variable is a relative path, the path is considered to
+be relative to the configuration file in which the include directive
+was found.  See below for examples.
+
+Conditional includes
+~~~~~~~~~~~~~~~~~~~~
+
+You can include a config file from another conditionally by setting a
+`includeIf.<condition>.path` variable to the name of the file to be
+included.
+
+The condition starts with a keyword followed by a colon and some data
+whose format and meaning depends on the keyword. Supported keywords
+are:
+
+`gitdir`::
+
+       The data that follows the keyword `gitdir:` is used as a glob
+       pattern. If the location of the .git directory matches the
+       pattern, the include condition is met.
++
+The .git location may be auto-discovered, or come from `$GIT_DIR`
+environment variable. If the repository is auto discovered via a .git
+file (e.g. from submodules, or a linked worktree), the .git location
+would be the final location where the .git directory is, not where the
+.git file is.
++
+The pattern can contain standard globbing wildcards and two additional
+ones, `**/` and `/**`, that can match multiple path components. Please
+refer to linkgit:gitignore[5] for details. For convenience:
+
+ * If the pattern starts with `~/`, `~` will be substituted with the
+   content of the environment variable `HOME`.
+
+ * If the pattern starts with `./`, it is replaced with the directory
+   containing the current config file.
+
+ * If the pattern does not start with either `~/`, `./` or `/`, `**/`
+   will be automatically prepended. For example, the pattern `foo/bar`
+   becomes `**/foo/bar` and would match `/any/path/to/foo/bar`.
+
+ * If the pattern ends with `/`, `**` will be automatically added. For
+   example, the pattern `foo/` becomes `foo/**`. In other words, it
+   matches "foo" and everything inside, recursively.
+
+`gitdir/i`::
+       This is the same as `gitdir` except that matching is done
+       case-insensitively (e.g. on case-insensitive file sytems)
+
+A few more notes on matching via `gitdir` and `gitdir/i`:
+
+ * Symlinks in `$GIT_DIR` are not resolved before matching.
+
+ * Note that "../" is not special and will match literally, which is
+   unlikely what you want.
 
 Example
 ~~~~~~~
@@ -116,9 +172,26 @@ Example
 
        [include]
                path = /path/to/foo.inc ; include by absolute path
-               path = foo ; expand "foo" relative to the current file
-               path = ~/foo ; expand "foo" in your `$HOME` directory
+               path = foo.inc ; find "foo.inc" relative to the current file
+               path = ~/foo.inc ; find "foo.inc" in your `$HOME` directory
+
+       ; include if $GIT_DIR is /path/to/foo/.git
+       [includeIf "gitdir:/path/to/foo/.git"]
+               path = /path/to/foo.inc
 
+       ; include for all repositories inside /path/to/group
+       [includeIf "gitdir:/path/to/group/"]
+               path = /path/to/foo.inc
+
+       ; include for all repositories inside $HOME/to/group
+       [includeIf "gitdir:~/to/group/"]
+               path = /path/to/foo.inc
+
+       ; relative paths are always relative to the including
+       ; file (if the condition is true); their location is not
+       ; affected by the condition
+       [includeIf "gitdir:/path/to/group/"]
+               path = foo.inc
 
 Values
 ~~~~~~
@@ -170,6 +243,9 @@ The position of any attributes with respect to the colors
 be turned off by prefixing them with `no` or `no-` (e.g., `noreverse`,
 `no-ul`, etc).
 +
+An empty color string produces no color effect at all. This can be used
+to avoid coloring specific elements without disabling color entirely.
++
 For git's pre-defined color slots, the attributes are meant to be reset
 at the beginning of each item in the colored output. So setting
 `color.decorate.branch` to `black` will paint that branch name in a
@@ -269,7 +345,7 @@ core.fileMode::
        is to be honored.
 +
 Some filesystems lose the executable bit when a file that is
-marked as executable is checked out, or checks out an
+marked as executable is checked out, or checks out a
 non-executable file with executable bit on.
 linkgit:git-clone[1] or linkgit:git-init[1] probe the filesystem
 to see if it handles the executable bit correctly
@@ -331,6 +407,10 @@ core.trustctime::
        crawlers and some backup systems).
        See linkgit:git-update-index[1]. True by default.
 
+core.splitIndex::
+       If true, the split-index feature of the index will be used.
+       See linkgit:git-update-index[1]. False by default.
+
 core.untrackedCache::
        Determines what to do about the untracked cache feature of the
        index. It will be kept, if this variable is unset or set to
@@ -347,16 +427,19 @@ core.checkStat::
        all fields, including the sub-second part of mtime and ctime.
 
 core.quotePath::
-       The commands that output paths (e.g. 'ls-files',
-       'diff'), when not given the `-z` option, will quote
-       "unusual" characters in the pathname by enclosing the
-       pathname in a double-quote pair and with backslashes the
-       same way strings in C source code are quoted.  If this
-       variable is set to false, the bytes higher than 0x80 are
-       not quoted but output as verbatim.  Note that double
-       quote, backslash and control characters are always
-       quoted without `-z` regardless of the setting of this
-       variable.
+       Commands that output paths (e.g. 'ls-files', 'diff'), will
+       quote "unusual" characters in the pathname by enclosing the
+       pathname in double-quotes and escaping those characters with
+       backslashes in the same way C escapes control characters (e.g.
+       `\t` for TAB, `\n` for LF, `\\` for backslash) or bytes with
+       values larger than 0x80 (e.g. octal `\302\265` for "micro" in
+       UTF-8).  If this variable is set to false, bytes higher than
+       0x80 are not considered "unusual" any more. Double-quotes,
+       backslash and control characters are always escaped regardless
+       of the setting of this variable.  A simple space character is
+       not considered "unusual".  Many commands can output pathnames
+       completely verbatim using the `-z` option. The default value
+       is true.
 
 core.eol::
        Sets the line ending type to use in the working directory for
@@ -517,10 +600,12 @@ core.logAllRefUpdates::
        "`$GIT_DIR/logs/<ref>`", by appending the new and old
        SHA-1, the date/time and the reason of the update, but
        only when the file exists.  If this configuration
-       variable is set to true, missing "`$GIT_DIR/logs/<ref>`"
+       variable is set to `true`, missing "`$GIT_DIR/logs/<ref>`"
        file is automatically created for branch heads (i.e. under
-       refs/heads/), remote refs (i.e. under refs/remotes/),
-       note refs (i.e. under refs/notes/), and the symbolic ref HEAD.
+       `refs/heads/`), remote refs (i.e. under `refs/remotes/`),
+       note refs (i.e. under `refs/notes/`), and the symbolic ref `HEAD`.
+       If it is set to `always`, then a missing reflog is automatically
+       created for any ref under `refs/`.
 +
 This information can be used to determine what commit
 was the tip of a branch "2 days ago".
@@ -663,13 +748,13 @@ alternative to having an `init.templateDir` where you've changed
 default hooks.
 
 core.editor::
-       Commands such as `commit` and `tag` that lets you edit
-       messages by launching an editor uses the value of this
+       Commands such as `commit` and `tag` that let you edit
+       messages by launching an editor use the value of this
        variable when it is set, and the environment variable
        `GIT_EDITOR` is not set.  See linkgit:git-var[1].
 
 core.commentChar::
-       Commands such as `commit` and `tag` that lets you edit
+       Commands such as `commit` and `tag` that let you edit
        messages consider a line that begins with this character
        commented, and removes them after the editor returns
        (default '#').
@@ -783,10 +868,12 @@ core.sparseCheckout::
        linkgit:git-read-tree[1] for more information.
 
 core.abbrev::
-       Set the length object names are abbreviated to.  If unspecified,
-       many commands abbreviate to 7 hexdigits, which may not be enough
-       for abbreviated object names to stay unique for sufficiently long
-       time.
+       Set the length object names are abbreviated to.  If
+       unspecified or set to "auto", an appropriate value is
+       computed based on the approximate number of packed objects
+       in your repository, which hopefully is enough for
+       abbreviated object names to stay unique for some time.
+       The minimum length is 4.
 
 add.ignoreErrors::
 add.ignore-errors (deprecated)::
@@ -1396,6 +1483,12 @@ gc.autoDetach::
        Make `git gc --auto` return immediately and run in background
        if the system supports it. Default is true.
 
+gc.logExpiry::
+       If the file gc.log exists, then `git gc --auto` won't run
+       unless that file is more than 'gc.logExpiry' old.  Default is
+       "1.day".  See `gc.pruneExpire` for more ways to specify its
+       value.
+
 gc.packRefs::
        Running `git pack-refs` in a repository renders it
        unclonable by Git versions prior to 1.5.1.2 over dumb
@@ -1409,7 +1502,9 @@ gc.pruneExpire::
        Override the grace period with this config variable.  The value
        "now" may be used to disable this grace period and always prune
        unreachable objects immediately, or "never" may be used to
-       suppress pruning.
+       suppress pruning.  This feature helps prevent corruption when
+       'git gc' runs concurrently with another process writing to the
+       repository; see the "NOTES" section of linkgit:git-gc[1].
 
 gc.worktreePruneExpire::
        When 'git gc' is run, it calls
@@ -1736,6 +1831,20 @@ http.emptyAuth::
        a username in the URL, as libcurl normally requires a username for
        authentication.
 
+http.delegation::
+       Control GSSAPI credential delegation. The delegation is disabled
+       by default in libcurl since version 7.21.7. Set parameter to tell
+       the server what it is allowed to delegate when it comes to user
+       credentials. Used with GSS/kerberos. Possible values are:
++
+--
+* `none` - Don't allow any delegation.
+* `policy` - Delegates if and only if the OK-AS-DELEGATE flag is set in the
+  Kerberos service ticket, which is a matter of realm policy.
+* `always` - Unconditionally allow the server to delegate.
+--
+
+
 http.extraHeader::
        Pass an additional HTTP header when communicating with a server.  If
        more than one such entry exists, all of them are added as extra
@@ -1877,6 +1986,16 @@ http.userAgent::
        of common USER_AGENT strings (but not including those like git/1.7.1).
        Can be overridden by the `GIT_HTTP_USER_AGENT` environment variable.
 
+http.followRedirects::
+       Whether git should follow HTTP redirects. If set to `true`, git
+       will transparently follow any redirect issued by a server it
+       encounters. If set to `false`, git will treat all redirects as
+       errors. If set to `initial`, git will follow redirects only for
+       the initial request to a remote, but not for subsequent
+       follow-up HTTP requests. Since git uses the redirected URL as
+       the base for the follow-up requests, this is generally
+       sufficient. The default is `initial`.
+
 http.<url>.*::
        Any of the http.* options above can be applied selectively to some URLs.
        For a config key to match a URL, each element of the config key is
@@ -1887,7 +2006,10 @@ http.<url>.*::
   must match exactly between the config key and the URL.
 
 . Host/domain name (e.g., `example.com` in `https://example.com/`).
-  This field must match exactly between the config key and the URL.
+  This field must match between the config key and the URL. It is
+  possible to specify a `*` as part of the host name to match all subdomains
+  at this level. `https://*.example.com/` for example would match
+  `https://foo.example.com/`, but not `https://foo.bar.example.com/`.
 
 . Port number (e.g., `8080` in `http://example.com:8080/`).
   This field must match exactly between the config key and the URL.
@@ -1922,6 +2044,17 @@ Environment variable settings always override any matches.  The URLs that are
 matched against are those given directly to Git commands.  This means any URLs
 visited as a result of a redirection do not participate in matching.
 
+ssh.variant::
+       Depending on the value of the environment variables `GIT_SSH` or
+       `GIT_SSH_COMMAND`, or the config setting `core.sshCommand`, Git
+       auto-detects whether to adjust its command-line parameters for use
+       with plink or tortoiseplink, as opposed to the default (OpenSSH).
++
+The config variable `ssh.variant` can be set to override this auto-detection;
+valid values are `ssh`, `plink`, `putty` or `tortoiseplink`. Any other value
+will be treated as normal ssh. This setting can be overridden via the
+environment variable `GIT_SSH_VARIANT`.
+
 i18n.commitEncoding::
        Character encoding the commit messages are stored in; Git itself
        does not care per se, but this information is necessary e.g. when
@@ -2009,12 +2142,20 @@ log.follow::
        i.e. it cannot be used to follow multiple files and does not work well
        on non-linear history.
 
+log.graphColors::
+       A list of colors, separated by commas, that can be used to draw
+       history lines in `git log --graph`.
+
 log.showRoot::
        If true, the initial commit will be shown as a big creation event.
        This is equivalent to a diff against an empty tree.
        Tools like linkgit:git-log[1] or linkgit:git-whatchanged[1], which
        normally hide the root commit will now show it. True by default.
 
+log.showSignature::
+       If true, makes linkgit:git-log[1], linkgit:git-show[1], and
+       linkgit:git-whatchanged[1] assume `--show-signature`.
+
 log.mailmap::
        If true, makes linkgit:git-log[1], linkgit:git-show[1], and
        linkgit:git-whatchanged[1] assume `--use-mailmap`.
@@ -2294,6 +2435,52 @@ pretty.<name>::
        Note that an alias with the same name as a built-in format
        will be silently ignored.
 
+protocol.allow::
+       If set, provide a user defined default policy for all protocols which
+       don't explicitly have a policy (`protocol.<name>.allow`).  By default,
+       if unset, known-safe protocols (http, https, git, ssh, file) have a
+       default policy of `always`, known-dangerous protocols (ext) have a
+       default policy of `never`, and all other protocols have a default
+       policy of `user`.  Supported policies:
++
+--
+
+* `always` - protocol is always able to be used.
+
+* `never` - protocol is never able to be used.
+
+* `user` - protocol is only able to be used when `GIT_PROTOCOL_FROM_USER` is
+  either unset or has a value of 1.  This policy should be used when you want a
+  protocol to be directly usable by the user but don't want it used by commands which
+  execute clone/fetch/push commands without user input, e.g. recursive
+  submodule initialization.
+
+--
+
+protocol.<name>.allow::
+       Set a policy to be used by protocol `<name>` with clone/fetch/push
+       commands. See `protocol.allow` above for the available policies.
++
+The protocol names currently used by git are:
++
+--
+  - `file`: any local file-based path (including `file://` URLs,
+    or local paths)
+
+  - `git`: the anonymous git protocol over a direct TCP
+    connection (or proxy, if configured)
+
+  - `ssh`: git over ssh (including `host:path` syntax,
+    `ssh://`, etc).
+
+  - `http`: git over http, both "smart http" and "dumb http".
+    Note that this does _not_ include `https`; if you want to configure
+    both, you must do so individually.
+
+  - any external helpers are named by their protocol (e.g., use
+    `hg` to allow the `git-remote-hg` helper)
+--
+
 pull.ff::
        By default, Git does not create an extra merge commit when merging
        a commit that is a descendant of the current commit. Instead, the
@@ -2350,6 +2537,8 @@ push.default::
   pushing to the same repository you would normally pull from
   (i.e. central workflow).
 
+* `tracking` - This is a deprecated synonym for `upstream`.
+
 * `simple` - in centralized workflow, work like `upstream` with an
   added safety to refuse to push if the upstream branch's name is
   different from the local one.
@@ -2447,9 +2636,8 @@ receive.advertiseAtomic::
        capability, set this variable to false.
 
 receive.advertisePushOptions::
-       By default, git-receive-pack will advertise the push options
-       capability to its clients. If you don't want to advertise this
-       capability, set this variable to false.
+       When set to true, git-receive-pack will advertise the push options
+       capability to its clients. False by default.
 
 receive.autogc::
        By default, git-receive-pack will run "git-gc --auto" after
@@ -2523,6 +2711,12 @@ receive.unpackLimit::
        especially on slow filesystems.  If not set, the value of
        `transfer.unpackLimit` is used instead.
 
+receive.maxInputSize::
+       If the size of the incoming pack stream is larger than this
+       limit, then git-receive-pack will error out, instead of
+       accepting the pack file. If not set or set to 0, then the size
+       is unlimited.
+
 receive.denyDeletes::
        If set to true, git-receive-pack will deny a ref update that deletes
        the ref. Use this to prevent such a ref deletion via a push.
@@ -2739,6 +2933,31 @@ showbranch.default::
        The default set of branches for linkgit:git-show-branch[1].
        See linkgit:git-show-branch[1].
 
+splitIndex.maxPercentChange::
+       When the split index feature is used, this specifies the
+       percent of entries the split index can contain compared to the
+       total number of entries in both the split index and the shared
+       index before a new shared index is written.
+       The value should be between 0 and 100. If the value is 0 then
+       a new shared index is always written, if it is 100 a new
+       shared index is never written.
+       By default the value is 20, so a new shared index is written
+       if the number of entries in the split index would be greater
+       than 20 percent of the total number of entries.
+       See linkgit:git-update-index[1].
+
+splitIndex.sharedIndexExpire::
+       When the split index feature is used, shared index files that
+       were not modified since the time this variable specifies will
+       be removed when a new shared index file is created. The value
+       "now" expires all entries immediately, and "never" suppresses
+       expiration altogether.
+       The default value is "2.weeks.ago".
+       Note that a shared index file is considered modified (for the
+       purpose of expiration) each time a new split-index file is
+       either created based on it or read from it.
+       See linkgit:git-update-index[1].
+
 status.relativePaths::
        By default, linkgit:git-status[1] shows paths relative to the
        current directory. Setting this variable to `false` shows paths
@@ -2809,8 +3028,9 @@ submodule.<name>.url::
        The URL for a submodule. This variable is copied from the .gitmodules
        file to the git config via 'git submodule init'. The user can change
        the configured URL before obtaining the submodule via 'git submodule
-       update'. After obtaining the submodule, the presence of this variable
-       is used as a sign whether the submodule is of interest to git commands.
+       update'. If neither submodule.<name>.active or submodule.active are
+       set, the presence of this variable is used as a fallback to indicate
+       whether the submodule is of interest to git commands.
        See linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
 
 submodule.<name>.update::
@@ -2848,12 +3068,34 @@ submodule.<name>.ignore::
        "--ignore-submodules" option. The 'git submodule' commands are not
        affected by this setting.
 
+submodule.<name>.active::
+       Boolean value indicating if the submodule is of interest to git
+       commands.  This config option takes precedence over the
+       submodule.active config option.
+
+submodule.active::
+       A repeated field which contains a pathspec used to match against a
+       submodule's path to determine if the submodule is of interest to git
+       commands.
+
 submodule.fetchJobs::
        Specifies how many submodules are fetched/cloned at the same time.
        A positive integer allows up to that number of submodules fetched
        in parallel. A value of 0 will give some reasonable default.
        If unset, it defaults to 1.
 
+submodule.alternateLocation::
+       Specifies how the submodules obtain alternates when submodules are
+       cloned. Possible values are `no`, `superproject`.
+       By default `no` is assumed, which doesn't add references. When the
+       value is set to `superproject` the submodule to be cloned computes
+       its alternates location relative to the superprojects alternate.
+
+submodule.alternateErrorStrategy::
+       Specifies how to treat errors with the alternates for a submodule
+       as computed via `submodule.alternateLocation`. Possible values are
+       `ignore`, `info`, `die`. Default is `die`.
+
 tag.forceSignAnnotated::
        A boolean to specify whether annotated tags created should be GPG signed.
        If `--annotate` is specified on the command line, it takes
@@ -2898,6 +3140,11 @@ is omitted from the advertisements but `refs/heads/master` and
 `refs/namespaces/bar/refs/heads/master` are still advertised as so-called
 "have" lines. In order to match refs before stripping, add a `^` in front of
 the ref name. If you combine `!` and `^`, `!` must be specified first.
++
+Even if you hide refs, a client may still be able to steal the target
+objects via the techniques described in the "SECURITY" section of the
+linkgit:gitnamespaces[7] man page; it's best to keep private data in a
+separate repository.
 
 transfer.unpackLimit::
        When `fetch.unpackLimit` or `receive.unpackLimit` are
@@ -2907,7 +3154,7 @@ transfer.unpackLimit::
 uploadarchive.allowUnreachable::
        If true, allow clients to use `git archive --remote` to request
        any tree, whether reachable from the ref tips or not. See the
-       discussion in the `SECURITY` section of
+       discussion in the "SECURITY" section of
        linkgit:git-upload-archive[1] for more details. Defaults to
        `false`.
 
@@ -2921,12 +3168,23 @@ uploadpack.allowTipSHA1InWant::
        When `uploadpack.hideRefs` is in effect, allow `upload-pack`
        to accept a fetch request that asks for an object at the tip
        of a hidden ref (by default, such a request is rejected).
-       see also `uploadpack.hideRefs`.
+       See also `uploadpack.hideRefs`.  Even if this is false, a client
+       may be able to steal objects via the techniques described in the
+       "SECURITY" section of the linkgit:gitnamespaces[7] man page; it's
+       best to keep private data in a separate repository.
 
 uploadpack.allowReachableSHA1InWant::
        Allow `upload-pack` to accept a fetch request that asks for an
        object that is reachable from any ref tip. However, note that
        calculating object reachability is computationally expensive.
+       Defaults to `false`.  Even if this is false, a client may be able
+       to steal objects via the techniques described in the "SECURITY"
+       section of the linkgit:gitnamespaces[7] man page; it's best to
+       keep private data in a separate repository.
+
+uploadpack.allowAnySHA1InWant::
+       Allow `upload-pack` to accept a fetch request that asks for any
+       object at all.
        Defaults to `false`.
 
 uploadpack.keepAlive::
@@ -2965,6 +3223,13 @@ url.<base>.insteadOf::
        the best alternative for the particular user, even for a
        never-before-seen repository on the site.  When more than one
        insteadOf strings match a given URL, the longest match is used.
++
+Note that any protocol restrictions will be applied to the rewritten
+URL. If the rewrite changes the URL to use a custom protocol or remote
+helper, you may need to adjust the `protocol.*.allow` config to permit
+the request.  In particular, protocols you expect to use for submodules
+must be set to `always` rather than the default of `user`. See the
+description of `protocol.allow` above.
 
 url.<base>.pushInsteadOf::
        Any URL that starts with this value will not be pushed to;
@@ -3006,17 +3271,39 @@ user.signingKey::
        This option is passed unchanged to gpg's --local-user parameter,
        so you may specify a key using any method that gpg supports.
 
-versionsort.prereleaseSuffix::
-       When version sort is used in linkgit:git-tag[1], prerelease
-       tags (e.g. "1.0-rc1") may appear after the main release
-       "1.0". By specifying the suffix "-rc" in this variable,
-       "1.0-rc1" will appear before "1.0".
-+
-This variable can be specified multiple times, once per suffix. The
-order of suffixes in the config file determines the sorting order
-(e.g. if "-pre" appears before "-rc" in the config file then 1.0-preXX
-is sorted before 1.0-rcXX). The sorting order between different
-suffixes is undefined if they are in multiple config files.
+versionsort.prereleaseSuffix (deprecated)::
+       Deprecated alias for `versionsort.suffix`.  Ignored if
+       `versionsort.suffix` is set.
+
+versionsort.suffix::
+       Even when version sort is used in linkgit:git-tag[1], tagnames
+       with the same base version but different suffixes are still sorted
+       lexicographically, resulting e.g. in prerelease tags appearing
+       after the main release (e.g. "1.0-rc1" after "1.0").  This
+       variable can be specified to determine the sorting order of tags
+       with different suffixes.
++
+By specifying a single suffix in this variable, any tagname containing
+that suffix will appear before the corresponding main release.  E.g. if
+the variable is set to "-rc", then all "1.0-rcX" tags will appear before
+"1.0".  If specified multiple times, once per suffix, then the order of
+suffixes in the configuration will determine the sorting order of tagnames
+with those suffixes.  E.g. if "-pre" appears before "-rc" in the
+configuration, then all "1.0-preX" tags will be listed before any
+"1.0-rcX" tags.  The placement of the main release tag relative to tags
+with various suffixes can be determined by specifying the empty suffix
+among those other suffixes.  E.g. if the suffixes "-rc", "", "-ck" and
+"-bfs" appear in the configuration in this order, then all "v4.8-rcX" tags
+are listed first, followed by "v4.8", then "v4.8-ckX" and finally
+"v4.8-bfsX".
++
+If more than one suffixes match the same tagname, then that tagname will
+be sorted according to the suffix which starts at the earliest position in
+the tagname.  If more than one different matching suffixes start at
+that earliest position, then that tagname will be sorted according to the
+longest of those suffixes.
+The sorting order between different suffixes is undefined if they are
+in multiple config files.
 
 web.browser::
        Specify a web browser that may be used by some commands.
index 35e8da201005dee34b75c87aebf720a8f7300a9c..6926e0a4c86a0c8396d9cca4942a81bbb8e7dc85 100644 (file)
@@ -11,7 +11,7 @@ Git internal format::
        It is `<unix timestamp> <time zone offset>`, where `<unix
        timestamp>` is the number of seconds since the UNIX epoch.
        `<time zone offset>` is a positive or negative offset from UTC.
-       For example CET (which is 2 hours ahead UTC) is `+0200`.
+       For example CET (which is 1 hour ahead of UTC) is `+0100`.
 
 RFC 2822::
        The standard email format as described by RFC 2822, for example
index d5a5b17d508839bc379821ee1a318400a3557fe9..cbce8ec63841e8631f7122dae6e084b15e16832d 100644 (file)
@@ -60,6 +60,12 @@ diff.context::
        Generate diffs with <n> lines of context instead of the default
        of 3. This value is overridden by the -U option.
 
+diff.interHunkContext::
+       Show the context between diff hunks, up to the specified number
+       of lines, thereby fusing the hunks that are close to each other.
+       This value serves as the default for the `--inter-hunk-context`
+       command line option.
+
 diff.external::
        If this config variable is set, diff generation is not
        performed using the internal diff machinery, but using the
@@ -99,9 +105,10 @@ diff.noprefix::
        If set, 'git diff' does not show any source or destination prefix.
 
 diff.orderFile::
-       File indicating how to order files within a diff, using
-       one shell glob pattern per line.
-       Can be overridden by the '-O' option to linkgit:git-diff[1].
+       File indicating how to order files within a diff.
+       See the '-O' option to linkgit:git-diff[1] for details.
+       If `diff.orderFile` is a relative pathname, it is treated as
+       relative to the top of the working tree.
 
 diff.renameLimit::
        The number of files to consider when performing the copy/rename
@@ -122,10 +129,11 @@ diff.suppressBlankEmpty::
 
 diff.submodule::
        Specify the format in which differences in submodules are
-       shown.  The "log" format lists the commits in the range like
-       linkgit:git-submodule[1] `summary` does.  The "short" format
-       format just shows the names of the commits at the beginning
-       and end of the range.  Defaults to short.
+       shown.  The "short" format just shows the names of the commits
+       at the beginning and end of the range. The "log" format lists
+       the commits in the range like linkgit:git-submodule[1] `summary`
+       does. The "diff" format shows an inline diff of the changed
+       contents of the submodule. Defaults to "short".
 
 diff.wordRegex::
        A POSIX Extended Regular Expression used to determine what is a "word"
@@ -170,10 +178,9 @@ diff.tool::
 
 include::mergetools-diff.txt[]
 
-diff.compactionHeuristic::
-       Set this option to `true` to enable an experimental heuristic that
-       shifts the hunk boundary in an attempt to make the resulting
-       patch easier to read.
+diff.indentHeuristic::
+       Set this option to `true` to enable experimental heuristics
+       that shift diff hunk boundaries to make patches easier to read.
 
 diff.algorithm::
        Choose a diff algorithm.  The variants are as follows:
@@ -191,3 +198,9 @@ diff.algorithm::
        low-occurrence common elements".
 --
 +
+
+diff.wsErrorHighlight::
+       A comma separated list of `old`, `new`, `context`, that
+       specifies how whitespace errors on lines are highlighted
+       with `color.diff.whitespace`.  Can be overridden by the
+       command line option `--ws-error-highlight=<kind>`
index cf5262622f6a7f82b3989cbcb4ee1ebd4652b220..706916c94c1d930ef1fe476c7a16c140aeef7420 100644 (file)
@@ -78,9 +78,10 @@ Example:
 :100644 100644 5be4a4...... 000000...... M file.c
 ------------------------------------------------
 
-When `-z` option is not used, TAB, LF, and backslash characters
-in pathnames are represented as `\t`, `\n`, and `\\`,
-respectively.
+Without the `-z` option, pathnames with "unusual" characters are
+quoted as explained for the configuration variable `core.quotePath`
+(see linkgit:git-config[1]).  Using `-z` the filename is output
+verbatim and the line is terminated by a NUL byte.
 
 diff format for merges
 ----------------------
index d2a7ff56e860b92c4dd346a0ea1eb2eb9f7fde79..231105cff48d9c109b2001623c67d51690c595ba 100644 (file)
@@ -53,10 +53,9 @@ The index line includes the SHA-1 checksum before and after the change.
 The <mode> is included if the file mode does not change; otherwise,
 separate lines indicate the old and the new mode.
 
-3.  TAB, LF, double quote and backslash characters in pathnames
-    are represented as `\t`, `\n`, `\"` and `\\`, respectively.
-    If there is need for such substitution then the whole
-    pathname is put in double quotes.
+3.  Pathnames with "unusual" characters are quoted as explained for
+    the configuration variable `core.quotePath` (see
+    linkgit:git-config[1]).
 
 4.  All the `file1` files in the output refer to files before the
     commit, and all the `file2` files refer to files after the commit.
diff --git a/Documentation/diff-heuristic-options.txt b/Documentation/diff-heuristic-options.txt
new file mode 100644 (file)
index 0000000..d4f3d95
--- /dev/null
@@ -0,0 +1,5 @@
+--indent-heuristic::
+--no-indent-heuristic::
+       These are to help debugging and tuning experimental heuristics
+       (which are off by default) that shift diff hunk boundaries to
+       make patches easier to read.
index 705a8739420067d433817c0f855c5cb4ee99559b..89cc0f48deef7152d59f4d4665ff3179ed8e4315 100644 (file)
@@ -63,12 +63,7 @@ ifndef::git-format-patch[]
        Synonym for `-p --raw`.
 endif::git-format-patch[]
 
---compaction-heuristic::
---no-compaction-heuristic::
-       These are to help debugging and tuning an experimental
-       heuristic (which is off by default) that shifts the hunk
-       boundary in an attempt to make the resulting patch easier
-       to read.
+include::diff-heuristic-options.txt[]
 
 --minimal::
        Spend extra time to make sure the smallest possible
@@ -197,10 +192,9 @@ ifndef::git-log[]
        given, do not munge pathnames and use NULs as output field terminators.
 endif::git-log[]
 +
-Without this option, each pathname output will have TAB, LF, double quotes,
-and backslash characters replaced with `\t`, `\n`, `\"`, and `\\`,
-respectively, and the pathname will be enclosed in double quotes if
-any of those replacements occurred.
+Without this option, pathnames with "unusual" characters are quoted as
+explained for the configuration variable `core.quotePath` (see
+linkgit:git-config[1]).
 
 --name-only::
        Show only names of changed files.
@@ -210,13 +204,16 @@ any of those replacements occurred.
        of the `--diff-filter` option on what the status letters mean.
 
 --submodule[=<format>]::
-       Specify how differences in submodules are shown.  When `--submodule`
-       or `--submodule=log` is given, the 'log' format is used.  This format lists
-       the commits in the range like linkgit:git-submodule[1] `summary` does.
-       Omitting the `--submodule` option or specifying `--submodule=short`,
-       uses the 'short' format. This format just shows the names of the commits
-       at the beginning and end of the range.  Can be tweaked via the
-       `diff.submodule` configuration variable.
+       Specify how differences in submodules are shown.  When specifying
+       `--submodule=short` the 'short' format is used.  This format just
+       shows the names of the commits at the beginning and end of the range.
+       When `--submodule` or `--submodule=log` is specified, the 'log'
+       format is used.  This format lists the commits in the range like
+       linkgit:git-submodule[1] `summary` does.  When `--submodule=diff`
+       is specified, the 'diff' format is used.  This format shows an
+       inline diff of the changes in the submodule contents between the
+       commit range.  Defaults to `diff.submodule` or the 'short' format
+       if the config option is unset.
 
 --color[=<when>]::
        Show colored diff.
@@ -310,6 +307,8 @@ ifndef::git-format-patch[]
        lines are highlighted.  E.g. `--ws-error-highlight=new,old`
        highlights whitespace errors on both deleted and added lines.
        `all` can be used as a short-hand for `old,new,context`.
+       The `diff.wsErrorHighlight` configuration variable can be
+       used to specify the default behaviour.
 
 endif::git-format-patch[]
 
@@ -466,11 +465,41 @@ information.
 endif::git-format-patch[]
 
 -O<orderfile>::
-       Output the patch in the order specified in the
-       <orderfile>, which has one shell glob pattern per line.
+       Control the order in which files appear in the output.
        This overrides the `diff.orderFile` configuration variable
        (see linkgit:git-config[1]).  To cancel `diff.orderFile`,
        use `-O/dev/null`.
++
+The output order is determined by the order of glob patterns in
+<orderfile>.
+All files with pathnames that match the first pattern are output
+first, all files with pathnames that match the second pattern (but not
+the first) are output next, and so on.
+All files with pathnames that do not match any pattern are output
+last, as if there was an implicit match-all pattern at the end of the
+file.
+If multiple pathnames have the same rank (they match the same pattern
+but no earlier patterns), their output order relative to each other is
+the normal order.
++
+<orderfile> is parsed as follows:
++
+--
+ - Blank lines are ignored, so they can be used as separators for
+   readability.
+
+ - Lines starting with a hash ("`#`") are ignored, so they can be used
+   for comments.  Add a backslash ("`\`") to the beginning of the
+   pattern if it starts with a hash.
+
+ - Each other line contains a single pattern.
+--
++
+Patterns have the same syntax and semantics as patterns used for
+fnmantch(3) without the FNM_PATHNAME flag, except a pathname also
+matches a pattern if removing any number of the final pathname
+components matches the pattern.  For example, the pattern "`foo*bar`"
+matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`".
 
 ifndef::git-format-patch[]
 -R::
@@ -511,6 +540,8 @@ endif::git-format-patch[]
 --inter-hunk-context=<lines>::
        Show the context between diff hunks, up to the specified number
        of lines, thereby fusing hunks that are close to each other.
+       Defaults to `diff.interHunkContext` or 0 if the config option
+       is unset.
 
 -W::
 --function-context::
@@ -569,5 +600,16 @@ endif::git-format-patch[]
 --no-prefix::
        Do not show any source or destination prefix.
 
+--line-prefix=<prefix>::
+       Prepend an additional prefix to every line of output.
+
+--ita-invisible-in-index::
+       By default entries added by "git add -N" appear as an existing
+       empty file in "git diff" and a new file in "git diff --cached".
+       This option makes the entry appear as a new file in "git diff"
+       and non-existent in "git diff --cached". This option could be
+       reverted with `--ita-visible-in-index`. Both options are
+       experimental and could be removed in future.
+
 For more detailed explanation on these common options, see also
 linkgit:gitdiffcore[7].
index 9eab1f5fa42859651c6a0928ae0434799d5ce30e..fb6bebbc618c3f71ab400ff4267264a0167a887a 100644 (file)
        linkgit:git-clone[1]), deepen or shorten the history to the specified
        number of commits. Tags for the deepened commits are not fetched.
 
+--deepen=<depth>::
+       Similar to --depth, except it specifies the number of commits
+       from the current shallow boundary instead of from the tip of
+       each remote branch history.
+
+--shallow-since=<date>::
+       Deepen or shorten the history of a shallow repository to
+       include all reachable commits after <date>.
+
+--shallow-exclude=<revision>::
+       Deepen or shorten the history of a shallow repository to
+       exclude commits reachable from a specified remote branch or tag.
+       This option can be specified multiple times.
+
 --unshallow::
        If the source repository is complete, convert a shallow
        repository to a complete one, removing all the limitations
index 05fd482b74ed00445613c7cc9b8a0b019ae31550..94be4b85e099f8b67901a737b8347ee02e6c6a6c 100644 (file)
@@ -23,6 +23,7 @@ familiar command name for people coming from other SCM systems.
 OPTIONS
 -------
 include::blame-options.txt[]
+include::diff-heuristic-options.txt[]
 
 SEE ALSO
 --------
index 8ddb207409df99825b561be42234e9c23707287d..631cbd840a08eb29add1e900ac9272992669a75c 100644 (file)
@@ -108,10 +108,9 @@ the information is read from the current index instead.
        When `--numstat` has been given, do not munge pathnames,
        but use a NUL-terminated machine-readable format.
 +
-Without this option, each pathname output will have TAB, LF, double quotes,
-and backslash characters replaced with `\t`, `\n`, `\"`, and `\\`,
-respectively, and the pathname will be enclosed in double quotes if
-any of those replacements occurred.
+Without this option, pathnames with "unusual" characters are quoted as
+explained for the configuration variable `core.quotePath` (see
+linkgit:git-config[1]).
 
 -p<n>::
        Remove <n> leading slashes from traditional diff paths. The
index 163b9f6f4140d787e3edccd7c13deadff789c3f3..ea7065336920756d03329475472016391cec83dc 100644 (file)
@@ -96,7 +96,7 @@ OPTIONS
        pruned.
 
 -a::
-       Attempt to auto-register archives at http://mirrors.sourcecontrol.net
+       Attempt to auto-register archives at `http://mirrors.sourcecontrol.net`
        This is particularly useful with the -D option.
 
 -t <tmpdir>::
index e015f5b3ccc7651def48b63466072ea51eaecaa0..78479b003eb3a340da99c533aece8ee9fc19360c 100644 (file)
@@ -1347,12 +1347,12 @@ author to given a talk and for publishing this paper.
 References
 ----------
 
-- [[[1]]] http://www.nist.gov/public_affairs/releases/n02-10.htm['Software Errors Cost U.S. Economy $59.5 Billion Annually'. Nist News Release.]
-- [[[2]]] http://java.sun.com/docs/codeconv/html/CodeConventions.doc.html#16712['Code Conventions for the Java Programming Language'. Sun Microsystems.]
-- [[[3]]] http://en.wikipedia.org/wiki/Software_maintenance['Software maintenance'. Wikipedia.]
-- [[[4]]] http://article.gmane.org/gmane.comp.version-control.git/45195/[Junio C Hamano. 'Automated bisect success story'. Gmane.]
-- [[[5]]] http://lwn.net/Articles/317154/[Christian Couder. 'Fully automated bisecting with "git bisect run"'. LWN.net.]
-- [[[6]]] http://lwn.net/Articles/277872/[Jonathan Corbet. 'Bisection divides users and developers'. LWN.net.]
-- [[[7]]] http://article.gmane.org/gmane.linux.scsi/36652/[Ingo Molnar. 'Re: BUG 2.6.23-rc3 can't see sd partitions on Alpha'. Gmane.]
-- [[[8]]] http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html[Junio C Hamano and the git-list. 'git-bisect(1) Manual Page'. Linux Kernel Archives.]
-- [[[9]]] http://github.com/Ealdwulf/bbchop[Ealdwulf. 'bbchop'. GitHub.]
+- [[[1]]] https://www.nist.gov/sites/default/files/documents/director/planning/report02-3.pdf['The Economic Impacts of Inadequate Infratructure for Software Testing'.  Nist Planning Report 02-3], see Executive Summary and Chapter 8.
+- [[[2]]] http://www.oracle.com/technetwork/java/codeconvtoc-136057.html['Code Conventions for the Java Programming Language'. Sun Microsystems.]
+- [[[3]]] https://en.wikipedia.org/wiki/Software_maintenance['Software maintenance'. Wikipedia.]
+- [[[4]]] https://public-inbox.org/git/7vps5xsbwp.fsf_-_@assigned-by-dhcp.cox.net/[Junio C Hamano. 'Automated bisect success story'.]
+- [[[5]]] https://lwn.net/Articles/317154/[Christian Couder. 'Fully automated bisecting with "git bisect run"'. LWN.net.]
+- [[[6]]] https://lwn.net/Articles/277872/[Jonathan Corbet. 'Bisection divides users and developers'. LWN.net.]
+- [[[7]]] http://marc.info/?l=linux-kernel&m=119702753411680&w=2[Ingo Molnar. 'Re: BUG 2.6.23-rc3 can't see sd partitions on Alpha'. Linux-kernel mailing list.]
+- [[[8]]] https://www.kernel.org/pub/software/scm/git/docs/git-bisect.html[Junio C Hamano and the git-list. 'git-bisect(1) Manual Page'. Linux Kernel Archives.]
+- [[[9]]] https://github.com/Ealdwulf/bbchop[Ealdwulf. 'bbchop'. GitHub.]
index 2bb9a577a2b4a4e95dcf950239c2ead8d424319f..6c42abf070df93187e11dd31d263b199346cace2 100644 (file)
@@ -18,8 +18,8 @@ on the subcommand:
 
  git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]
                  [--no-checkout] [<bad> [<good>...]] [--] [<paths>...]
- git bisect (bad|new) [<rev>]
- git bisect (good|old) [<rev>...]
+ git bisect (bad|new|<term-new>) [<rev>]
+ git bisect (good|old|<term-old>) [<rev>...]
  git bisect terms [--term-good | --term-bad]
  git bisect skip [(<rev>|<range>)...]
  git bisect reset [<commit>]
@@ -137,7 +137,7 @@ respectively, in place of "good" and "bad". (But note that you cannot
 mix "good" and "bad" with "old" and "new" in a single session.)
 
 In this more general usage, you provide `git bisect` with a "new"
-commit has some property and an "old" commit that doesn't have that
+commit that has some property and an "old" commit that doesn't have that
 property. Each time `git bisect` checks out a commit, you test if that
 commit has the property. If it does, mark the commit as "new";
 otherwise, mark it as "old". When the bisection is done, `git bisect`
index ba5417567c4df286a95a99cf1ae3e02ee466458f..fdc3aea30a4cdb480d469455a66e51a76366be93 100644 (file)
@@ -10,7 +10,7 @@ SYNOPSIS
 [verse]
 'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
            [-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
-           [--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>]
+           [--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>..<rev>]
            [--] <file>
 
 DESCRIPTION
@@ -89,6 +89,8 @@ include::blame-options.txt[]
        abbreviated object name, use <n>+1 digits. Note that 1 column
        is used for a caret to mark the boundary commit.
 
+include::diff-heuristic-options.txt[]
+
 
 THE PORCELAIN FORMAT
 --------------------
index 1fe73448f3f5a3ff48f939924156771cabfc1f77..81bd0a7b7741f175cf7a99e2aa9cbcacf42da78e 100644 (file)
@@ -10,9 +10,10 @@ SYNOPSIS
 [verse]
 'git branch' [--color[=<when>] | --no-color] [-r | -a]
        [--list] [-v [--abbrev=<length> | --no-abbrev]]
-       [--column[=<options>] | --no-column]
-       [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
-       [--points-at <object>] [<pattern>...]
+       [--column[=<options>] | --no-column] [--sort=<key>]
+       [(--merged | --no-merged) [<commit>]]
+       [--contains [<commit]] [--no-contains [<commit>]]
+       [--points-at <object>] [--format=<format>] [<pattern>...]
 'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
 'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
 'git branch' --unset-upstream [<branchname>]
@@ -35,11 +36,12 @@ as branch creation.
 
 With `--contains`, shows only the branches that contain the named commit
 (in other words, the branches whose tip commits are descendants of the
-named commit).  With `--merged`, only branches merged into the named
-commit (i.e. the branches whose tip commits are reachable from the named
-commit) will be listed.  With `--no-merged` only branches not merged into
-the named commit will be listed.  If the <commit> argument is missing it
-defaults to `HEAD` (i.e. the tip of the current branch).
+named commit), `--no-contains` inverts it. With `--merged`, only branches
+merged into the named commit (i.e. the branches whose tip commits are
+reachable from the named commit) will be listed.  With `--no-merged` only
+branches not merged into the named commit will be listed.  If the <commit>
+argument is missing it defaults to `HEAD` (i.e. the tip of the current
+branch).
 
 The command's second form creates a new branch head named <branchname>
 which points to the current `HEAD`, or <start-point> if given.
@@ -91,6 +93,9 @@ OPTIONS
        based sha1 expressions such as "<branchname>@\{yesterday}".
        Note that in non-bare repositories, reflogs are usually
        enabled by default by the `core.logallrefupdates` config option.
+       The negated form `--no-create-reflog` only overrides an earlier
+       `--create-reflog`, but currently does not negate the setting of
+       `core.logallrefupdates`.
 
 -f::
 --force::
@@ -118,6 +123,10 @@ OPTIONS
        default to color output.
        Same as `--color=never`.
 
+-i::
+--ignore-case::
+       Sorting and filtering branches are case insensitive.
+
 --column[=<options>]::
 --no-column::
        Display branch listing in columns. See configuration variable
@@ -135,8 +144,13 @@ This option is only applicable in non-verbose mode.
        List both remote-tracking branches and local branches.
 
 --list::
-       Activate the list mode. `git branch <pattern>` would try to create a branch,
-       use `git branch --list <pattern>` to list matching branches.
+       List branches.  With optional `<pattern>...`, e.g. `git
+       branch --list 'maint-*'`, list only the branches that match
+       the pattern(s).
++
+This should not be confused with `git branch -l <branchname>`,
+which creates a branch named `<branchname>` with a reflog.
+See `--create-reflog` above for details.
 
 -v::
 -vv::
@@ -206,13 +220,19 @@ start-point is either a local or remote-tracking branch.
        Only list branches which contain the specified commit (HEAD
        if not specified). Implies `--list`.
 
+--no-contains [<commit>]::
+       Only list branches which don't contain the specified commit
+       (HEAD if not specified). Implies `--list`.
+
 --merged [<commit>]::
        Only list branches whose tips are reachable from the
-       specified commit (HEAD if not specified). Implies `--list`.
+       specified commit (HEAD if not specified). Implies `--list`,
+       incompatible with `--no-merged`.
 
 --no-merged [<commit>]::
        Only list branches whose tips are not reachable from the
-       specified commit (HEAD if not specified). Implies `--list`.
+       specified commit (HEAD if not specified). Implies `--list`,
+       incompatible with `--merged`.
 
 <branchname>::
        The name of the branch to create or delete.
@@ -246,6 +266,11 @@ start-point is either a local or remote-tracking branch.
 --points-at <object>::
        Only list branches of the given object.
 
+--format <format>::
+       A string that interpolates `%(fieldname)` from the object
+       pointed at by a ref being shown.  The format is the same as
+       that of linkgit:git-for-each-ref[1].
+
 Examples
 --------
 
@@ -284,13 +309,16 @@ If you are creating a branch that you want to checkout immediately, it is
 easier to use the git checkout command with its `-b` option to create
 a branch and check it out with a single command.
 
-The options `--contains`, `--merged` and `--no-merged` serve three related
-but different purposes:
+The options `--contains`, `--no-contains`, `--merged` and `--no-merged`
+serve four related but different purposes:
 
 - `--contains <commit>` is used to find all branches which will need
   special attention if <commit> were to be rebased or amended, since those
   branches contain the specified <commit>.
 
+- `--no-contains <commit>` is the inverse of that, i.e. branches that don't
+  contain the specified <commit>.
+
 - `--merged` is used to find all branches which can be safely deleted,
   since those branches are fully contained by HEAD.
 
index 18d03d8e8b9b0921007d35d5adbaf954d289cdeb..204541c690ce24bdf5b6e20baa0ddca928920f71 100644 (file)
@@ -9,18 +9,22 @@ git-cat-file - Provide content or type and size information for repository objec
 SYNOPSIS
 --------
 [verse]
-'git cat-file' (-t [--allow-unknown-type]| -s [--allow-unknown-type]| -e | -p | <type> | --textconv ) <object>
-'git cat-file' (--batch | --batch-check) [--follow-symlinks]
+'git cat-file' (-t [--allow-unknown-type]| -s [--allow-unknown-type]| -e | -p | <type> | --textconv | --filters ) [--path=<path>] <object>
+'git cat-file' (--batch | --batch-check) [ --textconv | --filters ] [--follow-symlinks]
 
 DESCRIPTION
 -----------
 In its first form, the command provides the content or the type of an object in
 the repository. The type is required unless `-t` or `-p` is used to find the
-object type, or `-s` is used to find the object size, or `--textconv` is used
-(which implies type "blob").
+object type, or `-s` is used to find the object size, or `--textconv` or
+`--filters` is used (which imply type "blob").
 
 In the second form, a list of objects (separated by linefeeds) is provided on
-stdin, and the SHA-1, type, and size of each object is printed on stdout.
+stdin, and the SHA-1, type, and size of each object is printed on stdout. The
+output format can be overridden using the optional `<format>` argument. If
+either `--textconv` or `--filters` was specified, the input is expected to
+list the object names followed by the path name, separated by a single white
+space, so that the appropriate drivers can be determined.
 
 OPTIONS
 -------
@@ -54,19 +58,35 @@ OPTIONS
 
 --textconv::
        Show the content as transformed by a textconv filter. In this case,
-       <object> has be of the form <tree-ish>:<path>, or :<path> in order
-       to apply the filter to the content recorded in the index at <path>.
+       <object> has to be of the form <tree-ish>:<path>, or :<path> in
+       order to apply the filter to the content recorded in the index at
+       <path>.
+
+--filters::
+       Show the content as converted by the filters configured in
+       the current working tree for the given <path> (i.e. smudge filters,
+       end-of-line conversion, etc). In this case, <object> has to be of
+       the form <tree-ish>:<path>, or :<path>.
+
+--path=<path>::
+       For use with --textconv or --filters, to allow specifying an object
+       name and a path separately, e.g. when it is difficult to figure out
+       the revision from which the blob came.
 
 --batch::
 --batch=<format>::
        Print object information and contents for each object provided
-       on stdin.  May not be combined with any other options or arguments.
-       See the section `BATCH OUTPUT` below for details.
+       on stdin.  May not be combined with any other options or arguments
+       except `--textconv` or `--filters`, in which case the input lines
+       also need to specify the path, separated by white space.  See the
+       section `BATCH OUTPUT` below for details.
 
 --batch-check::
 --batch-check=<format>::
        Print object information for each object provided on stdin.  May
-       not be combined with any other options or arguments.  See the
+       not be combined with any other options or arguments except
+       `--textconv` or `--filters`, in which case the input lines also
+       need to specify the path, separated by white space.  See the
        section `BATCH OUTPUT` below for details.
 
 --batch-all-objects::
index 8611a99120eb1c7070b64f80b39b1526225a8019..92777cef25e1145fc2a060d572255be564dec491 100644 (file)
@@ -100,10 +100,10 @@ OPTIONS
 --normalize::
        Normalize 'refname' by removing any leading slash (`/`)
        characters and collapsing runs of adjacent slashes between
-       name components into a single slash.  Iff the normalized
+       name components into a single slash.  If the normalized
        refname is valid then print it to standard output and exit
-       with a status of 0.  (`--print` is a deprecated way to spell
-       `--normalize`.)
+       with a status of 0, otherwise exit with a non-zero status.
+       (`--print` is a deprecated way to spell `--normalize`.)
 
 
 EXAMPLES
index 8e2c0662ddd72c1bc0765aadbbafd22b62b5adf6..d6399c0af86bb84cd86b82500ce706cbcd93cd93 100644 (file)
@@ -256,6 +256,13 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
        out anyway. In other words, the ref can be held by more than one
        worktree.
 
+--[no-]recurse-submodules::
+       Using --recurse-submodules will update the content of all initialized
+       submodules according to the commit recorded in the superproject. If
+       local modifications in a submodule would be overwritten the checkout
+       will fail unless `-f` is used. If nothing (or --no-recurse-submodules)
+       is used, the work trees of submodules will not be updated.
+
 <branch>::
        Branch to checkout; if it refers to a branch (i.e., a name that,
        when prepended with "refs/heads/", is a valid ref), then that
index ec41d3d698a1bcffac3b3a21489b61cc74f9d8d0..30052cce49947914f71b16aa0474bfaa36d13b09 100644 (file)
@@ -14,7 +14,7 @@ SYNOPSIS
          [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
          [--dissociate] [--separate-git-dir <git dir>]
          [--depth <depth>] [--[no-]single-branch]
-         [--recursive | --recurse-submodules] [--[no-]shallow-submodules]
+         [--recurse-submodules] [--[no-]shallow-submodules]
          [--jobs <n>] [--] <repository> [<directory>]
 
 DESCRIPTION
@@ -90,13 +90,16 @@ If you want to break the dependency of a repository cloned with `-s` on
 its source repository, you can simply run `git repack -a` to copy all
 objects from the source repository into a pack in the cloned repository.
 
---reference <repository>::
+--reference[-if-able] <repository>::
        If the reference repository is on the local machine,
        automatically setup `.git/objects/info/alternates` to
        obtain objects from the reference repository.  Using
        an already existing repository as an alternate will
        require fewer objects to be copied from the repository
        being cloned, reducing network and local storage costs.
+       When using the `--reference-if-able`, a non existing
+       directory is skipped with a warning instead of aborting
+       the clone.
 +
 *NOTE*: see the NOTE for the `--shared` option, and also the
 `--dissociate` option.
@@ -194,6 +197,14 @@ objects from the source repository into a pack in the cloned repository.
        tips of all branches. If you want to clone submodules shallowly,
        also pass `--shallow-submodules`.
 
+--shallow-since=<date>::
+       Create a shallow clone with a history after the specified time.
+
+--shallow-exclude=<revision>::
+       Create a shallow clone with a history, excluding commits
+       reachable from a specified remote branch or tag.  This option
+       can be specified multiple times.
+
 --[no-]single-branch::
        Clone only the history leading to the tip of a single branch,
        either specified by the `--branch` option or the primary
@@ -204,10 +215,14 @@ objects from the source repository into a pack in the cloned repository.
        branch when `--single-branch` clone was made, no remote-tracking
        branch is created.
 
---recursive::
---recurse-submodules::
-       After the clone is created, initialize all submodules within,
-       using their default settings. This is equivalent to running
+--recurse-submodules[=<pathspec]::
+       After the clone is created, initialize and clone submodules
+       within based on the provided pathspec.  If no pathspec is
+       provided, all submodules are initialized and cloned.
+       Submodules are initialized and cloned using their default
+       settings.  The resulting clone has `submodule.active` set to
+       the provided pathspec, or "." (meaning all submodules) if no
+       pathspec is provided.  This is equivalent to running
        `git submodule update --init --recursive` immediately after
        the clone is finished. This option is ignored if the cloned
        repository does not have a worktree/checkout (i.e. if any of
index f2ab0ee2e7d1ff0f79c09cbd27e745f5f08d139d..afb06adba433ebc985bf88c318be1ff3e7775162 100644 (file)
@@ -95,7 +95,7 @@ OPTIONS
 
 --reset-author::
        When used with -C/-c/--amend options, or when committing after a
-       conflicting cherry-pick, declare that the authorship of the
+       conflicting cherry-pick, declare that the authorship of the
        resulting commit now belongs to the committer. This also renews
        the author timestamp.
 
@@ -112,14 +112,17 @@ OPTIONS
        `--dry-run`.
 
 --long::
-       When doing a dry-run, give the output in the long-format.
+       When doing a dry-run, give the output in the long-format.
        Implies `--dry-run`.
 
 -z::
 --null::
-       When showing `short` or `porcelain` status output, terminate
-       entries in the status output with NUL, instead of LF. If no
-       format is given, implies the `--porcelain` output format.
+       When showing `short` or `porcelain` status output, print the
+       filename verbatim and terminate the entries with NUL, instead of LF.
+       If no format is given, implies the `--porcelain` output format.
+       Without the `-z` option, filenames with "unusual" characters are
+       quoted as explained for the configuration variable `core.quotePath`
+       (see linkgit:git-config[1]).
 
 -F <file>::
 --file=<file>::
@@ -265,7 +268,8 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
        If this option is specified together with `--amend`, then
        no paths need to be specified, which can be used to amend
        the last commit without committing changes that have
-       already been staged.
+       already been staged. If used together with `--allow-empty`
+       paths are also not required, and an empty commit will be created.
 
 -u[<mode>]::
 --untracked-files[=<mode>]::
@@ -459,7 +463,7 @@ order).  See linkgit:git-var[1] for details.
 HOOKS
 -----
 This command can run `commit-msg`, `prepare-commit-msg`, `pre-commit`,
-and `post-commit` hooks.  See linkgit:githooks[5] for more
+`post-commit` and `post-rewrite` hooks.  See linkgit:githooks[5] for more
 information.
 
 FILES
index 2ff35683e5daac368f959ad6f53d22a77d0d5185..cb9b4d2e460adaa46ee863c37283840c2bdb9333 100644 (file)
@@ -38,6 +38,11 @@ objects nor valid packs
 +
 size-garbage: disk space consumed by garbage files, in KiB (unless -H is
 specified)
++
+alternate: absolute path of alternate object databases; may appear
+multiple times, one line per path. Note that if the path contains
+non-printable characters, it may be surrounded by double-quotes and
+contain C-style backslashed escape sequences.
 
 -H::
 --human-readable::
index 96208f822e0995f97664423038abe1f406431986..2b8582639332acb4d3e81273c6a90163a3a8b378 100644 (file)
@@ -33,10 +33,13 @@ OPTIONS
 --socket <path>::
 
        Use `<path>` to contact a running cache daemon (or start a new
-       cache daemon if one is not started). Defaults to
-       `~/.git-credential-cache/socket`. If your home directory is on a
-       network-mounted filesystem, you may need to change this to a
-       local filesystem. You must specify an absolute path.
+       cache daemon if one is not started).
+       Defaults to `$XDG_CACHE_HOME/git/credential/socket` unless
+       `~/.git-credential-cache/` exists in which case
+       `~/.git-credential-cache/socket` is used instead.
+       If your home directory is on a network-mounted filesystem, you
+       may need to change this to a local filesystem. You must specify
+       an absolute path.
 
 CONTROLLING THE DAEMON
 ----------------------
index e4ac448ff565a0951444d0b1b98b2d5f86f01a9f..26f19d3b072aa358043fbf79f3057a11aee2fdb2 100644 (file)
@@ -30,9 +30,14 @@ OPTIONS
        Commit-ish object names to describe.  Defaults to HEAD if omitted.
 
 --dirty[=<mark>]::
-       Describe the working tree.
-       It means describe HEAD and appends <mark> (`-dirty` by
-       default) if the working tree is dirty.
+--broken[=<mark>]::
+       Describe the state of the working tree.  When the working
+       tree matches HEAD, the output is the same as "git describe
+       HEAD".  If the working tree has local modification "-dirty"
+       is appended to it.  If a repository is corrupt and Git
+       cannot determine if there is local modification, Git will
+       error out, unless `--broken' is given, which appends
+       the suffix "-broken" instead.
 
 --all::
        Instead of using only the annotated tags, use any ref
@@ -83,7 +88,20 @@ OPTIONS
 --match <pattern>::
        Only consider tags matching the given `glob(7)` pattern,
        excluding the "refs/tags/" prefix.  This can be used to avoid
-       leaking private tags from the repository.
+       leaking private tags from the repository. If given multiple times, a
+       list of patterns will be accumulated, and tags matching any of the
+       patterns will be considered. Use `--no-match` to clear and reset the
+       list of patterns.
+
+--exclude <pattern>::
+       Do not consider tags matching the given `glob(7)` pattern, excluding
+       the "refs/tags/" prefix. This can be used to narrow the tag space and
+       find only tags matching some meaningful criteria. If given multiple
+       times, a list of patterns will be accumulated and tags matching any
+       of the patterns will be excluded. When combined with --match a tag will
+       be considered when it matches at least one --match pattern and does not
+       match any of the --exclude patterns. Use `--no-exclude` to clear and
+       reset the list of patterns.
 
 --always::
        Show uniquely abbreviated commit object as fallback.
index bbab35fcaff35ccd5459251550924a42ce2c871e..b0c1bb95c83b8e8e6cf6fa863e74108e3e5fc35f 100644 (file)
@@ -97,6 +97,20 @@ OPTIONS
 :git-diff: 1
 include::diff-options.txt[]
 
+-1 --base::
+-2 --ours::
+-3 --theirs::
+       Compare the working tree with the "base" version (stage #1),
+       "our branch" (stage #2) or "their branch" (stage #3).  The
+       index contains these stages only for unmerged entries i.e.
+       while resolving conflicts.  See linkgit:git-read-tree[1]
+       section "3-Way Merge" for detailed information.
+
+-0::
+       Omit diff output for unmerged entries and just show
+       "Unmerged".  Can be used only when comparing the working tree
+       with the index.
+
 <path>...::
        The <paths> parameters, when given, are used to limit
        the diff to the named paths (you can give directory
index 224fb3090bba3f9dfd98448019a2ff6303b268f7..96c26e6aa82c98da1652023f0d04b4b63c8a4944 100644 (file)
@@ -86,10 +86,11 @@ instead.  `--no-symlinks` is the default on Windows.
        Additionally, `$BASE` is set in the environment.
 
 -g::
---gui::
+--[no-]gui::
        When 'git-difftool' is invoked with the `-g` or `--gui` option
        the default diff tool will be read from the configured
-       `diff.guitool` variable instead of `diff.tool`.
+       `diff.guitool` variable instead of `diff.tool`. The `--no-gui`
+       option can be used to override this setting.
 
 --[no-]trust-exit-code::
        'git-difftool' invokes a diff tool individually on each file.
index 24417ee3a66218c9033f450ca07c7b26a3bcc018..f7ebe36a7b2c203e0b2f320309a5ce6250b12471 100644 (file)
@@ -87,6 +87,20 @@ be in a separate packet, and the list must end with a flush packet.
        'git-upload-pack' treats the special depth 2147483647 as
        infinite even if there is an ancestor-chain that long.
 
+--shallow-since=<date>::
+       Deepen or shorten the history of a shallow'repository to
+       include all reachable commits after <date>.
+
+--shallow-exclude=<revision>::
+       Deepen or shorten the history of a shallow repository to
+       exclude commits reachable from a specified remote branch or tag.
+       This option can be specified multiple times.
+
+--deepen-relative::
+       Argument --depth specifies the number of commits from the
+       current shallow boundary instead of from the tip of each
+       remote branch history.
+
 --no-progress::
        Do not show the progress.
 
@@ -105,9 +119,9 @@ be in a separate packet, and the list must end with a flush packet.
        $GIT_DIR (e.g. "HEAD", "refs/heads/master").  When
        unspecified, update from all heads the remote side has.
 +
-If the remote has enabled the options `uploadpack.allowTipSHA1InWant` or
-`uploadpack.allowReachableSHA1InWant`, they may alternatively be 40-hex
-sha1s present on the remote.
+If the remote has enabled the options `uploadpack.allowTipSHA1InWant`,
+`uploadpack.allowReachableSHA1InWant`, or `uploadpack.allowAnySHA1InWant`,
+they may alternatively be 40-hex sha1s present on the remote.
 
 SEE ALSO
 --------
index 9e4216999d69f448b50d238d22e09289c6780661..b153aefa68c8dcaa5f3600d67c5ff0010ee899af 100644 (file)
@@ -192,6 +192,8 @@ The first command fetches the `maint` branch from the repository at
 objects will eventually be removed by git's built-in housekeeping (see
 linkgit:git-gc[1]).
 
+include::transfer-data-leaks.txt[]
+
 BUGS
 ----
 Using --recurse-submodules can only fetch new commits in already checked
index 0a09698c033fb2e1cdf68aa33eed4f109a034d5f..7b695dbb7267bb8ab3497af133331dd8fbb3c147 100644 (file)
@@ -86,8 +86,7 @@ OPTIONS
        This filter may be used if you only need to modify the environment
        in which the commit will be performed.  Specifically, you might
        want to rewrite the author/committer name/email/time environment
-       variables (see linkgit:git-commit-tree[1] for details).  Do not forget
-       to re-export the variables.
+       variables (see linkgit:git-commit-tree[1] for details).
 
 --tree-filter <command>::
        This is the filter for rewriting the tree and its contents.
@@ -167,14 +166,12 @@ to other tags will be rewritten to point to the underlying commit.
        project root. Implies <<Remap_to_ancestor>>.
 
 --prune-empty::
-       Some kind of filters will generate empty commits, that left the tree
-       untouched.  This switch allow git-filter-branch to ignore such
-       commits.  Though, this switch only applies for commits that have one
-       and only one parent, it will hence keep merges points. Also, this
-       option is not compatible with the use of `--commit-filter`. Though you
-       just need to use the function 'git_commit_non_empty_tree "$@"' instead
-       of the `git commit-tree "$@"` idiom in your commit filter to make that
-       happen.
+       Some filters will generate empty commits that leave the tree untouched.
+       This option instructs git-filter-branch to remove such commits if they
+       have exactly one or zero non-pruned parents; merge commits will
+       therefore remain intact.  This option cannot be used together with
+       `--commit-filter`, though the same effect can be achieved by using the
+       provided `git_commit_non_empty_tree` function in a commit filter.
 
 --original <namespace>::
        Use this option to set the namespace where the original commits
@@ -342,12 +339,10 @@ git filter-branch --env-filter '
        if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
        then
                GIT_AUTHOR_EMAIL=john@example.com
-               export GIT_AUTHOR_EMAIL
        fi
        if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
        then
                GIT_COMMITTER_EMAIL=john@example.com
-               export GIT_COMMITTER_EMAIL
        fi
 ' -- --all
 --------------------------------------------------------
index f57e69bc83e33e3de3d02e339fd71066b93e7d4d..03e187a105b1bd5ffa6e615c2dc9199f0b803e44 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 'git for-each-ref' [--count=<count>] [--shell|--perl|--python|--tcl]
                   [(--sort=<key>)...] [--format=<format>] [<pattern>...]
                   [--points-at <object>] [(--merged | --no-merged) [<object>]]
-                  [--contains [<object>]]
+                  [--contains [<object>]] [--no-contains [<object>]]
 
 DESCRIPTION
 -----------
@@ -69,16 +69,25 @@ OPTIONS
 
 --merged [<object>]::
        Only list refs whose tips are reachable from the
-       specified commit (HEAD if not specified).
+       specified commit (HEAD if not specified),
+       incompatible with `--no-merged`.
 
 --no-merged [<object>]::
        Only list refs whose tips are not reachable from the
-       specified commit (HEAD if not specified).
+       specified commit (HEAD if not specified),
+       incompatible with `--merged`.
 
 --contains [<object>]::
        Only list refs which contain the specified commit (HEAD if not
        specified).
 
+--no-contains [<object>]::
+       Only list refs which don't contain the specified commit (HEAD
+       if not specified).
+
+--ignore-case::
+       Sorting and filtering refs are case insensitive.
+
 FIELD NAMES
 -----------
 
@@ -92,11 +101,20 @@ refname::
        The name of the ref (the part after $GIT_DIR/).
        For a non-ambiguous short name of the ref append `:short`.
        The option core.warnAmbiguousRefs is used to select the strict
-       abbreviation mode. If `strip=<N>` is appended, strips `<N>`
-       slash-separated path components from the front of the refname
-       (e.g., `%(refname:strip=2)` turns `refs/tags/foo` into `foo`.
-       `<N>` must be a positive integer.  If a displayed ref has fewer
-       components than `<N>`, the command aborts with an error.
+       abbreviation mode. If `lstrip=<N>` (`rstrip=<N>`) is appended, strips `<N>`
+       slash-separated path components from the front (back) of the refname
+       (e.g. `%(refname:lstrip=2)` turns `refs/tags/foo` into `foo` and
+       `%(refname:rstrip=2)` turns `refs/tags/foo` into `refs`).
+       If `<N>` is a negative number, strip as many path components as
+       necessary from the specified end to leave `-<N>` path components
+       (e.g. `%(refname:lstrip=-2)` turns
+       `refs/tags/foo` into `tags/foo` and `%(refname:rstrip=-1)`
+       turns `refs/tags/foo` into `refs`). When the ref does not have
+       enough components, the result becomes an empty string if
+       stripping with positive <N>, or it becomes the full refname if
+       stripping with negative <N>.  Neither is an error.
++
+`strip` can be used as a synomym to `lstrip`.
 
 objecttype::
        The type of the object (`blob`, `tree`, `commit`, `tag`).
@@ -107,21 +125,31 @@ objectsize::
 objectname::
        The object name (aka SHA-1).
        For a non-ambiguous abbreviation of the object name append `:short`.
+       For an abbreviation of the object name with desired length append
+       `:short=<length>`, where the minimum length is MINIMUM_ABBREV. The
+       length may be exceeded to ensure unique object names.
 
 upstream::
        The name of a local ref which can be considered ``upstream''
-       from the displayed ref. Respects `:short` in the same way as
-       `refname` above.  Additionally respects `:track` to show
-       "[ahead N, behind M]" and `:trackshort` to show the terse
-       version: ">" (ahead), "<" (behind), "<>" (ahead and behind),
-       or "=" (in sync).  Has no effect if the ref does not have
-       tracking information associated with it.
+       from the displayed ref. Respects `:short`, `:lstrip` and
+       `:rstrip` in the same way as `refname` above.  Additionally
+       respects `:track` to show "[ahead N, behind M]" and
+       `:trackshort` to show the terse version: ">" (ahead), "<"
+       (behind), "<>" (ahead and behind), or "=" (in sync). `:track`
+       also prints "[gone]" whenever unknown upstream ref is
+       encountered. Append `:track,nobracket` to show tracking
+       information without brackets (i.e "ahead N, behind M").  Has
+       no effect if the ref does not have tracking information
+       associated with it.  All the options apart from `nobracket`
+       are mutually exclusive, but if used together the last option
+       is selected.
 
 push::
-       The name of a local ref which represents the `@{push}` location
-       for the displayed ref. Respects `:short`, `:track`, and
-       `:trackshort` options as `upstream` does. Produces an empty
-       string if no `@{push}` ref is configured.
+       The name of a local ref which represents the `@{push}`
+       location for the displayed ref. Respects `:short`, `:lstrip`,
+       `:rstrip`, `:track`, and `:trackshort` options as `upstream`
+       does. Produces an empty string if no `@{push}` ref is
+       configured.
 
 HEAD::
        '*' if HEAD matches current ref (the checked out branch), ' '
@@ -146,6 +174,25 @@ align::
        quoted, but if nested then only the topmost level performs
        quoting.
 
+if::
+       Used as %(if)...%(then)...%(end) or
+       %(if)...%(then)...%(else)...%(end).  If there is an atom with
+       value or string literal after the %(if) then everything after
+       the %(then) is printed, else if the %(else) atom is used, then
+       everything after %(else) is printed. We ignore space when
+       evaluating the string before %(then), this is useful when we
+       use the %(HEAD) atom which prints either "*" or " " and we
+       want to apply the 'if' condition only on the 'HEAD' ref.
+       Append ":equals=<string>" or ":notequals=<string>" to compare
+       the value between the %(if:...) and %(then) atoms with the
+       given string.
+
+symref::
+       The ref which the given symbolic ref refers to. If not a
+       symbolic ref, nothing is printed. Respects the `:short`,
+       `:lstrip` and `:rstrip` options in the same way as `refname`
+       above.
+
 In addition to the above, for commit and tag objects, the header
 field names (`tree`, `parent`, `object`, `type`, and `tag`) can
 be used to specify the value in the header field.
@@ -165,6 +212,8 @@ of all lines of the commit message up to the first blank line.  The next
 line is 'contents:body', where body is all of the lines after the first
 blank line.  The optional GPG signature is `contents:signature`.  The
 first `N` lines of the message is obtained using `contents:lines=N`.
+Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1]
+are obtained as 'contents:trailers'.
 
 For sorting purposes, fields with numeric values sort in numeric order
 (`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`).
@@ -181,6 +230,14 @@ As a special case for the date-type fields, you may specify a format for
 the date by adding `:` followed by date format name (see the
 values the `--date` option to linkgit:git-rev-list[1] takes).
 
+Some atoms like %(align) and %(if) always require a matching %(end).
+We call them "opening atoms" and sometimes denote them as %($open).
+
+When a scripting language specific quoting is in effect, everything
+between a top-level opening atom and its matching %(end) is evaluated
+according to the semantics of the opening atom and only its result
+from the top-level is quoted.
+
 
 EXAMPLES
 --------
@@ -268,6 +325,22 @@ eval=`git for-each-ref --shell --format="$fmt" \
 eval "$eval"
 ------------
 
+
+An example to show the usage of %(if)...%(then)...%(else)...%(end).
+This prefixes the current branch with a star.
+
+------------
+git for-each-ref --format="%(if)%(HEAD)%(then)* %(else)  %(end)%(refname:short)" refs/heads/
+------------
+
+
+An example to show the usage of %(if)...%(then)...%(end).
+This prints the authorname, if present.
+
+------------
+git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Authored by: %(authorname)%(end)"
+------------
+
 SEE ALSO
 --------
 linkgit:git-show-ref[1]
index 9624c84a658c13758cd3b9de55f47d1e89f7b15d..c890328b02ec4c3a28aaeb8aa057d327c75b9967 100644 (file)
@@ -19,7 +19,8 @@ SYNOPSIS
                   [--start-number <n>] [--numbered-files]
                   [--in-reply-to=Message-Id] [--suffix=.<sfx>]
                   [--ignore-if-in-upstream]
-                  [--subject-prefix=Subject-Prefix] [(--reroll-count|-v) <n>]
+                  [--rfc] [--subject-prefix=Subject-Prefix]
+                  [(--reroll-count|-v) <n>]
                   [--to=<email>] [--cc=<email>]
                   [--[no-]cover-letter] [--quiet] [--notes[=<ref>]]
                   [<common diff options>]
@@ -172,6 +173,11 @@ will want to ensure that threading is disabled for `git send-email`.
        allows for useful naming of a patch series, and can be
        combined with the `--numbered` option.
 
+--rfc::
+       Alias for `--subject-prefix="RFC PATCH"`. RFC means "Request For
+       Comments"; use this when sending an experimental patch for
+       discussion rather than application.
+
 -v <n>::
 --reroll-count=<n>::
        Mark the series as the <n>-th iteration of the topic. The
@@ -233,7 +239,7 @@ keeping them as Git notes allows them to be maintained between versions
 of the patch series (but see the discussion of the `notes.rewrite`
 configuration options in linkgit:git-notes[1] to use this workflow).
 
---[no]-signature=<signature>::
+--[no-]signature=<signature>::
        Add a signature to each message produced. Per RFC 3676 the signature
        is separated from the body by a line with '-- ' on it. If the
        signature option is omitted the signature defaults to the Git version
@@ -551,7 +557,7 @@ series A, B, C, the history would be like:
 ................................................
 
 With `git format-patch --base=P -3 C` (or variants thereof, e.g. with
-`--cover-letter` of using `Z..C` instead of `-3 C` to specify the
+`--cover-letter` or using `Z..C` instead of `-3 C` to specify the
 range), the base tree information block is shown at the end of the
 first message the command outputs (either the first patch, or the
 cover letter), like this:
index bed60f471cd5736b173a2c636717cd566c1e4511..571b5a7e3c9dbc11aafc194b6e08dbbed5b2f7d3 100644 (file)
@@ -63,11 +63,10 @@ automatic consolidation of packs.
 --prune=<date>::
        Prune loose objects older than date (default is 2 weeks ago,
        overridable by the config variable `gc.pruneExpire`).
-       --prune=all prunes loose objects regardless of their age (do
-       not use --prune=all unless you know exactly what you are doing.
-       Unless the repository is quiescent, you will lose newly created
-       objects that haven't been anchored with the refs and end up
-       corrupting your repository).  --prune is on by default.
+       --prune=all prunes loose objects regardless of their age and
+       increases the risk of corruption if another process is writing to
+       the repository concurrently; see "NOTES" below. --prune is on by
+       default.
 
 --no-prune::
        Do not prune any loose objects.
@@ -128,7 +127,7 @@ the documentation for the --window' option in linkgit:git-repack[1] for
 more details.  This defaults to 250.
 
 Similarly, the optional configuration variable `gc.aggressiveDepth`
-controls --depth option in linkgit:git-repack[1]. This defaults to 250.
+controls --depth option in linkgit:git-repack[1]. This defaults to 50.
 
 The optional configuration variable `gc.pruneExpire` controls how old
 the unreferenced loose objects have to be before they are pruned.  The
@@ -138,17 +137,36 @@ default is "2 weeks ago".
 Notes
 -----
 
-'git gc' tries very hard to be safe about the garbage it collects. In
+'git gc' tries very hard not to delete objects that are referenced
+anywhere in your repository. In
 particular, it will keep not only objects referenced by your current set
 of branches and tags, but also objects referenced by the index,
 remote-tracking branches, refs saved by 'git filter-branch' in
 refs/original/, or reflogs (which may reference commits in branches
 that were later amended or rewound).
-
-If you are expecting some objects to be collected and they aren't, check
+If you are expecting some objects to be deleted and they aren't, check
 all of those locations and decide whether it makes sense in your case to
 remove those references.
 
+On the other hand, when 'git gc' runs concurrently with another process,
+there is a risk of it deleting an object that the other process is using
+but hasn't created a reference to. This may just cause the other process
+to fail or may corrupt the repository if the other process later adds a
+reference to the deleted object. Git has two features that significantly
+mitigate this problem:
+
+. Any object with modification time newer than the `--prune` date is kept,
+  along with everything reachable from it.
+
+. Most operations that add an object to the database update the
+  modification time of the object if it is already present so that #1
+  applies.
+
+However, these features fall short of a complete solution, so users who
+run commands concurrently have to live with some risk of corruption (which
+seems to be low in practice) unless they turn off automatic garbage
+collection with 'git config gc.auto 0'.
+
 HOOKS
 -----
 
index 0ecea6e4912f635e2825e8c02a14aef191cd91f1..71f32f35089241bc452cfdccdc6b3e9a30f95366 100644 (file)
@@ -26,6 +26,7 @@ SYNOPSIS
           [--threads <num>]
           [-f <file>] [-e] <pattern>
           [--and|--or|--not|(|)|-e <pattern>...]
+          [--recurse-submodules] [--parent-basename <basename>]
           [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
           [--] [<pathspec>...]
 
@@ -88,6 +89,19 @@ OPTIONS
        mechanism.  Only useful when searching files in the current directory
        with `--no-index`.
 
+--recurse-submodules::
+       Recursively search in each submodule that has been initialized and
+       checked out in the repository.  When used in combination with the
+       <tree> option the prefix of all submodule output will be the name of
+       the parent project's <tree> object.
+
+--parent-basename <basename>::
+       For internal use only.  In order to produce uniform output with the
+       --recurse-submodules option, this option can be used to provide the
+       basename of a parent's <tree> object to a submodule so the submodule
+       can prefix its output with the parent's name rather than the SHA1 of
+       the submodule.
+
 -a::
 --text::
        Process binary files as if they were text.
index c1a3e8bf073f7aef89989356e985861644530a86..5f93f8003d1dfa43b6fab00253a206e47839efda 100644 (file)
@@ -35,7 +35,7 @@ blame::
 
 browser::
        Start a tree browser showing all files in the specified
-       commit (or `HEAD` by default).  Files selected through the
+       commit.  Files selected through the
        browser are opened in the blame viewer.
 
 citool::
index 7a4e0555205be5d8bb26e5a183f1552cc057637a..1b4b65d6657b003079e0407d1da8d8c239933267 100644 (file)
@@ -87,6 +87,8 @@ OPTIONS
        Specifying 0 will cause Git to auto-detect the number of CPU's
        and use maximum 3 threads.
 
+--max-input-size=<size>::
+       Die, if the pack is larger than <size>.
 
 Note
 ----
index 9d27197de8f63e2e7495976af944344436e48302..3c5a67fb9671f8c65e0830222c63bb5035a05c30 100644 (file)
@@ -116,8 +116,8 @@ does not exist, it will be created.
 TEMPLATE DIRECTORY
 ------------------
 
-The template directory contains files and directories that will be copied to
-the `$GIT_DIR` after it is created.
+Files and directories in the template directory whose name do not start with a
+dot will be copied to the `$GIT_DIR` after it is created.
 
 The template directory will be one of the following (in order):
 
index 93d1db65284bca04c4dd75dd060acf5930ceec44..31cdeaecdfde8fb358c35c3a9a2e3c4279d440d0 100644 (file)
@@ -48,19 +48,22 @@ with only spaces at the end of the commit message part, one blank line
 will be added before the new trailer.
 
 Existing trailers are extracted from the input message by looking for
-a group of one or more lines that contain a colon (by default), where
-the group is preceded by one or more empty (or whitespace-only) lines.
+a group of one or more lines that (i) are all trailers, or (ii) contains at
+least one Git-generated or user-configured trailer and consists of at
+least 25% trailers.
+The group must be preceded by one or more empty (or whitespace-only) lines.
 The group must either be at the end of the message or be the last
 non-whitespace lines before a line that starts with '---'. Such three
 minus signs start the patch part of the message.
 
-When reading trailers, there can be whitespaces before and after the
+When reading trailers, there can be whitespaces after the
 token, the separator and the value. There can also be whitespaces
-inside the token and the value.
+inside the token and the value. The value may be split over multiple lines with
+each subsequent line starting with whitespace, like the "folding" in RFC 822.
 
 Note that 'trailers' do not follow and are not intended to follow many
-rules for RFC 822 headers. For example they do not follow the line
-folding rules, the encoding rules and probably many other rules.
+rules for RFC 822 headers. For example they do not follow
+the encoding rules and probably many other rules.
 
 OPTIONS
 -------
@@ -120,7 +123,7 @@ trailer.ifexists::
        same <token> in the message.
 +
 The valid values for this option are: `addIfDifferentNeighbor` (this
-is the default), `addIfDifferent`, `add`, `overwrite` or `doNothing`.
+is the default), `addIfDifferent`, `add`, `replace` or `doNothing`.
 +
 With `addIfDifferentNeighbor`, a new trailer will be added only if no
 trailer with the same (<token>, <value>) pair is above or below the line
index 0d933ac355e8a1bef0758b40d293f2f5a7e7c962..d153c17e0660d8ab9edb0b10a53172007d355510 100644 (file)
@@ -18,7 +18,8 @@ SYNOPSIS
                [--exclude-per-directory=<file>]
                [--exclude-standard]
                [--error-unmatch] [--with-tree=<tree-ish>]
-               [--full-name] [--abbrev] [--] [<file>...]
+               [--full-name] [--recurse-submodules]
+               [--abbrev] [--] [<file>...]
 
 DESCRIPTION
 -----------
@@ -56,7 +57,7 @@ OPTIONS
 
 -s::
 --stage::
-       Show staged contents' object name, mode bits and stage number in the output.
+       Show staged contents' mode bits, object name and stage number in the output.
 
 --directory::
        If a whole directory is classified as "other", show just its
@@ -76,7 +77,8 @@ OPTIONS
        succeed.
 
 -z::
-       \0 line termination on output.
+       \0 line termination on output and do not quote filenames.
+       See OUTPUT below for more information.
 
 -x <pattern>::
 --exclude=<pattern>::
@@ -137,6 +139,10 @@ a space) at the start of each line:
        option forces paths to be output relative to the project
        top directory.
 
+--recurse-submodules::
+       Recursively calls ls-files on each submodule in the repository.
+       Currently there is only support for the --cached mode.
+
 --abbrev[=<n>]::
        Instead of showing the full 40-byte hexadecimal object
        lines, show only a partial prefix.
@@ -191,9 +197,10 @@ the index records up to three such pairs; one from tree O in stage
 the user (or the porcelain) to see what should eventually be recorded at the
 path. (see linkgit:git-read-tree[1] for more information on state)
 
-When `-z` option is not used, TAB, LF, and backslash characters
-in pathnames are represented as `\t`, `\n`, and `\\`,
-respectively.
+Without the `-z` option, pathnames with "unusual" characters are
+quoted as explained for the configuration variable `core.quotePath`
+(see linkgit:git-config[1]).  Using `-z` the filename is output
+verbatim and the line is terminated by a NUL byte.
 
 
 Exclude Patterns
index dbc91f98ffbee198bed7d2eeeb2758687c17adf8..9dee7bef35fb1df1afa2fcabebe22043c66b6fba 100644 (file)
@@ -53,7 +53,8 @@ OPTIONS
        Show object size of blob (file) entries.
 
 -z::
-       \0 line termination on output.
+       \0 line termination on output and do not quote filenames.
+       See OUTPUT FORMAT below for more information.
 
 --name-only::
 --name-status::
@@ -82,8 +83,6 @@ Output Format
 -------------
         <mode> SP <type> SP <object> TAB <file>
 
-Unless the `-z` option is used, TAB, LF, and backslash characters
-in pathnames are represented as `\t`, `\n`, and `\\`, respectively.
 This output format is compatible with what `--index-info --stdin` of
 'git update-index' expects.
 
@@ -95,6 +94,11 @@ Object size identified by <object> is given in bytes, and right-justified
 with minimum width of 7 characters.  Object size is given only for blobs
 (file) entries; for other entries `-` character is used in place of size.
 
+Without the `-z` option, pathnames with "unusual" characters are
+quoted as explained for the configuration variable `core.quotePath`
+(see linkgit:git-config[1]).  Using `-z` the filename is output
+verbatim and the line is terminated by a NUL byte.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
index b758d5556caaeeb0a439d67c46100e5fa0d34cd4..04fdd8cf086db6413a01421c306a80c9583f7fa4 100644 (file)
@@ -13,8 +13,8 @@ SYNOPSIS
        [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
        [--[no-]allow-unrelated-histories]
        [--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]
-'git merge' <msg> HEAD <commit>...
 'git merge' --abort
+'git merge' --continue
 
 DESCRIPTION
 -----------
@@ -45,11 +45,7 @@ a log message from the user describing the changes.
     D---E---F---G---H master
 ------------
 
-The second syntax (<msg> `HEAD` <commit>...) is supported for
-historical reasons.  Do not use it from the command line or in
-new scripts.  It is the same as `git merge -m <msg> <commit>...`.
-
-The third syntax ("`git merge --abort`") can only be run after the
+The second syntax ("`git merge --abort`") can only be run after the
 merge has resulted in conflicts. 'git merge --abort' will abort the
 merge process and try to reconstruct the pre-merge state. However,
 if there were uncommitted changes when the merge started (and
@@ -61,6 +57,8 @@ reconstruct the original (pre-merge) changes. Therefore:
 discouraged: while possible, it may leave you in a state that is hard to
 back out of in the case of a conflict.
 
+The fourth syntax ("`git merge --continue`") can only be run after the
+merge has resulted in conflicts.
 
 OPTIONS
 -------
@@ -99,6 +97,11 @@ commit or stash your changes before running 'git merge'.
 'git merge --abort' is equivalent to 'git reset --merge' when
 `MERGE_HEAD` is present.
 
+--continue::
+       After a 'git merge' stops due to conflicts you can conclude the
+       merge by running 'git merge --continue' (see "HOW TO RESOLVE
+       CONFLICTS" section below).
+
 <commit>...::
        Commits, usually other branch heads, to merge into our branch.
        Specifying more than one commit will create a merge with
index e846c2ed7f7f862f5324c0e95a2b17dabcaac58d..3622d66488c7de057d32e02cd4cfd21704500822 100644 (file)
@@ -79,6 +79,13 @@ success of the resolution after the custom tool has exited.
        Prompt before each invocation of the merge resolution program
        to give the user a chance to skip the path.
 
+-O<orderfile>::
+       Process files in the order specified in the
+       <orderfile>, which has one shell glob pattern per line.
+       This overrides the `diff.orderFile` configuration variable
+       (see linkgit:git-config[1]).  To cancel `diff.orderFile`,
+       use `-O/dev/null`.
+
 TEMPORARY FILES
 ---------------
 `git mergetool` creates `*.orig` backup files while resolving merges.
index ca28fb8e2a07bebde63c896939211fbec69e93e0..e8e68f528cf2fa5705e7cedce8d3d807fa20057d 100644 (file)
@@ -26,7 +26,18 @@ OPTIONS
 
 --refs=<pattern>::
        Only use refs whose names match a given shell pattern.  The pattern
-       can be one of branch name, tag name or fully qualified ref name.
+       can be one of branch name, tag name or fully qualified ref name. If
+       given multiple times, use refs whose names match any of the given shell
+       patterns. Use `--no-refs` to clear any previous ref patterns given.
+
+--exclude=<pattern>::
+       Do not use any ref whose name matches a given shell pattern. The
+       pattern can be one of branch name, tag name or fully qualified ref
+       name. If given multiple times, a ref will be excluded when it matches
+       any of the given patterns. When used together with --refs, a ref will
+       be used as a match only when it matches at least one --refs pattern and
+       does not match any --exclude patterns. Use `--no-exclude` to clear the
+       list of exclude patterns.
 
 --all::
        List all commits reachable from all refs
index c83aaf39c33505ead72d523f278620fcc6f8f757..7436c64a95616d84af9922958e4ccacd0c28519a 100644 (file)
@@ -303,6 +303,15 @@ These options can be used to modify 'git p4 submit' behavior.
        submit manually or revert.  This option always stops after the
        first (oldest) commit.  Git tags are not exported to p4.
 
+--shelve::
+       Instead of submitting create a series of shelved changelists.
+       After creating each shelve, the relevant files are reverted/deleted.
+       If you have multiple commits pending multiple shelves will be created.
+
+--update-shelve CHANGELIST::
+       Update an existing shelved changelist with this commit. Implies
+       --shelve.
+
 --conflict=(ask|skip|quit)::
        Conflicts can occur when applying a commit to p4.  When this
        happens, the default behavior ("ask") is to prompt whether to
@@ -467,6 +476,12 @@ git-p4.client::
        Client specified as an option to all p4 commands, with
        '-c <client>', including the client spec.
 
+git-p4.retries::
+       Specifies the number of times to retry a p4 command (notably,
+       'p4 sync') if the network times out. The default value is 3.
+       Set the value to 0 to disable retries or if your p4 version
+       does not support retries (pre 2012.2).
+
 Clone and sync variables
 ~~~~~~~~~~~~~~~~~~~~~~~~
 git-p4.syncFromOrigin::
index d033b258e5ee7c6e16c7d96c6339282a849b1b02..e414185f5a6a302afa359926c7f8c2c6bf5ac3e7 100644 (file)
@@ -67,7 +67,7 @@ with uncommitted changes is discouraged: while possible, it leaves you
 in a state that may be hard to back out of in the case of a conflict.
 
 If any of the remote changes overlap with local uncommitted changes,
-the merge will be automatically cancelled and the work tree untouched.
+the merge will be automatically canceled and the work tree untouched.
 It is generally best to get any local changes in working order before
 pulling or stash them away with linkgit:git-stash[1].
 
@@ -159,15 +159,15 @@ present while on branch `<name>`, that value is used instead of
 
 In order to determine what URL to use to fetch from, the value
 of the configuration `remote.<origin>.url` is consulted
-and if there is not any such variable, the value on `URL: ` line
-in `$GIT_DIR/remotes/<origin>` file is used.
+and if there is not any such variable, the value on the `URL:` line
+in `$GIT_DIR/remotes/<origin>` is used.
 
 In order to determine what remote branches to fetch (and
 optionally store in the remote-tracking branches) when the command is
 run without any refspec parameters on the command line, values
 of the configuration variable `remote.<origin>.fetch` are
 consulted, and if there aren't any, `$GIT_DIR/remotes/<origin>`
-file is consulted and its `Pull: ` lines are used.
+is consulted and its `Pull:` lines are used.
 In addition to the refspec formats described in the OPTIONS
 section, you can have a globbing refspec that looks like this:
 
@@ -210,7 +210,8 @@ EXAMPLES
   current branch:
 +
 ------------------------------------------------
-$ git pull, git pull origin
+$ git pull
+$ git pull origin
 ------------------------------------------------
 +
 Normally the branch merged in is the HEAD of the remote repository,
@@ -237,6 +238,8 @@ If you tried a pull which resulted in complex conflicts and
 would want to start over, you can recover with 'git reset'.
 
 
+include::transfer-data-leaks.txt[]
+
 BUGS
 ----
 Using --recurse-submodules can only fetch new commits in already checked
index 47b77e693bca1675a4887bddb5147077d60805a0..0a639664fd67f497b1597cf903015a284947509d 100644 (file)
@@ -217,6 +217,47 @@ with this feature.
 +
 "--no-force-with-lease" will cancel all the previous --force-with-lease on the
 command line.
++
+A general note on safety: supplying this option without an expected
+value, i.e. as `--force-with-lease` or `--force-with-lease=<refname>`
+interacts very badly with anything that implicitly runs `git fetch` on
+the remote to be pushed to in the background, e.g. `git fetch origin`
+on your repository in a cronjob.
++
+The protection it offers over `--force` is ensuring that subsequent
+changes your work wasn't based on aren't clobbered, but this is
+trivially defeated if some background process is updating refs in the
+background. We don't have anything except the remote tracking info to
+go by as a heuristic for refs you're expected to have seen & are
+willing to clobber.
++
+If your editor or some other system is running `git fetch` in the
+background for you a way to mitigate this is to simply set up another
+remote:
++
+       git remote add origin-push $(git config remote.origin.url)
+       git fetch origin-push
++
+Now when the background process runs `git fetch origin` the references
+on `origin-push` won't be updated, and thus commands like:
++
+       git push --force-with-lease origin-push
++
+Will fail unless you manually run `git fetch origin-push`. This method
+is of course entirely defeated by something that runs `git fetch
+--all`, in that case you'd need to either disable it or do something
+more tedious like:
++
+       git fetch              # update 'master' from remote
+       git tag base master    # mark our base point
+       git rebase -i master   # rewrite some commits
+       git push --force-with-lease=master:base master:master
++
+I.e. create a `base` tag for versions of the upstream code that you've
+seen and are willing to overwrite, then rewrite history, and finally
+force push changes to `master` if the remote version is still at
+`base`, regardless of what your local `remotes/origin/master` has been
+updated to in the background.
 
 -f::
 --force::
@@ -272,7 +313,7 @@ origin +master` to force a push to the `master` branch). See the
        standard error stream is not directed to a terminal.
 
 --no-recurse-submodules::
---recurse-submodules=check|on-demand|no::
+--recurse-submodules=check|on-demand|only|no::
        May be used to make sure all submodule commits used by the
        revisions to be pushed are available on a remote-tracking branch.
        If 'check' is used Git will verify that all submodule commits that
@@ -280,11 +321,12 @@ origin +master` to force a push to the `master` branch). See the
        remote of the submodule. If any commits are missing the push will
        be aborted and exit with non-zero status. If 'on-demand' is used
        all submodules that changed in the revisions to be pushed will be
-       pushed. If on-demand was not able to push all necessary revisions
-       it will also be aborted and exit with non-zero status. A value of
-       'no' or using `--no-recurse-submodules` can be used to override the
-       push.recurseSubmodules configuration variable when no submodule
-       recursion is required.
+       pushed. If on-demand was not able to push all necessary revisions it will
+       also be aborted and exit with non-zero status. If 'only' is used all
+       submodules will be recursively pushed while the superproject is left
+       unpushed. A value of 'no' or using `--no-recurse-submodules` can be used
+       to override the push.recurseSubmodules configuration variable when no
+       submodule recursion is required.
 
 --[no-]verify::
        Toggle the pre-push hook (see linkgit:githooks[5]).  The
@@ -559,6 +601,8 @@ Commits A and B would no longer belong to a branch with a symbolic name,
 and so would be unreachable.  As such, these commits would be removed by
 a `git gc` command on the origin repository.
 
+include::transfer-data-leaks.txt[]
+
 GIT
 ---
 Part of the linkgit:git[1] suite
index fa1d557e5b98eb6dc40e3baa65964138b4cc0621..02576d8c0ae6008fc22d7c7c706909efde5856da 100644 (file)
@@ -115,6 +115,12 @@ OPTIONS
        directories the index file and index output file are
        located in.
 
+--[no-]recurse-submodules::
+       Using --recurse-submodules will update the content of all initialized
+       submodules according to the commit recorded in the superproject by
+       calling read-tree recursively, also setting the submodules HEAD to be
+       detached at that commit.
+
 --no-sparse-checkout::
        Disable sparse checkout support even if `core.sparseCheckout`
        is true.
@@ -131,7 +137,7 @@ Merging
 -------
 If `-m` is specified, 'git read-tree' can perform 3 kinds of
 merge, a single tree merge if only 1 tree is given, a
-fast-forward merge with 2 trees, or a 3-way merge if 3 trees are
+fast-forward merge with 2 trees, or a 3-way merge if 3 or more trees are
 provided.
 
 
index de222c81af98c96678841f258342fe2cc3c426a8..53f4e144444ae7b30ce2634c0f364400927b27d2 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
        [<upstream> [<branch>]]
 'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
        --root [<branch>]
-'git rebase' --continue | --skip | --abort | --edit-todo
+'git rebase' --continue | --skip | --abort | --quit | --edit-todo
 
 DESCRIPTION
 -----------
@@ -252,6 +252,11 @@ leave out at most one of A and B, in which case it defaults to HEAD.
        will be reset to where it was when the rebase operation was
        started.
 
+--quit::
+       Abort the rebase operation but HEAD is not reset back to the
+       original branch. The index and working tree are also left
+       unchanged as a result.
+
 --keep-empty::
        Keep the commits that do not change anything from its
        parents in the result.
@@ -365,6 +370,11 @@ default is `--no-fork-point`, otherwise the default is `--fork-point`.
        of the rebased commits (see linkgit:git-am[1]).
        Incompatible with the --interactive option.
 
+--signoff::
+       This flag is passed to 'git am' to sign off all the rebased
+       commits (see linkgit:git-am[1]). Incompatible with the
+       --interactive option.
+
 -i::
 --interactive::
        Make a list of the commits which are about to be rebased.  Let the
index 000ee8dba2ab3069e0459defe3df9d7140541a59..86a4b32f0f1cbb8b69ff8b935edade6f14e7d5e2 100644 (file)
@@ -33,6 +33,9 @@ post-update hooks found in the Documentation/howto directory.
 option, which tells it if updates to a ref should be denied if they
 are not fast-forwards.
 
+A number of other receive.* config options are available to tweak
+its behavior, see linkgit:git-config[1].
+
 OPTIONS
 -------
 <directory>::
@@ -111,6 +114,8 @@ will be performed, and the update, post-receive and post-update
 hooks will not be invoked either.  This can be useful to quickly
 bail out if the update is not to be supported.
 
+See the notes on the quarantine environment below.
+
 update Hook
 -----------
 Before each ref is updated, if $GIT_DIR/hooks/update file exists
@@ -211,6 +216,33 @@ if the repository is packed and is served via a dumb transport.
        exec git update-server-info
 
 
+Quarantine Environment
+----------------------
+
+When `receive-pack` takes in objects, they are placed into a temporary
+"quarantine" directory within the `$GIT_DIR/objects` directory and
+migrated into the main object store only after the `pre-receive` hook
+has completed. If the push fails before then, the temporary directory is
+removed entirely.
+
+This has a few user-visible effects and caveats:
+
+  1. Pushes which fail due to problems with the incoming pack, missing
+     objects, or due to the `pre-receive` hook will not leave any
+     on-disk data. This is usually helpful to prevent repeated failed
+     pushes from filling up your disk, but can make debugging more
+     challenging.
+
+  2. Any objects created by the `pre-receive` hook will be created in
+     the quarantine directory (and migrated only if it succeeds).
+
+  3. The `pre-receive` hook MUST NOT update any refs to point to
+     quarantined objects. Other programs accessing the repository will
+     not be able to see the objects (and if the pre-receive hook fails,
+     those refs would become corrupted). For safety, any ref updates
+     from within `pre-receive` are automatically rejected.
+
+
 SEE ALSO
 --------
 linkgit:git-send-pack[1], linkgit:gitnamespaces[7]
diff --git a/Documentation/git-relink.txt b/Documentation/git-relink.txt
deleted file mode 100644 (file)
index 3b33c99..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-git-relink(1)
-=============
-
-NAME
-----
-git-relink - Hardlink common objects in local repositories
-
-SYNOPSIS
---------
-[verse]
-'git relink' [--safe] <dir>... <master_dir>
-
-DESCRIPTION
------------
-This will scan 1 or more object repositories and look for objects in common
-with a master repository. Objects not already hardlinked to the master
-repository will be replaced with a hardlink to the master repository.
-
-OPTIONS
--------
---safe::
-       Stops if two objects with the same hash exist but have different sizes.
-       Default is to warn and continue.
-
-<dir>::
-       Directories containing a .git/objects/ subdirectory.
-
-GIT
----
-Part of the linkgit:git[1] suite
index 25432d9257f9c06773edc8ca3d24ddae16bddf99..70f3753e1e90f74bb41e8a9ce90dcf7dc4420192 100644 (file)
@@ -115,7 +115,7 @@ $ git pull git://info.example.com/ nitfol  <4>
 in these files are in good order.  You do not want to see them
 when you run "git diff", because you plan to work on other files
 and changes with these files are distracting.
-<2> Somebody asks you to pull, and the changes sounds worthy of merging.
+<2> Somebody asks you to pull, and the changes sound worthy of merging.
 <3> However, you already dirtied the index (i.e. your index does
 not match the HEAD commit).  But you know the pull you are going
 to make does not affect frotz.c or filfre.c, so you revert the
@@ -292,6 +292,54 @@ $ git reset --keep start                    <3>
 <3> But you can use "reset --keep" to remove the unwanted commit after
     you switched to "branch2".
 
+Split a commit apart into a sequence of commits::
++
+Suppose that you have created lots of logically separate changes and commited
+them together. Then, later you decide that it might be better to have each
+logical chunk associated with its own commit. You can use git reset to rewind
+history without changing the contents of your local files, and then successively
+use `git add -p` to interactively select which hunks to include into each commit,
+using `git commit -c` to pre-populate the commit message.
++
+------------
+$ git reset -N HEAD^                        <1>
+$ git add -p                                <2>
+$ git diff --cached                         <3>
+$ git commit -c HEAD@{1}                    <4>
+...                                         <5>
+$ git add ...                               <6>
+$ git diff --cached                         <7>
+$ git commit ...                            <8>
+------------
++
+<1> First, reset the history back one commit so that we remove the original
+    commit, but leave the working tree with all the changes. The -N ensures
+    that any new files added with HEAD are still marked so that git add -p
+    will find them.
+<2> Next, we interactively select diff hunks to add using the git add -p
+    facility. This will ask you about each diff hunk in sequence and you can
+    use simple commands such as "yes, include this", "No don't include this"
+    or even the very powerful "edit" facility.
+<3> Once satisfied with the hunks you want to include, you should verify what
+    has been prepared for the first commit by using git diff --cached. This
+    shows all the changes that have been moved into the index and are about
+    to be committed.
+<4> Next, commit the changes stored in the index. The -c option specifies to
+    pre-populate the commit message from the original message that you started
+    with in the first commit. This is helpful to avoid retyping it. The HEAD@{1}
+    is a special notation for the commit that HEAD used to be at prior to the
+    original reset commit (1 change ago). See linkgit:git-reflog[1] for more
+    details. You may also use any other valid commit reference.
+<5> You can repeat steps 2-4 multiple times to break the original code into
+    any number of commits.
+<6> Now you've split out many of the changes into their own commits, and might
+    no longer use the patch mode of git add, in order to select all remaining
+    uncommitted changes.
+<7> Once again, check to verify that you've included what you want to. You may
+    also wish to verify that git diff doesn't show any remaining changes to be
+    committed later.
+<8> And finally create the final commit.
+
 
 DISCUSSION
 ----------
index b6c6326cdc7bb42993cf16fcae0d492944720e51..b1293f24bb46f71238f3dee4700340a79b90fca8 100644 (file)
@@ -91,7 +91,8 @@ repository.  For example:
 ----
 prefix=$(git rev-parse --show-prefix)
 cd "$(git rev-parse --show-toplevel)"
-eval "set -- $(git rev-parse --sq --prefix "$prefix" "$@")"
+# rev-parse provides the -- needed for 'set'
+eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
 ----
 
 --verify::
@@ -125,6 +126,12 @@ can be used.
        'git diff-{asterisk}'). In contrast to the `--sq-quote` option,
        the command input is still interpreted as usual.
 
+--short[=length]::
+       Same as `--verify` but shortens the object name to a unique
+       prefix with at least `length` characters. The minimum length
+       is 4, the default is the effective value of the `core.abbrev`
+       configuration variable (see linkgit:git-config[1]).
+
 --not::
        When showing object names, prefix them with '{caret}' and
        strip '{caret}' prefix from the object names that already have
@@ -135,12 +142,6 @@ can be used.
        The option core.warnAmbiguousRefs is used to select the strict
        abbreviation mode.
 
---short::
---short=number::
-       Instead of outputting the full SHA-1 values of object names try to
-       abbreviate them to a shorter unique name. When no length is specified
-       7 is used. The minimum length is 4.
-
 --symbolic::
        Usually the object names are output in SHA-1 form (with
        possible '{caret}' prefix); this option makes them output in a
@@ -216,6 +217,10 @@ If `$GIT_DIR` is not defined and the current directory
 is not detected to lie in a Git repository or work tree
 print a message to stderr and exit with nonzero status.
 
+--absolute-git-dir::
+       Like `--git-dir`, but its output is always the canonicalized
+       absolute path.
+
 --git-common-dir::
        Show `$GIT_COMMON_DIR` if defined, else `$GIT_DIR`.
 
@@ -256,6 +261,12 @@ print a message to stderr and exit with nonzero status.
 --show-toplevel::
        Show the absolute path of the top-level directory.
 
+--show-superproject-working-tree
+       Show the absolute path of the root of the superproject's
+       working tree (if exists) that uses the current repository as
+       its submodule.  Outputs nothing if the current repository is
+       not used as a submodule by any project.
+
 --shared-index-path::
        Show the path to the shared index file in split index mode, or
        empty if not in split-index mode.
index f1efc116ebb88a3bc31898f6a18837f8b951ad09..8c87e8cdd772a42192f54a6a49789c6005eeb87d 100644 (file)
@@ -140,10 +140,11 @@ Only submodules using a gitfile (which means they were cloned
 with a Git version 1.7.8 or newer) will be removed from the work
 tree, as their repository lives inside the .git directory of the
 superproject. If a submodule (or one of those nested inside it)
-still uses a .git directory, `git rm` will fail - no matter if forced
-or not - to protect the submodule's history. If it exists the
-submodule.<name> section in the linkgit:gitmodules[5] file will also
-be removed and that file will be staged (unless --cached or -n are used).
+still uses a .git directory, `git rm` will move the submodules
+git directory into the superprojects git directory to protect
+the submodule's history. If it exists the submodule.<name> section
+in the linkgit:gitmodules[5] file will also be removed and that file
+will be staged (unless --cached or -n are used).
 
 A submodule is considered up-to-date when the HEAD is the same as
 recorded in the index, no tracked files are modified and no untracked
index 642d0ef199c72160ca74238122fafdbdfee9a0c7..9d66166f69d93e544c949ad80fe0f432fa3f1ffd 100644 (file)
@@ -89,7 +89,7 @@ See the CONFIGURATION section for `sendemail.multiEdit`.
        reply to the given Message-Id, which avoids breaking threads to
        provide a new patch series.
        The second and subsequent emails will be sent as replies according to
-       the `--[no]-chain-reply-to` setting.
+       the `--[no-]chain-reply-to` setting.
 +
 So for example when `--thread` and `--no-chain-reply-to` are specified, the
 second and subsequent patches will be replies to the first one like in the
index a831dd0288306d3355bb5607bc6f36229563c8f7..966abb0df807c79714a18d8b106390caae45cf89 100644 (file)
@@ -81,6 +81,12 @@ be in a separate packet, and the list must end with a flush packet.
        will also fail if the actual call to `gpg --sign` fails.  See
        linkgit:git-receive-pack[1] for the details on the receiving end.
 
+--push-option=<string>::
+       Pass the specified string as a push option for consumption by
+       hooks on the server side.  If the server doesn't support push
+       options, error out.  See linkgit:git-push[1] and
+       linkgit:githooks[5] for details.
+
 <host>::
        A remote host to house the repository.  When this
        part is specified, 'git-receive-pack' is invoked via
index 31af7f27360d277ccdc3e5bd59b4788c83934b8e..ee6c5476c1d2bf3b2a708e6152ebaba5882cc4f7 100644 (file)
@@ -47,6 +47,10 @@ OPTIONS
 
        Each pretty-printed commit will be rewrapped before it is shown.
 
+-c::
+--committer::
+       Collect and show committer identities instead of authors.
+
 -w[<width>[,<indent1>[,<indent2>]]]::
        Linewrap the output by wrapping each line at `width`.  The first
        line of each entry is indented by `indent1` spaces, and the second
index 92df596e5fe9757fee399078e05e3ba44196fda3..70191d06b69ed307c6ce1d8f46c158b61eb6545f 100644 (file)
@@ -13,8 +13,11 @@ SYNOPSIS
 'git stash' drop [-q|--quiet] [<stash>]
 'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>]
 'git stash' branch <branchname> [<stash>]
-'git stash' [save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
-            [-u|--include-untracked] [-a|--all] [<message>]]
+'git stash' save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
+            [-u|--include-untracked] [-a|--all] [<message>]
+'git stash' [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
+            [-u|--include-untracked] [-a|--all] [-m|--message <message>]]
+            [--] [<pathspec>...]]
 'git stash' clear
 'git stash' create [<message>]
 'git stash' store [-m|--message <message>] [-q|--quiet] <commit>
@@ -39,19 +42,31 @@ The latest stash you created is stored in `refs/stash`; older
 stashes are found in the reflog of this reference and can be named using
 the usual reflog syntax (e.g. `stash@{0}` is the most recently
 created stash, `stash@{1}` is the one before it, `stash@{2.hours.ago}`
-is also possible).
+is also possible). Stashes may also be referenced by specifying just the
+stash index (e.g. the integer `n` is equivalent to `stash@{n}`).
 
 OPTIONS
 -------
 
 save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
+push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--] [<pathspec>...]::
 
-       Save your local modifications to a new 'stash', and run `git reset
-       --hard` to revert them.  The <message> part is optional and gives
-       the description along with the stashed state.  For quickly making
-       a snapshot, you can omit _both_ "save" and <message>, but giving
-       only <message> does not trigger this action to prevent a misspelled
-       subcommand from making an unwanted stash.
+       Save your local modifications to a new 'stash' and roll them
+       back to HEAD (in the working tree and in the index).
+       The <message> part is optional and gives
+       the description along with the stashed state.
++
+For quickly making a snapshot, you can omit "push".  In this mode,
+non-option arguments are not allowed to prevent a misspelled
+subcommand from making an unwanted stash.  The two exceptions to this
+are `stash -p` which acts as alias for `stash push -p` and pathspecs,
+which are allowed after a double hyphen `--` for disambiguation.
++
+When pathspec is given to 'git stash push', the new stash records the
+modified states only for the files that match the pathspec.  The index
+entries and working tree files are then rolled back to the state in
+HEAD only for these files, too, leaving files that do not match the
+pathspec intact.
 +
 If the `--keep-index` option is used, all changes already added to the
 index are left intact.
index e1e8f57cdd217b43b9b04bc54381e9b155d9cbde..d70abc6afe3aa40aaaab2e055ee75d8ee22cdb69 100644 (file)
@@ -32,11 +32,14 @@ OPTIONS
 --branch::
        Show the branch and tracking info even in short-format.
 
---porcelain::
+--porcelain[=<version>]::
        Give the output in an easy-to-parse format for scripts.
        This is similar to the short output, but will remain stable
        across Git versions and regardless of user configuration. See
        below for details.
++
+The version parameter is used to specify the format version.
+This is optional and defaults to the original version 'v1' format.
 
 --long::
        Give the output in the long-format. This is the default.
@@ -96,7 +99,7 @@ configuration variable documented in linkgit:git-config[1].
 
 -z::
        Terminate entries with NUL, instead of LF.  This implies
-       the `--porcelain` output format if no other format is given.
+       the `--porcelain=v1` output format if no other format is given.
 
 --column[=<options>]::
 --no-column::
@@ -178,14 +181,25 @@ in which case `XY` are `!!`.
     !           !    ignored
     -------------------------------------------------
 
+Submodules have more state and instead report
+               M    the submodule has a different HEAD than
+                    recorded in the index
+               m    the submodule has modified content
+               ?    the submodule has untracked files
+since modified content or untracked files in a submodule cannot be added
+via `git add` in the superproject to prepare a commit.
+
+'m' and '?' are applied recursively. For example if a nested submodule
+in a submodule contains an untracked file, this is reported as '?' as well.
+
 If -b is used the short-format status is preceded by a line
 
-## branchname tracking info
+    ## branchname tracking info
 
-Porcelain Format
-~~~~~~~~~~~~~~~~
+Porcelain Format Version 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The porcelain format is similar to the short format, but is guaranteed
+Version 1 porcelain format is similar to the short format, but is guaranteed
 not to change in a backwards-incompatible way between Git versions or
 based on user configuration. This makes it ideal for parsing by scripts.
 The description of the short format above also describes the porcelain
@@ -207,6 +221,125 @@ field from the first filename).  Third, filenames containing special
 characters are not specially formatted; no quoting or
 backslash-escaping is performed.
 
+Any submodule changes are reported as modified `M` instead of `m` or single `?`.
+
+Porcelain Format Version 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Version 2 format adds more detailed information about the state of
+the worktree and changed items.  Version 2 also defines an extensible
+set of easy to parse optional headers.
+
+Header lines start with "#" and are added in response to specific
+command line arguments.  Parsers should ignore headers they
+don't recognize.
+
+### Branch Headers
+
+If `--branch` is given, a series of header lines are printed with
+information about the current branch.
+
+    Line                                     Notes
+    ------------------------------------------------------------
+    # branch.oid <commit> | (initial)        Current commit.
+    # branch.head <branch> | (detached)      Current branch.
+    # branch.upstream <upstream_branch>      If upstream is set.
+    # branch.ab +<ahead> -<behind>           If upstream is set and
+                                            the commit is present.
+    ------------------------------------------------------------
+
+### Changed Tracked Entries
+
+Following the headers, a series of lines are printed for tracked
+entries.  One of three different line formats may be used to describe
+an entry depending on the type of change.  Tracked entries are printed
+in an undefined order; parsers should allow for a mixture of the 3
+line types in any order.
+
+Ordinary changed entries have the following format:
+
+    1 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <path>
+
+Renamed or copied entries have the following format:
+
+    2 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <X><score> <path><sep><origPath>
+
+    Field       Meaning
+    --------------------------------------------------------
+    <XY>        A 2 character field containing the staged and
+               unstaged XY values described in the short format,
+               with unchanged indicated by a "." rather than
+               a space.
+    <sub>       A 4 character field describing the submodule state.
+               "N..." when the entry is not a submodule.
+               "S<c><m><u>" when the entry is a submodule.
+               <c> is "C" if the commit changed; otherwise ".".
+               <m> is "M" if it has tracked changes; otherwise ".".
+               <u> is "U" if there are untracked changes; otherwise ".".
+    <mH>        The octal file mode in HEAD.
+    <mI>        The octal file mode in the index.
+    <mW>        The octal file mode in the worktree.
+    <hH>        The object name in HEAD.
+    <hI>        The object name in the index.
+    <X><score>  The rename or copy score (denoting the percentage
+               of similarity between the source and target of the
+               move or copy). For example "R100" or "C75".
+    <path>      The pathname.  In a renamed/copied entry, this
+               is the path in the index and in the working tree.
+    <sep>       When the `-z` option is used, the 2 pathnames are separated
+               with a NUL (ASCII 0x00) byte; otherwise, a tab (ASCII 0x09)
+               byte separates them.
+    <origPath>  The pathname in the commit at HEAD.  This is only
+               present in a renamed/copied entry, and tells
+               where the renamed/copied contents came from.
+    --------------------------------------------------------
+
+Unmerged entries have the following format; the first character is
+a "u" to distinguish from ordinary changed entries.
+
+    u <xy> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>
+
+    Field       Meaning
+    --------------------------------------------------------
+    <XY>        A 2 character field describing the conflict type
+               as described in the short format.
+    <sub>       A 4 character field describing the submodule state
+               as described above.
+    <m1>        The octal file mode in stage 1.
+    <m2>        The octal file mode in stage 2.
+    <m3>        The octal file mode in stage 3.
+    <mW>        The octal file mode in the worktree.
+    <h1>        The object name in stage 1.
+    <h2>        The object name in stage 2.
+    <h3>        The object name in stage 3.
+    <path>      The pathname.
+    --------------------------------------------------------
+
+### Other Items
+
+Following the tracked entries (and if requested), a series of
+lines will be printed for untracked and then ignored items
+found in the worktree.
+
+Untracked items have the following format:
+
+    ? <path>
+
+Ignored items have the following format:
+
+    ! <path>
+
+### Pathname Format Notes and -z
+
+When the `-z` option is given, pathnames are printed as is and
+without any quoting and lines are terminated with a NUL (ASCII 0x00)
+byte.
+
+Without the `-z` option, pathnames with "unusual" characters are
+quoted as explained for the configuration variable `core.quotePath`
+(see linkgit:git-config[1]).
+
+
 CONFIGURATION
 -------------
 
index d8415734753e0d03f3f6d37bd4b76369d37f5fb0..74bc6200d564c6aa72183e393f7c7d2e0c00bf7d 100644 (file)
@@ -9,19 +9,15 @@ git-submodule - Initialize, update or inspect submodules
 SYNOPSIS
 --------
 [verse]
-'git submodule' [--quiet] add [-b <branch>] [-f|--force] [--name <name>]
-             [--reference <repository>] [--depth <depth>] [--] <repository> [<path>]
+'git submodule' [--quiet] add [<options>] [--] <repository> [<path>]
 'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] init [--] [<path>...]
 'git submodule' [--quiet] deinit [-f|--force] (--all|[--] <path>...)
-'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
-             [--[no-]recommend-shallow] [-f|--force] [--rebase|--merge]
-             [--reference <repository>] [--depth <depth>] [--recursive]
-             [--jobs <n>] [--] [<path>...]
-'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
-             [commit] [--] [<path>...]
+'git submodule' [--quiet] update [<options>] [--] [<path>...]
+'git submodule' [--quiet] summary [<options>] [--] [<path>...]
 'git submodule' [--quiet] foreach [--recursive] <command>
 'git submodule' [--quiet] sync [--recursive] [--] [<path>...]
+'git submodule' [--quiet] absorbgitdirs [--] [<path>...]
 
 
 DESCRIPTION
@@ -62,7 +58,7 @@ if you choose to go that route.
 
 COMMANDS
 --------
-add::
+add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--depth <depth>] [--] <repository> [<path>]::
        Add the given repository as a submodule at the given path
        to the changeset to be committed next to the current
        project: the current project is termed the "superproject".
@@ -77,13 +73,17 @@ configuration entries unless `--name` is used to specify a logical name.
 +
 <repository> is the URL of the new submodule's origin repository.
 This may be either an absolute URL, or (if it begins with ./
-or ../), the location relative to the superproject's origin
+or ../), the location relative to the superproject's default remote
 repository (Please note that to specify a repository 'foo.git'
 which is located right next to a superproject 'bar.git', you'll
 have to use '../foo.git' instead of './foo.git' - as one might expect
 when following the rules for relative URLs - because the evaluation
 of relative URLs in Git is identical to that of relative directories).
-If the superproject doesn't have an origin configured
++
+The default remote is the remote of the remote tracking branch
+of the current branch. If no such remote tracking branch exists or
+the HEAD is detached, "origin" is assumed to be the default remote.
+If the superproject doesn't have a default remote configured
 the superproject is its own authoritative upstream and the current
 working directory is used instead.
 +
@@ -103,7 +103,7 @@ together in the same relative location, and only the
 superproject's URL needs to be provided: git-submodule will correctly
 locate the submodule using the relative URL in .gitmodules.
 
-status::
+status [--cached] [--recursive] [--] [<path>...]::
        Show the status of the submodules. This will print the SHA-1 of the
        currently checked out commit for each submodule, along with the
        submodule path and the output of 'git describe' for the
@@ -120,22 +120,30 @@ submodules with respect to the commit recorded in the index or the HEAD,
 linkgit:git-status[1] and linkgit:git-diff[1] will provide that information
 too (and can also report changes to a submodule's work tree).
 
-init::
+init [--] [<path>...]::
        Initialize the submodules recorded in the index (which were
-       added and committed elsewhere) by copying submodule
-       names and urls from .gitmodules to .git/config.
-       Optional <path> arguments limit which submodules will be initialized.
-       It will also copy the value of `submodule.$name.update` into
-       .git/config.
-       The key used in .git/config is `submodule.$name.url`.
-       This command does not alter existing information in .git/config.
-       You can then customize the submodule clone URLs in .git/config
-       for your local setup and proceed to `git submodule update`;
-       you can also just use `git submodule update --init` without
-       the explicit 'init' step if you do not intend to customize
-       any submodule locations.
-
-deinit::
+       added and committed elsewhere) by setting `submodule.$name.url`
+       in .git/config. It uses the same setting from .gitmodules as
+       a template. If the URL is relative, it will be resolved using
+       the default remote. If there is no default remote, the current
+       repository will be assumed to be upstream.
++
+Optional <path> arguments limit which submodules will be initialized.
+If no path is specified and submodule.active has been configured, submodules
+configured to be active will be initialized, otherwise all submodules are
+initialized.
++
+When present, it will also copy the value of `submodule.$name.update`.
+This command does not alter existing information in .git/config.
+You can then customize the submodule clone URLs in .git/config
+for your local setup and proceed to `git submodule update`;
+you can also just use `git submodule update --init` without
+the explicit 'init' step if you do not intend to customize
+any submodule locations.
++
+See the add subcommand for the defintion of default remote.
+
+deinit [-f|--force] (--all|[--] <path>...)::
        Unregister the given submodules, i.e. remove the whole
        `submodule.$name` section from .git/config together with their work
        tree. Further calls to `git submodule update`, `git submodule foreach`
@@ -151,20 +159,20 @@ instead of deinit-ing everything, to prevent mistakes.
 If `--force` is specified, the submodule's working tree will
 be removed even if it contains local modifications.
 
-update::
+update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--] [<path>...]::
 +
 --
 Update the registered submodules to match what the superproject
 expects by cloning missing submodules and updating the working tree of
 the submodules. The "updating" can be done in several ways depending
 on command line options and the value of `submodule.<name>.update`
-configuration variable. Supported update procedures are:
+configuration variable. The command line option takes precedence over
+the configuration variable. if neither is given, a checkout is performed.
+update procedures supported both from the command line as well as setting
+`submodule.<name>.update`:
 
        checkout;; the commit recorded in the superproject will be
-           checked out in the submodule on a detached HEAD. This is
-           done when `--checkout` option is given, or no option is
-           given, and `submodule.<name>.update` is unset, or if it is
-           set to 'checkout'.
+           checked out in the submodule on a detached HEAD.
 +
 If `--force` is specified, the submodule will be checked out (using
 `git checkout --force` if appropriate), even if the commit specified
@@ -172,23 +180,21 @@ in the index of the containing repository already matches the commit
 checked out in the submodule.
 
        rebase;; the current branch of the submodule will be rebased
-           onto the commit recorded in the superproject. This is done
-           when `--rebase` option is given, or no option is given, and
-           `submodule.<name>.update` is set to 'rebase'.
+           onto the commit recorded in the superproject.
 
        merge;; the commit recorded in the superproject will be merged
-           into the current branch in the submodule. This is done
-           when `--merge` option is given, or no option is given, and
-           `submodule.<name>.update` is set to 'merge'.
+           into the current branch in the submodule.
+
+The following procedures are only available via the `submodule.<name>.update`
+configuration variable:
 
        custom command;; arbitrary shell command that takes a single
            argument (the sha1 of the commit recorded in the
-           superproject) is executed. This is done when no option is
-           given, and `submodule.<name>.update` has the form of
-           '!command'.
+           superproject) is executed. When `submodule.<name>.update`
+           is set to '!command', the remainder after the exclamation mark
+           is the custom command.
 
-When no option is given and `submodule.<name>.update` is set to 'none',
-the submodule is not updated.
+       none;; the submodule is not updated.
 
 If the submodule is not yet initialized, and you just want to use the
 setting as stored in .gitmodules, you can automatically initialize the
@@ -197,7 +203,7 @@ submodule with the `--init` option.
 If `--recursive` is specified, this command will recurse into the
 registered submodules, and update any nested submodules within.
 --
-summary::
+summary [--cached|--files] [(-n|--summary-limit) <n>] [commit] [--] [<path>...]::
        Show commit summary between the given commit (defaults to HEAD) and
        working tree/index. For a submodule in question, a series of commits
        in the submodule between the given super project commit and the
@@ -210,7 +216,7 @@ summary::
 Using the `--submodule=log` option with linkgit:git-diff[1] will provide that
 information too.
 
-foreach::
+foreach [--recursive] <command>::
        Evaluates an arbitrary shell command in each checked out submodule.
        The command has access to the variables $name, $path, $sha1 and
        $toplevel:
@@ -227,11 +233,14 @@ foreach::
        the processing to terminate. This can be overridden by adding '|| :'
        to the end of the command.
 +
-As an example, +git submodule foreach \'echo $path {backtick}git
-rev-parse HEAD{backtick}'+ will show the path and currently checked out
-commit for each submodule.
+As an example, the command below will show the path and currently
+checked out commit for each submodule:
++
+--------------
+git submodule foreach 'echo $path `git rev-parse HEAD`'
+--------------
 
-sync::
+sync [--recursive] [--] [<path>...]::
        Synchronizes submodules' remote URL configuration setting
        to the value specified in .gitmodules. It will only affect those
        submodules which already have a URL entry in .git/config (that is the
@@ -245,6 +254,20 @@ sync::
 If `--recursive` is specified, this command will recurse into the
 registered submodules, and sync any nested submodules within.
 
+absorbgitdirs::
+       If a git directory of a submodule is inside the submodule,
+       move the git directory of the submodule into its superprojects
+       `$GIT_DIR/modules` path and then connect the git directory and
+       its working directory by setting the `core.worktree` and adding
+       a .git file pointing to the git directory embedded in the
+       superprojects git directory.
++
+A repository that was cloned independently and later added as a submodule or
+old setups have the submodules git directory inside the submodule instead of
+embedded into the superprojects git directory.
++
+This command is recursive by default.
+
 OPTIONS
 -------
 -q::
index 5f9e65b0c4de117942babf0a14d255922d02b4ad..9bee9b0c4c53692bab569577d584797c0bd9e217 100644 (file)
@@ -664,13 +664,19 @@ creating the branch or tag.
        When retrieving svn commits into Git (as part of 'fetch', 'rebase', or
        'dcommit' operations), look for the first `From:` or `Signed-off-by:` line
        in the log message and use that as the author string.
++
+[verse]
+config key: svn.useLogAuthor
+
 --add-author-from::
        When committing to svn from Git (as part of 'commit-diff', 'set-tree' or 'dcommit'
        operations), if the existing log message doesn't already have a
        `From:` or `Signed-off-by:` line, append a `From:` line based on the
        Git commit's author string.  If you use this, then `--use-log-author`
        will retrieve a valid author string for all commits.
-
++
+[verse]
+config key: svn.addAuthorFrom
 
 ADVANCED OPTIONS
 ----------------
index 80019c584b11b35b2b14da83a31f326634bc6708..1eb15afa1ce8a533d65c5f5ace0bcd694d7f6ffd 100644 (file)
@@ -12,10 +12,11 @@ SYNOPSIS
 'git tag' [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>]
        <tagname> [<commit> | <object>]
 'git tag' -d <tagname>...
-'git tag' [-n[<num>]] -l [--contains <commit>] [--points-at <object>]
-       [--column[=<options>] | --no-column] [--create-reflog] [--sort=<key>]
-       [--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]
-'git tag' -v <tagname>...
+'git tag' [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
+       [--points-at <object>] [--column[=<options>] | --no-column]
+       [--create-reflog] [--sort=<key>] [--format=<format>]
+       [--[no-]merged [<commit>]] [<pattern>...]
+'git tag' -v [--format=<format>] <tagname>...
 
 DESCRIPTION
 -----------
@@ -82,18 +83,24 @@ OPTIONS
 
 -n<num>::
        <num> specifies how many lines from the annotation, if any,
-       are printed when using -l.
-       The default is not to print any annotation lines.
-       If no number is given to `-n`, only the first line is printed.
-       If the tag is not annotated, the commit message is displayed instead.
-
--l <pattern>::
---list <pattern>::
-       List tags with names that match the given pattern (or all if no
-       pattern is given).  Running "git tag" without arguments also
-       lists all tags. The pattern is a shell wildcard (i.e., matched
-       using fnmatch(3)).  Multiple patterns may be given; if any of
-       them matches, the tag is shown.
+       are printed when using -l. Implies `--list`.
++
+The default is not to print any annotation lines.
+If no number is given to `-n`, only the first line is printed.
+If the tag is not annotated, the commit message is displayed instead.
+
+-l::
+--list::
+       List tags. With optional `<pattern>...`, e.g. `git tag --list
+       'v-*'`, list only the tags that match the pattern(s).
++
+Running "git tag" without arguments also lists all tags. The pattern
+is a shell wildcard (i.e., matched using fnmatch(3)). Multiple
+patterns may be given; if any of them matches, the tag is shown.
++
+This option is implicitly supplied if any other list-like option such
+as `--contains` is provided. See the documentation for each of those
+options for details.
 
 --sort=<key>::
        Sort based on the key given.  Prefix `-` to sort in
@@ -101,13 +108,17 @@ OPTIONS
        multiple times, in which case the last key becomes the primary
        key. Also supports "version:refname" or "v:refname" (tag
        names are treated as versions). The "version:refname" sort
-       order can also be affected by the
-       "versionsort.prereleaseSuffix" configuration variable.
+       order can also be affected by the "versionsort.suffix"
+       configuration variable.
        The keys supported are the same as those in `git for-each-ref`.
        Sort order defaults to the value configured for the `tag.sort`
        variable if it exists, or lexicographic order otherwise. See
        linkgit:git-config[1].
 
+-i::
+--ignore-case::
+       Sorting and filtering tags are case insensitive.
+
 --column[=<options>]::
 --no-column::
        Display tag listing in columns. See configuration variable
@@ -118,10 +129,23 @@ This option is only applicable when listing tags without annotation lines.
 
 --contains [<commit>]::
        Only list tags which contain the specified commit (HEAD if not
-       specified).
+       specified). Implies `--list`.
+
+--no-contains [<commit>]::
+       Only list tags which don't contain the specified commit (HEAD if
+       not specified). Implies `--list`.
+
+--merged [<commit>]::
+       Only list tags whose commits are reachable from the specified
+       commit (`HEAD` if not specified), incompatible with `--no-merged`.
+
+--no-merged [<commit>]::
+       Only list tags whose commits are not reachable from the specified
+       commit (`HEAD` if not specified), incompatible with `--merged`.
 
 --points-at <object>::
-       Only list tags of the given object.
+       Only list tags of the given object (HEAD if not
+       specified). Implies `--list`.
 
 -m <msg>::
 --message=<msg>::
@@ -146,7 +170,11 @@ This option is only applicable when listing tags without annotation lines.
        'strip' removes both whitespace and commentary.
 
 --create-reflog::
-       Create a reflog for the tag.
+       Create a reflog for the tag. To globally enable reflogs for tags, see
+       `core.logAllRefUpdates` in linkgit:git-config[1].
+       The negated form `--no-create-reflog` only overrides an earlier
+       `--create-reflog`, but currently does not negate the setting of
+       `core.logallrefupdates`.
 
 <tagname>::
        The name of the tag to create, delete, or describe.
@@ -165,11 +193,6 @@ This option is only applicable when listing tags without annotation lines.
        that of linkgit:git-for-each-ref[1].  When unspecified,
        defaults to `%(refname:strip=2)`.
 
---[no-]merged [<commit>]::
-       Only list tags whose tips are reachable, or not reachable
-       if `--no-merged` is used, from the specified commit (`HEAD`
-       if not specified).
-
 CONFIGURATION
 -------------
 By default, 'git tag' in sign-with-default mode (-s) will use your
index 2f4ff501568d3a3e0a65212cf177e6903343a6d9..d0fec4cddd2a500758e1500af869d5c84cd7ebe8 100644 (file)
@@ -7,4 +7,4 @@ maintained here. These days, however, search engines fill that role much
 more efficiently, so this manually-maintained list has been retired.
 
 See also the `contrib/` area, and the Git wiki:
-http://git.or.cz/gitwiki/InterfacesFrontendsAndTools
+https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools
index 3e887d16109c48f4f906d8a7c5c0c860bbd6123d..b3de50d7106819f4dee92b3508c7713d170832ce 100644 (file)
@@ -44,6 +44,9 @@ OPTIONS
 --strict::
        Don't write objects with broken content or links.
 
+--max-input-size=<size>::
+       Die, if the pack is larger than <size>.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
index 7386c931627f1c2bd1303407075db9831ec4045c..1579abf3c3b45f4e63f8f17746dde31a06a3a564 100644 (file)
@@ -163,14 +163,16 @@ may not support it yet.
 
 --split-index::
 --no-split-index::
-       Enable or disable split index mode. If enabled, the index is
-       split into two files, $GIT_DIR/index and $GIT_DIR/sharedindex.<SHA-1>.
-       Changes are accumulated in $GIT_DIR/index while the shared
-       index file contains all index entries stays unchanged. If
-       split-index mode is already enabled and `--split-index` is
-       given again, all changes in $GIT_DIR/index are pushed back to
-       the shared index file. This mode is designed for very large
-       indexes that take a significant amount of time to read or write.
+       Enable or disable split index mode. If split-index mode is
+       already enabled and `--split-index` is given again, all
+       changes in $GIT_DIR/index are pushed back to the shared index
+       file.
++
+These options take effect whatever the value of the `core.splitIndex`
+configuration variable (see linkgit:git-config[1]). But a warning is
+emitted when the change goes against the configured value, as the
+configured value will take effect next time the index is read and this
+will remove the intended effect of the option.
 
 --untracked-cache::
 --no-untracked-cache::
@@ -388,6 +390,31 @@ Although this bit looks similar to assume-unchanged bit, its goal is
 different from assume-unchanged bit's. Skip-worktree also takes
 precedence over assume-unchanged bit when both are set.
 
+Split index
+-----------
+
+This mode is designed for repositories with very large indexes, and
+aims at reducing the time it takes to repeatedly write these indexes.
+
+In this mode, the index is split into two files, $GIT_DIR/index and
+$GIT_DIR/sharedindex.<SHA-1>. Changes are accumulated in
+$GIT_DIR/index, the split index, while the shared index file contains
+all index entries and stays unchanged.
+
+All changes in the split index are pushed back to the shared index
+file when the number of entries in the split index reaches a level
+specified by the splitIndex.maxPercentChange config variable (see
+linkgit:git-config[1]).
+
+Each time a new shared index file is created, the old shared index
+files are deleted if their modification time is older than what is
+specified by the splitIndex.sharedIndexExpire config variable (see
+linkgit:git-config[1]).
+
+To avoid deleting a shared index file that is still used, its
+modification time is updated to the current time everytime a new split
+index based on the shared index file is either created or read from.
+
 Untracked cache
 ---------------
 
index d590edcebd99a3c9321cfdc00499aa6996b78a5b..0b8075dad965f58b159bbe45f18d94bcc9f5ae60 100644 (file)
@@ -8,7 +8,7 @@ git-verify-tag - Check the GPG signature of tags
 SYNOPSIS
 --------
 [verse]
-'git verify-tag' <tag>...
+'git verify-tag' [--format=<format>] <tag>...
 
 DESCRIPTION
 -----------
index e257c19ebed96c3ab4877a752c3545e2d98c5d84..b472acc3567f2cb0ed574a48459adb1c9a6f0334 100644 (file)
@@ -9,7 +9,7 @@ git-worktree - Manage multiple working trees
 SYNOPSIS
 --------
 [verse]
-'git worktree add' [-f] [--detach] [--checkout] [-b <new-branch>] <path> [<branch>]
+'git worktree add' [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<branch>]
 'git worktree list' [--porcelain]
 'git worktree lock' [--reason <string>] <worktree>
 'git worktree prune' [-n] [-v] [--expire <expire>]
@@ -52,7 +52,7 @@ is linked to the current repository, sharing everything except working
 directory specific files such as HEAD, index, etc. `-` may also be
 specified as `<branch>`; it is synonymous with `@{-1}`.
 +
-If `<branch>` is omitted and neither `-b` nor `-B` nor `--detached` used,
+If `<branch>` is omitted and neither `-b` nor `-B` nor `--detach` used,
 then, as a convenience, a new branch based at HEAD is created automatically,
 as if `-b $(basename <path>)` was specified.
 
@@ -107,6 +107,11 @@ OPTIONS
        such as configuring sparse-checkout. See "Sparse checkout"
        in linkgit:git-read-tree[1].
 
+--lock::
+       Keep the working tree locked after creation. This is the
+       equivalent of `git worktree lock` after `git worktree add`,
+       but without race condition.
+
 -n::
 --dry-run::
        With `prune`, do not remove anything; just report what it would
index 89157e2d4590f399fc617a6bfe4db0abc0d12b5b..7dd5e03280b09f21f59289b0b00cd6fdee0ca3cb 100644 (file)
@@ -13,6 +13,7 @@ SYNOPSIS
     [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
     [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
     [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
+    [--super-prefix=<path>]
     <command> [<args>]
 
 DESCRIPTION
@@ -34,495 +35,6 @@ manual page gives you an overview of the command-line command syntax.
 A formatted and hyperlinked copy of the latest Git documentation
 can be viewed at `https://git.github.io/htmldocs/git.html`.
 
-ifdef::stalenotes[]
-[NOTE]
-============
-
-You are reading the documentation for the latest (possibly
-unreleased) version of Git, that is available from the 'master'
-branch of the `git.git` repository.
-Documentation for older releases are available here:
-
-* link:v2.10.3/git.html[documentation for release 2.10.3]
-
-* release notes for
-  link:RelNotes/2.10.3.txt[2.10.3],
-  link:RelNotes/2.10.2.txt[2.10.2],
-  link:RelNotes/2.10.1.txt[2.10.1],
-  link:RelNotes/2.10.0.txt[2.10].
-
-* link:v2.9.4/git.html[documentation for release 2.9.4]
-
-* release notes for
-  link:RelNotes/2.9.4.txt[2.9.4],
-  link:RelNotes/2.9.3.txt[2.9.3],
-  link:RelNotes/2.9.2.txt[2.9.2],
-  link:RelNotes/2.9.1.txt[2.9.1],
-  link:RelNotes/2.9.0.txt[2.9].
-
-* link:v2.8.5/git.html[documentation for release 2.8.5]
-
-* release notes for
-  link:RelNotes/2.8.5.txt[2.8.5],
-  link:RelNotes/2.8.4.txt[2.8.4],
-  link:RelNotes/2.8.3.txt[2.8.3],
-  link:RelNotes/2.8.2.txt[2.8.2],
-  link:RelNotes/2.8.1.txt[2.8.1],
-  link:RelNotes/2.8.0.txt[2.8].
-
-* link:v2.7.5/git.html[documentation for release 2.7.5]
-
-* release notes for
-  link:RelNotes/2.7.5.txt[2.7.5],
-  link:RelNotes/2.7.4.txt[2.7.4],
-  link:RelNotes/2.7.3.txt[2.7.3],
-  link:RelNotes/2.7.2.txt[2.7.2],
-  link:RelNotes/2.7.1.txt[2.7.1],
-  link:RelNotes/2.7.0.txt[2.7].
-
-* link:v2.6.7/git.html[documentation for release 2.6.7]
-
-* release notes for
-  link:RelNotes/2.6.7.txt[2.6.7],
-  link:RelNotes/2.6.6.txt[2.6.6],
-  link:RelNotes/2.6.5.txt[2.6.5],
-  link:RelNotes/2.6.4.txt[2.6.4],
-  link:RelNotes/2.6.3.txt[2.6.3],
-  link:RelNotes/2.6.2.txt[2.6.2],
-  link:RelNotes/2.6.1.txt[2.6.1],
-  link:RelNotes/2.6.0.txt[2.6].
-
-* link:v2.5.6/git.html[documentation for release 2.5.6]
-
-* release notes for
-  link:RelNotes/2.5.6.txt[2.5.6],
-  link:RelNotes/2.5.5.txt[2.5.5],
-  link:RelNotes/2.5.4.txt[2.5.4],
-  link:RelNotes/2.5.3.txt[2.5.3],
-  link:RelNotes/2.5.2.txt[2.5.2],
-  link:RelNotes/2.5.1.txt[2.5.1],
-  link:RelNotes/2.5.0.txt[2.5].
-
-* link:v2.4.12/git.html[documentation for release 2.4.12]
-
-* release notes for
-  link:RelNotes/2.4.12.txt[2.4.12],
-  link:RelNotes/2.4.11.txt[2.4.11],
-  link:RelNotes/2.4.10.txt[2.4.10],
-  link:RelNotes/2.4.9.txt[2.4.9],
-  link:RelNotes/2.4.8.txt[2.4.8],
-  link:RelNotes/2.4.7.txt[2.4.7],
-  link:RelNotes/2.4.6.txt[2.4.6],
-  link:RelNotes/2.4.5.txt[2.4.5],
-  link:RelNotes/2.4.4.txt[2.4.4],
-  link:RelNotes/2.4.3.txt[2.4.3],
-  link:RelNotes/2.4.2.txt[2.4.2],
-  link:RelNotes/2.4.1.txt[2.4.1],
-  link:RelNotes/2.4.0.txt[2.4].
-
-* link:v2.3.10/git.html[documentation for release 2.3.10]
-
-* release notes for
-  link:RelNotes/2.3.10.txt[2.3.10],
-  link:RelNotes/2.3.9.txt[2.3.9],
-  link:RelNotes/2.3.8.txt[2.3.8],
-  link:RelNotes/2.3.7.txt[2.3.7],
-  link:RelNotes/2.3.6.txt[2.3.6],
-  link:RelNotes/2.3.5.txt[2.3.5],
-  link:RelNotes/2.3.4.txt[2.3.4],
-  link:RelNotes/2.3.3.txt[2.3.3],
-  link:RelNotes/2.3.2.txt[2.3.2],
-  link:RelNotes/2.3.1.txt[2.3.1],
-  link:RelNotes/2.3.0.txt[2.3].
-
-* link:v2.2.3/git.html[documentation for release 2.2.3]
-
-* release notes for
-  link:RelNotes/2.2.3.txt[2.2.3],
-  link:RelNotes/2.2.2.txt[2.2.2],
-  link:RelNotes/2.2.1.txt[2.2.1],
-  link:RelNotes/2.2.0.txt[2.2].
-
-* link:v2.1.4/git.html[documentation for release 2.1.4]
-
-* release notes for
-  link:RelNotes/2.1.4.txt[2.1.4],
-  link:RelNotes/2.1.3.txt[2.1.3],
-  link:RelNotes/2.1.2.txt[2.1.2],
-  link:RelNotes/2.1.1.txt[2.1.1],
-  link:RelNotes/2.1.0.txt[2.1].
-
-* link:v2.0.5/git.html[documentation for release 2.0.5]
-
-* release notes for
-  link:RelNotes/2.0.5.txt[2.0.5],
-  link:RelNotes/2.0.4.txt[2.0.4],
-  link:RelNotes/2.0.3.txt[2.0.3],
-  link:RelNotes/2.0.2.txt[2.0.2],
-  link:RelNotes/2.0.1.txt[2.0.1],
-  link:RelNotes/2.0.0.txt[2.0.0].
-
-* link:v1.9.5/git.html[documentation for release 1.9.5]
-
-* release notes for
-  link:RelNotes/1.9.5.txt[1.9.5],
-  link:RelNotes/1.9.4.txt[1.9.4],
-  link:RelNotes/1.9.3.txt[1.9.3],
-  link:RelNotes/1.9.2.txt[1.9.2],
-  link:RelNotes/1.9.1.txt[1.9.1],
-  link:RelNotes/1.9.0.txt[1.9.0].
-
-* link:v1.8.5.6/git.html[documentation for release 1.8.5.6]
-
-* release notes for
-  link:RelNotes/1.8.5.6.txt[1.8.5.6],
-  link:RelNotes/1.8.5.5.txt[1.8.5.5],
-  link:RelNotes/1.8.5.4.txt[1.8.5.4],
-  link:RelNotes/1.8.5.3.txt[1.8.5.3],
-  link:RelNotes/1.8.5.2.txt[1.8.5.2],
-  link:RelNotes/1.8.5.1.txt[1.8.5.1],
-  link:RelNotes/1.8.5.txt[1.8.5].
-
-* link:v1.8.4.5/git.html[documentation for release 1.8.4.5]
-
-* release notes for
-  link:RelNotes/1.8.4.5.txt[1.8.4.5],
-  link:RelNotes/1.8.4.4.txt[1.8.4.4],
-  link:RelNotes/1.8.4.3.txt[1.8.4.3],
-  link:RelNotes/1.8.4.2.txt[1.8.4.2],
-  link:RelNotes/1.8.4.1.txt[1.8.4.1],
-  link:RelNotes/1.8.4.txt[1.8.4].
-
-* link:v1.8.3.4/git.html[documentation for release 1.8.3.4]
-
-* release notes for
-  link:RelNotes/1.8.3.4.txt[1.8.3.4],
-  link:RelNotes/1.8.3.3.txt[1.8.3.3],
-  link:RelNotes/1.8.3.2.txt[1.8.3.2],
-  link:RelNotes/1.8.3.1.txt[1.8.3.1],
-  link:RelNotes/1.8.3.txt[1.8.3].
-
-* link:v1.8.2.3/git.html[documentation for release 1.8.2.3]
-
-* release notes for
-  link:RelNotes/1.8.2.3.txt[1.8.2.3],
-  link:RelNotes/1.8.2.2.txt[1.8.2.2],
-  link:RelNotes/1.8.2.1.txt[1.8.2.1],
-  link:RelNotes/1.8.2.txt[1.8.2].
-
-* link:v1.8.1.6/git.html[documentation for release 1.8.1.6]
-
-* release notes for
-  link:RelNotes/1.8.1.6.txt[1.8.1.6],
-  link:RelNotes/1.8.1.5.txt[1.8.1.5],
-  link:RelNotes/1.8.1.4.txt[1.8.1.4],
-  link:RelNotes/1.8.1.3.txt[1.8.1.3],
-  link:RelNotes/1.8.1.2.txt[1.8.1.2],
-  link:RelNotes/1.8.1.1.txt[1.8.1.1],
-  link:RelNotes/1.8.1.txt[1.8.1].
-
-* link:v1.8.0.3/git.html[documentation for release 1.8.0.3]
-
-* release notes for
-  link:RelNotes/1.8.0.3.txt[1.8.0.3],
-  link:RelNotes/1.8.0.2.txt[1.8.0.2],
-  link:RelNotes/1.8.0.1.txt[1.8.0.1],
-  link:RelNotes/1.8.0.txt[1.8.0].
-
-* link:v1.7.12.4/git.html[documentation for release 1.7.12.4]
-
-* release notes for
-  link:RelNotes/1.7.12.4.txt[1.7.12.4],
-  link:RelNotes/1.7.12.3.txt[1.7.12.3],
-  link:RelNotes/1.7.12.2.txt[1.7.12.2],
-  link:RelNotes/1.7.12.1.txt[1.7.12.1],
-  link:RelNotes/1.7.12.txt[1.7.12].
-
-* link:v1.7.11.7/git.html[documentation for release 1.7.11.7]
-
-* release notes for
-  link:RelNotes/1.7.11.7.txt[1.7.11.7],
-  link:RelNotes/1.7.11.6.txt[1.7.11.6],
-  link:RelNotes/1.7.11.5.txt[1.7.11.5],
-  link:RelNotes/1.7.11.4.txt[1.7.11.4],
-  link:RelNotes/1.7.11.3.txt[1.7.11.3],
-  link:RelNotes/1.7.11.2.txt[1.7.11.2],
-  link:RelNotes/1.7.11.1.txt[1.7.11.1],
-  link:RelNotes/1.7.11.txt[1.7.11].
-
-* link:v1.7.10.5/git.html[documentation for release 1.7.10.5]
-
-* release notes for
-  link:RelNotes/1.7.10.5.txt[1.7.10.5],
-  link:RelNotes/1.7.10.4.txt[1.7.10.4],
-  link:RelNotes/1.7.10.3.txt[1.7.10.3],
-  link:RelNotes/1.7.10.2.txt[1.7.10.2],
-  link:RelNotes/1.7.10.1.txt[1.7.10.1],
-  link:RelNotes/1.7.10.txt[1.7.10].
-
-* link:v1.7.9.7/git.html[documentation for release 1.7.9.7]
-
-* release notes for
-  link:RelNotes/1.7.9.7.txt[1.7.9.7],
-  link:RelNotes/1.7.9.6.txt[1.7.9.6],
-  link:RelNotes/1.7.9.5.txt[1.7.9.5],
-  link:RelNotes/1.7.9.4.txt[1.7.9.4],
-  link:RelNotes/1.7.9.3.txt[1.7.9.3],
-  link:RelNotes/1.7.9.2.txt[1.7.9.2],
-  link:RelNotes/1.7.9.1.txt[1.7.9.1],
-  link:RelNotes/1.7.9.txt[1.7.9].
-
-* link:v1.7.8.6/git.html[documentation for release 1.7.8.6]
-
-* release notes for
-  link:RelNotes/1.7.8.6.txt[1.7.8.6],
-  link:RelNotes/1.7.8.5.txt[1.7.8.5],
-  link:RelNotes/1.7.8.4.txt[1.7.8.4],
-  link:RelNotes/1.7.8.3.txt[1.7.8.3],
-  link:RelNotes/1.7.8.2.txt[1.7.8.2],
-  link:RelNotes/1.7.8.1.txt[1.7.8.1],
-  link:RelNotes/1.7.8.txt[1.7.8].
-
-* link:v1.7.7.7/git.html[documentation for release 1.7.7.7]
-
-* release notes for
-  link:RelNotes/1.7.7.7.txt[1.7.7.7],
-  link:RelNotes/1.7.7.6.txt[1.7.7.6],
-  link:RelNotes/1.7.7.5.txt[1.7.7.5],
-  link:RelNotes/1.7.7.4.txt[1.7.7.4],
-  link:RelNotes/1.7.7.3.txt[1.7.7.3],
-  link:RelNotes/1.7.7.2.txt[1.7.7.2],
-  link:RelNotes/1.7.7.1.txt[1.7.7.1],
-  link:RelNotes/1.7.7.txt[1.7.7].
-
-* link:v1.7.6.6/git.html[documentation for release 1.7.6.6]
-
-* release notes for
-  link:RelNotes/1.7.6.6.txt[1.7.6.6],
-  link:RelNotes/1.7.6.5.txt[1.7.6.5],
-  link:RelNotes/1.7.6.4.txt[1.7.6.4],
-  link:RelNotes/1.7.6.3.txt[1.7.6.3],
-  link:RelNotes/1.7.6.2.txt[1.7.6.2],
-  link:RelNotes/1.7.6.1.txt[1.7.6.1],
-  link:RelNotes/1.7.6.txt[1.7.6].
-
-* link:v1.7.5.4/git.html[documentation for release 1.7.5.4]
-
-* release notes for
-  link:RelNotes/1.7.5.4.txt[1.7.5.4],
-  link:RelNotes/1.7.5.3.txt[1.7.5.3],
-  link:RelNotes/1.7.5.2.txt[1.7.5.2],
-  link:RelNotes/1.7.5.1.txt[1.7.5.1],
-  link:RelNotes/1.7.5.txt[1.7.5].
-
-* link:v1.7.4.5/git.html[documentation for release 1.7.4.5]
-
-* release notes for
-  link:RelNotes/1.7.4.5.txt[1.7.4.5],
-  link:RelNotes/1.7.4.4.txt[1.7.4.4],
-  link:RelNotes/1.7.4.3.txt[1.7.4.3],
-  link:RelNotes/1.7.4.2.txt[1.7.4.2],
-  link:RelNotes/1.7.4.1.txt[1.7.4.1],
-  link:RelNotes/1.7.4.txt[1.7.4].
-
-* link:v1.7.3.5/git.html[documentation for release 1.7.3.5]
-
-* release notes for
-  link:RelNotes/1.7.3.5.txt[1.7.3.5],
-  link:RelNotes/1.7.3.4.txt[1.7.3.4],
-  link:RelNotes/1.7.3.3.txt[1.7.3.3],
-  link:RelNotes/1.7.3.2.txt[1.7.3.2],
-  link:RelNotes/1.7.3.1.txt[1.7.3.1],
-  link:RelNotes/1.7.3.txt[1.7.3].
-
-* link:v1.7.2.5/git.html[documentation for release 1.7.2.5]
-
-* release notes for
-  link:RelNotes/1.7.2.5.txt[1.7.2.5],
-  link:RelNotes/1.7.2.4.txt[1.7.2.4],
-  link:RelNotes/1.7.2.3.txt[1.7.2.3],
-  link:RelNotes/1.7.2.2.txt[1.7.2.2],
-  link:RelNotes/1.7.2.1.txt[1.7.2.1],
-  link:RelNotes/1.7.2.txt[1.7.2].
-
-* link:v1.7.1.4/git.html[documentation for release 1.7.1.4]
-
-* release notes for
-  link:RelNotes/1.7.1.4.txt[1.7.1.4],
-  link:RelNotes/1.7.1.3.txt[1.7.1.3],
-  link:RelNotes/1.7.1.2.txt[1.7.1.2],
-  link:RelNotes/1.7.1.1.txt[1.7.1.1],
-  link:RelNotes/1.7.1.txt[1.7.1].
-
-* link:v1.7.0.9/git.html[documentation for release 1.7.0.9]
-
-* release notes for
-  link:RelNotes/1.7.0.9.txt[1.7.0.9],
-  link:RelNotes/1.7.0.8.txt[1.7.0.8],
-  link:RelNotes/1.7.0.7.txt[1.7.0.7],
-  link:RelNotes/1.7.0.6.txt[1.7.0.6],
-  link:RelNotes/1.7.0.5.txt[1.7.0.5],
-  link:RelNotes/1.7.0.4.txt[1.7.0.4],
-  link:RelNotes/1.7.0.3.txt[1.7.0.3],
-  link:RelNotes/1.7.0.2.txt[1.7.0.2],
-  link:RelNotes/1.7.0.1.txt[1.7.0.1],
-  link:RelNotes/1.7.0.txt[1.7.0].
-
-* link:v1.6.6.3/git.html[documentation for release 1.6.6.3]
-
-* release notes for
-  link:RelNotes/1.6.6.3.txt[1.6.6.3],
-  link:RelNotes/1.6.6.2.txt[1.6.6.2],
-  link:RelNotes/1.6.6.1.txt[1.6.6.1],
-  link:RelNotes/1.6.6.txt[1.6.6].
-
-* link:v1.6.5.9/git.html[documentation for release 1.6.5.9]
-
-* release notes for
-  link:RelNotes/1.6.5.9.txt[1.6.5.9],
-  link:RelNotes/1.6.5.8.txt[1.6.5.8],
-  link:RelNotes/1.6.5.7.txt[1.6.5.7],
-  link:RelNotes/1.6.5.6.txt[1.6.5.6],
-  link:RelNotes/1.6.5.5.txt[1.6.5.5],
-  link:RelNotes/1.6.5.4.txt[1.6.5.4],
-  link:RelNotes/1.6.5.3.txt[1.6.5.3],
-  link:RelNotes/1.6.5.2.txt[1.6.5.2],
-  link:RelNotes/1.6.5.1.txt[1.6.5.1],
-  link:RelNotes/1.6.5.txt[1.6.5].
-
-* link:v1.6.4.5/git.html[documentation for release 1.6.4.5]
-
-* release notes for
-  link:RelNotes/1.6.4.5.txt[1.6.4.5],
-  link:RelNotes/1.6.4.4.txt[1.6.4.4],
-  link:RelNotes/1.6.4.3.txt[1.6.4.3],
-  link:RelNotes/1.6.4.2.txt[1.6.4.2],
-  link:RelNotes/1.6.4.1.txt[1.6.4.1],
-  link:RelNotes/1.6.4.txt[1.6.4].
-
-* link:v1.6.3.4/git.html[documentation for release 1.6.3.4]
-
-* release notes for
-  link:RelNotes/1.6.3.4.txt[1.6.3.4],
-  link:RelNotes/1.6.3.3.txt[1.6.3.3],
-  link:RelNotes/1.6.3.2.txt[1.6.3.2],
-  link:RelNotes/1.6.3.1.txt[1.6.3.1],
-  link:RelNotes/1.6.3.txt[1.6.3].
-
-* release notes for
-  link:RelNotes/1.6.2.5.txt[1.6.2.5],
-  link:RelNotes/1.6.2.4.txt[1.6.2.4],
-  link:RelNotes/1.6.2.3.txt[1.6.2.3],
-  link:RelNotes/1.6.2.2.txt[1.6.2.2],
-  link:RelNotes/1.6.2.1.txt[1.6.2.1],
-  link:RelNotes/1.6.2.txt[1.6.2].
-
-* link:v1.6.1.3/git.html[documentation for release 1.6.1.3]
-
-* release notes for
-  link:RelNotes/1.6.1.3.txt[1.6.1.3],
-  link:RelNotes/1.6.1.2.txt[1.6.1.2],
-  link:RelNotes/1.6.1.1.txt[1.6.1.1],
-  link:RelNotes/1.6.1.txt[1.6.1].
-
-* link:v1.6.0.6/git.html[documentation for release 1.6.0.6]
-
-* release notes for
-  link:RelNotes/1.6.0.6.txt[1.6.0.6],
-  link:RelNotes/1.6.0.5.txt[1.6.0.5],
-  link:RelNotes/1.6.0.4.txt[1.6.0.4],
-  link:RelNotes/1.6.0.3.txt[1.6.0.3],
-  link:RelNotes/1.6.0.2.txt[1.6.0.2],
-  link:RelNotes/1.6.0.1.txt[1.6.0.1],
-  link:RelNotes/1.6.0.txt[1.6.0].
-
-* link:v1.5.6.6/git.html[documentation for release 1.5.6.6]
-
-* release notes for
-  link:RelNotes/1.5.6.6.txt[1.5.6.6],
-  link:RelNotes/1.5.6.5.txt[1.5.6.5],
-  link:RelNotes/1.5.6.4.txt[1.5.6.4],
-  link:RelNotes/1.5.6.3.txt[1.5.6.3],
-  link:RelNotes/1.5.6.2.txt[1.5.6.2],
-  link:RelNotes/1.5.6.1.txt[1.5.6.1],
-  link:RelNotes/1.5.6.txt[1.5.6].
-
-* link:v1.5.5.6/git.html[documentation for release 1.5.5.6]
-
-* release notes for
-  link:RelNotes/1.5.5.6.txt[1.5.5.6],
-  link:RelNotes/1.5.5.5.txt[1.5.5.5],
-  link:RelNotes/1.5.5.4.txt[1.5.5.4],
-  link:RelNotes/1.5.5.3.txt[1.5.5.3],
-  link:RelNotes/1.5.5.2.txt[1.5.5.2],
-  link:RelNotes/1.5.5.1.txt[1.5.5.1],
-  link:RelNotes/1.5.5.txt[1.5.5].
-
-* link:v1.5.4.7/git.html[documentation for release 1.5.4.7]
-
-* release notes for
-  link:RelNotes/1.5.4.7.txt[1.5.4.7],
-  link:RelNotes/1.5.4.6.txt[1.5.4.6],
-  link:RelNotes/1.5.4.5.txt[1.5.4.5],
-  link:RelNotes/1.5.4.4.txt[1.5.4.4],
-  link:RelNotes/1.5.4.3.txt[1.5.4.3],
-  link:RelNotes/1.5.4.2.txt[1.5.4.2],
-  link:RelNotes/1.5.4.1.txt[1.5.4.1],
-  link:RelNotes/1.5.4.txt[1.5.4].
-
-* link:v1.5.3.8/git.html[documentation for release 1.5.3.8]
-
-* release notes for
-  link:RelNotes/1.5.3.8.txt[1.5.3.8],
-  link:RelNotes/1.5.3.7.txt[1.5.3.7],
-  link:RelNotes/1.5.3.6.txt[1.5.3.6],
-  link:RelNotes/1.5.3.5.txt[1.5.3.5],
-  link:RelNotes/1.5.3.4.txt[1.5.3.4],
-  link:RelNotes/1.5.3.3.txt[1.5.3.3],
-  link:RelNotes/1.5.3.2.txt[1.5.3.2],
-  link:RelNotes/1.5.3.1.txt[1.5.3.1],
-  link:RelNotes/1.5.3.txt[1.5.3].
-
-* link:v1.5.2.5/git.html[documentation for release 1.5.2.5]
-
-* release notes for
-  link:RelNotes/1.5.2.5.txt[1.5.2.5],
-  link:RelNotes/1.5.2.4.txt[1.5.2.4],
-  link:RelNotes/1.5.2.3.txt[1.5.2.3],
-  link:RelNotes/1.5.2.2.txt[1.5.2.2],
-  link:RelNotes/1.5.2.1.txt[1.5.2.1],
-  link:RelNotes/1.5.2.txt[1.5.2].
-
-* link:v1.5.1.6/git.html[documentation for release 1.5.1.6]
-
-* release notes for
-  link:RelNotes/1.5.1.6.txt[1.5.1.6],
-  link:RelNotes/1.5.1.5.txt[1.5.1.5],
-  link:RelNotes/1.5.1.4.txt[1.5.1.4],
-  link:RelNotes/1.5.1.3.txt[1.5.1.3],
-  link:RelNotes/1.5.1.2.txt[1.5.1.2],
-  link:RelNotes/1.5.1.1.txt[1.5.1.1],
-  link:RelNotes/1.5.1.txt[1.5.1].
-
-* link:v1.5.0.7/git.html[documentation for release 1.5.0.7]
-
-* release notes for
-  link:RelNotes/1.5.0.7.txt[1.5.0.7],
-  link:RelNotes/1.5.0.6.txt[1.5.0.6],
-  link:RelNotes/1.5.0.5.txt[1.5.0.5],
-  link:RelNotes/1.5.0.3.txt[1.5.0.3],
-  link:RelNotes/1.5.0.2.txt[1.5.0.2],
-  link:RelNotes/1.5.0.1.txt[1.5.0.1],
-  link:RelNotes/1.5.0.txt[1.5.0].
-
-* documentation for release link:v1.4.4.4/git.html[1.4.4.4],
-  link:v1.3.3/git.html[1.3.3],
-  link:v1.2.6/git.html[1.2.6],
-  link:v1.0.13/git.html[1.0.13].
-
-============
-
-endif::stalenotes[]
 
 OPTIONS
 -------
@@ -611,6 +123,11 @@ foo.bar= ...`) sets `foo.bar` to the empty string.
        details.  Equivalent to setting the `GIT_NAMESPACE` environment
        variable.
 
+--super-prefix=<path>::
+       Currently for internal use only.  Set a prefix which gives a path from
+       above a repository down to its root.  One use is to give submodules
+       context about the superproject that invoked it.
+
 --bare::
        Treat the repository as a bare repository.  If GIT_DIR
        environment is not set, it is set to the current working
@@ -868,6 +385,12 @@ Git so take care if using a foreign front-end.
        specifies a ":" separated (on Windows ";" separated) list
        of Git object directories which can be used to search for Git
        objects. New objects will not be written to these directories.
++
+       Entries that begin with `"` (double-quote) will be interpreted
+       as C-style quoted paths, removing leading and trailing
+       double-quotes and respecting backslash escapes. E.g., the value
+       `"path-with-\"-and-:-in-it":vanilla-path` has two paths:
+       `path-with-"-and-:-in-it` and `vanilla-path`.
 
 `GIT_DIR`::
        If the `GIT_DIR` environment variable is set then it
@@ -1010,6 +533,12 @@ Usually it is easier to configure any desired options through your
 personal `.ssh/config` file.  Please consult your ssh documentation
 for further details.
 
+`GIT_SSH_VARIANT`::
+       If this environment variable is set, it overrides Git's autodetection
+       whether `GIT_SSH`/`GIT_SSH_COMMAND`/`core.sshCommand` refer to OpenSSH,
+       plink or tortoiseplink. This variable overrides the config setting
+       `ssh.variant` that serves the same purpose.
+
 `GIT_ASKPASS`::
        If this environment variable is set, then Git commands which need to
        acquire passwords or passphrases (e.g. for HTTP or IMAP authentication)
@@ -1152,30 +681,20 @@ of clones and fetches.
        cloning a repository to make a backup).
 
 `GIT_ALLOW_PROTOCOL`::
-       If set, provide a colon-separated list of protocols which are
-       allowed to be used with fetch/push/clone. This is useful to
-       restrict recursive submodule initialization from an untrusted
-       repository. Any protocol not mentioned will be disallowed (i.e.,
-       this is a whitelist, not a blacklist). If the variable is not
-       set at all, all protocols are enabled.  The protocol names
-       currently used by git are:
-
-         - `file`: any local file-based path (including `file://` URLs,
-           or local paths)
-
-         - `git`: the anonymous git protocol over a direct TCP
-           connection (or proxy, if configured)
-
-         - `ssh`: git over ssh (including `host:path` syntax,
-           `ssh://`, etc).
-
-         - `http`: git over http, both "smart http" and "dumb http".
-           Note that this does _not_ include `https`; if you want both,
-           you should specify both as `http:https`.
-
-         - any external helpers are named by their protocol (e.g., use
-           `hg` to allow the `git-remote-hg` helper)
-
+       If set to a colon-separated list of protocols, behave as if
+       `protocol.allow` is set to `never`, and each of the listed
+       protocols has `protocol.<name>.allow` set to `always`
+       (overriding any existing configuration). In other words, any
+       protocol not mentioned will be disallowed (i.e., this is a
+       whitelist, not a blacklist). See the description of
+       `protocol.allow` in linkgit:git-config[1] for more details.
+
+`GIT_PROTOCOL_FROM_USER`::
+       Set to 0 to prevent protocols used by fetch/push/clone which are
+       configured to the `user` state.  This is useful to restrict recursive
+       submodule initialization from an untrusted repository or for programs
+       which feed potentially-untrusted URLS to git commands.  See
+       linkgit:git-config[1] for more details.
 
 Discussion[[Discussion]]
 ------------------------
index 7aff94020243a02a7785e4890cf99b71d039884d..2a2d7e2a4d2a9cab2af8bd881dd880ca2a52235a 100644 (file)
@@ -21,9 +21,11 @@ Each line in `gitattributes` file is of form:
        pattern attr1 attr2 ...
 
 That is, a pattern followed by an attributes list,
-separated by whitespaces.  When the pattern matches the
-path in question, the attributes listed on the line are given to
-the path.
+separated by whitespaces. Leading and trailing whitespaces are
+ignored. Lines that begin with '#' are ignored. Patterns
+that begin with a double quote are quoted in C style.
+When the pattern matches the path in question, the attributes
+listed on the line are given to the path.
 
 Each attribute can be in one of these states for a given path:
 
@@ -86,7 +88,7 @@ is either not set or empty, $HOME/.config/git/attributes is used instead.
 Attributes for all users on a system should be placed in the
 `$(prefix)/etc/gitattributes` file.
 
-Sometimes you would need to override an setting of an attribute
+Sometimes you would need to override a setting of an attribute
 for a path to `Unspecified` state.  This can be done by listing
 the name of the attribute prefixed with an exclamation point `!`.
 
@@ -227,11 +229,9 @@ From a clean working directory:
 
 -------------------------------------------------
 $ echo "* text=auto" >.gitattributes
-$ rm .git/index     # Remove the index to force Git to
-$ git reset         # re-scan the working directory
+$ git read-tree --empty   # Clean index, force re-scan of working directory
+$ git add .
 $ git status        # Show files that will be normalized
-$ git add -u
-$ git add .gitattributes
 $ git commit -m "Introduce end-of-line normalization"
 -------------------------------------------------
 
@@ -293,7 +293,15 @@ checkout, when the `smudge` command is specified, the command is
 fed the blob object from its standard input, and its standard
 output is used to update the worktree file.  Similarly, the
 `clean` command is used to convert the contents of worktree file
-upon checkin.
+upon checkin. By default these commands process only a single
+blob and terminate. If a long running `process` filter is used
+in place of `clean` and/or `smudge` filters, then Git can process
+all blobs with a single filter command invocation for the entire
+life of a single Git command, for example `git add --all`. If a
+long running `process` filter is configured then it always takes
+precedence over a configured single blob filter. See section
+below for the description of the protocol used to communicate with
+a `process` filter.
 
 One use of the content filtering is to massage the content into a shape
 that is more convenient for the platform, filesystem, and the user to use.
@@ -373,6 +381,155 @@ not exist, or may have different contents. So, smudge and clean commands
 should not try to access the file on disk, but only act as filters on the
 content provided to them on standard input.
 
+Long Running Filter Process
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If the filter command (a string value) is defined via
+`filter.<driver>.process` then Git can process all blobs with a
+single filter invocation for the entire life of a single Git
+command. This is achieved by using a packet format (pkt-line,
+see technical/protocol-common.txt) based protocol over standard
+input and standard output as follows. All packets, except for the
+"*CONTENT" packets and the "0000" flush packet, are considered
+text and therefore are terminated by a LF.
+
+Git starts the filter when it encounters the first file
+that needs to be cleaned or smudged. After the filter started
+Git sends a welcome message ("git-filter-client"), a list of supported
+protocol version numbers, and a flush packet. Git expects to read a welcome
+response message ("git-filter-server"), exactly one protocol version number
+from the previously sent list, and a flush packet. All further
+communication will be based on the selected version. The remaining
+protocol description below documents "version=2". Please note that
+"version=42" in the example below does not exist and is only there
+to illustrate how the protocol would look like with more than one
+version.
+
+After the version negotiation Git sends a list of all capabilities that
+it supports and a flush packet. Git expects to read a list of desired
+capabilities, which must be a subset of the supported capabilities list,
+and a flush packet as response:
+------------------------
+packet:          git> git-filter-client
+packet:          git> version=2
+packet:          git> version=42
+packet:          git> 0000
+packet:          git< git-filter-server
+packet:          git< version=2
+packet:          git< 0000
+packet:          git> capability=clean
+packet:          git> capability=smudge
+packet:          git> capability=not-yet-invented
+packet:          git> 0000
+packet:          git< capability=clean
+packet:          git< capability=smudge
+packet:          git< 0000
+------------------------
+Supported filter capabilities in version 2 are "clean" and
+"smudge".
+
+Afterwards Git sends a list of "key=value" pairs terminated with
+a flush packet. The list will contain at least the filter command
+(based on the supported capabilities) and the pathname of the file
+to filter relative to the repository root. Right after the flush packet
+Git sends the content split in zero or more pkt-line packets and a
+flush packet to terminate content. Please note, that the filter
+must not send any response before it received the content and the
+final flush packet. Also note that the "value" of a "key=value" pair
+can contain the "=" character whereas the key would never contain
+that character.
+------------------------
+packet:          git> command=smudge
+packet:          git> pathname=path/testfile.dat
+packet:          git> 0000
+packet:          git> CONTENT
+packet:          git> 0000
+------------------------
+
+The filter is expected to respond with a list of "key=value" pairs
+terminated with a flush packet. If the filter does not experience
+problems then the list must contain a "success" status. Right after
+these packets the filter is expected to send the content in zero
+or more pkt-line packets and a flush packet at the end. Finally, a
+second list of "key=value" pairs terminated with a flush packet
+is expected. The filter can change the status in the second list
+or keep the status as is with an empty list. Please note that the
+empty list must be terminated with a flush packet regardless.
+
+------------------------
+packet:          git< status=success
+packet:          git< 0000
+packet:          git< SMUDGED_CONTENT
+packet:          git< 0000
+packet:          git< 0000  # empty list, keep "status=success" unchanged!
+------------------------
+
+If the result content is empty then the filter is expected to respond
+with a "success" status and a flush packet to signal the empty content.
+------------------------
+packet:          git< status=success
+packet:          git< 0000
+packet:          git< 0000  # empty content!
+packet:          git< 0000  # empty list, keep "status=success" unchanged!
+------------------------
+
+In case the filter cannot or does not want to process the content,
+it is expected to respond with an "error" status.
+------------------------
+packet:          git< status=error
+packet:          git< 0000
+------------------------
+
+If the filter experiences an error during processing, then it can
+send the status "error" after the content was (partially or
+completely) sent.
+------------------------
+packet:          git< status=success
+packet:          git< 0000
+packet:          git< HALF_WRITTEN_ERRONEOUS_CONTENT
+packet:          git< 0000
+packet:          git< status=error
+packet:          git< 0000
+------------------------
+
+In case the filter cannot or does not want to process the content
+as well as any future content for the lifetime of the Git process,
+then it is expected to respond with an "abort" status at any point
+in the protocol.
+------------------------
+packet:          git< status=abort
+packet:          git< 0000
+------------------------
+
+Git neither stops nor restarts the filter process in case the
+"error"/"abort" status is set. However, Git sets its exit code
+according to the `filter.<driver>.required` flag, mimicking the
+behavior of the `filter.<driver>.clean` / `filter.<driver>.smudge`
+mechanism.
+
+If the filter dies during the communication or does not adhere to
+the protocol then Git will stop the filter process and restart it
+with the next file that needs to be processed. Depending on the
+`filter.<driver>.required` flag Git will interpret that as error.
+
+After the filter has processed a blob it is expected to wait for
+the next "key=value" list containing a command. Git will close
+the command pipe on exit. The filter is expected to detect EOF
+and exit gracefully on its own. Git will wait until the filter
+process has stopped.
+
+A long running filter demo implementation can be found in
+`contrib/long-running-filter/example.pl` located in the Git
+core repository. If you develop your own long running filter
+process then the `GIT_TRACE_PACKET` environment variables can be
+very helpful for debugging (see linkgit:git[1]).
+
+Please note that you cannot use an existing `filter.<driver>.clean`
+or `filter.<driver>.smudge` command with `filter.<driver>.process`
+because the former two use a different inter process communication
+protocol than the latter one.
+
+
 Interaction between checkin/checkout attributes
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
index 4546fa0d751705c27c88448ec3e7beb954233280..7577f27ec20c90eabea2652a438ca09961559f6a 100644 (file)
@@ -25,7 +25,7 @@ you want to understand Git's internals.
 The core Git is often called "plumbing", with the prettier user
 interfaces on top of it called "porcelain". You may not want to use the
 plumbing directly very often, but it can be good to know what the
-plumbing does for when the porcelain isn't flushing.
+plumbing does when the porcelain isn't flushing.
 
 Back when this document was originally written, many porcelain
 commands were shell scripts. For simplicity, it still uses them as
@@ -1368,7 +1368,7 @@ $ git repack
 will do it for you. If you followed the tutorial examples, you
 would have accumulated about 17 objects in `.git/objects/??/`
 directories by now. 'git repack' tells you how many objects it
-packed, and stores the packed file in `.git/objects/pack`
+packed, and stores the packed file in the `.git/objects/pack`
 directory.
 
 [NOTE]
@@ -1429,7 +1429,7 @@ Although Git is a truly distributed system, it is often
 convenient to organize your project with an informal hierarchy
 of developers. Linux kernel development is run this way. There
 is a nice illustration (page 17, "Merges to Mainline") in
-http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf[Randy Dunlap's presentation].
+https://web.archive.org/web/20120915203609/http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf[Randy Dunlap's presentation].
 
 It should be stressed that this hierarchy is purely *informal*.
 There is nothing fundamental in Git that enforces the "chain of
@@ -1478,7 +1478,7 @@ You can repack this private repository whenever you feel like.
 A recommended work cycle for a "subsystem maintainer" who works
 on that project and has an own "public repository" goes like this:
 
-1. Prepare your work repository, by 'git clone' the public
+1. Prepare your work repository, by running 'git clone' on the public
    repository of the "project lead". The URL used for the
    initial cloning is stored in the remote.origin.url
    configuration variable.
@@ -1543,9 +1543,9 @@ like this:
 Working with Others, Shared Repository Style
 --------------------------------------------
 
-If you are coming from CVS background, the style of cooperation
+If you are coming from CVS background, the style of cooperation
 suggested in the previous section may be new to you. You do not
-have to worry. Git supports "shared public repository" style of
+have to worry. Git supports the "shared public repository" style of
 cooperation you are probably more familiar with as well.
 
 See linkgit:gitcvs-migration[7] for the details.
@@ -1635,7 +1635,7 @@ $ git show-branch
 ++* [master~2] Pretty-print messages.
 ------------
 
-Note that you should not do Octopus because you can.  An octopus
+Note that you should not do Octopus just because you can.  An octopus
 is a valid thing to do and often makes it easier to view the
 commit history if you are merging more than two independent
 changes at the same time.  However, if you have merge conflicts
@@ -1658,4 +1658,4 @@ link:user-manual.html[The Git User's Manual]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index f3a75d1ce1c5a2709b452faca76f5f6f1cdb7de0..f970196bc1c52f489538ab515e1640ac435fead3 100644 (file)
@@ -101,16 +101,6 @@ $ git help credential-foo
 $ git config --global credential.helper foo
 -------------------------------------------
 
-If there are multiple instances of the `credential.helper` configuration
-variable, each helper will be tried in turn, and may provide a username,
-password, or nothing. Once Git has acquired both a username and a
-password, no more helpers will be tried.
-
-If `credential.helper` is configured to the empty string, this resets
-the helper list to empty (so you may override a helper set by a
-lower-priority config file by configuring the empty-string helper,
-followed by whatever set of helpers you would like).
-
 
 CREDENTIAL CONTEXTS
 -------------------
@@ -162,6 +152,16 @@ helper::
        shell (so, for example, setting this to `foo --option=bar` will execute
        `git credential-foo --option=bar` via the shell. See the manual of
        specific helpers for examples of their use.
++
+If there are multiple instances of the `credential.helper` configuration
+variable, each helper will be tried in turn, and may provide a username,
+password, or nothing. Once Git has acquired both a username and a
+password, no more helpers will be tried.
++
+If `credential.helper` is configured to the empty string, this resets
+the helper list to empty (so you may override a helper set by a
+lower-priority config file by configuring the empty-string helper,
+followed by whatever set of helpers you would like).
 
 username::
 
index 4c6143c511c06a1fd5f3854445a14533653fd752..1cd1283d0f817d06e42ed41c31e7c02f69c1f821 100644 (file)
@@ -203,4 +203,4 @@ link:user-manual.html[The Git User's Manual]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index 08cf62278e87556bbf764c0a22f8354d0a462ebe..c0a60f315811c788f3431b5757c38ffcea487386 100644 (file)
@@ -84,8 +84,8 @@ format sections of the manual for 'git diff-{asterisk}' commands) or
 diff-patch format.
 
 
-diffcore-break: For Splitting Up "Complete Rewrites"
-----------------------------------------------------
+diffcore-break: For Splitting Up Complete Rewrites
+--------------------------------------------------
 
 The second transformation in the chain is diffcore-break, and is
 controlled by the -B option to the 'git diff-{asterisk}' commands.  This is
@@ -119,7 +119,7 @@ the original is used), and can be customized by giving a number
 after "-B" option (e.g. "-B75" to tell it to use 75%).
 
 
-diffcore-rename: For Detection Renames and Copies
+diffcore-rename: For Detecting Renames and Copies
 -------------------------------------------------
 
 This transformation is used to detect renames and copies, and is
@@ -177,8 +177,8 @@ the expense of making it slower.  Without `--find-copies-harder`,
 copied happened to have been modified in the same changeset.
 
 
-diffcore-merge-broken: For Putting "Complete Rewrites" Back Together
---------------------------------------------------------------------
+diffcore-merge-broken: For Putting Complete Rewrites Back Together
+------------------------------------------------------------------
 
 This transformation is used to merge filepairs broken by
 diffcore-break, and not transformed into rename/copy by
@@ -288,4 +288,4 @@ link:user-manual.html[The Git User's Manual]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index 35473ad02fb1dcce2e03bca30bdace4dea0232d4..10c8ff93c0b9f55ff19a8b54cdeed2fdad93b92b 100644 (file)
@@ -307,9 +307,16 @@ master or exposed as a part of a stable branch.
 <9> backport a critical fix.
 <10> create a signed tag.
 <11> make sure master was not accidentally rewound beyond that
-already pushed out.  `ko` shorthand points at the Git maintainer's
+already pushed out.
+<12> In the output from `git show-branch`, `master` should have
+everything `ko/master` has, and `next` should have
+everything `ko/next` has, etc.
+<13> push out the bleeding edge, together with new tags that point
+into the pushed history.
+
+In this example, the `ko` shorthand points at the Git maintainer's
 repository at kernel.org, and looks like this:
-+
+
 ------------
 (in .git/config)
 [remote "ko"]
@@ -320,12 +327,6 @@ repository at kernel.org, and looks like this:
        push = +refs/heads/pu
        push = refs/heads/maint
 ------------
-+
-<12> In the output from `git show-branch`, `master` should have
-everything `ko/master` has, and `next` should have
-everything `ko/next` has, etc.
-<13> push out the bleeding edge, together with new tags that point
-into the pushed history.
 
 
 Repository Administration[[ADMINISTRATION]]
index 212e254adc057fa3f67bc50cc23a995059a24585..571f640f5c1c8f7d6eb464e2c0f9b2366b2bd6f3 100644 (file)
@@ -24,4 +24,4 @@ link:user-manual.html[The Git User's Manual]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index 9565dc3fda47d7c8a7290132c347b5a6f0d2422e..706091a569c17cae93e250ed7cb34d056a5b25f0 100644 (file)
@@ -22,8 +22,10 @@ changed via the `core.hooksPath` configuration variable (see
 linkgit:git-config[1]).
 
 Before Git invokes a hook, it changes its working directory to either
-the root of the working tree in a non-bare repository, or to the
-$GIT_DIR in a bare repository.
+$GIT_DIR in a bare repository or the root of the working tree in a non-bare
+repository. An exception are hooks triggered during a push ('pre-receive',
+'update', 'post-receive', 'post-update', 'push-to-checkout') which are always
+executed in $GIT_DIR.
 
 Hooks can get their arguments via the environment, command-line
 arguments, and stdin. See the documentation for each hook below for
@@ -256,6 +258,9 @@ environment variables will not be set. If the client selects
 to use push options, but doesn't transmit any, the count variable
 will be set to zero, `GIT_PUSH_OPTION_COUNT=0`.
 
+See the section on "Quarantine Environment" in
+linkgit:git-receive-pack[1] for some caveats.
+
 [[update]]
 update
 ~~~~~~
index e382dd96dfded769a27c2295ebc096c15214713b..ca96c281d1f3abbf71cdac112a019d2849e7ad0b 100644 (file)
@@ -178,19 +178,21 @@ used by default. If '$XDG_CONFIG_HOME' is not set it defaults to
 History
 -------
 Gitk was the first graphical repository browser. It's written in
-tcl/tk and started off in a separate repository but was later merged
-into the main Git repository.
+tcl/tk.
 
+'gitk' is actually maintained as an independent project, but stable
+versions are distributed as part of the Git suite for the convenience
+of end users.
+
+gitk-git/ comes from Paul Mackerras's gitk project:
+
+       git://ozlabs.org/~paulus/gitk
 
 SEE ALSO
 --------
 'qgit(1)'::
        A repository browser written in C++ using Qt.
 
-'gitview(1)'::
-       A repository browser written in Python using Gtk. It's based on
-       'bzrk(1)' and distributed in the contrib area of the Git repository.
-
 'tig(1)'::
        A minimal repository browser and Git tool output highlighter written
        in C using Ncurses.
index 8f7c50f330f36f625951db7f4cc4657a31fa7113..db5d47eb19b8f2aa21c11a9d3eedf40b9d71e84e 100644 (file)
@@ -66,17 +66,26 @@ submodule.<name>.fetchRecurseSubmodules::
 
 submodule.<name>.ignore::
        Defines under what circumstances "git status" and the diff family show
-       a submodule as modified. When set to "all", it will never be considered
-       modified (but will nonetheless show up in the output of status and
-       commit when it has been staged), "dirty" will ignore all changes
-       to the submodules work tree and
-       takes only differences between the HEAD of the submodule and the commit
-       recorded in the superproject into account. "untracked" will additionally
-       let submodules with modified tracked files in their work tree show up.
-       Using "none" (the default when this option is not set) also shows
-       submodules that have untracked files in their work tree as changed.
-       If this option is also present in the submodules entry in .git/config of
-       the superproject, the setting there will override the one found in
+       a submodule as modified. The following values are supported:
+
+       all;; The submodule will never be considered modified (but will
+           nonetheless show up in the output of status and commit when it has
+           been staged).
+
+       dirty;; All changes to the submodule's work tree will be ignored, only
+           committed differences between the HEAD of the submodule and its
+           recorded state in the superproject are taken into account.
+
+       untracked;; Only untracked files in submodules will be ignored.
+           Committed differences and modifications to tracked files will show
+           up.
+
+       none;; No modifiations to submodules are ignored, all of committed
+           differences, and modifications to tracked and untracked files are
+           shown. This is the default option.
+
+       If this option is also present in the submodules entry in .git/config
+       of the superproject, the setting there will override the one found in
        .gitmodules.
        Both settings can be overridden on the command line by using the
        "--ignore-submodule" option. The 'git submodule' commands are not
@@ -84,8 +93,8 @@ submodule.<name>.ignore::
 
 submodule.<name>.shallow::
        When set to true, a clone of this submodule will be performed as a
-       shallow clone unless the user explicitly asks for a non-shallow
-       clone.
+       shallow clone (with a history depth of 1) unless the user explicitly
+       asks for a non-shallow clone.
 
 
 EXAMPLES
index 7685e3651ae0c63c9fe00f43957ef60648419db3..b614969ad2c12b5c4ed337617d7f4dd559a4d278 100644 (file)
@@ -61,22 +61,4 @@ For a simple local test, you can use linkgit:git-remote-ext[1]:
 git clone ext::'git --namespace=foo %s /tmp/prefixed.git'
 ----------
 
-SECURITY
---------
-
-Anyone with access to any namespace within a repository can potentially
-access objects from any other namespace stored in the same repository.
-You can't directly say "give me object ABCD" if you don't have a ref to
-it, but you can do some other sneaky things like:
-
-. Claiming to push ABCD, at which point the server will optimize out the
-  need for you to actually send it. Now you have a ref to ABCD and can
-  fetch it (claiming not to have it, of course).
-
-. Requesting other refs, claiming that you have ABCD, at which point the
-  server may generate deltas against ABCD.
-
-None of this causes a problem if you only host public repositories, or
-if everyone who may read one namespace may also read everything in every
-other namespace (for instance, if everyone in an organization has read
-permission to every repository).
+include::transfer-data-leaks.txt[]
index a4de50ad227bb1653977ee9502a3df20afefaf92..4a584f3c5d7e40fc5a8a1e5c68a63e8156bdcd64 100644 (file)
@@ -415,6 +415,17 @@ set by Git if the remote helper has the 'option' capability.
 'option depth' <depth>::
        Deepens the history of a shallow repository.
 
+'option deepen-since <timestamp>::
+       Deepens the history of a shallow repository based on time.
+
+'option deepen-not <ref>::
+       Deepens the history of a shallow repository excluding ref.
+       Multiple options add up.
+
+'option deepen-relative {'true'|'false'}::
+       Deepens the history of a shallow repository relative to
+       current boundary. Only valid when used with "option depth".
+
 'option followtags' {'true'|'false'}::
        If enabled the helper should automatically fetch annotated
        tag objects if the object the tag points at was transferred
@@ -441,16 +452,20 @@ set by Git if the remote helper has the 'option' capability.
        Request the helper to perform a force update.  Defaults to
        'false'.
 
-'option cloning {'true'|'false'}::
+'option cloning' {'true'|'false'}::
        Notify the helper this is a clone request (i.e. the current
        repository is guaranteed empty).
 
-'option update-shallow {'true'|'false'}::
+'option update-shallow' {'true'|'false'}::
        Allow to extend .git/shallow if the new refs require it.
 
-'option pushcert {'true'|'false'}::
+'option pushcert' {'true'|'false'}::
        GPG sign pushes.
 
+'option push-option <string>::
+       Transmit <string> as a push option. As the push option
+       must not contain LF or NUL characters, the string is not encoded.
+
 SEE ALSO
 --------
 linkgit:git-remote[1]
index a5f99cbb11ba3f7957b9fcd432354c08d99a32c1..f51ed4e37cd3fad80bf855e6217906f094f894fb 100644 (file)
@@ -289,4 +289,4 @@ link:user-manual.html[The Git User's Manual]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index 30d2119565b9df5a3693e4134b8202c3936e8158..e0976f601799f7d29daa1c3e09b9396c9e8c8320 100644 (file)
@@ -433,4 +433,4 @@ link:user-manual.html[The Git User's Manual]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index b3b58d324e4b7c254c54531bbab979064f3ced4a..794b83393ea21a8d569c34791ee4af1dfb99a57a 100644 (file)
@@ -674,4 +674,4 @@ link:user-manual.html[The Git User's Manual]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index a79e35024623904145c7ac2031f8416bac6e6e23..9c8982ec98744852e69e96455ec6b2bbce093556 100644 (file)
@@ -246,13 +246,20 @@ $highlight_bin::
        Note that 'highlight' feature must be set for gitweb to actually
        use syntax highlighting.
 +
-*NOTE*: if you want to add support for new file type (supported by
-"highlight" but not used by gitweb), you need to modify `%highlight_ext`
-or `%highlight_basename`, depending on whether you detect type of file
-based on extension (for example "sh") or on its basename (for example
-"Makefile").  The keys of these hashes are extension and basename,
-respectively, and value for given key is name of syntax to be passed via
-`--syntax <syntax>` to highlighter.
+*NOTE*: for a file to be highlighted, its syntax type must be detected
+and that syntax must be supported by "highlight".  The default syntax
+detection is minimal, and there are many supported syntax types with no
+detection by default.  There are three options for adding syntax
+detection.  The first and second priority are `%highlight_basename` and
+`%highlight_ext`, which detect based on basename (the full filename, for
+example "Makefile") and extension (for example "sh").  The keys of these
+hashes are the basename and extension, respectively, and the value for a
+given key is the name of the syntax to be passed via `--syntax <syntax>`
+to "highlight".  The last priority is the "highlight" configuration of
+`Shebang` regular expressions to detect the language based on the first
+line in the file, (for example, matching the line "#!/bin/bash").  See
+the highlight documentation and the default config at
+/etc/highlight/filetypes.conf for more details.
 +
 For example if repositories you are hosting use "phtml" extension for
 PHP files, and you want to have correct syntax-highlighting for those
@@ -361,8 +368,8 @@ $logo_url::
 $logo_label::
        URI and label (title) for the Git logo link (or your site logo,
        if you chose to use different logo image). By default, these both
-       refer to Git homepage, http://git-scm.com[]; in the past, they pointed
-       to Git documentation at http://www.kernel.org[].
+       refer to Git homepage, https://git-scm.com[]; in the past, they pointed
+       to Git documentation at https://www.kernel.org[].
 
 
 Changing gitweb's look
index 96156e5e1f5fe86cd793ad2a89b417f2bf6a2245..88450589aff7e656a5fbf52a36da433d1627d177 100644 (file)
@@ -84,7 +84,7 @@ separator (rules for Perl's "`split(" ", $line)`").
 
 * Fields use modified URI encoding, defined in RFC 3986, section 2.1
 (Percent-Encoding), or rather "Query string encoding" (see
-http://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference
+https://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference
 being that SP (" ") can be encoded as "{plus}" (and therefore "{plus}" has to be
 also percent-encoded).
 +
index f16c414ea7f2e39e69315c2548b904ccb30f3519..177610e44ea31eede07035292a66b0dca167c9ae 100644 (file)
@@ -477,4 +477,4 @@ linkgit:git-am[1]
 
 GIT
 ---
-Part of the linkgit:git[1] suite.
+Part of the linkgit:git[1] suite
index 8ad29e61a950c2cb1f33779977a33c63ae0df33b..6e991c246915143deba887632def104fc709c9bf 100644 (file)
@@ -384,10 +384,33 @@ full pathname may have special meaning:
 +
 Glob magic is incompatible with literal magic.
 
+attr;;
+After `attr:` comes a space separated list of "attribute
+requirements", all of which must be met in order for the
+path to be considered a match; this is in addition to the
+usual non-magic pathspec pattern matching.
+See linkgit:gitattributes[5].
++
+Each of the attribute requirements for the path takes one of
+these forms:
+
+- "`ATTR`" requires that the attribute `ATTR` be set.
+
+- "`-ATTR`" requires that the attribute `ATTR` be unset.
+
+- "`ATTR=VALUE`" requires that the attribute `ATTR` be
+  set to the string `VALUE`.
+
+- "`!ATTR`" requires that the attribute `ATTR` be
+  unspecified.
++
+
 exclude;;
        After a path matches any non-exclude pathspec, it will be run
-       through all exclude pathspec (magic signature: `!`). If it
-       matches, the path is ignored.
+       through all exclude pathspec (magic signature: `!` or its
+       synonym `^`). If it matches, the path is ignored.  When there
+       is no non-exclude pathspec, the exclusion is applied to the
+       result set as if invoked without any pathspec.
 --
 
 [[def_parent]]parent::
index 25378f68d30bd343f610228ae1b69a1d0cb8b0a1..db219f5c0745dc7b331361ea1237f8e5c102e452 100644 (file)
@@ -4,13 +4,13 @@ From: Junio C Hamano <gitster@pobox.com>
 Date: Fri, 26 Aug 2005 18:19:10 -0700
 Abstract: In this how-to article, JC talks about how he
  uses the post-update hook to automate Git documentation page
- shown at http://www.kernel.org/pub/software/scm/git/docs/.
+ shown at https://www.kernel.org/pub/software/scm/git/docs/.
 Content-type: text/asciidoc
 
 How to rebuild from update hook
 ===============================
 
-The pages under http://www.kernel.org/pub/software/scm/git/docs/
+The pages under https://www.kernel.org/pub/software/scm/git/docs/
 are built from Documentation/ directory of the git.git project
 and needed to be kept up-to-date.  The www.kernel.org/ servers
 are mirrored and I was told that the origin of the mirror is on
index 69c289dd0cdb2b344b7051d25c4889b824e21f9c..a48d267e26c1098e003ed6342b33c6e43d57a884 100644 (file)
@@ -143,8 +143,14 @@ ifndef::git-rev-list[]
 - '%N': commit notes
 endif::git-rev-list[]
 - '%GG': raw verification message from GPG for a signed commit
-- '%G?': show "G" for a good (valid) signature, "B" for a bad signature,
-  "U" for a good signature with unknown validity and "N" for no signature
+- '%G?': show "G" for a good (valid) signature,
+  "B" for a bad signature,
+  "U" for a good signature with unknown validity,
+  "X" for a good signature that has expired,
+  "Y" for a good signature made by an expired key,
+  "R" for a good signature made by a revoked key,
+  "E" if the signature cannot be checked (e.g. missing key)
+  and "N" for no signature
 - '%GS': show the name of the signer for a signed commit
 - '%GK': show the key used to sign a signed commit
 - '%gD': reflog selector, e.g., `refs/stash@{1}` or
@@ -193,6 +199,8 @@ endif::git-rev-list[]
   than given and there are spaces on its left, use those spaces
 - '%><(<N>)', '%><|(<N>)': similar to '% <(<N>)', '%<|(<N>)'
   respectively, but padding both sides (i.e. the text is centered)
+- %(trailers): display the trailers of the body as interpreted by
+  linkgit:git-interpret-trailers[1]
 
 NOTE: Some placeholders may depend on other options given to the
 revision traversal engine. For example, the `%g*` reflog options will
@@ -205,8 +213,8 @@ If you add a `+` (plus sign) after '%' of a placeholder, a line-feed
 is inserted immediately before the expansion if and only if the
 placeholder expands to a non-empty string.
 
-If you add a `-` (minus sign) after '%' of a placeholder, line-feeds that
-immediately precede the expansion are deleted if and only if the
+If you add a `-` (minus sign) after '%' of a placeholder, all consecutive
+line-feeds immediately preceding the expansion are deleted if and only if the
 placeholder expands to an empty string.
 
 If you add a ` ` (space) after '%' of a placeholder, a space
index 5da7cf5a8d02d6fd52993f042f29efe4cc749051..a02f7324c01ee5811441d2a6dcb93aafd892298c 100644 (file)
@@ -133,8 +133,8 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit).
        for all following revision specifiers, up to the next `--not`.
 
 --all::
-       Pretend as if all the refs in `refs/` are listed on the
-       command line as '<commit>'.
+       Pretend as if all the refs in `refs/`, along with `HEAD`, are
+       listed on the command line as '<commit>'.
 
 --branches[=<pattern>]::
        Pretend as if all the refs in `refs/heads` are listed
index 4bed5b1ab741d9c86f5a9443f980080a56b84629..61277469c874933fbc21f7d64a3687374e9324c2 100644 (file)
@@ -96,7 +96,8 @@ some output processing may assume ref names in UTF-8.
   refers to the branch that the branch specified by branchname is set to build on
   top of (configured with `branch.<name>.remote` and
   `branch.<name>.merge`).  A missing branchname defaults to the
-  current one.
+  current one. These suffixes are also accepted when spelled in uppercase, and
+  they mean the same thing no matter the case.
 
 '<branchname>@\{push\}', e.g. 'master@\{push\}', '@\{push\}'::
   The suffix '@\{push}' reports the branch "where we would push to" if
@@ -122,6 +123,9 @@ refs/remotes/myfork/mybranch
 Note in the example that we set up a triangular workflow, where we pull
 from one location and push to another. In a non-triangular workflow,
 '@\{push}' is the same as '@\{upstream}', and there is no need for it.
++
+This suffix is also accepted when spelled in uppercase, and means the same
+thing no matter the case.
 
 '<rev>{caret}', e.g. 'HEAD{caret}, v1.5.1{caret}0'::
   A suffix '{caret}' to a revision parameter means the first parent of
@@ -283,7 +287,7 @@ empty range that is both reachable and unreachable from HEAD.
 
 Other <rev>{caret} Parent Shorthand Notations
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Two other shorthands exist, particularly useful for merge commits,
+Three other shorthands exist, particularly useful for merge commits,
 for naming a set that is formed by a commit and its parent commits.
 
 The 'r1{caret}@' notation means all parents of 'r1'.
@@ -291,8 +295,15 @@ The 'r1{caret}@' notation means all parents of 'r1'.
 The 'r1{caret}!' notation includes commit 'r1' but excludes all of its parents.
 By itself, this notation denotes the single commit 'r1'.
 
+The '<rev>{caret}-<n>' notation includes '<rev>' but excludes the <n>th
+parent (i.e. a shorthand for '<rev>{caret}<n>..<rev>'), with '<n>' = 1 if
+not given. This is typically useful for merge commits where you
+can just pass '<commit>{caret}-' to get all the commits in the branch
+that was merged in merge commit '<commit>' (including '<commit>'
+itself).
+
 While '<rev>{caret}<n>' was about specifying a single commit parent, these
-two notations consider all its parents. For example you can say
+three notations also consider its parents. For example you can say
 'HEAD{caret}2{caret}@', however you cannot say 'HEAD{caret}@{caret}2'.
 
 Revision Range Summary
@@ -326,6 +337,10 @@ Revision Range Summary
   as giving commit '<rev>' and then all its parents prefixed with
   '{caret}' to exclude them (and their ancestors).
 
+'<rev>{caret}-<n>', e.g. 'HEAD{caret}-, HEAD{caret}-2'::
+       Equivalent to '<rev>{caret}<n>..<rev>', with '<n>' = 1 if not
+       given.
+
 Here are a handful of examples using the Loeliger illustration above,
 with each step in the notation's expansion and selection carefully
 spelt out:
@@ -339,6 +354,8 @@ spelt out:
    C                            I J F C
    B..C   = ^B C                C
    B...C  = B ^F C              G H D E B C
+   B^-    = B^..B
+         = ^B^1 B              E I J F B
    C^@    = C^1
          = F                   I J F
    B^@    = B^1 B^2 B^3
index 7f8e78d916c0b38ed6757aee6578a53cab30d9d0..6c77b4920c92a0b327fb88d2b461ec0d918ec99a 100644 (file)
@@ -33,6 +33,12 @@ The notable options are:
        Similar to `DIR_SHOW_IGNORED`, but return ignored files in `ignored[]`
        in addition to untracked files in `entries[]`.
 
+`DIR_KEEP_UNTRACKED_CONTENTS`:::
+
+       Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if this is set, the
+       untracked contents of untracked directories are also returned in
+       `entries[]`.
+
 `DIR_COLLECT_IGNORED`:::
 
        Special mode for git-add. Return ignored files in `ignored[]` and
index 260266867768a549e58e540eaa95d3bbe422e5c0..e7cbb7c13adf2f7ea3b15279a17f1a06da859cbc 100644 (file)
@@ -16,10 +16,15 @@ Data Structure
        of no interest to the calling programs.  The name of the
        attribute can be retrieved by calling `git_attr_name()`.
 
-`struct git_attr_check`::
+`struct attr_check_item`::
 
-       This structure represents a set of attributes to check in a call
-       to `git_check_attr()` function, and receives the results.
+       This structure represents one attribute and its value.
+
+`struct attr_check`::
+
+       This structure represents a collection of `attr_check_item`.
+       It is passed to `git_check_attr()` function, specifying the
+       attributes to check, and receives their values.
 
 
 Attribute Values
@@ -27,7 +32,7 @@ Attribute Values
 
 An attribute for a path can be in one of four states: Set, Unset,
 Unspecified or set to a string, and `.value` member of `struct
-git_attr_check` records it.  There are three macros to check these:
+attr_check_item` records it.  There are three macros to check these:
 
 `ATTR_TRUE()`::
 
@@ -48,49 +53,51 @@ value of the attribute for the path.
 Querying Specific Attributes
 ----------------------------
 
-* Prepare an array of `struct git_attr_check` to define the list of
-  attributes you would want to check.  To populate this array, you would
-  need to define necessary attributes by calling `git_attr()` function.
+* Prepare `struct attr_check` using attr_check_initl()
+  function, enumerating the names of attributes whose values you are
+  interested in, terminated with a NULL pointer.  Alternatively, an
+  empty `struct attr_check` can be prepared by calling
+  `attr_check_alloc()` function and then attributes you want to
+  ask about can be added to it with `attr_check_append()`
+  function.
 
 * Call `git_check_attr()` to check the attributes for the path.
 
-* Inspect `git_attr_check` structure to see how each of the attribute in
-  the array is defined for the path.
+* Inspect `attr_check` structure to see how each of the
+  attribute in the array is defined for the path.
 
 
 Example
 -------
 
-To see how attributes "crlf" and "indent" are set for different paths.
+To see how attributes "crlf" and "ident" are set for different paths.
 
-. Prepare an array of `struct git_attr_check` with two elements (because
-  we are checking two attributes).  Initialize their `attr` member with
-  pointers to `struct git_attr` obtained by calling `git_attr()`:
+. Prepare a `struct attr_check` with two elements (because
+  we are checking two attributes):
 
 ------------
-static struct git_attr_check check[2];
+static struct attr_check *check;
 static void setup_check(void)
 {
-       if (check[0].attr)
+       if (check)
                return; /* already done */
-       check[0].attr = git_attr("crlf");
-       check[1].attr = git_attr("ident");
+       check = attr_check_initl("crlf", "ident", NULL);
 }
 ------------
 
-. Call `git_check_attr()` with the prepared array of `struct git_attr_check`:
+. Call `git_check_attr()` with the prepared `struct attr_check`:
 
 ------------
        const char *path;
 
        setup_check();
-       git_check_attr(path, ARRAY_SIZE(check), check);
+       git_check_attr(path, check);
 ------------
 
-. Act on `.value` member of the result, left in `check[]`:
+. Act on `.value` member of the result, left in `check->items[]`:
 
 ------------
-       const char *value = check[0].value;
+       const char *value = check->items[0].value;
 
        if (ATTR_TRUE(value)) {
                The attribute is Set, by listing only the name of the
@@ -109,20 +116,39 @@ static void setup_check(void)
        }
 ------------
 
+To see how attributes in argv[] are set for different paths, only
+the first step in the above would be different.
+
+------------
+static struct attr_check *check;
+static void setup_check(const char **argv)
+{
+       check = attr_check_alloc();
+       while (*argv) {
+               struct git_attr *attr = git_attr(*argv);
+               attr_check_append(check, attr);
+               argv++;
+       }
+}
+------------
+
 
 Querying All Attributes
 -----------------------
 
 To get the values of all attributes associated with a file:
 
-* Call `git_all_attrs()`, which returns an array of `git_attr_check`
-  structures.
+* Prepare an empty `attr_check` structure by calling
+  `attr_check_alloc()`.
+
+* Call `git_all_attrs()`, which populates the `attr_check`
+  with the attributes attached to the path.
 
-* Iterate over the `git_attr_check` array to examine the attribute
-  names and values.  The name of the attribute described by a
-  `git_attr_check` object can be retrieved via
-  `git_attr_name(check[i].attr)`.  (Please note that no items will be
-  returned for unset attributes, so `ATTR_UNSET()` will return false
-  for all returned `git_array_check` objects.)
+* Iterate over the `attr_check.items[]` array to examine
+  the attribute names and values.  The name of the attribute
+  described by a  `attr_check.items[]` object can be retrieved via
+  `git_attr_name(check->items[i].attr)`.  (Please note that no items
+  will be returned for unset attributes, so `ATTR_UNSET()` will return
+  false for all returned `attr_check.items[]` objects.)
 
-* Free the `git_array_check` array.
+* Free the `attr_check` struct by calling `attr_check_free()`.
index 28f5a8b71574916820cdb1f1a023e27cb45ed6e6..ccc634bbd754f6e0bab80fb3ccf1cc42afc5b829 100644 (file)
@@ -21,6 +21,9 @@ that the hashmap is initialized. It may also be useful for statistical purposes
 `cmpfn` stores the comparison function specified in `hashmap_init()`. In
 advanced scenarios, it may be useful to change this, e.g. to switch between
 case-sensitive and case-insensitive lookup.
++
+When `disallow_rehash` is set, automatic rehashes are prevented during inserts
+and deletes.
 
 `struct hashmap_entry`::
 
@@ -57,6 +60,7 @@ Functions
 `unsigned int strihash(const char *buf)`::
 `unsigned int memhash(const void *buf, size_t len)`::
 `unsigned int memihash(const void *buf, size_t len)`::
+`unsigned int memihash_cont(unsigned int hash_seed, const void *buf, size_t len)`::
 
        Ready-to-use hash functions for strings, using the FNV-1 algorithm (see
        http://www.isthe.com/chongo/tech/comp/fnv).
@@ -65,6 +69,9 @@ Functions
 `memihash` operate on arbitrary-length memory.
 +
 `strihash` and `memihash` are case insensitive versions.
++
+`memihash_cont` is a variant of `memihash` that allows a computation to be
+continued with another chunk of data.
 
 `unsigned int sha1hash(const unsigned char *sha1)`::
 
@@ -184,11 +191,28 @@ passed to `hashmap_cmp_fn` to decide whether the entry matches the key.
 +
 Returns the removed entry, or NULL if not found.
 
+`void hashmap_disallow_rehash(struct hashmap *map, unsigned value)`::
+
+       Disallow/allow automatic rehashing of the hashmap during inserts
+       and deletes.
++
+This is useful if the caller knows that the hashmap will be accessed
+by multiple threads.
++
+The caller is still responsible for any necessary locking; this simply
+prevents unexpected rehashing.  The caller is also responsible for properly
+sizing the initial hashmap to ensure good performance.
++
+A call to allow rehashing does not force a rehash; that might happen
+with the next insert or delete.
+
 `void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter)`::
 `void *hashmap_iter_next(struct hashmap_iter *iter)`::
 `void *hashmap_iter_first(struct hashmap *map, struct hashmap_iter *iter)`::
 
-       Used to iterate over all entries of a hashmap.
+       Used to iterate over all entries of a hashmap. Note that it is
+       not safe to add or remove entries to the hashmap while
+       iterating.
 +
 `hashmap_iter_init` initializes a `hashmap_iter` structure.
 +
diff --git a/Documentation/technical/api-in-core-index.txt b/Documentation/technical/api-in-core-index.txt
deleted file mode 100644 (file)
index adbdbf5..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-in-core index API
-=================
-
-Talk about <read-cache.c> and <cache-tree.c>, things like:
-
-* cache -> the_index macros
-* read_index()
-* write_index()
-* ie_match_stat() and ie_modified(); how they are different and when to
-  use which.
-* index_name_pos()
-* remove_index_entry_at()
-* remove_file_from_index()
-* add_file_to_index()
-* add_index_entry()
-* refresh_index()
-* discard_index()
-* cache_tree_invalidate_path()
-* cache_tree_update()
-
-(JC, Linus)
similarity index 51%
rename from Documentation/technical/api-sha1-array.txt
rename to Documentation/technical/api-oid-array.txt
index 3e75497a37d696d534c16ff0270a808b57ac9180..b0c11f868da3c66ae263ca2755137420ce022b71 100644 (file)
@@ -1,7 +1,7 @@
-sha1-array API
+oid-array API
 ==============
 
-The sha1-array API provides storage and manipulation of sets of SHA-1
+The oid-array API provides storage and manipulation of sets of object
 identifiers. The emphasis is on storage and processing efficiency,
 making them suitable for large lists. Note that the ordering of items is
 not preserved over some operations.
@@ -9,10 +9,10 @@ not preserved over some operations.
 Data Structures
 ---------------
 
-`struct sha1_array`::
+`struct oid_array`::
 
-       A single array of SHA-1 hashes. This should be initialized by
-       assignment from `SHA1_ARRAY_INIT`.  The `sha1` member contains
+       A single array of object IDs. This should be initialized by
+       assignment from `OID_ARRAY_INIT`.  The `oid` member contains
        the actual data. The `nr` member contains the number of items in
        the set.  The `alloc` and `sorted` members are used internally,
        and should not be needed by API callers.
@@ -20,48 +20,52 @@ Data Structures
 Functions
 ---------
 
-`sha1_array_append`::
-       Add an item to the set. The sha1 will be placed at the end of
+`oid_array_append`::
+       Add an item to the set. The object ID will be placed at the end of
        the array (but note that some operations below may lose this
        ordering).
 
-`sha1_array_lookup`::
-       Perform a binary search of the array for a specific sha1.
+`oid_array_lookup`::
+       Perform a binary search of the array for a specific object ID.
        If found, returns the offset (in number of elements) of the
-       sha1. If not found, returns a negative integer. If the array is
-       not sorted, this function has the side effect of sorting it.
+       object ID. If not found, returns a negative integer. If the array
+       is not sorted, this function has the side effect of sorting it.
 
-`sha1_array_clear`::
+`oid_array_clear`::
        Free all memory associated with the array and return it to the
        initial, empty state.
 
-`sha1_array_for_each_unique`::
+`oid_array_for_each_unique`::
        Efficiently iterate over each unique element of the list,
        executing the callback function for each one. If the array is
-       not sorted, this function has the side effect of sorting it.
+       not sorted, this function has the side effect of sorting it. If
+       the callback returns a non-zero value, the iteration ends
+       immediately and the callback's return is propagated; otherwise,
+       0 is returned.
 
 Examples
 --------
 
 -----------------------------------------
-void print_callback(const unsigned char sha1[20],
+int print_callback(const struct object_id *oid,
                    void *data)
 {
-       printf("%s\n", sha1_to_hex(sha1));
+       printf("%s\n", oid_to_hex(oid));
+       return 0; /* always continue */
 }
 
 void some_func(void)
 {
-       struct sha1_array hashes = SHA1_ARRAY_INIT;
-       unsigned char sha1[20];
+       struct sha1_array hashes = OID_ARRAY_INIT;
+       struct object_id oid;
 
        /* Read objects into our set */
-       while (read_object_from_stdin(sha1))
-               sha1_array_append(&hashes, sha1);
+       while (read_object_from_stdin(oid.hash))
+               oid_array_append(&hashes, &oid);
 
        /* Check if some objects are in our set */
-       while (read_object_from_stdin(sha1)) {
-               if (sha1_array_lookup(&hashes, sha1) >= 0)
+       while (read_object_from_stdin(oid.hash)) {
+               if (oid_array_lookup(&hashes, &oid) >= 0)
                        printf("it's in there!\n");
 
        /*
@@ -71,6 +75,6 @@ void some_func(void)
         * Instead, this will sort once and then skip duplicates
         * in linear time.
         */
-       sha1_array_for_each_unique(&hashes, print_callback, NULL);
+       oid_array_for_each_unique(&hashes, print_callback, NULL);
 }
 -----------------------------------------
index 27bd701c0d6862f38c700fbfc02c24b135bd6c0e..36768b479e16c9456982230f078d98513a72c37f 100644 (file)
@@ -168,6 +168,11 @@ There are some macros to easily define options:
        Introduce an option with string argument.
        The string argument is put into `str_var`.
 
+`OPT_STRING_LIST(short, long, &struct string_list, arg_str, description)`::
+       Introduce an option with string argument.
+       The string argument is stored as an element in `string_list`.
+       Use of `--no-option` will clear the list of preceding values.
+
 `OPT_INTEGER(short, long, &int_var, description)`::
        Introduce an option with integer argument.
        The integer is put into `int_var`.
index 540e45568990f89fceb50ad619ca8402e9925983..eb1fa9853ef6fd3ba9ab29342cf55747efaa2a69 100644 (file)
@@ -27,8 +27,6 @@ parse_pathspec(). This function takes several arguments:
 
 - prefix and args come from cmd_* functions
 
-get_pathspec() is obsolete and should never be used in new code.
-
 parse_pathspec() helps catch unsupported features and reject them
 politely. At a lower level, different pathspec-related functions may
 not support the same set of features. Such pathspec-sensitive
index 941fa178dd866162b4d3e8cb0c23a17f03016bb5..3dce003fda008e61c7a91c85554f9a1cafe6106f 100644 (file)
@@ -47,16 +47,20 @@ Functions
        Can be passed to the config parsing infrastructure to parse
        local (worktree) submodule configurations.
 
-`const struct submodule *submodule_from_path(const unsigned char *commit_sha1, const char *path)`::
+`const struct submodule *submodule_from_path(const unsigned char *treeish_name, const char *path)`::
 
-       Lookup values for one submodule by its commit_sha1 and path.
+       Given a tree-ish in the superproject and a path, return the
+       submodule that is bound at the path in the named tree.
 
-`const struct submodule *submodule_from_name(const unsigned char *commit_sha1, const char *name)`::
+`const struct submodule *submodule_from_name(const unsigned char *treeish_name, const char *name)`::
 
        The same as above but lookup by name.
 
-If given the null_sha1 as commit_sha1 the local configuration of a
-submodule will be returned (e.g. consolidated values from local git
+Whenever a submodule configuration is parsed in `parse_submodule_config_option`
+via e.g. `gitmodules_config()`, it will overwrite the null_sha1 entry.
+So in the normal case, when HEAD:.gitmodules is parsed first and then overlayed
+with the repository configuration, the null_sha1 entry contains the local
+configuration of a submodule (e.g. consolidated values from local git
 configuration and the .gitmodules file in the worktree).
 
 For an example usage see test-submodule-config.c.
index 736f3894a85602c10e0bf13fb74eb7f556207672..a34917153fd3dc10fefe71a1ba05e5dacb9af7f9 100644 (file)
@@ -219,7 +219,9 @@ out of what the server said it could do with the first 'want' line.
 
   shallow-line      =  PKT-LINE("shallow" SP obj-id)
 
-  depth-request     =  PKT-LINE("deepen" SP depth)
+  depth-request     =  PKT-LINE("deepen" SP depth) /
+                      PKT-LINE("deepen-since" SP timestamp) /
+                      PKT-LINE("deepen-not" SP ref)
 
   first-want        =  PKT-LINE("want" SP obj-id SP capability-list)
   additional-want   =  PKT-LINE("want" SP obj-id)
@@ -349,14 +351,19 @@ ACK after 'done' if there is at least one common base and multi_ack or
 multi_ack_detailed is enabled. The server always sends NAK after 'done'
 if there is no common base found.
 
+Instead of 'ACK' or 'NAK', the server may send an error message (for
+example, if it does not recognize an object in a 'want' line received
+from the client).
+
 Then the server will start sending its packfile data.
 
 ----
-  server-response = *ack_multi ack / nak
+  server-response = *ack_multi ack / nak / error-line
   ack_multi       = PKT-LINE("ACK" SP obj-id ack_status)
   ack_status      = "continue" / "common" / "ready"
   ack             = PKT-LINE("ACK" SP obj-id)
   nak             = PKT-LINE("NAK")
+  error-line     =  PKT-LINE("ERR" SP explanation-text)
 ----
 
 A simple clone may look like this (with no 'have' lines):
@@ -466,13 +473,10 @@ that it wants to update, it sends a line listing the obj-id currently on
 the server, the obj-id the client would like to update it to and the name
 of the reference.
 
-This list is followed by a flush-pkt. Then the push options are transmitted
-one per packet followed by another flush-pkt. After that the packfile that
-should contain all the objects that the server will need to complete the new
-references will be sent.
+This list is followed by a flush-pkt.
 
 ----
-  update-request    =  *shallow ( command-list | push-cert ) [packfile]
+  update-requests   =  *shallow ( command-list | push-cert )
 
   shallow           =  PKT-LINE("shallow" SP obj-id)
 
@@ -493,12 +497,35 @@ references will be sent.
                      PKT-LINE("pusher" SP ident LF)
                      PKT-LINE("pushee" SP url LF)
                      PKT-LINE("nonce" SP nonce LF)
+                     *PKT-LINE("push-option" SP push-option LF)
                      PKT-LINE(LF)
                      *PKT-LINE(command LF)
                      *PKT-LINE(gpg-signature-lines LF)
                      PKT-LINE("push-cert-end" LF)
 
-  packfile          = "PACK" 28*(OCTET)
+  push-option       =  1*( VCHAR | SP )
+----
+
+If the server has advertised the 'push-options' capability and the client has
+specified 'push-options' as part of the capability list above, the client then
+sends its push options followed by a flush-pkt.
+
+----
+  push-options      =  *PKT-LINE(push-option) flush-pkt
+----
+
+For backwards compatibility with older Git servers, if the client sends a push
+cert and push options, it MUST send its push options both embedded within the
+push cert and after the push cert. (Note that the push options within the cert
+are prefixed, but the push options after the cert are not.) Both these lists
+MUST be the same, modulo the prefix.
+
+After that the packfile that
+should contain all the objects that the server will need to complete the new
+references will be sent.
+
+----
+  packfile          =  "PACK" 28*(OCTET)
 ----
 
 If the receiving end does not support delete-refs, the sending end MUST
index 4c28d3a8aea3312190d859e4accb70f9d28973bf..26dcc6f502020da5214f1e161f1678813dd24059 100644 (file)
@@ -179,6 +179,31 @@ This capability adds "deepen", "shallow" and "unshallow" commands to
 the  fetch-pack/upload-pack protocol so clients can request shallow
 clones.
 
+deepen-since
+------------
+
+This capability adds "deepen-since" command to fetch-pack/upload-pack
+protocol so the client can request shallow clones that are cut at a
+specific time, instead of depth. Internally it's equivalent of doing
+"rev-list --max-age=<timestamp>" on the server side. "deepen-since"
+cannot be used with "deepen".
+
+deepen-not
+----------
+
+This capability adds "deepen-not" command to fetch-pack/upload-pack
+protocol so the client can request shallow clones that are cut at a
+specific revision, instead of depth. Internally it's equivalent of
+doing "rev-list --not <rev>" on the server side. "deepen-not"
+cannot be used with "deepen", but can be used with "deepen-since".
+
+deepen-relative
+---------------
+
+If this capability is requested by the client, the semantics of
+"deepen" command is changed. The "depth" argument is the depth from
+the current shallow boundary, instead of the depth from remote refs.
+
 no-progress
 -----------
 
diff --git a/Documentation/texi.xsl b/Documentation/texi.xsl
new file mode 100644 (file)
index 0000000..0f8ff07
--- /dev/null
@@ -0,0 +1,26 @@
+<!-- texi.xsl:
+     convert refsection elements into refsect elements that docbook2texi can
+     understand -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+               version="1.0">
+
+<xsl:output method="xml"
+           encoding="UTF-8"
+           doctype-public="-//OASIS//DTD DocBook XML V4.5//EN"
+           doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" />
+
+<xsl:template match="//refsection">
+       <xsl:variable name="element">refsect<xsl:value-of select="count(ancestor-or-self::refsection)" /></xsl:variable>
+       <xsl:element name="{$element}">
+               <xsl:apply-templates select="@*|node()" />
+       </xsl:element>
+</xsl:template>
+
+<!-- Copy all other nodes through. -->
+<xsl:template match="node()|@*">
+       <xsl:copy>
+               <xsl:apply-templates select="@*|node()" />
+       </xsl:copy>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/Documentation/transfer-data-leaks.txt b/Documentation/transfer-data-leaks.txt
new file mode 100644 (file)
index 0000000..914bacc
--- /dev/null
@@ -0,0 +1,30 @@
+SECURITY
+--------
+The fetch and push protocols are not designed to prevent one side from
+stealing data from the other repository that was not intended to be
+shared. If you have private data that you need to protect from a malicious
+peer, your best option is to store it in another repository. This applies
+to both clients and servers. In particular, namespaces on a server are not
+effective for read access control; you should only grant read access to a
+namespace to clients that you would trust with read access to the entire
+repository.
+
+The known attack vectors are as follows:
+
+. The victim sends "have" lines advertising the IDs of objects it has that
+  are not explicitly intended to be shared but can be used to optimize the
+  transfer if the peer also has them. The attacker chooses an object ID X
+  to steal and sends a ref to X, but isn't required to send the content of
+  X because the victim already has it. Now the victim believes that the
+  attacker has X, and it sends the content of X back to the attacker
+  later. (This attack is most straightforward for a client to perform on a
+  server, by creating a ref to X in the namespace the client has access
+  to and then fetching it. The most likely way for a server to perform it
+  on a client is to "merge" X into a public branch and hope that the user
+  does additional work on this branch and pushes it back to the server
+  without noticing the merge.)
+
+. As in #1, the attacker chooses an object ID X to steal. The victim sends
+  an object Y that the attacker already has, and the attacker falsely
+  claims to have X and not Y, so the victim sends Y as a delta against X.
+  The delta reveals regions of X that are similar to Y to the attacker.
index 5e074545729fbd938efaa65311f8437b2ca1bcdf..bc29298678a6d2d9f6b2927f97c40ba8978bd93b 100644 (file)
@@ -4395,6 +4395,10 @@ itself!
 Git Glossary
 ============
 
+[[git-explained]]
+Git explained
+-------------
+
 include::glossary-content.txt[]
 
 [[git-quick-start]]
@@ -4636,6 +4640,10 @@ $ git gc
 Appendix B: Notes and todo list for this manual
 ===============================================
 
+[[todo-list]]
+Todo list
+---------
+
 This is a work in progress.
 
 The basic requirements:
index 40700d547b222a217758b5caa5532fd86f785d84..c26b01f60bf23a3d9c9bae5d40c0abc0d985ccb0 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.10.3
+DEF_VER=v2.13.2
 
 LF='
 '
@@ -12,7 +12,7 @@ if test -f version
 then
        VN=$(cat version) || VN="$DEF_VER"
 elif test -d ${GIT_DIR:-.git} -o -f .git &&
-       VN=$(git describe --match "v[0-9]*" --abbrev=7 HEAD 2>/dev/null) &&
+       VN=$(git describe --match "v[0-9]*" HEAD 2>/dev/null) &&
        case "$VN" in
        *$LF*) (exit 1) ;;
        v[0-9]*)
index 46ad908ec5ffe851885c099cb0b3f51af8d1abf8..ffa6da71b7ccaecd6a1fb449b03d3002d5e15ea8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -102,8 +102,6 @@ all::
 #
 # Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
 #
-# Define NO_MKSTEMPS if you don't have mkstemps in the C library.
-#
 # Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
 # in the C library.
 #
@@ -142,6 +140,13 @@ all::
 # Define PPC_SHA1 environment variable when running make to make use of
 # a bundled SHA1 routine optimized for PowerPC.
 #
+# Define DC_SHA1 to unconditionally enable the collision-detecting sha1
+# algorithm. This is slower, but may detect attempted collision attacks.
+# Takes priority over other *_SHA1 knobs.
+#
+# Define OPENSSL_SHA1 environment variable when running make to link
+# with the SHA1 routine from openssl library.
+#
 # Define SHA1_MAX_BLOCK_SIZE to limit the amount of data that will be hashed
 # in one call to the platform's SHA1_Update(). e.g. APPLE_COMMON_CRYPTO
 # wants 'SHA1_MAX_BLOCK_SIZE=1024L*1024L*1024L' defined.
@@ -250,6 +255,12 @@ all::
 # apostrophes to be ASCII so that cut&pasting examples to the shell
 # will work.
 #
+# Define USE_ASCIIDOCTOR to use Asciidoctor instead of AsciiDoc to build the
+# documentation.
+#
+# Define ASCIIDOCTOR_EXTENSIONS_LAB to point to the location of the Asciidoctor
+# Extensions Lab if you have it available.
+#
 # Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
 #
 # Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
@@ -279,6 +290,9 @@ all::
 # is a simplified version of the merge sort used in glibc. This is
 # recommended if Git triggers O(n^2) behavior in your platform's qsort().
 #
+# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's
+# compatible with the one described in C11 Annex K.
+#
 # Define UNRELIABLE_FSTAT if your system's fstat does not return the same
 # information on a not yet closed file that lstat would return for the same
 # file after it was closed.
@@ -338,11 +352,6 @@ all::
 #
 # Define NATIVE_CRLF if your platform uses CRLF for line endings.
 #
-# Define XDL_FAST_HASH to use an alternative line-hashing method in
-# the diff algorithm.  It gives a nice speedup if your processor has
-# fast unaligned word loads.  Does NOT work on big-endian systems!
-# Enabled by default on x86_64.
-#
 # Define GIT_USER_AGENT if you want to change how git identifies itself during
 # network interactions.  The default is "git/$(GIT_VERSION)".
 #
@@ -467,6 +476,7 @@ SPATCH = spatch
 export TCL_PATH TCLTK_PATH
 
 SPARSE_FLAGS =
+SPATCH_FLAGS = --all-includes
 
 
 
@@ -526,12 +536,10 @@ SCRIPT_LIB += git-sh-setup
 SCRIPT_LIB += git-sh-i18n
 
 SCRIPT_PERL += git-add--interactive.perl
-SCRIPT_PERL += git-difftool.perl
 SCRIPT_PERL += git-archimport.perl
 SCRIPT_PERL += git-cvsexportcommit.perl
 SCRIPT_PERL += git-cvsimport.perl
 SCRIPT_PERL += git-cvsserver.perl
-SCRIPT_PERL += git-relink.perl
 SCRIPT_PERL += git-send-email.perl
 SCRIPT_PERL += git-svn.perl
 
@@ -613,14 +621,17 @@ TEST_PROGRAMS_NEED_X += test-fake-ssh
 TEST_PROGRAMS_NEED_X += test-genrandom
 TEST_PROGRAMS_NEED_X += test-hashmap
 TEST_PROGRAMS_NEED_X += test-index-version
+TEST_PROGRAMS_NEED_X += test-lazy-init-name-hash
 TEST_PROGRAMS_NEED_X += test-line-buffer
 TEST_PROGRAMS_NEED_X += test-match-trees
 TEST_PROGRAMS_NEED_X += test-mergesort
 TEST_PROGRAMS_NEED_X += test-mktemp
+TEST_PROGRAMS_NEED_X += test-online-cpus
 TEST_PROGRAMS_NEED_X += test-parse-options
 TEST_PROGRAMS_NEED_X += test-path-utils
 TEST_PROGRAMS_NEED_X += test-prio-queue
 TEST_PROGRAMS_NEED_X += test-read-cache
+TEST_PROGRAMS_NEED_X += test-ref-store
 TEST_PROGRAMS_NEED_X += test-regex
 TEST_PROGRAMS_NEED_X += test-revision-walking
 TEST_PROGRAMS_NEED_X += test-run-command
@@ -628,6 +639,7 @@ TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
 TEST_PROGRAMS_NEED_X += test-sha1
 TEST_PROGRAMS_NEED_X += test-sha1-array
 TEST_PROGRAMS_NEED_X += test-sigchain
+TEST_PROGRAMS_NEED_X += test-strcmp-offset
 TEST_PROGRAMS_NEED_X += test-string-list
 TEST_PROGRAMS_NEED_X += test-submodule-config
 TEST_PROGRAMS_NEED_X += test-subprocess
@@ -698,6 +710,7 @@ LIB_OBJS += abspath.o
 LIB_OBJS += advice.o
 LIB_OBJS += alias.o
 LIB_OBJS += alloc.o
+LIB_OBJS += apply.o
 LIB_OBJS += archive.o
 LIB_OBJS += archive-tar.o
 LIB_OBJS += archive-zip.o
@@ -777,6 +790,7 @@ LIB_OBJS += notes-cache.o
 LIB_OBJS += notes-merge.o
 LIB_OBJS += notes-utils.o
 LIB_OBJS += object.o
+LIB_OBJS += oidset.o
 LIB_OBJS += pack-bitmap.o
 LIB_OBJS += pack-bitmap-write.o
 LIB_OBJS += pack-check.o
@@ -803,6 +817,7 @@ LIB_OBJS += reflog-walk.o
 LIB_OBJS += refs.o
 LIB_OBJS += refs/files-backend.o
 LIB_OBJS += refs/iterator.o
+LIB_OBJS += refs/ref-cache.o
 LIB_OBJS += ref-filter.o
 LIB_OBJS += remote.o
 LIB_OBJS += replace_object.o
@@ -830,6 +845,7 @@ LIB_OBJS += submodule-config.o
 LIB_OBJS += symlinks.o
 LIB_OBJS += tag.o
 LIB_OBJS += tempfile.o
+LIB_OBJS += tmp-objdir.o
 LIB_OBJS += trace.o
 LIB_OBJS += trailer.o
 LIB_OBJS += transport.o
@@ -885,6 +901,7 @@ BUILTIN_OBJS += builtin/diff-files.o
 BUILTIN_OBJS += builtin/diff-index.o
 BUILTIN_OBJS += builtin/diff-tree.o
 BUILTIN_OBJS += builtin/diff.o
+BUILTIN_OBJS += builtin/difftool.o
 BUILTIN_OBJS += builtin/fast-export.o
 BUILTIN_OBJS += builtin/fetch-pack.o
 BUILTIN_OBJS += builtin/fetch.o
@@ -926,6 +943,7 @@ BUILTIN_OBJS += builtin/prune.o
 BUILTIN_OBJS += builtin/pull.o
 BUILTIN_OBJS += builtin/push.o
 BUILTIN_OBJS += builtin/read-tree.o
+BUILTIN_OBJS += builtin/rebase--helper.o
 BUILTIN_OBJS += builtin/receive-pack.o
 BUILTIN_OBJS += builtin/reflog.o
 BUILTIN_OBJS += builtin/remote.o
@@ -1274,9 +1292,6 @@ ifdef MKDIR_WO_TRAILING_SLASH
        COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
        COMPAT_OBJS += compat/mkdir.o
 endif
-ifdef NO_MKSTEMPS
-       COMPAT_CFLAGS += -DNO_MKSTEMPS
-endif
 ifdef NO_UNSETENV
        COMPAT_CFLAGS += -DNO_UNSETENV
        COMPAT_OBJS += compat/unsetenv.o
@@ -1380,20 +1395,34 @@ ifdef APPLE_COMMON_CRYPTO
        SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
 endif
 
+ifdef OPENSSL_SHA1
+       EXTLIBS += $(LIB_4_CRYPTO)
+       BASIC_CFLAGS += -DSHA1_OPENSSL
+else
 ifdef BLK_SHA1
-       SHA1_HEADER = "block-sha1/sha1.h"
        LIB_OBJS += block-sha1/sha1.o
+       BASIC_CFLAGS += -DSHA1_BLK
 else
 ifdef PPC_SHA1
-       SHA1_HEADER = "ppc/sha1.h"
        LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
+       BASIC_CFLAGS += -DSHA1_PPC
 else
 ifdef APPLE_COMMON_CRYPTO
        COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
-       SHA1_HEADER = <CommonCrypto/CommonDigest.h>
+       BASIC_CFLAGS += -DSHA1_APPLE
 else
-       SHA1_HEADER = <openssl/sha.h>
-       EXTLIBS += $(LIB_4_CRYPTO)
+       DC_SHA1 := YesPlease
+       LIB_OBJS += sha1dc/sha1.o
+       LIB_OBJS += sha1dc/ubc_check.o
+       BASIC_CFLAGS += \
+               -DSHA1_DC \
+               -DSHA1DC_NO_STANDARD_INCLUDES \
+               -DSHA1DC_INIT_SAFE_HASH_DEFAULT=0 \
+               -DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"cache.h\"" \
+               -DSHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_C="\"sha1dc_git.c\"" \
+               -DSHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_H="\"sha1dc_git.h\"" \
+               -DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="\"git-compat-util.h\""
+endif
 endif
 endif
 endif
@@ -1420,6 +1449,11 @@ ifdef INTERNAL_QSORT
        COMPAT_CFLAGS += -DINTERNAL_QSORT
        COMPAT_OBJS += compat/qsort.o
 endif
+ifdef HAVE_ISO_QSORT_S
+       COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
+else
+       COMPAT_OBJS += compat/qsort_s.o
+endif
 ifdef RUNTIME_PREFIX
        COMPAT_CFLAGS += -DRUNTIME_PREFIX
 endif
@@ -1482,10 +1516,6 @@ ifndef NO_MSGFMT_EXTENDED_OPTIONS
        MSGFMT += --check --statistics
 endif
 
-ifneq (,$(XDL_FAST_HASH))
-       BASIC_CFLAGS += -DXDL_FAST_HASH
-endif
-
 ifdef GMTIME_UNRELIABLE_ERRORS
        COMPAT_OBJS += compat/gmtime.o
        BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
@@ -1584,7 +1614,6 @@ endif
 
 # Shell quote (do not use $(call) to accommodate ancient setups);
 
-SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
 ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
 ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
 
@@ -1617,8 +1646,7 @@ PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
 # from the dependency list, that would make each entry appear twice.
 LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS)
 
-BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
-       $(COMPAT_CFLAGS)
+BASIC_CFLAGS += $(COMPAT_CFLAGS)
 LIB_OBJS += $(COMPAT_OBJS)
 
 # Quote for C
@@ -1822,7 +1850,7 @@ $(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
 git.res: git.rc GIT-VERSION-FILE
        $(QUIET_RC)$(RC) \
          $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
-         -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@
+         -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
 
 # This makes sure we depend on the NO_PERL setting itself.
 $(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
@@ -1834,6 +1862,7 @@ perl/perl.mak: perl/PM.stamp
 
 perl/PM.stamp: FORCE
        @$(FIND) perl -type f -name '*.pm' | sort >$@+ && \
+       $(PERL_PATH) -V >>$@+ && \
        { cmp $@+ $@ >/dev/null 2>/dev/null || mv $@+ $@; } && \
        $(RM) $@+
 
@@ -2052,7 +2081,7 @@ git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
 
 git-imap-send$X: imap-send.o $(IMAP_SEND_BUILDDEPS) GIT-LDFLAGS $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
-               $(LIBS) $(IMAP_SEND_LDFLAGS)
+               $(IMAP_SEND_LDFLAGS) $(LIBS)
 
 git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
@@ -2111,7 +2140,8 @@ XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
        --keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
        --keyword=gettextln --keyword=eval_gettextln
-XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
+XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
+       --keyword=__ --keyword=N__ --keyword="__n:1,2"
 LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
 LOCALIZED_SH += git-parse-remote.sh
@@ -2146,9 +2176,22 @@ endif
 po/build/locale/%/LC_MESSAGES/git.mo: po/%.po
        $(QUIET_MSGFMT)mkdir -p $(dir $@) && $(MSGFMT) -o $@ $<
 
-FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
-                       $(FIND) . \( -name .git -type d -prune \) \
-                               -o \( -name '*.[hcS]' -type f -print \) )
+FIND_SOURCE_FILES = ( \
+       git ls-files \
+               '*.[hcS]' \
+               '*.sh' \
+               ':!*[tp][0-9][0-9][0-9][0-9]*' \
+               ':!contrib' \
+               2>/dev/null || \
+       $(FIND) . \
+               \( -name .git -type d -prune \) \
+               -o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
+               -o \( -name contrib -type d -prune \) \
+               -o \( -name build -type d -prune \) \
+               -o \( -name 'trash*' -type d -prune \) \
+               -o \( -name '*.[hcS]' -type f -print \) \
+               -o \( -name '*.sh' -type f -print \) \
+       )
 
 $(ETAGS_TARGET): FORCE
        $(RM) $(ETAGS_TARGET)
@@ -2207,6 +2250,7 @@ GIT-BUILD-OPTIONS: FORCE
        @echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
        @echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
        @echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
+       @echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
 ifdef TEST_OUTPUT_DIRECTORY
        @echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
 endif
@@ -2233,6 +2277,9 @@ endif
 ifdef GIT_PERF_MAKE_OPTS
        @echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
 endif
+ifdef GIT_INTEROP_MAKE_OPTS
+       @echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
+endif
 ifdef TEST_GIT_INDEX_VERSION
        @echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
 endif
@@ -2313,9 +2360,17 @@ check: common-cmds.h
 C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
 %.cocci.patch: %.cocci $(C_SOURCES)
        @echo '    ' SPATCH $<; \
+       ret=0; \
        for f in $(C_SOURCES); do \
-               $(SPATCH) --sp-file $< $$f; \
-       done >$@ 2>$@.log; \
+               $(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS) || \
+                       { ret=$$?; break; }; \
+       done >$@+ 2>$@.log; \
+       if test $$ret != 0; \
+       then \
+               cat $@.log; \
+               exit 1; \
+       fi; \
+       mv $@+ $@; \
        if test -s $@; \
        then \
                echo '    ' SPATCH result: $@; \
index bd8a918a9bcbd46590078d98a66f3d7e939df3fb..f17af66a97c8097ab91f074478c4a5cb90425725 100644 (file)
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ Torvalds with help of a group of hackers around the net.
 
 Please read the file [INSTALL][] for installation instructions.
 
-Many Git online resources are accessible from http://git-scm.com/
+Many Git online resources are accessible from <https://git-scm.com/>
 including full documentation and Git related tools.
 
 See [Documentation/gittutorial.txt][] to get started, then see
@@ -33,8 +33,8 @@ requests, comments and patches to git@vger.kernel.org (read
 [Documentation/SubmittingPatches][] for instructions on patch submission).
 To subscribe to the list, send an email with just "subscribe git" in
 the body to majordomo@vger.kernel.org. The mailing list archives are
-available at http://news.gmane.org/gmane.comp.version-control.git/,
-http://marc.info/?l=git and other archival sites.
+available at <https://public-inbox.org/git/>,
+<http://marc.info/?l=git> and other archival sites.
 
 The maintainer frequently sends the "What's cooking" reports that
 list the current status of various development topics to the mailing
index 75030cb5e0c9dca7f7fa88bdb0af64c0b5c0273d..d75ac9dd09072809084680945aef73c86c20fa3a 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.10.3.txt
\ No newline at end of file
+Documentation/RelNotes/2.13.2.txt
\ No newline at end of file
index 2825de85912fc730d9a40fa66f4f83b6250a4171..7f1cfe97929ea33efb81adfcc97b82f334dccb3d 100644 (file)
--- a/abspath.c
+++ b/abspath.c
@@ -11,46 +11,83 @@ int is_directory(const char *path)
        return (!stat(path, &st) && S_ISDIR(st.st_mode));
 }
 
+/* removes the last path component from 'path' except if 'path' is root */
+static void strip_last_component(struct strbuf *path)
+{
+       size_t offset = offset_1st_component(path->buf);
+       size_t len = path->len;
+
+       /* Find start of the last component */
+       while (offset < len && !is_dir_sep(path->buf[len - 1]))
+               len--;
+       /* Skip sequences of multiple path-separators */
+       while (offset < len && is_dir_sep(path->buf[len - 1]))
+               len--;
+
+       strbuf_setlen(path, len);
+}
+
+/* get (and remove) the next component in 'remaining' and place it in 'next' */
+static void get_next_component(struct strbuf *next, struct strbuf *remaining)
+{
+       char *start = NULL;
+       char *end = NULL;
+
+       strbuf_reset(next);
+
+       /* look for the next component */
+       /* Skip sequences of multiple path-separators */
+       for (start = remaining->buf; is_dir_sep(*start); start++)
+               ; /* nothing */
+       /* Find end of the path component */
+       for (end = start; *end && !is_dir_sep(*end); end++)
+               ; /* nothing */
+
+       strbuf_add(next, start, end - start);
+       /* remove the component from 'remaining' */
+       strbuf_remove(remaining, 0, end - remaining->buf);
+}
+
+/* copies root part from remaining to resolved, canonicalizing it on the way */
+static void get_root_part(struct strbuf *resolved, struct strbuf *remaining)
+{
+       int offset = offset_1st_component(remaining->buf);
+
+       strbuf_reset(resolved);
+       strbuf_add(resolved, remaining->buf, offset);
+#ifdef GIT_WINDOWS_NATIVE
+       convert_slashes(resolved->buf);
+#endif
+       strbuf_remove(remaining, 0, offset);
+}
+
 /* We allow "recursive" symbolic links. Only within reason, though. */
-#define MAXDEPTH 5
+#ifndef MAXSYMLINKS
+#define MAXSYMLINKS 32
+#endif
 
 /*
  * Return the real path (i.e., absolute path, with symlinks resolved
  * and extra slashes removed) equivalent to the specified path.  (If
  * you want an absolute path but don't mind links, use
- * absolute_path().)  The return value is a pointer to a static
- * buffer.
+ * absolute_path().)  Places the resolved realpath in the provided strbuf.
  *
- * The input and all intermediate paths must be shorter than MAX_PATH.
  * The directory part of path (i.e., everything up to the last
  * dir_sep) must denote a valid, existing directory, but the last
  * component need not exist.  If die_on_error is set, then die with an
  * informative error message if there is a problem.  Otherwise, return
  * NULL on errors (without generating any output).
- *
- * If path is our buffer, then return path, as it's already what the
- * user wants.
  */
-static const char *real_path_internal(const char *path, int die_on_error)
+char *strbuf_realpath(struct strbuf *resolved, const char *path,
+                     int die_on_error)
 {
-       static struct strbuf sb = STRBUF_INIT;
+       struct strbuf remaining = STRBUF_INIT;
+       struct strbuf next = STRBUF_INIT;
+       struct strbuf symlink = STRBUF_INIT;
        char *retval = NULL;
-
-       /*
-        * If we have to temporarily chdir(), store the original CWD
-        * here so that we can chdir() back to it at the end of the
-        * function:
-        */
-       struct strbuf cwd = STRBUF_INIT;
-
-       int depth = MAXDEPTH;
-       char *last_elem = NULL;
+       int num_symlinks = 0;
        struct stat st;
 
-       /* We've already done it */
-       if (path == sb.buf)
-               return path;
-
        if (!*path) {
                if (die_on_error)
                        die("The empty string is not a valid path");
@@ -58,86 +95,136 @@ static const char *real_path_internal(const char *path, int die_on_error)
                        goto error_out;
        }
 
-       strbuf_reset(&sb);
-       strbuf_addstr(&sb, path);
-
-       while (depth--) {
-               if (!is_directory(sb.buf)) {
-                       char *last_slash = find_last_dir_sep(sb.buf);
-                       if (last_slash) {
-                               last_elem = xstrdup(last_slash + 1);
-                               strbuf_setlen(&sb, last_slash - sb.buf + 1);
-                       } else {
-                               last_elem = xmemdupz(sb.buf, sb.len);
-                               strbuf_reset(&sb);
-                       }
+       strbuf_addstr(&remaining, path);
+       get_root_part(resolved, &remaining);
+
+       if (!resolved->len) {
+               /* relative path; can use CWD as the initial resolved path */
+               if (strbuf_getcwd(resolved)) {
+                       if (die_on_error)
+                               die_errno("unable to get current working directory");
+                       else
+                               goto error_out;
+               }
+       }
+
+       /* Iterate over the remaining path components */
+       while (remaining.len > 0) {
+               get_next_component(&next, &remaining);
+
+               if (next.len == 0) {
+                       continue; /* empty component */
+               } else if (next.len == 1 && !strcmp(next.buf, ".")) {
+                       continue; /* '.' component */
+               } else if (next.len == 2 && !strcmp(next.buf, "..")) {
+                       /* '..' component; strip the last path component */
+                       strip_last_component(resolved);
+                       continue;
                }
 
-               if (sb.len) {
-                       if (!cwd.len && strbuf_getcwd(&cwd)) {
+               /* append the next component and resolve resultant path */
+               if (!is_dir_sep(resolved->buf[resolved->len - 1]))
+                       strbuf_addch(resolved, '/');
+               strbuf_addbuf(resolved, &next);
+
+               if (lstat(resolved->buf, &st)) {
+                       /* error out unless this was the last component */
+                       if (errno != ENOENT || remaining.len) {
                                if (die_on_error)
-                                       die_errno("Could not get current working directory");
+                                       die_errno("Invalid path '%s'",
+                                                 resolved->buf);
                                else
                                        goto error_out;
                        }
+               } else if (S_ISLNK(st.st_mode)) {
+                       ssize_t len;
+                       strbuf_reset(&symlink);
+
+                       if (num_symlinks++ > MAXSYMLINKS) {
+                               errno = ELOOP;
 
-                       if (chdir(sb.buf)) {
                                if (die_on_error)
-                                       die_errno("Could not switch to '%s'",
-                                                 sb.buf);
+                                       die("More than %d nested symlinks "
+                                           "on path '%s'", MAXSYMLINKS, path);
                                else
                                        goto error_out;
                        }
-               }
-               if (strbuf_getcwd(&sb)) {
-                       if (die_on_error)
-                               die_errno("Could not get current working directory");
-                       else
-                               goto error_out;
-               }
-
-               if (last_elem) {
-                       if (sb.len && !is_dir_sep(sb.buf[sb.len - 1]))
-                               strbuf_addch(&sb, '/');
-                       strbuf_addstr(&sb, last_elem);
-                       free(last_elem);
-                       last_elem = NULL;
-               }
 
-               if (!lstat(sb.buf, &st) && S_ISLNK(st.st_mode)) {
-                       struct strbuf next_sb = STRBUF_INIT;
-                       ssize_t len = strbuf_readlink(&next_sb, sb.buf, 0);
+                       len = strbuf_readlink(&symlink, resolved->buf,
+                                             st.st_size);
                        if (len < 0) {
                                if (die_on_error)
                                        die_errno("Invalid symlink '%s'",
-                                                 sb.buf);
+                                                 resolved->buf);
                                else
                                        goto error_out;
                        }
-                       strbuf_swap(&sb, &next_sb);
-                       strbuf_release(&next_sb);
-               } else
-                       break;
+
+                       if (is_absolute_path(symlink.buf)) {
+                               /* absolute symlink; set resolved to root */
+                               get_root_part(resolved, &symlink);
+                       } else {
+                               /*
+                                * relative symlink
+                                * strip off the last component since it will
+                                * be replaced with the contents of the symlink
+                                */
+                               strip_last_component(resolved);
+                       }
+
+                       /*
+                        * if there are still remaining components to resolve
+                        * then append them to symlink
+                        */
+                       if (remaining.len) {
+                               strbuf_addch(&symlink, '/');
+                               strbuf_addbuf(&symlink, &remaining);
+                       }
+
+                       /*
+                        * use the symlink as the remaining components that
+                        * need to be resloved
+                        */
+                       strbuf_swap(&symlink, &remaining);
+               }
        }
 
-       retval = sb.buf;
+       retval = resolved->buf;
+
 error_out:
-       free(last_elem);
-       if (cwd.len && chdir(cwd.buf))
-               die_errno("Could not change back to '%s'", cwd.buf);
-       strbuf_release(&cwd);
+       strbuf_release(&remaining);
+       strbuf_release(&next);
+       strbuf_release(&symlink);
+
+       if (!retval)
+               strbuf_reset(resolved);
 
        return retval;
 }
 
 const char *real_path(const char *path)
 {
-       return real_path_internal(path, 1);
+       static struct strbuf realpath = STRBUF_INIT;
+       return strbuf_realpath(&realpath, path, 1);
 }
 
 const char *real_path_if_valid(const char *path)
 {
-       return real_path_internal(path, 0);
+       static struct strbuf realpath = STRBUF_INIT;
+       return strbuf_realpath(&realpath, path, 0);
+}
+
+char *real_pathdup(const char *path, int die_on_error)
+{
+       struct strbuf realpath = STRBUF_INIT;
+       char *retval = NULL;
+
+       if (strbuf_realpath(&realpath, path, die_on_error))
+               retval = strbuf_detach(&realpath, NULL);
+
+       strbuf_release(&realpath);
+
+       return retval;
 }
 
 /*
@@ -152,29 +239,28 @@ const char *absolute_path(const char *path)
        return sb.buf;
 }
 
-/*
- * Unlike prefix_path, this should be used if the named file does
- * not have to interact with index entry; i.e. name of a random file
- * on the filesystem.
- */
-const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
+char *absolute_pathdup(const char *path)
 {
-       static struct strbuf path = STRBUF_INIT;
-#ifndef GIT_WINDOWS_NATIVE
-       if (!pfx_len || is_absolute_path(arg))
-               return arg;
-       strbuf_reset(&path);
-       strbuf_add(&path, pfx, pfx_len);
-       strbuf_addstr(&path, arg);
-#else
-       /* don't add prefix to absolute paths, but still replace '\' by '/' */
-       strbuf_reset(&path);
-       if (is_absolute_path(arg))
+       struct strbuf sb = STRBUF_INIT;
+       strbuf_add_absolute_path(&sb, path);
+       return strbuf_detach(&sb, NULL);
+}
+
+char *prefix_filename(const char *pfx, const char *arg)
+{
+       struct strbuf path = STRBUF_INIT;
+       size_t pfx_len = pfx ? strlen(pfx) : 0;
+
+       if (!pfx_len)
+               ; /* nothing to prefix */
+       else if (is_absolute_path(arg))
                pfx_len = 0;
-       else if (pfx_len)
+       else
                strbuf_add(&path, pfx, pfx_len);
+
        strbuf_addstr(&path, arg);
+#ifdef GIT_WINDOWS_NATIVE
        convert_slashes(path.buf + pfx_len);
 #endif
-       return path.buf;
+       return strbuf_detach(&path, NULL);
 }
diff --git a/alias.c b/alias.c
index 3b90397a99d9f7ed4a0c1c5a83f5e69c879e752f..05263046614e10945cb8d81ef3e42e0d5f2c9a2e 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -1,14 +1,28 @@
 #include "cache.h"
 
+struct config_alias_data {
+       const char *alias;
+       char *v;
+};
+
+static int config_alias_cb(const char *key, const char *value, void *d)
+{
+       struct config_alias_data *data = d;
+       const char *p;
+
+       if (skip_prefix(key, "alias.", &p) && !strcmp(p, data->alias))
+               return git_config_string((const char **)&data->v, key, value);
+
+       return 0;
+}
+
 char *alias_lookup(const char *alias)
 {
-       char *v = NULL;
-       struct strbuf key = STRBUF_INIT;
-       strbuf_addf(&key, "alias.%s", alias);
-       if (git_config_key_is_valid(key.buf))
-               git_config_get_string(key.buf, &v);
-       strbuf_release(&key);
-       return v;
+       struct config_alias_data data = { alias, NULL };
+
+       read_early_config(config_alias_cb, &data);
+
+       return data.v;
 }
 
 #define SPLIT_CMDLINE_BAD_ENDING 1
diff --git a/apply.c b/apply.c
new file mode 100644 (file)
index 0000000..7a9f4c8
--- /dev/null
+++ b/apply.c
@@ -0,0 +1,5003 @@
+/*
+ * apply.c
+ *
+ * Copyright (C) Linus Torvalds, 2005
+ *
+ * This applies patches on top of some (arbitrary) version of the SCM.
+ *
+ */
+
+#include "cache.h"
+#include "blob.h"
+#include "delta.h"
+#include "diff.h"
+#include "dir.h"
+#include "xdiff-interface.h"
+#include "ll-merge.h"
+#include "lockfile.h"
+#include "parse-options.h"
+#include "quote.h"
+#include "rerere.h"
+#include "apply.h"
+
+static void git_apply_config(void)
+{
+       git_config_get_string_const("apply.whitespace", &apply_default_whitespace);
+       git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace);
+       git_config(git_default_config, NULL);
+}
+
+static int parse_whitespace_option(struct apply_state *state, const char *option)
+{
+       if (!option) {
+               state->ws_error_action = warn_on_ws_error;
+               return 0;
+       }
+       if (!strcmp(option, "warn")) {
+               state->ws_error_action = warn_on_ws_error;
+               return 0;
+       }
+       if (!strcmp(option, "nowarn")) {
+               state->ws_error_action = nowarn_ws_error;
+               return 0;
+       }
+       if (!strcmp(option, "error")) {
+               state->ws_error_action = die_on_ws_error;
+               return 0;
+       }
+       if (!strcmp(option, "error-all")) {
+               state->ws_error_action = die_on_ws_error;
+               state->squelch_whitespace_errors = 0;
+               return 0;
+       }
+       if (!strcmp(option, "strip") || !strcmp(option, "fix")) {
+               state->ws_error_action = correct_ws_error;
+               return 0;
+       }
+       return error(_("unrecognized whitespace option '%s'"), option);
+}
+
+static int parse_ignorewhitespace_option(struct apply_state *state,
+                                                const char *option)
+{
+       if (!option || !strcmp(option, "no") ||
+           !strcmp(option, "false") || !strcmp(option, "never") ||
+           !strcmp(option, "none")) {
+               state->ws_ignore_action = ignore_ws_none;
+               return 0;
+       }
+       if (!strcmp(option, "change")) {
+               state->ws_ignore_action = ignore_ws_change;
+               return 0;
+       }
+       return error(_("unrecognized whitespace ignore option '%s'"), option);
+}
+
+int init_apply_state(struct apply_state *state,
+                    const char *prefix,
+                    struct lock_file *lock_file)
+{
+       memset(state, 0, sizeof(*state));
+       state->prefix = prefix;
+       state->prefix_length = state->prefix ? strlen(state->prefix) : 0;
+       state->lock_file = lock_file;
+       state->newfd = -1;
+       state->apply = 1;
+       state->line_termination = '\n';
+       state->p_value = 1;
+       state->p_context = UINT_MAX;
+       state->squelch_whitespace_errors = 5;
+       state->ws_error_action = warn_on_ws_error;
+       state->ws_ignore_action = ignore_ws_none;
+       state->linenr = 1;
+       string_list_init(&state->fn_table, 0);
+       string_list_init(&state->limit_by_name, 0);
+       string_list_init(&state->symlink_changes, 0);
+       strbuf_init(&state->root, 0);
+
+       git_apply_config();
+       if (apply_default_whitespace && parse_whitespace_option(state, apply_default_whitespace))
+               return -1;
+       if (apply_default_ignorewhitespace && parse_ignorewhitespace_option(state, apply_default_ignorewhitespace))
+               return -1;
+       return 0;
+}
+
+void clear_apply_state(struct apply_state *state)
+{
+       string_list_clear(&state->limit_by_name, 0);
+       string_list_clear(&state->symlink_changes, 0);
+       strbuf_release(&state->root);
+
+       /* &state->fn_table is cleared at the end of apply_patch() */
+}
+
+static void mute_routine(const char *msg, va_list params)
+{
+       /* do nothing */
+}
+
+int check_apply_state(struct apply_state *state, int force_apply)
+{
+       int is_not_gitdir = !startup_info->have_repository;
+
+       if (state->apply_with_reject && state->threeway)
+               return error(_("--reject and --3way cannot be used together."));
+       if (state->cached && state->threeway)
+               return error(_("--cached and --3way cannot be used together."));
+       if (state->threeway) {
+               if (is_not_gitdir)
+                       return error(_("--3way outside a repository"));
+               state->check_index = 1;
+       }
+       if (state->apply_with_reject) {
+               state->apply = 1;
+               if (state->apply_verbosity == verbosity_normal)
+                       state->apply_verbosity = verbosity_verbose;
+       }
+       if (!force_apply && (state->diffstat || state->numstat || state->summary || state->check || state->fake_ancestor))
+               state->apply = 0;
+       if (state->check_index && is_not_gitdir)
+               return error(_("--index outside a repository"));
+       if (state->cached) {
+               if (is_not_gitdir)
+                       return error(_("--cached outside a repository"));
+               state->check_index = 1;
+       }
+       if (state->check_index)
+               state->unsafe_paths = 0;
+       if (!state->lock_file)
+               return error("BUG: state->lock_file should not be NULL");
+
+       if (state->apply_verbosity <= verbosity_silent) {
+               state->saved_error_routine = get_error_routine();
+               state->saved_warn_routine = get_warn_routine();
+               set_error_routine(mute_routine);
+               set_warn_routine(mute_routine);
+       }
+
+       return 0;
+}
+
+static void set_default_whitespace_mode(struct apply_state *state)
+{
+       if (!state->whitespace_option && !apply_default_whitespace)
+               state->ws_error_action = (state->apply ? warn_on_ws_error : nowarn_ws_error);
+}
+
+/*
+ * This represents one "hunk" from a patch, starting with
+ * "@@ -oldpos,oldlines +newpos,newlines @@" marker.  The
+ * patch text is pointed at by patch, and its byte length
+ * is stored in size.  leading and trailing are the number
+ * of context lines.
+ */
+struct fragment {
+       unsigned long leading, trailing;
+       unsigned long oldpos, oldlines;
+       unsigned long newpos, newlines;
+       /*
+        * 'patch' is usually borrowed from buf in apply_patch(),
+        * but some codepaths store an allocated buffer.
+        */
+       const char *patch;
+       unsigned free_patch:1,
+               rejected:1;
+       int size;
+       int linenr;
+       struct fragment *next;
+};
+
+/*
+ * When dealing with a binary patch, we reuse "leading" field
+ * to store the type of the binary hunk, either deflated "delta"
+ * or deflated "literal".
+ */
+#define binary_patch_method leading
+#define BINARY_DELTA_DEFLATED  1
+#define BINARY_LITERAL_DEFLATED 2
+
+/*
+ * This represents a "patch" to a file, both metainfo changes
+ * such as creation/deletion, filemode and content changes represented
+ * as a series of fragments.
+ */
+struct patch {
+       char *new_name, *old_name, *def_name;
+       unsigned int old_mode, new_mode;
+       int is_new, is_delete;  /* -1 = unknown, 0 = false, 1 = true */
+       int rejected;
+       unsigned ws_rule;
+       int lines_added, lines_deleted;
+       int score;
+       int extension_linenr; /* first line specifying delete/new/rename/copy */
+       unsigned int is_toplevel_relative:1;
+       unsigned int inaccurate_eof:1;
+       unsigned int is_binary:1;
+       unsigned int is_copy:1;
+       unsigned int is_rename:1;
+       unsigned int recount:1;
+       unsigned int conflicted_threeway:1;
+       unsigned int direct_to_threeway:1;
+       struct fragment *fragments;
+       char *result;
+       size_t resultsize;
+       char old_sha1_prefix[41];
+       char new_sha1_prefix[41];
+       struct patch *next;
+
+       /* three-way fallback result */
+       struct object_id threeway_stage[3];
+};
+
+static void free_fragment_list(struct fragment *list)
+{
+       while (list) {
+               struct fragment *next = list->next;
+               if (list->free_patch)
+                       free((char *)list->patch);
+               free(list);
+               list = next;
+       }
+}
+
+static void free_patch(struct patch *patch)
+{
+       free_fragment_list(patch->fragments);
+       free(patch->def_name);
+       free(patch->old_name);
+       free(patch->new_name);
+       free(patch->result);
+       free(patch);
+}
+
+static void free_patch_list(struct patch *list)
+{
+       while (list) {
+               struct patch *next = list->next;
+               free_patch(list);
+               list = next;
+       }
+}
+
+/*
+ * A line in a file, len-bytes long (includes the terminating LF,
+ * except for an incomplete line at the end if the file ends with
+ * one), and its contents hashes to 'hash'.
+ */
+struct line {
+       size_t len;
+       unsigned hash : 24;
+       unsigned flag : 8;
+#define LINE_COMMON     1
+#define LINE_PATCHED   2
+};
+
+/*
+ * This represents a "file", which is an array of "lines".
+ */
+struct image {
+       char *buf;
+       size_t len;
+       size_t nr;
+       size_t alloc;
+       struct line *line_allocated;
+       struct line *line;
+};
+
+static uint32_t hash_line(const char *cp, size_t len)
+{
+       size_t i;
+       uint32_t h;
+       for (i = 0, h = 0; i < len; i++) {
+               if (!isspace(cp[i])) {
+                       h = h * 3 + (cp[i] & 0xff);
+               }
+       }
+       return h;
+}
+
+/*
+ * Compare lines s1 of length n1 and s2 of length n2, ignoring
+ * whitespace difference. Returns 1 if they match, 0 otherwise
+ */
+static int fuzzy_matchlines(const char *s1, size_t n1,
+                           const char *s2, size_t n2)
+{
+       const char *last1 = s1 + n1 - 1;
+       const char *last2 = s2 + n2 - 1;
+       int result = 0;
+
+       /* ignore line endings */
+       while ((*last1 == '\r') || (*last1 == '\n'))
+               last1--;
+       while ((*last2 == '\r') || (*last2 == '\n'))
+               last2--;
+
+       /* skip leading whitespaces, if both begin with whitespace */
+       if (s1 <= last1 && s2 <= last2 && isspace(*s1) && isspace(*s2)) {
+               while (isspace(*s1) && (s1 <= last1))
+                       s1++;
+               while (isspace(*s2) && (s2 <= last2))
+                       s2++;
+       }
+       /* early return if both lines are empty */
+       if ((s1 > last1) && (s2 > last2))
+               return 1;
+       while (!result) {
+               result = *s1++ - *s2++;
+               /*
+                * Skip whitespace inside. We check for whitespace on
+                * both buffers because we don't want "a b" to match
+                * "ab"
+                */
+               if (isspace(*s1) && isspace(*s2)) {
+                       while (isspace(*s1) && s1 <= last1)
+                               s1++;
+                       while (isspace(*s2) && s2 <= last2)
+                               s2++;
+               }
+               /*
+                * If we reached the end on one side only,
+                * lines don't match
+                */
+               if (
+                   ((s2 > last2) && (s1 <= last1)) ||
+                   ((s1 > last1) && (s2 <= last2)))
+                       return 0;
+               if ((s1 > last1) && (s2 > last2))
+                       break;
+       }
+
+       return !result;
+}
+
+static void add_line_info(struct image *img, const char *bol, size_t len, unsigned flag)
+{
+       ALLOC_GROW(img->line_allocated, img->nr + 1, img->alloc);
+       img->line_allocated[img->nr].len = len;
+       img->line_allocated[img->nr].hash = hash_line(bol, len);
+       img->line_allocated[img->nr].flag = flag;
+       img->nr++;
+}
+
+/*
+ * "buf" has the file contents to be patched (read from various sources).
+ * attach it to "image" and add line-based index to it.
+ * "image" now owns the "buf".
+ */
+static void prepare_image(struct image *image, char *buf, size_t len,
+                         int prepare_linetable)
+{
+       const char *cp, *ep;
+
+       memset(image, 0, sizeof(*image));
+       image->buf = buf;
+       image->len = len;
+
+       if (!prepare_linetable)
+               return;
+
+       ep = image->buf + image->len;
+       cp = image->buf;
+       while (cp < ep) {
+               const char *next;
+               for (next = cp; next < ep && *next != '\n'; next++)
+                       ;
+               if (next < ep)
+                       next++;
+               add_line_info(image, cp, next - cp, 0);
+               cp = next;
+       }
+       image->line = image->line_allocated;
+}
+
+static void clear_image(struct image *image)
+{
+       free(image->buf);
+       free(image->line_allocated);
+       memset(image, 0, sizeof(*image));
+}
+
+/* fmt must contain _one_ %s and no other substitution */
+static void say_patch_name(FILE *output, const char *fmt, struct patch *patch)
+{
+       struct strbuf sb = STRBUF_INIT;
+
+       if (patch->old_name && patch->new_name &&
+           strcmp(patch->old_name, patch->new_name)) {
+               quote_c_style(patch->old_name, &sb, NULL, 0);
+               strbuf_addstr(&sb, " => ");
+               quote_c_style(patch->new_name, &sb, NULL, 0);
+       } else {
+               const char *n = patch->new_name;
+               if (!n)
+                       n = patch->old_name;
+               quote_c_style(n, &sb, NULL, 0);
+       }
+       fprintf(output, fmt, sb.buf);
+       fputc('\n', output);
+       strbuf_release(&sb);
+}
+
+#define SLOP (16)
+
+static int read_patch_file(struct strbuf *sb, int fd)
+{
+       if (strbuf_read(sb, fd, 0) < 0)
+               return error_errno("git apply: failed to read");
+
+       /*
+        * Make sure that we have some slop in the buffer
+        * so that we can do speculative "memcmp" etc, and
+        * see to it that it is NUL-filled.
+        */
+       strbuf_grow(sb, SLOP);
+       memset(sb->buf + sb->len, 0, SLOP);
+       return 0;
+}
+
+static unsigned long linelen(const char *buffer, unsigned long size)
+{
+       unsigned long len = 0;
+       while (size--) {
+               len++;
+               if (*buffer++ == '\n')
+                       break;
+       }
+       return len;
+}
+
+static int is_dev_null(const char *str)
+{
+       return skip_prefix(str, "/dev/null", &str) && isspace(*str);
+}
+
+#define TERM_SPACE     1
+#define TERM_TAB       2
+
+static int name_terminate(int c, int terminate)
+{
+       if (c == ' ' && !(terminate & TERM_SPACE))
+               return 0;
+       if (c == '\t' && !(terminate & TERM_TAB))
+               return 0;
+
+       return 1;
+}
+
+/* remove double slashes to make --index work with such filenames */
+static char *squash_slash(char *name)
+{
+       int i = 0, j = 0;
+
+       if (!name)
+               return NULL;
+
+       while (name[i]) {
+               if ((name[j++] = name[i++]) == '/')
+                       while (name[i] == '/')
+                               i++;
+       }
+       name[j] = '\0';
+       return name;
+}
+
+static char *find_name_gnu(struct apply_state *state,
+                          const char *line,
+                          const char *def,
+                          int p_value)
+{
+       struct strbuf name = STRBUF_INIT;
+       char *cp;
+
+       /*
+        * Proposed "new-style" GNU patch/diff format; see
+        * http://marc.info/?l=git&m=112927316408690&w=2
+        */
+       if (unquote_c_style(&name, line, NULL)) {
+               strbuf_release(&name);
+               return NULL;
+       }
+
+       for (cp = name.buf; p_value; p_value--) {
+               cp = strchr(cp, '/');
+               if (!cp) {
+                       strbuf_release(&name);
+                       return NULL;
+               }
+               cp++;
+       }
+
+       strbuf_remove(&name, 0, cp - name.buf);
+       if (state->root.len)
+               strbuf_insert(&name, 0, state->root.buf, state->root.len);
+       return squash_slash(strbuf_detach(&name, NULL));
+}
+
+static size_t sane_tz_len(const char *line, size_t len)
+{
+       const char *tz, *p;
+
+       if (len < strlen(" +0500") || line[len-strlen(" +0500")] != ' ')
+               return 0;
+       tz = line + len - strlen(" +0500");
+
+       if (tz[1] != '+' && tz[1] != '-')
+               return 0;
+
+       for (p = tz + 2; p != line + len; p++)
+               if (!isdigit(*p))
+                       return 0;
+
+       return line + len - tz;
+}
+
+static size_t tz_with_colon_len(const char *line, size_t len)
+{
+       const char *tz, *p;
+
+       if (len < strlen(" +08:00") || line[len - strlen(":00")] != ':')
+               return 0;
+       tz = line + len - strlen(" +08:00");
+
+       if (tz[0] != ' ' || (tz[1] != '+' && tz[1] != '-'))
+               return 0;
+       p = tz + 2;
+       if (!isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
+           !isdigit(*p++) || !isdigit(*p++))
+               return 0;
+
+       return line + len - tz;
+}
+
+static size_t date_len(const char *line, size_t len)
+{
+       const char *date, *p;
+
+       if (len < strlen("72-02-05") || line[len-strlen("-05")] != '-')
+               return 0;
+       p = date = line + len - strlen("72-02-05");
+
+       if (!isdigit(*p++) || !isdigit(*p++) || *p++ != '-' ||
+           !isdigit(*p++) || !isdigit(*p++) || *p++ != '-' ||
+           !isdigit(*p++) || !isdigit(*p++))   /* Not a date. */
+               return 0;
+
+       if (date - line >= strlen("19") &&
+           isdigit(date[-1]) && isdigit(date[-2]))     /* 4-digit year */
+               date -= strlen("19");
+
+       return line + len - date;
+}
+
+static size_t short_time_len(const char *line, size_t len)
+{
+       const char *time, *p;
+
+       if (len < strlen(" 07:01:32") || line[len-strlen(":32")] != ':')
+               return 0;
+       p = time = line + len - strlen(" 07:01:32");
+
+       /* Permit 1-digit hours? */
+       if (*p++ != ' ' ||
+           !isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
+           !isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
+           !isdigit(*p++) || !isdigit(*p++))   /* Not a time. */
+               return 0;
+
+       return line + len - time;
+}
+
+static size_t fractional_time_len(const char *line, size_t len)
+{
+       const char *p;
+       size_t n;
+
+       /* Expected format: 19:41:17.620000023 */
+       if (!len || !isdigit(line[len - 1]))
+               return 0;
+       p = line + len - 1;
+
+       /* Fractional seconds. */
+       while (p > line && isdigit(*p))
+               p--;
+       if (*p != '.')
+               return 0;
+
+       /* Hours, minutes, and whole seconds. */
+       n = short_time_len(line, p - line);
+       if (!n)
+               return 0;
+
+       return line + len - p + n;
+}
+
+static size_t trailing_spaces_len(const char *line, size_t len)
+{
+       const char *p;
+
+       /* Expected format: ' ' x (1 or more)  */
+       if (!len || line[len - 1] != ' ')
+               return 0;
+
+       p = line + len;
+       while (p != line) {
+               p--;
+               if (*p != ' ')
+                       return line + len - (p + 1);
+       }
+
+       /* All spaces! */
+       return len;
+}
+
+static size_t diff_timestamp_len(const char *line, size_t len)
+{
+       const char *end = line + len;
+       size_t n;
+
+       /*
+        * Posix: 2010-07-05 19:41:17
+        * GNU: 2010-07-05 19:41:17.620000023 -0500
+        */
+
+       if (!isdigit(end[-1]))
+               return 0;
+
+       n = sane_tz_len(line, end - line);
+       if (!n)
+               n = tz_with_colon_len(line, end - line);
+       end -= n;
+
+       n = short_time_len(line, end - line);
+       if (!n)
+               n = fractional_time_len(line, end - line);
+       end -= n;
+
+       n = date_len(line, end - line);
+       if (!n) /* No date.  Too bad. */
+               return 0;
+       end -= n;
+
+       if (end == line)        /* No space before date. */
+               return 0;
+       if (end[-1] == '\t') {  /* Success! */
+               end--;
+               return line + len - end;
+       }
+       if (end[-1] != ' ')     /* No space before date. */
+               return 0;
+
+       /* Whitespace damage. */
+       end -= trailing_spaces_len(line, end - line);
+       return line + len - end;
+}
+
+static char *find_name_common(struct apply_state *state,
+                             const char *line,
+                             const char *def,
+                             int p_value,
+                             const char *end,
+                             int terminate)
+{
+       int len;
+       const char *start = NULL;
+
+       if (p_value == 0)
+               start = line;
+       while (line != end) {
+               char c = *line;
+
+               if (!end && isspace(c)) {
+                       if (c == '\n')
+                               break;
+                       if (name_terminate(c, terminate))
+                               break;
+               }
+               line++;
+               if (c == '/' && !--p_value)
+                       start = line;
+       }
+       if (!start)
+               return squash_slash(xstrdup_or_null(def));
+       len = line - start;
+       if (!len)
+               return squash_slash(xstrdup_or_null(def));
+
+       /*
+        * Generally we prefer the shorter name, especially
+        * if the other one is just a variation of that with
+        * something else tacked on to the end (ie "file.orig"
+        * or "file~").
+        */
+       if (def) {
+               int deflen = strlen(def);
+               if (deflen < len && !strncmp(start, def, deflen))
+                       return squash_slash(xstrdup(def));
+       }
+
+       if (state->root.len) {
+               char *ret = xstrfmt("%s%.*s", state->root.buf, len, start);
+               return squash_slash(ret);
+       }
+
+       return squash_slash(xmemdupz(start, len));
+}
+
+static char *find_name(struct apply_state *state,
+                      const char *line,
+                      char *def,
+                      int p_value,
+                      int terminate)
+{
+       if (*line == '"') {
+               char *name = find_name_gnu(state, line, def, p_value);
+               if (name)
+                       return name;
+       }
+
+       return find_name_common(state, line, def, p_value, NULL, terminate);
+}
+
+static char *find_name_traditional(struct apply_state *state,
+                                  const char *line,
+                                  char *def,
+                                  int p_value)
+{
+       size_t len;
+       size_t date_len;
+
+       if (*line == '"') {
+               char *name = find_name_gnu(state, line, def, p_value);
+               if (name)
+                       return name;
+       }
+
+       len = strchrnul(line, '\n') - line;
+       date_len = diff_timestamp_len(line, len);
+       if (!date_len)
+               return find_name_common(state, line, def, p_value, NULL, TERM_TAB);
+       len -= date_len;
+
+       return find_name_common(state, line, def, p_value, line + len, 0);
+}
+
+static int count_slashes(const char *cp)
+{
+       int cnt = 0;
+       char ch;
+
+       while ((ch = *cp++))
+               if (ch == '/')
+                       cnt++;
+       return cnt;
+}
+
+/*
+ * Given the string after "--- " or "+++ ", guess the appropriate
+ * p_value for the given patch.
+ */
+static int guess_p_value(struct apply_state *state, const char *nameline)
+{
+       char *name, *cp;
+       int val = -1;
+
+       if (is_dev_null(nameline))
+               return -1;
+       name = find_name_traditional(state, nameline, NULL, 0);
+       if (!name)
+               return -1;
+       cp = strchr(name, '/');
+       if (!cp)
+               val = 0;
+       else if (state->prefix) {
+               /*
+                * Does it begin with "a/$our-prefix" and such?  Then this is
+                * very likely to apply to our directory.
+                */
+               if (!strncmp(name, state->prefix, state->prefix_length))
+                       val = count_slashes(state->prefix);
+               else {
+                       cp++;
+                       if (!strncmp(cp, state->prefix, state->prefix_length))
+                               val = count_slashes(state->prefix) + 1;
+               }
+       }
+       free(name);
+       return val;
+}
+
+/*
+ * Does the ---/+++ line have the POSIX timestamp after the last HT?
+ * GNU diff puts epoch there to signal a creation/deletion event.  Is
+ * this such a timestamp?
+ */
+static int has_epoch_timestamp(const char *nameline)
+{
+       /*
+        * We are only interested in epoch timestamp; any non-zero
+        * fraction cannot be one, hence "(\.0+)?" in the regexp below.
+        * For the same reason, the date must be either 1969-12-31 or
+        * 1970-01-01, and the seconds part must be "00".
+        */
+       const char stamp_regexp[] =
+               "^(1969-12-31|1970-01-01)"
+               " "
+               "[0-2][0-9]:[0-5][0-9]:00(\\.0+)?"
+               " "
+               "([-+][0-2][0-9]:?[0-5][0-9])\n";
+       const char *timestamp = NULL, *cp, *colon;
+       static regex_t *stamp;
+       regmatch_t m[10];
+       int zoneoffset;
+       int hourminute;
+       int status;
+
+       for (cp = nameline; *cp != '\n'; cp++) {
+               if (*cp == '\t')
+                       timestamp = cp + 1;
+       }
+       if (!timestamp)
+               return 0;
+       if (!stamp) {
+               stamp = xmalloc(sizeof(*stamp));
+               if (regcomp(stamp, stamp_regexp, REG_EXTENDED)) {
+                       warning(_("Cannot prepare timestamp regexp %s"),
+                               stamp_regexp);
+                       return 0;
+               }
+       }
+
+       status = regexec(stamp, timestamp, ARRAY_SIZE(m), m, 0);
+       if (status) {
+               if (status != REG_NOMATCH)
+                       warning(_("regexec returned %d for input: %s"),
+                               status, timestamp);
+               return 0;
+       }
+
+       zoneoffset = strtol(timestamp + m[3].rm_so + 1, (char **) &colon, 10);
+       if (*colon == ':')
+               zoneoffset = zoneoffset * 60 + strtol(colon + 1, NULL, 10);
+       else
+               zoneoffset = (zoneoffset / 100) * 60 + (zoneoffset % 100);
+       if (timestamp[m[3].rm_so] == '-')
+               zoneoffset = -zoneoffset;
+
+       /*
+        * YYYY-MM-DD hh:mm:ss must be from either 1969-12-31
+        * (west of GMT) or 1970-01-01 (east of GMT)
+        */
+       if ((zoneoffset < 0 && memcmp(timestamp, "1969-12-31", 10)) ||
+           (0 <= zoneoffset && memcmp(timestamp, "1970-01-01", 10)))
+               return 0;
+
+       hourminute = (strtol(timestamp + 11, NULL, 10) * 60 +
+                     strtol(timestamp + 14, NULL, 10) -
+                     zoneoffset);
+
+       return ((zoneoffset < 0 && hourminute == 1440) ||
+               (0 <= zoneoffset && !hourminute));
+}
+
+/*
+ * Get the name etc info from the ---/+++ lines of a traditional patch header
+ *
+ * FIXME! The end-of-filename heuristics are kind of screwy. For existing
+ * files, we can happily check the index for a match, but for creating a
+ * new file we should try to match whatever "patch" does. I have no idea.
+ */
+static int parse_traditional_patch(struct apply_state *state,
+                                  const char *first,
+                                  const char *second,
+                                  struct patch *patch)
+{
+       char *name;
+
+       first += 4;     /* skip "--- " */
+       second += 4;    /* skip "+++ " */
+       if (!state->p_value_known) {
+               int p, q;
+               p = guess_p_value(state, first);
+               q = guess_p_value(state, second);
+               if (p < 0) p = q;
+               if (0 <= p && p == q) {
+                       state->p_value = p;
+                       state->p_value_known = 1;
+               }
+       }
+       if (is_dev_null(first)) {
+               patch->is_new = 1;
+               patch->is_delete = 0;
+               name = find_name_traditional(state, second, NULL, state->p_value);
+               patch->new_name = name;
+       } else if (is_dev_null(second)) {
+               patch->is_new = 0;
+               patch->is_delete = 1;
+               name = find_name_traditional(state, first, NULL, state->p_value);
+               patch->old_name = name;
+       } else {
+               char *first_name;
+               first_name = find_name_traditional(state, first, NULL, state->p_value);
+               name = find_name_traditional(state, second, first_name, state->p_value);
+               free(first_name);
+               if (has_epoch_timestamp(first)) {
+                       patch->is_new = 1;
+                       patch->is_delete = 0;
+                       patch->new_name = name;
+               } else if (has_epoch_timestamp(second)) {
+                       patch->is_new = 0;
+                       patch->is_delete = 1;
+                       patch->old_name = name;
+               } else {
+                       patch->old_name = name;
+                       patch->new_name = xstrdup_or_null(name);
+               }
+       }
+       if (!name)
+               return error(_("unable to find filename in patch at line %d"), state->linenr);
+
+       return 0;
+}
+
+static int gitdiff_hdrend(struct apply_state *state,
+                         const char *line,
+                         struct patch *patch)
+{
+       return 1;
+}
+
+/*
+ * We're anal about diff header consistency, to make
+ * sure that we don't end up having strange ambiguous
+ * patches floating around.
+ *
+ * As a result, gitdiff_{old|new}name() will check
+ * their names against any previous information, just
+ * to make sure..
+ */
+#define DIFF_OLD_NAME 0
+#define DIFF_NEW_NAME 1
+
+static int gitdiff_verify_name(struct apply_state *state,
+                              const char *line,
+                              int isnull,
+                              char **name,
+                              int side)
+{
+       if (!*name && !isnull) {
+               *name = find_name(state, line, NULL, state->p_value, TERM_TAB);
+               return 0;
+       }
+
+       if (*name) {
+               int len = strlen(*name);
+               char *another;
+               if (isnull)
+                       return error(_("git apply: bad git-diff - expected /dev/null, got %s on line %d"),
+                                    *name, state->linenr);
+               another = find_name(state, line, NULL, state->p_value, TERM_TAB);
+               if (!another || memcmp(another, *name, len + 1)) {
+                       free(another);
+                       return error((side == DIFF_NEW_NAME) ?
+                           _("git apply: bad git-diff - inconsistent new filename on line %d") :
+                           _("git apply: bad git-diff - inconsistent old filename on line %d"), state->linenr);
+               }
+               free(another);
+       } else {
+               /* expect "/dev/null" */
+               if (memcmp("/dev/null", line, 9) || line[9] != '\n')
+                       return error(_("git apply: bad git-diff - expected /dev/null on line %d"), state->linenr);
+       }
+
+       return 0;
+}
+
+static int gitdiff_oldname(struct apply_state *state,
+                          const char *line,
+                          struct patch *patch)
+{
+       return gitdiff_verify_name(state, line,
+                                  patch->is_new, &patch->old_name,
+                                  DIFF_OLD_NAME);
+}
+
+static int gitdiff_newname(struct apply_state *state,
+                          const char *line,
+                          struct patch *patch)
+{
+       return gitdiff_verify_name(state, line,
+                                  patch->is_delete, &patch->new_name,
+                                  DIFF_NEW_NAME);
+}
+
+static int parse_mode_line(const char *line, int linenr, unsigned int *mode)
+{
+       char *end;
+       *mode = strtoul(line, &end, 8);
+       if (end == line || !isspace(*end))
+               return error(_("invalid mode on line %d: %s"), linenr, line);
+       return 0;
+}
+
+static int gitdiff_oldmode(struct apply_state *state,
+                          const char *line,
+                          struct patch *patch)
+{
+       return parse_mode_line(line, state->linenr, &patch->old_mode);
+}
+
+static int gitdiff_newmode(struct apply_state *state,
+                          const char *line,
+                          struct patch *patch)
+{
+       return parse_mode_line(line, state->linenr, &patch->new_mode);
+}
+
+static int gitdiff_delete(struct apply_state *state,
+                         const char *line,
+                         struct patch *patch)
+{
+       patch->is_delete = 1;
+       free(patch->old_name);
+       patch->old_name = xstrdup_or_null(patch->def_name);
+       return gitdiff_oldmode(state, line, patch);
+}
+
+static int gitdiff_newfile(struct apply_state *state,
+                          const char *line,
+                          struct patch *patch)
+{
+       patch->is_new = 1;
+       free(patch->new_name);
+       patch->new_name = xstrdup_or_null(patch->def_name);
+       return gitdiff_newmode(state, line, patch);
+}
+
+static int gitdiff_copysrc(struct apply_state *state,
+                          const char *line,
+                          struct patch *patch)
+{
+       patch->is_copy = 1;
+       free(patch->old_name);
+       patch->old_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
+       return 0;
+}
+
+static int gitdiff_copydst(struct apply_state *state,
+                          const char *line,
+                          struct patch *patch)
+{
+       patch->is_copy = 1;
+       free(patch->new_name);
+       patch->new_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
+       return 0;
+}
+
+static int gitdiff_renamesrc(struct apply_state *state,
+                            const char *line,
+                            struct patch *patch)
+{
+       patch->is_rename = 1;
+       free(patch->old_name);
+       patch->old_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
+       return 0;
+}
+
+static int gitdiff_renamedst(struct apply_state *state,
+                            const char *line,
+                            struct patch *patch)
+{
+       patch->is_rename = 1;
+       free(patch->new_name);
+       patch->new_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
+       return 0;
+}
+
+static int gitdiff_similarity(struct apply_state *state,
+                             const char *line,
+                             struct patch *patch)
+{
+       unsigned long val = strtoul(line, NULL, 10);
+       if (val <= 100)
+               patch->score = val;
+       return 0;
+}
+
+static int gitdiff_dissimilarity(struct apply_state *state,
+                                const char *line,
+                                struct patch *patch)
+{
+       unsigned long val = strtoul(line, NULL, 10);
+       if (val <= 100)
+               patch->score = val;
+       return 0;
+}
+
+static int gitdiff_index(struct apply_state *state,
+                        const char *line,
+                        struct patch *patch)
+{
+       /*
+        * index line is N hexadecimal, "..", N hexadecimal,
+        * and optional space with octal mode.
+        */
+       const char *ptr, *eol;
+       int len;
+
+       ptr = strchr(line, '.');
+       if (!ptr || ptr[1] != '.' || 40 < ptr - line)
+               return 0;
+       len = ptr - line;
+       memcpy(patch->old_sha1_prefix, line, len);
+       patch->old_sha1_prefix[len] = 0;
+
+       line = ptr + 2;
+       ptr = strchr(line, ' ');
+       eol = strchrnul(line, '\n');
+
+       if (!ptr || eol < ptr)
+               ptr = eol;
+       len = ptr - line;
+
+       if (40 < len)
+               return 0;
+       memcpy(patch->new_sha1_prefix, line, len);
+       patch->new_sha1_prefix[len] = 0;
+       if (*ptr == ' ')
+               return gitdiff_oldmode(state, ptr + 1, patch);
+       return 0;
+}
+
+/*
+ * This is normal for a diff that doesn't change anything: we'll fall through
+ * into the next diff. Tell the parser to break out.
+ */
+static int gitdiff_unrecognized(struct apply_state *state,
+                               const char *line,
+                               struct patch *patch)
+{
+       return 1;
+}
+
+/*
+ * Skip p_value leading components from "line"; as we do not accept
+ * absolute paths, return NULL in that case.
+ */
+static const char *skip_tree_prefix(struct apply_state *state,
+                                   const char *line,
+                                   int llen)
+{
+       int nslash;
+       int i;
+
+       if (!state->p_value)
+               return (llen && line[0] == '/') ? NULL : line;
+
+       nslash = state->p_value;
+       for (i = 0; i < llen; i++) {
+               int ch = line[i];
+               if (ch == '/' && --nslash <= 0)
+                       return (i == 0) ? NULL : &line[i + 1];
+       }
+       return NULL;
+}
+
+/*
+ * This is to extract the same name that appears on "diff --git"
+ * line.  We do not find and return anything if it is a rename
+ * patch, and it is OK because we will find the name elsewhere.
+ * We need to reliably find name only when it is mode-change only,
+ * creation or deletion of an empty file.  In any of these cases,
+ * both sides are the same name under a/ and b/ respectively.
+ */
+static char *git_header_name(struct apply_state *state,
+                            const char *line,
+                            int llen)
+{
+       const char *name;
+       const char *second = NULL;
+       size_t len, line_len;
+
+       line += strlen("diff --git ");
+       llen -= strlen("diff --git ");
+
+       if (*line == '"') {
+               const char *cp;
+               struct strbuf first = STRBUF_INIT;
+               struct strbuf sp = STRBUF_INIT;
+
+               if (unquote_c_style(&first, line, &second))
+                       goto free_and_fail1;
+
+               /* strip the a/b prefix including trailing slash */
+               cp = skip_tree_prefix(state, first.buf, first.len);
+               if (!cp)
+                       goto free_and_fail1;
+               strbuf_remove(&first, 0, cp - first.buf);
+
+               /*
+                * second points at one past closing dq of name.
+                * find the second name.
+                */
+               while ((second < line + llen) && isspace(*second))
+                       second++;
+
+               if (line + llen <= second)
+                       goto free_and_fail1;
+               if (*second == '"') {
+                       if (unquote_c_style(&sp, second, NULL))
+                               goto free_and_fail1;
+                       cp = skip_tree_prefix(state, sp.buf, sp.len);
+                       if (!cp)
+                               goto free_and_fail1;
+                       /* They must match, otherwise ignore */
+                       if (strcmp(cp, first.buf))
+                               goto free_and_fail1;
+                       strbuf_release(&sp);
+                       return strbuf_detach(&first, NULL);
+               }
+
+               /* unquoted second */
+               cp = skip_tree_prefix(state, second, line + llen - second);
+               if (!cp)
+                       goto free_and_fail1;
+               if (line + llen - cp != first.len ||
+                   memcmp(first.buf, cp, first.len))
+                       goto free_and_fail1;
+               return strbuf_detach(&first, NULL);
+
+       free_and_fail1:
+               strbuf_release(&first);
+               strbuf_release(&sp);
+               return NULL;
+       }
+
+       /* unquoted first name */
+       name = skip_tree_prefix(state, line, llen);
+       if (!name)
+               return NULL;
+
+       /*
+        * since the first name is unquoted, a dq if exists must be
+        * the beginning of the second name.
+        */
+       for (second = name; second < line + llen; second++) {
+               if (*second == '"') {
+                       struct strbuf sp = STRBUF_INIT;
+                       const char *np;
+
+                       if (unquote_c_style(&sp, second, NULL))
+                               goto free_and_fail2;
+
+                       np = skip_tree_prefix(state, sp.buf, sp.len);
+                       if (!np)
+                               goto free_and_fail2;
+
+                       len = sp.buf + sp.len - np;
+                       if (len < second - name &&
+                           !strncmp(np, name, len) &&
+                           isspace(name[len])) {
+                               /* Good */
+                               strbuf_remove(&sp, 0, np - sp.buf);
+                               return strbuf_detach(&sp, NULL);
+                       }
+
+               free_and_fail2:
+                       strbuf_release(&sp);
+                       return NULL;
+               }
+       }
+
+       /*
+        * Accept a name only if it shows up twice, exactly the same
+        * form.
+        */
+       second = strchr(name, '\n');
+       if (!second)
+               return NULL;
+       line_len = second - name;
+       for (len = 0 ; ; len++) {
+               switch (name[len]) {
+               default:
+                       continue;
+               case '\n':
+                       return NULL;
+               case '\t': case ' ':
+                       /*
+                        * Is this the separator between the preimage
+                        * and the postimage pathname?  Again, we are
+                        * only interested in the case where there is
+                        * no rename, as this is only to set def_name
+                        * and a rename patch has the names elsewhere
+                        * in an unambiguous form.
+                        */
+                       if (!name[len + 1])
+                               return NULL; /* no postimage name */
+                       second = skip_tree_prefix(state, name + len + 1,
+                                                 line_len - (len + 1));
+                       if (!second)
+                               return NULL;
+                       /*
+                        * Does len bytes starting at "name" and "second"
+                        * (that are separated by one HT or SP we just
+                        * found) exactly match?
+                        */
+                       if (second[len] == '\n' && !strncmp(name, second, len))
+                               return xmemdupz(name, len);
+               }
+       }
+}
+
+static int check_header_line(struct apply_state *state, struct patch *patch)
+{
+       int extensions = (patch->is_delete == 1) + (patch->is_new == 1) +
+                        (patch->is_rename == 1) + (patch->is_copy == 1);
+       if (extensions > 1)
+               return error(_("inconsistent header lines %d and %d"),
+                            patch->extension_linenr, state->linenr);
+       if (extensions && !patch->extension_linenr)
+               patch->extension_linenr = state->linenr;
+       return 0;
+}
+
+/* Verify that we recognize the lines following a git header */
+static int parse_git_header(struct apply_state *state,
+                           const char *line,
+                           int len,
+                           unsigned int size,
+                           struct patch *patch)
+{
+       unsigned long offset;
+
+       /* A git diff has explicit new/delete information, so we don't guess */
+       patch->is_new = 0;
+       patch->is_delete = 0;
+
+       /*
+        * Some things may not have the old name in the
+        * rest of the headers anywhere (pure mode changes,
+        * or removing or adding empty files), so we get
+        * the default name from the header.
+        */
+       patch->def_name = git_header_name(state, line, len);
+       if (patch->def_name && state->root.len) {
+               char *s = xstrfmt("%s%s", state->root.buf, patch->def_name);
+               free(patch->def_name);
+               patch->def_name = s;
+       }
+
+       line += len;
+       size -= len;
+       state->linenr++;
+       for (offset = len ; size > 0 ; offset += len, size -= len, line += len, state->linenr++) {
+               static const struct opentry {
+                       const char *str;
+                       int (*fn)(struct apply_state *, const char *, struct patch *);
+               } optable[] = {
+                       { "@@ -", gitdiff_hdrend },
+                       { "--- ", gitdiff_oldname },
+                       { "+++ ", gitdiff_newname },
+                       { "old mode ", gitdiff_oldmode },
+                       { "new mode ", gitdiff_newmode },
+                       { "deleted file mode ", gitdiff_delete },
+                       { "new file mode ", gitdiff_newfile },
+                       { "copy from ", gitdiff_copysrc },
+                       { "copy to ", gitdiff_copydst },
+                       { "rename old ", gitdiff_renamesrc },
+                       { "rename new ", gitdiff_renamedst },
+                       { "rename from ", gitdiff_renamesrc },
+                       { "rename to ", gitdiff_renamedst },
+                       { "similarity index ", gitdiff_similarity },
+                       { "dissimilarity index ", gitdiff_dissimilarity },
+                       { "index ", gitdiff_index },
+                       { "", gitdiff_unrecognized },
+               };
+               int i;
+
+               len = linelen(line, size);
+               if (!len || line[len-1] != '\n')
+                       break;
+               for (i = 0; i < ARRAY_SIZE(optable); i++) {
+                       const struct opentry *p = optable + i;
+                       int oplen = strlen(p->str);
+                       int res;
+                       if (len < oplen || memcmp(p->str, line, oplen))
+                               continue;
+                       res = p->fn(state, line + oplen, patch);
+                       if (res < 0)
+                               return -1;
+                       if (check_header_line(state, patch))
+                               return -1;
+                       if (res > 0)
+                               return offset;
+                       break;
+               }
+       }
+
+       return offset;
+}
+
+static int parse_num(const char *line, unsigned long *p)
+{
+       char *ptr;
+
+       if (!isdigit(*line))
+               return 0;
+       *p = strtoul(line, &ptr, 10);
+       return ptr - line;
+}
+
+static int parse_range(const char *line, int len, int offset, const char *expect,
+                      unsigned long *p1, unsigned long *p2)
+{
+       int digits, ex;
+
+       if (offset < 0 || offset >= len)
+               return -1;
+       line += offset;
+       len -= offset;
+
+       digits = parse_num(line, p1);
+       if (!digits)
+               return -1;
+
+       offset += digits;
+       line += digits;
+       len -= digits;
+
+       *p2 = 1;
+       if (*line == ',') {
+               digits = parse_num(line+1, p2);
+               if (!digits)
+                       return -1;
+
+               offset += digits+1;
+               line += digits+1;
+               len -= digits+1;
+       }
+
+       ex = strlen(expect);
+       if (ex > len)
+               return -1;
+       if (memcmp(line, expect, ex))
+               return -1;
+
+       return offset + ex;
+}
+
+static void recount_diff(const char *line, int size, struct fragment *fragment)
+{
+       int oldlines = 0, newlines = 0, ret = 0;
+
+       if (size < 1) {
+               warning("recount: ignore empty hunk");
+               return;
+       }
+
+       for (;;) {
+               int len = linelen(line, size);
+               size -= len;
+               line += len;
+
+               if (size < 1)
+                       break;
+
+               switch (*line) {
+               case ' ': case '\n':
+                       newlines++;
+                       /* fall through */
+               case '-':
+                       oldlines++;
+                       continue;
+               case '+':
+                       newlines++;
+                       continue;
+               case '\\':
+                       continue;
+               case '@':
+                       ret = size < 3 || !starts_with(line, "@@ ");
+                       break;
+               case 'd':
+                       ret = size < 5 || !starts_with(line, "diff ");
+                       break;
+               default:
+                       ret = -1;
+                       break;
+               }
+               if (ret) {
+                       warning(_("recount: unexpected line: %.*s"),
+                               (int)linelen(line, size), line);
+                       return;
+               }
+               break;
+       }
+       fragment->oldlines = oldlines;
+       fragment->newlines = newlines;
+}
+
+/*
+ * Parse a unified diff fragment header of the
+ * form "@@ -a,b +c,d @@"
+ */
+static int parse_fragment_header(const char *line, int len, struct fragment *fragment)
+{
+       int offset;
+
+       if (!len || line[len-1] != '\n')
+               return -1;
+
+       /* Figure out the number of lines in a fragment */
+       offset = parse_range(line, len, 4, " +", &fragment->oldpos, &fragment->oldlines);
+       offset = parse_range(line, len, offset, " @@", &fragment->newpos, &fragment->newlines);
+
+       return offset;
+}
+
+/*
+ * Find file diff header
+ *
+ * Returns:
+ *  -1 if no header was found
+ *  -128 in case of error
+ *   the size of the header in bytes (called "offset") otherwise
+ */
+static int find_header(struct apply_state *state,
+                      const char *line,
+                      unsigned long size,
+                      int *hdrsize,
+                      struct patch *patch)
+{
+       unsigned long offset, len;
+
+       patch->is_toplevel_relative = 0;
+       patch->is_rename = patch->is_copy = 0;
+       patch->is_new = patch->is_delete = -1;
+       patch->old_mode = patch->new_mode = 0;
+       patch->old_name = patch->new_name = NULL;
+       for (offset = 0; size > 0; offset += len, size -= len, line += len, state->linenr++) {
+               unsigned long nextlen;
+
+               len = linelen(line, size);
+               if (!len)
+                       break;
+
+               /* Testing this early allows us to take a few shortcuts.. */
+               if (len < 6)
+                       continue;
+
+               /*
+                * Make sure we don't find any unconnected patch fragments.
+                * That's a sign that we didn't find a header, and that a
+                * patch has become corrupted/broken up.
+                */
+               if (!memcmp("@@ -", line, 4)) {
+                       struct fragment dummy;
+                       if (parse_fragment_header(line, len, &dummy) < 0)
+                               continue;
+                       error(_("patch fragment without header at line %d: %.*s"),
+                                    state->linenr, (int)len-1, line);
+                       return -128;
+               }
+
+               if (size < len + 6)
+                       break;
+
+               /*
+                * Git patch? It might not have a real patch, just a rename
+                * or mode change, so we handle that specially
+                */
+               if (!memcmp("diff --git ", line, 11)) {
+                       int git_hdr_len = parse_git_header(state, line, len, size, patch);
+                       if (git_hdr_len < 0)
+                               return -128;
+                       if (git_hdr_len <= len)
+                               continue;
+                       if (!patch->old_name && !patch->new_name) {
+                               if (!patch->def_name) {
+                                       error(Q_("git diff header lacks filename information when removing "
+                                                       "%d leading pathname component (line %d)",
+                                                       "git diff header lacks filename information when removing "
+                                                       "%d leading pathname components (line %d)",
+                                                       state->p_value),
+                                                    state->p_value, state->linenr);
+                                       return -128;
+                               }
+                               patch->old_name = xstrdup(patch->def_name);
+                               patch->new_name = xstrdup(patch->def_name);
+                       }
+                       if ((!patch->new_name && !patch->is_delete) ||
+                           (!patch->old_name && !patch->is_new)) {
+                               error(_("git diff header lacks filename information "
+                                            "(line %d)"), state->linenr);
+                               return -128;
+                       }
+                       patch->is_toplevel_relative = 1;
+                       *hdrsize = git_hdr_len;
+                       return offset;
+               }
+
+               /* --- followed by +++ ? */
+               if (memcmp("--- ", line,  4) || memcmp("+++ ", line + len, 4))
+                       continue;
+
+               /*
+                * We only accept unified patches, so we want it to
+                * at least have "@@ -a,b +c,d @@\n", which is 14 chars
+                * minimum ("@@ -0,0 +1 @@\n" is the shortest).
+                */
+               nextlen = linelen(line + len, size - len);
+               if (size < nextlen + 14 || memcmp("@@ -", line + len + nextlen, 4))
+                       continue;
+
+               /* Ok, we'll consider it a patch */
+               if (parse_traditional_patch(state, line, line+len, patch))
+                       return -128;
+               *hdrsize = len + nextlen;
+               state->linenr += 2;
+               return offset;
+       }
+       return -1;
+}
+
+static void record_ws_error(struct apply_state *state,
+                           unsigned result,
+                           const char *line,
+                           int len,
+                           int linenr)
+{
+       char *err;
+
+       if (!result)
+               return;
+
+       state->whitespace_error++;
+       if (state->squelch_whitespace_errors &&
+           state->squelch_whitespace_errors < state->whitespace_error)
+               return;
+
+       err = whitespace_error_string(result);
+       if (state->apply_verbosity > verbosity_silent)
+               fprintf(stderr, "%s:%d: %s.\n%.*s\n",
+                       state->patch_input_file, linenr, err, len, line);
+       free(err);
+}
+
+static void check_whitespace(struct apply_state *state,
+                            const char *line,
+                            int len,
+                            unsigned ws_rule)
+{
+       unsigned result = ws_check(line + 1, len - 1, ws_rule);
+
+       record_ws_error(state, result, line + 1, len - 2, state->linenr);
+}
+
+/*
+ * Parse a unified diff. Note that this really needs to parse each
+ * fragment separately, since the only way to know the difference
+ * between a "---" that is part of a patch, and a "---" that starts
+ * the next patch is to look at the line counts..
+ */
+static int parse_fragment(struct apply_state *state,
+                         const char *line,
+                         unsigned long size,
+                         struct patch *patch,
+                         struct fragment *fragment)
+{
+       int added, deleted;
+       int len = linelen(line, size), offset;
+       unsigned long oldlines, newlines;
+       unsigned long leading, trailing;
+
+       offset = parse_fragment_header(line, len, fragment);
+       if (offset < 0)
+               return -1;
+       if (offset > 0 && patch->recount)
+               recount_diff(line + offset, size - offset, fragment);
+       oldlines = fragment->oldlines;
+       newlines = fragment->newlines;
+       leading = 0;
+       trailing = 0;
+
+       /* Parse the thing.. */
+       line += len;
+       size -= len;
+       state->linenr++;
+       added = deleted = 0;
+       for (offset = len;
+            0 < size;
+            offset += len, size -= len, line += len, state->linenr++) {
+               if (!oldlines && !newlines)
+                       break;
+               len = linelen(line, size);
+               if (!len || line[len-1] != '\n')
+                       return -1;
+               switch (*line) {
+               default:
+                       return -1;
+               case '\n': /* newer GNU diff, an empty context line */
+               case ' ':
+                       oldlines--;
+                       newlines--;
+                       if (!deleted && !added)
+                               leading++;
+                       trailing++;
+                       if (!state->apply_in_reverse &&
+                           state->ws_error_action == correct_ws_error)
+                               check_whitespace(state, line, len, patch->ws_rule);
+                       break;
+               case '-':
+                       if (state->apply_in_reverse &&
+                           state->ws_error_action != nowarn_ws_error)
+                               check_whitespace(state, line, len, patch->ws_rule);
+                       deleted++;
+                       oldlines--;
+                       trailing = 0;
+                       break;
+               case '+':
+                       if (!state->apply_in_reverse &&
+                           state->ws_error_action != nowarn_ws_error)
+                               check_whitespace(state, line, len, patch->ws_rule);
+                       added++;
+                       newlines--;
+                       trailing = 0;
+                       break;
+
+               /*
+                * We allow "\ No newline at end of file". Depending
+                * on locale settings when the patch was produced we
+                * don't know what this line looks like. The only
+                * thing we do know is that it begins with "\ ".
+                * Checking for 12 is just for sanity check -- any
+                * l10n of "\ No newline..." is at least that long.
+                */
+               case '\\':
+                       if (len < 12 || memcmp(line, "\\ ", 2))
+                               return -1;
+                       break;
+               }
+       }
+       if (oldlines || newlines)
+               return -1;
+       if (!deleted && !added)
+               return -1;
+
+       fragment->leading = leading;
+       fragment->trailing = trailing;
+
+       /*
+        * If a fragment ends with an incomplete line, we failed to include
+        * it in the above loop because we hit oldlines == newlines == 0
+        * before seeing it.
+        */
+       if (12 < size && !memcmp(line, "\\ ", 2))
+               offset += linelen(line, size);
+
+       patch->lines_added += added;
+       patch->lines_deleted += deleted;
+
+       if (0 < patch->is_new && oldlines)
+               return error(_("new file depends on old contents"));
+       if (0 < patch->is_delete && newlines)
+               return error(_("deleted file still has contents"));
+       return offset;
+}
+
+/*
+ * We have seen "diff --git a/... b/..." header (or a traditional patch
+ * header).  Read hunks that belong to this patch into fragments and hang
+ * them to the given patch structure.
+ *
+ * The (fragment->patch, fragment->size) pair points into the memory given
+ * by the caller, not a copy, when we return.
+ *
+ * Returns:
+ *   -1 in case of error,
+ *   the number of bytes in the patch otherwise.
+ */
+static int parse_single_patch(struct apply_state *state,
+                             const char *line,
+                             unsigned long size,
+                             struct patch *patch)
+{
+       unsigned long offset = 0;
+       unsigned long oldlines = 0, newlines = 0, context = 0;
+       struct fragment **fragp = &patch->fragments;
+
+       while (size > 4 && !memcmp(line, "@@ -", 4)) {
+               struct fragment *fragment;
+               int len;
+
+               fragment = xcalloc(1, sizeof(*fragment));
+               fragment->linenr = state->linenr;
+               len = parse_fragment(state, line, size, patch, fragment);
+               if (len <= 0) {
+                       free(fragment);
+                       return error(_("corrupt patch at line %d"), state->linenr);
+               }
+               fragment->patch = line;
+               fragment->size = len;
+               oldlines += fragment->oldlines;
+               newlines += fragment->newlines;
+               context += fragment->leading + fragment->trailing;
+
+               *fragp = fragment;
+               fragp = &fragment->next;
+
+               offset += len;
+               line += len;
+               size -= len;
+       }
+
+       /*
+        * If something was removed (i.e. we have old-lines) it cannot
+        * be creation, and if something was added it cannot be
+        * deletion.  However, the reverse is not true; --unified=0
+        * patches that only add are not necessarily creation even
+        * though they do not have any old lines, and ones that only
+        * delete are not necessarily deletion.
+        *
+        * Unfortunately, a real creation/deletion patch do _not_ have
+        * any context line by definition, so we cannot safely tell it
+        * apart with --unified=0 insanity.  At least if the patch has
+        * more than one hunk it is not creation or deletion.
+        */
+       if (patch->is_new < 0 &&
+           (oldlines || (patch->fragments && patch->fragments->next)))
+               patch->is_new = 0;
+       if (patch->is_delete < 0 &&
+           (newlines || (patch->fragments && patch->fragments->next)))
+               patch->is_delete = 0;
+
+       if (0 < patch->is_new && oldlines)
+               return error(_("new file %s depends on old contents"), patch->new_name);
+       if (0 < patch->is_delete && newlines)
+               return error(_("deleted file %s still has contents"), patch->old_name);
+       if (!patch->is_delete && !newlines && context && state->apply_verbosity > verbosity_silent)
+               fprintf_ln(stderr,
+                          _("** warning: "
+                            "file %s becomes empty but is not deleted"),
+                          patch->new_name);
+
+       return offset;
+}
+
+static inline int metadata_changes(struct patch *patch)
+{
+       return  patch->is_rename > 0 ||
+               patch->is_copy > 0 ||
+               patch->is_new > 0 ||
+               patch->is_delete ||
+               (patch->old_mode && patch->new_mode &&
+                patch->old_mode != patch->new_mode);
+}
+
+static char *inflate_it(const void *data, unsigned long size,
+                       unsigned long inflated_size)
+{
+       git_zstream stream;
+       void *out;
+       int st;
+
+       memset(&stream, 0, sizeof(stream));
+
+       stream.next_in = (unsigned char *)data;
+       stream.avail_in = size;
+       stream.next_out = out = xmalloc(inflated_size);
+       stream.avail_out = inflated_size;
+       git_inflate_init(&stream);
+       st = git_inflate(&stream, Z_FINISH);
+       git_inflate_end(&stream);
+       if ((st != Z_STREAM_END) || stream.total_out != inflated_size) {
+               free(out);
+               return NULL;
+       }
+       return out;
+}
+
+/*
+ * Read a binary hunk and return a new fragment; fragment->patch
+ * points at an allocated memory that the caller must free, so
+ * it is marked as "->free_patch = 1".
+ */
+static struct fragment *parse_binary_hunk(struct apply_state *state,
+                                         char **buf_p,
+                                         unsigned long *sz_p,
+                                         int *status_p,
+                                         int *used_p)
+{
+       /*
+        * Expect a line that begins with binary patch method ("literal"
+        * or "delta"), followed by the length of data before deflating.
+        * a sequence of 'length-byte' followed by base-85 encoded data
+        * should follow, terminated by a newline.
+        *
+        * Each 5-byte sequence of base-85 encodes up to 4 bytes,
+        * and we would limit the patch line to 66 characters,
+        * so one line can fit up to 13 groups that would decode
+        * to 52 bytes max.  The length byte 'A'-'Z' corresponds
+        * to 1-26 bytes, and 'a'-'z' corresponds to 27-52 bytes.
+        */
+       int llen, used;
+       unsigned long size = *sz_p;
+       char *buffer = *buf_p;
+       int patch_method;
+       unsigned long origlen;
+       char *data = NULL;
+       int hunk_size = 0;
+       struct fragment *frag;
+
+       llen = linelen(buffer, size);
+       used = llen;
+
+       *status_p = 0;
+
+       if (starts_with(buffer, "delta ")) {
+               patch_method = BINARY_DELTA_DEFLATED;
+               origlen = strtoul(buffer + 6, NULL, 10);
+       }
+       else if (starts_with(buffer, "literal ")) {
+               patch_method = BINARY_LITERAL_DEFLATED;
+               origlen = strtoul(buffer + 8, NULL, 10);
+       }
+       else
+               return NULL;
+
+       state->linenr++;
+       buffer += llen;
+       while (1) {
+               int byte_length, max_byte_length, newsize;
+               llen = linelen(buffer, size);
+               used += llen;
+               state->linenr++;
+               if (llen == 1) {
+                       /* consume the blank line */
+                       buffer++;
+                       size--;
+                       break;
+               }
+               /*
+                * Minimum line is "A00000\n" which is 7-byte long,
+                * and the line length must be multiple of 5 plus 2.
+                */
+               if ((llen < 7) || (llen-2) % 5)
+                       goto corrupt;
+               max_byte_length = (llen - 2) / 5 * 4;
+               byte_length = *buffer;
+               if ('A' <= byte_length && byte_length <= 'Z')
+                       byte_length = byte_length - 'A' + 1;
+               else if ('a' <= byte_length && byte_length <= 'z')
+                       byte_length = byte_length - 'a' + 27;
+               else
+                       goto corrupt;
+               /* if the input length was not multiple of 4, we would
+                * have filler at the end but the filler should never
+                * exceed 3 bytes
+                */
+               if (max_byte_length < byte_length ||
+                   byte_length <= max_byte_length - 4)
+                       goto corrupt;
+               newsize = hunk_size + byte_length;
+               data = xrealloc(data, newsize);
+               if (decode_85(data + hunk_size, buffer + 1, byte_length))
+                       goto corrupt;
+               hunk_size = newsize;
+               buffer += llen;
+               size -= llen;
+       }
+
+       frag = xcalloc(1, sizeof(*frag));
+       frag->patch = inflate_it(data, hunk_size, origlen);
+       frag->free_patch = 1;
+       if (!frag->patch)
+               goto corrupt;
+       free(data);
+       frag->size = origlen;
+       *buf_p = buffer;
+       *sz_p = size;
+       *used_p = used;
+       frag->binary_patch_method = patch_method;
+       return frag;
+
+ corrupt:
+       free(data);
+       *status_p = -1;
+       error(_("corrupt binary patch at line %d: %.*s"),
+             state->linenr-1, llen-1, buffer);
+       return NULL;
+}
+
+/*
+ * Returns:
+ *   -1 in case of error,
+ *   the length of the parsed binary patch otherwise
+ */
+static int parse_binary(struct apply_state *state,
+                       char *buffer,
+                       unsigned long size,
+                       struct patch *patch)
+{
+       /*
+        * We have read "GIT binary patch\n"; what follows is a line
+        * that says the patch method (currently, either "literal" or
+        * "delta") and the length of data before deflating; a
+        * sequence of 'length-byte' followed by base-85 encoded data
+        * follows.
+        *
+        * When a binary patch is reversible, there is another binary
+        * hunk in the same format, starting with patch method (either
+        * "literal" or "delta") with the length of data, and a sequence
+        * of length-byte + base-85 encoded data, terminated with another
+        * empty line.  This data, when applied to the postimage, produces
+        * the preimage.
+        */
+       struct fragment *forward;
+       struct fragment *reverse;
+       int status;
+       int used, used_1;
+
+       forward = parse_binary_hunk(state, &buffer, &size, &status, &used);
+       if (!forward && !status)
+               /* there has to be one hunk (forward hunk) */
+               return error(_("unrecognized binary patch at line %d"), state->linenr-1);
+       if (status)
+               /* otherwise we already gave an error message */
+               return status;
+
+       reverse = parse_binary_hunk(state, &buffer, &size, &status, &used_1);
+       if (reverse)
+               used += used_1;
+       else if (status) {
+               /*
+                * Not having reverse hunk is not an error, but having
+                * a corrupt reverse hunk is.
+                */
+               free((void*) forward->patch);
+               free(forward);
+               return status;
+       }
+       forward->next = reverse;
+       patch->fragments = forward;
+       patch->is_binary = 1;
+       return used;
+}
+
+static void prefix_one(struct apply_state *state, char **name)
+{
+       char *old_name = *name;
+       if (!old_name)
+               return;
+       *name = prefix_filename(state->prefix, *name);
+       free(old_name);
+}
+
+static void prefix_patch(struct apply_state *state, struct patch *p)
+{
+       if (!state->prefix || p->is_toplevel_relative)
+               return;
+       prefix_one(state, &p->new_name);
+       prefix_one(state, &p->old_name);
+}
+
+/*
+ * include/exclude
+ */
+
+static void add_name_limit(struct apply_state *state,
+                          const char *name,
+                          int exclude)
+{
+       struct string_list_item *it;
+
+       it = string_list_append(&state->limit_by_name, name);
+       it->util = exclude ? NULL : (void *) 1;
+}
+
+static int use_patch(struct apply_state *state, struct patch *p)
+{
+       const char *pathname = p->new_name ? p->new_name : p->old_name;
+       int i;
+
+       /* Paths outside are not touched regardless of "--include" */
+       if (0 < state->prefix_length) {
+               int pathlen = strlen(pathname);
+               if (pathlen <= state->prefix_length ||
+                   memcmp(state->prefix, pathname, state->prefix_length))
+                       return 0;
+       }
+
+       /* See if it matches any of exclude/include rule */
+       for (i = 0; i < state->limit_by_name.nr; i++) {
+               struct string_list_item *it = &state->limit_by_name.items[i];
+               if (!wildmatch(it->string, pathname, 0, NULL))
+                       return (it->util != NULL);
+       }
+
+       /*
+        * If we had any include, a path that does not match any rule is
+        * not used.  Otherwise, we saw bunch of exclude rules (or none)
+        * and such a path is used.
+        */
+       return !state->has_include;
+}
+
+/*
+ * Read the patch text in "buffer" that extends for "size" bytes; stop
+ * reading after seeing a single patch (i.e. changes to a single file).
+ * Create fragments (i.e. patch hunks) and hang them to the given patch.
+ *
+ * Returns:
+ *   -1 if no header was found or parse_binary() failed,
+ *   -128 on another error,
+ *   the number of bytes consumed otherwise,
+ *     so that the caller can call us again for the next patch.
+ */
+static int parse_chunk(struct apply_state *state, char *buffer, unsigned long size, struct patch *patch)
+{
+       int hdrsize, patchsize;
+       int offset = find_header(state, buffer, size, &hdrsize, patch);
+
+       if (offset < 0)
+               return offset;
+
+       prefix_patch(state, patch);
+
+       if (!use_patch(state, patch))
+               patch->ws_rule = 0;
+       else
+               patch->ws_rule = whitespace_rule(patch->new_name
+                                                ? patch->new_name
+                                                : patch->old_name);
+
+       patchsize = parse_single_patch(state,
+                                      buffer + offset + hdrsize,
+                                      size - offset - hdrsize,
+                                      patch);
+
+       if (patchsize < 0)
+               return -128;
+
+       if (!patchsize) {
+               static const char git_binary[] = "GIT binary patch\n";
+               int hd = hdrsize + offset;
+               unsigned long llen = linelen(buffer + hd, size - hd);
+
+               if (llen == sizeof(git_binary) - 1 &&
+                   !memcmp(git_binary, buffer + hd, llen)) {
+                       int used;
+                       state->linenr++;
+                       used = parse_binary(state, buffer + hd + llen,
+                                           size - hd - llen, patch);
+                       if (used < 0)
+                               return -1;
+                       if (used)
+                               patchsize = used + llen;
+                       else
+                               patchsize = 0;
+               }
+               else if (!memcmp(" differ\n", buffer + hd + llen - 8, 8)) {
+                       static const char *binhdr[] = {
+                               "Binary files ",
+                               "Files ",
+                               NULL,
+                       };
+                       int i;
+                       for (i = 0; binhdr[i]; i++) {
+                               int len = strlen(binhdr[i]);
+                               if (len < size - hd &&
+                                   !memcmp(binhdr[i], buffer + hd, len)) {
+                                       state->linenr++;
+                                       patch->is_binary = 1;
+                                       patchsize = llen;
+                                       break;
+                               }
+                       }
+               }
+
+               /* Empty patch cannot be applied if it is a text patch
+                * without metadata change.  A binary patch appears
+                * empty to us here.
+                */
+               if ((state->apply || state->check) &&
+                   (!patch->is_binary && !metadata_changes(patch))) {
+                       error(_("patch with only garbage at line %d"), state->linenr);
+                       return -128;
+               }
+       }
+
+       return offset + hdrsize + patchsize;
+}
+
+static void reverse_patches(struct patch *p)
+{
+       for (; p; p = p->next) {
+               struct fragment *frag = p->fragments;
+
+               SWAP(p->new_name, p->old_name);
+               SWAP(p->new_mode, p->old_mode);
+               SWAP(p->is_new, p->is_delete);
+               SWAP(p->lines_added, p->lines_deleted);
+               SWAP(p->old_sha1_prefix, p->new_sha1_prefix);
+
+               for (; frag; frag = frag->next) {
+                       SWAP(frag->newpos, frag->oldpos);
+                       SWAP(frag->newlines, frag->oldlines);
+               }
+       }
+}
+
+static const char pluses[] =
+"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";
+static const char minuses[]=
+"----------------------------------------------------------------------";
+
+static void show_stats(struct apply_state *state, struct patch *patch)
+{
+       struct strbuf qname = STRBUF_INIT;
+       char *cp = patch->new_name ? patch->new_name : patch->old_name;
+       int max, add, del;
+
+       quote_c_style(cp, &qname, NULL, 0);
+
+       /*
+        * "scale" the filename
+        */
+       max = state->max_len;
+       if (max > 50)
+               max = 50;
+
+       if (qname.len > max) {
+               cp = strchr(qname.buf + qname.len + 3 - max, '/');
+               if (!cp)
+                       cp = qname.buf + qname.len + 3 - max;
+               strbuf_splice(&qname, 0, cp - qname.buf, "...", 3);
+       }
+
+       if (patch->is_binary) {
+               printf(" %-*s |  Bin\n", max, qname.buf);
+               strbuf_release(&qname);
+               return;
+       }
+
+       printf(" %-*s |", max, qname.buf);
+       strbuf_release(&qname);
+
+       /*
+        * scale the add/delete
+        */
+       max = max + state->max_change > 70 ? 70 - max : state->max_change;
+       add = patch->lines_added;
+       del = patch->lines_deleted;
+
+       if (state->max_change > 0) {
+               int total = ((add + del) * max + state->max_change / 2) / state->max_change;
+               add = (add * max + state->max_change / 2) / state->max_change;
+               del = total - add;
+       }
+       printf("%5d %.*s%.*s\n", patch->lines_added + patch->lines_deleted,
+               add, pluses, del, minuses);
+}
+
+static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)
+{
+       switch (st->st_mode & S_IFMT) {
+       case S_IFLNK:
+               if (strbuf_readlink(buf, path, st->st_size) < 0)
+                       return error(_("unable to read symlink %s"), path);
+               return 0;
+       case S_IFREG:
+               if (strbuf_read_file(buf, path, st->st_size) != st->st_size)
+                       return error(_("unable to open or read %s"), path);
+               convert_to_git(path, buf->buf, buf->len, buf, 0);
+               return 0;
+       default:
+               return -1;
+       }
+}
+
+/*
+ * Update the preimage, and the common lines in postimage,
+ * from buffer buf of length len. If postlen is 0 the postimage
+ * is updated in place, otherwise it's updated on a new buffer
+ * of length postlen
+ */
+
+static void update_pre_post_images(struct image *preimage,
+                                  struct image *postimage,
+                                  char *buf,
+                                  size_t len, size_t postlen)
+{
+       int i, ctx, reduced;
+       char *new, *old, *fixed;
+       struct image fixed_preimage;
+
+       /*
+        * Update the preimage with whitespace fixes.  Note that we
+        * are not losing preimage->buf -- apply_one_fragment() will
+        * free "oldlines".
+        */
+       prepare_image(&fixed_preimage, buf, len, 1);
+       assert(postlen
+              ? fixed_preimage.nr == preimage->nr
+              : fixed_preimage.nr <= preimage->nr);
+       for (i = 0; i < fixed_preimage.nr; i++)
+               fixed_preimage.line[i].flag = preimage->line[i].flag;
+       free(preimage->line_allocated);
+       *preimage = fixed_preimage;
+
+       /*
+        * Adjust the common context lines in postimage. This can be
+        * done in-place when we are shrinking it with whitespace
+        * fixing, but needs a new buffer when ignoring whitespace or
+        * expanding leading tabs to spaces.
+        *
+        * We trust the caller to tell us if the update can be done
+        * in place (postlen==0) or not.
+        */
+       old = postimage->buf;
+       if (postlen)
+               new = postimage->buf = xmalloc(postlen);
+       else
+               new = old;
+       fixed = preimage->buf;
+
+       for (i = reduced = ctx = 0; i < postimage->nr; i++) {
+               size_t l_len = postimage->line[i].len;
+               if (!(postimage->line[i].flag & LINE_COMMON)) {
+                       /* an added line -- no counterparts in preimage */
+                       memmove(new, old, l_len);
+                       old += l_len;
+                       new += l_len;
+                       continue;
+               }
+
+               /* a common context -- skip it in the original postimage */
+               old += l_len;
+
+               /* and find the corresponding one in the fixed preimage */
+               while (ctx < preimage->nr &&
+                      !(preimage->line[ctx].flag & LINE_COMMON)) {
+                       fixed += preimage->line[ctx].len;
+                       ctx++;
+               }
+
+               /*
+                * preimage is expected to run out, if the caller
+                * fixed addition of trailing blank lines.
+                */
+               if (preimage->nr <= ctx) {
+                       reduced++;
+                       continue;
+               }
+
+               /* and copy it in, while fixing the line length */
+               l_len = preimage->line[ctx].len;
+               memcpy(new, fixed, l_len);
+               new += l_len;
+               fixed += l_len;
+               postimage->line[i].len = l_len;
+               ctx++;
+       }
+
+       if (postlen
+           ? postlen < new - postimage->buf
+           : postimage->len < new - postimage->buf)
+               die("BUG: caller miscounted postlen: asked %d, orig = %d, used = %d",
+                   (int)postlen, (int) postimage->len, (int)(new - postimage->buf));
+
+       /* Fix the length of the whole thing */
+       postimage->len = new - postimage->buf;
+       postimage->nr -= reduced;
+}
+
+static int line_by_line_fuzzy_match(struct image *img,
+                                   struct image *preimage,
+                                   struct image *postimage,
+                                   unsigned long try,
+                                   int try_lno,
+                                   int preimage_limit)
+{
+       int i;
+       size_t imgoff = 0;
+       size_t preoff = 0;
+       size_t postlen = postimage->len;
+       size_t extra_chars;
+       char *buf;
+       char *preimage_eof;
+       char *preimage_end;
+       struct strbuf fixed;
+       char *fixed_buf;
+       size_t fixed_len;
+
+       for (i = 0; i < preimage_limit; i++) {
+               size_t prelen = preimage->line[i].len;
+               size_t imglen = img->line[try_lno+i].len;
+
+               if (!fuzzy_matchlines(img->buf + try + imgoff, imglen,
+                                     preimage->buf + preoff, prelen))
+                       return 0;
+               if (preimage->line[i].flag & LINE_COMMON)
+                       postlen += imglen - prelen;
+               imgoff += imglen;
+               preoff += prelen;
+       }
+
+       /*
+        * Ok, the preimage matches with whitespace fuzz.
+        *
+        * imgoff now holds the true length of the target that
+        * matches the preimage before the end of the file.
+        *
+        * Count the number of characters in the preimage that fall
+        * beyond the end of the file and make sure that all of them
+        * are whitespace characters. (This can only happen if
+        * we are removing blank lines at the end of the file.)
+        */
+       buf = preimage_eof = preimage->buf + preoff;
+       for ( ; i < preimage->nr; i++)
+               preoff += preimage->line[i].len;
+       preimage_end = preimage->buf + preoff;
+       for ( ; buf < preimage_end; buf++)
+               if (!isspace(*buf))
+                       return 0;
+
+       /*
+        * Update the preimage and the common postimage context
+        * lines to use the same whitespace as the target.
+        * If whitespace is missing in the target (i.e.
+        * if the preimage extends beyond the end of the file),
+        * use the whitespace from the preimage.
+        */
+       extra_chars = preimage_end - preimage_eof;
+       strbuf_init(&fixed, imgoff + extra_chars);
+       strbuf_add(&fixed, img->buf + try, imgoff);
+       strbuf_add(&fixed, preimage_eof, extra_chars);
+       fixed_buf = strbuf_detach(&fixed, &fixed_len);
+       update_pre_post_images(preimage, postimage,
+                              fixed_buf, fixed_len, postlen);
+       return 1;
+}
+
+static int match_fragment(struct apply_state *state,
+                         struct image *img,
+                         struct image *preimage,
+                         struct image *postimage,
+                         unsigned long try,
+                         int try_lno,
+                         unsigned ws_rule,
+                         int match_beginning, int match_end)
+{
+       int i;
+       char *fixed_buf, *buf, *orig, *target;
+       struct strbuf fixed;
+       size_t fixed_len, postlen;
+       int preimage_limit;
+
+       if (preimage->nr + try_lno <= img->nr) {
+               /*
+                * The hunk falls within the boundaries of img.
+                */
+               preimage_limit = preimage->nr;
+               if (match_end && (preimage->nr + try_lno != img->nr))
+                       return 0;
+       } else if (state->ws_error_action == correct_ws_error &&
+                  (ws_rule & WS_BLANK_AT_EOF)) {
+               /*
+                * This hunk extends beyond the end of img, and we are
+                * removing blank lines at the end of the file.  This
+                * many lines from the beginning of the preimage must
+                * match with img, and the remainder of the preimage
+                * must be blank.
+                */
+               preimage_limit = img->nr - try_lno;
+       } else {
+               /*
+                * The hunk extends beyond the end of the img and
+                * we are not removing blanks at the end, so we
+                * should reject the hunk at this position.
+                */
+               return 0;
+       }
+
+       if (match_beginning && try_lno)
+               return 0;
+
+       /* Quick hash check */
+       for (i = 0; i < preimage_limit; i++)
+               if ((img->line[try_lno + i].flag & LINE_PATCHED) ||
+                   (preimage->line[i].hash != img->line[try_lno + i].hash))
+                       return 0;
+
+       if (preimage_limit == preimage->nr) {
+               /*
+                * Do we have an exact match?  If we were told to match
+                * at the end, size must be exactly at try+fragsize,
+                * otherwise try+fragsize must be still within the preimage,
+                * and either case, the old piece should match the preimage
+                * exactly.
+                */
+               if ((match_end
+                    ? (try + preimage->len == img->len)
+                    : (try + preimage->len <= img->len)) &&
+                   !memcmp(img->buf + try, preimage->buf, preimage->len))
+                       return 1;
+       } else {
+               /*
+                * The preimage extends beyond the end of img, so
+                * there cannot be an exact match.
+                *
+                * There must be one non-blank context line that match
+                * a line before the end of img.
+                */
+               char *buf_end;
+
+               buf = preimage->buf;
+               buf_end = buf;
+               for (i = 0; i < preimage_limit; i++)
+                       buf_end += preimage->line[i].len;
+
+               for ( ; buf < buf_end; buf++)
+                       if (!isspace(*buf))
+                               break;
+               if (buf == buf_end)
+                       return 0;
+       }
+
+       /*
+        * No exact match. If we are ignoring whitespace, run a line-by-line
+        * fuzzy matching. We collect all the line length information because
+        * we need it to adjust whitespace if we match.
+        */
+       if (state->ws_ignore_action == ignore_ws_change)
+               return line_by_line_fuzzy_match(img, preimage, postimage,
+                                               try, try_lno, preimage_limit);
+
+       if (state->ws_error_action != correct_ws_error)
+               return 0;
+
+       /*
+        * The hunk does not apply byte-by-byte, but the hash says
+        * it might with whitespace fuzz. We weren't asked to
+        * ignore whitespace, we were asked to correct whitespace
+        * errors, so let's try matching after whitespace correction.
+        *
+        * While checking the preimage against the target, whitespace
+        * errors in both fixed, we count how large the corresponding
+        * postimage needs to be.  The postimage prepared by
+        * apply_one_fragment() has whitespace errors fixed on added
+        * lines already, but the common lines were propagated as-is,
+        * which may become longer when their whitespace errors are
+        * fixed.
+        */
+
+       /* First count added lines in postimage */
+       postlen = 0;
+       for (i = 0; i < postimage->nr; i++) {
+               if (!(postimage->line[i].flag & LINE_COMMON))
+                       postlen += postimage->line[i].len;
+       }
+
+       /*
+        * The preimage may extend beyond the end of the file,
+        * but in this loop we will only handle the part of the
+        * preimage that falls within the file.
+        */
+       strbuf_init(&fixed, preimage->len + 1);
+       orig = preimage->buf;
+       target = img->buf + try;
+       for (i = 0; i < preimage_limit; i++) {
+               size_t oldlen = preimage->line[i].len;
+               size_t tgtlen = img->line[try_lno + i].len;
+               size_t fixstart = fixed.len;
+               struct strbuf tgtfix;
+               int match;
+
+               /* Try fixing the line in the preimage */
+               ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
+
+               /* Try fixing the line in the target */
+               strbuf_init(&tgtfix, tgtlen);
+               ws_fix_copy(&tgtfix, target, tgtlen, ws_rule, NULL);
+
+               /*
+                * If they match, either the preimage was based on
+                * a version before our tree fixed whitespace breakage,
+                * or we are lacking a whitespace-fix patch the tree
+                * the preimage was based on already had (i.e. target
+                * has whitespace breakage, the preimage doesn't).
+                * In either case, we are fixing the whitespace breakages
+                * so we might as well take the fix together with their
+                * real change.
+                */
+               match = (tgtfix.len == fixed.len - fixstart &&
+                        !memcmp(tgtfix.buf, fixed.buf + fixstart,
+                                            fixed.len - fixstart));
+
+               /* Add the length if this is common with the postimage */
+               if (preimage->line[i].flag & LINE_COMMON)
+                       postlen += tgtfix.len;
+
+               strbuf_release(&tgtfix);
+               if (!match)
+                       goto unmatch_exit;
+
+               orig += oldlen;
+               target += tgtlen;
+       }
+
+
+       /*
+        * Now handle the lines in the preimage that falls beyond the
+        * end of the file (if any). They will only match if they are
+        * empty or only contain whitespace (if WS_BLANK_AT_EOL is
+        * false).
+        */
+       for ( ; i < preimage->nr; i++) {
+               size_t fixstart = fixed.len; /* start of the fixed preimage */
+               size_t oldlen = preimage->line[i].len;
+               int j;
+
+               /* Try fixing the line in the preimage */
+               ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
+
+               for (j = fixstart; j < fixed.len; j++)
+                       if (!isspace(fixed.buf[j]))
+                               goto unmatch_exit;
+
+               orig += oldlen;
+       }
+
+       /*
+        * Yes, the preimage is based on an older version that still
+        * has whitespace breakages unfixed, and fixing them makes the
+        * hunk match.  Update the context lines in the postimage.
+        */
+       fixed_buf = strbuf_detach(&fixed, &fixed_len);
+       if (postlen < postimage->len)
+               postlen = 0;
+       update_pre_post_images(preimage, postimage,
+                              fixed_buf, fixed_len, postlen);
+       return 1;
+
+ unmatch_exit:
+       strbuf_release(&fixed);
+       return 0;
+}
+
+static int find_pos(struct apply_state *state,
+                   struct image *img,
+                   struct image *preimage,
+                   struct image *postimage,
+                   int line,
+                   unsigned ws_rule,
+                   int match_beginning, int match_end)
+{
+       int i;
+       unsigned long backwards, forwards, try;
+       int backwards_lno, forwards_lno, try_lno;
+
+       /*
+        * If match_beginning or match_end is specified, there is no
+        * point starting from a wrong line that will never match and
+        * wander around and wait for a match at the specified end.
+        */
+       if (match_beginning)
+               line = 0;
+       else if (match_end)
+               line = img->nr - preimage->nr;
+
+       /*
+        * Because the comparison is unsigned, the following test
+        * will also take care of a negative line number that can
+        * result when match_end and preimage is larger than the target.
+        */
+       if ((size_t) line > img->nr)
+               line = img->nr;
+
+       try = 0;
+       for (i = 0; i < line; i++)
+               try += img->line[i].len;
+
+       /*
+        * There's probably some smart way to do this, but I'll leave
+        * that to the smart and beautiful people. I'm simple and stupid.
+        */
+       backwards = try;
+       backwards_lno = line;
+       forwards = try;
+       forwards_lno = line;
+       try_lno = line;
+
+       for (i = 0; ; i++) {
+               if (match_fragment(state, img, preimage, postimage,
+                                  try, try_lno, ws_rule,
+                                  match_beginning, match_end))
+                       return try_lno;
+
+       again:
+               if (backwards_lno == 0 && forwards_lno == img->nr)
+                       break;
+
+               if (i & 1) {
+                       if (backwards_lno == 0) {
+                               i++;
+                               goto again;
+                       }
+                       backwards_lno--;
+                       backwards -= img->line[backwards_lno].len;
+                       try = backwards;
+                       try_lno = backwards_lno;
+               } else {
+                       if (forwards_lno == img->nr) {
+                               i++;
+                               goto again;
+                       }
+                       forwards += img->line[forwards_lno].len;
+                       forwards_lno++;
+                       try = forwards;
+                       try_lno = forwards_lno;
+               }
+
+       }
+       return -1;
+}
+
+static void remove_first_line(struct image *img)
+{
+       img->buf += img->line[0].len;
+       img->len -= img->line[0].len;
+       img->line++;
+       img->nr--;
+}
+
+static void remove_last_line(struct image *img)
+{
+       img->len -= img->line[--img->nr].len;
+}
+
+/*
+ * The change from "preimage" and "postimage" has been found to
+ * apply at applied_pos (counts in line numbers) in "img".
+ * Update "img" to remove "preimage" and replace it with "postimage".
+ */
+static void update_image(struct apply_state *state,
+                        struct image *img,
+                        int applied_pos,
+                        struct image *preimage,
+                        struct image *postimage)
+{
+       /*
+        * remove the copy of preimage at offset in img
+        * and replace it with postimage
+        */
+       int i, nr;
+       size_t remove_count, insert_count, applied_at = 0;
+       char *result;
+       int preimage_limit;
+
+       /*
+        * If we are removing blank lines at the end of img,
+        * the preimage may extend beyond the end.
+        * If that is the case, we must be careful only to
+        * remove the part of the preimage that falls within
+        * the boundaries of img. Initialize preimage_limit
+        * to the number of lines in the preimage that falls
+        * within the boundaries.
+        */
+       preimage_limit = preimage->nr;
+       if (preimage_limit > img->nr - applied_pos)
+               preimage_limit = img->nr - applied_pos;
+
+       for (i = 0; i < applied_pos; i++)
+               applied_at += img->line[i].len;
+
+       remove_count = 0;
+       for (i = 0; i < preimage_limit; i++)
+               remove_count += img->line[applied_pos + i].len;
+       insert_count = postimage->len;
+
+       /* Adjust the contents */
+       result = xmalloc(st_add3(st_sub(img->len, remove_count), insert_count, 1));
+       memcpy(result, img->buf, applied_at);
+       memcpy(result + applied_at, postimage->buf, postimage->len);
+       memcpy(result + applied_at + postimage->len,
+              img->buf + (applied_at + remove_count),
+              img->len - (applied_at + remove_count));
+       free(img->buf);
+       img->buf = result;
+       img->len += insert_count - remove_count;
+       result[img->len] = '\0';
+
+       /* Adjust the line table */
+       nr = img->nr + postimage->nr - preimage_limit;
+       if (preimage_limit < postimage->nr) {
+               /*
+                * NOTE: this knows that we never call remove_first_line()
+                * on anything other than pre/post image.
+                */
+               REALLOC_ARRAY(img->line, nr);
+               img->line_allocated = img->line;
+       }
+       if (preimage_limit != postimage->nr)
+               memmove(img->line + applied_pos + postimage->nr,
+                       img->line + applied_pos + preimage_limit,
+                       (img->nr - (applied_pos + preimage_limit)) *
+                       sizeof(*img->line));
+       memcpy(img->line + applied_pos,
+              postimage->line,
+              postimage->nr * sizeof(*img->line));
+       if (!state->allow_overlap)
+               for (i = 0; i < postimage->nr; i++)
+                       img->line[applied_pos + i].flag |= LINE_PATCHED;
+       img->nr = nr;
+}
+
+/*
+ * Use the patch-hunk text in "frag" to prepare two images (preimage and
+ * postimage) for the hunk.  Find lines that match "preimage" in "img" and
+ * replace the part of "img" with "postimage" text.
+ */
+static int apply_one_fragment(struct apply_state *state,
+                             struct image *img, struct fragment *frag,
+                             int inaccurate_eof, unsigned ws_rule,
+                             int nth_fragment)
+{
+       int match_beginning, match_end;
+       const char *patch = frag->patch;
+       int size = frag->size;
+       char *old, *oldlines;
+       struct strbuf newlines;
+       int new_blank_lines_at_end = 0;
+       int found_new_blank_lines_at_end = 0;
+       int hunk_linenr = frag->linenr;
+       unsigned long leading, trailing;
+       int pos, applied_pos;
+       struct image preimage;
+       struct image postimage;
+
+       memset(&preimage, 0, sizeof(preimage));
+       memset(&postimage, 0, sizeof(postimage));
+       oldlines = xmalloc(size);
+       strbuf_init(&newlines, size);
+
+       old = oldlines;
+       while (size > 0) {
+               char first;
+               int len = linelen(patch, size);
+               int plen;
+               int added_blank_line = 0;
+               int is_blank_context = 0;
+               size_t start;
+
+               if (!len)
+                       break;
+
+               /*
+                * "plen" is how much of the line we should use for
+                * the actual patch data. Normally we just remove the
+                * first character on the line, but if the line is
+                * followed by "\ No newline", then we also remove the
+                * last one (which is the newline, of course).
+                */
+               plen = len - 1;
+               if (len < size && patch[len] == '\\')
+                       plen--;
+               first = *patch;
+               if (state->apply_in_reverse) {
+                       if (first == '-')
+                               first = '+';
+                       else if (first == '+')
+                               first = '-';
+               }
+
+               switch (first) {
+               case '\n':
+                       /* Newer GNU diff, empty context line */
+                       if (plen < 0)
+                               /* ... followed by '\No newline'; nothing */
+                               break;
+                       *old++ = '\n';
+                       strbuf_addch(&newlines, '\n');
+                       add_line_info(&preimage, "\n", 1, LINE_COMMON);
+                       add_line_info(&postimage, "\n", 1, LINE_COMMON);
+                       is_blank_context = 1;
+                       break;
+               case ' ':
+                       if (plen && (ws_rule & WS_BLANK_AT_EOF) &&
+                           ws_blank_line(patch + 1, plen, ws_rule))
+                               is_blank_context = 1;
+               case '-':
+                       memcpy(old, patch + 1, plen);
+                       add_line_info(&preimage, old, plen,
+                                     (first == ' ' ? LINE_COMMON : 0));
+                       old += plen;
+                       if (first == '-')
+                               break;
+               /* Fall-through for ' ' */
+               case '+':
+                       /* --no-add does not add new lines */
+                       if (first == '+' && state->no_add)
+                               break;
+
+                       start = newlines.len;
+                       if (first != '+' ||
+                           !state->whitespace_error ||
+                           state->ws_error_action != correct_ws_error) {
+                               strbuf_add(&newlines, patch + 1, plen);
+                       }
+                       else {
+                               ws_fix_copy(&newlines, patch + 1, plen, ws_rule, &state->applied_after_fixing_ws);
+                       }
+                       add_line_info(&postimage, newlines.buf + start, newlines.len - start,
+                                     (first == '+' ? 0 : LINE_COMMON));
+                       if (first == '+' &&
+                           (ws_rule & WS_BLANK_AT_EOF) &&
+                           ws_blank_line(patch + 1, plen, ws_rule))
+                               added_blank_line = 1;
+                       break;
+               case '@': case '\\':
+                       /* Ignore it, we already handled it */
+                       break;
+               default:
+                       if (state->apply_verbosity > verbosity_normal)
+                               error(_("invalid start of line: '%c'"), first);
+                       applied_pos = -1;
+                       goto out;
+               }
+               if (added_blank_line) {
+                       if (!new_blank_lines_at_end)
+                               found_new_blank_lines_at_end = hunk_linenr;
+                       new_blank_lines_at_end++;
+               }
+               else if (is_blank_context)
+                       ;
+               else
+                       new_blank_lines_at_end = 0;
+               patch += len;
+               size -= len;
+               hunk_linenr++;
+       }
+       if (inaccurate_eof &&
+           old > oldlines && old[-1] == '\n' &&
+           newlines.len > 0 && newlines.buf[newlines.len - 1] == '\n') {
+               old--;
+               strbuf_setlen(&newlines, newlines.len - 1);
+       }
+
+       leading = frag->leading;
+       trailing = frag->trailing;
+
+       /*
+        * A hunk to change lines at the beginning would begin with
+        * @@ -1,L +N,M @@
+        * but we need to be careful.  -U0 that inserts before the second
+        * line also has this pattern.
+        *
+        * And a hunk to add to an empty file would begin with
+        * @@ -0,0 +N,M @@
+        *
+        * In other words, a hunk that is (frag->oldpos <= 1) with or
+        * without leading context must match at the beginning.
+        */
+       match_beginning = (!frag->oldpos ||
+                          (frag->oldpos == 1 && !state->unidiff_zero));
+
+       /*
+        * A hunk without trailing lines must match at the end.
+        * However, we simply cannot tell if a hunk must match end
+        * from the lack of trailing lines if the patch was generated
+        * with unidiff without any context.
+        */
+       match_end = !state->unidiff_zero && !trailing;
+
+       pos = frag->newpos ? (frag->newpos - 1) : 0;
+       preimage.buf = oldlines;
+       preimage.len = old - oldlines;
+       postimage.buf = newlines.buf;
+       postimage.len = newlines.len;
+       preimage.line = preimage.line_allocated;
+       postimage.line = postimage.line_allocated;
+
+       for (;;) {
+
+               applied_pos = find_pos(state, img, &preimage, &postimage, pos,
+                                      ws_rule, match_beginning, match_end);
+
+               if (applied_pos >= 0)
+                       break;
+
+               /* Am I at my context limits? */
+               if ((leading <= state->p_context) && (trailing <= state->p_context))
+                       break;
+               if (match_beginning || match_end) {
+                       match_beginning = match_end = 0;
+                       continue;
+               }
+
+               /*
+                * Reduce the number of context lines; reduce both
+                * leading and trailing if they are equal otherwise
+                * just reduce the larger context.
+                */
+               if (leading >= trailing) {
+                       remove_first_line(&preimage);
+                       remove_first_line(&postimage);
+                       pos--;
+                       leading--;
+               }
+               if (trailing > leading) {
+                       remove_last_line(&preimage);
+                       remove_last_line(&postimage);
+                       trailing--;
+               }
+       }
+
+       if (applied_pos >= 0) {
+               if (new_blank_lines_at_end &&
+                   preimage.nr + applied_pos >= img->nr &&
+                   (ws_rule & WS_BLANK_AT_EOF) &&
+                   state->ws_error_action != nowarn_ws_error) {
+                       record_ws_error(state, WS_BLANK_AT_EOF, "+", 1,
+                                       found_new_blank_lines_at_end);
+                       if (state->ws_error_action == correct_ws_error) {
+                               while (new_blank_lines_at_end--)
+                                       remove_last_line(&postimage);
+                       }
+                       /*
+                        * We would want to prevent write_out_results()
+                        * from taking place in apply_patch() that follows
+                        * the callchain led us here, which is:
+                        * apply_patch->check_patch_list->check_patch->
+                        * apply_data->apply_fragments->apply_one_fragment
+                        */
+                       if (state->ws_error_action == die_on_ws_error)
+                               state->apply = 0;
+               }
+
+               if (state->apply_verbosity > verbosity_normal && applied_pos != pos) {
+                       int offset = applied_pos - pos;
+                       if (state->apply_in_reverse)
+                               offset = 0 - offset;
+                       fprintf_ln(stderr,
+                                  Q_("Hunk #%d succeeded at %d (offset %d line).",
+                                     "Hunk #%d succeeded at %d (offset %d lines).",
+                                     offset),
+                                  nth_fragment, applied_pos + 1, offset);
+               }
+
+               /*
+                * Warn if it was necessary to reduce the number
+                * of context lines.
+                */
+               if ((leading != frag->leading ||
+                    trailing != frag->trailing) && state->apply_verbosity > verbosity_silent)
+                       fprintf_ln(stderr, _("Context reduced to (%ld/%ld)"
+                                            " to apply fragment at %d"),
+                                  leading, trailing, applied_pos+1);
+               update_image(state, img, applied_pos, &preimage, &postimage);
+       } else {
+               if (state->apply_verbosity > verbosity_normal)
+                       error(_("while searching for:\n%.*s"),
+                             (int)(old - oldlines), oldlines);
+       }
+
+out:
+       free(oldlines);
+       strbuf_release(&newlines);
+       free(preimage.line_allocated);
+       free(postimage.line_allocated);
+
+       return (applied_pos < 0);
+}
+
+static int apply_binary_fragment(struct apply_state *state,
+                                struct image *img,
+                                struct patch *patch)
+{
+       struct fragment *fragment = patch->fragments;
+       unsigned long len;
+       void *dst;
+
+       if (!fragment)
+               return error(_("missing binary patch data for '%s'"),
+                            patch->new_name ?
+                            patch->new_name :
+                            patch->old_name);
+
+       /* Binary patch is irreversible without the optional second hunk */
+       if (state->apply_in_reverse) {
+               if (!fragment->next)
+                       return error(_("cannot reverse-apply a binary patch "
+                                      "without the reverse hunk to '%s'"),
+                                    patch->new_name
+                                    ? patch->new_name : patch->old_name);
+               fragment = fragment->next;
+       }
+       switch (fragment->binary_patch_method) {
+       case BINARY_DELTA_DEFLATED:
+               dst = patch_delta(img->buf, img->len, fragment->patch,
+                                 fragment->size, &len);
+               if (!dst)
+                       return -1;
+               clear_image(img);
+               img->buf = dst;
+               img->len = len;
+               return 0;
+       case BINARY_LITERAL_DEFLATED:
+               clear_image(img);
+               img->len = fragment->size;
+               img->buf = xmemdupz(fragment->patch, img->len);
+               return 0;
+       }
+       return -1;
+}
+
+/*
+ * Replace "img" with the result of applying the binary patch.
+ * The binary patch data itself in patch->fragment is still kept
+ * but the preimage prepared by the caller in "img" is freed here
+ * or in the helper function apply_binary_fragment() this calls.
+ */
+static int apply_binary(struct apply_state *state,
+                       struct image *img,
+                       struct patch *patch)
+{
+       const char *name = patch->old_name ? patch->old_name : patch->new_name;
+       struct object_id oid;
+
+       /*
+        * For safety, we require patch index line to contain
+        * full 40-byte textual SHA1 for old and new, at least for now.
+        */
+       if (strlen(patch->old_sha1_prefix) != 40 ||
+           strlen(patch->new_sha1_prefix) != 40 ||
+           get_oid_hex(patch->old_sha1_prefix, &oid) ||
+           get_oid_hex(patch->new_sha1_prefix, &oid))
+               return error(_("cannot apply binary patch to '%s' "
+                              "without full index line"), name);
+
+       if (patch->old_name) {
+               /*
+                * See if the old one matches what the patch
+                * applies to.
+                */
+               hash_sha1_file(img->buf, img->len, blob_type, oid.hash);
+               if (strcmp(oid_to_hex(&oid), patch->old_sha1_prefix))
+                       return error(_("the patch applies to '%s' (%s), "
+                                      "which does not match the "
+                                      "current contents."),
+                                    name, oid_to_hex(&oid));
+       }
+       else {
+               /* Otherwise, the old one must be empty. */
+               if (img->len)
+                       return error(_("the patch applies to an empty "
+                                      "'%s' but it is not empty"), name);
+       }
+
+       get_oid_hex(patch->new_sha1_prefix, &oid);
+       if (is_null_oid(&oid)) {
+               clear_image(img);
+               return 0; /* deletion patch */
+       }
+
+       if (has_sha1_file(oid.hash)) {
+               /* We already have the postimage */
+               enum object_type type;
+               unsigned long size;
+               char *result;
+
+               result = read_sha1_file(oid.hash, &type, &size);
+               if (!result)
+                       return error(_("the necessary postimage %s for "
+                                      "'%s' cannot be read"),
+                                    patch->new_sha1_prefix, name);
+               clear_image(img);
+               img->buf = result;
+               img->len = size;
+       } else {
+               /*
+                * We have verified buf matches the preimage;
+                * apply the patch data to it, which is stored
+                * in the patch->fragments->{patch,size}.
+                */
+               if (apply_binary_fragment(state, img, patch))
+                       return error(_("binary patch does not apply to '%s'"),
+                                    name);
+
+               /* verify that the result matches */
+               hash_sha1_file(img->buf, img->len, blob_type, oid.hash);
+               if (strcmp(oid_to_hex(&oid), patch->new_sha1_prefix))
+                       return error(_("binary patch to '%s' creates incorrect result (expecting %s, got %s)"),
+                               name, patch->new_sha1_prefix, oid_to_hex(&oid));
+       }
+
+       return 0;
+}
+
+static int apply_fragments(struct apply_state *state, struct image *img, struct patch *patch)
+{
+       struct fragment *frag = patch->fragments;
+       const char *name = patch->old_name ? patch->old_name : patch->new_name;
+       unsigned ws_rule = patch->ws_rule;
+       unsigned inaccurate_eof = patch->inaccurate_eof;
+       int nth = 0;
+
+       if (patch->is_binary)
+               return apply_binary(state, img, patch);
+
+       while (frag) {
+               nth++;
+               if (apply_one_fragment(state, img, frag, inaccurate_eof, ws_rule, nth)) {
+                       error(_("patch failed: %s:%ld"), name, frag->oldpos);
+                       if (!state->apply_with_reject)
+                               return -1;
+                       frag->rejected = 1;
+               }
+               frag = frag->next;
+       }
+       return 0;
+}
+
+static int read_blob_object(struct strbuf *buf, const struct object_id *oid, unsigned mode)
+{
+       if (S_ISGITLINK(mode)) {
+               strbuf_grow(buf, 100);
+               strbuf_addf(buf, "Subproject commit %s\n", oid_to_hex(oid));
+       } else {
+               enum object_type type;
+               unsigned long sz;
+               char *result;
+
+               result = read_sha1_file(oid->hash, &type, &sz);
+               if (!result)
+                       return -1;
+               /* XXX read_sha1_file NUL-terminates */
+               strbuf_attach(buf, result, sz, sz + 1);
+       }
+       return 0;
+}
+
+static int read_file_or_gitlink(const struct cache_entry *ce, struct strbuf *buf)
+{
+       if (!ce)
+               return 0;
+       return read_blob_object(buf, &ce->oid, ce->ce_mode);
+}
+
+static struct patch *in_fn_table(struct apply_state *state, const char *name)
+{
+       struct string_list_item *item;
+
+       if (name == NULL)
+               return NULL;
+
+       item = string_list_lookup(&state->fn_table, name);
+       if (item != NULL)
+               return (struct patch *)item->util;
+
+       return NULL;
+}
+
+/*
+ * item->util in the filename table records the status of the path.
+ * Usually it points at a patch (whose result records the contents
+ * of it after applying it), but it could be PATH_WAS_DELETED for a
+ * path that a previously applied patch has already removed, or
+ * PATH_TO_BE_DELETED for a path that a later patch would remove.
+ *
+ * The latter is needed to deal with a case where two paths A and B
+ * are swapped by first renaming A to B and then renaming B to A;
+ * moving A to B should not be prevented due to presence of B as we
+ * will remove it in a later patch.
+ */
+#define PATH_TO_BE_DELETED ((struct patch *) -2)
+#define PATH_WAS_DELETED ((struct patch *) -1)
+
+static int to_be_deleted(struct patch *patch)
+{
+       return patch == PATH_TO_BE_DELETED;
+}
+
+static int was_deleted(struct patch *patch)
+{
+       return patch == PATH_WAS_DELETED;
+}
+
+static void add_to_fn_table(struct apply_state *state, struct patch *patch)
+{
+       struct string_list_item *item;
+
+       /*
+        * Always add new_name unless patch is a deletion
+        * This should cover the cases for normal diffs,
+        * file creations and copies
+        */
+       if (patch->new_name != NULL) {
+               item = string_list_insert(&state->fn_table, patch->new_name);
+               item->util = patch;
+       }
+
+       /*
+        * store a failure on rename/deletion cases because
+        * later chunks shouldn't patch old names
+        */
+       if ((patch->new_name == NULL) || (patch->is_rename)) {
+               item = string_list_insert(&state->fn_table, patch->old_name);
+               item->util = PATH_WAS_DELETED;
+       }
+}
+
+static void prepare_fn_table(struct apply_state *state, struct patch *patch)
+{
+       /*
+        * store information about incoming file deletion
+        */
+       while (patch) {
+               if ((patch->new_name == NULL) || (patch->is_rename)) {
+                       struct string_list_item *item;
+                       item = string_list_insert(&state->fn_table, patch->old_name);
+                       item->util = PATH_TO_BE_DELETED;
+               }
+               patch = patch->next;
+       }
+}
+
+static int checkout_target(struct index_state *istate,
+                          struct cache_entry *ce, struct stat *st)
+{
+       struct checkout costate = CHECKOUT_INIT;
+
+       costate.refresh_cache = 1;
+       costate.istate = istate;
+       if (checkout_entry(ce, &costate, NULL) || lstat(ce->name, st))
+               return error(_("cannot checkout %s"), ce->name);
+       return 0;
+}
+
+static struct patch *previous_patch(struct apply_state *state,
+                                   struct patch *patch,
+                                   int *gone)
+{
+       struct patch *previous;
+
+       *gone = 0;
+       if (patch->is_copy || patch->is_rename)
+               return NULL; /* "git" patches do not depend on the order */
+
+       previous = in_fn_table(state, patch->old_name);
+       if (!previous)
+               return NULL;
+
+       if (to_be_deleted(previous))
+               return NULL; /* the deletion hasn't happened yet */
+
+       if (was_deleted(previous))
+               *gone = 1;
+
+       return previous;
+}
+
+static int verify_index_match(const struct cache_entry *ce, struct stat *st)
+{
+       if (S_ISGITLINK(ce->ce_mode)) {
+               if (!S_ISDIR(st->st_mode))
+                       return -1;
+               return 0;
+       }
+       return ce_match_stat(ce, st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
+}
+
+#define SUBMODULE_PATCH_WITHOUT_INDEX 1
+
+static int load_patch_target(struct apply_state *state,
+                            struct strbuf *buf,
+                            const struct cache_entry *ce,
+                            struct stat *st,
+                            const char *name,
+                            unsigned expected_mode)
+{
+       if (state->cached || state->check_index) {
+               if (read_file_or_gitlink(ce, buf))
+                       return error(_("failed to read %s"), name);
+       } else if (name) {
+               if (S_ISGITLINK(expected_mode)) {
+                       if (ce)
+                               return read_file_or_gitlink(ce, buf);
+                       else
+                               return SUBMODULE_PATCH_WITHOUT_INDEX;
+               } else if (has_symlink_leading_path(name, strlen(name))) {
+                       return error(_("reading from '%s' beyond a symbolic link"), name);
+               } else {
+                       if (read_old_data(st, name, buf))
+                               return error(_("failed to read %s"), name);
+               }
+       }
+       return 0;
+}
+
+/*
+ * We are about to apply "patch"; populate the "image" with the
+ * current version we have, from the working tree or from the index,
+ * depending on the situation e.g. --cached/--index.  If we are
+ * applying a non-git patch that incrementally updates the tree,
+ * we read from the result of a previous diff.
+ */
+static int load_preimage(struct apply_state *state,
+                        struct image *image,
+                        struct patch *patch, struct stat *st,
+                        const struct cache_entry *ce)
+{
+       struct strbuf buf = STRBUF_INIT;
+       size_t len;
+       char *img;
+       struct patch *previous;
+       int status;
+
+       previous = previous_patch(state, patch, &status);
+       if (status)
+               return error(_("path %s has been renamed/deleted"),
+                            patch->old_name);
+       if (previous) {
+               /* We have a patched copy in memory; use that. */
+               strbuf_add(&buf, previous->result, previous->resultsize);
+       } else {
+               status = load_patch_target(state, &buf, ce, st,
+                                          patch->old_name, patch->old_mode);
+               if (status < 0)
+                       return status;
+               else if (status == SUBMODULE_PATCH_WITHOUT_INDEX) {
+                       /*
+                        * There is no way to apply subproject
+                        * patch without looking at the index.
+                        * NEEDSWORK: shouldn't this be flagged
+                        * as an error???
+                        */
+                       free_fragment_list(patch->fragments);
+                       patch->fragments = NULL;
+               } else if (status) {
+                       return error(_("failed to read %s"), patch->old_name);
+               }
+       }
+
+       img = strbuf_detach(&buf, &len);
+       prepare_image(image, img, len, !patch->is_binary);
+       return 0;
+}
+
+static int three_way_merge(struct image *image,
+                          char *path,
+                          const struct object_id *base,
+                          const struct object_id *ours,
+                          const struct object_id *theirs)
+{
+       mmfile_t base_file, our_file, their_file;
+       mmbuffer_t result = { NULL };
+       int status;
+
+       read_mmblob(&base_file, base);
+       read_mmblob(&our_file, ours);
+       read_mmblob(&their_file, theirs);
+       status = ll_merge(&result, path,
+                         &base_file, "base",
+                         &our_file, "ours",
+                         &their_file, "theirs", NULL);
+       free(base_file.ptr);
+       free(our_file.ptr);
+       free(their_file.ptr);
+       if (status < 0 || !result.ptr) {
+               free(result.ptr);
+               return -1;
+       }
+       clear_image(image);
+       image->buf = result.ptr;
+       image->len = result.size;
+
+       return status;
+}
+
+/*
+ * When directly falling back to add/add three-way merge, we read from
+ * the current contents of the new_name.  In no cases other than that
+ * this function will be called.
+ */
+static int load_current(struct apply_state *state,
+                       struct image *image,
+                       struct patch *patch)
+{
+       struct strbuf buf = STRBUF_INIT;
+       int status, pos;
+       size_t len;
+       char *img;
+       struct stat st;
+       struct cache_entry *ce;
+       char *name = patch->new_name;
+       unsigned mode = patch->new_mode;
+
+       if (!patch->is_new)
+               die("BUG: patch to %s is not a creation", patch->old_name);
+
+       pos = cache_name_pos(name, strlen(name));
+       if (pos < 0)
+               return error(_("%s: does not exist in index"), name);
+       ce = active_cache[pos];
+       if (lstat(name, &st)) {
+               if (errno != ENOENT)
+                       return error_errno("%s", name);
+               if (checkout_target(&the_index, ce, &st))
+                       return -1;
+       }
+       if (verify_index_match(ce, &st))
+               return error(_("%s: does not match index"), name);
+
+       status = load_patch_target(state, &buf, ce, &st, name, mode);
+       if (status < 0)
+               return status;
+       else if (status)
+               return -1;
+       img = strbuf_detach(&buf, &len);
+       prepare_image(image, img, len, !patch->is_binary);
+       return 0;
+}
+
+static int try_threeway(struct apply_state *state,
+                       struct image *image,
+                       struct patch *patch,
+                       struct stat *st,
+                       const struct cache_entry *ce)
+{
+       struct object_id pre_oid, post_oid, our_oid;
+       struct strbuf buf = STRBUF_INIT;
+       size_t len;
+       int status;
+       char *img;
+       struct image tmp_image;
+
+       /* No point falling back to 3-way merge in these cases */
+       if (patch->is_delete ||
+           S_ISGITLINK(patch->old_mode) || S_ISGITLINK(patch->new_mode))
+               return -1;
+
+       /* Preimage the patch was prepared for */
+       if (patch->is_new)
+               write_sha1_file("", 0, blob_type, pre_oid.hash);
+       else if (get_sha1(patch->old_sha1_prefix, pre_oid.hash) ||
+                read_blob_object(&buf, &pre_oid, patch->old_mode))
+               return error(_("repository lacks the necessary blob to fall back on 3-way merge."));
+
+       if (state->apply_verbosity > verbosity_silent)
+               fprintf(stderr, _("Falling back to three-way merge...\n"));
+
+       img = strbuf_detach(&buf, &len);
+       prepare_image(&tmp_image, img, len, 1);
+       /* Apply the patch to get the post image */
+       if (apply_fragments(state, &tmp_image, patch) < 0) {
+               clear_image(&tmp_image);
+               return -1;
+       }
+       /* post_oid is theirs */
+       write_sha1_file(tmp_image.buf, tmp_image.len, blob_type, post_oid.hash);
+       clear_image(&tmp_image);
+
+       /* our_oid is ours */
+       if (patch->is_new) {
+               if (load_current(state, &tmp_image, patch))
+                       return error(_("cannot read the current contents of '%s'"),
+                                    patch->new_name);
+       } else {
+               if (load_preimage(state, &tmp_image, patch, st, ce))
+                       return error(_("cannot read the current contents of '%s'"),
+                                    patch->old_name);
+       }
+       write_sha1_file(tmp_image.buf, tmp_image.len, blob_type, our_oid.hash);
+       clear_image(&tmp_image);
+
+       /* in-core three-way merge between post and our using pre as base */
+       status = three_way_merge(image, patch->new_name,
+                                &pre_oid, &our_oid, &post_oid);
+       if (status < 0) {
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf(stderr,
+                               _("Failed to fall back on three-way merge...\n"));
+               return status;
+       }
+
+       if (status) {
+               patch->conflicted_threeway = 1;
+               if (patch->is_new)
+                       oidclr(&patch->threeway_stage[0]);
+               else
+                       oidcpy(&patch->threeway_stage[0], &pre_oid);
+               oidcpy(&patch->threeway_stage[1], &our_oid);
+               oidcpy(&patch->threeway_stage[2], &post_oid);
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf(stderr,
+                               _("Applied patch to '%s' with conflicts.\n"),
+                               patch->new_name);
+       } else {
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf(stderr,
+                               _("Applied patch to '%s' cleanly.\n"),
+                               patch->new_name);
+       }
+       return 0;
+}
+
+static int apply_data(struct apply_state *state, struct patch *patch,
+                     struct stat *st, const struct cache_entry *ce)
+{
+       struct image image;
+
+       if (load_preimage(state, &image, patch, st, ce) < 0)
+               return -1;
+
+       if (patch->direct_to_threeway ||
+           apply_fragments(state, &image, patch) < 0) {
+               /* Note: with --reject, apply_fragments() returns 0 */
+               if (!state->threeway || try_threeway(state, &image, patch, st, ce) < 0)
+                       return -1;
+       }
+       patch->result = image.buf;
+       patch->resultsize = image.len;
+       add_to_fn_table(state, patch);
+       free(image.line_allocated);
+
+       if (0 < patch->is_delete && patch->resultsize)
+               return error(_("removal patch leaves file contents"));
+
+       return 0;
+}
+
+/*
+ * If "patch" that we are looking at modifies or deletes what we have,
+ * we would want it not to lose any local modification we have, either
+ * in the working tree or in the index.
+ *
+ * This also decides if a non-git patch is a creation patch or a
+ * modification to an existing empty file.  We do not check the state
+ * of the current tree for a creation patch in this function; the caller
+ * check_patch() separately makes sure (and errors out otherwise) that
+ * the path the patch creates does not exist in the current tree.
+ */
+static int check_preimage(struct apply_state *state,
+                         struct patch *patch,
+                         struct cache_entry **ce,
+                         struct stat *st)
+{
+       const char *old_name = patch->old_name;
+       struct patch *previous = NULL;
+       int stat_ret = 0, status;
+       unsigned st_mode = 0;
+
+       if (!old_name)
+               return 0;
+
+       assert(patch->is_new <= 0);
+       previous = previous_patch(state, patch, &status);
+
+       if (status)
+               return error(_("path %s has been renamed/deleted"), old_name);
+       if (previous) {
+               st_mode = previous->new_mode;
+       } else if (!state->cached) {
+               stat_ret = lstat(old_name, st);
+               if (stat_ret && errno != ENOENT)
+                       return error_errno("%s", old_name);
+       }
+
+       if (state->check_index && !previous) {
+               int pos = cache_name_pos(old_name, strlen(old_name));
+               if (pos < 0) {
+                       if (patch->is_new < 0)
+                               goto is_new;
+                       return error(_("%s: does not exist in index"), old_name);
+               }
+               *ce = active_cache[pos];
+               if (stat_ret < 0) {
+                       if (checkout_target(&the_index, *ce, st))
+                               return -1;
+               }
+               if (!state->cached && verify_index_match(*ce, st))
+                       return error(_("%s: does not match index"), old_name);
+               if (state->cached)
+                       st_mode = (*ce)->ce_mode;
+       } else if (stat_ret < 0) {
+               if (patch->is_new < 0)
+                       goto is_new;
+               return error_errno("%s", old_name);
+       }
+
+       if (!state->cached && !previous)
+               st_mode = ce_mode_from_stat(*ce, st->st_mode);
+
+       if (patch->is_new < 0)
+               patch->is_new = 0;
+       if (!patch->old_mode)
+               patch->old_mode = st_mode;
+       if ((st_mode ^ patch->old_mode) & S_IFMT)
+               return error(_("%s: wrong type"), old_name);
+       if (st_mode != patch->old_mode)
+               warning(_("%s has type %o, expected %o"),
+                       old_name, st_mode, patch->old_mode);
+       if (!patch->new_mode && !patch->is_delete)
+               patch->new_mode = st_mode;
+       return 0;
+
+ is_new:
+       patch->is_new = 1;
+       patch->is_delete = 0;
+       free(patch->old_name);
+       patch->old_name = NULL;
+       return 0;
+}
+
+
+#define EXISTS_IN_INDEX 1
+#define EXISTS_IN_WORKTREE 2
+
+static int check_to_create(struct apply_state *state,
+                          const char *new_name,
+                          int ok_if_exists)
+{
+       struct stat nst;
+
+       if (state->check_index &&
+           cache_name_pos(new_name, strlen(new_name)) >= 0 &&
+           !ok_if_exists)
+               return EXISTS_IN_INDEX;
+       if (state->cached)
+               return 0;
+
+       if (!lstat(new_name, &nst)) {
+               if (S_ISDIR(nst.st_mode) || ok_if_exists)
+                       return 0;
+               /*
+                * A leading component of new_name might be a symlink
+                * that is going to be removed with this patch, but
+                * still pointing at somewhere that has the path.
+                * In such a case, path "new_name" does not exist as
+                * far as git is concerned.
+                */
+               if (has_symlink_leading_path(new_name, strlen(new_name)))
+                       return 0;
+
+               return EXISTS_IN_WORKTREE;
+       } else if ((errno != ENOENT) && (errno != ENOTDIR)) {
+               return error_errno("%s", new_name);
+       }
+       return 0;
+}
+
+static uintptr_t register_symlink_changes(struct apply_state *state,
+                                         const char *path,
+                                         uintptr_t what)
+{
+       struct string_list_item *ent;
+
+       ent = string_list_lookup(&state->symlink_changes, path);
+       if (!ent) {
+               ent = string_list_insert(&state->symlink_changes, path);
+               ent->util = (void *)0;
+       }
+       ent->util = (void *)(what | ((uintptr_t)ent->util));
+       return (uintptr_t)ent->util;
+}
+
+static uintptr_t check_symlink_changes(struct apply_state *state, const char *path)
+{
+       struct string_list_item *ent;
+
+       ent = string_list_lookup(&state->symlink_changes, path);
+       if (!ent)
+               return 0;
+       return (uintptr_t)ent->util;
+}
+
+static void prepare_symlink_changes(struct apply_state *state, struct patch *patch)
+{
+       for ( ; patch; patch = patch->next) {
+               if ((patch->old_name && S_ISLNK(patch->old_mode)) &&
+                   (patch->is_rename || patch->is_delete))
+                       /* the symlink at patch->old_name is removed */
+                       register_symlink_changes(state, patch->old_name, APPLY_SYMLINK_GOES_AWAY);
+
+               if (patch->new_name && S_ISLNK(patch->new_mode))
+                       /* the symlink at patch->new_name is created or remains */
+                       register_symlink_changes(state, patch->new_name, APPLY_SYMLINK_IN_RESULT);
+       }
+}
+
+static int path_is_beyond_symlink_1(struct apply_state *state, struct strbuf *name)
+{
+       do {
+               unsigned int change;
+
+               while (--name->len && name->buf[name->len] != '/')
+                       ; /* scan backwards */
+               if (!name->len)
+                       break;
+               name->buf[name->len] = '\0';
+               change = check_symlink_changes(state, name->buf);
+               if (change & APPLY_SYMLINK_IN_RESULT)
+                       return 1;
+               if (change & APPLY_SYMLINK_GOES_AWAY)
+                       /*
+                        * This cannot be "return 0", because we may
+                        * see a new one created at a higher level.
+                        */
+                       continue;
+
+               /* otherwise, check the preimage */
+               if (state->check_index) {
+                       struct cache_entry *ce;
+
+                       ce = cache_file_exists(name->buf, name->len, ignore_case);
+                       if (ce && S_ISLNK(ce->ce_mode))
+                               return 1;
+               } else {
+                       struct stat st;
+                       if (!lstat(name->buf, &st) && S_ISLNK(st.st_mode))
+                               return 1;
+               }
+       } while (1);
+       return 0;
+}
+
+static int path_is_beyond_symlink(struct apply_state *state, const char *name_)
+{
+       int ret;
+       struct strbuf name = STRBUF_INIT;
+
+       assert(*name_ != '\0');
+       strbuf_addstr(&name, name_);
+       ret = path_is_beyond_symlink_1(state, &name);
+       strbuf_release(&name);
+
+       return ret;
+}
+
+static int check_unsafe_path(struct patch *patch)
+{
+       const char *old_name = NULL;
+       const char *new_name = NULL;
+       if (patch->is_delete)
+               old_name = patch->old_name;
+       else if (!patch->is_new && !patch->is_copy)
+               old_name = patch->old_name;
+       if (!patch->is_delete)
+               new_name = patch->new_name;
+
+       if (old_name && !verify_path(old_name))
+               return error(_("invalid path '%s'"), old_name);
+       if (new_name && !verify_path(new_name))
+               return error(_("invalid path '%s'"), new_name);
+       return 0;
+}
+
+/*
+ * Check and apply the patch in-core; leave the result in patch->result
+ * for the caller to write it out to the final destination.
+ */
+static int check_patch(struct apply_state *state, struct patch *patch)
+{
+       struct stat st;
+       const char *old_name = patch->old_name;
+       const char *new_name = patch->new_name;
+       const char *name = old_name ? old_name : new_name;
+       struct cache_entry *ce = NULL;
+       struct patch *tpatch;
+       int ok_if_exists;
+       int status;
+
+       patch->rejected = 1; /* we will drop this after we succeed */
+
+       status = check_preimage(state, patch, &ce, &st);
+       if (status)
+               return status;
+       old_name = patch->old_name;
+
+       /*
+        * A type-change diff is always split into a patch to delete
+        * old, immediately followed by a patch to create new (see
+        * diff.c::run_diff()); in such a case it is Ok that the entry
+        * to be deleted by the previous patch is still in the working
+        * tree and in the index.
+        *
+        * A patch to swap-rename between A and B would first rename A
+        * to B and then rename B to A.  While applying the first one,
+        * the presence of B should not stop A from getting renamed to
+        * B; ask to_be_deleted() about the later rename.  Removal of
+        * B and rename from A to B is handled the same way by asking
+        * was_deleted().
+        */
+       if ((tpatch = in_fn_table(state, new_name)) &&
+           (was_deleted(tpatch) || to_be_deleted(tpatch)))
+               ok_if_exists = 1;
+       else
+               ok_if_exists = 0;
+
+       if (new_name &&
+           ((0 < patch->is_new) || patch->is_rename || patch->is_copy)) {
+               int err = check_to_create(state, new_name, ok_if_exists);
+
+               if (err && state->threeway) {
+                       patch->direct_to_threeway = 1;
+               } else switch (err) {
+               case 0:
+                       break; /* happy */
+               case EXISTS_IN_INDEX:
+                       return error(_("%s: already exists in index"), new_name);
+                       break;
+               case EXISTS_IN_WORKTREE:
+                       return error(_("%s: already exists in working directory"),
+                                    new_name);
+               default:
+                       return err;
+               }
+
+               if (!patch->new_mode) {
+                       if (0 < patch->is_new)
+                               patch->new_mode = S_IFREG | 0644;
+                       else
+                               patch->new_mode = patch->old_mode;
+               }
+       }
+
+       if (new_name && old_name) {
+               int same = !strcmp(old_name, new_name);
+               if (!patch->new_mode)
+                       patch->new_mode = patch->old_mode;
+               if ((patch->old_mode ^ patch->new_mode) & S_IFMT) {
+                       if (same)
+                               return error(_("new mode (%o) of %s does not "
+                                              "match old mode (%o)"),
+                                       patch->new_mode, new_name,
+                                       patch->old_mode);
+                       else
+                               return error(_("new mode (%o) of %s does not "
+                                              "match old mode (%o) of %s"),
+                                       patch->new_mode, new_name,
+                                       patch->old_mode, old_name);
+               }
+       }
+
+       if (!state->unsafe_paths && check_unsafe_path(patch))
+               return -128;
+
+       /*
+        * An attempt to read from or delete a path that is beyond a
+        * symbolic link will be prevented by load_patch_target() that
+        * is called at the beginning of apply_data() so we do not
+        * have to worry about a patch marked with "is_delete" bit
+        * here.  We however need to make sure that the patch result
+        * is not deposited to a path that is beyond a symbolic link
+        * here.
+        */
+       if (!patch->is_delete && path_is_beyond_symlink(state, patch->new_name))
+               return error(_("affected file '%s' is beyond a symbolic link"),
+                            patch->new_name);
+
+       if (apply_data(state, patch, &st, ce) < 0)
+               return error(_("%s: patch does not apply"), name);
+       patch->rejected = 0;
+       return 0;
+}
+
+static int check_patch_list(struct apply_state *state, struct patch *patch)
+{
+       int err = 0;
+
+       prepare_symlink_changes(state, patch);
+       prepare_fn_table(state, patch);
+       while (patch) {
+               int res;
+               if (state->apply_verbosity > verbosity_normal)
+                       say_patch_name(stderr,
+                                      _("Checking patch %s..."), patch);
+               res = check_patch(state, patch);
+               if (res == -128)
+                       return -128;
+               err |= res;
+               patch = patch->next;
+       }
+       return err;
+}
+
+static int read_apply_cache(struct apply_state *state)
+{
+       if (state->index_file)
+               return read_cache_from(state->index_file);
+       else
+               return read_cache();
+}
+
+/* This function tries to read the object name from the current index */
+static int get_current_oid(struct apply_state *state, const char *path,
+                          struct object_id *oid)
+{
+       int pos;
+
+       if (read_apply_cache(state) < 0)
+               return -1;
+       pos = cache_name_pos(path, strlen(path));
+       if (pos < 0)
+               return -1;
+       oidcpy(oid, &active_cache[pos]->oid);
+       return 0;
+}
+
+static int preimage_oid_in_gitlink_patch(struct patch *p, struct object_id *oid)
+{
+       /*
+        * A usable gitlink patch has only one fragment (hunk) that looks like:
+        * @@ -1 +1 @@
+        * -Subproject commit <old sha1>
+        * +Subproject commit <new sha1>
+        * or
+        * @@ -1 +0,0 @@
+        * -Subproject commit <old sha1>
+        * for a removal patch.
+        */
+       struct fragment *hunk = p->fragments;
+       static const char heading[] = "-Subproject commit ";
+       char *preimage;
+
+       if (/* does the patch have only one hunk? */
+           hunk && !hunk->next &&
+           /* is its preimage one line? */
+           hunk->oldpos == 1 && hunk->oldlines == 1 &&
+           /* does preimage begin with the heading? */
+           (preimage = memchr(hunk->patch, '\n', hunk->size)) != NULL &&
+           starts_with(++preimage, heading) &&
+           /* does it record full SHA-1? */
+           !get_oid_hex(preimage + sizeof(heading) - 1, oid) &&
+           preimage[sizeof(heading) + GIT_SHA1_HEXSZ - 1] == '\n' &&
+           /* does the abbreviated name on the index line agree with it? */
+           starts_with(preimage + sizeof(heading) - 1, p->old_sha1_prefix))
+               return 0; /* it all looks fine */
+
+       /* we may have full object name on the index line */
+       return get_oid_hex(p->old_sha1_prefix, oid);
+}
+
+/* Build an index that contains the just the files needed for a 3way merge */
+static int build_fake_ancestor(struct apply_state *state, struct patch *list)
+{
+       struct patch *patch;
+       struct index_state result = { NULL };
+       static struct lock_file lock;
+       int res;
+
+       /* Once we start supporting the reverse patch, it may be
+        * worth showing the new sha1 prefix, but until then...
+        */
+       for (patch = list; patch; patch = patch->next) {
+               struct object_id oid;
+               struct cache_entry *ce;
+               const char *name;
+
+               name = patch->old_name ? patch->old_name : patch->new_name;
+               if (0 < patch->is_new)
+                       continue;
+
+               if (S_ISGITLINK(patch->old_mode)) {
+                       if (!preimage_oid_in_gitlink_patch(patch, &oid))
+                               ; /* ok, the textual part looks sane */
+                       else
+                               return error(_("sha1 information is lacking or "
+                                              "useless for submodule %s"), name);
+               } else if (!get_sha1_blob(patch->old_sha1_prefix, oid.hash)) {
+                       ; /* ok */
+               } else if (!patch->lines_added && !patch->lines_deleted) {
+                       /* mode-only change: update the current */
+                       if (get_current_oid(state, patch->old_name, &oid))
+                               return error(_("mode change for %s, which is not "
+                                              "in current HEAD"), name);
+               } else
+                       return error(_("sha1 information is lacking or useless "
+                                      "(%s)."), name);
+
+               ce = make_cache_entry(patch->old_mode, oid.hash, name, 0, 0);
+               if (!ce)
+                       return error(_("make_cache_entry failed for path '%s'"),
+                                    name);
+               if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD)) {
+                       free(ce);
+                       return error(_("could not add %s to temporary index"),
+                                    name);
+               }
+       }
+
+       hold_lock_file_for_update(&lock, state->fake_ancestor, LOCK_DIE_ON_ERROR);
+       res = write_locked_index(&result, &lock, COMMIT_LOCK);
+       discard_index(&result);
+
+       if (res)
+               return error(_("could not write temporary index to %s"),
+                            state->fake_ancestor);
+
+       return 0;
+}
+
+static void stat_patch_list(struct apply_state *state, struct patch *patch)
+{
+       int files, adds, dels;
+
+       for (files = adds = dels = 0 ; patch ; patch = patch->next) {
+               files++;
+               adds += patch->lines_added;
+               dels += patch->lines_deleted;
+               show_stats(state, patch);
+       }
+
+       print_stat_summary(stdout, files, adds, dels);
+}
+
+static void numstat_patch_list(struct apply_state *state,
+                              struct patch *patch)
+{
+       for ( ; patch; patch = patch->next) {
+               const char *name;
+               name = patch->new_name ? patch->new_name : patch->old_name;
+               if (patch->is_binary)
+                       printf("-\t-\t");
+               else
+                       printf("%d\t%d\t", patch->lines_added, patch->lines_deleted);
+               write_name_quoted(name, stdout, state->line_termination);
+       }
+}
+
+static void show_file_mode_name(const char *newdelete, unsigned int mode, const char *name)
+{
+       if (mode)
+               printf(" %s mode %06o %s\n", newdelete, mode, name);
+       else
+               printf(" %s %s\n", newdelete, name);
+}
+
+static void show_mode_change(struct patch *p, int show_name)
+{
+       if (p->old_mode && p->new_mode && p->old_mode != p->new_mode) {
+               if (show_name)
+                       printf(" mode change %06o => %06o %s\n",
+                              p->old_mode, p->new_mode, p->new_name);
+               else
+                       printf(" mode change %06o => %06o\n",
+                              p->old_mode, p->new_mode);
+       }
+}
+
+static void show_rename_copy(struct patch *p)
+{
+       const char *renamecopy = p->is_rename ? "rename" : "copy";
+       const char *old, *new;
+
+       /* Find common prefix */
+       old = p->old_name;
+       new = p->new_name;
+       while (1) {
+               const char *slash_old, *slash_new;
+               slash_old = strchr(old, '/');
+               slash_new = strchr(new, '/');
+               if (!slash_old ||
+                   !slash_new ||
+                   slash_old - old != slash_new - new ||
+                   memcmp(old, new, slash_new - new))
+                       break;
+               old = slash_old + 1;
+               new = slash_new + 1;
+       }
+       /* p->old_name thru old is the common prefix, and old and new
+        * through the end of names are renames
+        */
+       if (old != p->old_name)
+               printf(" %s %.*s{%s => %s} (%d%%)\n", renamecopy,
+                      (int)(old - p->old_name), p->old_name,
+                      old, new, p->score);
+       else
+               printf(" %s %s => %s (%d%%)\n", renamecopy,
+                      p->old_name, p->new_name, p->score);
+       show_mode_change(p, 0);
+}
+
+static void summary_patch_list(struct patch *patch)
+{
+       struct patch *p;
+
+       for (p = patch; p; p = p->next) {
+               if (p->is_new)
+                       show_file_mode_name("create", p->new_mode, p->new_name);
+               else if (p->is_delete)
+                       show_file_mode_name("delete", p->old_mode, p->old_name);
+               else {
+                       if (p->is_rename || p->is_copy)
+                               show_rename_copy(p);
+                       else {
+                               if (p->score) {
+                                       printf(" rewrite %s (%d%%)\n",
+                                              p->new_name, p->score);
+                                       show_mode_change(p, 0);
+                               }
+                               else
+                                       show_mode_change(p, 1);
+                       }
+               }
+       }
+}
+
+static void patch_stats(struct apply_state *state, struct patch *patch)
+{
+       int lines = patch->lines_added + patch->lines_deleted;
+
+       if (lines > state->max_change)
+               state->max_change = lines;
+       if (patch->old_name) {
+               int len = quote_c_style(patch->old_name, NULL, NULL, 0);
+               if (!len)
+                       len = strlen(patch->old_name);
+               if (len > state->max_len)
+                       state->max_len = len;
+       }
+       if (patch->new_name) {
+               int len = quote_c_style(patch->new_name, NULL, NULL, 0);
+               if (!len)
+                       len = strlen(patch->new_name);
+               if (len > state->max_len)
+                       state->max_len = len;
+       }
+}
+
+static int remove_file(struct apply_state *state, struct patch *patch, int rmdir_empty)
+{
+       if (state->update_index) {
+               if (remove_file_from_cache(patch->old_name) < 0)
+                       return error(_("unable to remove %s from index"), patch->old_name);
+       }
+       if (!state->cached) {
+               if (!remove_or_warn(patch->old_mode, patch->old_name) && rmdir_empty) {
+                       remove_path(patch->old_name);
+               }
+       }
+       return 0;
+}
+
+static int add_index_file(struct apply_state *state,
+                         const char *path,
+                         unsigned mode,
+                         void *buf,
+                         unsigned long size)
+{
+       struct stat st;
+       struct cache_entry *ce;
+       int namelen = strlen(path);
+       unsigned ce_size = cache_entry_size(namelen);
+
+       if (!state->update_index)
+               return 0;
+
+       ce = xcalloc(1, ce_size);
+       memcpy(ce->name, path, namelen);
+       ce->ce_mode = create_ce_mode(mode);
+       ce->ce_flags = create_ce_flags(0);
+       ce->ce_namelen = namelen;
+       if (S_ISGITLINK(mode)) {
+               const char *s;
+
+               if (!skip_prefix(buf, "Subproject commit ", &s) ||
+                   get_oid_hex(s, &ce->oid)) {
+                       free(ce);
+                      return error(_("corrupt patch for submodule %s"), path);
+               }
+       } else {
+               if (!state->cached) {
+                       if (lstat(path, &st) < 0) {
+                               free(ce);
+                               return error_errno(_("unable to stat newly "
+                                                    "created file '%s'"),
+                                                  path);
+                       }
+                       fill_stat_cache_info(ce, &st);
+               }
+               if (write_sha1_file(buf, size, blob_type, ce->oid.hash) < 0) {
+                       free(ce);
+                       return error(_("unable to create backing store "
+                                      "for newly created file %s"), path);
+               }
+       }
+       if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0) {
+               free(ce);
+               return error(_("unable to add cache entry for %s"), path);
+       }
+
+       return 0;
+}
+
+/*
+ * Returns:
+ *  -1 if an unrecoverable error happened
+ *   0 if everything went well
+ *   1 if a recoverable error happened
+ */
+static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
+{
+       int fd, res;
+       struct strbuf nbuf = STRBUF_INIT;
+
+       if (S_ISGITLINK(mode)) {
+               struct stat st;
+               if (!lstat(path, &st) && S_ISDIR(st.st_mode))
+                       return 0;
+               return !!mkdir(path, 0777);
+       }
+
+       if (has_symlinks && S_ISLNK(mode))
+               /* Although buf:size is counted string, it also is NUL
+                * terminated.
+                */
+               return !!symlink(buf, path);
+
+       fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
+       if (fd < 0)
+               return 1;
+
+       if (convert_to_working_tree(path, buf, size, &nbuf)) {
+               size = nbuf.len;
+               buf  = nbuf.buf;
+       }
+
+       res = write_in_full(fd, buf, size) < 0;
+       if (res)
+               error_errno(_("failed to write to '%s'"), path);
+       strbuf_release(&nbuf);
+
+       if (close(fd) < 0 && !res)
+               return error_errno(_("closing file '%s'"), path);
+
+       return res ? -1 : 0;
+}
+
+/*
+ * We optimistically assume that the directories exist,
+ * which is true 99% of the time anyway. If they don't,
+ * we create them and try again.
+ *
+ * Returns:
+ *   -1 on error
+ *   0 otherwise
+ */
+static int create_one_file(struct apply_state *state,
+                          char *path,
+                          unsigned mode,
+                          const char *buf,
+                          unsigned long size)
+{
+       int res;
+
+       if (state->cached)
+               return 0;
+
+       res = try_create_file(path, mode, buf, size);
+       if (res < 0)
+               return -1;
+       if (!res)
+               return 0;
+
+       if (errno == ENOENT) {
+               if (safe_create_leading_directories(path))
+                       return 0;
+               res = try_create_file(path, mode, buf, size);
+               if (res < 0)
+                       return -1;
+               if (!res)
+                       return 0;
+       }
+
+       if (errno == EEXIST || errno == EACCES) {
+               /* We may be trying to create a file where a directory
+                * used to be.
+                */
+               struct stat st;
+               if (!lstat(path, &st) && (!S_ISDIR(st.st_mode) || !rmdir(path)))
+                       errno = EEXIST;
+       }
+
+       if (errno == EEXIST) {
+               unsigned int nr = getpid();
+
+               for (;;) {
+                       char newpath[PATH_MAX];
+                       mksnpath(newpath, sizeof(newpath), "%s~%u", path, nr);
+                       res = try_create_file(newpath, mode, buf, size);
+                       if (res < 0)
+                               return -1;
+                       if (!res) {
+                               if (!rename(newpath, path))
+                                       return 0;
+                               unlink_or_warn(newpath);
+                               break;
+                       }
+                       if (errno != EEXIST)
+                               break;
+                       ++nr;
+               }
+       }
+       return error_errno(_("unable to write file '%s' mode %o"),
+                          path, mode);
+}
+
+static int add_conflicted_stages_file(struct apply_state *state,
+                                      struct patch *patch)
+{
+       int stage, namelen;
+       unsigned ce_size, mode;
+       struct cache_entry *ce;
+
+       if (!state->update_index)
+               return 0;
+       namelen = strlen(patch->new_name);
+       ce_size = cache_entry_size(namelen);
+       mode = patch->new_mode ? patch->new_mode : (S_IFREG | 0644);
+
+       remove_file_from_cache(patch->new_name);
+       for (stage = 1; stage < 4; stage++) {
+               if (is_null_oid(&patch->threeway_stage[stage - 1]))
+                       continue;
+               ce = xcalloc(1, ce_size);
+               memcpy(ce->name, patch->new_name, namelen);
+               ce->ce_mode = create_ce_mode(mode);
+               ce->ce_flags = create_ce_flags(stage);
+               ce->ce_namelen = namelen;
+               oidcpy(&ce->oid, &patch->threeway_stage[stage - 1]);
+               if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0) {
+                       free(ce);
+                       return error(_("unable to add cache entry for %s"),
+                                    patch->new_name);
+               }
+       }
+
+       return 0;
+}
+
+static int create_file(struct apply_state *state, struct patch *patch)
+{
+       char *path = patch->new_name;
+       unsigned mode = patch->new_mode;
+       unsigned long size = patch->resultsize;
+       char *buf = patch->result;
+
+       if (!mode)
+               mode = S_IFREG | 0644;
+       if (create_one_file(state, path, mode, buf, size))
+               return -1;
+
+       if (patch->conflicted_threeway)
+               return add_conflicted_stages_file(state, patch);
+       else
+               return add_index_file(state, path, mode, buf, size);
+}
+
+/* phase zero is to remove, phase one is to create */
+static int write_out_one_result(struct apply_state *state,
+                               struct patch *patch,
+                               int phase)
+{
+       if (patch->is_delete > 0) {
+               if (phase == 0)
+                       return remove_file(state, patch, 1);
+               return 0;
+       }
+       if (patch->is_new > 0 || patch->is_copy) {
+               if (phase == 1)
+                       return create_file(state, patch);
+               return 0;
+       }
+       /*
+        * Rename or modification boils down to the same
+        * thing: remove the old, write the new
+        */
+       if (phase == 0)
+               return remove_file(state, patch, patch->is_rename);
+       if (phase == 1)
+               return create_file(state, patch);
+       return 0;
+}
+
+static int write_out_one_reject(struct apply_state *state, struct patch *patch)
+{
+       FILE *rej;
+       char namebuf[PATH_MAX];
+       struct fragment *frag;
+       int cnt = 0;
+       struct strbuf sb = STRBUF_INIT;
+
+       for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) {
+               if (!frag->rejected)
+                       continue;
+               cnt++;
+       }
+
+       if (!cnt) {
+               if (state->apply_verbosity > verbosity_normal)
+                       say_patch_name(stderr,
+                                      _("Applied patch %s cleanly."), patch);
+               return 0;
+       }
+
+       /* This should not happen, because a removal patch that leaves
+        * contents are marked "rejected" at the patch level.
+        */
+       if (!patch->new_name)
+               die(_("internal error"));
+
+       /* Say this even without --verbose */
+       strbuf_addf(&sb, Q_("Applying patch %%s with %d reject...",
+                           "Applying patch %%s with %d rejects...",
+                           cnt),
+                   cnt);
+       if (state->apply_verbosity > verbosity_silent)
+               say_patch_name(stderr, sb.buf, patch);
+       strbuf_release(&sb);
+
+       cnt = strlen(patch->new_name);
+       if (ARRAY_SIZE(namebuf) <= cnt + 5) {
+               cnt = ARRAY_SIZE(namebuf) - 5;
+               warning(_("truncating .rej filename to %.*s.rej"),
+                       cnt - 1, patch->new_name);
+       }
+       memcpy(namebuf, patch->new_name, cnt);
+       memcpy(namebuf + cnt, ".rej", 5);
+
+       rej = fopen(namebuf, "w");
+       if (!rej)
+               return error_errno(_("cannot open %s"), namebuf);
+
+       /* Normal git tools never deal with .rej, so do not pretend
+        * this is a git patch by saying --git or giving extended
+        * headers.  While at it, maybe please "kompare" that wants
+        * the trailing TAB and some garbage at the end of line ;-).
+        */
+       fprintf(rej, "diff a/%s b/%s\t(rejected hunks)\n",
+               patch->new_name, patch->new_name);
+       for (cnt = 1, frag = patch->fragments;
+            frag;
+            cnt++, frag = frag->next) {
+               if (!frag->rejected) {
+                       if (state->apply_verbosity > verbosity_silent)
+                               fprintf_ln(stderr, _("Hunk #%d applied cleanly."), cnt);
+                       continue;
+               }
+               if (state->apply_verbosity > verbosity_silent)
+                       fprintf_ln(stderr, _("Rejected hunk #%d."), cnt);
+               fprintf(rej, "%.*s", frag->size, frag->patch);
+               if (frag->patch[frag->size-1] != '\n')
+                       fputc('\n', rej);
+       }
+       fclose(rej);
+       return -1;
+}
+
+/*
+ * Returns:
+ *  -1 if an error happened
+ *   0 if the patch applied cleanly
+ *   1 if the patch did not apply cleanly
+ */
+static int write_out_results(struct apply_state *state, struct patch *list)
+{
+       int phase;
+       int errs = 0;
+       struct patch *l;
+       struct string_list cpath = STRING_LIST_INIT_DUP;
+
+       for (phase = 0; phase < 2; phase++) {
+               l = list;
+               while (l) {
+                       if (l->rejected)
+                               errs = 1;
+                       else {
+                               if (write_out_one_result(state, l, phase)) {
+                                       string_list_clear(&cpath, 0);
+                                       return -1;
+                               }
+                               if (phase == 1) {
+                                       if (write_out_one_reject(state, l))
+                                               errs = 1;
+                                       if (l->conflicted_threeway) {
+                                               string_list_append(&cpath, l->new_name);
+                                               errs = 1;
+                                       }
+                               }
+                       }
+                       l = l->next;
+               }
+       }
+
+       if (cpath.nr) {
+               struct string_list_item *item;
+
+               string_list_sort(&cpath);
+               if (state->apply_verbosity > verbosity_silent) {
+                       for_each_string_list_item(item, &cpath)
+                               fprintf(stderr, "U %s\n", item->string);
+               }
+               string_list_clear(&cpath, 0);
+
+               rerere(0);
+       }
+
+       return errs;
+}
+
+/*
+ * Try to apply a patch.
+ *
+ * Returns:
+ *  -128 if a bad error happened (like patch unreadable)
+ *  -1 if patch did not apply and user cannot deal with it
+ *   0 if the patch applied
+ *   1 if the patch did not apply but user might fix it
+ */
+static int apply_patch(struct apply_state *state,
+                      int fd,
+                      const char *filename,
+                      int options)
+{
+       size_t offset;
+       struct strbuf buf = STRBUF_INIT; /* owns the patch text */
+       struct patch *list = NULL, **listp = &list;
+       int skipped_patch = 0;
+       int res = 0;
+
+       state->patch_input_file = filename;
+       if (read_patch_file(&buf, fd) < 0)
+               return -128;
+       offset = 0;
+       while (offset < buf.len) {
+               struct patch *patch;
+               int nr;
+
+               patch = xcalloc(1, sizeof(*patch));
+               patch->inaccurate_eof = !!(options & APPLY_OPT_INACCURATE_EOF);
+               patch->recount =  !!(options & APPLY_OPT_RECOUNT);
+               nr = parse_chunk(state, buf.buf + offset, buf.len - offset, patch);
+               if (nr < 0) {
+                       free_patch(patch);
+                       if (nr == -128) {
+                               res = -128;
+                               goto end;
+                       }
+                       break;
+               }
+               if (state->apply_in_reverse)
+                       reverse_patches(patch);
+               if (use_patch(state, patch)) {
+                       patch_stats(state, patch);
+                       *listp = patch;
+                       listp = &patch->next;
+               }
+               else {
+                       if (state->apply_verbosity > verbosity_normal)
+                               say_patch_name(stderr, _("Skipped patch '%s'."), patch);
+                       free_patch(patch);
+                       skipped_patch++;
+               }
+               offset += nr;
+       }
+
+       if (!list && !skipped_patch) {
+               error(_("unrecognized input"));
+               res = -128;
+               goto end;
+       }
+
+       if (state->whitespace_error && (state->ws_error_action == die_on_ws_error))
+               state->apply = 0;
+
+       state->update_index = state->check_index && state->apply;
+       if (state->update_index && state->newfd < 0) {
+               if (state->index_file)
+                       state->newfd = hold_lock_file_for_update(state->lock_file,
+                                                                state->index_file,
+                                                                LOCK_DIE_ON_ERROR);
+               else
+                       state->newfd = hold_locked_index(state->lock_file, LOCK_DIE_ON_ERROR);
+       }
+
+       if (state->check_index && read_apply_cache(state) < 0) {
+               error(_("unable to read index file"));
+               res = -128;
+               goto end;
+       }
+
+       if (state->check || state->apply) {
+               int r = check_patch_list(state, list);
+               if (r == -128) {
+                       res = -128;
+                       goto end;
+               }
+               if (r < 0 && !state->apply_with_reject) {
+                       res = -1;
+                       goto end;
+               }
+       }
+
+       if (state->apply) {
+               int write_res = write_out_results(state, list);
+               if (write_res < 0) {
+                       res = -128;
+                       goto end;
+               }
+               if (write_res > 0) {
+                       /* with --3way, we still need to write the index out */
+                       res = state->apply_with_reject ? -1 : 1;
+                       goto end;
+               }
+       }
+
+       if (state->fake_ancestor &&
+           build_fake_ancestor(state, list)) {
+               res = -128;
+               goto end;
+       }
+
+       if (state->diffstat && state->apply_verbosity > verbosity_silent)
+               stat_patch_list(state, list);
+
+       if (state->numstat && state->apply_verbosity > verbosity_silent)
+               numstat_patch_list(state, list);
+
+       if (state->summary && state->apply_verbosity > verbosity_silent)
+               summary_patch_list(list);
+
+end:
+       free_patch_list(list);
+       strbuf_release(&buf);
+       string_list_clear(&state->fn_table, 0);
+       return res;
+}
+
+static int apply_option_parse_exclude(const struct option *opt,
+                                     const char *arg, int unset)
+{
+       struct apply_state *state = opt->value;
+       add_name_limit(state, arg, 1);
+       return 0;
+}
+
+static int apply_option_parse_include(const struct option *opt,
+                                     const char *arg, int unset)
+{
+       struct apply_state *state = opt->value;
+       add_name_limit(state, arg, 0);
+       state->has_include = 1;
+       return 0;
+}
+
+static int apply_option_parse_p(const struct option *opt,
+                               const char *arg,
+                               int unset)
+{
+       struct apply_state *state = opt->value;
+       state->p_value = atoi(arg);
+       state->p_value_known = 1;
+       return 0;
+}
+
+static int apply_option_parse_space_change(const struct option *opt,
+                                          const char *arg, int unset)
+{
+       struct apply_state *state = opt->value;
+       if (unset)
+               state->ws_ignore_action = ignore_ws_none;
+       else
+               state->ws_ignore_action = ignore_ws_change;
+       return 0;
+}
+
+static int apply_option_parse_whitespace(const struct option *opt,
+                                        const char *arg, int unset)
+{
+       struct apply_state *state = opt->value;
+       state->whitespace_option = arg;
+       if (parse_whitespace_option(state, arg))
+               exit(1);
+       return 0;
+}
+
+static int apply_option_parse_directory(const struct option *opt,
+                                       const char *arg, int unset)
+{
+       struct apply_state *state = opt->value;
+       strbuf_reset(&state->root);
+       strbuf_addstr(&state->root, arg);
+       strbuf_complete(&state->root, '/');
+       return 0;
+}
+
+int apply_all_patches(struct apply_state *state,
+                     int argc,
+                     const char **argv,
+                     int options)
+{
+       int i;
+       int res;
+       int errs = 0;
+       int read_stdin = 1;
+
+       for (i = 0; i < argc; i++) {
+               const char *arg = argv[i];
+               char *to_free = NULL;
+               int fd;
+
+               if (!strcmp(arg, "-")) {
+                       res = apply_patch(state, 0, "<stdin>", options);
+                       if (res < 0)
+                               goto end;
+                       errs |= res;
+                       read_stdin = 0;
+                       continue;
+               } else
+                       arg = to_free = prefix_filename(state->prefix, arg);
+
+               fd = open(arg, O_RDONLY);
+               if (fd < 0) {
+                       error(_("can't open patch '%s': %s"), arg, strerror(errno));
+                       res = -128;
+                       free(to_free);
+                       goto end;
+               }
+               read_stdin = 0;
+               set_default_whitespace_mode(state);
+               res = apply_patch(state, fd, arg, options);
+               close(fd);
+               free(to_free);
+               if (res < 0)
+                       goto end;
+               errs |= res;
+       }
+       set_default_whitespace_mode(state);
+       if (read_stdin) {
+               res = apply_patch(state, 0, "<stdin>", options);
+               if (res < 0)
+                       goto end;
+               errs |= res;
+       }
+
+       if (state->whitespace_error) {
+               if (state->squelch_whitespace_errors &&
+                   state->squelch_whitespace_errors < state->whitespace_error) {
+                       int squelched =
+                               state->whitespace_error - state->squelch_whitespace_errors;
+                       warning(Q_("squelched %d whitespace error",
+                                  "squelched %d whitespace errors",
+                                  squelched),
+                               squelched);
+               }
+               if (state->ws_error_action == die_on_ws_error) {
+                       error(Q_("%d line adds whitespace errors.",
+                                "%d lines add whitespace errors.",
+                                state->whitespace_error),
+                             state->whitespace_error);
+                       res = -128;
+                       goto end;
+               }
+               if (state->applied_after_fixing_ws && state->apply)
+                       warning(Q_("%d line applied after"
+                                  " fixing whitespace errors.",
+                                  "%d lines applied after"
+                                  " fixing whitespace errors.",
+                                  state->applied_after_fixing_ws),
+                               state->applied_after_fixing_ws);
+               else if (state->whitespace_error)
+                       warning(Q_("%d line adds whitespace errors.",
+                                  "%d lines add whitespace errors.",
+                                  state->whitespace_error),
+                               state->whitespace_error);
+       }
+
+       if (state->update_index) {
+               res = write_locked_index(&the_index, state->lock_file, COMMIT_LOCK);
+               if (res) {
+                       error(_("Unable to write new index file"));
+                       res = -128;
+                       goto end;
+               }
+               state->newfd = -1;
+       }
+
+       res = !!errs;
+
+end:
+       if (state->newfd >= 0) {
+               rollback_lock_file(state->lock_file);
+               state->newfd = -1;
+       }
+
+       if (state->apply_verbosity <= verbosity_silent) {
+               set_error_routine(state->saved_error_routine);
+               set_warn_routine(state->saved_warn_routine);
+       }
+
+       if (res > -1)
+               return res;
+       return (res == -1 ? 1 : 128);
+}
+
+int apply_parse_options(int argc, const char **argv,
+                       struct apply_state *state,
+                       int *force_apply, int *options,
+                       const char * const *apply_usage)
+{
+       struct option builtin_apply_options[] = {
+               { OPTION_CALLBACK, 0, "exclude", state, N_("path"),
+                       N_("don't apply changes matching the given path"),
+                       0, apply_option_parse_exclude },
+               { OPTION_CALLBACK, 0, "include", state, N_("path"),
+                       N_("apply changes matching the given path"),
+                       0, apply_option_parse_include },
+               { OPTION_CALLBACK, 'p', NULL, state, N_("num"),
+                       N_("remove <num> leading slashes from traditional diff paths"),
+                       0, apply_option_parse_p },
+               OPT_BOOL(0, "no-add", &state->no_add,
+                       N_("ignore additions made by the patch")),
+               OPT_BOOL(0, "stat", &state->diffstat,
+                       N_("instead of applying the patch, output diffstat for the input")),
+               OPT_NOOP_NOARG(0, "allow-binary-replacement"),
+               OPT_NOOP_NOARG(0, "binary"),
+               OPT_BOOL(0, "numstat", &state->numstat,
+                       N_("show number of added and deleted lines in decimal notation")),
+               OPT_BOOL(0, "summary", &state->summary,
+                       N_("instead of applying the patch, output a summary for the input")),
+               OPT_BOOL(0, "check", &state->check,
+                       N_("instead of applying the patch, see if the patch is applicable")),
+               OPT_BOOL(0, "index", &state->check_index,
+                       N_("make sure the patch is applicable to the current index")),
+               OPT_BOOL(0, "cached", &state->cached,
+                       N_("apply a patch without touching the working tree")),
+               OPT_BOOL(0, "unsafe-paths", &state->unsafe_paths,
+                       N_("accept a patch that touches outside the working area")),
+               OPT_BOOL(0, "apply", force_apply,
+                       N_("also apply the patch (use with --stat/--summary/--check)")),
+               OPT_BOOL('3', "3way", &state->threeway,
+                        N_( "attempt three-way merge if a patch does not apply")),
+               OPT_FILENAME(0, "build-fake-ancestor", &state->fake_ancestor,
+                       N_("build a temporary index based on embedded index information")),
+               /* Think twice before adding "--nul" synonym to this */
+               OPT_SET_INT('z', NULL, &state->line_termination,
+                       N_("paths are separated with NUL character"), '\0'),
+               OPT_INTEGER('C', NULL, &state->p_context,
+                               N_("ensure at least <n> lines of context match")),
+               { OPTION_CALLBACK, 0, "whitespace", state, N_("action"),
+                       N_("detect new or modified lines that have whitespace errors"),
+                       0, apply_option_parse_whitespace },
+               { OPTION_CALLBACK, 0, "ignore-space-change", state, NULL,
+                       N_("ignore changes in whitespace when finding context"),
+                       PARSE_OPT_NOARG, apply_option_parse_space_change },
+               { OPTION_CALLBACK, 0, "ignore-whitespace", state, NULL,
+                       N_("ignore changes in whitespace when finding context"),
+                       PARSE_OPT_NOARG, apply_option_parse_space_change },
+               OPT_BOOL('R', "reverse", &state->apply_in_reverse,
+                       N_("apply the patch in reverse")),
+               OPT_BOOL(0, "unidiff-zero", &state->unidiff_zero,
+                       N_("don't expect at least one line of context")),
+               OPT_BOOL(0, "reject", &state->apply_with_reject,
+                       N_("leave the rejected hunks in corresponding *.rej files")),
+               OPT_BOOL(0, "allow-overlap", &state->allow_overlap,
+                       N_("allow overlapping hunks")),
+               OPT__VERBOSE(&state->apply_verbosity, N_("be verbose")),
+               OPT_BIT(0, "inaccurate-eof", options,
+                       N_("tolerate incorrectly detected missing new-line at the end of file"),
+                       APPLY_OPT_INACCURATE_EOF),
+               OPT_BIT(0, "recount", options,
+                       N_("do not trust the line counts in the hunk headers"),
+                       APPLY_OPT_RECOUNT),
+               { OPTION_CALLBACK, 0, "directory", state, N_("root"),
+                       N_("prepend <root> to all filenames"),
+                       0, apply_option_parse_directory },
+               OPT_END()
+       };
+
+       return parse_options(argc, argv, state->prefix, builtin_apply_options, apply_usage, 0);
+}
diff --git a/apply.h b/apply.h
new file mode 100644 (file)
index 0000000..b3d6783
--- /dev/null
+++ b/apply.h
@@ -0,0 +1,137 @@
+#ifndef APPLY_H
+#define APPLY_H
+
+enum apply_ws_error_action {
+       nowarn_ws_error,
+       warn_on_ws_error,
+       die_on_ws_error,
+       correct_ws_error
+};
+
+enum apply_ws_ignore {
+       ignore_ws_none,
+       ignore_ws_change
+};
+
+enum apply_verbosity {
+       verbosity_silent = -1,
+       verbosity_normal = 0,
+       verbosity_verbose = 1
+};
+
+/*
+ * We need to keep track of how symlinks in the preimage are
+ * manipulated by the patches.  A patch to add a/b/c where a/b
+ * is a symlink should not be allowed to affect the directory
+ * the symlink points at, but if the same patch removes a/b,
+ * it is perfectly fine, as the patch removes a/b to make room
+ * to create a directory a/b so that a/b/c can be created.
+ *
+ * See also "struct string_list symlink_changes" in "struct
+ * apply_state".
+ */
+#define APPLY_SYMLINK_GOES_AWAY 01
+#define APPLY_SYMLINK_IN_RESULT 02
+
+struct apply_state {
+       const char *prefix;
+       int prefix_length;
+
+       /* These are lock_file related */
+       struct lock_file *lock_file;
+       int newfd;
+
+       /* These control what gets looked at and modified */
+       int apply; /* this is not a dry-run */
+       int cached; /* apply to the index only */
+       int check; /* preimage must match working tree, don't actually apply */
+       int check_index; /* preimage must match the indexed version */
+       int update_index; /* check_index && apply */
+
+       /* These control cosmetic aspect of the output */
+       int diffstat; /* just show a diffstat, and don't actually apply */
+       int numstat; /* just show a numeric diffstat, and don't actually apply */
+       int summary; /* just report creation, deletion, etc, and don't actually apply */
+
+       /* These boolean parameters control how the apply is done */
+       int allow_overlap;
+       int apply_in_reverse;
+       int apply_with_reject;
+       int no_add;
+       int threeway;
+       int unidiff_zero;
+       int unsafe_paths;
+
+       /* Other non boolean parameters */
+       const char *index_file;
+       enum apply_verbosity apply_verbosity;
+       const char *fake_ancestor;
+       const char *patch_input_file;
+       int line_termination;
+       struct strbuf root;
+       int p_value;
+       int p_value_known;
+       unsigned int p_context;
+
+       /* Exclude and include path parameters */
+       struct string_list limit_by_name;
+       int has_include;
+
+       /* Various "current state" */
+       int linenr; /* current line number */
+       struct string_list symlink_changes; /* we have to track symlinks */
+
+       /*
+        * For "diff-stat" like behaviour, we keep track of the biggest change
+        * we've seen, and the longest filename. That allows us to do simple
+        * scaling.
+        */
+       int max_change;
+       int max_len;
+
+       /*
+        * Records filenames that have been touched, in order to handle
+        * the case where more than one patches touch the same file.
+        */
+       struct string_list fn_table;
+
+       /*
+        * This is to save reporting routines before using
+        * set_error_routine() or set_warn_routine() to install muting
+        * routines when in verbosity_silent mode.
+        */
+       void (*saved_error_routine)(const char *err, va_list params);
+       void (*saved_warn_routine)(const char *warn, va_list params);
+
+       /* These control whitespace errors */
+       enum apply_ws_error_action ws_error_action;
+       enum apply_ws_ignore ws_ignore_action;
+       const char *whitespace_option;
+       int whitespace_error;
+       int squelch_whitespace_errors;
+       int applied_after_fixing_ws;
+};
+
+extern int apply_parse_options(int argc, const char **argv,
+                              struct apply_state *state,
+                              int *force_apply, int *options,
+                              const char * const *apply_usage);
+extern int init_apply_state(struct apply_state *state,
+                           const char *prefix,
+                           struct lock_file *lock_file);
+extern void clear_apply_state(struct apply_state *state);
+extern int check_apply_state(struct apply_state *state, int force_apply);
+
+/*
+ * Some aspects of the apply behavior are controlled by the following
+ * bits in the "options" parameter passed to apply_all_patches().
+ */
+#define APPLY_OPT_INACCURATE_EOF       (1<<0) /* accept inaccurate eof */
+#define APPLY_OPT_RECOUNT              (1<<1) /* accept inaccurate line count */
+
+extern int apply_all_patches(struct apply_state *state,
+                            int argc,
+                            const char **argv,
+                            int options);
+
+#endif
index 9db47357b02d4c33fc4e2d1edb8d948b2b3a496f..b429a8d974a02b06c9c6bc46850f4c9fae4a6d01 100644 (file)
@@ -554,11 +554,18 @@ static void dos_time(time_t *time, int *dos_date, int *dos_time)
        *dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
 }
 
+static int archive_zip_config(const char *var, const char *value, void *data)
+{
+       return userdiff_config(var, value);
+}
+
 static int write_zip_archive(const struct archiver *ar,
                             struct archiver_args *args)
 {
        int err;
 
+       git_config(archive_zip_config, NULL);
+
        dos_time(&args->time, &zip_date, &zip_time);
 
        zip_dir = xmalloc(ZIP_DIRECTORY_MIN_SIZE);
index dde1ab4c79f87c00ffdd42c37073f459e76da315..60b889198656f42a1d073503c4da5886bf0a0526 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -87,19 +87,6 @@ void *sha1_file_to_archive(const struct archiver_args *args,
        return buffer;
 }
 
-static void setup_archive_check(struct git_attr_check *check)
-{
-       static struct git_attr *attr_export_ignore;
-       static struct git_attr *attr_export_subst;
-
-       if (!attr_export_ignore) {
-               attr_export_ignore = git_attr("export-ignore");
-               attr_export_subst = git_attr("export-subst");
-       }
-       check[0].attr = attr_export_ignore;
-       check[1].attr = attr_export_subst;
-}
-
 struct directory {
        struct directory *up;
        struct object_id oid;
@@ -120,10 +107,10 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
                void *context)
 {
        static struct strbuf path = STRBUF_INIT;
+       static struct attr_check *check;
        struct archiver_context *c = context;
        struct archiver_args *args = c->args;
        write_archive_entry_fn_t write_entry = c->write_entry;
-       struct git_attr_check check[2];
        const char *path_without_prefix;
        int err;
 
@@ -137,11 +124,12 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
                strbuf_addch(&path, '/');
        path_without_prefix = path.buf + args->baselen;
 
-       setup_archive_check(check);
-       if (!git_check_attr(path_without_prefix, ARRAY_SIZE(check), check)) {
-               if (ATTR_TRUE(check[0].value))
+       if (!check)
+               check = attr_check_initl("export-ignore", "export-subst", NULL);
+       if (!git_check_attr(path_without_prefix, check)) {
+               if (ATTR_TRUE(check->items[0].value))
                        return 0;
-               args->convert = ATTR_TRUE(check[1].value);
+               args->convert = ATTR_TRUE(check->items[1].value);
        }
 
        if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
@@ -504,15 +492,11 @@ static int parse_archive_args(int argc, const char **argv,
 }
 
 int write_archive(int argc, const char **argv, const char *prefix,
-                 int setup_prefix, const char *name_hint, int remote)
+                 const char *name_hint, int remote)
 {
-       int nongit = 0;
        const struct archiver *ar = NULL;
        struct archiver_args args;
 
-       if (setup_prefix && prefix == NULL)
-               prefix = setup_git_directory_gently(&nongit);
-
        git_config_get_bool("uploadarchive.allowunreachable", &remote_allow_unreachable);
        git_config(git_default_config, NULL);
 
@@ -520,7 +504,7 @@ int write_archive(int argc, const char **argv, const char *prefix,
        init_zip_archiver();
 
        argc = parse_archive_args(argc, argv, &ar, &args, name_hint, remote);
-       if (nongit) {
+       if (!startup_info->have_repository) {
                /*
                 * We know this will die() with an error, so we could just
                 * die ourselves; but its error message will be more specific
index 4a791e1fed4ecb0fc89b309b294acc93793886f0..415e0152e2cf42827b1b370d2e5c78f6e91bd961 100644 (file)
--- a/archive.h
+++ b/archive.h
@@ -36,7 +36,7 @@ typedef int (*write_archive_entry_fn_t)(struct archiver_args *args,
                                        unsigned int mode);
 
 extern int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry);
-extern int write_archive(int argc, const char **argv, const char *prefix, int setup_prefix, const char *name_hint, int remote);
+extern int write_archive(int argc, const char **argv, const char *prefix, const char *name_hint, int remote);
 
 const char *archive_format_from_filename(const char *filename);
 extern void *sha1_file_to_archive(const struct archiver_args *args,
diff --git a/attr.c b/attr.c
index eec5d7d15a48fb9ca2fdd43d94ae515191d573f1..7e2134471cb4afc1b891208ebe4bebd6ad55571d 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -13,6 +13,8 @@
 #include "attr.h"
 #include "dir.h"
 #include "utf8.h"
+#include "quote.h"
+#include "thread-utils.h"
 
 const char git_attr__true[] = "(builtin)true";
 const char git_attr__false[] = "\0(builtin)false";
@@ -22,99 +24,234 @@ static const char git_attr__unknown[] = "(builtin)unknown";
 #define ATTR__UNSET NULL
 #define ATTR__UNKNOWN git_attr__unknown
 
-/* This is a randomly chosen prime. */
-#define HASHSIZE 257
-
 #ifndef DEBUG_ATTR
 #define DEBUG_ATTR 0
 #endif
 
 struct git_attr {
-       struct git_attr *next;
-       unsigned h;
-       int attr_nr;
-       int maybe_macro;
-       int maybe_real;
-       char name[FLEX_ARRAY];
+       int attr_nr; /* unique attribute number */
+       char name[FLEX_ARRAY]; /* attribute name */
 };
-static int attr_nr;
-static int cannot_trust_maybe_real;
-
-static struct git_attr_check *check_all_attr;
-static struct git_attr *(git_attr_hash[HASHSIZE]);
 
-char *git_attr_name(struct git_attr *attr)
+const char *git_attr_name(const struct git_attr *attr)
 {
        return attr->name;
 }
 
-static unsigned hash_name(const char *name, int namelen)
+struct attr_hashmap {
+       struct hashmap map;
+#ifndef NO_PTHREADS
+       pthread_mutex_t mutex;
+#endif
+};
+
+static inline void hashmap_lock(struct attr_hashmap *map)
 {
-       unsigned val = 0, c;
+#ifndef NO_PTHREADS
+       pthread_mutex_lock(&map->mutex);
+#endif
+}
 
-       while (namelen--) {
-               c = *name++;
-               val = ((val << 7) | (val >> 22)) ^ c;
+static inline void hashmap_unlock(struct attr_hashmap *map)
+{
+#ifndef NO_PTHREADS
+       pthread_mutex_unlock(&map->mutex);
+#endif
+}
+
+/*
+ * The global dictionary of all interned attributes.  This
+ * is a singleton object which is shared between threads.
+ * Access to this dictionary must be surrounded with a mutex.
+ */
+static struct attr_hashmap g_attr_hashmap;
+
+/* The container for objects stored in "struct attr_hashmap" */
+struct attr_hash_entry {
+       struct hashmap_entry ent; /* must be the first member! */
+       const char *key; /* the key; memory should be owned by value */
+       size_t keylen; /* length of the key */
+       void *value; /* the stored value */
+};
+
+/* attr_hashmap comparison function */
+static int attr_hash_entry_cmp(const struct attr_hash_entry *a,
+                              const struct attr_hash_entry *b,
+                              void *unused)
+{
+       return (a->keylen != b->keylen) || strncmp(a->key, b->key, a->keylen);
+}
+
+/* Initialize an 'attr_hashmap' object */
+static void attr_hashmap_init(struct attr_hashmap *map)
+{
+       hashmap_init(&map->map, (hashmap_cmp_fn) attr_hash_entry_cmp, 0);
+}
+
+/*
+ * Retrieve the 'value' stored in a hashmap given the provided 'key'.
+ * If there is no matching entry, return NULL.
+ */
+static void *attr_hashmap_get(struct attr_hashmap *map,
+                             const char *key, size_t keylen)
+{
+       struct attr_hash_entry k;
+       struct attr_hash_entry *e;
+
+       if (!map->map.tablesize)
+               attr_hashmap_init(map);
+
+       hashmap_entry_init(&k, memhash(key, keylen));
+       k.key = key;
+       k.keylen = keylen;
+       e = hashmap_get(&map->map, &k, NULL);
+
+       return e ? e->value : NULL;
+}
+
+/* Add 'value' to a hashmap based on the provided 'key'. */
+static void attr_hashmap_add(struct attr_hashmap *map,
+                            const char *key, size_t keylen,
+                            void *value)
+{
+       struct attr_hash_entry *e;
+
+       if (!map->map.tablesize)
+               attr_hashmap_init(map);
+
+       e = xmalloc(sizeof(struct attr_hash_entry));
+       hashmap_entry_init(e, memhash(key, keylen));
+       e->key = key;
+       e->keylen = keylen;
+       e->value = value;
+
+       hashmap_add(&map->map, e);
+}
+
+struct all_attrs_item {
+       const struct git_attr *attr;
+       const char *value;
+       /*
+        * If 'macro' is non-NULL, indicates that 'attr' is a macro based on
+        * the current attribute stack and contains a pointer to the match_attr
+        * definition of the macro
+        */
+       const struct match_attr *macro;
+};
+
+/*
+ * Reallocate and reinitialize the array of all attributes (which is used in
+ * the attribute collection process) in 'check' based on the global dictionary
+ * of attributes.
+ */
+static void all_attrs_init(struct attr_hashmap *map, struct attr_check *check)
+{
+       int i;
+
+       hashmap_lock(map);
+
+       if (map->map.size < check->all_attrs_nr)
+               die("BUG: interned attributes shouldn't be deleted");
+
+       /*
+        * If the number of attributes in the global dictionary has increased
+        * (or this attr_check instance doesn't have an initialized all_attrs
+        * field), reallocate the provided attr_check instance's all_attrs
+        * field and fill each entry with its corresponding git_attr.
+        */
+       if (map->map.size != check->all_attrs_nr) {
+               struct attr_hash_entry *e;
+               struct hashmap_iter iter;
+               hashmap_iter_init(&map->map, &iter);
+
+               REALLOC_ARRAY(check->all_attrs, map->map.size);
+               check->all_attrs_nr = map->map.size;
+
+               while ((e = hashmap_iter_next(&iter))) {
+                       const struct git_attr *a = e->value;
+                       check->all_attrs[a->attr_nr].attr = a;
+               }
+       }
+
+       hashmap_unlock(map);
+
+       /*
+        * Re-initialize every entry in check->all_attrs.
+        * This re-initialization can live outside of the locked region since
+        * the attribute dictionary is no longer being accessed.
+        */
+       for (i = 0; i < check->all_attrs_nr; i++) {
+               check->all_attrs[i].value = ATTR__UNKNOWN;
+               check->all_attrs[i].macro = NULL;
        }
-       return val;
 }
 
-static int invalid_attr_name(const char *name, int namelen)
+static int attr_name_valid(const char *name, size_t namelen)
 {
        /*
         * Attribute name cannot begin with '-' and must consist of
         * characters from [-A-Za-z0-9_.].
         */
        if (namelen <= 0 || *name == '-')
-               return -1;
+               return 0;
        while (namelen--) {
                char ch = *name++;
                if (! (ch == '-' || ch == '.' || ch == '_' ||
                       ('0' <= ch && ch <= '9') ||
                       ('a' <= ch && ch <= 'z') ||
                       ('A' <= ch && ch <= 'Z')) )
-                       return -1;
+                       return 0;
        }
-       return 0;
+       return 1;
+}
+
+static void report_invalid_attr(const char *name, size_t len,
+                               const char *src, int lineno)
+{
+       struct strbuf err = STRBUF_INIT;
+       strbuf_addf(&err, _("%.*s is not a valid attribute name"),
+                   (int) len, name);
+       fprintf(stderr, "%s: %s:%d\n", err.buf, src, lineno);
+       strbuf_release(&err);
 }
 
-static struct git_attr *git_attr_internal(const char *name, int len)
+/*
+ * Given a 'name', lookup and return the corresponding attribute in the global
+ * dictionary.  If no entry is found, create a new attribute and store it in
+ * the dictionary.
+ */
+static const struct git_attr *git_attr_internal(const char *name, int namelen)
 {
-       unsigned hval = hash_name(name, len);
-       unsigned pos = hval % HASHSIZE;
        struct git_attr *a;
 
-       for (a = git_attr_hash[pos]; a; a = a->next) {
-               if (a->h == hval &&
-                   !memcmp(a->name, name, len) && !a->name[len])
-                       return a;
+       if (!attr_name_valid(name, namelen))
+               return NULL;
+
+       hashmap_lock(&g_attr_hashmap);
+
+       a = attr_hashmap_get(&g_attr_hashmap, name, namelen);
+
+       if (!a) {
+               FLEX_ALLOC_MEM(a, name, name, namelen);
+               a->attr_nr = g_attr_hashmap.map.size;
+
+               attr_hashmap_add(&g_attr_hashmap, a->name, namelen, a);
+               assert(a->attr_nr == (g_attr_hashmap.map.size - 1));
        }
 
-       if (invalid_attr_name(name, len))
-               return NULL;
+       hashmap_unlock(&g_attr_hashmap);
 
-       FLEX_ALLOC_MEM(a, name, name, len);
-       a->h = hval;
-       a->next = git_attr_hash[pos];
-       a->attr_nr = attr_nr++;
-       a->maybe_macro = 0;
-       a->maybe_real = 0;
-       git_attr_hash[pos] = a;
-
-       REALLOC_ARRAY(check_all_attr, attr_nr);
-       check_all_attr[a->attr_nr].attr = a;
-       check_all_attr[a->attr_nr].value = ATTR__UNKNOWN;
        return a;
 }
 
-struct git_attr *git_attr(const char *name)
+const struct git_attr *git_attr(const char *name)
 {
        return git_attr_internal(name, strlen(name));
 }
 
 /* What does a matched pattern decide? */
 struct attr_state {
-       struct git_attr *attr;
+       const struct git_attr *attr;
        const char *setto;
 };
 
@@ -131,9 +268,8 @@ struct pattern {
  * If is_macro is true, then u.attr is a pointer to the git_attr being
  * defined.
  *
- * If is_macro is false, then u.pattern points at the filename pattern
- * to which the rule applies.  (The memory pointed to is part of the
- * memory block allocated for the match_attr instance.)
+ * If is_macro is false, then u.pat is the filename pattern to which the
+ * rule applies.
  *
  * In either case, num_attr is the number of attributes affected by
  * this rule, and state is an array listing them.  The attributes are
@@ -142,7 +278,7 @@ struct pattern {
 struct match_attr {
        union {
                struct pattern pat;
-               struct git_attr *attr;
+               const struct git_attr *attr;
        } u;
        char is_macro;
        unsigned num_attr;
@@ -177,13 +313,17 @@ static const char *parse_attr(const char *src, int lineno, const char *cp,
                        cp++;
                        len--;
                }
-               if (invalid_attr_name(cp, len)) {
-                       fprintf(stderr,
-                               "%.*s is not a valid attribute name: %s:%d\n",
-                               len, cp, src, lineno);
+               if (!attr_name_valid(cp, len)) {
+                       report_invalid_attr(cp, len, src, lineno);
                        return NULL;
                }
        } else {
+               /*
+                * As this function is always called twice, once with
+                * e == NULL in the first pass and then e != NULL in
+                * the second pass, no need for attr_name_valid()
+                * check here.
+                */
                if (*cp == '-' || *cp == '!') {
                        e->setto = (*cp == '-') ? ATTR__FALSE : ATTR__UNSET;
                        cp++;
@@ -207,41 +347,47 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
        const char *cp, *name, *states;
        struct match_attr *res = NULL;
        int is_macro;
+       struct strbuf pattern = STRBUF_INIT;
 
        cp = line + strspn(line, blank);
        if (!*cp || *cp == '#')
                return NULL;
        name = cp;
-       namelen = strcspn(name, blank);
+
+       if (*cp == '"' && !unquote_c_style(&pattern, name, &states)) {
+               name = pattern.buf;
+               namelen = pattern.len;
+       } else {
+               namelen = strcspn(name, blank);
+               states = name + namelen;
+       }
+
        if (strlen(ATTRIBUTE_MACRO_PREFIX) < namelen &&
            starts_with(name, ATTRIBUTE_MACRO_PREFIX)) {
                if (!macro_ok) {
                        fprintf(stderr, "%s not allowed: %s:%d\n",
                                name, src, lineno);
-                       return NULL;
+                       goto fail_return;
                }
                is_macro = 1;
                name += strlen(ATTRIBUTE_MACRO_PREFIX);
                name += strspn(name, blank);
                namelen = strcspn(name, blank);
-               if (invalid_attr_name(name, namelen)) {
-                       fprintf(stderr,
-                               "%.*s is not a valid attribute name: %s:%d\n",
-                               namelen, name, src, lineno);
-                       return NULL;
+               if (!attr_name_valid(name, namelen)) {
+                       report_invalid_attr(name, namelen, src, lineno);
+                       goto fail_return;
                }
        }
        else
                is_macro = 0;
 
-       states = name + namelen;
        states += strspn(states, blank);
 
        /* First pass to count the attr_states */
        for (cp = states, num_attr = 0; *cp; num_attr++) {
                cp = parse_attr(src, lineno, cp, NULL);
                if (!cp)
-                       return NULL;
+                       goto fail_return;
        }
 
        res = xcalloc(1,
@@ -250,7 +396,6 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
                      (is_macro ? 0 : namelen + 1));
        if (is_macro) {
                res->u.attr = git_attr_internal(name, namelen);
-               res->u.attr->maybe_macro = 1;
        } else {
                char *p = (char *)&(res->state[num_attr]);
                memcpy(p, name, namelen);
@@ -262,7 +407,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
                if (res->u.pat.flags & EXC_FLAG_NEGATIVE) {
                        warning(_("Negative patterns are ignored in git attributes\n"
                                  "Use '\\!' for literal leading exclamation."));
-                       return NULL;
+                       goto fail_return;
                }
        }
        res->is_macro = is_macro;
@@ -271,13 +416,15 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
        /* Second pass to fill the attr_states */
        for (cp = states, i = 0; *cp; i++) {
                cp = parse_attr(src, lineno, cp, &(res->state[i]));
-               if (!is_macro)
-                       res->state[i].attr->maybe_real = 1;
-               if (res->state[i].attr->maybe_macro)
-                       cannot_trust_maybe_real = 1;
        }
 
+       strbuf_release(&pattern);
        return res;
+
+fail_return:
+       strbuf_release(&pattern);
+       free(res);
+       return NULL;
 }
 
 /*
@@ -295,19 +442,19 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
  * directory (again, reading the file from top to bottom) down to the
  * current directory, and then scan the list backwards to find the first match.
  * This is exactly the same as what is_excluded() does in dir.c to deal with
- * .gitignore
+ * .gitignore file and info/excludes file as a fallback.
  */
 
-static struct attr_stack {
+struct attr_stack {
        struct attr_stack *prev;
        char *origin;
        size_t originlen;
        unsigned num_matches;
        unsigned alloc;
        struct match_attr **attrs;
-} *attr_stack;
+};
 
-static void free_attr_elem(struct attr_stack *e)
+static void attr_stack_free(struct attr_stack *e)
 {
        int i;
        free(e->origin);
@@ -330,6 +477,190 @@ static void free_attr_elem(struct attr_stack *e)
        free(e);
 }
 
+static void drop_attr_stack(struct attr_stack **stack)
+{
+       while (*stack) {
+               struct attr_stack *elem = *stack;
+               *stack = elem->prev;
+               attr_stack_free(elem);
+       }
+}
+
+/* List of all attr_check structs; access should be surrounded by mutex */
+static struct check_vector {
+       size_t nr;
+       size_t alloc;
+       struct attr_check **checks;
+#ifndef NO_PTHREADS
+       pthread_mutex_t mutex;
+#endif
+} check_vector;
+
+static inline void vector_lock(void)
+{
+#ifndef NO_PTHREADS
+       pthread_mutex_lock(&check_vector.mutex);
+#endif
+}
+
+static inline void vector_unlock(void)
+{
+#ifndef NO_PTHREADS
+       pthread_mutex_unlock(&check_vector.mutex);
+#endif
+}
+
+static void check_vector_add(struct attr_check *c)
+{
+       vector_lock();
+
+       ALLOC_GROW(check_vector.checks,
+                  check_vector.nr + 1,
+                  check_vector.alloc);
+       check_vector.checks[check_vector.nr++] = c;
+
+       vector_unlock();
+}
+
+static void check_vector_remove(struct attr_check *check)
+{
+       int i;
+
+       vector_lock();
+
+       /* Find entry */
+       for (i = 0; i < check_vector.nr; i++)
+               if (check_vector.checks[i] == check)
+                       break;
+
+       if (i >= check_vector.nr)
+               die("BUG: no entry found");
+
+       /* shift entries over */
+       for (; i < check_vector.nr - 1; i++)
+               check_vector.checks[i] = check_vector.checks[i + 1];
+
+       check_vector.nr--;
+
+       vector_unlock();
+}
+
+/* Iterate through all attr_check instances and drop their stacks */
+static void drop_all_attr_stacks(void)
+{
+       int i;
+
+       vector_lock();
+
+       for (i = 0; i < check_vector.nr; i++) {
+               drop_attr_stack(&check_vector.checks[i]->stack);
+       }
+
+       vector_unlock();
+}
+
+struct attr_check *attr_check_alloc(void)
+{
+       struct attr_check *c = xcalloc(1, sizeof(struct attr_check));
+
+       /* save pointer to the check struct */
+       check_vector_add(c);
+
+       return c;
+}
+
+struct attr_check *attr_check_initl(const char *one, ...)
+{
+       struct attr_check *check;
+       int cnt;
+       va_list params;
+       const char *param;
+
+       va_start(params, one);
+       for (cnt = 1; (param = va_arg(params, const char *)) != NULL; cnt++)
+               ;
+       va_end(params);
+
+       check = attr_check_alloc();
+       check->nr = cnt;
+       check->alloc = cnt;
+       check->items = xcalloc(cnt, sizeof(struct attr_check_item));
+
+       check->items[0].attr = git_attr(one);
+       va_start(params, one);
+       for (cnt = 1; cnt < check->nr; cnt++) {
+               const struct git_attr *attr;
+               param = va_arg(params, const char *);
+               if (!param)
+                       die("BUG: counted %d != ended at %d",
+                           check->nr, cnt);
+               attr = git_attr(param);
+               if (!attr)
+                       die("BUG: %s: not a valid attribute name", param);
+               check->items[cnt].attr = attr;
+       }
+       va_end(params);
+       return check;
+}
+
+struct attr_check *attr_check_dup(const struct attr_check *check)
+{
+       struct attr_check *ret;
+
+       if (!check)
+               return NULL;
+
+       ret = attr_check_alloc();
+
+       ret->nr = check->nr;
+       ret->alloc = check->alloc;
+       ALLOC_ARRAY(ret->items, ret->nr);
+       COPY_ARRAY(ret->items, check->items, ret->nr);
+
+       return ret;
+}
+
+struct attr_check_item *attr_check_append(struct attr_check *check,
+                                         const struct git_attr *attr)
+{
+       struct attr_check_item *item;
+
+       ALLOC_GROW(check->items, check->nr + 1, check->alloc);
+       item = &check->items[check->nr++];
+       item->attr = attr;
+       return item;
+}
+
+void attr_check_reset(struct attr_check *check)
+{
+       check->nr = 0;
+}
+
+void attr_check_clear(struct attr_check *check)
+{
+       free(check->items);
+       check->items = NULL;
+       check->alloc = 0;
+       check->nr = 0;
+
+       free(check->all_attrs);
+       check->all_attrs = NULL;
+       check->all_attrs_nr = 0;
+
+       drop_attr_stack(&check->stack);
+}
+
+void attr_check_free(struct attr_check *check)
+{
+       if (check) {
+               /* Remove check from the check vector */
+               check_vector_remove(check);
+
+               attr_check_clear(check);
+               free(check);
+       }
+}
+
 static const char *builtin_attr[] = {
        "[attr]binary -diff -merge -text",
        NULL,
@@ -362,9 +693,31 @@ static struct attr_stack *read_attr_from_array(const char **list)
        return res;
 }
 
+/*
+ * Callers into the attribute system assume there is a single, system-wide
+ * global state where attributes are read from and when the state is flipped by
+ * calling git_attr_set_direction(), the stack frames that have been
+ * constructed need to be discarded so so that subsequent calls into the
+ * attribute system will lazily read from the right place.  Since changing
+ * direction causes a global paradigm shift, it should not ever be called while
+ * another thread could potentially be calling into the attribute system.
+ */
 static enum git_attr_direction direction;
 static struct index_state *use_index;
 
+void git_attr_set_direction(enum git_attr_direction new_direction,
+                           struct index_state *istate)
+{
+       if (is_bare_repository() && new_direction != GIT_ATTR_INDEX)
+               die("BUG: non-INDEX attr direction in a bare repo");
+
+       if (new_direction != direction)
+               drop_all_attr_stacks();
+
+       direction = new_direction;
+       use_index = istate;
+}
+
 static struct attr_stack *read_attr_from_file(const char *path, int macro_ok)
 {
        FILE *fp = fopen(path, "r");
@@ -402,8 +755,8 @@ static struct attr_stack *read_attr_from_index(const char *path, int macro_ok)
        for (sp = buf; *sp; ) {
                char *ep;
                int more;
-               for (ep = sp; *ep && *ep != '\n'; ep++)
-                       ;
+
+               ep = strchrnul(sp, '\n');
                more = (*ep == '\n');
                *ep = '\0';
                handle_attr_line(res, sp, path, ++lineno, macro_ok);
@@ -415,25 +768,28 @@ static struct attr_stack *read_attr_from_index(const char *path, int macro_ok)
 
 static struct attr_stack *read_attr(const char *path, int macro_ok)
 {
-       struct attr_stack *res;
+       struct attr_stack *res = NULL;
 
-       if (direction == GIT_ATTR_CHECKOUT) {
+       if (direction == GIT_ATTR_INDEX) {
                res = read_attr_from_index(path, macro_ok);
-               if (!res)
-                       res = read_attr_from_file(path, macro_ok);
-       }
-       else if (direction == GIT_ATTR_CHECKIN) {
-               res = read_attr_from_file(path, macro_ok);
-               if (!res)
-                       /*
-                        * There is no checked out .gitattributes file there, but
-                        * we might have it in the index.  We allow operation in a
-                        * sparsely checked out work tree, so read from it.
-                        */
+       } else if (!is_bare_repository()) {
+               if (direction == GIT_ATTR_CHECKOUT) {
                        res = read_attr_from_index(path, macro_ok);
+                       if (!res)
+                               res = read_attr_from_file(path, macro_ok);
+               } else if (direction == GIT_ATTR_CHECKIN) {
+                       res = read_attr_from_file(path, macro_ok);
+                       if (!res)
+                               /*
+                                * There is no checked out .gitattributes file
+                                * there, but we might have it in the index.
+                                * We allow operation in a sparsely checked out
+                                * work tree, so read from it.
+                                */
+                               res = read_attr_from_index(path, macro_ok);
+               }
        }
-       else
-               res = read_attr_from_index(path, macro_ok);
+
        if (!res)
                res = xcalloc(1, sizeof(*res));
        return res;
@@ -464,16 +820,7 @@ static void debug_set(const char *what, const char *match, struct git_attr *attr
 #define debug_push(a) do { ; } while (0)
 #define debug_pop(a) do { ; } while (0)
 #define debug_set(a,b,c,d) do { ; } while (0)
-#endif
-
-static void drop_attr_stack(void)
-{
-       while (attr_stack) {
-               struct attr_stack *elem = attr_stack;
-               attr_stack = elem->prev;
-               free_attr_elem(elem);
-       }
-}
+#endif /* DEBUG_ATTR */
 
 static const char *git_etc_gitattributes(void)
 {
@@ -483,6 +830,14 @@ static const char *git_etc_gitattributes(void)
        return system_wide;
 }
 
+static const char *get_home_gitattributes(void)
+{
+       if (!git_attributes_file)
+               git_attributes_file = xdg_config_home("attributes");
+
+       return git_attributes_file;
+}
+
 static int git_attr_system(void)
 {
        return !git_env_bool("GIT_ATTR_NOSYSTEM", 0);
@@ -490,60 +845,60 @@ static int git_attr_system(void)
 
 static GIT_PATH_FUNC(git_path_info_attributes, INFOATTRIBUTES_FILE)
 
-static void bootstrap_attr_stack(void)
+static void push_stack(struct attr_stack **attr_stack_p,
+                      struct attr_stack *elem, char *origin, size_t originlen)
 {
-       struct attr_stack *elem;
+       if (elem) {
+               elem->origin = origin;
+               if (origin)
+                       elem->originlen = originlen;
+               elem->prev = *attr_stack_p;
+               *attr_stack_p = elem;
+       }
+}
 
-       if (attr_stack)
+static void bootstrap_attr_stack(struct attr_stack **stack)
+{
+       struct attr_stack *e;
+
+       if (*stack)
                return;
 
-       elem = read_attr_from_array(builtin_attr);
-       elem->origin = NULL;
-       elem->prev = attr_stack;
-       attr_stack = elem;
+       /* builtin frame */
+       e = read_attr_from_array(builtin_attr);
+       push_stack(stack, e, NULL, 0);
 
+       /* system-wide frame */
        if (git_attr_system()) {
-               elem = read_attr_from_file(git_etc_gitattributes(), 1);
-               if (elem) {
-                       elem->origin = NULL;
-                       elem->prev = attr_stack;
-                       attr_stack = elem;
-               }
+               e = read_attr_from_file(git_etc_gitattributes(), 1);
+               push_stack(stack, e, NULL, 0);
        }
 
-       if (!git_attributes_file)
-               git_attributes_file = xdg_config_home("attributes");
-       if (git_attributes_file) {
-               elem = read_attr_from_file(git_attributes_file, 1);
-               if (elem) {
-                       elem->origin = NULL;
-                       elem->prev = attr_stack;
-                       attr_stack = elem;
-               }
+       /* home directory */
+       if (get_home_gitattributes()) {
+               e = read_attr_from_file(get_home_gitattributes(), 1);
+               push_stack(stack, e, NULL, 0);
        }
 
-       if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
-               elem = read_attr(GITATTRIBUTES_FILE, 1);
-               elem->origin = xstrdup("");
-               elem->originlen = 0;
-               elem->prev = attr_stack;
-               attr_stack = elem;
-               debug_push(elem);
-       }
+       /* root directory */
+       e = read_attr(GITATTRIBUTES_FILE, 1);
+       push_stack(stack, e, xstrdup(""), 0);
 
-       elem = read_attr_from_file(git_path_info_attributes(), 1);
-       if (!elem)
-               elem = xcalloc(1, sizeof(*elem));
-       elem->origin = NULL;
-       elem->prev = attr_stack;
-       attr_stack = elem;
+       /* info frame */
+       if (startup_info->have_repository)
+               e = read_attr_from_file(git_path_info_attributes(), 1);
+       else
+               e = NULL;
+       if (!e)
+               e = xcalloc(1, sizeof(struct attr_stack));
+       push_stack(stack, e, NULL, 0);
 }
 
-static void prepare_attr_stack(const char *path, int dirlen)
+static void prepare_attr_stack(const char *path, int dirlen,
+                              struct attr_stack **stack)
 {
-       struct attr_stack *elem, *info;
-       int len;
-       const char *cp;
+       struct attr_stack *info;
+       struct strbuf pathbuf = STRBUF_INIT;
 
        /*
         * At the bottom of the attribute stack is the built-in
@@ -560,13 +915,13 @@ static void prepare_attr_stack(const char *path, int dirlen)
         * .gitattributes in deeper directories to shallower ones,
         * and finally use the built-in set as the default.
         */
-       bootstrap_attr_stack();
+       bootstrap_attr_stack(stack);
 
        /*
         * Pop the "info" one that is always at the top of the stack.
         */
-       info = attr_stack;
-       attr_stack = info->prev;
+       info = *stack;
+       *stack = info->prev;
 
        /*
         * Pop the ones from directories that are not the prefix of
@@ -574,59 +929,63 @@ static void prepare_attr_stack(const char *path, int dirlen)
         * the root one (whose origin is an empty string "") or the builtin
         * one (whose origin is NULL) without popping it.
         */
-       while (attr_stack->origin) {
-               int namelen = strlen(attr_stack->origin);
+       while ((*stack)->origin) {
+               int namelen = (*stack)->originlen;
+               struct attr_stack *elem;
 
-               elem = attr_stack;
+               elem = *stack;
                if (namelen <= dirlen &&
                    !strncmp(elem->origin, path, namelen) &&
                    (!namelen || path[namelen] == '/'))
                        break;
 
                debug_pop(elem);
-               attr_stack = elem->prev;
-               free_attr_elem(elem);
+               *stack = elem->prev;
+               attr_stack_free(elem);
        }
 
        /*
-        * Read from parent directories and push them down
+        * bootstrap_attr_stack() should have added, and the
+        * above loop should have stopped before popping, the
+        * root element whose attr_stack->origin is set to an
+        * empty string.
         */
-       if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
-               /*
-                * bootstrap_attr_stack() should have added, and the
-                * above loop should have stopped before popping, the
-                * root element whose attr_stack->origin is set to an
-                * empty string.
-                */
-               struct strbuf pathbuf = STRBUF_INIT;
-
-               assert(attr_stack->origin);
-               while (1) {
-                       len = strlen(attr_stack->origin);
-                       if (dirlen <= len)
-                               break;
-                       cp = memchr(path + len + 1, '/', dirlen - len - 1);
-                       if (!cp)
-                               cp = path + dirlen;
-                       strbuf_add(&pathbuf, path, cp - path);
+       assert((*stack)->origin);
+
+       strbuf_addstr(&pathbuf, (*stack)->origin);
+       /* Build up to the directory 'path' is in */
+       while (pathbuf.len < dirlen) {
+               size_t len = pathbuf.len;
+               struct attr_stack *next;
+               char *origin;
+
+               /* Skip path-separator */
+               if (len < dirlen && is_dir_sep(path[len]))
+                       len++;
+               /* Find the end of the next component */
+               while (len < dirlen && !is_dir_sep(path[len]))
+                       len++;
+
+               if (pathbuf.len > 0)
                        strbuf_addch(&pathbuf, '/');
-                       strbuf_addstr(&pathbuf, GITATTRIBUTES_FILE);
-                       elem = read_attr(pathbuf.buf, 0);
-                       strbuf_setlen(&pathbuf, cp - path);
-                       elem->origin = strbuf_detach(&pathbuf, &elem->originlen);
-                       elem->prev = attr_stack;
-                       attr_stack = elem;
-                       debug_push(elem);
-               }
+               strbuf_add(&pathbuf, path + pathbuf.len, (len - pathbuf.len));
+               strbuf_addf(&pathbuf, "/%s", GITATTRIBUTES_FILE);
+
+               next = read_attr(pathbuf.buf, 0);
+
+               /* reset the pathbuf to not include "/.gitattributes" */
+               strbuf_setlen(&pathbuf, len);
 
-               strbuf_release(&pathbuf);
+               origin = xstrdup(pathbuf.buf);
+               push_stack(stack, next, origin, len);
        }
 
        /*
         * Finally push the "info" one at the top of the stack.
         */
-       info->prev = attr_stack;
-       attr_stack = info;
+       push_stack(stack, info, NULL, 0);
+
+       strbuf_release(&pathbuf);
 }
 
 static int path_matches(const char *pathname, int pathlen,
@@ -652,16 +1011,16 @@ static int path_matches(const char *pathname, int pathlen,
                              pattern, prefix, pat->patternlen, pat->flags);
 }
 
-static int macroexpand_one(int attr_nr, int rem);
+static int macroexpand_one(struct all_attrs_item *all_attrs, int nr, int rem);
 
-static int fill_one(const char *what, struct match_attr *a, int rem)
+static int fill_one(const char *what, struct all_attrs_item *all_attrs,
+                   const struct match_attr *a, int rem)
 {
-       struct git_attr_check *check = check_all_attr;
        int i;
 
-       for (i = a->num_attr - 1; 0 < rem && 0 <= i; i--) {
-               struct git_attr *attr = a->state[i].attr;
-               const char **n = &(check[attr->attr_nr].value);
+       for (i = a->num_attr - 1; rem > 0 && i >= 0; i--) {
+               const struct git_attr *attr = a->state[i].attr;
+               const char **n = &(all_attrs[attr->attr_nr].value);
                const char *v = a->state[i].setto;
 
                if (*n == ATTR__UNKNOWN) {
@@ -670,64 +1029,72 @@ static int fill_one(const char *what, struct match_attr *a, int rem)
                                  attr, v);
                        *n = v;
                        rem--;
-                       rem = macroexpand_one(attr->attr_nr, rem);
+                       rem = macroexpand_one(all_attrs, attr->attr_nr, rem);
                }
        }
        return rem;
 }
 
 static int fill(const char *path, int pathlen, int basename_offset,
-               struct attr_stack *stk, int rem)
+               const struct attr_stack *stack,
+               struct all_attrs_item *all_attrs, int rem)
 {
-       int i;
-       const char *base = stk->origin ? stk->origin : "";
+       for (; rem > 0 && stack; stack = stack->prev) {
+               int i;
+               const char *base = stack->origin ? stack->origin : "";
 
-       for (i = stk->num_matches - 1; 0 < rem && 0 <= i; i--) {
-               struct match_attr *a = stk->attrs[i];
-               if (a->is_macro)
-                       continue;
-               if (path_matches(path, pathlen, basename_offset,
-                                &a->u.pat, base, stk->originlen))
-                       rem = fill_one("fill", a, rem);
+               for (i = stack->num_matches - 1; 0 < rem && 0 <= i; i--) {
+                       const struct match_attr *a = stack->attrs[i];
+                       if (a->is_macro)
+                               continue;
+                       if (path_matches(path, pathlen, basename_offset,
+                                        &a->u.pat, base, stack->originlen))
+                               rem = fill_one("fill", all_attrs, a, rem);
+               }
        }
+
        return rem;
 }
 
-static int macroexpand_one(int nr, int rem)
+static int macroexpand_one(struct all_attrs_item *all_attrs, int nr, int rem)
 {
-       struct attr_stack *stk;
-       struct match_attr *a = NULL;
-       int i;
+       const struct all_attrs_item *item = &all_attrs[nr];
 
-       if (check_all_attr[nr].value != ATTR__TRUE ||
-           !check_all_attr[nr].attr->maybe_macro)
+       if (item->macro && item->value == ATTR__TRUE)
+               return fill_one("expand", all_attrs, item->macro, rem);
+       else
                return rem;
+}
 
-       for (stk = attr_stack; !a && stk; stk = stk->prev)
-               for (i = stk->num_matches - 1; !a && 0 <= i; i--) {
-                       struct match_attr *ma = stk->attrs[i];
-                       if (!ma->is_macro)
-                               continue;
-                       if (ma->u.attr->attr_nr == nr)
-                               a = ma;
+/*
+ * Marks the attributes which are macros based on the attribute stack.
+ * This prevents having to search through the attribute stack each time
+ * a macro needs to be expanded during the fill stage.
+ */
+static void determine_macros(struct all_attrs_item *all_attrs,
+                            const struct attr_stack *stack)
+{
+       for (; stack; stack = stack->prev) {
+               int i;
+               for (i = stack->num_matches - 1; i >= 0; i--) {
+                       const struct match_attr *ma = stack->attrs[i];
+                       if (ma->is_macro) {
+                               int n = ma->u.attr->attr_nr;
+                               if (!all_attrs[n].macro) {
+                                       all_attrs[n].macro = ma;
+                               }
+                       }
                }
-
-       if (a)
-               rem = fill_one("expand", a, rem);
-
-       return rem;
+       }
 }
 
 /*
- * Collect attributes for path into the array pointed to by
- * check_all_attr. If num is non-zero, only attributes in check[] are
- * collected. Otherwise all attributes are collected.
+ * Collect attributes for path into the array pointed to by check->all_attrs.
+ * If check->check_nr is non-zero, only attributes in check[] are collected.
+ * Otherwise all attributes are collected.
  */
-static void collect_some_attrs(const char *path, int num,
-                              struct git_attr_check *check)
-
+static void collect_some_attrs(const char *path, struct attr_check *check)
 {
-       struct attr_stack *stk;
        int i, pathlen, rem, dirlen;
        const char *cp, *last_slash = NULL;
        int basename_offset;
@@ -745,81 +1112,67 @@ static void collect_some_attrs(const char *path, int num,
                dirlen = 0;
        }
 
-       prepare_attr_stack(path, dirlen);
-       for (i = 0; i < attr_nr; i++)
-               check_all_attr[i].value = ATTR__UNKNOWN;
-       if (num && !cannot_trust_maybe_real) {
+       prepare_attr_stack(path, dirlen, &check->stack);
+       all_attrs_init(&g_attr_hashmap, check);
+       determine_macros(check->all_attrs, check->stack);
+
+       if (check->nr) {
                rem = 0;
-               for (i = 0; i < num; i++) {
-                       if (!check[i].attr->maybe_real) {
-                               struct git_attr_check *c;
-                               c = check_all_attr + check[i].attr->attr_nr;
-                               c->value = ATTR__UNSET;
+               for (i = 0; i < check->nr; i++) {
+                       int n = check->items[i].attr->attr_nr;
+                       struct all_attrs_item *item = &check->all_attrs[n];
+                       if (item->macro) {
+                               item->value = ATTR__UNSET;
                                rem++;
                        }
                }
-               if (rem == num)
+               if (rem == check->nr)
                        return;
        }
 
-       rem = attr_nr;
-       for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
-               rem = fill(path, pathlen, basename_offset, stk, rem);
+       rem = check->all_attrs_nr;
+       fill(path, pathlen, basename_offset, check->stack, check->all_attrs, rem);
 }
 
-int git_check_attr(const char *path, int num, struct git_attr_check *check)
+int git_check_attr(const char *path, struct attr_check *check)
 {
        int i;
 
-       collect_some_attrs(path, num, check);
+       collect_some_attrs(path, check);
 
-       for (i = 0; i < num; i++) {
-               const char *value = check_all_attr[check[i].attr->attr_nr].value;
+       for (i = 0; i < check->nr; i++) {
+               size_t n = check->items[i].attr->attr_nr;
+               const char *value = check->all_attrs[n].value;
                if (value == ATTR__UNKNOWN)
                        value = ATTR__UNSET;
-               check[i].value = value;
+               check->items[i].value = value;
        }
 
        return 0;
 }
 
-int git_all_attrs(const char *path, int *num, struct git_attr_check **check)
+void git_all_attrs(const char *path, struct attr_check *check)
 {
-       int i, count, j;
+       int i;
 
-       collect_some_attrs(path, 0, NULL);
+       attr_check_reset(check);
+       collect_some_attrs(path, check);
 
-       /* Count the number of attributes that are set. */
-       count = 0;
-       for (i = 0; i < attr_nr; i++) {
-               const char *value = check_all_attr[i].value;
-               if (value != ATTR__UNSET && value != ATTR__UNKNOWN)
-                       ++count;
-       }
-       *num = count;
-       ALLOC_ARRAY(*check, count);
-       j = 0;
-       for (i = 0; i < attr_nr; i++) {
-               const char *value = check_all_attr[i].value;
-               if (value != ATTR__UNSET && value != ATTR__UNKNOWN) {
-                       (*check)[j].attr = check_all_attr[i].attr;
-                       (*check)[j].value = value;
-                       ++j;
-               }
+       for (i = 0; i < check->all_attrs_nr; i++) {
+               const char *name = check->all_attrs[i].attr->name;
+               const char *value = check->all_attrs[i].value;
+               struct attr_check_item *item;
+               if (value == ATTR__UNSET || value == ATTR__UNKNOWN)
+                       continue;
+               item = attr_check_append(check, git_attr(name));
+               item->value = value;
        }
-
-       return 0;
 }
 
-void git_attr_set_direction(enum git_attr_direction new, struct index_state *istate)
+void attr_start(void)
 {
-       enum git_attr_direction old = direction;
-
-       if (is_bare_repository() && new != GIT_ATTR_INDEX)
-               die("BUG: non-INDEX attr direction in a bare repo");
-
-       direction = new;
-       if (new != old)
-               drop_attr_stack();
-       use_index = istate;
+#ifndef NO_PTHREADS
+       pthread_mutex_init(&g_attr_hashmap.mutex, NULL);
+       pthread_mutex_init(&check_vector.mutex, NULL);
+#endif
 }
diff --git a/attr.h b/attr.h
index 8b08d33af84ebbb376a69d85f3db6c03eeb78a63..442d464db6271da48a4ef133127c7d3a18c186cf 100644 (file)
--- a/attr.h
+++ b/attr.h
@@ -4,11 +4,15 @@
 /* An attribute is a pointer to this opaque structure */
 struct git_attr;
 
+/* opaque structures used internally for attribute collection */
+struct all_attrs_item;
+struct attr_stack;
+
 /*
  * Given a string, return the gitattribute object that
  * corresponds to it.
  */
-struct git_attr *git_attr(const char *);
+const struct git_attr *git_attr(const char *);
 
 /* Internal use */
 extern const char git_attr__true[];
@@ -20,38 +24,58 @@ extern const char git_attr__false[];
 #define ATTR_UNSET(v) ((v) == NULL)
 
 /*
- * Send one or more git_attr_check to git_check_attr(), and
+ * Send one or more git_attr_check to git_check_attrs(), and
  * each 'value' member tells what its value is.
  * Unset one is returned as NULL.
  */
-struct git_attr_check {
-       struct git_attr *attr;
+struct attr_check_item {
+       const struct git_attr *attr;
        const char *value;
 };
 
+struct attr_check {
+       int nr;
+       int alloc;
+       struct attr_check_item *items;
+       int all_attrs_nr;
+       struct all_attrs_item *all_attrs;
+       struct attr_stack *stack;
+};
+
+extern struct attr_check *attr_check_alloc(void);
+extern struct attr_check *attr_check_initl(const char *, ...);
+extern struct attr_check *attr_check_dup(const struct attr_check *check);
+
+extern struct attr_check_item *attr_check_append(struct attr_check *check,
+                                                const struct git_attr *attr);
+
+extern void attr_check_reset(struct attr_check *check);
+extern void attr_check_clear(struct attr_check *check);
+extern void attr_check_free(struct attr_check *check);
+
 /*
  * Return the name of the attribute represented by the argument.  The
  * return value is a pointer to a null-delimited string that is part
  * of the internal data structure; it should not be modified or freed.
  */
-char *git_attr_name(struct git_attr *);
+extern const char *git_attr_name(const struct git_attr *);
 
-int git_check_attr(const char *path, int, struct git_attr_check *);
+extern int git_check_attr(const char *path, struct attr_check *check);
 
 /*
- * Retrieve all attributes that apply to the specified path.  *num
- * will be set to the number of attributes on the path; **check will
- * be set to point at a newly-allocated array of git_attr_check
- * objects describing the attributes and their values.  *check must be
- * free()ed by the caller.
+ * Retrieve all attributes that apply to the specified path.
+ * check holds the attributes and their values.
  */
-int git_all_attrs(const char *path, int *num, struct git_attr_check **check);
+extern void git_all_attrs(const char *path, struct attr_check *check);
 
 enum git_attr_direction {
        GIT_ATTR_CHECKIN,
        GIT_ATTR_CHECKOUT,
        GIT_ATTR_INDEX
 };
-void git_attr_set_direction(enum git_attr_direction, struct index_state *);
+void git_attr_set_direction(enum git_attr_direction new_direction,
+                           struct index_state *istate);
+
+extern void attr_start(void);
 
 #endif /* ATTR_H */
index 6f512c20638718df91ed4a29aae3518f985c0d30..aaab6ada2b620e10af5dff2ea894ecf3d44ac9ea 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -12,8 +12,8 @@
 #include "sha1-array.h"
 #include "argv-array.h"
 
-static struct sha1_array good_revs;
-static struct sha1_array skipped_revs;
+static struct oid_array good_revs;
+static struct oid_array skipped_revs;
 
 static struct object_id *current_bad_oid;
 
@@ -200,6 +200,7 @@ static struct commit_list *best_bisection_sorted(struct commit_list *list, int n
 {
        struct commit_list *p;
        struct commit_dist *array = xcalloc(nr, sizeof(*array));
+       struct strbuf buf = STRBUF_INIT;
        int cnt, i;
 
        for (p = list, cnt = 0; p; p = p->next) {
@@ -215,19 +216,20 @@ static struct commit_list *best_bisection_sorted(struct commit_list *list, int n
                array[cnt].distance = distance;
                cnt++;
        }
-       qsort(array, cnt, sizeof(*array), compare_commit_dist);
+       QSORT(array, cnt, compare_commit_dist);
        for (p = list, i = 0; i < cnt; i++) {
-               char buf[100]; /* enough for dist=%d */
                struct object *obj = &(array[i].commit->object);
 
-               snprintf(buf, sizeof(buf), "dist=%d", array[i].distance);
-               add_name_decoration(DECORATION_NONE, buf, obj);
+               strbuf_reset(&buf);
+               strbuf_addf(&buf, "dist=%d", array[i].distance);
+               add_name_decoration(DECORATION_NONE, buf.buf, obj);
 
                p->item = array[i].commit;
                p = p->next;
        }
        if (p)
                p->next = NULL;
+       strbuf_release(&buf);
        free(array);
        return list;
 }
@@ -413,9 +415,9 @@ static int register_ref(const char *refname, const struct object_id *oid,
                current_bad_oid = xmalloc(sizeof(*current_bad_oid));
                oidcpy(current_bad_oid, oid);
        } else if (starts_with(refname, good_prefix.buf)) {
-               sha1_array_append(&good_revs, oid->hash);
+               oid_array_append(&good_revs, oid);
        } else if (starts_with(refname, "skip-")) {
-               sha1_array_append(&skipped_revs, oid->hash);
+               oid_array_append(&skipped_revs, oid);
        }
 
        strbuf_release(&good_prefix);
@@ -430,6 +432,7 @@ static int read_bisect_refs(void)
 
 static GIT_PATH_FUNC(git_path_bisect_names, "BISECT_NAMES")
 static GIT_PATH_FUNC(git_path_bisect_expected_rev, "BISECT_EXPECTED_REV")
+static GIT_PATH_FUNC(git_path_bisect_terms, "BISECT_TERMS")
 
 static void read_bisect_paths(struct argv_array *array)
 {
@@ -451,13 +454,13 @@ static void read_bisect_paths(struct argv_array *array)
        fclose(fp);
 }
 
-static char *join_sha1_array_hex(struct sha1_array *array, char delim)
+static char *join_sha1_array_hex(struct oid_array *array, char delim)
 {
        struct strbuf joined_hexs = STRBUF_INIT;
        int i;
 
        for (i = 0; i < array->nr; i++) {
-               strbuf_addstr(&joined_hexs, sha1_to_hex(array->sha1[i]));
+               strbuf_addstr(&joined_hexs, oid_to_hex(array->oid + i));
                if (i + 1 < array->nr)
                        strbuf_addch(&joined_hexs, delim);
        }
@@ -499,8 +502,7 @@ struct commit_list *filter_skipped(struct commit_list *list,
        while (list) {
                struct commit_list *next = list->next;
                list->next = NULL;
-               if (0 <= sha1_array_lookup(&skipped_revs,
-                                          list->item->object.oid.hash)) {
+               if (0 <= oid_array_lookup(&skipped_revs, &list->item->object.oid)) {
                        if (skipped_first && !*skipped_first)
                                *skipped_first = 1;
                        /* Move current to tried list */
@@ -544,7 +546,7 @@ static unsigned get_prn(unsigned count) {
 
 /*
  * Custom integer square root from
- * http://en.wikipedia.org/wiki/Integer_square_root
+ * https://en.wikipedia.org/wiki/Integer_square_root
  */
 static int sqrti(int val)
 {
@@ -621,7 +623,7 @@ static void bisect_rev_setup(struct rev_info *revs, const char *prefix,
        argv_array_pushf(&rev_argv, bad_format, oid_to_hex(current_bad_oid));
        for (i = 0; i < good_revs.nr; i++)
                argv_array_pushf(&rev_argv, good_format,
-                                sha1_to_hex(good_revs.sha1[i]));
+                                oid_to_hex(good_revs.oid + i));
        argv_array_push(&rev_argv, "--");
        if (read_paths)
                read_bisect_paths(&rev_argv);
@@ -682,7 +684,7 @@ static int is_expected_rev(const struct object_id *oid)
 
 static int bisect_checkout(const unsigned char *bisect_rev, int no_checkout)
 {
-       char bisect_rev_hex[GIT_SHA1_HEXSZ + 1];
+       char bisect_rev_hex[GIT_MAX_HEXSZ + 1];
 
        memcpy(bisect_rev_hex, sha1_to_hex(bisect_rev), GIT_SHA1_HEXSZ + 1);
        update_ref(NULL, "BISECT_EXPECTED_REV", bisect_rev, NULL, 0, UPDATE_REFS_DIE_ON_ERR);
@@ -701,11 +703,11 @@ static int bisect_checkout(const unsigned char *bisect_rev, int no_checkout)
        return run_command_v_opt(argv_show_branch, RUN_GIT_CMD);
 }
 
-static struct commit *get_commit_reference(const unsigned char *sha1)
+static struct commit *get_commit_reference(const struct object_id *oid)
 {
-       struct commit *r = lookup_commit_reference(sha1);
+       struct commit *r = lookup_commit_reference(oid->hash);
        if (!r)
-               die(_("Not a valid commit name %s"), sha1_to_hex(sha1));
+               die(_("Not a valid commit name %s"), oid_to_hex(oid));
        return r;
 }
 
@@ -715,9 +717,9 @@ static struct commit **get_bad_and_good_commits(int *rev_nr)
        int i, n = 0;
 
        ALLOC_ARRAY(rev, 1 + good_revs.nr);
-       rev[n++] = get_commit_reference(current_bad_oid->hash);
+       rev[n++] = get_commit_reference(current_bad_oid);
        for (i = 0; i < good_revs.nr; i++)
-               rev[n++] = get_commit_reference(good_revs.sha1[i]);
+               rev[n++] = get_commit_reference(good_revs.oid + i);
        *rev_nr = n;
 
        return rev;
@@ -747,16 +749,16 @@ static void handle_bad_merge_base(void)
                exit(3);
        }
 
-       fprintf(stderr, _("Some %s revs are not ancestor of the %s rev.\n"
+       fprintf(stderr, _("Some %s revs are not ancestors of the %s rev.\n"
                "git bisect cannot work properly in this case.\n"
                "Maybe you mistook %s and %s revs?\n"),
                term_good, term_bad, term_good, term_bad);
        exit(1);
 }
 
-static void handle_skipped_merge_base(const unsigned char *mb)
+static void handle_skipped_merge_base(const struct object_id *mb)
 {
-       char *mb_hex = sha1_to_hex(mb);
+       char *mb_hex = oid_to_hex(mb);
        char *bad_hex = oid_to_hex(current_bad_oid);
        char *good_hex = join_sha1_array_hex(&good_revs, ' ');
 
@@ -787,16 +789,16 @@ static void check_merge_bases(int no_checkout)
        result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1);
 
        for (; result; result = result->next) {
-               const unsigned char *mb = result->item->object.oid.hash;
-               if (!hashcmp(mb, current_bad_oid->hash)) {
+               const struct object_id *mb = &result->item->object.oid;
+               if (!oidcmp(mb, current_bad_oid)) {
                        handle_bad_merge_base();
-               } else if (0 <= sha1_array_lookup(&good_revs, mb)) {
+               } else if (0 <= oid_array_lookup(&good_revs, mb)) {
                        continue;
-               } else if (0 <= sha1_array_lookup(&skipped_revs, mb)) {
+               } else if (0 <= oid_array_lookup(&skipped_revs, mb)) {
                        handle_skipped_merge_base(mb);
                } else {
                        printf(_("Bisecting: a merge base must be tested\n"));
-                       exit(bisect_checkout(mb, no_checkout));
+                       exit(bisect_checkout(mb->hash, no_checkout));
                }
        }
 
@@ -905,7 +907,7 @@ static void show_diff_tree(const char *prefix, struct commit *commit)
 void read_bisect_terms(const char **read_bad, const char **read_good)
 {
        struct strbuf str = STRBUF_INIT;
-       const char *filename = git_path("BISECT_TERMS");
+       const char *filename = git_path_bisect_terms();
        FILE *fp = fopen(filename, "r");
 
        if (!fp) {
@@ -940,7 +942,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
        struct commit_list *tried;
        int reaches = 0, all = 0, nr, steps;
        const unsigned char *bisect_rev;
-       char steps_msg[32];
+       char *steps_msg;
 
        read_bisect_terms(&term_bad, &term_good);
        if (read_bisect_refs())
@@ -990,14 +992,17 @@ int bisect_next_all(const char *prefix, int no_checkout)
 
        nr = all - reaches - 1;
        steps = estimate_bisect_steps(all);
-       xsnprintf(steps_msg, sizeof(steps_msg),
-                 Q_("(roughly %d step)", "(roughly %d steps)", steps),
-                 steps);
-       /* TRANSLATORS: the last %s will be replaced with
-          "(roughly %d steps)" translation */
+
+       steps_msg = xstrfmt(Q_("(roughly %d step)", "(roughly %d steps)",
+                 steps), steps);
+       /*
+        * TRANSLATORS: the last %s will be replaced with "(roughly %d
+        * steps)" translation.
+        */
        printf(Q_("Bisecting: %d revision left to test after this %s\n",
                  "Bisecting: %d revisions left to test after this %s\n",
                  nr), nr, steps_msg);
+       free(steps_msg);
 
        return bisect_checkout(bisect_rev, no_checkout);
 }
index 0d459b3cfe507b3906760fbea7f35e6191366057..ad5a2299ba2600e67c8aaa7719a2c7d54898958f 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -234,7 +234,7 @@ void create_branch(const char *name, const char *start_name,
 {
        struct commit *commit;
        unsigned char sha1[20];
-       char *real_ref, msg[PATH_MAX + 20];
+       char *real_ref;
        struct strbuf ref = STRBUF_INIT;
        int forcing = 0;
        int dont_change_ref = 0;
@@ -290,19 +290,18 @@ void create_branch(const char *name, const char *start_name,
                die(_("Not a valid branch point: '%s'."), start_name);
        hashcpy(sha1, commit->object.oid.hash);
 
-       if (forcing)
-               snprintf(msg, sizeof msg, "branch: Reset to %s",
-                        start_name);
-       else if (!dont_change_ref)
-               snprintf(msg, sizeof msg, "branch: Created from %s",
-                        start_name);
-
        if (reflog)
-               log_all_ref_updates = 1;
+               log_all_ref_updates = LOG_REFS_NORMAL;
 
        if (!dont_change_ref) {
                struct ref_transaction *transaction;
                struct strbuf err = STRBUF_INIT;
+               char *msg;
+
+               if (forcing)
+                       msg = xstrfmt("branch: Reset to %s", start_name);
+               else
+                       msg = xstrfmt("branch: Created from %s", start_name);
 
                transaction = ref_transaction_begin(&err);
                if (!transaction ||
@@ -313,6 +312,7 @@ void create_branch(const char *name, const char *start_name,
                        die("%s", err.buf);
                ref_transaction_free(transaction);
                strbuf_release(&err);
+               free(msg);
        }
 
        if (real_ref && track)
@@ -345,10 +345,11 @@ void die_if_checked_out(const char *branch, int ignore_current_worktree)
            branch, wt->path);
 }
 
-int replace_each_worktree_head_symref(const char *oldref, const char *newref)
+int replace_each_worktree_head_symref(const char *oldref, const char *newref,
+                                     const char *logmsg)
 {
        int ret = 0;
-       struct worktree **worktrees = get_worktrees();
+       struct worktree **worktrees = get_worktrees(0);
        int i;
 
        for (i = 0; worktrees[i]; i++) {
@@ -358,7 +359,7 @@ int replace_each_worktree_head_symref(const char *oldref, const char *newref)
                        continue;
 
                if (set_worktree_head_symref(get_worktree_git_dir(worktrees[i]),
-                                            newref)) {
+                                            newref, logmsg)) {
                        ret = -1;
                        error(_("HEAD of working tree %s is not updated"),
                              worktrees[i]->path);
index 3103eb9add31e08600f9fa158303417e36d3b229..b07788558c0e76a701b571f73c0462dcf2abcc63 100644 (file)
--- a/branch.h
+++ b/branch.h
@@ -71,6 +71,7 @@ extern void die_if_checked_out(const char *branch, int ignore_current_worktree);
  * This will be used when renaming a branch. Returns 0 if successful, non-zero
  * otherwise.
  */
-extern int replace_each_worktree_head_symref(const char *oldref, const char *newref);
+extern int replace_each_worktree_head_symref(const char *oldref, const char *newref,
+                                            const char *logmsg);
 
 #endif
index 6b95006a0a38d8bec522342fb72a5edeb0af7f07..9e4a89816d5fbde0ed0b3bebff8f90f70dd4480d 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -25,7 +25,7 @@ struct fmt_merge_msg_opts {
 extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
                         struct fmt_merge_msg_opts *);
 
-extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, int sha1_valid, char **buf, unsigned long *buf_size);
+extern int textconv_object(const char *path, unsigned mode, const struct object_id *oid, int oid_valid, char **buf, unsigned long *buf_size);
 
 extern int is_builtin(const char *s);
 
@@ -60,6 +60,7 @@ extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
 extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
 extern int cmd_diff(int argc, const char **argv, const char *prefix);
 extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
+extern int cmd_difftool(int argc, const char **argv, const char *prefix);
 extern int cmd_fast_export(int argc, const char **argv, const char *prefix);
 extern int cmd_fetch(int argc, const char **argv, const char *prefix);
 extern int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
@@ -102,6 +103,7 @@ extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
 extern int cmd_pull(int argc, const char **argv, const char *prefix);
 extern int cmd_push(int argc, const char **argv, const char *prefix);
 extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
+extern int cmd_rebase__helper(int argc, const char **argv, const char *prefix);
 extern int cmd_receive_pack(int argc, const char **argv, const char *prefix);
 extern int cmd_reflog(int argc, const char **argv, const char *prefix);
 extern int cmd_remote(int argc, const char **argv, const char *prefix);
index e8fb80b36e7386fa9a9da91a61893c14ec696be4..9f53f020d0fc7184ac803a4346bdf426a814ed72 100644 (file)
@@ -361,7 +361,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        add_new_files = !take_worktree_changes && !refresh_only;
        require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
                 (show_only ? ADD_CACHE_PRETEND : 0) |
index 9daeb27225c04c28e33adc7b8e9071d825a490de..593c1b5dda953d146c66a479b3bc5028efad5bf8 100644 (file)
@@ -28,6 +28,7 @@
 #include "rerere.h"
 #include "prompt.h"
 #include "mailinfo.h"
+#include "apply.h"
 #include "string-list.h"
 
 /**
@@ -109,7 +110,7 @@ struct am_state {
        size_t msg_len;
 
        /* when --rebasing, records the original commit the patch came from */
-       unsigned char orig_commit[GIT_SHA1_RAWSZ];
+       struct object_id orig_commit;
 
        /* number of digits in patch filename */
        int prec;
@@ -133,17 +134,15 @@ struct am_state {
 };
 
 /**
- * Initializes am_state with the default values. The state directory is set to
- * dir.
+ * Initializes am_state with the default values.
  */
-static void am_state_init(struct am_state *state, const char *dir)
+static void am_state_init(struct am_state *state)
 {
        int gpgsign;
 
        memset(state, 0, sizeof(*state));
 
-       assert(dir);
-       state->dir = xstrdup(dir);
+       state->dir = git_pathdup("rebase-apply");
 
        state->prec = 4;
 
@@ -415,8 +414,8 @@ static void am_load(struct am_state *state)
        read_commit_msg(state);
 
        if (read_state_file(&sb, state, "original-commit", 1) < 0)
-               hashclr(state->orig_commit);
-       else if (get_sha1_hex(sb.buf, state->orig_commit) < 0)
+               oidclr(&state->orig_commit);
+       else if (get_oid_hex(sb.buf, &state->orig_commit) < 0)
                die(_("could not parse %s"), am_path(state, "original-commit"));
 
        read_state_file(&sb, state, "threeway", 1);
@@ -542,14 +541,14 @@ static int copy_notes_for_rebase(const struct am_state *state)
        fp = xfopen(am_path(state, "rewritten"), "r");
 
        while (!strbuf_getline_lf(&sb, fp)) {
-               unsigned char from_obj[GIT_SHA1_RAWSZ], to_obj[GIT_SHA1_RAWSZ];
+               struct object_id from_obj, to_obj;
 
                if (sb.len != GIT_SHA1_HEXSZ * 2 + 1) {
                        ret = error(invalid_line, sb.buf);
                        goto finish;
                }
 
-               if (get_sha1_hex(sb.buf, from_obj)) {
+               if (get_oid_hex(sb.buf, &from_obj)) {
                        ret = error(invalid_line, sb.buf);
                        goto finish;
                }
@@ -559,14 +558,14 @@ static int copy_notes_for_rebase(const struct am_state *state)
                        goto finish;
                }
 
-               if (get_sha1_hex(sb.buf + GIT_SHA1_HEXSZ + 1, to_obj)) {
+               if (get_oid_hex(sb.buf + GIT_SHA1_HEXSZ + 1, &to_obj)) {
                        ret = error(invalid_line, sb.buf);
                        goto finish;
                }
 
-               if (copy_note_for_rewrite(c, from_obj, to_obj))
+               if (copy_note_for_rewrite(c, from_obj.hash, to_obj.hash))
                        ret = error(_("Failed to copy notes from '%s' to '%s'"),
-                                       sha1_to_hex(from_obj), sha1_to_hex(to_obj));
+                                       oid_to_hex(&from_obj), oid_to_hex(&to_obj));
        }
 
 finish:
@@ -761,14 +760,18 @@ static int split_mail_conv(mail_conv_fn fn, struct am_state *state,
                mail = mkpath("%s/%0*d", state->dir, state->prec, i + 1);
 
                out = fopen(mail, "w");
-               if (!out)
+               if (!out) {
+                       if (in != stdin)
+                               fclose(in);
                        return error_errno(_("could not open '%s' for writing"),
                                           mail);
+               }
 
                ret = fn(out, in, keep_cr);
 
                fclose(out);
-               fclose(in);
+               if (in != stdin)
+                       fclose(in);
 
                if (ret)
                        return error(_("could not parse patch '%s'"), *paths);
@@ -972,7 +975,7 @@ static int split_mail(struct am_state *state, enum patch_format patch_format,
 static void am_setup(struct am_state *state, enum patch_format patch_format,
                        const char **paths, int keep_cr)
 {
-       unsigned char curr_head[GIT_SHA1_RAWSZ];
+       struct object_id curr_head;
        const char *str;
        struct strbuf sb = STRBUF_INIT;
 
@@ -1040,15 +1043,15 @@ static void am_setup(struct am_state *state, enum patch_format patch_format,
        else
                write_state_text(state, "applying", "");
 
-       if (!get_sha1("HEAD", curr_head)) {
-               write_state_text(state, "abort-safety", sha1_to_hex(curr_head));
+       if (!get_oid("HEAD", &curr_head)) {
+               write_state_text(state, "abort-safety", oid_to_hex(&curr_head));
                if (!state->rebasing)
-                       update_ref("am", "ORIG_HEAD", curr_head, NULL, 0,
+                       update_ref_oid("am", "ORIG_HEAD", &curr_head, NULL, 0,
                                        UPDATE_REFS_DIE_ON_ERR);
        } else {
                write_state_text(state, "abort-safety", "");
                if (!state->rebasing)
-                       delete_ref("ORIG_HEAD", NULL, 0);
+                       delete_ref(NULL, "ORIG_HEAD", NULL, 0);
        }
 
        /*
@@ -1068,7 +1071,7 @@ static void am_setup(struct am_state *state, enum patch_format patch_format,
  */
 static void am_next(struct am_state *state)
 {
-       unsigned char head[GIT_SHA1_RAWSZ];
+       struct object_id head;
 
        free(state->author_name);
        state->author_name = NULL;
@@ -1086,11 +1089,11 @@ static void am_next(struct am_state *state)
        unlink(am_path(state, "author-script"));
        unlink(am_path(state, "final-commit"));
 
-       hashclr(state->orig_commit);
+       oidclr(&state->orig_commit);
        unlink(am_path(state, "original-commit"));
 
-       if (!get_sha1("HEAD", head))
-               write_state_text(state, "abort-safety", sha1_to_hex(head));
+       if (!get_oid("HEAD", &head))
+               write_state_text(state, "abort-safety", oid_to_hex(&head));
        else
                write_state_text(state, "abort-safety", "");
 
@@ -1118,7 +1121,7 @@ static void refresh_and_write_cache(void)
 {
        struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
 
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
        refresh_cache(REFRESH_QUIET);
        if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
                die(_("unable to write index file"));
@@ -1132,17 +1135,17 @@ static void refresh_and_write_cache(void)
  */
 static int index_has_changes(struct strbuf *sb)
 {
-       unsigned char head[GIT_SHA1_RAWSZ];
+       struct object_id head;
        int i;
 
-       if (!get_sha1_tree("HEAD", head)) {
+       if (!get_sha1_tree("HEAD", head.hash)) {
                struct diff_options opt;
 
                diff_setup(&opt);
                DIFF_OPT_SET(&opt, EXIT_WITH_STATUS);
                if (!sb)
                        DIFF_OPT_SET(&opt, QUICK);
-               do_diff_cache(head, &opt);
+               do_diff_cache(head.hash, &opt);
                diffcore_std(&opt);
                for (i = 0; sb && i < diff_queued_diff.nr; i++) {
                        if (i)
@@ -1180,42 +1183,39 @@ static void NORETURN die_user_resolve(const struct am_state *state)
        exit(128);
 }
 
-static void am_signoff(struct strbuf *sb)
+/**
+ * Appends signoff to the "msg" field of the am_state.
+ */
+static void am_append_signoff(struct am_state *state)
 {
        char *cp;
        struct strbuf mine = STRBUF_INIT;
+       struct strbuf sb = STRBUF_INIT;
 
-       /* Does it end with our own sign-off? */
+       strbuf_attach(&sb, state->msg, state->msg_len, state->msg_len);
+
+       /* our sign-off */
        strbuf_addf(&mine, "\n%s%s\n",
                    sign_off_header,
                    fmt_name(getenv("GIT_COMMITTER_NAME"),
                             getenv("GIT_COMMITTER_EMAIL")));
-       if (mine.len < sb->len &&
-           !strcmp(mine.buf, sb->buf + sb->len - mine.len))
+
+       /* Does sb end with it already? */
+       if (mine.len < sb.len &&
+           !strcmp(mine.buf, sb.buf + sb.len - mine.len))
                goto exit; /* no need to duplicate */
 
        /* Does it have any Signed-off-by: in the text */
-       for (cp = sb->buf;
+       for (cp = sb.buf;
             cp && *cp && (cp = strstr(cp, sign_off_header)) != NULL;
             cp = strchr(cp, '\n')) {
-               if (sb->buf == cp || cp[-1] == '\n')
+               if (sb.buf == cp || cp[-1] == '\n')
                        break;
        }
 
-       strbuf_addstr(sb, mine.buf + !!cp);
+       strbuf_addstr(&sb, mine.buf + !!cp);
 exit:
        strbuf_release(&mine);
-}
-
-/**
- * Appends signoff to the "msg" field of the am_state.
- */
-static void am_append_signoff(struct am_state *state)
-{
-       struct strbuf sb = STRBUF_INIT;
-
-       strbuf_attach(&sb, state->msg, state->msg_len, state->msg_len);
-       am_signoff(&sb);
        state->msg = strbuf_detach(&sb, &state->msg_len);
 }
 
@@ -1312,7 +1312,7 @@ static int parse_mail(struct am_state *state, const char *mail)
        }
 
        if (is_empty_file(am_path(state, "patch"))) {
-               printf_ln(_("Patch is empty. Was it split wrong?"));
+               printf_ln(_("Patch is empty."));
                die_user_resolve(state);
        }
 
@@ -1320,9 +1320,6 @@ static int parse_mail(struct am_state *state, const char *mail)
        strbuf_addbuf(&msg, &mi.log_message);
        strbuf_stripspace(&msg, 0);
 
-       if (state->signoff)
-               am_signoff(&msg);
-
        assert(!state->author_name);
        state->author_name = strbuf_detach(&author_name, NULL);
 
@@ -1349,24 +1346,21 @@ finish:
  * Sets commit_id to the commit hash where the mail was generated from.
  * Returns 0 on success, -1 on failure.
  */
-static int get_mail_commit_sha1(unsigned char *commit_id, const char *mail)
+static int get_mail_commit_oid(struct object_id *commit_id, const char *mail)
 {
        struct strbuf sb = STRBUF_INIT;
        FILE *fp = xfopen(mail, "r");
        const char *x;
+       int ret = 0;
 
-       if (strbuf_getline_lf(&sb, fp))
-               return -1;
-
-       if (!skip_prefix(sb.buf, "From ", &x))
-               return -1;
-
-       if (get_sha1_hex(x, commit_id) < 0)
-               return -1;
+       if (strbuf_getline_lf(&sb, fp) ||
+           !skip_prefix(sb.buf, "From ", &x) ||
+           get_oid_hex(x, commit_id) < 0)
+               ret = -1;
 
        strbuf_release(&sb);
        fclose(fp);
-       return 0;
+       return ret;
 }
 
 /**
@@ -1375,40 +1369,33 @@ static int get_mail_commit_sha1(unsigned char *commit_id, const char *mail)
  */
 static void get_commit_info(struct am_state *state, struct commit *commit)
 {
-       const char *buffer, *ident_line, *author_date, *msg;
+       const char *buffer, *ident_line, *msg;
        size_t ident_len;
-       struct ident_split ident_split;
-       struct strbuf sb = STRBUF_INIT;
+       struct ident_split id;
 
        buffer = logmsg_reencode(commit, NULL, get_commit_output_encoding());
 
        ident_line = find_commit_header(buffer, "author", &ident_len);
 
-       if (split_ident_line(&ident_split, ident_line, ident_len) < 0) {
-               strbuf_add(&sb, ident_line, ident_len);
-               die(_("invalid ident line: %s"), sb.buf);
-       }
+       if (split_ident_line(&id, ident_line, ident_len) < 0)
+               die(_("invalid ident line: %.*s"), (int)ident_len, ident_line);
 
        assert(!state->author_name);
-       if (ident_split.name_begin) {
-               strbuf_add(&sb, ident_split.name_begin,
-                       ident_split.name_end - ident_split.name_begin);
-               state->author_name = strbuf_detach(&sb, NULL);
-       } else
+       if (id.name_begin)
+               state->author_name =
+                       xmemdupz(id.name_begin, id.name_end - id.name_begin);
+       else
                state->author_name = xstrdup("");
 
        assert(!state->author_email);
-       if (ident_split.mail_begin) {
-               strbuf_add(&sb, ident_split.mail_begin,
-                       ident_split.mail_end - ident_split.mail_begin);
-               state->author_email = strbuf_detach(&sb, NULL);
-       } else
+       if (id.mail_begin)
+               state->author_email =
+                       xmemdupz(id.mail_begin, id.mail_end - id.mail_begin);
+       else
                state->author_email = xstrdup("");
 
-       author_date = show_ident_date(&ident_split, DATE_MODE(NORMAL));
-       strbuf_addstr(&sb, author_date);
        assert(!state->author_date);
-       state->author_date = strbuf_detach(&sb, NULL);
+       state->author_date = xstrdup(show_ident_date(&id, DATE_MODE(NORMAL)));
 
        assert(!state->msg);
        msg = strstr(buffer, "\n\n");
@@ -1416,6 +1403,7 @@ static void get_commit_info(struct am_state *state, struct commit *commit)
                die(_("unable to parse commit %s"), oid_to_hex(&commit->object.oid));
        state->msg = xstrdup(msg + 2);
        state->msg_len = strlen(state->msg);
+       unuse_commit_buffer(commit, buffer);
 }
 
 /**
@@ -1451,12 +1439,12 @@ static void write_commit_patch(const struct am_state *state, struct commit *comm
 static void write_index_patch(const struct am_state *state)
 {
        struct tree *tree;
-       unsigned char head[GIT_SHA1_RAWSZ];
+       struct object_id head;
        struct rev_info rev_info;
        FILE *fp;
 
-       if (!get_sha1_tree("HEAD", head))
-               tree = lookup_tree(head);
+       if (!get_sha1_tree("HEAD", head.hash))
+               tree = lookup_tree(head.hash);
        else
                tree = lookup_tree(EMPTY_TREE_SHA1_BIN);
 
@@ -1486,19 +1474,19 @@ static void write_index_patch(const struct am_state *state)
 static int parse_mail_rebase(struct am_state *state, const char *mail)
 {
        struct commit *commit;
-       unsigned char commit_sha1[GIT_SHA1_RAWSZ];
+       struct object_id commit_oid;
 
-       if (get_mail_commit_sha1(commit_sha1, mail) < 0)
+       if (get_mail_commit_oid(&commit_oid, mail) < 0)
                die(_("could not parse %s"), mail);
 
-       commit = lookup_commit_or_die(commit_sha1, mail);
+       commit = lookup_commit_or_die(commit_oid.hash, mail);
 
        get_commit_info(state, commit);
 
        write_commit_patch(state, commit);
 
-       hashcpy(state->orig_commit, commit_sha1);
-       write_state_text(state, "original-commit", sha1_to_hex(commit_sha1));
+       oidcpy(&state->orig_commit, &commit_oid);
+       write_state_text(state, "original-commit", oid_to_hex(&commit_oid));
 
        return 0;
 }
@@ -1509,39 +1497,59 @@ static int parse_mail_rebase(struct am_state *state, const char *mail)
  */
 static int run_apply(const struct am_state *state, const char *index_file)
 {
-       struct child_process cp = CHILD_PROCESS_INIT;
-
-       cp.git_cmd = 1;
-
-       if (index_file)
-               argv_array_pushf(&cp.env_array, "GIT_INDEX_FILE=%s", index_file);
+       struct argv_array apply_paths = ARGV_ARRAY_INIT;
+       struct argv_array apply_opts = ARGV_ARRAY_INIT;
+       struct apply_state apply_state;
+       int res, opts_left;
+       static struct lock_file lock_file;
+       int force_apply = 0;
+       int options = 0;
+
+       if (init_apply_state(&apply_state, NULL, &lock_file))
+               die("BUG: init_apply_state() failed");
+
+       argv_array_push(&apply_opts, "apply");
+       argv_array_pushv(&apply_opts, state->git_apply_opts.argv);
+
+       opts_left = apply_parse_options(apply_opts.argc, apply_opts.argv,
+                                       &apply_state, &force_apply, &options,
+                                       NULL);
+
+       if (opts_left != 0)
+               die("unknown option passed through to git apply");
+
+       if (index_file) {
+               apply_state.index_file = index_file;
+               apply_state.cached = 1;
+       } else
+               apply_state.check_index = 1;
 
        /*
         * If we are allowed to fall back on 3-way merge, don't give false
         * errors during the initial attempt.
         */
-       if (state->threeway && !index_file) {
-               cp.no_stdout = 1;
-               cp.no_stderr = 1;
-       }
+       if (state->threeway && !index_file)
+               apply_state.apply_verbosity = verbosity_silent;
 
-       argv_array_push(&cp.args, "apply");
+       if (check_apply_state(&apply_state, force_apply))
+               die("BUG: check_apply_state() failed");
 
-       argv_array_pushv(&cp.args, state->git_apply_opts.argv);
+       argv_array_push(&apply_paths, am_path(state, "patch"));
 
-       if (index_file)
-               argv_array_push(&cp.args, "--cached");
-       else
-               argv_array_push(&cp.args, "--index");
+       res = apply_all_patches(&apply_state, apply_paths.argc, apply_paths.argv, options);
 
-       argv_array_push(&cp.args, am_path(state, "patch"));
+       argv_array_clear(&apply_paths);
+       argv_array_clear(&apply_opts);
+       clear_apply_state(&apply_state);
 
-       if (run_command(&cp))
-               return -1;
+       if (res)
+               return res;
 
-       /* Reload index as git-apply will have modified it. */
-       discard_cache();
-       read_cache_from(index_file ? index_file : get_index_file());
+       if (index_file) {
+               /* Reload index as apply_all_patches() will have modified it. */
+               discard_cache();
+               read_cache_from(index_file);
+       }
 
        return 0;
 }
@@ -1652,9 +1660,8 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
  */
 static void do_commit(const struct am_state *state)
 {
-       unsigned char tree[GIT_SHA1_RAWSZ], parent[GIT_SHA1_RAWSZ],
-                     commit[GIT_SHA1_RAWSZ];
-       unsigned char *ptr;
+       struct object_id tree, parent, commit;
+       const struct object_id *old_oid;
        struct commit_list *parents = NULL;
        const char *reflog_msg, *author;
        struct strbuf sb = STRBUF_INIT;
@@ -1662,14 +1669,14 @@ static void do_commit(const struct am_state *state)
        if (run_hook_le(NULL, "pre-applypatch", NULL))
                exit(1);
 
-       if (write_cache_as_tree(tree, 0, NULL))
+       if (write_cache_as_tree(tree.hash, 0, NULL))
                die(_("git write-tree failed to write a tree"));
 
-       if (!get_sha1_commit("HEAD", parent)) {
-               ptr = parent;
-               commit_list_insert(lookup_commit(parent), &parents);
+       if (!get_sha1_commit("HEAD", parent.hash)) {
+               old_oid = &parent;
+               commit_list_insert(lookup_commit(parent.hash), &parents);
        } else {
-               ptr = NULL;
+               old_oid = NULL;
                say(state, stderr, _("applying to an empty history"));
        }
 
@@ -1681,7 +1688,7 @@ static void do_commit(const struct am_state *state)
                setenv("GIT_COMMITTER_DATE",
                        state->ignore_date ? "" : state->author_date, 1);
 
-       if (commit_tree(state->msg, state->msg_len, tree, parents, commit,
+       if (commit_tree(state->msg, state->msg_len, tree.hash, parents, commit.hash,
                                author, state->sign_commit))
                die(_("failed to write commit object"));
 
@@ -1692,14 +1699,15 @@ static void do_commit(const struct am_state *state)
        strbuf_addf(&sb, "%s: %.*s", reflog_msg, linelen(state->msg),
                        state->msg);
 
-       update_ref(sb.buf, "HEAD", commit, ptr, 0, UPDATE_REFS_DIE_ON_ERR);
+       update_ref_oid(sb.buf, "HEAD", &commit, old_oid, 0,
+                       UPDATE_REFS_DIE_ON_ERR);
 
        if (state->rebasing) {
                FILE *fp = xfopen(am_path(state, "rewritten"), "a");
 
-               assert(!is_null_sha1(state->orig_commit));
-               fprintf(fp, "%s ", sha1_to_hex(state->orig_commit));
-               fprintf(fp, "%s\n", sha1_to_hex(commit));
+               assert(!is_null_oid(&state->orig_commit));
+               fprintf(fp, "%s ", oid_to_hex(&state->orig_commit));
+               fprintf(fp, "%s\n", oid_to_hex(&commit));
                fclose(fp);
        }
 
@@ -1827,6 +1835,9 @@ static void am_run(struct am_state *state, int resume)
                        if (skip)
                                goto next; /* mail should be skipped */
 
+                       if (state->signoff)
+                               am_append_signoff(state);
+
                        write_author_script(state);
                        write_commit_msg(state);
                }
@@ -1920,7 +1931,8 @@ static void am_resolve(struct am_state *state)
 
        if (unmerged_cache()) {
                printf_ln(_("You still have unmerged paths in your index.\n"
-                       "Did you forget to use 'git add'?"));
+                       "You should 'git add' each file with resolved conflicts to mark them as such.\n"
+                       "You might run `git rm` on a file to accept \"deleted by them\" for it."));
                die_user_resolve(state);
        }
 
@@ -1955,7 +1967,7 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
                return -1;
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
 
        refresh_cache(REFRESH_QUIET);
 
@@ -1995,7 +2007,7 @@ static int merge_tree(struct tree *tree)
                return -1;
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
 
        memset(&opts, 0, sizeof(opts));
        opts.head_idx = 1;
@@ -2020,30 +2032,30 @@ static int merge_tree(struct tree *tree)
  * Clean the index without touching entries that are not modified between
  * `head` and `remote`.
  */
-static int clean_index(const unsigned char *head, const unsigned char *remote)
+static int clean_index(const struct object_id *head, const struct object_id *remote)
 {
        struct tree *head_tree, *remote_tree, *index_tree;
-       unsigned char index[GIT_SHA1_RAWSZ];
+       struct object_id index;
 
-       head_tree = parse_tree_indirect(head);
+       head_tree = parse_tree_indirect(head->hash);
        if (!head_tree)
-               return error(_("Could not parse object '%s'."), sha1_to_hex(head));
+               return error(_("Could not parse object '%s'."), oid_to_hex(head));
 
-       remote_tree = parse_tree_indirect(remote);
+       remote_tree = parse_tree_indirect(remote->hash);
        if (!remote_tree)
-               return error(_("Could not parse object '%s'."), sha1_to_hex(remote));
+               return error(_("Could not parse object '%s'."), oid_to_hex(remote));
 
        read_cache_unmerged();
 
        if (fast_forward_to(head_tree, head_tree, 1))
                return -1;
 
-       if (write_cache_as_tree(index, 0, NULL))
+       if (write_cache_as_tree(index.hash, 0, NULL))
                return -1;
 
-       index_tree = parse_tree_indirect(index);
+       index_tree = parse_tree_indirect(index.hash);
        if (!index_tree)
-               return error(_("Could not parse object '%s'."), sha1_to_hex(index));
+               return error(_("Could not parse object '%s'."), oid_to_hex(&index));
 
        if (fast_forward_to(index_tree, remote_tree, 0))
                return -1;
@@ -2071,14 +2083,14 @@ static void am_rerere_clear(void)
  */
 static void am_skip(struct am_state *state)
 {
-       unsigned char head[GIT_SHA1_RAWSZ];
+       struct object_id head;
 
        am_rerere_clear();
 
-       if (get_sha1("HEAD", head))
-               hashcpy(head, EMPTY_TREE_SHA1_BIN);
+       if (get_oid("HEAD", &head))
+               hashcpy(head.hash, EMPTY_TREE_SHA1_BIN);
 
-       if (clean_index(head, head))
+       if (clean_index(&head, &head))
                die(_("failed to clean index"));
 
        am_next(state);
@@ -2096,24 +2108,24 @@ static void am_skip(struct am_state *state)
 static int safe_to_abort(const struct am_state *state)
 {
        struct strbuf sb = STRBUF_INIT;
-       unsigned char abort_safety[GIT_SHA1_RAWSZ], head[GIT_SHA1_RAWSZ];
+       struct object_id abort_safety, head;
 
        if (file_exists(am_path(state, "dirtyindex")))
                return 0;
 
        if (read_state_file(&sb, state, "abort-safety", 1) > 0) {
-               if (get_sha1_hex(sb.buf, abort_safety))
-                       die(_("could not parse %s"), am_path(state, "abort_safety"));
+               if (get_oid_hex(sb.buf, &abort_safety))
+                       die(_("could not parse %s"), am_path(state, "abort-safety"));
        } else
-               hashclr(abort_safety);
+               oidclr(&abort_safety);
 
-       if (get_sha1("HEAD", head))
-               hashclr(head);
+       if (get_oid("HEAD", &head))
+               oidclr(&head);
 
-       if (!hashcmp(head, abort_safety))
+       if (!oidcmp(&head, &abort_safety))
                return 1;
 
-       error(_("You seem to have moved HEAD since the last 'am' failure.\n"
+       warning(_("You seem to have moved HEAD since the last 'am' failure.\n"
                "Not rewinding to ORIG_HEAD"));
 
        return 0;
@@ -2124,7 +2136,7 @@ static int safe_to_abort(const struct am_state *state)
  */
 static void am_abort(struct am_state *state)
 {
-       unsigned char curr_head[GIT_SHA1_RAWSZ], orig_head[GIT_SHA1_RAWSZ];
+       struct object_id curr_head, orig_head;
        int has_curr_head, has_orig_head;
        char *curr_branch;
 
@@ -2135,23 +2147,23 @@ static void am_abort(struct am_state *state)
 
        am_rerere_clear();
 
-       curr_branch = resolve_refdup("HEAD", 0, curr_head, NULL);
-       has_curr_head = !is_null_sha1(curr_head);
+       curr_branch = resolve_refdup("HEAD", 0, curr_head.hash, NULL);
+       has_curr_head = curr_branch && !is_null_oid(&curr_head);
        if (!has_curr_head)
-               hashcpy(curr_head, EMPTY_TREE_SHA1_BIN);
+               hashcpy(curr_head.hash, EMPTY_TREE_SHA1_BIN);
 
-       has_orig_head = !get_sha1("ORIG_HEAD", orig_head);
+       has_orig_head = !get_oid("ORIG_HEAD", &orig_head);
        if (!has_orig_head)
-               hashcpy(orig_head, EMPTY_TREE_SHA1_BIN);
+               hashcpy(orig_head.hash, EMPTY_TREE_SHA1_BIN);
 
-       clean_index(curr_head, orig_head);
+       clean_index(&curr_head, &orig_head);
 
        if (has_orig_head)
-               update_ref("am --abort", "HEAD", orig_head,
-                               has_curr_head ? curr_head : NULL, 0,
+               update_ref_oid("am --abort", "HEAD", &orig_head,
+                               has_curr_head ? &curr_head : NULL, 0,
                                UPDATE_REFS_DIE_ON_ERR);
        else if (curr_branch)
-               delete_ref(curr_branch, NULL, REF_NODEREF);
+               delete_ref(NULL, curr_branch, NULL, REF_NODEREF);
 
        free(curr_branch);
        am_destroy(state);
@@ -2299,9 +2311,12 @@ int cmd_am(int argc, const char **argv, const char *prefix)
                OPT_END()
        };
 
+       if (argc == 2 && !strcmp(argv[1], "-h"))
+               usage_with_options(usage, options);
+
        git_config(git_am_config, NULL);
 
-       am_state_init(&state, git_path("rebase-apply"));
+       am_state_init(&state);
 
        in_progress = am_in_progress(&state);
        if (in_progress)
index 1a488f9e888b6e9ebb1357a6cf3f7f007cf732fe..81b9a61c3713a718a912d49916cf2632478cb47c 100644 (file)
-/*
- * apply.c
- *
- * Copyright (C) Linus Torvalds, 2005
- *
- * This applies patches on top of some (arbitrary) version of the SCM.
- *
- */
 #include "cache.h"
-#include "lockfile.h"
-#include "cache-tree.h"
-#include "quote.h"
-#include "blob.h"
-#include "delta.h"
-#include "builtin.h"
-#include "string-list.h"
-#include "dir.h"
-#include "diff.h"
-#include "parse-options.h"
-#include "xdiff-interface.h"
-#include "ll-merge.h"
-#include "rerere.h"
-
-enum ws_error_action {
-       nowarn_ws_error,
-       warn_on_ws_error,
-       die_on_ws_error,
-       correct_ws_error
-};
-
-
-enum ws_ignore {
-       ignore_ws_none,
-       ignore_ws_change
-};
-
-/*
- * We need to keep track of how symlinks in the preimage are
- * manipulated by the patches.  A patch to add a/b/c where a/b
- * is a symlink should not be allowed to affect the directory
- * the symlink points at, but if the same patch removes a/b,
- * it is perfectly fine, as the patch removes a/b to make room
- * to create a directory a/b so that a/b/c can be created.
- *
- * See also "struct string_list symlink_changes" in "struct
- * apply_state".
- */
-#define SYMLINK_GOES_AWAY 01
-#define SYMLINK_IN_RESULT 02
-
-struct apply_state {
-       const char *prefix;
-       int prefix_length;
-
-       /* These are lock_file related */
-       struct lock_file *lock_file;
-       int newfd;
-
-       /* These control what gets looked at and modified */
-       int apply; /* this is not a dry-run */
-       int cached; /* apply to the index only */
-       int check; /* preimage must match working tree, don't actually apply */
-       int check_index; /* preimage must match the indexed version */
-       int update_index; /* check_index && apply */
-
-       /* These control cosmetic aspect of the output */
-       int diffstat; /* just show a diffstat, and don't actually apply */
-       int numstat; /* just show a numeric diffstat, and don't actually apply */
-       int summary; /* just report creation, deletion, etc, and don't actually apply */
-
-       /* These boolean parameters control how the apply is done */
-       int allow_overlap;
-       int apply_in_reverse;
-       int apply_with_reject;
-       int apply_verbosely;
-       int no_add;
-       int threeway;
-       int unidiff_zero;
-       int unsafe_paths;
-
-       /* Other non boolean parameters */
-       const char *fake_ancestor;
-       const char *patch_input_file;
-       int line_termination;
-       struct strbuf root;
-       int p_value;
-       int p_value_known;
-       unsigned int p_context;
-
-       /* Exclude and include path parameters */
-       struct string_list limit_by_name;
-       int has_include;
-
-       /* Various "current state" */
-       int linenr; /* current line number */
-       struct string_list symlink_changes; /* we have to track symlinks */
-
-       /*
-        * For "diff-stat" like behaviour, we keep track of the biggest change
-        * we've seen, and the longest filename. That allows us to do simple
-        * scaling.
-        */
-       int max_change;
-       int max_len;
-
-       /*
-        * Records filenames that have been touched, in order to handle
-        * the case where more than one patches touch the same file.
-        */
-       struct string_list fn_table;
-
-       /* These control whitespace errors */
-       enum ws_error_action ws_error_action;
-       enum ws_ignore ws_ignore_action;
-       const char *whitespace_option;
-       int whitespace_error;
-       int squelch_whitespace_errors;
-       int applied_after_fixing_ws;
-};
-
-static const char * const apply_usage[] = {
-       N_("git apply [<options>] [<patch>...]"),
-       NULL
-};
-
-static void parse_whitespace_option(struct apply_state *state, const char *option)
-{
-       if (!option) {
-               state->ws_error_action = warn_on_ws_error;
-               return;
-       }
-       if (!strcmp(option, "warn")) {
-               state->ws_error_action = warn_on_ws_error;
-               return;
-       }
-       if (!strcmp(option, "nowarn")) {
-               state->ws_error_action = nowarn_ws_error;
-               return;
-       }
-       if (!strcmp(option, "error")) {
-               state->ws_error_action = die_on_ws_error;
-               return;
-       }
-       if (!strcmp(option, "error-all")) {
-               state->ws_error_action = die_on_ws_error;
-               state->squelch_whitespace_errors = 0;
-               return;
-       }
-       if (!strcmp(option, "strip") || !strcmp(option, "fix")) {
-               state->ws_error_action = correct_ws_error;
-               return;
-       }
-       die(_("unrecognized whitespace option '%s'"), option);
-}
-
-static void parse_ignorewhitespace_option(struct apply_state *state,
-                                         const char *option)
-{
-       if (!option || !strcmp(option, "no") ||
-           !strcmp(option, "false") || !strcmp(option, "never") ||
-           !strcmp(option, "none")) {
-               state->ws_ignore_action = ignore_ws_none;
-               return;
-       }
-       if (!strcmp(option, "change")) {
-               state->ws_ignore_action = ignore_ws_change;
-               return;
-       }
-       die(_("unrecognized whitespace ignore option '%s'"), option);
-}
-
-static void set_default_whitespace_mode(struct apply_state *state)
-{
-       if (!state->whitespace_option && !apply_default_whitespace)
-               state->ws_error_action = (state->apply ? warn_on_ws_error : nowarn_ws_error);
-}
-
-/*
- * This represents one "hunk" from a patch, starting with
- * "@@ -oldpos,oldlines +newpos,newlines @@" marker.  The
- * patch text is pointed at by patch, and its byte length
- * is stored in size.  leading and trailing are the number
- * of context lines.
- */
-struct fragment {
-       unsigned long leading, trailing;
-       unsigned long oldpos, oldlines;
-       unsigned long newpos, newlines;
-       /*
-        * 'patch' is usually borrowed from buf in apply_patch(),
-        * but some codepaths store an allocated buffer.
-        */
-       const char *patch;
-       unsigned free_patch:1,
-               rejected:1;
-       int size;
-       int linenr;
-       struct fragment *next;
-};
-
-/*
- * When dealing with a binary patch, we reuse "leading" field
- * to store the type of the binary hunk, either deflated "delta"
- * or deflated "literal".
- */
-#define binary_patch_method leading
-#define BINARY_DELTA_DEFLATED  1
-#define BINARY_LITERAL_DEFLATED 2
-
-/*
- * This represents a "patch" to a file, both metainfo changes
- * such as creation/deletion, filemode and content changes represented
- * as a series of fragments.
- */
-struct patch {
-       char *new_name, *old_name, *def_name;
-       unsigned int old_mode, new_mode;
-       int is_new, is_delete;  /* -1 = unknown, 0 = false, 1 = true */
-       int rejected;
-       unsigned ws_rule;
-       int lines_added, lines_deleted;
-       int score;
-       unsigned int is_toplevel_relative:1;
-       unsigned int inaccurate_eof:1;
-       unsigned int is_binary:1;
-       unsigned int is_copy:1;
-       unsigned int is_rename:1;
-       unsigned int recount:1;
-       unsigned int conflicted_threeway:1;
-       unsigned int direct_to_threeway:1;
-       struct fragment *fragments;
-       char *result;
-       size_t resultsize;
-       char old_sha1_prefix[41];
-       char new_sha1_prefix[41];
-       struct patch *next;
-
-       /* three-way fallback result */
-       struct object_id threeway_stage[3];
-};
-
-static void free_fragment_list(struct fragment *list)
-{
-       while (list) {
-               struct fragment *next = list->next;
-               if (list->free_patch)
-                       free((char *)list->patch);
-               free(list);
-               list = next;
-       }
-}
-
-static void free_patch(struct patch *patch)
-{
-       free_fragment_list(patch->fragments);
-       free(patch->def_name);
-       free(patch->old_name);
-       free(patch->new_name);
-       free(patch->result);
-       free(patch);
-}
-
-static void free_patch_list(struct patch *list)
-{
-       while (list) {
-               struct patch *next = list->next;
-               free_patch(list);
-               list = next;
-       }
-}
-
-/*
- * A line in a file, len-bytes long (includes the terminating LF,
- * except for an incomplete line at the end if the file ends with
- * one), and its contents hashes to 'hash'.
- */
-struct line {
-       size_t len;
-       unsigned hash : 24;
-       unsigned flag : 8;
-#define LINE_COMMON     1
-#define LINE_PATCHED   2
-};
-
-/*
- * This represents a "file", which is an array of "lines".
- */
-struct image {
-       char *buf;
-       size_t len;
-       size_t nr;
-       size_t alloc;
-       struct line *line_allocated;
-       struct line *line;
-};
-
-static uint32_t hash_line(const char *cp, size_t len)
-{
-       size_t i;
-       uint32_t h;
-       for (i = 0, h = 0; i < len; i++) {
-               if (!isspace(cp[i])) {
-                       h = h * 3 + (cp[i] & 0xff);
-               }
-       }
-       return h;
-}
-
-/*
- * Compare lines s1 of length n1 and s2 of length n2, ignoring
- * whitespace difference. Returns 1 if they match, 0 otherwise
- */
-static int fuzzy_matchlines(const char *s1, size_t n1,
-                           const char *s2, size_t n2)
-{
-       const char *last1 = s1 + n1 - 1;
-       const char *last2 = s2 + n2 - 1;
-       int result = 0;
-
-       /* ignore line endings */
-       while ((*last1 == '\r') || (*last1 == '\n'))
-               last1--;
-       while ((*last2 == '\r') || (*last2 == '\n'))
-               last2--;
-
-       /* skip leading whitespaces, if both begin with whitespace */
-       if (s1 <= last1 && s2 <= last2 && isspace(*s1) && isspace(*s2)) {
-               while (isspace(*s1) && (s1 <= last1))
-                       s1++;
-               while (isspace(*s2) && (s2 <= last2))
-                       s2++;
-       }
-       /* early return if both lines are empty */
-       if ((s1 > last1) && (s2 > last2))
-               return 1;
-       while (!result) {
-               result = *s1++ - *s2++;
-               /*
-                * Skip whitespace inside. We check for whitespace on
-                * both buffers because we don't want "a b" to match
-                * "ab"
-                */
-               if (isspace(*s1) && isspace(*s2)) {
-                       while (isspace(*s1) && s1 <= last1)
-                               s1++;
-                       while (isspace(*s2) && s2 <= last2)
-                               s2++;
-               }
-               /*
-                * If we reached the end on one side only,
-                * lines don't match
-                */
-               if (
-                   ((s2 > last2) && (s1 <= last1)) ||
-                   ((s1 > last1) && (s2 <= last2)))
-                       return 0;
-               if ((s1 > last1) && (s2 > last2))
-                       break;
-       }
-
-       return !result;
-}
-
-static void add_line_info(struct image *img, const char *bol, size_t len, unsigned flag)
-{
-       ALLOC_GROW(img->line_allocated, img->nr + 1, img->alloc);
-       img->line_allocated[img->nr].len = len;
-       img->line_allocated[img->nr].hash = hash_line(bol, len);
-       img->line_allocated[img->nr].flag = flag;
-       img->nr++;
-}
-
-/*
- * "buf" has the file contents to be patched (read from various sources).
- * attach it to "image" and add line-based index to it.
- * "image" now owns the "buf".
- */
-static void prepare_image(struct image *image, char *buf, size_t len,
-                         int prepare_linetable)
-{
-       const char *cp, *ep;
-
-       memset(image, 0, sizeof(*image));
-       image->buf = buf;
-       image->len = len;
-
-       if (!prepare_linetable)
-               return;
-
-       ep = image->buf + image->len;
-       cp = image->buf;
-       while (cp < ep) {
-               const char *next;
-               for (next = cp; next < ep && *next != '\n'; next++)
-                       ;
-               if (next < ep)
-                       next++;
-               add_line_info(image, cp, next - cp, 0);
-               cp = next;
-       }
-       image->line = image->line_allocated;
-}
-
-static void clear_image(struct image *image)
-{
-       free(image->buf);
-       free(image->line_allocated);
-       memset(image, 0, sizeof(*image));
-}
-
-/* fmt must contain _one_ %s and no other substitution */
-static void say_patch_name(FILE *output, const char *fmt, struct patch *patch)
-{
-       struct strbuf sb = STRBUF_INIT;
-
-       if (patch->old_name && patch->new_name &&
-           strcmp(patch->old_name, patch->new_name)) {
-               quote_c_style(patch->old_name, &sb, NULL, 0);
-               strbuf_addstr(&sb, " => ");
-               quote_c_style(patch->new_name, &sb, NULL, 0);
-       } else {
-               const char *n = patch->new_name;
-               if (!n)
-                       n = patch->old_name;
-               quote_c_style(n, &sb, NULL, 0);
-       }
-       fprintf(output, fmt, sb.buf);
-       fputc('\n', output);
-       strbuf_release(&sb);
-}
-
-#define SLOP (16)
-
-static void read_patch_file(struct strbuf *sb, int fd)
-{
-       if (strbuf_read(sb, fd, 0) < 0)
-               die_errno("git apply: failed to read");
-
-       /*
-        * Make sure that we have some slop in the buffer
-        * so that we can do speculative "memcmp" etc, and
-        * see to it that it is NUL-filled.
-        */
-       strbuf_grow(sb, SLOP);
-       memset(sb->buf + sb->len, 0, SLOP);
-}
-
-static unsigned long linelen(const char *buffer, unsigned long size)
-{
-       unsigned long len = 0;
-       while (size--) {
-               len++;
-               if (*buffer++ == '\n')
-                       break;
-       }
-       return len;
-}
-
-static int is_dev_null(const char *str)
-{
-       return skip_prefix(str, "/dev/null", &str) && isspace(*str);
-}
-
-#define TERM_SPACE     1
-#define TERM_TAB       2
-
-static int name_terminate(int c, int terminate)
-{
-       if (c == ' ' && !(terminate & TERM_SPACE))
-               return 0;
-       if (c == '\t' && !(terminate & TERM_TAB))
-               return 0;
-
-       return 1;
-}
-
-/* remove double slashes to make --index work with such filenames */
-static char *squash_slash(char *name)
-{
-       int i = 0, j = 0;
-
-       if (!name)
-               return NULL;
-
-       while (name[i]) {
-               if ((name[j++] = name[i++]) == '/')
-                       while (name[i] == '/')
-                               i++;
-       }
-       name[j] = '\0';
-       return name;
-}
-
-static char *find_name_gnu(struct apply_state *state,
-                          const char *line,
-                          const char *def,
-                          int p_value)
-{
-       struct strbuf name = STRBUF_INIT;
-       char *cp;
-
-       /*
-        * Proposed "new-style" GNU patch/diff format; see
-        * http://marc.info/?l=git&m=112927316408690&w=2
-        */
-       if (unquote_c_style(&name, line, NULL)) {
-               strbuf_release(&name);
-               return NULL;
-       }
-
-       for (cp = name.buf; p_value; p_value--) {
-               cp = strchr(cp, '/');
-               if (!cp) {
-                       strbuf_release(&name);
-                       return NULL;
-               }
-               cp++;
-       }
-
-       strbuf_remove(&name, 0, cp - name.buf);
-       if (state->root.len)
-               strbuf_insert(&name, 0, state->root.buf, state->root.len);
-       return squash_slash(strbuf_detach(&name, NULL));
-}
-
-static size_t sane_tz_len(const char *line, size_t len)
-{
-       const char *tz, *p;
-
-       if (len < strlen(" +0500") || line[len-strlen(" +0500")] != ' ')
-               return 0;
-       tz = line + len - strlen(" +0500");
-
-       if (tz[1] != '+' && tz[1] != '-')
-               return 0;
-
-       for (p = tz + 2; p != line + len; p++)
-               if (!isdigit(*p))
-                       return 0;
-
-       return line + len - tz;
-}
-
-static size_t tz_with_colon_len(const char *line, size_t len)
-{
-       const char *tz, *p;
-
-       if (len < strlen(" +08:00") || line[len - strlen(":00")] != ':')
-               return 0;
-       tz = line + len - strlen(" +08:00");
-
-       if (tz[0] != ' ' || (tz[1] != '+' && tz[1] != '-'))
-               return 0;
-       p = tz + 2;
-       if (!isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
-           !isdigit(*p++) || !isdigit(*p++))
-               return 0;
-
-       return line + len - tz;
-}
-
-static size_t date_len(const char *line, size_t len)
-{
-       const char *date, *p;
-
-       if (len < strlen("72-02-05") || line[len-strlen("-05")] != '-')
-               return 0;
-       p = date = line + len - strlen("72-02-05");
-
-       if (!isdigit(*p++) || !isdigit(*p++) || *p++ != '-' ||
-           !isdigit(*p++) || !isdigit(*p++) || *p++ != '-' ||
-           !isdigit(*p++) || !isdigit(*p++))   /* Not a date. */
-               return 0;
-
-       if (date - line >= strlen("19") &&
-           isdigit(date[-1]) && isdigit(date[-2]))     /* 4-digit year */
-               date -= strlen("19");
-
-       return line + len - date;
-}
-
-static size_t short_time_len(const char *line, size_t len)
-{
-       const char *time, *p;
-
-       if (len < strlen(" 07:01:32") || line[len-strlen(":32")] != ':')
-               return 0;
-       p = time = line + len - strlen(" 07:01:32");
-
-       /* Permit 1-digit hours? */
-       if (*p++ != ' ' ||
-           !isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
-           !isdigit(*p++) || !isdigit(*p++) || *p++ != ':' ||
-           !isdigit(*p++) || !isdigit(*p++))   /* Not a time. */
-               return 0;
-
-       return line + len - time;
-}
-
-static size_t fractional_time_len(const char *line, size_t len)
-{
-       const char *p;
-       size_t n;
-
-       /* Expected format: 19:41:17.620000023 */
-       if (!len || !isdigit(line[len - 1]))
-               return 0;
-       p = line + len - 1;
-
-       /* Fractional seconds. */
-       while (p > line && isdigit(*p))
-               p--;
-       if (*p != '.')
-               return 0;
-
-       /* Hours, minutes, and whole seconds. */
-       n = short_time_len(line, p - line);
-       if (!n)
-               return 0;
-
-       return line + len - p + n;
-}
-
-static size_t trailing_spaces_len(const char *line, size_t len)
-{
-       const char *p;
-
-       /* Expected format: ' ' x (1 or more)  */
-       if (!len || line[len - 1] != ' ')
-               return 0;
-
-       p = line + len;
-       while (p != line) {
-               p--;
-               if (*p != ' ')
-                       return line + len - (p + 1);
-       }
-
-       /* All spaces! */
-       return len;
-}
-
-static size_t diff_timestamp_len(const char *line, size_t len)
-{
-       const char *end = line + len;
-       size_t n;
-
-       /*
-        * Posix: 2010-07-05 19:41:17
-        * GNU: 2010-07-05 19:41:17.620000023 -0500
-        */
-
-       if (!isdigit(end[-1]))
-               return 0;
-
-       n = sane_tz_len(line, end - line);
-       if (!n)
-               n = tz_with_colon_len(line, end - line);
-       end -= n;
-
-       n = short_time_len(line, end - line);
-       if (!n)
-               n = fractional_time_len(line, end - line);
-       end -= n;
-
-       n = date_len(line, end - line);
-       if (!n) /* No date.  Too bad. */
-               return 0;
-       end -= n;
-
-       if (end == line)        /* No space before date. */
-               return 0;
-       if (end[-1] == '\t') {  /* Success! */
-               end--;
-               return line + len - end;
-       }
-       if (end[-1] != ' ')     /* No space before date. */
-               return 0;
-
-       /* Whitespace damage. */
-       end -= trailing_spaces_len(line, end - line);
-       return line + len - end;
-}
-
-static char *find_name_common(struct apply_state *state,
-                             const char *line,
-                             const char *def,
-                             int p_value,
-                             const char *end,
-                             int terminate)
-{
-       int len;
-       const char *start = NULL;
-
-       if (p_value == 0)
-               start = line;
-       while (line != end) {
-               char c = *line;
-
-               if (!end && isspace(c)) {
-                       if (c == '\n')
-                               break;
-                       if (name_terminate(c, terminate))
-                               break;
-               }
-               line++;
-               if (c == '/' && !--p_value)
-                       start = line;
-       }
-       if (!start)
-               return squash_slash(xstrdup_or_null(def));
-       len = line - start;
-       if (!len)
-               return squash_slash(xstrdup_or_null(def));
-
-       /*
-        * Generally we prefer the shorter name, especially
-        * if the other one is just a variation of that with
-        * something else tacked on to the end (ie "file.orig"
-        * or "file~").
-        */
-       if (def) {
-               int deflen = strlen(def);
-               if (deflen < len && !strncmp(start, def, deflen))
-                       return squash_slash(xstrdup(def));
-       }
-
-       if (state->root.len) {
-               char *ret = xstrfmt("%s%.*s", state->root.buf, len, start);
-               return squash_slash(ret);
-       }
-
-       return squash_slash(xmemdupz(start, len));
-}
-
-static char *find_name(struct apply_state *state,
-                      const char *line,
-                      char *def,
-                      int p_value,
-                      int terminate)
-{
-       if (*line == '"') {
-               char *name = find_name_gnu(state, line, def, p_value);
-               if (name)
-                       return name;
-       }
-
-       return find_name_common(state, line, def, p_value, NULL, terminate);
-}
-
-static char *find_name_traditional(struct apply_state *state,
-                                  const char *line,
-                                  char *def,
-                                  int p_value)
-{
-       size_t len;
-       size_t date_len;
-
-       if (*line == '"') {
-               char *name = find_name_gnu(state, line, def, p_value);
-               if (name)
-                       return name;
-       }
-
-       len = strchrnul(line, '\n') - line;
-       date_len = diff_timestamp_len(line, len);
-       if (!date_len)
-               return find_name_common(state, line, def, p_value, NULL, TERM_TAB);
-       len -= date_len;
-
-       return find_name_common(state, line, def, p_value, line + len, 0);
-}
-
-static int count_slashes(const char *cp)
-{
-       int cnt = 0;
-       char ch;
-
-       while ((ch = *cp++))
-               if (ch == '/')
-                       cnt++;
-       return cnt;
-}
-
-/*
- * Given the string after "--- " or "+++ ", guess the appropriate
- * p_value for the given patch.
- */
-static int guess_p_value(struct apply_state *state, const char *nameline)
-{
-       char *name, *cp;
-       int val = -1;
-
-       if (is_dev_null(nameline))
-               return -1;
-       name = find_name_traditional(state, nameline, NULL, 0);
-       if (!name)
-               return -1;
-       cp = strchr(name, '/');
-       if (!cp)
-               val = 0;
-       else if (state->prefix) {
-               /*
-                * Does it begin with "a/$our-prefix" and such?  Then this is
-                * very likely to apply to our directory.
-                */
-               if (!strncmp(name, state->prefix, state->prefix_length))
-                       val = count_slashes(state->prefix);
-               else {
-                       cp++;
-                       if (!strncmp(cp, state->prefix, state->prefix_length))
-                               val = count_slashes(state->prefix) + 1;
-               }
-       }
-       free(name);
-       return val;
-}
-
-/*
- * Does the ---/+++ line have the POSIX timestamp after the last HT?
- * GNU diff puts epoch there to signal a creation/deletion event.  Is
- * this such a timestamp?
- */
-static int has_epoch_timestamp(const char *nameline)
-{
-       /*
-        * We are only interested in epoch timestamp; any non-zero
-        * fraction cannot be one, hence "(\.0+)?" in the regexp below.
-        * For the same reason, the date must be either 1969-12-31 or
-        * 1970-01-01, and the seconds part must be "00".
-        */
-       const char stamp_regexp[] =
-               "^(1969-12-31|1970-01-01)"
-               " "
-               "[0-2][0-9]:[0-5][0-9]:00(\\.0+)?"
-               " "
-               "([-+][0-2][0-9]:?[0-5][0-9])\n";
-       const char *timestamp = NULL, *cp, *colon;
-       static regex_t *stamp;
-       regmatch_t m[10];
-       int zoneoffset;
-       int hourminute;
-       int status;
-
-       for (cp = nameline; *cp != '\n'; cp++) {
-               if (*cp == '\t')
-                       timestamp = cp + 1;
-       }
-       if (!timestamp)
-               return 0;
-       if (!stamp) {
-               stamp = xmalloc(sizeof(*stamp));
-               if (regcomp(stamp, stamp_regexp, REG_EXTENDED)) {
-                       warning(_("Cannot prepare timestamp regexp %s"),
-                               stamp_regexp);
-                       return 0;
-               }
-       }
-
-       status = regexec(stamp, timestamp, ARRAY_SIZE(m), m, 0);
-       if (status) {
-               if (status != REG_NOMATCH)
-                       warning(_("regexec returned %d for input: %s"),
-                               status, timestamp);
-               return 0;
-       }
-
-       zoneoffset = strtol(timestamp + m[3].rm_so + 1, (char **) &colon, 10);
-       if (*colon == ':')
-               zoneoffset = zoneoffset * 60 + strtol(colon + 1, NULL, 10);
-       else
-               zoneoffset = (zoneoffset / 100) * 60 + (zoneoffset % 100);
-       if (timestamp[m[3].rm_so] == '-')
-               zoneoffset = -zoneoffset;
-
-       /*
-        * YYYY-MM-DD hh:mm:ss must be from either 1969-12-31
-        * (west of GMT) or 1970-01-01 (east of GMT)
-        */
-       if ((zoneoffset < 0 && memcmp(timestamp, "1969-12-31", 10)) ||
-           (0 <= zoneoffset && memcmp(timestamp, "1970-01-01", 10)))
-               return 0;
-
-       hourminute = (strtol(timestamp + 11, NULL, 10) * 60 +
-                     strtol(timestamp + 14, NULL, 10) -
-                     zoneoffset);
-
-       return ((zoneoffset < 0 && hourminute == 1440) ||
-               (0 <= zoneoffset && !hourminute));
-}
-
-/*
- * Get the name etc info from the ---/+++ lines of a traditional patch header
- *
- * FIXME! The end-of-filename heuristics are kind of screwy. For existing
- * files, we can happily check the index for a match, but for creating a
- * new file we should try to match whatever "patch" does. I have no idea.
- */
-static void parse_traditional_patch(struct apply_state *state,
-                                   const char *first,
-                                   const char *second,
-                                   struct patch *patch)
-{
-       char *name;
-
-       first += 4;     /* skip "--- " */
-       second += 4;    /* skip "+++ " */
-       if (!state->p_value_known) {
-               int p, q;
-               p = guess_p_value(state, first);
-               q = guess_p_value(state, second);
-               if (p < 0) p = q;
-               if (0 <= p && p == q) {
-                       state->p_value = p;
-                       state->p_value_known = 1;
-               }
-       }
-       if (is_dev_null(first)) {
-               patch->is_new = 1;
-               patch->is_delete = 0;
-               name = find_name_traditional(state, second, NULL, state->p_value);
-               patch->new_name = name;
-       } else if (is_dev_null(second)) {
-               patch->is_new = 0;
-               patch->is_delete = 1;
-               name = find_name_traditional(state, first, NULL, state->p_value);
-               patch->old_name = name;
-       } else {
-               char *first_name;
-               first_name = find_name_traditional(state, first, NULL, state->p_value);
-               name = find_name_traditional(state, second, first_name, state->p_value);
-               free(first_name);
-               if (has_epoch_timestamp(first)) {
-                       patch->is_new = 1;
-                       patch->is_delete = 0;
-                       patch->new_name = name;
-               } else if (has_epoch_timestamp(second)) {
-                       patch->is_new = 0;
-                       patch->is_delete = 1;
-                       patch->old_name = name;
-               } else {
-                       patch->old_name = name;
-                       patch->new_name = xstrdup_or_null(name);
-               }
-       }
-       if (!name)
-               die(_("unable to find filename in patch at line %d"), state->linenr);
-}
-
-static int gitdiff_hdrend(struct apply_state *state,
-                         const char *line,
-                         struct patch *patch)
-{
-       return -1;
-}
-
-/*
- * We're anal about diff header consistency, to make
- * sure that we don't end up having strange ambiguous
- * patches floating around.
- *
- * As a result, gitdiff_{old|new}name() will check
- * their names against any previous information, just
- * to make sure..
- */
-#define DIFF_OLD_NAME 0
-#define DIFF_NEW_NAME 1
-
-static void gitdiff_verify_name(struct apply_state *state,
-                               const char *line,
-                               int isnull,
-                               char **name,
-                               int side)
-{
-       if (!*name && !isnull) {
-               *name = find_name(state, line, NULL, state->p_value, TERM_TAB);
-               return;
-       }
-
-       if (*name) {
-               int len = strlen(*name);
-               char *another;
-               if (isnull)
-                       die(_("git apply: bad git-diff - expected /dev/null, got %s on line %d"),
-                           *name, state->linenr);
-               another = find_name(state, line, NULL, state->p_value, TERM_TAB);
-               if (!another || memcmp(another, *name, len + 1))
-                       die((side == DIFF_NEW_NAME) ?
-                           _("git apply: bad git-diff - inconsistent new filename on line %d") :
-                           _("git apply: bad git-diff - inconsistent old filename on line %d"), state->linenr);
-               free(another);
-       } else {
-               /* expect "/dev/null" */
-               if (memcmp("/dev/null", line, 9) || line[9] != '\n')
-                       die(_("git apply: bad git-diff - expected /dev/null on line %d"), state->linenr);
-       }
-}
-
-static int gitdiff_oldname(struct apply_state *state,
-                          const char *line,
-                          struct patch *patch)
-{
-       gitdiff_verify_name(state, line,
-                           patch->is_new, &patch->old_name,
-                           DIFF_OLD_NAME);
-       return 0;
-}
-
-static int gitdiff_newname(struct apply_state *state,
-                          const char *line,
-                          struct patch *patch)
-{
-       gitdiff_verify_name(state, line,
-                           patch->is_delete, &patch->new_name,
-                           DIFF_NEW_NAME);
-       return 0;
-}
-
-static int gitdiff_oldmode(struct apply_state *state,
-                          const char *line,
-                          struct patch *patch)
-{
-       patch->old_mode = strtoul(line, NULL, 8);
-       return 0;
-}
-
-static int gitdiff_newmode(struct apply_state *state,
-                          const char *line,
-                          struct patch *patch)
-{
-       patch->new_mode = strtoul(line, NULL, 8);
-       return 0;
-}
-
-static int gitdiff_delete(struct apply_state *state,
-                         const char *line,
-                         struct patch *patch)
-{
-       patch->is_delete = 1;
-       free(patch->old_name);
-       patch->old_name = xstrdup_or_null(patch->def_name);
-       return gitdiff_oldmode(state, line, patch);
-}
-
-static int gitdiff_newfile(struct apply_state *state,
-                          const char *line,
-                          struct patch *patch)
-{
-       patch->is_new = 1;
-       free(patch->new_name);
-       patch->new_name = xstrdup_or_null(patch->def_name);
-       return gitdiff_newmode(state, line, patch);
-}
-
-static int gitdiff_copysrc(struct apply_state *state,
-                          const char *line,
-                          struct patch *patch)
-{
-       patch->is_copy = 1;
-       free(patch->old_name);
-       patch->old_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_copydst(struct apply_state *state,
-                          const char *line,
-                          struct patch *patch)
-{
-       patch->is_copy = 1;
-       free(patch->new_name);
-       patch->new_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_renamesrc(struct apply_state *state,
-                            const char *line,
-                            struct patch *patch)
-{
-       patch->is_rename = 1;
-       free(patch->old_name);
-       patch->old_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_renamedst(struct apply_state *state,
-                            const char *line,
-                            struct patch *patch)
-{
-       patch->is_rename = 1;
-       free(patch->new_name);
-       patch->new_name = find_name(state, line, NULL, state->p_value ? state->p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_similarity(struct apply_state *state,
-                             const char *line,
-                             struct patch *patch)
-{
-       unsigned long val = strtoul(line, NULL, 10);
-       if (val <= 100)
-               patch->score = val;
-       return 0;
-}
-
-static int gitdiff_dissimilarity(struct apply_state *state,
-                                const char *line,
-                                struct patch *patch)
-{
-       unsigned long val = strtoul(line, NULL, 10);
-       if (val <= 100)
-               patch->score = val;
-       return 0;
-}
-
-static int gitdiff_index(struct apply_state *state,
-                        const char *line,
-                        struct patch *patch)
-{
-       /*
-        * index line is N hexadecimal, "..", N hexadecimal,
-        * and optional space with octal mode.
-        */
-       const char *ptr, *eol;
-       int len;
-
-       ptr = strchr(line, '.');
-       if (!ptr || ptr[1] != '.' || 40 < ptr - line)
-               return 0;
-       len = ptr - line;
-       memcpy(patch->old_sha1_prefix, line, len);
-       patch->old_sha1_prefix[len] = 0;
-
-       line = ptr + 2;
-       ptr = strchr(line, ' ');
-       eol = strchrnul(line, '\n');
-
-       if (!ptr || eol < ptr)
-               ptr = eol;
-       len = ptr - line;
-
-       if (40 < len)
-               return 0;
-       memcpy(patch->new_sha1_prefix, line, len);
-       patch->new_sha1_prefix[len] = 0;
-       if (*ptr == ' ')
-               patch->old_mode = strtoul(ptr+1, NULL, 8);
-       return 0;
-}
-
-/*
- * This is normal for a diff that doesn't change anything: we'll fall through
- * into the next diff. Tell the parser to break out.
- */
-static int gitdiff_unrecognized(struct apply_state *state,
-                               const char *line,
-                               struct patch *patch)
-{
-       return -1;
-}
-
-/*
- * Skip p_value leading components from "line"; as we do not accept
- * absolute paths, return NULL in that case.
- */
-static const char *skip_tree_prefix(struct apply_state *state,
-                                   const char *line,
-                                   int llen)
-{
-       int nslash;
-       int i;
-
-       if (!state->p_value)
-               return (llen && line[0] == '/') ? NULL : line;
-
-       nslash = state->p_value;
-       for (i = 0; i < llen; i++) {
-               int ch = line[i];
-               if (ch == '/' && --nslash <= 0)
-                       return (i == 0) ? NULL : &line[i + 1];
-       }
-       return NULL;
-}
-
-/*
- * This is to extract the same name that appears on "diff --git"
- * line.  We do not find and return anything if it is a rename
- * patch, and it is OK because we will find the name elsewhere.
- * We need to reliably find name only when it is mode-change only,
- * creation or deletion of an empty file.  In any of these cases,
- * both sides are the same name under a/ and b/ respectively.
- */
-static char *git_header_name(struct apply_state *state,
-                            const char *line,
-                            int llen)
-{
-       const char *name;
-       const char *second = NULL;
-       size_t len, line_len;
-
-       line += strlen("diff --git ");
-       llen -= strlen("diff --git ");
-
-       if (*line == '"') {
-               const char *cp;
-               struct strbuf first = STRBUF_INIT;
-               struct strbuf sp = STRBUF_INIT;
-
-               if (unquote_c_style(&first, line, &second))
-                       goto free_and_fail1;
-
-               /* strip the a/b prefix including trailing slash */
-               cp = skip_tree_prefix(state, first.buf, first.len);
-               if (!cp)
-                       goto free_and_fail1;
-               strbuf_remove(&first, 0, cp - first.buf);
-
-               /*
-                * second points at one past closing dq of name.
-                * find the second name.
-                */
-               while ((second < line + llen) && isspace(*second))
-                       second++;
-
-               if (line + llen <= second)
-                       goto free_and_fail1;
-               if (*second == '"') {
-                       if (unquote_c_style(&sp, second, NULL))
-                               goto free_and_fail1;
-                       cp = skip_tree_prefix(state, sp.buf, sp.len);
-                       if (!cp)
-                               goto free_and_fail1;
-                       /* They must match, otherwise ignore */
-                       if (strcmp(cp, first.buf))
-                               goto free_and_fail1;
-                       strbuf_release(&sp);
-                       return strbuf_detach(&first, NULL);
-               }
-
-               /* unquoted second */
-               cp = skip_tree_prefix(state, second, line + llen - second);
-               if (!cp)
-                       goto free_and_fail1;
-               if (line + llen - cp != first.len ||
-                   memcmp(first.buf, cp, first.len))
-                       goto free_and_fail1;
-               return strbuf_detach(&first, NULL);
-
-       free_and_fail1:
-               strbuf_release(&first);
-               strbuf_release(&sp);
-               return NULL;
-       }
-
-       /* unquoted first name */
-       name = skip_tree_prefix(state, line, llen);
-       if (!name)
-               return NULL;
-
-       /*
-        * since the first name is unquoted, a dq if exists must be
-        * the beginning of the second name.
-        */
-       for (second = name; second < line + llen; second++) {
-               if (*second == '"') {
-                       struct strbuf sp = STRBUF_INIT;
-                       const char *np;
-
-                       if (unquote_c_style(&sp, second, NULL))
-                               goto free_and_fail2;
-
-                       np = skip_tree_prefix(state, sp.buf, sp.len);
-                       if (!np)
-                               goto free_and_fail2;
-
-                       len = sp.buf + sp.len - np;
-                       if (len < second - name &&
-                           !strncmp(np, name, len) &&
-                           isspace(name[len])) {
-                               /* Good */
-                               strbuf_remove(&sp, 0, np - sp.buf);
-                               return strbuf_detach(&sp, NULL);
-                       }
-
-               free_and_fail2:
-                       strbuf_release(&sp);
-                       return NULL;
-               }
-       }
-
-       /*
-        * Accept a name only if it shows up twice, exactly the same
-        * form.
-        */
-       second = strchr(name, '\n');
-       if (!second)
-               return NULL;
-       line_len = second - name;
-       for (len = 0 ; ; len++) {
-               switch (name[len]) {
-               default:
-                       continue;
-               case '\n':
-                       return NULL;
-               case '\t': case ' ':
-                       /*
-                        * Is this the separator between the preimage
-                        * and the postimage pathname?  Again, we are
-                        * only interested in the case where there is
-                        * no rename, as this is only to set def_name
-                        * and a rename patch has the names elsewhere
-                        * in an unambiguous form.
-                        */
-                       if (!name[len + 1])
-                               return NULL; /* no postimage name */
-                       second = skip_tree_prefix(state, name + len + 1,
-                                                 line_len - (len + 1));
-                       if (!second)
-                               return NULL;
-                       /*
-                        * Does len bytes starting at "name" and "second"
-                        * (that are separated by one HT or SP we just
-                        * found) exactly match?
-                        */
-                       if (second[len] == '\n' && !strncmp(name, second, len))
-                               return xmemdupz(name, len);
-               }
-       }
-}
-
-/* Verify that we recognize the lines following a git header */
-static int parse_git_header(struct apply_state *state,
-                           const char *line,
-                           int len,
-                           unsigned int size,
-                           struct patch *patch)
-{
-       unsigned long offset;
-
-       /* A git diff has explicit new/delete information, so we don't guess */
-       patch->is_new = 0;
-       patch->is_delete = 0;
-
-       /*
-        * Some things may not have the old name in the
-        * rest of the headers anywhere (pure mode changes,
-        * or removing or adding empty files), so we get
-        * the default name from the header.
-        */
-       patch->def_name = git_header_name(state, line, len);
-       if (patch->def_name && state->root.len) {
-               char *s = xstrfmt("%s%s", state->root.buf, patch->def_name);
-               free(patch->def_name);
-               patch->def_name = s;
-       }
-
-       line += len;
-       size -= len;
-       state->linenr++;
-       for (offset = len ; size > 0 ; offset += len, size -= len, line += len, state->linenr++) {
-               static const struct opentry {
-                       const char *str;
-                       int (*fn)(struct apply_state *, const char *, struct patch *);
-               } optable[] = {
-                       { "@@ -", gitdiff_hdrend },
-                       { "--- ", gitdiff_oldname },
-                       { "+++ ", gitdiff_newname },
-                       { "old mode ", gitdiff_oldmode },
-                       { "new mode ", gitdiff_newmode },
-                       { "deleted file mode ", gitdiff_delete },
-                       { "new file mode ", gitdiff_newfile },
-                       { "copy from ", gitdiff_copysrc },
-                       { "copy to ", gitdiff_copydst },
-                       { "rename old ", gitdiff_renamesrc },
-                       { "rename new ", gitdiff_renamedst },
-                       { "rename from ", gitdiff_renamesrc },
-                       { "rename to ", gitdiff_renamedst },
-                       { "similarity index ", gitdiff_similarity },
-                       { "dissimilarity index ", gitdiff_dissimilarity },
-                       { "index ", gitdiff_index },
-                       { "", gitdiff_unrecognized },
-               };
-               int i;
-
-               len = linelen(line, size);
-               if (!len || line[len-1] != '\n')
-                       break;
-               for (i = 0; i < ARRAY_SIZE(optable); i++) {
-                       const struct opentry *p = optable + i;
-                       int oplen = strlen(p->str);
-                       if (len < oplen || memcmp(p->str, line, oplen))
-                               continue;
-                       if (p->fn(state, line + oplen, patch) < 0)
-                               return offset;
-                       break;
-               }
-       }
-
-       return offset;
-}
-
-static int parse_num(const char *line, unsigned long *p)
-{
-       char *ptr;
-
-       if (!isdigit(*line))
-               return 0;
-       *p = strtoul(line, &ptr, 10);
-       return ptr - line;
-}
-
-static int parse_range(const char *line, int len, int offset, const char *expect,
-                      unsigned long *p1, unsigned long *p2)
-{
-       int digits, ex;
-
-       if (offset < 0 || offset >= len)
-               return -1;
-       line += offset;
-       len -= offset;
-
-       digits = parse_num(line, p1);
-       if (!digits)
-               return -1;
-
-       offset += digits;
-       line += digits;
-       len -= digits;
-
-       *p2 = 1;
-       if (*line == ',') {
-               digits = parse_num(line+1, p2);
-               if (!digits)
-                       return -1;
-
-               offset += digits+1;
-               line += digits+1;
-               len -= digits+1;
-       }
-
-       ex = strlen(expect);
-       if (ex > len)
-               return -1;
-       if (memcmp(line, expect, ex))
-               return -1;
-
-       return offset + ex;
-}
-
-static void recount_diff(const char *line, int size, struct fragment *fragment)
-{
-       int oldlines = 0, newlines = 0, ret = 0;
-
-       if (size < 1) {
-               warning("recount: ignore empty hunk");
-               return;
-       }
-
-       for (;;) {
-               int len = linelen(line, size);
-               size -= len;
-               line += len;
-
-               if (size < 1)
-                       break;
-
-               switch (*line) {
-               case ' ': case '\n':
-                       newlines++;
-                       /* fall through */
-               case '-':
-                       oldlines++;
-                       continue;
-               case '+':
-                       newlines++;
-                       continue;
-               case '\\':
-                       continue;
-               case '@':
-                       ret = size < 3 || !starts_with(line, "@@ ");
-                       break;
-               case 'd':
-                       ret = size < 5 || !starts_with(line, "diff ");
-                       break;
-               default:
-                       ret = -1;
-                       break;
-               }
-               if (ret) {
-                       warning(_("recount: unexpected line: %.*s"),
-                               (int)linelen(line, size), line);
-                       return;
-               }
-               break;
-       }
-       fragment->oldlines = oldlines;
-       fragment->newlines = newlines;
-}
-
-/*
- * Parse a unified diff fragment header of the
- * form "@@ -a,b +c,d @@"
- */
-static int parse_fragment_header(const char *line, int len, struct fragment *fragment)
-{
-       int offset;
-
-       if (!len || line[len-1] != '\n')
-               return -1;
-
-       /* Figure out the number of lines in a fragment */
-       offset = parse_range(line, len, 4, " +", &fragment->oldpos, &fragment->oldlines);
-       offset = parse_range(line, len, offset, " @@", &fragment->newpos, &fragment->newlines);
-
-       return offset;
-}
-
-static int find_header(struct apply_state *state,
-                      const char *line,
-                      unsigned long size,
-                      int *hdrsize,
-                      struct patch *patch)
-{
-       unsigned long offset, len;
-
-       patch->is_toplevel_relative = 0;
-       patch->is_rename = patch->is_copy = 0;
-       patch->is_new = patch->is_delete = -1;
-       patch->old_mode = patch->new_mode = 0;
-       patch->old_name = patch->new_name = NULL;
-       for (offset = 0; size > 0; offset += len, size -= len, line += len, state->linenr++) {
-               unsigned long nextlen;
-
-               len = linelen(line, size);
-               if (!len)
-                       break;
-
-               /* Testing this early allows us to take a few shortcuts.. */
-               if (len < 6)
-                       continue;
-
-               /*
-                * Make sure we don't find any unconnected patch fragments.
-                * That's a sign that we didn't find a header, and that a
-                * patch has become corrupted/broken up.
-                */
-               if (!memcmp("@@ -", line, 4)) {
-                       struct fragment dummy;
-                       if (parse_fragment_header(line, len, &dummy) < 0)
-                               continue;
-                       die(_("patch fragment without header at line %d: %.*s"),
-                           state->linenr, (int)len-1, line);
-               }
-
-               if (size < len + 6)
-                       break;
-
-               /*
-                * Git patch? It might not have a real patch, just a rename
-                * or mode change, so we handle that specially
-                */
-               if (!memcmp("diff --git ", line, 11)) {
-                       int git_hdr_len = parse_git_header(state, line, len, size, patch);
-                       if (git_hdr_len <= len)
-                               continue;
-                       if (!patch->old_name && !patch->new_name) {
-                               if (!patch->def_name)
-                                       die(Q_("git diff header lacks filename information when removing "
-                                              "%d leading pathname component (line %d)",
-                                              "git diff header lacks filename information when removing "
-                                              "%d leading pathname components (line %d)",
-                                              state->p_value),
-                                           state->p_value, state->linenr);
-                               patch->old_name = xstrdup(patch->def_name);
-                               patch->new_name = xstrdup(patch->def_name);
-                       }
-                       if (!patch->is_delete && !patch->new_name)
-                               die("git diff header lacks filename information "
-                                   "(line %d)", state->linenr);
-                       patch->is_toplevel_relative = 1;
-                       *hdrsize = git_hdr_len;
-                       return offset;
-               }
-
-               /* --- followed by +++ ? */
-               if (memcmp("--- ", line,  4) || memcmp("+++ ", line + len, 4))
-                       continue;
-
-               /*
-                * We only accept unified patches, so we want it to
-                * at least have "@@ -a,b +c,d @@\n", which is 14 chars
-                * minimum ("@@ -0,0 +1 @@\n" is the shortest).
-                */
-               nextlen = linelen(line + len, size - len);
-               if (size < nextlen + 14 || memcmp("@@ -", line + len + nextlen, 4))
-                       continue;
-
-               /* Ok, we'll consider it a patch */
-               parse_traditional_patch(state, line, line+len, patch);
-               *hdrsize = len + nextlen;
-               state->linenr += 2;
-               return offset;
-       }
-       return -1;
-}
-
-static void record_ws_error(struct apply_state *state,
-                           unsigned result,
-                           const char *line,
-                           int len,
-                           int linenr)
-{
-       char *err;
-
-       if (!result)
-               return;
-
-       state->whitespace_error++;
-       if (state->squelch_whitespace_errors &&
-           state->squelch_whitespace_errors < state->whitespace_error)
-               return;
-
-       err = whitespace_error_string(result);
-       fprintf(stderr, "%s:%d: %s.\n%.*s\n",
-               state->patch_input_file, linenr, err, len, line);
-       free(err);
-}
-
-static void check_whitespace(struct apply_state *state,
-                            const char *line,
-                            int len,
-                            unsigned ws_rule)
-{
-       unsigned result = ws_check(line + 1, len - 1, ws_rule);
-
-       record_ws_error(state, result, line + 1, len - 2, state->linenr);
-}
-
-/*
- * Parse a unified diff. Note that this really needs to parse each
- * fragment separately, since the only way to know the difference
- * between a "---" that is part of a patch, and a "---" that starts
- * the next patch is to look at the line counts..
- */
-static int parse_fragment(struct apply_state *state,
-                         const char *line,
-                         unsigned long size,
-                         struct patch *patch,
-                         struct fragment *fragment)
-{
-       int added, deleted;
-       int len = linelen(line, size), offset;
-       unsigned long oldlines, newlines;
-       unsigned long leading, trailing;
-
-       offset = parse_fragment_header(line, len, fragment);
-       if (offset < 0)
-               return -1;
-       if (offset > 0 && patch->recount)
-               recount_diff(line + offset, size - offset, fragment);
-       oldlines = fragment->oldlines;
-       newlines = fragment->newlines;
-       leading = 0;
-       trailing = 0;
-
-       /* Parse the thing.. */
-       line += len;
-       size -= len;
-       state->linenr++;
-       added = deleted = 0;
-       for (offset = len;
-            0 < size;
-            offset += len, size -= len, line += len, state->linenr++) {
-               if (!oldlines && !newlines)
-                       break;
-               len = linelen(line, size);
-               if (!len || line[len-1] != '\n')
-                       return -1;
-               switch (*line) {
-               default:
-                       return -1;
-               case '\n': /* newer GNU diff, an empty context line */
-               case ' ':
-                       oldlines--;
-                       newlines--;
-                       if (!deleted && !added)
-                               leading++;
-                       trailing++;
-                       if (!state->apply_in_reverse &&
-                           state->ws_error_action == correct_ws_error)
-                               check_whitespace(state, line, len, patch->ws_rule);
-                       break;
-               case '-':
-                       if (state->apply_in_reverse &&
-                           state->ws_error_action != nowarn_ws_error)
-                               check_whitespace(state, line, len, patch->ws_rule);
-                       deleted++;
-                       oldlines--;
-                       trailing = 0;
-                       break;
-               case '+':
-                       if (!state->apply_in_reverse &&
-                           state->ws_error_action != nowarn_ws_error)
-                               check_whitespace(state, line, len, patch->ws_rule);
-                       added++;
-                       newlines--;
-                       trailing = 0;
-                       break;
-
-               /*
-                * We allow "\ No newline at end of file". Depending
-                 * on locale settings when the patch was produced we
-                 * don't know what this line looks like. The only
-                 * thing we do know is that it begins with "\ ".
-                * Checking for 12 is just for sanity check -- any
-                * l10n of "\ No newline..." is at least that long.
-                */
-               case '\\':
-                       if (len < 12 || memcmp(line, "\\ ", 2))
-                               return -1;
-                       break;
-               }
-       }
-       if (oldlines || newlines)
-               return -1;
-       if (!deleted && !added)
-               return -1;
-
-       fragment->leading = leading;
-       fragment->trailing = trailing;
-
-       /*
-        * If a fragment ends with an incomplete line, we failed to include
-        * it in the above loop because we hit oldlines == newlines == 0
-        * before seeing it.
-        */
-       if (12 < size && !memcmp(line, "\\ ", 2))
-               offset += linelen(line, size);
-
-       patch->lines_added += added;
-       patch->lines_deleted += deleted;
-
-       if (0 < patch->is_new && oldlines)
-               return error(_("new file depends on old contents"));
-       if (0 < patch->is_delete && newlines)
-               return error(_("deleted file still has contents"));
-       return offset;
-}
-
-/*
- * We have seen "diff --git a/... b/..." header (or a traditional patch
- * header).  Read hunks that belong to this patch into fragments and hang
- * them to the given patch structure.
- *
- * The (fragment->patch, fragment->size) pair points into the memory given
- * by the caller, not a copy, when we return.
- */
-static int parse_single_patch(struct apply_state *state,
-                             const char *line,
-                             unsigned long size,
-                             struct patch *patch)
-{
-       unsigned long offset = 0;
-       unsigned long oldlines = 0, newlines = 0, context = 0;
-       struct fragment **fragp = &patch->fragments;
-
-       while (size > 4 && !memcmp(line, "@@ -", 4)) {
-               struct fragment *fragment;
-               int len;
-
-               fragment = xcalloc(1, sizeof(*fragment));
-               fragment->linenr = state->linenr;
-               len = parse_fragment(state, line, size, patch, fragment);
-               if (len <= 0)
-                       die(_("corrupt patch at line %d"), state->linenr);
-               fragment->patch = line;
-               fragment->size = len;
-               oldlines += fragment->oldlines;
-               newlines += fragment->newlines;
-               context += fragment->leading + fragment->trailing;
-
-               *fragp = fragment;
-               fragp = &fragment->next;
-
-               offset += len;
-               line += len;
-               size -= len;
-       }
-
-       /*
-        * If something was removed (i.e. we have old-lines) it cannot
-        * be creation, and if something was added it cannot be
-        * deletion.  However, the reverse is not true; --unified=0
-        * patches that only add are not necessarily creation even
-        * though they do not have any old lines, and ones that only
-        * delete are not necessarily deletion.
-        *
-        * Unfortunately, a real creation/deletion patch do _not_ have
-        * any context line by definition, so we cannot safely tell it
-        * apart with --unified=0 insanity.  At least if the patch has
-        * more than one hunk it is not creation or deletion.
-        */
-       if (patch->is_new < 0 &&
-           (oldlines || (patch->fragments && patch->fragments->next)))
-               patch->is_new = 0;
-       if (patch->is_delete < 0 &&
-           (newlines || (patch->fragments && patch->fragments->next)))
-               patch->is_delete = 0;
-
-       if (0 < patch->is_new && oldlines)
-               die(_("new file %s depends on old contents"), patch->new_name);
-       if (0 < patch->is_delete && newlines)
-               die(_("deleted file %s still has contents"), patch->old_name);
-       if (!patch->is_delete && !newlines && context)
-               fprintf_ln(stderr,
-                          _("** warning: "
-                            "file %s becomes empty but is not deleted"),
-                          patch->new_name);
-
-       return offset;
-}
-
-static inline int metadata_changes(struct patch *patch)
-{
-       return  patch->is_rename > 0 ||
-               patch->is_copy > 0 ||
-               patch->is_new > 0 ||
-               patch->is_delete ||
-               (patch->old_mode && patch->new_mode &&
-                patch->old_mode != patch->new_mode);
-}
-
-static char *inflate_it(const void *data, unsigned long size,
-                       unsigned long inflated_size)
-{
-       git_zstream stream;
-       void *out;
-       int st;
-
-       memset(&stream, 0, sizeof(stream));
-
-       stream.next_in = (unsigned char *)data;
-       stream.avail_in = size;
-       stream.next_out = out = xmalloc(inflated_size);
-       stream.avail_out = inflated_size;
-       git_inflate_init(&stream);
-       st = git_inflate(&stream, Z_FINISH);
-       git_inflate_end(&stream);
-       if ((st != Z_STREAM_END) || stream.total_out != inflated_size) {
-               free(out);
-               return NULL;
-       }
-       return out;
-}
-
-/*
- * Read a binary hunk and return a new fragment; fragment->patch
- * points at an allocated memory that the caller must free, so
- * it is marked as "->free_patch = 1".
- */
-static struct fragment *parse_binary_hunk(struct apply_state *state,
-                                         char **buf_p,
-                                         unsigned long *sz_p,
-                                         int *status_p,
-                                         int *used_p)
-{
-       /*
-        * Expect a line that begins with binary patch method ("literal"
-        * or "delta"), followed by the length of data before deflating.
-        * a sequence of 'length-byte' followed by base-85 encoded data
-        * should follow, terminated by a newline.
-        *
-        * Each 5-byte sequence of base-85 encodes up to 4 bytes,
-        * and we would limit the patch line to 66 characters,
-        * so one line can fit up to 13 groups that would decode
-        * to 52 bytes max.  The length byte 'A'-'Z' corresponds
-        * to 1-26 bytes, and 'a'-'z' corresponds to 27-52 bytes.
-        */
-       int llen, used;
-       unsigned long size = *sz_p;
-       char *buffer = *buf_p;
-       int patch_method;
-       unsigned long origlen;
-       char *data = NULL;
-       int hunk_size = 0;
-       struct fragment *frag;
-
-       llen = linelen(buffer, size);
-       used = llen;
-
-       *status_p = 0;
-
-       if (starts_with(buffer, "delta ")) {
-               patch_method = BINARY_DELTA_DEFLATED;
-               origlen = strtoul(buffer + 6, NULL, 10);
-       }
-       else if (starts_with(buffer, "literal ")) {
-               patch_method = BINARY_LITERAL_DEFLATED;
-               origlen = strtoul(buffer + 8, NULL, 10);
-       }
-       else
-               return NULL;
-
-       state->linenr++;
-       buffer += llen;
-       while (1) {
-               int byte_length, max_byte_length, newsize;
-               llen = linelen(buffer, size);
-               used += llen;
-               state->linenr++;
-               if (llen == 1) {
-                       /* consume the blank line */
-                       buffer++;
-                       size--;
-                       break;
-               }
-               /*
-                * Minimum line is "A00000\n" which is 7-byte long,
-                * and the line length must be multiple of 5 plus 2.
-                */
-               if ((llen < 7) || (llen-2) % 5)
-                       goto corrupt;
-               max_byte_length = (llen - 2) / 5 * 4;
-               byte_length = *buffer;
-               if ('A' <= byte_length && byte_length <= 'Z')
-                       byte_length = byte_length - 'A' + 1;
-               else if ('a' <= byte_length && byte_length <= 'z')
-                       byte_length = byte_length - 'a' + 27;
-               else
-                       goto corrupt;
-               /* if the input length was not multiple of 4, we would
-                * have filler at the end but the filler should never
-                * exceed 3 bytes
-                */
-               if (max_byte_length < byte_length ||
-                   byte_length <= max_byte_length - 4)
-                       goto corrupt;
-               newsize = hunk_size + byte_length;
-               data = xrealloc(data, newsize);
-               if (decode_85(data + hunk_size, buffer + 1, byte_length))
-                       goto corrupt;
-               hunk_size = newsize;
-               buffer += llen;
-               size -= llen;
-       }
-
-       frag = xcalloc(1, sizeof(*frag));
-       frag->patch = inflate_it(data, hunk_size, origlen);
-       frag->free_patch = 1;
-       if (!frag->patch)
-               goto corrupt;
-       free(data);
-       frag->size = origlen;
-       *buf_p = buffer;
-       *sz_p = size;
-       *used_p = used;
-       frag->binary_patch_method = patch_method;
-       return frag;
-
- corrupt:
-       free(data);
-       *status_p = -1;
-       error(_("corrupt binary patch at line %d: %.*s"),
-             state->linenr-1, llen-1, buffer);
-       return NULL;
-}
-
-/*
- * Returns:
- *   -1 in case of error,
- *   the length of the parsed binary patch otherwise
- */
-static int parse_binary(struct apply_state *state,
-                       char *buffer,
-                       unsigned long size,
-                       struct patch *patch)
-{
-       /*
-        * We have read "GIT binary patch\n"; what follows is a line
-        * that says the patch method (currently, either "literal" or
-        * "delta") and the length of data before deflating; a
-        * sequence of 'length-byte' followed by base-85 encoded data
-        * follows.
-        *
-        * When a binary patch is reversible, there is another binary
-        * hunk in the same format, starting with patch method (either
-        * "literal" or "delta") with the length of data, and a sequence
-        * of length-byte + base-85 encoded data, terminated with another
-        * empty line.  This data, when applied to the postimage, produces
-        * the preimage.
-        */
-       struct fragment *forward;
-       struct fragment *reverse;
-       int status;
-       int used, used_1;
-
-       forward = parse_binary_hunk(state, &buffer, &size, &status, &used);
-       if (!forward && !status)
-               /* there has to be one hunk (forward hunk) */
-               return error(_("unrecognized binary patch at line %d"), state->linenr-1);
-       if (status)
-               /* otherwise we already gave an error message */
-               return status;
-
-       reverse = parse_binary_hunk(state, &buffer, &size, &status, &used_1);
-       if (reverse)
-               used += used_1;
-       else if (status) {
-               /*
-                * Not having reverse hunk is not an error, but having
-                * a corrupt reverse hunk is.
-                */
-               free((void*) forward->patch);
-               free(forward);
-               return status;
-       }
-       forward->next = reverse;
-       patch->fragments = forward;
-       patch->is_binary = 1;
-       return used;
-}
-
-static void prefix_one(struct apply_state *state, char **name)
-{
-       char *old_name = *name;
-       if (!old_name)
-               return;
-       *name = xstrdup(prefix_filename(state->prefix, state->prefix_length, *name));
-       free(old_name);
-}
-
-static void prefix_patch(struct apply_state *state, struct patch *p)
-{
-       if (!state->prefix || p->is_toplevel_relative)
-               return;
-       prefix_one(state, &p->new_name);
-       prefix_one(state, &p->old_name);
-}
-
-/*
- * include/exclude
- */
-
-static void add_name_limit(struct apply_state *state,
-                          const char *name,
-                          int exclude)
-{
-       struct string_list_item *it;
-
-       it = string_list_append(&state->limit_by_name, name);
-       it->util = exclude ? NULL : (void *) 1;
-}
-
-static int use_patch(struct apply_state *state, struct patch *p)
-{
-       const char *pathname = p->new_name ? p->new_name : p->old_name;
-       int i;
-
-       /* Paths outside are not touched regardless of "--include" */
-       if (0 < state->prefix_length) {
-               int pathlen = strlen(pathname);
-               if (pathlen <= state->prefix_length ||
-                   memcmp(state->prefix, pathname, state->prefix_length))
-                       return 0;
-       }
-
-       /* See if it matches any of exclude/include rule */
-       for (i = 0; i < state->limit_by_name.nr; i++) {
-               struct string_list_item *it = &state->limit_by_name.items[i];
-               if (!wildmatch(it->string, pathname, 0, NULL))
-                       return (it->util != NULL);
-       }
-
-       /*
-        * If we had any include, a path that does not match any rule is
-        * not used.  Otherwise, we saw bunch of exclude rules (or none)
-        * and such a path is used.
-        */
-       return !state->has_include;
-}
-
-
-/*
- * Read the patch text in "buffer" that extends for "size" bytes; stop
- * reading after seeing a single patch (i.e. changes to a single file).
- * Create fragments (i.e. patch hunks) and hang them to the given patch.
- * Return the number of bytes consumed, so that the caller can call us
- * again for the next patch.
- */
-static int parse_chunk(struct apply_state *state, char *buffer, unsigned long size, struct patch *patch)
-{
-       int hdrsize, patchsize;
-       int offset = find_header(state, buffer, size, &hdrsize, patch);
-
-       if (offset < 0)
-               return offset;
-
-       prefix_patch(state, patch);
-
-       if (!use_patch(state, patch))
-               patch->ws_rule = 0;
-       else
-               patch->ws_rule = whitespace_rule(patch->new_name
-                                                ? patch->new_name
-                                                : patch->old_name);
-
-       patchsize = parse_single_patch(state,
-                                      buffer + offset + hdrsize,
-                                      size - offset - hdrsize,
-                                      patch);
-
-       if (!patchsize) {
-               static const char git_binary[] = "GIT binary patch\n";
-               int hd = hdrsize + offset;
-               unsigned long llen = linelen(buffer + hd, size - hd);
-
-               if (llen == sizeof(git_binary) - 1 &&
-                   !memcmp(git_binary, buffer + hd, llen)) {
-                       int used;
-                       state->linenr++;
-                       used = parse_binary(state, buffer + hd + llen,
-                                           size - hd - llen, patch);
-                       if (used < 0)
-                               return -1;
-                       if (used)
-                               patchsize = used + llen;
-                       else
-                               patchsize = 0;
-               }
-               else if (!memcmp(" differ\n", buffer + hd + llen - 8, 8)) {
-                       static const char *binhdr[] = {
-                               "Binary files ",
-                               "Files ",
-                               NULL,
-                       };
-                       int i;
-                       for (i = 0; binhdr[i]; i++) {
-                               int len = strlen(binhdr[i]);
-                               if (len < size - hd &&
-                                   !memcmp(binhdr[i], buffer + hd, len)) {
-                                       state->linenr++;
-                                       patch->is_binary = 1;
-                                       patchsize = llen;
-                                       break;
-                               }
-                       }
-               }
-
-               /* Empty patch cannot be applied if it is a text patch
-                * without metadata change.  A binary patch appears
-                * empty to us here.
-                */
-               if ((state->apply || state->check) &&
-                   (!patch->is_binary && !metadata_changes(patch)))
-                       die(_("patch with only garbage at line %d"), state->linenr);
-       }
-
-       return offset + hdrsize + patchsize;
-}
-
-#define swap(a,b) myswap((a),(b),sizeof(a))
-
-#define myswap(a, b, size) do {                \
-       unsigned char mytmp[size];      \
-       memcpy(mytmp, &a, size);                \
-       memcpy(&a, &b, size);           \
-       memcpy(&b, mytmp, size);                \
-} while (0)
-
-static void reverse_patches(struct patch *p)
-{
-       for (; p; p = p->next) {
-               struct fragment *frag = p->fragments;
-
-               swap(p->new_name, p->old_name);
-               swap(p->new_mode, p->old_mode);
-               swap(p->is_new, p->is_delete);
-               swap(p->lines_added, p->lines_deleted);
-               swap(p->old_sha1_prefix, p->new_sha1_prefix);
-
-               for (; frag; frag = frag->next) {
-                       swap(frag->newpos, frag->oldpos);
-                       swap(frag->newlines, frag->oldlines);
-               }
-       }
-}
-
-static const char pluses[] =
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";
-static const char minuses[]=
-"----------------------------------------------------------------------";
-
-static void show_stats(struct apply_state *state, struct patch *patch)
-{
-       struct strbuf qname = STRBUF_INIT;
-       char *cp = patch->new_name ? patch->new_name : patch->old_name;
-       int max, add, del;
-
-       quote_c_style(cp, &qname, NULL, 0);
-
-       /*
-        * "scale" the filename
-        */
-       max = state->max_len;
-       if (max > 50)
-               max = 50;
-
-       if (qname.len > max) {
-               cp = strchr(qname.buf + qname.len + 3 - max, '/');
-               if (!cp)
-                       cp = qname.buf + qname.len + 3 - max;
-               strbuf_splice(&qname, 0, cp - qname.buf, "...", 3);
-       }
-
-       if (patch->is_binary) {
-               printf(" %-*s |  Bin\n", max, qname.buf);
-               strbuf_release(&qname);
-               return;
-       }
-
-       printf(" %-*s |", max, qname.buf);
-       strbuf_release(&qname);
-
-       /*
-        * scale the add/delete
-        */
-       max = max + state->max_change > 70 ? 70 - max : state->max_change;
-       add = patch->lines_added;
-       del = patch->lines_deleted;
-
-       if (state->max_change > 0) {
-               int total = ((add + del) * max + state->max_change / 2) / state->max_change;
-               add = (add * max + state->max_change / 2) / state->max_change;
-               del = total - add;
-       }
-       printf("%5d %.*s%.*s\n", patch->lines_added + patch->lines_deleted,
-               add, pluses, del, minuses);
-}
-
-static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)
-{
-       switch (st->st_mode & S_IFMT) {
-       case S_IFLNK:
-               if (strbuf_readlink(buf, path, st->st_size) < 0)
-                       return error(_("unable to read symlink %s"), path);
-               return 0;
-       case S_IFREG:
-               if (strbuf_read_file(buf, path, st->st_size) != st->st_size)
-                       return error(_("unable to open or read %s"), path);
-               convert_to_git(path, buf->buf, buf->len, buf, 0);
-               return 0;
-       default:
-               return -1;
-       }
-}
-
-/*
- * Update the preimage, and the common lines in postimage,
- * from buffer buf of length len. If postlen is 0 the postimage
- * is updated in place, otherwise it's updated on a new buffer
- * of length postlen
- */
-
-static void update_pre_post_images(struct image *preimage,
-                                  struct image *postimage,
-                                  char *buf,
-                                  size_t len, size_t postlen)
-{
-       int i, ctx, reduced;
-       char *new, *old, *fixed;
-       struct image fixed_preimage;
-
-       /*
-        * Update the preimage with whitespace fixes.  Note that we
-        * are not losing preimage->buf -- apply_one_fragment() will
-        * free "oldlines".
-        */
-       prepare_image(&fixed_preimage, buf, len, 1);
-       assert(postlen
-              ? fixed_preimage.nr == preimage->nr
-              : fixed_preimage.nr <= preimage->nr);
-       for (i = 0; i < fixed_preimage.nr; i++)
-               fixed_preimage.line[i].flag = preimage->line[i].flag;
-       free(preimage->line_allocated);
-       *preimage = fixed_preimage;
-
-       /*
-        * Adjust the common context lines in postimage. This can be
-        * done in-place when we are shrinking it with whitespace
-        * fixing, but needs a new buffer when ignoring whitespace or
-        * expanding leading tabs to spaces.
-        *
-        * We trust the caller to tell us if the update can be done
-        * in place (postlen==0) or not.
-        */
-       old = postimage->buf;
-       if (postlen)
-               new = postimage->buf = xmalloc(postlen);
-       else
-               new = old;
-       fixed = preimage->buf;
-
-       for (i = reduced = ctx = 0; i < postimage->nr; i++) {
-               size_t l_len = postimage->line[i].len;
-               if (!(postimage->line[i].flag & LINE_COMMON)) {
-                       /* an added line -- no counterparts in preimage */
-                       memmove(new, old, l_len);
-                       old += l_len;
-                       new += l_len;
-                       continue;
-               }
-
-               /* a common context -- skip it in the original postimage */
-               old += l_len;
-
-               /* and find the corresponding one in the fixed preimage */
-               while (ctx < preimage->nr &&
-                      !(preimage->line[ctx].flag & LINE_COMMON)) {
-                       fixed += preimage->line[ctx].len;
-                       ctx++;
-               }
-
-               /*
-                * preimage is expected to run out, if the caller
-                * fixed addition of trailing blank lines.
-                */
-               if (preimage->nr <= ctx) {
-                       reduced++;
-                       continue;
-               }
-
-               /* and copy it in, while fixing the line length */
-               l_len = preimage->line[ctx].len;
-               memcpy(new, fixed, l_len);
-               new += l_len;
-               fixed += l_len;
-               postimage->line[i].len = l_len;
-               ctx++;
-       }
-
-       if (postlen
-           ? postlen < new - postimage->buf
-           : postimage->len < new - postimage->buf)
-               die("BUG: caller miscounted postlen: asked %d, orig = %d, used = %d",
-                   (int)postlen, (int) postimage->len, (int)(new - postimage->buf));
-
-       /* Fix the length of the whole thing */
-       postimage->len = new - postimage->buf;
-       postimage->nr -= reduced;
-}
-
-static int line_by_line_fuzzy_match(struct image *img,
-                                   struct image *preimage,
-                                   struct image *postimage,
-                                   unsigned long try,
-                                   int try_lno,
-                                   int preimage_limit)
-{
-       int i;
-       size_t imgoff = 0;
-       size_t preoff = 0;
-       size_t postlen = postimage->len;
-       size_t extra_chars;
-       char *buf;
-       char *preimage_eof;
-       char *preimage_end;
-       struct strbuf fixed;
-       char *fixed_buf;
-       size_t fixed_len;
-
-       for (i = 0; i < preimage_limit; i++) {
-               size_t prelen = preimage->line[i].len;
-               size_t imglen = img->line[try_lno+i].len;
-
-               if (!fuzzy_matchlines(img->buf + try + imgoff, imglen,
-                                     preimage->buf + preoff, prelen))
-                       return 0;
-               if (preimage->line[i].flag & LINE_COMMON)
-                       postlen += imglen - prelen;
-               imgoff += imglen;
-               preoff += prelen;
-       }
-
-       /*
-        * Ok, the preimage matches with whitespace fuzz.
-        *
-        * imgoff now holds the true length of the target that
-        * matches the preimage before the end of the file.
-        *
-        * Count the number of characters in the preimage that fall
-        * beyond the end of the file and make sure that all of them
-        * are whitespace characters. (This can only happen if
-        * we are removing blank lines at the end of the file.)
-        */
-       buf = preimage_eof = preimage->buf + preoff;
-       for ( ; i < preimage->nr; i++)
-               preoff += preimage->line[i].len;
-       preimage_end = preimage->buf + preoff;
-       for ( ; buf < preimage_end; buf++)
-               if (!isspace(*buf))
-                       return 0;
-
-       /*
-        * Update the preimage and the common postimage context
-        * lines to use the same whitespace as the target.
-        * If whitespace is missing in the target (i.e.
-        * if the preimage extends beyond the end of the file),
-        * use the whitespace from the preimage.
-        */
-       extra_chars = preimage_end - preimage_eof;
-       strbuf_init(&fixed, imgoff + extra_chars);
-       strbuf_add(&fixed, img->buf + try, imgoff);
-       strbuf_add(&fixed, preimage_eof, extra_chars);
-       fixed_buf = strbuf_detach(&fixed, &fixed_len);
-       update_pre_post_images(preimage, postimage,
-                              fixed_buf, fixed_len, postlen);
-       return 1;
-}
-
-static int match_fragment(struct apply_state *state,
-                         struct image *img,
-                         struct image *preimage,
-                         struct image *postimage,
-                         unsigned long try,
-                         int try_lno,
-                         unsigned ws_rule,
-                         int match_beginning, int match_end)
-{
-       int i;
-       char *fixed_buf, *buf, *orig, *target;
-       struct strbuf fixed;
-       size_t fixed_len, postlen;
-       int preimage_limit;
-
-       if (preimage->nr + try_lno <= img->nr) {
-               /*
-                * The hunk falls within the boundaries of img.
-                */
-               preimage_limit = preimage->nr;
-               if (match_end && (preimage->nr + try_lno != img->nr))
-                       return 0;
-       } else if (state->ws_error_action == correct_ws_error &&
-                  (ws_rule & WS_BLANK_AT_EOF)) {
-               /*
-                * This hunk extends beyond the end of img, and we are
-                * removing blank lines at the end of the file.  This
-                * many lines from the beginning of the preimage must
-                * match with img, and the remainder of the preimage
-                * must be blank.
-                */
-               preimage_limit = img->nr - try_lno;
-       } else {
-               /*
-                * The hunk extends beyond the end of the img and
-                * we are not removing blanks at the end, so we
-                * should reject the hunk at this position.
-                */
-               return 0;
-       }
-
-       if (match_beginning && try_lno)
-               return 0;
-
-       /* Quick hash check */
-       for (i = 0; i < preimage_limit; i++)
-               if ((img->line[try_lno + i].flag & LINE_PATCHED) ||
-                   (preimage->line[i].hash != img->line[try_lno + i].hash))
-                       return 0;
-
-       if (preimage_limit == preimage->nr) {
-               /*
-                * Do we have an exact match?  If we were told to match
-                * at the end, size must be exactly at try+fragsize,
-                * otherwise try+fragsize must be still within the preimage,
-                * and either case, the old piece should match the preimage
-                * exactly.
-                */
-               if ((match_end
-                    ? (try + preimage->len == img->len)
-                    : (try + preimage->len <= img->len)) &&
-                   !memcmp(img->buf + try, preimage->buf, preimage->len))
-                       return 1;
-       } else {
-               /*
-                * The preimage extends beyond the end of img, so
-                * there cannot be an exact match.
-                *
-                * There must be one non-blank context line that match
-                * a line before the end of img.
-                */
-               char *buf_end;
-
-               buf = preimage->buf;
-               buf_end = buf;
-               for (i = 0; i < preimage_limit; i++)
-                       buf_end += preimage->line[i].len;
-
-               for ( ; buf < buf_end; buf++)
-                       if (!isspace(*buf))
-                               break;
-               if (buf == buf_end)
-                       return 0;
-       }
-
-       /*
-        * No exact match. If we are ignoring whitespace, run a line-by-line
-        * fuzzy matching. We collect all the line length information because
-        * we need it to adjust whitespace if we match.
-        */
-       if (state->ws_ignore_action == ignore_ws_change)
-               return line_by_line_fuzzy_match(img, preimage, postimage,
-                                               try, try_lno, preimage_limit);
-
-       if (state->ws_error_action != correct_ws_error)
-               return 0;
-
-       /*
-        * The hunk does not apply byte-by-byte, but the hash says
-        * it might with whitespace fuzz. We weren't asked to
-        * ignore whitespace, we were asked to correct whitespace
-        * errors, so let's try matching after whitespace correction.
-        *
-        * While checking the preimage against the target, whitespace
-        * errors in both fixed, we count how large the corresponding
-        * postimage needs to be.  The postimage prepared by
-        * apply_one_fragment() has whitespace errors fixed on added
-        * lines already, but the common lines were propagated as-is,
-        * which may become longer when their whitespace errors are
-        * fixed.
-        */
-
-       /* First count added lines in postimage */
-       postlen = 0;
-       for (i = 0; i < postimage->nr; i++) {
-               if (!(postimage->line[i].flag & LINE_COMMON))
-                       postlen += postimage->line[i].len;
-       }
-
-       /*
-        * The preimage may extend beyond the end of the file,
-        * but in this loop we will only handle the part of the
-        * preimage that falls within the file.
-        */
-       strbuf_init(&fixed, preimage->len + 1);
-       orig = preimage->buf;
-       target = img->buf + try;
-       for (i = 0; i < preimage_limit; i++) {
-               size_t oldlen = preimage->line[i].len;
-               size_t tgtlen = img->line[try_lno + i].len;
-               size_t fixstart = fixed.len;
-               struct strbuf tgtfix;
-               int match;
-
-               /* Try fixing the line in the preimage */
-               ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
-
-               /* Try fixing the line in the target */
-               strbuf_init(&tgtfix, tgtlen);
-               ws_fix_copy(&tgtfix, target, tgtlen, ws_rule, NULL);
-
-               /*
-                * If they match, either the preimage was based on
-                * a version before our tree fixed whitespace breakage,
-                * or we are lacking a whitespace-fix patch the tree
-                * the preimage was based on already had (i.e. target
-                * has whitespace breakage, the preimage doesn't).
-                * In either case, we are fixing the whitespace breakages
-                * so we might as well take the fix together with their
-                * real change.
-                */
-               match = (tgtfix.len == fixed.len - fixstart &&
-                        !memcmp(tgtfix.buf, fixed.buf + fixstart,
-                                            fixed.len - fixstart));
-
-               /* Add the length if this is common with the postimage */
-               if (preimage->line[i].flag & LINE_COMMON)
-                       postlen += tgtfix.len;
-
-               strbuf_release(&tgtfix);
-               if (!match)
-                       goto unmatch_exit;
-
-               orig += oldlen;
-               target += tgtlen;
-       }
-
-
-       /*
-        * Now handle the lines in the preimage that falls beyond the
-        * end of the file (if any). They will only match if they are
-        * empty or only contain whitespace (if WS_BLANK_AT_EOL is
-        * false).
-        */
-       for ( ; i < preimage->nr; i++) {
-               size_t fixstart = fixed.len; /* start of the fixed preimage */
-               size_t oldlen = preimage->line[i].len;
-               int j;
-
-               /* Try fixing the line in the preimage */
-               ws_fix_copy(&fixed, orig, oldlen, ws_rule, NULL);
-
-               for (j = fixstart; j < fixed.len; j++)
-                       if (!isspace(fixed.buf[j]))
-                               goto unmatch_exit;
-
-               orig += oldlen;
-       }
-
-       /*
-        * Yes, the preimage is based on an older version that still
-        * has whitespace breakages unfixed, and fixing them makes the
-        * hunk match.  Update the context lines in the postimage.
-        */
-       fixed_buf = strbuf_detach(&fixed, &fixed_len);
-       if (postlen < postimage->len)
-               postlen = 0;
-       update_pre_post_images(preimage, postimage,
-                              fixed_buf, fixed_len, postlen);
-       return 1;
-
- unmatch_exit:
-       strbuf_release(&fixed);
-       return 0;
-}
-
-static int find_pos(struct apply_state *state,
-                   struct image *img,
-                   struct image *preimage,
-                   struct image *postimage,
-                   int line,
-                   unsigned ws_rule,
-                   int match_beginning, int match_end)
-{
-       int i;
-       unsigned long backwards, forwards, try;
-       int backwards_lno, forwards_lno, try_lno;
-
-       /*
-        * If match_beginning or match_end is specified, there is no
-        * point starting from a wrong line that will never match and
-        * wander around and wait for a match at the specified end.
-        */
-       if (match_beginning)
-               line = 0;
-       else if (match_end)
-               line = img->nr - preimage->nr;
-
-       /*
-        * Because the comparison is unsigned, the following test
-        * will also take care of a negative line number that can
-        * result when match_end and preimage is larger than the target.
-        */
-       if ((size_t) line > img->nr)
-               line = img->nr;
-
-       try = 0;
-       for (i = 0; i < line; i++)
-               try += img->line[i].len;
-
-       /*
-        * There's probably some smart way to do this, but I'll leave
-        * that to the smart and beautiful people. I'm simple and stupid.
-        */
-       backwards = try;
-       backwards_lno = line;
-       forwards = try;
-       forwards_lno = line;
-       try_lno = line;
-
-       for (i = 0; ; i++) {
-               if (match_fragment(state, img, preimage, postimage,
-                                  try, try_lno, ws_rule,
-                                  match_beginning, match_end))
-                       return try_lno;
-
-       again:
-               if (backwards_lno == 0 && forwards_lno == img->nr)
-                       break;
-
-               if (i & 1) {
-                       if (backwards_lno == 0) {
-                               i++;
-                               goto again;
-                       }
-                       backwards_lno--;
-                       backwards -= img->line[backwards_lno].len;
-                       try = backwards;
-                       try_lno = backwards_lno;
-               } else {
-                       if (forwards_lno == img->nr) {
-                               i++;
-                               goto again;
-                       }
-                       forwards += img->line[forwards_lno].len;
-                       forwards_lno++;
-                       try = forwards;
-                       try_lno = forwards_lno;
-               }
-
-       }
-       return -1;
-}
-
-static void remove_first_line(struct image *img)
-{
-       img->buf += img->line[0].len;
-       img->len -= img->line[0].len;
-       img->line++;
-       img->nr--;
-}
-
-static void remove_last_line(struct image *img)
-{
-       img->len -= img->line[--img->nr].len;
-}
-
-/*
- * The change from "preimage" and "postimage" has been found to
- * apply at applied_pos (counts in line numbers) in "img".
- * Update "img" to remove "preimage" and replace it with "postimage".
- */
-static void update_image(struct apply_state *state,
-                        struct image *img,
-                        int applied_pos,
-                        struct image *preimage,
-                        struct image *postimage)
-{
-       /*
-        * remove the copy of preimage at offset in img
-        * and replace it with postimage
-        */
-       int i, nr;
-       size_t remove_count, insert_count, applied_at = 0;
-       char *result;
-       int preimage_limit;
-
-       /*
-        * If we are removing blank lines at the end of img,
-        * the preimage may extend beyond the end.
-        * If that is the case, we must be careful only to
-        * remove the part of the preimage that falls within
-        * the boundaries of img. Initialize preimage_limit
-        * to the number of lines in the preimage that falls
-        * within the boundaries.
-        */
-       preimage_limit = preimage->nr;
-       if (preimage_limit > img->nr - applied_pos)
-               preimage_limit = img->nr - applied_pos;
-
-       for (i = 0; i < applied_pos; i++)
-               applied_at += img->line[i].len;
-
-       remove_count = 0;
-       for (i = 0; i < preimage_limit; i++)
-               remove_count += img->line[applied_pos + i].len;
-       insert_count = postimage->len;
-
-       /* Adjust the contents */
-       result = xmalloc(st_add3(st_sub(img->len, remove_count), insert_count, 1));
-       memcpy(result, img->buf, applied_at);
-       memcpy(result + applied_at, postimage->buf, postimage->len);
-       memcpy(result + applied_at + postimage->len,
-              img->buf + (applied_at + remove_count),
-              img->len - (applied_at + remove_count));
-       free(img->buf);
-       img->buf = result;
-       img->len += insert_count - remove_count;
-       result[img->len] = '\0';
-
-       /* Adjust the line table */
-       nr = img->nr + postimage->nr - preimage_limit;
-       if (preimage_limit < postimage->nr) {
-               /*
-                * NOTE: this knows that we never call remove_first_line()
-                * on anything other than pre/post image.
-                */
-               REALLOC_ARRAY(img->line, nr);
-               img->line_allocated = img->line;
-       }
-       if (preimage_limit != postimage->nr)
-               memmove(img->line + applied_pos + postimage->nr,
-                       img->line + applied_pos + preimage_limit,
-                       (img->nr - (applied_pos + preimage_limit)) *
-                       sizeof(*img->line));
-       memcpy(img->line + applied_pos,
-              postimage->line,
-              postimage->nr * sizeof(*img->line));
-       if (!state->allow_overlap)
-               for (i = 0; i < postimage->nr; i++)
-                       img->line[applied_pos + i].flag |= LINE_PATCHED;
-       img->nr = nr;
-}
-
-/*
- * Use the patch-hunk text in "frag" to prepare two images (preimage and
- * postimage) for the hunk.  Find lines that match "preimage" in "img" and
- * replace the part of "img" with "postimage" text.
- */
-static int apply_one_fragment(struct apply_state *state,
-                             struct image *img, struct fragment *frag,
-                             int inaccurate_eof, unsigned ws_rule,
-                             int nth_fragment)
-{
-       int match_beginning, match_end;
-       const char *patch = frag->patch;
-       int size = frag->size;
-       char *old, *oldlines;
-       struct strbuf newlines;
-       int new_blank_lines_at_end = 0;
-       int found_new_blank_lines_at_end = 0;
-       int hunk_linenr = frag->linenr;
-       unsigned long leading, trailing;
-       int pos, applied_pos;
-       struct image preimage;
-       struct image postimage;
-
-       memset(&preimage, 0, sizeof(preimage));
-       memset(&postimage, 0, sizeof(postimage));
-       oldlines = xmalloc(size);
-       strbuf_init(&newlines, size);
-
-       old = oldlines;
-       while (size > 0) {
-               char first;
-               int len = linelen(patch, size);
-               int plen;
-               int added_blank_line = 0;
-               int is_blank_context = 0;
-               size_t start;
-
-               if (!len)
-                       break;
-
-               /*
-                * "plen" is how much of the line we should use for
-                * the actual patch data. Normally we just remove the
-                * first character on the line, but if the line is
-                * followed by "\ No newline", then we also remove the
-                * last one (which is the newline, of course).
-                */
-               plen = len - 1;
-               if (len < size && patch[len] == '\\')
-                       plen--;
-               first = *patch;
-               if (state->apply_in_reverse) {
-                       if (first == '-')
-                               first = '+';
-                       else if (first == '+')
-                               first = '-';
-               }
-
-               switch (first) {
-               case '\n':
-                       /* Newer GNU diff, empty context line */
-                       if (plen < 0)
-                               /* ... followed by '\No newline'; nothing */
-                               break;
-                       *old++ = '\n';
-                       strbuf_addch(&newlines, '\n');
-                       add_line_info(&preimage, "\n", 1, LINE_COMMON);
-                       add_line_info(&postimage, "\n", 1, LINE_COMMON);
-                       is_blank_context = 1;
-                       break;
-               case ' ':
-                       if (plen && (ws_rule & WS_BLANK_AT_EOF) &&
-                           ws_blank_line(patch + 1, plen, ws_rule))
-                               is_blank_context = 1;
-               case '-':
-                       memcpy(old, patch + 1, plen);
-                       add_line_info(&preimage, old, plen,
-                                     (first == ' ' ? LINE_COMMON : 0));
-                       old += plen;
-                       if (first == '-')
-                               break;
-               /* Fall-through for ' ' */
-               case '+':
-                       /* --no-add does not add new lines */
-                       if (first == '+' && state->no_add)
-                               break;
-
-                       start = newlines.len;
-                       if (first != '+' ||
-                           !state->whitespace_error ||
-                           state->ws_error_action != correct_ws_error) {
-                               strbuf_add(&newlines, patch + 1, plen);
-                       }
-                       else {
-                               ws_fix_copy(&newlines, patch + 1, plen, ws_rule, &state->applied_after_fixing_ws);
-                       }
-                       add_line_info(&postimage, newlines.buf + start, newlines.len - start,
-                                     (first == '+' ? 0 : LINE_COMMON));
-                       if (first == '+' &&
-                           (ws_rule & WS_BLANK_AT_EOF) &&
-                           ws_blank_line(patch + 1, plen, ws_rule))
-                               added_blank_line = 1;
-                       break;
-               case '@': case '\\':
-                       /* Ignore it, we already handled it */
-                       break;
-               default:
-                       if (state->apply_verbosely)
-                               error(_("invalid start of line: '%c'"), first);
-                       applied_pos = -1;
-                       goto out;
-               }
-               if (added_blank_line) {
-                       if (!new_blank_lines_at_end)
-                               found_new_blank_lines_at_end = hunk_linenr;
-                       new_blank_lines_at_end++;
-               }
-               else if (is_blank_context)
-                       ;
-               else
-                       new_blank_lines_at_end = 0;
-               patch += len;
-               size -= len;
-               hunk_linenr++;
-       }
-       if (inaccurate_eof &&
-           old > oldlines && old[-1] == '\n' &&
-           newlines.len > 0 && newlines.buf[newlines.len - 1] == '\n') {
-               old--;
-               strbuf_setlen(&newlines, newlines.len - 1);
-       }
-
-       leading = frag->leading;
-       trailing = frag->trailing;
-
-       /*
-        * A hunk to change lines at the beginning would begin with
-        * @@ -1,L +N,M @@
-        * but we need to be careful.  -U0 that inserts before the second
-        * line also has this pattern.
-        *
-        * And a hunk to add to an empty file would begin with
-        * @@ -0,0 +N,M @@
-        *
-        * In other words, a hunk that is (frag->oldpos <= 1) with or
-        * without leading context must match at the beginning.
-        */
-       match_beginning = (!frag->oldpos ||
-                          (frag->oldpos == 1 && !state->unidiff_zero));
-
-       /*
-        * A hunk without trailing lines must match at the end.
-        * However, we simply cannot tell if a hunk must match end
-        * from the lack of trailing lines if the patch was generated
-        * with unidiff without any context.
-        */
-       match_end = !state->unidiff_zero && !trailing;
-
-       pos = frag->newpos ? (frag->newpos - 1) : 0;
-       preimage.buf = oldlines;
-       preimage.len = old - oldlines;
-       postimage.buf = newlines.buf;
-       postimage.len = newlines.len;
-       preimage.line = preimage.line_allocated;
-       postimage.line = postimage.line_allocated;
-
-       for (;;) {
-
-               applied_pos = find_pos(state, img, &preimage, &postimage, pos,
-                                      ws_rule, match_beginning, match_end);
-
-               if (applied_pos >= 0)
-                       break;
-
-               /* Am I at my context limits? */
-               if ((leading <= state->p_context) && (trailing <= state->p_context))
-                       break;
-               if (match_beginning || match_end) {
-                       match_beginning = match_end = 0;
-                       continue;
-               }
-
-               /*
-                * Reduce the number of context lines; reduce both
-                * leading and trailing if they are equal otherwise
-                * just reduce the larger context.
-                */
-               if (leading >= trailing) {
-                       remove_first_line(&preimage);
-                       remove_first_line(&postimage);
-                       pos--;
-                       leading--;
-               }
-               if (trailing > leading) {
-                       remove_last_line(&preimage);
-                       remove_last_line(&postimage);
-                       trailing--;
-               }
-       }
-
-       if (applied_pos >= 0) {
-               if (new_blank_lines_at_end &&
-                   preimage.nr + applied_pos >= img->nr &&
-                   (ws_rule & WS_BLANK_AT_EOF) &&
-                   state->ws_error_action != nowarn_ws_error) {
-                       record_ws_error(state, WS_BLANK_AT_EOF, "+", 1,
-                                       found_new_blank_lines_at_end);
-                       if (state->ws_error_action == correct_ws_error) {
-                               while (new_blank_lines_at_end--)
-                                       remove_last_line(&postimage);
-                       }
-                       /*
-                        * We would want to prevent write_out_results()
-                        * from taking place in apply_patch() that follows
-                        * the callchain led us here, which is:
-                        * apply_patch->check_patch_list->check_patch->
-                        * apply_data->apply_fragments->apply_one_fragment
-                        */
-                       if (state->ws_error_action == die_on_ws_error)
-                               state->apply = 0;
-               }
-
-               if (state->apply_verbosely && applied_pos != pos) {
-                       int offset = applied_pos - pos;
-                       if (state->apply_in_reverse)
-                               offset = 0 - offset;
-                       fprintf_ln(stderr,
-                                  Q_("Hunk #%d succeeded at %d (offset %d line).",
-                                     "Hunk #%d succeeded at %d (offset %d lines).",
-                                     offset),
-                                  nth_fragment, applied_pos + 1, offset);
-               }
-
-               /*
-                * Warn if it was necessary to reduce the number
-                * of context lines.
-                */
-               if ((leading != frag->leading) ||
-                   (trailing != frag->trailing))
-                       fprintf_ln(stderr, _("Context reduced to (%ld/%ld)"
-                                            " to apply fragment at %d"),
-                                  leading, trailing, applied_pos+1);
-               update_image(state, img, applied_pos, &preimage, &postimage);
-       } else {
-               if (state->apply_verbosely)
-                       error(_("while searching for:\n%.*s"),
-                             (int)(old - oldlines), oldlines);
-       }
-
-out:
-       free(oldlines);
-       strbuf_release(&newlines);
-       free(preimage.line_allocated);
-       free(postimage.line_allocated);
-
-       return (applied_pos < 0);
-}
-
-static int apply_binary_fragment(struct apply_state *state,
-                                struct image *img,
-                                struct patch *patch)
-{
-       struct fragment *fragment = patch->fragments;
-       unsigned long len;
-       void *dst;
-
-       if (!fragment)
-               return error(_("missing binary patch data for '%s'"),
-                            patch->new_name ?
-                            patch->new_name :
-                            patch->old_name);
-
-       /* Binary patch is irreversible without the optional second hunk */
-       if (state->apply_in_reverse) {
-               if (!fragment->next)
-                       return error("cannot reverse-apply a binary patch "
-                                    "without the reverse hunk to '%s'",
-                                    patch->new_name
-                                    ? patch->new_name : patch->old_name);
-               fragment = fragment->next;
-       }
-       switch (fragment->binary_patch_method) {
-       case BINARY_DELTA_DEFLATED:
-               dst = patch_delta(img->buf, img->len, fragment->patch,
-                                 fragment->size, &len);
-               if (!dst)
-                       return -1;
-               clear_image(img);
-               img->buf = dst;
-               img->len = len;
-               return 0;
-       case BINARY_LITERAL_DEFLATED:
-               clear_image(img);
-               img->len = fragment->size;
-               img->buf = xmemdupz(fragment->patch, img->len);
-               return 0;
-       }
-       return -1;
-}
-
-/*
- * Replace "img" with the result of applying the binary patch.
- * The binary patch data itself in patch->fragment is still kept
- * but the preimage prepared by the caller in "img" is freed here
- * or in the helper function apply_binary_fragment() this calls.
- */
-static int apply_binary(struct apply_state *state,
-                       struct image *img,
-                       struct patch *patch)
-{
-       const char *name = patch->old_name ? patch->old_name : patch->new_name;
-       unsigned char sha1[20];
-
-       /*
-        * For safety, we require patch index line to contain
-        * full 40-byte textual SHA1 for old and new, at least for now.
-        */
-       if (strlen(patch->old_sha1_prefix) != 40 ||
-           strlen(patch->new_sha1_prefix) != 40 ||
-           get_sha1_hex(patch->old_sha1_prefix, sha1) ||
-           get_sha1_hex(patch->new_sha1_prefix, sha1))
-               return error("cannot apply binary patch to '%s' "
-                            "without full index line", name);
-
-       if (patch->old_name) {
-               /*
-                * See if the old one matches what the patch
-                * applies to.
-                */
-               hash_sha1_file(img->buf, img->len, blob_type, sha1);
-               if (strcmp(sha1_to_hex(sha1), patch->old_sha1_prefix))
-                       return error("the patch applies to '%s' (%s), "
-                                    "which does not match the "
-                                    "current contents.",
-                                    name, sha1_to_hex(sha1));
-       }
-       else {
-               /* Otherwise, the old one must be empty. */
-               if (img->len)
-                       return error("the patch applies to an empty "
-                                    "'%s' but it is not empty", name);
-       }
-
-       get_sha1_hex(patch->new_sha1_prefix, sha1);
-       if (is_null_sha1(sha1)) {
-               clear_image(img);
-               return 0; /* deletion patch */
-       }
-
-       if (has_sha1_file(sha1)) {
-               /* We already have the postimage */
-               enum object_type type;
-               unsigned long size;
-               char *result;
-
-               result = read_sha1_file(sha1, &type, &size);
-               if (!result)
-                       return error("the necessary postimage %s for "
-                                    "'%s' cannot be read",
-                                    patch->new_sha1_prefix, name);
-               clear_image(img);
-               img->buf = result;
-               img->len = size;
-       } else {
-               /*
-                * We have verified buf matches the preimage;
-                * apply the patch data to it, which is stored
-                * in the patch->fragments->{patch,size}.
-                */
-               if (apply_binary_fragment(state, img, patch))
-                       return error(_("binary patch does not apply to '%s'"),
-                                    name);
-
-               /* verify that the result matches */
-               hash_sha1_file(img->buf, img->len, blob_type, sha1);
-               if (strcmp(sha1_to_hex(sha1), patch->new_sha1_prefix))
-                       return error(_("binary patch to '%s' creates incorrect result (expecting %s, got %s)"),
-                               name, patch->new_sha1_prefix, sha1_to_hex(sha1));
-       }
-
-       return 0;
-}
-
-static int apply_fragments(struct apply_state *state, struct image *img, struct patch *patch)
-{
-       struct fragment *frag = patch->fragments;
-       const char *name = patch->old_name ? patch->old_name : patch->new_name;
-       unsigned ws_rule = patch->ws_rule;
-       unsigned inaccurate_eof = patch->inaccurate_eof;
-       int nth = 0;
-
-       if (patch->is_binary)
-               return apply_binary(state, img, patch);
-
-       while (frag) {
-               nth++;
-               if (apply_one_fragment(state, img, frag, inaccurate_eof, ws_rule, nth)) {
-                       error(_("patch failed: %s:%ld"), name, frag->oldpos);
-                       if (!state->apply_with_reject)
-                               return -1;
-                       frag->rejected = 1;
-               }
-               frag = frag->next;
-       }
-       return 0;
-}
-
-static int read_blob_object(struct strbuf *buf, const unsigned char *sha1, unsigned mode)
-{
-       if (S_ISGITLINK(mode)) {
-               strbuf_grow(buf, 100);
-               strbuf_addf(buf, "Subproject commit %s\n", sha1_to_hex(sha1));
-       } else {
-               enum object_type type;
-               unsigned long sz;
-               char *result;
-
-               result = read_sha1_file(sha1, &type, &sz);
-               if (!result)
-                       return -1;
-               /* XXX read_sha1_file NUL-terminates */
-               strbuf_attach(buf, result, sz, sz + 1);
-       }
-       return 0;
-}
-
-static int read_file_or_gitlink(const struct cache_entry *ce, struct strbuf *buf)
-{
-       if (!ce)
-               return 0;
-       return read_blob_object(buf, ce->sha1, ce->ce_mode);
-}
-
-static struct patch *in_fn_table(struct apply_state *state, const char *name)
-{
-       struct string_list_item *item;
-
-       if (name == NULL)
-               return NULL;
-
-       item = string_list_lookup(&state->fn_table, name);
-       if (item != NULL)
-               return (struct patch *)item->util;
-
-       return NULL;
-}
-
-/*
- * item->util in the filename table records the status of the path.
- * Usually it points at a patch (whose result records the contents
- * of it after applying it), but it could be PATH_WAS_DELETED for a
- * path that a previously applied patch has already removed, or
- * PATH_TO_BE_DELETED for a path that a later patch would remove.
- *
- * The latter is needed to deal with a case where two paths A and B
- * are swapped by first renaming A to B and then renaming B to A;
- * moving A to B should not be prevented due to presence of B as we
- * will remove it in a later patch.
- */
-#define PATH_TO_BE_DELETED ((struct patch *) -2)
-#define PATH_WAS_DELETED ((struct patch *) -1)
-
-static int to_be_deleted(struct patch *patch)
-{
-       return patch == PATH_TO_BE_DELETED;
-}
-
-static int was_deleted(struct patch *patch)
-{
-       return patch == PATH_WAS_DELETED;
-}
-
-static void add_to_fn_table(struct apply_state *state, struct patch *patch)
-{
-       struct string_list_item *item;
-
-       /*
-        * Always add new_name unless patch is a deletion
-        * This should cover the cases for normal diffs,
-        * file creations and copies
-        */
-       if (patch->new_name != NULL) {
-               item = string_list_insert(&state->fn_table, patch->new_name);
-               item->util = patch;
-       }
-
-       /*
-        * store a failure on rename/deletion cases because
-        * later chunks shouldn't patch old names
-        */
-       if ((patch->new_name == NULL) || (patch->is_rename)) {
-               item = string_list_insert(&state->fn_table, patch->old_name);
-               item->util = PATH_WAS_DELETED;
-       }
-}
-
-static void prepare_fn_table(struct apply_state *state, struct patch *patch)
-{
-       /*
-        * store information about incoming file deletion
-        */
-       while (patch) {
-               if ((patch->new_name == NULL) || (patch->is_rename)) {
-                       struct string_list_item *item;
-                       item = string_list_insert(&state->fn_table, patch->old_name);
-                       item->util = PATH_TO_BE_DELETED;
-               }
-               patch = patch->next;
-       }
-}
-
-static int checkout_target(struct index_state *istate,
-                          struct cache_entry *ce, struct stat *st)
-{
-       struct checkout costate;
-
-       memset(&costate, 0, sizeof(costate));
-       costate.base_dir = "";
-       costate.refresh_cache = 1;
-       costate.istate = istate;
-       if (checkout_entry(ce, &costate, NULL) || lstat(ce->name, st))
-               return error(_("cannot checkout %s"), ce->name);
-       return 0;
-}
-
-static struct patch *previous_patch(struct apply_state *state,
-                                   struct patch *patch,
-                                   int *gone)
-{
-       struct patch *previous;
-
-       *gone = 0;
-       if (patch->is_copy || patch->is_rename)
-               return NULL; /* "git" patches do not depend on the order */
-
-       previous = in_fn_table(state, patch->old_name);
-       if (!previous)
-               return NULL;
-
-       if (to_be_deleted(previous))
-               return NULL; /* the deletion hasn't happened yet */
-
-       if (was_deleted(previous))
-               *gone = 1;
-
-       return previous;
-}
-
-static int verify_index_match(const struct cache_entry *ce, struct stat *st)
-{
-       if (S_ISGITLINK(ce->ce_mode)) {
-               if (!S_ISDIR(st->st_mode))
-                       return -1;
-               return 0;
-       }
-       return ce_match_stat(ce, st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
-}
-
-#define SUBMODULE_PATCH_WITHOUT_INDEX 1
-
-static int load_patch_target(struct apply_state *state,
-                            struct strbuf *buf,
-                            const struct cache_entry *ce,
-                            struct stat *st,
-                            const char *name,
-                            unsigned expected_mode)
-{
-       if (state->cached || state->check_index) {
-               if (read_file_or_gitlink(ce, buf))
-                       return error(_("failed to read %s"), name);
-       } else if (name) {
-               if (S_ISGITLINK(expected_mode)) {
-                       if (ce)
-                               return read_file_or_gitlink(ce, buf);
-                       else
-                               return SUBMODULE_PATCH_WITHOUT_INDEX;
-               } else if (has_symlink_leading_path(name, strlen(name))) {
-                       return error(_("reading from '%s' beyond a symbolic link"), name);
-               } else {
-                       if (read_old_data(st, name, buf))
-                               return error(_("failed to read %s"), name);
-               }
-       }
-       return 0;
-}
-
-/*
- * We are about to apply "patch"; populate the "image" with the
- * current version we have, from the working tree or from the index,
- * depending on the situation e.g. --cached/--index.  If we are
- * applying a non-git patch that incrementally updates the tree,
- * we read from the result of a previous diff.
- */
-static int load_preimage(struct apply_state *state,
-                        struct image *image,
-                        struct patch *patch, struct stat *st,
-                        const struct cache_entry *ce)
-{
-       struct strbuf buf = STRBUF_INIT;
-       size_t len;
-       char *img;
-       struct patch *previous;
-       int status;
-
-       previous = previous_patch(state, patch, &status);
-       if (status)
-               return error(_("path %s has been renamed/deleted"),
-                            patch->old_name);
-       if (previous) {
-               /* We have a patched copy in memory; use that. */
-               strbuf_add(&buf, previous->result, previous->resultsize);
-       } else {
-               status = load_patch_target(state, &buf, ce, st,
-                                          patch->old_name, patch->old_mode);
-               if (status < 0)
-                       return status;
-               else if (status == SUBMODULE_PATCH_WITHOUT_INDEX) {
-                       /*
-                        * There is no way to apply subproject
-                        * patch without looking at the index.
-                        * NEEDSWORK: shouldn't this be flagged
-                        * as an error???
-                        */
-                       free_fragment_list(patch->fragments);
-                       patch->fragments = NULL;
-               } else if (status) {
-                       return error(_("failed to read %s"), patch->old_name);
-               }
-       }
-
-       img = strbuf_detach(&buf, &len);
-       prepare_image(image, img, len, !patch->is_binary);
-       return 0;
-}
-
-static int three_way_merge(struct image *image,
-                          char *path,
-                          const unsigned char *base,
-                          const unsigned char *ours,
-                          const unsigned char *theirs)
-{
-       mmfile_t base_file, our_file, their_file;
-       mmbuffer_t result = { NULL };
-       int status;
-
-       read_mmblob(&base_file, base);
-       read_mmblob(&our_file, ours);
-       read_mmblob(&their_file, theirs);
-       status = ll_merge(&result, path,
-                         &base_file, "base",
-                         &our_file, "ours",
-                         &their_file, "theirs", NULL);
-       free(base_file.ptr);
-       free(our_file.ptr);
-       free(their_file.ptr);
-       if (status < 0 || !result.ptr) {
-               free(result.ptr);
-               return -1;
-       }
-       clear_image(image);
-       image->buf = result.ptr;
-       image->len = result.size;
-
-       return status;
-}
-
-/*
- * When directly falling back to add/add three-way merge, we read from
- * the current contents of the new_name.  In no cases other than that
- * this function will be called.
- */
-static int load_current(struct apply_state *state,
-                       struct image *image,
-                       struct patch *patch)
-{
-       struct strbuf buf = STRBUF_INIT;
-       int status, pos;
-       size_t len;
-       char *img;
-       struct stat st;
-       struct cache_entry *ce;
-       char *name = patch->new_name;
-       unsigned mode = patch->new_mode;
-
-       if (!patch->is_new)
-               die("BUG: patch to %s is not a creation", patch->old_name);
-
-       pos = cache_name_pos(name, strlen(name));
-       if (pos < 0)
-               return error(_("%s: does not exist in index"), name);
-       ce = active_cache[pos];
-       if (lstat(name, &st)) {
-               if (errno != ENOENT)
-                       return error(_("%s: %s"), name, strerror(errno));
-               if (checkout_target(&the_index, ce, &st))
-                       return -1;
-       }
-       if (verify_index_match(ce, &st))
-               return error(_("%s: does not match index"), name);
-
-       status = load_patch_target(state, &buf, ce, &st, name, mode);
-       if (status < 0)
-               return status;
-       else if (status)
-               return -1;
-       img = strbuf_detach(&buf, &len);
-       prepare_image(image, img, len, !patch->is_binary);
-       return 0;
-}
-
-static int try_threeway(struct apply_state *state,
-                       struct image *image,
-                       struct patch *patch,
-                       struct stat *st,
-                       const struct cache_entry *ce)
-{
-       unsigned char pre_sha1[20], post_sha1[20], our_sha1[20];
-       struct strbuf buf = STRBUF_INIT;
-       size_t len;
-       int status;
-       char *img;
-       struct image tmp_image;
-
-       /* No point falling back to 3-way merge in these cases */
-       if (patch->is_delete ||
-           S_ISGITLINK(patch->old_mode) || S_ISGITLINK(patch->new_mode))
-               return -1;
-
-       /* Preimage the patch was prepared for */
-       if (patch->is_new)
-               write_sha1_file("", 0, blob_type, pre_sha1);
-       else if (get_sha1(patch->old_sha1_prefix, pre_sha1) ||
-                read_blob_object(&buf, pre_sha1, patch->old_mode))
-               return error("repository lacks the necessary blob to fall back on 3-way merge.");
-
-       fprintf(stderr, "Falling back to three-way merge...\n");
-
-       img = strbuf_detach(&buf, &len);
-       prepare_image(&tmp_image, img, len, 1);
-       /* Apply the patch to get the post image */
-       if (apply_fragments(state, &tmp_image, patch) < 0) {
-               clear_image(&tmp_image);
-               return -1;
-       }
-       /* post_sha1[] is theirs */
-       write_sha1_file(tmp_image.buf, tmp_image.len, blob_type, post_sha1);
-       clear_image(&tmp_image);
-
-       /* our_sha1[] is ours */
-       if (patch->is_new) {
-               if (load_current(state, &tmp_image, patch))
-                       return error("cannot read the current contents of '%s'",
-                                    patch->new_name);
-       } else {
-               if (load_preimage(state, &tmp_image, patch, st, ce))
-                       return error("cannot read the current contents of '%s'",
-                                    patch->old_name);
-       }
-       write_sha1_file(tmp_image.buf, tmp_image.len, blob_type, our_sha1);
-       clear_image(&tmp_image);
-
-       /* in-core three-way merge between post and our using pre as base */
-       status = three_way_merge(image, patch->new_name,
-                                pre_sha1, our_sha1, post_sha1);
-       if (status < 0) {
-               fprintf(stderr, "Failed to fall back on three-way merge...\n");
-               return status;
-       }
-
-       if (status) {
-               patch->conflicted_threeway = 1;
-               if (patch->is_new)
-                       oidclr(&patch->threeway_stage[0]);
-               else
-                       hashcpy(patch->threeway_stage[0].hash, pre_sha1);
-               hashcpy(patch->threeway_stage[1].hash, our_sha1);
-               hashcpy(patch->threeway_stage[2].hash, post_sha1);
-               fprintf(stderr, "Applied patch to '%s' with conflicts.\n", patch->new_name);
-       } else {
-               fprintf(stderr, "Applied patch to '%s' cleanly.\n", patch->new_name);
-       }
-       return 0;
-}
-
-static int apply_data(struct apply_state *state, struct patch *patch,
-                     struct stat *st, const struct cache_entry *ce)
-{
-       struct image image;
-
-       if (load_preimage(state, &image, patch, st, ce) < 0)
-               return -1;
-
-       if (patch->direct_to_threeway ||
-           apply_fragments(state, &image, patch) < 0) {
-               /* Note: with --reject, apply_fragments() returns 0 */
-               if (!state->threeway || try_threeway(state, &image, patch, st, ce) < 0)
-                       return -1;
-       }
-       patch->result = image.buf;
-       patch->resultsize = image.len;
-       add_to_fn_table(state, patch);
-       free(image.line_allocated);
-
-       if (0 < patch->is_delete && patch->resultsize)
-               return error(_("removal patch leaves file contents"));
-
-       return 0;
-}
-
-/*
- * If "patch" that we are looking at modifies or deletes what we have,
- * we would want it not to lose any local modification we have, either
- * in the working tree or in the index.
- *
- * This also decides if a non-git patch is a creation patch or a
- * modification to an existing empty file.  We do not check the state
- * of the current tree for a creation patch in this function; the caller
- * check_patch() separately makes sure (and errors out otherwise) that
- * the path the patch creates does not exist in the current tree.
- */
-static int check_preimage(struct apply_state *state,
-                         struct patch *patch,
-                         struct cache_entry **ce,
-                         struct stat *st)
-{
-       const char *old_name = patch->old_name;
-       struct patch *previous = NULL;
-       int stat_ret = 0, status;
-       unsigned st_mode = 0;
-
-       if (!old_name)
-               return 0;
-
-       assert(patch->is_new <= 0);
-       previous = previous_patch(state, patch, &status);
-
-       if (status)
-               return error(_("path %s has been renamed/deleted"), old_name);
-       if (previous) {
-               st_mode = previous->new_mode;
-       } else if (!state->cached) {
-               stat_ret = lstat(old_name, st);
-               if (stat_ret && errno != ENOENT)
-                       return error(_("%s: %s"), old_name, strerror(errno));
-       }
-
-       if (state->check_index && !previous) {
-               int pos = cache_name_pos(old_name, strlen(old_name));
-               if (pos < 0) {
-                       if (patch->is_new < 0)
-                               goto is_new;
-                       return error(_("%s: does not exist in index"), old_name);
-               }
-               *ce = active_cache[pos];
-               if (stat_ret < 0) {
-                       if (checkout_target(&the_index, *ce, st))
-                               return -1;
-               }
-               if (!state->cached && verify_index_match(*ce, st))
-                       return error(_("%s: does not match index"), old_name);
-               if (state->cached)
-                       st_mode = (*ce)->ce_mode;
-       } else if (stat_ret < 0) {
-               if (patch->is_new < 0)
-                       goto is_new;
-               return error(_("%s: %s"), old_name, strerror(errno));
-       }
-
-       if (!state->cached && !previous)
-               st_mode = ce_mode_from_stat(*ce, st->st_mode);
-
-       if (patch->is_new < 0)
-               patch->is_new = 0;
-       if (!patch->old_mode)
-               patch->old_mode = st_mode;
-       if ((st_mode ^ patch->old_mode) & S_IFMT)
-               return error(_("%s: wrong type"), old_name);
-       if (st_mode != patch->old_mode)
-               warning(_("%s has type %o, expected %o"),
-                       old_name, st_mode, patch->old_mode);
-       if (!patch->new_mode && !patch->is_delete)
-               patch->new_mode = st_mode;
-       return 0;
-
- is_new:
-       patch->is_new = 1;
-       patch->is_delete = 0;
-       free(patch->old_name);
-       patch->old_name = NULL;
-       return 0;
-}
-
-
-#define EXISTS_IN_INDEX 1
-#define EXISTS_IN_WORKTREE 2
-
-static int check_to_create(struct apply_state *state,
-                          const char *new_name,
-                          int ok_if_exists)
-{
-       struct stat nst;
-
-       if (state->check_index &&
-           cache_name_pos(new_name, strlen(new_name)) >= 0 &&
-           !ok_if_exists)
-               return EXISTS_IN_INDEX;
-       if (state->cached)
-               return 0;
-
-       if (!lstat(new_name, &nst)) {
-               if (S_ISDIR(nst.st_mode) || ok_if_exists)
-                       return 0;
-               /*
-                * A leading component of new_name might be a symlink
-                * that is going to be removed with this patch, but
-                * still pointing at somewhere that has the path.
-                * In such a case, path "new_name" does not exist as
-                * far as git is concerned.
-                */
-               if (has_symlink_leading_path(new_name, strlen(new_name)))
-                       return 0;
-
-               return EXISTS_IN_WORKTREE;
-       } else if ((errno != ENOENT) && (errno != ENOTDIR)) {
-               return error("%s: %s", new_name, strerror(errno));
-       }
-       return 0;
-}
-
-static uintptr_t register_symlink_changes(struct apply_state *state,
-                                         const char *path,
-                                         uintptr_t what)
-{
-       struct string_list_item *ent;
-
-       ent = string_list_lookup(&state->symlink_changes, path);
-       if (!ent) {
-               ent = string_list_insert(&state->symlink_changes, path);
-               ent->util = (void *)0;
-       }
-       ent->util = (void *)(what | ((uintptr_t)ent->util));
-       return (uintptr_t)ent->util;
-}
-
-static uintptr_t check_symlink_changes(struct apply_state *state, const char *path)
-{
-       struct string_list_item *ent;
-
-       ent = string_list_lookup(&state->symlink_changes, path);
-       if (!ent)
-               return 0;
-       return (uintptr_t)ent->util;
-}
-
-static void prepare_symlink_changes(struct apply_state *state, struct patch *patch)
-{
-       for ( ; patch; patch = patch->next) {
-               if ((patch->old_name && S_ISLNK(patch->old_mode)) &&
-                   (patch->is_rename || patch->is_delete))
-                       /* the symlink at patch->old_name is removed */
-                       register_symlink_changes(state, patch->old_name, SYMLINK_GOES_AWAY);
-
-               if (patch->new_name && S_ISLNK(patch->new_mode))
-                       /* the symlink at patch->new_name is created or remains */
-                       register_symlink_changes(state, patch->new_name, SYMLINK_IN_RESULT);
-       }
-}
-
-static int path_is_beyond_symlink_1(struct apply_state *state, struct strbuf *name)
-{
-       do {
-               unsigned int change;
-
-               while (--name->len && name->buf[name->len] != '/')
-                       ; /* scan backwards */
-               if (!name->len)
-                       break;
-               name->buf[name->len] = '\0';
-               change = check_symlink_changes(state, name->buf);
-               if (change & SYMLINK_IN_RESULT)
-                       return 1;
-               if (change & SYMLINK_GOES_AWAY)
-                       /*
-                        * This cannot be "return 0", because we may
-                        * see a new one created at a higher level.
-                        */
-                       continue;
-
-               /* otherwise, check the preimage */
-               if (state->check_index) {
-                       struct cache_entry *ce;
-
-                       ce = cache_file_exists(name->buf, name->len, ignore_case);
-                       if (ce && S_ISLNK(ce->ce_mode))
-                               return 1;
-               } else {
-                       struct stat st;
-                       if (!lstat(name->buf, &st) && S_ISLNK(st.st_mode))
-                               return 1;
-               }
-       } while (1);
-       return 0;
-}
-
-static int path_is_beyond_symlink(struct apply_state *state, const char *name_)
-{
-       int ret;
-       struct strbuf name = STRBUF_INIT;
-
-       assert(*name_ != '\0');
-       strbuf_addstr(&name, name_);
-       ret = path_is_beyond_symlink_1(state, &name);
-       strbuf_release(&name);
-
-       return ret;
-}
-
-static void die_on_unsafe_path(struct patch *patch)
-{
-       const char *old_name = NULL;
-       const char *new_name = NULL;
-       if (patch->is_delete)
-               old_name = patch->old_name;
-       else if (!patch->is_new && !patch->is_copy)
-               old_name = patch->old_name;
-       if (!patch->is_delete)
-               new_name = patch->new_name;
-
-       if (old_name && !verify_path(old_name))
-               die(_("invalid path '%s'"), old_name);
-       if (new_name && !verify_path(new_name))
-               die(_("invalid path '%s'"), new_name);
-}
-
-/*
- * Check and apply the patch in-core; leave the result in patch->result
- * for the caller to write it out to the final destination.
- */
-static int check_patch(struct apply_state *state, struct patch *patch)
-{
-       struct stat st;
-       const char *old_name = patch->old_name;
-       const char *new_name = patch->new_name;
-       const char *name = old_name ? old_name : new_name;
-       struct cache_entry *ce = NULL;
-       struct patch *tpatch;
-       int ok_if_exists;
-       int status;
-
-       patch->rejected = 1; /* we will drop this after we succeed */
-
-       status = check_preimage(state, patch, &ce, &st);
-       if (status)
-               return status;
-       old_name = patch->old_name;
-
-       /*
-        * A type-change diff is always split into a patch to delete
-        * old, immediately followed by a patch to create new (see
-        * diff.c::run_diff()); in such a case it is Ok that the entry
-        * to be deleted by the previous patch is still in the working
-        * tree and in the index.
-        *
-        * A patch to swap-rename between A and B would first rename A
-        * to B and then rename B to A.  While applying the first one,
-        * the presence of B should not stop A from getting renamed to
-        * B; ask to_be_deleted() about the later rename.  Removal of
-        * B and rename from A to B is handled the same way by asking
-        * was_deleted().
-        */
-       if ((tpatch = in_fn_table(state, new_name)) &&
-           (was_deleted(tpatch) || to_be_deleted(tpatch)))
-               ok_if_exists = 1;
-       else
-               ok_if_exists = 0;
-
-       if (new_name &&
-           ((0 < patch->is_new) || patch->is_rename || patch->is_copy)) {
-               int err = check_to_create(state, new_name, ok_if_exists);
-
-               if (err && state->threeway) {
-                       patch->direct_to_threeway = 1;
-               } else switch (err) {
-               case 0:
-                       break; /* happy */
-               case EXISTS_IN_INDEX:
-                       return error(_("%s: already exists in index"), new_name);
-                       break;
-               case EXISTS_IN_WORKTREE:
-                       return error(_("%s: already exists in working directory"),
-                                    new_name);
-               default:
-                       return err;
-               }
-
-               if (!patch->new_mode) {
-                       if (0 < patch->is_new)
-                               patch->new_mode = S_IFREG | 0644;
-                       else
-                               patch->new_mode = patch->old_mode;
-               }
-       }
-
-       if (new_name && old_name) {
-               int same = !strcmp(old_name, new_name);
-               if (!patch->new_mode)
-                       patch->new_mode = patch->old_mode;
-               if ((patch->old_mode ^ patch->new_mode) & S_IFMT) {
-                       if (same)
-                               return error(_("new mode (%o) of %s does not "
-                                              "match old mode (%o)"),
-                                       patch->new_mode, new_name,
-                                       patch->old_mode);
-                       else
-                               return error(_("new mode (%o) of %s does not "
-                                              "match old mode (%o) of %s"),
-                                       patch->new_mode, new_name,
-                                       patch->old_mode, old_name);
-               }
-       }
-
-       if (!state->unsafe_paths)
-               die_on_unsafe_path(patch);
-
-       /*
-        * An attempt to read from or delete a path that is beyond a
-        * symbolic link will be prevented by load_patch_target() that
-        * is called at the beginning of apply_data() so we do not
-        * have to worry about a patch marked with "is_delete" bit
-        * here.  We however need to make sure that the patch result
-        * is not deposited to a path that is beyond a symbolic link
-        * here.
-        */
-       if (!patch->is_delete && path_is_beyond_symlink(state, patch->new_name))
-               return error(_("affected file '%s' is beyond a symbolic link"),
-                            patch->new_name);
-
-       if (apply_data(state, patch, &st, ce) < 0)
-               return error(_("%s: patch does not apply"), name);
-       patch->rejected = 0;
-       return 0;
-}
-
-static int check_patch_list(struct apply_state *state, struct patch *patch)
-{
-       int err = 0;
-
-       prepare_symlink_changes(state, patch);
-       prepare_fn_table(state, patch);
-       while (patch) {
-               if (state->apply_verbosely)
-                       say_patch_name(stderr,
-                                      _("Checking patch %s..."), patch);
-               err |= check_patch(state, patch);
-               patch = patch->next;
-       }
-       return err;
-}
-
-/* This function tries to read the sha1 from the current index */
-static int get_current_sha1(const char *path, unsigned char *sha1)
-{
-       int pos;
-
-       if (read_cache() < 0)
-               return -1;
-       pos = cache_name_pos(path, strlen(path));
-       if (pos < 0)
-               return -1;
-       hashcpy(sha1, active_cache[pos]->sha1);
-       return 0;
-}
-
-static int preimage_sha1_in_gitlink_patch(struct patch *p, unsigned char sha1[20])
-{
-       /*
-        * A usable gitlink patch has only one fragment (hunk) that looks like:
-        * @@ -1 +1 @@
-        * -Subproject commit <old sha1>
-        * +Subproject commit <new sha1>
-        * or
-        * @@ -1 +0,0 @@
-        * -Subproject commit <old sha1>
-        * for a removal patch.
-        */
-       struct fragment *hunk = p->fragments;
-       static const char heading[] = "-Subproject commit ";
-       char *preimage;
-
-       if (/* does the patch have only one hunk? */
-           hunk && !hunk->next &&
-           /* is its preimage one line? */
-           hunk->oldpos == 1 && hunk->oldlines == 1 &&
-           /* does preimage begin with the heading? */
-           (preimage = memchr(hunk->patch, '\n', hunk->size)) != NULL &&
-           starts_with(++preimage, heading) &&
-           /* does it record full SHA-1? */
-           !get_sha1_hex(preimage + sizeof(heading) - 1, sha1) &&
-           preimage[sizeof(heading) + 40 - 1] == '\n' &&
-           /* does the abbreviated name on the index line agree with it? */
-           starts_with(preimage + sizeof(heading) - 1, p->old_sha1_prefix))
-               return 0; /* it all looks fine */
-
-       /* we may have full object name on the index line */
-       return get_sha1_hex(p->old_sha1_prefix, sha1);
-}
-
-/* Build an index that contains the just the files needed for a 3way merge */
-static void build_fake_ancestor(struct patch *list, const char *filename)
-{
-       struct patch *patch;
-       struct index_state result = { NULL };
-       static struct lock_file lock;
-
-       /* Once we start supporting the reverse patch, it may be
-        * worth showing the new sha1 prefix, but until then...
-        */
-       for (patch = list; patch; patch = patch->next) {
-               unsigned char sha1[20];
-               struct cache_entry *ce;
-               const char *name;
-
-               name = patch->old_name ? patch->old_name : patch->new_name;
-               if (0 < patch->is_new)
-                       continue;
-
-               if (S_ISGITLINK(patch->old_mode)) {
-                       if (!preimage_sha1_in_gitlink_patch(patch, sha1))
-                               ; /* ok, the textual part looks sane */
-                       else
-                               die("sha1 information is lacking or useless for submodule %s",
-                                   name);
-               } else if (!get_sha1_blob(patch->old_sha1_prefix, sha1)) {
-                       ; /* ok */
-               } else if (!patch->lines_added && !patch->lines_deleted) {
-                       /* mode-only change: update the current */
-                       if (get_current_sha1(patch->old_name, sha1))
-                               die("mode change for %s, which is not "
-                                   "in current HEAD", name);
-               } else
-                       die("sha1 information is lacking or useless "
-                           "(%s).", name);
-
-               ce = make_cache_entry(patch->old_mode, sha1, name, 0, 0);
-               if (!ce)
-                       die(_("make_cache_entry failed for path '%s'"), name);
-               if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD))
-                       die ("Could not add %s to temporary index", name);
-       }
-
-       hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
-       if (write_locked_index(&result, &lock, COMMIT_LOCK))
-               die ("Could not write temporary index to %s", filename);
-
-       discard_index(&result);
-}
-
-static void stat_patch_list(struct apply_state *state, struct patch *patch)
-{
-       int files, adds, dels;
-
-       for (files = adds = dels = 0 ; patch ; patch = patch->next) {
-               files++;
-               adds += patch->lines_added;
-               dels += patch->lines_deleted;
-               show_stats(state, patch);
-       }
-
-       print_stat_summary(stdout, files, adds, dels);
-}
-
-static void numstat_patch_list(struct apply_state *state,
-                              struct patch *patch)
-{
-       for ( ; patch; patch = patch->next) {
-               const char *name;
-               name = patch->new_name ? patch->new_name : patch->old_name;
-               if (patch->is_binary)
-                       printf("-\t-\t");
-               else
-                       printf("%d\t%d\t", patch->lines_added, patch->lines_deleted);
-               write_name_quoted(name, stdout, state->line_termination);
-       }
-}
-
-static void show_file_mode_name(const char *newdelete, unsigned int mode, const char *name)
-{
-       if (mode)
-               printf(" %s mode %06o %s\n", newdelete, mode, name);
-       else
-               printf(" %s %s\n", newdelete, name);
-}
-
-static void show_mode_change(struct patch *p, int show_name)
-{
-       if (p->old_mode && p->new_mode && p->old_mode != p->new_mode) {
-               if (show_name)
-                       printf(" mode change %06o => %06o %s\n",
-                              p->old_mode, p->new_mode, p->new_name);
-               else
-                       printf(" mode change %06o => %06o\n",
-                              p->old_mode, p->new_mode);
-       }
-}
-
-static void show_rename_copy(struct patch *p)
-{
-       const char *renamecopy = p->is_rename ? "rename" : "copy";
-       const char *old, *new;
-
-       /* Find common prefix */
-       old = p->old_name;
-       new = p->new_name;
-       while (1) {
-               const char *slash_old, *slash_new;
-               slash_old = strchr(old, '/');
-               slash_new = strchr(new, '/');
-               if (!slash_old ||
-                   !slash_new ||
-                   slash_old - old != slash_new - new ||
-                   memcmp(old, new, slash_new - new))
-                       break;
-               old = slash_old + 1;
-               new = slash_new + 1;
-       }
-       /* p->old_name thru old is the common prefix, and old and new
-        * through the end of names are renames
-        */
-       if (old != p->old_name)
-               printf(" %s %.*s{%s => %s} (%d%%)\n", renamecopy,
-                      (int)(old - p->old_name), p->old_name,
-                      old, new, p->score);
-       else
-               printf(" %s %s => %s (%d%%)\n", renamecopy,
-                      p->old_name, p->new_name, p->score);
-       show_mode_change(p, 0);
-}
-
-static void summary_patch_list(struct patch *patch)
-{
-       struct patch *p;
-
-       for (p = patch; p; p = p->next) {
-               if (p->is_new)
-                       show_file_mode_name("create", p->new_mode, p->new_name);
-               else if (p->is_delete)
-                       show_file_mode_name("delete", p->old_mode, p->old_name);
-               else {
-                       if (p->is_rename || p->is_copy)
-                               show_rename_copy(p);
-                       else {
-                               if (p->score) {
-                                       printf(" rewrite %s (%d%%)\n",
-                                              p->new_name, p->score);
-                                       show_mode_change(p, 0);
-                               }
-                               else
-                                       show_mode_change(p, 1);
-                       }
-               }
-       }
-}
-
-static void patch_stats(struct apply_state *state, struct patch *patch)
-{
-       int lines = patch->lines_added + patch->lines_deleted;
-
-       if (lines > state->max_change)
-               state->max_change = lines;
-       if (patch->old_name) {
-               int len = quote_c_style(patch->old_name, NULL, NULL, 0);
-               if (!len)
-                       len = strlen(patch->old_name);
-               if (len > state->max_len)
-                       state->max_len = len;
-       }
-       if (patch->new_name) {
-               int len = quote_c_style(patch->new_name, NULL, NULL, 0);
-               if (!len)
-                       len = strlen(patch->new_name);
-               if (len > state->max_len)
-                       state->max_len = len;
-       }
-}
-
-static void remove_file(struct apply_state *state, struct patch *patch, int rmdir_empty)
-{
-       if (state->update_index) {
-               if (remove_file_from_cache(patch->old_name) < 0)
-                       die(_("unable to remove %s from index"), patch->old_name);
-       }
-       if (!state->cached) {
-               if (!remove_or_warn(patch->old_mode, patch->old_name) && rmdir_empty) {
-                       remove_path(patch->old_name);
-               }
-       }
-}
-
-static void add_index_file(struct apply_state *state,
-                          const char *path,
-                          unsigned mode,
-                          void *buf,
-                          unsigned long size)
-{
-       struct stat st;
-       struct cache_entry *ce;
-       int namelen = strlen(path);
-       unsigned ce_size = cache_entry_size(namelen);
-
-       if (!state->update_index)
-               return;
-
-       ce = xcalloc(1, ce_size);
-       memcpy(ce->name, path, namelen);
-       ce->ce_mode = create_ce_mode(mode);
-       ce->ce_flags = create_ce_flags(0);
-       ce->ce_namelen = namelen;
-       if (S_ISGITLINK(mode)) {
-               const char *s;
-
-               if (!skip_prefix(buf, "Subproject commit ", &s) ||
-                   get_sha1_hex(s, ce->sha1))
-                       die(_("corrupt patch for submodule %s"), path);
-       } else {
-               if (!state->cached) {
-                       if (lstat(path, &st) < 0)
-                               die_errno(_("unable to stat newly created file '%s'"),
-                                         path);
-                       fill_stat_cache_info(ce, &st);
-               }
-               if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0)
-                       die(_("unable to create backing store for newly created file %s"), path);
-       }
-       if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)
-               die(_("unable to add cache entry for %s"), path);
-}
-
-static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
-{
-       int fd;
-       struct strbuf nbuf = STRBUF_INIT;
-
-       if (S_ISGITLINK(mode)) {
-               struct stat st;
-               if (!lstat(path, &st) && S_ISDIR(st.st_mode))
-                       return 0;
-               return mkdir(path, 0777);
-       }
-
-       if (has_symlinks && S_ISLNK(mode))
-               /* Although buf:size is counted string, it also is NUL
-                * terminated.
-                */
-               return symlink(buf, path);
-
-       fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
-       if (fd < 0)
-               return -1;
-
-       if (convert_to_working_tree(path, buf, size, &nbuf)) {
-               size = nbuf.len;
-               buf  = nbuf.buf;
-       }
-       write_or_die(fd, buf, size);
-       strbuf_release(&nbuf);
-
-       if (close(fd) < 0)
-               die_errno(_("closing file '%s'"), path);
-       return 0;
-}
-
-/*
- * We optimistically assume that the directories exist,
- * which is true 99% of the time anyway. If they don't,
- * we create them and try again.
- */
-static void create_one_file(struct apply_state *state,
-                           char *path,
-                           unsigned mode,
-                           const char *buf,
-                           unsigned long size)
-{
-       if (state->cached)
-               return;
-       if (!try_create_file(path, mode, buf, size))
-               return;
-
-       if (errno == ENOENT) {
-               if (safe_create_leading_directories(path))
-                       return;
-               if (!try_create_file(path, mode, buf, size))
-                       return;
-       }
-
-       if (errno == EEXIST || errno == EACCES) {
-               /* We may be trying to create a file where a directory
-                * used to be.
-                */
-               struct stat st;
-               if (!lstat(path, &st) && (!S_ISDIR(st.st_mode) || !rmdir(path)))
-                       errno = EEXIST;
-       }
-
-       if (errno == EEXIST) {
-               unsigned int nr = getpid();
-
-               for (;;) {
-                       char newpath[PATH_MAX];
-                       mksnpath(newpath, sizeof(newpath), "%s~%u", path, nr);
-                       if (!try_create_file(newpath, mode, buf, size)) {
-                               if (!rename(newpath, path))
-                                       return;
-                               unlink_or_warn(newpath);
-                               break;
-                       }
-                       if (errno != EEXIST)
-                               break;
-                       ++nr;
-               }
-       }
-       die_errno(_("unable to write file '%s' mode %o"), path, mode);
-}
-
-static void add_conflicted_stages_file(struct apply_state *state,
-                                      struct patch *patch)
-{
-       int stage, namelen;
-       unsigned ce_size, mode;
-       struct cache_entry *ce;
-
-       if (!state->update_index)
-               return;
-       namelen = strlen(patch->new_name);
-       ce_size = cache_entry_size(namelen);
-       mode = patch->new_mode ? patch->new_mode : (S_IFREG | 0644);
-
-       remove_file_from_cache(patch->new_name);
-       for (stage = 1; stage < 4; stage++) {
-               if (is_null_oid(&patch->threeway_stage[stage - 1]))
-                       continue;
-               ce = xcalloc(1, ce_size);
-               memcpy(ce->name, patch->new_name, namelen);
-               ce->ce_mode = create_ce_mode(mode);
-               ce->ce_flags = create_ce_flags(stage);
-               ce->ce_namelen = namelen;
-               hashcpy(ce->sha1, patch->threeway_stage[stage - 1].hash);
-               if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)
-                       die(_("unable to add cache entry for %s"), patch->new_name);
-       }
-}
-
-static void create_file(struct apply_state *state, struct patch *patch)
-{
-       char *path = patch->new_name;
-       unsigned mode = patch->new_mode;
-       unsigned long size = patch->resultsize;
-       char *buf = patch->result;
-
-       if (!mode)
-               mode = S_IFREG | 0644;
-       create_one_file(state, path, mode, buf, size);
-
-       if (patch->conflicted_threeway)
-               add_conflicted_stages_file(state, patch);
-       else
-               add_index_file(state, path, mode, buf, size);
-}
-
-/* phase zero is to remove, phase one is to create */
-static void write_out_one_result(struct apply_state *state,
-                                struct patch *patch,
-                                int phase)
-{
-       if (patch->is_delete > 0) {
-               if (phase == 0)
-                       remove_file(state, patch, 1);
-               return;
-       }
-       if (patch->is_new > 0 || patch->is_copy) {
-               if (phase == 1)
-                       create_file(state, patch);
-               return;
-       }
-       /*
-        * Rename or modification boils down to the same
-        * thing: remove the old, write the new
-        */
-       if (phase == 0)
-               remove_file(state, patch, patch->is_rename);
-       if (phase == 1)
-               create_file(state, patch);
-}
-
-static int write_out_one_reject(struct apply_state *state, struct patch *patch)
-{
-       FILE *rej;
-       char namebuf[PATH_MAX];
-       struct fragment *frag;
-       int cnt = 0;
-       struct strbuf sb = STRBUF_INIT;
-
-       for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) {
-               if (!frag->rejected)
-                       continue;
-               cnt++;
-       }
-
-       if (!cnt) {
-               if (state->apply_verbosely)
-                       say_patch_name(stderr,
-                                      _("Applied patch %s cleanly."), patch);
-               return 0;
-       }
-
-       /* This should not happen, because a removal patch that leaves
-        * contents are marked "rejected" at the patch level.
-        */
-       if (!patch->new_name)
-               die(_("internal error"));
-
-       /* Say this even without --verbose */
-       strbuf_addf(&sb, Q_("Applying patch %%s with %d reject...",
-                           "Applying patch %%s with %d rejects...",
-                           cnt),
-                   cnt);
-       say_patch_name(stderr, sb.buf, patch);
-       strbuf_release(&sb);
-
-       cnt = strlen(patch->new_name);
-       if (ARRAY_SIZE(namebuf) <= cnt + 5) {
-               cnt = ARRAY_SIZE(namebuf) - 5;
-               warning(_("truncating .rej filename to %.*s.rej"),
-                       cnt - 1, patch->new_name);
-       }
-       memcpy(namebuf, patch->new_name, cnt);
-       memcpy(namebuf + cnt, ".rej", 5);
-
-       rej = fopen(namebuf, "w");
-       if (!rej)
-               return error(_("cannot open %s: %s"), namebuf, strerror(errno));
-
-       /* Normal git tools never deal with .rej, so do not pretend
-        * this is a git patch by saying --git or giving extended
-        * headers.  While at it, maybe please "kompare" that wants
-        * the trailing TAB and some garbage at the end of line ;-).
-        */
-       fprintf(rej, "diff a/%s b/%s\t(rejected hunks)\n",
-               patch->new_name, patch->new_name);
-       for (cnt = 1, frag = patch->fragments;
-            frag;
-            cnt++, frag = frag->next) {
-               if (!frag->rejected) {
-                       fprintf_ln(stderr, _("Hunk #%d applied cleanly."), cnt);
-                       continue;
-               }
-               fprintf_ln(stderr, _("Rejected hunk #%d."), cnt);
-               fprintf(rej, "%.*s", frag->size, frag->patch);
-               if (frag->patch[frag->size-1] != '\n')
-                       fputc('\n', rej);
-       }
-       fclose(rej);
-       return -1;
-}
-
-static int write_out_results(struct apply_state *state, struct patch *list)
-{
-       int phase;
-       int errs = 0;
-       struct patch *l;
-       struct string_list cpath = STRING_LIST_INIT_DUP;
-
-       for (phase = 0; phase < 2; phase++) {
-               l = list;
-               while (l) {
-                       if (l->rejected)
-                               errs = 1;
-                       else {
-                               write_out_one_result(state, l, phase);
-                               if (phase == 1) {
-                                       if (write_out_one_reject(state, l))
-                                               errs = 1;
-                                       if (l->conflicted_threeway) {
-                                               string_list_append(&cpath, l->new_name);
-                                               errs = 1;
-                                       }
-                               }
-                       }
-                       l = l->next;
-               }
-       }
-
-       if (cpath.nr) {
-               struct string_list_item *item;
-
-               string_list_sort(&cpath);
-               for_each_string_list_item(item, &cpath)
-                       fprintf(stderr, "U %s\n", item->string);
-               string_list_clear(&cpath, 0);
-
-               rerere(0);
-       }
+#include "builtin.h"
+#include "parse-options.h"
+#include "lockfile.h"
+#include "apply.h"
 
-       return errs;
-}
+static const char * const apply_usage[] = {
+       N_("git apply [<options>] [<patch>...]"),
+       NULL
+};
 
 static struct lock_file lock_file;
 
-#define INACCURATE_EOF (1<<0)
-#define RECOUNT                (1<<1)
-
-static int apply_patch(struct apply_state *state,
-                      int fd,
-                      const char *filename,
-                      int options)
-{
-       size_t offset;
-       struct strbuf buf = STRBUF_INIT; /* owns the patch text */
-       struct patch *list = NULL, **listp = &list;
-       int skipped_patch = 0;
-
-       state->patch_input_file = filename;
-       read_patch_file(&buf, fd);
-       offset = 0;
-       while (offset < buf.len) {
-               struct patch *patch;
-               int nr;
-
-               patch = xcalloc(1, sizeof(*patch));
-               patch->inaccurate_eof = !!(options & INACCURATE_EOF);
-               patch->recount =  !!(options & RECOUNT);
-               nr = parse_chunk(state, buf.buf + offset, buf.len - offset, patch);
-               if (nr < 0) {
-                       free_patch(patch);
-                       break;
-               }
-               if (state->apply_in_reverse)
-                       reverse_patches(patch);
-               if (use_patch(state, patch)) {
-                       patch_stats(state, patch);
-                       *listp = patch;
-                       listp = &patch->next;
-               }
-               else {
-                       if (state->apply_verbosely)
-                               say_patch_name(stderr, _("Skipped patch '%s'."), patch);
-                       free_patch(patch);
-                       skipped_patch++;
-               }
-               offset += nr;
-       }
-
-       if (!list && !skipped_patch)
-               die(_("unrecognized input"));
-
-       if (state->whitespace_error && (state->ws_error_action == die_on_ws_error))
-               state->apply = 0;
-
-       state->update_index = state->check_index && state->apply;
-       if (state->update_index && state->newfd < 0)
-               state->newfd = hold_locked_index(state->lock_file, 1);
-
-       if (state->check_index) {
-               if (read_cache() < 0)
-                       die(_("unable to read index file"));
-       }
-
-       if ((state->check || state->apply) &&
-           check_patch_list(state, list) < 0 &&
-           !state->apply_with_reject)
-               exit(1);
-
-       if (state->apply && write_out_results(state, list)) {
-               if (state->apply_with_reject)
-                       exit(1);
-               /* with --3way, we still need to write the index out */
-               return 1;
-       }
-
-       if (state->fake_ancestor)
-               build_fake_ancestor(list, state->fake_ancestor);
-
-       if (state->diffstat)
-               stat_patch_list(state, list);
-
-       if (state->numstat)
-               numstat_patch_list(state, list);
-
-       if (state->summary)
-               summary_patch_list(list);
-
-       free_patch_list(list);
-       strbuf_release(&buf);
-       string_list_clear(&state->fn_table, 0);
-       return 0;
-}
-
-static void git_apply_config(void)
-{
-       git_config_get_string_const("apply.whitespace", &apply_default_whitespace);
-       git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace);
-       git_config(git_default_config, NULL);
-}
-
-static int option_parse_exclude(const struct option *opt,
-                               const char *arg, int unset)
-{
-       struct apply_state *state = opt->value;
-       add_name_limit(state, arg, 1);
-       return 0;
-}
-
-static int option_parse_include(const struct option *opt,
-                               const char *arg, int unset)
-{
-       struct apply_state *state = opt->value;
-       add_name_limit(state, arg, 0);
-       state->has_include = 1;
-       return 0;
-}
-
-static int option_parse_p(const struct option *opt,
-                         const char *arg,
-                         int unset)
-{
-       struct apply_state *state = opt->value;
-       state->p_value = atoi(arg);
-       state->p_value_known = 1;
-       return 0;
-}
-
-static int option_parse_space_change(const struct option *opt,
-                                    const char *arg, int unset)
-{
-       struct apply_state *state = opt->value;
-       if (unset)
-               state->ws_ignore_action = ignore_ws_none;
-       else
-               state->ws_ignore_action = ignore_ws_change;
-       return 0;
-}
-
-static int option_parse_whitespace(const struct option *opt,
-                                  const char *arg, int unset)
-{
-       struct apply_state *state = opt->value;
-       state->whitespace_option = arg;
-       parse_whitespace_option(state, arg);
-       return 0;
-}
-
-static int option_parse_directory(const struct option *opt,
-                                 const char *arg, int unset)
-{
-       struct apply_state *state = opt->value;
-       strbuf_reset(&state->root);
-       strbuf_addstr(&state->root, arg);
-       strbuf_complete(&state->root, '/');
-       return 0;
-}
-
-static void init_apply_state(struct apply_state *state,
-                            const char *prefix,
-                            struct lock_file *lock_file)
-{
-       memset(state, 0, sizeof(*state));
-       state->prefix = prefix;
-       state->prefix_length = state->prefix ? strlen(state->prefix) : 0;
-       state->lock_file = lock_file;
-       state->newfd = -1;
-       state->apply = 1;
-       state->line_termination = '\n';
-       state->p_value = 1;
-       state->p_context = UINT_MAX;
-       state->squelch_whitespace_errors = 5;
-       state->ws_error_action = warn_on_ws_error;
-       state->ws_ignore_action = ignore_ws_none;
-       state->linenr = 1;
-       string_list_init(&state->fn_table, 0);
-       string_list_init(&state->limit_by_name, 0);
-       string_list_init(&state->symlink_changes, 0);
-       strbuf_init(&state->root, 0);
-
-       git_apply_config();
-       if (apply_default_whitespace)
-               parse_whitespace_option(state, apply_default_whitespace);
-       if (apply_default_ignorewhitespace)
-               parse_ignorewhitespace_option(state, apply_default_ignorewhitespace);
-}
-
-static void clear_apply_state(struct apply_state *state)
-{
-       string_list_clear(&state->limit_by_name, 0);
-       string_list_clear(&state->symlink_changes, 0);
-       strbuf_release(&state->root);
-
-       /* &state->fn_table is cleared at the end of apply_patch() */
-}
-
-static void check_apply_state(struct apply_state *state, int force_apply)
-{
-       int is_not_gitdir = !startup_info->have_repository;
-
-       if (state->apply_with_reject && state->threeway)
-               die("--reject and --3way cannot be used together.");
-       if (state->cached && state->threeway)
-               die("--cached and --3way cannot be used together.");
-       if (state->threeway) {
-               if (is_not_gitdir)
-                       die(_("--3way outside a repository"));
-               state->check_index = 1;
-       }
-       if (state->apply_with_reject)
-               state->apply = state->apply_verbosely = 1;
-       if (!force_apply && (state->diffstat || state->numstat || state->summary || state->check || state->fake_ancestor))
-               state->apply = 0;
-       if (state->check_index && is_not_gitdir)
-               die(_("--index outside a repository"));
-       if (state->cached) {
-               if (is_not_gitdir)
-                       die(_("--cached outside a repository"));
-               state->check_index = 1;
-       }
-       if (state->check_index)
-               state->unsafe_paths = 0;
-       if (!state->lock_file)
-               die("BUG: state->lock_file should not be NULL");
-}
-
-static int apply_all_patches(struct apply_state *state,
-                            int argc,
-                            const char **argv,
-                            int options)
-{
-       int i;
-       int errs = 0;
-       int read_stdin = 1;
-
-       for (i = 0; i < argc; i++) {
-               const char *arg = argv[i];
-               int fd;
-
-               if (!strcmp(arg, "-")) {
-                       errs |= apply_patch(state, 0, "<stdin>", options);
-                       read_stdin = 0;
-                       continue;
-               } else if (0 < state->prefix_length)
-                       arg = prefix_filename(state->prefix,
-                                             state->prefix_length,
-                                             arg);
-
-               fd = open(arg, O_RDONLY);
-               if (fd < 0)
-                       die_errno(_("can't open patch '%s'"), arg);
-               read_stdin = 0;
-               set_default_whitespace_mode(state);
-               errs |= apply_patch(state, fd, arg, options);
-               close(fd);
-       }
-       set_default_whitespace_mode(state);
-       if (read_stdin)
-               errs |= apply_patch(state, 0, "<stdin>", options);
-
-       if (state->whitespace_error) {
-               if (state->squelch_whitespace_errors &&
-                   state->squelch_whitespace_errors < state->whitespace_error) {
-                       int squelched =
-                               state->whitespace_error - state->squelch_whitespace_errors;
-                       warning(Q_("squelched %d whitespace error",
-                                  "squelched %d whitespace errors",
-                                  squelched),
-                               squelched);
-               }
-               if (state->ws_error_action == die_on_ws_error)
-                       die(Q_("%d line adds whitespace errors.",
-                              "%d lines add whitespace errors.",
-                              state->whitespace_error),
-                           state->whitespace_error);
-               if (state->applied_after_fixing_ws && state->apply)
-                       warning("%d line%s applied after"
-                               " fixing whitespace errors.",
-                               state->applied_after_fixing_ws,
-                               state->applied_after_fixing_ws == 1 ? "" : "s");
-               else if (state->whitespace_error)
-                       warning(Q_("%d line adds whitespace errors.",
-                                  "%d lines add whitespace errors.",
-                                  state->whitespace_error),
-                               state->whitespace_error);
-       }
-
-       if (state->update_index) {
-               if (write_locked_index(&the_index, state->lock_file, COMMIT_LOCK))
-                       die(_("Unable to write new index file"));
-               state->newfd = -1;
-       }
-
-       return !!errs;
-}
-
 int cmd_apply(int argc, const char **argv, const char *prefix)
 {
        int force_apply = 0;
@@ -4795,81 +18,15 @@ int cmd_apply(int argc, const char **argv, const char *prefix)
        int ret;
        struct apply_state state;
 
-       struct option builtin_apply_options[] = {
-               { OPTION_CALLBACK, 0, "exclude", &state, N_("path"),
-                       N_("don't apply changes matching the given path"),
-                       0, option_parse_exclude },
-               { OPTION_CALLBACK, 0, "include", &state, N_("path"),
-                       N_("apply changes matching the given path"),
-                       0, option_parse_include },
-               { OPTION_CALLBACK, 'p', NULL, &state, N_("num"),
-                       N_("remove <num> leading slashes from traditional diff paths"),
-                       0, option_parse_p },
-               OPT_BOOL(0, "no-add", &state.no_add,
-                       N_("ignore additions made by the patch")),
-               OPT_BOOL(0, "stat", &state.diffstat,
-                       N_("instead of applying the patch, output diffstat for the input")),
-               OPT_NOOP_NOARG(0, "allow-binary-replacement"),
-               OPT_NOOP_NOARG(0, "binary"),
-               OPT_BOOL(0, "numstat", &state.numstat,
-                       N_("show number of added and deleted lines in decimal notation")),
-               OPT_BOOL(0, "summary", &state.summary,
-                       N_("instead of applying the patch, output a summary for the input")),
-               OPT_BOOL(0, "check", &state.check,
-                       N_("instead of applying the patch, see if the patch is applicable")),
-               OPT_BOOL(0, "index", &state.check_index,
-                       N_("make sure the patch is applicable to the current index")),
-               OPT_BOOL(0, "cached", &state.cached,
-                       N_("apply a patch without touching the working tree")),
-               OPT_BOOL(0, "unsafe-paths", &state.unsafe_paths,
-                       N_("accept a patch that touches outside the working area")),
-               OPT_BOOL(0, "apply", &force_apply,
-                       N_("also apply the patch (use with --stat/--summary/--check)")),
-               OPT_BOOL('3', "3way", &state.threeway,
-                        N_( "attempt three-way merge if a patch does not apply")),
-               OPT_FILENAME(0, "build-fake-ancestor", &state.fake_ancestor,
-                       N_("build a temporary index based on embedded index information")),
-               /* Think twice before adding "--nul" synonym to this */
-               OPT_SET_INT('z', NULL, &state.line_termination,
-                       N_("paths are separated with NUL character"), '\0'),
-               OPT_INTEGER('C', NULL, &state.p_context,
-                               N_("ensure at least <n> lines of context match")),
-               { OPTION_CALLBACK, 0, "whitespace", &state, N_("action"),
-                       N_("detect new or modified lines that have whitespace errors"),
-                       0, option_parse_whitespace },
-               { OPTION_CALLBACK, 0, "ignore-space-change", &state, NULL,
-                       N_("ignore changes in whitespace when finding context"),
-                       PARSE_OPT_NOARG, option_parse_space_change },
-               { OPTION_CALLBACK, 0, "ignore-whitespace", &state, NULL,
-                       N_("ignore changes in whitespace when finding context"),
-                       PARSE_OPT_NOARG, option_parse_space_change },
-               OPT_BOOL('R', "reverse", &state.apply_in_reverse,
-                       N_("apply the patch in reverse")),
-               OPT_BOOL(0, "unidiff-zero", &state.unidiff_zero,
-                       N_("don't expect at least one line of context")),
-               OPT_BOOL(0, "reject", &state.apply_with_reject,
-                       N_("leave the rejected hunks in corresponding *.rej files")),
-               OPT_BOOL(0, "allow-overlap", &state.allow_overlap,
-                       N_("allow overlapping hunks")),
-               OPT__VERBOSE(&state.apply_verbosely, N_("be verbose")),
-               OPT_BIT(0, "inaccurate-eof", &options,
-                       N_("tolerate incorrectly detected missing new-line at the end of file"),
-                       INACCURATE_EOF),
-               OPT_BIT(0, "recount", &options,
-                       N_("do not trust the line counts in the hunk headers"),
-                       RECOUNT),
-               { OPTION_CALLBACK, 0, "directory", &state, N_("root"),
-                       N_("prepend <root> to all filenames"),
-                       0, option_parse_directory },
-               OPT_END()
-       };
-
-       init_apply_state(&state, prefix, &lock_file);
+       if (init_apply_state(&state, prefix, &lock_file))
+               exit(128);
 
-       argc = parse_options(argc, argv, state.prefix, builtin_apply_options,
-                       apply_usage, 0);
+       argc = apply_parse_options(argc, argv,
+                                  &state, &force_apply, &options,
+                                  apply_usage);
 
-       check_apply_state(&state, force_apply);
+       if (check_apply_state(&state, force_apply))
+               exit(128);
 
        ret = apply_all_patches(&state, argc, argv, options);
 
index a1e3b940c25ac20927d4daefa417d5b626e38a24..f863465a0fa137f3446071a0ec1653adad536fdc 100644 (file)
@@ -47,10 +47,10 @@ static int run_remote_archiver(int argc, const char **argv,
        if (name_hint) {
                const char *format = archive_format_from_filename(name_hint);
                if (format)
-                       packet_write(fd[1], "argument --format=%s\n", format);
+                       packet_write_fmt(fd[1], "argument --format=%s\n", format);
        }
        for (i = 1; i < argc; i++)
-               packet_write(fd[1], "argument %s\n", argv[i]);
+               packet_write_fmt(fd[1], "argument %s\n", argv[i]);
        packet_flush(fd[1]);
 
        buf = packet_read_line(fd[0], NULL);
@@ -85,8 +85,8 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
        const char *output = NULL;
        const char *remote = NULL;
        struct option local_opts[] = {
-               OPT_STRING('o', "output", &output, N_("file"),
-                       N_("write the archive to this file")),
+               OPT_FILENAME('o', "output", &output,
+                            N_("write the archive to this file")),
                OPT_STRING(0, "remote", &remote, N_("repo"),
                        N_("retrieve the archive from remote repository <repo>")),
                OPT_STRING(0, "exec", &exec, N_("command"),
@@ -105,5 +105,5 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
 
        setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
 
-       return write_archive(argc, argv, prefix, 1, output, 0);
+       return write_archive(argc, argv, prefix, output, 0);
 }
index f618392e55f70966accc49aa7ff22de2d16f189f..ca9ebe40e7d4dac16a7b325e18857e9f1bfb316c 100644 (file)
@@ -120,7 +120,7 @@ struct origin {
         */
        struct blame_entry *suspects;
        mmfile_t file;
-       unsigned char blob_sha1[20];
+       struct object_id blob_oid;
        unsigned mode;
        /* guilty gets set when shipping any suspects to the final
         * blame list instead of other commits
@@ -154,8 +154,8 @@ static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b,
  */
 int textconv_object(const char *path,
                    unsigned mode,
-                   const unsigned char *sha1,
-                   int sha1_valid,
+                   const struct object_id *oid,
+                   int oid_valid,
                    char **buf,
                    unsigned long *buf_size)
 {
@@ -163,7 +163,7 @@ int textconv_object(const char *path,
        struct userdiff_driver *textconv;
 
        df = alloc_filespec(path);
-       fill_filespec(df, sha1, sha1_valid, mode);
+       fill_filespec(df, oid->hash, oid_valid, mode);
        textconv = get_textconv(df);
        if (!textconv) {
                free_filespec(df);
@@ -188,15 +188,16 @@ static void fill_origin_blob(struct diff_options *opt,
 
                num_read_blob++;
                if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) &&
-                   textconv_object(o->path, o->mode, o->blob_sha1, 1, &file->ptr, &file_size))
+                   textconv_object(o->path, o->mode, &o->blob_oid, 1, &file->ptr, &file_size))
                        ;
                else
-                       file->ptr = read_sha1_file(o->blob_sha1, &type, &file_size);
+                       file->ptr = read_sha1_file(o->blob_oid.hash, &type,
+                                                  &file_size);
                file->size = file_size;
 
                if (!file->ptr)
                        die("Cannot read blob %s for path %s",
-                           sha1_to_hex(o->blob_sha1),
+                           oid_to_hex(&o->blob_oid),
                            o->path);
                o->file = *file;
        }
@@ -508,17 +509,17 @@ static struct origin *get_origin(struct scoreboard *sb,
  */
 static int fill_blob_sha1_and_mode(struct origin *origin)
 {
-       if (!is_null_sha1(origin->blob_sha1))
+       if (!is_null_oid(&origin->blob_oid))
                return 0;
        if (get_tree_entry(origin->commit->object.oid.hash,
                           origin->path,
-                          origin->blob_sha1, &origin->mode))
+                          origin->blob_oid.hash, &origin->mode))
                goto error_out;
-       if (sha1_object_info(origin->blob_sha1, NULL) != OBJ_BLOB)
+       if (sha1_object_info(origin->blob_oid.hash, NULL) != OBJ_BLOB)
                goto error_out;
        return 0;
  error_out:
-       hashclr(origin->blob_sha1);
+       oidclr(&origin->blob_oid);
        origin->mode = S_IFINVALID;
        return -1;
 }
@@ -572,7 +573,7 @@ static struct origin *find_origin(struct scoreboard *sb,
        if (!diff_queued_diff.nr) {
                /* The path is the same as parent */
                porigin = get_origin(sb, parent, origin->path);
-               hashcpy(porigin->blob_sha1, origin->blob_sha1);
+               oidcpy(&porigin->blob_oid, &origin->blob_oid);
                porigin->mode = origin->mode;
        } else {
                /*
@@ -598,7 +599,7 @@ static struct origin *find_origin(struct scoreboard *sb,
                            p->status);
                case 'M':
                        porigin = get_origin(sb, parent, origin->path);
-                       hashcpy(porigin->blob_sha1, p->one->oid.hash);
+                       oidcpy(&porigin->blob_oid, &p->one->oid);
                        porigin->mode = p->one->mode;
                        break;
                case 'A':
@@ -644,7 +645,7 @@ static struct origin *find_rename(struct scoreboard *sb,
                if ((p->status == 'R' || p->status == 'C') &&
                    !strcmp(p->two->path, origin->path)) {
                        porigin = get_origin(sb, parent, p->one->path);
-                       hashcpy(porigin->blob_sha1, p->one->oid.hash);
+                       oidcpy(&porigin->blob_oid, &p->one->oid);
                        porigin->mode = p->one->mode;
                        break;
                }
@@ -657,8 +658,11 @@ static struct origin *find_rename(struct scoreboard *sb,
 /*
  * Append a new blame entry to a given output queue.
  */
-static void add_blame_entry(struct blame_entry ***queue, struct blame_entry *e)
+static void add_blame_entry(struct blame_entry ***queue,
+                           const struct blame_entry *src)
 {
+       struct blame_entry *e = xmalloc(sizeof(*e));
+       memcpy(e, src, sizeof(*e));
        origin_incref(e->suspect);
 
        e->next = **queue;
@@ -759,21 +763,15 @@ static void split_blame(struct blame_entry ***blamed,
                        struct blame_entry *split,
                        struct blame_entry *e)
 {
-       struct blame_entry *new_entry;
-
        if (split[0].suspect && split[2].suspect) {
                /* The first part (reuse storage for the existing entry e) */
                dup_entry(unblamed, e, &split[0]);
 
                /* The last part -- me */
-               new_entry = xmalloc(sizeof(*new_entry));
-               memcpy(new_entry, &(split[2]), sizeof(struct blame_entry));
-               add_blame_entry(unblamed, new_entry);
+               add_blame_entry(unblamed, &split[2]);
 
                /* ... and the middle part -- parent */
-               new_entry = xmalloc(sizeof(*new_entry));
-               memcpy(new_entry, &(split[1]), sizeof(struct blame_entry));
-               add_blame_entry(blamed, new_entry);
+               add_blame_entry(blamed, &split[1]);
        }
        else if (!split[0].suspect && !split[2].suspect)
                /*
@@ -784,18 +782,12 @@ static void split_blame(struct blame_entry ***blamed,
        else if (split[0].suspect) {
                /* me and then parent */
                dup_entry(unblamed, e, &split[0]);
-
-               new_entry = xmalloc(sizeof(*new_entry));
-               memcpy(new_entry, &(split[1]), sizeof(struct blame_entry));
-               add_blame_entry(blamed, new_entry);
+               add_blame_entry(blamed, &split[1]);
        }
        else {
                /* parent and then me */
                dup_entry(blamed, e, &split[1]);
-
-               new_entry = xmalloc(sizeof(*new_entry));
-               memcpy(new_entry, &(split[2]), sizeof(struct blame_entry));
-               add_blame_entry(unblamed, new_entry);
+               add_blame_entry(unblamed, &split[2]);
        }
 }
 
@@ -1308,7 +1300,7 @@ static void find_copy_in_parent(struct scoreboard *sb,
                                continue;
 
                        norigin = get_origin(sb, parent, p->one->path);
-                       hashcpy(norigin->blob_sha1, p->one->oid.hash);
+                       oidcpy(&norigin->blob_oid, &p->one->oid);
                        norigin->mode = p->one->mode;
                        fill_origin_blob(&sb->revs->diffopt, norigin, &file_p);
                        if (!file_p.ptr)
@@ -1458,15 +1450,14 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
                        porigin = find(sb, p, origin);
                        if (!porigin)
                                continue;
-                       if (!hashcmp(porigin->blob_sha1, origin->blob_sha1)) {
+                       if (!oidcmp(&porigin->blob_oid, &origin->blob_oid)) {
                                pass_whole_blame(sb, origin, porigin);
                                origin_decref(porigin);
                                goto finish;
                        }
                        for (j = same = 0; j < i; j++)
                                if (sg_origin[j] &&
-                                   !hashcmp(sg_origin[j]->blob_sha1,
-                                            porigin->blob_sha1)) {
+                                   !oidcmp(&sg_origin[j]->blob_oid, &porigin->blob_oid)) {
                                        same = 1;
                                        break;
                                }
@@ -1700,13 +1691,23 @@ static void get_commit_info(struct commit *commit,
 }
 
 /*
+ * Write out any suspect information which depends on the path. This must be
+ * handled separately from emit_one_suspect_detail(), because a given commit
+ * may have changes in multiple paths. So this needs to appear each time
+ * we mention a new group.
+ *
  * To allow LF and other nonportable characters in pathnames,
  * they are c-style quoted as needed.
  */
-static void write_filename_info(const char *path)
+static void write_filename_info(struct origin *suspect)
 {
+       if (suspect->previous) {
+               struct origin *prev = suspect->previous;
+               printf("previous %s ", oid_to_hex(&prev->commit->object.oid));
+               write_name_quoted(prev->path, stdout, '\n');
+       }
        printf("filename ");
-       write_name_quoted(path, stdout, '\n');
+       write_name_quoted(suspect->path, stdout, '\n');
 }
 
 /*
@@ -1735,11 +1736,6 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat)
        printf("summary %s\n", ci.summary.buf);
        if (suspect->commit->object.flags & UNINTERESTING)
                printf("boundary\n");
-       if (suspect->previous) {
-               struct origin *prev = suspect->previous;
-               printf("previous %s ", oid_to_hex(&prev->commit->object.oid));
-               write_name_quoted(prev->path, stdout, '\n');
-       }
 
        commit_info_destroy(&ci);
 
@@ -1760,7 +1756,7 @@ static void found_guilty_entry(struct blame_entry *ent,
                       oid_to_hex(&suspect->commit->object.oid),
                       ent->s_lno + 1, ent->lno + 1, ent->num_lines);
                emit_one_suspect_detail(suspect, 0);
-               write_filename_info(suspect->path);
+               write_filename_info(suspect);
                maybe_flush_or_die(stdout, "stdout");
        }
        pi->blamed_lines += ent->num_lines;
@@ -1884,7 +1880,7 @@ static void emit_porcelain_details(struct origin *suspect, int repeat)
 {
        if (emit_one_suspect_detail(suspect, repeat) ||
            (suspect->commit->object.flags & MORE_THAN_ONE_PATH))
-               write_filename_info(suspect->path);
+               write_filename_info(suspect);
 }
 
 static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent,
@@ -1894,9 +1890,9 @@ static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent,
        int cnt;
        const char *cp;
        struct origin *suspect = ent->suspect;
-       char hex[GIT_SHA1_HEXSZ + 1];
+       char hex[GIT_MAX_HEXSZ + 1];
 
-       sha1_to_hex_r(hex, suspect->commit->object.oid.hash);
+       oid_to_hex_r(hex, &suspect->commit->object.oid);
        printf("%s %d %d %d\n",
               hex,
               ent->s_lno + 1,
@@ -1932,16 +1928,16 @@ static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt)
        const char *cp;
        struct origin *suspect = ent->suspect;
        struct commit_info ci;
-       char hex[GIT_SHA1_HEXSZ + 1];
+       char hex[GIT_MAX_HEXSZ + 1];
        int show_raw_time = !!(opt & OUTPUT_RAW_TIMESTAMP);
 
        get_commit_info(suspect->commit, &ci, 1);
-       sha1_to_hex_r(hex, suspect->commit->object.oid.hash);
+       oid_to_hex_r(hex, &suspect->commit->object.oid);
 
        cp = nth_line(sb, ent->lno);
        for (cnt = 0; cnt < ent->num_lines; cnt++) {
                char ch;
-               int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? 40 : abbrev;
+               int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? GIT_SHA1_HEXSZ : abbrev;
 
                if (suspect->commit->object.flags & UNINTERESTING) {
                        if (blank_boundary)
@@ -2220,6 +2216,8 @@ static int git_blame_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (git_diff_heuristic_config(var, value, cb) < 0)
+               return -1;
        if (userdiff_config(var, value) < 0)
                return -1;
 
@@ -2232,12 +2230,12 @@ static void verify_working_tree_path(struct commit *work_tree, const char *path)
        int pos;
 
        for (parents = work_tree->parents; parents; parents = parents->next) {
-               const unsigned char *commit_sha1 = parents->item->object.oid.hash;
-               unsigned char blob_sha1[20];
+               const struct object_id *commit_oid = &parents->item->object.oid;
+               struct object_id blob_oid;
                unsigned mode;
 
-               if (!get_tree_entry(commit_sha1, path, blob_sha1, &mode) &&
-                   sha1_object_info(blob_sha1, NULL) == OBJ_BLOB)
+               if (!get_tree_entry(commit_oid->hash, path, blob_oid.hash, &mode) &&
+                   sha1_object_info(blob_oid.hash, NULL) == OBJ_BLOB)
                        return;
        }
 
@@ -2251,13 +2249,13 @@ static void verify_working_tree_path(struct commit *work_tree, const char *path)
                die("no such path '%s' in HEAD", path);
 }
 
-static struct commit_list **append_parent(struct commit_list **tail, const unsigned char *sha1)
+static struct commit_list **append_parent(struct commit_list **tail, const struct object_id *oid)
 {
        struct commit *parent;
 
-       parent = lookup_commit_reference(sha1);
+       parent = lookup_commit_reference(oid->hash);
        if (!parent)
-               die("no such commit %s", sha1_to_hex(sha1));
+               die("no such commit %s", oid_to_hex(oid));
        return &commit_list_insert(parent, tail)->next;
 }
 
@@ -2274,10 +2272,10 @@ static void append_merge_parents(struct commit_list **tail)
        }
 
        while (!strbuf_getwholeline_fd(&line, merge_head, '\n')) {
-               unsigned char sha1[20];
-               if (line.len < 40 || get_sha1_hex(line.buf, sha1))
+               struct object_id oid;
+               if (line.len < GIT_SHA1_HEXSZ || get_oid_hex(line.buf, &oid))
                        die("unknown line in '%s': %s", git_path_merge_head(), line.buf);
-               tail = append_parent(tail, sha1);
+               tail = append_parent(tail, &oid);
        }
        close(merge_head);
        strbuf_release(&line);
@@ -2306,7 +2304,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
        struct commit *commit;
        struct origin *origin;
        struct commit_list **parent_tail, *parent;
-       unsigned char head_sha1[20];
+       struct object_id head_oid;
        struct strbuf buf = STRBUF_INIT;
        const char *ident;
        time_t now;
@@ -2322,10 +2320,10 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
        commit->date = now;
        parent_tail = &commit->parents;
 
-       if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
+       if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_oid.hash, NULL))
                die("no such ref: HEAD");
 
-       parent_tail = append_parent(parent_tail, head_sha1);
+       parent_tail = append_parent(parent_tail, &head_oid);
        append_merge_parents(parent_tail);
        verify_working_tree_path(commit, path);
 
@@ -2366,7 +2364,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
                switch (st.st_mode & S_IFMT) {
                case S_IFREG:
                        if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) &&
-                           textconv_object(read_from, mode, null_sha1, 0, &buf_ptr, &buf_len))
+                           textconv_object(read_from, mode, &null_oid, 0, &buf_ptr, &buf_len))
                                strbuf_attach(&buf, buf_ptr, buf_len, buf_len + 1);
                        else if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size)
                                die_errno("cannot open or read '%s'", read_from);
@@ -2388,7 +2386,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
        convert_to_git(path, buf.buf, buf.len, &buf, 0);
        origin->file.ptr = buf.buf;
        origin->file.size = buf.len;
-       pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_sha1);
+       pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_oid.hash);
 
        /*
         * Read the current index, replace the path entry with
@@ -2410,7 +2408,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
        }
        size = cache_entry_size(len);
        ce = xcalloc(1, size);
-       hashcpy(ce->sha1, origin->blob_sha1);
+       oidcpy(&ce->oid, &origin->blob_oid);
        memcpy(ce->name, path, len);
        ce->ce_flags = create_ce_flags(0);
        ce->ce_namelen = len;
@@ -2454,6 +2452,41 @@ static char *prepare_final(struct scoreboard *sb)
        return xstrdup_or_null(name);
 }
 
+static const char *dwim_reverse_initial(struct scoreboard *sb)
+{
+       /*
+        * DWIM "git blame --reverse ONE -- PATH" as
+        * "git blame --reverse ONE..HEAD -- PATH" but only do so
+        * when it makes sense.
+        */
+       struct object *obj;
+       struct commit *head_commit;
+       unsigned char head_sha1[20];
+
+       if (sb->revs->pending.nr != 1)
+               return NULL;
+
+       /* Is that sole rev a committish? */
+       obj = sb->revs->pending.objects[0].item;
+       obj = deref_tag(obj, NULL, 0);
+       if (obj->type != OBJ_COMMIT)
+               return NULL;
+
+       /* Do we have HEAD? */
+       if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
+               return NULL;
+       head_commit = lookup_commit_reference_gently(head_sha1, 1);
+       if (!head_commit)
+               return NULL;
+
+       /* Turn "ONE" into "ONE..HEAD" then */
+       obj->flags |= UNINTERESTING;
+       add_pending_object(sb->revs, &head_commit->object, "HEAD");
+
+       sb->final = (struct commit *)obj;
+       return sb->revs->pending.objects[0].name;
+}
+
 static char *prepare_initial(struct scoreboard *sb)
 {
        int i;
@@ -2472,14 +2505,17 @@ static char *prepare_initial(struct scoreboard *sb)
                if (obj->type != OBJ_COMMIT)
                        die("Non commit %s?", revs->pending.objects[i].name);
                if (sb->final)
-                       die("More than one commit to dig down to %s and %s?",
+                       die("More than one commit to dig up from, %s and %s?",
                            revs->pending.objects[i].name,
                            final_commit_name);
                sb->final = (struct commit *) obj;
                final_commit_name = revs->pending.objects[i].name;
        }
+
+       if (!final_commit_name)
+               final_commit_name = dwim_reverse_initial(sb);
        if (!final_commit_name)
-               die("No commit to dig down to?");
+               die("No commit to dig up from?");
        return xstrdup(final_commit_name);
 }
 
@@ -2550,6 +2586,14 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
                OPT_BIT('s', NULL, &output_option, N_("Suppress author name and timestamp (Default: off)"), OUTPUT_NO_AUTHOR),
                OPT_BIT('e', "show-email", &output_option, N_("Show author email instead of name (Default: off)"), OUTPUT_SHOW_EMAIL),
                OPT_BIT('w', NULL, &xdl_opts, N_("Ignore whitespace differences"), XDF_IGNORE_WHITESPACE),
+
+               /*
+                * The following two options are parsed by parse_revision_opt()
+                * and are only included here to get included in the "-h"
+                * output:
+                */
+               { OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental heuristic to improve diffs"), PARSE_OPT_NOARG, parse_opt_unknown_cb },
+
                OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL),
                OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")),
                OPT_STRING(0, "contents", &contents_from, N_("file"), N_("Use <file>'s contents as the final image")),
@@ -2596,19 +2640,22 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
        }
 parse_done:
        no_whole_file_rename = !DIFF_OPT_TST(&revs.diffopt, FOLLOW_RENAMES);
+       xdl_opts |= revs.diffopt.xdl_opts & XDF_INDENT_HEURISTIC;
        DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES);
        argc = parse_options_end(&ctx);
 
        if (incremental || (output_option & OUTPUT_PORCELAIN)) {
                if (show_progress > 0)
-                       die("--progress can't be used with --incremental or porcelain formats");
+                       die(_("--progress can't be used with --incremental or porcelain formats"));
                show_progress = 0;
        } else if (show_progress < 0)
                show_progress = isatty(2);
 
-       if (0 < abbrev)
+       if (0 < abbrev && abbrev < GIT_SHA1_HEXSZ)
                /* one more abbrev length is needed for the boundary commit */
                abbrev++;
+       else if (!abbrev)
+               abbrev = GIT_SHA1_HEXSZ;
 
        if (revs_file && read_ancestry(revs_file))
                die_errno("reading graft file '%s' failed", revs_file);
@@ -2641,12 +2688,15 @@ parse_done:
                blame_date_width = sizeof("2006-10-19");
                break;
        case DATE_RELATIVE:
-               /* TRANSLATORS: This string is used to tell us the maximum
-                  display width for a relative timestamp in "git blame"
-                  output.  For C locale, "4 years, 11 months ago", which
-                  takes 22 places, is the longest among various forms of
-                  relative timestamps, but your language may need more or
-                  fewer display columns. */
+               /*
+                * TRANSLATORS: This string is used to tell us the
+                * maximum display width for a relative timestamp in
+                * "git blame" output.  For C locale, "4 years, 11
+                * months ago", which takes 22 places, is the longest
+                * among various forms of relative timestamps, but
+                * your language may need more or fewer display
+                * columns.
+                */
                blame_date_width = utf8_strwidth(_("4 years, 11 months ago")) + 1; /* add the null */
                break;
        case DATE_NORMAL:
@@ -2727,7 +2777,7 @@ parse_done:
                sb.commits.compare = compare_commits_by_commit_date;
        }
        else if (contents_from)
-               die("--contents and --reverse do not blend well.");
+               die(_("--contents and --reverse do not blend well."));
        else {
                final_commit_name = prepare_initial(&sb);
                sb.commits.compare = compare_commits_by_reverse_commit_date;
@@ -2747,12 +2797,12 @@ parse_done:
                add_pending_object(&revs, &(sb.final->object), ":");
        }
        else if (contents_from)
-               die("Cannot use --contents with final commit object name");
+               die(_("cannot use --contents with final commit object name"));
 
        if (reverse && revs.first_parent_only) {
                final_commit = find_single_final(sb.revs, NULL);
                if (!final_commit)
-                       die("--reverse and --first-parent together require specified latest commit");
+                       die(_("--reverse and --first-parent together require specified latest commit"));
        }
 
        /*
@@ -2779,7 +2829,7 @@ parse_done:
                }
 
                if (oidcmp(&c->object.oid, &sb.final->object.oid))
-                       die("--reverse --first-parent together require range along first-parent chain");
+                       die(_("--reverse --first-parent together require range along first-parent chain"));
        }
 
        if (is_null_oid(&sb.final->object.oid)) {
@@ -2790,19 +2840,19 @@ parse_done:
        else {
                o = get_origin(&sb, sb.final, path);
                if (fill_blob_sha1_and_mode(o))
-                       die("no such path %s in %s", path, final_commit_name);
+                       die(_("no such path %s in %s"), path, final_commit_name);
 
                if (DIFF_OPT_TST(&sb.revs->diffopt, ALLOW_TEXTCONV) &&
-                   textconv_object(path, o->mode, o->blob_sha1, 1, (char **) &sb.final_buf,
+                   textconv_object(path, o->mode, &o->blob_oid, 1, (char **) &sb.final_buf,
                                    &sb.final_buf_size))
                        ;
                else
-                       sb.final_buf = read_sha1_file(o->blob_sha1, &type,
+                       sb.final_buf = read_sha1_file(o->blob_oid.hash, &type,
                                                      &sb.final_buf_size);
 
                if (!sb.final_buf)
-                       die("Cannot read blob %s for path %s",
-                           sha1_to_hex(o->blob_sha1),
+                       die(_("cannot read blob %s for path %s"),
+                           oid_to_hex(&o->blob_oid),
                            path);
        }
        num_read_blob++;
@@ -2820,7 +2870,9 @@ parse_done:
                                    &bottom, &top, sb.path))
                        usage(blame_usage);
                if (lno < top || ((lno || bottom) && lno < bottom))
-                       die("file %s has only %lu lines", path, lno);
+                       die(Q_("file %s has only %lu line",
+                              "file %s has only %lu lines",
+                              lno), path, lno);
                if (bottom < 1)
                        bottom = 1;
                if (top < 1)
index 6810c3ac447a3078681c60f1e72bb008e5961bcf..48a513a84dbf6cf2516a10cbcced267369bc747c 100644 (file)
@@ -28,20 +28,21 @@ static const char * const builtin_branch_usage[] = {
        N_("git branch [<options>] [-r] (-d | -D) <branch-name>..."),
        N_("git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"),
        N_("git branch [<options>] [-r | -a] [--points-at]"),
+       N_("git branch [<options>] [-r | -a] [--format]"),
        NULL
 };
 
 static const char *head;
-static unsigned char head_sha1[20];
+static struct object_id head_oid;
 
 static int branch_use_color = -1;
 static char branch_colors[][COLOR_MAXLEN] = {
        GIT_COLOR_RESET,
-       GIT_COLOR_NORMAL,       /* PLAIN */
-       GIT_COLOR_RED,          /* REMOTE */
-       GIT_COLOR_NORMAL,       /* LOCAL */
-       GIT_COLOR_GREEN,        /* CURRENT */
-       GIT_COLOR_BLUE,         /* UPSTREAM */
+       GIT_COLOR_NORMAL,       /* PLAIN */
+       GIT_COLOR_RED,          /* REMOTE */
+       GIT_COLOR_NORMAL,       /* LOCAL */
+       GIT_COLOR_GREEN,        /* CURRENT */
+       GIT_COLOR_BLUE,         /* UPSTREAM */
 };
 enum color_branch {
        BRANCH_COLOR_RESET = 0,
@@ -117,13 +118,13 @@ static int branch_merged(int kind, const char *name,
        if (kind == FILTER_REFS_BRANCHES) {
                struct branch *branch = branch_get(name);
                const char *upstream = branch_get_upstream(branch, NULL);
-               unsigned char sha1[20];
+               struct object_id oid;
 
                if (upstream &&
                    (reference_name = reference_name_to_free =
                     resolve_refdup(upstream, RESOLVE_REF_READING,
-                                   sha1, NULL)) != NULL)
-                       reference_rev = lookup_commit_reference(sha1);
+                                   oid.hash, NULL)) != NULL)
+                       reference_rev = lookup_commit_reference(oid.hash);
        }
        if (!reference_rev)
                reference_rev = head_rev;
@@ -153,10 +154,10 @@ static int branch_merged(int kind, const char *name,
 }
 
 static int check_branch_commit(const char *branchname, const char *refname,
-                              const unsigned char *sha1, struct commit *head_rev,
+                              const struct object_id *oid, struct commit *head_rev,
                               int kinds, int force)
 {
-       struct commit *rev = lookup_commit_reference(sha1);
+       struct commit *rev = lookup_commit_reference(oid->hash);
        if (!rev) {
                error(_("Couldn't look up commit object for '%s'"), refname);
                return -1;
@@ -183,31 +184,34 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                           int quiet)
 {
        struct commit *head_rev = NULL;
-       unsigned char sha1[20];
+       struct object_id oid;
        char *name = NULL;
        const char *fmt;
        int i;
        int ret = 0;
        int remote_branch = 0;
        struct strbuf bname = STRBUF_INIT;
+       unsigned allowed_interpret;
 
        switch (kinds) {
        case FILTER_REFS_REMOTES:
                fmt = "refs/remotes/%s";
                /* For subsequent UI messages */
                remote_branch = 1;
+               allowed_interpret = INTERPRET_BRANCH_REMOTE;
 
                force = 1;
                break;
        case FILTER_REFS_BRANCHES:
                fmt = "refs/heads/%s";
+               allowed_interpret = INTERPRET_BRANCH_LOCAL;
                break;
        default:
                die(_("cannot use -a with -d"));
        }
 
        if (!force) {
-               head_rev = lookup_commit_reference(head_sha1);
+               head_rev = lookup_commit_reference(head_oid.hash);
                if (!head_rev)
                        die(_("Couldn't look up commit object for HEAD"));
        }
@@ -215,7 +219,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                char *target = NULL;
                int flags = 0;
 
-               strbuf_branchname(&bname, argv[i]);
+               strbuf_branchname(&bname, argv[i], allowed_interpret);
                free(name);
                name = mkpathdup(fmt, bname.buf);
 
@@ -235,7 +239,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                                        RESOLVE_REF_READING
                                        | RESOLVE_REF_NO_RECURSE
                                        | RESOLVE_REF_ALLOW_BAD_NAME,
-                                       sha1, &flags);
+                                       oid.hash, &flags);
                if (!target) {
                        error(remote_branch
                              ? _("remote-tracking branch '%s' not found.")
@@ -245,13 +249,13 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                }
 
                if (!(flags & (REF_ISSYMREF|REF_ISBROKEN)) &&
-                   check_branch_commit(bname.buf, name, sha1, head_rev, kinds,
+                   check_branch_commit(bname.buf, name, &oid, head_rev, kinds,
                                        force)) {
                        ret = 1;
                        goto next;
                }
 
-               if (delete_ref(name, is_null_sha1(sha1) ? NULL : sha1,
+               if (delete_ref(NULL, name, is_null_oid(&oid) ? NULL : oid.hash,
                               REF_NODEREF)) {
                        error(remote_branch
                              ? _("Error deleting remote-tracking branch '%s'")
@@ -267,7 +271,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                               bname.buf,
                               (flags & REF_ISBROKEN) ? "broken"
                               : (flags & REF_ISSYMREF) ? target
-                              : find_unique_abbrev(sha1, DEFAULT_ABBREV));
+                              : find_unique_abbrev(oid.hash, DEFAULT_ABBREV));
                }
                delete_branch_config(bname.buf);
 
@@ -280,221 +284,109 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
        return(ret);
 }
 
-static void fill_tracking_info(struct strbuf *stat, const char *branch_name,
-               int show_upstream_ref)
+static int calc_maxwidth(struct ref_array *refs, int remote_bonus)
 {
-       int ours, theirs;
-       char *ref = NULL;
-       struct branch *branch = branch_get(branch_name);
-       const char *upstream;
-       struct strbuf fancy = STRBUF_INIT;
-       int upstream_is_gone = 0;
-       int added_decoration = 1;
-
-       if (stat_tracking_info(branch, &ours, &theirs, &upstream) < 0) {
-               if (!upstream)
-                       return;
-               upstream_is_gone = 1;
-       }
-
-       if (show_upstream_ref) {
-               ref = shorten_unambiguous_ref(upstream, 0);
-               if (want_color(branch_use_color))
-                       strbuf_addf(&fancy, "%s%s%s",
-                                       branch_get_color(BRANCH_COLOR_UPSTREAM),
-                                       ref, branch_get_color(BRANCH_COLOR_RESET));
-               else
-                       strbuf_addstr(&fancy, ref);
-       }
+       int i, max = 0;
+       for (i = 0; i < refs->nr; i++) {
+               struct ref_array_item *it = refs->items[i];
+               const char *desc = it->refname;
+               int w;
 
-       if (upstream_is_gone) {
-               if (show_upstream_ref)
-                       strbuf_addf(stat, _("[%s: gone]"), fancy.buf);
-               else
-                       added_decoration = 0;
-       } else if (!ours && !theirs) {
-               if (show_upstream_ref)
-                       strbuf_addf(stat, _("[%s]"), fancy.buf);
-               else
-                       added_decoration = 0;
-       } else if (!ours) {
-               if (show_upstream_ref)
-                       strbuf_addf(stat, _("[%s: behind %d]"), fancy.buf, theirs);
-               else
-                       strbuf_addf(stat, _("[behind %d]"), theirs);
+               skip_prefix(it->refname, "refs/heads/", &desc);
+               skip_prefix(it->refname, "refs/remotes/", &desc);
+               if (it->kind == FILTER_REFS_DETACHED_HEAD) {
+                       char *head_desc = get_head_description();
+                       w = utf8_strwidth(head_desc);
+                       free(head_desc);
+               } else
+                       w = utf8_strwidth(desc);
 
-       } else if (!theirs) {
-               if (show_upstream_ref)
-                       strbuf_addf(stat, _("[%s: ahead %d]"), fancy.buf, ours);
-               else
-                       strbuf_addf(stat, _("[ahead %d]"), ours);
-       } else {
-               if (show_upstream_ref)
-                       strbuf_addf(stat, _("[%s: ahead %d, behind %d]"),
-                                   fancy.buf, ours, theirs);
-               else
-                       strbuf_addf(stat, _("[ahead %d, behind %d]"),
-                                   ours, theirs);
+               if (it->kind == FILTER_REFS_REMOTES)
+                       w += remote_bonus;
+               if (w > max)
+                       max = w;
        }
-       strbuf_release(&fancy);
-       if (added_decoration)
-               strbuf_addch(stat, ' ');
-       free(ref);
+       return max;
 }
 
-static void add_verbose_info(struct strbuf *out, struct ref_array_item *item,
-                            struct ref_filter *filter, const char *refname)
+static const char *quote_literal_for_format(const char *s)
 {
-       struct strbuf subject = STRBUF_INIT, stat = STRBUF_INIT;
-       const char *sub = _(" **** invalid ref ****");
-       struct commit *commit = item->commit;
+       static struct strbuf buf = STRBUF_INIT;
 
-       if (!parse_commit(commit)) {
-               pp_commit_easy(CMIT_FMT_ONELINE, commit, &subject);
-               sub = subject.buf;
+       strbuf_reset(&buf);
+       while (*s) {
+               const char *ep = strchrnul(s, '%');
+               if (s < ep)
+                       strbuf_add(&buf, s, ep - s);
+               if (*ep == '%') {
+                       strbuf_addstr(&buf, "%%");
+                       s = ep + 1;
+               } else {
+                       s = ep;
+               }
        }
-
-       if (item->kind == FILTER_REFS_BRANCHES)
-               fill_tracking_info(&stat, refname, filter->verbose > 1);
-
-       strbuf_addf(out, " %s %s%s",
-               find_unique_abbrev(item->commit->object.oid.hash, filter->abbrev),
-               stat.buf, sub);
-       strbuf_release(&stat);
-       strbuf_release(&subject);
+       return buf.buf;
 }
 
-static char *get_head_description(void)
+static char *build_format(struct ref_filter *filter, int maxwidth, const char *remote_prefix)
 {
-       struct strbuf desc = STRBUF_INIT;
-       struct wt_status_state state;
-       memset(&state, 0, sizeof(state));
-       wt_status_get_state(&state, 1);
-       if (state.rebase_in_progress ||
-           state.rebase_interactive_in_progress)
-               strbuf_addf(&desc, _("(no branch, rebasing %s)"),
-                           state.branch);
-       else if (state.bisect_in_progress)
-               strbuf_addf(&desc, _("(no branch, bisect started on %s)"),
-                           state.branch);
-       else if (state.detached_from) {
-               if (state.detached_at)
-                       /* TRANSLATORS: make sure this matches
-                          "HEAD detached at " in wt-status.c */
-                       strbuf_addf(&desc, _("(HEAD detached at %s)"),
-                               state.detached_from);
-               else
-                       /* TRANSLATORS: make sure this matches
-                          "HEAD detached from " in wt-status.c */
-                       strbuf_addf(&desc, _("(HEAD detached from %s)"),
-                               state.detached_from);
-       }
-       else
-               strbuf_addstr(&desc, _("(no branch)"));
-       free(state.branch);
-       free(state.onto);
-       free(state.detached_from);
-       return strbuf_detach(&desc, NULL);
-}
+       struct strbuf fmt = STRBUF_INIT;
+       struct strbuf local = STRBUF_INIT;
+       struct strbuf remote = STRBUF_INIT;
 
-static void format_and_print_ref_item(struct ref_array_item *item, int maxwidth,
-                                     struct ref_filter *filter, const char *remote_prefix)
-{
-       char c;
-       int current = 0;
-       int color;
-       struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
-       const char *prefix_to_show = "";
-       const char *prefix_to_skip = NULL;
-       const char *desc = item->refname;
-       char *to_free = NULL;
+       strbuf_addf(&fmt, "%%(if)%%(HEAD)%%(then)* %s%%(else)  %%(end)",
+                   branch_get_color(BRANCH_COLOR_CURRENT));
 
-       switch (item->kind) {
-       case FILTER_REFS_BRANCHES:
-               prefix_to_skip = "refs/heads/";
-               skip_prefix(desc, prefix_to_skip, &desc);
-               if (!filter->detached && !strcmp(desc, head))
-                       current = 1;
+       if (filter->verbose) {
+               struct strbuf obname = STRBUF_INIT;
+
+               if (filter->abbrev < 0)
+                       strbuf_addf(&obname, "%%(objectname:short)");
+               else if (!filter->abbrev)
+                       strbuf_addf(&obname, "%%(objectname)");
                else
-                       color = BRANCH_COLOR_LOCAL;
-               break;
-       case FILTER_REFS_REMOTES:
-               prefix_to_skip = "refs/remotes/";
-               skip_prefix(desc, prefix_to_skip, &desc);
-               color = BRANCH_COLOR_REMOTE;
-               prefix_to_show = remote_prefix;
-               break;
-       case FILTER_REFS_DETACHED_HEAD:
-               desc = to_free = get_head_description();
-               current = 1;
-               break;
-       default:
-               color = BRANCH_COLOR_PLAIN;
-               break;
-       }
+                       strbuf_addf(&obname, "%%(objectname:short=%d)", filter->abbrev);
 
-       c = ' ';
-       if (current) {
-               c = '*';
-               color = BRANCH_COLOR_CURRENT;
-       }
+               strbuf_addf(&local, "%%(align:%d,left)%%(refname:lstrip=2)%%(end)", maxwidth);
+               strbuf_addf(&local, "%s", branch_get_color(BRANCH_COLOR_RESET));
+               strbuf_addf(&local, " %s ", obname.buf);
 
-       strbuf_addf(&name, "%s%s", prefix_to_show, desc);
-       if (filter->verbose) {
-               int utf8_compensation = strlen(name.buf) - utf8_strwidth(name.buf);
-               strbuf_addf(&out, "%c %s%-*s%s", c, branch_get_color(color),
-                           maxwidth + utf8_compensation, name.buf,
-                           branch_get_color(BRANCH_COLOR_RESET));
-       } else
-               strbuf_addf(&out, "%c %s%s%s", c, branch_get_color(color),
-                           name.buf, branch_get_color(BRANCH_COLOR_RESET));
-
-       if (item->symref) {
-               const char *symref = item->symref;
-               if (prefix_to_skip)
-                       skip_prefix(symref, prefix_to_skip, &symref);
-               strbuf_addf(&out, " -> %s", symref);
-       }
-       else if (filter->verbose)
-               /* " f7c0c00 [ahead 58, behind 197] vcs-svn: drop obj_pool.h" */
-               add_verbose_info(&out, item, filter, desc);
-       if (column_active(colopts)) {
-               assert(!filter->verbose && "--column and --verbose are incompatible");
-               string_list_append(&output, out.buf);
+               if (filter->verbose > 1)
+                       strbuf_addf(&local, "%%(if)%%(upstream)%%(then)[%s%%(upstream:short)%s%%(if)%%(upstream:track)"
+                                   "%%(then): %%(upstream:track,nobracket)%%(end)] %%(end)%%(contents:subject)",
+                                   branch_get_color(BRANCH_COLOR_UPSTREAM), branch_get_color(BRANCH_COLOR_RESET));
+               else
+                       strbuf_addf(&local, "%%(if)%%(upstream:track)%%(then)%%(upstream:track) %%(end)%%(contents:subject)");
+
+               strbuf_addf(&remote, "%s%%(align:%d,left)%s%%(refname:lstrip=2)%%(end)%s"
+                           "%%(if)%%(symref)%%(then) -> %%(symref:short)"
+                           "%%(else) %s %%(contents:subject)%%(end)",
+                           branch_get_color(BRANCH_COLOR_REMOTE), maxwidth, quote_literal_for_format(remote_prefix),
+                           branch_get_color(BRANCH_COLOR_RESET), obname.buf);
+               strbuf_release(&obname);
        } else {
-               printf("%s\n", out.buf);
+               strbuf_addf(&local, "%%(refname:lstrip=2)%s%%(if)%%(symref)%%(then) -> %%(symref:short)%%(end)",
+                           branch_get_color(BRANCH_COLOR_RESET));
+               strbuf_addf(&remote, "%s%s%%(refname:lstrip=2)%s%%(if)%%(symref)%%(then) -> %%(symref:short)%%(end)",
+                           branch_get_color(BRANCH_COLOR_REMOTE), quote_literal_for_format(remote_prefix),
+                           branch_get_color(BRANCH_COLOR_RESET));
        }
-       strbuf_release(&name);
-       strbuf_release(&out);
-       free(to_free);
-}
 
-static int calc_maxwidth(struct ref_array *refs, int remote_bonus)
-{
-       int i, max = 0;
-       for (i = 0; i < refs->nr; i++) {
-               struct ref_array_item *it = refs->items[i];
-               const char *desc = it->refname;
-               int w;
-
-               skip_prefix(it->refname, "refs/heads/", &desc);
-               skip_prefix(it->refname, "refs/remotes/", &desc);
-               w = utf8_strwidth(desc);
+       strbuf_addf(&fmt, "%%(if:notequals=refs/remotes)%%(refname:rstrip=-2)%%(then)%s%%(else)%s%%(end)", local.buf, remote.buf);
 
-               if (it->kind == FILTER_REFS_REMOTES)
-                       w += remote_bonus;
-               if (w > max)
-                       max = w;
-       }
-       return max;
+       strbuf_release(&local);
+       strbuf_release(&remote);
+       return strbuf_detach(&fmt, NULL);
 }
 
-static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting)
+static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting, const char *format)
 {
        int i;
        struct ref_array array;
        int maxwidth = 0;
        const char *remote_prefix = "";
+       struct strbuf out = STRBUF_INIT;
+       char *to_free = NULL;
 
        /*
         * If we are listing more than just remote branches,
@@ -506,32 +398,37 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
 
        memset(&array, 0, sizeof(array));
 
-       verify_ref_format("%(refname)%(symref)");
        filter_refs(&array, filter, filter->kind | FILTER_REFS_INCLUDE_BROKEN);
 
        if (filter->verbose)
                maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
 
-       /*
-        * If no sorting parameter is given then we default to sorting
-        * by 'refname'. This would give us an alphabetically sorted
-        * array with the 'HEAD' ref at the beginning followed by
-        * local branches 'refs/heads/...' and finally remote-tacking
-        * branches 'refs/remotes/...'.
-        */
-       if (!sorting)
-               sorting = ref_default_sorting();
+       if (!format)
+               format = to_free = build_format(filter, maxwidth, remote_prefix);
+       verify_ref_format(format);
+
        ref_array_sort(sorting, &array);
 
-       for (i = 0; i < array.nr; i++)
-               format_and_print_ref_item(array.items[i], maxwidth, filter, remote_prefix);
+       for (i = 0; i < array.nr; i++) {
+               format_ref_array_item(array.items[i], format, 0, &out);
+               if (column_active(colopts)) {
+                       assert(!filter->verbose && "--column and --verbose are incompatible");
+                        /* format to a string_list to let print_columns() do its job */
+                       string_list_append(&output, out.buf);
+               } else {
+                       fwrite(out.buf, 1, out.len, stdout);
+                       putchar('\n');
+               }
+               strbuf_release(&out);
+       }
 
        ref_array_clear(&array);
+       free(to_free);
 }
 
 static void reject_rebase_or_bisect_branch(const char *target)
 {
-       struct worktree **worktrees = get_worktrees();
+       struct worktree **worktrees = get_worktrees(0);
        int i;
 
        for (i = 0; worktrees[i]; i++) {
@@ -588,14 +485,15 @@ static void rename_branch(const char *oldname, const char *newname, int force)
 
        if (rename_ref(oldref.buf, newref.buf, logmsg.buf))
                die(_("Branch rename failed"));
-       strbuf_release(&logmsg);
 
        if (recovery)
                warning(_("Renamed a misnamed branch '%s' away"), oldref.buf + 11);
 
-       if (replace_each_worktree_head_symref(oldref.buf, newref.buf))
+       if (replace_each_worktree_head_symref(oldref.buf, newref.buf, logmsg.buf))
                die(_("Branch renamed to %s, but HEAD is not updated!"), newname);
 
+       strbuf_release(&logmsg);
+
        strbuf_addf(&oldsection, "branch.%s", oldref.buf + 11);
        strbuf_release(&oldref);
        strbuf_addf(&newsection, "branch.%s", newref.buf + 11);
@@ -606,7 +504,7 @@ static void rename_branch(const char *oldname, const char *newname, int force)
        strbuf_release(&newsection);
 }
 
-static const char edit_description[] = "BRANCH_DESCRIPTION";
+static GIT_PATH_FUNC(edit_description, "EDIT_DESCRIPTION")
 
 static int edit_branch_description(const char *branch_name)
 {
@@ -621,9 +519,9 @@ static int edit_branch_description(const char *branch_name)
                      "  %s\n"
                      "Lines starting with '%c' will be stripped.\n"),
                    branch_name, comment_line_char);
-       write_file_buf(git_path(edit_description), buf.buf, buf.len);
+       write_file_buf(edit_description(), buf.buf, buf.len);
        strbuf_reset(&buf);
-       if (launch_editor(git_path(edit_description), &buf, NULL)) {
+       if (launch_editor(edit_description(), &buf, NULL)) {
                strbuf_release(&buf);
                return -1;
        }
@@ -645,7 +543,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
        const char *new_upstream = NULL;
        enum branch_track track;
        struct ref_filter filter;
+       int icase = 0;
        static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
+       const char *format = NULL;
 
        struct option options[] = {
                OPT_GROUP(N_("Generic options")),
@@ -657,12 +557,14 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                OPT_SET_INT( 0, "set-upstream",  &track, N_("change upstream info"),
                        BRANCH_TRACK_OVERRIDE),
                OPT_STRING('u', "set-upstream-to", &new_upstream, N_("upstream"), N_("change the upstream info")),
-               OPT_BOOL(0, "unset-upstream", &unset_upstream, "Unset the upstream info"),
+               OPT_BOOL(0, "unset-upstream", &unset_upstream, N_("Unset the upstream info")),
                OPT__COLOR(&branch_use_color, N_("use colored output")),
                OPT_SET_INT('r', "remotes",     &filter.kind, N_("act on remote-tracking branches"),
                        FILTER_REFS_REMOTES),
                OPT_CONTAINS(&filter.with_commit, N_("print only branches that contain the commit")),
+               OPT_NO_CONTAINS(&filter.no_commit, N_("print only branches that don't contain the commit")),
                OPT_WITH(&filter.with_commit, N_("print only branches that contain the commit")),
+               OPT_WITHOUT(&filter.no_commit, N_("print only branches that don't contain the commit")),
                OPT__ABBREV(&filter.abbrev),
 
                OPT_GROUP(N_("Specific git-branch actions:")),
@@ -686,9 +588,13 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                        OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
                        N_("print only branches of the object"), 0, parse_opt_object_name
                },
+               OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
+               OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
                OPT_END(),
        };
 
+       setup_ref_filter_porcelain_msg();
+
        memset(&filter, 0, sizeof(filter));
        filter.kind = FILTER_REFS_BRANCHES;
        filter.abbrev = -1;
@@ -700,7 +606,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 
        track = git_branch_track;
 
-       head = resolve_refdup("HEAD", 0, head_sha1, NULL);
+       head = resolve_refdup("HEAD", 0, head_oid.hash, NULL);
        if (!head)
                die(_("Failed to resolve HEAD as a valid ref."));
        if (!strcmp(head, "HEAD"))
@@ -714,7 +620,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
        if (!delete && !rename && !edit_description && !new_upstream && !unset_upstream && argc == 0)
                list = 1;
 
-       if (filter.with_commit || filter.merge != REF_FILTER_MERGED_NONE || filter.points_at.nr)
+       if (filter.with_commit || filter.merge != REF_FILTER_MERGED_NONE || filter.points_at.nr ||
+           filter.no_commit)
                list = 1;
 
        if (!!delete + !!rename + !!new_upstream +
@@ -723,6 +630,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 
        if (filter.abbrev == -1)
                filter.abbrev = DEFAULT_ABBREV;
+       filter.ignore_case = icase;
+
        finalize_colopts(&colopts, -1);
        if (filter.verbose) {
                if (explicitly_enable_column(colopts))
@@ -744,7 +653,17 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                if ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)
                        filter.kind |= FILTER_REFS_DETACHED_HEAD;
                filter.name_patterns = argv;
-               print_ref_list(&filter, sorting);
+               /*
+                * If no sorting parameter is given then we default to sorting
+                * by 'refname'. This would give us an alphabetically sorted
+                * array with the 'HEAD' ref at the beginning followed by
+                * local branches 'refs/heads/...' and finally remote-tacking
+                * branches 'refs/remotes/...'.
+                */
+               if (!sorting)
+                       sorting = ref_default_sorting();
+               sorting->ignore_case = icase;
+               print_ref_list(&filter, sorting, format);
                print_columns(&output, colopts, NULL);
                string_list_clear(&output, 0);
                return 0;
index 4883a435a9afc607618d34c9b61b218eeda7de45..d0de59b94ff23eebe03984dc670babf793bdd5ff 100644 (file)
@@ -20,21 +20,15 @@ int cmd_bundle(int argc, const char **argv, const char *prefix)
        struct bundle_header header;
        const char *cmd, *bundle_file;
        int bundle_fd = -1;
-       char buffer[PATH_MAX];
 
        if (argc < 3)
                usage(builtin_bundle_usage);
 
        cmd = argv[1];
-       bundle_file = argv[2];
+       bundle_file = prefix_filename(prefix, argv[2]);
        argc -= 2;
        argv += 2;
 
-       if (prefix && bundle_file[0] != '/') {
-               snprintf(buffer, sizeof(buffer), "%s/%s", prefix, bundle_file);
-               bundle_file = buffer;
-       }
-
        memset(&header, 0, sizeof(header));
        if (strcmp(cmd, "create") && (bundle_fd =
                                read_bundle_header(bundle_file, &header)) < 0)
index 560f6c2cc72b8f489c7f113601b464f44b6e395a..73c81f0cb1ae34169667adc7ee7fc246468e08a4 100644 (file)
@@ -17,32 +17,64 @@ struct batch_options {
        int print_contents;
        int buffer_output;
        int all_objects;
+       int cmdmode; /* may be 'w' or 'c' for --filters or --textconv */
        const char *format;
 };
 
+static const char *force_path;
+
+static int filter_object(const char *path, unsigned mode,
+                        const struct object_id *oid,
+                        char **buf, unsigned long *size)
+{
+       enum object_type type;
+
+       *buf = read_sha1_file(oid->hash, &type, size);
+       if (!*buf)
+               return error(_("cannot read object %s '%s'"),
+                            oid_to_hex(oid), path);
+       if ((type == OBJ_BLOB) && S_ISREG(mode)) {
+               struct strbuf strbuf = STRBUF_INIT;
+               if (convert_to_working_tree(path, *buf, *size, &strbuf)) {
+                       free(*buf);
+                       *size = strbuf.len;
+                       *buf = strbuf_detach(&strbuf, NULL);
+               }
+       }
+
+       return 0;
+}
+
 static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
                        int unknown_type)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
        enum object_type type;
        char *buf;
        unsigned long size;
        struct object_context obj_context;
-       struct object_info oi = {NULL};
+       struct object_info oi = OBJECT_INFO_INIT;
        struct strbuf sb = STRBUF_INIT;
        unsigned flags = LOOKUP_REPLACE_OBJECT;
+       const char *path = force_path;
 
        if (unknown_type)
                flags |= LOOKUP_UNKNOWN_OBJECT;
 
-       if (get_sha1_with_context(obj_name, 0, sha1, &obj_context))
+       if (get_sha1_with_context(obj_name, GET_SHA1_RECORD_PATH,
+                                 oid.hash, &obj_context))
                die("Not a valid object name %s", obj_name);
 
+       if (!path)
+               path = obj_context.path;
+       if (obj_context.mode == S_IFINVALID)
+               obj_context.mode = 0100644;
+
        buf = NULL;
        switch (opt) {
        case 't':
                oi.typename = &sb;
-               if (sha1_object_info_extended(sha1, &oi, flags) < 0)
+               if (sha1_object_info_extended(oid.hash, &oi, flags) < 0)
                        die("git cat-file: could not get object info");
                if (sb.len) {
                        printf("%s\n", sb.buf);
@@ -53,24 +85,34 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
 
        case 's':
                oi.sizep = &size;
-               if (sha1_object_info_extended(sha1, &oi, flags) < 0)
+               if (sha1_object_info_extended(oid.hash, &oi, flags) < 0)
                        die("git cat-file: could not get object info");
                printf("%lu\n", size);
                return 0;
 
        case 'e':
-               return !has_sha1_file(sha1);
+               return !has_object_file(&oid);
+
+       case 'w':
+               if (!path[0])
+                       die("git cat-file --filters %s: <object> must be "
+                           "<sha1:path>", obj_name);
+
+               if (filter_object(path, obj_context.mode,
+                                 &oid, &buf, &size))
+                       return -1;
+               break;
 
        case 'c':
-               if (!obj_context.path[0])
+               if (!path[0])
                        die("git cat-file --textconv %s: <object> must be <sha1:path>",
                            obj_name);
 
-               if (textconv_object(obj_context.path, obj_context.mode, sha1, 1, &buf, &size))
+               if (textconv_object(path, obj_context.mode, &oid, 1, &buf, &size))
                        break;
 
        case 'p':
-               type = sha1_object_info(sha1, NULL);
+               type = sha1_object_info(oid.hash, NULL);
                if (type < 0)
                        die("Not a valid object name %s", obj_name);
 
@@ -83,8 +125,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
                }
 
                if (type == OBJ_BLOB)
-                       return stream_blob_to_fd(1, sha1, NULL, 0);
-               buf = read_sha1_file(sha1, &type, &size);
+                       return stream_blob_to_fd(1, &oid, NULL, 0);
+               buf = read_sha1_file(oid.hash, &type, &size);
                if (!buf)
                        die("Cannot read object %s", obj_name);
 
@@ -93,19 +135,19 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
 
        case 0:
                if (type_from_string(exp_type) == OBJ_BLOB) {
-                       unsigned char blob_sha1[20];
-                       if (sha1_object_info(sha1, NULL) == OBJ_TAG) {
-                               char *buffer = read_sha1_file(sha1, &type, &size);
+                       struct object_id blob_oid;
+                       if (sha1_object_info(oid.hash, NULL) == OBJ_TAG) {
+                               char *buffer = read_sha1_file(oid.hash, &type, &size);
                                const char *target;
                                if (!skip_prefix(buffer, "object ", &target) ||
-                                   get_sha1_hex(target, blob_sha1))
-                                       die("%s not a valid tag", sha1_to_hex(sha1));
+                                   get_oid_hex(target, &blob_oid))
+                                       die("%s not a valid tag", oid_to_hex(&oid));
                                free(buffer);
                        } else
-                               hashcpy(blob_sha1, sha1);
+                               oidcpy(&blob_oid, &oid);
 
-                       if (sha1_object_info(blob_sha1, NULL) == OBJ_BLOB)
-                               return stream_blob_to_fd(1, blob_sha1, NULL, 0);
+                       if (sha1_object_info(blob_oid.hash, NULL) == OBJ_BLOB)
+                               return stream_blob_to_fd(1, &blob_oid, NULL, 0);
                        /*
                         * we attempted to dereference a tag to a blob
                         * and failed; there may be new dereference
@@ -113,7 +155,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
                         * fall-back to the usual case.
                         */
                }
-               buf = read_object_with_reference(sha1, exp_type, &size, NULL);
+               buf = read_object_with_reference(oid.hash, exp_type, &size, NULL);
                break;
 
        default:
@@ -124,16 +166,18 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
                die("git cat-file %s: bad file", obj_name);
 
        write_or_die(1, buf, size);
+       free(buf);
+       free(obj_context.path);
        return 0;
 }
 
 struct expand_data {
-       unsigned char sha1[20];
+       struct object_id oid;
        enum object_type type;
        unsigned long size;
        off_t disk_size;
        const char *rest;
-       unsigned char delta_base_sha1[20];
+       struct object_id delta_base_oid;
 
        /*
         * If mark_query is true, we do not expand anything, but rather
@@ -176,7 +220,7 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
 
        if (is_atom("objectname", atom, len)) {
                if (!data->mark_query)
-                       strbuf_addstr(sb, sha1_to_hex(data->sha1));
+                       strbuf_addstr(sb, oid_to_hex(&data->oid));
        } else if (is_atom("objecttype", atom, len)) {
                if (data->mark_query)
                        data->info.typep = &data->type;
@@ -199,9 +243,10 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
                        strbuf_addstr(sb, data->rest);
        } else if (is_atom("deltabase", atom, len)) {
                if (data->mark_query)
-                       data->info.delta_base_sha1 = data->delta_base_sha1;
+                       data->info.delta_base_sha1 = data->delta_base_oid.hash;
                else
-                       strbuf_addstr(sb, sha1_to_hex(data->delta_base_sha1));
+                       strbuf_addstr(sb,
+                                     oid_to_hex(&data->delta_base_oid));
        } else
                die("unknown format element: %.*s", len, atom);
 }
@@ -232,28 +277,53 @@ static void batch_write(struct batch_options *opt, const void *data, int len)
 
 static void print_object_or_die(struct batch_options *opt, struct expand_data *data)
 {
-       const unsigned char *sha1 = data->sha1;
+       const struct object_id *oid = &data->oid;
 
        assert(data->info.typep);
 
        if (data->type == OBJ_BLOB) {
                if (opt->buffer_output)
                        fflush(stdout);
-               if (stream_blob_to_fd(1, sha1, NULL, 0) < 0)
-                       die("unable to stream %s to stdout", sha1_to_hex(sha1));
+               if (opt->cmdmode) {
+                       char *contents;
+                       unsigned long size;
+
+                       if (!data->rest)
+                               die("missing path for '%s'", oid_to_hex(oid));
+
+                       if (opt->cmdmode == 'w') {
+                               if (filter_object(data->rest, 0100644, oid,
+                                                 &contents, &size))
+                                       die("could not convert '%s' %s",
+                                           oid_to_hex(oid), data->rest);
+                       } else if (opt->cmdmode == 'c') {
+                               enum object_type type;
+                               if (!textconv_object(data->rest, 0100644, oid,
+                                                    1, &contents, &size))
+                                       contents = read_sha1_file(oid->hash, &type,
+                                                                 &size);
+                               if (!contents)
+                                       die("could not convert '%s' %s",
+                                           oid_to_hex(oid), data->rest);
+                       } else
+                               die("BUG: invalid cmdmode: %c", opt->cmdmode);
+                       batch_write(opt, contents, size);
+                       free(contents);
+               } else if (stream_blob_to_fd(1, oid, NULL, 0) < 0)
+                       die("unable to stream %s to stdout", oid_to_hex(oid));
        }
        else {
                enum object_type type;
                unsigned long size;
                void *contents;
 
-               contents = read_sha1_file(sha1, &type, &size);
+               contents = read_sha1_file(oid->hash, &type, &size);
                if (!contents)
-                       die("object %s disappeared", sha1_to_hex(sha1));
+                       die("object %s disappeared", oid_to_hex(oid));
                if (type != data->type)
-                       die("object %s changed type!?", sha1_to_hex(sha1));
+                       die("object %s changed type!?", oid_to_hex(oid));
                if (data->info.sizep && size != data->size)
-                       die("object %s changed size!?", sha1_to_hex(sha1));
+                       die("object %s changed size!?", oid_to_hex(oid));
 
                batch_write(opt, contents, size);
                free(contents);
@@ -266,8 +336,9 @@ static void batch_object_write(const char *obj_name, struct batch_options *opt,
        struct strbuf buf = STRBUF_INIT;
 
        if (!data->skip_object_info &&
-           sha1_object_info_extended(data->sha1, &data->info, LOOKUP_REPLACE_OBJECT) < 0) {
-               printf("%s missing\n", obj_name ? obj_name : sha1_to_hex(data->sha1));
+           sha1_object_info_extended(data->oid.hash, &data->info, LOOKUP_REPLACE_OBJECT) < 0) {
+               printf("%s missing\n",
+                      obj_name ? obj_name : oid_to_hex(&data->oid));
                fflush(stdout);
                return;
        }
@@ -290,7 +361,7 @@ static void batch_one_object(const char *obj_name, struct batch_options *opt,
        int flags = opt->follow_symlinks ? GET_SHA1_FOLLOW_SYMLINKS : 0;
        enum follow_symlinks_result result;
 
-       result = get_sha1_with_context(obj_name, flags, data->sha1, &ctx);
+       result = get_sha1_with_context(obj_name, flags, data->oid.hash, &ctx);
        if (result != FOUND) {
                switch (result) {
                case MISSING_OBJECT:
@@ -333,27 +404,28 @@ struct object_cb_data {
        struct expand_data *expand;
 };
 
-static void batch_object_cb(const unsigned char sha1[20], void *vdata)
+static int batch_object_cb(const struct object_id *oid, void *vdata)
 {
        struct object_cb_data *data = vdata;
-       hashcpy(data->expand->sha1, sha1);
+       oidcpy(&data->expand->oid, oid);
        batch_object_write(NULL, data->opt, data->expand);
+       return 0;
 }
 
-static int batch_loose_object(const unsigned char *sha1,
+static int batch_loose_object(const struct object_id *oid,
                              const char *path,
                              void *data)
 {
-       sha1_array_append(data, sha1);
+       oid_array_append(data, oid);
        return 0;
 }
 
-static int batch_packed_object(const unsigned char *sha1,
+static int batch_packed_object(const struct object_id *oid,
                               struct packed_git *pack,
                               uint32_t pos,
                               void *data)
 {
-       sha1_array_append(data, sha1);
+       oid_array_append(data, oid);
        return 0;
 }
 
@@ -376,10 +448,11 @@ static int batch_objects(struct batch_options *opt)
        data.mark_query = 1;
        strbuf_expand(&buf, opt->format, expand_format, &data);
        data.mark_query = 0;
+       if (opt->cmdmode)
+               data.split_on_whitespace = 1;
 
        if (opt->all_objects) {
-               struct object_info empty;
-               memset(&empty, 0, sizeof(empty));
+               struct object_info empty = OBJECT_INFO_INIT;
                if (!memcmp(&data.info, &empty, sizeof(empty)))
                        data.skip_object_info = 1;
        }
@@ -392,7 +465,7 @@ static int batch_objects(struct batch_options *opt)
                data.info.typep = &data.type;
 
        if (opt->all_objects) {
-               struct sha1_array sa = SHA1_ARRAY_INIT;
+               struct oid_array sa = OID_ARRAY_INIT;
                struct object_cb_data cb;
 
                for_each_loose_object(batch_loose_object, &sa, 0);
@@ -400,9 +473,9 @@ static int batch_objects(struct batch_options *opt)
 
                cb.opt = opt;
                cb.expand = &data;
-               sha1_array_for_each_unique(&sa, batch_object_cb, &cb);
+               oid_array_for_each_unique(&sa, batch_object_cb, &cb);
 
-               sha1_array_clear(&sa);
+               oid_array_clear(&sa);
                return 0;
        }
 
@@ -440,8 +513,8 @@ static int batch_objects(struct batch_options *opt)
 }
 
 static const char * const cat_file_usage[] = {
-       N_("git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <type> | --textconv) <object>"),
-       N_("git cat-file (--batch | --batch-check) [--follow-symlinks]"),
+       N_("git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <type> | --textconv | --filters) [--path=<path>] <object>"),
+       N_("git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --filters]"),
        NULL
 };
 
@@ -486,6 +559,10 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
                OPT_CMDMODE('p', NULL, &opt, N_("pretty-print object's content"), 'p'),
                OPT_CMDMODE(0, "textconv", &opt,
                            N_("for blob objects, run textconv on object's content"), 'c'),
+               OPT_CMDMODE(0, "filters", &opt,
+                           N_("for blob objects, run filters on object's content"), 'w'),
+               OPT_STRING(0, "path", &force_path, N_("blob"),
+                          N_("use a specific path for --textconv/--filters")),
                OPT_BOOL(0, "allow-unknown-type", &unknown_type,
                          N_("allow -s and -t to work with broken/corrupt objects")),
                OPT_BOOL(0, "buffer", &batch.buffer_output, N_("buffer --batch output")),
@@ -508,7 +585,9 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, prefix, options, cat_file_usage, 0);
 
        if (opt) {
-               if (argc == 1)
+               if (batch.enabled && (opt == 'c' || opt == 'w'))
+                       batch.cmdmode = opt;
+               else if (argc == 1)
                        obj_name = argv[0];
                else
                        usage_with_options(cat_file_usage, options);
@@ -520,14 +599,28 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
                } else
                        usage_with_options(cat_file_usage, options);
        }
-       if (batch.enabled && (opt || argc)) {
-               usage_with_options(cat_file_usage, options);
+       if (batch.enabled) {
+               if (batch.cmdmode != opt || argc)
+                       usage_with_options(cat_file_usage, options);
+               if (batch.cmdmode && batch.all_objects)
+                       die("--batch-all-objects cannot be combined with "
+                           "--textconv nor with --filters");
        }
 
        if ((batch.follow_symlinks || batch.all_objects) && !batch.enabled) {
                usage_with_options(cat_file_usage, options);
        }
 
+       if (force_path && opt != 'c' && opt != 'w') {
+               error("--path=<path> needs --textconv or --filters");
+               usage_with_options(cat_file_usage, options);
+       }
+
+       if (force_path && batch.enabled) {
+               error("--path=<path> incompatible with --batch");
+               usage_with_options(cat_file_usage, options);
+       }
+
        if (batch.buffer_output < 0)
                batch.buffer_output = batch.all_objects;
 
index 53a5a18c1681f5f13f6ddd4fd4d7d30c0ea14ce6..4d01ca0c8ba0ba2a1d2c209b766e19d9ca9c8ac0 100644 (file)
@@ -24,12 +24,13 @@ static const struct option check_attr_options[] = {
        OPT_END()
 };
 
-static void output_attr(int cnt, struct git_attr_check *check,
-       const char *file)
+static void output_attr(struct attr_check *check, const char *file)
 {
        int j;
+       int cnt = check->nr;
+
        for (j = 0; j < cnt; j++) {
-               const char *value = check[j].value;
+               const char *value = check->items[j].value;
 
                if (ATTR_TRUE(value))
                        value = "set";
@@ -42,35 +43,38 @@ static void output_attr(int cnt, struct git_attr_check *check,
                        printf("%s%c" /* path */
                               "%s%c" /* attrname */
                               "%s%c" /* attrvalue */,
-                              file, 0, git_attr_name(check[j].attr), 0, value, 0);
+                              file, 0,
+                              git_attr_name(check->items[j].attr), 0, value, 0);
                } else {
                        quote_c_style(file, NULL, stdout, 0);
-                       printf(": %s: %s\n", git_attr_name(check[j].attr), value);
+                       printf(": %s: %s\n",
+                              git_attr_name(check->items[j].attr), value);
                }
-
        }
 }
 
-static void check_attr(const char *prefix, int cnt,
-       struct git_attr_check *check, const char *file)
+static void check_attr(const char *prefix,
+                      struct attr_check *check,
+                      int collect_all,
+                      const char *file)
 {
        char *full_path =
                prefix_path(prefix, prefix ? strlen(prefix) : 0, file);
-       if (check != NULL) {
-               if (git_check_attr(full_path, cnt, check))
-                       die("git_check_attr died");
-               output_attr(cnt, check, file);
+
+       if (collect_all) {
+               git_all_attrs(full_path, check);
        } else {
-               if (git_all_attrs(full_path, &cnt, &check))
-                       die("git_all_attrs died");
-               output_attr(cnt, check, file);
-               free(check);
+               if (git_check_attr(full_path, check))
+                       die("git_check_attr died");
        }
+       output_attr(check, file);
+
        free(full_path);
 }
 
-static void check_attr_stdin_paths(const char *prefix, int cnt,
-       struct git_attr_check *check)
+static void check_attr_stdin_paths(const char *prefix,
+                                  struct attr_check *check,
+                                  int collect_all)
 {
        struct strbuf buf = STRBUF_INIT;
        struct strbuf unquoted = STRBUF_INIT;
@@ -84,7 +88,7 @@ static void check_attr_stdin_paths(const char *prefix, int cnt,
                                die("line is badly quoted");
                        strbuf_swap(&buf, &unquoted);
                }
-               check_attr(prefix, cnt, check, buf.buf);
+               check_attr(prefix, check, collect_all, buf.buf);
                maybe_flush_or_die(stdout, "attribute to stdout");
        }
        strbuf_release(&buf);
@@ -99,7 +103,7 @@ static NORETURN void error_with_usage(const char *msg)
 
 int cmd_check_attr(int argc, const char **argv, const char *prefix)
 {
-       struct git_attr_check *check;
+       struct attr_check *check;
        int cnt, i, doubledash, filei;
 
        if (!is_bare_repository())
@@ -159,28 +163,26 @@ int cmd_check_attr(int argc, const char **argv, const char *prefix)
                        error_with_usage("No file specified");
        }
 
-       if (all_attrs) {
-               check = NULL;
-       } else {
-               check = xcalloc(cnt, sizeof(*check));
+       check = attr_check_alloc();
+       if (!all_attrs) {
                for (i = 0; i < cnt; i++) {
-                       const char *name;
-                       struct git_attr *a;
-                       name = argv[i];
-                       a = git_attr(name);
+                       const struct git_attr *a = git_attr(argv[i]);
+
                        if (!a)
                                return error("%s: not a valid attribute name",
-                                       name);
-                       check[i].attr = a;
+                                            argv[i]);
+                       attr_check_append(check, a);
                }
        }
 
        if (stdin_paths)
-               check_attr_stdin_paths(prefix, cnt, check);
+               check_attr_stdin_paths(prefix, check, all_attrs);
        else {
                for (i = filei; i < argc; i++)
-                       check_attr(prefix, cnt, check, argv[i]);
+                       check_attr(prefix, check, all_attrs, argv[i]);
                maybe_flush_or_die(stdout, "attribute to stdout");
        }
+
+       attr_check_free(check);
        return 0;
 }
index 92c69672e96f6e7fc6bbe7b783c551474224f18b..07631d0c9c59f6ba03f288294797e08cdfe22b7c 100644 (file)
@@ -16,7 +16,7 @@ static int checkout_stage; /* default to checkout stage0 */
 static int to_tempfile;
 static char topath[4][TEMPORARY_FILENAME_LENGTH + 1];
 
-static struct checkout state;
+static struct checkout state = CHECKOUT_INIT;
 
 static void write_tempfile_record(const char *name, const char *prefix)
 {
@@ -205,7 +205,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
        if (index_opt && !state.base_dir_len && !to_tempfile) {
                state.refresh_cache = 1;
                state.istate = &the_index;
-               newfd = hold_locked_index(&lock_file, 1);
+               newfd = hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        }
 
        /* Check out named files first */
index 899bd8db0b50d8d8a1cb00a9432692d9b898980d..b3609434550a5521b63327eeb909b32797215496 100644 (file)
 #include "submodule-config.h"
 #include "submodule.h"
 
+static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
+
 static const char * const checkout_usage[] = {
        N_("git checkout [<options>] <branch>"),
        N_("git checkout [<options>] [<branch>] -- <file>..."),
        NULL,
 };
 
+static int option_parse_recurse_submodules(const struct option *opt,
+                                          const char *arg, int unset)
+{
+       if (unset) {
+               recurse_submodules = RECURSE_SUBMODULES_OFF;
+               return 0;
+       }
+       if (arg)
+               recurse_submodules =
+                       parse_update_recurse_submodules_arg(opt->long_name,
+                                                           arg);
+       else
+               recurse_submodules = RECURSE_SUBMODULES_ON;
+
+       return 0;
+}
+
 struct checkout_opts {
        int patch_mode;
        int quiet;
@@ -56,8 +75,8 @@ static int post_checkout_hook(struct commit *old, struct commit *new,
                              int changed)
 {
        return run_hook_le(NULL, "post-checkout",
-                          sha1_to_hex(old ? old->object.oid.hash : null_sha1),
-                          sha1_to_hex(new ? new->object.oid.hash : null_sha1),
+                          oid_to_hex(old ? &old->object.oid : &null_oid),
+                          oid_to_hex(new ? &new->object.oid : &null_oid),
                           changed ? "1" : "0", NULL);
        /* "new" can be NULL when checking out from the index before
           a commit exists. */
@@ -76,7 +95,7 @@ static int update_some(const unsigned char *sha1, struct strbuf *base,
 
        len = base->len + strlen(pathname);
        ce = xcalloc(1, cache_entry_size(len));
-       hashcpy(ce->sha1, sha1);
+       hashcpy(ce->oid.hash, sha1);
        memcpy(ce->name, base->buf, base->len);
        memcpy(ce->name + base->len, pathname, len - base->len);
        ce->ce_flags = create_ce_flags(0) | CE_UPDATE;
@@ -92,7 +111,7 @@ static int update_some(const unsigned char *sha1, struct strbuf *base,
        if (pos >= 0) {
                struct cache_entry *old = active_cache[pos];
                if (ce->ce_mode == old->ce_mode &&
-                   !hashcmp(ce->sha1, old->sha1)) {
+                   !oidcmp(&ce->oid, &old->oid)) {
                        old->ce_flags |= CE_UPDATE;
                        free(ce);
                        return 0;
@@ -175,9 +194,9 @@ static int checkout_merged(int pos, const struct checkout *state)
        const char *path = ce->name;
        mmfile_t ancestor, ours, theirs;
        int status;
-       unsigned char sha1[20];
+       struct object_id oid;
        mmbuffer_t result_buf;
-       unsigned char threeway[3][20];
+       struct object_id threeway[3];
        unsigned mode = 0;
 
        memset(threeway, 0, sizeof(threeway));
@@ -186,18 +205,18 @@ static int checkout_merged(int pos, const struct checkout *state)
                stage = ce_stage(ce);
                if (!stage || strcmp(path, ce->name))
                        break;
-               hashcpy(threeway[stage - 1], ce->sha1);
+               oidcpy(&threeway[stage - 1], &ce->oid);
                if (stage == 2)
                        mode = create_ce_mode(ce->ce_mode);
                pos++;
                ce = active_cache[pos];
        }
-       if (is_null_sha1(threeway[1]) || is_null_sha1(threeway[2]))
+       if (is_null_oid(&threeway[1]) || is_null_oid(&threeway[2]))
                return error(_("path '%s' does not have necessary versions"), path);
 
-       read_mmblob(&ancestor, threeway[0]);
-       read_mmblob(&ours, threeway[1]);
-       read_mmblob(&theirs, threeway[2]);
+       read_mmblob(&ancestor, &threeway[0]);
+       read_mmblob(&ours, &threeway[1]);
+       read_mmblob(&theirs, &threeway[2]);
 
        /*
         * NEEDSWORK: re-create conflicts from merges with
@@ -216,22 +235,24 @@ static int checkout_merged(int pos, const struct checkout *state)
        /*
         * NEEDSWORK:
         * There is absolutely no reason to write this as a blob object
-        * and create a phony cache entry just to leak.  This hack is
-        * primarily to get to the write_entry() machinery that massages
-        * the contents to work-tree format and writes out which only
-        * allows it for a cache entry.  The code in write_entry() needs
-        * to be refactored to allow us to feed a <buffer, size, mode>
-        * instead of a cache entry.  Such a refactoring would help
-        * merge_recursive as well (it also writes the merge result to the
-        * object database even when it may contain conflicts).
+        * and create a phony cache entry.  This hack is primarily to get
+        * to the write_entry() machinery that massages the contents to
+        * work-tree format and writes out which only allows it for a
+        * cache entry.  The code in write_entry() needs to be refactored
+        * to allow us to feed a <buffer, size, mode> instead of a cache
+        * entry.  Such a refactoring would help merge_recursive as well
+        * (it also writes the merge result to the object database even
+        * when it may contain conflicts).
         */
        if (write_sha1_file(result_buf.ptr, result_buf.size,
-                           blob_type, sha1))
+                           blob_type, oid.hash))
                die(_("Unable to add merge result for '%s'"), path);
-       ce = make_cache_entry(mode, sha1, path, 2, 0);
+       free(result_buf.ptr);
+       ce = make_cache_entry(mode, oid.hash, path, 2, 0);
        if (!ce)
                die(_("make_cache_entry failed for path '%s'"), path);
        status = checkout_entry(ce, state, NULL);
+       free(ce);
        return status;
 }
 
@@ -239,9 +260,9 @@ static int checkout_paths(const struct checkout_opts *opts,
                          const char *revision)
 {
        int pos;
-       struct checkout state;
+       struct checkout state = CHECKOUT_INIT;
        static char *ps_matched;
-       unsigned char rev[20];
+       struct object_id rev;
        struct commit *head;
        int errs = 0;
        struct lock_file *lock_file;
@@ -274,7 +295,7 @@ static int checkout_paths(const struct checkout_opts *opts,
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
 
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache_preload(&opts->pathspec) < 0)
                return error(_("index file corrupt"));
 
@@ -352,7 +373,6 @@ static int checkout_paths(const struct checkout_opts *opts,
                return 1;
 
        /* Now we are committed to check them out */
-       memset(&state, 0, sizeof(state));
        state.force = 1;
        state.refresh_cache = 1;
        state.istate = &the_index;
@@ -374,8 +394,8 @@ static int checkout_paths(const struct checkout_opts *opts,
        if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
                die(_("unable to write new index file"));
 
-       read_ref_full("HEAD", 0, rev, NULL);
-       head = lookup_commit_reference_gently(rev, 1);
+       read_ref_full("HEAD", 0, rev.hash, NULL);
+       head = lookup_commit_reference_gently(rev.hash, 1);
 
        errs |= post_checkout_hook(head, head, 0);
        return errs;
@@ -453,7 +473,7 @@ static void setup_branch_path(struct branch_info *branch)
 {
        struct strbuf buf = STRBUF_INIT;
 
-       strbuf_branchname(&buf, branch->name);
+       strbuf_branchname(&buf, branch->name, INTERPRET_BRANCH_LOCAL);
        if (strcmp(buf.buf, branch->name))
                branch->name = xstrdup(buf.buf);
        strbuf_splice(&buf, 0, 0, "refs/heads/", 11);
@@ -468,7 +488,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
        int ret;
        struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
 
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache_preload(NULL) < 0)
                return error(_("index file corrupt"));
 
@@ -613,22 +633,25 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
        const char *old_desc, *reflog_msg;
        if (opts->new_branch) {
                if (opts->new_orphan_branch) {
-                       if (opts->new_branch_log && !log_all_ref_updates) {
+                       char *refname;
+
+                       refname = mkpathdup("refs/heads/%s", opts->new_orphan_branch);
+                       if (opts->new_branch_log &&
+                           !should_autocreate_reflog(refname)) {
                                int ret;
-                               char *refname;
                                struct strbuf err = STRBUF_INIT;
 
-                               refname = mkpathdup("refs/heads/%s", opts->new_orphan_branch);
                                ret = safe_create_reflog(refname, 1, &err);
-                               free(refname);
                                if (ret) {
                                        fprintf(stderr, _("Can not do reflog for '%s': %s\n"),
                                                opts->new_orphan_branch, err.buf);
                                        strbuf_release(&err);
+                                       free(refname);
                                        return;
                                }
                                strbuf_release(&err);
                        }
+                       free(refname);
                }
                else
                        create_branch(opts->new_branch, new->name,
@@ -808,11 +831,12 @@ static int switch_branches(const struct checkout_opts *opts,
        int ret = 0;
        struct branch_info old;
        void *path_to_free;
-       unsigned char rev[20];
+       struct object_id rev;
        int flag, writeout_error = 0;
        memset(&old, 0, sizeof(old));
-       old.path = path_to_free = resolve_refdup("HEAD", 0, rev, &flag);
-       old.commit = lookup_commit_reference_gently(rev, 1);
+       old.path = path_to_free = resolve_refdup("HEAD", 0, rev.hash, &flag);
+       if (old.path)
+               old.commit = lookup_commit_reference_gently(rev.hash, 1);
        if (!(flag & REF_ISSYMREF))
                old.path = NULL;
 
@@ -860,7 +884,7 @@ static int git_checkout_config(const char *var, const char *value, void *cb)
 struct tracking_name_data {
        /* const */ char *src_ref;
        char *dst_ref;
-       unsigned char *dst_sha1;
+       struct object_id *dst_oid;
        int unique;
 };
 
@@ -871,7 +895,7 @@ static int check_tracking_name(struct remote *remote, void *cb_data)
        memset(&query, 0, sizeof(struct refspec));
        query.src = cb->src_ref;
        if (remote_find_tracking(remote, &query) ||
-           get_sha1(query.dst, cb->dst_sha1)) {
+           get_oid(query.dst, cb->dst_oid)) {
                free(query.dst);
                return 0;
        }
@@ -884,14 +908,13 @@ static int check_tracking_name(struct remote *remote, void *cb_data)
        return 0;
 }
 
-static const char *unique_tracking_name(const char *name, unsigned char *sha1)
+static const char *unique_tracking_name(const char *name, struct object_id *oid)
 {
        struct tracking_name_data cb_data = { NULL, NULL, NULL, 1 };
-       char src_ref[PATH_MAX];
-       snprintf(src_ref, PATH_MAX, "refs/heads/%s", name);
-       cb_data.src_ref = src_ref;
-       cb_data.dst_sha1 = sha1;
+       cb_data.src_ref = xstrfmt("refs/heads/%s", name);
+       cb_data.dst_oid = oid;
        for_each_remote(check_tracking_name, &cb_data);
+       free(cb_data.src_ref);
        if (cb_data.unique)
                return cb_data.dst_ref;
        free(cb_data.dst_ref);
@@ -902,12 +925,12 @@ static int parse_branchname_arg(int argc, const char **argv,
                                int dwim_new_local_branch_ok,
                                struct branch_info *new,
                                struct checkout_opts *opts,
-                               unsigned char rev[20])
+                               struct object_id *rev)
 {
        struct tree **source_tree = &opts->source_tree;
        const char **new_branch = &opts->new_branch;
        int argcount = 0;
-       unsigned char branch_rev[20];
+       struct object_id branch_rev;
        const char *arg;
        int dash_dash_pos;
        int has_dash_dash = 0;
@@ -973,7 +996,7 @@ static int parse_branchname_arg(int argc, const char **argv,
        if (!strcmp(arg, "-"))
                arg = "@{-1}";
 
-       if (get_sha1_mb(arg, rev)) {
+       if (get_oid_mb(arg, rev)) {
                /*
                 * Either case (3) or (4), with <something> not being
                 * a commit, or an attempt to use case (1) with an
@@ -1022,15 +1045,15 @@ static int parse_branchname_arg(int argc, const char **argv,
        setup_branch_path(new);
 
        if (!check_refname_format(new->path, 0) &&
-           !read_ref(new->path, branch_rev))
-               hashcpy(rev, branch_rev);
+           !read_ref(new->path, branch_rev.hash))
+               oidcpy(rev, &branch_rev);
        else
                new->path = NULL; /* not an existing branch */
 
-       new->commit = lookup_commit_reference_gently(rev, 1);
+       new->commit = lookup_commit_reference_gently(rev->hash, 1);
        if (!new->commit) {
                /* not a commit */
-               *source_tree = parse_tree_indirect(rev);
+               *source_tree = parse_tree_indirect(rev->hash);
        } else {
                parse_commit_or_die(new->commit);
                *source_tree = new->commit->tree;
@@ -1108,9 +1131,9 @@ static int checkout_branch(struct checkout_opts *opts,
 
        if (new->path && !opts->force_detach && !opts->new_branch &&
            !opts->ignore_other_worktrees) {
-               unsigned char sha1[20];
+               struct object_id oid;
                int flag;
-               char *head_ref = resolve_refdup("HEAD", 0, sha1, &flag);
+               char *head_ref = resolve_refdup("HEAD", 0, oid.hash, &flag);
                if (head_ref &&
                    (!(flag & REF_ISSYMREF) || strcmp(head_ref, new->path)))
                        die_if_checked_out(new->path, 1);
@@ -1118,11 +1141,11 @@ static int checkout_branch(struct checkout_opts *opts,
        }
 
        if (!new->commit && opts->new_branch) {
-               unsigned char rev[20];
+               struct object_id rev;
                int flag;
 
-               if (!read_ref_full("HEAD", 0, rev, &flag) &&
-                   (flag & REF_ISSYMREF) && is_null_sha1(rev))
+               if (!read_ref_full("HEAD", 0, rev.hash, &flag) &&
+                   (flag & REF_ISSYMREF) && is_null_oid(&rev))
                        return switch_unborn_to_new_branch(opts);
        }
        return switch_branches(opts, new);
@@ -1161,6 +1184,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
                                N_("second guess 'git checkout <no-such-branch>'")),
                OPT_BOOL(0, "ignore-other-worktrees", &opts.ignore_other_worktrees,
                         N_("do not check if another worktree is holding the given ref")),
+               { OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules,
+                           "checkout", "control recursive updating of submodules",
+                           PARSE_OPT_OPTARG, option_parse_recurse_submodules },
                OPT_BOOL(0, "progress", &opts.show_progress, N_("force progress reporting")),
                OPT_END(),
        };
@@ -1191,6 +1217,12 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
                git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
        }
 
+       if (recurse_submodules != RECURSE_SUBMODULES_OFF) {
+               git_config(submodule_config, NULL);
+               if (recurse_submodules != RECURSE_SUBMODULES_DEFAULT)
+                       set_config_update_recurse_submodules(recurse_submodules);
+       }
+
        if ((!!opts.new_branch + !!opts.new_branch_force + !!opts.new_orphan_branch) > 1)
                die(_("-b, -B and --orphan are mutually exclusive"));
 
@@ -1232,14 +1264,14 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
         * remote branches, erroring out for invalid or ambiguous cases.
         */
        if (argc) {
-               unsigned char rev[20];
+               struct object_id rev;
                int dwim_ok =
                        !opts.patch_mode &&
                        dwim_new_local_branch &&
                        opts.track == BRANCH_TRACK_UNSPECIFIED &&
                        !opts.new_branch;
                int n = parse_branchname_arg(argc, argv, dwim_ok,
-                                            &new, &opts, rev);
+                                            &new, &opts, &rev);
                argv += n;
                argc -= n;
        }
@@ -1257,9 +1289,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
                 * new_branch && argc > 1 will be caught later.
                 */
                if (opts.new_branch && argc == 1)
-                       die(_("Cannot update paths and switch to branch '%s' at the same time.\n"
-                             "Did you intend to checkout '%s' which can not be resolved as commit?"),
-                           opts.new_branch, argv[0]);
+                       die(_("'%s' is not a commit and a branch '%s' cannot be created from it"),
+                               argv[0], opts.new_branch);
 
                if (opts.force_detach)
                        die(_("git checkout: --detach does not take a path argument '%s'"),
index 0371010afbad54283ceca9883f2a9fbe6da4686b..937eb17b66ca8984a040e32b575eca43cfccb0e2 100644 (file)
@@ -174,8 +174,10 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
                /* an empty dir could be removed even if it is unreadble */
                res = dry_run ? 0 : rmdir(path->buf);
                if (res) {
+                       int saved_errno = errno;
                        quote_path_relative(path->buf, prefix, &quoted);
-                       warning(_(msg_warn_remove_failed), quoted.buf);
+                       errno = saved_errno;
+                       warning_errno(_(msg_warn_remove_failed), quoted.buf);
                        *dir_gone = 0;
                }
                return res;
@@ -208,8 +210,10 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
                                quote_path_relative(path->buf, prefix, &quoted);
                                string_list_append(&dels, quoted.buf);
                        } else {
+                               int saved_errno = errno;
                                quote_path_relative(path->buf, prefix, &quoted);
-                               warning(_(msg_warn_remove_failed), quoted.buf);
+                               errno = saved_errno;
+                               warning_errno(_(msg_warn_remove_failed), quoted.buf);
                                *dir_gone = 0;
                                ret = 1;
                        }
@@ -230,8 +234,10 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
                if (!res)
                        *dir_gone = 1;
                else {
+                       int saved_errno = errno;
                        quote_path_relative(path->buf, prefix, &quoted);
-                       warning(_(msg_warn_remove_failed), quoted.buf);
+                       errno = saved_errno;
+                       warning_errno(_(msg_warn_remove_failed), quoted.buf);
                        *dir_gone = 0;
                        ret = 1;
                }
@@ -287,11 +293,11 @@ static void pretty_print_menus(struct string_list *menu_list)
 static void prompt_help_cmd(int singleton)
 {
        clean_print_color(CLEAN_COLOR_HELP);
-       printf_ln(singleton ?
+       printf(singleton ?
                  _("Prompt help:\n"
                    "1          - select a numbered item\n"
                    "foo        - select item based on unique prefix\n"
-                   "           - (empty) select nothing") :
+                   "           - (empty) select nothing\n") :
                  _("Prompt help:\n"
                    "1          - select a single item\n"
                    "3-5        - select a range of items\n"
@@ -299,7 +305,7 @@ static void prompt_help_cmd(int singleton)
                    "foo        - select item based on unique prefix\n"
                    "-...       - unselect specified items\n"
                    "*          - choose all items\n"
-                   "           - (empty) finish selecting"));
+                   "           - (empty) finish selecting\n"));
        clean_print_color(CLEAN_COLOR_RESET);
 }
 
@@ -508,7 +514,7 @@ static int parse_choice(struct menu_stuff *menu_stuff,
                if (top <= 0 || bottom <= 0 || top > menu_stuff->nr || bottom > top ||
                    (is_single && bottom != top)) {
                        clean_print_color(CLEAN_COLOR_ERROR);
-                       printf_ln(_("Huh (%s)?"), (*ptr)->buf);
+                       printf(_("Huh (%s)?\n"), (*ptr)->buf);
                        clean_print_color(CLEAN_COLOR_RESET);
                        continue;
                }
@@ -774,7 +780,7 @@ static int ask_each_cmd(void)
 static int quit_cmd(void)
 {
        string_list_clear(&del_list, 0);
-       printf_ln(_("Bye."));
+       printf(_("Bye.\n"));
        return MENU_RETURN_NO_LOOP;
 }
 
@@ -851,6 +857,38 @@ static void interactive_main_loop(void)
        }
 }
 
+static void correct_untracked_entries(struct dir_struct *dir)
+{
+       int src, dst, ign;
+
+       for (src = dst = ign = 0; src < dir->nr; src++) {
+               /* skip paths in ignored[] that cannot be inside entries[src] */
+               while (ign < dir->ignored_nr &&
+                      0 <= cmp_dir_entry(&dir->entries[src], &dir->ignored[ign]))
+                       ign++;
+
+               if (ign < dir->ignored_nr &&
+                   check_dir_entry_contains(dir->entries[src], dir->ignored[ign])) {
+                       /* entries[src] contains an ignored path, so we drop it */
+                       free(dir->entries[src]);
+               } else {
+                       struct dir_entry *ent = dir->entries[src++];
+
+                       /* entries[src] does not contain an ignored path, so we keep it */
+                       dir->entries[dst++] = ent;
+
+                       /* then discard paths in entries[] contained inside entries[src] */
+                       while (src < dir->nr &&
+                              check_dir_entry_contains(ent, dir->entries[src]))
+                               free(dir->entries[src++]);
+
+                       /* compensate for the outer loop's loop control */
+                       src--;
+               }
+       }
+       dir->nr = dst;
+}
+
 int cmd_clean(int argc, const char **argv, const char *prefix)
 {
        int i, res;
@@ -910,6 +948,9 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
 
        dir.flags |= DIR_SHOW_OTHER_DIRECTORIES;
 
+       if (remove_directories)
+               dir.flags |= DIR_SHOW_IGNORED_TOO | DIR_KEEP_UNTRACKED_CONTENTS;
+
        if (read_cache() < 0)
                die(_("index file corrupt"));
 
@@ -925,6 +966,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
                       prefix, argv);
 
        fill_directory(&dir, &pathspec);
+       correct_untracked_entries(&dir);
 
        for (i = 0; i < dir.nr; i++) {
                struct dir_entry *ent = dir.entries[i];
@@ -952,6 +994,12 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
                string_list_append(&del_list, rel);
        }
 
+       for (i = 0; i < dir.nr; i++)
+               free(dir.entries[i]);
+
+       for (i = 0; i < dir.ignored_nr; i++)
+               free(dir.ignored[i]);
+
        if (interactive && del_list.nr > 0)
                interactive_main_loop();
 
@@ -981,8 +1029,10 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
                } else {
                        res = dry_run ? 0 : unlink(abs_path.buf);
                        if (res) {
+                               int saved_errno = errno;
                                qname = quote_path_relative(item->string, NULL, &buf);
-                               warning(_(msg_warn_remove_failed), qname);
+                               errno = saved_errno;
+                               warning_errno(_(msg_warn_remove_failed), qname);
                                errors++;
                        } else if (!quiet) {
                                qname = quote_path_relative(item->string, NULL, &buf);
index a35d62293a9c84abb1473a1962c7af1540ed5017..a6ae7d6180ebee6e199b40b4e0c720d4049b68e9 100644 (file)
@@ -39,20 +39,38 @@ static const char * const builtin_clone_usage[] = {
 };
 
 static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
-static int option_local = -1, option_no_hardlinks, option_shared, option_recursive;
+static int option_local = -1, option_no_hardlinks, option_shared;
 static int option_shallow_submodules;
-static char *option_template, *option_depth;
+static int deepen;
+static char *option_template, *option_depth, *option_since;
 static char *option_origin = NULL;
 static char *option_branch = NULL;
+static struct string_list option_not = STRING_LIST_INIT_NODUP;
 static const char *real_git_dir;
 static char *option_upload_pack = "git-upload-pack";
 static int option_verbosity;
 static int option_progress = -1;
 static enum transport_family family;
 static struct string_list option_config = STRING_LIST_INIT_NODUP;
-static struct string_list option_reference = STRING_LIST_INIT_NODUP;
+static struct string_list option_required_reference = STRING_LIST_INIT_NODUP;
+static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP;
 static int option_dissociate;
 static int max_jobs = -1;
+static struct string_list option_recurse_submodules = STRING_LIST_INIT_NODUP;
+
+static int recurse_submodules_cb(const struct option *opt,
+                                const char *arg, int unset)
+{
+       if (unset)
+               string_list_clear((struct string_list *)opt->value, 0);
+       else if (arg)
+               string_list_append((struct string_list *)opt->value, arg);
+       else
+               string_list_append((struct string_list *)opt->value,
+                                  (const char *)opt->defval);
+
+       return 0;
+}
 
 static struct option builtin_clone_options[] = {
        OPT__VERBOSITY(&option_verbosity),
@@ -71,16 +89,21 @@ static struct option builtin_clone_options[] = {
                    N_("don't use local hardlinks, always copy")),
        OPT_BOOL('s', "shared", &option_shared,
                    N_("setup as shared repository")),
-       OPT_BOOL(0, "recursive", &option_recursive,
-                   N_("initialize submodules in the clone")),
-       OPT_BOOL(0, "recurse-submodules", &option_recursive,
-                   N_("initialize submodules in the clone")),
+       { OPTION_CALLBACK, 0, "recursive", &option_recurse_submodules,
+         N_("pathspec"), N_("initialize submodules in the clone"),
+         PARSE_OPT_OPTARG | PARSE_OPT_HIDDEN, recurse_submodules_cb,
+         (intptr_t)"." },
+       { OPTION_CALLBACK, 0, "recurse-submodules", &option_recurse_submodules,
+         N_("pathspec"), N_("initialize submodules in the clone"),
+         PARSE_OPT_OPTARG, recurse_submodules_cb, (intptr_t)"." },
        OPT_INTEGER('j', "jobs", &max_jobs,
                    N_("number of submodules cloned in parallel")),
        OPT_STRING(0, "template", &option_template, N_("template-directory"),
                   N_("directory from which templates will be used")),
-       OPT_STRING_LIST(0, "reference", &option_reference, N_("repo"),
+       OPT_STRING_LIST(0, "reference", &option_required_reference, N_("repo"),
                        N_("reference repository")),
+       OPT_STRING_LIST(0, "reference-if-able", &option_optional_reference,
+                       N_("repo"), N_("reference repository")),
        OPT_BOOL(0, "dissociate", &option_dissociate,
                 N_("use --reference only while cloning")),
        OPT_STRING('o', "origin", &option_origin, N_("name"),
@@ -91,6 +114,10 @@ static struct option builtin_clone_options[] = {
                   N_("path to git-upload-pack on the remote")),
        OPT_STRING(0, "depth", &option_depth, N_("depth"),
                    N_("create a shallow clone of that depth")),
+       OPT_STRING(0, "shallow-since", &option_since, N_("time"),
+                   N_("create a shallow clone since a specific time")),
+       OPT_STRING_LIST(0, "shallow-exclude", &option_not, N_("revision"),
+                       N_("deepen history of shallow clone, excluding rev")),
        OPT_BOOL(0, "single-branch", &option_single_branch,
                    N_("clone only one branch, HEAD or --branch")),
        OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
@@ -161,7 +188,7 @@ static char *get_repo_path(const char *repo, int *is_bundle)
 
        strbuf_addstr(&path, repo);
        raw = get_repo_path_1(&path, is_bundle);
-       canon = raw ? xstrdup(absolute_path(raw)) : NULL;
+       canon = raw ? absolute_pathdup(raw) : NULL;
        strbuf_release(&path);
        return canon;
 }
@@ -282,50 +309,37 @@ static void strip_trailing_slashes(char *dir)
 
 static int add_one_reference(struct string_list_item *item, void *cb_data)
 {
-       char *ref_git;
-       const char *repo;
-       struct strbuf alternate = STRBUF_INIT;
-
-       /* Beware: read_gitfile(), real_path() and mkpath() return static buffer */
-       ref_git = xstrdup(real_path(item->string));
-
-       repo = read_gitfile(ref_git);
-       if (!repo)
-               repo = read_gitfile(mkpath("%s/.git", ref_git));
-       if (repo) {
-               free(ref_git);
-               ref_git = xstrdup(repo);
-       }
+       struct strbuf err = STRBUF_INIT;
+       int *required = cb_data;
+       char *ref_git = compute_alternate_path(item->string, &err);
 
-       if (!repo && is_directory(mkpath("%s/.git/objects", ref_git))) {
-               char *ref_git_git = mkpathdup("%s/.git", ref_git);
-               free(ref_git);
-               ref_git = ref_git_git;
-       } else if (!is_directory(mkpath("%s/objects", ref_git))) {
+       if (!ref_git) {
+               if (*required)
+                       die("%s", err.buf);
+               else
+                       fprintf(stderr,
+                               _("info: Could not add alternate for '%s': %s\n"),
+                               item->string, err.buf);
+       } else {
                struct strbuf sb = STRBUF_INIT;
-               if (get_common_dir(&sb, ref_git))
-                       die(_("reference repository '%s' as a linked checkout is not supported yet."),
-                           item->string);
-               die(_("reference repository '%s' is not a local repository."),
-                   item->string);
+               strbuf_addf(&sb, "%s/objects", ref_git);
+               add_to_alternates_file(sb.buf);
+               strbuf_release(&sb);
        }
 
-       if (!access(mkpath("%s/shallow", ref_git), F_OK))
-               die(_("reference repository '%s' is shallow"), item->string);
-
-       if (!access(mkpath("%s/info/grafts", ref_git), F_OK))
-               die(_("reference repository '%s' is grafted"), item->string);
-
-       strbuf_addf(&alternate, "%s/objects", ref_git);
-       add_to_alternates_file(alternate.buf);
-       strbuf_release(&alternate);
+       strbuf_release(&err);
        free(ref_git);
        return 0;
 }
 
 static void setup_reference(void)
 {
-       for_each_string_list(&option_reference, add_one_reference, NULL);
+       int required = 1;
+       for_each_string_list(&option_required_reference,
+                            add_one_reference, &required);
+       required = 0;
+       for_each_string_list(&option_optional_reference,
+                            add_one_reference, &required);
 }
 
 static void copy_alternates(struct strbuf *src, struct strbuf *dst,
@@ -683,9 +697,9 @@ static void update_head(const struct ref *our, const struct ref *remote,
        }
 }
 
-static int checkout(void)
+static int checkout(int submodule_progress)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
        char *head;
        struct lock_file *lock_file;
        struct unpack_trees_options opts;
@@ -696,7 +710,7 @@ static int checkout(void)
        if (option_no_checkout)
                return 0;
 
-       head = resolve_refdup("HEAD", RESOLVE_REF_READING, sha1, NULL);
+       head = resolve_refdup("HEAD", RESOLVE_REF_READING, oid.hash, NULL);
        if (!head) {
                warning(_("remote HEAD refers to nonexistent ref, "
                          "unable to checkout.\n"));
@@ -704,7 +718,7 @@ static int checkout(void)
        }
        if (!strcmp(head, "HEAD")) {
                if (advice_detached_head)
-                       detach_advice(sha1_to_hex(sha1));
+                       detach_advice(oid_to_hex(&oid));
        } else {
                if (!starts_with(head, "refs/heads/"))
                        die(_("HEAD not found below refs/heads!"));
@@ -715,7 +729,7 @@ static int checkout(void)
        setup_work_tree();
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
-       hold_locked_index(lock_file, 1);
+       hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
 
        memset(&opts, 0, sizeof opts);
        opts.update = 1;
@@ -725,7 +739,7 @@ static int checkout(void)
        opts.src_index = &the_index;
        opts.dst_index = &the_index;
 
-       tree = parse_tree_indirect(sha1);
+       tree = parse_tree_indirect(oid.hash);
        parse_tree(tree);
        init_tree_desc(&t, tree->buffer, tree->size);
        if (unpack_trees(1, &t, &opts) < 0)
@@ -735,9 +749,9 @@ static int checkout(void)
                die(_("unable to write new index file"));
 
        err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
-                          sha1_to_hex(sha1), "1", NULL);
+                          oid_to_hex(&oid), "1", NULL);
 
-       if (!err && option_recursive) {
+       if (!err && (option_recurse_submodules.nr > 0)) {
                struct argv_array args = ARGV_ARRAY_INIT;
                argv_array_pushl(&args, "submodule", "update", "--init", "--recursive", NULL);
 
@@ -747,6 +761,9 @@ static int checkout(void)
                if (max_jobs != -1)
                        argv_array_pushf(&args, "--jobs=%d", max_jobs);
 
+               if (submodule_progress)
+                       argv_array_push(&args, "--progress");
+
                err = run_command_v_opt(args.argv, RUN_GIT_CMD);
                argv_array_clear(&args);
        }
@@ -756,7 +773,9 @@ static int checkout(void)
 
 static int write_one_config(const char *key, const char *value, void *data)
 {
-       return git_config_set_multivar_gently(key, value ? value : "true", "^$", 0);
+       return git_config_set_multivar_gently(key,
+                                             value ? value : "true",
+                                             CONFIG_REGEX_NONE, 0);
 }
 
 static void write_config(struct string_list *config)
@@ -854,6 +873,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
        const char *src_ref_prefix = "refs/heads/";
        struct remote *remote;
        int err = 0, complete_refs_before_fetch = 1;
+       int submodule_progress;
 
        struct refspec *refspec;
        const char *fetch_pattern;
@@ -870,8 +890,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
                usage_msg_opt(_("You must specify a repository to clone."),
                        builtin_clone_usage, builtin_clone_options);
 
+       if (option_depth || option_since || option_not.nr)
+               deepen = 1;
        if (option_single_branch == -1)
-               option_single_branch = option_depth ? 1 : 0;
+               option_single_branch = deepen ? 1 : 0;
 
        if (option_mirror)
                option_bare = 1;
@@ -892,7 +914,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 
        path = get_repo_path(repo_name, &is_bundle);
        if (path)
-               repo = xstrdup(absolute_path(repo_name));
+               repo = absolute_pathdup(repo_name);
        else if (!strchr(repo_name, ':'))
                die(_("repository '%s' does not exist"), repo_name);
        else
@@ -944,23 +966,58 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
                set_git_work_tree(work_tree);
        }
 
-       junk_git_dir = git_dir;
+       junk_git_dir = real_git_dir ? real_git_dir : git_dir;
        if (safe_create_leading_directories_const(git_dir) < 0)
                die(_("could not create leading directories of '%s'"), git_dir);
 
-       set_git_dir_init(git_dir, real_git_dir, 0);
-       if (real_git_dir) {
-               git_dir = real_git_dir;
-               junk_git_dir = real_git_dir;
-       }
-
        if (0 <= option_verbosity) {
                if (option_bare)
                        fprintf(stderr, _("Cloning into bare repository '%s'...\n"), dir);
                else
                        fprintf(stderr, _("Cloning into '%s'...\n"), dir);
        }
-       init_db(option_template, INIT_DB_QUIET);
+
+       if (option_recurse_submodules.nr > 0) {
+               struct string_list_item *item;
+               struct strbuf sb = STRBUF_INIT;
+
+               /* remove duplicates */
+               string_list_sort(&option_recurse_submodules);
+               string_list_remove_duplicates(&option_recurse_submodules, 0);
+
+               /*
+                * NEEDSWORK: In a multi-working-tree world, this needs to be
+                * set in the per-worktree config.
+                */
+               for_each_string_list_item(item, &option_recurse_submodules) {
+                       strbuf_addf(&sb, "submodule.active=%s",
+                                   item->string);
+                       string_list_append(&option_config,
+                                          strbuf_detach(&sb, NULL));
+               }
+
+               if (option_required_reference.nr &&
+                   option_optional_reference.nr)
+                       die(_("clone --recursive is not compatible with "
+                             "both --reference and --reference-if-able"));
+               else if (option_required_reference.nr) {
+                       string_list_append(&option_config,
+                               "submodule.alternateLocation=superproject");
+                       string_list_append(&option_config,
+                               "submodule.alternateErrorStrategy=die");
+               } else if (option_optional_reference.nr) {
+                       string_list_append(&option_config,
+                               "submodule.alternateLocation=superproject");
+                       string_list_append(&option_config,
+                               "submodule.alternateErrorStrategy=info");
+               }
+       }
+
+       init_db(git_dir, real_git_dir, option_template, INIT_DB_QUIET);
+
+       if (real_git_dir)
+               git_dir = real_git_dir;
+
        write_config(&option_config);
 
        git_config(git_default_config, NULL);
@@ -980,7 +1037,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
        git_config_set(key.buf, repo);
        strbuf_reset(&key);
 
-       if (option_reference.nr)
+       if (option_required_reference.nr || option_optional_reference.nr)
                setup_reference();
 
        fetch_pattern = value.buf;
@@ -998,6 +1055,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
        if (is_local) {
                if (option_depth)
                        warning(_("--depth is ignored in local clones; use file:// instead."));
+               if (option_since)
+                       warning(_("--shallow-since is ignored in local clones; use file:// instead."));
+               if (option_not.nr)
+                       warning(_("--shallow-exclude is ignored in local clones; use file:// instead."));
                if (!access(mkpath("%s/shallow", path), F_OK)) {
                        if (option_local > 0)
                                warning(_("source repository is shallow, ignoring --local"));
@@ -1016,6 +1077,12 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
        if (option_depth)
                transport_set_option(transport, TRANS_OPT_DEPTH,
                                     option_depth);
+       if (option_since)
+               transport_set_option(transport, TRANS_OPT_DEEPEN_SINCE,
+                                    option_since);
+       if (option_not.nr)
+               transport_set_option(transport, TRANS_OPT_DEEPEN_NOT,
+                                    (const char *)&option_not);
        if (option_single_branch)
                transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
 
@@ -1023,7 +1090,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
                transport_set_option(transport, TRANS_OPT_UPLOADPACK,
                                     option_upload_pack);
 
-       if (transport->smart_options && !option_depth)
+       if (transport->smart_options && !deepen)
                transport->smart_options->check_self_contained_and_connected = 1;
 
        refs = transport_get_remote_refs(transport);
@@ -1093,6 +1160,14 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 
        update_head(our_head_points_at, remote_head, reflog_msg.buf);
 
+       /*
+        * We want to show progress for recursive submodule clones iff
+        * we did so for the main clone. But only the transport knows
+        * the final decision for this flag, so we need to rescue the value
+        * before we free the transport.
+        */
+       submodule_progress = transport->progress;
+
        transport_unlock_pack(transport);
        transport_disconnect(transport);
 
@@ -1102,7 +1177,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
        }
 
        junk_mode = JUNK_LEAVE_REPO;
-       err = checkout();
+       err = checkout(submodule_progress);
 
        strbuf_release(&reflog_msg);
        strbuf_release(&branch_top);
index 8a674bc9e759116a06f7464222ec591472b65610..605017261c38dea1f5ada18c7d5b12446d6ea44f 100644 (file)
@@ -40,8 +40,8 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
 {
        int i, got_tree = 0;
        struct commit_list *parents = NULL;
-       unsigned char tree_sha1[20];
-       unsigned char commit_sha1[20];
+       struct object_id tree_oid;
+       struct object_id commit_oid;
        struct strbuf buffer = STRBUF_INIT;
 
        git_config(commit_tree_config, NULL);
@@ -52,13 +52,13 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
                if (!strcmp(arg, "-p")) {
-                       unsigned char sha1[20];
+                       struct object_id oid;
                        if (argc <= ++i)
                                usage(commit_tree_usage);
-                       if (get_sha1_commit(argv[i], sha1))
+                       if (get_sha1_commit(argv[i], oid.hash))
                                die("Not a valid object name %s", argv[i]);
-                       assert_sha1_type(sha1, OBJ_COMMIT);
-                       new_parent(lookup_commit(sha1), &parents);
+                       assert_sha1_type(oid.hash, OBJ_COMMIT);
+                       new_parent(lookup_commit(oid.hash), &parents);
                        continue;
                }
 
@@ -105,7 +105,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
                        continue;
                }
 
-               if (get_sha1_tree(arg, tree_sha1))
+               if (get_sha1_tree(arg, tree_oid.hash))
                        die("Not a valid object name %s", arg);
                if (got_tree)
                        die("Cannot give more than one trees");
@@ -117,13 +117,13 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
                        die_errno("git commit-tree: failed to read");
        }
 
-       if (commit_tree(buffer.buf, buffer.len, tree_sha1, parents,
-                       commit_sha1, NULL, sign_commit)) {
+       if (commit_tree(buffer.buf, buffer.len, tree_oid.hash, parents,
+                       commit_oid.hash, NULL, sign_commit)) {
                strbuf_release(&buffer);
                return 1;
        }
 
-       printf("%s\n", sha1_to_hex(commit_sha1));
+       printf("%s\n", oid_to_hex(&commit_oid));
        strbuf_release(&buffer);
        return 0;
 }
index 63a8424c5a5342ae52f1cb9f463e260328b5bec5..8d1cac0629e7079daeef57ac049c0c7d7549e6d0 100644 (file)
@@ -142,14 +142,24 @@ static int show_ignored_in_status, have_option_m;
 static const char *only_include_assumed;
 static struct strbuf message = STRBUF_INIT;
 
-static enum status_format {
-       STATUS_FORMAT_NONE = 0,
-       STATUS_FORMAT_LONG,
-       STATUS_FORMAT_SHORT,
-       STATUS_FORMAT_PORCELAIN,
+static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED;
 
-       STATUS_FORMAT_UNSPECIFIED
-} status_format = STATUS_FORMAT_UNSPECIFIED;
+static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset)
+{
+       enum wt_status_format *value = (enum wt_status_format *)opt->value;
+       if (unset)
+               *value = STATUS_FORMAT_NONE;
+       else if (!arg)
+               *value = STATUS_FORMAT_PORCELAIN;
+       else if (!strcmp(arg, "v1") || !strcmp(arg, "1"))
+               *value = STATUS_FORMAT_PORCELAIN;
+       else if (!strcmp(arg, "v2") || !strcmp(arg, "2"))
+               *value = STATUS_FORMAT_PORCELAIN_V2;
+       else
+               die("unsupported porcelain version '%s'", arg);
+
+       return 0;
+}
 
 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
 {
@@ -173,7 +183,7 @@ static void determine_whence(struct wt_status *s)
                whence = FROM_MERGE;
        else if (file_exists(git_path_cherry_pick_head())) {
                whence = FROM_CHERRY_PICK;
-               if (file_exists(git_path(SEQ_DIR)))
+               if (file_exists(git_path_seq_dir()))
                        sequencer_in_use = 1;
        }
        else
@@ -341,7 +351,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
 
        if (interactive) {
                char *old_index_env = NULL;
-               hold_locked_index(&index_lock, 1);
+               hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 
                refresh_cache_or_die(refresh_flags);
 
@@ -386,7 +396,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
         * (B) on failure, rollback the real index.
         */
        if (all || (also && pathspec.nr)) {
-               hold_locked_index(&index_lock, 1);
+               hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
                add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
                refresh_cache_or_die(refresh_flags);
                update_main_cache_tree(WRITE_TREE_SILENT);
@@ -406,7 +416,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
         * We still need to refresh the index here.
         */
        if (!only && !pathspec.nr) {
-               hold_locked_index(&index_lock, 1);
+               hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
                refresh_cache_or_die(refresh_flags);
                if (active_cache_changed
                    || !cache_tree_fully_valid(active_cache_tree))
@@ -458,7 +468,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
        if (read_cache() < 0)
                die(_("cannot read the index"));
 
-       hold_locked_index(&index_lock, 1);
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
        add_remove_files(&partial);
        refresh_cache(REFRESH_QUIET);
        update_main_cache_tree(WRITE_TREE_SILENT);
@@ -486,7 +496,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
                      struct wt_status *s)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
 
        if (s->relative_paths)
                s->prefix = prefix;
@@ -499,25 +509,14 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int
        s->index_file = index_file;
        s->fp = fp;
        s->nowarn = nowarn;
-       s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
+       s->is_initial = get_sha1(s->reference, oid.hash) ? 1 : 0;
+       if (!s->is_initial)
+               hashcpy(s->sha1_commit, oid.hash);
+       s->status_format = status_format;
+       s->ignore_submodule_arg = ignore_submodule_arg;
 
        wt_status_collect(s);
-
-       switch (status_format) {
-       case STATUS_FORMAT_SHORT:
-               wt_shortstatus_print(s);
-               break;
-       case STATUS_FORMAT_PORCELAIN:
-               wt_porcelain_print(s);
-               break;
-       case STATUS_FORMAT_UNSPECIFIED:
-               die("BUG: finalize_deferred_config() should have been called");
-               break;
-       case STATUS_FORMAT_NONE:
-       case STATUS_FORMAT_LONG:
-               wt_status_print(s);
-               break;
-       }
+       wt_status_print(s);
 
        return s->commitable;
 }
@@ -791,7 +790,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                strbuf_stripspace(&sb, 0);
 
        if (signoff)
-               append_signoff(&sb, ignore_non_trailer(&sb), 0);
+               append_signoff(&sb, ignore_non_trailer(sb.buf, sb.len), 0);
 
        if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
                die_errno(_("could not write commit template"));
@@ -822,9 +821,9 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                                        "If this is not correct, please remove the file\n"
                                        "       %s\n"
                                        "and try again.\n"),
-                               git_path(whence == FROM_MERGE
-                                        ? "MERGE_HEAD"
-                                        : "CHERRY_PICK_HEAD"));
+                               whence == FROM_MERGE ?
+                                       git_path_merge_head() :
+                                       git_path_cherry_pick_head());
                }
 
                fprintf(s->fp, "\n");
@@ -886,7 +885,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                commitable = run_status(s->fp, index_file, prefix, 1, s);
                s->use_color = saved_color_setting;
        } else {
-               unsigned char sha1[20];
+               struct object_id oid;
                const char *parent = "HEAD";
 
                if (!active_nr && read_cache() < 0)
@@ -895,9 +894,14 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                if (amend)
                        parent = "HEAD^1";
 
-               if (get_sha1(parent, sha1))
-                       commitable = !!active_nr;
-               else {
+               if (get_sha1(parent, oid.hash)) {
+                       int i, ita_nr = 0;
+
+                       for (i = 0; i < active_nr; i++)
+                               if (ce_intent_to_add(active_cache[i]))
+                                       ita_nr++;
+                       commitable = active_nr - ita_nr > 0;
+               } else {
                        /*
                         * Unless the user did explicitly request a submodule
                         * ignore mode by passing a command line option we do
@@ -911,7 +915,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                        if (ignore_submodule_arg &&
                            !strcmp(ignore_submodule_arg, "all"))
                                diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
-                       commitable = index_differs_from(parent, diff_flags);
+                       commitable = index_differs_from(parent, diff_flags, 1);
                }
        }
        strbuf_release(&committer_ident);
@@ -956,15 +960,15 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                return 0;
 
        if (use_editor) {
-               char index[PATH_MAX];
-               const char *env[2] = { NULL };
-               env[0] =  index;
-               snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
-               if (launch_editor(git_path_commit_editmsg(), NULL, env)) {
+               struct argv_array env = ARGV_ARRAY_INIT;
+
+               argv_array_pushf(&env, "GIT_INDEX_FILE=%s", index_file);
+               if (launch_editor(git_path_commit_editmsg(), NULL, env.argv)) {
                        fprintf(stderr,
                        _("Please supply the message using either -m or -F option.\n"));
                        exit(1);
                }
+               argv_array_clear(&env);
        }
 
        if (!no_verify &&
@@ -1099,7 +1103,7 @@ static const char *read_commit_message(const char *name)
  * is not in effect here.
  */
 static struct status_deferred_config {
-       enum status_format status_format;
+       enum wt_status_format status_format;
        int show_branch;
 } status_deferred_config = {
        STATUS_FORMAT_UNSPECIFIED,
@@ -1109,6 +1113,7 @@ static struct status_deferred_config {
 static void finalize_deferred_config(struct wt_status *s)
 {
        int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN &&
+                                  status_format != STATUS_FORMAT_PORCELAIN_V2 &&
                                   !s->null_termination);
 
        if (s->null_termination) {
@@ -1201,10 +1206,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
 
        if (also + only + all + interactive > 1)
                die(_("Only one of --include/--only/--all/--interactive/--patch can be used."));
-       if (argc == 0 && (also || (only && !amend)))
+       if (argc == 0 && (also || (only && !amend && !allow_empty)))
                die(_("No paths with --include/--only does not make sense."));
-       if (argc == 0 && only && amend)
-               only_include_assumed = _("Clever... amending the last one with dirty index.");
        if (argc > 0 && !also && !only)
                only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
        if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
@@ -1329,16 +1332,16 @@ int cmd_status(int argc, const char **argv, const char *prefix)
 {
        static struct wt_status s;
        int fd;
-       unsigned char sha1[20];
+       struct object_id oid;
        static struct option builtin_status_options[] = {
                OPT__VERBOSE(&verbose, N_("be verbose")),
                OPT_SET_INT('s', "short", &status_format,
                            N_("show status concisely"), STATUS_FORMAT_SHORT),
                OPT_BOOL('b', "branch", &s.show_branch,
                         N_("show branch information")),
-               OPT_SET_INT(0, "porcelain", &status_format,
-                           N_("machine-readable output"),
-                           STATUS_FORMAT_PORCELAIN),
+               { OPTION_CALLBACK, 0, "porcelain", &status_format,
+                 N_("version"), N_("machine-readable output"),
+                 PARSE_OPT_OPTARG, opt_parse_porcelain },
                OPT_SET_INT(0, "long", &status_format,
                            N_("show status in long format (default)"),
                            STATUS_FORMAT_LONG),
@@ -1379,8 +1382,14 @@ int cmd_status(int argc, const char **argv, const char *prefix)
 
        fd = hold_locked_index(&index_lock, 0);
 
-       s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
+       s.is_initial = get_sha1(s.reference, oid.hash) ? 1 : 0;
+       if (!s.is_initial)
+               hashcpy(s.sha1_commit, oid.hash);
+
        s.ignore_submodule_arg = ignore_submodule_arg;
+       s.status_format = status_format;
+       s.verbose = verbose;
+
        wt_status_collect(&s);
 
        if (0 <= fd)
@@ -1389,29 +1398,13 @@ int cmd_status(int argc, const char **argv, const char *prefix)
        if (s.relative_paths)
                s.prefix = prefix;
 
-       switch (status_format) {
-       case STATUS_FORMAT_SHORT:
-               wt_shortstatus_print(&s);
-               break;
-       case STATUS_FORMAT_PORCELAIN:
-               wt_porcelain_print(&s);
-               break;
-       case STATUS_FORMAT_UNSPECIFIED:
-               die("BUG: finalize_deferred_config() should have been called");
-               break;
-       case STATUS_FORMAT_NONE:
-       case STATUS_FORMAT_LONG:
-               s.verbose = verbose;
-               s.ignore_submodule_arg = ignore_submodule_arg;
-               wt_status_print(&s);
-               break;
-       }
+       wt_status_print(&s);
        return 0;
 }
 
 static const char *implicit_ident_advice(void)
 {
-       char *user_config = expand_user_path("~/.gitconfig");
+       char *user_config = expand_user_path("~/.gitconfig", 0);
        char *xdg_config = xdg_config_home("config");
        int config_exists = file_exists(user_config) || file_exists(xdg_config);
 
@@ -1425,19 +1418,19 @@ static const char *implicit_ident_advice(void)
 
 }
 
-static void print_summary(const char *prefix, const unsigned char *sha1,
+static void print_summary(const char *prefix, const struct object_id *oid,
                          int initial_commit)
 {
        struct rev_info rev;
        struct commit *commit;
        struct strbuf format = STRBUF_INIT;
-       unsigned char junk_sha1[20];
+       struct object_id junk_oid;
        const char *head;
        struct pretty_print_context pctx = {0};
        struct strbuf author_ident = STRBUF_INIT;
        struct strbuf committer_ident = STRBUF_INIT;
 
-       commit = lookup_commit(sha1);
+       commit = lookup_commit(oid->hash);
        if (!commit)
                die(_("couldn't look up newly created commit"));
        if (parse_commit(commit))
@@ -1484,7 +1477,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
        rev.diffopt.break_opt = 0;
        diff_setup_done(&rev.diffopt);
 
-       head = resolve_ref_unsafe("HEAD", 0, junk_sha1, NULL);
+       head = resolve_ref_unsafe("HEAD", 0, junk_oid.hash, NULL);
        if (!strcmp(head, "HEAD"))
                head = _("detached HEAD");
        else
@@ -1529,15 +1522,13 @@ static int git_commit_config(const char *k, const char *v, void *cb)
        return git_status_config(k, v, s);
 }
 
-static int run_rewrite_hook(const unsigned char *oldsha1,
-                           const unsigned char *newsha1)
+static int run_rewrite_hook(const struct object_id *oldoid,
+                           const struct object_id *newoid)
 {
-       /* oldsha1 SP newsha1 LF NUL */
-       static char buf[2*40 + 3];
        struct child_process proc = CHILD_PROCESS_INIT;
        const char *argv[3];
        int code;
-       size_t n;
+       struct strbuf sb = STRBUF_INIT;
 
        argv[0] = find_hook("post-rewrite");
        if (!argv[0])
@@ -1553,34 +1544,33 @@ static int run_rewrite_hook(const unsigned char *oldsha1,
        code = start_command(&proc);
        if (code)
                return code;
-       n = snprintf(buf, sizeof(buf), "%s %s\n",
-                    sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
+       strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
        sigchain_push(SIGPIPE, SIG_IGN);
-       write_in_full(proc.in, buf, n);
+       write_in_full(proc.in, sb.buf, sb.len);
        close(proc.in);
+       strbuf_release(&sb);
        sigchain_pop(SIGPIPE);
        return finish_command(&proc);
 }
 
 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
 {
-       const char *hook_env[3] =  { NULL };
-       char index[PATH_MAX];
+       struct argv_array hook_env = ARGV_ARRAY_INIT;
        va_list args;
        int ret;
 
-       snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
-       hook_env[0] = index;
+       argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", index_file);
 
        /*
         * Let the hook know that no editor will be launched.
         */
        if (!editor_is_used)
-               hook_env[1] = "GIT_EDITOR=:";
+               argv_array_push(&hook_env, "GIT_EDITOR=:");
 
        va_start(args, name);
-       ret = run_hook_ve(hook_envname, args);
+       ret = run_hook_ve(hook_env.argv,name, args);
        va_end(args);
+       argv_array_clear(&hook_env);
 
        return ret;
 }
@@ -1646,7 +1636,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        struct strbuf author_ident = STRBUF_INIT;
        const char *index_file, *reflog_msg;
        char *nl;
-       unsigned char sha1[20];
+       struct object_id oid;
        struct commit_list *parents = NULL;
        struct stat statbuf;
        struct commit *current_head = NULL;
@@ -1661,10 +1651,10 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
        s.colopts = 0;
 
-       if (get_sha1("HEAD", sha1))
+       if (get_sha1("HEAD", oid.hash))
                current_head = NULL;
        else {
-               current_head = lookup_commit_or_die(sha1, "HEAD");
+               current_head = lookup_commit_or_die(oid.hash, "HEAD");
                if (parse_commit(current_head))
                        die(_("could not parse HEAD commit"));
        }
@@ -1745,7 +1735,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
 
        if (verbose || /* Truncate the message just before the diff, if any. */
            cleanup_mode == CLEANUP_SCISSORS)
-               wt_status_truncate_message_at_cut_line(&sb);
+               strbuf_setlen(&sb, wt_status_locate_end(sb.buf, sb.len));
 
        if (cleanup_mode != CLEANUP_NONE)
                strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL);
@@ -1769,7 +1759,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        }
 
        if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->sha1,
-                        parents, sha1, author_ident.buf, sign_commit, extra)) {
+                        parents, oid.hash, author_ident.buf, sign_commit, extra)) {
                rollback_index_files();
                die(_("failed to write commit object"));
        }
@@ -1786,7 +1776,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
 
        transaction = ref_transaction_begin(&err);
        if (!transaction ||
-           ref_transaction_update(transaction, "HEAD", sha1,
+           ref_transaction_update(transaction, "HEAD", oid.hash,
                                   current_head
                                   ? current_head->object.oid.hash : null_sha1,
                                   0, sb.buf, &err) ||
@@ -1815,13 +1805,13 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                cfg = init_copy_notes_for_rewrite("amend");
                if (cfg) {
                        /* we are amending, so current_head is not NULL */
-                       copy_note_for_rewrite(cfg, current_head->object.oid.hash, sha1);
+                       copy_note_for_rewrite(cfg, current_head->object.oid.hash, oid.hash);
                        finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
                }
-               run_rewrite_hook(current_head->object.oid.hash, sha1);
+               run_rewrite_hook(&current_head->object.oid, &oid);
        }
        if (!quiet)
-               print_summary(prefix, sha1, !current_head);
+               print_summary(prefix, &oid, !current_head);
 
        strbuf_release(&err);
        return 0;
index 6cbf73369b2f6cf41430d78e0a5e8ffa18de6d15..7f6c25d4d95b37f7785e0b6872d059095548c87f 100644 (file)
@@ -26,7 +26,8 @@ static int use_global_config, use_system_config, use_local_config;
 static struct git_config_source given_config_source;
 static int actions, types;
 static int end_null;
-static int respect_includes = -1;
+static int respect_includes_opt = -1;
+static struct config_options config_options;
 static int show_origin;
 
 #define ACTION_GET (1<<0)
@@ -81,7 +82,7 @@ static struct option builtin_config_options[] = {
        OPT_GROUP(N_("Other")),
        OPT_BOOL('z', "null", &end_null, N_("terminate values with NUL byte")),
        OPT_BOOL(0, "name-only", &omit_values, N_("show variable names only")),
-       OPT_BOOL(0, "includes", &respect_includes, N_("respect include directives on lookup")),
+       OPT_BOOL(0, "includes", &respect_includes_opt, N_("respect include directives on lookup")),
        OPT_BOOL(0, "show-origin", &show_origin, N_("show origin of config (file, standard input, blob, command line)")),
        OPT_END(),
 };
@@ -242,7 +243,7 @@ static int get_value(const char *key_, const char *regex_)
        }
 
        git_config_with_options(collect_config, &values,
-                               &given_config_source, respect_includes);
+                               &given_config_source, &config_options);
 
        ret = !values.nr;
 
@@ -320,7 +321,7 @@ static void get_color(const char *var, const char *def_color)
        get_color_found = 0;
        parsed_color[0] = '\0';
        git_config_with_options(git_get_color_config, NULL,
-                               &given_config_source, respect_includes);
+                               &given_config_source, &config_options);
 
        if (!get_color_found && def_color) {
                if (color_parse(def_color, parsed_color) < 0)
@@ -352,7 +353,7 @@ static int get_colorbool(const char *var, int print)
        get_diff_color_found = -1;
        get_color_ui_found = -1;
        git_config_with_options(git_get_colorbool_config, NULL,
-                               &given_config_source, respect_includes);
+                               &given_config_source, &config_options);
 
        if (get_colorbool_found < 0) {
                if (!strcmp(get_colorbool_slot, "color.diff"))
@@ -441,7 +442,7 @@ static int get_urlmatch(const char *var, const char *url)
        }
 
        git_config_with_options(urlmatch_config_entry, &config,
-                               &given_config_source, respect_includes);
+                               &given_config_source, &config_options);
 
        ret = !values.nr;
 
@@ -495,6 +496,9 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                usage_with_options(builtin_config_usage, builtin_config_options);
        }
 
+       if (use_local_config && nongit)
+               die(_("--local can only be used inside a git repository"));
+
        if (given_config_source.file &&
                        !strcmp(given_config_source.file, "-")) {
                given_config_source.file = NULL;
@@ -502,7 +506,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        }
 
        if (use_global_config) {
-               char *user_config = expand_user_path("~/.gitconfig");
+               char *user_config = expand_user_path("~/.gitconfig", 0);
                char *xdg_config = xdg_config_home("config");
 
                if (!user_config)
@@ -527,13 +531,13 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        else if (given_config_source.file) {
                if (!is_absolute_path(given_config_source.file) && prefix)
                        given_config_source.file =
-                               xstrdup(prefix_filename(prefix,
-                                                       strlen(prefix),
-                                                       given_config_source.file));
+                               prefix_filename(prefix, given_config_source.file);
        }
 
-       if (respect_includes == -1)
-               respect_includes = !given_config_source.file;
+       if (respect_includes_opt == -1)
+               config_options.respect_includes = !given_config_source.file;
+       else
+               config_options.respect_includes = respect_includes_opt;
 
        if (end_null) {
                term = '\0';
@@ -580,7 +584,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                check_argc(argc, 0, 0);
                if (git_config_with_options(show_all_config, NULL,
                                            &given_config_source,
-                                           respect_includes) < 0) {
+                                           &config_options) < 0) {
                        if (given_config_source.file)
                                die_errno("unable to read config file '%s'",
                                          given_config_source.file);
@@ -599,8 +603,9 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                if (given_config_source.blob)
                        die("editing blobs is not supported");
                git_config(git_default_config, NULL);
-               config_file = xstrdup(given_config_source.file ?
-                                     given_config_source.file : git_path("config"));
+               config_file = given_config_source.file ?
+                               xstrdup(given_config_source.file) :
+                               git_pathdup("config");
                if (use_global_config) {
                        int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, 0666);
                        if (fd >= 0) {
@@ -622,8 +627,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                value = normalize_value(argv[0], argv[1]);
                ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value);
                if (ret == CONFIG_NOTHING_SET)
-                       error("cannot overwrite multiple values with a single value\n"
-                       "       Use a regexp, --add or --replace-all to change %s.", argv[0]);
+                       error(_("cannot overwrite multiple values with a single value\n"
+                       "       Use a regexp, --add or --replace-all to change %s."), argv[0]);
                return ret;
        }
        else if (actions == ACTION_SET_ALL) {
index ba9291944f7752a0b7c671cd4d63309a15ba5df2..acb05940fc3cd902d4c9bfa480f2c473dcc4d9d5 100644 (file)
@@ -8,6 +8,7 @@
 #include "dir.h"
 #include "builtin.h"
 #include "parse-options.h"
+#include "quote.h"
 
 static unsigned long garbage;
 static off_t size_garbage;
@@ -52,7 +53,7 @@ static void loose_garbage(const char *path)
                report_garbage(PACKDIR_FILE_GARBAGE, path);
 }
 
-static int count_loose(const unsigned char *sha1, const char *path, void *data)
+static int count_loose(const struct object_id *oid, const char *path, void *data)
 {
        struct stat st;
 
@@ -61,7 +62,7 @@ static int count_loose(const unsigned char *sha1, const char *path, void *data)
        else {
                loose_size += on_disk_bytes(st);
                loose++;
-               if (verbose && has_sha1_pack(sha1))
+               if (verbose && has_sha1_pack(oid->hash))
                        packed_loose++;
        }
        return 0;
@@ -73,6 +74,14 @@ static int count_cruft(const char *basename, const char *path, void *data)
        return 0;
 }
 
+static int print_alternate(struct alternate_object_database *alt, void *data)
+{
+       printf("alternate: ");
+       quote_c_style(alt->path, NULL, stdout, 0);
+       putchar('\n');
+       return 0;
+}
+
 static char const * const count_objects_usage[] = {
        N_("git count-objects [-v] [-H | --human-readable]"),
        NULL
@@ -88,6 +97,8 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
                OPT_END(),
        };
 
+       git_config(git_default_config, NULL);
+
        argc = parse_options(argc, argv, prefix, opts, count_objects_usage, 0);
        /* we do not take arguments other than flags for now */
        if (argc)
@@ -140,6 +151,7 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
                printf("prune-packable: %lu\n", packed_loose);
                printf("garbage: %lu\n", garbage);
                printf("size-garbage: %s\n", garbage_buf.buf);
+               foreach_alt_odb(print_alternate, NULL);
                strbuf_release(&loose_buf);
                strbuf_release(&pack_buf);
                strbuf_release(&garbage_buf);
index 8a25abe0a03e2b2463ac352daafc326c4322ac32..a5cd8c513f96baaaa0d9a310e2bf02b8db41199b 100644 (file)
@@ -9,6 +9,7 @@
 #include "diff.h"
 #include "hashmap.h"
 #include "argv-array.h"
+#include "run-command.h"
 
 #define SEEN           (1u << 0)
 #define MAX_TAGS       (FLAG_BITS - 1)
@@ -28,9 +29,10 @@ static int abbrev = -1; /* unspecified */
 static int max_candidates = 10;
 static struct hashmap names;
 static int have_util;
-static const char *pattern;
+static struct string_list patterns = STRING_LIST_INIT_NODUP;
+static struct string_list exclude_patterns = STRING_LIST_INIT_NODUP;
 static int always;
-static const char *dirty;
+static const char *suffix, *dirty, *broken;
 
 /* diff-index command arguments to check if working tree is dirty. */
 static const char *diff_index_args[] = {
@@ -39,32 +41,32 @@ static const char *diff_index_args[] = {
 
 struct commit_name {
        struct hashmap_entry entry;
-       unsigned char peeled[20];
+       struct object_id peeled;
        struct tag *tag;
        unsigned prio:2; /* annotated tag = 2, tag = 1, head = 0 */
        unsigned name_checked:1;
-       unsigned char sha1[20];
+       struct object_id oid;
        char *path;
 };
 
 static const char *prio_names[] = {
-       "head", "lightweight", "annotated",
+       N_("head"), N_("lightweight"), N_("annotated"),
 };
 
 static int commit_name_cmp(const struct commit_name *cn1,
                const struct commit_name *cn2, const void *peeled)
 {
-       return hashcmp(cn1->peeled, peeled ? peeled : cn2->peeled);
+       return oidcmp(&cn1->peeled, peeled ? peeled : &cn2->peeled);
 }
 
-static inline struct commit_name *find_commit_name(const unsigned char *peeled)
+static inline struct commit_name *find_commit_name(const struct object_id *peeled)
 {
-       return hashmap_get_from_hash(&names, sha1hash(peeled), peeled);
+       return hashmap_get_from_hash(&names, sha1hash(peeled->hash), peeled->hash);
 }
 
 static int replace_name(struct commit_name *e,
                               int prio,
-                              const unsigned char *sha1,
+                              const struct object_id *oid,
                               struct tag **tag)
 {
        if (!e || e->prio < prio)
@@ -77,13 +79,13 @@ static int replace_name(struct commit_name *e,
                struct tag *t;
 
                if (!e->tag) {
-                       t = lookup_tag(e->sha1);
+                       t = lookup_tag(e->oid.hash);
                        if (!t || parse_tag(t))
                                return 1;
                        e->tag = t;
                }
 
-               t = lookup_tag(sha1);
+               t = lookup_tag(oid->hash);
                if (!t || parse_tag(t))
                        return 0;
                *tag = t;
@@ -96,24 +98,24 @@ static int replace_name(struct commit_name *e,
 }
 
 static void add_to_known_names(const char *path,
-                              const unsigned char *peeled,
+                              const struct object_id *peeled,
                               int prio,
-                              const unsigned char *sha1)
+                              const struct object_id *oid)
 {
        struct commit_name *e = find_commit_name(peeled);
        struct tag *tag = NULL;
-       if (replace_name(e, prio, sha1, &tag)) {
+       if (replace_name(e, prio, oid, &tag)) {
                if (!e) {
                        e = xmalloc(sizeof(struct commit_name));
-                       hashcpy(e->peeled, peeled);
-                       hashmap_entry_init(e, sha1hash(peeled));
+                       oidcpy(&e->peeled, peeled);
+                       hashmap_entry_init(e, sha1hash(peeled->hash));
                        hashmap_add(&names, e);
                        e->path = NULL;
                }
                e->tag = tag;
                e->prio = prio;
                e->name_checked = 0;
-               hashcpy(e->sha1, sha1);
+               oidcpy(&e->oid, oid);
                free(e->path);
                e->path = xstrdup(path);
        }
@@ -129,9 +131,40 @@ static int get_name(const char *path, const struct object_id *oid, int flag, voi
        if (!all && !is_tag)
                return 0;
 
-       /* Accept only tags that match the pattern, if given */
-       if (pattern && (!is_tag || wildmatch(pattern, path + 10, 0, NULL)))
-               return 0;
+       /*
+        * If we're given exclude patterns, first exclude any tag which match
+        * any of the exclude pattern.
+        */
+       if (exclude_patterns.nr) {
+               struct string_list_item *item;
+
+               if (!is_tag)
+                       return 0;
+
+               for_each_string_list_item(item, &exclude_patterns) {
+                       if (!wildmatch(item->string, path + 10, 0, NULL))
+                               return 0;
+               }
+       }
+
+       /*
+        * If we're given patterns, accept only tags which match at least one
+        * pattern.
+        */
+       if (patterns.nr) {
+               struct string_list_item *item;
+
+               if (!is_tag)
+                       return 0;
+
+               for_each_string_list_item(item, &patterns) {
+                       if (!wildmatch(item->string, path + 10, 0, NULL))
+                               break;
+
+                       /* If we get here, no pattern matched. */
+                       return 0;
+               }
+       }
 
        /* Is it annotated? */
        if (!peel_ref(path, peeled.hash)) {
@@ -154,7 +187,7 @@ static int get_name(const char *path, const struct object_id *oid, int flag, voi
        else
                prio = 0;
 
-       add_to_known_names(all ? path + 5 : path + 10, peeled.hash, prio, oid->hash);
+       add_to_known_names(all ? path + 5 : path + 10, &peeled, prio, oid);
        return 0;
 }
 
@@ -212,7 +245,7 @@ static unsigned long finish_depth_computation(
 static void display_name(struct commit_name *n)
 {
        if (n->prio == 2 && !n->tag) {
-               n->tag = lookup_tag(n->sha1);
+               n->tag = lookup_tag(n->oid.hash);
                if (!n->tag || parse_tag(n->tag))
                        die(_("annotated tag %s not available"), n->path);
        }
@@ -230,14 +263,14 @@ static void display_name(struct commit_name *n)
                printf("%s", n->path);
 }
 
-static void show_suffix(int depth, const unsigned char *sha1)
+static void show_suffix(int depth, const struct object_id *oid)
 {
-       printf("-%d-g%s", depth, find_unique_abbrev(sha1, abbrev));
+       printf("-%d-g%s", depth, find_unique_abbrev(oid->hash, abbrev));
 }
 
 static void describe(const char *arg, int last_one)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
        struct commit *cmit, *gave_up_on = NULL;
        struct commit_list *list;
        struct commit_name *n;
@@ -246,22 +279,22 @@ static void describe(const char *arg, int last_one)
        unsigned long seen_commits = 0;
        unsigned int unannotated_cnt = 0;
 
-       if (get_sha1(arg, sha1))
+       if (get_oid(arg, &oid))
                die(_("Not a valid object name %s"), arg);
-       cmit = lookup_commit_reference(sha1);
+       cmit = lookup_commit_reference(oid.hash);
        if (!cmit)
                die(_("%s is not a valid '%s' object"), arg, commit_type);
 
-       n = find_commit_name(cmit->object.oid.hash);
+       n = find_commit_name(&cmit->object.oid);
        if (n && (tags || all || n->prio == 2)) {
                /*
                 * Exact match to an existing ref.
                 */
                display_name(n);
                if (longformat)
-                       show_suffix(0, n->tag ? n->tag->tagged->oid.hash : sha1);
-               if (dirty)
-                       printf("%s", dirty);
+                       show_suffix(0, n->tag ? &n->tag->tagged->oid : &oid);
+               if (suffix)
+                       printf("%s", suffix);
                printf("\n");
                return;
        }
@@ -276,7 +309,7 @@ static void describe(const char *arg, int last_one)
                struct commit *c;
                struct commit_name *n = hashmap_iter_first(&names, &iter);
                for (; n; n = hashmap_iter_next(&iter)) {
-                       c = lookup_commit_reference_gently(n->peeled, 1);
+                       c = lookup_commit_reference_gently(n->peeled.hash, 1);
                        if (c)
                                c->util = n;
                }
@@ -337,8 +370,8 @@ static void describe(const char *arg, int last_one)
                struct object_id *oid = &cmit->object.oid;
                if (always) {
                        printf("%s", find_unique_abbrev(oid->hash, abbrev));
-                       if (dirty)
-                               printf("%s", dirty);
+                       if (suffix)
+                               printf("%s", suffix);
                        printf("\n");
                        return;
                }
@@ -352,7 +385,7 @@ static void describe(const char *arg, int last_one)
                            oid_to_hex(oid));
        }
 
-       qsort(all_matches, match_cnt, sizeof(all_matches[0]), compare_pt);
+       QSORT(all_matches, match_cnt, compare_pt);
 
        if (gave_up_on) {
                commit_list_insert_by_date(gave_up_on, &list);
@@ -362,10 +395,19 @@ static void describe(const char *arg, int last_one)
        free_commit_list(list);
 
        if (debug) {
+               static int label_width = -1;
+               if (label_width < 0) {
+                       int i, w;
+                       for (i = 0; i < ARRAY_SIZE(prio_names); i++) {
+                               w = strlen(_(prio_names[i]));
+                               if (label_width < w)
+                                       label_width = w;
+                       }
+               }
                for (cur_match = 0; cur_match < match_cnt; cur_match++) {
                        struct possible_tag *t = &all_matches[cur_match];
-                       fprintf(stderr, " %-11s %8d %s\n",
-                               prio_names[t->name->prio],
+                       fprintf(stderr, " %-*s %8d %s\n",
+                               label_width, _(prio_names[t->name->prio]),
                                t->depth, t->name->path);
                }
                fprintf(stderr, _("traversed %lu commits\n"), seen_commits);
@@ -380,9 +422,9 @@ static void describe(const char *arg, int last_one)
 
        display_name(all_matches[0].name);
        if (abbrev)
-               show_suffix(all_matches[0].depth, cmit->object.oid.hash);
-       if (dirty)
-               printf("%s", dirty);
+               show_suffix(all_matches[0].depth, &cmit->object.oid);
+       if (suffix)
+               printf("%s", suffix);
        printf("\n");
 
        if (!last_one)
@@ -404,13 +446,18 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                            N_("only output exact matches"), 0),
                OPT_INTEGER(0, "candidates", &max_candidates,
                            N_("consider <n> most recent tags (default: 10)")),
-               OPT_STRING(0, "match",       &pattern, N_("pattern"),
+               OPT_STRING_LIST(0, "match", &patterns, N_("pattern"),
                           N_("only consider tags matching <pattern>")),
+               OPT_STRING_LIST(0, "exclude", &exclude_patterns, N_("pattern"),
+                          N_("do not consider tags matching <pattern>")),
                OPT_BOOL(0, "always",        &always,
                        N_("show abbreviated commit object as fallback")),
                {OPTION_STRING, 0, "dirty",  &dirty, N_("mark"),
                        N_("append <mark> on dirty working tree (default: \"-dirty\")"),
                        PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"},
+               {OPTION_STRING, 0, "broken",  &broken, N_("mark"),
+                       N_("append <mark> on broken working tree (default: \"-broken\")"),
+                       PARSE_OPT_OPTARG, NULL, (intptr_t) "-broken"},
                OPT_END(),
        };
 
@@ -430,6 +477,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                die(_("--long is incompatible with --abbrev=0"));
 
        if (contains) {
+               struct string_list_item *item;
                struct argv_array args;
 
                argv_array_init(&args);
@@ -440,8 +488,10 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                        argv_array_push(&args, "--always");
                if (!all) {
                        argv_array_push(&args, "--tags");
-                       if (pattern)
-                               argv_array_pushf(&args, "--refs=refs/tags/%s", pattern);
+                       for_each_string_list_item(item, &patterns)
+                               argv_array_pushf(&args, "--refs=refs/tags/%s", item->string);
+                       for_each_string_list_item(item, &exclude_patterns)
+                               argv_array_pushf(&args, "--exclude=refs/tags/%s", item->string);
                }
                if (argc)
                        argv_array_pushv(&args, argv);
@@ -456,7 +506,28 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                die(_("No names found, cannot describe anything."));
 
        if (argc == 0) {
-               if (dirty) {
+               if (broken) {
+                       struct child_process cp = CHILD_PROCESS_INIT;
+                       argv_array_pushv(&cp.args, diff_index_args);
+                       cp.git_cmd = 1;
+                       cp.no_stdin = 1;
+                       cp.no_stdout = 1;
+
+                       if (!dirty)
+                               dirty = "-dirty";
+
+                       switch (run_command(&cp)) {
+                       case 0:
+                               suffix = NULL;
+                               break;
+                       case 1:
+                               suffix = dirty;
+                               break;
+                       default:
+                               /* diff-index aborted abnormally */
+                               suffix = broken;
+                       }
+               } else if (dirty) {
                        static struct lock_file index_lock;
                        int fd;
 
@@ -469,11 +540,15 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
 
                        if (!cmd_diff_index(ARRAY_SIZE(diff_index_args) - 1,
                                            diff_index_args, prefix))
-                               dirty = NULL;
+                               suffix = NULL;
+                       else
+                               suffix = dirty;
                }
                describe("HEAD", 1);
        } else if (dirty) {
                die(_("--dirty is incompatible with commit-ishes"));
+       } else if (broken) {
+               die(_("--broken is incompatible with commit-ishes"));
        } else {
                while (argc-- > 0)
                        describe(*argv++, argc == 0);
index 806dd7a885e9e7b87e19ca8acd2b6d0383b41d85..a570fea55b760809ac276cedbed8de9f7f95e44b 100644 (file)
@@ -7,46 +7,44 @@
 
 static struct rev_info log_tree_opt;
 
-static int diff_tree_commit_sha1(const unsigned char *sha1)
+static int diff_tree_commit_sha1(const struct object_id *oid)
 {
-       struct commit *commit = lookup_commit_reference(sha1);
+       struct commit *commit = lookup_commit_reference(oid->hash);
        if (!commit)
                return -1;
        return log_tree_commit(&log_tree_opt, commit);
 }
 
 /* Diff one or more commits. */
-static int stdin_diff_commit(struct commit *commit, char *line, int len)
+static int stdin_diff_commit(struct commit *commit, const char *p)
 {
-       unsigned char sha1[20];
-       if (isspace(line[40]) && !get_sha1_hex(line+41, sha1)) {
-               /* Graft the fake parents locally to the commit */
-               int pos = 41;
-               struct commit_list **pptr;
-
-               /* Free the real parent list */
-               free_commit_list(commit->parents);
-               commit->parents = NULL;
-               pptr = &(commit->parents);
-               while (line[pos] && !get_sha1_hex(line + pos, sha1)) {
-                       struct commit *parent = lookup_commit(sha1);
-                       if (parent) {
-                               pptr = &commit_list_insert(parent, pptr)->next;
-                       }
-                       pos += 41;
+       struct object_id oid;
+       struct commit_list **pptr = NULL;
+
+       /* Graft the fake parents locally to the commit */
+       while (isspace(*p++) && !parse_oid_hex(p, &oid, &p)) {
+               struct commit *parent = lookup_commit(oid.hash);
+               if (!pptr) {
+                       /* Free the real parent list */
+                       free_commit_list(commit->parents);
+                       commit->parents = NULL;
+                       pptr = &(commit->parents);
+               }
+               if (parent) {
+                       pptr = &commit_list_insert(parent, pptr)->next;
                }
        }
        return log_tree_commit(&log_tree_opt, commit);
 }
 
 /* Diff two trees. */
-static int stdin_diff_trees(struct tree *tree1, char *line, int len)
+static int stdin_diff_trees(struct tree *tree1, const char *p)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
        struct tree *tree2;
-       if (len != 82 || !isspace(line[40]) || get_sha1_hex(line + 41, sha1))
+       if (!isspace(*p++) || parse_oid_hex(p, &oid, &p) || *p)
                return error("Need exactly two trees, separated by a space");
-       tree2 = lookup_tree(sha1);
+       tree2 = lookup_tree(oid.hash);
        if (!tree2 || parse_tree(tree2))
                return -1;
        printf("%s %s\n", oid_to_hex(&tree1->object.oid),
@@ -60,23 +58,24 @@ static int stdin_diff_trees(struct tree *tree1, char *line, int len)
 static int diff_tree_stdin(char *line)
 {
        int len = strlen(line);
-       unsigned char sha1[20];
+       struct object_id oid;
        struct object *obj;
+       const char *p;
 
        if (!len || line[len-1] != '\n')
                return -1;
        line[len-1] = 0;
-       if (get_sha1_hex(line, sha1))
+       if (parse_oid_hex(line, &oid, &p))
                return -1;
-       obj = parse_object(sha1);
+       obj = parse_object(oid.hash);
        if (!obj)
                return -1;
        if (obj->type == OBJ_COMMIT)
-               return stdin_diff_commit((struct commit *)obj, line, len);
+               return stdin_diff_commit((struct commit *)obj, p);
        if (obj->type == OBJ_TREE)
-               return stdin_diff_trees((struct tree *)obj, line, len);
+               return stdin_diff_trees((struct tree *)obj, p);
        error("Object %s is a %s, not a commit or tree",
-             sha1_to_hex(sha1), typename(obj->type));
+             oid_to_hex(&oid), typename(obj->type));
        return -1;
 }
 
@@ -129,9 +128,11 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
        }
 
        /*
-        * NOTE! We expect "a ^b" to be equal to "a..b", so we
-        * reverse the order of the objects if the second one
-        * is marked UNINTERESTING.
+        * NOTE!  We expect "a..b" to expand to "^a b" but it is
+        * perfectly valid for revision range parser to yield "b ^a",
+        * which means the same thing. If we get the latter, i.e. the
+        * second one is marked UNINTERESTING, we recover the original
+        * order the user gave, i.e. "a..b", by swapping the trees.
         */
        nr_sha1 = opt->pending.nr;
        switch (nr_sha1) {
@@ -141,15 +142,13 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
                break;
        case 1:
                tree1 = opt->pending.objects[0].item;
-               diff_tree_commit_sha1(tree1->oid.hash);
+               diff_tree_commit_sha1(&tree1->oid);
                break;
        case 2:
                tree1 = opt->pending.objects[0].item;
                tree2 = opt->pending.objects[1].item;
                if (tree2->flags & UNINTERESTING) {
-                       struct object *tmp = tree2;
-                       tree2 = tree1;
-                       tree1 = tmp;
+                       SWAP(tree2, tree1);
                }
                diff_tree_sha1(tree1->oid.hash,
                               tree2->oid.hash,
@@ -166,9 +165,9 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
                        opt->diffopt.setup |= (DIFF_SETUP_USE_SIZE_CACHE |
                                               DIFF_SETUP_USE_CACHE);
                while (fgets(line, sizeof(line), stdin)) {
-                       unsigned char sha1[20];
+                       struct object_id oid;
 
-                       if (get_sha1_hex(line, sha1)) {
+                       if (get_oid_hex(line, &oid)) {
                                fputs(line, stdout);
                                fflush(stdout);
                        }
index b7a9405d9fbec46edf99637557d7499fb58c4d77..5e7c6428c91203fa1f3fb0c7790364987a623fc0 100644 (file)
 #define DIFF_NO_INDEX_EXPLICIT 1
 #define DIFF_NO_INDEX_IMPLICIT 2
 
-struct blobinfo {
-       unsigned char sha1[20];
-       const char *name;
-       unsigned mode;
-};
-
 static const char builtin_diff_usage[] =
 "git diff [<options>] [<commit> [<commit>]] [--] [<path>...]";
 
+static const char *blob_path(struct object_array_entry *entry)
+{
+       return entry->path ? entry->path : entry->name;
+}
+
 static void stuff_change(struct diff_options *opt,
                         unsigned old_mode, unsigned new_mode,
-                        const unsigned char *old_sha1,
-                        const unsigned char *new_sha1,
-                        int old_sha1_valid,
-                        int new_sha1_valid,
-                        const char *old_name,
-                        const char *new_name)
+                        const struct object_id *old_oid,
+                        const struct object_id *new_oid,
+                        int old_oid_valid,
+                        int new_oid_valid,
+                        const char *old_path,
+                        const char *new_path)
 {
        struct diff_filespec *one, *two;
 
-       if (!is_null_sha1(old_sha1) && !is_null_sha1(new_sha1) &&
-           !hashcmp(old_sha1, new_sha1) && (old_mode == new_mode))
+       if (!is_null_oid(old_oid) && !is_null_oid(new_oid) &&
+           !oidcmp(old_oid, new_oid) && (old_mode == new_mode))
                return;
 
        if (DIFF_OPT_TST(opt, REVERSE_DIFF)) {
-               unsigned tmp;
-               const unsigned char *tmp_u;
-               const char *tmp_c;
-               tmp = old_mode; old_mode = new_mode; new_mode = tmp;
-               tmp_u = old_sha1; old_sha1 = new_sha1; new_sha1 = tmp_u;
-               tmp_c = old_name; old_name = new_name; new_name = tmp_c;
+               SWAP(old_mode, new_mode);
+               SWAP(old_oid, new_oid);
+               SWAP(old_path, new_path);
        }
 
        if (opt->prefix &&
-           (strncmp(old_name, opt->prefix, opt->prefix_length) ||
-            strncmp(new_name, opt->prefix, opt->prefix_length)))
+           (strncmp(old_path, opt->prefix, opt->prefix_length) ||
+            strncmp(new_path, opt->prefix, opt->prefix_length)))
                return;
 
-       one = alloc_filespec(old_name);
-       two = alloc_filespec(new_name);
-       fill_filespec(one, old_sha1, old_sha1_valid, old_mode);
-       fill_filespec(two, new_sha1, new_sha1_valid, new_mode);
+       one = alloc_filespec(old_path);
+       two = alloc_filespec(new_path);
+       fill_filespec(one, old_oid->hash, old_oid_valid, old_mode);
+       fill_filespec(two, new_oid->hash, new_oid_valid, new_mode);
 
        diff_queue(&diff_queued_diff, one, two);
 }
 
 static int builtin_diff_b_f(struct rev_info *revs,
                            int argc, const char **argv,
-                           struct blobinfo *blob)
+                           struct object_array_entry **blob)
 {
        /* Blob vs file in the working tree*/
        struct stat st;
@@ -87,14 +83,15 @@ static int builtin_diff_b_f(struct rev_info *revs,
 
        diff_set_mnemonic_prefix(&revs->diffopt, "o/", "w/");
 
-       if (blob[0].mode == S_IFINVALID)
-               blob[0].mode = canon_mode(st.st_mode);
+       if (blob[0]->mode == S_IFINVALID)
+               blob[0]->mode = canon_mode(st.st_mode);
 
        stuff_change(&revs->diffopt,
-                    blob[0].mode, canon_mode(st.st_mode),
-                    blob[0].sha1, null_sha1,
+                    blob[0]->mode, canon_mode(st.st_mode),
+                    &blob[0]->item->oid, &null_oid,
                     1, 0,
-                    path, path);
+                    blob[0]->path ? blob[0]->path : path,
+                    path);
        diffcore_std(&revs->diffopt);
        diff_flush(&revs->diffopt);
        return 0;
@@ -102,24 +99,24 @@ static int builtin_diff_b_f(struct rev_info *revs,
 
 static int builtin_diff_blobs(struct rev_info *revs,
                              int argc, const char **argv,
-                             struct blobinfo *blob)
+                             struct object_array_entry **blob)
 {
        unsigned mode = canon_mode(S_IFREG | 0644);
 
        if (argc > 1)
                usage(builtin_diff_usage);
 
-       if (blob[0].mode == S_IFINVALID)
-               blob[0].mode = mode;
+       if (blob[0]->mode == S_IFINVALID)
+               blob[0]->mode = mode;
 
-       if (blob[1].mode == S_IFINVALID)
-               blob[1].mode = mode;
+       if (blob[1]->mode == S_IFINVALID)
+               blob[1]->mode = mode;
 
        stuff_change(&revs->diffopt,
-                    blob[0].mode, blob[1].mode,
-                    blob[0].sha1, blob[1].sha1,
+                    blob[0]->mode, blob[1]->mode,
+                    &blob[0]->item->oid, &blob[1]->item->oid,
                     1, 1,
-                    blob[0].name, blob[1].name);
+                    blob_path(blob[0]), blob_path(blob[1]));
        diffcore_std(&revs->diffopt);
        diff_flush(&revs->diffopt);
        return 0;
@@ -163,7 +160,7 @@ static int builtin_diff_tree(struct rev_info *revs,
                             struct object_array_entry *ent0,
                             struct object_array_entry *ent1)
 {
-       const unsigned char *(sha1[2]);
+       const struct object_id *(oid[2]);
        int swap = 0;
 
        if (argc > 1)
@@ -175,9 +172,9 @@ static int builtin_diff_tree(struct rev_info *revs,
         */
        if (ent1->item->flags & UNINTERESTING)
                swap = 1;
-       sha1[swap] = ent0->item->oid.hash;
-       sha1[1 - swap] = ent1->item->oid.hash;
-       diff_tree_sha1(sha1[0], sha1[1], "", &revs->diffopt);
+       oid[swap] = &ent0->item->oid;
+       oid[1 - swap] = &ent1->item->oid;
+       diff_tree_sha1(oid[0]->hash, oid[1]->hash, "", &revs->diffopt);
        log_tree_diff_flush(revs);
        return 0;
 }
@@ -187,7 +184,7 @@ static int builtin_diff_combined(struct rev_info *revs,
                                 struct object_array_entry *ent,
                                 int ents)
 {
-       struct sha1_array parents = SHA1_ARRAY_INIT;
+       struct oid_array parents = OID_ARRAY_INIT;
        int i;
 
        if (argc > 1)
@@ -196,10 +193,10 @@ static int builtin_diff_combined(struct rev_info *revs,
        if (!revs->dense_combined_merges && !revs->combine_merges)
                revs->dense_combined_merges = revs->combine_merges = 1;
        for (i = 1; i < ents; i++)
-               sha1_array_append(&parents, ent[i].item->oid.hash);
+               oid_array_append(&parents, &ent[i].item->oid);
        diff_tree_combined(ent[0].item->oid.hash, &parents,
                           revs->dense_combined_merges, revs);
-       sha1_array_clear(&parents);
+       oid_array_clear(&parents);
        return 0;
 }
 
@@ -262,7 +259,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
        struct rev_info rev;
        struct object_array ent = OBJECT_ARRAY_INIT;
        int blobs = 0, paths = 0;
-       struct blobinfo blob[2];
+       struct object_array_entry *blob[2];
        int nongit = 0, no_index = 0;
        int result = 0;
 
@@ -301,20 +298,21 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                        break;
        }
 
-       if (!no_index)
-               prefix = setup_git_directory_gently(&nongit);
+       prefix = setup_git_directory_gently(&nongit);
 
-       /*
-        * Treat git diff with at least one path outside of the
-        * repo the same as if the command would have been executed
-        * outside of a git repository.  In this case it behaves
-        * the same way as "git diff --no-index <a> <b>", which acts
-        * as a colourful "diff" replacement.
-        */
-       if (nongit || ((argc == i + 2) &&
-                      (!path_inside_repo(prefix, argv[i]) ||
-                       !path_inside_repo(prefix, argv[i + 1]))))
-               no_index = DIFF_NO_INDEX_IMPLICIT;
+       if (!no_index) {
+               /*
+                * Treat git diff with at least one path outside of the
+                * repo the same as if the command would have been executed
+                * outside of a git repository.  In this case it behaves
+                * the same way as "git diff --no-index <a> <b>", which acts
+                * as a colourful "diff" replacement.
+                */
+               if (nongit || ((argc == i + 2) &&
+                              (!path_inside_repo(prefix, argv[i]) ||
+                               !path_inside_repo(prefix, argv[i + 1]))))
+                       no_index = DIFF_NO_INDEX_IMPLICIT;
+       }
 
        if (!no_index)
                gitmodules_config();
@@ -410,9 +408,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                } else if (obj->type == OBJ_BLOB) {
                        if (2 <= blobs)
                                die(_("more than two blobs given: '%s'"), name);
-                       hashcpy(blob[blobs].sha1, obj->oid.hash);
-                       blob[blobs].name = name;
-                       blob[blobs].mode = entry->mode;
+                       blob[blobs] = entry;
                        blobs++;
 
                } else {
diff --git a/builtin/difftool.c b/builtin/difftool.c
new file mode 100644 (file)
index 0000000..b9a892f
--- /dev/null
@@ -0,0 +1,748 @@
+/*
+ * "git difftool" builtin command
+ *
+ * This is a wrapper around the GIT_EXTERNAL_DIFF-compatible
+ * git-difftool--helper script.
+ *
+ * This script exports GIT_EXTERNAL_DIFF and GIT_PAGER for use by git.
+ * The GIT_DIFF* variables are exported for use by git-difftool--helper.
+ *
+ * Any arguments that are unknown to this script are forwarded to 'git diff'.
+ *
+ * Copyright (C) 2016 Johannes Schindelin
+ */
+#include "cache.h"
+#include "builtin.h"
+#include "run-command.h"
+#include "exec_cmd.h"
+#include "parse-options.h"
+#include "argv-array.h"
+#include "strbuf.h"
+#include "lockfile.h"
+#include "dir.h"
+
+static char *diff_gui_tool;
+static int trust_exit_code;
+
+static const char *const builtin_difftool_usage[] = {
+       N_("git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"),
+       NULL
+};
+
+static int difftool_config(const char *var, const char *value, void *cb)
+{
+       if (!strcmp(var, "diff.guitool")) {
+               diff_gui_tool = xstrdup(value);
+               return 0;
+       }
+
+       if (!strcmp(var, "difftool.trustexitcode")) {
+               trust_exit_code = git_config_bool(var, value);
+               return 0;
+       }
+
+       return git_default_config(var, value, cb);
+}
+
+static int print_tool_help(void)
+{
+       const char *argv[] = { "mergetool", "--tool-help=diff", NULL };
+       return run_command_v_opt(argv, RUN_GIT_CMD);
+}
+
+static int parse_index_info(char *p, int *mode1, int *mode2,
+                           struct object_id *oid1, struct object_id *oid2,
+                           char *status)
+{
+       if (*p != ':')
+               return error("expected ':', got '%c'", *p);
+       *mode1 = (int)strtol(p + 1, &p, 8);
+       if (*p != ' ')
+               return error("expected ' ', got '%c'", *p);
+       *mode2 = (int)strtol(p + 1, &p, 8);
+       if (*p != ' ')
+               return error("expected ' ', got '%c'", *p);
+       if (get_oid_hex(++p, oid1))
+               return error("expected object ID, got '%s'", p + 1);
+       p += GIT_SHA1_HEXSZ;
+       if (*p != ' ')
+               return error("expected ' ', got '%c'", *p);
+       if (get_oid_hex(++p, oid2))
+               return error("expected object ID, got '%s'", p + 1);
+       p += GIT_SHA1_HEXSZ;
+       if (*p != ' ')
+               return error("expected ' ', got '%c'", *p);
+       *status = *++p;
+       if (!*status)
+               return error("missing status");
+       if (p[1] && !isdigit(p[1]))
+               return error("unexpected trailer: '%s'", p + 1);
+       return 0;
+}
+
+/*
+ * Remove any trailing slash from $workdir
+ * before starting to avoid double slashes in symlink targets.
+ */
+static void add_path(struct strbuf *buf, size_t base_len, const char *path)
+{
+       strbuf_setlen(buf, base_len);
+       if (buf->len && buf->buf[buf->len - 1] != '/')
+               strbuf_addch(buf, '/');
+       strbuf_addstr(buf, path);
+}
+
+/*
+ * Determine whether we can simply reuse the file in the worktree.
+ */
+static int use_wt_file(const char *workdir, const char *name,
+                      struct object_id *oid)
+{
+       struct strbuf buf = STRBUF_INIT;
+       struct stat st;
+       int use = 0;
+
+       strbuf_addstr(&buf, workdir);
+       add_path(&buf, buf.len, name);
+
+       if (!lstat(buf.buf, &st) && !S_ISLNK(st.st_mode)) {
+               struct object_id wt_oid;
+               int fd = open(buf.buf, O_RDONLY);
+
+               if (fd >= 0 &&
+                   !index_fd(wt_oid.hash, fd, &st, OBJ_BLOB, name, 0)) {
+                       if (is_null_oid(oid)) {
+                               oidcpy(oid, &wt_oid);
+                               use = 1;
+                       } else if (!oidcmp(oid, &wt_oid))
+                               use = 1;
+               }
+       }
+
+       strbuf_release(&buf);
+
+       return use;
+}
+
+struct working_tree_entry {
+       struct hashmap_entry entry;
+       char path[FLEX_ARRAY];
+};
+
+static int working_tree_entry_cmp(struct working_tree_entry *a,
+                                 struct working_tree_entry *b, void *keydata)
+{
+       return strcmp(a->path, b->path);
+}
+
+/*
+ * The `left` and `right` entries hold paths for the symlinks hashmap,
+ * and a SHA-1 surrounded by brief text for submodules.
+ */
+struct pair_entry {
+       struct hashmap_entry entry;
+       char left[PATH_MAX], right[PATH_MAX];
+       const char path[FLEX_ARRAY];
+};
+
+static int pair_cmp(struct pair_entry *a, struct pair_entry *b, void *keydata)
+{
+       return strcmp(a->path, b->path);
+}
+
+static void add_left_or_right(struct hashmap *map, const char *path,
+                             const char *content, int is_right)
+{
+       struct pair_entry *e, *existing;
+
+       FLEX_ALLOC_STR(e, path, path);
+       hashmap_entry_init(e, strhash(path));
+       existing = hashmap_get(map, e, NULL);
+       if (existing) {
+               free(e);
+               e = existing;
+       } else {
+               e->left[0] = e->right[0] = '\0';
+               hashmap_add(map, e);
+       }
+       strlcpy(is_right ? e->right : e->left, content, PATH_MAX);
+}
+
+struct path_entry {
+       struct hashmap_entry entry;
+       char path[FLEX_ARRAY];
+};
+
+static int path_entry_cmp(struct path_entry *a, struct path_entry *b, void *key)
+{
+       return strcmp(a->path, key ? key : b->path);
+}
+
+static void changed_files(struct hashmap *result, const char *index_path,
+                         const char *workdir)
+{
+       struct child_process update_index = CHILD_PROCESS_INIT;
+       struct child_process diff_files = CHILD_PROCESS_INIT;
+       struct strbuf index_env = STRBUF_INIT, buf = STRBUF_INIT;
+       const char *git_dir = absolute_path(get_git_dir()), *env[] = {
+               NULL, NULL
+       };
+       FILE *fp;
+
+       strbuf_addf(&index_env, "GIT_INDEX_FILE=%s", index_path);
+       env[0] = index_env.buf;
+
+       argv_array_pushl(&update_index.args,
+                        "--git-dir", git_dir, "--work-tree", workdir,
+                        "update-index", "--really-refresh", "-q",
+                        "--unmerged", NULL);
+       update_index.no_stdin = 1;
+       update_index.no_stdout = 1;
+       update_index.no_stderr = 1;
+       update_index.git_cmd = 1;
+       update_index.use_shell = 0;
+       update_index.clean_on_exit = 1;
+       update_index.dir = workdir;
+       update_index.env = env;
+       /* Ignore any errors of update-index */
+       run_command(&update_index);
+
+       argv_array_pushl(&diff_files.args,
+                        "--git-dir", git_dir, "--work-tree", workdir,
+                        "diff-files", "--name-only", "-z", NULL);
+       diff_files.no_stdin = 1;
+       diff_files.git_cmd = 1;
+       diff_files.use_shell = 0;
+       diff_files.clean_on_exit = 1;
+       diff_files.out = -1;
+       diff_files.dir = workdir;
+       diff_files.env = env;
+       if (start_command(&diff_files))
+               die("could not obtain raw diff");
+       fp = xfdopen(diff_files.out, "r");
+       while (!strbuf_getline_nul(&buf, fp)) {
+               struct path_entry *entry;
+               FLEX_ALLOC_STR(entry, path, buf.buf);
+               hashmap_entry_init(entry, strhash(buf.buf));
+               hashmap_add(result, entry);
+       }
+       fclose(fp);
+       if (finish_command(&diff_files))
+               die("diff-files did not exit properly");
+       strbuf_release(&index_env);
+       strbuf_release(&buf);
+}
+
+static NORETURN void exit_cleanup(const char *tmpdir, int exit_code)
+{
+       struct strbuf buf = STRBUF_INIT;
+       strbuf_addstr(&buf, tmpdir);
+       remove_dir_recursively(&buf, 0);
+       if (exit_code)
+               warning(_("failed: %d"), exit_code);
+       exit(exit_code);
+}
+
+static int ensure_leading_directories(char *path)
+{
+       switch (safe_create_leading_directories(path)) {
+               case SCLD_OK:
+               case SCLD_EXISTS:
+                       return 0;
+               default:
+                       return error(_("could not create leading directories "
+                                      "of '%s'"), path);
+       }
+}
+
+/*
+ * Unconditional writing of a plain regular file is what
+ * "git difftool --dir-diff" wants to do for symlinks.  We are preparing two
+ * temporary directories to be fed to a Git-unaware tool that knows how to
+ * show a diff of two directories (e.g. "diff -r A B").
+ *
+ * Because the tool is Git-unaware, if a symbolic link appears in either of
+ * these temporary directories, it will try to dereference and show the
+ * difference of the target of the symbolic link, which is not what we want,
+ * as the goal of the dir-diff mode is to produce an output that is logically
+ * equivalent to what "git diff" produces.
+ *
+ * Most importantly, we want to get textual comparison of the result of the
+ * readlink(2).  get_symlink() provides that---it returns the contents of
+ * the symlink that gets written to a regular file to force the external tool
+ * to compare the readlink(2) result as text, even on a filesystem that is
+ * capable of doing a symbolic link.
+ */
+static char *get_symlink(const struct object_id *oid, const char *path)
+{
+       char *data;
+       if (is_null_oid(oid)) {
+               /* The symlink is unknown to Git so read from the filesystem */
+               struct strbuf link = STRBUF_INIT;
+               if (has_symlinks) {
+                       if (strbuf_readlink(&link, path, strlen(path)))
+                               die(_("could not read symlink %s"), path);
+               } else if (strbuf_read_file(&link, path, 128))
+                       die(_("could not read symlink file %s"), path);
+
+               data = strbuf_detach(&link, NULL);
+       } else {
+               enum object_type type;
+               unsigned long size;
+               data = read_sha1_file(oid->hash, &type, &size);
+               if (!data)
+                       die(_("could not read object %s for symlink %s"),
+                               oid_to_hex(oid), path);
+       }
+
+       return data;
+}
+
+static int checkout_path(unsigned mode, struct object_id *oid,
+                        const char *path, const struct checkout *state)
+{
+       struct cache_entry *ce;
+       int ret;
+
+       ce = make_cache_entry(mode, oid->hash, path, 0, 0);
+       ret = checkout_entry(ce, state, NULL);
+
+       free(ce);
+       return ret;
+}
+
+static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
+                       int argc, const char **argv)
+{
+       char tmpdir[PATH_MAX];
+       struct strbuf info = STRBUF_INIT, lpath = STRBUF_INIT;
+       struct strbuf rpath = STRBUF_INIT, buf = STRBUF_INIT;
+       struct strbuf ldir = STRBUF_INIT, rdir = STRBUF_INIT;
+       struct strbuf wtdir = STRBUF_INIT;
+       char *lbase_dir, *rbase_dir;
+       size_t ldir_len, rdir_len, wtdir_len;
+       const char *workdir, *tmp;
+       int ret = 0, i;
+       FILE *fp;
+       struct hashmap working_tree_dups, submodules, symlinks2;
+       struct hashmap_iter iter;
+       struct pair_entry *entry;
+       struct index_state wtindex;
+       struct checkout lstate, rstate;
+       int rc, flags = RUN_GIT_CMD, err = 0;
+       struct child_process child = CHILD_PROCESS_INIT;
+       const char *helper_argv[] = { "difftool--helper", NULL, NULL, NULL };
+       struct hashmap wt_modified, tmp_modified;
+       int indices_loaded = 0;
+
+       workdir = get_git_work_tree();
+
+       /* Setup temp directories */
+       tmp = getenv("TMPDIR");
+       xsnprintf(tmpdir, sizeof(tmpdir), "%s/git-difftool.XXXXXX", tmp ? tmp : "/tmp");
+       if (!mkdtemp(tmpdir))
+               return error("could not create '%s'", tmpdir);
+       strbuf_addf(&ldir, "%s/left/", tmpdir);
+       strbuf_addf(&rdir, "%s/right/", tmpdir);
+       strbuf_addstr(&wtdir, workdir);
+       if (!wtdir.len || !is_dir_sep(wtdir.buf[wtdir.len - 1]))
+               strbuf_addch(&wtdir, '/');
+       mkdir(ldir.buf, 0700);
+       mkdir(rdir.buf, 0700);
+
+       memset(&wtindex, 0, sizeof(wtindex));
+
+       memset(&lstate, 0, sizeof(lstate));
+       lstate.base_dir = lbase_dir = xstrdup(ldir.buf);
+       lstate.base_dir_len = ldir.len;
+       lstate.force = 1;
+       memset(&rstate, 0, sizeof(rstate));
+       rstate.base_dir = rbase_dir = xstrdup(rdir.buf);
+       rstate.base_dir_len = rdir.len;
+       rstate.force = 1;
+
+       ldir_len = ldir.len;
+       rdir_len = rdir.len;
+       wtdir_len = wtdir.len;
+
+       hashmap_init(&working_tree_dups,
+                    (hashmap_cmp_fn)working_tree_entry_cmp, 0);
+       hashmap_init(&submodules, (hashmap_cmp_fn)pair_cmp, 0);
+       hashmap_init(&symlinks2, (hashmap_cmp_fn)pair_cmp, 0);
+
+       child.no_stdin = 1;
+       child.git_cmd = 1;
+       child.use_shell = 0;
+       child.clean_on_exit = 1;
+       child.dir = prefix;
+       child.out = -1;
+       argv_array_pushl(&child.args, "diff", "--raw", "--no-abbrev", "-z",
+                        NULL);
+       for (i = 0; i < argc; i++)
+               argv_array_push(&child.args, argv[i]);
+       if (start_command(&child))
+               die("could not obtain raw diff");
+       fp = xfdopen(child.out, "r");
+
+       /* Build index info for left and right sides of the diff */
+       i = 0;
+       while (!strbuf_getline_nul(&info, fp)) {
+               int lmode, rmode;
+               struct object_id loid, roid;
+               char status;
+               const char *src_path, *dst_path;
+
+               if (starts_with(info.buf, "::"))
+                       die(N_("combined diff formats('-c' and '--cc') are "
+                              "not supported in\n"
+                              "directory diff mode('-d' and '--dir-diff')."));
+
+               if (parse_index_info(info.buf, &lmode, &rmode, &loid, &roid,
+                                    &status))
+                       break;
+               if (strbuf_getline_nul(&lpath, fp))
+                       break;
+               src_path = lpath.buf;
+
+               i++;
+               if (status != 'C' && status != 'R') {
+                       dst_path = src_path;
+               } else {
+                       if (strbuf_getline_nul(&rpath, fp))
+                               break;
+                       dst_path = rpath.buf;
+               }
+
+               if (S_ISGITLINK(lmode) || S_ISGITLINK(rmode)) {
+                       strbuf_reset(&buf);
+                       strbuf_addf(&buf, "Subproject commit %s",
+                                   oid_to_hex(&loid));
+                       add_left_or_right(&submodules, src_path, buf.buf, 0);
+                       strbuf_reset(&buf);
+                       strbuf_addf(&buf, "Subproject commit %s",
+                                   oid_to_hex(&roid));
+                       if (!oidcmp(&loid, &roid))
+                               strbuf_addstr(&buf, "-dirty");
+                       add_left_or_right(&submodules, dst_path, buf.buf, 1);
+                       continue;
+               }
+
+               if (S_ISLNK(lmode)) {
+                       char *content = get_symlink(&loid, src_path);
+                       add_left_or_right(&symlinks2, src_path, content, 0);
+                       free(content);
+               }
+
+               if (S_ISLNK(rmode)) {
+                       char *content = get_symlink(&roid, dst_path);
+                       add_left_or_right(&symlinks2, dst_path, content, 1);
+                       free(content);
+               }
+
+               if (lmode && status != 'C') {
+                       if (checkout_path(lmode, &loid, src_path, &lstate)) {
+                               ret = error("could not write '%s'", src_path);
+                               goto finish;
+                       }
+               }
+
+               if (rmode && !S_ISLNK(rmode)) {
+                       struct working_tree_entry *entry;
+
+                       /* Avoid duplicate working_tree entries */
+                       FLEX_ALLOC_STR(entry, path, dst_path);
+                       hashmap_entry_init(entry, strhash(dst_path));
+                       if (hashmap_get(&working_tree_dups, entry, NULL)) {
+                               free(entry);
+                               continue;
+                       }
+                       hashmap_add(&working_tree_dups, entry);
+
+                       if (!use_wt_file(workdir, dst_path, &roid)) {
+                               if (checkout_path(rmode, &roid, dst_path,
+                                                 &rstate)) {
+                                       ret = error("could not write '%s'",
+                                                   dst_path);
+                                       goto finish;
+                               }
+                       } else if (!is_null_oid(&roid)) {
+                               /*
+                                * Changes in the working tree need special
+                                * treatment since they are not part of the
+                                * index.
+                                */
+                               struct cache_entry *ce2 =
+                                       make_cache_entry(rmode, roid.hash,
+                                                        dst_path, 0, 0);
+
+                               add_index_entry(&wtindex, ce2,
+                                               ADD_CACHE_JUST_APPEND);
+
+                               add_path(&rdir, rdir_len, dst_path);
+                               if (ensure_leading_directories(rdir.buf)) {
+                                       ret = error("could not create "
+                                                   "directory for '%s'",
+                                                   dst_path);
+                                       goto finish;
+                               }
+                               add_path(&wtdir, wtdir_len, dst_path);
+                               if (symlinks) {
+                                       if (symlink(wtdir.buf, rdir.buf)) {
+                                               ret = error_errno("could not symlink '%s' to '%s'", wtdir.buf, rdir.buf);
+                                               goto finish;
+                                       }
+                               } else {
+                                       struct stat st;
+                                       if (stat(wtdir.buf, &st))
+                                               st.st_mode = 0644;
+                                       if (copy_file(rdir.buf, wtdir.buf,
+                                                     st.st_mode)) {
+                                               ret = error("could not copy '%s' to '%s'", wtdir.buf, rdir.buf);
+                                               goto finish;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       fclose(fp);
+       fp = NULL;
+       if (finish_command(&child)) {
+               ret = error("error occurred running diff --raw");
+               goto finish;
+       }
+
+       if (!i)
+               goto finish;
+
+       /*
+        * Changes to submodules require special treatment.This loop writes a
+        * temporary file to both the left and right directories to show the
+        * change in the recorded SHA1 for the submodule.
+        */
+       hashmap_iter_init(&submodules, &iter);
+       while ((entry = hashmap_iter_next(&iter))) {
+               if (*entry->left) {
+                       add_path(&ldir, ldir_len, entry->path);
+                       ensure_leading_directories(ldir.buf);
+                       write_file(ldir.buf, "%s", entry->left);
+               }
+               if (*entry->right) {
+                       add_path(&rdir, rdir_len, entry->path);
+                       ensure_leading_directories(rdir.buf);
+                       write_file(rdir.buf, "%s", entry->right);
+               }
+       }
+
+       /*
+        * Symbolic links require special treatment.The standard "git diff"
+        * shows only the link itself, not the contents of the link target.
+        * This loop replicates that behavior.
+        */
+       hashmap_iter_init(&symlinks2, &iter);
+       while ((entry = hashmap_iter_next(&iter))) {
+               if (*entry->left) {
+                       add_path(&ldir, ldir_len, entry->path);
+                       ensure_leading_directories(ldir.buf);
+                       write_file(ldir.buf, "%s", entry->left);
+               }
+               if (*entry->right) {
+                       add_path(&rdir, rdir_len, entry->path);
+                       ensure_leading_directories(rdir.buf);
+                       write_file(rdir.buf, "%s", entry->right);
+               }
+       }
+
+       strbuf_release(&buf);
+
+       strbuf_setlen(&ldir, ldir_len);
+       helper_argv[1] = ldir.buf;
+       strbuf_setlen(&rdir, rdir_len);
+       helper_argv[2] = rdir.buf;
+
+       if (extcmd) {
+               helper_argv[0] = extcmd;
+               flags = 0;
+       } else
+               setenv("GIT_DIFFTOOL_DIRDIFF", "true", 1);
+       rc = run_command_v_opt(helper_argv, flags);
+
+       /*
+        * If the diff includes working copy files and those
+        * files were modified during the diff, then the changes
+        * should be copied back to the working tree.
+        * Do not copy back files when symlinks are used and the
+        * external tool did not replace the original link with a file.
+        *
+        * These hashes are loaded lazily since they aren't needed
+        * in the common case of --symlinks and the difftool updating
+        * files through the symlink.
+        */
+       hashmap_init(&wt_modified, (hashmap_cmp_fn)path_entry_cmp,
+                    wtindex.cache_nr);
+       hashmap_init(&tmp_modified, (hashmap_cmp_fn)path_entry_cmp,
+                    wtindex.cache_nr);
+
+       for (i = 0; i < wtindex.cache_nr; i++) {
+               struct hashmap_entry dummy;
+               const char *name = wtindex.cache[i]->name;
+               struct stat st;
+
+               add_path(&rdir, rdir_len, name);
+               if (lstat(rdir.buf, &st))
+                       continue;
+
+               if ((symlinks && S_ISLNK(st.st_mode)) || !S_ISREG(st.st_mode))
+                       continue;
+
+               if (!indices_loaded) {
+                       static struct lock_file lock;
+                       strbuf_reset(&buf);
+                       strbuf_addf(&buf, "%s/wtindex", tmpdir);
+                       if (hold_lock_file_for_update(&lock, buf.buf, 0) < 0 ||
+                           write_locked_index(&wtindex, &lock, COMMIT_LOCK)) {
+                               ret = error("could not write %s", buf.buf);
+                               rollback_lock_file(&lock);
+                               goto finish;
+                       }
+                       changed_files(&wt_modified, buf.buf, workdir);
+                       strbuf_setlen(&rdir, rdir_len);
+                       changed_files(&tmp_modified, buf.buf, rdir.buf);
+                       add_path(&rdir, rdir_len, name);
+                       indices_loaded = 1;
+               }
+
+               hashmap_entry_init(&dummy, strhash(name));
+               if (hashmap_get(&tmp_modified, &dummy, name)) {
+                       add_path(&wtdir, wtdir_len, name);
+                       if (hashmap_get(&wt_modified, &dummy, name)) {
+                               warning(_("both files modified: '%s' and '%s'."),
+                                       wtdir.buf, rdir.buf);
+                               warning(_("working tree file has been left."));
+                               warning("%s", "");
+                               err = 1;
+                       } else if (unlink(wtdir.buf) ||
+                                  copy_file(wtdir.buf, rdir.buf, st.st_mode))
+                               warning_errno(_("could not copy '%s' to '%s'"),
+                                             rdir.buf, wtdir.buf);
+               }
+       }
+
+       if (err) {
+               warning(_("temporary files exist in '%s'."), tmpdir);
+               warning(_("you may want to cleanup or recover these."));
+               exit(1);
+       } else
+               exit_cleanup(tmpdir, rc);
+
+finish:
+       if (fp)
+               fclose(fp);
+
+       free(lbase_dir);
+       free(rbase_dir);
+       strbuf_release(&ldir);
+       strbuf_release(&rdir);
+       strbuf_release(&wtdir);
+       strbuf_release(&buf);
+
+       return ret;
+}
+
+static int run_file_diff(int prompt, const char *prefix,
+                        int argc, const char **argv)
+{
+       struct argv_array args = ARGV_ARRAY_INIT;
+       const char *env[] = {
+               "GIT_PAGER=", "GIT_EXTERNAL_DIFF=git-difftool--helper", NULL,
+               NULL
+       };
+       int ret = 0, i;
+
+       if (prompt > 0)
+               env[2] = "GIT_DIFFTOOL_PROMPT=true";
+       else if (!prompt)
+               env[2] = "GIT_DIFFTOOL_NO_PROMPT=true";
+
+
+       argv_array_push(&args, "diff");
+       for (i = 0; i < argc; i++)
+               argv_array_push(&args, argv[i]);
+       ret = run_command_v_opt_cd_env(args.argv, RUN_GIT_CMD, prefix, env);
+       exit(ret);
+}
+
+int cmd_difftool(int argc, const char **argv, const char *prefix)
+{
+       int use_gui_tool = 0, dir_diff = 0, prompt = -1, symlinks = 0,
+           tool_help = 0;
+       static char *difftool_cmd = NULL, *extcmd = NULL;
+       struct option builtin_difftool_options[] = {
+               OPT_BOOL('g', "gui", &use_gui_tool,
+                        N_("use `diff.guitool` instead of `diff.tool`")),
+               OPT_BOOL('d', "dir-diff", &dir_diff,
+                        N_("perform a full-directory diff")),
+               { OPTION_SET_INT, 'y', "no-prompt", &prompt, NULL,
+                       N_("do not prompt before launching a diff tool"),
+                       PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 0},
+               { OPTION_SET_INT, 0, "prompt", &prompt, NULL, NULL,
+                       PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_HIDDEN,
+                       NULL, 1 },
+               OPT_BOOL(0, "symlinks", &symlinks,
+                        N_("use symlinks in dir-diff mode")),
+               OPT_STRING('t', "tool", &difftool_cmd, N_("<tool>"),
+                          N_("use the specified diff tool")),
+               OPT_BOOL(0, "tool-help", &tool_help,
+                        N_("print a list of diff tools that may be used with "
+                           "`--tool`")),
+               OPT_BOOL(0, "trust-exit-code", &trust_exit_code,
+                        N_("make 'git-difftool' exit when an invoked diff "
+                           "tool returns a non - zero exit code")),
+               OPT_STRING('x', "extcmd", &extcmd, N_("<command>"),
+                          N_("specify a custom command for viewing diffs")),
+               OPT_END()
+       };
+
+       git_config(difftool_config, NULL);
+       symlinks = has_symlinks;
+
+       argc = parse_options(argc, argv, prefix, builtin_difftool_options,
+                            builtin_difftool_usage, PARSE_OPT_KEEP_UNKNOWN |
+                            PARSE_OPT_KEEP_DASHDASH);
+
+       if (tool_help)
+               return print_tool_help();
+
+       /* NEEDSWORK: once we no longer spawn anything, remove this */
+       setenv(GIT_DIR_ENVIRONMENT, absolute_path(get_git_dir()), 1);
+       setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(get_git_work_tree()), 1);
+
+       if (use_gui_tool && diff_gui_tool && *diff_gui_tool)
+               setenv("GIT_DIFF_TOOL", diff_gui_tool, 1);
+       else if (difftool_cmd) {
+               if (*difftool_cmd)
+                       setenv("GIT_DIFF_TOOL", difftool_cmd, 1);
+               else
+                       die(_("no <tool> given for --tool=<tool>"));
+       }
+
+       if (extcmd) {
+               if (*extcmd)
+                       setenv("GIT_DIFFTOOL_EXTCMD", extcmd, 1);
+               else
+                       die(_("no <cmd> given for --extcmd=<cmd>"));
+       }
+
+       setenv("GIT_DIFFTOOL_TRUST_EXIT_CODE",
+              trust_exit_code ? "true" : "false", 1);
+
+       /*
+        * In directory diff mode, 'git-difftool--helper' is called once
+        * to compare the a / b directories. In file diff mode, 'git diff'
+        * will invoke a separate instance of 'git-difftool--helper' for
+        * each file that changed.
+        */
+       if (dir_diff)
+               return run_dir_diff(extcmd, symlinks, prefix, argc, argv);
+       return run_file_diff(prompt, prefix, argc, argv);
+}
index c0652a7ed0a928d43db21dac82bc440d268ed194..64617ad8e362fff47381d34c36a914d9458a7d1a 100644 (file)
@@ -212,7 +212,7 @@ static char *anonymize_blob(unsigned long *size)
        return strbuf_detach(&out, NULL);
 }
 
-static void export_blob(const unsigned char *sha1)
+static void export_blob(const struct object_id *oid)
 {
        unsigned long size;
        enum object_type type;
@@ -223,34 +223,34 @@ static void export_blob(const unsigned char *sha1)
        if (no_data)
                return;
 
-       if (is_null_sha1(sha1))
+       if (is_null_oid(oid))
                return;
 
-       object = lookup_object(sha1);
+       object = lookup_object(oid->hash);
        if (object && object->flags & SHOWN)
                return;
 
        if (anonymize) {
                buf = anonymize_blob(&size);
-               object = (struct object *)lookup_blob(sha1);
+               object = (struct object *)lookup_blob(oid->hash);
                eaten = 0;
        } else {
-               buf = read_sha1_file(sha1, &type, &size);
+               buf = read_sha1_file(oid->hash, &type, &size);
                if (!buf)
-                       die ("Could not read blob %s", sha1_to_hex(sha1));
-               if (check_sha1_signature(sha1, buf, size, typename(type)) < 0)
-                       die("sha1 mismatch in blob %s", sha1_to_hex(sha1));
-               object = parse_object_buffer(sha1, type, size, buf, &eaten);
+                       die ("Could not read blob %s", oid_to_hex(oid));
+               if (check_sha1_signature(oid->hash, buf, size, typename(type)) < 0)
+                       die("sha1 mismatch in blob %s", oid_to_hex(oid));
+               object = parse_object_buffer(oid->hash, type, size, buf, &eaten);
        }
 
        if (!object)
-               die("Could not read blob %s", sha1_to_hex(sha1));
+               die("Could not read blob %s", oid_to_hex(oid));
 
        mark_next_object(object);
 
        printf("blob\nmark :%"PRIu32"\ndata %lu\n", last_idnum, size);
        if (size && fwrite(buf, size, 1, stdout) != 1)
-               die_errno ("Could not write blob '%s'", sha1_to_hex(sha1));
+               die_errno ("Could not write blob '%s'", oid_to_hex(oid));
        printf("\n");
 
        show_progress();
@@ -323,19 +323,19 @@ static void print_path(const char *path)
        }
 }
 
-static void *generate_fake_sha1(const void *old, size_t *len)
+static void *generate_fake_oid(const void *old, size_t *len)
 {
        static uint32_t counter = 1; /* avoid null sha1 */
-       unsigned char *out = xcalloc(20, 1);
-       put_be32(out + 16, counter++);
+       unsigned char *out = xcalloc(GIT_SHA1_RAWSZ, 1);
+       put_be32(out + GIT_SHA1_RAWSZ - 4, counter++);
        return out;
 }
 
-static const unsigned char *anonymize_sha1(const unsigned char *sha1)
+static const unsigned char *anonymize_sha1(const struct object_id *oid)
 {
        static struct hashmap sha1s;
-       size_t len = 20;
-       return anonymize_mem(&sha1s, generate_fake_sha1, sha1, &len);
+       size_t len = GIT_SHA1_RAWSZ;
+       return anonymize_mem(&sha1s, generate_fake_oid, oid, &len);
 }
 
 static void show_filemodify(struct diff_queue_struct *q,
@@ -347,7 +347,7 @@ static void show_filemodify(struct diff_queue_struct *q,
         * Handle files below a directory first, in case they are all deleted
         * and the directory changes to a file or symlink.
         */
-       qsort(q->queue, q->nr, sizeof(q->queue[0]), depth_first);
+       QSORT(q->queue, q->nr, depth_first);
 
        for (i = 0; i < q->nr; i++) {
                struct diff_filespec *ospec = q->queue[i]->one;
@@ -383,7 +383,7 @@ static void show_filemodify(struct diff_queue_struct *q,
                        if (no_data || S_ISGITLINK(spec->mode))
                                printf("M %06o %s ", spec->mode,
                                       sha1_to_hex(anonymize ?
-                                                  anonymize_sha1(spec->oid.hash) :
+                                                  anonymize_sha1(&spec->oid) :
                                                   spec->oid.hash));
                        else {
                                struct object *object = lookup_object(spec->oid.hash);
@@ -572,7 +572,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
        /* Export the referenced blobs, and remember the marks. */
        for (i = 0; i < diff_queued_diff.nr; i++)
                if (!S_ISGITLINK(diff_queued_diff.queue[i]->two->mode))
-                       export_blob(diff_queued_diff.queue[i]->two->oid.hash);
+                       export_blob(&diff_queued_diff.queue[i]->two->oid);
 
        refname = commit->util;
        if (anonymize) {
@@ -734,6 +734,7 @@ static void handle_tag(const char *name, struct tag *tag)
                             oid_to_hex(&tag->object.oid));
                case DROP:
                        /* Ignore this tag altogether */
+                       free(buf);
                        return;
                case REWRITE:
                        if (tagged->type != OBJ_COMMIT) {
@@ -765,6 +766,7 @@ static void handle_tag(const char *name, struct tag *tag)
               (int)(tagger_end - tagger), tagger,
               tagger == tagger_end ? "" : "\n",
               (int)message_size, (int)message_size, message ? message : "");
+       free(buf);
 }
 
 static struct commit *get_commit(struct rev_cmdline_entry *e, char *full_name)
@@ -797,14 +799,14 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
 
        for (i = 0; i < info->nr; i++) {
                struct rev_cmdline_entry *e = info->rev + i;
-               unsigned char sha1[20];
+               struct object_id oid;
                struct commit *commit;
                char *full_name;
 
                if (e->flags & UNINTERESTING)
                        continue;
 
-               if (dwim_ref(e->name, strlen(e->name), sha1, &full_name) != 1)
+               if (dwim_ref(e->name, strlen(e->name), oid.hash, &full_name) != 1)
                        continue;
 
                if (refspecs) {
@@ -828,7 +830,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
                case OBJ_COMMIT:
                        break;
                case OBJ_BLOB:
-                       export_blob(commit->object.oid.hash);
+                       export_blob(&commit->object.oid);
                        continue;
                default: /* OBJ_TAG (nested tags) is already handled */
                        warning("Tag points to object of unexpected type %s, skipping.",
@@ -912,7 +914,7 @@ static void import_marks(char *input_file)
        while (fgets(line, sizeof(line), f)) {
                uint32_t mark;
                char *line_end, *mark_end;
-               unsigned char sha1[20];
+               struct object_id oid;
                struct object *object;
                struct commit *commit;
                enum object_type type;
@@ -924,28 +926,28 @@ static void import_marks(char *input_file)
 
                mark = strtoumax(line + 1, &mark_end, 10);
                if (!mark || mark_end == line + 1
-                       || *mark_end != ' ' || get_sha1_hex(mark_end + 1, sha1))
+                       || *mark_end != ' ' || get_oid_hex(mark_end + 1, &oid))
                        die("corrupt mark line: %s", line);
 
                if (last_idnum < mark)
                        last_idnum = mark;
 
-               type = sha1_object_info(sha1, NULL);
+               type = sha1_object_info(oid.hash, NULL);
                if (type < 0)
-                       die("object not found: %s", sha1_to_hex(sha1));
+                       die("object not found: %s", oid_to_hex(&oid));
 
                if (type != OBJ_COMMIT)
                        /* only commits */
                        continue;
 
-               commit = lookup_commit(sha1);
+               commit = lookup_commit(oid.hash);
                if (!commit)
-                       die("not a commit? can't happen: %s", sha1_to_hex(sha1));
+                       die("not a commit? can't happen: %s", oid_to_hex(&oid));
 
                object = &commit->object;
 
                if (object->flags & SHOWN)
-                       error("Object %s already has a mark", sha1_to_hex(sha1));
+                       error("Object %s already has a mark", oid_to_hex(&oid));
 
                mark_object(object, mark);
 
index bfd0be44a91f66034c98361dc713cc0883693a69..366b9d13f929b7d299a31d9c53fb643220fe64e3 100644 (file)
@@ -50,7 +50,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
        char **pack_lockfile_ptr = NULL;
        struct child_process *conn;
        struct fetch_pack_args args;
-       struct sha1_array shallow = SHA1_ARRAY_INIT;
+       struct oid_array shallow = OID_ARRAY_INIT;
+       struct string_list deepen_not = STRING_LIST_INIT_DUP;
 
        packet_trace_identity("fetch-pack");
 
@@ -60,12 +61,12 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
        for (i = 1; i < argc && *argv[i] == '-'; i++) {
                const char *arg = argv[i];
 
-               if (starts_with(arg, "--upload-pack=")) {
-                       args.uploadpack = arg + 14;
+               if (skip_prefix(arg, "--upload-pack=", &arg)) {
+                       args.uploadpack = arg;
                        continue;
                }
-               if (starts_with(arg, "--exec=")) {
-                       args.uploadpack = arg + 7;
+               if (skip_prefix(arg, "--exec=", &arg)) {
+                       args.uploadpack = arg;
                        continue;
                }
                if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
@@ -101,8 +102,20 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
                        args.verbose = 1;
                        continue;
                }
-               if (starts_with(arg, "--depth=")) {
-                       args.depth = strtol(arg + 8, NULL, 0);
+               if (skip_prefix(arg, "--depth=", &arg)) {
+                       args.depth = strtol(arg, NULL, 0);
+                       continue;
+               }
+               if (skip_prefix(arg, "--shallow-since=", &arg)) {
+                       args.deepen_since = xstrdup(arg);
+                       continue;
+               }
+               if (skip_prefix(arg, "--shallow-exclude=", &arg)) {
+                       string_list_append(&deepen_not, arg);
+                       continue;
+               }
+               if (!strcmp(arg, "--deepen-relative")) {
+                       args.deepen_relative = 1;
                        continue;
                }
                if (!strcmp("--no-progress", arg)) {
@@ -132,6 +145,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
                }
                usage(fetch_pack_usage);
        }
+       if (deepen_not.nr)
+               args.deepen_not = &deepen_not;
 
        if (i < argc)
                dest = argv[i++];
@@ -204,12 +219,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
         * remote no-such-ref' would silently succeed without issuing
         * an error.
         */
-       for (i = 0; i < nr_sought; i++) {
-               if (!sought[i] || sought[i]->matched)
-                       continue;
-               error("no such remote ref %s", sought[i]->name);
-               ret = 1;
-       }
+       ret |= report_unmatched_refs(sought, nr_sought);
 
        while (ref) {
                printf("%s %s\n",
index cd7e3cefe62b98786097de9a6a456589060c7ebd..5f2c2ab23e4cde17747147f23dcedaebe66c74a3 100644 (file)
@@ -35,13 +35,15 @@ static int fetch_prune_config = -1; /* unspecified */
 static int prune = -1; /* unspecified */
 #define PRUNE_BY_DEFAULT 0 /* do we prune by default? */
 
-static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity;
+static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity, deepen_relative;
 static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
-static int tags = TAGS_DEFAULT, unshallow, update_shallow;
+static int tags = TAGS_DEFAULT, unshallow, update_shallow, deepen;
 static int max_children = -1;
 static enum transport_family family;
 static const char *depth;
+static const char *deepen_since;
 static const char *upload_pack;
+static struct string_list deepen_not = STRING_LIST_INIT_NODUP;
 static struct strbuf default_rla = STRBUF_INIT;
 static struct transport *gtransport;
 static struct transport *gsecondary;
@@ -117,6 +119,12 @@ static struct option builtin_fetch_options[] = {
        OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
        OPT_STRING(0, "depth", &depth, N_("depth"),
                   N_("deepen history of shallow clone")),
+       OPT_STRING(0, "shallow-since", &deepen_since, N_("time"),
+                  N_("deepen history of shallow repository based on time")),
+       OPT_STRING_LIST(0, "shallow-exclude", &deepen_not, N_("revision"),
+                       N_("deepen history of shallow clone, excluding rev")),
+       OPT_INTEGER(0, "deepen", &deepen_relative,
+                   N_("deepen history of shallow clone")),
        { OPTION_SET_INT, 0, "unshallow", &unshallow, NULL,
                   N_("convert to a complete repository"),
                   PARSE_OPT_NONEG | PARSE_OPT_NOARG, NULL, 1 },
@@ -351,9 +359,6 @@ static struct ref *get_ref_map(struct transport *transport,
 
                for (i = 0; i < fetch_refspec_nr; i++)
                        get_fetch_map(ref_map, &fetch_refspec[i], &oref_tail, 1);
-
-               if (tags == TAGS_SET)
-                       get_fetch_map(remote_refs, tag_refspec, &tail, 0);
        } else if (refmap_array) {
                die("--refmap option is only meaningful with command-line refspec(s).");
        } else {
@@ -416,7 +421,7 @@ static int s_update_ref(const char *action,
                        struct ref *ref,
                        int check_old)
 {
-       char msg[1024];
+       char *msg;
        char *rla = getenv("GIT_REFLOG_ACTION");
        struct ref_transaction *transaction;
        struct strbuf err = STRBUF_INIT;
@@ -426,7 +431,7 @@ static int s_update_ref(const char *action,
                return 0;
        if (!rla)
                rla = default_rla.buf;
-       snprintf(msg, sizeof(msg), "%s: %s", rla, action);
+       msg = xstrfmt("%s: %s", rla, action);
 
        transaction = ref_transaction_begin(&err);
        if (!transaction ||
@@ -444,11 +449,13 @@ static int s_update_ref(const char *action,
 
        ref_transaction_free(transaction);
        strbuf_release(&err);
+       free(msg);
        return 0;
 fail:
        ref_transaction_free(transaction);
        error("%s", err.buf);
        strbuf_release(&err);
+       free(msg);
        return df_conflict ? STORE_REF_ERROR_DF_CONFLICT
                           : STORE_REF_ERROR_OTHER;
 }
@@ -569,9 +576,12 @@ static void print_compact(struct strbuf *display,
 
 static void format_display(struct strbuf *display, char code,
                           const char *summary, const char *error,
-                          const char *remote, const char *local)
+                          const char *remote, const char *local,
+                          int summary_width)
 {
-       strbuf_addf(display, "%c %-*s ", code, TRANSPORT_SUMMARY(summary));
+       int width = (summary_width + strlen(summary) - gettext_width(summary));
+
+       strbuf_addf(display, "%c %-*s ", code, width, summary);
        if (!compact_format)
                print_remote_to_local(display, remote, local);
        else
@@ -583,7 +593,8 @@ static void format_display(struct strbuf *display, char code,
 static int update_local_ref(struct ref *ref,
                            const char *remote,
                            const struct ref *remote_ref,
-                           struct strbuf *display)
+                           struct strbuf *display,
+                           int summary_width)
 {
        struct commit *current = NULL, *updated;
        enum object_type type;
@@ -597,7 +608,7 @@ static int update_local_ref(struct ref *ref,
        if (!oidcmp(&ref->old_oid, &ref->new_oid)) {
                if (verbosity > 0)
                        format_display(display, '=', _("[up to date]"), NULL,
-                                      remote, pretty_ref);
+                                      remote, pretty_ref, summary_width);
                return 0;
        }
 
@@ -611,7 +622,7 @@ static int update_local_ref(struct ref *ref,
                 */
                format_display(display, '!', _("[rejected]"),
                               _("can't fetch in current branch"),
-                              remote, pretty_ref);
+                              remote, pretty_ref, summary_width);
                return 1;
        }
 
@@ -621,7 +632,7 @@ static int update_local_ref(struct ref *ref,
                r = s_update_ref("updating tag", ref, 0);
                format_display(display, r ? '!' : 't', _("[tag update]"),
                               r ? _("unable to update local ref") : NULL,
-                              remote, pretty_ref);
+                              remote, pretty_ref, summary_width);
                return r;
        }
 
@@ -650,11 +661,11 @@ static int update_local_ref(struct ref *ref,
 
                if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
                    (recurse_submodules != RECURSE_SUBMODULES_ON))
-                       check_for_new_submodule_commits(ref->new_oid.hash);
+                       check_for_new_submodule_commits(&ref->new_oid);
                r = s_update_ref(msg, ref, 0);
                format_display(display, r ? '!' : '*', what,
                               r ? _("unable to update local ref") : NULL,
-                              remote, pretty_ref);
+                              remote, pretty_ref, summary_width);
                return r;
        }
 
@@ -666,11 +677,11 @@ static int update_local_ref(struct ref *ref,
                strbuf_add_unique_abbrev(&quickref, ref->new_oid.hash, DEFAULT_ABBREV);
                if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
                    (recurse_submodules != RECURSE_SUBMODULES_ON))
-                       check_for_new_submodule_commits(ref->new_oid.hash);
+                       check_for_new_submodule_commits(&ref->new_oid);
                r = s_update_ref("fast-forward", ref, 1);
                format_display(display, r ? '!' : ' ', quickref.buf,
                               r ? _("unable to update local ref") : NULL,
-                              remote, pretty_ref);
+                              remote, pretty_ref, summary_width);
                strbuf_release(&quickref);
                return r;
        } else if (force || ref->force) {
@@ -681,16 +692,16 @@ static int update_local_ref(struct ref *ref,
                strbuf_add_unique_abbrev(&quickref, ref->new_oid.hash, DEFAULT_ABBREV);
                if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
                    (recurse_submodules != RECURSE_SUBMODULES_ON))
-                       check_for_new_submodule_commits(ref->new_oid.hash);
+                       check_for_new_submodule_commits(&ref->new_oid);
                r = s_update_ref("forced-update", ref, 1);
                format_display(display, r ? '!' : '+', quickref.buf,
                               r ? _("unable to update local ref") : _("forced update"),
-                              remote, pretty_ref);
+                              remote, pretty_ref, summary_width);
                strbuf_release(&quickref);
                return r;
        } else {
                format_display(display, '!', _("[rejected]"), _("non-fast-forward"),
-                              remote, pretty_ref);
+                              remote, pretty_ref, summary_width);
                return 1;
        }
 }
@@ -721,6 +732,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
        char *url;
        const char *filename = dry_run ? "/dev/null" : git_path_fetch_head();
        int want_status;
+       int summary_width = transport_summary_width(ref_map);
 
        fp = fopen(filename, "a");
        if (!fp)
@@ -830,13 +842,14 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 
                        strbuf_reset(&note);
                        if (ref) {
-                               rc |= update_local_ref(ref, what, rm, &note);
+                               rc |= update_local_ref(ref, what, rm, &note,
+                                                      summary_width);
                                free(ref);
                        } else
                                format_display(&note, '*',
                                               *kind ? kind : "branch", NULL,
                                               *what ? what : "HEAD",
-                                              "FETCH_HEAD");
+                                              "FETCH_HEAD", summary_width);
                        if (note.len) {
                                if (verbosity >= 0 && !shown_url) {
                                        fprintf(stderr, _("From %.*s\n"),
@@ -878,7 +891,7 @@ static int quickfetch(struct ref *ref_map)
         * really need to perform.  Claiming failure now will ensure
         * we perform the network exchange to deepen our history.
         */
-       if (depth)
+       if (deepen)
                return -1;
        opt.quiet = 1;
        return check_connected(iterate_ref_map, &rm, &opt);
@@ -903,6 +916,7 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map,
        int url_len, i, result = 0;
        struct ref *ref, *stale_refs = get_stale_heads(refs, ref_count, ref_map);
        char *url;
+       int summary_width = transport_summary_width(stale_refs);
        const char *dangling_msg = dry_run
                ? _("   (%s will become dangling)")
                : _("   (%s has become dangling)");
@@ -938,7 +952,8 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map,
                                shown_url = 1;
                        }
                        format_display(&sb, '-', _("[deleted]"), NULL,
-                                      _("(none)"), prettify_refname(ref->name));
+                                      _("(none)"), prettify_refname(ref->name),
+                                      summary_width);
                        fprintf(stderr, " %s\n",sb.buf);
                        strbuf_release(&sb);
                        warn_dangling_symref(stderr, dangling_msg, ref->name);
@@ -986,7 +1001,7 @@ static void set_option(struct transport *transport, const char *name, const char
                        name, transport->url);
 }
 
-static struct transport *prepare_transport(struct remote *remote)
+static struct transport *prepare_transport(struct remote *remote, int deepen)
 {
        struct transport *transport;
        transport = transport_get(remote, NULL);
@@ -998,6 +1013,13 @@ static struct transport *prepare_transport(struct remote *remote)
                set_option(transport, TRANS_OPT_KEEP, "yes");
        if (depth)
                set_option(transport, TRANS_OPT_DEPTH, depth);
+       if (deepen && deepen_since)
+               set_option(transport, TRANS_OPT_DEEPEN_SINCE, deepen_since);
+       if (deepen && deepen_not.nr)
+               set_option(transport, TRANS_OPT_DEEPEN_NOT,
+                          (const char *)&deepen_not);
+       if (deepen_relative)
+               set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, "yes");
        if (update_shallow)
                set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes");
        return transport;
@@ -1005,13 +1027,25 @@ static struct transport *prepare_transport(struct remote *remote)
 
 static void backfill_tags(struct transport *transport, struct ref *ref_map)
 {
-       if (transport->cannot_reuse) {
-               gsecondary = prepare_transport(transport->remote);
+       int cannot_reuse;
+
+       /*
+        * Once we have set TRANS_OPT_DEEPEN_SINCE, we can't unset it
+        * when remote helper is used (setting it to an empty string
+        * is not unsetting). We could extend the remote helper
+        * protocol for that, but for now, just force a new connection
+        * without deepen-since. Similar story for deepen-not.
+        */
+       cannot_reuse = transport->cannot_reuse ||
+               deepen_since || deepen_not.nr;
+       if (cannot_reuse) {
+               gsecondary = prepare_transport(transport->remote, 0);
                transport = gsecondary;
        }
 
        transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, NULL);
        transport_set_option(transport, TRANS_OPT_DEPTH, "0");
+       transport_set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, NULL);
        fetch_refs(transport, ref_map);
 
        if (gsecondary) {
@@ -1145,7 +1179,7 @@ static int add_remote_or_group(const char *name, struct string_list *list)
        git_config(get_remote_group, &g);
        if (list->nr == prev_nr) {
                struct remote *remote = remote_get(name);
-               if (!remote_is_configured(remote))
+               if (!remote_is_configured(remote, 0))
                        return 0;
                string_list_append(list, remote->name);
        }
@@ -1222,7 +1256,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
                die(_("No remote repository specified.  Please, specify either a URL or a\n"
                    "remote name from which new revisions should be fetched."));
 
-       gtransport = prepare_transport(remote);
+       gtransport = prepare_transport(remote, 1);
 
        if (prune < 0) {
                /* no command line request */
@@ -1282,6 +1316,13 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, prefix,
                             builtin_fetch_options, builtin_fetch_usage, 0);
 
+       if (deepen_relative) {
+               if (deepen_relative < 0)
+                       die(_("Negative depth in --deepen is not supported"));
+               if (depth)
+                       die(_("--deepen and --depth are mutually exclusive"));
+               depth = xstrfmt("%d", deepen_relative);
+       }
        if (unshallow) {
                if (depth)
                        die(_("--depth and --unshallow cannot be used together"));
@@ -1294,6 +1335,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
        /* no need to be strict, transport_set_option() will validate it again */
        if (depth && atoi(depth) < 1)
                die(_("depth %s is not a positive number"), depth);
+       if (depth || deepen_since || deepen_not.nr)
+               deepen = 1;
 
        if (recurse_submodules != RECURSE_SUBMODULES_OFF) {
                if (recurse_submodules_default) {
index dc2e9e420d6beb47f0e04184dfb7429b6559a789..6faa3c0d2424600a5e69dd20466aa763d95b586c 100644 (file)
@@ -41,7 +41,7 @@ struct src_data {
 };
 
 struct origin_data {
-       unsigned char sha1[20];
+       struct object_id oid;
        unsigned is_local_branch:1;
 };
 
@@ -59,8 +59,8 @@ static struct string_list origins = STRING_LIST_INIT_DUP;
 struct merge_parents {
        int alloc, nr;
        struct merge_parent {
-               unsigned char given[20];
-               unsigned char commit[20];
+               struct object_id given;
+               struct object_id commit;
                unsigned char used;
        } *item;
 };
@@ -70,14 +70,14 @@ struct merge_parents {
  * hundreds of heads at a time anyway.
  */
 static struct merge_parent *find_merge_parent(struct merge_parents *table,
-                                             unsigned char *given,
-                                             unsigned char *commit)
+                                             struct object_id *given,
+                                             struct object_id *commit)
 {
        int i;
        for (i = 0; i < table->nr; i++) {
-               if (given && hashcmp(table->item[i].given, given))
+               if (given && oidcmp(&table->item[i].given, given))
                        continue;
-               if (commit && hashcmp(table->item[i].commit, commit))
+               if (commit && oidcmp(&table->item[i].commit, commit))
                        continue;
                return &table->item[i];
        }
@@ -85,14 +85,14 @@ static struct merge_parent *find_merge_parent(struct merge_parents *table,
 }
 
 static void add_merge_parent(struct merge_parents *table,
-                            unsigned char *given,
-                            unsigned char *commit)
+                            struct object_id *given,
+                            struct object_id *commit)
 {
        if (table->nr && find_merge_parent(table, given, commit))
                return;
        ALLOC_GROW(table->item, table->nr + 1, table->alloc);
-       hashcpy(table->item[table->nr].given, given);
-       hashcpy(table->item[table->nr].commit, commit);
+       oidcpy(&table->item[table->nr].given, given);
+       oidcpy(&table->item[table->nr].commit, commit);
        table->item[table->nr].used = 0;
        table->nr++;
 }
@@ -106,30 +106,30 @@ static int handle_line(char *line, struct merge_parents *merge_parents)
        struct src_data *src_data;
        struct string_list_item *item;
        int pulling_head = 0;
-       unsigned char sha1[20];
+       struct object_id oid;
 
-       if (len < 43 || line[40] != '\t')
+       if (len < GIT_SHA1_HEXSZ + 3 || line[GIT_SHA1_HEXSZ] != '\t')
                return 1;
 
-       if (starts_with(line + 41, "not-for-merge"))
+       if (starts_with(line + GIT_SHA1_HEXSZ + 1, "not-for-merge"))
                return 0;
 
-       if (line[41] != '\t')
+       if (line[GIT_SHA1_HEXSZ + 1] != '\t')
                return 2;
 
-       i = get_sha1_hex(line, sha1);
+       i = get_oid_hex(line, &oid);
        if (i)
                return 3;
 
-       if (!find_merge_parent(merge_parents, sha1, NULL))
+       if (!find_merge_parent(merge_parents, &oid, NULL))
                return 0; /* subsumed by other parents */
 
        origin_data = xcalloc(1, sizeof(struct origin_data));
-       hashcpy(origin_data->sha1, sha1);
+       oidcpy(&origin_data->oid, &oid);
 
        if (line[len - 1] == '\n')
                line[len - 1] = 0;
-       line += 42;
+       line += GIT_SHA1_HEXSZ + 2;
 
        /*
         * At this point, line points at the beginning of comment e.g.
@@ -314,14 +314,10 @@ static void add_people_info(struct strbuf *out,
                            struct string_list *authors,
                            struct string_list *committers)
 {
-       if (authors->nr)
-               qsort(authors->items,
-                     authors->nr, sizeof(authors->items[0]),
-                     cmp_string_list_util_as_integral);
-       if (committers->nr)
-               qsort(committers->items,
-                     committers->nr, sizeof(committers->items[0]),
-                     cmp_string_list_util_as_integral);
+       QSORT(authors->items, authors->nr,
+             cmp_string_list_util_as_integral);
+       QSORT(committers->items, committers->nr,
+             cmp_string_list_util_as_integral);
 
        credit_people(out, authors, 'a');
        credit_people(out, committers, 'c');
@@ -342,10 +338,10 @@ static void shortlog(const char *name,
        struct string_list committers = STRING_LIST_INIT_DUP;
        int flags = UNINTERESTING | TREESAME | SEEN | SHOWN | ADDED;
        struct strbuf sb = STRBUF_INIT;
-       const unsigned char *sha1 = origin_data->sha1;
+       const struct object_id *oid = &origin_data->oid;
        int limit = opts->shortlog_len;
 
-       branch = deref_tag(parse_object(sha1), sha1_to_hex(sha1), 40);
+       branch = deref_tag(parse_object(oid->hash), oid_to_hex(oid), GIT_SHA1_HEXSZ);
        if (!branch || branch->type != OBJ_COMMIT)
                return;
 
@@ -535,7 +531,7 @@ static void fmt_merge_msg_sigs(struct strbuf *out)
 }
 
 static void find_merge_parents(struct merge_parents *result,
-                              struct strbuf *in, unsigned char *head)
+                              struct strbuf *in, struct object_id *head)
 {
        struct commit_list *parents;
        struct commit *head_commit;
@@ -546,31 +542,31 @@ static void find_merge_parents(struct merge_parents *result,
                int len;
                char *p = in->buf + pos;
                char *newline = strchr(p, '\n');
-               unsigned char sha1[20];
+               struct object_id oid;
                struct commit *parent;
                struct object *obj;
 
                len = newline ? newline - p : strlen(p);
                pos += len + !!newline;
 
-               if (len < 43 ||
-                   get_sha1_hex(p, sha1) ||
-                   p[40] != '\t' ||
-                   p[41] != '\t')
+               if (len < GIT_SHA1_HEXSZ + 3 ||
+                   get_oid_hex(p, &oid) ||
+                   p[GIT_SHA1_HEXSZ] != '\t' ||
+                   p[GIT_SHA1_HEXSZ + 1] != '\t')
                        continue; /* skip not-for-merge */
                /*
                 * Do not use get_merge_parent() here; we do not have
                 * "name" here and we do not want to contaminate its
                 * util field yet.
                 */
-               obj = parse_object(sha1);
+               obj = parse_object(oid.hash);
                parent = (struct commit *)peel_to_type(NULL, 0, obj, OBJ_COMMIT);
                if (!parent)
                        continue;
                commit_list_insert(parent, &parents);
-               add_merge_parent(result, obj->oid.hash, parent->object.oid.hash);
+               add_merge_parent(result, &obj->oid, &parent->object.oid);
        }
-       head_commit = lookup_commit(head);
+       head_commit = lookup_commit(head->hash);
        if (head_commit)
                commit_list_insert(head_commit, &parents);
        parents = reduce_heads(parents);
@@ -578,7 +574,7 @@ static void find_merge_parents(struct merge_parents *result,
        while (parents) {
                struct commit *cmit = pop_commit(&parents);
                for (i = 0; i < result->nr; i++)
-                       if (!hashcmp(result->item[i].commit, cmit->object.oid.hash))
+                       if (!oidcmp(&result->item[i].commit, &cmit->object.oid))
                                result->item[i].used = 1;
        }
 
@@ -596,7 +592,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
                  struct fmt_merge_msg_opts *opts)
 {
        int i = 0, pos = 0;
-       unsigned char head_sha1[20];
+       struct object_id head_oid;
        const char *current_branch;
        void *current_branch_to_free;
        struct merge_parents merge_parents;
@@ -605,13 +601,13 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
 
        /* get current branch */
        current_branch = current_branch_to_free =
-               resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, NULL);
+               resolve_refdup("HEAD", RESOLVE_REF_READING, head_oid.hash, NULL);
        if (!current_branch)
                die("No current branch");
        if (starts_with(current_branch, "refs/heads/"))
                current_branch += 11;
 
-       find_merge_parents(&merge_parents, in, head_sha1);
+       find_merge_parents(&merge_parents, in, &head_oid);
 
        /* get a line */
        while (pos < in->len) {
@@ -637,7 +633,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
                struct commit *head;
                struct rev_info rev;
 
-               head = lookup_commit_or_die(head_sha1, "HEAD");
+               head = lookup_commit_or_die(head_oid.hash, "HEAD");
                init_revisions(&rev, NULL);
                rev.commit_format = CMIT_FMT_ONELINE;
                rev.ignore_merges = 1;
index 4e9f6c29bf1e0c1cc7b44548f49077c2e4a81ec8..eca365bf89bb64a71d02d21da29fc1e84204c1a1 100644 (file)
@@ -8,8 +8,8 @@
 static char const * const for_each_ref_usage[] = {
        N_("git for-each-ref [<options>] [<pattern>]"),
        N_("git for-each-ref [--points-at <object>]"),
-       N_("git for-each-ref [(--merged | --no-merged) [<object>]]"),
-       N_("git for-each-ref [--contains [<object>]]"),
+       N_("git for-each-ref [(--merged | --no-merged) [<commit>]]"),
+       N_("git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"),
        NULL
 };
 
@@ -18,7 +18,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
        int i;
        const char *format = "%(objectname) %(objecttype)\t%(refname)";
        struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
-       int maxcount = 0, quote_style = 0;
+       int maxcount = 0, quote_style = 0, icase = 0;
        struct ref_array array;
        struct ref_filter filter;
 
@@ -43,6 +43,8 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
                OPT_MERGED(&filter, N_("print only refs that are merged")),
                OPT_NO_MERGED(&filter, N_("print only refs that are not merged")),
                OPT_CONTAINS(&filter.with_commit, N_("print only refs which contain the commit")),
+               OPT_NO_CONTAINS(&filter.no_commit, N_("print only refs which don't contain the commit")),
+               OPT_BOOL(0, "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
                OPT_END(),
        };
 
@@ -63,6 +65,8 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 
        if (!sorting)
                sorting = ref_default_sorting();
+       sorting->ignore_case = icase;
+       filter.ignore_case = icase;
 
        /* for warn_ambiguous_refs */
        git_config(git_default_config, NULL);
index 2de272ea3659411b58d38d703a48790d55d6a12b..b5e13a45560f9338a65191c22d213f33052bf9b9 100644 (file)
@@ -56,6 +56,23 @@ static const char *describe_object(struct object *obj)
        return buf.buf;
 }
 
+static const char *printable_type(struct object *obj)
+{
+       const char *ret;
+
+       if (obj->type == OBJ_NONE) {
+               enum object_type type = sha1_object_info(obj->oid.hash, NULL);
+               if (type > 0)
+                       object_as_type(obj, type, 0);
+       }
+
+       ret = typename(obj->type);
+       if (!ret)
+               ret = "unknown";
+
+       return ret;
+}
+
 static int fsck_config(const char *var, const char *value, void *cb)
 {
        if (strcmp(var, "fsck.skiplist") == 0) {
@@ -83,7 +100,7 @@ static void objreport(struct object *obj, const char *msg_type,
                        const char *err)
 {
        fprintf(stderr, "%s in %s %s: %s\n",
-               msg_type, typename(obj->type), describe_object(obj), err);
+               msg_type, printable_type(obj), describe_object(obj), err);
 }
 
 static int objerror(struct object *obj, const char *err)
@@ -114,7 +131,7 @@ static int mark_object(struct object *obj, int type, void *data, struct fsck_opt
        if (!obj) {
                /* ... these references to parent->fld are safe here */
                printf("broken link from %7s %s\n",
-                          typename(parent->type), describe_object(parent));
+                          printable_type(parent), describe_object(parent));
                printf("broken link from %7s %s\n",
                           (type == OBJ_ANY ? "unknown" : typename(type)), "unknown");
                errors_found |= ERROR_REACHABLE;
@@ -131,9 +148,9 @@ static int mark_object(struct object *obj, int type, void *data, struct fsck_opt
        if (!(obj->flags & HAS_OBJ)) {
                if (parent && !has_object_file(&obj->oid)) {
                        printf("broken link from %7s %s\n",
-                                typename(parent->type), describe_object(parent));
+                                printable_type(parent), describe_object(parent));
                        printf("              to %7s %s\n",
-                                typename(obj->type), describe_object(obj));
+                                printable_type(obj), describe_object(obj));
                        errors_found |= ERROR_REACHABLE;
                }
                return 1;
@@ -205,9 +222,7 @@ static void check_reachable_object(struct object *obj)
        if (!(obj->flags & HAS_OBJ)) {
                if (has_sha1_pack(obj->oid.hash))
                        return; /* it is in pack - forget about it */
-               if (connectivity_only && has_object_file(&obj->oid))
-                       return;
-               printf("missing %s %s\n", typename(obj->type),
+               printf("missing %s %s\n", printable_type(obj),
                        describe_object(obj));
                errors_found |= ERROR_REACHABLE;
                return;
@@ -225,7 +240,7 @@ static void check_unreachable_object(struct object *obj)
         * to complain about it being unreachable (since it does
         * not exist).
         */
-       if (!obj->parsed)
+       if (!(obj->flags & HAS_OBJ))
                return;
 
        /*
@@ -233,7 +248,7 @@ static void check_unreachable_object(struct object *obj)
         * since this is something that is prunable.
         */
        if (show_unreachable) {
-               printf("unreachable %s %s\n", typename(obj->type),
+               printf("unreachable %s %s\n", printable_type(obj),
                        describe_object(obj));
                return;
        }
@@ -252,7 +267,7 @@ static void check_unreachable_object(struct object *obj)
         */
        if (!obj->used) {
                if (show_dangling)
-                       printf("dangling %s %s\n", typename(obj->type),
+                       printf("dangling %s %s\n", printable_type(obj),
                               describe_object(obj));
                if (write_lost_and_found) {
                        char *filename = git_pathdup("lost-found/%s/%s",
@@ -268,7 +283,7 @@ static void check_unreachable_object(struct object *obj)
                        if (!(f = fopen(filename, "w")))
                                die_errno("Could not open '%s'", filename);
                        if (obj->type == OBJ_BLOB) {
-                               if (stream_blob_to_fd(fileno(f), obj->oid.hash, NULL, 1))
+                               if (stream_blob_to_fd(fileno(f), &obj->oid, NULL, 1))
                                        die_errno("Could not write '%s'", filename);
                        } else
                                fprintf(f, "%s\n", describe_object(obj));
@@ -326,7 +341,7 @@ static int fsck_obj(struct object *obj)
 
        if (verbose)
                fprintf(stderr, "Checking %s %s\n",
-                       typename(obj->type), describe_object(obj));
+                       printable_type(obj), describe_object(obj));
 
        if (fsck_walk(obj, NULL, &fsck_obj_options))
                objerror(obj, "broken links");
@@ -352,7 +367,7 @@ static int fsck_obj(struct object *obj)
                struct tag *tag = (struct tag *) obj;
 
                if (show_tags && tag->tagged) {
-                       printf("tagged %s %s", typename(tag->tagged->type),
+                       printf("tagged %s %s", printable_type(tag->tagged),
                                describe_object(tag->tagged));
                        printf(" (%s) in %s\n", tag->tag,
                                describe_object(&tag->object));
@@ -362,18 +377,6 @@ static int fsck_obj(struct object *obj)
        return 0;
 }
 
-static int fsck_sha1(const unsigned char *sha1)
-{
-       struct object *obj = parse_object(sha1);
-       if (!obj) {
-               errors_found |= ERROR_OBJECT;
-               return error("%s: object corrupt or missing",
-                            sha1_to_hex(sha1));
-       }
-       obj->flags |= HAS_OBJ;
-       return fsck_obj(obj);
-}
-
 static int fsck_obj_buffer(const unsigned char *sha1, enum object_type type,
                           unsigned long size, void *buffer, int *eaten)
 {
@@ -393,14 +396,14 @@ static int fsck_obj_buffer(const unsigned char *sha1, enum object_type type,
 
 static int default_refs;
 
-static void fsck_handle_reflog_sha1(const char *refname, unsigned char *sha1,
+static void fsck_handle_reflog_oid(const char *refname, struct object_id *oid,
        unsigned long timestamp)
 {
        struct object *obj;
 
-       if (!is_null_sha1(sha1)) {
-               obj = lookup_object(sha1);
-               if (obj) {
+       if (!is_null_oid(oid)) {
+               obj = lookup_object(oid->hash);
+               if (obj && (obj->flags & HAS_OBJ)) {
                        if (timestamp && name_objects)
                                add_decoration(fsck_walk_options.object_names,
                                        obj,
@@ -408,13 +411,13 @@ static void fsck_handle_reflog_sha1(const char *refname, unsigned char *sha1,
                        obj->used = 1;
                        mark_object_reachable(obj);
                } else {
-                       error("%s: invalid reflog entry %s", refname, sha1_to_hex(sha1));
+                       error("%s: invalid reflog entry %s", refname, oid_to_hex(oid));
                        errors_found |= ERROR_REACHABLE;
                }
        }
 }
 
-static int fsck_handle_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+static int fsck_handle_reflog_ent(struct object_id *ooid, struct object_id *noid,
                const char *email, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
@@ -422,10 +425,10 @@ static int fsck_handle_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
 
        if (verbose)
                fprintf(stderr, "Checking reflog %s->%s\n",
-                       sha1_to_hex(osha1), sha1_to_hex(nsha1));
+                       oid_to_hex(ooid), oid_to_hex(noid));
 
-       fsck_handle_reflog_sha1(refname, osha1, 0);
-       fsck_handle_reflog_sha1(refname, nsha1, timestamp);
+       fsck_handle_reflog_oid(refname, ooid, 0);
+       fsck_handle_reflog_oid(refname, noid, timestamp);
        return 0;
 }
 
@@ -488,9 +491,41 @@ static void get_default_heads(void)
        }
 }
 
-static int fsck_loose(const unsigned char *sha1, const char *path, void *data)
+static struct object *parse_loose_object(const struct object_id *oid,
+                                        const char *path)
+{
+       struct object *obj;
+       void *contents;
+       enum object_type type;
+       unsigned long size;
+       int eaten;
+
+       if (read_loose_object(path, oid->hash, &type, &size, &contents) < 0)
+               return NULL;
+
+       if (!contents && type != OBJ_BLOB)
+               die("BUG: read_loose_object streamed a non-blob");
+
+       obj = parse_object_buffer(oid->hash, type, size, contents, &eaten);
+
+       if (!eaten)
+               free(contents);
+       return obj;
+}
+
+static int fsck_loose(const struct object_id *oid, const char *path, void *data)
 {
-       if (fsck_sha1(sha1))
+       struct object *obj = parse_loose_object(oid, path);
+
+       if (!obj) {
+               errors_found |= ERROR_OBJECT;
+               error("%s: object corrupt or missing: %s",
+                     oid_to_hex(oid), path);
+               return 0; /* keep checking other objects */
+       }
+
+       obj->flags = HAS_OBJ;
+       if (fsck_obj(obj))
                errors_found |= ERROR_OBJECT;
        return 0;
 }
@@ -584,6 +619,29 @@ static int fsck_cache_tree(struct cache_tree *it)
        return err;
 }
 
+static void mark_object_for_connectivity(const struct object_id *oid)
+{
+       struct object *obj = lookup_unknown_object(oid->hash);
+       obj->flags |= HAS_OBJ;
+}
+
+static int mark_loose_for_connectivity(const struct object_id *oid,
+                                      const char *path,
+                                      void *data)
+{
+       mark_object_for_connectivity(oid);
+       return 0;
+}
+
+static int mark_packed_for_connectivity(const struct object_id *oid,
+                                       struct packed_git *pack,
+                                       uint32_t pos,
+                                       void *data)
+{
+       mark_object_for_connectivity(oid);
+       return 0;
+}
+
 static char const * const fsck_usage[] = {
        N_("git fsck [<options>] [<object>...]"),
        NULL
@@ -640,44 +698,41 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
        git_config(fsck_config, NULL);
 
        fsck_head_link();
-       if (!connectivity_only) {
+       if (connectivity_only) {
+               for_each_loose_object(mark_loose_for_connectivity, NULL, 0);
+               for_each_packed_object(mark_packed_for_connectivity, NULL, 0);
+       } else {
                fsck_object_dir(get_object_directory());
 
                prepare_alt_odb();
-               for (alt = alt_odb_list; alt; alt = alt->next) {
-                       /* directory name, minus trailing slash */
-                       size_t namelen = alt->name - alt->base - 1;
-                       struct strbuf name = STRBUF_INIT;
-                       strbuf_add(&name, alt->base, namelen);
-                       fsck_object_dir(name.buf);
-                       strbuf_release(&name);
-               }
-       }
+               for (alt = alt_odb_list; alt; alt = alt->next)
+                       fsck_object_dir(alt->path);
 
-       if (check_full) {
-               struct packed_git *p;
-               uint32_t total = 0, count = 0;
-               struct progress *progress = NULL;
+               if (check_full) {
+                       struct packed_git *p;
+                       uint32_t total = 0, count = 0;
+                       struct progress *progress = NULL;
 
-               prepare_packed_git();
+                       prepare_packed_git();
 
-               if (show_progress) {
+                       if (show_progress) {
+                               for (p = packed_git; p; p = p->next) {
+                                       if (open_pack_index(p))
+                                               continue;
+                                       total += p->num_objects;
+                               }
+
+                               progress = start_progress(_("Checking objects"), total);
+                       }
                        for (p = packed_git; p; p = p->next) {
-                               if (open_pack_index(p))
-                                       continue;
-                               total += p->num_objects;
+                               /* verify gives error messages itself */
+                               if (verify_pack(p, fsck_obj_buffer,
+                                               progress, count))
+                                       errors_found |= ERROR_PACK;
+                               count += p->num_objects;
                        }
-
-                       progress = start_progress(_("Checking objects"), total);
+                       stop_progress(&progress);
                }
-               for (p = packed_git; p; p = p->next) {
-                       /* verify gives error messages itself */
-                       if (verify_pack(p, fsck_obj_buffer,
-                                       progress, count))
-                               errors_found |= ERROR_PACK;
-                       count += p->num_objects;
-               }
-               stop_progress(&progress);
        }
 
        heads = 0;
@@ -687,9 +742,11 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                if (!get_sha1(arg, sha1)) {
                        struct object *obj = lookup_object(sha1);
 
-                       /* Error is printed by lookup_object(). */
-                       if (!obj)
+                       if (!obj || !(obj->flags & HAS_OBJ)) {
+                               error("%s: object missing", sha1_to_hex(sha1));
+                               errors_found |= ERROR_OBJECT;
                                continue;
+                       }
 
                        obj->used = 1;
                        if (name_objects)
@@ -700,6 +757,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                        continue;
                }
                error("invalid parameter: expected sha1, got '%s'", arg);
+               errors_found |= ERROR_OBJECT;
        }
 
        /*
@@ -707,12 +765,13 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
         * default ones from .git/refs. We also consider the index file
         * in this case (ie this implies --cache).
         */
-       if (!heads) {
+       if (!argc) {
                get_default_heads();
                keep_cache_objects = 1;
        }
 
        if (keep_cache_objects) {
+               verify_index_checksum = 1;
                read_cache();
                for (i = 0; i < active_nr; i++) {
                        unsigned int mode;
@@ -722,7 +781,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                        mode = active_cache[i]->ce_mode;
                        if (S_ISGITLINK(mode))
                                continue;
-                       blob = lookup_blob(active_cache[i]->sha1);
+                       blob = lookup_blob(active_cache[i]->oid.hash);
                        if (!blob)
                                continue;
                        obj = &blob->object;
index 069950d0b417f5eb97cd756ae32df7a2fb13abce..91f7696a85ec974d0ff5a1591cc404ed99efb7d7 100644 (file)
@@ -33,6 +33,8 @@ static int aggressive_window = 250;
 static int gc_auto_threshold = 6700;
 static int gc_auto_pack_limit = 50;
 static int detach_auto = 1;
+static unsigned long gc_log_expire_time;
+static const char *gc_log_expire = "1.day.ago";
 static const char *prune_expire = "2.weeks.ago";
 static const char *prune_worktrees_expire = "3.months.ago";
 
@@ -62,24 +64,31 @@ static void report_pack_garbage(unsigned seen_bits, const char *path)
                string_list_append(&pack_garbage, path);
 }
 
-static void git_config_date_string(const char *key, const char **output)
-{
-       if (git_config_get_string_const(key, output))
-               return;
-       if (strcmp(*output, "now")) {
-               unsigned long now = approxidate("now");
-               if (approxidate(*output) >= now)
-                       git_die_config(key, _("Invalid %s: '%s'"), key, *output);
-       }
-}
-
 static void process_log_file(void)
 {
        struct stat st;
-       if (!fstat(get_lock_file_fd(&log_lock), &st) && st.st_size)
+       if (fstat(get_lock_file_fd(&log_lock), &st)) {
+               /*
+                * Perhaps there was an i/o error or another
+                * unlikely situation.  Try to make a note of
+                * this in gc.log along with any existing
+                * messages.
+                */
+               int saved_errno = errno;
+               fprintf(stderr, _("Failed to fstat %s: %s"),
+                       get_tempfile_path(&log_lock.tempfile),
+                       strerror(saved_errno));
+               fflush(stderr);
                commit_lock_file(&log_lock);
-       else
+               errno = saved_errno;
+       } else if (st.st_size) {
+               /* There was some error recorded in the lock file */
+               commit_lock_file(&log_lock);
+       } else {
+               /* No error, clean up any old gc.log */
+               unlink(git_path("gc.log"));
                rollback_lock_file(&log_lock);
+       }
 }
 
 static void process_log_file_at_exit(void)
@@ -111,8 +120,10 @@ static void gc_config(void)
        git_config_get_int("gc.auto", &gc_auto_threshold);
        git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit);
        git_config_get_bool("gc.autodetach", &detach_auto);
-       git_config_date_string("gc.pruneexpire", &prune_expire);
-       git_config_date_string("gc.worktreepruneexpire", &prune_worktrees_expire);
+       git_config_get_expiry("gc.pruneexpire", &prune_expire);
+       git_config_get_expiry("gc.worktreepruneexpire", &prune_worktrees_expire);
+       git_config_get_expiry("gc.logexpiry", &gc_log_expire);
+
        git_config(git_default_config, NULL);
 }
 
@@ -124,8 +135,6 @@ static int too_many_loose_objects(void)
         * distributed, we can check only one and get a reasonable
         * estimate.
         */
-       char path[PATH_MAX];
-       const char *objdir = get_object_directory();
        DIR *dir;
        struct dirent *ent;
        int auto_threshold;
@@ -135,11 +144,7 @@ static int too_many_loose_objects(void)
        if (gc_auto_threshold <= 0)
                return 0;
 
-       if (sizeof(path) <= snprintf(path, sizeof(path), "%s/17", objdir)) {
-               warning(_("insanely long object directory %.*s"), 50, objdir);
-               return 0;
-       }
-       dir = opendir(path);
+       dir = opendir(git_path("objects/17"));
        if (!dir)
                return 0;
 
@@ -191,6 +196,11 @@ static void add_repack_all_option(void)
        }
 }
 
+static void add_repack_incremental_option(void)
+{
+       argv_array_push(&repack, "--no-write-bitmap-index");
+}
+
 static int need_to_gc(void)
 {
        /*
@@ -208,7 +218,9 @@ static int need_to_gc(void)
         */
        if (too_many_packs())
                add_repack_all_option();
-       else if (!too_many_loose_objects())
+       else if (too_many_loose_objects())
+               add_repack_incremental_option();
+       else
                return 0;
 
        if (run_hook_le(NULL, "pre-auto-gc", NULL))
@@ -220,7 +232,7 @@ static int need_to_gc(void)
 static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
 {
        static struct lock_file lock;
-       char my_host[128];
+       char my_host[HOST_NAME_MAX + 1];
        struct strbuf sb = STRBUF_INIT;
        struct stat st;
        uintmax_t pid;
@@ -232,15 +244,19 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
                /* already locked */
                return NULL;
 
-       if (gethostname(my_host, sizeof(my_host)))
+       if (xgethostname(my_host, sizeof(my_host)))
                xsnprintf(my_host, sizeof(my_host), "unknown");
 
        pidfile_path = git_pathdup("gc.pid");
        fd = hold_lock_file_for_update(&lock, pidfile_path,
                                       LOCK_DIE_ON_ERROR);
        if (!force) {
-               static char locking_host[128];
+               static char locking_host[HOST_NAME_MAX + 1];
+               static char *scan_fmt;
                int should_exit;
+
+               if (!scan_fmt)
+                       scan_fmt = xstrfmt("%s %%%dc", "%"SCNuMAX, HOST_NAME_MAX);
                fp = fopen(pidfile_path, "r");
                memset(locking_host, 0, sizeof(locking_host));
                should_exit =
@@ -256,7 +272,7 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
                         * running.
                         */
                        time(NULL) - st.st_mtime <= 12 * 3600 &&
-                       fscanf(fp, "%"SCNuMAX" %127c", &pid, locking_host) == 2 &&
+                       fscanf(fp, scan_fmt, &pid, locking_host) == 2 &&
                        /* be gentle to concurrent "gc" on remote hosts */
                        (strcmp(locking_host, my_host) || !kill(pid, 0) || errno == EPERM);
                if (fp != NULL)
@@ -283,19 +299,34 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
 static int report_last_gc_error(void)
 {
        struct strbuf sb = STRBUF_INIT;
-       int ret;
+       int ret = 0;
+       struct stat st;
+       char *gc_log_path = git_pathdup("gc.log");
 
-       ret = strbuf_read_file(&sb, git_path("gc.log"), 0);
+       if (stat(gc_log_path, &st)) {
+               if (errno == ENOENT)
+                       goto done;
+
+               ret = error_errno(_("Can't stat %s"), gc_log_path);
+               goto done;
+       }
+
+       if (st.st_mtime < gc_log_expire_time)
+               goto done;
+
+       ret = strbuf_read_file(&sb, gc_log_path, 0);
        if (ret > 0)
-               return error(_("The last gc run reported the following. "
+               ret = error(_("The last gc run reported the following. "
                               "Please correct the root cause\n"
                               "and remove %s.\n"
                               "Automatic cleanup will not be performed "
                               "until the file is removed.\n\n"
                               "%s"),
-                            git_path("gc.log"), sb.buf);
+                           gc_log_path, sb.buf);
        strbuf_release(&sb);
-       return 0;
+done:
+       free(gc_log_path);
+       return ret;
 }
 
 static int gc_before_repack(void)
@@ -342,7 +373,10 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
        argv_array_pushl(&prune_worktrees, "worktree", "prune", "--expire", NULL);
        argv_array_pushl(&rerere, "rerere", "gc", NULL);
 
+       /* default expiry time, overwritten in gc_config */
        gc_config();
+       if (parse_expiry_date(gc_log_expire, &gc_log_expire_time))
+               die(_("Failed to parse gc.logexpiry value %s"), gc_log_expire);
 
        if (pack_refs < 0)
                pack_refs = !is_bare_repository();
@@ -441,5 +475,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
                warning(_("There are too many unreachable loose objects; "
                        "run 'git prune' to remove them."));
 
+       if (!daemonized)
+               unlink(git_path("gc.log"));
+
        return 0;
 }
index ae738312aadd48e74497368917e82f221f3abe45..254c1c7849152884d9abd0b603f1c75f87e085b5 100644 (file)
 #include "quote.h"
 #include "dir.h"
 #include "pathspec.h"
+#include "submodule.h"
+#include "submodule-config.h"
 
 static char const * const grep_usage[] = {
        N_("git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"),
        NULL
 };
 
+static const char *super_prefix;
+static int recurse_submodules;
+static struct argv_array submodule_options = ARGV_ARRAY_INIT;
+static const char *parent_basename;
+
+static int grep_submodule_launch(struct grep_opt *opt,
+                                const struct grep_source *gs);
+
 #define GREP_NUM_THREADS_DEFAULT 8
 static int num_threads;
 
@@ -174,7 +184,10 @@ static void *run(void *arg)
                        break;
 
                opt->output_priv = w;
-               hit |= grep_source(opt, &w->source);
+               if (w->source.type == GREP_SOURCE_SUBMODULE)
+                       hit |= grep_submodule_launch(opt, &w->source);
+               else
+                       hit |= grep_source(opt, &w->source);
                grep_source_clear_data(&w->source);
                work_done(w);
        }
@@ -281,32 +294,40 @@ static int grep_cmd_config(const char *var, const char *value, void *cb)
        return st;
 }
 
-static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size)
+static void *lock_and_read_oid_file(const struct object_id *oid, enum object_type *type, unsigned long *size)
 {
        void *data;
 
        grep_read_lock();
-       data = read_sha1_file(sha1, type, size);
+       data = read_sha1_file(oid->hash, type, size);
        grep_read_unlock();
        return data;
 }
 
-static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1,
+static int grep_oid(struct grep_opt *opt, const struct object_id *oid,
                     const char *filename, int tree_name_len,
                     const char *path)
 {
        struct strbuf pathbuf = STRBUF_INIT;
 
-       if (opt->relative && opt->prefix_length) {
-               quote_path_relative(filename + tree_name_len, opt->prefix, &pathbuf);
-               strbuf_insert(&pathbuf, 0, filename, tree_name_len);
+       if (super_prefix) {
+               strbuf_add(&pathbuf, filename, tree_name_len);
+               strbuf_addstr(&pathbuf, super_prefix);
+               strbuf_addstr(&pathbuf, filename + tree_name_len);
        } else {
                strbuf_addstr(&pathbuf, filename);
        }
 
+       if (opt->relative && opt->prefix_length) {
+               char *name = strbuf_detach(&pathbuf, NULL);
+               quote_path_relative(name + tree_name_len, opt->prefix, &pathbuf);
+               strbuf_insert(&pathbuf, 0, name, tree_name_len);
+               free(name);
+       }
+
 #ifndef NO_PTHREADS
        if (num_threads) {
-               add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1);
+               add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, oid);
                strbuf_release(&pathbuf);
                return 0;
        } else
@@ -315,7 +336,7 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1,
                struct grep_source gs;
                int hit;
 
-               grep_source_init(&gs, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1);
+               grep_source_init(&gs, GREP_SOURCE_SHA1, pathbuf.buf, path, oid);
                strbuf_release(&pathbuf);
                hit = grep_source(opt, &gs);
 
@@ -328,10 +349,15 @@ static int grep_file(struct grep_opt *opt, const char *filename)
 {
        struct strbuf buf = STRBUF_INIT;
 
-       if (opt->relative && opt->prefix_length)
-               quote_path_relative(filename, opt->prefix, &buf);
-       else
-               strbuf_addstr(&buf, filename);
+       if (super_prefix)
+               strbuf_addstr(&buf, super_prefix);
+       strbuf_addstr(&buf, filename);
+
+       if (opt->relative && opt->prefix_length) {
+               char *name = strbuf_detach(&buf, NULL);
+               quote_path_relative(name, opt->prefix, &buf);
+               free(name);
+       }
 
 #ifndef NO_PTHREADS
        if (num_threads) {
@@ -378,30 +404,310 @@ static void run_pager(struct grep_opt *opt, const char *prefix)
                exit(status);
 }
 
-static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int cached)
+static void compile_submodule_options(const struct grep_opt *opt,
+                                     const char **argv,
+                                     int cached, int untracked,
+                                     int opt_exclude, int use_index,
+                                     int pattern_type_arg)
+{
+       struct grep_pat *pattern;
+
+       if (recurse_submodules)
+               argv_array_push(&submodule_options, "--recurse-submodules");
+
+       if (cached)
+               argv_array_push(&submodule_options, "--cached");
+       if (!use_index)
+               argv_array_push(&submodule_options, "--no-index");
+       if (untracked)
+               argv_array_push(&submodule_options, "--untracked");
+       if (opt_exclude > 0)
+               argv_array_push(&submodule_options, "--exclude-standard");
+
+       if (opt->invert)
+               argv_array_push(&submodule_options, "-v");
+       if (opt->ignore_case)
+               argv_array_push(&submodule_options, "-i");
+       if (opt->word_regexp)
+               argv_array_push(&submodule_options, "-w");
+       switch (opt->binary) {
+       case GREP_BINARY_NOMATCH:
+               argv_array_push(&submodule_options, "-I");
+               break;
+       case GREP_BINARY_TEXT:
+               argv_array_push(&submodule_options, "-a");
+               break;
+       default:
+               break;
+       }
+       if (opt->allow_textconv)
+               argv_array_push(&submodule_options, "--textconv");
+       if (opt->max_depth != -1)
+               argv_array_pushf(&submodule_options, "--max-depth=%d",
+                                opt->max_depth);
+       if (opt->linenum)
+               argv_array_push(&submodule_options, "-n");
+       if (!opt->pathname)
+               argv_array_push(&submodule_options, "-h");
+       if (!opt->relative)
+               argv_array_push(&submodule_options, "--full-name");
+       if (opt->name_only)
+               argv_array_push(&submodule_options, "-l");
+       if (opt->unmatch_name_only)
+               argv_array_push(&submodule_options, "-L");
+       if (opt->null_following_name)
+               argv_array_push(&submodule_options, "-z");
+       if (opt->count)
+               argv_array_push(&submodule_options, "-c");
+       if (opt->file_break)
+               argv_array_push(&submodule_options, "--break");
+       if (opt->heading)
+               argv_array_push(&submodule_options, "--heading");
+       if (opt->pre_context)
+               argv_array_pushf(&submodule_options, "--before-context=%d",
+                                opt->pre_context);
+       if (opt->post_context)
+               argv_array_pushf(&submodule_options, "--after-context=%d",
+                                opt->post_context);
+       if (opt->funcname)
+               argv_array_push(&submodule_options, "-p");
+       if (opt->funcbody)
+               argv_array_push(&submodule_options, "-W");
+       if (opt->all_match)
+               argv_array_push(&submodule_options, "--all-match");
+       if (opt->debug)
+               argv_array_push(&submodule_options, "--debug");
+       if (opt->status_only)
+               argv_array_push(&submodule_options, "-q");
+
+       switch (pattern_type_arg) {
+       case GREP_PATTERN_TYPE_BRE:
+               argv_array_push(&submodule_options, "-G");
+               break;
+       case GREP_PATTERN_TYPE_ERE:
+               argv_array_push(&submodule_options, "-E");
+               break;
+       case GREP_PATTERN_TYPE_FIXED:
+               argv_array_push(&submodule_options, "-F");
+               break;
+       case GREP_PATTERN_TYPE_PCRE:
+               argv_array_push(&submodule_options, "-P");
+               break;
+       case GREP_PATTERN_TYPE_UNSPECIFIED:
+               break;
+       }
+
+       for (pattern = opt->pattern_list; pattern != NULL;
+            pattern = pattern->next) {
+               switch (pattern->token) {
+               case GREP_PATTERN:
+                       argv_array_pushf(&submodule_options, "-e%s",
+                                        pattern->pattern);
+                       break;
+               case GREP_AND:
+               case GREP_OPEN_PAREN:
+               case GREP_CLOSE_PAREN:
+               case GREP_NOT:
+               case GREP_OR:
+                       argv_array_push(&submodule_options, pattern->pattern);
+                       break;
+               /* BODY and HEAD are not used by git-grep */
+               case GREP_PATTERN_BODY:
+               case GREP_PATTERN_HEAD:
+                       break;
+               }
+       }
+
+       /*
+        * Limit number of threads for child process to use.
+        * This is to prevent potential fork-bomb behavior of git-grep as each
+        * submodule process has its own thread pool.
+        */
+       argv_array_pushf(&submodule_options, "--threads=%d",
+                        (num_threads + 1) / 2);
+
+       /* Add Pathspecs */
+       argv_array_push(&submodule_options, "--");
+       for (; *argv; argv++)
+               argv_array_push(&submodule_options, *argv);
+}
+
+/*
+ * Launch child process to grep contents of a submodule
+ */
+static int grep_submodule_launch(struct grep_opt *opt,
+                                const struct grep_source *gs)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+       int status, i;
+       const char *end_of_base;
+       const char *name;
+       struct strbuf child_output = STRBUF_INIT;
+
+       end_of_base = strchr(gs->name, ':');
+       if (gs->identifier && end_of_base)
+               name = end_of_base + 1;
+       else
+               name = gs->name;
+
+       prepare_submodule_repo_env(&cp.env_array);
+       argv_array_push(&cp.env_array, GIT_DIR_ENVIRONMENT);
+
+       if (opt->relative && opt->prefix_length)
+               argv_array_pushf(&cp.env_array, "%s=%s",
+                                GIT_TOPLEVEL_PREFIX_ENVIRONMENT,
+                                opt->prefix);
+
+       /* Add super prefix */
+       argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
+                        super_prefix ? super_prefix : "",
+                        name);
+       argv_array_push(&cp.args, "grep");
+
+       /*
+        * Add basename of parent project
+        * When performing grep on a tree object the filename is prefixed
+        * with the object's name: 'tree-name:filename'.  In order to
+        * provide uniformity of output we want to pass the name of the
+        * parent project's object name to the submodule so the submodule can
+        * prefix its output with the parent's name and not its own SHA1.
+        */
+       if (gs->identifier && end_of_base)
+               argv_array_pushf(&cp.args, "--parent-basename=%.*s",
+                                (int) (end_of_base - gs->name),
+                                gs->name);
+
+       /* Add options */
+       for (i = 0; i < submodule_options.argc; i++) {
+               /*
+                * If there is a tree identifier for the submodule, add the
+                * rev after adding the submodule options but before the
+                * pathspecs.  To do this we listen for the '--' and insert the
+                * sha1 before pushing the '--' onto the child process argv
+                * array.
+                */
+               if (gs->identifier &&
+                   !strcmp("--", submodule_options.argv[i])) {
+                       argv_array_push(&cp.args, sha1_to_hex(gs->identifier));
+               }
+
+               argv_array_push(&cp.args, submodule_options.argv[i]);
+       }
+
+       cp.git_cmd = 1;
+       cp.dir = gs->path;
+
+       /*
+        * Capture output to output buffer and check the return code from the
+        * child process.  A '0' indicates a hit, a '1' indicates no hit and
+        * anything else is an error.
+        */
+       status = capture_command(&cp, &child_output, 0);
+       if (status && (status != 1)) {
+               /* flush the buffer */
+               write_or_die(1, child_output.buf, child_output.len);
+               die("process for submodule '%s' failed with exit code: %d",
+                   gs->name, status);
+       }
+
+       opt->output(opt, child_output.buf, child_output.len);
+       strbuf_release(&child_output);
+       /* invert the return code to make a hit equal to 1 */
+       return !status;
+}
+
+/*
+ * Prep grep structures for a submodule grep
+ * sha1: the sha1 of the submodule or NULL if using the working tree
+ * filename: name of the submodule including tree name of parent
+ * path: location of the submodule
+ */
+static int grep_submodule(struct grep_opt *opt, const unsigned char *sha1,
+                         const char *filename, const char *path)
+{
+       if (!is_submodule_initialized(path))
+               return 0;
+       if (!is_submodule_populated_gently(path, NULL)) {
+               /*
+                * If searching history, check for the presense of the
+                * submodule's gitdir before skipping the submodule.
+                */
+               if (sha1) {
+                       const struct submodule *sub =
+                                       submodule_from_path(null_sha1, path);
+                       if (sub)
+                               path = git_path("modules/%s", sub->name);
+
+                       if (!(is_directory(path) && is_git_directory(path)))
+                               return 0;
+               } else {
+                       return 0;
+               }
+       }
+
+#ifndef NO_PTHREADS
+       if (num_threads) {
+               add_work(opt, GREP_SOURCE_SUBMODULE, filename, path, sha1);
+               return 0;
+       } else
+#endif
+       {
+               struct grep_source gs;
+               int hit;
+
+               grep_source_init(&gs, GREP_SOURCE_SUBMODULE,
+                                filename, path, sha1);
+               hit = grep_submodule_launch(opt, &gs);
+
+               grep_source_clear(&gs);
+               return hit;
+       }
+}
+
+static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec,
+                     int cached)
 {
        int hit = 0;
        int nr;
+       struct strbuf name = STRBUF_INIT;
+       int name_base_len = 0;
+       if (super_prefix) {
+               name_base_len = strlen(super_prefix);
+               strbuf_addstr(&name, super_prefix);
+       }
+
        read_cache();
 
        for (nr = 0; nr < active_nr; nr++) {
                const struct cache_entry *ce = active_cache[nr];
-               if (!S_ISREG(ce->ce_mode))
-                       continue;
-               if (!ce_path_match(ce, pathspec, NULL))
+               strbuf_setlen(&name, name_base_len);
+               strbuf_addstr(&name, ce->name);
+
+               if (S_ISREG(ce->ce_mode) &&
+                   match_pathspec(pathspec, name.buf, name.len, 0, NULL,
+                                  S_ISDIR(ce->ce_mode) ||
+                                  S_ISGITLINK(ce->ce_mode))) {
+                       /*
+                        * If CE_VALID is on, we assume worktree file and its
+                        * cache entry are identical, even if worktree file has
+                        * been modified, so use cache version instead
+                        */
+                       if (cached || (ce->ce_flags & CE_VALID) ||
+                           ce_skip_worktree(ce)) {
+                               if (ce_stage(ce) || ce_intent_to_add(ce))
+                                       continue;
+                               hit |= grep_oid(opt, &ce->oid, ce->name,
+                                                0, ce->name);
+                       } else {
+                               hit |= grep_file(opt, ce->name);
+                       }
+               } else if (recurse_submodules && S_ISGITLINK(ce->ce_mode) &&
+                          submodule_path_match(pathspec, name.buf, NULL)) {
+                       hit |= grep_submodule(opt, NULL, ce->name, ce->name);
+               } else {
                        continue;
-               /*
-                * If CE_VALID is on, we assume worktree file and its cache entry
-                * are identical, even if worktree file has been modified, so use
-                * cache version instead
-                */
-               if (cached || (ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) {
-                       if (ce_stage(ce) || ce_intent_to_add(ce))
-                               continue;
-                       hit |= grep_sha1(opt, ce->sha1, ce->name, 0, ce->name);
                }
-               else
-                       hit |= grep_file(opt, ce->name);
+
                if (ce_stage(ce)) {
                        do {
                                nr++;
@@ -412,6 +718,8 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int
                if (hit && opt->status_only)
                        break;
        }
+
+       strbuf_release(&name);
        return hit;
 }
 
@@ -423,12 +731,22 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
        enum interesting match = entry_not_interesting;
        struct name_entry entry;
        int old_baselen = base->len;
+       struct strbuf name = STRBUF_INIT;
+       int name_base_len = 0;
+       if (super_prefix) {
+               strbuf_addstr(&name, super_prefix);
+               name_base_len = name.len;
+       }
 
        while (tree_entry(tree, &entry)) {
                int te_len = tree_entry_len(&entry);
 
                if (match != all_entries_interesting) {
-                       match = tree_entry_interesting(&entry, base, tn_len, pathspec);
+                       strbuf_addstr(&name, base->buf + tn_len);
+                       match = tree_entry_interesting(&entry, &name,
+                                                      0, pathspec);
+                       strbuf_setlen(&name, name_base_len);
+
                        if (match == all_entries_not_interesting)
                                break;
                        if (match == entry_not_interesting)
@@ -438,16 +756,15 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
                strbuf_add(base, entry.path, te_len);
 
                if (S_ISREG(entry.mode)) {
-                       hit |= grep_sha1(opt, entry.oid->hash, base->buf, tn_len,
+                       hit |= grep_oid(opt, entry.oid, base->buf, tn_len,
                                         check_attr ? base->buf + tn_len : NULL);
-               }
-               else if (S_ISDIR(entry.mode)) {
+               } else if (S_ISDIR(entry.mode)) {
                        enum object_type type;
                        struct tree_desc sub;
                        void *data;
                        unsigned long size;
 
-                       data = lock_and_read_sha1_file(entry.oid->hash, &type, &size);
+                       data = lock_and_read_oid_file(entry.oid, &type, &size);
                        if (!data)
                                die(_("unable to read tree (%s)"),
                                    oid_to_hex(entry.oid));
@@ -457,12 +774,18 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
                        hit |= grep_tree(opt, pathspec, &sub, base, tn_len,
                                         check_attr);
                        free(data);
+               } else if (recurse_submodules && S_ISGITLINK(entry.mode)) {
+                       hit |= grep_submodule(opt, entry.oid->hash, base->buf,
+                                             base->buf + tn_len);
                }
+
                strbuf_setlen(base, old_baselen);
 
                if (hit && opt->status_only)
                        break;
        }
+
+       strbuf_release(&name);
        return hit;
 }
 
@@ -470,7 +793,7 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
                       struct object *obj, const char *name, const char *path)
 {
        if (obj->type == OBJ_BLOB)
-               return grep_sha1(opt, obj->oid.hash, name, 0, path);
+               return grep_oid(opt, &obj->oid, name, 0, path);
        if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) {
                struct tree_desc tree;
                void *data;
@@ -486,6 +809,10 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
                if (!data)
                        die(_("unable to read tree (%s)"), oid_to_hex(&obj->oid));
 
+               /* Use parent's name as base when recursing submodules */
+               if (recurse_submodules && parent_basename)
+                       name = parent_basename;
+
                len = name ? strlen(name) : 0;
                strbuf_init(&base, PATH_MAX + len + 1);
                if (len) {
@@ -512,6 +839,12 @@ static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec,
        for (i = 0; i < nr; i++) {
                struct object *real_obj;
                real_obj = deref_tag(list->objects[i].item, NULL, 0);
+
+               /* load the gitmodules file for this rev */
+               if (recurse_submodules) {
+                       submodule_free();
+                       gitmodules_config_sha1(real_obj->oid.hash);
+               }
                if (grep_object(opt, pathspec, real_obj, list->objects[i].name, list->objects[i].path)) {
                        hit = 1;
                        if (opt->status_only)
@@ -640,6 +973,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        int dummy;
        int use_index = 1;
        int pattern_type_arg = GREP_PATTERN_TYPE_UNSPECIFIED;
+       int allow_revs;
 
        struct option options[] = {
                OPT_BOOL(0, "cached", &cached,
@@ -650,6 +984,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                        N_("search in both tracked and untracked files")),
                OPT_SET_INT(0, "exclude-standard", &opt_exclude,
                            N_("ignore files specified via '.gitignore'"), 1),
+               OPT_BOOL(0, "recurse-submodules", &recurse_submodules,
+                        N_("recursively search in each submodule")),
+               OPT_STRING(0, "parent-basename", &parent_basename,
+                          N_("basename"),
+                          N_("prepend parent project's basename to output")),
                OPT_GROUP(""),
                OPT_BOOL('v', "invert-match", &opt.invert,
                        N_("show non-matching lines")),
@@ -754,6 +1093,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        init_grep_defaults();
        git_config(grep_cmd_config, NULL);
        grep_init(&opt, prefix);
+       super_prefix = get_super_prefix();
 
        /*
         * If there is no -- then the paths must exist in the working
@@ -816,26 +1156,71 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 
        compile_grep_patterns(&opt);
 
-       /* Check revs and then paths */
+       /*
+        * We have to find "--" in a separate pass, because its presence
+        * influences how we will parse arguments that come before it.
+        */
+       for (i = 0; i < argc; i++) {
+               if (!strcmp(argv[i], "--")) {
+                       seen_dashdash = 1;
+                       break;
+               }
+       }
+
+       /*
+        * Resolve any rev arguments. If we have a dashdash, then everything up
+        * to it must resolve as a rev. If not, then we stop at the first
+        * non-rev and assume everything else is a path.
+        */
+       allow_revs = use_index && !untracked;
        for (i = 0; i < argc; i++) {
                const char *arg = argv[i];
-               unsigned char sha1[20];
+               struct object_id oid;
                struct object_context oc;
-               /* Is it a rev? */
-               if (!get_sha1_with_context(arg, 0, sha1, &oc)) {
-                       struct object *object = parse_object_or_die(sha1, arg);
-                       if (!seen_dashdash)
-                               verify_non_filename(prefix, arg);
-                       add_object_array_with_path(object, arg, &list, oc.mode, oc.path);
-                       continue;
-               }
+               struct object *object;
+
                if (!strcmp(arg, "--")) {
                        i++;
-                       seen_dashdash = 1;
+                       break;
                }
-               break;
+
+               if (!allow_revs) {
+                       if (seen_dashdash)
+                               die(_("--no-index or --untracked cannot be used with revs"));
+                       break;
+               }
+
+               if (get_sha1_with_context(arg, GET_SHA1_RECORD_PATH,
+                                         oid.hash, &oc)) {
+                       if (seen_dashdash)
+                               die(_("unable to resolve revision: %s"), arg);
+                       break;
+               }
+
+               object = parse_object_or_die(oid.hash, arg);
+               if (!seen_dashdash)
+                       verify_non_filename(prefix, arg);
+               add_object_array_with_path(object, arg, &list, oc.mode, oc.path);
+               free(oc.path);
+       }
+
+       /*
+        * Anything left over is presumed to be a path. But in the non-dashdash
+        * "do what I mean" case, we verify and complain when that isn't true.
+        */
+       if (!seen_dashdash) {
+               int j;
+               for (j = i; j < argc; j++)
+                       verify_filename(prefix, argv[j], j == i && allow_revs);
        }
 
+       parse_pathspec(&pathspec, 0,
+                      PATHSPEC_PREFER_CWD |
+                      (opt.max_depth != -1 ? PATHSPEC_MAXDEPTH_VALID : 0),
+                      prefix, argv + i);
+       pathspec.max_depth = opt.max_depth;
+       pathspec.recursive = 1;
+
 #ifndef NO_PTHREADS
        if (list.nr || cached || show_in_pager)
                num_threads = 0;
@@ -857,20 +1242,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        }
 #endif
 
-       /* The rest are paths */
-       if (!seen_dashdash) {
-               int j;
-               for (j = i; j < argc; j++)
-                       verify_filename(prefix, argv[j], j == i);
+       if (recurse_submodules) {
+               gitmodules_config();
+               compile_submodule_options(&opt, argv + i, cached, untracked,
+                                         opt_exclude, use_index,
+                                         pattern_type_arg);
        }
 
-       parse_pathspec(&pathspec, 0,
-                      PATHSPEC_PREFER_CWD |
-                      (opt.max_depth != -1 ? PATHSPEC_MAXDEPTH_VALID : 0),
-                      prefix, argv + i);
-       pathspec.max_depth = opt.max_depth;
-       pathspec.recursive = 1;
-
        if (show_in_pager && (cached || list.nr))
                die(_("--open-files-in-pager only works on the worktree"));
 
@@ -894,6 +1272,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                }
        }
 
+       if (recurse_submodules && (!use_index || untracked))
+               die(_("option not supported with --recurse-submodules."));
+
        if (!show_in_pager && !opt.status_only)
                setup_pager();
 
@@ -902,8 +1283,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 
        if (!use_index || untracked) {
                int use_exclude = (opt_exclude < 0) ? use_index : !!opt_exclude;
-               if (list.nr)
-                       die(_("--no-index or --untracked cannot be used with revs."));
                hit = grep_directory(&opt, &pathspec, use_exclude, use_index);
        } else if (0 <= opt_exclude) {
                die(_("--[no-]exclude-standard cannot be used for tracked contents."));
@@ -922,6 +1301,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                hit |= wait_all();
        if (hit && show_in_pager)
                run_pager(&opt, prefix);
+       clear_pathspec(&pathspec);
        free_grep_patterns(&opt);
        return !hit;
 }
index f7d3567dd0ce2d75778d6cf011961c0f203432b4..bbeaf20bcca1ae1e9bfa55b5a8e4adbed83c00e8 100644 (file)
@@ -87,6 +87,7 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
        int stdin_paths = 0;
        int no_filters = 0;
        int literally = 0;
+       int nongit = 0;
        unsigned flags = HASH_FORMAT_CHECK;
        const char *vpath = NULL;
        const struct option hash_object_options[] = {
@@ -101,18 +102,18 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
                OPT_END()
        };
        int i;
-       int prefix_length = -1;
        const char *errstr = NULL;
 
        argc = parse_options(argc, argv, NULL, hash_object_options,
                             hash_object_usage, 0);
 
-       if (flags & HASH_WRITE_OBJECT) {
+       if (flags & HASH_WRITE_OBJECT)
                prefix = setup_git_directory();
-               prefix_length = prefix ? strlen(prefix) : 0;
-               if (vpath && prefix)
-                       vpath = prefix_filename(prefix, prefix_length, vpath);
-       }
+       else
+               prefix = setup_git_directory_gently(&nongit);
+
+       if (vpath && prefix)
+               vpath = xstrdup(prefix_filename(prefix, vpath));
 
        git_config(git_default_config, NULL);
 
@@ -141,11 +142,13 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
 
        for (i = 0 ; i < argc; i++) {
                const char *arg = argv[i];
+               char *to_free = NULL;
 
-               if (0 <= prefix_length)
-                       arg = prefix_filename(prefix, prefix_length, arg);
+               if (prefix)
+                       arg = to_free = prefix_filename(prefix, arg);
                hash_object(arg, type, no_filters ? NULL : vpath ? vpath : arg,
                            flags, literally);
+               free(to_free);
        }
 
        if (stdin_paths)
index e8f79d7af54bce18e8d503dea182146da0fbd456..49f7a07f85db1e36d959749adf2eb1962940fb19 100644 (file)
@@ -37,8 +37,10 @@ static int show_all = 0;
 static int show_guides = 0;
 static unsigned int colopts;
 static enum help_format help_format = HELP_FORMAT_NONE;
+static int exclude_guides;
 static struct option builtin_help_options[] = {
        OPT_BOOL('a', "all", &show_all, N_("print all available commands")),
+       OPT_HIDDEN_BOOL(0, "exclude-guides", &exclude_guides, N_("exclude guides")),
        OPT_BOOL('g', "guides", &show_guides, N_("print list of useful guides")),
        OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
        OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
@@ -426,10 +428,29 @@ static void list_common_guides_help(void)
        putchar('\n');
 }
 
+static const char *check_git_cmd(const char* cmd)
+{
+       char *alias;
+
+       if (is_git_command(cmd))
+               return cmd;
+
+       alias = alias_lookup(cmd);
+       if (alias) {
+               printf_ln(_("`git %s' is aliased to `%s'"), cmd, alias);
+               free(alias);
+               exit(0);
+       }
+
+       if (exclude_guides)
+               return help_unknown_cmd(cmd);
+
+       return cmd;
+}
+
 int cmd_help(int argc, const char **argv, const char *prefix)
 {
        int nongit;
-       char *alias;
        enum help_format parsed_help_format;
 
        argc = parse_options(argc, argv, prefix, builtin_help_options,
@@ -469,12 +490,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
        if (help_format == HELP_FORMAT_NONE)
                help_format = parse_help_format(DEFAULT_HELP_FORMAT);
 
-       alias = alias_lookup(argv[0]);
-       if (alias && !is_git_command(argv[0])) {
-               printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
-               free(alias);
-               return 0;
-       }
+       argv[0] = check_git_cmd(argv[0]);
 
        switch (help_format) {
        case HELP_FORMAT_NONE:
index 1d2ea583a45507935ec2007d6c44f5e968a1aed5..4ff567db475573f8f45830983b7d3716d6832b4b 100644 (file)
@@ -87,6 +87,7 @@ static struct progress *progress;
 static unsigned char input_buffer[4096];
 static unsigned int input_offset, input_len;
 static off_t consumed_bytes;
+static off_t max_input_size;
 static unsigned deepest_delta;
 static git_SHA_CTX input_ctx;
 static uint32_t input_crc32;
@@ -297,6 +298,8 @@ static void use(int bytes)
        if (signed_add_overflows(consumed_bytes, bytes))
                die(_("pack too large for current definition of off_t"));
        consumed_bytes += bytes;
+       if (max_input_size && consumed_bytes > max_input_size)
+               die(_("pack exceeds maximum allowed size"));
 }
 
 static const char *open_pack_file(const char *pack_name)
@@ -304,14 +307,15 @@ static const char *open_pack_file(const char *pack_name)
        if (from_stdin) {
                input_fd = 0;
                if (!pack_name) {
-                       static char tmp_file[PATH_MAX];
-                       output_fd = odb_mkstemp(tmp_file, sizeof(tmp_file),
+                       struct strbuf tmp_file = STRBUF_INIT;
+                       output_fd = odb_mkstemp(&tmp_file,
                                                "pack/tmp_pack_XXXXXX");
-                       pack_name = xstrdup(tmp_file);
-               } else
+                       pack_name = strbuf_detach(&tmp_file, NULL);
+               } else {
                        output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
-               if (output_fd < 0)
-                       die_errno(_("unable to create '%s'"), pack_name);
+                       if (output_fd < 0)
+                               die_errno(_("unable to create '%s'"), pack_name);
+               }
                nothread_data.pack_fd = output_fd;
        } else {
                input_fd = open(pack_name, O_RDONLY);
@@ -784,13 +788,15 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
                        const unsigned char *sha1)
 {
        void *new_data = NULL;
-       int collision_test_needed;
+       int collision_test_needed = 0;
 
        assert(data || obj_entry);
 
-       read_lock();
-       collision_test_needed = has_sha1_file_with_flags(sha1, HAS_SHA1_QUICK);
-       read_unlock();
+       if (startup_info->have_repository) {
+               read_lock();
+               collision_test_needed = has_sha1_file_with_flags(sha1, HAS_SHA1_QUICK);
+               read_unlock();
+       }
 
        if (collision_test_needed && !data) {
                read_lock();
@@ -804,6 +810,8 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
                unsigned long has_size;
                read_lock();
                has_type = sha1_object_info(sha1, &has_size);
+               if (has_type < 0)
+                       die(_("cannot read existing object info %s"), sha1_to_hex(sha1));
                if (has_type != type || has_size != size)
                        die(_("SHA1 COLLISION FOUND WITH %s !"), sha1_to_hex(sha1));
                has_data = read_sha1_file(sha1, &has_type, &has_size);
@@ -1187,10 +1195,8 @@ static void resolve_deltas(void)
                return;
 
        /* Sort deltas by base SHA1/offset for fast searching */
-       qsort(ofs_deltas, nr_ofs_deltas, sizeof(struct ofs_delta_entry),
-             compare_ofs_delta_entry);
-       qsort(ref_deltas, nr_ref_deltas, sizeof(struct ref_delta_entry),
-             compare_ref_delta_entry);
+       QSORT(ofs_deltas, nr_ofs_deltas, compare_ofs_delta_entry);
+       QSORT(ref_deltas, nr_ref_deltas, compare_ref_delta_entry);
 
        if (verbose || show_resolving_progress)
                progress = start_progress(_("Resolving deltas"),
@@ -1353,7 +1359,7 @@ static void fix_unresolved_deltas(struct sha1file *f)
        ALLOC_ARRAY(sorted_by_pos, nr_ref_deltas);
        for (i = 0; i < nr_ref_deltas; i++)
                sorted_by_pos[i] = &ref_deltas[i];
-       qsort(sorted_by_pos, nr_ref_deltas, sizeof(*sorted_by_pos), delta_pos_compare);
+       QSORT(sorted_by_pos, nr_ref_deltas, delta_pos_compare);
 
        for (i = 0; i < nr_ref_deltas; i++) {
                struct ref_delta_entry *d = sorted_by_pos[i];
@@ -1383,7 +1389,9 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
                  unsigned char *sha1)
 {
        const char *report = "pack";
-       char name[PATH_MAX];
+       struct strbuf pack_name = STRBUF_INIT;
+       struct strbuf index_name = STRBUF_INIT;
+       struct strbuf keep_name_buf = STRBUF_INIT;
        int err;
 
        if (!from_stdin) {
@@ -1399,14 +1407,13 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
                int keep_fd, keep_msg_len = strlen(keep_msg);
 
                if (!keep_name)
-                       keep_fd = odb_pack_keep(name, sizeof(name), sha1);
-               else
-                       keep_fd = open(keep_name, O_RDWR|O_CREAT|O_EXCL, 0600);
+                       keep_name = odb_pack_name(&keep_name_buf, sha1, "keep");
 
+               keep_fd = odb_pack_keep(keep_name);
                if (keep_fd < 0) {
                        if (errno != EEXIST)
                                die_errno(_("cannot write keep file '%s'"),
-                                         keep_name ? keep_name : name);
+                                         keep_name);
                } else {
                        if (keep_msg_len > 0) {
                                write_or_die(keep_fd, keep_msg, keep_msg_len);
@@ -1414,28 +1421,22 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
                        }
                        if (close(keep_fd) != 0)
                                die_errno(_("cannot close written keep file '%s'"),
-                                         keep_name ? keep_name : name);
+                                         keep_name);
                        report = "keep";
                }
        }
 
        if (final_pack_name != curr_pack_name) {
-               if (!final_pack_name) {
-                       snprintf(name, sizeof(name), "%s/pack/pack-%s.pack",
-                                get_object_directory(), sha1_to_hex(sha1));
-                       final_pack_name = name;
-               }
+               if (!final_pack_name)
+                       final_pack_name = odb_pack_name(&pack_name, sha1, "pack");
                if (finalize_object_file(curr_pack_name, final_pack_name))
                        die(_("cannot store pack file"));
        } else if (from_stdin)
                chmod(final_pack_name, 0444);
 
        if (final_index_name != curr_index_name) {
-               if (!final_index_name) {
-                       snprintf(name, sizeof(name), "%s/pack/pack-%s.idx",
-                                get_object_directory(), sha1_to_hex(sha1));
-                       final_index_name = name;
-               }
+               if (!final_index_name)
+                       final_index_name = odb_pack_name(&index_name, sha1, "idx");
                if (finalize_object_file(curr_index_name, final_index_name))
                        die(_("cannot store index file"));
        } else
@@ -1444,10 +1445,11 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
        if (!from_stdin) {
                printf("%s\n", sha1_to_hex(sha1));
        } else {
-               char buf[48];
-               int len = snprintf(buf, sizeof(buf), "%s\t%s\n",
-                                  report, sha1_to_hex(sha1));
-               write_or_die(1, buf, len);
+               struct strbuf buf = STRBUF_INIT;
+
+               strbuf_addf(&buf, "%s\t%s\n", report, sha1_to_hex(sha1));
+               write_or_die(1, buf.buf, buf.len);
+               strbuf_release(&buf);
 
                /*
                 * Let's just mimic git-unpack-objects here and write
@@ -1461,6 +1463,10 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
                        input_offset += err;
                }
        }
+
+       strbuf_release(&index_name);
+       strbuf_release(&pack_name);
+       strbuf_release(&keep_name_buf);
 }
 
 static int git_index_pack_config(const char *k, const char *v, void *cb)
@@ -1530,8 +1536,7 @@ static void read_v2_anomalous_offsets(struct packed_git *p,
                opts->anomaly[opts->anomaly_nr++] = ntohl(idx2[off * 2 + 1]);
        }
 
-       if (1 < opts->anomaly_nr)
-               qsort(opts->anomaly, opts->anomaly_nr, sizeof(uint32_t), cmp_uint32);
+       QSORT(opts->anomaly, opts->anomaly_nr, cmp_uint32);
 }
 
 static void read_idx_option(struct pack_idx_option *opts, const char *pack_name)
@@ -1714,6 +1719,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
                                        opts.off32_limit = strtoul(c+1, &c, 0);
                                if (*c || opts.off32_limit & 0x80000000)
                                        die(_("bad %s"), arg);
+                       } else if (skip_prefix(arg, "--max-input-size=", &arg)) {
+                               max_input_size = strtoumax(arg, NULL, 10);
                        } else
                                usage(index_pack_usage);
                        continue;
@@ -1728,6 +1735,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
                usage(index_pack_usage);
        if (fix_thin_pack && !from_stdin)
                die(_("--fix-thin cannot be used without --stdin"));
+       if (from_stdin && !startup_info->have_repository)
+               die(_("--stdin requires a git repository"));
        if (!index_name && pack_name)
                index_name = derive_filename(pack_name, ".idx", &index_name_buf);
        if (keep_msg && !keep_name && pack_name)
index 3a45f0bcfba46210d6f28f61ebef56192869548d..8a6acb0ec69330f7aae20d34fb5c5733f0058c67 100644 (file)
@@ -22,7 +22,6 @@
 static int init_is_bare_repository = 0;
 static int init_shared_repository = -1;
 static const char *init_db_template_dir;
-static const char *git_link;
 
 static void copy_templates_1(struct strbuf *path, struct strbuf *template,
                             DIR *dir)
@@ -138,7 +137,7 @@ static void copy_templates(const char *template_dir)
                goto close_free_return;
        }
 
-       strbuf_addstr(&path, get_git_dir());
+       strbuf_addstr(&path, get_git_common_dir());
        strbuf_complete(&path, '/');
        copy_templates_1(&path, &template_path, dir);
 close_free_return:
@@ -171,7 +170,8 @@ static int needs_work_tree_config(const char *git_dir, const char *work_tree)
        return 1;
 }
 
-static int create_default_files(const char *template_path)
+static int create_default_files(const char *template_path,
+                               const char *original_git_dir)
 {
        struct stat st1;
        struct strbuf buf = STRBUF_INIT;
@@ -180,27 +180,30 @@ static int create_default_files(const char *template_path)
        char junk[2];
        int reinit;
        int filemode;
-
-       /*
-        * Create .git/refs/{heads,tags}
-        */
-       safe_create_dir(git_path_buf(&buf, "refs"), 1);
-       safe_create_dir(git_path_buf(&buf, "refs/heads"), 1);
-       safe_create_dir(git_path_buf(&buf, "refs/tags"), 1);
+       struct strbuf err = STRBUF_INIT;
 
        /* Just look for `init.templatedir` */
        git_config(git_init_db_config, NULL);
 
-       /* First copy the templates -- we might have the default
+       /*
+        * First copy the templates -- we might have the default
         * config file there, in which case we would want to read
         * from it after installing.
+        *
+        * Before reading that config, we also need to clear out any cached
+        * values (since we've just potentially changed what's available on
+        * disk).
         */
        copy_templates(template_path);
-
+       git_config_clear();
+       reset_shared_repository();
        git_config(git_default_config, NULL);
-       is_bare_repository_cfg = init_is_bare_repository;
 
-       /* reading existing config may have overwrote it */
+       /*
+        * We must make sure command-line options continue to override any
+        * values we might have just re-read from the config.
+        */
+       is_bare_repository_cfg = init_is_bare_repository;
        if (init_shared_repository != -1)
                set_shared_repository(init_shared_repository);
 
@@ -210,11 +213,18 @@ static int create_default_files(const char *template_path)
         */
        if (get_shared_repository()) {
                adjust_shared_perm(get_git_dir());
-               adjust_shared_perm(git_path_buf(&buf, "refs"));
-               adjust_shared_perm(git_path_buf(&buf, "refs/heads"));
-               adjust_shared_perm(git_path_buf(&buf, "refs/tags"));
        }
 
+       /*
+        * We need to create a "refs" dir in any case so that older
+        * versions of git can tell that this is a repository.
+        */
+       safe_create_dir(git_path("refs"), 1);
+       adjust_shared_perm(git_path("refs"));
+
+       if (refs_init_db(&err))
+               die("failed to set up refs db: %s", err.buf);
+
        /*
         * Create the default symlink from ".git/HEAD" to the "master"
         * branch, if it does not exist yet.
@@ -252,9 +262,9 @@ static int create_default_files(const char *template_path)
                const char *work_tree = get_git_work_tree();
                git_config_set("core.bare", "false");
                /* allow template config file to override the default */
-               if (log_all_ref_updates == -1)
+               if (log_all_ref_updates == LOG_REFS_UNSET)
                        git_config_set("core.logallrefupdates", "true");
-               if (needs_work_tree_config(get_git_dir(), work_tree))
+               if (needs_work_tree_config(original_git_dir, work_tree))
                        git_config_set("core.worktree", work_tree);
        }
 
@@ -302,34 +312,7 @@ static void create_object_directory(void)
        strbuf_release(&path);
 }
 
-int set_git_dir_init(const char *git_dir, const char *real_git_dir,
-                    int exist_ok)
-{
-       if (real_git_dir) {
-               struct stat st;
-
-               if (!exist_ok && !stat(git_dir, &st))
-                       die(_("%s already exists"), git_dir);
-
-               if (!exist_ok && !stat(real_git_dir, &st))
-                       die(_("%s already exists"), real_git_dir);
-
-               /*
-                * make sure symlinks are resolved because we'll be
-                * moving the target repo later on in separate_git_dir()
-                */
-               git_link = xstrdup(real_path(git_dir));
-               set_git_dir(real_path(real_git_dir));
-       }
-       else {
-               set_git_dir(real_path(git_dir));
-               git_link = NULL;
-       }
-       startup_info->have_repository = 1;
-       return 0;
-}
-
-static void separate_git_dir(const char *git_dir)
+static void separate_git_dir(const char *git_dir, const char *git_link)
 {
        struct stat st;
 
@@ -350,13 +333,31 @@ static void separate_git_dir(const char *git_dir)
        write_file(git_link, "gitdir: %s", git_dir);
 }
 
-int init_db(const char *template_dir, unsigned int flags)
+int init_db(const char *git_dir, const char *real_git_dir,
+           const char *template_dir, unsigned int flags)
 {
        int reinit;
-       const char *git_dir = get_git_dir();
+       int exist_ok = flags & INIT_DB_EXIST_OK;
+       char *original_git_dir = real_pathdup(git_dir, 1);
 
-       if (git_link)
-               separate_git_dir(git_dir);
+       if (real_git_dir) {
+               struct stat st;
+
+               if (!exist_ok && !stat(git_dir, &st))
+                       die(_("%s already exists"), git_dir);
+
+               if (!exist_ok && !stat(real_git_dir, &st))
+                       die(_("%s already exists"), real_git_dir);
+
+               set_git_dir(real_path(real_git_dir));
+               git_dir = get_git_dir();
+               separate_git_dir(git_dir, original_git_dir);
+       }
+       else {
+               set_git_dir(real_path(git_dir));
+               git_dir = get_git_dir();
+       }
+       startup_info->have_repository = 1;
 
        safe_create_dir(git_dir, 0);
 
@@ -369,7 +370,7 @@ int init_db(const char *template_dir, unsigned int flags)
         */
        check_repository_format();
 
-       reinit = create_default_files(template_dir);
+       reinit = create_default_files(template_dir, original_git_dir);
 
        create_object_directory();
 
@@ -409,6 +410,7 @@ int init_db(const char *template_dir, unsigned int flags)
                               git_dir, len && git_dir[len-1] != '/' ? "/" : "");
        }
 
+       free(original_git_dir);
        return 0;
 }
 
@@ -487,7 +489,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, prefix, init_db_options, init_db_usage, 0);
 
        if (real_git_dir && !is_absolute_path(real_git_dir))
-               real_git_dir = xstrdup(real_path(real_git_dir));
+               real_git_dir = real_pathdup(real_git_dir, 1);
 
        if (argc == 1) {
                int mkdir_tried = 0;
@@ -558,7 +560,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
                const char *git_dir_parent = strrchr(git_dir, '/');
                if (git_dir_parent) {
                        char *rel = xstrndup(git_dir, git_dir_parent - git_dir);
-                       git_work_tree_cfg = xstrdup(real_path(rel));
+                       git_work_tree_cfg = real_pathdup(rel, 1);
                        free(rel);
                }
                if (!git_work_tree_cfg)
@@ -576,7 +578,6 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
                        set_git_work_tree(work_tree);
        }
 
-       set_git_dir_init(git_dir, real_git_dir, 1);
-
-       return init_db(template_dir, flags);
+       flags |= INIT_DB_EXIST_OK;
+       return init_db(git_dir, real_git_dir, template_dir, flags);
 }
index cd9c4a46d10c0898ea84f9b5f5f4f833a1428dbd..57ce470f5094c238ea4d5390f358b5cdd9499a56 100644 (file)
@@ -52,6 +52,11 @@ struct line_opt_callback_data {
        struct string_list args;
 };
 
+static int auto_decoration_style(void)
+{
+       return (isatty(1) || pager_in_use()) ? DECORATE_SHORT_REFS : 0;
+}
+
 static int parse_decoration_style(const char *var, const char *value)
 {
        switch (git_config_maybe_bool(var, value)) {
@@ -67,7 +72,7 @@ static int parse_decoration_style(const char *var, const char *value)
        else if (!strcmp(value, "short"))
                return DECORATE_SHORT_REFS;
        else if (!strcmp(value, "auto"))
-               return (isatty(1) || pager_in_use()) ? DECORATE_SHORT_REFS : 0;
+               return auto_decoration_style();
        return -1;
 }
 
@@ -105,6 +110,8 @@ static void init_log_defaults(void)
 {
        init_grep_defaults();
        init_diff_ui_defaults();
+
+       decoration_style = auto_decoration_style();
 }
 
 static void cmd_log_init_defaults(struct rev_info *rev)
@@ -464,9 +471,9 @@ static void show_tagger(char *buf, int len, struct rev_info *rev)
        strbuf_release(&out);
 }
 
-static int show_blob_object(const unsigned char *sha1, struct rev_info *rev, const char *obj_name)
+static int show_blob_object(const struct object_id *oid, struct rev_info *rev, const char *obj_name)
 {
-       unsigned char sha1c[20];
+       struct object_id oidc;
        struct object_context obj_context;
        char *buf;
        unsigned long size;
@@ -474,30 +481,34 @@ static int show_blob_object(const unsigned char *sha1, struct rev_info *rev, con
        fflush(rev->diffopt.file);
        if (!DIFF_OPT_TOUCHED(&rev->diffopt, ALLOW_TEXTCONV) ||
            !DIFF_OPT_TST(&rev->diffopt, ALLOW_TEXTCONV))
-               return stream_blob_to_fd(1, sha1, NULL, 0);
+               return stream_blob_to_fd(1, oid, NULL, 0);
 
-       if (get_sha1_with_context(obj_name, 0, sha1c, &obj_context))
+       if (get_sha1_with_context(obj_name, GET_SHA1_RECORD_PATH,
+                                 oidc.hash, &obj_context))
                die(_("Not a valid object name %s"), obj_name);
-       if (!obj_context.path[0] ||
-           !textconv_object(obj_context.path, obj_context.mode, sha1c, 1, &buf, &size))
-               return stream_blob_to_fd(1, sha1, NULL, 0);
+       if (!obj_context.path ||
+           !textconv_object(obj_context.path, obj_context.mode, &oidc, 1, &buf, &size)) {
+               free(obj_context.path);
+               return stream_blob_to_fd(1, oid, NULL, 0);
+       }
 
        if (!buf)
                die(_("git show %s: bad file"), obj_name);
 
        write_or_die(1, buf, size);
+       free(obj_context.path);
        return 0;
 }
 
-static int show_tag_object(const unsigned char *sha1, struct rev_info *rev)
+static int show_tag_object(const struct object_id *oid, struct rev_info *rev)
 {
        unsigned long size;
        enum object_type type;
-       char *buf = read_sha1_file(sha1, &type, &size);
+       char *buf = read_sha1_file(oid->hash, &type, &size);
        int offset = 0;
 
        if (!buf)
-               return error(_("Could not read object %s"), sha1_to_hex(sha1));
+               return error(_("Could not read object %s"), oid_to_hex(oid));
 
        assert(type == OBJ_TAG);
        while (offset < size && buf[offset] != '\n') {
@@ -574,7 +585,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
                const char *name = objects[i].name;
                switch (o->type) {
                case OBJ_BLOB:
-                       ret = show_blob_object(o->oid.hash, &rev, name);
+                       ret = show_blob_object(&o->oid, &rev, name);
                        break;
                case OBJ_TAG: {
                        struct tag *t = (struct tag *)o;
@@ -585,7 +596,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
                                        diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
                                        t->tag,
                                        diff_get_color_opt(&rev.diffopt, DIFF_RESET));
-                       ret = show_tag_object(o->oid.hash, &rev);
+                       ret = show_tag_object(&o->oid, &rev);
                        rev.shown_one = 1;
                        if (ret)
                                break;
@@ -989,8 +1000,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
            open_next_file(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet))
                return;
 
-       log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
-                               &need_8bit_cte);
+       log_write_email_headers(rev, head, &pp.after_subject, &need_8bit_cte);
 
        for (i = 0; !need_8bit_cte && i < nr; i++) {
                const char *buf = get_commit_buffer(list[i], NULL);
@@ -1005,6 +1015,8 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
        msg = body;
        pp.fmt = CMIT_FMT_EMAIL;
        pp.date_mode.type = DATE_RFC2822;
+       pp.rev = rev;
+       pp.print_email_subject = 1;
        pp_user_info(&pp, NULL, &sb, committer, encoding);
        pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
        pp_remainder(&pp, &msg, &sb, 0);
@@ -1083,8 +1095,7 @@ static const char *set_outdir(const char *prefix, const char *output_directory)
        if (!output_directory)
                return prefix;
 
-       return xstrdup(prefix_filename(prefix, outdir_offset,
-                                      output_directory));
+       return prefix_filename(prefix, output_directory);
 }
 
 static const char * const builtin_format_patch_usage[] = {
@@ -1111,6 +1122,11 @@ static int subject_prefix_callback(const struct option *opt, const char *arg,
        return 0;
 }
 
+static int rfc_callback(const struct option *opt, const char *arg, int unset)
+{
+       return subject_prefix_callback(opt, "RFC PATCH", unset);
+}
+
 static int numbered_cmdline_opt = 0;
 
 static int numbered_callback(const struct option *opt, const char *arg,
@@ -1247,11 +1263,11 @@ static struct commit *get_base_commit(const char *base_commit,
                if (upstream) {
                        struct commit_list *base_list;
                        struct commit *commit;
-                       unsigned char sha1[20];
+                       struct object_id oid;
 
-                       if (get_sha1(upstream, sha1))
+                       if (get_oid(upstream, &oid))
                                die(_("Failed to resolve '%s' as a valid ref."), upstream);
-                       commit = lookup_commit_or_die(sha1, "upstream base");
+                       commit = lookup_commit_or_die(oid.hash, "upstream base");
                        base_list = get_merge_bases_many(commit, total, list);
                        /* There should be one and only one merge base. */
                        if (!base_list || base_list->next)
@@ -1338,15 +1354,15 @@ static void prepare_bases(struct base_tree_info *bases,
         * and stuff them in bases structure.
         */
        while ((commit = get_revision(&revs)) != NULL) {
-               unsigned char sha1[20];
+               struct object_id oid;
                struct object_id *patch_id;
                if (commit->util)
                        continue;
-               if (commit_patch_id(commit, &diffopt, sha1, 0))
+               if (commit_patch_id(commit, &diffopt, oid.hash, 0))
                        die(_("cannot get patch id"));
                ALLOC_GROW(bases->patch_id, bases->nr_patch_id + 1, bases->alloc_patch_id);
                patch_id = bases->patch_id + bases->nr_patch_id;
-               hashcpy(patch_id->hash, sha1);
+               oidcpy(patch_id, &oid);
                bases->nr_patch_id++;
        }
 }
@@ -1418,6 +1434,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                            N_("start numbering patches at <n> instead of 1")),
                OPT_INTEGER('v', "reroll-count", &reroll_count,
                            N_("mark the series as Nth re-roll")),
+               { OPTION_CALLBACK, 0, "rfc", &rev, NULL,
+                           N_("Use [RFC PATCH] instead of [PATCH]"),
+                           PARSE_OPT_NOARG | PARSE_OPT_NONEG, rfc_callback },
                { OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"),
                            N_("Use [<prefix>] instead of [PATCH]"),
                            PARSE_OPT_NONEG, subject_prefix_callback },
@@ -1556,7 +1575,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        if (numbered && keep_subject)
                die (_("-n and -k are mutually exclusive."));
        if (keep_subject && subject_prefix)
-               die (_("--subject-prefix and -k are mutually exclusive."));
+               die (_("--subject-prefix/--rfc and -k are mutually exclusive."));
        rev.preserve_subject = keep_subject;
 
        argc = setup_revisions(argc, argv, &rev, &s_r_opt);
@@ -1627,10 +1646,10 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                        check_head = 1;
 
                if (check_head) {
-                       unsigned char sha1[20];
+                       struct object_id oid;
                        const char *ref, *v;
                        ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
-                                                sha1, NULL);
+                                                oid.hash, NULL);
                        if (ref && skip_prefix(ref, "refs/heads/", &v))
                                branch_name = xstrdup(v);
                        else
@@ -1675,16 +1694,16 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                /* nothing to do */
                return 0;
        total = nr;
-       if (!keep_subject && auto_number && total > 1)
-               numbered = 1;
-       if (numbered)
-               rev.total = total + start_number - 1;
        if (cover_letter == -1) {
                if (config_cover_letter == COVER_AUTO)
                        cover_letter = (total > 1);
                else
                        cover_letter = (config_cover_letter == COVER_ON);
        }
+       if (!keep_subject && auto_number && (total > 1 || cover_letter))
+               numbered = 1;
+       if (numbered)
+               rev.total = total + start_number - 1;
 
        if (!signature) {
                ; /* --no-signature inhibits all signatures */
@@ -1802,9 +1821,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 
 static int add_pending_commit(const char *arg, struct rev_info *revs, int flags)
 {
-       unsigned char sha1[20];
-       if (get_sha1(arg, sha1) == 0) {
-               struct commit *commit = lookup_commit_reference(sha1);
+       struct object_id oid;
+       if (get_oid(arg, &oid) == 0) {
+               struct commit *commit = lookup_commit_reference(oid.hash);
                if (commit) {
                        commit->object.flags |= flags;
                        add_pending_object(revs, &commit->object, arg);
index 00ea91aae6325fccafc22c64d86c5f7335851b81..a6c70dbe9ec84921108a85485a12111c854833b8 100644 (file)
@@ -14,6 +14,8 @@
 #include "resolve-undo.h"
 #include "string-list.h"
 #include "pathspec.h"
+#include "run-command.h"
+#include "submodule.h"
 
 static int abbrev;
 static int show_deleted;
@@ -28,8 +30,11 @@ static int show_valid_bit;
 static int line_terminator = '\n';
 static int debug_mode;
 static int show_eol;
+static int recurse_submodules;
+static struct argv_array submodule_options = ARGV_ARRAY_INIT;
 
 static const char *prefix;
+static const char *super_prefix;
 static int max_prefix_len;
 static int prefix_len;
 static struct pathspec pathspec;
@@ -67,12 +72,25 @@ static void write_eolinfo(const struct cache_entry *ce, const char *path)
 
 static void write_name(const char *name)
 {
+       /*
+        * Prepend the super_prefix to name to construct the full_name to be
+        * written.
+        */
+       struct strbuf full_name = STRBUF_INIT;
+       if (super_prefix) {
+               strbuf_addstr(&full_name, super_prefix);
+               strbuf_addstr(&full_name, name);
+               name = full_name.buf;
+       }
+
        /*
         * With "--full-name", prefix_len=0; this caller needs to pass
         * an empty string in that case (a NULL is good for "").
         */
        write_name_quoted_relative(name, prefix_len ? prefix : NULL,
                                   stdout, line_terminator);
+
+       strbuf_release(&full_name);
 }
 
 static void show_dir_entry(const char *tag, struct dir_entry *ent)
@@ -152,55 +170,124 @@ static void show_killed_files(struct dir_struct *dir)
        }
 }
 
+/*
+ * Compile an argv_array with all of the options supported by --recurse_submodules
+ */
+static void compile_submodule_options(const char **argv,
+                                     const struct dir_struct *dir,
+                                     int show_tag)
+{
+       if (line_terminator == '\0')
+               argv_array_push(&submodule_options, "-z");
+       if (show_tag)
+               argv_array_push(&submodule_options, "-t");
+       if (show_valid_bit)
+               argv_array_push(&submodule_options, "-v");
+       if (show_cached)
+               argv_array_push(&submodule_options, "--cached");
+       if (show_eol)
+               argv_array_push(&submodule_options, "--eol");
+       if (debug_mode)
+               argv_array_push(&submodule_options, "--debug");
+
+       /* Add Pathspecs */
+       argv_array_push(&submodule_options, "--");
+       for (; *argv; argv++)
+               argv_array_push(&submodule_options, *argv);
+}
+
+/**
+ * Recursively call ls-files on a submodule
+ */
+static void show_gitlink(const struct cache_entry *ce)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+       int status;
+       char *dir;
+
+       prepare_submodule_repo_env(&cp.env_array);
+       argv_array_push(&cp.env_array, GIT_DIR_ENVIRONMENT);
+
+       if (prefix_len)
+               argv_array_pushf(&cp.env_array, "%s=%s",
+                                GIT_TOPLEVEL_PREFIX_ENVIRONMENT,
+                                prefix);
+       argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
+                        super_prefix ? super_prefix : "",
+                        ce->name);
+       argv_array_push(&cp.args, "ls-files");
+       argv_array_push(&cp.args, "--recurse-submodules");
+
+       /* add supported options */
+       argv_array_pushv(&cp.args, submodule_options.argv);
+
+       cp.git_cmd = 1;
+       dir = mkpathdup("%s/%s", get_git_work_tree(), ce->name);
+       cp.dir = dir;
+       status = run_command(&cp);
+       free(dir);
+       if (status)
+               exit(status);
+}
+
 static void show_ce_entry(const char *tag, const struct cache_entry *ce)
 {
+       struct strbuf name = STRBUF_INIT;
        int len = max_prefix_len;
+       if (super_prefix)
+               strbuf_addstr(&name, super_prefix);
+       strbuf_addstr(&name, ce->name);
 
        if (len >= ce_namelen(ce))
                die("git ls-files: internal error - cache entry not superset of prefix");
 
-       if (!match_pathspec(&pathspec, ce->name, ce_namelen(ce),
-                           len, ps_matched,
-                           S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode)))
-               return;
+       if (recurse_submodules && S_ISGITLINK(ce->ce_mode) &&
+           submodule_path_match(&pathspec, name.buf, ps_matched)) {
+               show_gitlink(ce);
+       } else if (match_pathspec(&pathspec, name.buf, name.len,
+                                 len, ps_matched,
+                                 S_ISDIR(ce->ce_mode) ||
+                                 S_ISGITLINK(ce->ce_mode))) {
+               if (tag && *tag && show_valid_bit &&
+                   (ce->ce_flags & CE_VALID)) {
+                       static char alttag[4];
+                       memcpy(alttag, tag, 3);
+                       if (isalpha(tag[0]))
+                               alttag[0] = tolower(tag[0]);
+                       else if (tag[0] == '?')
+                               alttag[0] = '!';
+                       else {
+                               alttag[0] = 'v';
+                               alttag[1] = tag[0];
+                               alttag[2] = ' ';
+                               alttag[3] = 0;
+                       }
+                       tag = alttag;
+               }
 
-       if (tag && *tag && show_valid_bit &&
-           (ce->ce_flags & CE_VALID)) {
-               static char alttag[4];
-               memcpy(alttag, tag, 3);
-               if (isalpha(tag[0]))
-                       alttag[0] = tolower(tag[0]);
-               else if (tag[0] == '?')
-                       alttag[0] = '!';
-               else {
-                       alttag[0] = 'v';
-                       alttag[1] = tag[0];
-                       alttag[2] = ' ';
-                       alttag[3] = 0;
+               if (!show_stage) {
+                       fputs(tag, stdout);
+               } else {
+                       printf("%s%06o %s %d\t",
+                              tag,
+                              ce->ce_mode,
+                              find_unique_abbrev(ce->oid.hash, abbrev),
+                              ce_stage(ce));
+               }
+               write_eolinfo(ce, ce->name);
+               write_name(ce->name);
+               if (debug_mode) {
+                       const struct stat_data *sd = &ce->ce_stat_data;
+
+                       printf("  ctime: %d:%d\n", sd->sd_ctime.sec, sd->sd_ctime.nsec);
+                       printf("  mtime: %d:%d\n", sd->sd_mtime.sec, sd->sd_mtime.nsec);
+                       printf("  dev: %d\tino: %d\n", sd->sd_dev, sd->sd_ino);
+                       printf("  uid: %d\tgid: %d\n", sd->sd_uid, sd->sd_gid);
+                       printf("  size: %d\tflags: %x\n", sd->sd_size, ce->ce_flags);
                }
-               tag = alttag;
        }
 
-       if (!show_stage) {
-               fputs(tag, stdout);
-       } else {
-               printf("%s%06o %s %d\t",
-                      tag,
-                      ce->ce_mode,
-                      find_unique_abbrev(ce->sha1,abbrev),
-                      ce_stage(ce));
-       }
-       write_eolinfo(ce, ce->name);
-       write_name(ce->name);
-       if (debug_mode) {
-               const struct stat_data *sd = &ce->ce_stat_data;
-
-               printf("  ctime: %d:%d\n", sd->sd_ctime.sec, sd->sd_ctime.nsec);
-               printf("  mtime: %d:%d\n", sd->sd_mtime.sec, sd->sd_mtime.nsec);
-               printf("  dev: %d\tino: %d\n", sd->sd_dev, sd->sd_ino);
-               printf("  uid: %d\tgid: %d\n", sd->sd_uid, sd->sd_gid);
-               printf("  size: %d\tflags: %x\n", sd->sd_size, ce->ce_flags);
-       }
+       strbuf_release(&name);
 }
 
 static void show_ru_info(void)
@@ -290,28 +377,30 @@ static void show_files(struct dir_struct *dir)
 /*
  * Prune the index to only contain stuff starting with "prefix"
  */
-static void prune_cache(const char *prefix)
+static void prune_cache(const char *prefix, size_t prefixlen)
 {
-       int pos = cache_name_pos(prefix, max_prefix_len);
+       int pos;
        unsigned int first, last;
 
+       if (!prefix)
+               return;
+       pos = cache_name_pos(prefix, prefixlen);
        if (pos < 0)
                pos = -pos-1;
-       memmove(active_cache, active_cache + pos,
-               (active_nr - pos) * sizeof(struct cache_entry *));
-       active_nr -= pos;
-       first = 0;
+       first = pos;
        last = active_nr;
        while (last > first) {
                int next = (last + first) >> 1;
                const struct cache_entry *ce = active_cache[next];
-               if (!strncmp(ce->name, prefix, max_prefix_len)) {
+               if (!strncmp(ce->name, prefix, prefixlen)) {
                        first = next+1;
                        continue;
                }
                last = next;
        }
-       active_nr = last;
+       memmove(active_cache, active_cache + pos,
+               (last - pos) * sizeof(struct cache_entry *));
+       active_nr = last - pos;
 }
 
 /*
@@ -468,6 +557,8 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
                { OPTION_SET_INT, 0, "full-name", &prefix_len, NULL,
                        N_("make the output relative to the project top directory"),
                        PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL },
+               OPT_BOOL(0, "recurse-submodules", &recurse_submodules,
+                       N_("recurse through submodules")),
                OPT_BOOL(0, "error-unmatch", &error_unmatch,
                        N_("if any <file> is not in the index, treat this as an error")),
                OPT_STRING(0, "with-tree", &with_tree, N_("tree-ish"),
@@ -484,6 +575,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
        prefix = cmd_prefix;
        if (prefix)
                prefix_len = strlen(prefix);
+       super_prefix = get_super_prefix();
        git_config(git_default_config, NULL);
 
        if (read_cache() < 0)
@@ -519,13 +611,32 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
        if (require_work_tree && !is_inside_work_tree())
                setup_work_tree();
 
+       if (recurse_submodules)
+               compile_submodule_options(argv, &dir, show_tag);
+
+       if (recurse_submodules &&
+           (show_stage || show_deleted || show_others || show_unmerged ||
+            show_killed || show_modified || show_resolve_undo || with_tree))
+               die("ls-files --recurse-submodules unsupported mode");
+
+       if (recurse_submodules && error_unmatch)
+               die("ls-files --recurse-submodules does not support "
+                   "--error-unmatch");
+
        parse_pathspec(&pathspec, 0,
                       PATHSPEC_PREFER_CWD |
                       PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP,
                       prefix, argv);
 
-       /* Find common prefix for all pathspec's */
-       max_prefix = common_prefix(&pathspec);
+       /*
+        * Find common prefix for all pathspec's
+        * This is used as a performance optimization which unfortunately cannot
+        * be done when recursing into submodules
+        */
+       if (recurse_submodules)
+               max_prefix = NULL;
+       else
+               max_prefix = common_prefix(&pathspec);
        max_prefix_len = max_prefix ? strlen(max_prefix) : 0;
 
        /* Treat unmatching pathspec elements as errors */
@@ -540,8 +651,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
              show_killed || show_modified || show_resolve_undo))
                show_cached = 1;
 
-       if (max_prefix)
-               prune_cache(max_prefix);
+       prune_cache(max_prefix, max_prefix_len);
        if (with_tree) {
                /*
                 * Basic sanity check; show-stages and show-unmerged
index 66cdd45cc10afd37f93f260688700408d11b1f5f..b2d7d5ce6841cf9cb9e310c659aac043ad00cfb0 100644 (file)
@@ -17,17 +17,19 @@ static const char * const ls_remote_usage[] = {
 static int tail_match(const char **pattern, const char *path)
 {
        const char *p;
-       char pathbuf[PATH_MAX];
+       char *pathbuf;
 
        if (!pattern)
                return 1; /* no restriction */
 
-       if (snprintf(pathbuf, sizeof(pathbuf), "/%s", path) > sizeof(pathbuf))
-               return error("insanely long ref %.*s...", 20, path);
+       pathbuf = xstrfmt("/%s", path);
        while ((p = *(pattern++)) != NULL) {
-               if (!wildmatch(p, pathbuf, 0, NULL))
+               if (!wildmatch(p, pathbuf, 0, NULL)) {
+                       free(pathbuf);
                        return 1;
+               }
        }
+       free(pathbuf);
        return 0;
 }
 
index 0e30d862303b67ace2c7accf2e7c9346d8f63264..d7ebeb4ce6b1f1a0491f8db8a66001968a41b641 100644 (file)
@@ -31,21 +31,18 @@ static const  char * const ls_tree_usage[] = {
 
 static int show_recursive(const char *base, int baselen, const char *pathname)
 {
-       const char **s;
+       int i;
 
        if (ls_options & LS_RECURSIVE)
                return 1;
 
-       s = pathspec._raw;
-       if (!s)
+       if (!pathspec.nr)
                return 0;
 
-       for (;;) {
-               const char *spec = *s++;
+       for (i = 0; i < pathspec.nr; i++) {
+               const char *spec = pathspec.items[i].match;
                int len, speclen;
 
-               if (!spec)
-                       return 0;
                if (strncmp(base, spec, baselen))
                        continue;
                len = strlen(pathname);
@@ -59,6 +56,7 @@ static int show_recursive(const char *base, int baselen, const char *pathname)
                        continue;
                return 1;
        }
+       return 0;
 }
 
 static int show_tree(const unsigned char *sha1, struct strbuf *base,
@@ -175,8 +173,8 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
         * cannot be lifted until it is converted to use
         * match_pathspec() or tree_entry_interesting()
         */
-       parse_pathspec(&pathspec, PATHSPEC_GLOB | PATHSPEC_ICASE |
-                                 PATHSPEC_EXCLUDE,
+       parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC &
+                                 ~(PATHSPEC_FROMTOP | PATHSPEC_LITERAL),
                       PATHSPEC_PREFER_CWD,
                       prefix, argv + 1);
        for (i = 0; i < pathspec.nr; i++)
index f6df2741112144a38d048ebfd1fe201c8576a040..cfb667a594c8452b8f4259bb3da1976965906f95 100644 (file)
@@ -16,10 +16,8 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix)
        const char *def_charset;
        struct mailinfo mi;
        int status;
+       char *msgfile, *patchfile;
 
-       /* NEEDSWORK: might want to do the optional .git/ directory
-        * discovery
-        */
        setup_mailinfo(&mi);
 
        def_charset = get_commit_output_encoding();
@@ -54,8 +52,14 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix)
 
        mi.input = stdin;
        mi.output = stdout;
-       status = !!mailinfo(&mi, argv[1], argv[2]);
+
+       msgfile = prefix_filename(prefix, argv[1]);
+       patchfile = prefix_filename(prefix, argv[2]);
+
+       status = !!mailinfo(&mi, msgfile, patchfile);
        clear_mailinfo(&mi);
 
+       free(msgfile);
+       free(patchfile);
        return status;
 }
index 30681681c1389826513464385405dfe6ef8a2855..664400b8169b673f735e77f7dd86474f1665a3ae 100644 (file)
@@ -232,6 +232,16 @@ static int split_mbox(const char *file, const char *dir, int allow_bare,
 
        do {
                peek = fgetc(f);
+               if (peek == EOF) {
+                       if (f == stdin)
+                               /* empty stdin is OK */
+                               ret = skip;
+                       else {
+                               fclose(f);
+                               error(_("empty mbox: '%s'"), file);
+                       }
+                       goto out;
+               }
        } while (isspace(peek));
        ungetc(peek, f);
 
index b572a37c2611b2a8c20b1db7edac68623d371a38..cfe2a796f85ecf8dfbbb35d3232893929670b492 100644 (file)
@@ -36,12 +36,12 @@ static const char * const merge_base_usage[] = {
 
 static struct commit *get_commit_reference(const char *arg)
 {
-       unsigned char revkey[20];
+       struct object_id revkey;
        struct commit *r;
 
-       if (get_sha1(arg, revkey))
+       if (get_oid(arg, &revkey))
                die("Not a valid object name %s", arg);
-       r = lookup_commit_reference(revkey);
+       r = lookup_commit_reference(revkey.hash);
        if (!r)
                die("Not a valid commit name %s", arg);
 
@@ -113,14 +113,14 @@ struct rev_collect {
        unsigned int initial : 1;
 };
 
-static void add_one_commit(unsigned char *sha1, struct rev_collect *revs)
+static void add_one_commit(struct object_id *oid, struct rev_collect *revs)
 {
        struct commit *commit;
 
-       if (is_null_sha1(sha1))
+       if (is_null_oid(oid))
                return;
 
-       commit = lookup_commit(sha1);
+       commit = lookup_commit(oid->hash);
        if (!commit ||
            (commit->object.flags & TMP_MARK) ||
            parse_commit(commit))
@@ -131,7 +131,7 @@ static void add_one_commit(unsigned char *sha1, struct rev_collect *revs)
        commit->object.flags |= TMP_MARK;
 }
 
-static int collect_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+static int collect_one_reflog_ent(struct object_id *ooid, struct object_id *noid,
                                  const char *ident, unsigned long timestamp,
                                  int tz, const char *message, void *cbdata)
 {
@@ -139,15 +139,15 @@ static int collect_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
 
        if (revs->initial) {
                revs->initial = 0;
-               add_one_commit(osha1, revs);
+               add_one_commit(ooid, revs);
        }
-       add_one_commit(nsha1, revs);
+       add_one_commit(noid, revs);
        return 0;
 }
 
 static int handle_fork_point(int argc, const char **argv)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
        char *refname;
        const char *commitname;
        struct rev_collect revs;
@@ -155,7 +155,7 @@ static int handle_fork_point(int argc, const char **argv)
        struct commit_list *bases;
        int i, ret = 0;
 
-       switch (dwim_ref(argv[0], strlen(argv[0]), sha1, &refname)) {
+       switch (dwim_ref(argv[0], strlen(argv[0]), oid.hash, &refname)) {
        case 0:
                die("No such ref: '%s'", argv[0]);
        case 1:
@@ -165,16 +165,16 @@ static int handle_fork_point(int argc, const char **argv)
        }
 
        commitname = (argc == 2) ? argv[1] : "HEAD";
-       if (get_sha1(commitname, sha1))
+       if (get_oid(commitname, &oid))
                die("Not a valid object name: '%s'", commitname);
 
-       derived = lookup_commit_reference(sha1);
+       derived = lookup_commit_reference(oid.hash);
        memset(&revs, 0, sizeof(revs));
        revs.initial = 1;
        for_each_reflog_ent(refname, collect_one_reflog_ent, &revs);
 
-       if (!revs.nr && !get_sha1(refname, sha1))
-               add_one_commit(sha1, &revs);
+       if (!revs.nr && !get_oid(refname, &oid))
+               add_one_commit(&oid, &revs);
 
        for (i = 0; i < revs.nr; i++)
                revs.commit[i]->object.flags &= ~TMP_MARK;
index 13e22a2f0be73ec7e521a02d1f36c414e77a8700..47dde7c39c922c77bf388e87db27618d09f5bb74 100644 (file)
@@ -28,7 +28,6 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
        xmparam_t xmp = {{0}};
        int ret = 0, i = 0, to_stdout = 0;
        int quiet = 0;
-       int prefixlen = 0;
        struct option options[] = {
                OPT_BOOL('p', "stdout", &to_stdout, N_("send results to standard output")),
                OPT_SET_INT(0, "diff3", &xmp.style, N_("use a diff3 based merge"), XDL_MERGE_DIFF3),
@@ -65,15 +64,19 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
                        return error_errno("failed to redirect stderr to /dev/null");
        }
 
-       if (prefix)
-               prefixlen = strlen(prefix);
-
        for (i = 0; i < 3; i++) {
-               const char *fname = prefix_filename(prefix, prefixlen, argv[i]);
+               char *fname;
+               int ret;
+
                if (!names[i])
                        names[i] = argv[i];
-               if (read_mmfile(mmfs + i, fname))
+
+               fname = prefix_filename(prefix, argv[i]);
+               ret = read_mmfile(mmfs + i, fname);
+               free(fname);
+               if (ret)
                        return -1;
+
                if (mmfs[i].size > MAX_XDIFF_SIZE ||
                    buffer_is_binary(mmfs[i].ptr, mmfs[i].size))
                        return error("Cannot merge binary files: %s",
@@ -90,7 +93,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
 
        if (ret >= 0) {
                const char *filename = argv[0];
-               const char *fpath = prefix_filename(prefix, prefixlen, argv[0]);
+               char *fpath = prefix_filename(prefix, argv[0]);
                FILE *f = to_stdout ? stdout : fopen(fpath, "wb");
 
                if (!f)
@@ -102,6 +105,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
                else if (fclose(f))
                        ret = error_errno("Could not close %s", filename);
                free(result.ptr);
+               free(fpath);
        }
 
        if (ret > 127)
index 1c3427c36caa40e8740b090c44a048201e81c706..c99443b095bd8abbe02d4ea87a452d916681c53f 100644 (file)
@@ -9,7 +9,7 @@ static int merge_entry(int pos, const char *path)
 {
        int found;
        const char *arguments[] = { pgm, "", "", "", path, "", "", "", NULL };
-       char hexbuf[4][GIT_SHA1_HEXSZ + 1];
+       char hexbuf[4][GIT_MAX_HEXSZ + 1];
        char ownbuf[4][60];
 
        if (pos >= active_nr)
@@ -22,7 +22,7 @@ static int merge_entry(int pos, const char *path)
                if (strcmp(ce->name, path))
                        break;
                found++;
-               sha1_to_hex_r(hexbuf[stage], ce->sha1);
+               oid_to_hex_r(hexbuf[stage], &ce->oid);
                xsnprintf(ownbuf[stage], sizeof(ownbuf[stage]), "%o", ce->ce_mode);
                arguments[stage] = hexbuf[stage];
                arguments[stage + 4] = ownbuf[stage];
index fd2c4556e1d648d82d3fb78675187623180c6261..0dd902195878aedef76559ad67ad6dc9384141b3 100644 (file)
@@ -42,36 +42,39 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
                        if (!arg[2])
                                break;
                        if (parse_merge_opt(&o, arg + 2))
-                               die("Unknown option %s", arg);
+                               die(_("unknown option %s"), arg);
                        continue;
                }
                if (bases_count < ARRAY_SIZE(bases)-1) {
                        struct object_id *oid = xmalloc(sizeof(struct object_id));
                        if (get_oid(argv[i], oid))
-                               die("Could not parse object '%s'", argv[i]);
+                               die(_("could not parse object '%s'"), argv[i]);
                        bases[bases_count++] = oid;
                }
                else
-                       warning("Cannot handle more than %d bases. "
-                               "Ignoring %s.",
+                       warning(Q_("cannot handle more than %d base. "
+                                  "Ignoring %s.",
+                                  "cannot handle more than %d bases. "
+                                  "Ignoring %s.",
+                                   (int)ARRAY_SIZE(bases)-1),
                                (int)ARRAY_SIZE(bases)-1, argv[i]);
        }
        if (argc - i != 3) /* "--" "<head>" "<remote>" */
-               die("Not handling anything other than two heads merge.");
+               die(_("not handling anything other than two heads merge."));
 
        o.branch1 = argv[++i];
        o.branch2 = argv[++i];
 
        if (get_oid(o.branch1, &h1))
-               die("Could not resolve ref '%s'", o.branch1);
+               die(_("could not resolve ref '%s'"), o.branch1);
        if (get_oid(o.branch2, &h2))
-               die("Could not resolve ref '%s'", o.branch2);
+               die(_("could not resolve ref '%s'"), o.branch2);
 
        o.branch1 = better_branch_name(o.branch1);
        o.branch2 = better_branch_name(o.branch2);
 
        if (o.verbosity >= 3)
-               printf("Merging %s with %s\n", o.branch1, o.branch2);
+               printf(_("Merging %s with %s\n"), o.branch1, o.branch2);
 
        failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result);
        if (failed < 0)
index a8b57c7d9856518fdcd4c3819f0656544eadf022..703827f00668ca0df807f35e300f0927d00075cd 100644 (file)
@@ -44,8 +44,8 @@ struct strategy {
 
 static const char * const builtin_merge_usage[] = {
        N_("git merge [<options>] [<commit>...]"),
-       N_("git merge [<options>] <msg> HEAD <commit>"),
        N_("git merge --abort"),
+       N_("git merge --continue"),
        NULL
 };
 
@@ -65,6 +65,7 @@ static int option_renormalize;
 static int verbosity;
 static int allow_rerere_auto;
 static int abort_current_merge;
+static int continue_current_merge;
 static int allow_unrelated_histories;
 static int show_progress = -1;
 static int default_to_upstream = 1;
@@ -223,6 +224,8 @@ static struct option builtin_merge_options[] = {
        OPT__VERBOSITY(&verbosity),
        OPT_BOOL(0, "abort", &abort_current_merge,
                N_("abort the current in-progress merge")),
+       OPT_BOOL(0, "continue", &continue_current_merge,
+               N_("continue the current in-progress merge")),
        OPT_BOOL(0, "allow-unrelated-histories", &allow_unrelated_histories,
                 N_("allow merging unrelated histories")),
        OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
@@ -240,7 +243,7 @@ static void drop_save(void)
        unlink(git_path_merge_mode());
 }
 
-static int save_state(unsigned char *stash)
+static int save_state(struct object_id *stash)
 {
        int len;
        struct child_process cp = CHILD_PROCESS_INIT;
@@ -261,7 +264,7 @@ static int save_state(unsigned char *stash)
        else if (!len)          /* no changes */
                return -1;
        strbuf_setlen(&buffer, buffer.len-1);
-       if (get_sha1(buffer.buf, stash))
+       if (get_oid(buffer.buf, stash))
                die(_("not a valid object: %s"), buffer.buf);
        return 0;
 }
@@ -301,18 +304,18 @@ static void reset_hard(unsigned const char *sha1, int verbose)
                die(_("read-tree failed"));
 }
 
-static void restore_state(const unsigned char *head,
-                         const unsigned char *stash)
+static void restore_state(const struct object_id *head,
+                         const struct object_id *stash)
 {
        struct strbuf sb = STRBUF_INIT;
        const char *args[] = { "stash", "apply", NULL, NULL };
 
-       if (is_null_sha1(stash))
+       if (is_null_oid(stash))
                return;
 
-       reset_hard(head, 1);
+       reset_hard(head->hash, 1);
 
-       args[2] = sha1_to_hex(stash);
+       args[2] = oid_to_hex(stash);
 
        /*
         * It is OK to ignore error here, for example when there was
@@ -372,10 +375,10 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
 
 static void finish(struct commit *head_commit,
                   struct commit_list *remoteheads,
-                  const unsigned char *new_head, const char *msg)
+                  const struct object_id *new_head, const char *msg)
 {
        struct strbuf reflog_message = STRBUF_INIT;
-       const unsigned char *head = head_commit->object.oid.hash;
+       const struct object_id *head = &head_commit->object.oid;
 
        if (!msg)
                strbuf_addstr(&reflog_message, getenv("GIT_REFLOG_ACTION"));
@@ -393,7 +396,7 @@ static void finish(struct commit *head_commit,
                else {
                        const char *argv_gc_auto[] = { "gc", "--auto", NULL };
                        update_ref(reflog_message.buf, "HEAD",
-                               new_head, head, 0,
+                               new_head->hash, head->hash, 0,
                                UPDATE_REFS_DIE_ON_ERR);
                        /*
                         * We ignore errors in 'gc --auto', since the
@@ -412,7 +415,7 @@ static void finish(struct commit *head_commit,
                        DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
                opts.detect_rename = DIFF_DETECT_RENAME;
                diff_setup_done(&opts);
-               diff_tree_sha1(head, new_head, "", &opts);
+               diff_tree_sha1(head->hash, new_head->hash, "", &opts);
                diffcore_std(&opts);
                diff_flush(&opts);
        }
@@ -427,35 +430,35 @@ static void finish(struct commit *head_commit,
 static void merge_name(const char *remote, struct strbuf *msg)
 {
        struct commit *remote_head;
-       unsigned char branch_head[20];
+       struct object_id branch_head;
        struct strbuf buf = STRBUF_INIT;
        struct strbuf bname = STRBUF_INIT;
        const char *ptr;
        char *found_ref;
        int len, early;
 
-       strbuf_branchname(&bname, remote);
+       strbuf_branchname(&bname, remote, 0);
        remote = bname.buf;
 
-       memset(branch_head, 0, sizeof(branch_head));
+       oidclr(&branch_head);
        remote_head = get_merge_parent(remote);
        if (!remote_head)
                die(_("'%s' does not point to a commit"), remote);
 
-       if (dwim_ref(remote, strlen(remote), branch_head, &found_ref) > 0) {
+       if (dwim_ref(remote, strlen(remote), branch_head.hash, &found_ref) > 0) {
                if (starts_with(found_ref, "refs/heads/")) {
                        strbuf_addf(msg, "%s\t\tbranch '%s' of .\n",
-                                   sha1_to_hex(branch_head), remote);
+                                   oid_to_hex(&branch_head), remote);
                        goto cleanup;
                }
                if (starts_with(found_ref, "refs/tags/")) {
                        strbuf_addf(msg, "%s\t\ttag '%s' of .\n",
-                                   sha1_to_hex(branch_head), remote);
+                                   oid_to_hex(&branch_head), remote);
                        goto cleanup;
                }
                if (starts_with(found_ref, "refs/remotes/")) {
                        strbuf_addf(msg, "%s\t\tremote-tracking branch '%s' of .\n",
-                                   sha1_to_hex(branch_head), remote);
+                                   oid_to_hex(&branch_head), remote);
                        goto cleanup;
                }
        }
@@ -586,8 +589,8 @@ static int git_merge_config(const char *k, const char *v, void *cb)
        return git_diff_ui_config(k, v, cb);
 }
 
-static int read_tree_trivial(unsigned char *common, unsigned char *head,
-                            unsigned char *one)
+static int read_tree_trivial(struct object_id *common, struct object_id *head,
+                            struct object_id *one)
 {
        int i, nr_trees = 0;
        struct tree *trees[MAX_UNPACK_TREES];
@@ -602,13 +605,13 @@ static int read_tree_trivial(unsigned char *common, unsigned char *head,
        opts.verbose_update = 1;
        opts.trivial_merges_only = 1;
        opts.merge = 1;
-       trees[nr_trees] = parse_tree_indirect(common);
+       trees[nr_trees] = parse_tree_indirect(common->hash);
        if (!trees[nr_trees++])
                return -1;
-       trees[nr_trees] = parse_tree_indirect(head);
+       trees[nr_trees] = parse_tree_indirect(head->hash);
        if (!trees[nr_trees++])
                return -1;
-       trees[nr_trees] = parse_tree_indirect(one);
+       trees[nr_trees] = parse_tree_indirect(one->hash);
        if (!trees[nr_trees++])
                return -1;
        opts.fn = threeway_merge;
@@ -622,19 +625,20 @@ static int read_tree_trivial(unsigned char *common, unsigned char *head,
        return 0;
 }
 
-static void write_tree_trivial(unsigned char *sha1)
+static void write_tree_trivial(struct object_id *oid)
 {
-       if (write_cache_as_tree(sha1, 0, NULL))
+       if (write_cache_as_tree(oid->hash, 0, NULL))
                die(_("git write-tree failed to write a tree"));
 }
 
 static int try_merge_strategy(const char *strategy, struct commit_list *common,
                              struct commit_list *remoteheads,
-                             struct commit *head, const char *head_arg)
+                             struct commit *head)
 {
        static struct lock_file lock;
+       const char *head_arg = "HEAD";
 
-       hold_locked_index(&lock, 1);
+       hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
        refresh_cache(REFRESH_QUIET);
        if (active_cache_changed &&
            write_locked_index(&the_index, &lock, COMMIT_LOCK))
@@ -671,7 +675,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
                for (j = common; j; j = j->next)
                        commit_list_insert(j->item, &reversed);
 
-               hold_locked_index(&lock, 1);
+               hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
                clean = merge_recursive(&o, head,
                                remoteheads->item, reversed, &result);
                if (clean < 0)
@@ -777,26 +781,26 @@ static void prepare_to_commit(struct commit_list *remoteheads)
 
 static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
 {
-       unsigned char result_tree[20], result_commit[20];
+       struct object_id result_tree, result_commit;
        struct commit_list *parents, **pptr = &parents;
        static struct lock_file lock;
 
-       hold_locked_index(&lock, 1);
+       hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
        refresh_cache(REFRESH_QUIET);
        if (active_cache_changed &&
            write_locked_index(&the_index, &lock, COMMIT_LOCK))
                return error(_("Unable to write index."));
        rollback_lock_file(&lock);
 
-       write_tree_trivial(result_tree);
+       write_tree_trivial(&result_tree);
        printf(_("Wonderful.\n"));
        pptr = commit_list_append(head, pptr);
        pptr = commit_list_append(remoteheads->item, pptr);
        prepare_to_commit(remoteheads);
-       if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parents,
-                       result_commit, NULL, sign_commit))
+       if (commit_tree(merge_msg.buf, merge_msg.len, result_tree.hash, parents,
+                       result_commit.hash, NULL, sign_commit))
                die(_("failed to write commit object"));
-       finish(head, remoteheads, result_commit, "In-index merge");
+       finish(head, remoteheads, &result_commit, "In-index merge");
        drop_save();
        return 0;
 }
@@ -805,12 +809,12 @@ static int finish_automerge(struct commit *head,
                            int head_subsumed,
                            struct commit_list *common,
                            struct commit_list *remoteheads,
-                           unsigned char *result_tree,
+                           struct object_id *result_tree,
                            const char *wt_strategy)
 {
        struct commit_list *parents = NULL;
        struct strbuf buf = STRBUF_INIT;
-       unsigned char result_commit[20];
+       struct object_id result_commit;
 
        free_commit_list(common);
        parents = remoteheads;
@@ -818,11 +822,11 @@ static int finish_automerge(struct commit *head,
                commit_list_insert(head, &parents);
        strbuf_addch(&merge_msg, '\n');
        prepare_to_commit(remoteheads);
-       if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parents,
-                       result_commit, NULL, sign_commit))
+       if (commit_tree(merge_msg.buf, merge_msg.len, result_tree->hash, parents,
+                       result_commit.hash, NULL, sign_commit))
                die(_("failed to write commit object"));
        strbuf_addf(&buf, "Merge made by the '%s' strategy.", wt_strategy);
-       finish(head, remoteheads, result_commit, buf.buf);
+       finish(head, remoteheads, &result_commit, buf.buf);
        strbuf_release(&buf);
        drop_save();
        return 0;
@@ -849,24 +853,6 @@ static int suggest_conflicts(void)
        return 1;
 }
 
-static struct commit *is_old_style_invocation(int argc, const char **argv,
-                                             const unsigned char *head)
-{
-       struct commit *second_token = NULL;
-       if (argc > 2) {
-               unsigned char second_sha1[20];
-
-               if (get_sha1(argv[1], second_sha1))
-                       return NULL;
-               second_token = lookup_commit_reference_gently(second_sha1, 0);
-               if (!second_token)
-                       die(_("'%s' is not a commit"), argv[1]);
-               if (hashcmp(second_token->object.oid.hash, head))
-                       return NULL;
-       }
-       return second_token;
-}
-
 static int evaluate_result(void)
 {
        int cnt = 0;
@@ -1034,7 +1020,7 @@ static void handle_fetch_head(struct commit_list **remotes, struct strbuf *merge
                die_errno(_("could not close '%s'"), filename);
 
        for (pos = 0; pos < merge_names->len; pos = npos) {
-               unsigned char sha1[20];
+               struct object_id oid;
                char *ptr;
                struct commit *commit;
 
@@ -1044,16 +1030,16 @@ static void handle_fetch_head(struct commit_list **remotes, struct strbuf *merge
                else
                        npos = merge_names->len;
 
-               if (npos - pos < 40 + 2 ||
-                   get_sha1_hex(merge_names->buf + pos, sha1))
+               if (npos - pos < GIT_SHA1_HEXSZ + 2 ||
+                   get_oid_hex(merge_names->buf + pos, &oid))
                        commit = NULL; /* bad */
-               else if (memcmp(merge_names->buf + pos + 40, "\t\t", 2))
+               else if (memcmp(merge_names->buf + pos + GIT_SHA1_HEXSZ, "\t\t", 2))
                        continue; /* not-for-merge */
                else {
-                       char saved = merge_names->buf[pos + 40];
-                       merge_names->buf[pos + 40] = '\0';
+                       char saved = merge_names->buf[pos + GIT_SHA1_HEXSZ];
+                       merge_names->buf[pos + GIT_SHA1_HEXSZ] = '\0';
                        commit = get_merge_parent(merge_names->buf + pos);
-                       merge_names->buf[pos + 40] = saved;
+                       merge_names->buf[pos + GIT_SHA1_HEXSZ] = saved;
                }
                if (!commit) {
                        if (ptr)
@@ -1113,18 +1099,16 @@ static struct commit_list *collect_parents(struct commit *head_commit,
 
 int cmd_merge(int argc, const char **argv, const char *prefix)
 {
-       unsigned char result_tree[20];
-       unsigned char stash[20];
-       unsigned char head_sha1[20];
+       struct object_id result_tree, stash, head_oid;
        struct commit *head_commit;
        struct strbuf buf = STRBUF_INIT;
-       const char *head_arg;
        int i, ret = 0, head_subsumed;
        int best_cnt = -1, merge_was_ok = 0, automerge_was_ok = 0;
        struct commit_list *common = NULL;
        const char *best_strategy = NULL, *wt_strategy = NULL;
        struct commit_list *remoteheads, *p;
        void *branch_to_free;
+       int orig_argc = argc;
 
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage_with_options(builtin_merge_usage, builtin_merge_options);
@@ -1133,13 +1117,13 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
         * Check if we are _not_ on a detached HEAD, i.e. if there is a
         * current branch.
         */
-       branch = branch_to_free = resolve_refdup("HEAD", 0, head_sha1, NULL);
+       branch = branch_to_free = resolve_refdup("HEAD", 0, head_oid.hash, NULL);
        if (branch && starts_with(branch, "refs/heads/"))
                branch += 11;
-       if (!branch || is_null_sha1(head_sha1))
+       if (!branch || is_null_oid(&head_oid))
                head_commit = NULL;
        else
-               head_commit = lookup_commit_or_die(head_sha1, "HEAD");
+               head_commit = lookup_commit_or_die(head_oid.hash, "HEAD");
 
        init_diff_ui_defaults();
        git_config(git_merge_config, NULL);
@@ -1158,6 +1142,10 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                int nargc = 2;
                const char *nargv[] = {"reset", "--merge", NULL};
 
+               if (orig_argc != 2)
+                       usage_msg_opt(_("--abort expects no arguments"),
+                             builtin_merge_usage, builtin_merge_options);
+
                if (!file_exists(git_path_merge_head()))
                        die(_("There is no merge to abort (MERGE_HEAD missing)."));
 
@@ -1166,6 +1154,22 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                goto done;
        }
 
+       if (continue_current_merge) {
+               int nargc = 1;
+               const char *nargv[] = {"commit", NULL};
+
+               if (orig_argc != 2)
+                       usage_msg_opt(_("--continue expects no arguments"),
+                             builtin_merge_usage, builtin_merge_options);
+
+               if (!file_exists(git_path_merge_head()))
+                       die(_("There is no merge in progress (MERGE_HEAD missing)."));
+
+               /* Invoke 'git commit' */
+               ret = cmd_commit(nargc, nargv, prefix);
+               goto done;
+       }
+
        if (read_cache_unmerged())
                die_resolve_conflict("merge");
 
@@ -1217,7 +1221,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                 * to forbid "git merge" into a branch yet to be born.
                 * We do the same for "git pull".
                 */
-               unsigned char *remote_head_sha1;
+               struct object_id *remote_head_oid;
                if (squash)
                        die(_("Squash commit into empty head not supported yet"));
                if (fast_forward == FF_NO)
@@ -1229,42 +1233,20 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                        die(_("%s - not something we can merge"), argv[0]);
                if (remoteheads->next)
                        die(_("Can merge only exactly one commit into empty head"));
-               remote_head_sha1 = remoteheads->item->object.oid.hash;
-               read_empty(remote_head_sha1, 0);
-               update_ref("initial pull", "HEAD", remote_head_sha1,
+               remote_head_oid = &remoteheads->item->object.oid;
+               read_empty(remote_head_oid->hash, 0);
+               update_ref("initial pull", "HEAD", remote_head_oid->hash,
                           NULL, 0, UPDATE_REFS_DIE_ON_ERR);
                goto done;
        }
 
        /*
-        * This could be traditional "merge <msg> HEAD <commit>..."  and
-        * the way we can tell it is to see if the second token is HEAD,
-        * but some people might have misused the interface and used a
-        * commit-ish that is the same as HEAD there instead.
-        * Traditional format never would have "-m" so it is an
-        * additional safety measure to check for it.
+        * All the rest are the commits being merged; prepare
+        * the standard merge summary message to be appended
+        * to the given message.
         */
-       if (!have_message &&
-           is_old_style_invocation(argc, argv, head_commit->object.oid.hash)) {
-               warning("old-style 'git merge <msg> HEAD <commit>' is deprecated.");
-               strbuf_addstr(&merge_msg, argv[0]);
-               head_arg = argv[1];
-               argv += 2;
-               argc -= 2;
-               remoteheads = collect_parents(head_commit, &head_subsumed,
-                                             argc, argv, NULL);
-       } else {
-               /* We are invoked directly as the first-class UI. */
-               head_arg = "HEAD";
-
-               /*
-                * All the rest are the commits being merged; prepare
-                * the standard merge summary message to be appended
-                * to the given message.
-                */
-               remoteheads = collect_parents(head_commit, &head_subsumed,
-                                             argc, argv, &merge_msg);
-       }
+       remoteheads = collect_parents(head_commit, &head_subsumed,
+                                     argc, argv, &merge_msg);
 
        if (!head_commit || !argc)
                usage_with_options(builtin_merge_usage,
@@ -1273,7 +1255,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        if (verify_signatures) {
                for (p = remoteheads; p; p = p->next) {
                        struct commit *commit = p->item;
-                       char hex[GIT_SHA1_HEXSZ + 1];
+                       char hex[GIT_MAX_HEXSZ + 1];
                        struct signature_check signature_check;
                        memset(&signature_check, 0, sizeof(signature_check));
 
@@ -1374,12 +1356,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                struct commit *commit;
 
                if (verbosity >= 0) {
-                       char from[GIT_SHA1_HEXSZ + 1], to[GIT_SHA1_HEXSZ + 1];
-                       find_unique_abbrev_r(from, head_commit->object.oid.hash,
-                                             DEFAULT_ABBREV);
-                       find_unique_abbrev_r(to, remoteheads->item->object.oid.hash,
-                                             DEFAULT_ABBREV);
-                       printf(_("Updating %s..%s\n"), from, to);
+                       printf(_("Updating %s..%s\n"),
+                              find_unique_abbrev(head_commit->object.oid.hash,
+                                                 DEFAULT_ABBREV),
+                              find_unique_abbrev(remoteheads->item->object.oid.hash,
+                                                 DEFAULT_ABBREV));
                }
                strbuf_addstr(&msg, "Fast-forward");
                if (have_message)
@@ -1398,7 +1379,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                        goto done;
                }
 
-               finish(head_commit, remoteheads, commit->object.oid.hash, msg.buf);
+               finish(head_commit, remoteheads, &commit->object.oid, msg.buf);
                drop_save();
                goto done;
        } else if (!remoteheads->next && common->next)
@@ -1417,9 +1398,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                        /* See if it is really trivial. */
                        git_committer_info(IDENT_STRICT);
                        printf(_("Trying really trivial in-index merge...\n"));
-                       if (!read_tree_trivial(common->item->object.oid.hash,
-                                              head_commit->object.oid.hash,
-                                              remoteheads->item->object.oid.hash)) {
+                       if (!read_tree_trivial(&common->item->object.oid,
+                                              &head_commit->object.oid,
+                                              &remoteheads->item->object.oid)) {
                                ret = merge_trivial(head_commit, remoteheads);
                                goto done;
                        }
@@ -1471,14 +1452,14 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
            /*
             * Stash away the local changes so that we can try more than one.
             */
-           save_state(stash))
-               hashclr(stash);
+           save_state(&stash))
+               oidclr(&stash);
 
        for (i = 0; i < use_strategies_nr; i++) {
                int ret;
                if (i) {
                        printf(_("Rewinding the tree to pristine...\n"));
-                       restore_state(head_commit->object.oid.hash, stash);
+                       restore_state(&head_commit->object.oid, &stash);
                }
                if (use_strategies_nr != 1)
                        printf(_("Trying merge strategy %s...\n"),
@@ -1491,7 +1472,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 
                ret = try_merge_strategy(use_strategies[i]->name,
                                         common, remoteheads,
-                                        head_commit, head_arg);
+                                        head_commit);
                if (!option_commit && !ret) {
                        merge_was_ok = 1;
                        /*
@@ -1523,7 +1504,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                }
 
                /* Automerge succeeded. */
-               write_tree_trivial(result_tree);
+               write_tree_trivial(&result_tree);
                automerge_was_ok = 1;
                break;
        }
@@ -1535,7 +1516,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        if (automerge_was_ok) {
                ret = finish_automerge(head_commit, head_subsumed,
                                       common, remoteheads,
-                                      result_tree, wt_strategy);
+                                      &result_tree, wt_strategy);
                goto done;
        }
 
@@ -1544,7 +1525,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
         * it up.
         */
        if (!best_strategy) {
-               restore_state(head_commit->object.oid.hash, stash);
+               restore_state(&head_commit->object.oid, &stash);
                if (use_strategies_nr > 1)
                        fprintf(stderr,
                                _("No merge strategy handled the merge.\n"));
@@ -1557,11 +1538,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                ; /* We already have its result in the working tree. */
        else {
                printf(_("Rewinding the tree to pristine...\n"));
-               restore_state(head_commit->object.oid.hash, stash);
+               restore_state(&head_commit->object.oid, &stash);
                printf(_("Using the %s to prepare resolving by hand.\n"),
                        best_strategy);
                try_merge_strategy(best_strategy, common, remoteheads,
-                                  head_commit, head_arg);
+                                  head_commit);
        }
 
        if (squash)
index 4282b62c595edd987a87eb23ba679079211e0835..da0fd8cd706659a8784da8112cd1b3acd306375f 100644 (file)
@@ -46,7 +46,7 @@ static void write_tree(unsigned char *sha1)
        size_t size;
        int i;
 
-       qsort(entries, used, sizeof(*entries), ent_compare);
+       QSORT(entries, used, ent_compare);
        for (size = i = 0; i < used; i++)
                size += 32 + entries[i]->len;
 
@@ -72,7 +72,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
        unsigned mode;
        enum object_type mode_type; /* object type derived from mode */
        enum object_type obj_type; /* object type derived from sha */
-       char *path;
+       char *path, *to_free = NULL;
        unsigned char sha1[20];
 
        ptr = buf;
@@ -102,7 +102,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
                struct strbuf p_uq = STRBUF_INIT;
                if (unquote_c_style(&p_uq, path, NULL))
                        die("invalid quoting");
-               path = strbuf_detach(&p_uq, NULL);
+               path = to_free = strbuf_detach(&p_uq, NULL);
        }
 
        /*
@@ -136,6 +136,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
        }
 
        append_to_tree(mode, sha1, path);
+       free(to_free);
 }
 
 int cmd_mktree(int ac, const char **av, const char *prefix)
index 2f43877bc9a17c5bef2906a383cc8cdd6f4f5b82..61d20037add7cf56df721f8d69612b50412f94e9 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2006 Johannes Schindelin
  */
 #include "builtin.h"
+#include "pathspec.h"
 #include "lockfile.h"
 #include "dir.h"
 #include "cache-tree.h"
@@ -19,31 +20,42 @@ static const char * const builtin_mv_usage[] = {
 #define DUP_BASENAME 1
 #define KEEP_TRAILING_SLASH 2
 
-static const char **internal_copy_pathspec(const char *prefix,
-                                          const char **pathspec,
-                                          int count, unsigned flags)
+static const char **internal_prefix_pathspec(const char *prefix,
+                                            const char **pathspec,
+                                            int count, unsigned flags)
 {
        int i;
        const char **result;
+       int prefixlen = prefix ? strlen(prefix) : 0;
        ALLOC_ARRAY(result, count + 1);
-       COPY_ARRAY(result, pathspec, count);
-       result[count] = NULL;
+
+       /* Create an intermediate copy of the pathspec based on the flags */
        for (i = 0; i < count; i++) {
-               int length = strlen(result[i]);
+               int length = strlen(pathspec[i]);
                int to_copy = length;
+               char *it;
                while (!(flags & KEEP_TRAILING_SLASH) &&
-                      to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
+                      to_copy > 0 && is_dir_sep(pathspec[i][to_copy - 1]))
                        to_copy--;
-               if (to_copy != length || flags & DUP_BASENAME) {
-                       char *it = xmemdupz(result[i], to_copy);
-                       if (flags & DUP_BASENAME) {
-                               result[i] = xstrdup(basename(it));
-                               free(it);
-                       } else
-                               result[i] = it;
+
+               it = xmemdupz(pathspec[i], to_copy);
+               if (flags & DUP_BASENAME) {
+                       result[i] = xstrdup(basename(it));
+                       free(it);
+               } else {
+                       result[i] = it;
                }
        }
-       return get_pathspec(prefix, result);
+       result[count] = NULL;
+
+       /* Prefix the pathspec and free the old intermediate strings */
+       for (i = 0; i < count; i++) {
+               const char *match = prefix_path(prefix, prefixlen, result[i]);
+               free((char *) result[i]);
+               result[i] = match;
+       }
+
+       return result;
 }
 
 static const char *add_slash(const char *path)
@@ -126,11 +138,11 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
        if (--argc < 1)
                usage_with_options(builtin_mv_usage, builtin_mv_options);
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
        if (read_cache() < 0)
                die(_("index file corrupt"));
 
-       source = internal_copy_pathspec(prefix, argv, argc, 0);
+       source = internal_prefix_pathspec(prefix, argv, argc, 0);
        modes = xcalloc(argc, sizeof(enum update_mode));
        /*
         * Keep trailing slash, needed to let
@@ -140,16 +152,16 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
        flags = KEEP_TRAILING_SLASH;
        if (argc == 1 && is_directory(argv[0]) && !is_directory(argv[1]))
                flags = 0;
-       dest_path = internal_copy_pathspec(prefix, argv + argc, 1, flags);
+       dest_path = internal_prefix_pathspec(prefix, argv + argc, 1, flags);
        submodule_gitfile = xcalloc(argc, sizeof(char *));
 
        if (dest_path[0][0] == '\0')
                /* special case: "." was normalized to "" */
-               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+               destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
        else if (!lstat(dest_path[0], &st) &&
                        S_ISDIR(st.st_mode)) {
                dest_path[0] = add_slash(dest_path[0]);
-               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
+               destination = internal_prefix_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
        } else {
                if (argc != 1)
                        die(_("destination '%s' is not a directory"), dest_path[0]);
index 57be35faf583d5bcb112c9f487b67ae4df8bf368..1767af750dde7f5184b4df25067f9f616c1918b3 100644 (file)
@@ -13,6 +13,7 @@ typedef struct rev_name {
        unsigned long taggerdate;
        int generation;
        int distance;
+       int from_tag;
 } rev_name;
 
 static long cutoff = LONG_MAX;
@@ -20,14 +21,53 @@ static long cutoff = LONG_MAX;
 /* How many generations are maximally preferred over _one_ merge traversal? */
 #define MERGE_TRAVERSAL_WEIGHT 65535
 
+static int is_better_name(struct rev_name *name,
+                         const char *tip_name,
+                         unsigned long taggerdate,
+                         int generation,
+                         int distance,
+                         int from_tag)
+{
+       /*
+        * When comparing names based on tags, prefer names
+        * based on the older tag, even if it is farther away.
+        */
+       if (from_tag && name->from_tag)
+               return (name->taggerdate > taggerdate ||
+                       (name->taggerdate == taggerdate &&
+                        name->distance > distance));
+
+       /*
+        * We know that at least one of them is a non-tag at this point.
+        * favor a tag over a non-tag.
+        */
+       if (name->from_tag != from_tag)
+               return from_tag;
+
+       /*
+        * We are now looking at two non-tags.  Tiebreak to favor
+        * shorter hops.
+        */
+       if (name->distance != distance)
+               return name->distance > distance;
+
+       /* ... or tiebreak to favor older date */
+       if (name->taggerdate != taggerdate)
+               return name->taggerdate > taggerdate;
+
+       /* keep the current one if we cannot decide */
+       return 0;
+}
+
 static void name_rev(struct commit *commit,
                const char *tip_name, unsigned long taggerdate,
-               int generation, int distance,
+               int generation, int distance, int from_tag,
                int deref)
 {
        struct rev_name *name = (struct rev_name *)commit->util;
        struct commit_list *parents;
        int parent_number = 1;
+       char *to_free = NULL;
 
        parse_commit(commit);
 
@@ -35,7 +75,7 @@ static void name_rev(struct commit *commit,
                return;
 
        if (deref) {
-               tip_name = xstrfmt("%s^0", tip_name);
+               tip_name = to_free = xstrfmt("%s^0", tip_name);
 
                if (generation)
                        die("generation: %d, but deref?", generation);
@@ -45,16 +85,18 @@ static void name_rev(struct commit *commit,
                name = xmalloc(sizeof(rev_name));
                commit->util = name;
                goto copy_data;
-       } else if (name->taggerdate > taggerdate ||
-                       (name->taggerdate == taggerdate &&
-                        name->distance > distance)) {
+       } else if (is_better_name(name, tip_name, taggerdate,
+                                 generation, distance, from_tag)) {
 copy_data:
                name->tip_name = tip_name;
                name->taggerdate = taggerdate;
                name->generation = generation;
                name->distance = distance;
-       } else
+               name->from_tag = from_tag;
+       } else {
+               free(to_free);
                return;
+       }
 
        for (parents = commit->parents;
                        parents;
@@ -72,10 +114,12 @@ copy_data:
                                                   parent_number);
 
                        name_rev(parents->item, new_name, taggerdate, 0,
-                               distance + MERGE_TRAVERSAL_WEIGHT, 0);
+                                distance + MERGE_TRAVERSAL_WEIGHT,
+                                from_tag, 0);
                } else {
                        name_rev(parents->item, tip_name, taggerdate,
-                               generation + 1, distance + 1, 0);
+                                generation + 1, distance + 1,
+                                from_tag, 0);
                }
        }
 }
@@ -108,7 +152,8 @@ static const char *name_ref_abbrev(const char *refname, int shorten_unambiguous)
 struct name_ref_data {
        int tags_only;
        int name_only;
-       const char *ref_filter;
+       struct string_list ref_filters;
+       struct string_list exclude_filters;
 };
 
 static struct tip_table {
@@ -150,18 +195,49 @@ static int name_ref(const char *path, const struct object_id *oid, int flags, vo
        if (data->tags_only && !starts_with(path, "refs/tags/"))
                return 0;
 
-       if (data->ref_filter) {
-               switch (subpath_matches(path, data->ref_filter)) {
-               case -1: /* did not match */
-                       return 0;
-               case 0:  /* matched fully */
-                       break;
-               default: /* matched subpath */
-                       can_abbreviate_output = 1;
-                       break;
+       if (data->exclude_filters.nr) {
+               struct string_list_item *item;
+
+               for_each_string_list_item(item, &data->exclude_filters) {
+                       if (subpath_matches(path, item->string) >= 0)
+                               return 0;
                }
        }
 
+       if (data->ref_filters.nr) {
+               struct string_list_item *item;
+               int matched = 0;
+
+               /* See if any of the patterns match. */
+               for_each_string_list_item(item, &data->ref_filters) {
+                       /*
+                        * Check all patterns even after finding a match, so
+                        * that we can see if a match with a subpath exists.
+                        * When a user asked for 'refs/tags/v*' and 'v1.*',
+                        * both of which match, the user is showing her
+                        * willingness to accept a shortened output by having
+                        * the 'v1.*' in the acceptable refnames, so we
+                        * shouldn't stop when seeing 'refs/tags/v1.4' matches
+                        * 'refs/tags/v*'.  We should show it as 'v1.4'.
+                        */
+                       switch (subpath_matches(path, item->string)) {
+                       case -1: /* did not match */
+                               break;
+                       case 0: /* matched fully */
+                               matched = 1;
+                               break;
+                       default: /* matched subpath */
+                               matched = 1;
+                               can_abbreviate_output = 1;
+                               break;
+                       }
+               }
+
+               /* If none of the patterns matched, stop now */
+               if (!matched)
+                       return 0;
+       }
+
        add_to_tip_table(oid->hash, path, can_abbreviate_output);
 
        while (o && o->type == OBJ_TAG) {
@@ -174,9 +250,13 @@ static int name_ref(const char *path, const struct object_id *oid, int flags, vo
        }
        if (o && o->type == OBJ_COMMIT) {
                struct commit *commit = (struct commit *)o;
+               int from_tag = starts_with(path, "refs/tags/");
 
+               if (taggerdate == ULONG_MAX)
+                       taggerdate = ((struct commit *)o)->date;
                path = name_ref_abbrev(path, can_abbreviate_output);
-               name_rev(commit, xstrdup(path), taggerdate, 0, 0, deref);
+               name_rev(commit, xstrdup(path), taggerdate, 0, 0,
+                        from_tag, deref);
        }
        return 0;
 }
@@ -195,8 +275,7 @@ static const char *get_exact_ref_match(const struct object *o)
                return NULL;
 
        if (!tip_table.sorted) {
-               qsort(tip_table.table, tip_table.nr, sizeof(*tip_table.table),
-                     tipcmp);
+               QSORT(tip_table.table, tip_table.nr, tipcmp);
                tip_table.sorted = 1;
        }
 
@@ -207,10 +286,9 @@ static const char *get_exact_ref_match(const struct object *o)
        return NULL;
 }
 
-/* returns a static buffer */
-static const char *get_rev_name(const struct object *o)
+/* may return a constant string or use "buf" as scratch space */
+static const char *get_rev_name(const struct object *o, struct strbuf *buf)
 {
-       static char buffer[1024];
        struct rev_name *n;
        struct commit *c;
 
@@ -227,10 +305,9 @@ static const char *get_rev_name(const struct object *o)
                int len = strlen(n->tip_name);
                if (len > 2 && !strcmp(n->tip_name + len - 2, "^0"))
                        len -= 2;
-               snprintf(buffer, sizeof(buffer), "%.*s~%d", len, n->tip_name,
-                               n->generation);
-
-               return buffer;
+               strbuf_reset(buf);
+               strbuf_addf(buf, "%.*s~%d", len, n->tip_name, n->generation);
+               return buf->buf;
        }
 }
 
@@ -240,10 +317,11 @@ static void show_name(const struct object *obj,
 {
        const char *name;
        const struct object_id *oid = &obj->oid;
+       struct strbuf buf = STRBUF_INIT;
 
        if (!name_only)
                printf("%s ", caller_name ? caller_name : oid_to_hex(oid));
-       name = get_rev_name(obj);
+       name = get_rev_name(obj, &buf);
        if (name)
                printf("%s\n", name);
        else if (allow_undefined)
@@ -252,6 +330,7 @@ static void show_name(const struct object *obj,
                printf("%s\n", find_unique_abbrev(oid->hash, DEFAULT_ABBREV));
        else
                die("cannot describe '%s'", oid_to_hex(oid));
+       strbuf_release(&buf);
 }
 
 static char const * const name_rev_usage[] = {
@@ -263,6 +342,7 @@ static char const * const name_rev_usage[] = {
 
 static void name_rev_line(char *p, struct name_ref_data *data)
 {
+       struct strbuf buf = STRBUF_INIT;
        int forty = 0;
        char *p_start;
        for (p_start = p; *p; p++) {
@@ -283,7 +363,7 @@ static void name_rev_line(char *p, struct name_ref_data *data)
                                struct object *o =
                                        lookup_object(sha1);
                                if (o)
-                                       name = get_rev_name(o);
+                                       name = get_rev_name(o, &buf);
                        }
                        *(p+1) = c;
 
@@ -301,18 +381,22 @@ static void name_rev_line(char *p, struct name_ref_data *data)
        /* flush */
        if (p_start != p)
                fwrite(p_start, p - p_start, 1, stdout);
+
+       strbuf_release(&buf);
 }
 
 int cmd_name_rev(int argc, const char **argv, const char *prefix)
 {
        struct object_array revs = OBJECT_ARRAY_INIT;
        int all = 0, transform_stdin = 0, allow_undefined = 1, always = 0, peel_tag = 0;
-       struct name_ref_data data = { 0, 0, NULL };
+       struct name_ref_data data = { 0, 0, STRING_LIST_INIT_NODUP, STRING_LIST_INIT_NODUP };
        struct option opts[] = {
                OPT_BOOL(0, "name-only", &data.name_only, N_("print only names (no SHA-1)")),
                OPT_BOOL(0, "tags", &data.tags_only, N_("only use tags to name the commits")),
-               OPT_STRING(0, "refs", &data.ref_filter, N_("pattern"),
+               OPT_STRING_LIST(0, "refs", &data.ref_filters, N_("pattern"),
                                   N_("only use refs matching <pattern>")),
+               OPT_STRING_LIST(0, "exclude", &data.exclude_filters, N_("pattern"),
+                                  N_("ignore refs matching <pattern>")),
                OPT_GROUP(""),
                OPT_BOOL(0, "all", &all, N_("list all commits reachable from all refs")),
                OPT_BOOL(0, "stdin", &transform_stdin, N_("read from stdin")),
index f848b896927a34e884f8377ea9c98271237be5fc..fb856e53b610087128094e3fc4deb7bab2106801 100644 (file)
@@ -191,7 +191,7 @@ static void prepare_note_data(const unsigned char *object, struct note_data *d,
                strbuf_reset(&d->buf);
 
                if (launch_editor(d->edit_path, &d->buf, NULL)) {
-                       die(_("Please supply the note contents using either -m or -F option"));
+                       die(_("please supply the note contents using either -m or -F option"));
                }
                strbuf_stripspace(&d->buf, 1);
        }
@@ -202,7 +202,7 @@ static void write_note_data(struct note_data *d, unsigned char *sha1)
        if (write_sha1_file(d->buf.buf, d->buf.len, blob_type, sha1)) {
                error(_("unable to write note object"));
                if (d->edit_path)
-                       error(_("The note contents have been left in %s"),
+                       error(_("the note contents have been left in %s"),
                                d->edit_path);
                exit(128);
        }
@@ -251,14 +251,14 @@ static int parse_reuse_arg(const struct option *opt, const char *arg, int unset)
                strbuf_addch(&d->buf, '\n');
 
        if (get_sha1(arg, object))
-               die(_("Failed to resolve '%s' as a valid ref."), arg);
+               die(_("failed to resolve '%s' as a valid ref."), arg);
        if (!(buf = read_sha1_file(object, &type, &len))) {
                free(buf);
-               die(_("Failed to read object '%s'."), arg);
+               die(_("failed to read object '%s'."), arg);
        }
        if (type != OBJ_BLOB) {
                free(buf);
-               die(_("Cannot read note data from non-blob object '%s'."), arg);
+               die(_("cannot read note data from non-blob object '%s'."), arg);
        }
        strbuf_add(&d->buf, buf, len);
        free(buf);
@@ -298,13 +298,13 @@ static int notes_copy_from_stdin(int force, const char *rewrite_cmd)
 
                split = strbuf_split(&buf, ' ');
                if (!split[0] || !split[1])
-                       die(_("Malformed input line: '%s'."), buf.buf);
+                       die(_("malformed input line: '%s'."), buf.buf);
                strbuf_rtrim(split[0]);
                strbuf_rtrim(split[1]);
                if (get_sha1(split[0]->buf, from_obj))
-                       die(_("Failed to resolve '%s' as a valid ref."), split[0]->buf);
+                       die(_("failed to resolve '%s' as a valid ref."), split[0]->buf);
                if (get_sha1(split[1]->buf, to_obj))
-                       die(_("Failed to resolve '%s' as a valid ref."), split[1]->buf);
+                       die(_("failed to resolve '%s' as a valid ref."), split[1]->buf);
 
                if (rewrite_cmd)
                        err = copy_note_for_rewrite(c, from_obj, to_obj);
@@ -313,7 +313,7 @@ static int notes_copy_from_stdin(int force, const char *rewrite_cmd)
                                        combine_notes_overwrite);
 
                if (err) {
-                       error(_("Failed to copy notes from '%s' to '%s'"),
+                       error(_("failed to copy notes from '%s' to '%s'"),
                              split[0]->buf, split[1]->buf);
                        ret = 1;
                }
@@ -340,7 +340,11 @@ static struct notes_tree *init_notes_check(const char *subcommand,
 
        ref = (flags & NOTES_INIT_WRITABLE) ? t->update_ref : t->ref;
        if (!starts_with(ref, "refs/notes/"))
-               die("Refusing to %s notes in %s (outside of refs/notes/)",
+               /*
+                * TRANSLATORS: the first %s will be replaced by a git
+                * notes command: 'add', 'merge', 'remove', etc.
+                */
+               die(_("refusing to %s notes in %s (outside of refs/notes/)"),
                    subcommand, ref);
        return t;
 }
@@ -367,13 +371,13 @@ static int list(int argc, const char **argv, const char *prefix)
        t = init_notes_check("list", 0);
        if (argc) {
                if (get_sha1(argv[0], object))
-                       die(_("Failed to resolve '%s' as a valid ref."), argv[0]);
+                       die(_("failed to resolve '%s' as a valid ref."), argv[0]);
                note = get_note(t, object);
                if (note) {
                        puts(sha1_to_hex(note));
                        retval = 0;
                } else
-                       retval = error(_("No note found for object %s."),
+                       retval = error(_("no note found for object %s."),
                                       sha1_to_hex(object));
        } else
                retval = for_each_note(t, 0, list_each_note, NULL);
@@ -422,7 +426,7 @@ static int add(int argc, const char **argv, const char *prefix)
        object_ref = argc > 1 ? argv[1] : "HEAD";
 
        if (get_sha1(object_ref, object))
-               die(_("Failed to resolve '%s' as a valid ref."), object_ref);
+               die(_("failed to resolve '%s' as a valid ref."), object_ref);
 
        t = init_notes_check("add", NOTES_INIT_WRITABLE);
        note = get_note(t, object);
@@ -508,12 +512,12 @@ static int copy(int argc, const char **argv, const char *prefix)
        }
 
        if (get_sha1(argv[0], from_obj))
-               die(_("Failed to resolve '%s' as a valid ref."), argv[0]);
+               die(_("failed to resolve '%s' as a valid ref."), argv[0]);
 
        object_ref = 1 < argc ? argv[1] : "HEAD";
 
        if (get_sha1(object_ref, object))
-               die(_("Failed to resolve '%s' as a valid ref."), object_ref);
+               die(_("failed to resolve '%s' as a valid ref."), object_ref);
 
        t = init_notes_check("copy", NOTES_INIT_WRITABLE);
        note = get_note(t, object);
@@ -532,7 +536,7 @@ static int copy(int argc, const char **argv, const char *prefix)
 
        from_note = get_note(t, from_obj);
        if (!from_note) {
-               retval = error(_("Missing notes on source object %s. Cannot "
+               retval = error(_("missing notes on source object %s. Cannot "
                               "copy."), sha1_to_hex(from_obj));
                goto out;
        }
@@ -552,7 +556,7 @@ static int append_edit(int argc, const char **argv, const char *prefix)
        struct notes_tree *t;
        unsigned char object[20], new_note[20];
        const unsigned char *note;
-       char logmsg[100];
+       char *logmsg;
        const char * const *usage;
        struct note_data d = { 0, 0, NULL, STRBUF_INIT };
        struct option options[] = {
@@ -591,7 +595,7 @@ static int append_edit(int argc, const char **argv, const char *prefix)
        object_ref = 1 < argc ? argv[1] : "HEAD";
 
        if (get_sha1(object_ref, object))
-               die(_("Failed to resolve '%s' as a valid ref."), object_ref);
+               die(_("failed to resolve '%s' as a valid ref."), object_ref);
 
        t = init_notes_check(argv[0], NOTES_INIT_WRITABLE);
        note = get_note(t, object);
@@ -616,17 +620,16 @@ static int append_edit(int argc, const char **argv, const char *prefix)
                write_note_data(&d, new_note);
                if (add_note(t, object, new_note, combine_notes_overwrite))
                        die("BUG: combine_notes_overwrite failed");
-               snprintf(logmsg, sizeof(logmsg), "Notes added by 'git notes %s'",
-                       argv[0]);
+               logmsg = xstrfmt("Notes added by 'git notes %s'", argv[0]);
        } else {
                fprintf(stderr, _("Removing note for object %s\n"),
                        sha1_to_hex(object));
                remove_note(t, object);
-               snprintf(logmsg, sizeof(logmsg), "Notes removed by 'git notes %s'",
-                       argv[0]);
+               logmsg = xstrfmt("Notes removed by 'git notes %s'", argv[0]);
        }
        commit_notes(t, logmsg);
 
+       free(logmsg);
        free_note_data(&d);
        free_notes(t);
        return 0;
@@ -654,13 +657,13 @@ static int show(int argc, const char **argv, const char *prefix)
        object_ref = argc ? argv[0] : "HEAD";
 
        if (get_sha1(object_ref, object))
-               die(_("Failed to resolve '%s' as a valid ref."), object_ref);
+               die(_("failed to resolve '%s' as a valid ref."), object_ref);
 
        t = init_notes_check("show", 0);
        note = get_note(t, object);
 
        if (!note)
-               retval = error(_("No note found for object %s."),
+               retval = error(_("no note found for object %s."),
                               sha1_to_hex(object));
        else {
                const char *show_args[3] = {"show", sha1_to_hex(note), NULL};
@@ -679,19 +682,19 @@ static int merge_abort(struct notes_merge_options *o)
         * notes_merge_abort() to remove .git/NOTES_MERGE_WORKTREE.
         */
 
-       if (delete_ref("NOTES_MERGE_PARTIAL", NULL, 0))
-               ret += error("Failed to delete ref NOTES_MERGE_PARTIAL");
-       if (delete_ref("NOTES_MERGE_REF", NULL, REF_NODEREF))
-               ret += error("Failed to delete ref NOTES_MERGE_REF");
+       if (delete_ref(NULL, "NOTES_MERGE_PARTIAL", NULL, 0))
+               ret += error(_("failed to delete ref NOTES_MERGE_PARTIAL"));
+       if (delete_ref(NULL, "NOTES_MERGE_REF", NULL, REF_NODEREF))
+               ret += error(_("failed to delete ref NOTES_MERGE_REF"));
        if (notes_merge_abort(o))
-               ret += error("Failed to remove 'git notes merge' worktree");
+               ret += error(_("failed to remove 'git notes merge' worktree"));
        return ret;
 }
 
 static int merge_commit(struct notes_merge_options *o)
 {
        struct strbuf msg = STRBUF_INIT;
-       unsigned char sha1[20], parent_sha1[20];
+       struct object_id oid, parent_oid;
        struct notes_tree *t;
        struct commit *partial;
        struct pretty_print_context pretty_ctx;
@@ -703,36 +706,36 @@ static int merge_commit(struct notes_merge_options *o)
         * and target notes ref from .git/NOTES_MERGE_REF.
         */
 
-       if (get_sha1("NOTES_MERGE_PARTIAL", sha1))
-               die("Failed to read ref NOTES_MERGE_PARTIAL");
-       else if (!(partial = lookup_commit_reference(sha1)))
-               die("Could not find commit from NOTES_MERGE_PARTIAL.");
+       if (get_oid("NOTES_MERGE_PARTIAL", &oid))
+               die(_("failed to read ref NOTES_MERGE_PARTIAL"));
+       else if (!(partial = lookup_commit_reference(oid.hash)))
+               die(_("could not find commit from NOTES_MERGE_PARTIAL."));
        else if (parse_commit(partial))
-               die("Could not parse commit from NOTES_MERGE_PARTIAL.");
+               die(_("could not parse commit from NOTES_MERGE_PARTIAL."));
 
        if (partial->parents)
-               hashcpy(parent_sha1, partial->parents->item->object.oid.hash);
+               oidcpy(&parent_oid, &partial->parents->item->object.oid);
        else
-               hashclr(parent_sha1);
+               oidclr(&parent_oid);
 
        t = xcalloc(1, sizeof(struct notes_tree));
        init_notes(t, "NOTES_MERGE_PARTIAL", combine_notes_overwrite, 0);
 
        o->local_ref = local_ref_to_free =
-               resolve_refdup("NOTES_MERGE_REF", 0, sha1, NULL);
+               resolve_refdup("NOTES_MERGE_REF", 0, oid.hash, NULL);
        if (!o->local_ref)
-               die("Failed to resolve NOTES_MERGE_REF");
+               die(_("failed to resolve NOTES_MERGE_REF"));
 
-       if (notes_merge_commit(o, t, partial, sha1))
-               die("Failed to finalize notes merge");
+       if (notes_merge_commit(o, t, partial, oid.hash))
+               die(_("failed to finalize notes merge"));
 
        /* Reuse existing commit message in reflog message */
        memset(&pretty_ctx, 0, sizeof(pretty_ctx));
        format_commit_message(partial, "%s", &msg, &pretty_ctx);
        strbuf_trim(&msg);
        strbuf_insert(&msg, 0, "notes: ", 7);
-       update_ref(msg.buf, o->local_ref, sha1,
-                  is_null_sha1(parent_sha1) ? NULL : parent_sha1,
+       update_ref(msg.buf, o->local_ref, oid.hash,
+                  is_null_oid(&parent_oid) ? NULL : parent_oid.hash,
                   0, UPDATE_REFS_DIE_ON_ERR);
 
        free_notes(t);
@@ -794,7 +797,7 @@ static int merge(int argc, const char **argv, const char *prefix)
        }
 
        if (do_merge && argc != 1) {
-               error(_("Must specify a notes ref to merge"));
+               error(_("must specify a notes ref to merge"));
                usage_with_options(git_notes_merge_usage, options);
        } else if (!do_merge && argc) {
                error(_("too many parameters"));
@@ -818,7 +821,7 @@ static int merge(int argc, const char **argv, const char *prefix)
 
        if (strategy) {
                if (parse_notes_merge_strategy(strategy, &o.strategy)) {
-                       error(_("Unknown -s/--strategy: %s"), strategy);
+                       error(_("unknown -s/--strategy: %s"), strategy);
                        usage_with_options(git_notes_merge_usage, options);
                }
        } else {
@@ -855,10 +858,10 @@ static int merge(int argc, const char **argv, const char *prefix)
                /* Store ref-to-be-updated into .git/NOTES_MERGE_REF */
                wt = find_shared_symref("NOTES_MERGE_REF", default_notes_ref());
                if (wt)
-                       die(_("A notes merge into %s is already in-progress at %s"),
+                       die(_("a notes merge into %s is already in-progress at %s"),
                            default_notes_ref(), wt->path);
                if (create_symref("NOTES_MERGE_REF", default_notes_ref(), NULL))
-                       die(_("Failed to store link to current notes ref (%s)"),
+                       die(_("failed to store link to current notes ref (%s)"),
                            default_notes_ref());
                printf(_("Automatic notes merge failed. Fix conflicts in %s and "
                         "commit the result with 'git notes merge --commit', or "
@@ -1014,7 +1017,7 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
        else if (!strcmp(argv[0], "get-ref"))
                result = get_ref(argc, argv, prefix);
        else {
-               result = error(_("Unknown subcommand: %s"), argv[0]);
+               result = error(_("unknown subcommand: %s"), argv[0]);
                usage_with_options(git_notes_usage, options);
        }
 
index 0954375be9ea5fe2b416d4142b6987ff2b5ec94f..50e01aa80ec7f56b32d47e841e1548c174501bc2 100644 (file)
@@ -23,6 +23,7 @@
 #include "reachable.h"
 #include "sha1-array.h"
 #include "argv-array.h"
+#include "mru.h"
 
 static const char *pack_usage[] = {
        N_("git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"),
@@ -60,14 +61,13 @@ static int delta_search_threads;
 static int pack_to_stdout;
 static int num_preferred_base;
 static struct progress *progress_state;
-static int pack_compression_level = Z_DEFAULT_COMPRESSION;
-static int pack_compression_seen;
 
 static struct packed_git *reuse_packfile;
 static uint32_t reuse_packfile_objects;
 static off_t reuse_packfile_offset;
 
-static int use_bitmap_index = 1;
+static int use_bitmap_index_default = 1;
+static int use_bitmap_index = -1;
 static int write_bitmap_index;
 static uint16_t write_bitmap_options;
 
@@ -239,7 +239,8 @@ static unsigned long write_no_reuse_object(struct sha1file *f, struct object_ent
                                           unsigned long limit, int usable_delta)
 {
        unsigned long size, datalen;
-       unsigned char header[10], dheader[10];
+       unsigned char header[MAX_PACK_OBJECT_HEADER],
+                     dheader[MAX_PACK_OBJECT_HEADER];
        unsigned hdrlen;
        enum object_type type;
        void *buf;
@@ -286,7 +287,8 @@ static unsigned long write_no_reuse_object(struct sha1file *f, struct object_ent
         * The object header is a byte of 'type' followed by zero or
         * more bytes of length.
         */
-       hdrlen = encode_in_pack_object_header(type, size, header);
+       hdrlen = encode_in_pack_object_header(header, sizeof(header),
+                                             type, size);
 
        if (type == OBJ_OFS_DELTA) {
                /*
@@ -352,13 +354,15 @@ static off_t write_reuse_object(struct sha1file *f, struct object_entry *entry,
        off_t offset;
        enum object_type type = entry->type;
        off_t datalen;
-       unsigned char header[10], dheader[10];
+       unsigned char header[MAX_PACK_OBJECT_HEADER],
+                     dheader[MAX_PACK_OBJECT_HEADER];
        unsigned hdrlen;
 
        if (entry->delta)
                type = (allow_ofs_delta && entry->delta->idx.offset) ?
                        OBJ_OFS_DELTA : OBJ_REF_DELTA;
-       hdrlen = encode_in_pack_object_header(type, entry->size, header);
+       hdrlen = encode_in_pack_object_header(header, sizeof(header),
+                                             type, entry->size);
 
        offset = entry->in_pack_offset;
        revidx = find_pack_revindex(p, offset);
@@ -718,7 +722,7 @@ static off_t write_reused_pack(struct sha1file *f)
        if (!is_pack_valid(reuse_packfile))
                die("packfile is invalid: %s", reuse_packfile->pack_name);
 
-       fd = git_open_noatime(reuse_packfile->pack_name);
+       fd = git_open(reuse_packfile->pack_name);
        if (fd < 0)
                die_errno("unable to open packfile for reuse: %s",
                          reuse_packfile->pack_name);
@@ -894,24 +898,15 @@ static void write_pack_file(void)
                        written, nr_result);
 }
 
-static void setup_delta_attr_check(struct git_attr_check *check)
-{
-       static struct git_attr *attr_delta;
-
-       if (!attr_delta)
-               attr_delta = git_attr("delta");
-
-       check[0].attr = attr_delta;
-}
-
 static int no_try_delta(const char *path)
 {
-       struct git_attr_check check[1];
+       static struct attr_check *check;
 
-       setup_delta_attr_check(check);
-       if (git_check_attr(path, ARRAY_SIZE(check), check))
+       if (!check)
+               check = attr_check_initl("delta", NULL);
+       if (git_check_attr(path, check))
                return 0;
-       if (ATTR_FALSE(check->value))
+       if (ATTR_FALSE(check->items[0].value))
                return 1;
        return 0;
 }
@@ -945,29 +940,80 @@ static int have_duplicate_entry(const unsigned char *sha1,
        return 1;
 }
 
+static int want_found_object(int exclude, struct packed_git *p)
+{
+       if (exclude)
+               return 1;
+       if (incremental)
+               return 0;
+
+       /*
+        * When asked to do --local (do not include an object that appears in a
+        * pack we borrow from elsewhere) or --honor-pack-keep (do not include
+        * an object that appears in a pack marked with .keep), finding a pack
+        * that matches the criteria is sufficient for us to decide to omit it.
+        * However, even if this pack does not satisfy the criteria, we need to
+        * make sure no copy of this object appears in _any_ pack that makes us
+        * to omit the object, so we need to check all the packs.
+        *
+        * We can however first check whether these options can possible matter;
+        * if they do not matter we know we want the object in generated pack.
+        * Otherwise, we signal "-1" at the end to tell the caller that we do
+        * not know either way, and it needs to check more packs.
+        */
+       if (!ignore_packed_keep &&
+           (!local || !have_non_local_packs))
+               return 1;
+
+       if (local && !p->pack_local)
+               return 0;
+       if (ignore_packed_keep && p->pack_local && p->pack_keep)
+               return 0;
+
+       /* we don't know yet; keep looking for more packs */
+       return -1;
+}
+
 /*
  * Check whether we want the object in the pack (e.g., we do not want
  * objects found in non-local stores if the "--local" option was used).
  *
- * As a side effect of this check, we will find the packed version of this
- * object, if any. We therefore pass out the pack information to avoid having
- * to look it up again later.
+ * If the caller already knows an existing pack it wants to take the object
+ * from, that is passed in *found_pack and *found_offset; otherwise this
+ * function finds if there is any pack that has the object and returns the pack
+ * and its offset in these variables.
  */
 static int want_object_in_pack(const unsigned char *sha1,
                               int exclude,
                               struct packed_git **found_pack,
                               off_t *found_offset)
 {
-       struct packed_git *p;
+       struct mru_entry *entry;
+       int want;
 
        if (!exclude && local && has_loose_object_nonlocal(sha1))
                return 0;
 
-       *found_pack = NULL;
-       *found_offset = 0;
+       /*
+        * If we already know the pack object lives in, start checks from that
+        * pack - in the usual case when neither --local was given nor .keep files
+        * are present we will determine the answer right now.
+        */
+       if (*found_pack) {
+               want = want_found_object(exclude, *found_pack);
+               if (want != -1)
+                       return want;
+       }
+
+       for (entry = packed_git_mru->head; entry; entry = entry->next) {
+               struct packed_git *p = entry->item;
+               off_t offset;
+
+               if (p == *found_pack)
+                       offset = *found_offset;
+               else
+                       offset = find_pack_entry_one(sha1, p);
 
-       for (p = packed_git; p; p = p->next) {
-               off_t offset = find_pack_entry_one(sha1, p);
                if (offset) {
                        if (!*found_pack) {
                                if (!is_pack_valid(p))
@@ -975,31 +1021,11 @@ static int want_object_in_pack(const unsigned char *sha1,
                                *found_offset = offset;
                                *found_pack = p;
                        }
-                       if (exclude)
-                               return 1;
-                       if (incremental)
-                               return 0;
-
-                       /*
-                        * When asked to do --local (do not include an
-                        * object that appears in a pack we borrow
-                        * from elsewhere) or --honor-pack-keep (do not
-                        * include an object that appears in a pack marked
-                        * with .keep), we need to make sure no copy of this
-                        * object come from in _any_ pack that causes us to
-                        * omit it, and need to complete this loop.  When
-                        * neither option is in effect, we know the object
-                        * we just found is going to be packed, so break
-                        * out of the loop to return 1 now.
-                        */
-                       if (!ignore_packed_keep &&
-                           (!local || !have_non_local_packs))
-                               break;
-
-                       if (local && !p->pack_local)
-                               return 0;
-                       if (ignore_packed_keep && p->pack_local && p->pack_keep)
-                               return 0;
+                       want = want_found_object(exclude, p);
+                       if (!exclude && want > 0)
+                               mru_mark(packed_git_mru, entry);
+                       if (want != -1)
+                               return want;
                }
        }
 
@@ -1040,8 +1066,8 @@ static const char no_closure_warning[] = N_(
 static int add_object_entry(const unsigned char *sha1, enum object_type type,
                            const char *name, int exclude)
 {
-       struct packed_git *found_pack;
-       off_t found_offset;
+       struct packed_git *found_pack = NULL;
+       off_t found_offset = 0;
        uint32_t index_pos;
 
        if (have_duplicate_entry(sha1, exclude, &index_pos))
@@ -1074,6 +1100,9 @@ static int add_object_entry_from_bitmap(const unsigned char *sha1,
        if (have_duplicate_entry(sha1, 0, &index_pos))
                return 0;
 
+       if (!want_object_in_pack(sha1, 0, &pack, &offset))
+               return 0;
+
        create_object_entry(sha1, type, name_hash, 0, 0, index_pos, pack, offset);
 
        display_progress(progress_state, nr_result);
@@ -1495,6 +1524,170 @@ static int pack_offset_sort(const void *_a, const void *_b)
                        (a->in_pack_offset > b->in_pack_offset);
 }
 
+/*
+ * Drop an on-disk delta we were planning to reuse. Naively, this would
+ * just involve blanking out the "delta" field, but we have to deal
+ * with some extra book-keeping:
+ *
+ *   1. Removing ourselves from the delta_sibling linked list.
+ *
+ *   2. Updating our size/type to the non-delta representation. These were
+ *      either not recorded initially (size) or overwritten with the delta type
+ *      (type) when check_object() decided to reuse the delta.
+ *
+ *   3. Resetting our delta depth, as we are now a base object.
+ */
+static void drop_reused_delta(struct object_entry *entry)
+{
+       struct object_entry **p = &entry->delta->delta_child;
+       struct object_info oi = OBJECT_INFO_INIT;
+
+       while (*p) {
+               if (*p == entry)
+                       *p = (*p)->delta_sibling;
+               else
+                       p = &(*p)->delta_sibling;
+       }
+       entry->delta = NULL;
+       entry->depth = 0;
+
+       oi.sizep = &entry->size;
+       oi.typep = &entry->type;
+       if (packed_object_info(entry->in_pack, entry->in_pack_offset, &oi) < 0) {
+               /*
+                * We failed to get the info from this pack for some reason;
+                * fall back to sha1_object_info, which may find another copy.
+                * And if that fails, the error will be recorded in entry->type
+                * and dealt with in prepare_pack().
+                */
+               entry->type = sha1_object_info(entry->idx.sha1, &entry->size);
+       }
+}
+
+/*
+ * Follow the chain of deltas from this entry onward, throwing away any links
+ * that cause us to hit a cycle (as determined by the DFS state flags in
+ * the entries).
+ *
+ * We also detect too-long reused chains that would violate our --depth
+ * limit.
+ */
+static void break_delta_chains(struct object_entry *entry)
+{
+       /*
+        * The actual depth of each object we will write is stored as an int,
+        * as it cannot exceed our int "depth" limit. But before we break
+        * changes based no that limit, we may potentially go as deep as the
+        * number of objects, which is elsewhere bounded to a uint32_t.
+        */
+       uint32_t total_depth;
+       struct object_entry *cur, *next;
+
+       for (cur = entry, total_depth = 0;
+            cur;
+            cur = cur->delta, total_depth++) {
+               if (cur->dfs_state == DFS_DONE) {
+                       /*
+                        * We've already seen this object and know it isn't
+                        * part of a cycle. We do need to append its depth
+                        * to our count.
+                        */
+                       total_depth += cur->depth;
+                       break;
+               }
+
+               /*
+                * We break cycles before looping, so an ACTIVE state (or any
+                * other cruft which made its way into the state variable)
+                * is a bug.
+                */
+               if (cur->dfs_state != DFS_NONE)
+                       die("BUG: confusing delta dfs state in first pass: %d",
+                           cur->dfs_state);
+
+               /*
+                * Now we know this is the first time we've seen the object. If
+                * it's not a delta, we're done traversing, but we'll mark it
+                * done to save time on future traversals.
+                */
+               if (!cur->delta) {
+                       cur->dfs_state = DFS_DONE;
+                       break;
+               }
+
+               /*
+                * Mark ourselves as active and see if the next step causes
+                * us to cycle to another active object. It's important to do
+                * this _before_ we loop, because it impacts where we make the
+                * cut, and thus how our total_depth counter works.
+                * E.g., We may see a partial loop like:
+                *
+                *   A -> B -> C -> D -> B
+                *
+                * Cutting B->C breaks the cycle. But now the depth of A is
+                * only 1, and our total_depth counter is at 3. The size of the
+                * error is always one less than the size of the cycle we
+                * broke. Commits C and D were "lost" from A's chain.
+                *
+                * If we instead cut D->B, then the depth of A is correct at 3.
+                * We keep all commits in the chain that we examined.
+                */
+               cur->dfs_state = DFS_ACTIVE;
+               if (cur->delta->dfs_state == DFS_ACTIVE) {
+                       drop_reused_delta(cur);
+                       cur->dfs_state = DFS_DONE;
+                       break;
+               }
+       }
+
+       /*
+        * And now that we've gone all the way to the bottom of the chain, we
+        * need to clear the active flags and set the depth fields as
+        * appropriate. Unlike the loop above, which can quit when it drops a
+        * delta, we need to keep going to look for more depth cuts. So we need
+        * an extra "next" pointer to keep going after we reset cur->delta.
+        */
+       for (cur = entry; cur; cur = next) {
+               next = cur->delta;
+
+               /*
+                * We should have a chain of zero or more ACTIVE states down to
+                * a final DONE. We can quit after the DONE, because either it
+                * has no bases, or we've already handled them in a previous
+                * call.
+                */
+               if (cur->dfs_state == DFS_DONE)
+                       break;
+               else if (cur->dfs_state != DFS_ACTIVE)
+                       die("BUG: confusing delta dfs state in second pass: %d",
+                           cur->dfs_state);
+
+               /*
+                * If the total_depth is more than depth, then we need to snip
+                * the chain into two or more smaller chains that don't exceed
+                * the maximum depth. Most of the resulting chains will contain
+                * (depth + 1) entries (i.e., depth deltas plus one base), and
+                * the last chain (i.e., the one containing entry) will contain
+                * whatever entries are left over, namely
+                * (total_depth % (depth + 1)) of them.
+                *
+                * Since we are iterating towards decreasing depth, we need to
+                * decrement total_depth as we go, and we need to write to the
+                * entry what its final depth will be after all of the
+                * snipping. Since we're snipping into chains of length (depth
+                * + 1) entries, the final depth of an entry will be its
+                * original depth modulo (depth + 1). Any time we encounter an
+                * entry whose final depth is supposed to be zero, we snip it
+                * from its delta base, thereby making it so.
+                */
+               cur->depth = (total_depth--) % (depth + 1);
+               if (!cur->depth)
+                       drop_reused_delta(cur);
+
+               cur->dfs_state = DFS_DONE;
+       }
+}
+
 static void get_object_details(void)
 {
        uint32_t i;
@@ -1503,7 +1696,7 @@ static void get_object_details(void)
        sorted_by_offset = xcalloc(to_pack.nr_objects, sizeof(struct object_entry *));
        for (i = 0; i < to_pack.nr_objects; i++)
                sorted_by_offset[i] = to_pack.objects + i;
-       qsort(sorted_by_offset, to_pack.nr_objects, sizeof(*sorted_by_offset), pack_offset_sort);
+       QSORT(sorted_by_offset, to_pack.nr_objects, pack_offset_sort);
 
        for (i = 0; i < to_pack.nr_objects; i++) {
                struct object_entry *entry = sorted_by_offset[i];
@@ -1512,6 +1705,13 @@ static void get_object_details(void)
                        entry->no_try_delta = 1;
        }
 
+       /*
+        * This must happen in a second pass, since we rely on the delta
+        * information for the whole list being completed.
+        */
+       for (i = 0; i < to_pack.nr_objects; i++)
+               break_delta_chains(&to_pack.objects[i]);
+
        free(sorted_by_offset);
 }
 
@@ -2225,7 +2425,7 @@ static void prepare_pack(int window, int depth)
                if (progress)
                        progress_state = start_progress(_("Compressing objects"),
                                                        nr_deltas);
-               qsort(delta_list, n, sizeof(*delta_list), type_size_sort);
+               QSORT(delta_list, n, type_size_sort);
                ll_find_deltas(delta_list, n, window+1, depth, &nr_done);
                stop_progress(&progress_state);
                if (nr_done != nr_deltas)
@@ -2248,16 +2448,6 @@ static int git_pack_config(const char *k, const char *v, void *cb)
                depth = git_config_int(k, v);
                return 0;
        }
-       if (!strcmp(k, "pack.compression")) {
-               int level = git_config_int(k, v);
-               if (level == -1)
-                       level = Z_DEFAULT_COMPRESSION;
-               else if (level < 0 || level > Z_BEST_COMPRESSION)
-                       die("bad pack compression level %d", level);
-               pack_compression_level = level;
-               pack_compression_seen = 1;
-               return 0;
-       }
        if (!strcmp(k, "pack.deltacachesize")) {
                max_delta_cache_size = git_config_int(k, v);
                return 0;
@@ -2273,7 +2463,7 @@ static int git_pack_config(const char *k, const char *v, void *cb)
                        write_bitmap_options &= ~BITMAP_OPT_HASH_CACHE;
        }
        if (!strcmp(k, "pack.usebitmaps")) {
-               use_bitmap_index = git_config_bool(k, v);
+               use_bitmap_index_default = git_config_bool(k, v);
                return 0;
        }
        if (!strcmp(k, "pack.threads")) {
@@ -2417,8 +2607,7 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs)
        }
 
        if (in_pack.nr) {
-               qsort(in_pack.array, in_pack.nr, sizeof(in_pack.array[0]),
-                     ofscmp);
+               QSORT(in_pack.array, in_pack.nr, ofscmp);
                for (i = 0; i < in_pack.nr; i++) {
                        struct object *o = in_pack.array[i].object;
                        add_object_entry(o->oid.hash, o->type, "", 0);
@@ -2427,17 +2616,17 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs)
        free(in_pack.array);
 }
 
-static int add_loose_object(const unsigned char *sha1, const char *path,
+static int add_loose_object(const struct object_id *oid, const char *path,
                            void *data)
 {
-       enum object_type type = sha1_object_info(sha1, NULL);
+       enum object_type type = sha1_object_info(oid->hash, NULL);
 
        if (type < 0) {
                warning("loose object at %s could not be examined", path);
                return 0;
        }
 
-       add_object_entry(sha1, type, "", 0);
+       add_object_entry(oid->hash, type, "", 0);
        return 0;
 }
 
@@ -2483,16 +2672,16 @@ static int has_sha1_pack_kept_or_nonlocal(const unsigned char *sha1)
  *
  * This is filled by get_object_list.
  */
-static struct sha1_array recent_objects;
+static struct oid_array recent_objects;
 
-static int loosened_object_can_be_discarded(const unsigned char *sha1,
+static int loosened_object_can_be_discarded(const struct object_id *oid,
                                            unsigned long mtime)
 {
        if (!unpack_unreachable_expiration)
                return 0;
        if (mtime > unpack_unreachable_expiration)
                return 0;
-       if (sha1_array_lookup(&recent_objects, sha1) >= 0)
+       if (oid_array_lookup(&recent_objects, oid) >= 0)
                return 0;
        return 1;
 }
@@ -2501,7 +2690,7 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
 {
        struct packed_git *p;
        uint32_t i;
-       const unsigned char *sha1;
+       struct object_id oid;
 
        for (p = packed_git; p; p = p->next) {
                if (!p->pack_local || p->pack_keep)
@@ -2511,24 +2700,28 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
                        die("cannot open pack index");
 
                for (i = 0; i < p->num_objects; i++) {
-                       sha1 = nth_packed_object_sha1(p, i);
-                       if (!packlist_find(&to_pack, sha1, NULL) &&
-                           !has_sha1_pack_kept_or_nonlocal(sha1) &&
-                           !loosened_object_can_be_discarded(sha1, p->mtime))
-                               if (force_object_loose(sha1, p->mtime))
+                       nth_packed_object_oid(&oid, p, i);
+                       if (!packlist_find(&to_pack, oid.hash, NULL) &&
+                           !has_sha1_pack_kept_or_nonlocal(oid.hash) &&
+                           !loosened_object_can_be_discarded(&oid, p->mtime))
+                               if (force_object_loose(oid.hash, p->mtime))
                                        die("unable to force loose object");
                }
        }
 }
 
 /*
- * This tracks any options which a reader of the pack might
- * not understand, and which would therefore prevent blind reuse
- * of what we have on disk.
+ * This tracks any options which pack-reuse code expects to be on, or which a
+ * reader of the pack might not understand, and which would therefore prevent
+ * blind reuse of what we have on disk.
  */
 static int pack_options_allow_reuse(void)
 {
-       return allow_ofs_delta;
+       return pack_to_stdout &&
+              allow_ofs_delta &&
+              !ignore_packed_keep &&
+              (!local || !have_non_local_packs) &&
+              !incremental;
 }
 
 static int get_object_list_from_bitmap(struct rev_info *revs)
@@ -2554,12 +2747,12 @@ static void record_recent_object(struct object *obj,
                                 const char *name,
                                 void *data)
 {
-       sha1_array_append(&recent_objects, obj->oid.hash);
+       oid_array_append(&recent_objects, &obj->oid);
 }
 
 static void record_recent_commit(struct commit *commit, void *data)
 {
-       sha1_array_append(&recent_objects, commit->object.oid.hash);
+       oid_array_append(&recent_objects, &commit->object.oid);
 }
 
 static void get_object_list(int ac, const char **av)
@@ -2627,7 +2820,7 @@ static void get_object_list(int ac, const char **av)
        if (unpack_unreachable)
                loosen_unused_packed_objects(&revs);
 
-       sha1_array_clear(&recent_objects);
+       oid_array_clear(&recent_objects);
 }
 
 static int option_parse_index_version(const struct option *opt,
@@ -2750,8 +2943,6 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 
        reset_pack_idx_option(&pack_idx_opts);
        git_config(git_pack_config, NULL);
-       if (!pack_compression_seen && core_compression_seen)
-               pack_compression_level = core_compression_level;
 
        progress = isatty(2);
        argc = parse_options(argc, argv, prefix, pack_objects_options,
@@ -2821,7 +3012,23 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
        if (!rev_list_all || !rev_list_reflog || !rev_list_index)
                unpack_unreachable_expiration = 0;
 
-       if (!use_internal_rev_list || !pack_to_stdout || is_repository_shallow())
+       /*
+        * "soft" reasons not to use bitmaps - for on-disk repack by default we want
+        *
+        * - to produce good pack (with bitmap index not-yet-packed objects are
+        *   packed in suboptimal order).
+        *
+        * - to use more robust pack-generation codepath (avoiding possible
+        *   bugs in bitmap code and possible bitmap index corruption).
+        */
+       if (!pack_to_stdout)
+               use_bitmap_index_default = 0;
+
+       if (use_bitmap_index < 0)
+               use_bitmap_index = use_bitmap_index_default;
+
+       /* "hard" reasons not to use bitmaps; these just won't work at all */
+       if (!use_internal_rev_list || (!pack_to_stdout && write_bitmap_index) || is_repository_shallow())
                use_bitmap_index = 0;
 
        if (pack_to_stdout || !rev_list_all)
index 72c815844dd2abe7f2b4bc5a641eb692d2a45103..cb1df1c7614b4a91f2ed39ffe1f31dfdbcbe793e 100644 (file)
@@ -442,6 +442,7 @@ static void minimize(struct pack_list **min)
        /* return if there are no objects missing from the unique set */
        if (missing->size == 0) {
                *min = unique;
+               free(missing);
                return;
        }
 
index 39f9a55d16736d93b43e6aa16a33634039e55de4..b106a392a481570d4fda5a1116c523cde34557ba 100644 (file)
@@ -17,5 +17,5 @@ int cmd_pack_refs(int argc, const char **argv, const char *prefix)
        };
        if (parse_options(argc, argv, prefix, opts, pack_refs_usage, 0))
                usage_with_options(pack_refs_usage, opts);
-       return pack_refs(flags);
+       return refs_pack_refs(get_main_ref_store(), flags);
 }
index a84d0003a3087c842b6eab6a987a93eebaddec79..81552e02e412b53fcb50ffa6a4d5949acdaac79c 100644 (file)
@@ -55,7 +55,7 @@ static int scan_hunk_header(const char *p, int *p_before, int *p_after)
 
 static void flush_one_hunk(struct object_id *result, git_SHA_CTX *ctx)
 {
-       unsigned char hash[GIT_SHA1_RAWSZ];
+       unsigned char hash[GIT_MAX_RAWSZ];
        unsigned short carry = 0;
        int i;
 
index 7cf900ea0765e334f02df5600f0911d41563a027..c026299e789abe19826264225fa2000b3149f875 100644 (file)
@@ -19,12 +19,12 @@ static int prune_subdir(int nr, const char *path, void *data)
        return 0;
 }
 
-static int prune_object(const unsigned char *sha1, const char *path,
+static int prune_object(const struct object_id *oid, const char *path,
                         void *data)
 {
        int *opts = data;
 
-       if (!has_sha1_pack(sha1))
+       if (!has_sha1_pack(oid->hash))
                return 0;
 
        if (*opts & PRUNE_PACKED_DRY_RUN)
index 8f4f0522856b988a8798fd65c6d81d8826709aa2..42633e0c6e672c46852f0590f1941249691f962c 100644 (file)
@@ -30,7 +30,7 @@ static int prune_tmp_file(const char *fullpath)
        return 0;
 }
 
-static int prune_object(const unsigned char *sha1, const char *fullpath,
+static int prune_object(const struct object_id *oid, const char *fullpath,
                        void *data)
 {
        struct stat st;
@@ -39,7 +39,7 @@ static int prune_object(const unsigned char *sha1, const char *fullpath,
         * Do we know about this object?
         * It must have been reachable
         */
-       if (lookup_object(sha1))
+       if (lookup_object(oid->hash))
                return 0;
 
        if (lstat(fullpath, &st)) {
@@ -50,8 +50,8 @@ static int prune_object(const unsigned char *sha1, const char *fullpath,
        if (st.st_mtime > expire)
                return 0;
        if (show_only || verbose) {
-               enum object_type type = sha1_object_info(sha1, NULL);
-               printf("%s %s\n", sha1_to_hex(sha1),
+               enum object_type type = sha1_object_info(oid->hash, NULL);
+               printf("%s %s\n", oid_to_hex(oid),
                       (type > 0) ? typename(type) : "unknown");
        }
        if (!show_only)
index 398aae16c006f5386ba6d65e3ef266b4ddfe1e74..42f0560252e000310aa8cc8e674890a09a90b471 100644 (file)
@@ -17,6 +17,7 @@
 #include "revision.h"
 #include "tempfile.h"
 #include "lockfile.h"
+#include "wt-status.h"
 
 enum rebase_type {
        REBASE_INVALID = -1,
@@ -325,92 +326,25 @@ static int git_pull_config(const char *var, const char *value, void *cb)
        return git_default_config(var, value, cb);
 }
 
-/**
- * Returns 1 if there are unstaged changes, 0 otherwise.
- */
-static int has_unstaged_changes(const char *prefix)
-{
-       struct rev_info rev_info;
-       int result;
-
-       init_revisions(&rev_info, prefix);
-       DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
-       DIFF_OPT_SET(&rev_info.diffopt, QUICK);
-       diff_setup_done(&rev_info.diffopt);
-       result = run_diff_files(&rev_info, 0);
-       return diff_result_code(&rev_info.diffopt, result);
-}
-
-/**
- * Returns 1 if there are uncommitted changes, 0 otherwise.
- */
-static int has_uncommitted_changes(const char *prefix)
-{
-       struct rev_info rev_info;
-       int result;
-
-       if (is_cache_unborn())
-               return 0;
-
-       init_revisions(&rev_info, prefix);
-       DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
-       DIFF_OPT_SET(&rev_info.diffopt, QUICK);
-       add_head_to_pending(&rev_info);
-       diff_setup_done(&rev_info.diffopt);
-       result = run_diff_index(&rev_info, 1);
-       return diff_result_code(&rev_info.diffopt, result);
-}
-
-/**
- * If the work tree has unstaged or uncommitted changes, dies with the
- * appropriate message.
- */
-static void die_on_unclean_work_tree(const char *prefix)
-{
-       struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
-       int do_die = 0;
-
-       hold_locked_index(lock_file, 0);
-       refresh_cache(REFRESH_QUIET);
-       update_index_if_able(&the_index, lock_file);
-       rollback_lock_file(lock_file);
-
-       if (has_unstaged_changes(prefix)) {
-               error(_("Cannot pull with rebase: You have unstaged changes."));
-               do_die = 1;
-       }
-
-       if (has_uncommitted_changes(prefix)) {
-               if (do_die)
-                       error(_("Additionally, your index contains uncommitted changes."));
-               else
-                       error(_("Cannot pull with rebase: Your index contains uncommitted changes."));
-               do_die = 1;
-       }
-
-       if (do_die)
-               exit(1);
-}
-
 /**
  * Appends merge candidates from FETCH_HEAD that are not marked not-for-merge
  * into merge_heads.
  */
-static void get_merge_heads(struct sha1_array *merge_heads)
+static void get_merge_heads(struct oid_array *merge_heads)
 {
-       const char *filename = git_path("FETCH_HEAD");
+       const char *filename = git_path_fetch_head();
        FILE *fp;
        struct strbuf sb = STRBUF_INIT;
-       unsigned char sha1[GIT_SHA1_RAWSZ];
+       struct object_id oid;
 
        if (!(fp = fopen(filename, "r")))
                die_errno(_("could not open '%s' for reading"), filename);
        while (strbuf_getline_lf(&sb, fp) != EOF) {
-               if (get_sha1_hex(sb.buf, sha1))
+               if (get_oid_hex(sb.buf, &oid))
                        continue;  /* invalid line: does not start with SHA1 */
                if (starts_with(sb.buf + GIT_SHA1_HEXSZ, "\tnot-for-merge\t"))
                        continue;  /* ref is not-for-merge */
-               sha1_array_append(merge_heads, sha1);
+               oid_array_append(merge_heads, &oid);
        }
        fclose(fp);
        strbuf_release(&sb);
@@ -580,8 +514,8 @@ static int run_fetch(const char *repo, const char **refspecs)
 /**
  * "Pulls into void" by branching off merge_head.
  */
-static int pull_into_void(const unsigned char *merge_head,
-               const unsigned char *curr_head)
+static int pull_into_void(const struct object_id *merge_head,
+               const struct object_id *curr_head)
 {
        /*
         * Two-way merge: we treat the index as based on an empty tree,
@@ -589,10 +523,10 @@ static int pull_into_void(const unsigned char *merge_head,
         * index/worktree changes that the user already made on the unborn
         * branch.
         */
-       if (checkout_fast_forward(EMPTY_TREE_SHA1_BIN, merge_head, 0))
+       if (checkout_fast_forward(EMPTY_TREE_SHA1_BIN, merge_head->hash, 0))
                return 1;
 
-       if (update_ref("initial pull", "HEAD", merge_head, curr_head, 0, UPDATE_REFS_DIE_ON_ERR))
+       if (update_ref("initial pull", "HEAD", merge_head->hash, curr_head->hash, 0, UPDATE_REFS_DIE_ON_ERR))
                return 1;
 
        return 0;
@@ -713,7 +647,7 @@ static const char *get_tracking_branch(const char *remote, const char *refspec)
  * current branch forked from its remote tracking branch. Returns 0 on success,
  * -1 on failure.
  */
-static int get_rebase_fork_point(unsigned char *fork_point, const char *repo,
+static int get_rebase_fork_point(struct object_id *fork_point, const char *repo,
                const char *refspec)
 {
        int ret;
@@ -744,7 +678,7 @@ static int get_rebase_fork_point(unsigned char *fork_point, const char *repo,
        if (ret)
                goto cleanup;
 
-       ret = get_sha1_hex(sb.buf, fork_point);
+       ret = get_oid_hex(sb.buf, fork_point);
        if (ret)
                goto cleanup;
 
@@ -757,24 +691,24 @@ cleanup:
  * Sets merge_base to the octopus merge base of curr_head, merge_head and
  * fork_point. Returns 0 if a merge base is found, 1 otherwise.
  */
-static int get_octopus_merge_base(unsigned char *merge_base,
-               const unsigned char *curr_head,
-               const unsigned char *merge_head,
-               const unsigned char *fork_point)
+static int get_octopus_merge_base(struct object_id *merge_base,
+               const struct object_id *curr_head,
+               const struct object_id *merge_head,
+               const struct object_id *fork_point)
 {
        struct commit_list *revs = NULL, *result;
 
-       commit_list_insert(lookup_commit_reference(curr_head), &revs);
-       commit_list_insert(lookup_commit_reference(merge_head), &revs);
-       if (!is_null_sha1(fork_point))
-               commit_list_insert(lookup_commit_reference(fork_point), &revs);
+       commit_list_insert(lookup_commit_reference(curr_head->hash), &revs);
+       commit_list_insert(lookup_commit_reference(merge_head->hash), &revs);
+       if (!is_null_oid(fork_point))
+               commit_list_insert(lookup_commit_reference(fork_point->hash), &revs);
 
        result = reduce_heads(get_octopus_merge_bases(revs));
        free_commit_list(revs);
        if (!result)
                return 1;
 
-       hashcpy(merge_base, result->item->object.oid.hash);
+       oidcpy(merge_base, &result->item->object.oid);
        return 0;
 }
 
@@ -783,16 +717,16 @@ static int get_octopus_merge_base(unsigned char *merge_base,
  * fork point calculated by get_rebase_fork_point(), runs git-rebase with the
  * appropriate arguments and returns its exit status.
  */
-static int run_rebase(const unsigned char *curr_head,
-               const unsigned char *merge_head,
-               const unsigned char *fork_point)
+static int run_rebase(const struct object_id *curr_head,
+               const struct object_id *merge_head,
+               const struct object_id *fork_point)
 {
        int ret;
-       unsigned char oct_merge_base[GIT_SHA1_RAWSZ];
+       struct object_id oct_merge_base;
        struct argv_array args = ARGV_ARRAY_INIT;
 
-       if (!get_octopus_merge_base(oct_merge_base, curr_head, merge_head, fork_point))
-               if (!is_null_sha1(fork_point) && !hashcmp(oct_merge_base, fork_point))
+       if (!get_octopus_merge_base(&oct_merge_base, curr_head, merge_head, fork_point))
+               if (!is_null_oid(fork_point) && !oidcmp(&oct_merge_base, fork_point))
                        fork_point = NULL;
 
        argv_array_push(&args, "rebase");
@@ -820,12 +754,12 @@ static int run_rebase(const unsigned char *curr_head,
                warning(_("ignoring --verify-signatures for rebase"));
 
        argv_array_push(&args, "--onto");
-       argv_array_push(&args, sha1_to_hex(merge_head));
+       argv_array_push(&args, oid_to_hex(merge_head));
 
-       if (fork_point && !is_null_sha1(fork_point))
-               argv_array_push(&args, sha1_to_hex(fork_point));
+       if (fork_point && !is_null_oid(fork_point))
+               argv_array_push(&args, oid_to_hex(fork_point));
        else
-               argv_array_push(&args, sha1_to_hex(merge_head));
+               argv_array_push(&args, oid_to_hex(merge_head));
 
        ret = run_command_v_opt(args.argv, RUN_GIT_CMD);
        argv_array_clear(&args);
@@ -835,9 +769,10 @@ static int run_rebase(const unsigned char *curr_head,
 int cmd_pull(int argc, const char **argv, const char *prefix)
 {
        const char *repo, **refspecs;
-       struct sha1_array merge_heads = SHA1_ARRAY_INIT;
-       unsigned char orig_head[GIT_SHA1_RAWSZ], curr_head[GIT_SHA1_RAWSZ];
-       unsigned char rebase_fork_point[GIT_SHA1_RAWSZ];
+       struct oid_array merge_heads = OID_ARRAY_INIT;
+       struct object_id orig_head, curr_head;
+       struct object_id rebase_fork_point;
+       int autostash;
 
        if (!getenv("GIT_REFLOG_ACTION"))
                set_reflog_message(argc, argv);
@@ -857,28 +792,29 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
        if (read_cache_unmerged())
                die_resolve_conflict("pull");
 
-       if (file_exists(git_path("MERGE_HEAD")))
+       if (file_exists(git_path_merge_head()))
                die_conclude_merge();
 
-       if (get_sha1("HEAD", orig_head))
-               hashclr(orig_head);
+       if (get_oid("HEAD", &orig_head))
+               oidclr(&orig_head);
 
        if (!opt_rebase && opt_autostash != -1)
                die(_("--[no-]autostash option is only valid with --rebase."));
 
+       autostash = config_autostash;
        if (opt_rebase) {
-               int autostash = config_autostash;
                if (opt_autostash != -1)
                        autostash = opt_autostash;
 
-               if (is_null_sha1(orig_head) && !is_cache_unborn())
+               if (is_null_oid(&orig_head) && !is_cache_unborn())
                        die(_("Updating an unborn branch with changes added to the index."));
 
                if (!autostash)
-                       die_on_unclean_work_tree(prefix);
+                       require_clean_work_tree(N_("pull with rebase"),
+                               _("please commit or stash them."), 1, 0);
 
-               if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
-                       hashclr(rebase_fork_point);
+               if (get_rebase_fork_point(&rebase_fork_point, repo, *refspecs))
+                       oidclr(&rebase_fork_point);
        }
 
        if (run_fetch(repo, refspecs))
@@ -887,11 +823,11 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
        if (opt_dry_run)
                return 0;
 
-       if (get_sha1("HEAD", curr_head))
-               hashclr(curr_head);
+       if (get_oid("HEAD", &curr_head))
+               oidclr(&curr_head);
 
-       if (!is_null_sha1(orig_head) && !is_null_sha1(curr_head) &&
-                       hashcmp(orig_head, curr_head)) {
+       if (!is_null_oid(&orig_head) && !is_null_oid(&curr_head) &&
+                       oidcmp(&orig_head, &curr_head)) {
                /*
                 * The fetch involved updating the current branch.
                 *
@@ -902,15 +838,15 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 
                warning(_("fetch updated the current branch head.\n"
                        "fast-forwarding your working tree from\n"
-                       "commit %s."), sha1_to_hex(orig_head));
+                       "commit %s."), oid_to_hex(&orig_head));
 
-               if (checkout_fast_forward(orig_head, curr_head, 0))
+               if (checkout_fast_forward(orig_head.hash, curr_head.hash, 0))
                        die(_("Cannot fast-forward your working tree.\n"
                                "After making sure that you saved anything precious from\n"
                                "$ git diff %s\n"
                                "output, run\n"
                                "$ git reset --hard\n"
-                               "to recover."), sha1_to_hex(orig_head));
+                               "to recover."), oid_to_hex(&orig_head));
        }
 
        get_merge_heads(&merge_heads);
@@ -918,14 +854,30 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
        if (!merge_heads.nr)
                die_no_merge_candidates(repo, refspecs);
 
-       if (is_null_sha1(orig_head)) {
+       if (is_null_oid(&orig_head)) {
                if (merge_heads.nr > 1)
                        die(_("Cannot merge multiple branches into empty head."));
-               return pull_into_void(*merge_heads.sha1, curr_head);
-       } else if (opt_rebase) {
-               if (merge_heads.nr > 1)
-                       die(_("Cannot rebase onto multiple branches."));
-               return run_rebase(curr_head, *merge_heads.sha1, rebase_fork_point);
-       } else
+               return pull_into_void(merge_heads.oid, &curr_head);
+       }
+       if (opt_rebase && merge_heads.nr > 1)
+               die(_("Cannot rebase onto multiple branches."));
+
+       if (opt_rebase) {
+               if (!autostash) {
+                       struct commit_list *list = NULL;
+                       struct commit *merge_head, *head;
+
+                       head = lookup_commit_reference(orig_head.hash);
+                       commit_list_insert(head, &list);
+                       merge_head = lookup_commit_reference(merge_heads.oid[0].hash);
+                       if (is_descendant_of(merge_head, list)) {
+                               /* we can fast-forward this without invoking rebase */
+                               opt_ff = "--ff-only";
+                               return run_merge();
+                       }
+               }
+               return run_rebase(&curr_head, merge_heads.oid, &rebase_fork_point);
+       } else {
                return run_merge();
+       }
 }
index 3bb9d6b7e63b3e3082023c3d333c11757df6fbda..a597759d8fac205f41c406d0a0e32f9240941190 100644 (file)
@@ -194,15 +194,18 @@ static void setup_push_upstream(struct remote *remote, struct branch *branch,
                        die_push_simple(branch, remote);
        }
 
-       strbuf_addf(&refspec, "%s:%s", branch->name, branch->merge[0]->src);
+       strbuf_addf(&refspec, "%s:%s", branch->refname, branch->merge[0]->src);
        add_refspec(refspec.buf);
 }
 
 static void setup_push_current(struct remote *remote, struct branch *branch)
 {
+       struct strbuf refspec = STRBUF_INIT;
+
        if (!branch)
                die(_(message_detached_head_die), remote->name);
-       add_refspec(branch->name);
+       strbuf_addf(&refspec, "%s:%s", branch->refname, branch->refname);
+       add_refspec(refspec.buf);
 }
 
 static int is_workflow_triangular(struct remote *remote)
@@ -507,8 +510,8 @@ int cmd_push(int argc, const char **argv, const char *prefix)
        int push_cert = -1;
        int rc;
        const char *repo = NULL;        /* default repository */
-       static struct string_list push_options = STRING_LIST_INIT_DUP;
-       static struct string_list_item *item;
+       struct string_list push_options = STRING_LIST_INIT_DUP;
+       const struct string_list_item *item;
 
        struct option options[] = {
                OPT__VERBOSITY(&verbosity),
@@ -565,6 +568,8 @@ int cmd_push(int argc, const char **argv, const char *prefix)
                flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK;
        else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)
                flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
+       else if (recurse_submodules == RECURSE_SUBMODULES_ONLY)
+               flags |= TRANSPORT_RECURSE_SUBMODULES_ONLY;
 
        if (tags)
                add_refspec("refs/tags/*");
@@ -579,6 +584,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)
                        die(_("push options must not have new line characters"));
 
        rc = do_push(repo, flags, &push_options);
+       string_list_clear(&push_options, 0);
        if (rc == -1)
                usage_with_options(push_usage, options);
        else
index 8c693e756852ef2ec3aac3bfc77d71c6258a8306..a52a9e11bb13c6685a7c1fbf98258792eef74ff3 100644 (file)
 #include "builtin.h"
 #include "parse-options.h"
 #include "resolve-undo.h"
+#include "submodule.h"
+#include "submodule-config.h"
 
 static int nr_trees;
 static int read_empty;
 static struct tree *trees[MAX_UNPACK_TREES];
+static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
 
 static int list_tree(unsigned char *sha1)
 {
@@ -78,7 +81,7 @@ static void debug_stage(const char *label, const struct cache_entry *ce,
        else
                printf("%06o #%d %s %.8s\n",
                       ce->ce_mode, ce_stage(ce), ce->name,
-                      sha1_to_hex(ce->sha1));
+                      oid_to_hex(&ce->oid));
 }
 
 static int debug_merge(const struct cache_entry * const *stages,
@@ -96,6 +99,23 @@ static int debug_merge(const struct cache_entry * const *stages,
        return 0;
 }
 
+static int option_parse_recurse_submodules(const struct option *opt,
+                                          const char *arg, int unset)
+{
+       if (unset) {
+               recurse_submodules = RECURSE_SUBMODULES_OFF;
+               return 0;
+       }
+       if (arg)
+               recurse_submodules =
+                       parse_update_recurse_submodules_arg(opt->long_name,
+                                                           arg);
+       else
+               recurse_submodules = RECURSE_SUBMODULES_ON;
+
+       return 0;
+}
+
 static struct lock_file lock_file;
 
 int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
@@ -109,34 +129,37 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                { OPTION_CALLBACK, 0, "index-output", NULL, N_("file"),
                  N_("write resulting index to <file>"),
                  PARSE_OPT_NONEG, index_output_cb },
-               OPT_SET_INT(0, "empty", &read_empty,
-                           N_("only empty the index"), 1),
+               OPT_BOOL(0, "empty", &read_empty,
+                           N_("only empty the index")),
                OPT__VERBOSE(&opts.verbose_update, N_("be verbose")),
                OPT_GROUP(N_("Merging")),
-               OPT_SET_INT('m', NULL, &opts.merge,
-                           N_("perform a merge in addition to a read"), 1),
-               OPT_SET_INT(0, "trivial", &opts.trivial_merges_only,
-                           N_("3-way merge if no file level merging required"), 1),
-               OPT_SET_INT(0, "aggressive", &opts.aggressive,
-                           N_("3-way merge in presence of adds and removes"), 1),
-               OPT_SET_INT(0, "reset", &opts.reset,
-                           N_("same as -m, but discard unmerged entries"), 1),
+               OPT_BOOL('m', NULL, &opts.merge,
+                        N_("perform a merge in addition to a read")),
+               OPT_BOOL(0, "trivial", &opts.trivial_merges_only,
+                        N_("3-way merge if no file level merging required")),
+               OPT_BOOL(0, "aggressive", &opts.aggressive,
+                        N_("3-way merge in presence of adds and removes")),
+               OPT_BOOL(0, "reset", &opts.reset,
+                        N_("same as -m, but discard unmerged entries")),
                { OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"),
                  N_("read the tree into the index under <subdirectory>/"),
                  PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP },
-               OPT_SET_INT('u', NULL, &opts.update,
-                           N_("update working tree with merge result"), 1),
+               OPT_BOOL('u', NULL, &opts.update,
+                        N_("update working tree with merge result")),
                { OPTION_CALLBACK, 0, "exclude-per-directory", &opts,
                  N_("gitignore"),
                  N_("allow explicitly ignored files to be overwritten"),
                  PARSE_OPT_NONEG, exclude_per_directory_cb },
-               OPT_SET_INT('i', NULL, &opts.index_only,
-                           N_("don't check the working tree after merging"), 1),
+               OPT_BOOL('i', NULL, &opts.index_only,
+                        N_("don't check the working tree after merging")),
                OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")),
-               OPT_SET_INT(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
-                           N_("skip applying sparse checkout filter"), 1),
-               OPT_SET_INT(0, "debug-unpack", &opts.debug_unpack,
-                           N_("debug unpack-trees"), 1),
+               OPT_BOOL(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
+                        N_("skip applying sparse checkout filter")),
+               OPT_BOOL(0, "debug-unpack", &opts.debug_unpack,
+                        N_("debug unpack-trees")),
+               { OPTION_CALLBACK, 0, "recurse-submodules", &recurse_submodules,
+                           "checkout", "control recursive updating of submodules",
+                           PARSE_OPT_OPTARG, option_parse_recurse_submodules },
                OPT_END()
        };
 
@@ -150,7 +173,13 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
        argc = parse_options(argc, argv, unused_prefix, read_tree_options,
                             read_tree_usage, 0);
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
+
+       if (recurse_submodules != RECURSE_SUBMODULES_DEFAULT) {
+               gitmodules_config();
+               git_config(submodule_config, NULL);
+               set_config_update_recurse_submodules(RECURSE_SUBMODULES_ON);
+       }
 
        prefix_set = opts.prefix ? 1 : 0;
        if (1 < opts.merge + opts.reset + prefix_set)
@@ -181,7 +210,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                        die("failed to unpack tree object %s", arg);
                stage++;
        }
-       if (nr_trees == 0 && !read_empty)
+       if (!nr_trees && !read_empty && !opts.merge)
                warning("read-tree: emptying the index with no arguments is deprecated; use --empty");
        else if (nr_trees > 0 && read_empty)
                die("passing trees as arguments contradicts --empty");
@@ -197,9 +226,10 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                setup_work_tree();
 
        if (opts.merge) {
-               if (stage < 2)
-                       die("just how do you expect me to merge %d trees?", stage-1);
                switch (stage - 1) {
+               case 0:
+                       die("you must specify at least one tree to merge");
+                       break;
                case 1:
                        opts.fn = opts.prefix ? bind_merge : oneway_merge;
                        break;
diff --git a/builtin/rebase--helper.c b/builtin/rebase--helper.c
new file mode 100644 (file)
index 0000000..ca1ebb2
--- /dev/null
@@ -0,0 +1,40 @@
+#include "builtin.h"
+#include "cache.h"
+#include "parse-options.h"
+#include "sequencer.h"
+
+static const char * const builtin_rebase_helper_usage[] = {
+       N_("git rebase--helper [<options>]"),
+       NULL
+};
+
+int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
+{
+       struct replay_opts opts = REPLAY_OPTS_INIT;
+       enum {
+               CONTINUE = 1, ABORT
+       } command = 0;
+       struct option options[] = {
+               OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")),
+               OPT_CMDMODE(0, "continue", &command, N_("continue rebase"),
+                               CONTINUE),
+               OPT_CMDMODE(0, "abort", &command, N_("abort rebase"),
+                               ABORT),
+               OPT_END()
+       };
+
+       git_config(git_default_config, NULL);
+
+       opts.action = REPLAY_INTERACTIVE_REBASE;
+       opts.allow_ff = 1;
+       opts.allow_empty = 1;
+
+       argc = parse_options(argc, argv, NULL, options,
+                       builtin_rebase_helper_usage, PARSE_OPT_KEEP_ARGV0);
+
+       if (command == CONTINUE && argc == 1)
+               return !!sequencer_continue(&opts);
+       if (command == ABORT && argc == 1)
+               return !!sequencer_remove_state(&opts);
+       usage_with_options(builtin_rebase_helper_usage, options);
+}
index 011db00d31709408a21b97abfb5742b97b54238d..da9a3a2c9dc271af3e5d842e2483e81dddbe9a77 100644 (file)
@@ -20,6 +20,8 @@
 #include "gpg-interface.h"
 #include "sigchain.h"
 #include "fsck.h"
+#include "tmp-objdir.h"
+#include "oidset.h"
 
 static const char * const receive_pack_usage[] = {
        N_("git receive-pack <git-dir>"),
@@ -46,6 +48,7 @@ static int transfer_unpack_limit = -1;
 static int advertise_atomic_push = 1;
 static int advertise_push_options;
 static int unpack_limit = 100;
+static off_t max_input_size;
 static int report_status;
 static int use_sideband;
 static int use_atomic;
@@ -85,6 +88,8 @@ static enum {
 } use_keepalive;
 static int keepalive_in_sec = 5;
 
+static struct tmp_objdir *tmp_objdir;
+
 static enum deny_action parse_deny_action(const char *var, const char *value)
 {
        if (value) {
@@ -212,13 +217,18 @@ static int receive_pack_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (strcmp(var, "receive.maxinputsize") == 0) {
+               max_input_size = git_config_int64(var, value);
+               return 0;
+       }
+
        return git_default_config(var, value, cb);
 }
 
-static void show_ref(const char *path, const unsigned char *sha1)
+static void show_ref(const char *path, const struct object_id *oid)
 {
        if (sent_capabilities) {
-               packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
+               packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), path);
        } else {
                struct strbuf cap = STRBUF_INIT;
 
@@ -233,16 +243,17 @@ static void show_ref(const char *path, const unsigned char *sha1)
                if (advertise_push_options)
                        strbuf_addstr(&cap, " push-options");
                strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
-               packet_write(1, "%s %s%c%s\n",
-                            sha1_to_hex(sha1), path, 0, cap.buf);
+               packet_write_fmt(1, "%s %s%c%s\n",
+                            oid_to_hex(oid), path, 0, cap.buf);
                strbuf_release(&cap);
                sent_capabilities = 1;
        }
 }
 
 static int show_ref_cb(const char *path_full, const struct object_id *oid,
-                      int flag, void *unused)
+                      int flag, void *data)
 {
+       struct oidset *seen = data;
        const char *path = strip_namespace(path_full);
 
        if (ref_is_hidden(path, path_full))
@@ -251,38 +262,40 @@ static int show_ref_cb(const char *path_full, const struct object_id *oid,
        /*
         * Advertise refs outside our current namespace as ".have"
         * refs, so that the client can use them to minimize data
-        * transfer but will otherwise ignore them. This happens to
-        * cover ".have" that are thrown in by add_one_alternate_ref()
-        * to mark histories that are complete in our alternates as
-        * well.
+        * transfer but will otherwise ignore them.
         */
-       if (!path)
+       if (!path) {
+               if (oidset_insert(seen, oid))
+                       return 0;
                path = ".have";
-       show_ref(path, oid->hash);
+       } else {
+               oidset_insert(seen, oid);
+       }
+       show_ref(path, oid);
        return 0;
 }
 
-static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
+static void show_one_alternate_ref(const char *refname,
+                                  const struct object_id *oid,
+                                  void *data)
 {
-       show_ref(".have", sha1);
-}
+       struct oidset *seen = data;
 
-static void collect_one_alternate_ref(const struct ref *ref, void *data)
-{
-       struct sha1_array *sa = data;
-       sha1_array_append(sa, ref->old_oid.hash);
+       if (oidset_insert(seen, oid))
+               return;
+
+       show_ref(".have", oid);
 }
 
 static void write_head_info(void)
 {
-       struct sha1_array sa = SHA1_ARRAY_INIT;
+       static struct oidset seen = OIDSET_INIT;
 
-       for_each_alternate_ref(collect_one_alternate_ref, &sa);
-       sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
-       sha1_array_clear(&sa);
-       for_each_ref(show_ref_cb, NULL);
+       for_each_ref(show_ref_cb, &seen);
+       for_each_alternate_ref(show_one_alternate_ref, &seen);
+       oidset_clear(&seen);
        if (!sent_capabilities)
-               show_ref("capabilities^{}", null_sha1);
+               show_ref("capabilities^{}", &null_oid);
 
        advertise_shallow_grafts(1);
 
@@ -296,8 +309,8 @@ struct command {
        unsigned int skip_update:1,
                     did_not_exist:1;
        int index;
-       unsigned char old_sha1[20];
-       unsigned char new_sha1[20];
+       struct object_id old_oid;
+       struct object_id new_oid;
        char ref_name[FLEX_ARRAY]; /* more */
 };
 
@@ -460,7 +473,8 @@ static char *prepare_push_cert_nonce(const char *path, unsigned long stamp)
  * after dropping "_commit" from its name and possibly moving it out
  * of commit.c
  */
-static char *find_header(const char *msg, size_t len, const char *key)
+static char *find_header(const char *msg, size_t len, const char *key,
+                        const char **next_line)
 {
        int key_len = strlen(key);
        const char *line = msg;
@@ -473,6 +487,8 @@ static char *find_header(const char *msg, size_t len, const char *key)
                if (line + key_len < eol &&
                    !memcmp(line, key, key_len) && line[key_len] == ' ') {
                        int offset = key_len + 1;
+                       if (next_line)
+                               *next_line = *eol ? eol + 1 : eol;
                        return xmemdupz(line + offset, (eol - line) - offset);
                }
                line = *eol ? eol + 1 : NULL;
@@ -482,7 +498,7 @@ static char *find_header(const char *msg, size_t len, const char *key)
 
 static const char *check_nonce(const char *buf, size_t len)
 {
-       char *nonce = find_header(buf, len, "nonce");
+       char *nonce = find_header(buf, len, "nonce", NULL);
        unsigned long stamp, ostamp;
        char *bohmac, *expect = NULL;
        const char *retval = NONCE_BAD;
@@ -562,6 +578,45 @@ leave:
        return retval;
 }
 
+/*
+ * Return 1 if there is no push_cert or if the push options in push_cert are
+ * the same as those in the argument; 0 otherwise.
+ */
+static int check_cert_push_options(const struct string_list *push_options)
+{
+       const char *buf = push_cert.buf;
+       int len = push_cert.len;
+
+       char *option;
+       const char *next_line;
+       int options_seen = 0;
+
+       int retval = 1;
+
+       if (!len)
+               return 1;
+
+       while ((option = find_header(buf, len, "push-option", &next_line))) {
+               len -= (next_line - buf);
+               buf = next_line;
+               options_seen++;
+               if (options_seen > push_options->nr
+                   || strcmp(option,
+                             push_options->items[options_seen - 1].string)) {
+                       retval = 0;
+                       goto leave;
+               }
+               free(option);
+       }
+
+       if (options_seen != push_options->nr)
+               retval = 0;
+
+leave:
+       free(option);
+       return retval;
+}
+
 static void prepare_push_cert_sha1(struct child_process *proc)
 {
        static int already_done;
@@ -657,6 +712,9 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed,
        } else
                argv_array_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT");
 
+       if (tmp_objdir)
+               argv_array_pushv(&proc.env_array, tmp_objdir_env(tmp_objdir));
+
        if (use_sideband) {
                memset(&muxer, 0, sizeof(muxer));
                muxer.proc = copy_to_sideband;
@@ -707,7 +765,7 @@ static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
                return -1; /* EOF */
        strbuf_reset(&state->buf);
        strbuf_addf(&state->buf, "%s %s %s\n",
-                   sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
+                   oid_to_hex(&cmd->old_oid), oid_to_hex(&cmd->new_oid),
                    cmd->ref_name);
        state->cmd = cmd->next;
        if (bufp) {
@@ -748,8 +806,8 @@ static int run_update_hook(struct command *cmd)
                return 0;
 
        argv[1] = cmd->ref_name;
-       argv[2] = sha1_to_hex(cmd->old_sha1);
-       argv[3] = sha1_to_hex(cmd->new_sha1);
+       argv[2] = oid_to_hex(&cmd->old_oid);
+       argv[3] = oid_to_hex(&cmd->new_oid);
        argv[4] = NULL;
 
        proc.no_stdin = 1;
@@ -775,54 +833,46 @@ static int is_ref_checked_out(const char *ref)
        return !strcmp(head_name, ref);
 }
 
-static char *refuse_unconfigured_deny_msg[] = {
-       "By default, updating the current branch in a non-bare repository",
-       "is denied, because it will make the index and work tree inconsistent",
-       "with what you pushed, and will require 'git reset --hard' to match",
-       "the work tree to HEAD.",
-       "",
-       "You can set 'receive.denyCurrentBranch' configuration variable to",
-       "'ignore' or 'warn' in the remote repository to allow pushing into",
-       "its current branch; however, this is not recommended unless you",
-       "arranged to update its work tree to match what you pushed in some",
-       "other way.",
-       "",
-       "To squelch this message and still keep the default behaviour, set",
-       "'receive.denyCurrentBranch' configuration variable to 'refuse'."
-};
+static char *refuse_unconfigured_deny_msg =
+       N_("By default, updating the current branch in a non-bare repository\n"
+          "is denied, because it will make the index and work tree inconsistent\n"
+          "with what you pushed, and will require 'git reset --hard' to match\n"
+          "the work tree to HEAD.\n"
+          "\n"
+          "You can set the 'receive.denyCurrentBranch' configuration variable\n"
+          "to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+          "its current branch; however, this is not recommended unless you\n"
+          "arranged to update its work tree to match what you pushed in some\n"
+          "other way.\n"
+          "\n"
+          "To squelch this message and still keep the default behaviour, set\n"
+          "'receive.denyCurrentBranch' configuration variable to 'refuse'.");
 
 static void refuse_unconfigured_deny(void)
 {
-       int i;
-       for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
-               rp_error("%s", refuse_unconfigured_deny_msg[i]);
+       rp_error("%s", _(refuse_unconfigured_deny_msg));
 }
 
-static char *refuse_unconfigured_deny_delete_current_msg[] = {
-       "By default, deleting the current branch is denied, because the next",
-       "'git clone' won't result in any file checked out, causing confusion.",
-       "",
-       "You can set 'receive.denyDeleteCurrent' configuration variable to",
-       "'warn' or 'ignore' in the remote repository to allow deleting the",
-       "current branch, with or without a warning message.",
-       "",
-       "To squelch this message, you can set it to 'refuse'."
-};
+static char *refuse_unconfigured_deny_delete_current_msg =
+       N_("By default, deleting the current branch is denied, because the next\n"
+          "'git clone' won't result in any file checked out, causing confusion.\n"
+          "\n"
+          "You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+          "'warn' or 'ignore' in the remote repository to allow deleting the\n"
+          "current branch, with or without a warning message.\n"
+          "\n"
+          "To squelch this message, you can set it to 'refuse'.");
 
 static void refuse_unconfigured_deny_delete_current(void)
 {
-       int i;
-       for (i = 0;
-            i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
-            i++)
-               rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
+       rp_error("%s", _(refuse_unconfigured_deny_delete_current_msg));
 }
 
 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]);
 static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
 {
        static struct lock_file shallow_lock;
-       struct sha1_array extra = SHA1_ARRAY_INIT;
+       struct oid_array extra = OID_ARRAY_INIT;
        struct check_connected_options opt = CHECK_CONNECTED_INIT;
        uint32_t mask = 1 << (cmd->index % 32);
        int i;
@@ -833,12 +883,13 @@ static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
                if (si->used_shallow[i] &&
                    (si->used_shallow[i][cmd->index / 32] & mask) &&
                    !delayed_reachability_test(si, i))
-                       sha1_array_append(&extra, si->shallow->sha1[i]);
+                       oid_array_append(&extra, &si->shallow->oid[i]);
 
+       opt.env = tmp_objdir_env(tmp_objdir);
        setup_alternate_shallow(&shallow_lock, &opt.shallow_file, &extra);
        if (check_connected(command_singleton_iterator, cmd, &opt)) {
                rollback_lock_file(&shallow_lock);
-               sha1_array_clear(&extra);
+               oid_array_clear(&extra);
                return -1;
        }
 
@@ -849,10 +900,10 @@ static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
         * not lose these new roots..
         */
        for (i = 0; i < extra.nr; i++)
-               register_shallow(extra.sha1[i]);
+               register_shallow(extra.oid[i].hash);
 
        si->shallow_ref[cmd->index] = 0;
-       sha1_array_clear(&extra);
+       oid_array_clear(&extra);
        return 0;
 }
 
@@ -977,9 +1028,10 @@ static const char *update(struct command *cmd, struct shallow_info *si)
 {
        const char *name = cmd->ref_name;
        struct strbuf namespaced_name_buf = STRBUF_INIT;
-       const char *namespaced_name, *ret;
-       unsigned char *old_sha1 = cmd->old_sha1;
-       unsigned char *new_sha1 = cmd->new_sha1;
+       static char *namespaced_name;
+       const char *ret;
+       struct object_id *old_oid = &cmd->old_oid;
+       struct object_id *new_oid = &cmd->new_oid;
 
        /* only refs/... are allowed */
        if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
@@ -988,6 +1040,7 @@ static const char *update(struct command *cmd, struct shallow_info *si)
        }
 
        strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
+       free(namespaced_name);
        namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
 
        if (is_ref_checked_out(namespaced_name)) {
@@ -1004,20 +1057,20 @@ static const char *update(struct command *cmd, struct shallow_info *si)
                                refuse_unconfigured_deny();
                        return "branch is currently checked out";
                case DENY_UPDATE_INSTEAD:
-                       ret = update_worktree(new_sha1);
+                       ret = update_worktree(new_oid->hash);
                        if (ret)
                                return ret;
                        break;
                }
        }
 
-       if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
+       if (!is_null_oid(new_oid) && !has_object_file(new_oid)) {
                error("unpack should have generated %s, "
-                     "but I can't find it!", sha1_to_hex(new_sha1));
+                     "but I can't find it!", oid_to_hex(new_oid));
                return "bad pack";
        }
 
-       if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
+       if (!is_null_oid(old_oid) && is_null_oid(new_oid)) {
                if (deny_deletes && starts_with(name, "refs/heads/")) {
                        rp_error("denying ref deletion for %s", name);
                        return "deletion prohibited";
@@ -1043,14 +1096,14 @@ static const char *update(struct command *cmd, struct shallow_info *si)
                }
        }
 
-       if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
-           !is_null_sha1(old_sha1) &&
+       if (deny_non_fast_forwards && !is_null_oid(new_oid) &&
+           !is_null_oid(old_oid) &&
            starts_with(name, "refs/heads/")) {
                struct object *old_object, *new_object;
                struct commit *old_commit, *new_commit;
 
-               old_object = parse_object(old_sha1);
-               new_object = parse_object(new_sha1);
+               old_object = parse_object(old_oid->hash);
+               new_object = parse_object(new_oid->hash);
 
                if (!old_object || !new_object ||
                    old_object->type != OBJ_COMMIT ||
@@ -1071,10 +1124,10 @@ static const char *update(struct command *cmd, struct shallow_info *si)
                return "hook declined";
        }
 
-       if (is_null_sha1(new_sha1)) {
+       if (is_null_oid(new_oid)) {
                struct strbuf err = STRBUF_INIT;
-               if (!parse_object(old_sha1)) {
-                       old_sha1 = NULL;
+               if (!parse_object(old_oid->hash)) {
+                       old_oid = NULL;
                        if (ref_exists(name)) {
                                rp_warning("Allowing deletion of corrupt ref.");
                        } else {
@@ -1084,7 +1137,7 @@ static const char *update(struct command *cmd, struct shallow_info *si)
                }
                if (ref_transaction_delete(transaction,
                                           namespaced_name,
-                                          old_sha1,
+                                          old_oid->hash,
                                           0, "push", &err)) {
                        rp_error("%s", err.buf);
                        strbuf_release(&err);
@@ -1101,7 +1154,7 @@ static const char *update(struct command *cmd, struct shallow_info *si)
 
                if (ref_transaction_update(transaction,
                                           namespaced_name,
-                                          new_sha1, old_sha1,
+                                          new_oid->hash, old_oid->hash,
                                           0, "push",
                                           &err)) {
                        rp_error("%s", err.buf);
@@ -1118,25 +1171,22 @@ static const char *update(struct command *cmd, struct shallow_info *si)
 static void run_update_post_hook(struct command *commands)
 {
        struct command *cmd;
-       int argc;
        struct child_process proc = CHILD_PROCESS_INIT;
        const char *hook;
 
        hook = find_hook("post-update");
-       for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
-               if (cmd->error_string || cmd->did_not_exist)
-                       continue;
-               argc++;
-       }
-       if (!argc || !hook)
+       if (!hook)
                return;
 
-       argv_array_push(&proc.args, hook);
        for (cmd = commands; cmd; cmd = cmd->next) {
                if (cmd->error_string || cmd->did_not_exist)
                        continue;
+               if (!proc.args.argc)
+                       argv_array_push(&proc.args, hook);
                argv_array_push(&proc.args, cmd->ref_name);
        }
+       if (!proc.args.argc)
+               return;
 
        proc.no_stdin = 1;
        proc.stdout_to_stderr = 1;
@@ -1155,11 +1205,7 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
        const char *dst_name;
        struct string_list_item *item;
        struct command *dst_cmd;
-       unsigned char sha1[GIT_SHA1_RAWSZ];
-       char cmd_oldh[GIT_SHA1_HEXSZ + 1],
-            cmd_newh[GIT_SHA1_HEXSZ + 1],
-            dst_oldh[GIT_SHA1_HEXSZ + 1],
-            dst_newh[GIT_SHA1_HEXSZ + 1];
+       unsigned char sha1[GIT_MAX_RAWSZ];
        int flag;
 
        strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
@@ -1184,20 +1230,20 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
 
        dst_cmd = (struct command *) item->util;
 
-       if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
-           !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
+       if (!oidcmp(&cmd->old_oid, &dst_cmd->old_oid) &&
+           !oidcmp(&cmd->new_oid, &dst_cmd->new_oid))
                return;
 
        dst_cmd->skip_update = 1;
 
-       find_unique_abbrev_r(cmd_oldh, cmd->old_sha1, DEFAULT_ABBREV);
-       find_unique_abbrev_r(cmd_newh, cmd->new_sha1, DEFAULT_ABBREV);
-       find_unique_abbrev_r(dst_oldh, dst_cmd->old_sha1, DEFAULT_ABBREV);
-       find_unique_abbrev_r(dst_newh, dst_cmd->new_sha1, DEFAULT_ABBREV);
        rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
                 " its target '%s' (%s..%s)",
-                cmd->ref_name, cmd_oldh, cmd_newh,
-                dst_cmd->ref_name, dst_oldh, dst_newh);
+                cmd->ref_name,
+                find_unique_abbrev(cmd->old_oid.hash, DEFAULT_ABBREV),
+                find_unique_abbrev(cmd->new_oid.hash, DEFAULT_ABBREV),
+                dst_cmd->ref_name,
+                find_unique_abbrev(dst_cmd->old_oid.hash, DEFAULT_ABBREV),
+                find_unique_abbrev(dst_cmd->new_oid.hash, DEFAULT_ABBREV));
 
        cmd->error_string = dst_cmd->error_string =
                "inconsistent aliased update";
@@ -1228,10 +1274,10 @@ static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
        struct command **cmd_list = cb_data;
        struct command *cmd = *cmd_list;
 
-       if (!cmd || is_null_sha1(cmd->new_sha1))
+       if (!cmd || is_null_oid(&cmd->new_oid))
                return -1; /* end of list */
        *cmd_list = NULL; /* this returns only one */
-       hashcpy(sha1, cmd->new_sha1);
+       hashcpy(sha1, cmd->new_oid.hash);
        return 0;
 }
 
@@ -1242,12 +1288,17 @@ static void set_connectivity_errors(struct command *commands,
 
        for (cmd = commands; cmd; cmd = cmd->next) {
                struct command *singleton = cmd;
+               struct check_connected_options opt = CHECK_CONNECTED_INIT;
+
                if (shallow_update && si->shallow_ref[cmd->index])
                        /* to be checked in update_shallow_ref() */
                        continue;
+
+               opt.env = tmp_objdir_env(tmp_objdir);
                if (!check_connected(command_singleton_iterator, &singleton,
-                                    NULL))
+                                    &opt))
                        continue;
+
                cmd->error_string = "missing necessary objects";
        }
 }
@@ -1267,8 +1318,8 @@ static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
                if (shallow_update && data->si->shallow_ref[cmd->index])
                        /* to be checked in update_shallow_ref() */
                        continue;
-               if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
-                       hashcpy(sha1, cmd->new_sha1);
+               if (!is_null_oid(&cmd->new_oid) && !cmd->skip_update) {
+                       hashcpy(sha1, cmd->new_oid.hash);
                        *cmd_list = cmd->next;
                        return 0;
                }
@@ -1295,7 +1346,7 @@ static void reject_updates_to_hidden(struct command *commands)
 
                if (!ref_is_hidden(cmd->ref_name, refname_full.buf))
                        continue;
-               if (is_null_sha1(cmd->new_sha1))
+               if (is_null_oid(&cmd->new_oid))
                        cmd->error_string = "deny deleting a hidden ref";
                else
                        cmd->error_string = "deny updating a hidden ref";
@@ -1406,7 +1457,7 @@ static void execute_commands(struct command *commands,
 {
        struct check_connected_options opt = CHECK_CONNECTED_INIT;
        struct command *cmd;
-       unsigned char sha1[20];
+       struct object_id oid;
        struct iterate_data data;
        struct async muxer;
        int err_fd = 0;
@@ -1430,6 +1481,7 @@ static void execute_commands(struct command *commands,
        data.si = si;
        opt.err_fd = err_fd;
        opt.progress = err_fd && !quiet;
+       opt.env = tmp_objdir_env(tmp_objdir);
        if (check_connected(iterate_receive_command_list, &data, &opt))
                set_connectivity_errors(commands, si);
 
@@ -1446,10 +1498,23 @@ static void execute_commands(struct command *commands,
                return;
        }
 
+       /*
+        * Now we'll start writing out refs, which means the objects need
+        * to be in their final positions so that other processes can see them.
+        */
+       if (tmp_objdir_migrate(tmp_objdir) < 0) {
+               for (cmd = commands; cmd; cmd = cmd->next) {
+                       if (!cmd->error_string)
+                               cmd->error_string = "unable to migrate objects to permanent storage";
+               }
+               return;
+       }
+       tmp_objdir = NULL;
+
        check_aliased_updates(commands);
 
        free(head_name_to_free);
-       head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
+       head_name = head_name_to_free = resolve_refdup("HEAD", 0, oid.hash, NULL);
 
        if (use_atomic)
                execute_commands_atomic(commands, si);
@@ -1464,23 +1529,23 @@ static struct command **queue_command(struct command **tail,
                                      const char *line,
                                      int linelen)
 {
-       unsigned char old_sha1[20], new_sha1[20];
+       struct object_id old_oid, new_oid;
        struct command *cmd;
        const char *refname;
        int reflen;
+       const char *p;
 
-       if (linelen < 83 ||
-           line[40] != ' ' ||
-           line[81] != ' ' ||
-           get_sha1_hex(line, old_sha1) ||
-           get_sha1_hex(line + 41, new_sha1))
+       if (parse_oid_hex(line, &old_oid, &p) ||
+           *p++ != ' ' ||
+           parse_oid_hex(p, &new_oid, &p) ||
+           *p++ != ' ')
                die("protocol error: expected old/new/ref, got '%s'", line);
 
-       refname = line + 82;
-       reflen = linelen - 82;
+       refname = p;
+       reflen = linelen - (p - line);
        FLEX_ALLOC_MEM(cmd, ref_name, refname, reflen);
-       hashcpy(cmd->old_sha1, old_sha1);
-       hashcpy(cmd->new_sha1, new_sha1);
+       oidcpy(&cmd->old_oid, &old_oid);
+       oidcpy(&cmd->new_oid, &new_oid);
        *tail = cmd;
        return &cmd->next;
 }
@@ -1502,12 +1567,12 @@ static void queue_commands_from_cert(struct command **tail,
 
        while (boc < eoc) {
                const char *eol = memchr(boc, '\n', eoc - boc);
-               tail = queue_command(tail, boc, eol ? eol - boc : eoc - eol);
+               tail = queue_command(tail, boc, eol ? eol - boc : eoc - boc);
                boc = eol ? eol + 1 : eoc;
        }
 }
 
-static struct command *read_head_info(struct sha1_array *shallow)
+static struct command *read_head_info(struct oid_array *shallow)
 {
        struct command *commands = NULL;
        struct command **p = &commands;
@@ -1519,12 +1584,12 @@ static struct command *read_head_info(struct sha1_array *shallow)
                if (!line)
                        break;
 
-               if (len == 48 && starts_with(line, "shallow ")) {
-                       unsigned char sha1[20];
-                       if (get_sha1_hex(line + 8, sha1))
+               if (len 8 && starts_with(line, "shallow ")) {
+                       struct object_id oid;
+                       if (get_oid_hex(line + 8, &oid))
                                die("protocol error: expected shallow sha, got '%s'",
                                    line + 8);
-                       sha1_array_append(shallow, sha1);
+                       oid_array_append(shallow, &oid);
                        continue;
                }
 
@@ -1612,12 +1677,17 @@ static const char *parse_pack_header(struct pack_header *hdr)
 
 static const char *pack_lockfile;
 
+static void push_header_arg(struct argv_array *args, struct pack_header *hdr)
+{
+       argv_array_pushf(args, "--pack_header=%"PRIu32",%"PRIu32,
+                       ntohl(hdr->hdr_version), ntohl(hdr->hdr_entries));
+}
+
 static const char *unpack(int err_fd, struct shallow_info *si)
 {
        struct pack_header hdr;
        const char *hdr_err;
        int status;
-       char hdr_arg[38];
        struct child_process child = CHILD_PROCESS_INIT;
        int fsck_objects = (receive_fsck_objects >= 0
                            ? receive_fsck_objects
@@ -1631,9 +1701,6 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                        close(err_fd);
                return hdr_err;
        }
-       snprintf(hdr_arg, sizeof(hdr_arg),
-                       "--pack_header=%"PRIu32",%"PRIu32,
-                       ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
 
        if (si->nr_ours || si->nr_theirs) {
                alt_shallow_file = setup_temporary_shallow(si->shallow);
@@ -1641,13 +1708,32 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                argv_array_push(&child.args, alt_shallow_file);
        }
 
+       tmp_objdir = tmp_objdir_create();
+       if (!tmp_objdir) {
+               if (err_fd > 0)
+                       close(err_fd);
+               return "unable to create temporary object directory";
+       }
+       child.env = tmp_objdir_env(tmp_objdir);
+
+       /*
+        * Normally we just pass the tmp_objdir environment to the child
+        * processes that do the heavy lifting, but we may need to see these
+        * objects ourselves to set up shallow information.
+        */
+       tmp_objdir_add_as_alternate(tmp_objdir);
+
        if (ntohl(hdr.hdr_entries) < unpack_limit) {
-               argv_array_pushl(&child.args, "unpack-objects", hdr_arg, NULL);
+               argv_array_push(&child.args, "unpack-objects");
+               push_header_arg(&child.args, &hdr);
                if (quiet)
                        argv_array_push(&child.args, "-q");
                if (fsck_objects)
                        argv_array_pushf(&child.args, "--strict%s",
                                fsck_msg_types.buf);
+               if (max_input_size)
+                       argv_array_pushf(&child.args, "--max-input-size=%"PRIuMAX,
+                               (uintmax_t)max_input_size);
                child.no_stdout = 1;
                child.err = err_fd;
                child.git_cmd = 1;
@@ -1655,12 +1741,12 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                if (status)
                        return "unpack-objects abnormal exit";
        } else {
-               char hostname[256];
+               char hostname[HOST_NAME_MAX + 1];
 
-               argv_array_pushl(&child.args, "index-pack",
-                                "--stdin", hdr_arg, NULL);
+               argv_array_pushl(&child.args, "index-pack", "--stdin", NULL);
+               push_header_arg(&child.args, &hdr);
 
-               if (gethostname(hostname, sizeof(hostname)))
+               if (xgethostname(hostname, sizeof(hostname)))
                        xsnprintf(hostname, sizeof(hostname), "localhost");
                argv_array_pushf(&child.args,
                                 "--keep=receive-pack %"PRIuMAX" on %s",
@@ -1676,6 +1762,9 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                                fsck_msg_types.buf);
                if (!reject_thin)
                        argv_array_push(&child.args, "--fix-thin");
+               if (max_input_size)
+                       argv_array_pushf(&child.args, "--max-input-size=%"PRIuMAX,
+                               (uintmax_t)max_input_size);
                child.out = -1;
                child.err = err_fd;
                child.git_cmd = 1;
@@ -1761,7 +1850,7 @@ static void prepare_shallow_update(struct command *commands,
 
 static void update_shallow_info(struct command *commands,
                                struct shallow_info *si,
-                               struct sha1_array *ref)
+                               struct oid_array *ref)
 {
        struct command *cmd;
        int *ref_status;
@@ -1772,9 +1861,9 @@ static void update_shallow_info(struct command *commands,
        }
 
        for (cmd = commands; cmd; cmd = cmd->next) {
-               if (is_null_sha1(cmd->new_sha1))
+               if (is_null_oid(&cmd->new_oid))
                        continue;
-               sha1_array_append(ref, cmd->new_sha1);
+               oid_array_append(ref, &cmd->new_oid);
                cmd->index = ref->nr - 1;
        }
        si->ref = ref;
@@ -1787,7 +1876,7 @@ static void update_shallow_info(struct command *commands,
        ALLOC_ARRAY(ref_status, ref->nr);
        assign_shallow_commits_to_refs(si, NULL, ref_status);
        for (cmd = commands; cmd; cmd = cmd->next) {
-               if (is_null_sha1(cmd->new_sha1))
+               if (is_null_oid(&cmd->new_oid))
                        continue;
                if (ref_status[cmd->index]) {
                        cmd->error_string = "shallow update not allowed";
@@ -1825,7 +1914,7 @@ static int delete_only(struct command *commands)
 {
        struct command *cmd;
        for (cmd = commands; cmd; cmd = cmd->next) {
-               if (!is_null_sha1(cmd->new_sha1))
+               if (!is_null_oid(&cmd->new_oid))
                        return 0;
        }
        return 1;
@@ -1835,8 +1924,8 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 {
        int advertise_refs = 0;
        struct command *commands;
-       struct sha1_array shallow = SHA1_ARRAY_INIT;
-       struct sha1_array ref = SHA1_ARRAY_INIT;
+       struct oid_array shallow = OID_ARRAY_INIT;
+       struct oid_array ref = OID_ARRAY_INIT;
        struct shallow_info si;
 
        struct option options[] = {
@@ -1884,6 +1973,11 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 
                if (use_push_options)
                        read_push_options(&push_options);
+               if (!check_cert_push_options(&push_options)) {
+                       struct command *cmd;
+                       for (cmd = commands; cmd; cmd = cmd->next)
+                               cmd->error_string = "inconsistent push options";
+               }
 
                prepare_shallow_info(&si, &shallow);
                if (!si.nr_ours && !si.nr_theirs)
@@ -1902,8 +1996,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
                run_receive_hook(commands, "post-receive", 1,
                                 &push_options);
                run_update_post_hook(commands);
-               if (push_options.nr)
-                       string_list_clear(&push_options, 0);
+               string_list_clear(&push_options, 0);
                if (auto_gc) {
                        const char *argv_gc_auto[] = {
                                "gc", "--auto", "--quiet", NULL,
@@ -1929,8 +2022,8 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
        }
        if (use_sideband)
                packet_flush(1);
-       sha1_array_clear(&shallow);
-       sha1_array_clear(&ref);
+       oid_array_clear(&shallow);
+       oid_array_clear(&ref);
        free((void *)push_cert_nonce);
        return 0;
 }
index 7a7136e53e2b8cf1eaa1c79b1183692dd54278a7..747277577857af2c71ab74b83d9ab3aea863c597 100644 (file)
@@ -615,7 +615,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
        return status;
 }
 
-static int count_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+static int count_reflog_ent(struct object_id *ooid, struct object_id *noid,
                const char *email, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
index 88eb8f901367aceffa008cf33b35ca8bee848626..11b48bfb41193387d53588c879ee50431f77b9cd 100644 (file)
@@ -128,9 +128,9 @@ static void send_git_request(int stdin_fd, const char *serv, const char *repo,
        const char *vhost)
 {
        if (!vhost)
-               packet_write(stdin_fd, "%s %s%c", serv, repo, 0);
+               packet_write_fmt(stdin_fd, "%s %s%c", serv, repo, 0);
        else
-               packet_write(stdin_fd, "%s %s%chost=%s%c", serv, repo, 0,
+               packet_write_fmt(stdin_fd, "%s %s%chost=%s%c", serv, repo, 0,
                             vhost, 0);
 }
 
index 9f6a6b3a9cea036d9a58c52f7d17c2b043a18f33..9054e2858e324aca5d6ce062331cf0ad9ccf0819 100644 (file)
@@ -186,7 +186,7 @@ static int add(int argc, const char **argv)
        url = argv[1];
 
        remote = remote_get(name);
-       if (remote_is_configured(remote))
+       if (remote_is_configured(remote, 1))
                die(_("remote %s already exists."), name);
 
        strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", name);
@@ -618,14 +618,14 @@ static int mv(int argc, const char **argv)
        rename.remote_branches = &remote_branches;
 
        oldremote = remote_get(rename.old);
-       if (!remote_is_configured(oldremote))
+       if (!remote_is_configured(oldremote, 1))
                die(_("No such remote: %s"), rename.old);
 
        if (!strcmp(rename.old, rename.new) && oldremote->origin != REMOTE_CONFIG)
                return migrate_file(oldremote);
 
        newremote = remote_get(rename.new);
-       if (remote_is_configured(newremote))
+       if (remote_is_configured(newremote, 1))
                die(_("remote %s already exists."), rename.new);
 
        strbuf_addf(&buf, "refs/heads/test:refs/remotes/%s/test", rename.new);
@@ -691,7 +691,7 @@ static int mv(int argc, const char **argv)
                read_ref_full(item->string, RESOLVE_REF_READING, oid.hash, &flag);
                if (!(flag & REF_ISSYMREF))
                        continue;
-               if (delete_ref(item->string, NULL, REF_NODEREF))
+               if (delete_ref(NULL, item->string, NULL, REF_NODEREF))
                        die(_("deleting '%s' failed"), item->string);
        }
        for (i = 0; i < remote_branches.nr; i++) {
@@ -753,7 +753,7 @@ static int rm(int argc, const char **argv)
                usage_with_options(builtin_remote_rm_usage, options);
 
        remote = remote_get(argv[1]);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote: %s"), argv[1]);
 
        known_remotes.to_delete = remote;
@@ -769,7 +769,9 @@ static int rm(int argc, const char **argv)
                                strbuf_reset(&buf);
                                strbuf_addf(&buf, "branch.%s.%s",
                                                item->string, *k);
-                               git_config_set(buf.buf, NULL);
+                               result = git_config_set_gently(buf.buf, NULL);
+                               if (result && result != CONFIG_NOTHING_SET)
+                                       die(_("could not unset '%s'"), buf.buf);
                        }
                }
        }
@@ -1149,8 +1151,11 @@ static int show(int argc, const char **argv)
                        url_nr = states.remote->url_nr;
                }
                for (i = 0; i < url_nr; i++)
-                       /* TRANSLATORS: the colon ':' should align with
-                          the one in "  Fetch URL: %s" translation */
+                       /*
+                        * TRANSLATORS: the colon ':' should align
+                        * with the one in " Fetch URL: %s"
+                        * translation.
+                        */
                        printf_ln(_("  Push  URL: %s"), url[i]);
                if (!i)
                        printf_ln(_("  Push  URL: %s"), _("(no URL)"));
@@ -1197,8 +1202,7 @@ static int show(int argc, const char **argv)
 
                info.width = info.width2 = 0;
                for_each_string_list(&states.push, add_push_to_show_info, &info);
-               qsort(info.list->items, info.list->nr,
-                       sizeof(*info.list->items), cmp_string_with_push);
+               QSORT(info.list->items, info.list->nr, cmp_string_with_push);
                if (info.list->nr)
                        printf_ln(Q_("  Local ref configured for 'git push'%s:",
                                     "  Local refs configured for 'git push'%s:",
@@ -1249,7 +1253,7 @@ static int set_head(int argc, const char **argv)
                        head_name = xstrdup(states.heads.items[0].string);
                free_remote_ref_states(&states);
        } else if (opt_d && !opt_a && argc == 1) {
-               if (delete_ref(buf.buf, NULL, REF_NODEREF))
+               if (delete_ref(NULL, buf.buf, NULL, REF_NODEREF))
                        result |= error(_("Could not delete %s"), buf.buf);
        } else
                usage_with_options(builtin_remote_sethead_usage, options);
@@ -1416,7 +1420,7 @@ static int set_remote_branches(const char *remotename, const char **branches,
        strbuf_addf(&key, "remote.%s.fetch", remotename);
 
        remote = remote_get(remotename);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote '%s'"), remotename);
 
        if (!add_mode && remove_all_fetch_refspecs(remotename, key.buf)) {
@@ -1470,7 +1474,7 @@ static int get_url(int argc, const char **argv)
        remotename = argv[0];
 
        remote = remote_get(remotename);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote '%s'"), remotename);
 
        url_nr = 0;
@@ -1538,7 +1542,7 @@ static int set_url(int argc, const char **argv)
                oldurl = newurl;
 
        remote = remote_get(remotename);
-       if (!remote_is_configured(remote))
+       if (!remote_is_configured(remote, 1))
                die(_("No such remote '%s'"), remotename);
 
        if (push_mode) {
index 80dd06b4a2a8b784ab96899cb150b13006d7e402..677bc7c81a2be11b287f3b05f91742216fbe1d51 100644 (file)
@@ -18,6 +18,12 @@ static const char *const git_repack_usage[] = {
        NULL
 };
 
+static const char incremental_bitmap_conflict_error[] = N_(
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+);
+
+
 static int repack_config(const char *var, const char *value, void *cb)
 {
        if (!strcmp(var, "repack.usedeltabaseoffset")) {
@@ -206,6 +212,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        if (pack_kept_objects < 0)
                pack_kept_objects = write_bitmaps;
 
+       if (write_bitmaps && !(pack_everything & ALL_INTO_ONE))
+               die(_(incremental_bitmap_conflict_error));
+
        packdir = mkpathdup("%s/pack", get_object_directory());
        packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
 
index b58c714cb8935efd08c81c8ebfd8922e1704c8f4..ab17668f4330a5e688d423a60c138768b9955e1b 100644 (file)
@@ -88,78 +88,81 @@ static int list_replace_refs(const char *pattern, const char *format)
 }
 
 typedef int (*each_replace_name_fn)(const char *name, const char *ref,
-                                   const unsigned char *sha1);
+                                   const struct object_id *oid);
 
 static int for_each_replace_name(const char **argv, each_replace_name_fn fn)
 {
        const char **p, *full_hex;
-       char ref[PATH_MAX];
+       struct strbuf ref = STRBUF_INIT;
+       size_t base_len;
        int had_error = 0;
-       unsigned char sha1[20];
+       struct object_id oid;
+
+       strbuf_addstr(&ref, git_replace_ref_base);
+       base_len = ref.len;
 
        for (p = argv; *p; p++) {
-               if (get_sha1(*p, sha1)) {
+               if (get_oid(*p, &oid)) {
                        error("Failed to resolve '%s' as a valid ref.", *p);
                        had_error = 1;
                        continue;
                }
-               full_hex = sha1_to_hex(sha1);
-               snprintf(ref, sizeof(ref), "%s%s", git_replace_ref_base, full_hex);
-               /* read_ref() may reuse the buffer */
-               full_hex = ref + strlen(git_replace_ref_base);
-               if (read_ref(ref, sha1)) {
+
+               strbuf_setlen(&ref, base_len);
+               strbuf_addstr(&ref, oid_to_hex(&oid));
+               full_hex = ref.buf + base_len;
+
+               if (read_ref(ref.buf, oid.hash)) {
                        error("replace ref '%s' not found.", full_hex);
                        had_error = 1;
                        continue;
                }
-               if (fn(full_hex, ref, sha1))
+               if (fn(full_hex, ref.buf, &oid))
                        had_error = 1;
        }
+       strbuf_release(&ref);
        return had_error;
 }
 
 static int delete_replace_ref(const char *name, const char *ref,
-                             const unsigned char *sha1)
+                             const struct object_id *oid)
 {
-       if (delete_ref(ref, sha1, 0))
+       if (delete_ref(NULL, ref, oid->hash, 0))
                return 1;
        printf("Deleted replace ref '%s'\n", name);
        return 0;
 }
 
-static void check_ref_valid(unsigned char object[20],
-                           unsigned char prev[20],
-                           char *ref,
-                           int ref_size,
+static void check_ref_valid(struct object_id *object,
+                           struct object_id *prev,
+                           struct strbuf *ref,
                            int force)
 {
-       if (snprintf(ref, ref_size,
-                    "%s%s", git_replace_ref_base,
-                    sha1_to_hex(object)) > ref_size - 1)
-               die("replace ref name too long: %.*s...", 50, ref);
-       if (check_refname_format(ref, 0))
-               die("'%s' is not a valid ref name.", ref);
-
-       if (read_ref(ref, prev))
-               hashclr(prev);
+       strbuf_reset(ref);
+       strbuf_addf(ref, "%s%s", git_replace_ref_base, oid_to_hex(object));
+       if (check_refname_format(ref->buf, 0))
+               die("'%s' is not a valid ref name.", ref->buf);
+
+       if (read_ref(ref->buf, prev->hash))
+               oidclr(prev);
        else if (!force)
-               die("replace ref '%s' already exists", ref);
+               die("replace ref '%s' already exists", ref->buf);
 }
 
-static int replace_object_sha1(const char *object_ref,
-                              unsigned char object[20],
+static int replace_object_oid(const char *object_ref,
+                              struct object_id *object,
                               const char *replace_ref,
-                              unsigned char repl[20],
+                              struct object_id *repl,
                               int force)
 {
-       unsigned char prev[20];
+       struct object_id prev;
        enum object_type obj_type, repl_type;
-       char ref[PATH_MAX];
+       struct strbuf ref = STRBUF_INIT;
        struct ref_transaction *transaction;
        struct strbuf err = STRBUF_INIT;
 
-       obj_type = sha1_object_info(object, NULL);
-       repl_type = sha1_object_info(repl, NULL);
+       obj_type = sha1_object_info(object->hash, NULL);
+       repl_type = sha1_object_info(repl->hash, NULL);
        if (!force && obj_type != repl_type)
                die("Objects must be of the same type.\n"
                    "'%s' points to a replaced object of type '%s'\n"
@@ -167,29 +170,30 @@ static int replace_object_sha1(const char *object_ref,
                    object_ref, typename(obj_type),
                    replace_ref, typename(repl_type));
 
-       check_ref_valid(object, prev, ref, sizeof(ref), force);
+       check_ref_valid(object, &prev, &ref, force);
 
        transaction = ref_transaction_begin(&err);
        if (!transaction ||
-           ref_transaction_update(transaction, ref, repl, prev,
+           ref_transaction_update(transaction, ref.buf, repl->hash, prev.hash,
                                   0, NULL, &err) ||
            ref_transaction_commit(transaction, &err))
                die("%s", err.buf);
 
        ref_transaction_free(transaction);
+       strbuf_release(&ref);
        return 0;
 }
 
 static int replace_object(const char *object_ref, const char *replace_ref, int force)
 {
-       unsigned char object[20], repl[20];
+       struct object_id object, repl;
 
-       if (get_sha1(object_ref, object))
+       if (get_oid(object_ref, &object))
                die("Failed to resolve '%s' as a valid ref.", object_ref);
-       if (get_sha1(replace_ref, repl))
+       if (get_oid(replace_ref, &repl))
                die("Failed to resolve '%s' as a valid ref.", replace_ref);
 
-       return replace_object_sha1(object_ref, object, replace_ref, repl, force);
+       return replace_object_oid(object_ref, &object, replace_ref, &repl, force);
 }
 
 /*
@@ -197,7 +201,7 @@ static int replace_object(const char *object_ref, const char *replace_ref, int f
  * If "raw" is true, then the object's raw contents are printed according to
  * "type". Otherwise, we pretty-print the contents for human editing.
  */
-static void export_object(const unsigned char *sha1, enum object_type type,
+static void export_object(const struct object_id *oid, enum object_type type,
                          int raw, const char *filename)
 {
        struct child_process cmd = CHILD_PROCESS_INIT;
@@ -213,7 +217,7 @@ static void export_object(const unsigned char *sha1, enum object_type type,
                argv_array_push(&cmd.args, typename(type));
        else
                argv_array_push(&cmd.args, "-p");
-       argv_array_push(&cmd.args, sha1_to_hex(sha1));
+       argv_array_push(&cmd.args, oid_to_hex(oid));
        cmd.git_cmd = 1;
        cmd.out = fd;
 
@@ -226,7 +230,7 @@ static void export_object(const unsigned char *sha1, enum object_type type,
  * interpreting it as "type", and writing the result to the object database.
  * The sha1 of the written object is returned via sha1.
  */
-static void import_object(unsigned char *sha1, enum object_type type,
+static void import_object(struct object_id *oid, enum object_type type,
                          int raw, const char *filename)
 {
        int fd;
@@ -254,7 +258,7 @@ static void import_object(unsigned char *sha1, enum object_type type,
 
                if (finish_command(&cmd))
                        die("mktree reported failure");
-               if (get_sha1_hex(result.buf, sha1) < 0)
+               if (get_oid_hex(result.buf, oid) < 0)
                        die("mktree did not return an object name");
 
                strbuf_release(&result);
@@ -264,7 +268,7 @@ static void import_object(unsigned char *sha1, enum object_type type,
 
                if (fstat(fd, &st) < 0)
                        die_errno("unable to fstat %s", filename);
-               if (index_fd(sha1, fd, &st, type, NULL, flags) < 0)
+               if (index_fd(oid->hash, fd, &st, type, NULL, flags) < 0)
                        die("unable to write object to database");
                /* index_fd close()s fd for us */
        }
@@ -279,29 +283,30 @@ static int edit_and_replace(const char *object_ref, int force, int raw)
 {
        char *tmpfile = git_pathdup("REPLACE_EDITOBJ");
        enum object_type type;
-       unsigned char old[20], new[20], prev[20];
-       char ref[PATH_MAX];
+       struct object_id old, new, prev;
+       struct strbuf ref = STRBUF_INIT;
 
-       if (get_sha1(object_ref, old) < 0)
+       if (get_oid(object_ref, &old) < 0)
                die("Not a valid object name: '%s'", object_ref);
 
-       type = sha1_object_info(old, NULL);
+       type = sha1_object_info(old.hash, NULL);
        if (type < 0)
-               die("unable to get object type for %s", sha1_to_hex(old));
+               die("unable to get object type for %s", oid_to_hex(&old));
 
-       check_ref_valid(old, prev, ref, sizeof(ref), force);
+       check_ref_valid(&old, &prev, &ref, force);
+       strbuf_release(&ref);
 
-       export_object(old, type, raw, tmpfile);
+       export_object(&old, type, raw, tmpfile);
        if (launch_editor(tmpfile, NULL, NULL) < 0)
                die("editing object file failed");
-       import_object(new, type, raw, tmpfile);
+       import_object(&new, type, raw, tmpfile);
 
        free(tmpfile);
 
-       if (!hashcmp(old, new))
-               return error("new object is the same as the old one: '%s'", sha1_to_hex(old));
+       if (!oidcmp(&old, &new))
+               return error("new object is the same as the old one: '%s'", oid_to_hex(&old));
 
-       return replace_object_sha1(object_ref, old, "replacement", new, force);
+       return replace_object_oid(object_ref, &old, "replacement", &new, force);
 }
 
 static void replace_parents(struct strbuf *buf, int argc, const char **argv)
@@ -312,7 +317,7 @@ static void replace_parents(struct strbuf *buf, int argc, const char **argv)
 
        /* find existing parents */
        parent_start = buf->buf;
-       parent_start += 46; /* "tree " + "hex sha1" + "\n" */
+       parent_start += GIT_SHA1_HEXSZ + 6; /* "tree " + "hex sha1" + "\n" */
        parent_end = parent_start;
 
        while (starts_with(parent_end, "parent "))
@@ -320,11 +325,11 @@ static void replace_parents(struct strbuf *buf, int argc, const char **argv)
 
        /* prepare new parents */
        for (i = 0; i < argc; i++) {
-               unsigned char sha1[20];
-               if (get_sha1(argv[i], sha1) < 0)
+               struct object_id oid;
+               if (get_oid(argv[i], &oid) < 0)
                        die(_("Not a valid object name: '%s'"), argv[i]);
-               lookup_commit_or_die(sha1, argv[i]);
-               strbuf_addf(&new_parents, "parent %s\n", sha1_to_hex(sha1));
+               lookup_commit_or_die(oid.hash, argv[i]);
+               strbuf_addf(&new_parents, "parent %s\n", oid_to_hex(&oid));
        }
 
        /* replace existing parents with new ones */
@@ -345,12 +350,12 @@ static void check_one_mergetag(struct commit *commit,
 {
        struct check_mergetag_data *mergetag_data = (struct check_mergetag_data *)data;
        const char *ref = mergetag_data->argv[0];
-       unsigned char tag_sha1[20];
+       struct object_id tag_oid;
        struct tag *tag;
        int i;
 
-       hash_sha1_file(extra->value, extra->len, typename(OBJ_TAG), tag_sha1);
-       tag = lookup_tag(tag_sha1);
+       hash_sha1_file(extra->value, extra->len, typename(OBJ_TAG), tag_oid.hash);
+       tag = lookup_tag(tag_oid.hash);
        if (!tag)
                die(_("bad mergetag in commit '%s'"), ref);
        if (parse_tag_buffer(tag, extra->value, extra->len))
@@ -366,7 +371,7 @@ static void check_one_mergetag(struct commit *commit,
        }
 
        die(_("original commit '%s' contains mergetag '%s' that is discarded; "
-             "use --edit instead of --graft"), ref, sha1_to_hex(tag_sha1));
+             "use --edit instead of --graft"), ref, oid_to_hex(&tag_oid));
 }
 
 static void check_mergetags(struct commit *commit, int argc, const char **argv)
@@ -380,16 +385,16 @@ static void check_mergetags(struct commit *commit, int argc, const char **argv)
 
 static int create_graft(int argc, const char **argv, int force)
 {
-       unsigned char old[20], new[20];
+       struct object_id old, new;
        const char *old_ref = argv[0];
        struct commit *commit;
        struct strbuf buf = STRBUF_INIT;
        const char *buffer;
        unsigned long size;
 
-       if (get_sha1(old_ref, old) < 0)
+       if (get_oid(old_ref, &old) < 0)
                die(_("Not a valid object name: '%s'"), old_ref);
-       commit = lookup_commit_or_die(old, old_ref);
+       commit = lookup_commit_or_die(old.hash, old_ref);
 
        buffer = get_commit_buffer(commit, &size);
        strbuf_add(&buf, buffer, size);
@@ -404,15 +409,15 @@ static int create_graft(int argc, const char **argv, int force)
 
        check_mergetags(commit, argc, argv);
 
-       if (write_sha1_file(buf.buf, buf.len, commit_type, new))
+       if (write_sha1_file(buf.buf, buf.len, commit_type, new.hash))
                die(_("could not write replacement commit for: '%s'"), old_ref);
 
        strbuf_release(&buf);
 
-       if (!hashcmp(old, new))
-               return error("new commit is the same as the old one: '%s'", sha1_to_hex(old));
+       if (!oidcmp(&old, &new))
+               return error("new commit is the same as the old one: '%s'", oid_to_hex(&old));
 
-       return replace_object_sha1(old_ref, old, "replacement", new, force);
+       return replace_object_oid(old_ref, &old, "replacement", &new, force);
 }
 
 int cmd_replace(int argc, const char **argv, const char *prefix)
index 9400acce070c8870d6aab8b9a4cb361460488fb6..fc3b906c47bbcbefdc35b178016c031e46c06691 100644 (file)
@@ -39,7 +39,7 @@ static inline int is_merge(void)
        return !access(git_path_merge_head(), F_OK);
 }
 
-static int reset_index(const unsigned char *sha1, int reset_type, int quiet)
+static int reset_index(const struct object_id *oid, int reset_type, int quiet)
 {
        int nr = 1;
        struct tree_desc desc[2];
@@ -69,22 +69,22 @@ static int reset_index(const unsigned char *sha1, int reset_type, int quiet)
        read_cache_unmerged();
 
        if (reset_type == KEEP) {
-               unsigned char head_sha1[20];
-               if (get_sha1("HEAD", head_sha1))
+               struct object_id head_oid;
+               if (get_oid("HEAD", &head_oid))
                        return error(_("You do not have a valid HEAD."));
-               if (!fill_tree_descriptor(desc, head_sha1))
+               if (!fill_tree_descriptor(desc, head_oid.hash))
                        return error(_("Failed to find tree of HEAD."));
                nr++;
                opts.fn = twoway_merge;
        }
 
-       if (!fill_tree_descriptor(desc + nr - 1, sha1))
-               return error(_("Failed to find tree of %s."), sha1_to_hex(sha1));
+       if (!fill_tree_descriptor(desc + nr - 1, oid->hash))
+               return error(_("Failed to find tree of %s."), oid_to_hex(oid));
        if (unpack_trees(nr, desc, &opts))
                return -1;
 
        if (reset_type == MIXED || reset_type == HARD) {
-               tree = parse_tree_indirect(sha1);
+               tree = parse_tree_indirect(oid->hash);
                prime_cache_tree(&the_index, tree);
        }
 
@@ -143,7 +143,7 @@ static void update_index_from_diff(struct diff_queue_struct *q,
 }
 
 static int read_from_tree(const struct pathspec *pathspec,
-                         unsigned char *tree_sha1,
+                         struct object_id *tree_oid,
                          int intent_to_add)
 {
        struct diff_options opt;
@@ -154,7 +154,7 @@ static int read_from_tree(const struct pathspec *pathspec,
        opt.format_callback = update_index_from_diff;
        opt.format_callback_data = &intent_to_add;
 
-       if (do_diff_cache(tree_sha1, &opt))
+       if (do_diff_cache(tree_oid->hash, &opt))
                return 1;
        diffcore_std(&opt);
        diff_flush(&opt);
@@ -191,7 +191,7 @@ static void parse_args(struct pathspec *pathspec,
                       const char **rev_ret)
 {
        const char *rev = "HEAD";
-       unsigned char unused[20];
+       struct object_id unused;
        /*
         * Possible arguments are:
         *
@@ -216,8 +216,8 @@ static void parse_args(struct pathspec *pathspec,
                 * has to be unambiguous. If there is a single argument, it
                 * can not be a tree
                 */
-               else if ((!argv[1] && !get_sha1_committish(argv[0], unused)) ||
-                        (argv[1] && !get_sha1_treeish(argv[0], unused))) {
+               else if ((!argv[1] && !get_sha1_committish(argv[0], unused.hash)) ||
+                        (argv[1] && !get_sha1_treeish(argv[0], unused.hash))) {
                        /*
                         * Ok, argv[0] looks like a commit/tree; it should not
                         * be a filename.
@@ -241,24 +241,24 @@ static void parse_args(struct pathspec *pathspec,
                       prefix, argv);
 }
 
-static int reset_refs(const char *rev, const unsigned char *sha1)
+static int reset_refs(const char *rev, const struct object_id *oid)
 {
        int update_ref_status;
        struct strbuf msg = STRBUF_INIT;
-       unsigned char *orig = NULL, sha1_orig[20],
-               *old_orig = NULL, sha1_old_orig[20];
+       struct object_id *orig = NULL, oid_orig,
+               *old_orig = NULL, oid_old_orig;
 
-       if (!get_sha1("ORIG_HEAD", sha1_old_orig))
-               old_orig = sha1_old_orig;
-       if (!get_sha1("HEAD", sha1_orig)) {
-               orig = sha1_orig;
+       if (!get_oid("ORIG_HEAD", &oid_old_orig))
+               old_orig = &oid_old_orig;
+       if (!get_oid("HEAD", &oid_orig)) {
+               orig = &oid_orig;
                set_reflog_message(&msg, "updating ORIG_HEAD", NULL);
-               update_ref(msg.buf, "ORIG_HEAD", orig, old_orig, 0,
+               update_ref_oid(msg.buf, "ORIG_HEAD", orig, old_orig, 0,
                           UPDATE_REFS_MSG_ON_ERR);
        } else if (old_orig)
-               delete_ref("ORIG_HEAD", old_orig, 0);
+               delete_ref(NULL, "ORIG_HEAD", old_orig->hash, 0);
        set_reflog_message(&msg, "updating HEAD", rev);
-       update_ref_status = update_ref(msg.buf, "HEAD", sha1, orig, 0,
+       update_ref_status = update_ref_oid(msg.buf, "HEAD", oid, orig, 0,
                                       UPDATE_REFS_MSG_ON_ERR);
        strbuf_release(&msg);
        return update_ref_status;
@@ -354,18 +354,18 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
 
        if (reset_type != SOFT) {
                struct lock_file *lock = xcalloc(1, sizeof(*lock));
-               hold_locked_index(lock, 1);
+               hold_locked_index(lock, LOCK_DIE_ON_ERROR);
                if (reset_type == MIXED) {
                        int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN;
-                       if (read_from_tree(&pathspec, oid.hash, intent_to_add))
+                       if (read_from_tree(&pathspec, &oid, intent_to_add))
                                return 1;
                        if (get_git_work_tree())
                                refresh_index(&the_index, flags, NULL, NULL,
                                              _("Unstaged changes after reset:"));
                } else {
-                       int err = reset_index(oid.hash, reset_type, quiet);
+                       int err = reset_index(&oid, reset_type, quiet);
                        if (reset_type == KEEP && !err)
-                               err = reset_index(oid.hash, MIXED, quiet);
+                               err = reset_index(&oid, MIXED, quiet);
                        if (err)
                                die(_("Could not reset index file to revision '%s'."), rev);
                }
@@ -377,7 +377,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
        if (!pathspec.nr && !unborn) {
                /* Any resets without paths update HEAD to the head being
                 * switched to, saving the previous head in ORIG_HEAD before. */
-               update_ref_status = reset_refs(rev, oid.hash);
+               update_ref_status = reset_refs(rev, &oid);
 
                if (reset_type == HARD && !update_ref_status && !quiet)
                        print_new_head_line(lookup_commit_reference(oid.hash));
index 0ba82b1635b6380d9a7d9fd9a31471b8c8ac9f20..bcf77f0b8a201278f0887933e568937473eb7251 100644 (file)
@@ -122,48 +122,40 @@ static void show_commit(struct commit *commit, void *data)
                ctx.fmt = revs->commit_format;
                ctx.output_encoding = get_log_output_encoding();
                pretty_print_commit(&ctx, commit, &buf);
-               if (revs->graph) {
-                       if (buf.len) {
-                               if (revs->commit_format != CMIT_FMT_ONELINE)
-                                       graph_show_oneline(revs->graph);
-
-                               graph_show_commit_msg(revs->graph, &buf);
-
-                               /*
-                                * Add a newline after the commit message.
-                                *
-                                * Usually, this newline produces a blank
-                                * padding line between entries, in which case
-                                * we need to add graph padding on this line.
-                                *
-                                * However, the commit message may not end in a
-                                * newline.  In this case the newline simply
-                                * ends the last line of the commit message,
-                                * and we don't need any graph output.  (This
-                                * always happens with CMIT_FMT_ONELINE, and it
-                                * happens with CMIT_FMT_USERFORMAT when the
-                                * format doesn't explicitly end in a newline.)
-                                */
-                               if (buf.len && buf.buf[buf.len - 1] == '\n')
-                                       graph_show_padding(revs->graph);
-                               putchar('\n');
-                       } else {
-                               /*
-                                * If the message buffer is empty, just show
-                                * the rest of the graph output for this
-                                * commit.
-                                */
-                               if (graph_show_remainder(revs->graph))
-                                       putchar('\n');
-                               if (revs->commit_format == CMIT_FMT_ONELINE)
-                                       putchar('\n');
-                       }
+               if (buf.len) {
+                       if (revs->commit_format != CMIT_FMT_ONELINE)
+                               graph_show_oneline(revs->graph);
+
+                       graph_show_commit_msg(revs->graph, stdout, &buf);
+
+                       /*
+                        * Add a newline after the commit message.
+                        *
+                        * Usually, this newline produces a blank
+                        * padding line between entries, in which case
+                        * we need to add graph padding on this line.
+                        *
+                        * However, the commit message may not end in a
+                        * newline.  In this case the newline simply
+                        * ends the last line of the commit message,
+                        * and we don't need any graph output.  (This
+                        * always happens with CMIT_FMT_ONELINE, and it
+                        * happens with CMIT_FMT_USERFORMAT when the
+                        * format doesn't explicitly end in a newline.)
+                        */
+                       if (buf.len && buf.buf[buf.len - 1] == '\n')
+                               graph_show_padding(revs->graph);
+                       putchar(info->hdr_termination);
                } else {
-                       if (revs->commit_format != CMIT_FMT_USERFORMAT ||
-                           buf.len) {
-                               fwrite(buf.buf, 1, buf.len, stdout);
-                               putchar(info->hdr_termination);
-                       }
+                       /*
+                        * If the message buffer is empty, just show
+                        * the rest of the graph output for this
+                        * commit.
+                        */
+                       if (graph_show_remainder(revs->graph))
+                               putchar('\n');
+                       if (revs->commit_format == CMIT_FMT_ONELINE)
+                               putchar('\n');
                }
                strbuf_release(&buf);
        } else {
@@ -220,7 +212,7 @@ static void print_var_int(const char *var, int val)
 static int show_bisect_vars(struct rev_list_info *info, int reaches, int all)
 {
        int cnt, flags = info->flags;
-       char hex[GIT_SHA1_HEXSZ + 1] = "";
+       char hex[GIT_MAX_HEXSZ + 1] = "";
        struct commit_list *tried;
        struct rev_info *revs = info->revs;
 
@@ -245,7 +237,7 @@ static int show_bisect_vars(struct rev_list_info *info, int reaches, int all)
                cnt = reaches;
 
        if (revs->commits)
-               sha1_to_hex_r(hex, revs->commits->item->object.oid.hash);
+               oid_to_hex_r(hex, &revs->commits->item->object.oid);
 
        if (flags & BISECT_SHOW_ALL) {
                traverse_commit_list(revs, show_commit, show_object, info);
index 76cf05e2ade4348b8ad59b1541b58f671e53e1ce..051333091062ef8e2e717ec4aef8a9bdf3b4450f 100644 (file)
@@ -12,6 +12,7 @@
 #include "diff.h"
 #include "revision.h"
 #include "split-index.h"
+#include "submodule.h"
 
 #define DO_REVS                1
 #define DO_NOREV       2
@@ -204,21 +205,22 @@ static int anti_reference(const char *refname, const struct object_id *oid, int
        return 0;
 }
 
-static int show_abbrev(const unsigned char *sha1, void *cb_data)
+static int show_abbrev(const struct object_id *oid, void *cb_data)
 {
-       show_rev(NORMAL, sha1, NULL);
+       show_rev(NORMAL, oid->hash, NULL);
        return 0;
 }
 
 static void show_datestring(const char *flag, const char *datestr)
 {
-       static char buffer[100];
+       char *buffer;
 
        /* date handling requires both flags and revs */
        if ((filter & (DO_FLAGS | DO_REVS)) != (DO_FLAGS | DO_REVS))
                return;
-       snprintf(buffer, sizeof(buffer), "%s%lu", flag, approxidate(datestr));
+       buffer = xstrfmt("%s%lu", flag, approxidate(datestr));
        show(buffer);
+       free(buffer);
 }
 
 static int show_file(const char *arg, int output_prefix)
@@ -227,9 +229,9 @@ static int show_file(const char *arg, int output_prefix)
        if ((filter & (DO_NONFLAGS|DO_NOREV)) == (DO_NONFLAGS|DO_NOREV)) {
                if (output_prefix) {
                        const char *prefix = startup_info->prefix;
-                       show(prefix_filename(prefix,
-                                            prefix ? strlen(prefix) : 0,
-                                            arg));
+                       char *fname = prefix_filename(prefix, arg);
+                       show(fname);
+                       free(fname);
                } else
                        show(arg);
                return 1;
@@ -298,14 +300,30 @@ static int try_parent_shorthands(const char *arg)
        unsigned char sha1[20];
        struct commit *commit;
        struct commit_list *parents;
-       int parents_only;
-
-       if ((dotdot = strstr(arg, "^!")))
-               parents_only = 0;
-       else if ((dotdot = strstr(arg, "^@")))
-               parents_only = 1;
-
-       if (!dotdot || dotdot[2])
+       int parent_number;
+       int include_rev = 0;
+       int include_parents = 0;
+       int exclude_parent = 0;
+
+       if ((dotdot = strstr(arg, "^!"))) {
+               include_rev = 1;
+               if (dotdot[2])
+                       return 0;
+       } else if ((dotdot = strstr(arg, "^@"))) {
+               include_parents = 1;
+               if (dotdot[2])
+                       return 0;
+       } else if ((dotdot = strstr(arg, "^-"))) {
+               include_rev = 1;
+               exclude_parent = 1;
+
+               if (dotdot[2]) {
+                       char *end;
+                       exclude_parent = strtoul(dotdot + 2, &end, 10);
+                       if (*end != '\0' || !exclude_parent)
+                               return 0;
+               }
+       } else
                return 0;
 
        *dotdot = 0;
@@ -314,12 +332,29 @@ static int try_parent_shorthands(const char *arg)
                return 0;
        }
 
-       if (!parents_only)
-               show_rev(NORMAL, sha1, arg);
        commit = lookup_commit_reference(sha1);
-       for (parents = commit->parents; parents; parents = parents->next)
-               show_rev(parents_only ? NORMAL : REVERSED,
-                               parents->item->object.oid.hash, arg);
+       if (exclude_parent &&
+           exclude_parent > commit_list_count(commit->parents)) {
+               *dotdot = '^';
+               return 0;
+       }
+
+       if (include_rev)
+               show_rev(NORMAL, sha1, arg);
+       for (parents = commit->parents, parent_number = 1;
+            parents;
+            parents = parents->next, parent_number++) {
+               char *name = NULL;
+
+               if (exclude_parent && parent_number != exclude_parent)
+                       continue;
+
+               if (symbolic)
+                       name = xstrfmt("%s^%d", arg, parent_number);
+               show_rev(include_parents ? NORMAL : REVERSED,
+                        parents->item->object.oid.hash, name);
+               free(name);
+       }
 
        *dotdot = '^';
        return 1;
@@ -502,6 +537,34 @@ N_("git rev-parse --parseopt [<options>] -- [<args>...]\n"
    "\n"
    "Run \"git rev-parse --parseopt -h\" for more information on the first usage.");
 
+/*
+ * Parse "opt" or "opt=<value>", setting value respectively to either
+ * NULL or the string after "=".
+ */
+static int opt_with_value(const char *arg, const char *opt, const char **value)
+{
+       if (skip_prefix(arg, opt, &arg)) {
+               if (!*arg) {
+                       *value = NULL;
+                       return 1;
+               }
+               if (*arg++ == '=') {
+                       *value = arg;
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+static void handle_ref_opt(const char *pattern, const char *prefix)
+{
+       if (pattern)
+               for_each_glob_ref_in(show_reference, pattern, prefix, NULL);
+       else
+               for_each_ref_in(prefix, show_reference, NULL);
+       clear_ref_exclusion(&ref_excludes);
+}
+
 int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 {
        int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0;
@@ -512,6 +575,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
        unsigned int flags = 0;
        const char *name = NULL;
        struct object_context unused;
+       struct strbuf buf = STRBUF_INIT;
 
        if (argc > 1 && !strcmp("--parseopt", argv[1]))
                return cmd_parseopt(argc - 1, argv + 1, prefix);
@@ -566,7 +630,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                if (!strcmp(arg, "--git-path")) {
                        if (!argv[i + 1])
                                die("--git-path requires an argument");
-                       puts(git_path("%s", argv[i + 1]));
+                       strbuf_reset(&buf);
+                       puts(relative_path(git_path("%s", argv[i + 1]),
+                                          prefix, &buf));
                        i++;
                        continue;
                }
@@ -638,13 +704,13 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                flags |= GET_SHA1_QUIETLY;
                                continue;
                        }
-                       if (!strcmp(arg, "--short") ||
-                           starts_with(arg, "--short=")) {
+                       if (opt_with_value(arg, "--short", &arg)) {
                                filter &= ~(DO_FLAGS|DO_NOREV);
                                verify = 1;
                                abbrev = DEFAULT_ABBREV;
-                               if (arg[7] == '=')
-                                       abbrev = strtoul(arg + 8, NULL, 10);
+                               if (!arg)
+                                       continue;
+                               abbrev = strtoul(arg, NULL, 10);
                                if (abbrev < MINIMUM_ABBREV)
                                        abbrev = MINIMUM_ABBREV;
                                else if (40 <= abbrev)
@@ -667,17 +733,17 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                symbolic = SHOW_SYMBOLIC_FULL;
                                continue;
                        }
-                       if (starts_with(arg, "--abbrev-ref") &&
-                           (!arg[12] || arg[12] == '=')) {
+                       if (opt_with_value(arg, "--abbrev-ref", &arg)) {
                                abbrev_ref = 1;
                                abbrev_ref_strict = warn_ambiguous_refs;
-                               if (arg[12] == '=') {
-                                       if (!strcmp(arg + 13, "strict"))
+                               if (arg) {
+                                       if (!strcmp(arg, "strict"))
                                                abbrev_ref_strict = 1;
-                                       else if (!strcmp(arg + 13, "loose"))
+                                       else if (!strcmp(arg, "loose"))
                                                abbrev_ref_strict = 0;
                                        else
-                                               die("unknown mode for %s", arg);
+                                               die("unknown mode for --abbrev-ref: %s",
+                                                   arg);
                                }
                                continue;
                        }
@@ -685,8 +751,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                for_each_ref(show_reference, NULL);
                                continue;
                        }
-                       if (starts_with(arg, "--disambiguate=")) {
-                               for_each_abbrev(arg + 15, show_abbrev, NULL);
+                       if (skip_prefix(arg, "--disambiguate=", &arg)) {
+                               for_each_abbrev(arg, show_abbrev, NULL);
                                continue;
                        }
                        if (!strcmp(arg, "--bisect")) {
@@ -694,46 +760,24 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                for_each_ref_in("refs/bisect/good", anti_reference, NULL);
                                continue;
                        }
-                       if (starts_with(arg, "--branches=")) {
-                               for_each_glob_ref_in(show_reference, arg + 11,
-                                       "refs/heads/", NULL);
-                               clear_ref_exclusion(&ref_excludes);
-                               continue;
-                       }
-                       if (!strcmp(arg, "--branches")) {
-                               for_each_branch_ref(show_reference, NULL);
-                               clear_ref_exclusion(&ref_excludes);
-                               continue;
-                       }
-                       if (starts_with(arg, "--tags=")) {
-                               for_each_glob_ref_in(show_reference, arg + 7,
-                                       "refs/tags/", NULL);
-                               clear_ref_exclusion(&ref_excludes);
-                               continue;
-                       }
-                       if (!strcmp(arg, "--tags")) {
-                               for_each_tag_ref(show_reference, NULL);
-                               clear_ref_exclusion(&ref_excludes);
+                       if (opt_with_value(arg, "--branches", &arg)) {
+                               handle_ref_opt(arg, "refs/heads/");
                                continue;
                        }
-                       if (starts_with(arg, "--glob=")) {
-                               for_each_glob_ref(show_reference, arg + 7, NULL);
-                               clear_ref_exclusion(&ref_excludes);
+                       if (opt_with_value(arg, "--tags", &arg)) {
+                               handle_ref_opt(arg, "refs/tags/");
                                continue;
                        }
-                       if (starts_with(arg, "--remotes=")) {
-                               for_each_glob_ref_in(show_reference, arg + 10,
-                                       "refs/remotes/", NULL);
-                               clear_ref_exclusion(&ref_excludes);
+                       if (skip_prefix(arg, "--glob=", &arg)) {
+                               handle_ref_opt(arg, NULL);
                                continue;
                        }
-                       if (!strcmp(arg, "--remotes")) {
-                               for_each_remote_ref(show_reference, NULL);
-                               clear_ref_exclusion(&ref_excludes);
+                       if (opt_with_value(arg, "--remotes", &arg)) {
+                               handle_ref_opt(arg, "refs/remotes/");
                                continue;
                        }
-                       if (starts_with(arg, "--exclude=")) {
-                               add_ref_exclusion(&ref_excludes, arg + 10);
+                       if (skip_prefix(arg, "--exclude=", &arg)) {
+                               add_ref_exclusion(&ref_excludes, arg);
                                continue;
                        }
                        if (!strcmp(arg, "--show-toplevel")) {
@@ -742,6 +786,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                        puts(work_tree);
                                continue;
                        }
+                       if (!strcmp(arg, "--show-superproject-working-tree")) {
+                               const char *superproject = get_superproject_working_tree();
+                               if (superproject)
+                                       puts(superproject);
+                               continue;
+                       }
                        if (!strcmp(arg, "--show-prefix")) {
                                if (prefix)
                                        puts(prefix);
@@ -768,17 +818,27 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                putchar('\n');
                                continue;
                        }
-                       if (!strcmp(arg, "--git-dir")) {
+                       if (!strcmp(arg, "--git-dir") ||
+                           !strcmp(arg, "--absolute-git-dir")) {
                                const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
                                char *cwd;
                                int len;
-                               if (gitdir) {
-                                       puts(gitdir);
-                                       continue;
-                               }
-                               if (!prefix) {
-                                       puts(".git");
-                                       continue;
+                               if (arg[2] == 'g') {    /* --git-dir */
+                                       if (gitdir) {
+                                               puts(gitdir);
+                                               continue;
+                                       }
+                                       if (!prefix) {
+                                               puts(".git");
+                                               continue;
+                                       }
+                               } else {                /* --absolute-git-dir */
+                                       if (!gitdir && !prefix)
+                                               gitdir = ".git";
+                                       if (gitdir) {
+                                               puts(real_path(gitdir));
+                                               continue;
+                                       }
                                }
                                cwd = xgetcwd();
                                len = strlen(cwd);
@@ -787,8 +847,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                continue;
                        }
                        if (!strcmp(arg, "--git-common-dir")) {
-                               const char *pfx = prefix ? prefix : "";
-                               puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir()));
+                               strbuf_reset(&buf);
+                               puts(relative_path(get_git_common_dir(),
+                                                  prefix, &buf));
                                continue;
                        }
                        if (!strcmp(arg, "--is-inside-git-dir")) {
@@ -811,24 +872,26 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                        die(_("Could not read the index"));
                                if (the_index.split_index) {
                                        const unsigned char *sha1 = the_index.split_index->base_sha1;
-                                       puts(git_path("sharedindex.%s", sha1_to_hex(sha1)));
+                                       const char *path = git_path("sharedindex.%s", sha1_to_hex(sha1));
+                                       strbuf_reset(&buf);
+                                       puts(relative_path(path, prefix, &buf));
                                }
                                continue;
                        }
-                       if (starts_with(arg, "--since=")) {
-                               show_datestring("--max-age=", arg+8);
+                       if (skip_prefix(arg, "--since=", &arg)) {
+                               show_datestring("--max-age=", arg);
                                continue;
                        }
-                       if (starts_with(arg, "--after=")) {
-                               show_datestring("--max-age=", arg+8);
+                       if (skip_prefix(arg, "--after=", &arg)) {
+                               show_datestring("--max-age=", arg);
                                continue;
                        }
-                       if (starts_with(arg, "--before=")) {
-                               show_datestring("--min-age=", arg+9);
+                       if (skip_prefix(arg, "--before=", &arg)) {
+                               show_datestring("--min-age=", arg);
                                continue;
                        }
-                       if (starts_with(arg, "--until=")) {
-                               show_datestring("--min-age=", arg+8);
+                       if (skip_prefix(arg, "--until=", &arg)) {
+                               show_datestring("--min-age=", arg);
                                continue;
                        }
                        if (show_flag(arg) && verify)
@@ -863,6 +926,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                        continue;
                verify_filename(prefix, arg, 1);
        }
+       strbuf_release(&buf);
        if (verify) {
                if (revs_count == 1) {
                        show_rev(type, sha1, name);
index 4e693808b197780c1029aaf886478795b3a6d0a1..345d9586a709c08a1095f2635833d075c45fe7be 100644 (file)
@@ -54,6 +54,24 @@ static int option_parse_x(const struct option *opt,
        return 0;
 }
 
+static int option_parse_m(const struct option *opt,
+                         const char *arg, int unset)
+{
+       struct replay_opts *replay = opt->value;
+       char *end;
+
+       if (unset) {
+               replay->mainline = 0;
+               return 0;
+       }
+
+       replay->mainline = strtol(arg, &end, 10);
+       if (*end || replay->mainline <= 0)
+               return opterror(opt, "expects a number greater than zero", 0);
+
+       return 0;
+}
+
 LAST_ARG_MUST_BE_NULL
 static void verify_opt_compatible(const char *me, const char *base_opt, ...)
 {
@@ -71,7 +89,7 @@ static void verify_opt_compatible(const char *me, const char *base_opt, ...)
                die(_("%s: %s cannot be used with %s"), me, this_opt, base_opt);
 }
 
-static void parse_args(int argc, const char **argv, struct replay_opts *opts)
+static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
 {
        const char * const * usage_str = revert_or_cherry_pick_usage(opts);
        const char *me = action_name(opts);
@@ -84,7 +102,8 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
                OPT_BOOL('e', "edit", &opts->edit, N_("edit the commit message")),
                OPT_NOOP_NOARG('r', NULL),
                OPT_BOOL('s', "signoff", &opts->signoff, N_("add Signed-off-by:")),
-               OPT_INTEGER('m', "mainline", &opts->mainline, N_("parent number")),
+               OPT_CALLBACK('m', "mainline", opts, N_("parent-number"),
+                            N_("select mainline parent"), option_parse_m),
                OPT_RERERE_AUTOUPDATE(&opts->allow_rerere_auto),
                OPT_STRING(0, "strategy", &opts->strategy, N_("strategy"), N_("merge strategy")),
                OPT_CALLBACK('X', "strategy-option", &opts, N_("option"),
@@ -115,25 +134,15 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
        if (opts->keep_redundant_commits)
                opts->allow_empty = 1;
 
-       /* Set the subcommand */
-       if (cmd == 'q')
-               opts->subcommand = REPLAY_REMOVE_STATE;
-       else if (cmd == 'c')
-               opts->subcommand = REPLAY_CONTINUE;
-       else if (cmd == 'a')
-               opts->subcommand = REPLAY_ROLLBACK;
-       else
-               opts->subcommand = REPLAY_NONE;
-
        /* Check for incompatible command line arguments */
-       if (opts->subcommand != REPLAY_NONE) {
+       if (cmd) {
                char *this_operation;
-               if (opts->subcommand == REPLAY_REMOVE_STATE)
+               if (cmd == 'q')
                        this_operation = "--quit";
-               else if (opts->subcommand == REPLAY_CONTINUE)
+               else if (cmd == 'c')
                        this_operation = "--continue";
                else {
-                       assert(opts->subcommand == REPLAY_ROLLBACK);
+                       assert(cmd == 'a');
                        this_operation = "--abort";
                }
 
@@ -156,7 +165,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
                                "--edit", opts->edit,
                                NULL);
 
-       if (opts->subcommand != REPLAY_NONE) {
+       if (cmd) {
                opts->revs = NULL;
        } else {
                struct setup_revision_opt s_r_opt;
@@ -174,20 +183,30 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
 
        if (argc > 1)
                usage_with_options(usage_str, options);
+
+       /* These option values will be free()d */
+       opts->gpg_sign = xstrdup_or_null(opts->gpg_sign);
+       opts->strategy = xstrdup_or_null(opts->strategy);
+
+       if (cmd == 'q')
+               return sequencer_remove_state(opts);
+       if (cmd == 'c')
+               return sequencer_continue(opts);
+       if (cmd == 'a')
+               return sequencer_rollback(opts);
+       return sequencer_pick_revisions(opts);
 }
 
 int cmd_revert(int argc, const char **argv, const char *prefix)
 {
-       struct replay_opts opts;
+       struct replay_opts opts = REPLAY_OPTS_INIT;
        int res;
 
-       memset(&opts, 0, sizeof(opts));
        if (isatty(0))
                opts.edit = 1;
        opts.action = REPLAY_REVERT;
        git_config(git_default_config, NULL);
-       parse_args(argc, argv, &opts);
-       res = sequencer_pick_revisions(&opts);
+       res = run_sequencer(argc, argv, &opts);
        if (res < 0)
                die(_("revert failed"));
        return res;
@@ -195,14 +214,12 @@ int cmd_revert(int argc, const char **argv, const char *prefix)
 
 int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
 {
-       struct replay_opts opts;
+       struct replay_opts opts = REPLAY_OPTS_INIT;
        int res;
 
-       memset(&opts, 0, sizeof(opts));
        opts.action = REPLAY_PICK;
        git_config(git_default_config, NULL);
-       parse_args(argc, argv, &opts);
-       res = sequencer_pick_revisions(&opts);
+       res = run_sequencer(argc, argv, &opts);
        if (res < 0)
                die(_("cherry-pick failed"));
        return res;
index b2fee3e90ab5439a86b06079c15ca1e4cc303e60..fb79dcab181558e79e3934363cac3c712ffbd3aa 100644 (file)
@@ -59,27 +59,9 @@ static void print_error_files(struct string_list *files_list,
        }
 }
 
-static void error_removing_concrete_submodules(struct string_list *files, int *errs)
-{
-       print_error_files(files,
-                         Q_("the following submodule (or one of its nested "
-                            "submodules)\n"
-                            "uses a .git directory:",
-                            "the following submodules (or one of their nested "
-                            "submodules)\n"
-                            "use a .git directory:", files->nr),
-                         _("\n(use 'rm -rf' if you really want to remove "
-                           "it including all of its history)"),
-                         errs);
-       string_list_clear(files, 0);
-}
-
-static int check_submodules_use_gitfiles(void)
+static void submodules_absorb_gitdir_if_needed(const char *prefix)
 {
        int i;
-       int errs = 0;
-       struct string_list files = STRING_LIST_INIT_NODUP;
-
        for (i = 0; i < list.nr; i++) {
                const char *name = list.entry[i].name;
                int pos;
@@ -99,15 +81,12 @@ static int check_submodules_use_gitfiles(void)
                        continue;
 
                if (!submodule_uses_gitfile(name))
-                       string_list_append(&files, name);
+                       absorb_git_dir_into_superproject(prefix, name,
+                               ABSORB_GITDIR_RECURSE_SUBMODULES);
        }
-
-       error_removing_concrete_submodules(&files, &errs);
-
-       return errs;
 }
 
-static int check_local_mod(unsigned char *head, int index_only)
+static int check_local_mod(struct object_id *head, int index_only)
 {
        /*
         * Items in list are already sorted in the cache order,
@@ -120,16 +99,15 @@ static int check_local_mod(unsigned char *head, int index_only)
        int errs = 0;
        struct string_list files_staged = STRING_LIST_INIT_NODUP;
        struct string_list files_cached = STRING_LIST_INIT_NODUP;
-       struct string_list files_submodule = STRING_LIST_INIT_NODUP;
        struct string_list files_local = STRING_LIST_INIT_NODUP;
 
-       no_head = is_null_sha1(head);
+       no_head = is_null_oid(head);
        for (i = 0; i < list.nr; i++) {
                struct stat st;
                int pos;
                const struct cache_entry *ce;
                const char *name = list.entry[i].name;
-               unsigned char sha1[20];
+               struct object_id oid;
                unsigned mode;
                int local_changes = 0;
                int staged_changes = 0;
@@ -187,7 +165,9 @@ static int check_local_mod(unsigned char *head, int index_only)
                 */
                if (ce_match_stat(ce, &st, 0) ||
                    (S_ISGITLINK(ce->ce_mode) &&
-                    !ok_to_remove_submodule(ce->name)))
+                    bad_to_remove_submodule(ce->name,
+                               SUBMODULE_REMOVAL_DIE_ON_ERROR |
+                               SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED)))
                        local_changes = 1;
 
                /*
@@ -197,9 +177,9 @@ static int check_local_mod(unsigned char *head, int index_only)
                 * way as changed from the HEAD.
                 */
                if (no_head
-                    || get_tree_entry(head, name, sha1, &mode)
+                    || get_tree_entry(head->hash, name, oid.hash, &mode)
                     || ce->ce_mode != create_ce_mode(mode)
-                    || hashcmp(ce->sha1, sha1))
+                    || oidcmp(&ce->oid, &oid))
                        staged_changes = 1;
 
                /*
@@ -217,13 +197,8 @@ static int check_local_mod(unsigned char *head, int index_only)
                else if (!index_only) {
                        if (staged_changes)
                                string_list_append(&files_cached, name);
-                       if (local_changes) {
-                               if (S_ISGITLINK(ce->ce_mode) &&
-                                   !submodule_uses_gitfile(name))
-                                       string_list_append(&files_submodule, name);
-                               else
-                                       string_list_append(&files_local, name);
-                       }
+                       if (local_changes)
+                               string_list_append(&files_local, name);
                }
        }
        print_error_files(&files_staged,
@@ -245,8 +220,6 @@ static int check_local_mod(unsigned char *head, int index_only)
                          &errs);
        string_list_clear(&files_cached, 0);
 
-       error_removing_concrete_submodules(&files_submodule, &errs);
-
        print_error_files(&files_local,
                          Q_("the following file has local modifications:",
                             "the following files have local modifications:",
@@ -292,7 +265,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
        if (!index_only)
                setup_work_tree();
 
-       hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
 
        if (read_cache() < 0)
                die(_("index file corrupt"));
@@ -340,6 +313,9 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                        exit(0);
        }
 
+       if (!index_only)
+               submodules_absorb_gitdir_if_needed(prefix);
+
        /*
         * If not forced, the file, the index and the HEAD (if exists)
         * must match; but the file can already been removed, since
@@ -351,13 +327,10 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
         * report no changes unless forced.
         */
        if (!force) {
-               unsigned char sha1[20];
-               if (get_sha1("HEAD", sha1))
-                       hashclr(sha1);
-               if (check_local_mod(sha1, index_only))
-                       exit(1);
-       } else if (!index_only) {
-               if (check_submodules_use_gitfiles())
+               struct object_id oid;
+               if (get_oid("HEAD", &oid))
+                       oidclr(&oid);
+               if (check_local_mod(&oid, index_only))
                        exit(1);
        }
 
@@ -391,28 +364,15 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                for (i = 0; i < list.nr; i++) {
                        const char *path = list.entry[i].name;
                        if (list.entry[i].is_submodule) {
-                               if (is_empty_dir(path)) {
-                                       if (!rmdir(path)) {
-                                               removed = 1;
-                                               if (!remove_path_from_gitmodules(path))
-                                                       gitmodules_modified = 1;
-                                               continue;
-                                       }
-                               } else {
-                                       strbuf_reset(&buf);
-                                       strbuf_addstr(&buf, path);
-                                       if (!remove_dir_recursively(&buf, 0)) {
-                                               removed = 1;
-                                               if (!remove_path_from_gitmodules(path))
-                                                       gitmodules_modified = 1;
-                                               strbuf_release(&buf);
-                                               continue;
-                                       } else if (!file_exists(path))
-                                               /* Submodule was removed by user */
-                                               if (!remove_path_from_gitmodules(path))
-                                                       gitmodules_modified = 1;
-                                       /* Fallthrough and let remove_path() fail. */
-                               }
+                               strbuf_reset(&buf);
+                               strbuf_addstr(&buf, path);
+                               if (remove_dir_recursively(&buf, 0))
+                                       die(_("could not remove '%s'"), path);
+
+                               removed = 1;
+                               if (!remove_path_from_gitmodules(path))
+                                       gitmodules_modified = 1;
+                               continue;
                        }
                        if (!remove_path(path)) {
                                removed = 1;
index 1ff5a6753803f8c2ccb5e66dcb926582bd25fd37..b8e2e74fe0c5cdefa6ed4d6c309a8bba203cc6e8 100644 (file)
@@ -131,8 +131,8 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
        const char *dest = NULL;
        int fd[2];
        struct child_process *conn;
-       struct sha1_array extra_have = SHA1_ARRAY_INIT;
-       struct sha1_array shallow = SHA1_ARRAY_INIT;
+       struct oid_array extra_have = OID_ARRAY_INIT;
+       struct oid_array shallow = OID_ARRAY_INIT;
        struct ref *remote_refs, *local_refs;
        int ret;
        int helper_status = 0;
@@ -144,6 +144,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
        unsigned force_update = 0;
        unsigned quiet = 0;
        int push_cert = 0;
+       struct string_list push_options = STRING_LIST_INIT_NODUP;
        unsigned use_thin_pack = 0;
        unsigned atomic = 0;
        unsigned stateless_rpc = 0;
@@ -165,6 +166,9 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
                { OPTION_CALLBACK,
                  0, "signed", &push_cert, "yes|no|if-asked", N_("GPG sign the push"),
                  PARSE_OPT_OPTARG, option_parse_push_signed },
+               OPT_STRING_LIST(0, "push-option", &push_options,
+                               N_("server-specific"),
+                               N_("option to transmit")),
                OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
                OPT_BOOL(0, "thin", &use_thin_pack, N_("use thin pack")),
                OPT_BOOL(0, "atomic", &atomic, N_("request atomic transaction on remote side")),
@@ -199,6 +203,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
        args.use_thin_pack = use_thin_pack;
        args.atomic = atomic;
        args.stateless_rpc = stateless_rpc;
+       args.push_options = push_options.nr ? &push_options : NULL;
 
        if (from_stdin) {
                struct argv_array all_refspecs = ARGV_ARRAY_INIT;
index 25fa8a6aed72bb91c3b99121059a90cc976976a5..7cff1839fc15f46d58c9f78361f362d1d790cbd9 100644 (file)
@@ -117,11 +117,15 @@ static void read_from_stdin(struct shortlog *log)
 {
        struct strbuf author = STRBUF_INIT;
        struct strbuf oneline = STRBUF_INIT;
+       static const char *author_match[2] = { "Author: ", "author " };
+       static const char *committer_match[2] = { "Commit: ", "committer " };
+       const char **match;
 
+       match = log->committer ? committer_match : author_match;
        while (strbuf_getline_lf(&author, stdin) != EOF) {
                const char *v;
-               if (!skip_prefix(author.buf, "Author: ", &v) &&
-                   !skip_prefix(author.buf, "author ", &v))
+               if (!skip_prefix(author.buf, match[0], &v) &&
+                   !skip_prefix(author.buf, match[1], &v))
                        continue;
                while (strbuf_getline_lf(&oneline, stdin) != EOF &&
                       oneline.len)
@@ -140,15 +144,17 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
        struct strbuf author = STRBUF_INIT;
        struct strbuf oneline = STRBUF_INIT;
        struct pretty_print_context ctx = {0};
+       const char *fmt;
 
        ctx.fmt = CMIT_FMT_USERFORMAT;
        ctx.abbrev = log->abbrev;
-       ctx.subject = "";
-       ctx.after_subject = "";
+       ctx.print_email_subject = 1;
        ctx.date_mode.type = DATE_NORMAL;
        ctx.output_encoding = get_log_output_encoding();
 
-       format_commit_message(commit, "%an <%ae>", &author, &ctx);
+       fmt = log->committer ? "%cn <%ce>" : "%an <%ae>";
+
+       format_commit_message(commit, fmt, &author, &ctx);
        if (!log->summary) {
                if (log->user_format)
                        pretty_print_commit(&ctx, commit, &oneline);
@@ -238,6 +244,8 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
        int nongit = !startup_info->have_repository;
 
        const struct option options[] = {
+               OPT_BOOL('c', "committer", &log.committer,
+                        N_("Group by committer rather than author")),
                OPT_BOOL('n', "numbered", &log.sort_by_number,
                         N_("sort output according to the number of commits per author")),
                OPT_BOOL('s', "summary", &log.summary,
@@ -308,7 +316,7 @@ void shortlog_output(struct shortlog *log)
        struct strbuf sb = STRBUF_INIT;
 
        if (log->sort_by_number)
-               qsort(log->list.items, log->list.nr, sizeof(struct string_list_item),
+               QSORT(log->list.items, log->list.nr,
                      log->summary ? compare_by_counter : compare_by_list);
        for (i = 0; i < log->list.nr; i++) {
                const struct string_list_item *item = &log->list.items[i];
index 25669357e97e892ffb050d879b74d13a91d4fafc..19756595d57f27c35c72449d03a95cefd55aef15 100644 (file)
@@ -275,8 +275,7 @@ static void show_one_commit(struct commit *commit, int no_name)
                pp_commit_easy(CMIT_FMT_ONELINE, commit, &pretty);
                pretty_str = pretty.buf;
        }
-       if (starts_with(pretty_str, "[PATCH] "))
-               pretty_str += 8;
+       skip_prefix(pretty_str, "[PATCH] ", &pretty_str);
 
        if (!no_name) {
                if (name && name->head_name) {
@@ -353,8 +352,7 @@ static int compare_ref_name(const void *a_, const void *b_)
 
 static void sort_ref_range(int bottom, int top)
 {
-       qsort(ref_name + bottom, top - bottom, sizeof(ref_name[0]),
-             compare_ref_name);
+       QSORT(ref_name + bottom, top - bottom, compare_ref_name);
 }
 
 static int append_ref(const char *refname, const struct object_id *oid,
@@ -373,8 +371,9 @@ static int append_ref(const char *refname, const struct object_id *oid,
                                return 0;
        }
        if (MAX_REVS <= ref_name_cnt) {
-               warning("ignoring %s; cannot handle more than %d refs",
-                       refname, MAX_REVS);
+               warning(Q_("ignoring %s; cannot handle more than %d ref",
+                          "ignoring %s; cannot handle more than %d refs",
+                          MAX_REVS), refname, MAX_REVS);
                return 0;
        }
        ref_name[ref_name_cnt++] = xstrdup(refname);
@@ -470,18 +469,14 @@ static void snarf_refs(int head, int remotes)
        }
 }
 
-static int rev_is_head(char *head, int headlen, char *name,
+static int rev_is_head(const char *head, const char *name,
                       unsigned char *head_sha1, unsigned char *sha1)
 {
-       if ((!head[0]) ||
-           (head_sha1 && sha1 && hashcmp(head_sha1, sha1)))
+       if (!head || (head_sha1 && sha1 && hashcmp(head_sha1, sha1)))
                return 0;
-       if (starts_with(head, "refs/heads/"))
-               head += 11;
-       if (starts_with(name, "refs/heads/"))
-               name += 11;
-       else if (starts_with(name, "heads/"))
-               name += 6;
+       skip_prefix(head, "refs/heads/", &head);
+       if (!skip_prefix(name, "refs/heads/", &name))
+               skip_prefix(name, "heads/", &name);
        return !strcmp(head, name);
 }
 
@@ -538,9 +533,8 @@ static void append_one_rev(const char *av)
                for_each_ref(append_matching_ref, NULL);
                if (saved_matches == ref_name_cnt &&
                    ref_name_cnt < MAX_REVS)
-                       error("no matching refs with %s", av);
-               if (saved_matches + 1 < ref_name_cnt)
-                       sort_ref_range(saved_matches, ref_name_cnt);
+                       error(_("no matching refs with %s"), av);
+               sort_ref_range(saved_matches, ref_name_cnt);
                return;
        }
        die("bad sha1 reference %s", av);
@@ -621,9 +615,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
        int all_heads = 0, all_remotes = 0;
        int all_mask, all_revs;
        enum rev_sort_order sort_order = REV_SORT_IN_GRAPH_ORDER;
-       char head[128];
-       const char *head_p;
-       int head_len;
+       char *head;
        struct object_id head_oid;
        int merge_base = 0;
        int independent = 0;
@@ -701,8 +693,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                         *
                         * Also --all and --remotes do not make sense either.
                         */
-                       die("--reflog is incompatible with --all, --remotes, "
-                           "--independent or --merge-base");
+                       die(_("--reflog is incompatible with --all, --remotes, "
+                             "--independent or --merge-base"));
        }
 
        /* If nothing is specified, show all branches by default */
@@ -725,16 +717,17 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                        av = fake_av;
                        ac = 1;
                        if (!*av)
-                               die("no branches given, and HEAD is not valid");
+                               die(_("no branches given, and HEAD is not valid"));
                }
                if (ac != 1)
-                       die("--reflog option needs one branch name");
+                       die(_("--reflog option needs one branch name"));
 
                if (MAX_REVS < reflog)
-                       die("Only %d entries can be shown at one time.",
-                           MAX_REVS);
+                       die(Q_("only %d entry can be shown at one time.",
+                              "only %d entries can be shown at one time.",
+                              MAX_REVS), MAX_REVS);
                if (!dwim_ref(*av, strlen(*av), oid.hash, &ref))
-                       die("No such ref %s", *av);
+                       die(_("no such ref %s"), *av);
 
                /* Has the base been specified? */
                if (reflog_base) {
@@ -787,32 +780,24 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                        snarf_refs(all_heads, all_remotes);
        }
 
-       head_p = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
-                                   head_oid.hash, NULL);
-       if (head_p) {
-               head_len = strlen(head_p);
-               memcpy(head, head_p, head_len + 1);
-       }
-       else {
-               head_len = 0;
-               head[0] = 0;
-       }
+       head = resolve_refdup("HEAD", RESOLVE_REF_READING,
+                             head_oid.hash, NULL);
 
-       if (with_current_branch && head_p) {
+       if (with_current_branch && head) {
                int has_head = 0;
                for (i = 0; !has_head && i < ref_name_cnt; i++) {
                        /* We are only interested in adding the branch
                         * HEAD points at.
                         */
                        if (rev_is_head(head,
-                                       head_len,
                                        ref_name[i],
                                        head_oid.hash, NULL))
                                has_head++;
                }
                if (!has_head) {
-                       int offset = starts_with(head, "refs/heads/") ? 11 : 0;
-                       append_one_rev(head + offset);
+                       const char *name = head;
+                       skip_prefix(name, "refs/heads/", &name);
+                       append_one_rev(name);
                }
        }
 
@@ -826,12 +811,14 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                unsigned int flag = 1u << (num_rev + REV_SHIFT);
 
                if (MAX_REVS <= num_rev)
-                       die("cannot handle more than %d revs.", MAX_REVS);
+                       die(Q_("cannot handle more than %d rev.",
+                              "cannot handle more than %d revs.",
+                              MAX_REVS), MAX_REVS);
                if (get_sha1(ref_name[num_rev], revkey.hash))
-                       die("'%s' is not a valid ref.", ref_name[num_rev]);
+                       die(_("'%s' is not a valid ref."), ref_name[num_rev]);
                commit = lookup_commit_reference(revkey.hash);
                if (!commit)
-                       die("cannot find commit %s (%s)",
+                       die(_("cannot find commit %s (%s)"),
                            ref_name[num_rev], oid_to_hex(&revkey));
                parse_commit(commit);
                mark_seen(commit, &seen);
@@ -864,7 +851,6 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                for (i = 0; i < num_rev; i++) {
                        int j;
                        int is_head = rev_is_head(head,
-                                                 head_len,
                                                  ref_name[i],
                                                  head_oid.hash,
                                                  rev[i]->object.oid.hash);
index 6d4e669002b1e58ebf40af5543221d809ffd0427..013d241abc09be76c318dbc25d5fb3b40ade7b3a 100644 (file)
@@ -19,19 +19,34 @@ static const char *exclude_existing_arg;
 
 static void show_one(const char *refname, const struct object_id *oid)
 {
-       const char *hex = find_unique_abbrev(oid->hash, abbrev);
+       const char *hex;
+       struct object_id peeled;
+
+       if (!has_sha1_file(oid->hash))
+               die("git show-ref: bad ref %s (%s)", refname,
+                   oid_to_hex(oid));
+
+       if (quiet)
+               return;
+
+       hex = find_unique_abbrev(oid->hash, abbrev);
        if (hash_only)
                printf("%s\n", hex);
        else
                printf("%s %s\n", hex, refname);
+
+       if (!deref_tags)
+               return;
+
+       if (!peel_ref(refname, peeled.hash)) {
+               hex = find_unique_abbrev(peeled.hash, abbrev);
+               printf("%s %s^{}\n", hex, refname);
+       }
 }
 
 static int show_ref(const char *refname, const struct object_id *oid,
                    int flag, void *cbdata)
 {
-       const char *hex;
-       struct object_id peeled;
-
        if (show_head && !strcmp(refname, "HEAD"))
                goto match;
 
@@ -54,9 +69,6 @@ static int show_ref(const char *refname, const struct object_id *oid,
                                continue;
                        if (len == reflen)
                                goto match;
-                       /* "--verify" requires an exact match */
-                       if (verify)
-                               continue;
                        if (refname[reflen - len - 1] == '/')
                                goto match;
                }
@@ -66,26 +78,8 @@ static int show_ref(const char *refname, const struct object_id *oid,
 match:
        found_match++;
 
-       /* This changes the semantics slightly that even under quiet we
-        * detect and return error if the repository is corrupt and
-        * ref points at a nonexistent object.
-        */
-       if (!has_sha1_file(oid->hash))
-               die("git show-ref: bad ref %s (%s)", refname,
-                   oid_to_hex(oid));
-
-       if (quiet)
-               return 0;
-
        show_one(refname, oid);
 
-       if (!deref_tags)
-               return 0;
-
-       if (!peel_ref(refname, peeled.hash)) {
-               hex = find_unique_abbrev(peeled.hash, abbrev);
-               printf("%s %s^{}\n", hex, refname);
-       }
        return 0;
 }
 
@@ -202,10 +196,9 @@ int cmd_show_ref(int argc, const char **argv, const char *prefix)
                while (*pattern) {
                        struct object_id oid;
 
-                       if (starts_with(*pattern, "refs/") &&
+                       if ((starts_with(*pattern, "refs/") || !strcmp(*pattern, "HEAD")) &&
                            !read_ref(*pattern, oid.hash)) {
-                               if (!quiet)
-                                       show_one(*pattern, &oid);
+                               show_one(*pattern, &oid);
                        }
                        else if (!quiet)
                                die("'%s' - not a valid ref", *pattern);
index 15e716ef4322bb53428685c349aa489ed84a6dda..1e62a008cbc57691c6a0055f0286a2c11d1e3122 100644 (file)
@@ -44,8 +44,10 @@ int cmd_stripspace(int argc, const char **argv, const char *prefix)
        if (argc)
                usage_with_options(stripspace_usage, options);
 
-       if (mode == STRIP_COMMENTS || mode == COMMENT_LINES)
+       if (mode == STRIP_COMMENTS || mode == COMMENT_LINES) {
+               setup_git_directory_gently(NULL);
                git_config(git_default_config, NULL);
+       }
 
        if (strbuf_read(&buf, 0, 1024) < 0)
                die_errno("could not read the input");
index dbe5699fe688faeec3bdad899f229746b96be57f..566a5b6a6f8937742e83577918a94f0dcb20c66c 100644 (file)
@@ -95,6 +95,8 @@ static int chop_last_dir(char **remoteurl, int is_relative)
  * NEEDSWORK: This works incorrectly on the domain and protocol part.
  * remote_url      url              outcome          expectation
  * http://a.com/b  ../c             http://a.com/c   as is
+ * http://a.com/b/ ../c             http://a.com/c   same as previous line, but
+ *                                                   ignore trailing slash in url
  * http://a.com/b  ../../c          http://c         error out
  * http://a.com/b  ../../../c       http:/c          error out
  * http://a.com/b  ../../../../c    http:c           error out
@@ -113,8 +115,8 @@ static char *relative_url(const char *remote_url,
        struct strbuf sb = STRBUF_INIT;
        size_t len = strlen(remoteurl);
 
-       if (is_dir_sep(remoteurl[len]))
-               remoteurl[len] = '\0';
+       if (is_dir_sep(remoteurl[len-1]))
+               remoteurl[len-1] = '\0';
 
        if (!url_is_local_not_ssh(remoteurl) || is_absolute_path(remoteurl))
                is_relative = 0;
@@ -147,6 +149,8 @@ static char *relative_url(const char *remote_url,
        }
        strbuf_reset(&sb);
        strbuf_addf(&sb, "%s%s%s", remoteurl, colonsep ? ":" : "/", url);
+       if (ends_with(url, "/"))
+               strbuf_setlen(&sb, sb.len - 1);
        free(remoteurl);
 
        if (starts_with_dot_slash(sb.buf))
@@ -266,6 +270,29 @@ static int module_list_compute(int argc, const char **argv,
        return result;
 }
 
+static void module_list_active(struct module_list *list)
+{
+       int i;
+       struct module_list active_modules = MODULE_LIST_INIT;
+
+       gitmodules_config();
+
+       for (i = 0; i < list->nr; i++) {
+               const struct cache_entry *ce = list->entries[i];
+
+               if (!is_submodule_initialized(ce->name))
+                       continue;
+
+               ALLOC_GROW(active_modules.entries,
+                          active_modules.nr + 1,
+                          active_modules.alloc);
+               active_modules.entries[active_modules.nr++] = ce;
+       }
+
+       free(list->entries);
+       *list = active_modules;
+}
+
 static int module_list(int argc, const char **argv, const char *prefix)
 {
        int i;
@@ -296,7 +323,8 @@ static int module_list(int argc, const char **argv, const char *prefix)
                if (ce_stage(ce))
                        printf("%06o %s U\t", ce->ce_mode, sha1_to_hex(null_sha1));
                else
-                       printf("%06o %s %d\t", ce->ce_mode, sha1_to_hex(ce->sha1), ce_stage(ce));
+                       printf("%06o %s %d\t", ce->ce_mode,
+                              oid_to_hex(&ce->oid), ce_stage(ce));
 
                utf8_fprintf(stdout, "%s\n", ce->name);
        }
@@ -312,8 +340,12 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
        /* Only loads from .gitmodules, no overlay with .git/config */
        gitmodules_config();
 
-       if (prefix) {
-               strbuf_addf(&sb, "%s%s", prefix, path);
+       if (prefix && get_super_prefix())
+               die("BUG: cannot have prefix and superprefix");
+       else if (prefix)
+               displaypath = xstrdup(relative_path(path, prefix, &sb));
+       else if (get_super_prefix()) {
+               strbuf_addf(&sb, "%s%s", get_super_prefix(), path);
                displaypath = strbuf_detach(&sb, NULL);
        } else
                displaypath = xstrdup(path);
@@ -324,6 +356,18 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
                die(_("No url found for submodule path '%s' in .gitmodules"),
                        displaypath);
 
+       /*
+        * NEEDSWORK: In a multi-working-tree world, this needs to be
+        * set in the per-worktree config.
+        *
+        * Set active flag for the submodule being initialized
+        */
+       if (!is_submodule_initialized(path)) {
+               strbuf_reset(&sb);
+               strbuf_addf(&sb, "submodule.%s.active", sub->name);
+               git_config_set_gently(sb.buf, "true");
+       }
+
        /*
         * Copy url setting when it is not set yet.
         * To look up the url in .git/config, we must not fall back to
@@ -332,12 +376,12 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
        strbuf_reset(&sb);
        strbuf_addf(&sb, "submodule.%s.url", sub->name);
        if (git_config_get_string(sb.buf, &url)) {
-               url = xstrdup(sub->url);
-
-               if (!url)
+               if (!sub->url)
                        die(_("No url found for submodule path '%s' in .gitmodules"),
                                displaypath);
 
+               url = xstrdup(sub->url);
+
                /* Possibly a url relative to parent */
                if (starts_with_dot_dot_slash(url) ||
                    starts_with_dot_slash(url)) {
@@ -347,12 +391,10 @@ static void init_submodule(const char *path, const char *prefix, int quiet)
                        strbuf_addf(&remotesb, "remote.%s.url", remote);
                        free(remote);
 
-                       if (git_config_get_string(remotesb.buf, &remoteurl))
-                               /*
-                                * The repository is its own
-                                * authoritative upstream
-                                */
+                       if (git_config_get_string(remotesb.buf, &remoteurl)) {
+                               warning(_("could not lookup configuration '%s'. Assuming this repository is its own authoritative upstream."), remotesb.buf);
                                remoteurl = xgetcwd();
+                       }
                        relurl = relative_url(remoteurl, url, NULL);
                        strbuf_release(&remotesb);
                        free(remoteurl);
@@ -398,9 +440,6 @@ static int module_init(int argc, const char **argv, const char *prefix)
        int i;
 
        struct option module_init_options[] = {
-               OPT_STRING(0, "prefix", &prefix,
-                          N_("path"),
-                          N_("alternative anchor for relative paths")),
                OPT__QUIET(&quiet, N_("Suppress output for initializing a submodule")),
                OPT_END()
        };
@@ -416,6 +455,13 @@ static int module_init(int argc, const char **argv, const char *prefix)
        if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
                return 1;
 
+       /*
+        * If there are no path args and submodule.active is set then,
+        * by default, only initialize 'active' modules.
+        */
+       if (!argc && git_config_get_value_multi("submodule.active"))
+               module_list_active(&list);
+
        for (i = 0; i < list.nr; i++)
                init_submodule(list.entries[i]->name, prefix, quiet);
 
@@ -442,7 +488,8 @@ static int module_name(int argc, const char **argv, const char *prefix)
 }
 
 static int clone_submodule(const char *path, const char *gitdir, const char *url,
-                          const char *depth, const char *reference, int quiet)
+                          const char *depth, struct string_list *reference,
+                          int quiet, int progress)
 {
        struct child_process cp = CHILD_PROCESS_INIT;
 
@@ -450,10 +497,16 @@ static int clone_submodule(const char *path, const char *gitdir, const char *url
        argv_array_push(&cp.args, "--no-checkout");
        if (quiet)
                argv_array_push(&cp.args, "--quiet");
+       if (progress)
+               argv_array_push(&cp.args, "--progress");
        if (depth && *depth)
                argv_array_pushl(&cp.args, "--depth", depth, NULL);
-       if (reference && *reference)
-               argv_array_pushl(&cp.args, "--reference", reference, NULL);
+       if (reference->nr) {
+               struct string_list_item *item;
+               for_each_string_list_item(item, reference)
+                       argv_array_pushl(&cp.args, "--reference",
+                                        item->string, NULL);
+       }
        if (gitdir && *gitdir)
                argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL);
 
@@ -467,15 +520,109 @@ static int clone_submodule(const char *path, const char *gitdir, const char *url
        return run_command(&cp);
 }
 
+struct submodule_alternate_setup {
+       const char *submodule_name;
+       enum SUBMODULE_ALTERNATE_ERROR_MODE {
+               SUBMODULE_ALTERNATE_ERROR_DIE,
+               SUBMODULE_ALTERNATE_ERROR_INFO,
+               SUBMODULE_ALTERNATE_ERROR_IGNORE
+       } error_mode;
+       struct string_list *reference;
+};
+#define SUBMODULE_ALTERNATE_SETUP_INIT { NULL, \
+       SUBMODULE_ALTERNATE_ERROR_IGNORE, NULL }
+
+static int add_possible_reference_from_superproject(
+               struct alternate_object_database *alt, void *sas_cb)
+{
+       struct submodule_alternate_setup *sas = sas_cb;
+
+       /*
+        * If the alternate object store is another repository, try the
+        * standard layout with .git/(modules/<name>)+/objects
+        */
+       if (ends_with(alt->path, "/objects")) {
+               char *sm_alternate;
+               struct strbuf sb = STRBUF_INIT;
+               struct strbuf err = STRBUF_INIT;
+               strbuf_add(&sb, alt->path, strlen(alt->path) - strlen("objects"));
+
+               /*
+                * We need to end the new path with '/' to mark it as a dir,
+                * otherwise a submodule name containing '/' will be broken
+                * as the last part of a missing submodule reference would
+                * be taken as a file name.
+                */
+               strbuf_addf(&sb, "modules/%s/", sas->submodule_name);
+
+               sm_alternate = compute_alternate_path(sb.buf, &err);
+               if (sm_alternate) {
+                       string_list_append(sas->reference, xstrdup(sb.buf));
+                       free(sm_alternate);
+               } else {
+                       switch (sas->error_mode) {
+                       case SUBMODULE_ALTERNATE_ERROR_DIE:
+                               die(_("submodule '%s' cannot add alternate: %s"),
+                                   sas->submodule_name, err.buf);
+                       case SUBMODULE_ALTERNATE_ERROR_INFO:
+                               fprintf(stderr, _("submodule '%s' cannot add alternate: %s"),
+                                       sas->submodule_name, err.buf);
+                       case SUBMODULE_ALTERNATE_ERROR_IGNORE:
+                               ; /* nothing */
+                       }
+               }
+               strbuf_release(&sb);
+       }
+
+       return 0;
+}
+
+static void prepare_possible_alternates(const char *sm_name,
+               struct string_list *reference)
+{
+       char *sm_alternate = NULL, *error_strategy = NULL;
+       struct submodule_alternate_setup sas = SUBMODULE_ALTERNATE_SETUP_INIT;
+
+       git_config_get_string("submodule.alternateLocation", &sm_alternate);
+       if (!sm_alternate)
+               return;
+
+       git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
+
+       if (!error_strategy)
+               error_strategy = xstrdup("die");
+
+       sas.submodule_name = sm_name;
+       sas.reference = reference;
+       if (!strcmp(error_strategy, "die"))
+               sas.error_mode = SUBMODULE_ALTERNATE_ERROR_DIE;
+       else if (!strcmp(error_strategy, "info"))
+               sas.error_mode = SUBMODULE_ALTERNATE_ERROR_INFO;
+       else if (!strcmp(error_strategy, "ignore"))
+               sas.error_mode = SUBMODULE_ALTERNATE_ERROR_IGNORE;
+       else
+               die(_("Value '%s' for submodule.alternateErrorStrategy is not recognized"), error_strategy);
+
+       if (!strcmp(sm_alternate, "superproject"))
+               foreach_alt_odb(add_possible_reference_from_superproject, &sas);
+       else if (!strcmp(sm_alternate, "no"))
+               ; /* do nothing */
+       else
+               die(_("Value '%s' for submodule.alternateLocation is not recognized"), sm_alternate);
+
+       free(sm_alternate);
+       free(error_strategy);
+}
+
 static int module_clone(int argc, const char **argv, const char *prefix)
 {
-       const char *name = NULL, *url = NULL;
-       const char *reference = NULL, *depth = NULL;
+       const char *name = NULL, *url = NULL, *depth = NULL;
        int quiet = 0;
-       FILE *submodule_dot_git;
+       int progress = 0;
        char *p, *path = NULL, *sm_gitdir;
-       struct strbuf rel_path = STRBUF_INIT;
        struct strbuf sb = STRBUF_INIT;
+       struct string_list reference = STRING_LIST_INIT_NODUP;
+       char *sm_alternate = NULL, *error_strategy = NULL;
 
        struct option module_clone_options[] = {
                OPT_STRING(0, "prefix", &prefix,
@@ -490,13 +637,15 @@ static int module_clone(int argc, const char **argv, const char *prefix)
                OPT_STRING(0, "url", &url,
                           N_("string"),
                           N_("url where to clone the submodule from")),
-               OPT_STRING(0, "reference", &reference,
-                          N_("string"),
+               OPT_STRING_LIST(0, "reference", &reference,
+                          N_("repo"),
                           N_("reference repository")),
                OPT_STRING(0, "depth", &depth,
                           N_("string"),
                           N_("depth for shallow clones")),
                OPT__QUIET(&quiet, "Suppress output for cloning a submodule"),
+               OPT_BOOL(0, "progress", &progress,
+                          N_("force cloning progress")),
                OPT_END()
        };
 
@@ -515,7 +664,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
                                   module_clone_options);
 
        strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
-       sm_gitdir = xstrdup(absolute_path(sb.buf));
+       sm_gitdir = absolute_pathdup(sb.buf);
        strbuf_reset(&sb);
 
        if (!is_absolute_path(path)) {
@@ -527,7 +676,11 @@ static int module_clone(int argc, const char **argv, const char *prefix)
        if (!file_exists(sm_gitdir)) {
                if (safe_create_leading_directories_const(sm_gitdir) < 0)
                        die(_("could not create directory '%s'"), sm_gitdir);
-               if (clone_submodule(path, sm_gitdir, url, depth, reference, quiet))
+
+               prepare_possible_alternates(name, &reference);
+
+               if (clone_submodule(path, sm_gitdir, url, depth, &reference,
+                                   quiet, progress))
                        die(_("clone of '%s' into submodule path '%s' failed"),
                            url, path);
        } else {
@@ -538,29 +691,27 @@ static int module_clone(int argc, const char **argv, const char *prefix)
                strbuf_reset(&sb);
        }
 
-       /* Write a .git file in the submodule to redirect to the superproject. */
-       strbuf_addf(&sb, "%s/.git", path);
-       if (safe_create_leading_directories_const(sb.buf) < 0)
-               die(_("could not create leading directories of '%s'"), sb.buf);
-       submodule_dot_git = fopen(sb.buf, "w");
-       if (!submodule_dot_git)
-               die_errno(_("cannot open file '%s'"), sb.buf);
-
-       fprintf_or_die(submodule_dot_git, "gitdir: %s\n",
-                      relative_path(sm_gitdir, path, &rel_path));
-       if (fclose(submodule_dot_git))
-               die(_("could not close file %s"), sb.buf);
-       strbuf_reset(&sb);
-       strbuf_reset(&rel_path);
+       /* Connect module worktree and git dir */
+       connect_work_tree_and_git_dir(path, sm_gitdir);
 
-       /* Redirect the worktree of the submodule in the superproject's config */
        p = git_pathdup_submodule(path, "config");
        if (!p)
                die(_("could not get submodule directory for '%s'"), path);
-       git_config_set_in_file(p, "core.worktree",
-                              relative_path(path, sm_gitdir, &rel_path));
+
+       /* setup alternateLocation and alternateErrorStrategy in the cloned submodule if needed */
+       git_config_get_string("submodule.alternateLocation", &sm_alternate);
+       if (sm_alternate)
+               git_config_set_in_file(p, "submodule.alternateLocation",
+                                          sm_alternate);
+       git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
+       if (error_strategy)
+               git_config_set_in_file(p, "submodule.alternateErrorStrategy",
+                                          error_strategy);
+
+       free(sm_alternate);
+       free(error_strategy);
+
        strbuf_release(&sb);
-       strbuf_release(&rel_path);
        free(sm_gitdir);
        free(path);
        free(p);
@@ -577,9 +728,10 @@ struct submodule_update_clone {
        struct submodule_update_strategy update;
 
        /* configuration parameters which are passed on to the children */
+       int progress;
        int quiet;
        int recommend_shallow;
-       const char *reference;
+       struct string_list references;
        const char *depth;
        const char *recursive_prefix;
        const char *prefix;
@@ -595,7 +747,8 @@ struct submodule_update_clone {
        int failed_clones_nr, failed_clones_alloc;
 };
 #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \
-       SUBMODULE_UPDATE_STRATEGY_INIT, 0, -1, NULL, NULL, NULL, NULL, \
+       SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, \
+       NULL, NULL, NULL, \
        STRING_LIST_INIT_DUP, 0, NULL, 0, 0}
 
 
@@ -630,7 +783,6 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
        struct strbuf displaypath_sb = STRBUF_INIT;
        struct strbuf sb = STRBUF_INIT;
        const char *displaypath = NULL;
-       char *url = NULL;
        int needs_cloning = 0;
 
        if (ce_stage(ce)) {
@@ -664,15 +816,8 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
                goto cleanup;
        }
 
-       /*
-        * Looking up the url in .git/config.
-        * We must not fall back to .gitmodules as we only want
-        * to process configured submodules.
-        */
-       strbuf_reset(&sb);
-       strbuf_addf(&sb, "submodule.%s.url", sub->name);
-       git_config_get_string(sb.buf, &url);
-       if (!url) {
+       /* Check if the submodule has been initialized. */
+       if (!is_submodule_initialized(ce->name)) {
                next_submodule_warn_missing(suc, out, displaypath);
                goto cleanup;
        }
@@ -683,7 +828,7 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
 
        strbuf_reset(&sb);
        strbuf_addf(&sb, "%06o %s %d %d\t%s\n", ce->ce_mode,
-                       sha1_to_hex(ce->sha1), ce_stage(ce),
+                       oid_to_hex(&ce->oid), ce_stage(ce),
                        needs_cloning, ce->name);
        string_list_append(&suc->projectlines, sb.buf);
 
@@ -696,6 +841,8 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
        child->err = -1;
        argv_array_push(&child->args, "submodule--helper");
        argv_array_push(&child->args, "clone");
+       if (suc->progress)
+               argv_array_push(&child->args, "--progress");
        if (suc->quiet)
                argv_array_push(&child->args, "--quiet");
        if (suc->prefix)
@@ -704,14 +851,16 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
                argv_array_push(&child->args, "--depth=1");
        argv_array_pushl(&child->args, "--path", sub->path, NULL);
        argv_array_pushl(&child->args, "--name", sub->name, NULL);
-       argv_array_pushl(&child->args, "--url", url, NULL);
-       if (suc->reference)
-               argv_array_push(&child->args, suc->reference);
+       argv_array_pushl(&child->args, "--url", sub->url, NULL);
+       if (suc->references.nr) {
+               struct string_list_item *item;
+               for_each_string_list_item(item, &suc->references)
+                       argv_array_pushl(&child->args, "--reference", item->string, NULL);
+       }
        if (suc->depth)
                argv_array_push(&child->args, suc->depth);
 
 cleanup:
-       free(url);
        strbuf_reset(&displaypath_sb);
        strbuf_reset(&sb);
 
@@ -830,7 +979,7 @@ static int update_clone(int argc, const char **argv, const char *prefix)
                OPT_STRING(0, "update", &update,
                           N_("string"),
                           N_("rebase, merge, checkout or none")),
-               OPT_STRING(0, "reference", &suc.reference, N_("repo"),
+               OPT_STRING_LIST(0, "reference", &suc.references, N_("repo"),
                           N_("reference repository")),
                OPT_STRING(0, "depth", &suc.depth, "<depth>",
                           N_("Create a shallow clone truncated to the "
@@ -840,6 +989,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
                OPT_BOOL(0, "recommend-shallow", &suc.recommend_shallow,
                            N_("whether the initial clone should follow the shallow recommendation")),
                OPT__QUIET(&suc.quiet, N_("don't print cloning progress")),
+               OPT_BOOL(0, "progress", &suc.progress,
+                           N_("force cloning progress")),
                OPT_END()
        };
 
@@ -954,21 +1105,118 @@ static int resolve_remote_submodule_branch(int argc, const char **argv,
        return 0;
 }
 
+static int push_check(int argc, const char **argv, const char *prefix)
+{
+       struct remote *remote;
+
+       if (argc < 2)
+               die("submodule--helper push-check requires at least 1 argument");
+
+       /*
+        * The remote must be configured.
+        * This is to avoid pushing to the exact same URL as the parent.
+        */
+       remote = pushremote_get(argv[1]);
+       if (!remote || remote->origin == REMOTE_UNCONFIGURED)
+               die("remote '%s' not configured", argv[1]);
+
+       /* Check the refspec */
+       if (argc > 2) {
+               int i, refspec_nr = argc - 2;
+               struct ref *local_refs = get_local_heads();
+               struct refspec *refspec = parse_push_refspec(refspec_nr,
+                                                            argv + 2);
+
+               for (i = 0; i < refspec_nr; i++) {
+                       struct refspec *rs = refspec + i;
+
+                       if (rs->pattern || rs->matching)
+                               continue;
+
+                       /*
+                        * LHS must match a single ref
+                        * NEEDSWORK: add logic to special case 'HEAD' once
+                        * working with submodules in a detached head state
+                        * ceases to be the norm.
+                        */
+                       if (count_refspec_match(rs->src, local_refs, NULL) != 1)
+                               die("src refspec '%s' must name a ref",
+                                   rs->src);
+               }
+               free_refspec(refspec_nr, refspec);
+       }
+
+       return 0;
+}
+
+static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
+{
+       int i;
+       struct pathspec pathspec;
+       struct module_list list = MODULE_LIST_INIT;
+       unsigned flags = ABSORB_GITDIR_RECURSE_SUBMODULES;
+
+       struct option embed_gitdir_options[] = {
+               OPT_STRING(0, "prefix", &prefix,
+                          N_("path"),
+                          N_("path into the working tree")),
+               OPT_BIT(0, "--recursive", &flags, N_("recurse into submodules"),
+                       ABSORB_GITDIR_RECURSE_SUBMODULES),
+               OPT_END()
+       };
+
+       const char *const git_submodule_helper_usage[] = {
+               N_("git submodule--helper embed-git-dir [<path>...]"),
+               NULL
+       };
+
+       argc = parse_options(argc, argv, prefix, embed_gitdir_options,
+                            git_submodule_helper_usage, 0);
+
+       gitmodules_config();
+       git_config(submodule_config, NULL);
+
+       if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
+               return 1;
+
+       for (i = 0; i < list.nr; i++)
+               absorb_git_dir_into_superproject(prefix,
+                               list.entries[i]->name, flags);
+
+       return 0;
+}
+
+static int is_active(int argc, const char **argv, const char *prefix)
+{
+       if (argc != 2)
+               die("submodule--helper is-active takes exactly 1 argument");
+
+       gitmodules_config();
+
+       return !is_submodule_initialized(argv[1]);
+}
+
+#define SUPPORT_SUPER_PREFIX (1<<0)
+
 struct cmd_struct {
        const char *cmd;
        int (*fn)(int, const char **, const char *);
+       unsigned option;
 };
 
 static struct cmd_struct commands[] = {
-       {"list", module_list},
-       {"name", module_name},
-       {"clone", module_clone},
-       {"update-clone", update_clone},
-       {"relative-path", resolve_relative_path},
-       {"resolve-relative-url", resolve_relative_url},
-       {"resolve-relative-url-test", resolve_relative_url_test},
-       {"init", module_init},
-       {"remote-branch", resolve_remote_submodule_branch}
+       {"list", module_list, 0},
+       {"name", module_name, 0},
+       {"clone", module_clone, 0},
+       {"update-clone", update_clone, 0},
+       {"relative-path", resolve_relative_path, 0},
+       {"resolve-relative-url", resolve_relative_url, 0},
+       {"resolve-relative-url-test", resolve_relative_url_test, 0},
+       {"init", module_init, SUPPORT_SUPER_PREFIX},
+       {"remote-branch", resolve_remote_submodule_branch, 0},
+       {"push-check", push_check, 0},
+       {"absorb-git-dirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX},
+       {"is-active", is_active, 0},
 };
 
 int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
@@ -978,9 +1226,15 @@ int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
                die(_("submodule--helper subcommand must be "
                      "called with a subcommand"));
 
-       for (i = 0; i < ARRAY_SIZE(commands); i++)
-               if (!strcmp(argv[1], commands[i].cmd))
+       for (i = 0; i < ARRAY_SIZE(commands); i++) {
+               if (!strcmp(argv[1], commands[i].cmd)) {
+                       if (get_super_prefix() &&
+                           !(commands[i].option & SUPPORT_SUPER_PREFIX))
+                               die(_("%s doesn't support --super-prefix"),
+                                   commands[i].cmd);
                        return commands[i].fn(argc - 1, argv + 1, prefix);
+               }
+       }
 
        die(_("'%s' is not a valid submodule--helper "
              "subcommand"), argv[1]);
index 96eed944683a45c33fa5d4a05414ae56406fafca..70addef158b347488366f6c5787d326c3657adcd 100644 (file)
@@ -58,7 +58,7 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix)
                        die("Cannot delete %s, not a symbolic ref", argv[0]);
                if (!strcmp(argv[0], "HEAD"))
                        die("deleting '%s' is not allowed", argv[0]);
-               return delete_ref(argv[0], NULL, REF_NODEREF);
+               return delete_ref(NULL, argv[0], NULL, REF_NODEREF);
        }
 
        switch (argc) {
index 50e4ae5678c21f348c3ce0e0d0662c9d5f995847..bdf1e88e93a61b6cbe840f4c8dd4563c1e13e337 100644 (file)
@@ -22,9 +22,9 @@
 static const char * const git_tag_usage[] = {
        N_("git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> [<head>]"),
        N_("git tag -d <tagname>..."),
-       N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]"
+       N_("git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--points-at <object>]"
                "\n\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"),
-       N_("git tag -v <tagname>..."),
+       N_("git tag -v [--format=<format>] <tagname>..."),
        NULL
 };
 
@@ -45,11 +45,11 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con
        if (!format) {
                if (filter->lines) {
                        to_free = xstrfmt("%s %%(contents:lines=%d)",
-                                         "%(align:15)%(refname:strip=2)%(end)",
+                                         "%(align:15)%(refname:lstrip=2)%(end)",
                                          filter->lines);
                        format = to_free;
                } else
-                       format = "%(refname:strip=2)";
+                       format = "%(refname:lstrip=2)";
        }
 
        verify_ref_format(format);
@@ -66,46 +66,57 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con
 }
 
 typedef int (*each_tag_name_fn)(const char *name, const char *ref,
-                               const unsigned char *sha1);
+                               const unsigned char *sha1, const void *cb_data);
 
-static int for_each_tag_name(const char **argv, each_tag_name_fn fn)
+static int for_each_tag_name(const char **argv, each_tag_name_fn fn,
+                            const void *cb_data)
 {
        const char **p;
-       char ref[PATH_MAX];
+       struct strbuf ref = STRBUF_INIT;
        int had_error = 0;
        unsigned char sha1[20];
 
        for (p = argv; *p; p++) {
-               if (snprintf(ref, sizeof(ref), "refs/tags/%s", *p)
-                                       >= sizeof(ref)) {
-                       error(_("tag name too long: %.*s..."), 50, *p);
-                       had_error = 1;
-                       continue;
-               }
-               if (read_ref(ref, sha1)) {
+               strbuf_reset(&ref);
+               strbuf_addf(&ref, "refs/tags/%s", *p);
+               if (read_ref(ref.buf, sha1)) {
                        error(_("tag '%s' not found."), *p);
                        had_error = 1;
                        continue;
                }
-               if (fn(*p, ref, sha1))
+               if (fn(*p, ref.buf, sha1, cb_data))
                        had_error = 1;
        }
+       strbuf_release(&ref);
        return had_error;
 }
 
 static int delete_tag(const char *name, const char *ref,
-                               const unsigned char *sha1)
+                     const unsigned char *sha1, const void *cb_data)
 {
-       if (delete_ref(ref, sha1, 0))
+       if (delete_ref(NULL, ref, sha1, 0))
                return 1;
        printf(_("Deleted tag '%s' (was %s)\n"), name, find_unique_abbrev(sha1, DEFAULT_ABBREV));
        return 0;
 }
 
 static int verify_tag(const char *name, const char *ref,
-                               const unsigned char *sha1)
+                     const unsigned char *sha1, const void *cb_data)
 {
-       return gpg_verify_tag(sha1, name, GPG_VERIFY_VERBOSE);
+       int flags;
+       const char *fmt_pretty = cb_data;
+       flags = GPG_VERIFY_VERBOSE;
+
+       if (fmt_pretty)
+               flags = GPG_VERIFY_OMIT_STATUS;
+
+       if (gpg_verify_tag(sha1, name, flags))
+               return -1;
+
+       if (fmt_pretty)
+               pretty_print_ref(name, sha1, fmt_pretty);
+
+       return 0;
 }
 
 static int do_sign(struct strbuf *buffer)
@@ -217,26 +228,22 @@ static void create_tag(const unsigned char *object, const char *tag,
                       unsigned char *prev, unsigned char *result)
 {
        enum object_type type;
-       char header_buf[1024];
-       int header_len;
+       struct strbuf header = STRBUF_INIT;
        char *path = NULL;
 
        type = sha1_object_info(object, NULL);
        if (type <= OBJ_NONE)
            die(_("bad object type."));
 
-       header_len = snprintf(header_buf, sizeof(header_buf),
-                         "object %s\n"
-                         "type %s\n"
-                         "tag %s\n"
-                         "tagger %s\n\n",
-                         sha1_to_hex(object),
-                         typename(type),
-                         tag,
-                         git_committer_info(IDENT_STRICT));
-
-       if (header_len > sizeof(header_buf) - 1)
-               die(_("tag header too big."));
+       strbuf_addf(&header,
+                   "object %s\n"
+                   "type %s\n"
+                   "tag %s\n"
+                   "tagger %s\n\n",
+                   sha1_to_hex(object),
+                   typename(type),
+                   tag,
+                   git_committer_info(IDENT_STRICT));
 
        if (!opt->message_given) {
                int fd;
@@ -274,7 +281,8 @@ static void create_tag(const unsigned char *object, const char *tag,
        if (!opt->message_given && !buf->len)
                die(_("no tag message?"));
 
-       strbuf_insert(buf, 0, header_buf, header_len);
+       strbuf_insert(buf, 0, header.buf, header.len);
+       strbuf_release(&header);
 
        if (build_tag_object(buf, opt->sign, result) < 0) {
                if (path)
@@ -288,6 +296,54 @@ static void create_tag(const unsigned char *object, const char *tag,
        }
 }
 
+static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)
+{
+       enum object_type type;
+       struct commit *c;
+       char *buf;
+       unsigned long size;
+       int subject_len = 0;
+       const char *subject_start;
+
+       char *rla = getenv("GIT_REFLOG_ACTION");
+       if (rla) {
+               strbuf_addstr(sb, rla);
+       } else {
+               strbuf_addstr(sb, "tag: tagging ");
+               strbuf_add_unique_abbrev(sb, sha1, DEFAULT_ABBREV);
+       }
+
+       strbuf_addstr(sb, " (");
+       type = sha1_object_info(sha1, NULL);
+       switch (type) {
+       default:
+               strbuf_addstr(sb, "object of unknown type");
+               break;
+       case OBJ_COMMIT:
+               if ((buf = read_sha1_file(sha1, &type, &size)) != NULL) {
+                       subject_len = find_commit_subject(buf, &subject_start);
+                       strbuf_insert(sb, sb->len, subject_start, subject_len);
+               } else {
+                       strbuf_addstr(sb, "commit object");
+               }
+               free(buf);
+
+               if ((c = lookup_commit_reference(sha1)) != NULL)
+                       strbuf_addf(sb, ", %s", show_date(c->date, 0, DATE_MODE(SHORT)));
+               break;
+       case OBJ_TREE:
+               strbuf_addstr(sb, "tree object");
+               break;
+       case OBJ_BLOB:
+               strbuf_addstr(sb, "blob object");
+               break;
+       case OBJ_TAG:
+               strbuf_addstr(sb, "other tag object");
+               break;
+       }
+       strbuf_addch(sb, ')');
+}
+
 struct msg_arg {
        int given;
        struct strbuf buf;
@@ -321,6 +377,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 {
        struct strbuf buf = STRBUF_INIT;
        struct strbuf ref = STRBUF_INIT;
+       struct strbuf reflog_msg = STRBUF_INIT;
        unsigned char object[20], prev[20];
        const char *object_ref, *tag;
        struct create_tag_options opt;
@@ -335,6 +392,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        struct ref_filter filter;
        static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
        const char *format = NULL;
+       int icase = 0;
        struct option options[] = {
                OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
                { OPTION_INTEGER, 'n', NULL, &filter.lines, N_("n"),
@@ -360,19 +418,25 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                OPT_GROUP(N_("Tag listing options")),
                OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
                OPT_CONTAINS(&filter.with_commit, N_("print only tags that contain the commit")),
+               OPT_NO_CONTAINS(&filter.no_commit, N_("print only tags that don't contain the commit")),
                OPT_WITH(&filter.with_commit, N_("print only tags that contain the commit")),
+               OPT_WITHOUT(&filter.no_commit, N_("print only tags that don't contain the commit")),
                OPT_MERGED(&filter, N_("print only tags that are merged")),
                OPT_NO_MERGED(&filter, N_("print only tags that are not merged")),
                OPT_CALLBACK(0 , "sort", sorting_tail, N_("key"),
                             N_("field name to sort on"), &parse_opt_ref_sorting),
                {
                        OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
-                       N_("print only tags of the object"), 0, parse_opt_object_name
+                       N_("print only tags of the object"), PARSE_OPT_LASTARG_DEFAULT,
+                       parse_opt_object_name, (intptr_t) "HEAD"
                },
                OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
+               OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
                OPT_END()
        };
 
+       setup_ref_filter_porcelain_msg();
+
        git_config(git_tag_config, sorting_tail);
 
        memset(&opt, 0, sizeof(opt));
@@ -387,8 +451,14 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        }
        create_tag_object = (opt.sign || annotate || msg.given || msgfile);
 
-       if (argc == 0 && !cmdmode)
-               cmdmode = 'l';
+       if (!cmdmode) {
+               if (argc == 0)
+                       cmdmode = 'l';
+               else if (filter.with_commit || filter.no_commit ||
+                        filter.points_at.nr || filter.merge_commit ||
+                        filter.lines != -1)
+                       cmdmode = 'l';
+       }
 
        if ((create_tag_object || force) && (cmdmode != 0))
                usage_with_options(git_tag_usage, options);
@@ -401,6 +471,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        }
        if (!sorting)
                sorting = ref_default_sorting();
+       sorting->ignore_case = icase;
+       filter.ignore_case = icase;
        if (cmdmode == 'l') {
                int ret;
                if (column_active(colopts)) {
@@ -416,17 +488,22 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                return ret;
        }
        if (filter.lines != -1)
-               die(_("-n option is only allowed with -l."));
+               die(_("-n option is only allowed in list mode"));
        if (filter.with_commit)
-               die(_("--contains option is only allowed with -l."));
+               die(_("--contains option is only allowed in list mode"));
+       if (filter.no_commit)
+               die(_("--no-contains option is only allowed in list mode"));
        if (filter.points_at.nr)
-               die(_("--points-at option is only allowed with -l."));
+               die(_("--points-at option is only allowed in list mode"));
        if (filter.merge_commit)
-               die(_("--merged and --no-merged option are only allowed with -l"));
+               die(_("--merged and --no-merged options are only allowed in list mode"));
        if (cmdmode == 'd')
-               return for_each_tag_name(argv, delete_tag);
-       if (cmdmode == 'v')
-               return for_each_tag_name(argv, verify_tag);
+               return for_each_tag_name(argv, delete_tag, NULL);
+       if (cmdmode == 'v') {
+               if (format)
+                       verify_ref_format(format);
+               return for_each_tag_name(argv, verify_tag, format);
+       }
 
        if (msg.given || msgfile) {
                if (msg.given && msgfile)
@@ -473,6 +550,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        else
                die(_("Invalid cleanup mode %s"), cleanup_arg);
 
+       create_reflog_msg(object, &reflog_msg);
+
        if (create_tag_object) {
                if (force_sign_annotate && !annotate)
                        opt.sign = 1;
@@ -483,7 +562,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        if (!transaction ||
            ref_transaction_update(transaction, ref.buf, object, prev,
                                   create_reflog ? REF_FORCE_CREATE_REFLOG : 0,
-                                  NULL, &err) ||
+                                  reflog_msg.buf, &err) ||
            ref_transaction_commit(transaction, &err))
                die("%s", err.buf);
        ref_transaction_free(transaction);
@@ -493,5 +572,6 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        strbuf_release(&err);
        strbuf_release(&buf);
        strbuf_release(&ref);
+       strbuf_release(&reflog_msg);
        return 0;
 }
index 172470bf241e4da731c5741567555d7e01691c74..4532aa083154ae7e9be07014d3761821fa6c4ddc 100644 (file)
@@ -19,6 +19,7 @@ static const char unpack_usage[] = "git unpack-objects [-n] [-q] [-r] [--strict]
 static unsigned char buffer[4096];
 static unsigned int offset, len;
 static off_t consumed_bytes;
+static off_t max_input_size;
 static git_SHA_CTX ctx;
 static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
 
@@ -87,6 +88,8 @@ static void use(int bytes)
        if (signed_add_overflows(consumed_bytes, bytes))
                die("pack too large for current definition of off_t");
        consumed_bytes += bytes;
+       if (max_input_size && consumed_bytes > max_input_size)
+               die(_("pack exceeds maximum allowed size"));
 }
 
 static void *get_data(unsigned long size)
@@ -550,6 +553,10 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
                                len = sizeof(*hdr);
                                continue;
                        }
+                       if (skip_prefix(arg, "--max-input-size=", &arg)) {
+                               max_input_size = strtoumax(arg, NULL, 10);
+                               continue;
+                       }
                        usage(unpack_usage);
                }
 
index 9e9e04059c989339bb1956b736e8379d2cff0462..ebfc09faa0d604218af8f5815af5e5fee5915158 100644 (file)
@@ -125,12 +125,16 @@ static int test_if_untracked_cache_is_supported(void)
        struct stat st;
        struct stat_data base;
        int fd, ret = 0;
+       char *cwd;
 
        strbuf_addstr(&mtime_dir, "mtime-test-XXXXXX");
        if (!mkdtemp(mtime_dir.buf))
                die_errno("Could not make temporary directory");
 
-       fprintf(stderr, _("Testing mtime in '%s' "), xgetcwd());
+       cwd = xgetcwd();
+       fprintf(stderr, _("Testing mtime in '%s' "), cwd);
+       free(cwd);
+
        atexit(remove_test_directory);
        xstat_mtime_dir(&st);
        fill_stat_data(&base, &st);
@@ -275,7 +279,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int len
        fill_stat_cache_info(ce, st);
        ce->ce_mode = ce_mode_from_stat(old, st->st_mode);
 
-       if (index_path(ce->sha1, path, st,
+       if (index_path(ce->oid.hash, path, st,
                       info_only ? 0 : HASH_WRITE_OBJECT)) {
                free(ce);
                return -1;
@@ -312,7 +316,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int len
  */
 static int process_directory(const char *path, int len, struct stat *st)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
        int pos = cache_name_pos(path, len);
 
        /* Exact match: file or existing gitlink */
@@ -321,7 +325,7 @@ static int process_directory(const char *path, int len, struct stat *st)
                if (S_ISGITLINK(ce->ce_mode)) {
 
                        /* Do nothing to the index if there is no HEAD! */
-                       if (resolve_gitlink_ref(path, "HEAD", sha1) < 0)
+                       if (resolve_gitlink_ref(path, "HEAD", oid.hash) < 0)
                                return 0;
 
                        return add_one_path(ce, path, len, st);
@@ -347,7 +351,7 @@ static int process_directory(const char *path, int len, struct stat *st)
        }
 
        /* No match - should we add it as a gitlink? */
-       if (!resolve_gitlink_ref(path, "HEAD", sha1))
+       if (!resolve_gitlink_ref(path, "HEAD", oid.hash))
                return add_one_path(NULL, path, len, st);
 
        /* Error out. */
@@ -390,7 +394,7 @@ static int process_path(const char *path)
        return add_one_path(ce, path, len, &st);
 }
 
-static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
+static int add_cacheinfo(unsigned int mode, const struct object_id *oid,
                         const char *path, int stage)
 {
        int size, len, option;
@@ -403,7 +407,7 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
        size = cache_entry_size(len);
        ce = xcalloc(1, size);
 
-       hashcpy(ce->sha1, sha1);
+       oidcpy(&ce->oid, oid);
        memcpy(ce->name, path, len);
        ce->ce_flags = create_ce_flags(stage);
        ce->ce_namelen = len;
@@ -475,7 +479,7 @@ static void read_index_info(int nul_term_line)
        while (getline_fn(&buf, stdin) != EOF) {
                char *ptr, *tab;
                char *path_name;
-               unsigned char sha1[20];
+               struct object_id oid;
                unsigned int mode;
                unsigned long ul;
                int stage;
@@ -504,7 +508,7 @@ static void read_index_info(int nul_term_line)
                mode = ul;
 
                tab = strchr(ptr, '\t');
-               if (!tab || tab - ptr < 41)
+               if (!tab || tab - ptr < GIT_SHA1_HEXSZ + 1)
                        goto bad_line;
 
                if (tab[-2] == ' ' && '0' <= tab[-1] && tab[-1] <= '3') {
@@ -517,7 +521,8 @@ static void read_index_info(int nul_term_line)
                        ptr = tab + 1; /* point at the head of path */
                }
 
-               if (get_sha1_hex(tab - 40, sha1) || tab[-41] != ' ')
+               if (get_oid_hex(tab - GIT_SHA1_HEXSZ, &oid) ||
+                       tab[-(GIT_SHA1_HEXSZ + 1)] != ' ')
                        goto bad_line;
 
                path_name = ptr;
@@ -545,8 +550,8 @@ static void read_index_info(int nul_term_line)
                         * ptr[-1] points at tab,
                         * ptr[-41] is at the beginning of sha1
                         */
-                       ptr[-42] = ptr[-1] = 0;
-                       if (add_cacheinfo(mode, sha1, path_name, stage))
+                       ptr[-(GIT_SHA1_HEXSZ + 2)] = ptr[-1] = 0;
+                       if (add_cacheinfo(mode, &oid, path_name, stage))
                                die("git update-index: unable to update %s",
                                    path_name);
                }
@@ -564,19 +569,19 @@ static const char * const update_index_usage[] = {
        NULL
 };
 
-static unsigned char head_sha1[20];
-static unsigned char merge_head_sha1[20];
+static struct object_id head_oid;
+static struct object_id merge_head_oid;
 
 static struct cache_entry *read_one_ent(const char *which,
-                                       unsigned char *ent, const char *path,
+                                       struct object_id *ent, const char *path,
                                        int namelen, int stage)
 {
        unsigned mode;
-       unsigned char sha1[20];
+       struct object_id oid;
        int size;
        struct cache_entry *ce;
 
-       if (get_tree_entry(ent, path, sha1, &mode)) {
+       if (get_tree_entry(ent->hash, path, oid.hash, &mode)) {
                if (which)
                        error("%s: not in %s branch.", path, which);
                return NULL;
@@ -589,7 +594,7 @@ static struct cache_entry *read_one_ent(const char *which,
        size = cache_entry_size(namelen);
        ce = xcalloc(1, size);
 
-       hashcpy(ce->sha1, sha1);
+       oidcpy(&ce->oid, &oid);
        memcpy(ce->name, path, namelen);
        ce->ce_flags = create_ce_flags(stage);
        ce->ce_namelen = namelen;
@@ -639,14 +644,14 @@ static int unresolve_one(const char *path)
         * stuff HEAD version in stage #2,
         * stuff MERGE_HEAD version in stage #3.
         */
-       ce_2 = read_one_ent("our", head_sha1, path, namelen, 2);
-       ce_3 = read_one_ent("their", merge_head_sha1, path, namelen, 3);
+       ce_2 = read_one_ent("our", &head_oid, path, namelen, 2);
+       ce_3 = read_one_ent("their", &merge_head_oid, path, namelen, 3);
 
        if (!ce_2 || !ce_3) {
                ret = -1;
                goto free_return;
        }
-       if (!hashcmp(ce_2->sha1, ce_3->sha1) &&
+       if (!oidcmp(&ce_2->oid, &ce_3->oid) &&
            ce_2->ce_mode == ce_3->ce_mode) {
                fprintf(stderr, "%s: identical in both, skipping.\n",
                        path);
@@ -671,9 +676,9 @@ static int unresolve_one(const char *path)
 
 static void read_head_pointers(void)
 {
-       if (read_ref("HEAD", head_sha1))
+       if (read_ref("HEAD", head_oid.hash))
                die("No HEAD -- no initial commit yet?");
-       if (read_ref("MERGE_HEAD", merge_head_sha1)) {
+       if (read_ref("MERGE_HEAD", merge_head_oid.hash)) {
                fprintf(stderr, "Not in the middle of a merge.\n");
                exit(0);
        }
@@ -713,7 +718,7 @@ static int do_reupdate(int ac, const char **av,
                       PATHSPEC_PREFER_CWD,
                       prefix, av + 1);
 
-       if (read_ref("HEAD", head_sha1))
+       if (read_ref("HEAD", head_oid.hash))
                /* If there is no HEAD, that means it is an initial
                 * commit.  Update everything in the index.
                 */
@@ -728,10 +733,10 @@ static int do_reupdate(int ac, const char **av,
                if (ce_stage(ce) || !ce_path_match(ce, &pathspec, NULL))
                        continue;
                if (has_head)
-                       old = read_one_ent(NULL, head_sha1,
+                       old = read_one_ent(NULL, &head_oid,
                                           ce->name, ce_namelen(ce), 0);
                if (old && ce->ce_mode == old->ce_mode &&
-                   !hashcmp(ce->sha1, old->sha1)) {
+                   !oidcmp(&ce->oid, &old->oid)) {
                        free(old);
                        continue; /* unchanged */
                }
@@ -795,7 +800,7 @@ static int resolve_undo_clear_callback(const struct option *opt,
 
 static int parse_new_style_cacheinfo(const char *arg,
                                     unsigned int *mode,
-                                    unsigned char sha1[],
+                                    struct object_id *oid,
                                     const char **path)
 {
        unsigned long ul;
@@ -810,21 +815,21 @@ static int parse_new_style_cacheinfo(const char *arg,
                return -1; /* not a new-style cacheinfo */
        *mode = ul;
        endp++;
-       if (get_sha1_hex(endp, sha1) || endp[40] != ',')
+       if (get_oid_hex(endp, oid) || endp[GIT_SHA1_HEXSZ] != ',')
                return -1;
-       *path = endp + 41;
+       *path = endp + GIT_SHA1_HEXSZ + 1;
        return 0;
 }
 
 static int cacheinfo_callback(struct parse_opt_ctx_t *ctx,
                                const struct option *opt, int unset)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
        unsigned int mode;
        const char *path;
 
-       if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, sha1, &path)) {
-               if (add_cacheinfo(mode, sha1, path, 0))
+       if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, &oid, &path)) {
+               if (add_cacheinfo(mode, &oid, path, 0))
                        die("git update-index: --cacheinfo cannot add %s", path);
                ctx->argv++;
                ctx->argc--;
@@ -833,8 +838,8 @@ static int cacheinfo_callback(struct parse_opt_ctx_t *ctx,
        if (ctx->argc <= 3)
                return error("option 'cacheinfo' expects <mode>,<sha1>,<path>");
        if (strtoul_ui(*++ctx->argv, 8, &mode) ||
-           get_sha1_hex(*++ctx->argv, sha1) ||
-           add_cacheinfo(mode, sha1, *++ctx->argv, 0))
+           get_oid_hex(*++ctx->argv, &oid) ||
+           add_cacheinfo(mode, &oid, *++ctx->argv, 0))
                die("git update-index: --cacheinfo cannot add %s", *ctx->argv);
        ctx->argc -= 3;
        return 0;
@@ -1011,6 +1016,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
        /* We can't free this memory, it becomes part of a linked list parsed atexit() */
        lock_file = xcalloc(1, sizeof(struct lock_file));
 
+       /* we will diagnose later if it turns out that we need to update it */
        newfd = hold_locked_index(lock_file, 0);
        if (newfd < 0)
                lock_error = errno;
@@ -1097,17 +1103,20 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
        }
 
        if (split_index > 0) {
-               init_split_index(&the_index);
-               the_index.cache_changed |= SPLIT_INDEX_ORDERED;
-       } else if (!split_index && the_index.split_index) {
-               /*
-                * can't discard_split_index(&the_index); because that
-                * will destroy split_index->base->cache[], which may
-                * be shared with the_index.cache[]. So yeah we're
-                * leaking a bit here.
-                */
-               the_index.split_index = NULL;
-               the_index.cache_changed |= SOMETHING_CHANGED;
+               if (git_config_get_split_index() == 0)
+                       warning(_("core.splitIndex is set to false; "
+                                 "remove or change it, if you really want to "
+                                 "enable split index"));
+               if (the_index.split_index)
+                       the_index.cache_changed |= SPLIT_INDEX_ORDERED;
+               else
+                       add_split_index(&the_index);
+       } else if (!split_index) {
+               if (git_config_get_split_index() == 1)
+                       warning(_("core.splitIndex is set to true; "
+                                 "remove or change it, if you really want to "
+                                 "disable split index"));
+               remove_split_index(&the_index);
        }
 
        switch (untracked_cache) {
@@ -1115,9 +1124,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
                break;
        case UC_DISABLE:
                if (git_config_get_untracked_cache() == 1)
-                       warning("core.untrackedCache is set to true; "
-                               "remove or change it, if you really want to "
-                               "disable the untracked cache");
+                       warning(_("core.untrackedCache is set to true; "
+                                 "remove or change it, if you really want to "
+                                 "disable the untracked cache"));
                remove_untracked_cache(&the_index);
                report(_("Untracked cache disabled"));
                break;
@@ -1127,9 +1136,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
        case UC_ENABLE:
        case UC_FORCE:
                if (git_config_get_untracked_cache() == 0)
-                       warning("core.untrackedCache is set to false; "
-                               "remove or change it, if you really want to "
-                               "enable the untracked cache");
+                       warning(_("core.untrackedCache is set to false; "
+                                 "remove or change it, if you really want to "
+                                 "enable the untracked cache"));
                add_untracked_cache(&the_index);
                report(_("Untracked cache enabled for '%s'"), get_git_work_tree());
                break;
index 7f30d3a76f69e58ae3cdbbe05c5ebdce6c8a120d..0b2ecf41aeda427e75eb7fe36388e7d0d91d5413 100644 (file)
@@ -433,7 +433,7 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
                 * For purposes of backwards compatibility, we treat
                 * NULL_SHA1 as "don't care" here:
                 */
-               return delete_ref(refname,
+               return delete_ref(msg, refname,
                                  (oldval && !is_null_sha1(oldsha1)) ? oldsha1 : NULL,
                                  flags);
        else
index 2caedf184959e2120d8e30a02f885925ceb412b4..cde06977b78b1475925e4b6722b5ecdd834847d5 100644 (file)
@@ -43,7 +43,7 @@ int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix)
        }
 
        /* parse all options sent by the client */
-       return write_archive(sent_argv.argc, sent_argv.argv, prefix, 0, NULL, 1);
+       return write_archive(sent_argv.argc, sent_argv.argv, prefix, NULL, 1);
 }
 
 __attribute__((format (printf, 1, 2)))
@@ -88,11 +88,11 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix)
        writer.git_cmd = 1;
        if (start_command(&writer)) {
                int err = errno;
-               packet_write(1, "NACK unable to spawn subprocess\n");
+               packet_write_fmt(1, "NACK unable to spawn subprocess\n");
                die("upload-archive: %s", strerror(err));
        }
 
-       packet_write(1, "ACK\n");
+       packet_write_fmt(1, "ACK\n");
        packet_flush(1);
 
        while (1) {
index 99f8148cf79bac1d636bfe35a93282f3da2ebfd7..5199553d914f266315ffc3f170ef95a2a7f621ff 100644 (file)
 #include <signal.h>
 #include "parse-options.h"
 #include "gpg-interface.h"
+#include "ref-filter.h"
 
 static const char * const verify_tag_usage[] = {
-               N_("git verify-tag [-v | --verbose] <tag>..."),
+               N_("git verify-tag [-v | --verbose] [--format=<format>] <tag>..."),
                NULL
 };
 
@@ -30,9 +31,11 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
 {
        int i = 1, verbose = 0, had_error = 0;
        unsigned flags = 0;
+       char *fmt_pretty = NULL;
        const struct option verify_tag_options[] = {
                OPT__VERBOSE(&verbose, N_("print tag contents")),
                OPT_BIT(0, "raw", &flags, N_("print raw gpg status output"), GPG_VERIFY_RAW),
+               OPT_STRING(  0 , "format", &fmt_pretty, N_("format"), N_("format to use for the output")),
                OPT_END()
        };
 
@@ -46,13 +49,26 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
        if (verbose)
                flags |= GPG_VERIFY_VERBOSE;
 
+       if (fmt_pretty) {
+               verify_ref_format(fmt_pretty);
+               flags |= GPG_VERIFY_OMIT_STATUS;
+       }
+
        while (i < argc) {
                unsigned char sha1[20];
                const char *name = argv[i++];
-               if (get_sha1(name, sha1))
+               if (get_sha1(name, sha1)) {
                        had_error = !!error("tag '%s' not found.", name);
-               else if (gpg_verify_tag(sha1, name, flags))
+                       continue;
+               }
+
+               if (gpg_verify_tag(sha1, name, flags)) {
                        had_error = 1;
+                       continue;
+               }
+
+               if (fmt_pretty)
+                       pretty_print_ref(name, sha1, fmt_pretty);
        }
        return had_error;
 }
index 5c4854d3e4a679f59f4a7db7cb3f37bd0e210622..ff5dfd2b1022fd94314f2cefe3ca91a4820e8abf 100644 (file)
@@ -24,6 +24,7 @@ struct add_opts {
        int force;
        int detach;
        int checkout;
+       int keep_locked;
        const char *new_branch;
        int force_new_branch;
 };
@@ -106,8 +107,7 @@ static void prune_worktrees(void)
                        printf("%s\n", reason.buf);
                if (show_only)
                        continue;
-               strbuf_reset(&path);
-               strbuf_addstr(&path, git_path("worktrees/%s", d->d_name));
+               git_path_buf(&path, "worktrees/%s", d->d_name);
                ret = remove_dir_recursively(&path, 0);
                if (ret < 0 && errno == ENOTDIR)
                        ret = unlink(path.buf);
@@ -125,9 +125,9 @@ static int prune(int ac, const char **av, const char *prefix)
 {
        struct option options[] = {
                OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
-               OPT__VERBOSE(&verbose, N_("report pruned objects")),
+               OPT__VERBOSE(&verbose, N_("report pruned working trees")),
                OPT_EXPIRY_DATE(0, "expire", &expire,
-                               N_("expire objects older than <time>")),
+                               N_("expire working trees older than <time>")),
                OPT_END()
        };
 
@@ -215,8 +215,7 @@ static int add_worktree(const char *path, const char *refname,
        }
 
        name = worktree_basename(path, &len);
-       strbuf_addstr(&sb_repo,
-                     git_path("worktrees/%.*s", (int)(path + len - name), name));
+       git_path_buf(&sb_repo, "worktrees/%.*s", (int)(path + len - name), name);
        len = sb_repo.len;
        if (safe_create_leading_directories_const(sb_repo.buf))
                die_errno(_("could not create leading directories of '%s'"),
@@ -242,7 +241,10 @@ static int add_worktree(const char *path, const char *refname,
         * after the preparation is over.
         */
        strbuf_addf(&sb, "%s/locked", sb_repo.buf);
-       write_file(sb.buf, "initializing");
+       if (!opts->keep_locked)
+               write_file(sb.buf, "initializing");
+       else
+               write_file(sb.buf, "added with --lock");
 
        strbuf_addf(&sb_git, "%s/.git", path);
        if (safe_create_leading_directories_const(sb_git.buf))
@@ -303,9 +305,11 @@ static int add_worktree(const char *path, const char *refname,
        junk_git_dir = NULL;
 
 done:
-       strbuf_reset(&sb);
-       strbuf_addf(&sb, "%s/locked", sb_repo.buf);
-       unlink_or_warn(sb.buf);
+       if (ret || !opts->keep_locked) {
+               strbuf_reset(&sb);
+               strbuf_addf(&sb, "%s/locked", sb_repo.buf);
+               unlink_or_warn(sb.buf);
+       }
        argv_array_clear(&child_env);
        strbuf_release(&sb);
        strbuf_release(&symref);
@@ -318,7 +322,8 @@ static int add(int ac, const char **av, const char *prefix)
 {
        struct add_opts opts;
        const char *new_branch_force = NULL;
-       const char *path, *branch;
+       char *path;
+       const char *branch;
        struct option options[] = {
                OPT__FORCE(&opts.force, N_("checkout <branch> even if already checked out in other worktree")),
                OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
@@ -327,6 +332,7 @@ static int add(int ac, const char **av, const char *prefix)
                           N_("create or reset a branch")),
                OPT_BOOL(0, "detach", &opts.detach, N_("detach HEAD at named commit")),
                OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")),
+               OPT_BOOL(0, "lock", &opts.keep_locked, N_("keep the new working tree locked")),
                OPT_END()
        };
 
@@ -338,7 +344,7 @@ static int add(int ac, const char **av, const char *prefix)
        if (ac < 1 || ac > 2)
                usage_with_options(worktree_usage, options);
 
-       path = prefix_filename(prefix, strlen(prefix), av[0]);
+       path = prefix_filename(prefix, av[0]);
        branch = ac < 2 ? "HEAD" : av[1];
 
        if (!strcmp(branch, "-"))
@@ -388,7 +394,7 @@ static void show_worktree_porcelain(struct worktree *wt)
                printf("HEAD %s\n", sha1_to_hex(wt->head_sha1));
                if (wt->is_detached)
                        printf("detached\n");
-               else
+               else if (wt->head_ref)
                        printf("branch %s\n", wt->head_ref);
        }
        printf("\n");
@@ -406,10 +412,14 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
        else {
                strbuf_addf(&sb, "%-*s ", abbrev_len,
                                find_unique_abbrev(wt->head_sha1, DEFAULT_ABBREV));
-               if (!wt->is_detached)
-                       strbuf_addf(&sb, "[%s]", shorten_unambiguous_ref(wt->head_ref, 0));
-               else
+               if (wt->is_detached)
                        strbuf_addstr(&sb, "(detached HEAD)");
+               else if (wt->head_ref) {
+                       char *ref = shorten_unambiguous_ref(wt->head_ref, 0);
+                       strbuf_addf(&sb, "[%s]", ref);
+                       free(ref);
+               } else
+                       strbuf_addstr(&sb, "(error)");
        }
        printf("%s\n", sb.buf);
 
@@ -445,7 +455,7 @@ static int list(int ac, const char **av, const char *prefix)
        if (ac)
                usage_with_options(worktree_usage, options);
        else {
-               struct worktree **worktrees = get_worktrees();
+               struct worktree **worktrees = get_worktrees(GWT_SORT_LINKED);
                int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
 
                if (!porcelain)
@@ -476,7 +486,7 @@ static int lock_worktree(int ac, const char **av, const char *prefix)
        if (ac != 1)
                usage_with_options(worktree_usage, options);
 
-       worktrees = get_worktrees();
+       worktrees = get_worktrees(0);
        wt = find_worktree(worktrees, prefix, av[0]);
        if (!wt)
                die(_("'%s' is not a working tree"), av[0]);
@@ -509,7 +519,7 @@ static int unlock_worktree(int ac, const char **av, const char *prefix)
        if (ac != 1)
                usage_with_options(worktree_usage, options);
 
-       worktrees = get_worktrees();
+       worktrees = get_worktrees(0);
        wt = find_worktree(worktrees, prefix, av[0]);
        if (!wt)
                die(_("'%s' is not a working tree"), av[0]);
index 4347f5c76aa72873eb5ccb090584428399f3159c..ddb6070c4c24653a4fa8699251d11626880c2e5c 100644 (file)
@@ -7,8 +7,6 @@
 #include "pack.h"
 #include "strbuf.h"
 
-static int pack_compression_level = Z_DEFAULT_COMPRESSION;
-
 static struct bulk_checkin_state {
        unsigned plugged:1;
 
@@ -107,7 +105,7 @@ static int stream_to_pack(struct bulk_checkin_state *state,
 
        git_deflate_init(&s, pack_compression_level);
 
-       hdrlen = encode_in_pack_object_header(type, size, obuf);
+       hdrlen = encode_in_pack_object_header(obuf, sizeof(obuf), type, size);
        s.next_out = obuf + hdrlen;
        s.avail_out = sizeof(obuf) - hdrlen;
 
index f28b1f45a49b842c2f7a372b0c0c595bebc56b5d..345ea359638fbdfec874c55d387f9da2399338d2 100644 (file)
@@ -168,7 +168,7 @@ static int verify_cache(struct cache_entry **cache,
                                break;
                        }
                        fprintf(stderr, "%s: unmerged (%s)\n",
-                               ce->name, sha1_to_hex(ce->sha1));
+                               ce->name, oid_to_hex(&ce->oid));
                }
        }
        if (funny)
@@ -349,7 +349,7 @@ static int update_one(struct cache_tree *it,
                        }
                }
                else {
-                       sha1 = ce->sha1;
+                       sha1 = ce->oid.hash;
                        mode = ce->ce_mode;
                        entlen = pathlen - baselen;
                        i++;
diff --git a/cache.h b/cache.h
index 1ec9021a70083ea40ee21add8ba766ea9b9c5e25..52b91f5b64146e1b6c7c93aa5054a7aca6303b42 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -10,8 +10,8 @@
 #include "trace.h"
 #include "string-list.h"
 #include "pack-revindex.h"
+#include "hash.h"
 
-#include SHA1_HEADER
 #ifndef platform_SHA_CTX
 /*
  * platform's underlying implementation of SHA-1; could be OpenSSL,
@@ -66,8 +66,12 @@ unsigned long git_deflate_bound(git_zstream *, unsigned long);
 #define GIT_SHA1_RAWSZ 20
 #define GIT_SHA1_HEXSZ (2 * GIT_SHA1_RAWSZ)
 
+/* The length in byte and in hex digits of the largest possible hash value. */
+#define GIT_MAX_RAWSZ GIT_SHA1_RAWSZ
+#define GIT_MAX_HEXSZ GIT_SHA1_HEXSZ
+
 struct object_id {
-       unsigned char hash[GIT_SHA1_RAWSZ];
+       unsigned char hash[GIT_MAX_RAWSZ];
 };
 
 #if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT)
@@ -173,7 +177,7 @@ struct cache_entry {
        unsigned int ce_flags;
        unsigned int ce_namelen;
        unsigned int index;     /* for link extension */
-       unsigned char sha1[20];
+       struct object_id oid;
        char name[FLEX_ARRAY]; /* more */
 };
 
@@ -343,6 +347,7 @@ struct index_state {
 extern struct index_state the_index;
 
 /* Name hashing */
+extern int test_lazy_init_name_hash(struct index_state *istate, int try_threaded);
 extern void add_name_hash(struct index_state *istate, struct cache_entry *ce);
 extern void remove_name_hash(struct index_state *istate, struct cache_entry *ce);
 extern void free_name_hash(struct index_state *istate);
@@ -409,6 +414,8 @@ static inline enum object_type object_type(unsigned int mode)
 #define GIT_NAMESPACE_ENVIRONMENT "GIT_NAMESPACE"
 #define GIT_WORK_TREE_ENVIRONMENT "GIT_WORK_TREE"
 #define GIT_PREFIX_ENVIRONMENT "GIT_PREFIX"
+#define GIT_SUPER_PREFIX_ENVIRONMENT "GIT_INTERNAL_SUPER_PREFIX"
+#define GIT_TOPLEVEL_PREFIX_ENVIRONMENT "GIT_INTERNAL_TOPLEVEL_PREFIX"
 #define DEFAULT_GIT_DIR_ENVIRONMENT ".git"
 #define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
 #define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
@@ -433,6 +440,7 @@ static inline enum object_type object_type(unsigned int mode)
 #define GIT_GLOB_PATHSPECS_ENVIRONMENT "GIT_GLOB_PATHSPECS"
 #define GIT_NOGLOB_PATHSPECS_ENVIRONMENT "GIT_NOGLOB_PATHSPECS"
 #define GIT_ICASE_PATHSPECS_ENVIRONMENT "GIT_ICASE_PATHSPECS"
+#define GIT_QUARANTINE_ENVIRONMENT "GIT_QUARANTINE_PATH"
 
 /*
  * This environment variable is expected to contain a boolean indicating
@@ -454,6 +462,12 @@ static inline enum object_type object_type(unsigned int mode)
  */
 extern const char * const local_repo_env[];
 
+/*
+ * Returns true iff we have a configured git repository (either via
+ * setup_git_directory, or in the environment via $GIT_DIR).
+ */
+int have_git_dir(void);
+
 extern int is_bare_repository_cfg;
 extern int is_bare_repository(void);
 extern int is_inside_git_dir(void);
@@ -469,6 +483,7 @@ extern int get_common_dir_noenv(struct strbuf *sb, const char *gitdir);
 extern int get_common_dir(struct strbuf *sb, const char *gitdir);
 extern const char *get_git_namespace(void);
 extern const char *strip_namespace(const char *namespaced_ref);
+extern const char *get_super_prefix(void);
 extern const char *get_git_work_tree(void);
 
 /*
@@ -498,20 +513,41 @@ extern int is_nonbare_repository_dir(struct strbuf *path);
 #define READ_GITFILE_ERR_NO_PATH 6
 #define READ_GITFILE_ERR_NOT_A_REPO 7
 #define READ_GITFILE_ERR_TOO_LARGE 8
+extern void read_gitfile_error_die(int error_code, const char *path, const char *dir);
 extern const char *read_gitfile_gently(const char *path, int *return_error_code);
 #define read_gitfile(path) read_gitfile_gently((path), NULL)
-extern const char *resolve_gitdir(const char *suspect);
+extern const char *resolve_gitdir_gently(const char *suspect, int *return_error_code);
+#define resolve_gitdir(path) resolve_gitdir_gently((path), NULL)
+
 extern void set_git_work_tree(const char *tree);
 
 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
 
-extern const char **get_pathspec(const char *prefix, const char **pathspec);
 extern void setup_work_tree(void);
+/*
+ * Find GIT_DIR of the repository that contains the current working directory,
+ * without changing the working directory or other global state. The result is
+ * appended to gitdir. The return value is either NULL if no repository was
+ * found, or pointing to the path inside gitdir's buffer.
+ */
+extern const char *discover_git_directory(struct strbuf *gitdir);
 extern const char *setup_git_directory_gently(int *);
 extern const char *setup_git_directory(void);
 extern char *prefix_path(const char *prefix, int len, const char *path);
 extern char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);
-extern const char *prefix_filename(const char *prefix, int len, const char *path);
+
+/*
+ * Concatenate "prefix" (if len is non-zero) and "path", with no
+ * connecting characters (so "prefix" should end with a "/").
+ * Unlike prefix_path, this should be used if the named file does
+ * not have to interact with index entry; i.e. name of a random file
+ * on the filesystem.
+ *
+ * The return value is always a newly allocated string (even if the
+ * prefix was empty).
+ */
+extern char *prefix_filename(const char *prefix, const char *path);
+
 extern int check_filename(const char *prefix, const char *name);
 extern void verify_filename(const char *prefix,
                            const char *name,
@@ -520,9 +556,10 @@ extern void verify_non_filename(const char *prefix, const char *name);
 extern int path_inside_repo(const char *prefix, const char *path);
 
 #define INIT_DB_QUIET 0x0001
+#define INIT_DB_EXIST_OK 0x0002
 
-extern int set_git_dir_init(const char *git_dir, const char *real_git_dir, int);
-extern int init_db(const char *template_dir, unsigned int flags);
+extern int init_db(const char *git_dir, const char *real_git_dir,
+                  const char *template_dir, unsigned int flags);
 
 extern void sanitize_stdfds(void);
 extern int daemonize(void);
@@ -562,10 +599,30 @@ extern int write_locked_index(struct index_state *, struct lock_file *lock, unsi
 extern int discard_index(struct index_state *);
 extern int unmerged_index(const struct index_state *);
 extern int verify_path(const char *path);
+extern int strcmp_offset(const char *s1, const char *s2, size_t *first_change);
 extern int index_dir_exists(struct index_state *istate, const char *name, int namelen);
 extern void adjust_dirname_case(struct index_state *istate, char *name);
 extern struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase);
+
+/*
+ * Searches for an entry defined by name and namelen in the given index.
+ * If the return value is positive (including 0) it is the position of an
+ * exact match. If the return value is negative, the negated value minus 1
+ * is the position where the entry would be inserted.
+ * Example: The current index consists of these files and its stages:
+ *
+ *   b#0, d#0, f#1, f#3
+ *
+ * index_name_pos(&index, "a", 1) -> -1
+ * index_name_pos(&index, "b", 1) ->  0
+ * index_name_pos(&index, "c", 1) -> -2
+ * index_name_pos(&index, "d", 1) ->  1
+ * index_name_pos(&index, "e", 1) -> -3
+ * index_name_pos(&index, "f", 1) -> -3
+ * index_name_pos(&index, "g", 1) -> -5
+ */
 extern int index_name_pos(const struct index_state *, const char *name, int namelen);
+
 #define ADD_CACHE_OK_TO_ADD 1          /* Ok to add */
 #define ADD_CACHE_OK_TO_REPLACE 2      /* Ok to replace file/directory */
 #define ADD_CACHE_SKIP_DFCHECK 4       /* Ok to skip DF conflict checks */
@@ -574,7 +631,10 @@ extern int index_name_pos(const struct index_state *, const char *name, int name
 #define ADD_CACHE_KEEP_CACHE_TREE 32   /* Do not invalidate cache-tree */
 extern int add_index_entry(struct index_state *, struct cache_entry *ce, int option);
 extern void rename_index_entry_at(struct index_state *, int pos, const char *new_name);
+
+/* Remove entry, return true if there are more entries to go. */
 extern int remove_index_entry_at(struct index_state *, int pos);
+
 extern void remove_marked_cache_entries(struct index_state *istate);
 extern int remove_file_from_index(struct index_state *, const char *path);
 #define ADD_CACHE_VERBOSE 1
@@ -582,14 +642,24 @@ extern int remove_file_from_index(struct index_state *, const char *path);
 #define ADD_CACHE_IGNORE_ERRORS        4
 #define ADD_CACHE_IGNORE_REMOVAL 8
 #define ADD_CACHE_INTENT 16
+/*
+ * These two are used to add the contents of the file at path
+ * to the index, marking the working tree up-to-date by storing
+ * the cached stat info in the resulting cache entry.  A caller
+ * that has already run lstat(2) on the path can call
+ * add_to_index(), and all others can call add_file_to_index();
+ * the latter will do necessary lstat(2) internally before
+ * calling the former.
+ */
 extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags);
 extern int add_file_to_index(struct index_state *, const char *path, int flags);
+
 extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, unsigned int refresh_options);
 extern int chmod_index_entry(struct index_state *, struct cache_entry *ce, char flip);
 extern int ce_same_name(const struct cache_entry *a, const struct cache_entry *b);
 extern void set_object_name_for_intent_to_add_entry(struct cache_entry *ce);
 extern int index_name_is_other(const struct index_state *, const char *, int);
-extern void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *);
+extern void *read_blob_data_from_index(const struct index_state *, const char *, unsigned long *);
 
 /* do stat comparison even if CE_VALID is true */
 #define CE_MATCH_IGNORE_VALID          01
@@ -641,6 +711,8 @@ extern void update_index_if_able(struct index_state *, struct lock_file *);
 extern int hold_locked_index(struct lock_file *, int);
 extern void set_alternate_index_output(const char *);
 
+extern int verify_index_checksum;
+
 /* Environment bits from configuration mechanism */
 extern int trust_executable_bit;
 extern int trust_ctime;
@@ -651,7 +723,6 @@ extern int minimum_abbrev, default_abbrev;
 extern int ignore_case;
 extern int assume_unchanged;
 extern int prefer_symlink_refs;
-extern int log_all_ref_updates;
 extern int warn_ambiguous_refs;
 extern int warn_on_object_refname_ambiguity;
 extern const char *apply_default_whitespace;
@@ -660,15 +731,22 @@ extern const char *git_attributes_file;
 extern const char *git_hooks_path;
 extern int zlib_compression_level;
 extern int core_compression_level;
-extern int core_compression_seen;
+extern int pack_compression_level;
 extern size_t packed_git_window_size;
 extern size_t packed_git_limit;
 extern size_t delta_base_cache_limit;
 extern unsigned long big_file_threshold;
 extern unsigned long pack_size_limit_cfg;
 
+/*
+ * Accessors for the core.sharedrepository config which lazy-load the value
+ * from the config (if not already set). The "reset" function can be
+ * used to unset "set" or cached value, meaning that the value will be loaded
+ * fresh from the config file on the next call to get_shared_repository().
+ */
 void set_shared_repository(int value);
 int get_shared_repository(void);
+void reset_shared_repository(void);
 
 /*
  * Do replace refs need to be checked this run?  This variable is
@@ -712,6 +790,14 @@ enum hide_dotfiles_type {
 };
 extern enum hide_dotfiles_type hide_dotfiles;
 
+enum log_refs_config {
+       LOG_REFS_UNSET = -1,
+       LOG_REFS_NONE = 0,
+       LOG_REFS_NORMAL,
+       LOG_REFS_ALWAYS
+};
+extern enum log_refs_config log_all_ref_updates;
+
 enum branch_track {
        BRANCH_TRACK_UNSPECIFIED = -1,
        BRANCH_TRACK_NEVER = 0,
@@ -821,8 +907,8 @@ extern void strbuf_git_common_path(struct strbuf *sb, const char *fmt, ...)
        __attribute__((format (printf, 2, 3)));
 extern char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
        __attribute__((format (printf, 2, 3)));
-extern void strbuf_git_path_submodule(struct strbuf *sb, const char *path,
-                                     const char *fmt, ...)
+extern int strbuf_git_path_submodule(struct strbuf *sb, const char *path,
+                                    const char *fmt, ...)
        __attribute__((format (printf, 3, 4)));
 extern char *git_pathdup(const char *fmt, ...)
        __attribute__((format (printf, 1, 2)));
@@ -886,8 +972,8 @@ extern char *sha1_pack_index_name(const unsigned char *sha1);
  * The result will be at least `len` characters long, and will be NUL
  * terminated.
  *
- * The non-`_r` version returns a static buffer which will be overwritten by
- * subsequent calls.
+ * The non-`_r` version returns a static buffer which remains valid until 4
+ * more calls to find_unique_abbrev are made.
  *
  * The `_r` variant writes to a buffer supplied by the caller, which must be at
  * least `GIT_SHA1_HEXSZ + 1` bytes. The return value is the number of bytes
@@ -899,7 +985,7 @@ extern char *sha1_pack_index_name(const unsigned char *sha1);
 extern const char *find_unique_abbrev(const unsigned char *sha1, int len);
 extern int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len);
 
-extern const unsigned char null_sha1[GIT_SHA1_RAWSZ];
+extern const unsigned char null_sha1[GIT_MAX_RAWSZ];
 extern const struct object_id null_oid;
 
 static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
@@ -955,23 +1041,37 @@ static inline void oidclr(struct object_id *oid)
 #define EMPTY_TREE_SHA1_BIN_LITERAL \
         "\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60" \
         "\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04"
-#define EMPTY_TREE_SHA1_BIN \
-        ((const unsigned char *) EMPTY_TREE_SHA1_BIN_LITERAL)
+extern const struct object_id empty_tree_oid;
+#define EMPTY_TREE_SHA1_BIN (empty_tree_oid.hash)
 
 #define EMPTY_BLOB_SHA1_HEX \
        "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
 #define EMPTY_BLOB_SHA1_BIN_LITERAL \
        "\xe6\x9d\xe2\x9b\xb2\xd1\xd6\x43\x4b\x8b" \
        "\x29\xae\x77\x5a\xd8\xc2\xe4\x8c\x53\x91"
-#define EMPTY_BLOB_SHA1_BIN \
-       ((const unsigned char *) EMPTY_BLOB_SHA1_BIN_LITERAL)
+extern const struct object_id empty_blob_oid;
+#define EMPTY_BLOB_SHA1_BIN (empty_blob_oid.hash)
+
 
 static inline int is_empty_blob_sha1(const unsigned char *sha1)
 {
        return !hashcmp(sha1, EMPTY_BLOB_SHA1_BIN);
 }
 
-int git_mkstemp(char *path, size_t n, const char *template);
+static inline int is_empty_blob_oid(const struct object_id *oid)
+{
+       return !hashcmp(oid->hash, EMPTY_BLOB_SHA1_BIN);
+}
+
+static inline int is_empty_tree_sha1(const unsigned char *sha1)
+{
+       return !hashcmp(sha1, EMPTY_TREE_SHA1_BIN);
+}
+
+static inline int is_empty_tree_oid(const struct object_id *oid)
+{
+       return !hashcmp(oid->hash, EMPTY_TREE_SHA1_BIN);
+}
 
 /* set default permissions by passing mode arguments to open(2) */
 int git_mkstemps_mode(char *pattern, int suffix_len, int mode);
@@ -997,8 +1097,9 @@ int adjust_shared_perm(const char *path);
 
 /*
  * Create the directory containing the named path, using care to be
- * somewhat safe against races.  Return one of the scld_error values
- * to indicate success/failure.
+ * somewhat safe against races. Return one of the scld_error values to
+ * indicate success/failure. On error, set errno to describe the
+ * problem.
  *
  * SCLD_VANISHED indicates that one of the ancestor directories of the
  * path existed at one point during the function call and then
@@ -1022,17 +1123,64 @@ enum scld_error {
 enum scld_error safe_create_leading_directories(char *path);
 enum scld_error safe_create_leading_directories_const(const char *path);
 
+/*
+ * Callback function for raceproof_create_file(). This function is
+ * expected to do something that makes dirname(path) permanent despite
+ * the fact that other processes might be cleaning up empty
+ * directories at the same time. Usually it will create a file named
+ * path, but alternatively it could create another file in that
+ * directory, or even chdir() into that directory. The function should
+ * return 0 if the action was completed successfully. On error, it
+ * should return a nonzero result and set errno.
+ * raceproof_create_file() treats two errno values specially:
+ *
+ * - ENOENT -- dirname(path) does not exist. In this case,
+ *             raceproof_create_file() tries creating dirname(path)
+ *             (and any parent directories, if necessary) and calls
+ *             the function again.
+ *
+ * - EISDIR -- the file already exists and is a directory. In this
+ *             case, raceproof_create_file() removes the directory if
+ *             it is empty (and recursively any empty directories that
+ *             it contains) and calls the function again.
+ *
+ * Any other errno causes raceproof_create_file() to fail with the
+ * callback's return value and errno.
+ *
+ * Obviously, this function should be OK with being called again if it
+ * fails with ENOENT or EISDIR. In other scenarios it will not be
+ * called again.
+ */
+typedef int create_file_fn(const char *path, void *cb);
+
+/*
+ * Create a file in dirname(path) by calling fn, creating leading
+ * directories if necessary. Retry a few times in case we are racing
+ * with another process that is trying to clean up the directory that
+ * contains path. See the documentation for create_file_fn for more
+ * details.
+ *
+ * Return the value and set the errno that resulted from the most
+ * recent call of fn. fn is always called at least once, and will be
+ * called more than once if it returns ENOENT or EISDIR.
+ */
+int raceproof_create_file(const char *path, create_file_fn fn, void *cb);
+
 int mkdir_in_gitdir(const char *path);
-extern char *expand_user_path(const char *path);
+extern char *expand_user_path(const char *path, int real_home);
 const char *enter_repo(const char *path, int strict);
 static inline int is_absolute_path(const char *path)
 {
        return is_dir_sep(path[0]) || has_dos_drive_prefix(path);
 }
 int is_directory(const char *);
+char *strbuf_realpath(struct strbuf *resolved, const char *path,
+                     int die_on_error);
 const char *real_path(const char *path);
 const char *real_path_if_valid(const char *path);
+char *real_pathdup(const char *path, int die_on_error);
 const char *absolute_path(const char *path);
+char *absolute_pathdup(const char *path);
 const char *remove_leading_path(const char *in, const char *prefix);
 const char *relative_path(const char *in, const char *prefix, struct strbuf *sb);
 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len);
@@ -1049,6 +1197,13 @@ extern int is_ntfs_dotgit(const char *name);
  */
 extern char *xdg_config_home(const char *filename);
 
+/**
+ * Return a newly allocated string with the evaluation of
+ * "$XDG_CACHE_HOME/git/$filename" if $XDG_CACHE_HOME is non-empty, otherwise
+ * "$HOME/.cache/git/$filename". Return NULL upon error.
+ */
+extern char *xdg_cache_home(const char *filename);
+
 /* object replacement */
 #define LOOKUP_REPLACE_OBJECT 1
 #define LOOKUP_UNKNOWN_OBJECT 2
@@ -1091,7 +1246,8 @@ extern int write_sha1_file(const void *buf, unsigned long len, const char *type,
 extern int hash_sha1_file_literally(const void *buf, unsigned long len, const char *type, unsigned char *sha1, unsigned flags);
 extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *);
 extern int force_object_loose(const unsigned char *sha1, time_t mtime);
-extern int git_open_noatime(const char *name);
+extern int git_open_cloexec(const char *name, int flags);
+#define git_open(name) git_open_cloexec(name, O_RDONLY)
 extern void *map_sha1_file(const unsigned char *sha1, unsigned long *size);
 extern int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz);
 extern int parse_sha1_header(const char *hdr, unsigned long *sizep);
@@ -1105,6 +1261,19 @@ extern int finalize_object_file(const char *tmpfile, const char *filename);
 
 extern int has_sha1_pack(const unsigned char *sha1);
 
+/*
+ * Open the loose object at path, check its sha1, and return the contents,
+ * type, and size. If the object is a blob, then "contents" may return NULL,
+ * to allow streaming of large blobs.
+ *
+ * Returns 0 on success, negative on error (details may be written to stderr).
+ */
+int read_loose_object(const char *path,
+                     const unsigned char *expected_sha1,
+                     enum object_type *type,
+                     unsigned long *size,
+                     void **contents);
+
 /*
  * Return true iff we have an object named sha1, whether local or in
  * an alternate object database, and whether packed or loose.  This
@@ -1136,6 +1305,9 @@ extern int has_pack_index(const unsigned char *sha1);
 
 extern void assert_sha1_type(const unsigned char *sha1, enum object_type expect);
 
+/* Helper to check and "touch" a file */
+extern int check_and_freshen_file(const char *fn, int freshen);
+
 extern const signed char hexval_table[256];
 static inline unsigned int hexval(unsigned char c)
 {
@@ -1156,15 +1328,23 @@ static inline int hex2chr(const char *s)
 #define MINIMUM_ABBREV minimum_abbrev
 #define DEFAULT_ABBREV default_abbrev
 
+/* used when the code does not know or care what the default abbrev is */
+#define FALLBACK_DEFAULT_ABBREV 7
+
 struct object_context {
        unsigned char tree[20];
-       char path[PATH_MAX];
        unsigned mode;
        /*
         * symlink_path is only used by get_tree_entry_follow_symlinks,
         * and only for symlinks that point outside the repository.
         */
        struct strbuf symlink_path;
+       /*
+        * If GET_SHA1_RECORD_PATH is set, this will record path (if any)
+        * found when resolving the name. The caller is responsible for
+        * releasing the memory.
+        */
+       char *path;
 };
 
 #define GET_SHA1_QUIETLY           01
@@ -1174,8 +1354,14 @@ struct object_context {
 #define GET_SHA1_TREEISH          020
 #define GET_SHA1_BLOB             040
 #define GET_SHA1_FOLLOW_SYMLINKS 0100
+#define GET_SHA1_RECORD_PATH     0200
 #define GET_SHA1_ONLY_TO_DIE    04000
 
+#define GET_SHA1_DISAMBIGUATORS \
+       (GET_SHA1_COMMIT | GET_SHA1_COMMITTISH | \
+       GET_SHA1_TREE | GET_SHA1_TREEISH | \
+       GET_SHA1_BLOB)
+
 extern int get_sha1(const char *str, unsigned char *sha1);
 extern int get_sha1_commit(const char *str, unsigned char *sha1);
 extern int get_sha1_committish(const char *str, unsigned char *sha1);
@@ -1183,13 +1369,15 @@ extern int get_sha1_tree(const char *str, unsigned char *sha1);
 extern int get_sha1_treeish(const char *str, unsigned char *sha1);
 extern int get_sha1_blob(const char *str, unsigned char *sha1);
 extern void maybe_die_on_misspelt_object_name(const char *name, const char *prefix);
-extern int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *orc);
+extern int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *oc);
 
 extern int get_oid(const char *str, struct object_id *oid);
 
-typedef int each_abbrev_fn(const unsigned char *sha1, void *);
+typedef int each_abbrev_fn(const struct object_id *oid, void *);
 extern int for_each_abbrev(const char *prefix, each_abbrev_fn, void *);
 
+extern int set_disambiguate_hint_config(const char *var, const char *value);
+
 /*
  * Try to read a SHA1 in hexadecimal format from the 40 characters
  * starting at hex.  Write the 20-byte result to sha1 in binary form.
@@ -1216,8 +1404,47 @@ extern char *oid_to_hex_r(char *out, const struct object_id *oid);
 extern char *sha1_to_hex(const unsigned char *sha1);   /* static buffer result! */
 extern char *oid_to_hex(const struct object_id *oid);  /* same static buffer as sha1_to_hex */
 
-extern int interpret_branch_name(const char *str, int len, struct strbuf *);
-extern int get_sha1_mb(const char *str, unsigned char *sha1);
+/*
+ * Parse a 40-character hexadecimal object ID starting from hex, updating the
+ * pointer specified by end when parsing stops.  The resulting object ID is
+ * stored in oid.  Returns 0 on success.  Parsing will stop on the first NUL or
+ * other invalid character.  end is only updated on success; otherwise, it is
+ * unmodified.
+ */
+extern int parse_oid_hex(const char *hex, struct object_id *oid, const char **end);
+
+/*
+ * This reads short-hand syntax that not only evaluates to a commit
+ * object name, but also can act as if the end user spelled the name
+ * of the branch from the command line.
+ *
+ * - "@{-N}" finds the name of the Nth previous branch we were on, and
+ *   places the name of the branch in the given buf and returns the
+ *   number of characters parsed if successful.
+ *
+ * - "<branch>@{upstream}" finds the name of the other ref that
+ *   <branch> is configured to merge with (missing <branch> defaults
+ *   to the current branch), and places the name of the branch in the
+ *   given buf and returns the number of characters parsed if
+ *   successful.
+ *
+ * If the input is not of the accepted format, it returns a negative
+ * number to signal an error.
+ *
+ * If the input was ok but there are not N branch switches in the
+ * reflog, it returns 0.
+ *
+ * If "allowed" is non-zero, it is a treated as a bitfield of allowable
+ * expansions: local branches ("refs/heads/"), remote branches
+ * ("refs/remotes/"), or "HEAD". If no "allowed" bits are set, any expansion is
+ * allowed, even ones to refs outside of those namespaces.
+ */
+#define INTERPRET_BRANCH_LOCAL (1<<0)
+#define INTERPRET_BRANCH_REMOTE (1<<1)
+#define INTERPRET_BRANCH_HEAD (1<<2)
+extern int interpret_branch_name(const char *str, int len, struct strbuf *,
+                                unsigned allowed);
+extern int get_oid_mb(const char *str, struct object_id *oid);
 
 extern int validate_headref(const char *ref);
 
@@ -1327,6 +1554,7 @@ struct checkout {
                 not_new:1,
                 refresh_cache:1;
 };
+#define CHECKOUT_INIT { NULL, "" }
 
 #define TEMPORARY_FILENAME_LENGTH 25
 extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath);
@@ -1352,15 +1580,46 @@ extern void remove_scheduled_dirs(void);
 
 extern struct alternate_object_database {
        struct alternate_object_database *next;
-       char *name;
-       char base[FLEX_ARRAY]; /* more */
+
+       /* see alt_scratch_buf() */
+       struct strbuf scratch;
+       size_t base_len;
+
+       char path[FLEX_ARRAY];
 } *alt_odb_list;
 extern void prepare_alt_odb(void);
 extern void read_info_alternates(const char * relative_base, int depth);
-extern void add_to_alternates_file(const char *reference);
+extern char *compute_alternate_path(const char *path, struct strbuf *err);
 typedef int alt_odb_fn(struct alternate_object_database *, void *);
 extern int foreach_alt_odb(alt_odb_fn, void*);
 
+/*
+ * Allocate a "struct alternate_object_database" but do _not_ actually
+ * add it to the list of alternates.
+ */
+struct alternate_object_database *alloc_alt_odb(const char *dir);
+
+/*
+ * Add the directory to the on-disk alternates file; the new entry will also
+ * take effect in the current process.
+ */
+extern void add_to_alternates_file(const char *dir);
+
+/*
+ * Add the directory to the in-memory list of alternates (along with any
+ * recursive alternates it points to), but do not modify the on-disk alternates
+ * file.
+ */
+extern void add_to_alternates_memory(const char *dir);
+
+/*
+ * Returns a scratch strbuf pre-filled with the alternate object directory,
+ * including a trailing slash, which can be used to access paths in the
+ * alternate. Always use this over direct access to alt->scratch, as it
+ * cleans up any previous use of the scratch buffer.
+ */
+extern struct strbuf *alt_scratch_buf(struct alternate_object_database *alt);
+
 struct pack_window {
        struct pack_window *next;
        unsigned char *base;
@@ -1417,11 +1676,41 @@ extern void prepare_packed_git(void);
 extern void reprepare_packed_git(void);
 extern void install_packed_git(struct packed_git *pack);
 
+/*
+ * Give a rough count of objects in the repository. This sacrifices accuracy
+ * for speed.
+ */
+unsigned long approximate_object_count(void);
+
 extern struct packed_git *find_sha1_pack(const unsigned char *sha1,
                                         struct packed_git *packs);
 
 extern void pack_report(void);
 
+/*
+ * Create a temporary file rooted in the object database directory, or
+ * die on failure. The filename is taken from "pattern", which should have the
+ * usual "XXXXXX" trailer, and the resulting filename is written into the
+ * "template" buffer. Returns the open descriptor.
+ */
+extern int odb_mkstemp(struct strbuf *template, const char *pattern);
+
+/*
+ * Generate the filename to be used for a pack file with checksum "sha1" and
+ * extension "ext". The result is written into the strbuf "buf", overwriting
+ * any existing contents. A pointer to buf->buf is returned as a convenience.
+ *
+ * Example: odb_pack_name(out, sha1, "idx") => ".git/objects/pack/pack-1234..idx"
+ */
+extern char *odb_pack_name(struct strbuf *buf, const unsigned char *sha1, const char *ext);
+
+/*
+ * Create a pack .keep file named "name" (which should generally be the output
+ * of odb_pack_name). Returns a file descriptor opened for writing, or -1 on
+ * error.
+ */
+extern int odb_pack_keep(const char *name);
+
 /*
  * mmap the index file for the specified packfile (if it is not
  * already mmapped).  Return 0 on success.
@@ -1458,6 +1747,12 @@ extern void check_pack_index_ptr(const struct packed_git *p, const void *ptr);
  * error.
  */
 extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t n);
+/*
+ * Like nth_packed_object_sha1, but write the data into the object specified by
+ * the the first argument.  Returns the first argument on success, and NULL on
+ * error.
+ */
+extern const struct object_id *nth_packed_object_oid(struct object_id *, struct packed_git *, uint32_t n);
 
 /*
  * Return the offset of the nth object within the specified packfile.
@@ -1499,7 +1794,7 @@ extern int unpack_object_header(struct packed_git *, struct pack_window **, off_
  * scratch buffer, but restored to its original contents before
  * the function returns.
  */
-typedef int each_loose_object_fn(const unsigned char *sha1,
+typedef int each_loose_object_fn(const struct object_id *oid,
                                 const char *path,
                                 void *data);
 typedef int each_loose_cruft_fn(const char *basename,
@@ -1525,7 +1820,7 @@ int for_each_loose_file_in_objdir_buf(struct strbuf *path,
  * LOCAL_ONLY flag is set).
  */
 #define FOR_EACH_OBJECT_LOCAL_ONLY 0x1
-typedef int each_packed_object_fn(const unsigned char *sha1,
+typedef int each_packed_object_fn(const struct object_id *oid,
                                  struct packed_git *pack,
                                  uint32_t pos,
                                  void *data);
@@ -1563,7 +1858,15 @@ struct object_info {
                } packed;
        } u;
 };
+
+/*
+ * Initializer for a "struct object_info" that wants no items. You may
+ * also memset() the memory to all-zeroes.
+ */
+#define OBJECT_INFO_INIT {NULL}
+
 extern int sha1_object_info_extended(const unsigned char *, struct object_info *, unsigned flags);
+extern int packed_object_info(struct packed_git *pack, off_t offset, struct object_info *);
 
 /* Dumb servers support */
 extern int update_server_info(int);
@@ -1595,22 +1898,31 @@ enum config_origin_type {
        CONFIG_ORIGIN_CMDLINE
 };
 
+struct config_options {
+       unsigned int respect_includes : 1;
+       const char *git_dir;
+};
+
 typedef int (*config_fn_t)(const char *, const char *, void *);
 extern int git_default_config(const char *, const char *, void *);
 extern int git_config_from_file(config_fn_t fn, const char *, void *);
 extern int git_config_from_mem(config_fn_t fn, const enum config_origin_type,
                                        const char *name, const char *buf, size_t len, void *data);
+extern int git_config_from_blob_sha1(config_fn_t fn, const char *name,
+                                    const unsigned char *sha1, void *data);
 extern void git_config_push_parameter(const char *text);
 extern int git_config_from_parameters(config_fn_t fn, void *data);
+extern void read_early_config(config_fn_t cb, void *data);
 extern void git_config(config_fn_t fn, void *);
 extern int git_config_with_options(config_fn_t fn, void *,
                                   struct git_config_source *config_source,
-                                  int respect_includes);
+                                  const struct config_options *opts);
 extern int git_parse_ulong(const char *, unsigned long *);
 extern int git_parse_maybe_bool(const char *);
 extern int git_config_int(const char *, const char *);
 extern int64_t git_config_int64(const char *, const char *);
 extern unsigned long git_config_ulong(const char *, const char *);
+extern ssize_t git_config_ssize_t(const char *, const char *);
 extern int git_config_bool_or_int(const char *, const char *, int *);
 extern int git_config_bool(const char *, const char *);
 extern int git_config_maybe_bool(const char *, const char *);
@@ -1657,6 +1969,7 @@ struct config_include_data {
        int depth;
        config_fn_t fn;
        void *data;
+       const struct config_options *opts;
 };
 #define CONFIG_INCLUDE_INIT { 0 }
 extern int git_config_include(const char *name, const char *value, void *data);
@@ -1668,8 +1981,11 @@ extern int git_config_include(const char *name, const char *value, void *data);
  *
  * (i.e., what gets handed to a config_fn_t). The caller provides the section;
  * we return -1 if it does not match, 0 otherwise. The subsection and key
- * out-parameters are filled by the function (and subsection is NULL if it is
+ * out-parameters are filled by the function (and *subsection is NULL if it is
  * missing).
+ *
+ * If the subsection pointer-to-pointer passed in is NULL, returns 0 only if
+ * there is no subsection at all.
  */
 extern int parse_config_key(const char *var,
                            const char *section,
@@ -1731,6 +2047,11 @@ extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest);
 extern int git_config_get_maybe_bool(const char *key, int *dest);
 extern int git_config_get_pathname(const char *key, const char **dest);
 extern int git_config_get_untracked_cache(void);
+extern int git_config_get_split_index(void);
+extern int git_config_get_max_percent_split_change(void);
+
+/* This dies if the configured or default date is in the future */
+extern int git_config_get_expiry(const char *key, const char **output);
 
 /*
  * This is a hack for test programs like test-dump-untracked-cache to
@@ -1798,7 +2119,6 @@ extern void write_file(const char *path, const char *fmt, ...);
 
 /* pager.c */
 extern void setup_pager(void);
-extern const char *pager_program;
 extern int pager_in_use(void);
 extern int pager_use_color;
 extern int term_columns(void);
diff --git a/ci/run-linux32-build.sh b/ci/run-linux32-build.sh
new file mode 100755 (executable)
index 0000000..e30fb2c
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Build and test Git in a 32-bit environment
+#
+# Usage:
+#   run-linux32-build.sh [host-user-id]
+#
+
+# Update packages to the latest available versions
+linux32 --32bit i386 sh -c '
+    apt update >/dev/null &&
+    apt install -y build-essential libcurl4-openssl-dev libssl-dev \
+       libexpat-dev gettext python >/dev/null
+' &&
+
+# If this script runs inside a docker container, then all commands are
+# usually executed as root. Consequently, the host user might not be
+# able to access the test output files.
+# If a host user id is given, then create a user "ci" with the host user
+# id to make everything accessible to the host user.
+HOST_UID=$1 &&
+CI_USER=$USER &&
+test -z $HOST_UID || (CI_USER="ci" && useradd -u $HOST_UID $CI_USER) &&
+
+# Build and test
+linux32 --32bit i386 su -m -l $CI_USER -c '
+    cd /usr/src/git &&
+    make --jobs=2 &&
+    make --quiet test
+'
diff --git a/ci/run-windows-build.sh b/ci/run-windows-build.sh
new file mode 100755 (executable)
index 0000000..d8f0d92
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/env bash
+#
+# Script to trigger the Git for Windows build and test run.
+# Set the $GFW_CI_TOKEN as environment variable.
+# Pass the branch (only branches on https://github.com/git/git are
+# supported) and a commit hash.
+#
+
+test $# -ne 2 && echo "Unexpected number of parameters" && exit 1
+test -z "$GFW_CI_TOKEN" && echo "GFW_CI_TOKEN not defined" && exit
+
+BRANCH=$1
+COMMIT=$2
+
+gfwci () {
+       local CURL_ERROR_CODE HTTP_CODE
+       exec 3>&1
+       HTTP_CODE=$(curl \
+               -H "Authentication: Bearer $GFW_CI_TOKEN" \
+               --silent --retry 5 --write-out '%{HTTP_CODE}' \
+               --output >(sed "$(printf '1s/^\xef\xbb\xbf//')" >cat >&3) \
+               "https://git-for-windows-ci.azurewebsites.net/api/TestNow?$1" \
+       )
+       CURL_ERROR_CODE=$?
+       if test $CURL_ERROR_CODE -ne 0
+       then
+               return $CURL_ERROR_CODE
+       fi
+       if test "$HTTP_CODE" -ge 400 && test "$HTTP_CODE" -lt 600
+       then
+               return 127
+       fi
+}
+
+# Trigger build job
+BUILD_ID=$(gfwci "action=trigger&branch=$BRANCH&commit=$COMMIT&skipTests=false")
+if test $? -ne 0
+then
+       echo "Unable to trigger Visual Studio Team Services Build"
+       echo "$BUILD_ID"
+       exit 1
+fi
+
+# Check if the $BUILD_ID contains a number
+case $BUILD_ID in
+''|*[!0-9]*) echo "Unexpected build number: $BUILD_ID" && exit 1
+esac
+
+echo "Visual Studio Team Services Build #${BUILD_ID}"
+
+# Wait until build job finished
+STATUS=
+RESULT=
+while true
+do
+       LAST_STATUS=$STATUS
+       STATUS=$(gfwci "action=status&buildId=$BUILD_ID")
+       test "$STATUS" = "$LAST_STATUS" || printf "\nStatus: %s " "$STATUS"
+       printf "."
+
+       case "$STATUS" in
+       inProgress|postponed|notStarted) sleep 10               ;; # continue
+                "completed: succeeded") RESULT="success"; break;; # success
+       *) echo "Unhandled status: $STATUS";               break;; # failure
+       esac
+done
+
+# Print log
+echo ""
+echo ""
+gfwci "action=log&buildId=$BUILD_ID" | cut -c 30-
+
+# Set exit code for TravisCI
+test "$RESULT" = "success"
index 579d540d32995715114f3b81ab5839800d9e006b..6214e6acb4a1acbc3eef764a8c610a5f6e100ee0 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
 #
 # Perform sanity checks on documentation and build it.
 #
@@ -7,8 +7,19 @@ set -e
 
 make check-builtins
 make check-docs
-make doc
 
+# Build docs with AsciiDoc
+make --jobs=2 doc > >(tee stdout.log) 2> >(tee stderr.log >&2)
+! test -s stderr.log
 test -s Documentation/git.html
 test -s Documentation/git.xml
 test -s Documentation/git.1
+grep '<meta name="generator" content="AsciiDoc ' Documentation/git.html
+
+# Build docs with AsciiDoctor
+make clean
+make --jobs=2 USE_ASCIIDOCTOR=1 doc > >(tee stdout.log) 2> >(tee stderr.log >&2)
+sed '/^GIT_VERSION = / d' stderr.log
+! test -s stderr.log
+test -s Documentation/git.html
+grep '<meta name="generator" content="Asciidoctor ' Documentation/git.html
diff --git a/color.c b/color.c
index 1b95e6b2a7bb1601fa5862de8989775e197c7b41..dee61557e03f452f1e20ce6c8c467203aa8aed60 100644 (file)
--- a/color.c
+++ b/color.c
@@ -207,7 +207,17 @@ int color_parse_mem(const char *value, int value_len, char *dst)
        struct color fg = { COLOR_UNSPECIFIED };
        struct color bg = { COLOR_UNSPECIFIED };
 
-       if (!strncasecmp(value, "reset", len)) {
+       while (len > 0 && isspace(*ptr)) {
+               ptr++;
+               len--;
+       }
+
+       if (!len) {
+               dst[0] = '\0';
+               return 0;
+       }
+
+       if (!strncasecmp(ptr, "reset", len)) {
                xsnprintf(dst, end - dst, GIT_COLOR_RESET);
                return 0;
        }
index 8e2a577bdb43297c619a1f4322dab9e4a5572d6a..2848034fe9c3f3cc1d930347e892cee1cbed4f52 100644 (file)
@@ -292,9 +292,10 @@ static char *grab_blob(const struct object_id *oid, unsigned int mode,
        enum object_type type;
 
        if (S_ISGITLINK(mode)) {
-               blob = xmalloc(100);
-               *size = snprintf(blob, 100,
-                                "Subproject commit %s\n", oid_to_hex(oid));
+               struct strbuf buf = STRBUF_INIT;
+               strbuf_addf(&buf, "Subproject commit %s\n", oid_to_hex(oid));
+               *size = buf.len;
+               blob = strbuf_detach(&buf, NULL);
        } else if (is_null_oid(oid)) {
                /* deleted blob */
                *size = 0;
@@ -1203,9 +1204,9 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re
 
                /* Show sha1's */
                for (i = 0; i < num_parent; i++)
-                       printf(" %s", diff_unique_abbrev(p->parent[i].oid.hash,
-                                                        opt->abbrev));
-               printf(" %s ", diff_unique_abbrev(p->oid.hash, opt->abbrev));
+                       printf(" %s", diff_aligned_abbrev(&p->parent[i].oid,
+                                                         opt->abbrev));
+               printf(" %s ", diff_aligned_abbrev(&p->oid, opt->abbrev));
        }
 
        if (opt->output_format & (DIFF_FORMAT_RAW | DIFF_FORMAT_NAME_STATUS)) {
@@ -1311,7 +1312,7 @@ static const char *path_path(void *obj)
 
 /* find set of paths that every parent touches */
 static struct combine_diff_path *find_paths_generic(const unsigned char *sha1,
-       const struct sha1_array *parents, struct diff_options *opt)
+       const struct oid_array *parents, struct diff_options *opt)
 {
        struct combine_diff_path *paths = NULL;
        int i, num_parent = parents->nr;
@@ -1335,7 +1336,7 @@ static struct combine_diff_path *find_paths_generic(const unsigned char *sha1,
                        opt->output_format = stat_opt;
                else
                        opt->output_format = DIFF_FORMAT_NO_OUTPUT;
-               diff_tree_sha1(parents->sha1[i], sha1, "", opt);
+               diff_tree_sha1(parents->oid[i].hash, sha1, "", opt);
                diffcore_std(opt);
                paths = intersect_paths(paths, i, num_parent);
 
@@ -1359,7 +1360,7 @@ static struct combine_diff_path *find_paths_generic(const unsigned char *sha1,
  * rename/copy detection, etc, comparing all trees simultaneously (= faster).
  */
 static struct combine_diff_path *find_paths_multitree(
-       const unsigned char *sha1, const struct sha1_array *parents,
+       const unsigned char *sha1, const struct oid_array *parents,
        struct diff_options *opt)
 {
        int i, nparent = parents->nr;
@@ -1369,7 +1370,7 @@ static struct combine_diff_path *find_paths_multitree(
 
        ALLOC_ARRAY(parents_sha1, nparent);
        for (i = 0; i < nparent; i++)
-               parents_sha1[i] = parents->sha1[i];
+               parents_sha1[i] = parents->oid[i].hash;
 
        /* fake list head, so worker can assume it is non-NULL */
        paths_head.next = NULL;
@@ -1384,7 +1385,7 @@ static struct combine_diff_path *find_paths_multitree(
 
 
 void diff_tree_combined(const unsigned char *sha1,
-                       const struct sha1_array *parents,
+                       const struct oid_array *parents,
                        int dense,
                        struct rev_info *rev)
 {
@@ -1462,7 +1463,7 @@ void diff_tree_combined(const unsigned char *sha1,
                if (stat_opt) {
                        diffopts.output_format = stat_opt;
 
-                       diff_tree_sha1(parents->sha1[0], sha1, "", &diffopts);
+                       diff_tree_sha1(parents->oid[0].hash, sha1, "", &diffopts);
                        diffcore_std(&diffopts);
                        if (opt->orderfile)
                                diffcore_order(opt->orderfile);
@@ -1532,12 +1533,12 @@ void diff_tree_combined_merge(const struct commit *commit, int dense,
                              struct rev_info *rev)
 {
        struct commit_list *parent = get_saved_parents(rev, commit);
-       struct sha1_array parents = SHA1_ARRAY_INIT;
+       struct oid_array parents = OID_ARRAY_INIT;
 
        while (parent) {
-               sha1_array_append(&parents, parent->item->object.oid.hash);
+               oid_array_append(&parents, &parent->item->object.oid);
                parent = parent->next;
        }
        diff_tree_combined(commit->object.oid.hash, &parents, dense, rev);
-       sha1_array_clear(&parents);
+       oid_array_clear(&parents);
 }
index 2a94137bbb383fda655b481446d0891062d73cb9..a1fad28fd82da18cc2b8f43e8eb26fed9864411b 100644 (file)
@@ -107,7 +107,6 @@ git-read-tree                           plumbingmanipulators
 git-rebase                              mainporcelain           history
 git-receive-pack                        synchelpers
 git-reflog                              ancillarymanipulators
-git-relink                              ancillarymanipulators
 git-remote                              ancillarymanipulators
 git-repack                              ancillarymanipulators
 git-replace                             ancillarymanipulators
index aada266f9a85e379ab2d2603b82071be4bb19ded..c14ddf191fbf047607699e562fd85c8046932efb 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -11,6 +11,7 @@
 #include "commit-slab.h"
 #include "prio-queue.h"
 #include "sha1-lookup.h"
+#include "wt-status.h"
 
 static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
 
@@ -415,8 +416,7 @@ int find_commit_subject(const char *commit_buffer, const char **subject)
                p++;
        if (*p) {
                p = skip_blank_lines(p + 2);
-               for (eol = p; *eol && *eol != '\n'; eol++)
-                       ; /* do nothing */
+               eol = strchrnul(p, '\n');
        } else
                eol = p;
 
@@ -1308,11 +1308,11 @@ void for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data)
 
 static inline int standard_header_field(const char *field, size_t len)
 {
-       return ((len == 4 && !memcmp(field, "tree ", 5)) ||
-               (len == 6 && !memcmp(field, "parent ", 7)) ||
-               (len == 6 && !memcmp(field, "author ", 7)) ||
-               (len == 9 && !memcmp(field, "committer ", 10)) ||
-               (len == 8 && !memcmp(field, "encoding ", 9)));
+       return ((len == 4 && !memcmp(field, "tree", 4)) ||
+               (len == 6 && !memcmp(field, "parent", 6)) ||
+               (len == 6 && !memcmp(field, "author", 6)) ||
+               (len == 9 && !memcmp(field, "committer", 9)) ||
+               (len == 8 && !memcmp(field, "encoding", 8)));
 }
 
 static int excluded_header_field(const char *field, size_t len, const char **exclude)
@@ -1322,8 +1322,7 @@ static int excluded_header_field(const char *field, size_t len, const char **exc
 
        while (*exclude) {
                size_t xlen = strlen(*exclude);
-               if (len == xlen &&
-                   !memcmp(field, *exclude, xlen) && field[xlen] == ' ')
+               if (len == xlen && !memcmp(field, *exclude, xlen))
                        return 1;
                exclude++;
        }
@@ -1354,12 +1353,11 @@ static struct commit_extra_header *read_commit_extra_header_lines(
                strbuf_reset(&buf);
                it = NULL;
 
-               eof = strchr(line, ' ');
-               if (next <= eof)
+               eof = memchr(line, ' ', next - line);
+               if (!eof)
                        eof = next;
-
-               if (standard_header_field(line, eof - line) ||
-                   excluded_header_field(line, eof - line, exclude))
+               else if (standard_header_field(line, eof - line) ||
+                        excluded_header_field(line, eof - line, exclude))
                        continue;
 
                it = xcalloc(1, sizeof(*it));
@@ -1511,9 +1509,9 @@ static int verify_utf8(struct strbuf *buf)
 }
 
 static const char commit_utf8_warn[] =
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n";
+N_("Warning: commit message did not conform to UTF-8.\n"
+   "You may want to amend it after fixing the message, or set the config\n"
+   "variable i18n.commitencoding to the encoding your project uses.\n");
 
 int commit_tree_extended(const char *msg, size_t msg_len,
                         const unsigned char *tree,
@@ -1566,7 +1564,7 @@ int commit_tree_extended(const char *msg, size_t msg_len,
 
        /* And check the encoding */
        if (encoding_is_utf8 && !verify_utf8(&buffer))
-               fprintf(stderr, commit_utf8_warn);
+               fprintf(stderr, _(commit_utf8_warn));
 
        if (sign_commit && do_sign_commit(&buffer, sign_commit))
                return -1;
@@ -1649,47 +1647,47 @@ const char *find_commit_header(const char *msg, const char *key, size_t *out_len
 }
 
 /*
- * Inspect sb and determine the true "end" of the log message, in
+ * Inspect the given string and determine the true "end" of the log message, in
  * order to find where to put a new Signed-off-by: line.  Ignored are
- * trailing comment lines and blank lines, and also the traditional
- * "Conflicts:" block that is not commented out, so that we can use
- * "git commit -s --amend" on an existing commit that forgot to remove
- * it.
+ * trailing comment lines and blank lines.  To support "git commit -s
+ * --amend" on an existing commit, we also ignore "Conflicts:".  To
+ * support "git commit -v", we truncate at cut lines.
  *
  * Returns the number of bytes from the tail to ignore, to be fed as
  * the second parameter to append_signoff().
  */
-int ignore_non_trailer(struct strbuf *sb)
+int ignore_non_trailer(const char *buf, size_t len)
 {
        int boc = 0;
        int bol = 0;
        int in_old_conflicts_block = 0;
+       size_t cutoff = wt_status_locate_end(buf, len);
 
-       while (bol < sb->len) {
-               char *next_line;
+       while (bol < cutoff) {
+               const char *next_line = memchr(buf + bol, '\n', len - bol);
 
-               if (!(next_line = memchr(sb->buf + bol, '\n', sb->len - bol)))
-                       next_line = sb->buf + sb->len;
+               if (!next_line)
+                       next_line = buf + len;
                else
                        next_line++;
 
-               if (sb->buf[bol] == comment_line_char || sb->buf[bol] == '\n') {
+               if (buf[bol] == comment_line_char || buf[bol] == '\n') {
                        /* is this the first of the run of comments? */
                        if (!boc)
                                boc = bol;
                        /* otherwise, it is just continuing */
-               } else if (starts_with(sb->buf + bol, "Conflicts:\n")) {
+               } else if (starts_with(buf + bol, "Conflicts:\n")) {
                        in_old_conflicts_block = 1;
                        if (!boc)
                                boc = bol;
-               } else if (in_old_conflicts_block && sb->buf[bol] == '\t') {
+               } else if (in_old_conflicts_block && buf[bol] == '\t') {
                        ; /* a pathname in the conflicts block */
                } else if (boc) {
                        /* the previous was not trailing comment */
                        boc = 0;
                        in_old_conflicts_block = 0;
                }
-               bol = next_line - sb->buf;
+               bol = next_line - buf;
        }
-       return boc ? sb->len - boc : 0;
+       return boc ? len - boc : len - cutoff;
 }
index 32e1a113e589f10ab3080dc173295083cd0c84ca..7b1986d5c8a0120ea90ee485ba46aff912de60fa 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -142,21 +142,24 @@ static inline int cmit_fmt_is_mail(enum cmit_fmt fmt)
        return (fmt == CMIT_FMT_EMAIL || fmt == CMIT_FMT_MBOXRD);
 }
 
+struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
+
 struct pretty_print_context {
        /*
         * Callers should tweak these to change the behavior of pp_* functions.
         */
        enum cmit_fmt fmt;
        int abbrev;
-       const char *subject;
        const char *after_subject;
        int preserve_subject;
        struct date_mode date_mode;
        unsigned date_mode_explicit:1;
+       int print_email_subject;
        int expand_tabs_in_log;
        int need_8bit_cte;
        char *notes_message;
        struct reflog_walk_info *reflog_info;
+       struct rev_info *rev;
        const char *output_encoding;
        struct string_list *mailmap;
        int color;
@@ -175,7 +178,6 @@ struct userformat_want {
 };
 
 extern int has_non_ascii(const char *text);
-struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
 extern const char *logmsg_reencode(const struct commit *commit,
                                   char **commit_encoding,
                                   const char *output_encoding);
@@ -259,7 +261,7 @@ extern struct commit_list *get_merge_bases_many_dirty(struct commit *one, int n,
 /* largest positive number a signed 32-bit integer can contain */
 #define INFINITE_DEPTH 0x7fffffff
 
-struct sha1_array;
+struct oid_array;
 struct ref;
 extern int register_shallow(const unsigned char *sha1);
 extern int unregister_shallow(const unsigned char *sha1);
@@ -267,20 +269,22 @@ extern int for_each_commit_graft(each_commit_graft_fn, void *);
 extern int is_repository_shallow(void);
 extern struct commit_list *get_shallow_commits(struct object_array *heads,
                int depth, int shallow_flag, int not_shallow_flag);
+extern struct commit_list *get_shallow_commits_by_rev_list(
+               int ac, const char **av, int shallow_flag, int not_shallow_flag);
 extern void set_alternate_shallow_file(const char *path, int override);
 extern int write_shallow_commits(struct strbuf *out, int use_pack_protocol,
-                                const struct sha1_array *extra);
+                                const struct oid_array *extra);
 extern void setup_alternate_shallow(struct lock_file *shallow_lock,
                                    const char **alternate_shallow_file,
-                                   const struct sha1_array *extra);
-extern const char *setup_temporary_shallow(const struct sha1_array *extra);
+                                   const struct oid_array *extra);
+extern const char *setup_temporary_shallow(const struct oid_array *extra);
 extern void advertise_shallow_grafts(int);
 
 struct shallow_info {
-       struct sha1_array *shallow;
+       struct oid_array *shallow;
        int *ours, nr_ours;
        int *theirs, nr_theirs;
-       struct sha1_array *ref;
+       struct oid_array *ref;
 
        /* for receive-pack */
        uint32_t **used_shallow;
@@ -291,7 +295,7 @@ struct shallow_info {
        int nr_commits;
 };
 
-extern void prepare_shallow_info(struct shallow_info *, struct sha1_array *);
+extern void prepare_shallow_info(struct shallow_info *, struct oid_array *);
 extern void clear_shallow_info(struct shallow_info *);
 extern void remove_nonexistent_theirs_shallow(struct shallow_info *);
 extern void assign_shallow_commits_to_refs(struct shallow_info *info,
@@ -353,7 +357,7 @@ extern const char *find_commit_header(const char *msg, const char *key,
                                      size_t *out_len);
 
 /* Find the end of the log message, the right place for a new trailer. */
-extern int ignore_non_trailer(struct strbuf *sb);
+extern int ignore_non_trailer(const char *buf, size_t len);
 
 typedef void (*each_mergetag_fn)(struct commit *commit, struct commit_extra_header *extra,
                                 void *cb_data);
index c654f95551c33d6b346ae7fe43a6cac987dd6b75..6a689007e7ce3fe08f148e8b82c0a1c618c513a5 100644 (file)
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "exec_cmd.h"
+#include "attr.h"
 
 /*
  * Many parts of Git have subprograms communicate via pipe, expect the
@@ -33,6 +34,8 @@ int main(int argc, const char **argv)
 
        git_setup_gettext();
 
+       attr_start();
+
        git_extract_argv0_path(argv[0]);
 
        restore_sigpipe_to_default();
index 3fbfda5978b7bb715ab132283a69fa49384896e9..fe0e3ccd24887a830b99dabb9c66db668ba4f566 100644 (file)
@@ -961,8 +961,10 @@ static char **get_path_split(void)
                        ++n;
                }
        }
-       if (!n)
+       if (!n) {
+               free(envpath);
                return NULL;
+       }
 
        ALLOC_ARRAY(path, n + 1);
        p = envpath;
index 034fff9479d03d2a2e3c7017a4fe4131461f0ec6..e03aecfe2e6556e1ef513922104557373eaa9260 100644 (file)
@@ -384,6 +384,9 @@ int mingw_raise(int sig);
  * ANSI emulation wrappers
  */
 
+int winansi_isatty(int fd);
+#define isatty winansi_isatty
+
 void winansi_init(void);
 HANDLE winansi_get_osfhandle(int fd);
 
@@ -395,7 +398,11 @@ HANDLE winansi_get_osfhandle(int fd);
        (isalpha(*(path)) && (path)[1] == ':' ? 2 : 0)
 int mingw_skip_dos_drive_prefix(char **path);
 #define skip_dos_drive_prefix mingw_skip_dos_drive_prefix
-#define is_dir_sep(c) ((c) == '/' || (c) == '\\')
+static inline int mingw_is_dir_sep(int c)
+{
+       return c == '/' || c == '\\';
+}
+#define is_dir_sep mingw_is_dir_sep
 static inline char *mingw_find_last_dir_sep(const char *path)
 {
        char *ret = NULL;
diff --git a/compat/qsort_s.c b/compat/qsort_s.c
new file mode 100644 (file)
index 0000000..52d1f0a
--- /dev/null
@@ -0,0 +1,69 @@
+#include "../git-compat-util.h"
+
+/*
+ * A merge sort implementation, simplified from the qsort implementation
+ * by Mike Haertel, which is a part of the GNU C Library.
+ * Added context pointer, safety checks and return value.
+ */
+
+static void msort_with_tmp(void *b, size_t n, size_t s,
+                          int (*cmp)(const void *, const void *, void *),
+                          char *t, void *ctx)
+{
+       char *tmp;
+       char *b1, *b2;
+       size_t n1, n2;
+
+       if (n <= 1)
+               return;
+
+       n1 = n / 2;
+       n2 = n - n1;
+       b1 = b;
+       b2 = (char *)b + (n1 * s);
+
+       msort_with_tmp(b1, n1, s, cmp, t, ctx);
+       msort_with_tmp(b2, n2, s, cmp, t, ctx);
+
+       tmp = t;
+
+       while (n1 > 0 && n2 > 0) {
+               if (cmp(b1, b2, ctx) <= 0) {
+                       memcpy(tmp, b1, s);
+                       tmp += s;
+                       b1 += s;
+                       --n1;
+               } else {
+                       memcpy(tmp, b2, s);
+                       tmp += s;
+                       b2 += s;
+                       --n2;
+               }
+       }
+       if (n1 > 0)
+               memcpy(tmp, b1, n1 * s);
+       memcpy(b, t, (n - n2) * s);
+}
+
+int git_qsort_s(void *b, size_t n, size_t s,
+               int (*cmp)(const void *, const void *, void *), void *ctx)
+{
+       const size_t size = st_mult(n, s);
+       char buf[1024];
+
+       if (!n)
+               return 0;
+       if (!b || !cmp)
+               return -1;
+
+       if (size < sizeof(buf)) {
+               /* The temporary array fits on the small on-stack buffer. */
+               msort_with_tmp(b, n, s, cmp, buf, ctx);
+       } else {
+               /* It's somewhat large, so malloc it.  */
+               char *tmp = xmalloc(size);
+               msort_with_tmp(b, n, s, cmp, tmp, ctx);
+               free(tmp);
+       }
+       return 0;
+}
index db4a5b0a37d687218ab085f22b57eb35e28893b8..a11a0f16d276470381587236ae513994d92af477 100644 (file)
@@ -6,6 +6,12 @@
 #include "../git-compat-util.h"
 #include <wingdi.h>
 #include <winreg.h>
+#include "win32.h"
+
+static int fd_is_interactive[3] = { 0, 0, 0 };
+#define FD_CONSOLE 0x1
+#define FD_SWAPPED 0x2
+#define FD_MSYS    0x4
 
 /*
  ANSI codes used by git: m, K
@@ -81,6 +87,7 @@ static void warn_if_raster_font(void)
 static int is_console(int fd)
 {
        CONSOLE_SCREEN_BUFFER_INFO sbi;
+       DWORD mode;
        HANDLE hcon;
 
        static int initialized = 0;
@@ -95,9 +102,22 @@ static int is_console(int fd)
                return 0;
 
        /* check if its a handle to a console output screen buffer */
-       if (!GetConsoleScreenBufferInfo(hcon, &sbi))
+       if (!fd) {
+               if (!GetConsoleMode(hcon, &mode))
+                       return 0;
+               /*
+                * This code path is only reached if there is no console
+                * attached to stdout/stderr, i.e. we will not need to output
+                * any text to any console, therefore we might just as well
+                * use black as foreground color.
+                */
+               sbi.wAttributes = 0;
+       } else if (!GetConsoleScreenBufferInfo(hcon, &sbi))
                return 0;
 
+       if (fd >= 0 && fd <= 2)
+               fd_is_interactive[fd] |= FD_CONSOLE;
+
        /* initialize attributes */
        if (!initialized) {
                console = hcon;
@@ -120,6 +140,11 @@ static void write_console(unsigned char *str, size_t len)
 
        /* convert utf-8 to utf-16 */
        int wlen = xutftowcsn(wbuf, (char*) str, ARRAY_SIZE(wbuf), len);
+       if (wlen < 0) {
+               wchar_t *err = L"[invalid]";
+               WriteConsoleW(console, err, wcslen(err), &dummy, NULL);
+               return;
+       }
 
        /* write directly to console */
        WriteConsoleW(console, wbuf, wlen, &dummy, NULL);
@@ -459,76 +484,49 @@ static HANDLE duplicate_handle(HANDLE hnd)
        return hresult;
 }
 
-
-/*
- * Make MSVCRT's internal file descriptor control structure accessible
- * so that we can tweak OS handles and flags directly (we need MSVCRT
- * to treat our pipe handle as if it were a console).
- *
- * We assume that the ioinfo structure (exposed by MSVCRT.dll via
- * __pioinfo) starts with the OS handle and the flags. The exact size
- * varies between MSVCRT versions, so we try different sizes until
- * toggling the FDEV bit of _pioinfo(1)->osflags is reflected in
- * isatty(1).
- */
-typedef struct {
-       HANDLE osfhnd;
-       char osflags;
-} ioinfo;
-
-extern __declspec(dllimport) ioinfo *__pioinfo[];
-
-static size_t sizeof_ioinfo = 0;
-
-#define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-
-#define FPIPE 0x08
-#define FDEV  0x40
-
-static inline ioinfo* _pioinfo(int fd)
-{
-       return (ioinfo*)((char*)__pioinfo[fd >> IOINFO_L2E] +
-                       (fd & (IOINFO_ARRAY_ELTS - 1)) * sizeof_ioinfo);
-}
-
-static int init_sizeof_ioinfo(void)
-{
-       int istty, wastty;
-       /* don't init twice */
-       if (sizeof_ioinfo)
-               return sizeof_ioinfo >= 256;
-
-       sizeof_ioinfo = sizeof(ioinfo);
-       wastty = isatty(1);
-       while (sizeof_ioinfo < 256) {
-               /* toggle FDEV flag, check isatty, then toggle back */
-               _pioinfo(1)->osflags ^= FDEV;
-               istty = isatty(1);
-               _pioinfo(1)->osflags ^= FDEV;
-               /* return if we found the correct size */
-               if (istty != wastty)
-                       return 0;
-               sizeof_ioinfo += sizeof(void*);
-       }
-       error("Tweaking file descriptors doesn't work with this MSVCRT.dll");
-       return 1;
-}
-
 static HANDLE swap_osfhnd(int fd, HANDLE new_handle)
 {
-       ioinfo *pioinfo;
-       HANDLE old_handle;
-
-       /* init ioinfo size if we haven't done so */
-       if (init_sizeof_ioinfo())
-               return INVALID_HANDLE_VALUE;
-
-       /* get ioinfo pointer and change the handles */
-       pioinfo = _pioinfo(fd);
-       old_handle = pioinfo->osfhnd;
-       pioinfo->osfhnd = new_handle;
-       return old_handle;
+       /*
+        * Create a copy of the original handle associated with fd
+        * because the original will get closed when we dup2().
+        */
+       HANDLE handle = (HANDLE)_get_osfhandle(fd);
+       HANDLE duplicate = duplicate_handle(handle);
+
+       /* Create a temp fd associated with the already open "new_handle". */
+       int new_fd = _open_osfhandle((intptr_t)new_handle, O_BINARY);
+
+       assert((fd == 1) || (fd == 2));
+
+       /*
+        * Use stock dup2() to re-bind fd to the new handle.  Note that
+        * this will implicitly close(1) and close both fd=1 and the
+        * originally associated handle.  It will open a new fd=1 and
+        * call DuplicateHandle() on the handle associated with new_fd.
+        * It is because of this implicit close() that we created the
+        * copy of the original.
+        *
+        * Note that we need to update the cached console handle to the
+        * duplicated one because the dup2() call will implicitly close
+        * the original one.
+        *
+        * Note that dup2() when given target := {0,1,2} will also
+        * call SetStdHandle(), so we don't need to worry about that.
+        */
+       if (console == handle)
+               console = duplicate;
+       dup2(new_fd, fd);
+
+       /* Close the temp fd.  This explicitly closes "new_handle"
+        * (because it has been associated with it).
+        */
+       close(new_fd);
+
+       if (fd == 2)
+               setvbuf(stderr, NULL, _IONBF, BUFSIZ);
+       fd_is_interactive[fd] |= FD_SWAPPED;
+
+       return duplicate;
 }
 
 #ifdef DETECT_MSYS_TTY
@@ -553,23 +551,39 @@ static void detect_msys_tty(int fd)
                        buffer, sizeof(buffer) - 2, &result)))
                return;
        name = nameinfo->Name.Buffer;
-       name[nameinfo->Name.Length] = 0;
-
-       /* check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX') */
-       if (!wcsstr(name, L"msys-") || !wcsstr(name, L"-pty"))
-               return;
-
-       /* init ioinfo size if we haven't done so */
-       if (init_sizeof_ioinfo())
+       name[nameinfo->Name.Length / sizeof(*name)] = 0;
+
+       /*
+        * Check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX')
+        * or a cygwin pty pipe ('cygwin-XXXX-ptyN-XX')
+        */
+       if ((!wcsstr(name, L"msys-") && !wcsstr(name, L"cygwin-")) ||
+                       !wcsstr(name, L"-pty"))
                return;
 
-       /* set FDEV flag, reset FPIPE flag */
-       _pioinfo(fd)->osflags &= ~FPIPE;
-       _pioinfo(fd)->osflags |= FDEV;
+       if (fd == 2)
+               setvbuf(stderr, NULL, _IONBF, BUFSIZ);
+       fd_is_interactive[fd] |= FD_MSYS;
 }
 
 #endif
 
+/*
+ * Wrapper for isatty().  Most calls in the main git code
+ * call isatty(1 or 2) to see if the instance is interactive
+ * and should: be colored, show progress, paginate output.
+ * We lie and give results for what the descriptor WAS at
+ * startup (and ignore any pipe redirection we internally
+ * do).
+ */
+#undef isatty
+int winansi_isatty(int fd)
+{
+       if (fd >= 0 && fd <= 2)
+               return fd_is_interactive[fd] != 0;
+       return isatty(fd);
+}
+
 void winansi_init(void)
 {
        int con1, con2;
@@ -578,6 +592,10 @@ void winansi_init(void)
        /* check if either stdout or stderr is a console output screen buffer */
        con1 = is_console(1);
        con2 = is_console(2);
+
+       /* Also compute console bit for fd 0 even though we don't need the result here. */
+       is_console(0);
+
        if (!con1 && !con2) {
 #ifdef DETECT_MSYS_TTY
                /* check if stdin / stdout / stderr are MSYS2 pty pipes */
@@ -621,12 +639,10 @@ void winansi_init(void)
  */
 HANDLE winansi_get_osfhandle(int fd)
 {
-       HANDLE hnd = (HANDLE) _get_osfhandle(fd);
-       if (isatty(fd) && GetFileType(hnd) == FILE_TYPE_PIPE) {
-               if (fd == 1 && hconsole1)
-                       return hconsole1;
-               else if (fd == 2 && hconsole2)
-                       return hconsole2;
-       }
-       return hnd;
+       if (fd == 1 && (fd_is_interactive[1] & FD_SWAPPED))
+               return hconsole1;
+       if (fd == 2 && (fd_is_interactive[2] & FD_SWAPPED))
+               return hconsole2;
+
+       return (HANDLE)_get_osfhandle(fd);
 }
index 0dfed682b86829fc06667d303c676e8abe6b3150..f0511e58e2af4235201a01618134a020592cf11c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -13,6 +13,7 @@
 #include "hashmap.h"
 #include "string-list.h"
 #include "utf8.h"
+#include "dir.h"
 
 struct config_source {
        struct config_source *prev;
@@ -66,6 +67,8 @@ static struct key_value_info *current_config_kvi;
  */
 static enum config_scope current_parsing_scope;
 
+static int core_compression_seen;
+static int pack_compression_seen;
 static int zlib_compression_seen;
 
 /*
@@ -132,7 +135,7 @@ static int handle_path_include(const char *path, struct config_include_data *inc
        if (!path)
                return config_error_nonbool("include.path");
 
-       expanded = expand_user_path(path);
+       expanded = expand_user_path(path, 0);
        if (!expanded)
                return error("could not expand include path '%s'", path);
        path = expanded;
@@ -168,9 +171,104 @@ static int handle_path_include(const char *path, struct config_include_data *inc
        return ret;
 }
 
+static int prepare_include_condition_pattern(struct strbuf *pat)
+{
+       struct strbuf path = STRBUF_INIT;
+       char *expanded;
+       int prefix = 0;
+
+       expanded = expand_user_path(pat->buf, 1);
+       if (expanded) {
+               strbuf_reset(pat);
+               strbuf_addstr(pat, expanded);
+               free(expanded);
+       }
+
+       if (pat->buf[0] == '.' && is_dir_sep(pat->buf[1])) {
+               const char *slash;
+
+               if (!cf || !cf->path)
+                       return error(_("relative config include "
+                                      "conditionals must come from files"));
+
+               strbuf_realpath(&path, cf->path, 1);
+               slash = find_last_dir_sep(path.buf);
+               if (!slash)
+                       die("BUG: how is this possible?");
+               strbuf_splice(pat, 0, 1, path.buf, slash - path.buf);
+               prefix = slash - path.buf + 1 /* slash */;
+       } else if (!is_absolute_path(pat->buf))
+               strbuf_insert(pat, 0, "**/", 3);
+
+       if (pat->len && is_dir_sep(pat->buf[pat->len - 1]))
+               strbuf_addstr(pat, "**");
+
+       strbuf_release(&path);
+       return prefix;
+}
+
+static int include_by_gitdir(const struct config_options *opts,
+                            const char *cond, size_t cond_len, int icase)
+{
+       struct strbuf text = STRBUF_INIT;
+       struct strbuf pattern = STRBUF_INIT;
+       int ret = 0, prefix;
+       const char *git_dir;
+
+       if (opts->git_dir)
+               git_dir = opts->git_dir;
+       else if (have_git_dir())
+               git_dir = get_git_dir();
+       else
+               goto done;
+
+       strbuf_realpath(&text, git_dir, 1);
+       strbuf_add(&pattern, cond, cond_len);
+       prefix = prepare_include_condition_pattern(&pattern);
+
+       if (prefix < 0)
+               goto done;
+
+       if (prefix > 0) {
+               /*
+                * perform literal matching on the prefix part so that
+                * any wildcard character in it can't create side effects.
+                */
+               if (text.len < prefix)
+                       goto done;
+               if (!icase && strncmp(pattern.buf, text.buf, prefix))
+                       goto done;
+               if (icase && strncasecmp(pattern.buf, text.buf, prefix))
+                       goto done;
+       }
+
+       ret = !wildmatch(pattern.buf + prefix, text.buf + prefix,
+                        icase ? WM_CASEFOLD : 0, NULL);
+
+done:
+       strbuf_release(&pattern);
+       strbuf_release(&text);
+       return ret;
+}
+
+static int include_condition_is_true(const struct config_options *opts,
+                                    const char *cond, size_t cond_len)
+{
+
+       if (skip_prefix_mem(cond, cond_len, "gitdir:", &cond, &cond_len))
+               return include_by_gitdir(opts, cond, cond_len, 0);
+       else if (skip_prefix_mem(cond, cond_len, "gitdir/i:", &cond, &cond_len))
+               return include_by_gitdir(opts, cond, cond_len, 1);
+
+       /* unknown conditionals are always false */
+       return 0;
+}
+
 int git_config_include(const char *var, const char *value, void *data)
 {
        struct config_include_data *inc = data;
+       const char *cond, *key;
+       int cond_len;
        int ret;
 
        /*
@@ -183,6 +281,12 @@ int git_config_include(const char *var, const char *value, void *data)
 
        if (!strcmp(var, "include.path"))
                ret = handle_path_include(value, inc);
+
+       if (!parse_config_key(var, "includeif", &cond, &cond_len, &key) &&
+           (cond && include_condition_is_true(inc->opts, cond, cond_len)) &&
+           !strcmp(key, "path"))
+               ret = handle_path_include(value, inc);
+
        return ret;
 }
 
@@ -199,11 +303,105 @@ void git_config_push_parameter(const char *text)
        strbuf_release(&env);
 }
 
+static inline int iskeychar(int c)
+{
+       return isalnum(c) || c == '-';
+}
+
+/*
+ * Auxiliary function to sanity-check and split the key into the section
+ * identifier and variable name.
+ *
+ * Returns 0 on success, -1 when there is an invalid character in the key and
+ * -2 if there is no section name in the key.
+ *
+ * store_key - pointer to char* which will hold a copy of the key with
+ *             lowercase section and variable name
+ * baselen - pointer to int which will hold the length of the
+ *           section + subsection part, can be NULL
+ */
+static int git_config_parse_key_1(const char *key, char **store_key, int *baselen_, int quiet)
+{
+       int i, dot, baselen;
+       const char *last_dot = strrchr(key, '.');
+
+       /*
+        * Since "key" actually contains the section name and the real
+        * key name separated by a dot, we have to know where the dot is.
+        */
+
+       if (last_dot == NULL || last_dot == key) {
+               if (!quiet)
+                       error("key does not contain a section: %s", key);
+               return -CONFIG_NO_SECTION_OR_NAME;
+       }
+
+       if (!last_dot[1]) {
+               if (!quiet)
+                       error("key does not contain variable name: %s", key);
+               return -CONFIG_NO_SECTION_OR_NAME;
+       }
+
+       baselen = last_dot - key;
+       if (baselen_)
+               *baselen_ = baselen;
+
+       /*
+        * Validate the key and while at it, lower case it for matching.
+        */
+       if (store_key)
+               *store_key = xmallocz(strlen(key));
+
+       dot = 0;
+       for (i = 0; key[i]; i++) {
+               unsigned char c = key[i];
+               if (c == '.')
+                       dot = 1;
+               /* Leave the extended basename untouched.. */
+               if (!dot || i > baselen) {
+                       if (!iskeychar(c) ||
+                           (i == baselen + 1 && !isalpha(c))) {
+                               if (!quiet)
+                                       error("invalid key: %s", key);
+                               goto out_free_ret_1;
+                       }
+                       c = tolower(c);
+               } else if (c == '\n') {
+                       if (!quiet)
+                               error("invalid key (newline): %s", key);
+                       goto out_free_ret_1;
+               }
+               if (store_key)
+                       (*store_key)[i] = c;
+       }
+
+       return 0;
+
+out_free_ret_1:
+       if (store_key) {
+               free(*store_key);
+               *store_key = NULL;
+       }
+       return -CONFIG_INVALID_KEY;
+}
+
+int git_config_parse_key(const char *key, char **store_key, int *baselen)
+{
+       return git_config_parse_key_1(key, store_key, baselen, 0);
+}
+
+int git_config_key_is_valid(const char *key)
+{
+       return !git_config_parse_key_1(key, NULL, NULL, 1);
+}
+
 int git_config_parse_parameter(const char *text,
                               config_fn_t fn, void *data)
 {
        const char *value;
+       char *canonical_name;
        struct strbuf **pair;
+       int ret;
 
        pair = strbuf_split_str(text, '=', 2);
        if (!pair[0])
@@ -221,13 +419,15 @@ int git_config_parse_parameter(const char *text,
                strbuf_list_free(pair);
                return error("bogus config parameter: %s", text);
        }
-       strbuf_tolower(pair[0]);
-       if (fn(pair[0]->buf, value, data) < 0) {
-               strbuf_list_free(pair);
-               return -1;
+
+       if (git_config_parse_key(pair[0]->buf, &canonical_name, NULL)) {
+               ret = -1;
+       } else {
+               ret = (fn(canonical_name, value, data) < 0) ? -1 : 0;
+               free(canonical_name);
        }
        strbuf_list_free(pair);
-       return 0;
+       return ret;
 }
 
 int git_config_from_parameters(config_fn_t fn, void *data)
@@ -354,11 +554,6 @@ static char *parse_value(void)
        }
 }
 
-static inline int iskeychar(int c)
-{
-       return isalnum(c) || c == '-';
-}
-
 static int get_value(config_fn_t fn, void *data, struct strbuf *name)
 {
        int c;
@@ -393,7 +588,8 @@ static int get_value(config_fn_t fn, void *data, struct strbuf *name)
         */
        cf->linenr--;
        ret = fn(name->buf, value, data);
-       cf->linenr++;
+       if (ret >= 0)
+               cf->linenr++;
        return ret;
 }
 
@@ -649,6 +845,15 @@ int git_parse_ulong(const char *value, unsigned long *ret)
        return 1;
 }
 
+static int git_parse_ssize_t(const char *value, ssize_t *ret)
+{
+       intmax_t tmp;
+       if (!git_parse_signed(value, &tmp, maximum_signed_value_of_type(ssize_t)))
+               return 0;
+       *ret = tmp;
+       return 1;
+}
+
 NORETURN
 static void die_bad_number(const char *name, const char *value)
 {
@@ -707,6 +912,14 @@ unsigned long git_config_ulong(const char *name, const char *value)
        return ret;
 }
 
+ssize_t git_config_ssize_t(const char *name, const char *value)
+{
+       ssize_t ret;
+       if (!git_parse_ssize_t(value, &ret))
+               die_bad_number(name, value);
+       return ret;
+}
+
 int git_parse_maybe_bool(const char *value)
 {
        if (!value)
@@ -763,7 +976,7 @@ int git_config_pathname(const char **dest, const char *var, const char *value)
 {
        if (!value)
                return config_error_nonbool(var);
-       *dest = expand_user_path(value);
+       *dest = expand_user_path(value, 0);
        if (!*dest)
                die(_("failed to expand user dir in: '%s'"), value);
        return 0;
@@ -824,7 +1037,12 @@ static int git_default_core_config(const char *var, const char *value)
        }
 
        if (!strcmp(var, "core.logallrefupdates")) {
-               log_all_ref_updates = git_config_bool(var, value);
+               if (value && !strcasecmp(value, "always"))
+                       log_all_ref_updates = LOG_REFS_ALWAYS;
+               else if (git_config_bool(var, value))
+                       log_all_ref_updates = LOG_REFS_NORMAL;
+               else
+                       log_all_ref_updates = LOG_REFS_NONE;
                return 0;
        }
 
@@ -834,13 +1052,22 @@ static int git_default_core_config(const char *var, const char *value)
        }
 
        if (!strcmp(var, "core.abbrev")) {
-               int abbrev = git_config_int(var, value);
-               if (abbrev < minimum_abbrev || abbrev > 40)
-                       return -1;
-               default_abbrev = abbrev;
+               if (!value)
+                       return config_error_nonbool(var);
+               if (!strcasecmp(value, "auto"))
+                       default_abbrev = -1;
+               else {
+                       int abbrev = git_config_int(var, value);
+                       if (abbrev < minimum_abbrev || abbrev > 40)
+                               return error("abbrev length out of range: %d", abbrev);
+                       default_abbrev = abbrev;
+               }
                return 0;
        }
 
+       if (!strcmp(var, "core.disambiguate"))
+               return set_disambiguate_hint_config(var, value);
+
        if (!strcmp(var, "core.loosecompression")) {
                int level = git_config_int(var, value);
                if (level == -1)
@@ -862,6 +1089,8 @@ static int git_default_core_config(const char *var, const char *value)
                core_compression_seen = 1;
                if (!zlib_compression_seen)
                        zlib_compression_level = level;
+               if (!pack_compression_seen)
+                       pack_compression_level = level;
                return 0;
        }
 
@@ -927,9 +1156,6 @@ static int git_default_core_config(const char *var, const char *value)
                return 0;
        }
 
-       if (!strcmp(var, "core.pager"))
-               return git_config_string(&pager_program, var, value);
-
        if (!strcmp(var, "core.editor"))
                return git_config_string(&editor_program, var, value);
 
@@ -1125,6 +1351,18 @@ int git_default_config(const char *var, const char *value, void *dummy)
                pack_size_limit_cfg = git_config_ulong(var, value);
                return 0;
        }
+
+       if (!strcmp(var, "pack.compression")) {
+               int level = git_config_int(var, value);
+               if (level == -1)
+                       level = Z_DEFAULT_COMPRESSION;
+               else if (level < 0 || level > Z_BEST_COMPRESSION)
+                       die(_("bad pack compression level %d"), level);
+               pack_compression_level = level;
+               pack_compression_seen = 1;
+               return 0;
+       }
+
        /* Add other config variables here and to Documentation/config.txt. */
        return 0;
 }
@@ -1214,10 +1452,10 @@ int git_config_from_mem(config_fn_t fn, const enum config_origin_type origin_typ
        return do_config_from(&top, fn, data);
 }
 
-static int git_config_from_blob_sha1(config_fn_t fn,
-                                    const char *name,
-                                    const unsigned char *sha1,
-                                    void *data)
+int git_config_from_blob_sha1(config_fn_t fn,
+                             const char *name,
+                             const unsigned char *sha1,
+                             void *data)
 {
        enum object_type type;
        char *buf;
@@ -1284,12 +1522,20 @@ int git_config_system(void)
        return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0);
 }
 
-static int do_git_config_sequence(config_fn_t fn, void *data)
+static int do_git_config_sequence(const struct config_options *opts,
+                                 config_fn_t fn, void *data)
 {
        int ret = 0;
        char *xdg_config = xdg_config_home("config");
-       char *user_config = expand_user_path("~/.gitconfig");
-       char *repo_config = git_pathdup("config");
+       char *user_config = expand_user_path("~/.gitconfig", 0);
+       char *repo_config;
+
+       if (opts->git_dir)
+               repo_config = mkpathdup("%s/config", opts->git_dir);
+       else if (have_git_dir())
+               repo_config = git_pathdup("config");
+       else
+               repo_config = NULL;
 
        current_parsing_scope = CONFIG_SCOPE_SYSTEM;
        if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0))
@@ -1320,13 +1566,14 @@ static int do_git_config_sequence(config_fn_t fn, void *data)
 
 int git_config_with_options(config_fn_t fn, void *data,
                            struct git_config_source *config_source,
-                           int respect_includes)
+                           const struct config_options *opts)
 {
        struct config_include_data inc = CONFIG_INCLUDE_INIT;
 
-       if (respect_includes) {
+       if (opts->respect_includes) {
                inc.fn = fn;
                inc.data = data;
+               inc.opts = opts;
                fn = git_config_include;
                data = &inc;
        }
@@ -1342,12 +1589,15 @@ int git_config_with_options(config_fn_t fn, void *data,
        else if (config_source && config_source->blob)
                return git_config_from_blob_ref(fn, config_source->blob, data);
 
-       return do_git_config_sequence(fn, data);
+       return do_git_config_sequence(opts, fn, data);
 }
 
 static void git_config_raw(config_fn_t fn, void *data)
 {
-       if (git_config_with_options(fn, data, NULL, 1) < 0)
+       struct config_options opts = {0};
+
+       opts.respect_includes = 1;
+       if (git_config_with_options(fn, data, NULL, &opts) < 0)
                /*
                 * git_config_with_options() normally returns only
                 * zero, as most errors are fatal, and
@@ -1385,6 +1635,31 @@ static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
        }
 }
 
+void read_early_config(config_fn_t cb, void *data)
+{
+       struct config_options opts = {0};
+       struct strbuf buf = STRBUF_INIT;
+
+       opts.respect_includes = 1;
+
+       if (have_git_dir())
+               opts.git_dir = get_git_dir();
+       /*
+        * When setup_git_directory() was not yet asked to discover the
+        * GIT_DIR, we ask discover_git_directory() to figure out whether there
+        * is any repository config we should use (but unlike
+        * setup_git_directory_gently(), no global state is changed, most
+        * notably, the current working directory is still the same after the
+        * call).
+        */
+       else if (discover_git_directory(&buf))
+               opts.git_dir = buf.buf;
+
+       git_config_with_options(cb, data, NULL, &opts);
+
+       strbuf_release(&buf);
+}
+
 static void git_config_check_init(void);
 
 void git_config(config_fn_t fn, void *data)
@@ -1685,6 +1960,19 @@ int git_config_get_pathname(const char *key, const char **dest)
        return ret;
 }
 
+int git_config_get_expiry(const char *key, const char **output)
+{
+       int ret = git_config_get_string_const(key, output);
+       if (ret)
+               return ret;
+       if (strcmp(*output, "now")) {
+               unsigned long now = approxidate("now");
+               if (approxidate(*output) >= now)
+                       git_die_config(key, _("Invalid %s: '%s'"), key, *output);
+       }
+       return ret;
+}
+
 int git_config_get_untracked_cache(void)
 {
        int val = -1;
@@ -1701,14 +1989,39 @@ int git_config_get_untracked_cache(void)
                if (!strcasecmp(v, "keep"))
                        return -1;
 
-               error("unknown core.untrackedCache value '%s'; "
-                     "using 'keep' default value", v);
+               error(_("unknown core.untrackedCache value '%s'; "
+                       "using 'keep' default value"), v);
                return -1;
        }
 
        return -1; /* default value */
 }
 
+int git_config_get_split_index(void)
+{
+       int val;
+
+       if (!git_config_get_maybe_bool("core.splitindex", &val))
+               return val;
+
+       return -1; /* default value */
+}
+
+int git_config_get_max_percent_split_change(void)
+{
+       int val = -1;
+
+       if (!git_config_get_int("splitindex.maxpercentchange", &val)) {
+               if (0 <= val && val <= 100)
+                       return val;
+
+               return error(_("splitIndex.maxPercentChange value '%d' "
+                              "should be between 0 and 100"), val);
+       }
+
+       return -1; /* default value */
+}
+
 NORETURN
 void git_die_config_linenr(const char *key, const char *filename, int linenr)
 {
@@ -1962,93 +2275,6 @@ void git_config_set(const char *key, const char *value)
        git_config_set_multivar(key, value, NULL, 0);
 }
 
-/*
- * Auxiliary function to sanity-check and split the key into the section
- * identifier and variable name.
- *
- * Returns 0 on success, -1 when there is an invalid character in the key and
- * -2 if there is no section name in the key.
- *
- * store_key - pointer to char* which will hold a copy of the key with
- *             lowercase section and variable name
- * baselen - pointer to int which will hold the length of the
- *           section + subsection part, can be NULL
- */
-static int git_config_parse_key_1(const char *key, char **store_key, int *baselen_, int quiet)
-{
-       int i, dot, baselen;
-       const char *last_dot = strrchr(key, '.');
-
-       /*
-        * Since "key" actually contains the section name and the real
-        * key name separated by a dot, we have to know where the dot is.
-        */
-
-       if (last_dot == NULL || last_dot == key) {
-               if (!quiet)
-                       error("key does not contain a section: %s", key);
-               return -CONFIG_NO_SECTION_OR_NAME;
-       }
-
-       if (!last_dot[1]) {
-               if (!quiet)
-                       error("key does not contain variable name: %s", key);
-               return -CONFIG_NO_SECTION_OR_NAME;
-       }
-
-       baselen = last_dot - key;
-       if (baselen_)
-               *baselen_ = baselen;
-
-       /*
-        * Validate the key and while at it, lower case it for matching.
-        */
-       if (store_key)
-               *store_key = xmallocz(strlen(key));
-
-       dot = 0;
-       for (i = 0; key[i]; i++) {
-               unsigned char c = key[i];
-               if (c == '.')
-                       dot = 1;
-               /* Leave the extended basename untouched.. */
-               if (!dot || i > baselen) {
-                       if (!iskeychar(c) ||
-                           (i == baselen + 1 && !isalpha(c))) {
-                               if (!quiet)
-                                       error("invalid key: %s", key);
-                               goto out_free_ret_1;
-                       }
-                       c = tolower(c);
-               } else if (c == '\n') {
-                       if (!quiet)
-                               error("invalid key (newline): %s", key);
-                       goto out_free_ret_1;
-               }
-               if (store_key)
-                       (*store_key)[i] = c;
-       }
-
-       return 0;
-
-out_free_ret_1:
-       if (store_key) {
-               free(*store_key);
-               *store_key = NULL;
-       }
-       return -CONFIG_INVALID_KEY;
-}
-
-int git_config_parse_key(const char *key, char **store_key, int *baselen)
-{
-       return git_config_parse_key_1(key, store_key, baselen, 0);
-}
-
-int git_config_key_is_valid(const char *key)
-{
-       return !git_config_parse_key_1(key, NULL, NULL, 1);
-}
-
 /*
  * If value==NULL, unset in (remove from) config,
  * if value_regex!=NULL, disregard key/value pairs where value does not match.
@@ -2194,7 +2420,12 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
                        goto out_free;
                }
 
-               fstat(in_fd, &st);
+               if (fstat(in_fd, &st) == -1) {
+                       error_errno(_("fstat on %s failed"), config_filename);
+                       ret = CONFIG_INVALID_FILE;
+                       goto out_free;
+               }
+
                contents_sz = xsize_t(st.st_size);
                contents = xmmap_gently(NULL, contents_sz, PROT_READ,
                                        MAP_PRIVATE, in_fd, 0);
@@ -2391,12 +2622,12 @@ int git_config_rename_section_in_file(const char *config_filename,
        struct lock_file *lock;
        int out_fd;
        char buf[1024];
-       FILE *config_file;
+       FILE *config_file = NULL;
        struct stat st;
 
        if (new_name && !section_name_is_ok(new_name)) {
                ret = error("invalid section name: %s", new_name);
-               goto out;
+               goto out_no_rollback;
        }
 
        if (!config_filename)
@@ -2411,10 +2642,13 @@ int git_config_rename_section_in_file(const char *config_filename,
 
        if (!(config_file = fopen(config_filename, "rb"))) {
                /* no config file means nothing to rename, no error */
-               goto unlock_and_out;
+               goto commit_and_out;
        }
 
-       fstat(fileno(config_file), &st);
+       if (fstat(fileno(config_file), &st) == -1) {
+               ret = error_errno(_("fstat on %s failed"), config_filename);
+               goto out;
+       }
 
        if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
                ret = error_errno("chmod on %s failed",
@@ -2470,11 +2704,16 @@ int git_config_rename_section_in_file(const char *config_filename,
                }
        }
        fclose(config_file);
-unlock_and_out:
+       config_file = NULL;
+commit_and_out:
        if (commit_lock_file(lock) < 0)
                ret = error_errno("could not write config file %s",
                                  config_filename);
 out:
+       if (config_file)
+               fclose(config_file);
+       rollback_lock_file(lock);
+out_no_rollback:
        free(filename_buf);
        return ret;
 }
@@ -2499,11 +2738,10 @@ int parse_config_key(const char *var,
                     const char **subsection, int *subsection_len,
                     const char **key)
 {
-       int section_len = strlen(section);
        const char *dot;
 
        /* Does it start with "section." ? */
-       if (!starts_with(var, section) || var[section_len] != '.')
+       if (!skip_prefix(var, section, &var) || *var != '.')
                return -1;
 
        /*
@@ -2515,12 +2753,16 @@ int parse_config_key(const char *var,
        *key = dot + 1;
 
        /* Did we have a subsection at all? */
-       if (dot == var + section_len) {
-               *subsection = NULL;
-               *subsection_len = 0;
+       if (dot == var) {
+               if (subsection) {
+                       *subsection = NULL;
+                       *subsection_len = 0;
+               }
        }
        else {
-               *subsection = var + section_len + 1;
+               if (!subsection)
+                       return -1;
+               *subsection = var + 1;
                *subsection_len = dot - *subsection;
        }
 
index b232908f8c8c2eae84bd6ef8ab2a96ac45bf94a3..192629f1431072f242f10a8528f1853b8bbaddeb 100644 (file)
@@ -17,9 +17,6 @@ endif
 # because maintaining the nesting to match is a pain.  If
 # we had "elif" things would have been much nicer...
 
-ifeq ($(uname_M),x86_64)
-       XDL_FAST_HASH = YesPlease
-endif
 ifeq ($(uname_S),OSF1)
        # Need this for u_short definitions et al
        BASIC_CFLAGS += -D_OSF_SOURCE
@@ -30,7 +27,6 @@ endif
 ifeq ($(uname_S),Linux)
        HAVE_ALLOCA_H = YesPlease
        NO_STRLCPY = YesPlease
-       NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
        LIBC_CONTAINS_LIBINTL = YesPlease
        HAVE_DEV_TTY = YesPlease
@@ -44,7 +40,6 @@ endif
 ifeq ($(uname_S),GNU/kFreeBSD)
        HAVE_ALLOCA_H = YesPlease
        NO_STRLCPY = YesPlease
-       NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
        DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
        LIBC_CONTAINS_LIBINTL = YesPlease
@@ -58,7 +53,6 @@ ifeq ($(uname_S),UnixWare)
        SHELL_PATH = /usr/local/bin/bash
        NO_IPV6 = YesPlease
        NO_HSTRERROR = YesPlease
-       NO_MKSTEMPS = YesPlease
        BASIC_CFLAGS += -Kthread
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
@@ -82,7 +76,6 @@ ifeq ($(uname_S),SCO_SV)
        SHELL_PATH = /usr/bin/bash
        NO_IPV6 = YesPlease
        NO_HSTRERROR = YesPlease
-       NO_MKSTEMPS = YesPlease
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
        NO_STRCASESTR = YesPlease
@@ -125,7 +118,6 @@ ifeq ($(uname_S),SunOS)
        NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
        NO_MKDTEMP = YesPlease
-       NO_MKSTEMPS = YesPlease
        NO_REGEX = YesPlease
        NO_MSGFMT_EXTENDED_OPTIONS = YesPlease
        HAVE_DEV_TTY = YesPlease
@@ -171,7 +163,6 @@ ifeq ($(uname_O),Cygwin)
                NO_D_TYPE_IN_DIRENT = YesPlease
                NO_STRCASESTR = YesPlease
                NO_MEMMEM = YesPlease
-               NO_MKSTEMPS = YesPlease
                NO_SYMLINK_HEAD = YesPlease
                NO_IPV6 = YesPlease
                OLD_ICONV = UnfortunatelyYes
@@ -236,7 +227,6 @@ ifeq ($(uname_S),NetBSD)
        BASIC_CFLAGS += -I/usr/pkg/include
        BASIC_LDFLAGS += -L/usr/pkg/lib $(CC_LD_DYNPATH)/usr/pkg/lib
        USE_ST_TIMESPEC = YesPlease
-       NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
        HAVE_BSD_SYSCTL = YesPlease
 endif
@@ -245,9 +235,9 @@ ifeq ($(uname_S),AIX)
        NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
        NO_MKDTEMP = YesPlease
-       NO_MKSTEMPS = YesPlease
        NO_STRLCPY = YesPlease
        NO_NSEC = YesPlease
+       NO_REGEX = NeedsStartEnd
        FREAD_READS_DIRECTORIES = UnfortunatelyYes
        INTERNAL_QSORT = UnfortunatelyYes
        NEEDS_LIBICONV = YesPlease
@@ -266,7 +256,6 @@ ifeq ($(uname_S),GNU)
        # GNU/Hurd
        HAVE_ALLOCA_H = YesPlease
        NO_STRLCPY = YesPlease
-       NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
        LIBC_CONTAINS_LIBINTL = YesPlease
 endif
@@ -275,7 +264,6 @@ ifeq ($(uname_S),IRIX)
        NO_UNSETENV = YesPlease
        NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
-       NO_MKSTEMPS = YesPlease
        NO_MKDTEMP = YesPlease
        # When compiled with the MIPSpro 7.4.4m compiler, and without pthreads
        # (i.e. NO_PTHREADS is set), and _with_ MMAP (i.e. NO_MMAP is not set),
@@ -294,7 +282,6 @@ ifeq ($(uname_S),IRIX64)
        NO_UNSETENV = YesPlease
        NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
-       NO_MKSTEMPS = YesPlease
        NO_MKDTEMP = YesPlease
        # When compiled with the MIPSpro 7.4.4m compiler, and without pthreads
        # (i.e. NO_PTHREADS is set), and _with_ MMAP (i.e. NO_MMAP is not set),
@@ -314,7 +301,6 @@ ifeq ($(uname_S),HP-UX)
        NO_SETENV = YesPlease
        NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
-       NO_MKSTEMPS = YesPlease
        NO_STRLCPY = YesPlease
        NO_MKDTEMP = YesPlease
        NO_UNSETENV = YesPlease
@@ -355,7 +341,6 @@ ifeq ($(uname_S),Windows)
        NO_ICONV = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_MKDTEMP = YesPlease
-       NO_MKSTEMPS = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
        NO_SVN_TESTS = YesPlease
        RUNTIME_PREFIX = YesPlease
@@ -405,7 +390,6 @@ ifeq ($(uname_S),Interix)
        NO_MKDTEMP = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_NSEC = YesPlease
-       NO_MKSTEMPS = YesPlease
        ifeq ($(uname_R),3.5)
                NO_INET_NTOP = YesPlease
                NO_INET_PTON = YesPlease
@@ -464,7 +448,6 @@ ifeq ($(uname_S),NONSTOP_KERNEL)
        NO_SETENV = YesPlease
        NO_UNSETENV = YesPlease
        NO_MKDTEMP = YesPlease
-       NO_MKSTEMPS = YesPlease
        # Currently libiconv-1.9.1.
        OLD_ICONV = UnfortunatelyYes
        NO_REGEX = YesPlease
@@ -506,7 +489,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))
        NEEDS_LIBICONV = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_MKDTEMP = YesPlease
-       NO_MKSTEMPS = YesPlease
        NO_SVN_TESTS = YesPlease
        NO_PERL_MAKEMAKER = YesPlease
        RUNTIME_PREFIX = YesPlease
@@ -518,7 +500,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))
        OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
        NO_REGEX = YesPlease
        NO_PYTHON = YesPlease
-       BLK_SHA1 = YesPlease
        ETAGS_TARGET = ETAGS
        NO_INET_PTON = YesPlease
        NO_INET_NTOP = YesPlease
@@ -587,7 +568,6 @@ ifeq ($(uname_S),QNX)
        NO_ICONV = YesPlease
        NO_MEMMEM = YesPlease
        NO_MKDTEMP = YesPlease
-       NO_MKSTEMPS = YesPlease
        NO_NSEC = YesPlease
        NO_PTHREADS = YesPlease
        NO_R_TO_GCC_LINKER = YesPlease
index 0b15f04b1089e48f20353cf068d7d37587b8d966..128165529fd70ac889ed0fb5098e4290893b593d 100644 (file)
@@ -1050,12 +1050,6 @@ GIT_CHECK_FUNC(mkdtemp,
 [NO_MKDTEMP=YesPlease])
 GIT_CONF_SUBST([NO_MKDTEMP])
 #
-# Define NO_MKSTEMPS if you don't have mkstemps in the C library.
-GIT_CHECK_FUNC(mkstemps,
-[NO_MKSTEMPS=],
-[NO_MKSTEMPS=YesPlease])
-GIT_CONF_SUBST([NO_MKSTEMPS])
-#
 # Define NO_INITGROUPS if you don't have initgroups in the C library.
 GIT_CHECK_FUNC(initgroups,
 [NO_INITGROUPS=],
index 722dc3fc546056be199f5d6a59c556833be58286..c72b1d1151744c5e7c7b82f453892a1bc9b26021 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -43,14 +43,14 @@ int check_ref_type(const struct ref *ref, int flags)
        return check_ref(ref->name, flags);
 }
 
-static void die_initial_contact(int got_at_least_one_head)
+static void die_initial_contact(int unexpected)
 {
-       if (got_at_least_one_head)
-               die("The remote end hung up upon initial contact");
+       if (unexpected)
+               die(_("The remote end hung up upon initial contact"));
        else
-               die("Could not read from remote repository.\n\n"
-                   "Please make sure you have the correct access rights\n"
-                   "and the repository exists.");
+               die(_("Could not read from remote repository.\n\n"
+                     "Please make sure you have the correct access rights\n"
+                     "and the repository exists."));
 }
 
 static void parse_one_symref_info(struct string_list *symref, const char *val, int len)
@@ -71,7 +71,7 @@ static void parse_one_symref_info(struct string_list *symref, const char *val, i
            check_refname_format(target, REFNAME_ALLOW_ONELEVEL))
                /* "symref=bogus:pair */
                goto reject;
-       item = string_list_append(symref, sym);
+       item = string_list_append_nodup(symref, sym);
        item->util = target;
        return;
 reject:
@@ -111,14 +111,22 @@ static void annotate_refs_with_symref_info(struct ref *ref)
  */
 struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
                              struct ref **list, unsigned int flags,
-                             struct sha1_array *extra_have,
-                             struct sha1_array *shallow_points)
+                             struct oid_array *extra_have,
+                             struct oid_array *shallow_points)
 {
        struct ref **orig_list = list;
-       int got_at_least_one_head = 0;
+
+       /*
+        * A hang-up after seeing some response from the other end
+        * means that it is unexpected, as we know the other end is
+        * willing to talk to us.  A hang-up before seeing any
+        * response does not necessarily mean an ACL problem, though.
+        */
+       int saw_response;
+       int got_dummy_ref_with_capabilities_declaration = 0;
 
        *list = NULL;
-       for (;;) {
+       for (saw_response = 0; ; saw_response = 1) {
                struct ref *ref;
                struct object_id old_oid;
                char *name;
@@ -131,7 +139,7 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
                                  PACKET_READ_GENTLE_ON_EOF |
                                  PACKET_READ_CHOMP_NEWLINE);
                if (len < 0)
-                       die_initial_contact(got_at_least_one_head);
+                       die_initial_contact(saw_response);
 
                if (!len)
                        break;
@@ -145,7 +153,7 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
                                die("protocol error: expected shallow sha-1, got '%s'", arg);
                        if (!shallow_points)
                                die("repository on the other end cannot be shallow");
-                       sha1_array_append(shallow_points, old_oid.hash);
+                       oid_array_append(shallow_points, &old_oid);
                        continue;
                }
 
@@ -161,17 +169,29 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
                }
 
                if (extra_have && !strcmp(name, ".have")) {
-                       sha1_array_append(extra_have, old_oid.hash);
+                       oid_array_append(extra_have, &old_oid);
+                       continue;
+               }
+
+               if (!strcmp(name, "capabilities^{}")) {
+                       if (saw_response)
+                               die("protocol error: unexpected capabilities^{}");
+                       if (got_dummy_ref_with_capabilities_declaration)
+                               die("protocol error: multiple capabilities^{}");
+                       got_dummy_ref_with_capabilities_declaration = 1;
                        continue;
                }
 
                if (!check_ref(name, flags))
                        continue;
+
+               if (got_dummy_ref_with_capabilities_declaration)
+                       die("protocol error: unexpected ref after capabilities^{}");
+
                ref = alloc_ref(buffer + GIT_SHA1_HEXSZ + 1);
                oidcpy(&ref->old_oid, &old_oid);
                *list = ref;
                list = &ref->next;
-               got_at_least_one_head = 1;
        }
 
        annotate_refs_with_symref_info(*orig_list);
@@ -671,6 +691,70 @@ static const char *get_ssh_command(void)
        return NULL;
 }
 
+static int override_ssh_variant(int *port_option, int *needs_batch)
+{
+       char *variant;
+
+       variant = xstrdup_or_null(getenv("GIT_SSH_VARIANT"));
+       if (!variant &&
+           git_config_get_string("ssh.variant", &variant))
+               return 0;
+
+       if (!strcmp(variant, "plink") || !strcmp(variant, "putty")) {
+               *port_option = 'P';
+               *needs_batch = 0;
+       } else if (!strcmp(variant, "tortoiseplink")) {
+               *port_option = 'P';
+               *needs_batch = 1;
+       } else {
+               *port_option = 'p';
+               *needs_batch = 0;
+       }
+       free(variant);
+       return 1;
+}
+
+static void handle_ssh_variant(const char *ssh_command, int is_cmdline,
+                              int *port_option, int *needs_batch)
+{
+       const char *variant;
+       char *p = NULL;
+
+       if (override_ssh_variant(port_option, needs_batch))
+               return;
+
+       if (!is_cmdline) {
+               p = xstrdup(ssh_command);
+               variant = basename(p);
+       } else {
+               const char **ssh_argv;
+
+               p = xstrdup(ssh_command);
+               if (split_cmdline(p, &ssh_argv) > 0) {
+                       variant = basename((char *)ssh_argv[0]);
+                       /*
+                        * At this point, variant points into the buffer
+                        * referenced by p, hence we do not need ssh_argv
+                        * any longer.
+                        */
+                       free(ssh_argv);
+               } else {
+                       free(p);
+                       return;
+               }
+       }
+
+       if (!strcasecmp(variant, "plink") ||
+           !strcasecmp(variant, "plink.exe"))
+               *port_option = 'P';
+       else if (!strcasecmp(variant, "tortoiseplink") ||
+                !strcasecmp(variant, "tortoiseplink.exe")) {
+               *port_option = 'P';
+               *needs_batch = 1;
+       }
+       free(p);
+}
+
 /*
  * This returns a dummy child_process if the transport protocol does not
  * need fork(2), or a struct child_process object if it does.  Once done,
@@ -730,7 +814,7 @@ struct child_process *git_connect(int fd[2], const char *url,
                 * Note: Do not add any other headers here!  Doing so
                 * will cause older git-daemon servers to crash.
                 */
-               packet_write(fd[1],
+               packet_write_fmt(fd[1],
                             "%s %s%chost=%s%c",
                             prog, path, 0,
                             target_host, 0);
@@ -749,7 +833,8 @@ struct child_process *git_connect(int fd[2], const char *url,
                conn->in = conn->out = -1;
                if (protocol == PROTO_SSH) {
                        const char *ssh;
-                       int putty = 0, tortoiseplink = 0;
+                       int needs_batch = 0;
+                       int port_option = 'p';
                        char *ssh_host = hostandport;
                        const char *port = NULL;
                        transport_check_allowed("ssh");
@@ -772,10 +857,10 @@ struct child_process *git_connect(int fd[2], const char *url,
                        }
 
                        ssh = get_ssh_command();
-                       if (!ssh) {
-                               const char *base;
-                               char *ssh_dup;
-
+                       if (ssh)
+                               handle_ssh_variant(ssh, 1, &port_option,
+                                                  &needs_batch);
+                       else {
                                /*
                                 * GIT_SSH is the no-shell version of
                                 * GIT_SSH_COMMAND (and must remain so for
@@ -786,17 +871,10 @@ struct child_process *git_connect(int fd[2], const char *url,
                                ssh = getenv("GIT_SSH");
                                if (!ssh)
                                        ssh = "ssh";
-
-                               ssh_dup = xstrdup(ssh);
-                               base = basename(ssh_dup);
-
-                               tortoiseplink = !strcasecmp(base, "tortoiseplink") ||
-                                       !strcasecmp(base, "tortoiseplink.exe");
-                               putty = tortoiseplink ||
-                                       !strcasecmp(base, "plink") ||
-                                       !strcasecmp(base, "plink.exe");
-
-                               free(ssh_dup);
+                               else
+                                       handle_ssh_variant(ssh, 0,
+                                                          &port_option,
+                                                          &needs_batch);
                        }
 
                        argv_array_push(&conn->args, ssh);
@@ -804,11 +882,11 @@ struct child_process *git_connect(int fd[2], const char *url,
                                argv_array_push(&conn->args, "-4");
                        else if (flags & CONNECT_IPV6)
                                argv_array_push(&conn->args, "-6");
-                       if (tortoiseplink)
+                       if (needs_batch)
                                argv_array_push(&conn->args, "-batch");
                        if (port) {
-                               /* P is for PuTTY, p is for OpenSSH */
-                               argv_array_push(&conn->args, putty ? "-P" : "-p");
+                               argv_array_pushf(&conn->args,
+                                                "-%c", port_option);
                                argv_array_push(&conn->args, port);
                        }
                        argv_array_push(&conn->args, ssh_host);
index 8e3e4b1dc1271f0530d10469dc5ef4eeb46526ea..136c2ac16839b8d4de9b653337dc4794c2a4ea34 100644 (file)
@@ -63,6 +63,7 @@ int check_connected(sha1_iterate_fn fn, void *cb_data,
                                 _("Checking connectivity"));
 
        rev_list.git_cmd = 1;
+       rev_list.env = opt->env;
        rev_list.in = -1;
        rev_list.no_stdout = 1;
        if (opt->err_fd)
index afa48cc0524764a65053f5bb1392142de3251609..4ca325f79dc5ee45823834f71f66a6d3b278c3e5 100644 (file)
@@ -33,6 +33,11 @@ struct check_connected_options {
 
        /* If non-zero, show progress as we traverse the objects. */
        int progress;
+
+       /*
+        * Insert these variables into the environment of the child process.
+        */
+       const char **env;
 };
 
 #define CHECK_CONNECTED_INIT { 0 }
index 2d7f25d99f0754e82e2d0615ebd42b02d8fe5a66..4ba98b7eaff268c6fc9f2f984449fd4d9e1bfd4b 100644 (file)
@@ -24,3 +24,19 @@ expression n;
 @@
 - memcpy(dst, src, n * sizeof(T));
 + COPY_ARRAY(dst, src, n);
+
+@@
+type T;
+T *ptr;
+expression n;
+@@
+- ptr = xmalloc(n * sizeof(*ptr));
++ ALLOC_ARRAY(ptr, n);
+
+@@
+type T;
+T *ptr;
+expression n;
+@@
+- ptr = xmalloc(n * sizeof(T));
++ ALLOC_ARRAY(ptr, n);
index e28213161a4680b266fc76a1052d728b96cbd666..c03ba737e5fafe63218c7023ce8bbd66c47f7dc5 100644 (file)
@@ -3,3 +3,9 @@ expression E;
 @@
 - if (E)
   free(E);
+
+@@
+expression E;
+@@
+- if (!E)
+  free(E);
diff --git a/contrib/coccinelle/qsort.cocci b/contrib/coccinelle/qsort.cocci
new file mode 100644 (file)
index 0000000..22b93a9
--- /dev/null
@@ -0,0 +1,37 @@
+@@
+expression base, nmemb, compar;
+@@
+- qsort(base, nmemb, sizeof(*base), compar);
++ QSORT(base, nmemb, compar);
+
+@@
+expression base, nmemb, compar;
+@@
+- qsort(base, nmemb, sizeof(base[0]), compar);
++ QSORT(base, nmemb, compar);
+
+@@
+type T;
+T *base;
+expression nmemb, compar;
+@@
+- qsort(base, nmemb, sizeof(T), compar);
++ QSORT(base, nmemb, compar);
+
+@@
+expression base, nmemb, compar;
+@@
+- if (nmemb)
+    QSORT(base, nmemb, compar);
+
+@@
+expression base, nmemb, compar;
+@@
+- if (nmemb > 0)
+    QSORT(base, nmemb, compar);
+
+@@
+expression base, nmemb, compar;
+@@
+- if (nmemb > 1)
+    QSORT(base, nmemb, compar);
index 63995f22ff29f717a360f300e626ddea91d59fa2..1d580e49b0ca3304ad7b3be62664df47ea84757d 100644 (file)
@@ -38,3 +38,9 @@ expression E1, E2, E3;
 @@
 - strbuf_addstr(E1, find_unique_abbrev(E2, E3));
 + strbuf_add_unique_abbrev(E1, E2, E3);
+
+@@
+expression E1, E2;
+@@
+- strbuf_addstr(E1, real_path(E2));
++ strbuf_add_real_path(E1, E2);
diff --git a/contrib/coccinelle/swap.cocci b/contrib/coccinelle/swap.cocci
new file mode 100644 (file)
index 0000000..a0934d1
--- /dev/null
@@ -0,0 +1,28 @@
+@ swap_with_declaration @
+type T;
+identifier tmp;
+T a, b;
+@@
+- T tmp = a;
++ T tmp;
++ tmp = a;
+  a = b;
+  b = tmp;
+
+@ swap @
+type T;
+T tmp, a, b;
+@@
+- tmp = a;
+- a = b;
+- b = tmp;
++ SWAP(a, b);
+
+@ extends swap @
+identifier unused;
+@@
+  {
+  ...
+- T unused;
+  ... when != unused
+  }
index 3fceef132bf57623e04a080d03da9aff951f1c11..8e05d1ca4b61b9792a6f7cc4e7d322efeab02e01 100644 (file)
@@ -5,3 +5,9 @@ expression V;
 - if (E)
 -    V = xstrdup(E);
 + V = xstrdup_or_null(E);
+
+@@
+expression E;
+@@
+- xstrdup(absolute_path(E))
++ absolute_pathdup(E)
diff --git a/contrib/completion/.gitattributes b/contrib/completion/.gitattributes
new file mode 100644 (file)
index 0000000..1911694
--- /dev/null
@@ -0,0 +1 @@
+*.bash eol=lf
index 21016bf8dfe87572fb53a05488ba05bb3c08ed97..ba7d8dddc975a6fe2adec333fb63c954ebddd97e 100644 (file)
 # completion style.  For example '!f() { : git commit ; ... }; f' will
 # tell the completion to use commit completion.  This also works with aliases
 # of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
+#
+# You can set the following environment variables to influence the behavior of
+# the completion routines:
+#
+#   GIT_COMPLETION_CHECKOUT_NO_GUESS
+#
+#     When set to "1", do not include "DWIM" suggestions in git-checkout
+#     completion (e.g., completing "foo" when "origin/foo" exists).
 
 case "$COMP_WORDBREAKS" in
 *:*) : great ;;
 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
 esac
 
+# Discovers the path to the git repository taking any '--git-dir=<path>' and
+# '-C <path>' options into account and stores it in the $__git_repo_path
+# variable.
+__git_find_repo_path ()
+{
+       if [ -n "$__git_repo_path" ]; then
+               # we already know where it is
+               return
+       fi
+
+       if [ -n "${__git_C_args-}" ]; then
+               __git_repo_path="$(git "${__git_C_args[@]}" \
+                       ${__git_dir:+--git-dir="$__git_dir"} \
+                       rev-parse --absolute-git-dir 2>/dev/null)"
+       elif [ -n "${__git_dir-}" ]; then
+               test -d "$__git_dir" &&
+               __git_repo_path="$__git_dir"
+       elif [ -n "${GIT_DIR-}" ]; then
+               test -d "${GIT_DIR-}" &&
+               __git_repo_path="$GIT_DIR"
+       elif [ -d .git ]; then
+               __git_repo_path=.git
+       else
+               __git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
+       fi
+}
+
+# Deprecated: use __git_find_repo_path() and $__git_repo_path instead
 # __gitdir accepts 0 or 1 arguments (i.e., location)
 # returns location of .git repo
 __gitdir ()
 {
        if [ -z "${1-}" ]; then
-               if [ -n "${__git_dir-}" ]; then
-                       echo "$__git_dir"
-               elif [ -n "${GIT_DIR-}" ]; then
-                       test -d "${GIT_DIR-}" || return 1
-                       echo "$GIT_DIR"
-               elif [ -d .git ]; then
-                       echo .git
-               else
-                       git rev-parse --git-dir 2>/dev/null
-               fi
+               __git_find_repo_path || return 1
+               echo "$__git_repo_path"
        elif [ -d "$1/.git" ]; then
                echo "$1/.git"
        else
@@ -56,6 +84,14 @@ __gitdir ()
        fi
 }
 
+# Runs git with all the options given as argument, respecting any
+# '--git-dir=<path>' and '-C <path>' options present on the command line
+__git ()
+{
+       git ${__git_C_args:+"${__git_C_args[@]}"} \
+               ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
+}
+
 # The following function is based on code from:
 #
 #   bash_completion - programmable completion functions for bash 3.2+
@@ -185,6 +221,20 @@ _get_comp_words_by_ref ()
 }
 fi
 
+# Fills the COMPREPLY array with prefiltered words without any additional
+# processing.
+# Callers must take care of providing only words that match the current word
+# to be completed and adding any prefix and/or suffix (trailing space!), if
+# necessary.
+# 1: List of newline-separated matching completion words, complete with
+#    prefix and suffix.
+__gitcomp_direct ()
+{
+       local IFS=$'\n'
+
+       COMPREPLY=($1)
+}
+
 __gitcompappend ()
 {
        local x i=${#COMPREPLY[@]}
@@ -283,11 +333,11 @@ __gitcomp_file ()
 __git_ls_files_helper ()
 {
        if [ "$2" == "--committable" ]; then
-               git -C "$1" diff-index --name-only --relative HEAD
+               __git -C "$1" diff-index --name-only --relative HEAD
        else
                # NOTE: $2 is not quoted in order to support multiple options
-               git -C "$1" ls-files --exclude-standard $2
-       fi 2>/dev/null
+               __git -C "$1" ls-files --exclude-standard $2
+       fi
 }
 
 
@@ -299,100 +349,195 @@ __git_ls_files_helper ()
 #    slash.
 __git_index_files ()
 {
-       local dir="$(__gitdir)" root="${2-.}" file
+       local root="${2-.}" file
 
-       if [ -d "$dir" ]; then
-               __git_ls_files_helper "$root" "$1" |
-               while read -r file; do
-                       case "$file" in
-                       ?*/*) echo "${file%%/*}" ;;
-                       *) echo "$file" ;;
-                       esac
-               done | sort | uniq
-       fi
+       __git_ls_files_helper "$root" "$1" |
+       while read -r file; do
+               case "$file" in
+               ?*/*) echo "${file%%/*}" ;;
+               *) echo "$file" ;;
+               esac
+       done | sort | uniq
 }
 
+# Lists branches from the local repository.
+# 1: A prefix to be added to each listed branch (optional).
+# 2: List only branches matching this word (optional; list all branches if
+#    unset or empty).
+# 3: A suffix to be appended to each listed branch (optional).
 __git_heads ()
 {
-       local dir="$(__gitdir)"
-       if [ -d "$dir" ]; then
-               git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
-                       refs/heads
-               return
-       fi
+       local pfx="${1-}" cur_="${2-}" sfx="${3-}"
+
+       __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
+                       "refs/heads/$cur_*" "refs/heads/$cur_*/**"
 }
 
+# Lists tags from the local repository.
+# Accepts the same positional parameters as __git_heads() above.
 __git_tags ()
 {
-       local dir="$(__gitdir)"
-       if [ -d "$dir" ]; then
-               git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
-                       refs/tags
-               return
-       fi
+       local pfx="${1-}" cur_="${2-}" sfx="${3-}"
+
+       __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
+                       "refs/tags/$cur_*" "refs/tags/$cur_*/**"
 }
 
-# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
-# presence of 2nd argument means use the guess heuristic employed
-# by checkout for tracking branches
+# Lists refs from the local (by default) or from a remote repository.
+# It accepts 0, 1 or 2 arguments:
+# 1: The remote to list refs from (optional; ignored, if set but empty).
+#    Can be the name of a configured remote, a path, or a URL.
+# 2: In addition to local refs, list unique branches from refs/remotes/ for
+#    'git checkout's tracking DWIMery (optional; ignored, if set but empty).
+# 3: A prefix to be added to each listed ref (optional).
+# 4: List only refs matching this word (optional; list all refs if unset or
+#    empty).
+# 5: A suffix to be appended to each listed ref (optional; ignored, if set
+#    but empty).
+#
+# Use __git_complete_refs() instead.
 __git_refs ()
 {
-       local i hash dir="$(__gitdir "${1-}")" track="${2-}"
-       local format refs pfx
-       if [ -d "$dir" ]; then
-               case "$cur" in
+       local i hash dir track="${2-}"
+       local list_refs_from=path remote="${1-}"
+       local format refs
+       local pfx="${3-}" cur_="${4-$cur}" sfx="${5-}"
+       local match="${4-}"
+       local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
+
+       __git_find_repo_path
+       dir="$__git_repo_path"
+
+       if [ -z "$remote" ]; then
+               if [ -z "$dir" ]; then
+                       return
+               fi
+       else
+               if __git_is_configured_remote "$remote"; then
+                       # configured remote takes precedence over a
+                       # local directory with the same name
+                       list_refs_from=remote
+               elif [ -d "$remote/.git" ]; then
+                       dir="$remote/.git"
+               elif [ -d "$remote" ]; then
+                       dir="$remote"
+               else
+                       list_refs_from=url
+               fi
+       fi
+
+       if [ "$list_refs_from" = path ]; then
+               if [[ "$cur_" == ^* ]]; then
+                       pfx="$pfx^"
+                       fer_pfx="$fer_pfx^"
+                       cur_=${cur_#^}
+                       match=${match#^}
+               fi
+               case "$cur_" in
                refs|refs/*)
                        format="refname"
-                       refs="${cur%/*}"
+                       refs=("$match*" "$match*/**")
                        track=""
                        ;;
                *)
-                       [[ "$cur" == ^* ]] && pfx="^"
                        for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
-                               if [ -e "$dir/$i" ]; then echo $pfx$i; fi
+                               case "$i" in
+                               $match*)
+                                       if [ -e "$dir/$i" ]; then
+                                               echo "$pfx$i$sfx"
+                                       fi
+                                       ;;
+                               esac
                        done
-                       format="refname:short"
-                       refs="refs/tags refs/heads refs/remotes"
+                       format="refname:strip=2"
+                       refs=("refs/tags/$match*" "refs/tags/$match*/**"
+                               "refs/heads/$match*" "refs/heads/$match*/**"
+                               "refs/remotes/$match*" "refs/remotes/$match*/**")
                        ;;
                esac
-               git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \
-                       $refs
+               __git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
+                       "${refs[@]}"
                if [ -n "$track" ]; then
                        # employ the heuristic used by git checkout
                        # Try to find a remote branch that matches the completion word
                        # but only output if the branch name is unique
-                       local ref entry
-                       git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
-                               "refs/remotes/" | \
-                       while read -r entry; do
-                               eval "$entry"
-                               ref="${ref#*/}"
-                               if [[ "$ref" == "$cur"* ]]; then
-                                       echo "$ref"
-                               fi
-                       done | sort | uniq -u
+                       __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
+                               --sort="refname:strip=3" \
+                               "refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
+                       uniq -u
                fi
                return
        fi
-       case "$cur" in
+       case "$cur_" in
        refs|refs/*)
-               git ls-remote "$dir" "$cur*" 2>/dev/null | \
+               __git ls-remote "$remote" "$match*" | \
                while read -r hash i; do
                        case "$i" in
                        *^{}) ;;
-                       *) echo "$i" ;;
+                       *) echo "$pfx$i$sfx" ;;
                        esac
                done
                ;;
        *)
-               echo "HEAD"
-               git for-each-ref --format="%(refname:short)" -- \
-                       "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
+               if [ "$list_refs_from" = remote ]; then
+                       case "HEAD" in
+                       $match*)        echo "${pfx}HEAD$sfx" ;;
+                       esac
+                       __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
+                               "refs/remotes/$remote/$match*" \
+                               "refs/remotes/$remote/$match*/**"
+               else
+                       local query_symref
+                       case "HEAD" in
+                       $match*)        query_symref="HEAD" ;;
+                       esac
+                       __git ls-remote "$remote" $query_symref \
+                               "refs/tags/$match*" "refs/heads/$match*" \
+                               "refs/remotes/$match*" |
+                       while read -r hash i; do
+                               case "$i" in
+                               *^{})   ;;
+                               refs/*) echo "$pfx${i#refs/*/}$sfx" ;;
+                               *)      echo "$pfx$i$sfx" ;;  # symbolic refs
+                               esac
+                       done
+               fi
                ;;
        esac
 }
 
+# Completes refs, short and long, local and remote, symbolic and pseudo.
+#
+# Usage: __git_complete_refs [<option>]...
+# --remote=<remote>: The remote to list refs from, can be the name of a
+#                    configured remote, a path, or a URL.
+# --track: List unique remote branches for 'git checkout's tracking DWIMery.
+# --pfx=<prefix>: A prefix to be added to each ref.
+# --cur=<word>: The current ref to be completed.  Defaults to the current
+#               word to be completed.
+# --sfx=<suffix>: A suffix to be appended to each ref instead of the default
+#                 space.
+__git_complete_refs ()
+{
+       local remote track pfx cur_="$cur" sfx=" "
+
+       while test $# != 0; do
+               case "$1" in
+               --remote=*)     remote="${1##--remote=}" ;;
+               --track)        track="yes" ;;
+               --pfx=*)        pfx="${1##--pfx=}" ;;
+               --cur=*)        cur_="${1##--cur=}" ;;
+               --sfx=*)        sfx="${1##--sfx=}" ;;
+               *)              return 1 ;;
+               esac
+               shift
+       done
+
+       __gitcomp_direct "$(__git_refs "$remote" "$track" "$pfx" "$cur_" "$sfx")"
+}
+
 # __git_refs2 requires 1 argument (to pass to __git_refs)
+# Deprecated: use __git_complete_fetch_refspecs() instead.
 __git_refs2 ()
 {
        local i
@@ -401,11 +546,29 @@ __git_refs2 ()
        done
 }
 
+# Completes refspecs for fetching from a remote repository.
+# 1: The remote repository.
+# 2: A prefix to be added to each listed refspec (optional).
+# 3: The ref to be completed as a refspec instead of the current word to be
+#    completed (optional)
+# 4: A suffix to be appended to each listed refspec instead of the default
+#    space (optional).
+__git_complete_fetch_refspecs ()
+{
+       local i remote="$1" pfx="${2-}" cur_="${3-$cur}" sfx="${4- }"
+
+       __gitcomp_direct "$(
+               for i in $(__git_refs "$remote" "" "" "$cur_") ; do
+                       echo "$pfx$i:$i$sfx"
+               done
+               )"
+}
+
 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
 __git_refs_remotes ()
 {
        local i hash
-       git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
+       __git ls-remote "$1" 'refs/heads/*' | \
        while read -r hash i; do
                echo "$i:refs/remotes/$1/${i#refs/heads/}"
        done
@@ -413,9 +576,21 @@ __git_refs_remotes ()
 
 __git_remotes ()
 {
-       local d="$(__gitdir)"
-       test -d "$d/remotes" && ls -1 "$d/remotes"
-       git --git-dir="$d" remote
+       __git_find_repo_path
+       test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
+       __git remote
+}
+
+# Returns true if $1 matches the name of a configured remote, false otherwise.
+__git_is_configured_remote ()
+{
+       local remote
+       for remote in $(__git_remotes); do
+               if [ "$remote" = "$1" ]; then
+                       return 0
+               fi
+       done
+       return 1
 }
 
 __git_list_merge_strategies ()
@@ -469,7 +644,7 @@ __git_complete_revlist_file ()
                *)   pfx="$ref:$pfx" ;;
                esac
 
-               __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
+               __gitcomp_nl "$(__git ls-tree "$ls" \
                                | sed '/^100... blob /{
                                           s,^.*        ,,
                                           s,$, ,
@@ -488,15 +663,15 @@ __git_complete_revlist_file ()
        *...*)
                pfx="${cur_%...*}..."
                cur_="${cur_#*...}"
-               __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+               __git_complete_refs --pfx="$pfx" --cur="$cur_"
                ;;
        *..*)
                pfx="${cur_%..*}.."
                cur_="${cur_#*..}"
-               __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+               __git_complete_refs --pfx="$pfx" --cur="$cur_"
                ;;
        *)
-               __gitcomp_nl "$(__git_refs)"
+               __git_complete_refs
                ;;
        esac
 }
@@ -542,6 +717,7 @@ __git_complete_remote_or_refspec ()
                i="${words[c]}"
                case "$i" in
                --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
+               -d|--delete) [ "$cmd" = "push" ] && lhs=0 ;;
                --all)
                        case "$cmd" in
                        push) no_complete_refspec=1 ;;
@@ -581,23 +757,23 @@ __git_complete_remote_or_refspec ()
        case "$cmd" in
        fetch)
                if [ $lhs = 1 ]; then
-                       __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
+                       __git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
                else
-                       __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+                       __git_complete_refs --pfx="$pfx" --cur="$cur_"
                fi
                ;;
        pull|remote)
                if [ $lhs = 1 ]; then
-                       __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
+                       __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
                else
-                       __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+                       __git_complete_refs --pfx="$pfx" --cur="$cur_"
                fi
                ;;
        push)
                if [ $lhs = 1 ]; then
-                       __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+                       __git_complete_refs --pfx="$pfx" --cur="$cur_"
                else
-                       __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
+                       __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
                fi
                ;;
        esac
@@ -747,7 +923,7 @@ __git_compute_porcelain_commands ()
 __git_get_config_variables ()
 {
        local section="$1" i IFS=$'\n'
-       for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
+       for i in $(__git config --name-only --get-regexp "^$section\..*"); do
                echo "${i#$section.}"
        done
 }
@@ -765,8 +941,7 @@ __git_aliases ()
 # __git_aliased_command requires 1 argument
 __git_aliased_command ()
 {
-       local word cmdline=$(git --git-dir="$(__gitdir)" \
-               config --get "alias.$1")
+       local word cmdline=$(__git config --get "alias.$1")
        for word in $cmdline; do
                case "$word" in
                \!gitk|gitk)
@@ -842,7 +1017,7 @@ __git_get_option_value ()
        done
 
        if [ -n "$config_key" ] && [ -z "$result" ]; then
-               result="$(git --git-dir="$(__gitdir)" config "$config_key")"
+               result="$(__git config "$config_key")"
        fi
 
        echo "$result"
@@ -901,8 +1076,8 @@ __git_whitespacelist="nowarn warn error error-all fix"
 
 _git_am ()
 {
-       local dir="$(__gitdir)"
-       if [ -d "$dir"/rebase-apply ]; then
+       __git_find_repo_path
+       if [ -d "$__git_repo_path"/rebase-apply ]; then
                __gitcomp "--skip --continue --resolved --abort"
                return
        fi
@@ -936,6 +1111,7 @@ _git_apply ()
                        --apply --no-add --exclude=
                        --ignore-whitespace --ignore-space-change
                        --whitespace= --inaccurate-eof --verbose
+                       --recount --directory=
                        "
                return
        esac
@@ -947,13 +1123,17 @@ _git_add ()
        --*)
                __gitcomp "
                        --interactive --refresh --patch --update --dry-run
-                       --ignore-errors --intent-to-add
+                       --ignore-errors --intent-to-add --force --edit --chmod=
                        "
                return
        esac
 
-       # XXX should we check for --update and --all options ?
-       __git_complete_index_file "--others --modified --directory --no-empty-directory"
+       local complete_opt="--others --modified --directory --no-empty-directory"
+       if test -n "$(__git_find_on_cmdline "-u --update")"
+       then
+               complete_opt="--modified"
+       fi
+       __git_complete_index_file "$complete_opt"
 }
 
 _git_archive ()
@@ -970,7 +1150,7 @@ _git_archive ()
        --*)
                __gitcomp "
                        --format= --list --verbose
-                       --prefix= --remote= --exec=
+                       --prefix= --remote= --exec= --output
                        "
                return
                ;;
@@ -985,7 +1165,8 @@ _git_bisect ()
        local subcommands="start bad good skip reset visualize replay log run"
        local subcommand="$(__git_find_on_cmdline "$subcommands")"
        if [ -z "$subcommand" ]; then
-               if [ -f "$(__gitdir)"/BISECT_START ]; then
+               __git_find_repo_path
+               if [ -f "$__git_repo_path"/BISECT_START ]; then
                        __gitcomp "$subcommands"
                else
                        __gitcomp "replay start"
@@ -995,7 +1176,7 @@ _git_bisect ()
 
        case "$subcommand" in
        bad|good|reset|skip|start)
-               __gitcomp_nl "$(__git_refs)"
+               __git_complete_refs
                ;;
        *)
                ;;
@@ -1017,21 +1198,22 @@ _git_branch ()
 
        case "$cur" in
        --set-upstream-to=*)
-               __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
+               __git_complete_refs --cur="${cur##--set-upstream-to=}"
                ;;
        --*)
                __gitcomp "
                        --color --no-color --verbose --abbrev= --no-abbrev
-                       --track --no-track --contains --merged --no-merged
+                       --track --no-track --contains --no-contains --merged --no-merged
                        --set-upstream-to= --edit-description --list
                        --unset-upstream --delete --move --remotes
+                       --column --no-column --sort= --points-at
                        "
                ;;
        *)
                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
-                       __gitcomp_nl "$(__git_heads)"
+                       __gitcomp_direct "$(__git_heads "" "$cur" " ")"
                else
-                       __gitcomp_nl "$(__git_refs)"
+                       __git_complete_refs
                fi
                ;;
        esac
@@ -1074,24 +1256,25 @@ _git_checkout ()
        *)
                # check if --track, --no-track, or --no-guess was specified
                # if so, disable DWIM mode
-               local flags="--track --no-track --no-guess" track=1
-               if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
-                       track=''
+               local flags="--track --no-track --no-guess" track_opt="--track"
+               if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
+                  [ -n "$(__git_find_on_cmdline "$flags")" ]; then
+                       track_opt=''
                fi
-               __gitcomp_nl "$(__git_refs '' $track)"
+               __git_complete_refs $track_opt
                ;;
        esac
 }
 
 _git_cherry ()
 {
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 _git_cherry_pick ()
 {
-       local dir="$(__gitdir)"
-       if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
+       __git_find_repo_path
+       if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
                __gitcomp "--continue --quit --abort"
                return
        fi
@@ -1100,7 +1283,7 @@ _git_cherry_pick ()
                __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
                ;;
        *)
-               __gitcomp_nl "$(__git_refs)"
+               __git_complete_refs
                ;;
        esac
 }
@@ -1138,6 +1321,8 @@ _git_clone ()
                        --single-branch
                        --branch
                        --recurse-submodules
+                       --no-single-branch
+                       --shallow-submodules
                        "
                return
                ;;
@@ -1150,7 +1335,7 @@ _git_commit ()
 {
        case "$prev" in
        -c|-C)
-               __gitcomp_nl "$(__git_refs)" "" "${cur}"
+               __git_complete_refs
                return
                ;;
        esac
@@ -1163,7 +1348,7 @@ _git_commit ()
                ;;
        --reuse-message=*|--reedit-message=*|\
        --fixup=*|--squash=*)
-               __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
+               __git_complete_refs --cur="${cur#*=}"
                return
                ;;
        --untracked-files=*)
@@ -1179,11 +1364,12 @@ _git_commit ()
                        --reset-author --file= --message= --template=
                        --cleanup= --untracked-files --untracked-files=
                        --verbose --quiet --fixup= --squash=
+                       --patch --short --date --allow-empty
                        "
                return
        esac
 
-       if git rev-parse --verify --quiet HEAD >/dev/null; then
+       if __git rev-parse --verify --quiet HEAD >/dev/null; then
                __git_complete_index_file "--committable"
        else
                # This is the first commit
@@ -1197,16 +1383,17 @@ _git_describe ()
        --*)
                __gitcomp "
                        --all --tags --contains --abbrev= --candidates=
-                       --exact-match --debug --long --match --always
+                       --exact-match --debug --long --match --always --first-parent
+                       --exclude
                        "
                return
        esac
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 __git_diff_algorithms="myers minimal patience histogram"
 
-__git_diff_submodule_formats="log short"
+__git_diff_submodule_formats="diff log short"
 
 __git_diff_common_options="--stat --numstat --shortstat --summary
                        --patch-with-stat --name-only --name-status --color
@@ -1280,6 +1467,7 @@ __git_fetch_recurse_submodules="yes on-demand no"
 __git_fetch_options="
        --quiet --verbose --append --upload-pack --force --keep --depth=
        --tags --no-tags --all --prune --dry-run --recurse-submodules=
+       --unshallow --update-shallow
 "
 
 _git_fetch ()
@@ -1329,7 +1517,7 @@ _git_fsck ()
        --*)
                __gitcomp "
                        --tags --root --unreachable --cache --no-reflogs --full
-                       --strict --verbose --lost-found
+                       --strict --verbose --lost-found --name-objects
                        "
                return
                ;;
@@ -1351,8 +1539,43 @@ _git_gitk ()
        _gitk
 }
 
-__git_match_ctag() {
-       awk "/^${1//\//\\/}/ { print \$1 }" "$2"
+# Lists matching symbol names from a tag (as in ctags) file.
+# 1: List symbol names matching this word.
+# 2: The tag file to list symbol names from.
+# 3: A prefix to be added to each listed symbol name (optional).
+# 4: A suffix to be appended to each listed symbol name (optional).
+__git_match_ctag () {
+       awk -v pfx="${3-}" -v sfx="${4-}" "
+               /^${1//\//\\/}/ { print pfx \$1 sfx }
+               " "$2"
+}
+
+# Complete symbol names from a tag file.
+# Usage: __git_complete_symbol [<option>]...
+# --tags=<file>: The tag file to list symbol names from instead of the
+#                default "tags".
+# --pfx=<prefix>: A prefix to be added to each symbol name.
+# --cur=<word>: The current symbol name to be completed.  Defaults to
+#               the current word to be completed.
+# --sfx=<suffix>: A suffix to be appended to each symbol name instead
+#                 of the default space.
+__git_complete_symbol () {
+       local tags=tags pfx="" cur_="${cur-}" sfx=" "
+
+       while test $# != 0; do
+               case "$1" in
+               --tags=*)       tags="${1##--tags=}" ;;
+               --pfx=*)        pfx="${1##--pfx=}" ;;
+               --cur=*)        cur_="${1##--cur=}" ;;
+               --sfx=*)        sfx="${1##--sfx=}" ;;
+               *)              return 1 ;;
+               esac
+               shift
+       done
+
+       if test -r "$tags"; then
+               __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
+       fi
 }
 
 _git_grep ()
@@ -1373,6 +1596,8 @@ _git_grep ()
                        --max-depth
                        --count
                        --and --or --not --all-match
+                       --break --heading --show-function --function-context
+                       --untracked --no-index
                        "
                return
                ;;
@@ -1380,14 +1605,11 @@ _git_grep ()
 
        case "$cword,$prev" in
        2,*|*,-*)
-               if test -r tags; then
-                       __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
-                       return
-               fi
+               __git_complete_symbol && return
                ;;
        esac
 
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 _git_help ()
@@ -1445,6 +1667,12 @@ _git_ls_files ()
 
 _git_ls_remote ()
 {
+       case "$cur" in
+       --*)
+               __gitcomp "--heads --tags --refs --get-url --symref"
+               return
+               ;;
+       esac
        __gitcomp_nl "$(__git_remotes)"
 }
 
@@ -1482,12 +1710,25 @@ __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
 _git_log ()
 {
        __git_has_doubledash && return
+       __git_find_repo_path
 
-       local g="$(git rev-parse --git-dir 2>/dev/null)"
        local merge=""
-       if [ -f "$g/MERGE_HEAD" ]; then
+       if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
                merge="--merge"
        fi
+       case "$prev,$cur" in
+       -L,:*:*)
+               return  # fall back to Bash filename completion
+               ;;
+       -L,:*)
+               __git_complete_symbol --cur="${cur#:}" --sfx=":"
+               return
+               ;;
+       -G,*|-S,*)
+               __git_complete_symbol
+               return
+               ;;
+       esac
        case "$cur" in
        --pretty=*|--format=*)
                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
@@ -1533,6 +1774,21 @@ _git_log ()
                        "
                return
                ;;
+       -L:*:*)
+               return  # fall back to Bash filename completion
+               ;;
+       -L:*)
+               __git_complete_symbol --cur="${cur#-L:}" --sfx=":"
+               return
+               ;;
+       -G*)
+               __git_complete_symbol --pfx="-G" --cur="${cur#-G}"
+               return
+               ;;
+       -S*)
+               __git_complete_symbol --pfx="-S" --cur="${cur#-S}"
+               return
+               ;;
        esac
        __git_complete_revlist
 }
@@ -1552,10 +1808,10 @@ _git_merge ()
        case "$cur" in
        --*)
                __gitcomp "$__git_merge_options
-                       --rerere-autoupdate --no-rerere-autoupdate --abort"
+                       --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
                return
        esac
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 _git_mergetool ()
@@ -1566,7 +1822,7 @@ _git_mergetool ()
                return
                ;;
        --*)
-               __gitcomp "--tool="
+               __gitcomp "--tool= --prompt --no-prompt"
                return
                ;;
        esac
@@ -1580,7 +1836,7 @@ _git_merge_base ()
                return
                ;;
        esac
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 _git_mv ()
@@ -1618,7 +1874,7 @@ _git_notes ()
        ,*)
                case "$prev" in
                --ref)
-                       __gitcomp_nl "$(__git_refs)"
+                       __git_complete_refs
                        ;;
                *)
                        __gitcomp "$subcommands --ref"
@@ -1627,7 +1883,7 @@ _git_notes ()
                ;;
        add,--reuse-message=*|append,--reuse-message=*|\
        add,--reedit-message=*|append,--reedit-message=*)
-               __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
+               __git_complete_refs --cur="${cur#*=}"
                ;;
        add,--*|append,--*)
                __gitcomp '--file= --message= --reedit-message=
@@ -1646,7 +1902,7 @@ _git_notes ()
                -m|-F)
                        ;;
                *)
-                       __gitcomp_nl "$(__git_refs)"
+                       __git_complete_refs
                        ;;
                esac
                ;;
@@ -1674,7 +1930,7 @@ _git_pull ()
        __git_complete_remote_or_refspec
 }
 
-__git_push_recurse_submodules="check on-demand"
+__git_push_recurse_submodules="check on-demand only"
 
 __git_complete_force_with_lease ()
 {
@@ -1684,10 +1940,10 @@ __git_complete_force_with_lease ()
        --*=)
                ;;
        *:*)
-               __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
+               __git_complete_refs --cur="${cur_#*:}"
                ;;
        *)
-               __gitcomp_nl "$(__git_refs)" "" "$cur_"
+               __git_complete_refs --cur="$cur_"
                ;;
        esac
 }
@@ -1732,12 +1988,13 @@ _git_push ()
 
 _git_rebase ()
 {
-       local dir="$(__gitdir)"
-       if [ -f "$dir"/rebase-merge/interactive ]; then
-               __gitcomp "--continue --skip --abort --edit-todo"
+       __git_find_repo_path
+       if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
+               __gitcomp "--continue --skip --abort --quit --edit-todo"
                return
-       elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
-               __gitcomp "--continue --skip --abort"
+       elif [ -d "$__git_repo_path"/rebase-apply ] || \
+            [ -d "$__git_repo_path"/rebase-merge ]; then
+               __gitcomp "--continue --skip --abort --quit"
                return
        fi
        __git_complete_strategy && return
@@ -1762,7 +2019,7 @@ _git_rebase ()
 
                return
        esac
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 _git_reflog ()
@@ -1773,7 +2030,7 @@ _git_reflog ()
        if [ -z "$subcommand" ]; then
                __gitcomp "$subcommands"
        else
-               __gitcomp_nl "$(__git_refs)"
+               __git_complete_refs
        fi
 }
 
@@ -1784,9 +2041,7 @@ _git_send_email ()
 {
        case "$prev" in
        --to|--cc|--bcc|--from)
-               __gitcomp "
-               $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
-               "
+               __gitcomp "$(__git send-email --dump-aliases)"
                return
                ;;
        esac
@@ -1816,9 +2071,7 @@ _git_send_email ()
                return
                ;;
        --to=*|--cc=*|--bcc=*|--from=*)
-               __gitcomp "
-               $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
-               " "" "${cur#--*=}"
+               __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
                return
                ;;
        --*)
@@ -1912,7 +2165,7 @@ __git_config_get_set_variables ()
                c=$((--c))
        done
 
-       git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
+       __git config $config_file --name-only --list
 }
 
 _git_config ()
@@ -1923,7 +2176,7 @@ _git_config ()
                return
                ;;
        branch.*.merge)
-               __gitcomp_nl "$(__git_refs)"
+               __git_complete_refs
                return
                ;;
        branch.*.rebase)
@@ -1947,9 +2200,8 @@ _git_config ()
        remote.*.push)
                local remote="${prev#remote.}"
                remote="${remote%.push}"
-               __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
-                       for-each-ref --format='%(refname):%(refname)' \
-                       refs/heads)"
+               __gitcomp_nl "$(__git for-each-ref \
+                       --format='%(refname):%(refname)' refs/heads)"
                return
                ;;
        pull.twohead|pull.octopus)
@@ -2028,7 +2280,7 @@ _git_config ()
                ;;
        branch.*)
                local pfx="${cur%.*}." cur_="${cur#*.}"
-               __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
+               __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
                return
                ;;
@@ -2140,8 +2392,11 @@ _git_config ()
                color.status.untracked
                color.status.updated
                color.ui
+               commit.cleanup
+               commit.gpgSign
                commit.status
                commit.template
+               commit.verbose
                core.abbrev
                core.askpass
                core.attributesfile
@@ -2374,31 +2629,79 @@ _git_config ()
 
 _git_remote ()
 {
-       local subcommands="add rename remove set-head set-branches set-url show prune update"
+       local subcommands="
+               add rename remove set-head set-branches
+               get-url set-url show prune update
+               "
        local subcommand="$(__git_find_on_cmdline "$subcommands")"
        if [ -z "$subcommand" ]; then
-               __gitcomp "$subcommands"
+               case "$cur" in
+               --*)
+                       __gitcomp "--verbose"
+                       ;;
+               *)
+                       __gitcomp "$subcommands"
+                       ;;
+               esac
                return
        fi
 
-       case "$subcommand" in
-       rename|remove|set-url|show|prune)
-               __gitcomp_nl "$(__git_remotes)"
+       case "$subcommand,$cur" in
+       add,--*)
+               __gitcomp "--track --master --fetch --tags --no-tags --mirror="
+               ;;
+       add,*)
+               ;;
+       set-head,--*)
+               __gitcomp "--auto --delete"
                ;;
-       set-head|set-branches)
+       set-branches,--*)
+               __gitcomp "--add"
+               ;;
+       set-head,*|set-branches,*)
                __git_complete_remote_or_refspec
                ;;
-       update)
+       update,--*)
+               __gitcomp "--prune"
+               ;;
+       update,*)
                __gitcomp "$(__git_get_config_variables "remotes")"
                ;;
+       set-url,--*)
+               __gitcomp "--push --add --delete"
+               ;;
+       get-url,--*)
+               __gitcomp "--push --all"
+               ;;
+       prune,--*)
+               __gitcomp "--dry-run"
+               ;;
        *)
+               __gitcomp_nl "$(__git_remotes)"
                ;;
        esac
 }
 
 _git_replace ()
 {
-       __gitcomp_nl "$(__git_refs)"
+       case "$cur" in
+       --*)
+               __gitcomp "--edit --graft --format= --list --delete"
+               return
+               ;;
+       esac
+       __git_complete_refs
+}
+
+_git_rerere ()
+{
+       local subcommands="clear forget diff remaining status gc"
+       local subcommand="$(__git_find_on_cmdline "$subcommands")"
+       if test -z "$subcommand"
+       then
+               __gitcomp "$subcommands"
+               return
+       fi
 }
 
 _git_reset ()
@@ -2407,27 +2710,30 @@ _git_reset ()
 
        case "$cur" in
        --*)
-               __gitcomp "--merge --mixed --hard --soft --patch"
+               __gitcomp "--merge --mixed --hard --soft --patch --keep"
                return
                ;;
        esac
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 _git_revert ()
 {
-       local dir="$(__gitdir)"
-       if [ -f "$dir"/REVERT_HEAD ]; then
+       __git_find_repo_path
+       if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
                __gitcomp "--continue --quit --abort"
                return
        fi
        case "$cur" in
        --*)
-               __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
+               __gitcomp "
+                       --edit --mainline --no-edit --no-commit --signoff
+                       --strategy= --strategy-option=
+                       "
                return
                ;;
        esac
-       __gitcomp_nl "$(__git_refs)"
+       __git_complete_refs
 }
 
 _git_rm ()
@@ -2451,7 +2757,7 @@ _git_shortlog ()
                __gitcomp "
                        $__git_log_common_options
                        $__git_log_shortlog_options
-                       --numbered --summary
+                       --numbered --summary --email
                        "
                return
                ;;
@@ -2507,7 +2813,7 @@ _git_show_branch ()
 _git_stash ()
 {
        local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
-       local subcommands='save list show apply clear drop pop create branch'
+       local subcommands='push save list show apply clear drop pop create branch'
        local subcommand="$(__git_find_on_cmdline "$subcommands")"
        if [ -z "$subcommand" ]; then
                case "$cur" in
@@ -2522,6 +2828,9 @@ _git_stash ()
                esac
        else
                case "$subcommand,$cur" in
+               push,--*)
+                       __gitcomp "$save_opts --message"
+                       ;;
                save,--*)
                        __gitcomp "$save_opts"
                        ;;
@@ -2535,14 +2844,14 @@ _git_stash ()
                        ;;
                branch,*)
                        if [ $cword -eq 3 ]; then
-                               __gitcomp_nl "$(__git_refs)";
+                               __git_complete_refs
                        else
-                               __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+                               __gitcomp_nl "$(__git stash list \
                                                | sed -n -e 's/:.*//p')"
                        fi
                        ;;
                show,*|apply,*|drop,*|pop,*)
-                       __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+                       __gitcomp_nl "$(__git stash list \
                                        | sed -n -e 's/:.*//p')"
                        ;;
                *)
@@ -2556,10 +2865,11 @@ _git_submodule ()
        __git_has_doubledash && return
 
        local subcommands="add status init deinit update summary foreach sync"
-       if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
+       local subcommand="$(__git_find_on_cmdline "$subcommands")"
+       if [ -z "$subcommand" ]; then
                case "$cur" in
                --*)
-                       __gitcomp "--quiet --cached"
+                       __gitcomp "--quiet"
                        ;;
                *)
                        __gitcomp "$subcommands"
@@ -2567,6 +2877,33 @@ _git_submodule ()
                esac
                return
        fi
+
+       case "$subcommand,$cur" in
+       add,--*)
+               __gitcomp "--branch --force --name --reference --depth"
+               ;;
+       status,--*)
+               __gitcomp "--cached --recursive"
+               ;;
+       deinit,--*)
+               __gitcomp "--force --all"
+               ;;
+       update,--*)
+               __gitcomp "
+                       --init --remote --no-fetch
+                       --recommend-shallow --no-recommend-shallow
+                       --force --rebase --merge --reference --depth --recursive --jobs
+               "
+               ;;
+       summary,--*)
+               __gitcomp "--cached --files --summary-limit"
+               ;;
+       foreach,--*|sync,--*)
+               __gitcomp "--recursive"
+               ;;
+       *)
+               ;;
+       esac
 }
 
 _git_svn ()
@@ -2587,14 +2924,14 @@ _git_svn ()
                        --no-metadata --use-svm-props --use-svnsync-props
                        --log-window-size= --no-checkout --quiet
                        --repack-flags --use-log-author --localtime
+                       --add-author-from
                        --ignore-paths= --include-paths= $remote_opts
                        "
                local init_opts="
                        --template= --shared= --trunk= --tags=
                        --branches= --stdlayout --minimize-url
                        --no-metadata --use-svm-props --use-svnsync-props
-                       --rewrite-root= --prefix= --use-log-author
-                       --add-author-from $remote_opts
+                       --rewrite-root= --prefix= $remote_opts
                        "
                local cmt_opts="
                        --edit --rmdir --find-copies-harder --copy-similarity=
@@ -2674,7 +3011,7 @@ _git_tag ()
                i="${words[c]}"
                case "$i" in
                -d|-v)
-                       __gitcomp_nl "$(__git_tags)"
+                       __gitcomp_direct "$(__git_tags "" "$cur" " ")"
                        return
                        ;;
                -f)
@@ -2689,11 +3026,11 @@ _git_tag ()
                ;;
        -*|tag)
                if [ $f = 1 ]; then
-                       __gitcomp_nl "$(__git_tags)"
+                       __gitcomp_direct "$(__git_tags "" "$cur" " ")"
                fi
                ;;
        *)
-               __gitcomp_nl "$(__git_refs)"
+               __git_complete_refs
                ;;
        esac
 
@@ -2701,8 +3038,8 @@ _git_tag ()
        --*)
                __gitcomp "
                        --list --delete --verify --annotate --message --file
-                       --sign --cleanup --local-user --force --column --sort
-                       --contains --points-at
+                       --sign --cleanup --local-user --force --column --sort=
+                       --contains --no-contains --points-at --merged --no-merged --create-reflog
                        "
                ;;
        esac
@@ -2741,7 +3078,8 @@ _git_worktree ()
 
 __git_main ()
 {
-       local i c=1 command __git_dir
+       local i c=1 command __git_dir __git_repo_path
+       local __git_C_args C_args_count=0
 
        while [ $c -lt $cword ]; do
                i="${words[c]}"
@@ -2751,6 +3089,10 @@ __git_main ()
                --bare)      __git_dir="." ;;
                --help) command="help"; break ;;
                -c|--work-tree|--namespace) ((c++)) ;;
+               -C)     __git_C_args[C_args_count++]=-C
+                       ((c++))
+                       __git_C_args[C_args_count++]="${words[c]}"
+                       ;;
                -*) ;;
                *) command="$i"; break ;;
                esac
@@ -2758,6 +3100,17 @@ __git_main ()
        done
 
        if [ -z "$command" ]; then
+               case "$prev" in
+               --git-dir|-C|--work-tree)
+                       # these need a path argument, let's fall back to
+                       # Bash filename completion
+                       return
+                       ;;
+               -c|--namespace)
+                       # we don't support completing these options' arguments
+                       return
+                       ;;
+               esac
                case "$cur" in
                --*)   __gitcomp "
                        --paginate
@@ -2783,13 +3136,13 @@ __git_main ()
        fi
 
        local completion_func="_git_${command//-/_}"
-       declare -f $completion_func >/dev/null && $completion_func && return
+       declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
 
        local expansion=$(__git_aliased_command "$command")
        if [ -n "$expansion" ]; then
                words[1]=$expansion
                completion_func="_git_${expansion//-/_}"
-               declare -f $completion_func >/dev/null && $completion_func
+               declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
        fi
 }
 
@@ -2797,9 +3150,11 @@ __gitk_main ()
 {
        __git_has_doubledash && return
 
-       local g="$(__gitdir)"
+       local __git_repo_path
+       __git_find_repo_path
+
        local merge=""
-       if [ -f "$g/MERGE_HEAD" ]; then
+       if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
                merge="--merge"
        fi
        case "$cur" in
@@ -2846,6 +3201,15 @@ if [[ -n ${ZSH_VERSION-} ]]; then
                esac
        }
 
+       __gitcomp_direct ()
+       {
+               emulate -L zsh
+
+               local IFS=$'\n'
+               compset -P '*[=:]'
+               compadd -Q -- ${=1} && _ret=0
+       }
+
        __gitcomp_nl ()
        {
                emulate -L zsh
index e25541308a1c269285a26b205d2d9990a789060a..c3521fbfc44fd8db18244bc10d346ee39b1c3c90 100644 (file)
@@ -67,6 +67,15 @@ __gitcomp ()
        esac
 }
 
+__gitcomp_direct ()
+{
+       emulate -L zsh
+
+       local IFS=$'\n'
+       compset -P '*[=:]'
+       compadd -Q -- ${=1} && _ret=0
+}
+
 __gitcomp_nl ()
 {
        emulate -L zsh
index 97eacd7832b28377c5e14918ce6bededc55d7d40..c6cbef38c2a580555dfcdc67e04f6ac507f9066c 100644 (file)
@@ -82,6 +82,7 @@
 #     contains      relative to newer annotated tag (v1.6.3.2~35)
 #     branch        relative to newer tag or branch (master~4)
 #     describe      relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
+#     tag           relative to any older tag (v1.6.3.1-13-gdd42c2f)
 #     default       exactly matching tag
 #
 # If you would like a colored hint about the current dirty state, set
@@ -443,6 +444,8 @@ __git_ps1 ()
                                        git describe --contains HEAD ;;
                                (branch)
                                        git describe --contains --all HEAD ;;
+                               (tag)
+                                       git describe --tags HEAD ;;
                                (describe)
                                        git describe HEAD ;;
                                (* | default)
diff --git a/contrib/convert-objects/convert-objects.c b/contrib/convert-objects/convert-objects.c
deleted file mode 100644 (file)
index f3b57bf..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-#include "cache.h"
-#include "blob.h"
-#include "commit.h"
-#include "tree.h"
-
-struct entry {
-       unsigned char old_sha1[20];
-       unsigned char new_sha1[20];
-       int converted;
-};
-
-#define MAXOBJECTS (1000000)
-
-static struct entry *convert[MAXOBJECTS];
-static int nr_convert;
-
-static struct entry * convert_entry(unsigned char *sha1);
-
-static struct entry *insert_new(unsigned char *sha1, int pos)
-{
-       struct entry *new = xcalloc(1, sizeof(struct entry));
-       hashcpy(new->old_sha1, sha1);
-       memmove(convert + pos + 1, convert + pos, (nr_convert - pos) * sizeof(struct entry *));
-       convert[pos] = new;
-       nr_convert++;
-       if (nr_convert == MAXOBJECTS)
-               die("you're kidding me - hit maximum object limit");
-       return new;
-}
-
-static struct entry *lookup_entry(unsigned char *sha1)
-{
-       int low = 0, high = nr_convert;
-
-       while (low < high) {
-               int next = (low + high) / 2;
-               struct entry *n = convert[next];
-               int cmp = hashcmp(sha1, n->old_sha1);
-               if (!cmp)
-                       return n;
-               if (cmp < 0) {
-                       high = next;
-                       continue;
-               }
-               low = next+1;
-       }
-       return insert_new(sha1, low);
-}
-
-static void convert_binary_sha1(void *buffer)
-{
-       struct entry *entry = convert_entry(buffer);
-       hashcpy(buffer, entry->new_sha1);
-}
-
-static void convert_ascii_sha1(void *buffer)
-{
-       unsigned char sha1[20];
-       struct entry *entry;
-
-       if (get_sha1_hex(buffer, sha1))
-               die("expected sha1, got '%s'", (char *) buffer);
-       entry = convert_entry(sha1);
-       memcpy(buffer, sha1_to_hex(entry->new_sha1), 40);
-}
-
-static unsigned int convert_mode(unsigned int mode)
-{
-       unsigned int newmode;
-
-       newmode = mode & S_IFMT;
-       if (S_ISREG(mode))
-               newmode |= (mode & 0100) ? 0755 : 0644;
-       return newmode;
-}
-
-static int write_subdirectory(void *buffer, unsigned long size, const char *base, int baselen, unsigned char *result_sha1)
-{
-       char *new = xmalloc(size);
-       unsigned long newlen = 0;
-       unsigned long used;
-
-       used = 0;
-       while (size) {
-               int len = 21 + strlen(buffer);
-               char *path = strchr(buffer, ' ');
-               unsigned char *sha1;
-               unsigned int mode;
-               char *slash, *origpath;
-
-               if (!path || strtoul_ui(buffer, 8, &mode))
-                       die("bad tree conversion");
-               mode = convert_mode(mode);
-               path++;
-               if (memcmp(path, base, baselen))
-                       break;
-               origpath = path;
-               path += baselen;
-               slash = strchr(path, '/');
-               if (!slash) {
-                       newlen += sprintf(new + newlen, "%o %s", mode, path);
-                       new[newlen++] = '\0';
-                       hashcpy((unsigned char *)new + newlen, (unsigned char *) buffer + len - 20);
-                       newlen += 20;
-
-                       used += len;
-                       size -= len;
-                       buffer = (char *) buffer + len;
-                       continue;
-               }
-
-               newlen += sprintf(new + newlen, "%o %.*s", S_IFDIR, (int)(slash - path), path);
-               new[newlen++] = 0;
-               sha1 = (unsigned char *)(new + newlen);
-               newlen += 20;
-
-               len = write_subdirectory(buffer, size, origpath, slash-origpath+1, sha1);
-
-               used += len;
-               size -= len;
-               buffer = (char *) buffer + len;
-       }
-
-       write_sha1_file(new, newlen, tree_type, result_sha1);
-       free(new);
-       return used;
-}
-
-static void convert_tree(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-       void *orig_buffer = buffer;
-       unsigned long orig_size = size;
-
-       while (size) {
-               size_t len = 1+strlen(buffer);
-
-               convert_binary_sha1((char *) buffer + len);
-
-               len += 20;
-               if (len > size)
-                       die("corrupt tree object");
-               size -= len;
-               buffer = (char *) buffer + len;
-       }
-
-       write_subdirectory(orig_buffer, orig_size, "", 0, result_sha1);
-}
-
-static unsigned long parse_oldstyle_date(const char *buf)
-{
-       char c, *p;
-       char buffer[100];
-       struct tm tm;
-       const char *formats[] = {
-               "%c",
-               "%a %b %d %T",
-               "%Z",
-               "%Y",
-               " %Y",
-               NULL
-       };
-       /* We only ever did two timezones in the bad old format .. */
-       const char *timezones[] = {
-               "PDT", "PST", "CEST", NULL
-       };
-       const char **fmt = formats;
-
-       p = buffer;
-       while (isspace(c = *buf))
-               buf++;
-       while ((c = *buf++) != '\n')
-               *p++ = c;
-       *p++ = 0;
-       buf = buffer;
-       memset(&tm, 0, sizeof(tm));
-       do {
-               const char *next = strptime(buf, *fmt, &tm);
-               if (next) {
-                       if (!*next)
-                               return mktime(&tm);
-                       buf = next;
-               } else {
-                       const char **p = timezones;
-                       while (isspace(*buf))
-                               buf++;
-                       while (*p) {
-                               if (!memcmp(buf, *p, strlen(*p))) {
-                                       buf += strlen(*p);
-                                       break;
-                               }
-                               p++;
-                       }
-               }
-               fmt++;
-       } while (*buf && *fmt);
-       printf("left: %s\n", buf);
-       return mktime(&tm);
-}
-
-static int convert_date_line(char *dst, void **buf, unsigned long *sp)
-{
-       unsigned long size = *sp;
-       char *line = *buf;
-       char *next = strchr(line, '\n');
-       char *date = strchr(line, '>');
-       int len;
-
-       if (!next || !date)
-               die("missing or bad author/committer line %s", line);
-       next++; date += 2;
-
-       *buf = next;
-       *sp = size - (next - line);
-
-       len = date - line;
-       memcpy(dst, line, len);
-       dst += len;
-
-       /* Is it already in new format? */
-       if (isdigit(*date)) {
-               int datelen = next - date;
-               memcpy(dst, date, datelen);
-               return len + datelen;
-       }
-
-       /*
-        * Hacky hacky: one of the sparse old-style commits does not have
-        * any date at all, but we can fake it by using the committer date.
-        */
-       if (*date == '\n' && strchr(next, '>'))
-               date = strchr(next, '>')+2;
-
-       return len + sprintf(dst, "%lu -0700\n", parse_oldstyle_date(date));
-}
-
-static void convert_date(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-       char *new = xmalloc(size + 100);
-       unsigned long newlen = 0;
-
-       /* "tree <sha1>\n" */
-       memcpy(new + newlen, buffer, 46);
-       newlen += 46;
-       buffer = (char *) buffer + 46;
-       size -= 46;
-
-       /* "parent <sha1>\n" */
-       while (!memcmp(buffer, "parent ", 7)) {
-               memcpy(new + newlen, buffer, 48);
-               newlen += 48;
-               buffer = (char *) buffer + 48;
-               size -= 48;
-       }
-
-       /* "author xyz <xyz> date" */
-       newlen += convert_date_line(new + newlen, &buffer, &size);
-       /* "committer xyz <xyz> date" */
-       newlen += convert_date_line(new + newlen, &buffer, &size);
-
-       /* Rest */
-       memcpy(new + newlen, buffer, size);
-       newlen += size;
-
-       write_sha1_file(new, newlen, commit_type, result_sha1);
-       free(new);
-}
-
-static void convert_commit(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-       void *orig_buffer = buffer;
-       unsigned long orig_size = size;
-
-       if (memcmp(buffer, "tree ", 5))
-               die("Bad commit '%s'", (char *) buffer);
-       convert_ascii_sha1((char *) buffer + 5);
-       buffer = (char *) buffer + 46;    /* "tree " + "hex sha1" + "\n" */
-       while (!memcmp(buffer, "parent ", 7)) {
-               convert_ascii_sha1((char *) buffer + 7);
-               buffer = (char *) buffer + 48;
-       }
-       convert_date(orig_buffer, orig_size, result_sha1);
-}
-
-static struct entry * convert_entry(unsigned char *sha1)
-{
-       struct entry *entry = lookup_entry(sha1);
-       enum object_type type;
-       void *buffer, *data;
-       unsigned long size;
-
-       if (entry->converted)
-               return entry;
-       data = read_sha1_file(sha1, &type, &size);
-       if (!data)
-               die("unable to read object %s", sha1_to_hex(sha1));
-
-       buffer = xmalloc(size);
-       memcpy(buffer, data, size);
-
-       if (type == OBJ_BLOB) {
-               write_sha1_file(buffer, size, blob_type, entry->new_sha1);
-       } else if (type == OBJ_TREE)
-               convert_tree(buffer, size, entry->new_sha1);
-       else if (type == OBJ_COMMIT)
-               convert_commit(buffer, size, entry->new_sha1);
-       else
-               die("unknown object type %d in %s", type, sha1_to_hex(sha1));
-       entry->converted = 1;
-       free(buffer);
-       free(data);
-       return entry;
-}
-
-int main(int argc, char **argv)
-{
-       unsigned char sha1[20];
-       struct entry *entry;
-
-       setup_git_directory();
-
-       if (argc != 2)
-               usage("git-convert-objects <sha1>");
-       if (get_sha1(argv[1], sha1))
-               die("Not a valid object name %s", argv[1]);
-
-       entry = convert_entry(sha1);
-       printf("new sha1: %s\n", sha1_to_hex(entry->new_sha1));
-       return 0;
-}
diff --git a/contrib/convert-objects/git-convert-objects.txt b/contrib/convert-objects/git-convert-objects.txt
deleted file mode 100644 (file)
index f871880..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-git-convert-objects(1)
-======================
-
-NAME
-----
-git-convert-objects - Converts old-style git repository
-
-
-SYNOPSIS
---------
-[verse]
-'git-convert-objects'
-
-DESCRIPTION
------------
-Converts old-style git repository to the latest format
-
-
-Author
-------
-Written by Linus Torvalds <torvalds@osdl.org>
-
-Documentation
---------------
-Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
-
-GIT
----
-Part of the linkgit:git[7] suite
diff --git a/contrib/credential/libsecret/Makefile b/contrib/credential/libsecret/Makefile
new file mode 100644 (file)
index 0000000..3e67552
--- /dev/null
@@ -0,0 +1,25 @@
+MAIN:=git-credential-libsecret
+all:: $(MAIN)
+
+CC = gcc
+RM = rm -f
+CFLAGS = -g -O2 -Wall
+PKG_CONFIG = pkg-config
+
+-include ../../../config.mak.autogen
+-include ../../../config.mak
+
+INCS:=$(shell $(PKG_CONFIG) --cflags libsecret-1 glib-2.0)
+LIBS:=$(shell $(PKG_CONFIG) --libs libsecret-1 glib-2.0)
+
+SRCS:=$(MAIN).c
+OBJS:=$(SRCS:.c=.o)
+
+%.o: %.c
+       $(CC) $(CFLAGS) $(CPPFLAGS) $(INCS) -o $@ -c $<
+
+$(MAIN): $(OBJS)
+       $(CC) -o $@ $(LDFLAGS) $^ $(LIBS)
+
+clean:
+       @$(RM) $(MAIN) $(OBJS)
diff --git a/contrib/credential/libsecret/git-credential-libsecret.c b/contrib/credential/libsecret/git-credential-libsecret.c
new file mode 100644 (file)
index 0000000..4c56979
--- /dev/null
@@ -0,0 +1,370 @@
+/*
+ * Copyright (C) 2011 John Szakmeister <john@szakmeister.net>
+ *               2012 Philipp A. Hartmann <pah@qo.cx>
+ *               2016 Mantas Mikulėnas <grawity@gmail.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * Credits:
+ * - GNOME Keyring API handling originally written by John Szakmeister
+ * - ported to credential helper API by Philipp A. Hartmann
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <libsecret/secret.h>
+
+/*
+ * This credential struct and API is simplified from git's credential.{h,c}
+ */
+struct credential {
+       char *protocol;
+       char *host;
+       unsigned short port;
+       char *path;
+       char *username;
+       char *password;
+};
+
+#define CREDENTIAL_INIT { NULL, NULL, 0, NULL, NULL, NULL }
+
+typedef int (*credential_op_cb)(struct credential *);
+
+struct credential_operation {
+       char *name;
+       credential_op_cb op;
+};
+
+#define CREDENTIAL_OP_END { NULL, NULL }
+
+/* ----------------- Secret Service functions ----------------- */
+
+static char *make_label(struct credential *c)
+{
+       if (c->port)
+               return g_strdup_printf("Git: %s://%s:%hu/%s",
+                                       c->protocol, c->host, c->port, c->path ? c->path : "");
+       else
+               return g_strdup_printf("Git: %s://%s/%s",
+                                       c->protocol, c->host, c->path ? c->path : "");
+}
+
+static GHashTable *make_attr_list(struct credential *c)
+{
+       GHashTable *al = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
+
+       if (c->username)
+               g_hash_table_insert(al, "user", g_strdup(c->username));
+       if (c->protocol)
+               g_hash_table_insert(al, "protocol", g_strdup(c->protocol));
+       if (c->host)
+               g_hash_table_insert(al, "server", g_strdup(c->host));
+       if (c->port)
+               g_hash_table_insert(al, "port", g_strdup_printf("%hu", c->port));
+       if (c->path)
+               g_hash_table_insert(al, "object", g_strdup(c->path));
+
+       return al;
+}
+
+static int keyring_get(struct credential *c)
+{
+       SecretService *service = NULL;
+       GHashTable *attributes = NULL;
+       GError *error = NULL;
+       GList *items = NULL;
+
+       if (!c->protocol || !(c->host || c->path))
+               return EXIT_FAILURE;
+
+       service = secret_service_get_sync(0, NULL, &error);
+       if (error != NULL) {
+               g_critical("could not connect to Secret Service: %s", error->message);
+               g_error_free(error);
+               return EXIT_FAILURE;
+       }
+
+       attributes = make_attr_list(c);
+       items = secret_service_search_sync(service,
+                                          SECRET_SCHEMA_COMPAT_NETWORK,
+                                          attributes,
+                                          SECRET_SEARCH_LOAD_SECRETS,
+                                          NULL,
+                                          &error);
+       g_hash_table_unref(attributes);
+       if (error != NULL) {
+               g_critical("lookup failed: %s", error->message);
+               g_error_free(error);
+               return EXIT_FAILURE;
+       }
+
+       if (items != NULL) {
+               SecretItem *item;
+               SecretValue *secret;
+               const char *s;
+
+               item = items->data;
+               secret = secret_item_get_secret(item);
+               attributes = secret_item_get_attributes(item);
+
+               s = g_hash_table_lookup(attributes, "user");
+               if (s) {
+                       g_free(c->username);
+                       c->username = g_strdup(s);
+               }
+
+               s = secret_value_get_text(secret);
+               if (s) {
+                       g_free(c->password);
+                       c->password = g_strdup(s);
+               }
+
+               g_hash_table_unref(attributes);
+               secret_value_unref(secret);
+               g_list_free_full(items, g_object_unref);
+       }
+
+       return EXIT_SUCCESS;
+}
+
+
+static int keyring_store(struct credential *c)
+{
+       char *label = NULL;
+       GHashTable *attributes = NULL;
+       GError *error = NULL;
+
+       /*
+        * Sanity check that what we are storing is actually sensible.
+        * In particular, we can't make a URL without a protocol field.
+        * Without either a host or pathname (depending on the scheme),
+        * we have no primary key. And without a username and password,
+        * we are not actually storing a credential.
+        */
+       if (!c->protocol || !(c->host || c->path) ||
+           !c->username || !c->password)
+               return EXIT_FAILURE;
+
+       label = make_label(c);
+       attributes = make_attr_list(c);
+       secret_password_storev_sync(SECRET_SCHEMA_COMPAT_NETWORK,
+                                   attributes,
+                                   NULL,
+                                   label,
+                                   c->password,
+                                   NULL,
+                                   &error);
+       g_free(label);
+       g_hash_table_unref(attributes);
+
+       if (error != NULL) {
+               g_critical("store failed: %s", error->message);
+               g_error_free(error);
+               return EXIT_FAILURE;
+       }
+
+       return EXIT_SUCCESS;
+}
+
+static int keyring_erase(struct credential *c)
+{
+       GHashTable *attributes = NULL;
+       GError *error = NULL;
+
+       /*
+        * Sanity check that we actually have something to match
+        * against. The input we get is a restrictive pattern,
+        * so technically a blank credential means "erase everything".
+        * But it is too easy to accidentally send this, since it is equivalent
+        * to empty input. So explicitly disallow it, and require that the
+        * pattern have some actual content to match.
+        */
+       if (!c->protocol && !c->host && !c->path && !c->username)
+               return EXIT_FAILURE;
+
+       attributes = make_attr_list(c);
+       secret_password_clearv_sync(SECRET_SCHEMA_COMPAT_NETWORK,
+                                   attributes,
+                                   NULL,
+                                   &error);
+       g_hash_table_unref(attributes);
+
+       if (error != NULL) {
+               g_critical("erase failed: %s", error->message);
+               g_error_free(error);
+               return EXIT_FAILURE;
+       }
+
+       return EXIT_SUCCESS;
+}
+
+/*
+ * Table with helper operation callbacks, used by generic
+ * credential helper main function.
+ */
+static struct credential_operation const credential_helper_ops[] = {
+       { "get",   keyring_get },
+       { "store", keyring_store },
+       { "erase", keyring_erase },
+       CREDENTIAL_OP_END
+};
+
+/* ------------------ credential functions ------------------ */
+
+static void credential_init(struct credential *c)
+{
+       memset(c, 0, sizeof(*c));
+}
+
+static void credential_clear(struct credential *c)
+{
+       g_free(c->protocol);
+       g_free(c->host);
+       g_free(c->path);
+       g_free(c->username);
+       g_free(c->password);
+
+       credential_init(c);
+}
+
+static int credential_read(struct credential *c)
+{
+       char *buf;
+       size_t line_len;
+       char *key;
+       char *value;
+
+       key = buf = g_malloc(1024);
+
+       while (fgets(buf, 1024, stdin)) {
+               line_len = strlen(buf);
+
+               if (line_len && buf[line_len-1] == '\n')
+                       buf[--line_len] = '\0';
+
+               if (!line_len)
+                       break;
+
+               value = strchr(buf, '=');
+               if (!value) {
+                       g_warning("invalid credential line: %s", key);
+                       g_free(buf);
+                       return -1;
+               }
+               *value++ = '\0';
+
+               if (!strcmp(key, "protocol")) {
+                       g_free(c->protocol);
+                       c->protocol = g_strdup(value);
+               } else if (!strcmp(key, "host")) {
+                       g_free(c->host);
+                       c->host = g_strdup(value);
+                       value = strrchr(c->host, ':');
+                       if (value) {
+                               *value++ = '\0';
+                               c->port = atoi(value);
+                       }
+               } else if (!strcmp(key, "path")) {
+                       g_free(c->path);
+                       c->path = g_strdup(value);
+               } else if (!strcmp(key, "username")) {
+                       g_free(c->username);
+                       c->username = g_strdup(value);
+               } else if (!strcmp(key, "password")) {
+                       g_free(c->password);
+                       c->password = g_strdup(value);
+                       while (*value)
+                               *value++ = '\0';
+               }
+               /*
+                * Ignore other lines; we don't know what they mean, but
+                * this future-proofs us when later versions of git do
+                * learn new lines, and the helpers are updated to match.
+                */
+       }
+
+       g_free(buf);
+
+       return 0;
+}
+
+static void credential_write_item(FILE *fp, const char *key, const char *value)
+{
+       if (!value)
+               return;
+       fprintf(fp, "%s=%s\n", key, value);
+}
+
+static void credential_write(const struct credential *c)
+{
+       /* only write username/password, if set */
+       credential_write_item(stdout, "username", c->username);
+       credential_write_item(stdout, "password", c->password);
+}
+
+static void usage(const char *name)
+{
+       struct credential_operation const *try_op = credential_helper_ops;
+       const char *basename = strrchr(name, '/');
+
+       basename = (basename) ? basename + 1 : name;
+       fprintf(stderr, "usage: %s <", basename);
+       while (try_op->name) {
+               fprintf(stderr, "%s", (try_op++)->name);
+               if (try_op->name)
+                       fprintf(stderr, "%s", "|");
+       }
+       fprintf(stderr, "%s", ">\n");
+}
+
+int main(int argc, char *argv[])
+{
+       int ret = EXIT_SUCCESS;
+
+       struct credential_operation const *try_op = credential_helper_ops;
+       struct credential cred = CREDENTIAL_INIT;
+
+       if (!argv[1]) {
+               usage(argv[0]);
+               exit(EXIT_FAILURE);
+       }
+
+       g_set_application_name("Git Credential Helper");
+
+       /* lookup operation callback */
+       while (try_op->name && strcmp(argv[1], try_op->name))
+               try_op++;
+
+       /* unsupported operation given -- ignore silently */
+       if (!try_op->name || !try_op->op)
+               goto out;
+
+       ret = credential_read(&cred);
+       if (ret)
+               goto out;
+
+       /* perform credential operation */
+       ret = (*try_op->op)(&cred);
+
+       credential_write(&cred);
+
+out:
+       credential_clear(&cred);
+       return ret;
+}
diff --git a/contrib/diff-highlight/.gitignore b/contrib/diff-highlight/.gitignore
new file mode 100644 (file)
index 0000000..c074548
--- /dev/null
@@ -0,0 +1,2 @@
+shebang.perl
+diff-highlight
old mode 100755 (executable)
new mode 100644 (file)
similarity index 91%
rename from contrib/diff-highlight/diff-highlight
rename to contrib/diff-highlight/DiffHighlight.pm
index 81bd804..663992e
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+package DiffHighlight;
 
 use 5.008;
 use warnings FATAL => 'all';
@@ -29,13 +29,14 @@ my @removed;
 my @added;
 my $in_hunk;
 
-# Some scripts may not realize that SIGPIPE is being ignored when launching the
-# pager--for instance scripts written in Python.
-$SIG{PIPE} = 'DEFAULT';
+our $line_cb = sub { print @_ };
+our $flush_cb = sub { local $| = 1 };
+
+sub handle_line {
+       local $_ = shift;
 
-while (<>) {
        if (!$in_hunk) {
-               print;
+               $line_cb->($_);
                $in_hunk = /^$GRAPH*$COLOR*\@\@ /;
        }
        elsif (/^$GRAPH*$COLOR*-/) {
@@ -49,7 +50,7 @@ while (<>) {
                @removed = ();
                @added = ();
 
-               print;
+               $line_cb->($_);
                $in_hunk = /^$GRAPH*$COLOR*[\@ ]/;
        }
 
@@ -62,15 +63,22 @@ while (<>) {
        # place to flush. Flushing on a blank line is a heuristic that
        # happens to match git-log output.
        if (!length) {
-               local $| = 1;
+               $flush_cb->();
        }
 }
 
-# Flush any queued hunk (this can happen when there is no trailing context in
-# the final diff of the input).
-show_hunk(\@removed, \@added);
+sub flush {
+       # Flush any queued hunk (this can happen when there is no trailing
+       # context in the final diff of the input).
+       show_hunk(\@removed, \@added);
+}
 
-exit 0;
+sub highlight_stdin {
+       while (<STDIN>) {
+               handle_line($_);
+       }
+       flush();
+}
 
 # Ideally we would feed the default as a human-readable color to
 # git-config as the fallback value. But diff-highlight does
@@ -88,7 +96,7 @@ sub show_hunk {
 
        # If one side is empty, then there is nothing to compare or highlight.
        if (!@$a || !@$b) {
-               print @$a, @$b;
+               $line_cb->(@$a, @$b);
                return;
        }
 
@@ -97,17 +105,17 @@ sub show_hunk {
        # stupid, and only handle multi-line hunks that remove and add the same
        # number of lines.
        if (@$a != @$b) {
-               print @$a, @$b;
+               $line_cb->(@$a, @$b);
                return;
        }
 
        my @queue;
        for (my $i = 0; $i < @$a; $i++) {
                my ($rm, $add) = highlight_pair($a->[$i], $b->[$i]);
-               print $rm;
+               $line_cb->($rm);
                push @queue, $add;
        }
-       print @queue;
+       $line_cb->(@queue);
 }
 
 sub highlight_pair {
index 9018724524ab7868bb015696e301396f1f9b5667..fbf5c582496eece56b29a91a2f3085716f4b0e9f 100644 (file)
@@ -1,5 +1,20 @@
-# nothing to build
-all:
+all: diff-highlight
 
-test:
+PERL_PATH = /usr/bin/perl
+-include ../../config.mak
+
+PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
+
+diff-highlight: shebang.perl DiffHighlight.pm diff-highlight.perl
+       cat $^ >$@+
+       chmod +x $@+
+       mv $@+ $@
+
+shebang.perl: FORCE
+       @echo '#!$(PERL_PATH_SQ)' >$@+
+       @cmp $@+ $@ >/dev/null 2>/dev/null || mv $@+ $@
+
+test: all
        $(MAKE) -C t
+
+.PHONY: FORCE
index 836b97a73075a51ef8bc66ba080085a7de4c8f32..d4c23431752063c7b455d429321264a4bd6becf7 100644 (file)
@@ -99,6 +99,36 @@ newHighlight = "black #aaffaa"
 ---------------------------------------------
 
 
+Using diff-highlight as a module
+--------------------------------
+
+If you want to pre- or post- process the highlighted lines as part of
+another perl script, you can use the DiffHighlight module. You can
+either "require" it or just cat the module together with your script (to
+avoid run-time dependencies).
+
+Your script may set up one or more of the following variables:
+
+  - $DiffHighlight::line_cb - this should point to a function which is
+    called whenever DiffHighlight has lines (which may contain
+    highlights) to output. The default function prints each line to
+    stdout. Note that the function may be called with multiple lines.
+
+  - $DiffHighlight::flush_cb - this should point to a function which
+    flushes the output (because DiffHighlight believes it has completed
+    processing a logical chunk of input). The default function flushes
+    stdout.
+
+The script may then feed lines, one at a time, to DiffHighlight::handle_line().
+When lines are done processing, they will be fed to $line_cb. Note that
+DiffHighlight may queue up many input lines (to analyze a whole hunk)
+before calling $line_cb. After providing all lines, call
+DiffHighlight::flush() to flush any unprocessed lines.
+
+If you just want to process stdin, DiffHighlight::highlight_stdin()
+is a convenience helper which will loop and flush for you.
+
+
 Bugs
 ----
 
diff --git a/contrib/diff-highlight/diff-highlight.perl b/contrib/diff-highlight/diff-highlight.perl
new file mode 100644 (file)
index 0000000..9b3e9c1
--- /dev/null
@@ -0,0 +1,8 @@
+package main;
+
+# Some scripts may not realize that SIGPIPE is being ignored when launching the
+# pager--for instance scripts written in Python.
+$SIG{PIPE} = 'DEFAULT';
+
+DiffHighlight::highlight_stdin();
+exit 0;
similarity index 86%
rename from git-difftool.perl
rename to contrib/examples/git-difftool.perl
index a5790d03a075884ffe93dbff782b28ec87263051..df59bdfe97786b5d9f48777cfad80545ff6bbdc2 100755 (executable)
@@ -22,6 +22,7 @@ use File::Path qw(mkpath rmtree);
 use File::Temp qw(tempdir);
 use Getopt::Long qw(:config pass_through);
 use Git;
+use Git::I18N;
 
 sub usage
 {
@@ -59,14 +60,14 @@ sub exit_cleanup
 
 sub use_wt_file
 {
-       my ($workdir, $file, $sha1) = @_;
+       my ($file, $sha1) = @_;
        my $null_sha1 = '0' x 40;
 
-       if (-l "$workdir/$file" || ! -e _) {
+       if (-l $file || ! -e _) {
                return (0, $null_sha1);
        }
 
-       my $wt_sha1 = Git::command_oneline('hash-object', "$workdir/$file");
+       my $wt_sha1 = Git::command_oneline('hash-object', $file);
        my $use = ($sha1 eq $null_sha1) || ($sha1 eq $wt_sha1);
        return ($use, $wt_sha1);
 }
@@ -100,11 +101,17 @@ sub changed_files
 
 sub setup_dir_diff
 {
-       my ($workdir, $symlinks) = @_;
+       my ($worktree, $symlinks) = @_;
        my @gitargs = ('diff', '--raw', '--no-abbrev', '-z', @ARGV);
        my $diffrtn = Git::command_oneline(@gitargs);
        exit(0) unless defined($diffrtn);
 
+       # Go to the root of the worktree now that we've captured the list of
+       # changed files.  The paths returned by diff --raw are relative to the
+       # top-level of the repository, but we defer changing directories so
+       # that @ARGV can perform pathspec limiting in the current directory.
+       chdir($worktree);
+
        # Build index info for left and right sides of the diff
        my $submodule_mode = '160000';
        my $symlink_mode = '120000';
@@ -115,14 +122,14 @@ sub setup_dir_diff
        my $wtindex = '';
        my %submodule;
        my %symlink;
-       my @working_tree = ();
+       my @files = ();
        my %working_tree_dups = ();
        my @rawdiff = split('\0', $diffrtn);
 
        my $i = 0;
        while ($i < $#rawdiff) {
                if ($rawdiff[$i] =~ /^::/) {
-                       warn << 'EOF';
+                       warn __ <<'EOF';
 Combined diff formats ('-c' and '--cc') are not supported in
 directory diff mode ('-d' and '--dir-diff').
 EOF
@@ -167,14 +174,14 @@ EOF
                }
 
                if ($rmode ne $null_mode) {
-                       # Avoid duplicate working_tree entries
+                       # Avoid duplicate entries
                        if ($working_tree_dups{$dst_path}++) {
                                next;
                        }
                        my ($use, $wt_sha1) =
-                               use_wt_file($workdir, $dst_path, $rsha1);
+                               use_wt_file($dst_path, $rsha1);
                        if ($use) {
-                               push @working_tree, $dst_path;
+                               push @files, $dst_path;
                                $wtindex .= "$rmode $wt_sha1\t$dst_path\0";
                        } else {
                                $rindex .= "$rmode $rsha1\t$dst_path\0";
@@ -182,6 +189,10 @@ EOF
                }
        }
 
+       # Go to the root of the worktree so that the left index files
+       # are properly setup -- the index is toplevel-relative.
+       chdir($worktree);
+
        # Setup temp directories
        my $tmpdir = tempdir('git-difftool.XXXXX', CLEANUP => 0, TMPDIR => 1);
        my $ldir = "$tmpdir/left";
@@ -220,23 +231,21 @@ EOF
        delete($ENV{GIT_INDEX_FILE});
 
        # Changes in the working tree need special treatment since they are
-       # not part of the index. Remove any trailing slash from $workdir
-       # before starting to avoid double slashes in symlink targets.
-       $workdir =~ s|/$||;
-       for my $file (@working_tree) {
+       # not part of the index.
+       for my $file (@files) {
                my $dir = dirname($file);
                unless (-d "$rdir/$dir") {
                        mkpath("$rdir/$dir") or
                        exit_cleanup($tmpdir, 1);
                }
                if ($symlinks) {
-                       symlink("$workdir/$file", "$rdir/$file") or
+                       symlink("$worktree/$file", "$rdir/$file") or
                        exit_cleanup($tmpdir, 1);
                } else {
-                       copy("$workdir/$file", "$rdir/$file") or
+                       copy($file, "$rdir/$file") or
                        exit_cleanup($tmpdir, 1);
 
-                       my $mode = stat("$workdir/$file")->mode;
+                       my $mode = stat($file)->mode;
                        chmod($mode, "$rdir/$file") or
                        exit_cleanup($tmpdir, 1);
                }
@@ -274,7 +283,7 @@ EOF
                exit_cleanup($tmpdir, 1) if not $ok;
        }
 
-       return ($ldir, $rdir, $tmpdir, @working_tree);
+       return ($ldir, $rdir, $tmpdir, @files);
 }
 
 sub write_to_file
@@ -338,7 +347,7 @@ sub main
                if (length($opts{difftool_cmd}) > 0) {
                        $ENV{GIT_DIFF_TOOL} = $opts{difftool_cmd};
                } else {
-                       print "No <tool> given for --tool=<tool>\n";
+                       print __("No <tool> given for --tool=<tool>\n");
                        usage(1);
                }
        }
@@ -346,7 +355,7 @@ sub main
                if (length($opts{extcmd}) > 0) {
                        $ENV{GIT_DIFFTOOL_EXTCMD} = $opts{extcmd};
                } else {
-                       print "No <cmd> given for --extcmd=<cmd>\n";
+                       print __("No <cmd> given for --extcmd=<cmd>\n");
                        usage(1);
                }
        }
@@ -384,8 +393,9 @@ sub dir_diff
        my $error = 0;
        my $repo = Git->repository();
        my $repo_path = $repo->repo_path();
-       my $workdir = $repo->wc_path();
-       my ($a, $b, $tmpdir, @worktree) = setup_dir_diff($workdir, $symlinks);
+       my $worktree = $repo->wc_path();
+       $worktree =~ s|/$||; # Avoid double slashes in symlink targets
+       my ($a, $b, $tmpdir, @files) = setup_dir_diff($worktree, $symlinks);
 
        if (defined($extcmd)) {
                $rc = system($extcmd, $a, $b);
@@ -406,37 +416,38 @@ sub dir_diff
        my %tmp_modified;
        my $indices_loaded = 0;
 
-       for my $file (@worktree) {
+       for my $file (@files) {
                next if $symlinks && -l "$b/$file";
                next if ! -f "$b/$file";
 
                if (!$indices_loaded) {
                        %wt_modified = changed_files(
-                               $repo_path, "$tmpdir/wtindex", $workdir);
+                               $repo_path, "$tmpdir/wtindex", $worktree);
                        %tmp_modified = changed_files(
                                $repo_path, "$tmpdir/wtindex", $b);
                        $indices_loaded = 1;
                }
 
                if (exists $wt_modified{$file} and exists $tmp_modified{$file}) {
-                       my $errmsg = "warning: Both files modified: ";
-                       $errmsg .= "'$workdir/$file' and '$b/$file'.\n";
-                       $errmsg .= "warning: Working tree file has been left.\n";
-                       $errmsg .= "warning:\n";
-                       warn $errmsg;
+                       warn sprintf(__(
+                               "warning: Both files modified:\n" .
+                               "'%s/%s' and '%s/%s'.\n" .
+                               "warning: Working tree file has been left.\n" .
+                               "warning:\n"), $worktree, $file, $b, $file);
                        $error = 1;
                } elsif (exists $tmp_modified{$file}) {
                        my $mode = stat("$b/$file")->mode;
-                       copy("$b/$file", "$workdir/$file") or
+                       copy("$b/$file", $file) or
                        exit_cleanup($tmpdir, 1);
 
-                       chmod($mode, "$workdir/$file") or
+                       chmod($mode, $file) or
                        exit_cleanup($tmpdir, 1);
                }
        }
        if ($error) {
-               warn "warning: Temporary files exist in '$tmpdir'.\n";
-               warn "warning: You may want to cleanup or recover these.\n";
+               warn sprintf(__(
+                       "warning: Temporary files exist in '%s'.\n" .
+                       "warning: You may want to cleanup or recover these.\n"), $tmpdir);
                exit(1);
        } else {
                exit_cleanup($tmpdir, $rc);
index d7e97bbc76c27f61e83a5328831fd6889b22e662..8c171dd959f69501706c565218665ef474252d43 100755 (executable)
@@ -26,13 +26,13 @@ n,dry-run            don't recreate the branch"
 . git-sh-setup
 
 search_reflog () {
-        sed -ne 's~^\([^ ]*\) .*\tcheckout: moving from '"$1"' .*~\1~p' \
+       sed -ne 's~^\([^ ]*\) .*        checkout: moving from '"$1"' .*~\1~p' \
                 < "$GIT_DIR"/logs/HEAD
 }
 
 search_reflog_merges () {
        git rev-parse $(
-               sed -ne 's~^[^ ]* \([^ ]*\) .*\tmerge '"$1"':.*~\1^2~p' \
+               sed -ne 's~^[^ ]* \([^ ]*\) .*  merge '"$1"':.*~\1^2~p' \
                        < "$GIT_DIR"/logs/HEAD
        )
 }
diff --git a/contrib/gitview/gitview b/contrib/gitview/gitview
deleted file mode 100755 (executable)
index 4e23c65..0000000
+++ /dev/null
@@ -1,1305 +0,0 @@
-#! /usr/bin/env python
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-""" gitview
-GUI browser for git repository
-This program is based on bzrk by Scott James Remnant <scott@ubuntu.com>
-"""
-__copyright__ = "Copyright (C) 2006 Hewlett-Packard Development Company, L.P."
-__copyright__ = "Copyright (C) 2007 Aneesh Kumar K.V <aneesh.kumar@gmail.com"
-__author__    = "Aneesh Kumar K.V <aneesh.kumar@gmail.com>"
-
-
-import sys
-import os
-import gtk
-import pygtk
-import pango
-import re
-import time
-import gobject
-import cairo
-import math
-import string
-import fcntl
-
-have_gtksourceview2 = False
-have_gtksourceview = False
-try:
-    import gtksourceview2
-    have_gtksourceview2 = True
-except ImportError:
-    try:
-        import gtksourceview
-        have_gtksourceview = True
-    except ImportError:
-        print "Running without gtksourceview2 or gtksourceview module"
-
-re_ident = re.compile('(author|committer) (?P<ident>.*) (?P<epoch>\d+) (?P<tz>[+-]\d{4})')
-
-def list_to_string(args, skip):
-       count = len(args)
-       i = skip
-       str_arg=" "
-       while (i < count ):
-               str_arg = str_arg + args[i]
-               str_arg = str_arg + " "
-               i = i+1
-
-       return str_arg
-
-def show_date(epoch, tz):
-       secs = float(epoch)
-       tzsecs = float(tz[1:3]) * 3600
-       tzsecs += float(tz[3:5]) * 60
-       if (tz[0] == "+"):
-               secs += tzsecs
-       else:
-               secs -= tzsecs
-
-       return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(secs))
-
-def get_source_buffer_and_view():
-       if have_gtksourceview2:
-               buffer = gtksourceview2.Buffer()
-               slm = gtksourceview2.LanguageManager()
-               gsl = slm.get_language("diff")
-               buffer.set_highlight_syntax(True)
-               buffer.set_language(gsl)
-               view = gtksourceview2.View(buffer)
-       elif have_gtksourceview:
-               buffer = gtksourceview.SourceBuffer()
-               slm = gtksourceview.SourceLanguagesManager()
-               gsl = slm.get_language_from_mime_type("text/x-patch")
-               buffer.set_highlight(True)
-               buffer.set_language(gsl)
-               view = gtksourceview.SourceView(buffer)
-       else:
-               buffer = gtk.TextBuffer()
-               view = gtk.TextView(buffer)
-       return (buffer, view)
-
-
-class CellRendererGraph(gtk.GenericCellRenderer):
-       """Cell renderer for directed graph.
-
-       This module contains the implementation of a custom GtkCellRenderer that
-       draws part of the directed graph based on the lines suggested by the code
-       in graph.py.
-
-       Because we're shiny, we use Cairo to do this, and because we're naughty
-       we cheat and draw over the bits of the TreeViewColumn that are supposed to
-       just be for the background.
-
-       Properties:
-       node              (column, colour, [ names ]) tuple to draw revision node,
-       in_lines          (start, end, colour) tuple list to draw inward lines,
-       out_lines         (start, end, colour) tuple list to draw outward lines.
-       """
-
-       __gproperties__ = {
-       "node":         ( gobject.TYPE_PYOBJECT, "node",
-                         "revision node instruction",
-                         gobject.PARAM_WRITABLE
-                       ),
-       "in-lines":     ( gobject.TYPE_PYOBJECT, "in-lines",
-                         "instructions to draw lines into the cell",
-                         gobject.PARAM_WRITABLE
-                       ),
-       "out-lines":    ( gobject.TYPE_PYOBJECT, "out-lines",
-                         "instructions to draw lines out of the cell",
-                         gobject.PARAM_WRITABLE
-                       ),
-       }
-
-       def do_set_property(self, property, value):
-               """Set properties from GObject properties."""
-               if property.name == "node":
-                       self.node = value
-               elif property.name == "in-lines":
-                       self.in_lines = value
-               elif property.name == "out-lines":
-                       self.out_lines = value
-               else:
-                       raise AttributeError, "no such property: '%s'" % property.name
-
-       def box_size(self, widget):
-               """Calculate box size based on widget's font.
-
-               Cache this as it's probably expensive to get.  It ensures that we
-               draw the graph at least as large as the text.
-               """
-               try:
-                       return self._box_size
-               except AttributeError:
-                       pango_ctx = widget.get_pango_context()
-                       font_desc = widget.get_style().font_desc
-                       metrics = pango_ctx.get_metrics(font_desc)
-
-                       ascent = pango.PIXELS(metrics.get_ascent())
-                       descent = pango.PIXELS(metrics.get_descent())
-
-                       self._box_size = ascent + descent + 6
-                       return self._box_size
-
-       def set_colour(self, ctx, colour, bg, fg):
-               """Set the context source colour.
-
-               Picks a distinct colour based on an internal wheel; the bg
-               parameter provides the value that should be assigned to the 'zero'
-               colours and the fg parameter provides the multiplier that should be
-               applied to the foreground colours.
-               """
-               colours = [
-                   ( 1.0, 0.0, 0.0 ),
-                   ( 1.0, 1.0, 0.0 ),
-                   ( 0.0, 1.0, 0.0 ),
-                   ( 0.0, 1.0, 1.0 ),
-                   ( 0.0, 0.0, 1.0 ),
-                   ( 1.0, 0.0, 1.0 ),
-                   ]
-
-               colour %= len(colours)
-               red   = (colours[colour][0] * fg) or bg
-               green = (colours[colour][1] * fg) or bg
-               blue  = (colours[colour][2] * fg) or bg
-
-               ctx.set_source_rgb(red, green, blue)
-
-       def on_get_size(self, widget, cell_area):
-               """Return the size we need for this cell.
-
-               Each cell is drawn individually and is only as wide as it needs
-               to be, we let the TreeViewColumn take care of making them all
-               line up.
-               """
-               box_size = self.box_size(widget)
-
-               cols = self.node[0]
-               for start, end, colour in self.in_lines + self.out_lines:
-                       cols = int(max(cols, start, end))
-
-               (column, colour, names) = self.node
-               names_len = 0
-               if (len(names) != 0):
-                       for item in names:
-                               names_len += len(item)
-
-               width = box_size * (cols + 1 ) + names_len
-               height = box_size
-
-               # FIXME I have no idea how to use cell_area properly
-               return (0, 0, width, height)
-
-       def on_render(self, window, widget, bg_area, cell_area, exp_area, flags):
-               """Render an individual cell.
-
-               Draws the cell contents using cairo, taking care to clip what we
-               do to within the background area so we don't draw over other cells.
-               Note that we're a bit naughty there and should really be drawing
-               in the cell_area (or even the exposed area), but we explicitly don't
-               want any gutter.
-
-               We try and be a little clever, if the line we need to draw is going
-               to cross other columns we actually draw it as in the .---' style
-               instead of a pure diagonal ... this reduces confusion by an
-               incredible amount.
-               """
-               ctx = window.cairo_create()
-               ctx.rectangle(bg_area.x, bg_area.y, bg_area.width, bg_area.height)
-               ctx.clip()
-
-               box_size = self.box_size(widget)
-
-               ctx.set_line_width(box_size / 8)
-               ctx.set_line_cap(cairo.LINE_CAP_SQUARE)
-
-               # Draw lines into the cell
-               for start, end, colour in self.in_lines:
-                       ctx.move_to(cell_area.x + box_size * start + box_size / 2,
-                                       bg_area.y - bg_area.height / 2)
-
-                       if start - end > 1:
-                               ctx.line_to(cell_area.x + box_size * start, bg_area.y)
-                               ctx.line_to(cell_area.x + box_size * end + box_size, bg_area.y)
-                       elif start - end < -1:
-                               ctx.line_to(cell_area.x + box_size * start + box_size,
-                                               bg_area.y)
-                               ctx.line_to(cell_area.x + box_size * end, bg_area.y)
-
-                       ctx.line_to(cell_area.x + box_size * end + box_size / 2,
-                                       bg_area.y + bg_area.height / 2)
-
-                       self.set_colour(ctx, colour, 0.0, 0.65)
-                       ctx.stroke()
-
-               # Draw lines out of the cell
-               for start, end, colour in self.out_lines:
-                       ctx.move_to(cell_area.x + box_size * start + box_size / 2,
-                                       bg_area.y + bg_area.height / 2)
-
-                       if start - end > 1:
-                               ctx.line_to(cell_area.x + box_size * start,
-                                               bg_area.y + bg_area.height)
-                               ctx.line_to(cell_area.x + box_size * end + box_size,
-                                               bg_area.y + bg_area.height)
-                       elif start - end < -1:
-                               ctx.line_to(cell_area.x + box_size * start + box_size,
-                                               bg_area.y + bg_area.height)
-                               ctx.line_to(cell_area.x + box_size * end,
-                                               bg_area.y + bg_area.height)
-
-                       ctx.line_to(cell_area.x + box_size * end + box_size / 2,
-                                       bg_area.y + bg_area.height / 2 + bg_area.height)
-
-                       self.set_colour(ctx, colour, 0.0, 0.65)
-                       ctx.stroke()
-
-               # Draw the revision node in the right column
-               (column, colour, names) = self.node
-               ctx.arc(cell_area.x + box_size * column + box_size / 2,
-                               cell_area.y + cell_area.height / 2,
-                               box_size / 4, 0, 2 * math.pi)
-
-
-               self.set_colour(ctx, colour, 0.0, 0.5)
-               ctx.stroke_preserve()
-
-               self.set_colour(ctx, colour, 0.5, 1.0)
-               ctx.fill_preserve()
-
-               if (len(names) != 0):
-                       name = " "
-                       for item in names:
-                               name = name + item + " "
-
-                       ctx.set_font_size(13)
-                       if (flags & 1):
-                               self.set_colour(ctx, colour, 0.5, 1.0)
-                       else:
-                               self.set_colour(ctx, colour, 0.0, 0.5)
-                       ctx.show_text(name)
-
-class Commit(object):
-       """ This represent a commit object obtained after parsing the git-rev-list
-       output """
-
-       __slots__ = ['children_sha1', 'message', 'author', 'date', 'committer',
-                                'commit_date', 'commit_sha1', 'parent_sha1']
-
-       children_sha1 = {}
-
-       def __init__(self, commit_lines):
-               self.message            = ""
-               self.author             = ""
-               self.date               = ""
-               self.committer          = ""
-               self.commit_date        = ""
-               self.commit_sha1        = ""
-               self.parent_sha1        = [ ]
-               self.parse_commit(commit_lines)
-
-
-       def parse_commit(self, commit_lines):
-
-               # First line is the sha1 lines
-               line = string.strip(commit_lines[0])
-               sha1 = re.split(" ", line)
-               self.commit_sha1 = sha1[0]
-               self.parent_sha1 = sha1[1:]
-
-               #build the child list
-               for parent_id in self.parent_sha1:
-                       try:
-                               Commit.children_sha1[parent_id].append(self.commit_sha1)
-                       except KeyError:
-                               Commit.children_sha1[parent_id] = [self.commit_sha1]
-
-               # IF we don't have parent
-               if (len(self.parent_sha1) == 0):
-                       self.parent_sha1 = [0]
-
-               for line in commit_lines[1:]:
-                       m = re.match("^ ", line)
-                       if (m != None):
-                               # First line of the commit message used for short log
-                               if self.message == "":
-                                       self.message = string.strip(line)
-                               continue
-
-                       m = re.match("tree", line)
-                       if (m != None):
-                               continue
-
-                       m = re.match("parent", line)
-                       if (m != None):
-                               continue
-
-                       m = re_ident.match(line)
-                       if (m != None):
-                               date = show_date(m.group('epoch'), m.group('tz'))
-                               if m.group(1) == "author":
-                                       self.author = m.group('ident')
-                                       self.date = date
-                               elif m.group(1) == "committer":
-                                       self.committer = m.group('ident')
-                                       self.commit_date = date
-
-                               continue
-
-       def get_message(self, with_diff=0):
-               if (with_diff == 1):
-                       message = self.diff_tree()
-               else:
-                       fp = os.popen("git cat-file commit " + self.commit_sha1)
-                       message = fp.read()
-                       fp.close()
-
-               return message
-
-       def diff_tree(self):
-               fp = os.popen("git diff-tree --pretty --cc  -v -p --always " +  self.commit_sha1)
-               diff = fp.read()
-               fp.close()
-               return diff
-
-class AnnotateWindow(object):
-       """Annotate window.
-       This object represents and manages a single window containing the
-       annotate information of the file
-       """
-
-       def __init__(self):
-               self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-               self.window.set_border_width(0)
-               self.window.set_title("Git repository browser annotation window")
-               self.prev_read = ""
-
-               # Use two thirds of the screen by default
-               screen = self.window.get_screen()
-               monitor = screen.get_monitor_geometry(0)
-               width = int(monitor.width * 0.66)
-               height = int(monitor.height * 0.66)
-               self.window.set_default_size(width, height)
-
-       def add_file_data(self, filename, commit_sha1, line_num):
-               fp = os.popen("git cat-file blob " + commit_sha1 +":"+filename)
-               i = 1;
-               for line in fp.readlines():
-                       line = string.rstrip(line)
-                       self.model.append(None, ["HEAD", filename, line, i])
-                       i = i+1
-               fp.close()
-
-               # now set the cursor position
-               self.treeview.set_cursor(line_num-1)
-               self.treeview.grab_focus()
-
-       def _treeview_cursor_cb(self, *args):
-               """Callback for when the treeview cursor changes."""
-               (path, col) = self.treeview.get_cursor()
-               commit_sha1 = self.model[path][0]
-               commit_msg = ""
-               fp = os.popen("git cat-file commit " + commit_sha1)
-               for line in fp.readlines():
-                       commit_msg =  commit_msg + line
-               fp.close()
-
-               self.commit_buffer.set_text(commit_msg)
-
-       def _treeview_row_activated(self, *args):
-               """Callback for when the treeview row gets selected."""
-               (path, col) = self.treeview.get_cursor()
-               commit_sha1 = self.model[path][0]
-               filename    = self.model[path][1]
-               line_num    = self.model[path][3]
-
-               window = AnnotateWindow();
-               fp = os.popen("git rev-parse "+ commit_sha1 + "~1")
-               commit_sha1 = string.strip(fp.readline())
-               fp.close()
-               window.annotate(filename, commit_sha1, line_num)
-
-       def data_ready(self, source, condition):
-               while (1):
-                       try :
-                               # A simple readline doesn't work
-                               # a readline bug ??
-                               buffer = source.read(100)
-
-                       except:
-                               # resource temporary not available
-                               return True
-
-                       if (len(buffer) == 0):
-                               gobject.source_remove(self.io_watch_tag)
-                               source.close()
-                               return False
-
-                       if (self.prev_read != ""):
-                               buffer = self.prev_read + buffer
-                               self.prev_read = ""
-
-                       if (buffer[len(buffer) -1] != '\n'):
-                               try:
-                                       newline_index = buffer.rindex("\n")
-                               except ValueError:
-                                       newline_index = 0
-
-                               self.prev_read = buffer[newline_index:(len(buffer))]
-                               buffer = buffer[0:newline_index]
-
-                       for buff in buffer.split("\n"):
-                               annotate_line = re.compile('^([0-9a-f]{40}) (.+) (.+) (.+)$')
-                               m = annotate_line.match(buff)
-                               if not m:
-                                       annotate_line = re.compile('^(filename) (.+)$')
-                                       m = annotate_line.match(buff)
-                                       if not m:
-                                               continue
-                                       filename = m.group(2)
-                               else:
-                                       self.commit_sha1 = m.group(1)
-                                       self.source_line = int(m.group(2))
-                                       self.result_line = int(m.group(3))
-                                       self.count          = int(m.group(4))
-                                       #set the details only when we have the file name
-                                       continue
-
-                               while (self.count > 0):
-                                       # set at result_line + count-1 the sha1 as commit_sha1
-                                       self.count = self.count - 1
-                                       iter = self.model.iter_nth_child(None, self.result_line + self.count-1)
-                                       self.model.set(iter, 0, self.commit_sha1, 1, filename, 3, self.source_line)
-
-
-       def annotate(self, filename, commit_sha1, line_num):
-               # verify the commit_sha1 specified has this filename
-
-               fp = os.popen("git ls-tree "+ commit_sha1 + " -- " + filename)
-               line = string.strip(fp.readline())
-               if line == '':
-                       # pop up the message the file is not there as a part of the commit
-                       fp.close()
-                       dialog = gtk.MessageDialog(parent=None, flags=0,
-                                       type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,
-                                       message_format=None)
-                       dialog.set_markup("The file %s is not present in the parent commit %s" % (filename, commit_sha1))
-                       dialog.run()
-                       dialog.destroy()
-                       return
-
-               fp.close()
-
-               vpan = gtk.VPaned();
-               self.window.add(vpan);
-               vpan.show()
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vpan.pack1(scrollwin, True, True);
-               scrollwin.show()
-
-               self.model = gtk.TreeStore(str, str, str, int)
-               self.treeview = gtk.TreeView(self.model)
-               self.treeview.set_rules_hint(True)
-               self.treeview.set_search_column(0)
-               self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
-               self.treeview.connect("row-activated", self._treeview_row_activated)
-               scrollwin.add(self.treeview)
-               self.treeview.show()
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 10)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Commit")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 0)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 20)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("File Name")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 1)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 20)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Data")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 2)
-               self.treeview.append_column(column)
-
-               # The commit message window
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vpan.pack2(scrollwin, True, True);
-               scrollwin.show()
-
-               commit_text = gtk.TextView()
-               self.commit_buffer = gtk.TextBuffer()
-               commit_text.set_buffer(self.commit_buffer)
-               scrollwin.add(commit_text)
-               commit_text.show()
-
-               self.window.show()
-
-               self.add_file_data(filename, commit_sha1, line_num)
-
-               fp = os.popen("git blame --incremental -C -C -- " + filename + " " + commit_sha1)
-               flags = fcntl.fcntl(fp.fileno(), fcntl.F_GETFL)
-               fcntl.fcntl(fp.fileno(), fcntl.F_SETFL, flags | os.O_NONBLOCK)
-               self.io_watch_tag = gobject.io_add_watch(fp, gobject.IO_IN, self.data_ready)
-
-
-class DiffWindow(object):
-       """Diff window.
-       This object represents and manages a single window containing the
-       differences between two revisions on a branch.
-       """
-
-       def __init__(self):
-               self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-               self.window.set_border_width(0)
-               self.window.set_title("Git repository browser diff window")
-
-               # Use two thirds of the screen by default
-               screen = self.window.get_screen()
-               monitor = screen.get_monitor_geometry(0)
-               width = int(monitor.width * 0.66)
-               height = int(monitor.height * 0.66)
-               self.window.set_default_size(width, height)
-
-
-               self.construct()
-
-       def construct(self):
-               """Construct the window contents."""
-               vbox = gtk.VBox()
-               self.window.add(vbox)
-               vbox.show()
-
-               menu_bar = gtk.MenuBar()
-               save_menu = gtk.ImageMenuItem(gtk.STOCK_SAVE)
-               save_menu.connect("activate", self.save_menu_response, "save")
-               save_menu.show()
-               menu_bar.append(save_menu)
-               vbox.pack_start(menu_bar, expand=False, fill=True)
-               menu_bar.show()
-
-               hpan = gtk.HPaned()
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               hpan.pack1(scrollwin, True, True)
-               scrollwin.show()
-
-               (self.buffer, sourceview) = get_source_buffer_and_view()
-
-               sourceview.set_editable(False)
-               sourceview.modify_font(pango.FontDescription("Monospace"))
-               scrollwin.add(sourceview)
-               sourceview.show()
-
-               # The file hierarchy: a scrollable treeview
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               scrollwin.set_size_request(20, -1)
-               hpan.pack2(scrollwin, True, True)
-               scrollwin.show()
-
-               self.model = gtk.TreeStore(str, str, str)
-               self.treeview = gtk.TreeView(self.model)
-               self.treeview.set_search_column(1)
-               self.treeview.connect("cursor-changed", self._treeview_clicked)
-               scrollwin.add(self.treeview)
-               self.treeview.show()
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 20)
-               column = gtk.TreeViewColumn("Select to annotate")
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 0)
-               self.treeview.append_column(column)
-
-               vbox.pack_start(hpan, expand=True, fill=True)
-               hpan.show()
-
-       def _treeview_clicked(self, *args):
-               """Callback for when the treeview cursor changes."""
-               (path, col) = self.treeview.get_cursor()
-               specific_file = self.model[path][1]
-               commit_sha1 =  self.model[path][2]
-               if specific_file ==  None :
-                       return
-               elif specific_file ==  "" :
-                       specific_file =  None
-
-               window = AnnotateWindow();
-               window.annotate(specific_file, commit_sha1, 1)
-
-
-       def commit_files(self, commit_sha1, parent_sha1):
-               self.model.clear()
-               add  = self.model.append(None, [ "Added", None, None])
-               dele = self.model.append(None, [ "Deleted", None, None])
-               mod  = self.model.append(None, [ "Modified", None, None])
-               diff_tree = re.compile('^(:.{6}) (.{6}) (.{40}) (.{40}) (A|D|M)\s(.+)$')
-               fp = os.popen("git diff-tree -r --no-commit-id " + parent_sha1 + " " + commit_sha1)
-               while 1:
-                       line = string.strip(fp.readline())
-                       if line == '':
-                               break
-                       m = diff_tree.match(line)
-                       if not m:
-                               continue
-
-                       attr = m.group(5)
-                       filename = m.group(6)
-                       if attr == "A":
-                               self.model.append(add,  [filename, filename, commit_sha1])
-                       elif attr == "D":
-                               self.model.append(dele, [filename, filename, commit_sha1])
-                       elif attr == "M":
-                               self.model.append(mod,  [filename, filename, commit_sha1])
-               fp.close()
-
-               self.treeview.expand_all()
-
-       def set_diff(self, commit_sha1, parent_sha1, encoding):
-               """Set the differences showed by this window.
-               Compares the two trees and populates the window with the
-               differences.
-               """
-               # Diff with the first commit or the last commit shows nothing
-               if (commit_sha1 == 0 or parent_sha1 == 0 ):
-                       return
-
-               fp = os.popen("git diff-tree -p " + parent_sha1 + " " + commit_sha1)
-               self.buffer.set_text(unicode(fp.read(), encoding).encode('utf-8'))
-               fp.close()
-               self.commit_files(commit_sha1, parent_sha1)
-               self.window.show()
-
-       def save_menu_response(self, widget, string):
-               dialog = gtk.FileChooserDialog("Save..", None, gtk.FILE_CHOOSER_ACTION_SAVE,
-                               (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                       gtk.STOCK_SAVE, gtk.RESPONSE_OK))
-               dialog.set_default_response(gtk.RESPONSE_OK)
-               response = dialog.run()
-               if response == gtk.RESPONSE_OK:
-                       patch_buffer = self.buffer.get_text(self.buffer.get_start_iter(),
-                                       self.buffer.get_end_iter())
-                       fp = open(dialog.get_filename(), "w")
-                       fp.write(patch_buffer)
-                       fp.close()
-               dialog.destroy()
-
-class GitView(object):
-       """ This is the main class
-       """
-       version = "0.9"
-
-       def __init__(self, with_diff=0):
-               self.with_diff = with_diff
-               self.window =   gtk.Window(gtk.WINDOW_TOPLEVEL)
-               self.window.set_border_width(0)
-               self.window.set_title("Git repository browser")
-
-               self.get_encoding()
-               self.get_bt_sha1()
-
-               # Use three-quarters of the screen by default
-               screen = self.window.get_screen()
-               monitor = screen.get_monitor_geometry(0)
-               width = int(monitor.width * 0.75)
-               height = int(monitor.height * 0.75)
-               self.window.set_default_size(width, height)
-
-               # FIXME AndyFitz!
-               icon = self.window.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
-               self.window.set_icon(icon)
-
-               self.accel_group = gtk.AccelGroup()
-               self.window.add_accel_group(self.accel_group)
-               self.accel_group.connect_group(0xffc2, 0, gtk.ACCEL_LOCKED, self.refresh);
-               self.accel_group.connect_group(0xffc1, 0, gtk.ACCEL_LOCKED, self.maximize);
-               self.accel_group.connect_group(0xffc8, 0, gtk.ACCEL_LOCKED, self.fullscreen);
-               self.accel_group.connect_group(0xffc9, 0, gtk.ACCEL_LOCKED, self.unfullscreen);
-
-               self.window.add(self.construct())
-
-       def refresh(self, widget, event=None, *arguments, **keywords):
-               self.get_encoding()
-               self.get_bt_sha1()
-               Commit.children_sha1 = {}
-               self.set_branch(sys.argv[without_diff:])
-               self.window.show()
-               return True
-
-       def maximize(self, widget, event=None, *arguments, **keywords):
-               self.window.maximize()
-               return True
-
-       def fullscreen(self, widget, event=None, *arguments, **keywords):
-               self.window.fullscreen()
-               return True
-
-       def unfullscreen(self, widget, event=None, *arguments, **keywords):
-               self.window.unfullscreen()
-               return True
-
-       def get_bt_sha1(self):
-               """ Update the bt_sha1 dictionary with the
-               respective sha1 details """
-
-               self.bt_sha1 = { }
-               ls_remote = re.compile('^(.{40})\trefs/([^^]+)(?:\\^(..))?$');
-               fp = os.popen('git ls-remote "${GIT_DIR-.git}"')
-               while 1:
-                       line = string.strip(fp.readline())
-                       if line == '':
-                               break
-                       m = ls_remote.match(line)
-                       if not m:
-                               continue
-                       (sha1, name) = (m.group(1), m.group(2))
-                       if not self.bt_sha1.has_key(sha1):
-                               self.bt_sha1[sha1] = []
-                       self.bt_sha1[sha1].append(name)
-               fp.close()
-
-       def get_encoding(self):
-               fp = os.popen("git config --get i18n.commitencoding")
-               self.encoding=string.strip(fp.readline())
-               fp.close()
-               if (self.encoding == ""):
-                       self.encoding = "utf-8"
-
-
-       def construct(self):
-               """Construct the window contents."""
-               vbox = gtk.VBox()
-               paned = gtk.VPaned()
-               paned.pack1(self.construct_top(), resize=False, shrink=True)
-               paned.pack2(self.construct_bottom(), resize=False, shrink=True)
-               menu_bar = gtk.MenuBar()
-               menu_bar.set_pack_direction(gtk.PACK_DIRECTION_RTL)
-               help_menu = gtk.MenuItem("Help")
-               menu = gtk.Menu()
-               about_menu = gtk.MenuItem("About")
-               menu.append(about_menu)
-               about_menu.connect("activate", self.about_menu_response, "about")
-               about_menu.show()
-               help_menu.set_submenu(menu)
-               help_menu.show()
-               menu_bar.append(help_menu)
-               menu_bar.show()
-               vbox.pack_start(menu_bar, expand=False, fill=True)
-               vbox.pack_start(paned, expand=True, fill=True)
-               paned.show()
-               vbox.show()
-               return vbox
-
-
-       def construct_top(self):
-               """Construct the top-half of the window."""
-               vbox = gtk.VBox(spacing=6)
-               vbox.set_border_width(12)
-               vbox.show()
-
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vbox.pack_start(scrollwin, expand=True, fill=True)
-               scrollwin.show()
-
-               self.treeview = gtk.TreeView()
-               self.treeview.set_rules_hint(True)
-               self.treeview.set_search_column(4)
-               self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
-               scrollwin.add(self.treeview)
-               self.treeview.show()
-
-               cell = CellRendererGraph()
-               column = gtk.TreeViewColumn()
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "node", 1)
-               column.add_attribute(cell, "in-lines", 2)
-               column.add_attribute(cell, "out-lines", 3)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 65)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Message")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 4)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("width-chars", 40)
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Author")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 5)
-               self.treeview.append_column(column)
-
-               cell = gtk.CellRendererText()
-               cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-               column = gtk.TreeViewColumn("Date")
-               column.set_resizable(True)
-               column.pack_start(cell, expand=True)
-               column.add_attribute(cell, "text", 6)
-               self.treeview.append_column(column)
-
-               return vbox
-
-       def about_menu_response(self, widget, string):
-               dialog = gtk.AboutDialog()
-               dialog.set_name("Gitview")
-               dialog.set_version(GitView.version)
-               dialog.set_authors(["Aneesh Kumar K.V <aneesh.kumar@gmail.com>"])
-               dialog.set_website("http://www.kernel.org/pub/software/scm/git/")
-               dialog.set_copyright("Use and distribute under the terms of the GNU General Public License")
-               dialog.set_wrap_license(True)
-               dialog.run()
-               dialog.destroy()
-
-
-       def construct_bottom(self):
-               """Construct the bottom half of the window."""
-               vbox = gtk.VBox(False, spacing=6)
-               vbox.set_border_width(12)
-               (width, height) = self.window.get_size()
-               vbox.set_size_request(width, int(height / 2.5))
-               vbox.show()
-
-               self.table = gtk.Table(rows=4, columns=4)
-               self.table.set_row_spacings(6)
-               self.table.set_col_spacings(6)
-               vbox.pack_start(self.table, expand=False, fill=True)
-               self.table.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Revision:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               self.revid_label = gtk.Label()
-               self.revid_label.set_selectable(True)
-               align.add(self.revid_label)
-               self.table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
-               self.revid_label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Committer:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               self.committer_label = gtk.Label()
-               self.committer_label.set_selectable(True)
-               align.add(self.committer_label)
-               self.table.attach(align, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
-               self.committer_label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Timestamp:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               self.timestamp_label = gtk.Label()
-               self.timestamp_label.set_selectable(True)
-               align.add(self.timestamp_label)
-               self.table.attach(align, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
-               self.timestamp_label.show()
-               align.show()
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Parents:</b>")
-               align.add(label)
-               self.table.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-               self.parents_widgets = []
-
-               align = gtk.Alignment(0.0, 0.5)
-               label = gtk.Label()
-               label.set_markup("<b>Children:</b>")
-               align.add(label)
-               self.table.attach(align, 2, 3, 3, 4, gtk.FILL, gtk.FILL)
-               label.show()
-               align.show()
-               self.children_widgets = []
-
-               scrollwin = gtk.ScrolledWindow()
-               scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-               scrollwin.set_shadow_type(gtk.SHADOW_IN)
-               vbox.pack_start(scrollwin, expand=True, fill=True)
-               scrollwin.show()
-
-               (self.message_buffer, sourceview) = get_source_buffer_and_view()
-
-               sourceview.set_editable(False)
-               sourceview.modify_font(pango.FontDescription("Monospace"))
-               scrollwin.add(sourceview)
-               sourceview.show()
-
-               return vbox
-
-       def _treeview_cursor_cb(self, *args):
-               """Callback for when the treeview cursor changes."""
-               (path, col) = self.treeview.get_cursor()
-               commit = self.model[path][0]
-
-               if commit.committer is not None:
-                       committer = commit.committer
-                       timestamp = commit.commit_date
-                       message   =  commit.get_message(self.with_diff)
-                       revid_label = commit.commit_sha1
-               else:
-                       committer = ""
-                       timestamp = ""
-                       message = ""
-                       revid_label = ""
-
-               self.revid_label.set_text(revid_label)
-               self.committer_label.set_text(committer)
-               self.timestamp_label.set_text(timestamp)
-               self.message_buffer.set_text(unicode(message, self.encoding).encode('utf-8'))
-
-               for widget in self.parents_widgets:
-                       self.table.remove(widget)
-
-               self.parents_widgets = []
-               self.table.resize(4 + len(commit.parent_sha1) - 1, 4)
-               for idx, parent_id in enumerate(commit.parent_sha1):
-                       self.table.set_row_spacing(idx + 3, 0)
-
-                       align = gtk.Alignment(0.0, 0.0)
-                       self.parents_widgets.append(align)
-                       self.table.attach(align, 1, 2, idx + 3, idx + 4,
-                                       gtk.EXPAND | gtk.FILL, gtk.FILL)
-                       align.show()
-
-                       hbox = gtk.HBox(False, 0)
-                       align.add(hbox)
-                       hbox.show()
-
-                       label = gtk.Label(parent_id)
-                       label.set_selectable(True)
-                       hbox.pack_start(label, expand=False, fill=True)
-                       label.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.connect("clicked", self._go_clicked_cb, parent_id)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.set_sensitive(True)
-                       button.connect("clicked", self._show_clicked_cb,
-                                       commit.commit_sha1, parent_id, self.encoding)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-               # Populate with child details
-               for widget in self.children_widgets:
-                       self.table.remove(widget)
-
-               self.children_widgets = []
-               try:
-                       child_sha1 = Commit.children_sha1[commit.commit_sha1]
-               except KeyError:
-                       # We don't have child
-                       child_sha1 = [ 0 ]
-
-               if ( len(child_sha1) > len(commit.parent_sha1)):
-                       self.table.resize(4 + len(child_sha1) - 1, 4)
-
-               for idx, child_id in enumerate(child_sha1):
-                       self.table.set_row_spacing(idx + 3, 0)
-
-                       align = gtk.Alignment(0.0, 0.0)
-                       self.children_widgets.append(align)
-                       self.table.attach(align, 3, 4, idx + 3, idx + 4,
-                                       gtk.EXPAND | gtk.FILL, gtk.FILL)
-                       align.show()
-
-                       hbox = gtk.HBox(False, 0)
-                       align.add(hbox)
-                       hbox.show()
-
-                       label = gtk.Label(child_id)
-                       label.set_selectable(True)
-                       hbox.pack_start(label, expand=False, fill=True)
-                       label.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.connect("clicked", self._go_clicked_cb, child_id)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-                       image = gtk.Image()
-                       image.set_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU)
-                       image.show()
-
-                       button = gtk.Button()
-                       button.add(image)
-                       button.set_relief(gtk.RELIEF_NONE)
-                       button.set_sensitive(True)
-                       button.connect("clicked", self._show_clicked_cb,
-                                       child_id, commit.commit_sha1, self.encoding)
-                       hbox.pack_start(button, expand=False, fill=True)
-                       button.show()
-
-       def _destroy_cb(self, widget):
-               """Callback for when a window we manage is destroyed."""
-               self.quit()
-
-
-       def quit(self):
-               """Stop the GTK+ main loop."""
-               gtk.main_quit()
-
-       def run(self, args):
-               self.set_branch(args)
-               self.window.connect("destroy", self._destroy_cb)
-               self.window.show()
-               gtk.main()
-
-       def set_branch(self, args):
-               """Fill in different windows with info from the reposiroty"""
-               fp = os.popen("git rev-parse --sq --default HEAD " + list_to_string(args, 1))
-               git_rev_list_cmd = fp.read()
-               fp.close()
-               fp = os.popen("git rev-list  --header --topo-order --parents " + git_rev_list_cmd)
-               self.update_window(fp)
-
-       def update_window(self, fp):
-               commit_lines = []
-
-               self.model = gtk.ListStore(gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT,
-                               gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, str, str, str)
-
-               # used for cursor positioning
-               self.index = {}
-
-               self.colours = {}
-               self.nodepos = {}
-               self.incomplete_line = {}
-               self.commits = []
-
-               index = 0
-               last_colour = 0
-               last_nodepos = -1
-               out_line = []
-               input_line = fp.readline()
-               while (input_line != ""):
-                       # The commit header ends with '\0'
-                       # This NULL is immediately followed by the sha1 of the
-                       # next commit
-                       if (input_line[0] != '\0'):
-                               commit_lines.append(input_line)
-                               input_line = fp.readline()
-                               continue;
-
-                       commit = Commit(commit_lines)
-                       if (commit != None ):
-                               self.commits.append(commit)
-
-                       # Skip the '\0
-                       commit_lines = []
-                       commit_lines.append(input_line[1:])
-                       input_line = fp.readline()
-
-               fp.close()
-
-               for commit in self.commits:
-                       (out_line, last_colour, last_nodepos) = self.draw_graph(commit,
-                                                                               index, out_line,
-                                                                               last_colour,
-                                                                               last_nodepos)
-                       self.index[commit.commit_sha1] = index
-                       index += 1
-
-               self.treeview.set_model(self.model)
-               self.treeview.show()
-
-       def draw_graph(self, commit, index, out_line, last_colour, last_nodepos):
-               in_line=[]
-
-               #   |   -> outline
-               #   X
-               #   |\  <- inline
-
-               # Reset nodepostion
-               if (last_nodepos > 5):
-                       last_nodepos = -1
-
-               # Add the incomplete lines of the last cell in this
-               try:
-                       colour = self.colours[commit.commit_sha1]
-               except KeyError:
-                       self.colours[commit.commit_sha1] = last_colour+1
-                       last_colour = self.colours[commit.commit_sha1]
-                       colour =   self.colours[commit.commit_sha1]
-
-               try:
-                       node_pos = self.nodepos[commit.commit_sha1]
-               except KeyError:
-                       self.nodepos[commit.commit_sha1] = last_nodepos+1
-                       last_nodepos = self.nodepos[commit.commit_sha1]
-                       node_pos =  self.nodepos[commit.commit_sha1]
-
-               #The first parent always continue on the same line
-               try:
-                       # check we already have the value
-                       tmp_node_pos = self.nodepos[commit.parent_sha1[0]]
-               except KeyError:
-                       self.colours[commit.parent_sha1[0]] = colour
-                       self.nodepos[commit.parent_sha1[0]] = node_pos
-
-               for sha1 in self.incomplete_line.keys():
-                       if (sha1 != commit.commit_sha1):
-                               self.draw_incomplete_line(sha1, node_pos,
-                                               out_line, in_line, index)
-                       else:
-                               del self.incomplete_line[sha1]
-
-
-               for parent_id in commit.parent_sha1:
-                       try:
-                               tmp_node_pos = self.nodepos[parent_id]
-                       except KeyError:
-                               self.colours[parent_id] = last_colour+1
-                               last_colour = self.colours[parent_id]
-                               self.nodepos[parent_id] = last_nodepos+1
-                               last_nodepos = self.nodepos[parent_id]
-
-                       in_line.append((node_pos, self.nodepos[parent_id],
-                                               self.colours[parent_id]))
-                       self.add_incomplete_line(parent_id)
-
-               try:
-                       branch_tag = self.bt_sha1[commit.commit_sha1]
-               except KeyError:
-                       branch_tag = [ ]
-
-
-               node = (node_pos, colour, branch_tag)
-
-               self.model.append([commit, node, out_line, in_line,
-                               commit.message, commit.author, commit.date])
-
-               return (in_line, last_colour, last_nodepos)
-
-       def add_incomplete_line(self, sha1):
-               try:
-                       self.incomplete_line[sha1].append(self.nodepos[sha1])
-               except KeyError:
-                       self.incomplete_line[sha1] = [self.nodepos[sha1]]
-
-       def draw_incomplete_line(self, sha1, node_pos, out_line, in_line, index):
-               for idx, pos in enumerate(self.incomplete_line[sha1]):
-                       if(pos == node_pos):
-                               #remove the straight line and add a slash
-                               if ((pos, pos, self.colours[sha1]) in out_line):
-                                       out_line.remove((pos, pos, self.colours[sha1]))
-                               out_line.append((pos, pos+0.5, self.colours[sha1]))
-                               self.incomplete_line[sha1][idx] = pos = pos+0.5
-                       try:
-                               next_commit = self.commits[index+1]
-                               if (next_commit.commit_sha1 == sha1 and pos != int(pos)):
-                               # join the line back to the node point
-                               # This need to be done only if we modified it
-                                       in_line.append((pos, pos-0.5, self.colours[sha1]))
-                                       continue;
-                       except IndexError:
-                               pass
-                       in_line.append((pos, pos, self.colours[sha1]))
-
-
-       def _go_clicked_cb(self, widget, revid):
-               """Callback for when the go button for a parent is clicked."""
-               try:
-                       self.treeview.set_cursor(self.index[revid])
-               except KeyError:
-                       dialog = gtk.MessageDialog(parent=None, flags=0,
-                                       type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,
-                                       message_format=None)
-                       dialog.set_markup("Revision <b>%s</b> not present in the list" % revid)
-                       # revid == 0 is the parent of the first commit
-                       if (revid != 0 ):
-                               dialog.format_secondary_text("Try running gitview without any options")
-                       dialog.run()
-                       dialog.destroy()
-
-               self.treeview.grab_focus()
-
-       def _show_clicked_cb(self, widget,  commit_sha1, parent_sha1, encoding):
-               """Callback for when the show button for a parent is clicked."""
-               window = DiffWindow()
-               window.set_diff(commit_sha1, parent_sha1, encoding)
-               self.treeview.grab_focus()
-
-without_diff = 0
-if __name__ == "__main__":
-
-       if (len(sys.argv) > 1 ):
-               if (sys.argv[1] == "--without-diff"):
-                       without_diff = 1
-
-       view = GitView( without_diff != 1)
-       view.run(sys.argv[without_diff:])
diff --git a/contrib/gitview/gitview.txt b/contrib/gitview/gitview.txt
deleted file mode 100644 (file)
index 7b5f900..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-gitview(1)
-==========
-
-NAME
-----
-gitview - A GTK based repository browser for git
-
-SYNOPSIS
---------
-[verse]
-'gitview' [options] [args]
-
-DESCRIPTION
----------
-
-Dependencies:
-
-* Python 2.4
-* PyGTK 2.8 or later
-* PyCairo 1.0 or later
-
-OPTIONS
--------
---without-diff::
-
-       If the user doesn't want to list the commit diffs in the main window.
-       This may speed up the repository browsing.
-
-<args>::
-
-       All the valid option for linkgit:git-rev-list[1].
-
-Key Bindings
-------------
-F4::
-       To maximize the window
-
-F5::
-       To reread references.
-
-F11::
-       Full screen
-
-F12::
-       Leave full screen
-
-EXAMPLES
---------
-
-gitview v2.6.12.. include/scsi drivers/scsi::
-
-       Show as the changes since version v2.6.12 that changed any file in the
-       include/scsi or drivers/scsi subdirectories
-
-gitview --since=2.weeks.ago::
-
-       Show the changes during the last two weeks
diff --git a/contrib/long-running-filter/example.pl b/contrib/long-running-filter/example.pl
new file mode 100755 (executable)
index 0000000..a677569
--- /dev/null
@@ -0,0 +1,132 @@
+#!/usr/bin/perl
+#
+# Example implementation for the Git filter protocol version 2
+# See Documentation/gitattributes.txt, section "Filter Protocol"
+#
+# Please note, this pass-thru filter is a minimal skeleton. No proper
+# error handling was implemented.
+#
+
+use strict;
+use warnings;
+
+my $MAX_PACKET_CONTENT_SIZE = 65516;
+
+sub packet_bin_read {
+       my $buffer;
+       my $bytes_read = read STDIN, $buffer, 4;
+       if ( $bytes_read == 0 ) {
+
+               # EOF - Git stopped talking to us!
+               exit();
+       }
+       elsif ( $bytes_read != 4 ) {
+               die "invalid packet: '$buffer'";
+       }
+       my $pkt_size = hex($buffer);
+       if ( $pkt_size == 0 ) {
+               return ( 1, "" );
+       }
+       elsif ( $pkt_size > 4 ) {
+               my $content_size = $pkt_size - 4;
+               $bytes_read = read STDIN, $buffer, $content_size;
+               if ( $bytes_read != $content_size ) {
+                       die "invalid packet ($content_size bytes expected; $bytes_read bytes read)";
+               }
+               return ( 0, $buffer );
+       }
+       else {
+               die "invalid packet size: $pkt_size";
+       }
+}
+
+sub packet_txt_read {
+       my ( $res, $buf ) = packet_bin_read();
+       unless ( $buf =~ s/\n$// ) {
+               die "A non-binary line MUST be terminated by an LF.";
+       }
+       return ( $res, $buf );
+}
+
+sub packet_bin_write {
+       my $buf = shift;
+       print STDOUT sprintf( "%04x", length($buf) + 4 );
+       print STDOUT $buf;
+       STDOUT->flush();
+}
+
+sub packet_txt_write {
+       packet_bin_write( $_[0] . "\n" );
+}
+
+sub packet_flush {
+       print STDOUT sprintf( "%04x", 0 );
+       STDOUT->flush();
+}
+
+( packet_txt_read() eq ( 0, "git-filter-client" ) ) || die "bad initialize";
+( packet_txt_read() eq ( 0, "version=2" ) )         || die "bad version";
+( packet_bin_read() eq ( 1, "" ) )                  || die "bad version end";
+
+packet_txt_write("git-filter-server");
+packet_txt_write("version=2");
+packet_flush();
+
+( packet_txt_read() eq ( 0, "capability=clean" ) )  || die "bad capability";
+( packet_txt_read() eq ( 0, "capability=smudge" ) ) || die "bad capability";
+( packet_bin_read() eq ( 1, "" ) )                  || die "bad capability end";
+
+packet_txt_write("capability=clean");
+packet_txt_write("capability=smudge");
+packet_flush();
+
+while (1) {
+       my ($command)  = packet_txt_read() =~ /^command=(.+)$/;
+       my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
+
+       if ( $pathname eq "" ) {
+               die "bad pathname '$pathname'";
+       }
+
+       packet_bin_read();
+
+       my $input = "";
+       {
+               binmode(STDIN);
+               my $buffer;
+               my $done = 0;
+               while ( !$done ) {
+                       ( $done, $buffer ) = packet_bin_read();
+                       $input .= $buffer;
+               }
+       }
+
+       my $output;
+       if ( $command eq "clean" ) {
+               ### Perform clean here ###
+               $output = $input;
+       }
+       elsif ( $command eq "smudge" ) {
+               ### Perform smudge here ###
+               $output = $input;
+       }
+       else {
+               die "bad command '$command'";
+       }
+
+       packet_txt_write("status=success");
+       packet_flush();
+       while ( length($output) > 0 ) {
+               my $packet = substr( $output, 0, $MAX_PACKET_CONTENT_SIZE );
+               packet_bin_write($packet);
+               if ( length($output) > $MAX_PACKET_CONTENT_SIZE ) {
+                       $output = substr( $output, $MAX_PACKET_CONTENT_SIZE );
+               }
+               else {
+                       $output = "";
+               }
+       }
+       packet_flush();    # flush content!
+       packet_flush();    # empty list, keep "status=success" unchanged!
+
+}
index f784dd2e66b9373285027dc1c47948231b172f46..7c4cd8d257da0d64098f6b31834280e90f6e4f31 100644 (file)
@@ -35,6 +35,16 @@ to use persistent-https:
 [url "persistent-http"]
        insteadof = http
 
+You may also want to allow the use of the persistent-https helper for
+submodule URLs (since any https URLs pointing to submodules will be
+rewritten, and Git's out-of-the-box defaults forbid submodules from
+using unknown remote helpers):
+
+[protocol "persistent-https"]
+       allow = always
+[protocol "persistent-http"]
+       allow = always
+
 
 #####################################################################
 # BUILDING FROM SOURCE
index 712a1377e208f717b61df44f0b5ea0ba99dc72d1..1c3d87f8619e7fb2432d3e318ad59c3ed84ee9ec 100755 (executable)
@@ -1,13 +1,11 @@
-#!/usr/bin/env python
+#!/bin/sh
 
-import sys
-
-sys.stderr.write('WARNING: git-remote-bzr is now maintained independently.\n')
-sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-bzr\n')
-
-sys.stderr.write('''WARNING:
+cat >&2 <<'EOT'
+WARNING: git-remote-bzr is now maintained independently.
+WARNING: For more information visit https://github.com/felipec/git-remote-bzr
+WARNING:
 WARNING: You can pick a directory on your $PATH and download it, e.g.:
-WARNING:   $ wget -O $HOME/bin/git-remote-bzr \\
+WARNING:   $ wget -O $HOME/bin/git-remote-bzr \
 WARNING:     https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
 WARNING:   $ chmod +x $HOME/bin/git-remote-bzr
-''')
+EOT
index 4255ad6312ec027b65ffd4dfc456bc0ed5dd533f..8e9188364c6f1ae23f3c3c8d86db9e6653a11d1f 100755 (executable)
@@ -1,13 +1,11 @@
-#!/usr/bin/env python
+#!/bin/sh
 
-import sys
-
-sys.stderr.write('WARNING: git-remote-hg is now maintained independently.\n')
-sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-hg\n')
-
-sys.stderr.write('''WARNING:
+cat >&2 <<'EOT'
+WARNING: git-remote-hg is now maintained independently.
+WARNING: For more information visit https://github.com/felipec/git-remote-hg
+WARNING:
 WARNING: You can pick a directory on your $PATH and download it, e.g.:
-WARNING:   $ wget -O $HOME/bin/git-remote-hg \\
+WARNING:   $ wget -O $HOME/bin/git-remote-hg \
 WARNING:     https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
 WARNING:   $ chmod +x $HOME/bin/git-remote-hg
-''')
+EOT
diff --git a/contrib/update-unicode/.gitignore b/contrib/update-unicode/.gitignore
new file mode 100644 (file)
index 0000000..b0ebc6a
--- /dev/null
@@ -0,0 +1,3 @@
+uniset/
+UnicodeData.txt
+EastAsianWidth.txt
diff --git a/contrib/update-unicode/README b/contrib/update-unicode/README
new file mode 100644 (file)
index 0000000..b9e2fc8
--- /dev/null
@@ -0,0 +1,20 @@
+TL;DR: Run update_unicode.sh after the publication of a new Unicode
+standard and commit the resulting unicode_widths.h file.
+
+The long version
+================
+
+The Git source code ships the file unicode_widths.h which contains
+tables of zero and double width Unicode code points, respectively.
+These tables are generated using update_unicode.sh in this directory.
+update_unicode.sh itself uses a third-party tool, uniset, to query two
+Unicode data files for the interesting code points.
+
+On first run, update_unicode.sh clones uniset from Github and builds it.
+This requires a current-ish version of autoconf (2.69 works per December
+2016).
+
+On each run, update_unicode.sh checks whether more recent Unicode data
+files are available from the Unicode consortium, and rebuilds the header
+unicode_widths.h with the new data. The new header can then be
+committed.
diff --git a/contrib/update-unicode/update_unicode.sh b/contrib/update-unicode/update_unicode.sh
new file mode 100755 (executable)
index 0000000..e05db92
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+#See http://www.unicode.org/reports/tr44/
+#
+#Me Enclosing_Mark  an enclosing combining mark
+#Mn Nonspacing_Mark a nonspacing combining mark (zero advance width)
+#Cf Format          a format control character
+#
+cd "$(dirname "$0")"
+UNICODEWIDTH_H=$(git rev-parse --show-toplevel)/unicode_width.h
+
+wget -N http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt \
+       http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt &&
+if ! test -d uniset; then
+       git clone https://github.com/depp/uniset.git &&
+       ( cd uniset && git checkout 4b186196dd )
+fi &&
+(
+       cd uniset &&
+       if ! test -x uniset; then
+               autoreconf -i &&
+               ./configure --enable-warnings=-Werror CFLAGS='-O0 -ggdb'
+       fi &&
+       make
+) &&
+UNICODE_DIR=. && export UNICODE_DIR &&
+cat >$UNICODEWIDTH_H <<-EOF
+static const struct interval zero_width[] = {
+       $(uniset/uniset --32 cat:Me,Mn,Cf + U+1160..U+11FF - U+00AD)
+};
+static const struct interval double_width[] = {
+       $(uniset/uniset --32 eaw:F,W)
+};
+EOF
diff --git a/contrib/workdir/.gitattributes b/contrib/workdir/.gitattributes
new file mode 100644 (file)
index 0000000..1f78c5d
--- /dev/null
@@ -0,0 +1 @@
+/git-new-workdir eol=lf
index 077f5e601e3283b7b2566bff791290209be4694e..8d652bf27c9444d3696c4b942dc85f062e2bf53e 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -3,6 +3,7 @@
 #include "run-command.h"
 #include "quote.h"
 #include "sigchain.h"
+#include "pkt-line.h"
 
 /*
  * convert.c - convert a file when checking it out and checking it in.
@@ -197,17 +198,21 @@ static void check_safe_crlf(const char *path, enum crlf_action crlf_action,
                 * CRLFs would not be restored by checkout
                 */
                if (checksafe == SAFE_CRLF_WARN)
-                       warning("CRLF will be replaced by LF in %s.\nThe file will have its original line endings in your working directory.", path);
+                       warning(_("CRLF will be replaced by LF in %s.\n"
+                                 "The file will have its original line"
+                                 " endings in your working directory."), path);
                else /* i.e. SAFE_CRLF_FAIL */
-                       die("CRLF would be replaced by LF in %s.", path);
+                       die(_("CRLF would be replaced by LF in %s."), path);
        } else if (old_stats->lonelf && !new_stats->lonelf ) {
                /*
                 * CRLFs would be added by checkout
                 */
                if (checksafe == SAFE_CRLF_WARN)
-                       warning("LF will be replaced by CRLF in %s.\nThe file will have its original line endings in your working directory.", path);
+                       warning(_("LF will be replaced by CRLF in %s.\n"
+                                 "The file will have its original line"
+                                 " endings in your working directory."), path);
                else /* i.e. SAFE_CRLF_FAIL */
-                       die("LF would be replaced by CRLF in %s", path);
+                       die(_("LF would be replaced by CRLF in %s"), path);
        }
 }
 
@@ -274,15 +279,16 @@ static int crlf_to_git(const char *path, const char *src, size_t len,
                if (convert_is_binary(len, &stats))
                        return 0;
                /*
-                * If the file in the index has any CR in it, do not convert.
-                * This is the new safer autocrlf handling.
+                * If the file in the index has any CR in it, do not
+                * convert.  This is the new safer autocrlf handling,
+                * unless we want to renormalize in a merge or
+                * cherry-pick.
                 */
-               if (checksafe == SAFE_CRLF_RENORMALIZE)
-                       checksafe = SAFE_CRLF_FALSE;
-               else if (has_cr_in_index(path))
+               if ((checksafe != SAFE_CRLF_RENORMALIZE) && has_cr_in_index(path))
                        convert_crlf_into_lf = 0;
        }
-       if (checksafe && len) {
+       if ((checksafe == SAFE_CRLF_WARN ||
+           (checksafe == SAFE_CRLF_FAIL)) && len) {
                struct text_stat new_stats;
                memcpy(&new_stats, &stats, sizeof(new_stats));
                /* simulate "git add" */
@@ -412,7 +418,7 @@ static int filter_buffer_or_fd(int in, int out, void *data)
        child_process.out = out;
 
        if (start_command(&child_process))
-               return error("cannot fork to run external filter %s", params->cmd);
+               return error("cannot fork to run external filter '%s'", params->cmd);
 
        sigchain_push(SIGPIPE, SIG_IGN);
 
@@ -430,19 +436,19 @@ static int filter_buffer_or_fd(int in, int out, void *data)
        if (close(child_process.in))
                write_err = 1;
        if (write_err)
-               error("cannot feed the input to external filter %s", params->cmd);
+               error("cannot feed the input to external filter '%s'", params->cmd);
 
        sigchain_pop(SIGPIPE);
 
        status = finish_command(&child_process);
        if (status)
-               error("external filter %s failed %d", params->cmd, status);
+               error("external filter '%s' failed %d", params->cmd, status);
 
        strbuf_release(&cmd);
        return (write_err || status);
 }
 
-static int apply_filter(const char *path, const char *src, size_t len, int fd,
+static int apply_single_file_filter(const char *path, const char *src, size_t len, int fd,
                         struct strbuf *dst, const char *cmd)
 {
        /*
@@ -451,17 +457,11 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd,
         *
         * (child --> cmd) --> us
         */
-       int ret = 1;
+       int err = 0;
        struct strbuf nbuf = STRBUF_INIT;
        struct async async;
        struct filter_params params;
 
-       if (!cmd || !*cmd)
-               return 0;
-
-       if (!dst)
-               return 1;
-
        memset(&async, 0, sizeof(async));
        async.proc = filter_buffer_or_fd;
        async.data = &params;
@@ -477,23 +477,304 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd,
                return 0;       /* error was already reported */
 
        if (strbuf_read(&nbuf, async.out, len) < 0) {
-               error("read from external filter %s failed", cmd);
-               ret = 0;
+               err = error("read from external filter '%s' failed", cmd);
        }
        if (close(async.out)) {
-               error("read from external filter %s failed", cmd);
-               ret = 0;
+               err = error("read from external filter '%s' failed", cmd);
        }
        if (finish_async(&async)) {
-               error("external filter %s failed", cmd);
-               ret = 0;
+               err = error("external filter '%s' failed", cmd);
        }
 
-       if (ret) {
+       if (!err) {
                strbuf_swap(dst, &nbuf);
        }
        strbuf_release(&nbuf);
-       return ret;
+       return !err;
+}
+
+#define CAP_CLEAN    (1u<<0)
+#define CAP_SMUDGE   (1u<<1)
+
+struct cmd2process {
+       struct hashmap_entry ent; /* must be the first member! */
+       unsigned int supported_capabilities;
+       const char *cmd;
+       struct child_process process;
+};
+
+static int cmd_process_map_initialized;
+static struct hashmap cmd_process_map;
+
+static int cmd2process_cmp(const struct cmd2process *e1,
+                          const struct cmd2process *e2,
+                          const void *unused)
+{
+       return strcmp(e1->cmd, e2->cmd);
+}
+
+static struct cmd2process *find_multi_file_filter_entry(struct hashmap *hashmap, const char *cmd)
+{
+       struct cmd2process key;
+       hashmap_entry_init(&key, strhash(cmd));
+       key.cmd = cmd;
+       return hashmap_get(hashmap, &key, NULL);
+}
+
+static int packet_write_list(int fd, const char *line, ...)
+{
+       va_list args;
+       int err;
+       va_start(args, line);
+       for (;;) {
+               if (!line)
+                       break;
+               if (strlen(line) > LARGE_PACKET_DATA_MAX)
+                       return -1;
+               err = packet_write_fmt_gently(fd, "%s\n", line);
+               if (err)
+                       return err;
+               line = va_arg(args, const char*);
+       }
+       va_end(args);
+       return packet_flush_gently(fd);
+}
+
+static void read_multi_file_filter_status(int fd, struct strbuf *status)
+{
+       struct strbuf **pair;
+       char *line;
+       for (;;) {
+               line = packet_read_line(fd, NULL);
+               if (!line)
+                       break;
+               pair = strbuf_split_str(line, '=', 2);
+               if (pair[0] && pair[0]->len && pair[1]) {
+                       /* the last "status=<foo>" line wins */
+                       if (!strcmp(pair[0]->buf, "status=")) {
+                               strbuf_reset(status);
+                               strbuf_addbuf(status, pair[1]);
+                       }
+               }
+               strbuf_list_free(pair);
+       }
+}
+
+static void kill_multi_file_filter(struct hashmap *hashmap, struct cmd2process *entry)
+{
+       if (!entry)
+               return;
+
+       entry->process.clean_on_exit = 0;
+       kill(entry->process.pid, SIGTERM);
+       finish_command(&entry->process);
+
+       hashmap_remove(hashmap, entry, NULL);
+       free(entry);
+}
+
+static void stop_multi_file_filter(struct child_process *process)
+{
+       sigchain_push(SIGPIPE, SIG_IGN);
+       /* Closing the pipe signals the filter to initiate a shutdown. */
+       close(process->in);
+       close(process->out);
+       sigchain_pop(SIGPIPE);
+       /* Finish command will wait until the shutdown is complete. */
+       finish_command(process);
+}
+
+static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd)
+{
+       int err;
+       struct cmd2process *entry;
+       struct child_process *process;
+       const char *argv[] = { cmd, NULL };
+       struct string_list cap_list = STRING_LIST_INIT_NODUP;
+       char *cap_buf;
+       const char *cap_name;
+
+       entry = xmalloc(sizeof(*entry));
+       entry->cmd = cmd;
+       entry->supported_capabilities = 0;
+       process = &entry->process;
+
+       child_process_init(process);
+       process->argv = argv;
+       process->use_shell = 1;
+       process->in = -1;
+       process->out = -1;
+       process->clean_on_exit = 1;
+       process->clean_on_exit_handler = stop_multi_file_filter;
+
+       if (start_command(process)) {
+               error("cannot fork to run external filter '%s'", cmd);
+               return NULL;
+       }
+
+       hashmap_entry_init(entry, strhash(cmd));
+
+       sigchain_push(SIGPIPE, SIG_IGN);
+
+       err = packet_write_list(process->in, "git-filter-client", "version=2", NULL);
+       if (err)
+               goto done;
+
+       err = strcmp(packet_read_line(process->out, NULL), "git-filter-server");
+       if (err) {
+               error("external filter '%s' does not support filter protocol version 2", cmd);
+               goto done;
+       }
+       err = strcmp(packet_read_line(process->out, NULL), "version=2");
+       if (err)
+               goto done;
+       err = packet_read_line(process->out, NULL) != NULL;
+       if (err)
+               goto done;
+
+       err = packet_write_list(process->in, "capability=clean", "capability=smudge", NULL);
+
+       for (;;) {
+               cap_buf = packet_read_line(process->out, NULL);
+               if (!cap_buf)
+                       break;
+               string_list_split_in_place(&cap_list, cap_buf, '=', 1);
+
+               if (cap_list.nr != 2 || strcmp(cap_list.items[0].string, "capability"))
+                       continue;
+
+               cap_name = cap_list.items[1].string;
+               if (!strcmp(cap_name, "clean")) {
+                       entry->supported_capabilities |= CAP_CLEAN;
+               } else if (!strcmp(cap_name, "smudge")) {
+                       entry->supported_capabilities |= CAP_SMUDGE;
+               } else {
+                       warning(
+                               "external filter '%s' requested unsupported filter capability '%s'",
+                               cmd, cap_name
+                       );
+               }
+
+               string_list_clear(&cap_list, 0);
+       }
+
+done:
+       sigchain_pop(SIGPIPE);
+
+       if (err || errno == EPIPE) {
+               error("initialization for external filter '%s' failed", cmd);
+               kill_multi_file_filter(hashmap, entry);
+               return NULL;
+       }
+
+       hashmap_add(hashmap, entry);
+       return entry;
+}
+
+static int apply_multi_file_filter(const char *path, const char *src, size_t len,
+                                  int fd, struct strbuf *dst, const char *cmd,
+                                  const unsigned int wanted_capability)
+{
+       int err;
+       struct cmd2process *entry;
+       struct child_process *process;
+       struct strbuf nbuf = STRBUF_INIT;
+       struct strbuf filter_status = STRBUF_INIT;
+       const char *filter_type;
+
+       if (!cmd_process_map_initialized) {
+               cmd_process_map_initialized = 1;
+               hashmap_init(&cmd_process_map, (hashmap_cmp_fn) cmd2process_cmp, 0);
+               entry = NULL;
+       } else {
+               entry = find_multi_file_filter_entry(&cmd_process_map, cmd);
+       }
+
+       fflush(NULL);
+
+       if (!entry) {
+               entry = start_multi_file_filter(&cmd_process_map, cmd);
+               if (!entry)
+                       return 0;
+       }
+       process = &entry->process;
+
+       if (!(wanted_capability & entry->supported_capabilities))
+               return 0;
+
+       if (CAP_CLEAN & wanted_capability)
+               filter_type = "clean";
+       else if (CAP_SMUDGE & wanted_capability)
+               filter_type = "smudge";
+       else
+               die("unexpected filter type");
+
+       sigchain_push(SIGPIPE, SIG_IGN);
+
+       assert(strlen(filter_type) < LARGE_PACKET_DATA_MAX - strlen("command=\n"));
+       err = packet_write_fmt_gently(process->in, "command=%s\n", filter_type);
+       if (err)
+               goto done;
+
+       err = strlen(path) > LARGE_PACKET_DATA_MAX - strlen("pathname=\n");
+       if (err) {
+               error("path name too long for external filter");
+               goto done;
+       }
+
+       err = packet_write_fmt_gently(process->in, "pathname=%s\n", path);
+       if (err)
+               goto done;
+
+       err = packet_flush_gently(process->in);
+       if (err)
+               goto done;
+
+       if (fd >= 0)
+               err = write_packetized_from_fd(fd, process->in);
+       else
+               err = write_packetized_from_buf(src, len, process->in);
+       if (err)
+               goto done;
+
+       read_multi_file_filter_status(process->out, &filter_status);
+       err = strcmp(filter_status.buf, "success");
+       if (err)
+               goto done;
+
+       err = read_packetized_to_strbuf(process->out, &nbuf) < 0;
+       if (err)
+               goto done;
+
+       read_multi_file_filter_status(process->out, &filter_status);
+       err = strcmp(filter_status.buf, "success");
+
+done:
+       sigchain_pop(SIGPIPE);
+
+       if (err || errno == EPIPE) {
+               if (!strcmp(filter_status.buf, "error")) {
+                       /* The filter signaled a problem with the file. */
+               } else if (!strcmp(filter_status.buf, "abort")) {
+                       /*
+                        * The filter signaled a permanent problem. Don't try to filter
+                        * files with the same command for the lifetime of the current
+                        * Git process.
+                        */
+                        entry->supported_capabilities &= ~wanted_capability;
+               } else {
+                       /*
+                        * Something went wrong with the protocol filter.
+                        * Force shutdown and restart if another blob requires filtering.
+                        */
+                       error("external filter '%s' failed", cmd);
+                       kill_multi_file_filter(&cmd_process_map, entry);
+               }
+       } else {
+               strbuf_swap(dst, &nbuf);
+       }
+       strbuf_release(&nbuf);
+       return !err;
 }
 
 static struct convert_driver {
@@ -501,9 +782,35 @@ static struct convert_driver {
        struct convert_driver *next;
        const char *smudge;
        const char *clean;
+       const char *process;
        int required;
 } *user_convert, **user_convert_tail;
 
+static int apply_filter(const char *path, const char *src, size_t len,
+                       int fd, struct strbuf *dst, struct convert_driver *drv,
+                       const unsigned int wanted_capability)
+{
+       const char *cmd = NULL;
+
+       if (!drv)
+               return 0;
+
+       if (!dst)
+               return 1;
+
+       if ((CAP_CLEAN & wanted_capability) && !drv->process && drv->clean)
+               cmd = drv->clean;
+       else if ((CAP_SMUDGE & wanted_capability) && !drv->process && drv->smudge)
+               cmd = drv->smudge;
+
+       if (cmd && *cmd)
+               return apply_single_file_filter(path, src, len, fd, dst, cmd);
+       else if (drv->process && *drv->process)
+               return apply_multi_file_filter(path, src, len, fd, dst, drv->process, wanted_capability);
+
+       return 0;
+}
+
 static int read_convert_config(const char *var, const char *value, void *cb)
 {
        const char *key, *name;
@@ -541,6 +848,9 @@ static int read_convert_config(const char *var, const char *value, void *cb)
        if (!strcmp("clean", key))
                return git_config_string(&drv->clean, var, value);
 
+       if (!strcmp("process", key))
+               return git_config_string(&drv->process, var, value);
+
        if (!strcmp("required", key)) {
                drv->required = git_config_bool(var, value);
                return 0;
@@ -718,7 +1028,7 @@ static int ident_to_worktree(const char *path, const char *src, size_t len,
        return 1;
 }
 
-static enum crlf_action git_path_check_crlf(struct git_attr_check *check)
+static enum crlf_action git_path_check_crlf(struct attr_check_item *check)
 {
        const char *value = check->value;
 
@@ -735,7 +1045,7 @@ static enum crlf_action git_path_check_crlf(struct git_attr_check *check)
        return CRLF_UNDEFINED;
 }
 
-static enum eol git_path_check_eol(struct git_attr_check *check)
+static enum eol git_path_check_eol(struct attr_check_item *check)
 {
        const char *value = check->value;
 
@@ -748,7 +1058,7 @@ static enum eol git_path_check_eol(struct git_attr_check *check)
        return EOL_UNSET;
 }
 
-static struct convert_driver *git_path_check_convert(struct git_attr_check *check)
+static struct convert_driver *git_path_check_convert(struct attr_check_item *check)
 {
        const char *value = check->value;
        struct convert_driver *drv;
@@ -761,7 +1071,7 @@ static struct convert_driver *git_path_check_convert(struct git_attr_check *chec
        return NULL;
 }
 
-static int git_path_check_ident(struct git_attr_check *check)
+static int git_path_check_ident(struct attr_check_item *check)
 {
        const char *value = check->value;
 
@@ -775,24 +1085,19 @@ struct conv_attrs {
        int ident;
 };
 
-static const char *conv_attr_name[] = {
-       "crlf", "ident", "filter", "eol", "text",
-};
-#define NUM_CONV_ATTRS ARRAY_SIZE(conv_attr_name)
-
 static void convert_attrs(struct conv_attrs *ca, const char *path)
 {
-       int i;
-       static struct git_attr_check ccheck[NUM_CONV_ATTRS];
+       static struct attr_check *check;
 
-       if (!ccheck[0].attr) {
-               for (i = 0; i < NUM_CONV_ATTRS; i++)
-                       ccheck[i].attr = git_attr(conv_attr_name[i]);
+       if (!check) {
+               check = attr_check_initl("crlf", "ident", "filter",
+                                        "eol", "text", NULL);
                user_convert_tail = &user_convert;
                git_config(read_convert_config, NULL);
        }
 
-       if (!git_check_attr(path, NUM_CONV_ATTRS, ccheck)) {
+       if (!git_check_attr(path, check)) {
+               struct attr_check_item *ccheck = check->items;
                ca->crlf_action = git_path_check_crlf(ccheck + 4);
                if (ca->crlf_action == CRLF_UNDEFINED)
                        ca->crlf_action = git_path_check_crlf(ccheck + 0);
@@ -842,7 +1147,7 @@ int would_convert_to_git_filter_fd(const char *path)
        if (!ca.drv->required)
                return 0;
 
-       return apply_filter(path, NULL, 0, -1, NULL, ca.drv->clean);
+       return apply_filter(path, NULL, 0, -1, NULL, ca.drv, CAP_CLEAN);
 }
 
 const char *get_convert_attr_ascii(const char *path)
@@ -875,18 +1180,12 @@ int convert_to_git(const char *path, const char *src, size_t len,
                    struct strbuf *dst, enum safe_crlf checksafe)
 {
        int ret = 0;
-       const char *filter = NULL;
-       int required = 0;
        struct conv_attrs ca;
 
        convert_attrs(&ca, path);
-       if (ca.drv) {
-               filter = ca.drv->clean;
-               required = ca.drv->required;
-       }
 
-       ret |= apply_filter(path, src, len, -1, dst, filter);
-       if (!ret && required)
+       ret |= apply_filter(path, src, len, -1, dst, ca.drv, CAP_CLEAN);
+       if (!ret && ca.drv && ca.drv->required)
                die("%s: clean filter '%s' failed", path, ca.drv->name);
 
        if (ret && dst) {
@@ -908,9 +1207,9 @@ void convert_to_git_filter_fd(const char *path, int fd, struct strbuf *dst,
        convert_attrs(&ca, path);
 
        assert(ca.drv);
-       assert(ca.drv->clean);
+       assert(ca.drv->clean || ca.drv->process);
 
-       if (!apply_filter(path, NULL, 0, fd, dst, ca.drv->clean))
+       if (!apply_filter(path, NULL, 0, fd, dst, ca.drv, CAP_CLEAN))
                die("%s: clean filter '%s' failed", path, ca.drv->name);
 
        crlf_to_git(path, dst->buf, dst->len, dst, ca.crlf_action, checksafe);
@@ -922,15 +1221,9 @@ static int convert_to_working_tree_internal(const char *path, const char *src,
                                            int normalizing)
 {
        int ret = 0, ret_filter = 0;
-       const char *filter = NULL;
-       int required = 0;
        struct conv_attrs ca;
 
        convert_attrs(&ca, path);
-       if (ca.drv) {
-               filter = ca.drv->smudge;
-               required = ca.drv->required;
-       }
 
        ret |= ident_to_worktree(path, src, len, dst, ca.ident);
        if (ret) {
@@ -939,9 +1232,10 @@ static int convert_to_working_tree_internal(const char *path, const char *src,
        }
        /*
         * CRLF conversion can be skipped if normalizing, unless there
-        * is a smudge filter.  The filter might expect CRLFs.
+        * is a smudge or process filter (even if the process filter doesn't
+        * support smudge).  The filters might expect CRLFs.
         */
-       if (filter || !normalizing) {
+       if ((ca.drv && (ca.drv->smudge || ca.drv->process)) || !normalizing) {
                ret |= crlf_to_worktree(path, src, len, dst, ca.crlf_action);
                if (ret) {
                        src = dst->buf;
@@ -949,8 +1243,8 @@ static int convert_to_working_tree_internal(const char *path, const char *src,
                }
        }
 
-       ret_filter = apply_filter(path, src, len, -1, dst, filter);
-       if (!ret_filter && required)
+       ret_filter = apply_filter(path, src, len, -1, dst, ca.drv, CAP_SMUDGE);
+       if (!ret_filter && ca.drv && ca.drv->required)
                die("%s: smudge filter %s failed", path, ca.drv->name);
 
        return ret | ret_filter;
@@ -1402,7 +1696,7 @@ struct stream_filter *get_stream_filter(const char *path, const unsigned char *s
        struct stream_filter *filter = NULL;
 
        convert_attrs(&ca, path);
-       if (ca.drv && (ca.drv->smudge || ca.drv->clean))
+       if (ca.drv && (ca.drv->process || ca.drv->smudge || ca.drv->clean))
                return NULL;
 
        if (ca.crlf_action == CRLF_AUTO || ca.crlf_action == CRLF_AUTO_CRLF)
index 1e5f16a3a1272d4a87478525585951d76307750a..46c5937526a53c3563ea47bfba8195bcf9352c35 100644 (file)
@@ -219,11 +219,11 @@ static void serve_cache(const char *socket_path, int debug)
        close(fd);
 }
 
-static const char permissions_advice[] =
+static const char permissions_advice[] = N_(
 "The permissions on your socket directory are too loose; other\n"
 "users may be able to read your cached credentials. Consider running:\n"
 "\n"
-"      chmod 0700 %s";
+"      chmod 0700 %s");
 static void init_socket_directory(const char *path)
 {
        struct stat st;
@@ -232,7 +232,7 @@ static void init_socket_directory(const char *path)
 
        if (!stat(dir, &st)) {
                if (st.st_mode & 077)
-                       die(permissions_advice, dir);
+                       die(_(permissions_advice), dir);
        } else {
                /*
                 * We must be sure to create the directory with the correct mode,
index cc8a6ee19214b12758fc3d4b39ff4a07f4442d91..91550bfb0b3325ad92a3f3c65d5f779b61fa9951 100644 (file)
@@ -83,6 +83,19 @@ static void do_cache(const char *socket, const char *action, int timeout,
        strbuf_release(&buf);
 }
 
+static char *get_socket_path(void)
+{
+       struct stat sb;
+       char *old_dir, *socket;
+       old_dir = expand_user_path("~/.git-credential-cache", 0);
+       if (old_dir && !stat(old_dir, &sb) && S_ISDIR(sb.st_mode))
+               socket = xstrfmt("%s/socket", old_dir);
+       else
+               socket = xdg_cache_home("credential/socket");
+       free(old_dir);
+       return socket;
+}
+
 int cmd_main(int argc, const char **argv)
 {
        char *socket_path = NULL;
@@ -106,7 +119,7 @@ int cmd_main(int argc, const char **argv)
        op = argv[0];
 
        if (!socket_path)
-               socket_path = expand_user_path("~/.git-credential-cache/socket");
+               socket_path = get_socket_path();
        if (!socket_path)
                die("unable to find a suitable socket path; use --socket");
 
index 55ca1b1334319924dcbbf69ec39b2335e6a452aa..ac295420dd0d03d1b31922f9b7c16a83e987e6a3 100644 (file)
@@ -168,7 +168,7 @@ int cmd_main(int argc, const char **argv)
        if (file) {
                string_list_append(&fns, file);
        } else {
-               if ((file = expand_user_path("~/.git-credentials")))
+               if ((file = expand_user_path("~/.git-credentials", 0)))
                        string_list_append_nodup(&fns, file);
                file = xdg_config_home("credentials");
                if (file)
index ff0fa583b0497d886c54ff93d97cc45fd909e7a5..ac7181a4832672ef1e599324a15868d1b06f8fc0 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -4,10 +4,6 @@
 #include "strbuf.h"
 #include "string-list.h"
 
-#ifndef HOST_NAME_MAX
-#define HOST_NAME_MAX 256
-#endif
-
 #ifdef NO_INITGROUPS
 #define initgroups(x, y) (0) /* nothing */
 #endif
@@ -298,7 +294,7 @@ static int daemon_error(const char *dir, const char *msg)
 {
        if (!informative_errors)
                msg = "access denied or repository not exported";
-       packet_write(1, "ERR %s: %s", msg, dir);
+       packet_write_fmt(1, "ERR %s: %s", msg, dir);
        return -1;
 }
 
@@ -449,46 +445,42 @@ static void copy_to_log(int fd)
        fclose(fp);
 }
 
-static int run_service_command(const char **argv)
+static int run_service_command(struct child_process *cld)
 {
-       struct child_process cld = CHILD_PROCESS_INIT;
-
-       cld.argv = argv;
-       cld.git_cmd = 1;
-       cld.err = -1;
-       if (start_command(&cld))
+       argv_array_push(&cld->args, ".");
+       cld->git_cmd = 1;
+       cld->err = -1;
+       if (start_command(cld))
                return -1;
 
        close(0);
        close(1);
 
-       copy_to_log(cld.err);
+       copy_to_log(cld->err);
 
-       return finish_command(&cld);
+       return finish_command(cld);
 }
 
 static int upload_pack(void)
 {
-       /* Timeout as string */
-       char timeout_buf[64];
-       const char *argv[] = { "upload-pack", "--strict", NULL, ".", NULL };
-
-       argv[2] = timeout_buf;
-
-       snprintf(timeout_buf, sizeof timeout_buf, "--timeout=%u", timeout);
-       return run_service_command(argv);
+       struct child_process cld = CHILD_PROCESS_INIT;
+       argv_array_pushl(&cld.args, "upload-pack", "--strict", NULL);
+       argv_array_pushf(&cld.args, "--timeout=%u", timeout);
+       return run_service_command(&cld);
 }
 
 static int upload_archive(void)
 {
-       static const char *argv[] = { "upload-archive", ".", NULL };
-       return run_service_command(argv);
+       struct child_process cld = CHILD_PROCESS_INIT;
+       argv_array_push(&cld.args, "upload-archive");
+       return run_service_command(&cld);
 }
 
 static int receive_pack(void)
 {
-       static const char *argv[] = { "receive-pack", ".", NULL };
-       return run_service_command(argv);
+       struct child_process cld = CHILD_PROCESS_INIT;
+       argv_array_push(&cld.args, "receive-pack");
+       return run_service_command(&cld);
 }
 
 static struct daemon_service daemon_service[] = {
index bc49c708c1854a0f67c25e4fd2b77a9ad50ff511..52447466b5d16c4e8978795b0122e2182e83c5cb 100644 (file)
@@ -155,7 +155,8 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
                                if (2 <= stage) {
                                        int mode = nce->ce_mode;
                                        num_compare_stages++;
-                                       hashcpy(dpath->parent[stage-2].oid.hash, nce->sha1);
+                                       oidcpy(&dpath->parent[stage - 2].oid,
+                                              &nce->oid);
                                        dpath->parent[stage-2].mode = ce_mode_from_stat(nce, mode);
                                        dpath->parent[stage-2].status =
                                                DIFF_STATUS_MODIFIED;
@@ -209,7 +210,14 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
                                        continue;
                                }
                                diff_addremove(&revs->diffopt, '-', ce->ce_mode,
-                                              ce->sha1, !is_null_sha1(ce->sha1),
+                                              ce->oid.hash,
+                                              !is_null_oid(&ce->oid),
+                                              ce->name, 0);
+                               continue;
+                       } else if (revs->diffopt.ita_invisible_in_index &&
+                                  ce_intent_to_add(ce)) {
+                               diff_addremove(&revs->diffopt, '+', ce->ce_mode,
+                                              EMPTY_BLOB_SHA1_BIN, 0,
                                               ce->name, 0);
                                continue;
                        }
@@ -225,8 +233,8 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
                                continue;
                }
                oldmode = ce->ce_mode;
-               old_sha1 = ce->sha1;
-               new_sha1 = changed ? null_sha1 : ce->sha1;
+               old_sha1 = ce->oid.hash;
+               new_sha1 = changed ? null_sha1 : ce->oid.hash;
                diff_change(&revs->diffopt, oldmode, newmode,
                            old_sha1, new_sha1,
                            !is_null_sha1(old_sha1),
@@ -261,7 +269,7 @@ static int get_stat_data(const struct cache_entry *ce,
                         int cached, int match_missing,
                         unsigned *dirty_submodule, struct diff_options *diffopt)
 {
-       const unsigned char *sha1 = ce->sha1;
+       const unsigned char *sha1 = ce->oid.hash;
        unsigned int mode = ce->ce_mode;
 
        if (!cached && !ce_uptodate(ce)) {
@@ -324,12 +332,13 @@ static int show_modified(struct rev_info *revs,
                          &dirty_submodule, &revs->diffopt) < 0) {
                if (report_missing)
                        diff_index_show_file(revs, "-", old,
-                                            old->sha1, 1, old->ce_mode, 0);
+                                            old->oid.hash, 1, old->ce_mode,
+                                            0);
                return -1;
        }
 
        if (revs->combine_merges && !cached &&
-           (hashcmp(sha1, old->sha1) || hashcmp(old->sha1, new->sha1))) {
+           (hashcmp(sha1, old->oid.hash) || oidcmp(&old->oid, &new->oid))) {
                struct combine_diff_path *p;
                int pathlen = ce_namelen(new);
 
@@ -343,22 +352,22 @@ static int show_modified(struct rev_info *revs,
                memset(p->parent, 0, 2 * sizeof(struct combine_diff_parent));
                p->parent[0].status = DIFF_STATUS_MODIFIED;
                p->parent[0].mode = new->ce_mode;
-               hashcpy(p->parent[0].oid.hash, new->sha1);
+               oidcpy(&p->parent[0].oid, &new->oid);
                p->parent[1].status = DIFF_STATUS_MODIFIED;
                p->parent[1].mode = old->ce_mode;
-               hashcpy(p->parent[1].oid.hash, old->sha1);
+               oidcpy(&p->parent[1].oid, &old->oid);
                show_combined_diff(p, 2, revs->dense_combined_merges, revs);
                free(p);
                return 0;
        }
 
        oldmode = old->ce_mode;
-       if (mode == oldmode && !hashcmp(sha1, old->sha1) && !dirty_submodule &&
+       if (mode == oldmode && !hashcmp(sha1, old->oid.hash) && !dirty_submodule &&
            !DIFF_OPT_TST(&revs->diffopt, FIND_COPIES_HARDER))
                return 0;
 
        diff_change(&revs->diffopt, oldmode, mode,
-                   old->sha1, sha1, 1, !is_null_sha1(sha1),
+                   old->oid.hash, sha1, 1, !is_null_sha1(sha1),
                    old->name, 0, dirty_submodule);
        return 0;
 }
@@ -376,6 +385,14 @@ static void do_oneway_diff(struct unpack_trees_options *o,
        struct rev_info *revs = o->unpack_data;
        int match_missing, cached;
 
+       /* i-t-a entries do not actually exist in the index */
+       if (revs->diffopt.ita_invisible_in_index &&
+           idx && ce_intent_to_add(idx)) {
+               idx = NULL;
+               if (!tree)
+                       return; /* nothing to diff.. */
+       }
+
        /* if the entry is not checked out, don't examine work tree */
        cached = o->index_only ||
                (idx && ((idx->ce_flags & CE_VALID) || ce_skip_worktree(idx)));
@@ -392,7 +409,8 @@ static void do_oneway_diff(struct unpack_trees_options *o,
                struct diff_filepair *pair;
                pair = diff_unmerge(&revs->diffopt, idx->name);
                if (tree)
-                       fill_filespec(pair->one, tree->sha1, 1, tree->ce_mode);
+                       fill_filespec(pair->one, tree->oid.hash, 1,
+                                     tree->ce_mode);
                return;
        }
 
@@ -408,7 +426,8 @@ static void do_oneway_diff(struct unpack_trees_options *o,
         * Something removed from the tree?
         */
        if (!idx) {
-               diff_index_show_file(revs, "-", tree, tree->sha1, 1, tree->ce_mode, 0);
+               diff_index_show_file(revs, "-", tree, tree->oid.hash, 1,
+                                    tree->ce_mode, 0);
                return;
        }
 
@@ -516,7 +535,8 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt)
        return 0;
 }
 
-int index_differs_from(const char *def, int diff_flags)
+int index_differs_from(const char *def, int diff_flags,
+                      int ita_invisible_in_index)
 {
        struct rev_info rev;
        struct setup_revision_opt opt;
@@ -528,6 +548,7 @@ int index_differs_from(const char *def, int diff_flags)
        DIFF_OPT_SET(&rev.diffopt, QUICK);
        DIFF_OPT_SET(&rev.diffopt, EXIT_WITH_STATUS);
        rev.diffopt.flags |= diff_flags;
+       rev.diffopt.ita_invisible_in_index = ita_invisible_in_index;
        run_diff_index(&rev, 1);
        if (rev.pending.alloc)
                free(rev.pending.objects);
index 1f8999b9cabf52c85b63f27178023ff53b7567c3..79229382b06cefc98aa8926065f0fb999ad1da2e 100644 (file)
@@ -185,10 +185,8 @@ static int queue_diff(struct diff_options *o,
                struct diff_filespec *d1, *d2;
 
                if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
-                       unsigned tmp;
-                       const char *tmp_c;
-                       tmp = mode1; mode1 = mode2; mode2 = tmp;
-                       tmp_c = name1; name1 = name2; name2 = tmp_c;
+                       SWAP(mode1, mode2);
+                       SWAP(name1, name2);
                }
 
                d1 = noindex_filespec(name1, mode1);
@@ -238,7 +236,7 @@ static void fixup_paths(const char **path, struct strbuf *replacement)
 void diff_no_index(struct rev_info *revs,
                   int argc, const char **argv)
 {
-       int i, prefixlen;
+       int i;
        const char *paths[2];
        struct strbuf replacement = STRBUF_INIT;
        const char *prefix = revs->prefix;
@@ -259,7 +257,6 @@ void diff_no_index(struct rev_info *revs,
                }
        }
 
-       prefixlen = prefix ? strlen(prefix) : 0;
        for (i = 0; i < 2; i++) {
                const char *p = argv[argc - 2 + i];
                if (!strcmp(p, "-"))
@@ -268,8 +265,8 @@ void diff_no_index(struct rev_info *revs,
                         * path that is "-", spell it as "./-".
                         */
                        p = file_from_standard_input;
-               else if (prefixlen)
-                       p = xstrdup(prefix_filename(prefix, prefixlen, p));
+               else if (prefix)
+                       p = prefix_filename(prefix, p);
                paths[i] = p;
        }
 
@@ -281,6 +278,9 @@ void diff_no_index(struct rev_info *revs,
 
        DIFF_OPT_SET(&revs->diffopt, NO_INDEX);
 
+       DIFF_OPT_SET(&revs->diffopt, RELATIVE_NAME);
+       revs->diffopt.prefix = prefix;
+
        revs->max_count = -2;
        diff_setup_done(&revs->diffopt);
 
diff --git a/diff.c b/diff.c
index 8c78fce49dc5fa9e1215eb3bdb88e1f5e7f9d2c6..74283d9001fbc48d11ba5c449ea7c16692791c88 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -18,6 +18,7 @@
 #include "ll-merge.h"
 #include "string-list.h"
 #include "argv-array.h"
+#include "graph.h"
 
 #ifdef NO_FAST_WORKING_DIRECTORY
 #define FAST_WORKING_DIRECTORY 0
 #endif
 
 static int diff_detect_rename_default;
-static int diff_compaction_heuristic; /* experimental */
+static int diff_indent_heuristic; /* experimental */
 static int diff_rename_limit_default = 400;
 static int diff_suppress_blank_empty;
 static int diff_use_color_default = -1;
 static int diff_context_default = 3;
+static int diff_interhunk_context_default;
 static const char *diff_word_regex_cfg;
 static const char *external_diff_cmd_cfg;
 static const char *diff_order_file_cfg;
@@ -41,6 +43,7 @@ static int diff_stat_graph_width;
 static int diff_dirstat_permille_default = 30;
 static struct diff_options default_diff_options;
 static long diff_algorithm;
+static unsigned ws_error_highlight_default = WSEH_NEW;
 
 static char diff_colors[][COLOR_MAXLEN] = {
        GIT_COLOR_RESET,
@@ -54,6 +57,11 @@ static char diff_colors[][COLOR_MAXLEN] = {
        GIT_COLOR_NORMAL,       /* FUNCINFO */
 };
 
+static NORETURN void die_want_option(const char *option_name)
+{
+       die(_("option '%s' requires a value"), option_name);
+}
+
 static int parse_diff_color_slot(const char *var)
 {
        if (!strcasecmp(var, "context") || !strcasecmp(var, "plain"))
@@ -131,9 +139,11 @@ static int parse_dirstat_params(struct diff_options *options, const char *params
 static int parse_submodule_params(struct diff_options *options, const char *value)
 {
        if (!strcmp(value, "log"))
-               DIFF_OPT_SET(options, SUBMODULE_LOG);
+               options->submodule_format = DIFF_SUBMODULE_LOG;
        else if (!strcmp(value, "short"))
-               DIFF_OPT_CLR(options, SUBMODULE_LOG);
+               options->submodule_format = DIFF_SUBMODULE_SHORT;
+       else if (!strcmp(value, "diff"))
+               options->submodule_format = DIFF_SUBMODULE_INLINE_DIFF;
        else
                return -1;
        return 0;
@@ -163,6 +173,43 @@ long parse_algorithm_value(const char *value)
        return -1;
 }
 
+static int parse_one_token(const char **arg, const char *token)
+{
+       const char *rest;
+       if (skip_prefix(*arg, token, &rest) && (!*rest || *rest == ',')) {
+               *arg = rest;
+               return 1;
+       }
+       return 0;
+}
+
+static int parse_ws_error_highlight(const char *arg)
+{
+       const char *orig_arg = arg;
+       unsigned val = 0;
+
+       while (*arg) {
+               if (parse_one_token(&arg, "none"))
+                       val = 0;
+               else if (parse_one_token(&arg, "default"))
+                       val = WSEH_NEW;
+               else if (parse_one_token(&arg, "all"))
+                       val = WSEH_NEW | WSEH_OLD | WSEH_CONTEXT;
+               else if (parse_one_token(&arg, "new"))
+                       val |= WSEH_NEW;
+               else if (parse_one_token(&arg, "old"))
+                       val |= WSEH_OLD;
+               else if (parse_one_token(&arg, "context"))
+                       val |= WSEH_CONTEXT;
+               else {
+                       return -1 - (int)(arg - orig_arg);
+               }
+               if (*arg)
+                       arg++;
+       }
+       return val;
+}
+
 /*
  * These are to give UI layer defaults.
  * The core-level commands such as git-diff-files should
@@ -174,6 +221,13 @@ void init_diff_ui_defaults(void)
        diff_detect_rename_default = 1;
 }
 
+int git_diff_heuristic_config(const char *var, const char *value, void *cb)
+{
+       if (!strcmp(var, "diff.indentheuristic"))
+               diff_indent_heuristic = git_config_bool(var, value);
+       return 0;
+}
+
 int git_diff_ui_config(const char *var, const char *value, void *cb)
 {
        if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
@@ -186,12 +240,14 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
                        return -1;
                return 0;
        }
-       if (!strcmp(var, "diff.renames")) {
-               diff_detect_rename_default = git_config_rename(var, value);
+       if (!strcmp(var, "diff.interhunkcontext")) {
+               diff_interhunk_context_default = git_config_int(var, value);
+               if (diff_interhunk_context_default < 0)
+                       return -1;
                return 0;
        }
-       if (!strcmp(var, "diff.compactionheuristic")) {
-               diff_compaction_heuristic = git_config_bool(var, value);
+       if (!strcmp(var, "diff.renames")) {
+               diff_detect_rename_default = git_config_rename(var, value);
                return 0;
        }
        if (!strcmp(var, "diff.autorefreshindex")) {
@@ -234,6 +290,17 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (git_diff_heuristic_config(var, value, cb) < 0)
+               return -1;
+
+       if (!strcmp(var, "diff.wserrorhighlight")) {
+               int val = parse_ws_error_highlight(value);
+               if (val < 0)
+                       return -1;
+               ws_error_highlight_default = val;
+               return 0;
+       }
+
        if (git_color_config(var, value, cb) < 0)
                return -1;
 
@@ -331,7 +398,7 @@ static struct diff_tempfile {
         */
        const char *name;
 
-       char hex[GIT_SHA1_HEXSZ + 1];
+       char hex[GIT_MAX_HEXSZ + 1];
        char mode[10];
 
        /*
@@ -844,7 +911,7 @@ static int fn_out_diff_words_write_helper(FILE *fp,
 /*
  * '--color-words' algorithm can be described as:
  *
- *   1. collect the minus/plus lines of a diff hunk, divided into
+ *   1. collect the minus/plus lines of a diff hunk, divided into
  *      minus-lines and plus-lines;
  *
  *   2. break both minus-lines and plus-lines into words and
@@ -1616,7 +1683,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
         */
 
        if (options->stat_width == -1)
-               width = term_columns() - options->output_prefix_length;
+               width = term_columns() - strlen(line_prefix);
        else
                width = options->stat_width ? options->stat_width : 80;
        number_width = decimal_width(max_change) > number_width ?
@@ -1997,7 +2064,7 @@ found_damage:
                return;
 
        /* Show all directories with more than x% of the changes */
-       qsort(dir.files, dir.nr, sizeof(dir.files[0]), dirstat_compare);
+       QSORT(dir.files, dir.nr, dirstat_compare);
        gather_dirstat(options, &dir, changed, "", 0);
 }
 
@@ -2041,7 +2108,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o
                return;
 
        /* Show all directories with more than x% of the changes */
-       qsort(dir.files, dir.nr, sizeof(dir.files[0]), dirstat_compare);
+       QSORT(dir.files, dir.nr, dirstat_compare);
        gather_dirstat(options, &dir, changed, "", 0);
 }
 
@@ -2290,17 +2357,37 @@ static void builtin_diff(const char *name_a,
        struct strbuf header = STRBUF_INIT;
        const char *line_prefix = diff_line_prefix(o);
 
-       if (DIFF_OPT_TST(o, SUBMODULE_LOG) &&
-                       (!one->mode || S_ISGITLINK(one->mode)) &&
-                       (!two->mode || S_ISGITLINK(two->mode))) {
+       diff_set_mnemonic_prefix(o, "a/", "b/");
+       if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
+               a_prefix = o->b_prefix;
+               b_prefix = o->a_prefix;
+       } else {
+               a_prefix = o->a_prefix;
+               b_prefix = o->b_prefix;
+       }
+
+       if (o->submodule_format == DIFF_SUBMODULE_LOG &&
+           (!one->mode || S_ISGITLINK(one->mode)) &&
+           (!two->mode || S_ISGITLINK(two->mode))) {
                const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
                const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
                show_submodule_summary(o->file, one->path ? one->path : two->path,
                                line_prefix,
-                               one->oid.hash, two->oid.hash,
+                               &one->oid, &two->oid,
                                two->dirty_submodule,
                                meta, del, add, reset);
                return;
+       } else if (o->submodule_format == DIFF_SUBMODULE_INLINE_DIFF &&
+                  (!one->mode || S_ISGITLINK(one->mode)) &&
+                  (!two->mode || S_ISGITLINK(two->mode))) {
+               const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
+               const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
+               show_submodule_inline_diff(o->file, one->path ? one->path : two->path,
+                               line_prefix,
+                               &one->oid, &two->oid,
+                               two->dirty_submodule,
+                               meta, del, add, reset, o);
+               return;
        }
 
        if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
@@ -2308,15 +2395,6 @@ static void builtin_diff(const char *name_a,
                textconv_two = get_textconv(two);
        }
 
-       diff_set_mnemonic_prefix(o, "a/", "b/");
-       if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
-               a_prefix = o->b_prefix;
-               b_prefix = o->a_prefix;
-       } else {
-               a_prefix = o->a_prefix;
-               b_prefix = o->b_prefix;
-       }
-
        /* Never use a non-valid filename anywhere if at all possible */
        name_a = DIFF_FILE_VALID(one) ? name_a : name_b;
        name_b = DIFF_FILE_VALID(two) ? name_b : name_a;
@@ -2690,7 +2768,7 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
         * This is not the sha1 we are looking for, or
         * unreusable because it is not a regular file.
         */
-       if (hashcmp(sha1, ce->sha1) || !S_ISREG(ce->ce_mode))
+       if (hashcmp(sha1, ce->oid.hash) || !S_ISREG(ce->ce_mode))
                return 0;
 
        /*
@@ -2792,8 +2870,25 @@ int diff_populate_filespec(struct diff_filespec *s, unsigned int flags)
                        s->should_free = 1;
                        return 0;
                }
-               if (size_only)
+
+               /*
+                * Even if the caller would be happy with getting
+                * only the size, we cannot return early at this
+                * point if the path requires us to run the content
+                * conversion.
+                */
+               if (size_only && !would_convert_to_git(s->path))
                        return 0;
+
+               /*
+                * Note: this check uses xsize_t(st.st_size) that may
+                * not be the true size of the blob after it goes
+                * through convert_to_git().  This may not strictly be
+                * correct, but the whole point of big_file_threshold
+                * and is_binary check being that we want to avoid
+                * opening the file and inspecting the contents, this
+                * is probably fine.
+                */
                if ((flags & CHECK_BINARY) &&
                    s->size > big_file_threshold && s->is_binary == -1) {
                        s->is_binary = 1;
@@ -2937,7 +3032,7 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
                        if (!one->oid_valid)
                                sha1_to_hex_r(temp->hex, null_sha1);
                        else
-                               sha1_to_hex_r(temp->hex, one->oid.hash);
+                               oid_to_hex_r(temp->hex, &one->oid);
                        /* Even though we may sometimes borrow the
                         * contents from the work tree, we always want
                         * one->mode.  mode is trustworthy even when
@@ -3016,6 +3111,22 @@ static int similarity_index(struct diff_filepair *p)
        return p->score * 100 / MAX_SCORE;
 }
 
+static const char *diff_abbrev_oid(const struct object_id *oid, int abbrev)
+{
+       if (startup_info->have_repository)
+               return find_unique_abbrev(oid->hash, abbrev);
+       else {
+               char *hex = oid_to_hex(oid);
+               if (abbrev < 0)
+                       abbrev = FALLBACK_DEFAULT_ABBREV;
+               if (abbrev > GIT_SHA1_HEXSZ)
+                       die("BUG: oid abbreviation out of range: %d", abbrev);
+               if (abbrev)
+                       hex[abbrev] = '\0';
+               return hex;
+       }
+}
+
 static void fill_metainfo(struct strbuf *msg,
                          const char *name,
                          const char *other,
@@ -3074,9 +3185,9 @@ static void fill_metainfo(struct strbuf *msg,
                            (!fill_mmfile(&mf, two) && diff_filespec_is_binary(two)))
                                abbrev = 40;
                }
-               strbuf_addf(msg, "%s%sindex %s..", line_prefix, set,
-                           find_unique_abbrev(one->oid.hash, abbrev));
-               strbuf_add_unique_abbrev(msg, two->oid.hash, abbrev);
+               strbuf_addf(msg, "%s%sindex %s..%s", line_prefix, set,
+                           diff_abbrev_oid(&one->oid, abbrev),
+                           diff_abbrev_oid(&two->oid, abbrev));
                if (one->mode == two->mode)
                        strbuf_addf(msg, " %06o", one->mode);
                strbuf_addf(msg, "%s\n", reset);
@@ -3269,12 +3380,14 @@ void diff_setup(struct diff_options *options)
 
        options->file = stdout;
 
+       options->abbrev = DEFAULT_ABBREV;
        options->line_termination = '\n';
        options->break_opt = -1;
        options->rename_limit = -1;
        options->dirstat_permille = diff_dirstat_permille_default;
        options->context = diff_context_default;
-       options->ws_error_highlight = WSEH_NEW;
+       options->interhunkcontext = diff_interhunk_context_default;
+       options->ws_error_highlight = ws_error_highlight_default;
        DIFF_OPT_SET(options, RENAME_EMPTY);
 
        /* pathchange left =NULL by default */
@@ -3283,8 +3396,8 @@ void diff_setup(struct diff_options *options)
        options->use_color = diff_use_color_default;
        options->detect_rename = diff_detect_rename_default;
        options->xdl_opts |= diff_algorithm;
-       if (diff_compaction_heuristic)
-               DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
+       if (diff_indent_heuristic)
+               DIFF_XDL_SET(options, INDENT_HEURISTIC);
 
        options->orderfile = diff_order_file_cfg;
 
@@ -3312,7 +3425,7 @@ void diff_setup_done(struct diff_options *options)
        if (options->output_format & DIFF_FORMAT_NO_OUTPUT)
                count++;
        if (count > 1)
-               die("--name-only, --name-status, --check and -s are mutually exclusive");
+               die(_("--name-only, --name-status, --check and -s are mutually exclusive"));
 
        /*
         * Most of the time we can say "there are changes"
@@ -3386,7 +3499,7 @@ void diff_setup_done(struct diff_options *options)
                         */
                        read_cache();
        }
-       if (options->abbrev <= 0 || 40 < options->abbrev)
+       if (40 < options->abbrev)
                options->abbrev = 40; /* full */
 
        /*
@@ -3508,7 +3621,7 @@ static int stat_opt(struct diff_options *options, const char **av)
                        if (*arg == '=')
                                width = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-width' requires a value");
+                               die_want_option("--stat-width");
                        else if (!*arg) {
                                width = strtoul(av[1], &end, 10);
                                argcount = 2;
@@ -3517,7 +3630,7 @@ static int stat_opt(struct diff_options *options, const char **av)
                        if (*arg == '=')
                                name_width = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-name-width' requires a value");
+                               die_want_option("--stat-name-width");
                        else if (!*arg) {
                                name_width = strtoul(av[1], &end, 10);
                                argcount = 2;
@@ -3526,7 +3639,7 @@ static int stat_opt(struct diff_options *options, const char **av)
                        if (*arg == '=')
                                graph_width = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-graph-width' requires a value");
+                               die_want_option("--stat-graph-width");
                        else if (!*arg) {
                                graph_width = strtoul(av[1], &end, 10);
                                argcount = 2;
@@ -3535,7 +3648,7 @@ static int stat_opt(struct diff_options *options, const char **av)
                        if (*arg == '=')
                                count = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-count' requires a value");
+                               die_want_option("--stat-count");
                        else if (!*arg) {
                                count = strtoul(av[1], &end, 10);
                                argcount = 2;
@@ -3663,40 +3776,14 @@ static void enable_patch_output(int *fmt) {
        *fmt |= DIFF_FORMAT_PATCH;
 }
 
-static int parse_one_token(const char **arg, const char *token)
+static int parse_ws_error_highlight_opt(struct diff_options *opt, const char *arg)
 {
-       const char *rest;
-       if (skip_prefix(*arg, token, &rest) && (!*rest || *rest == ',')) {
-               *arg = rest;
-               return 1;
-       }
-       return 0;
-}
+       int val = parse_ws_error_highlight(arg);
 
-static int parse_ws_error_highlight(struct diff_options *opt, const char *arg)
-{
-       const char *orig_arg = arg;
-       unsigned val = 0;
-       while (*arg) {
-               if (parse_one_token(&arg, "none"))
-                       val = 0;
-               else if (parse_one_token(&arg, "default"))
-                       val = WSEH_NEW;
-               else if (parse_one_token(&arg, "all"))
-                       val = WSEH_NEW | WSEH_OLD | WSEH_CONTEXT;
-               else if (parse_one_token(&arg, "new"))
-                       val |= WSEH_NEW;
-               else if (parse_one_token(&arg, "old"))
-                       val |= WSEH_OLD;
-               else if (parse_one_token(&arg, "context"))
-                       val |= WSEH_CONTEXT;
-               else {
-                       error("unknown value after ws-error-highlight=%.*s",
-                             (int)(arg - orig_arg), orig_arg);
-                       return 0;
-               }
-               if (*arg)
-                       arg++;
+       if (val < 0) {
+               error("unknown value after ws-error-highlight=%.*s",
+                     -1 - val, arg);
+               return 0;
        }
        opt->ws_error_highlight = val;
        return 1;
@@ -3805,10 +3892,10 @@ int diff_opt_parse(struct diff_options *options,
                DIFF_XDL_SET(options, IGNORE_WHITESPACE_AT_EOL);
        else if (!strcmp(arg, "--ignore-blank-lines"))
                DIFF_XDL_SET(options, IGNORE_BLANK_LINES);
-       else if (!strcmp(arg, "--compaction-heuristic"))
-               DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
-       else if (!strcmp(arg, "--no-compaction-heuristic"))
-               DIFF_XDL_CLR(options, COMPACTION_HEURISTIC);
+       else if (!strcmp(arg, "--indent-heuristic"))
+               DIFF_XDL_SET(options, INDENT_HEURISTIC);
+       else if (!strcmp(arg, "--no-indent-heuristic"))
+               DIFF_XDL_CLR(options, INDENT_HEURISTIC);
        else if (!strcmp(arg, "--patience"))
                options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
        else if (!strcmp(arg, "--histogram"))
@@ -3905,11 +3992,15 @@ int diff_opt_parse(struct diff_options *options,
                DIFF_OPT_SET(options, OVERRIDE_SUBMODULE_CONFIG);
                handle_ignore_submodules_arg(options, arg);
        } else if (!strcmp(arg, "--submodule"))
-               DIFF_OPT_SET(options, SUBMODULE_LOG);
+               options->submodule_format = DIFF_SUBMODULE_LOG;
        else if (skip_prefix(arg, "--submodule=", &arg))
                return parse_submodule_opt(options, arg);
        else if (skip_prefix(arg, "--ws-error-highlight=", &arg))
-               return parse_ws_error_highlight(options, arg);
+               return parse_ws_error_highlight_opt(options, arg);
+       else if (!strcmp(arg, "--ita-invisible-in-index"))
+               options->ita_invisible_in_index = 1;
+       else if (!strcmp(arg, "--ita-visible-in-index"))
+               options->ita_invisible_in_index = 0;
 
        /* misc options */
        else if (!strcmp(arg, "-z"))
@@ -3932,8 +4023,7 @@ int diff_opt_parse(struct diff_options *options,
        else if (!strcmp(arg, "--pickaxe-regex"))
                options->pickaxe_opts |= DIFF_PICKAXE_REGEX;
        else if ((argcount = short_opt('O', av, &optarg))) {
-               const char *path = prefix_filename(prefix, strlen(prefix), optarg);
-               options->orderfile = xstrdup(path);
+               options->orderfile = prefix_filename(prefix, optarg);
                return argcount;
        }
        else if ((argcount = parse_long_opt("diff-filter", av, &optarg))) {
@@ -3943,6 +4033,8 @@ int diff_opt_parse(struct diff_options *options,
                            offending, optarg);
                return argcount;
        }
+       else if (!strcmp(arg, "--no-abbrev"))
+               options->abbrev = 0;
        else if (!strcmp(arg, "--abbrev"))
                options->abbrev = DEFAULT_ABBREV;
        else if (skip_prefix(arg, "--abbrev=", &arg)) {
@@ -3956,6 +4048,12 @@ int diff_opt_parse(struct diff_options *options,
                options->a_prefix = optarg;
                return argcount;
        }
+       else if ((argcount = parse_long_opt("line-prefix", av, &optarg))) {
+               options->line_prefix = optarg;
+               options->line_prefix_length = strlen(options->line_prefix);
+               graph_setup_line_prefix(options);
+               return argcount;
+       }
        else if ((argcount = parse_long_opt("dst-prefix", av, &optarg))) {
                options->b_prefix = optarg;
                return argcount;
@@ -3972,13 +4070,14 @@ int diff_opt_parse(struct diff_options *options,
        else if (!strcmp(arg, "--no-function-context"))
                DIFF_OPT_CLR(options, FUNCCONTEXT);
        else if ((argcount = parse_long_opt("output", av, &optarg))) {
-               const char *path = prefix_filename(prefix, strlen(prefix), optarg);
+               char *path = prefix_filename(prefix, optarg);
                options->file = fopen(path, "w");
                if (!options->file)
                        die_errno("Could not open '%s'", path);
                options->close_file = 1;
                if (options->use_color != GIT_COLOR_ALWAYS)
                        options->use_color = GIT_COLOR_NEVER;
+               free(path);
                return argcount;
        } else
                return 0;
@@ -4089,18 +4188,15 @@ void diff_free_filepair(struct diff_filepair *p)
        free(p);
 }
 
-/*
- * This is different from find_unique_abbrev() in that
- * it stuffs the result with dots for alignment.
- */
-const char *diff_unique_abbrev(const unsigned char *sha1, int len)
+const char *diff_aligned_abbrev(const struct object_id *oid, int len)
 {
        int abblen;
        const char *abbrev;
-       if (len == 40)
-               return sha1_to_hex(sha1);
 
-       abbrev = find_unique_abbrev(sha1, len);
+       if (len == GIT_SHA1_HEXSZ)
+               return oid_to_hex(oid);
+
+       abbrev = diff_abbrev_oid(oid, len);
        abblen = strlen(abbrev);
 
        /*
@@ -4122,15 +4218,16 @@ const char *diff_unique_abbrev(const unsigned char *sha1, int len)
         * the automatic sizing is supposed to give abblen that ensures
         * uniqueness across all objects (statistically speaking).
         */
-       if (abblen < 37) {
-               static char hex[41];
+       if (abblen < GIT_SHA1_HEXSZ - 3) {
+               static char hex[GIT_MAX_HEXSZ + 1];
                if (len < abblen && abblen <= len + 2)
                        xsnprintf(hex, sizeof(hex), "%s%.*s", abbrev, len+3-abblen, "..");
                else
                        xsnprintf(hex, sizeof(hex), "%s...", abbrev);
                return hex;
        }
-       return sha1_to_hex(sha1);
+
+       return oid_to_hex(oid);
 }
 
 static void diff_flush_raw(struct diff_filepair *p, struct diff_options *opt)
@@ -4141,9 +4238,9 @@ static void diff_flush_raw(struct diff_filepair *p, struct diff_options *opt)
        fprintf(opt->file, "%s", diff_line_prefix(opt));
        if (!(opt->output_format & DIFF_FORMAT_NAME_STATUS)) {
                fprintf(opt->file, ":%06o %06o %s ", p->one->mode, p->two->mode,
-                       diff_unique_abbrev(p->one->oid.hash, opt->abbrev));
+                       diff_aligned_abbrev(&p->one->oid, opt->abbrev));
                fprintf(opt->file, "%s ",
-                       diff_unique_abbrev(p->two->oid.hash, opt->abbrev));
+                       diff_aligned_abbrev(&p->two->oid, opt->abbrev));
        }
        if (p->score) {
                fprintf(opt->file, "%c%03d%c", p->status, similarity_index(p),
@@ -4370,6 +4467,7 @@ static void flush_one_pair(struct diff_filepair *p, struct diff_options *opt)
                name_a = p->two->path;
                name_b = NULL;
                strip_prefix(opt->prefix_length, &name_a, &name_b);
+               fprintf(opt->file, "%s", diff_line_prefix(opt));
                write_name_quoted(name_a, opt->file, opt->line_termination);
        }
 }
@@ -4472,6 +4570,19 @@ static void patch_id_consume(void *priv, char *line, unsigned long len)
        data->patchlen += new_len;
 }
 
+static void patch_id_add_string(git_SHA_CTX *ctx, const char *str)
+{
+       git_SHA1_Update(ctx, str, strlen(str));
+}
+
+static void patch_id_add_mode(git_SHA_CTX *ctx, unsigned mode)
+{
+       /* large enough for 2^32 in octal */
+       char buf[12];
+       int len = xsnprintf(buf, sizeof(buf), "%06o", mode);
+       git_SHA1_Update(ctx, buf, len);
+}
+
 /* returns 0 upon success, and writes result into sha1 */
 static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1, int diff_header_only)
 {
@@ -4479,7 +4590,6 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1,
        int i;
        git_SHA_CTX ctx;
        struct patch_id_t data;
-       char buffer[PATH_MAX * 4 + 20];
 
        git_SHA1_Init(&ctx);
        memset(&data, 0, sizeof(struct patch_id_t));
@@ -4511,36 +4621,30 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1,
 
                len1 = remove_space(p->one->path, strlen(p->one->path));
                len2 = remove_space(p->two->path, strlen(p->two->path));
-               if (p->one->mode == 0)
-                       len1 = snprintf(buffer, sizeof(buffer),
-                                       "diff--gita/%.*sb/%.*s"
-                                       "newfilemode%06o"
-                                       "---/dev/null"
-                                       "+++b/%.*s",
-                                       len1, p->one->path,
-                                       len2, p->two->path,
-                                       p->two->mode,
-                                       len2, p->two->path);
-               else if (p->two->mode == 0)
-                       len1 = snprintf(buffer, sizeof(buffer),
-                                       "diff--gita/%.*sb/%.*s"
-                                       "deletedfilemode%06o"
-                                       "---a/%.*s"
-                                       "+++/dev/null",
-                                       len1, p->one->path,
-                                       len2, p->two->path,
-                                       p->one->mode,
-                                       len1, p->one->path);
-               else
-                       len1 = snprintf(buffer, sizeof(buffer),
-                                       "diff--gita/%.*sb/%.*s"
-                                       "---a/%.*s"
-                                       "+++b/%.*s",
-                                       len1, p->one->path,
-                                       len2, p->two->path,
-                                       len1, p->one->path,
-                                       len2, p->two->path);
-               git_SHA1_Update(&ctx, buffer, len1);
+               patch_id_add_string(&ctx, "diff--git");
+               patch_id_add_string(&ctx, "a/");
+               git_SHA1_Update(&ctx, p->one->path, len1);
+               patch_id_add_string(&ctx, "b/");
+               git_SHA1_Update(&ctx, p->two->path, len2);
+
+               if (p->one->mode == 0) {
+                       patch_id_add_string(&ctx, "newfilemode");
+                       patch_id_add_mode(&ctx, p->two->mode);
+                       patch_id_add_string(&ctx, "---/dev/null");
+                       patch_id_add_string(&ctx, "+++b/");
+                       git_SHA1_Update(&ctx, p->two->path, len2);
+               } else if (p->two->mode == 0) {
+                       patch_id_add_string(&ctx, "deletedfilemode");
+                       patch_id_add_mode(&ctx, p->one->mode);
+                       patch_id_add_string(&ctx, "---a/");
+                       git_SHA1_Update(&ctx, p->one->path, len1);
+                       patch_id_add_string(&ctx, "+++/dev/null");
+               } else {
+                       patch_id_add_string(&ctx, "---a/");
+                       git_SHA1_Update(&ctx, p->one->path, len1);
+                       patch_id_add_string(&ctx, "+++b/");
+                       git_SHA1_Update(&ctx, p->two->path, len2);
+               }
 
                if (diff_header_only)
                        continue;
@@ -4612,25 +4716,25 @@ static int is_summary_empty(const struct diff_queue_struct *q)
 }
 
 static const char rename_limit_warning[] =
-"inexact rename detection was skipped due to too many files.";
+N_("inexact rename detection was skipped due to too many files.");
 
 static const char degrade_cc_to_c_warning[] =
-"only found copies from modified paths due to too many files.";
+N_("only found copies from modified paths due to too many files.");
 
 static const char rename_limit_advice[] =
-"you may want to set your %s variable to at least "
-"%d and retry the command.";
+N_("you may want to set your %s variable to at least "
+   "%d and retry the command.");
 
 void diff_warn_rename_limit(const char *varname, int needed, int degraded_cc)
 {
        if (degraded_cc)
-               warning(degrade_cc_to_c_warning);
+               warning(_(degrade_cc_to_c_warning));
        else if (needed)
-               warning(rename_limit_warning);
+               warning(_(rename_limit_warning));
        else
                return;
        if (0 < needed && needed < 32767)
-               warning(rename_limit_advice, varname, needed);
+               warning(_(rename_limit_advice), varname, needed);
 }
 
 void diff_flush(struct diff_options *options)
@@ -4897,7 +5001,7 @@ static int diffnamecmp(const void *a_, const void *b_)
 void diffcore_fix_diff_index(struct diff_options *options)
 {
        struct diff_queue_struct *q = &diff_queued_diff;
-       qsort(q->queue, q->nr, sizeof(q->queue[0]), diffnamecmp);
+       QSORT(q->queue, q->nr, diffnamecmp);
 }
 
 void diffcore_std(struct diff_options *options)
@@ -5037,14 +5141,10 @@ void diff_change(struct diff_options *options,
                return;
 
        if (DIFF_OPT_TST(options, REVERSE_DIFF)) {
-               unsigned tmp;
-               const unsigned char *tmp_c;
-               tmp = old_mode; old_mode = new_mode; new_mode = tmp;
-               tmp_c = old_sha1; old_sha1 = new_sha1; new_sha1 = tmp_c;
-               tmp = old_sha1_valid; old_sha1_valid = new_sha1_valid;
-                       new_sha1_valid = tmp;
-               tmp = old_dirty_submodule; old_dirty_submodule = new_dirty_submodule;
-                       new_dirty_submodule = tmp;
+               SWAP(old_mode, new_mode);
+               SWAP(old_sha1, new_sha1);
+               SWAP(old_sha1_valid, new_sha1_valid);
+               SWAP(old_dirty_submodule, new_dirty_submodule);
        }
 
        if (options->prefix &&
diff --git a/diff.h b/diff.h
index 7883729edf10ae2888ebc672f62f6015dee21550..5be1ee77a759f330db4ace64a5772f23e3d19d50 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -14,7 +14,7 @@ struct diff_queue_struct;
 struct strbuf;
 struct diff_filespec;
 struct userdiff_driver;
-struct sha1_array;
+struct oid_array;
 struct commit;
 struct combine_diff_path;
 
@@ -83,7 +83,6 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data)
 #define DIFF_OPT_DIRSTAT_BY_FILE     (1 << 20)
 #define DIFF_OPT_ALLOW_TEXTCONV      (1 << 21)
 #define DIFF_OPT_DIFF_FROM_CONTENTS  (1 << 22)
-#define DIFF_OPT_SUBMODULE_LOG       (1 << 23)
 #define DIFF_OPT_DIRTY_SUBMODULES    (1 << 24)
 #define DIFF_OPT_IGNORE_UNTRACKED_IN_SUBMODULES (1 << 25)
 #define DIFF_OPT_IGNORE_DIRTY_SUBMODULES (1 << 26)
@@ -110,11 +109,19 @@ enum diff_words_type {
        DIFF_WORDS_COLOR
 };
 
+enum diff_submodule_format {
+       DIFF_SUBMODULE_SHORT = 0,
+       DIFF_SUBMODULE_LOG,
+       DIFF_SUBMODULE_INLINE_DIFF
+};
+
 struct diff_options {
        const char *orderfile;
        const char *pickaxe;
        const char *single_follow;
        const char *a_prefix, *b_prefix;
+       const char *line_prefix;
+       size_t line_prefix_length;
        unsigned flags;
        unsigned touched_flags;
 
@@ -139,6 +146,7 @@ struct diff_options {
        int dirstat_permille;
        int setup;
        int abbrev;
+       int ita_invisible_in_index;
 /* white-space error highlighting */
 #define WSEH_NEW 1
 #define WSEH_CONTEXT 2
@@ -155,6 +163,7 @@ struct diff_options {
        int stat_count;
        const char *word_regex;
        enum diff_words_type word_diff;
+       enum diff_submodule_format submodule_format;
 
        /* this is set by diffcore for DIFF_FORMAT_PATCH */
        int found_changes;
@@ -174,7 +183,6 @@ struct diff_options {
        diff_format_fn_t format_callback;
        void *format_callback_data;
        diff_prefix_fn_t output_prefix;
-       int output_prefix_length;
        void *output_prefix_data;
 
        int diff_path_counter;
@@ -228,7 +236,7 @@ struct combine_diff_path {
 extern void show_combined_diff(struct combine_diff_path *elem, int num_parent,
                              int dense, struct rev_info *);
 
-extern void diff_tree_combined(const unsigned char *sha1, const struct sha1_array *parents, int dense, struct rev_info *rev);
+extern void diff_tree_combined(const unsigned char *sha1, const struct oid_array *parents, int dense, struct rev_info *rev);
 
 extern void diff_tree_combined_merge(const struct commit *commit, int dense, struct rev_info *rev);
 
@@ -266,6 +274,7 @@ extern int parse_long_opt(const char *opt, const char **argv,
                         const char **optarg);
 
 extern int git_diff_basic_config(const char *var, const char *value, void *cb);
+extern int git_diff_heuristic_config(const char *var, const char *value, void *cb);
 extern void init_diff_ui_defaults(void);
 extern int git_diff_ui_config(const char *var, const char *value, void *cb);
 extern void diff_setup(struct diff_options *);
@@ -332,7 +341,11 @@ extern void diff_warn_rename_limit(const char *varname, int needed, int degraded
 #define DIFF_STATUS_FILTER_AON         '*'
 #define DIFF_STATUS_FILTER_BROKEN      'B'
 
-extern const char *diff_unique_abbrev(const unsigned char *, int);
+/*
+ * This is different from find_unique_abbrev() in that
+ * it stuffs the result with dots for alignment.
+ */
+extern const char *diff_aligned_abbrev(const struct object_id *sha1, int);
 
 /* do not report anything on removed paths */
 #define DIFF_SILENT_ON_REMOVED 01
@@ -348,7 +361,7 @@ extern int diff_result_code(struct diff_options *, int);
 
 extern void diff_no_index(struct rev_info *, int, const char **);
 
-extern int index_differs_from(const char *def, int diff_flags);
+extern int index_differs_from(const char *def, int diff_flags, int ita_invisible_in_index);
 
 /*
  * Fill the contents of the filespec "df", respecting any textconv defined by
index e2db85abd9f04d5e3a7a71ad396921cf9f2908b6..ebe70fb068519be86437a11b980d804be0534c75 100644 (file)
@@ -158,10 +158,7 @@ static struct spanhash_top *hash_chars(struct diff_filespec *one)
                n = 0;
                accum1 = accum2 = 0;
        }
-       qsort(hash->data,
-               1ul << hash->alloc_log2,
-               sizeof(hash->data[0]),
-               spanhash_cmp);
+       QSORT(hash->data, 1ul << hash->alloc_log2, spanhash_cmp);
        return hash;
 }
 
index 69d41f7a5781a10e43cf0e74f20be85a0d1fc5be..1957f822a5120a463ea4dff503fd8fe78f63b663 100644 (file)
@@ -101,7 +101,7 @@ void order_objects(const char *orderfile, obj_path_fn_t obj_path,
                objs[i].orig_order = i;
                objs[i].order = match_order(obj_path(objs[i].obj));
        }
-       qsort(objs, nr, sizeof(*objs), compare_objs_order);
+       QSORT(objs, nr, compare_objs_order);
 }
 
 static const char *pair_pathtwo(void *obj)
index 9795ca1c159a5177b1b7031a87c8f8bd5e5be3d5..341529b5a865ae6460f50d8593d52497059f2408 100644 (file)
@@ -81,12 +81,15 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
                regmatch_t regmatch;
                int flags = 0;
 
-               while (*data &&
+               while (sz && *data &&
                       !regexec_buf(regexp, data, sz, 1, &regmatch, flags)) {
                        flags |= REG_NOTBOL;
                        data += regmatch.rm_eo;
-                       if (*data && regmatch.rm_so == regmatch.rm_eo)
+                       sz -= regmatch.rm_eo;
+                       if (sz && *data && regmatch.rm_so == regmatch.rm_eo) {
                                data++;
+                               sz--;
+                       }
                        cnt++;
                }
 
index 15c014d864c65e2a6dd17523bacf1681a276db01..f7444c86bde3909c8fca23f71c4852514eb26b88 100644 (file)
@@ -576,7 +576,7 @@ void diffcore_rename(struct diff_options *options)
        stop_progress(&progress);
 
        /* cost matrix sorted by most to least similar pair */
-       qsort(mx, dst_cnt * NUM_CANDIDATE_PER_DST, sizeof(*mx), score_compare);
+       QSORT(mx, dst_cnt * NUM_CANDIDATE_PER_DST, score_compare);
 
        rename_count += find_renames(mx, dst_cnt, minimum_score, 0);
        if (detect_rename == DIFF_DETECT_COPY)
diff --git a/dir.c b/dir.c
index 0ea235f3d643d7a9072aca75d7317d1fd7552b4d..31f9343f9fcf57a89cab519f284cf2e0a767744d 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -9,6 +9,7 @@
  */
 #include "cache.h"
 #include "dir.h"
+#include "attr.h"
 #include "refs.h"
 #include "wildmatch.h"
 #include "pathspec.h"
 #include "varint.h"
 #include "ewah/ewok.h"
 
-struct path_simplify {
-       int len;
-       const char *path;
-};
-
 /*
  * Tells read_directory_recursive how a file or directory should be treated.
  * Values are ordered by significance, e.g. if a directory contains both
@@ -50,7 +46,7 @@ struct cached_dir {
 
 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
        const char *path, int len, struct untracked_cache_dir *untracked,
-       int check_only, const struct path_simplify *simplify);
+       int check_only, const struct pathspec *pathspec);
 static int get_dtype(struct dirent *de, const char *path, int len);
 
 int fspathcmp(const char *a, const char *b)
@@ -139,7 +135,8 @@ static size_t common_prefix_len(const struct pathspec *pathspec)
                       PATHSPEC_LITERAL |
                       PATHSPEC_GLOB |
                       PATHSPEC_ICASE |
-                      PATHSPEC_EXCLUDE);
+                      PATHSPEC_EXCLUDE |
+                      PATHSPEC_ATTR);
 
        for (n = 0; n < pathspec->nr; n++) {
                size_t i = 0, len = 0, item_len;
@@ -179,17 +176,20 @@ char *common_prefix(const struct pathspec *pathspec)
 
 int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec)
 {
-       size_t len;
+       const char *prefix;
+       size_t prefix_len;
 
        /*
         * Calculate common prefix for the pathspec, and
         * use that to optimize the directory walk
         */
-       len = common_prefix_len(pathspec);
+       prefix_len = common_prefix_len(pathspec);
+       prefix = prefix_len ? pathspec->items[0].match : "";
 
        /* Read the directory and prune it */
-       read_directory(dir, pathspec->nr ? pathspec->_raw[0] : "", len, pathspec);
-       return len;
+       read_directory(dir, prefix, prefix_len, pathspec);
+
+       return prefix_len;
 }
 
 int within_depth(const char *name, int namelen,
@@ -207,8 +207,39 @@ int within_depth(const char *name, int namelen,
        return 1;
 }
 
-#define DO_MATCH_EXCLUDE   1
-#define DO_MATCH_DIRECTORY 2
+#define DO_MATCH_EXCLUDE   (1<<0)
+#define DO_MATCH_DIRECTORY (1<<1)
+#define DO_MATCH_SUBMODULE (1<<2)
+
+static int match_attrs(const char *name, int namelen,
+                      const struct pathspec_item *item)
+{
+       int i;
+
+       git_check_attr(name, item->attr_check);
+       for (i = 0; i < item->attr_match_nr; i++) {
+               const char *value;
+               int matched;
+               enum attr_match_mode match_mode;
+
+               value = item->attr_check->items[i].value;
+               match_mode = item->attr_match[i].match_mode;
+
+               if (ATTR_TRUE(value))
+                       matched = (match_mode == MATCH_SET);
+               else if (ATTR_FALSE(value))
+                       matched = (match_mode == MATCH_UNSET);
+               else if (ATTR_UNSET(value))
+                       matched = (match_mode == MATCH_UNSPECIFIED);
+               else
+                       matched = (match_mode == MATCH_VALUE &&
+                                  !strcmp(item->attr_match[i].value, value));
+               if (!matched)
+                       return 0;
+       }
+
+       return 1;
+}
 
 /*
  * Does 'match' match the given name?
@@ -262,6 +293,9 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix,
            strncmp(item->match, name - prefix, item->prefix))
                return 0;
 
+       if (item->attr_match_nr && !match_attrs(name, namelen, item))
+               return 0;
+
        /* If the match was just the prefix, we matched */
        if (!*match)
                return MATCHED_RECURSIVELY;
@@ -283,6 +317,32 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix,
                         item->nowildcard_len - prefix))
                return MATCHED_FNMATCH;
 
+       /* Perform checks to see if "name" is a super set of the pathspec */
+       if (flags & DO_MATCH_SUBMODULE) {
+               /* name is a literal prefix of the pathspec */
+               if ((namelen < matchlen) &&
+                   (match[namelen] == '/') &&
+                   !ps_strncmp(item, match, name, namelen))
+                       return MATCHED_RECURSIVELY;
+
+               /* name" doesn't match up to the first wild character */
+               if (item->nowildcard_len < item->len &&
+                   ps_strncmp(item, match, name,
+                              item->nowildcard_len - prefix))
+                       return 0;
+
+               /*
+                * Here is where we would perform a wildmatch to check if
+                * "name" can be matched as a directory (or a prefix) against
+                * the pathspec.  Since wildmatch doesn't have this capability
+                * at the present we have to punt and say that it is a match,
+                * potentially returning a false positive
+                * The submodules themselves will be able to perform more
+                * accurate matching to determine if the pathspec matches.
+                */
+               return MATCHED_RECURSIVELY;
+       }
+
        return 0;
 }
 
@@ -314,7 +374,8 @@ static int do_match_pathspec(const struct pathspec *ps,
                       PATHSPEC_LITERAL |
                       PATHSPEC_GLOB |
                       PATHSPEC_ICASE |
-                      PATHSPEC_EXCLUDE);
+                      PATHSPEC_EXCLUDE |
+                      PATHSPEC_ATTR);
 
        if (!ps->nr) {
                if (!ps->recursive ||
@@ -386,6 +447,21 @@ int match_pathspec(const struct pathspec *ps,
        return negative ? 0 : positive;
 }
 
+/**
+ * Check if a submodule is a superset of the pathspec
+ */
+int submodule_path_match(const struct pathspec *ps,
+                        const char *submodule_name,
+                        char *seen)
+{
+       int matched = do_match_pathspec(ps, submodule_name,
+                                       strlen(submodule_name),
+                                       0, seen,
+                                       DO_MATCH_DIRECTORY |
+                                       DO_MATCH_SUBMODULE);
+       return matched;
+}
+
 int report_path_error(const char *ps_matched,
                      const struct pathspec *pathspec,
                      const char *prefix)
@@ -525,7 +601,7 @@ static void *read_skip_worktree_file_from_index(const char *path, size_t *size,
                return NULL;
        if (!ce_skip_worktree(active_cache[pos]))
                return NULL;
-       data = read_sha1_file(active_cache[pos]->sha1, &type, &sz);
+       data = read_sha1_file(active_cache[pos]->oid.hash, &type, &sz);
        if (!data || type != OBJ_BLOB) {
                free(data);
                return NULL;
@@ -533,7 +609,7 @@ static void *read_skip_worktree_file_from_index(const char *path, size_t *size,
        *size = xsize_t(sz);
        if (sha1_stat) {
                memset(&sha1_stat->stat, 0, sizeof(sha1_stat->stat));
-               hashcpy(sha1_stat->sha1, active_cache[pos]->sha1);
+               hashcpy(sha1_stat->sha1, active_cache[pos]->oid.hash);
        }
        return data;
 }
@@ -713,7 +789,8 @@ static int add_excludes(const char *fname, const char *base, int baselen,
                                 !ce_stage(active_cache[pos]) &&
                                 ce_uptodate(active_cache[pos]) &&
                                 !would_convert_to_git(fname))
-                               hashcpy(sha1_stat->sha1, active_cache[pos]->sha1);
+                               hashcpy(sha1_stat->sha1,
+                                       active_cache[pos]->oid.hash);
                        else
                                hash_sha1_file(buf, size, "blob", sha1_stat->sha1);
                        fill_stat_data(&sha1_stat->stat, &st);
@@ -1269,7 +1346,7 @@ static enum exist_status directory_exists_in_index(const char *dirname, int len)
 static enum path_treatment treat_directory(struct dir_struct *dir,
        struct untracked_cache_dir *untracked,
        const char *dirname, int len, int baselen, int exclude,
-       const struct path_simplify *simplify)
+       const struct pathspec *pathspec)
 {
        /* The "len-1" is to strip the final '/' */
        switch (directory_exists_in_index(dirname, len-1)) {
@@ -1298,7 +1375,7 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
        untracked = lookup_untracked(dir->untracked, untracked,
                                     dirname + baselen, len - baselen);
        return read_directory_recursive(dir, dirname, len,
-                                       untracked, 1, simplify);
+                                       untracked, 1, pathspec);
 }
 
 /*
@@ -1306,24 +1383,34 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
  * reading - if the path cannot possibly be in the pathspec,
  * return true, and we'll skip it early.
  */
-static int simplify_away(const char *path, int pathlen, const struct path_simplify *simplify)
+static int simplify_away(const char *path, int pathlen,
+                        const struct pathspec *pathspec)
 {
-       if (simplify) {
-               for (;;) {
-                       const char *match = simplify->path;
-                       int len = simplify->len;
+       int i;
 
-                       if (!match)
-                               break;
-                       if (len > pathlen)
-                               len = pathlen;
-                       if (!memcmp(path, match, len))
-                               return 0;
-                       simplify++;
-               }
-               return 1;
+       if (!pathspec || !pathspec->nr)
+               return 0;
+
+       GUARD_PATHSPEC(pathspec,
+                      PATHSPEC_FROMTOP |
+                      PATHSPEC_MAXDEPTH |
+                      PATHSPEC_LITERAL |
+                      PATHSPEC_GLOB |
+                      PATHSPEC_ICASE |
+                      PATHSPEC_EXCLUDE |
+                      PATHSPEC_ATTR);
+
+       for (i = 0; i < pathspec->nr; i++) {
+               const struct pathspec_item *item = &pathspec->items[i];
+               int len = item->nowildcard_len;
+
+               if (len > pathlen)
+                       len = pathlen;
+               if (!ps_strncmp(item, item->match, path, len))
+                       return 0;
        }
-       return 0;
+
+       return 1;
 }
 
 /*
@@ -1337,19 +1424,33 @@ static int simplify_away(const char *path, int pathlen, const struct path_simpli
  *   2. the path is a directory prefix of some element in the
  *      pathspec
  */
-static int exclude_matches_pathspec(const char *path, int len,
-               const struct path_simplify *simplify)
-{
-       if (simplify) {
-               for (; simplify->path; simplify++) {
-                       if (len == simplify->len
-                           && !memcmp(path, simplify->path, len))
-                               return 1;
-                       if (len < simplify->len
-                           && simplify->path[len] == '/'
-                           && !memcmp(path, simplify->path, len))
-                               return 1;
-               }
+static int exclude_matches_pathspec(const char *path, int pathlen,
+                                   const struct pathspec *pathspec)
+{
+       int i;
+
+       if (!pathspec || !pathspec->nr)
+               return 0;
+
+       GUARD_PATHSPEC(pathspec,
+                      PATHSPEC_FROMTOP |
+                      PATHSPEC_MAXDEPTH |
+                      PATHSPEC_LITERAL |
+                      PATHSPEC_GLOB |
+                      PATHSPEC_ICASE |
+                      PATHSPEC_EXCLUDE);
+
+       for (i = 0; i < pathspec->nr; i++) {
+               const struct pathspec_item *item = &pathspec->items[i];
+               int len = item->nowildcard_len;
+
+               if (len == pathlen &&
+                   !ps_strncmp(item, item->match, path, pathlen))
+                       return 1;
+               if (len > pathlen &&
+                   item->match[pathlen] == '/' &&
+                   !ps_strncmp(item, item->match, path, pathlen))
+                       return 1;
        }
        return 0;
 }
@@ -1417,7 +1518,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
                                          struct untracked_cache_dir *untracked,
                                          struct strbuf *path,
                                          int baselen,
-                                         const struct path_simplify *simplify,
+                                         const struct pathspec *pathspec,
                                          int dtype, struct dirent *de)
 {
        int exclude;
@@ -1469,7 +1570,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
        case DT_DIR:
                strbuf_addch(path, '/');
                return treat_directory(dir, untracked, path->buf, path->len,
-                                      baselen, exclude, simplify);
+                                      baselen, exclude, pathspec);
        case DT_REG:
        case DT_LNK:
                return exclude ? path_excluded : path_untracked;
@@ -1481,7 +1582,7 @@ static enum path_treatment treat_path_fast(struct dir_struct *dir,
                                           struct cached_dir *cdir,
                                           struct strbuf *path,
                                           int baselen,
-                                          const struct path_simplify *simplify)
+                                          const struct pathspec *pathspec)
 {
        strbuf_setlen(path, baselen);
        if (!cdir->ucd) {
@@ -1498,7 +1599,7 @@ static enum path_treatment treat_path_fast(struct dir_struct *dir,
                 * with check_only set.
                 */
                return read_directory_recursive(dir, path->buf, path->len,
-                                               cdir->ucd, 1, simplify);
+                                               cdir->ucd, 1, pathspec);
        /*
         * We get path_recurse in the first run when
         * directory_exists_in_index() returns index_nonexistent. We
@@ -1513,23 +1614,23 @@ static enum path_treatment treat_path(struct dir_struct *dir,
                                      struct cached_dir *cdir,
                                      struct strbuf *path,
                                      int baselen,
-                                     const struct path_simplify *simplify)
+                                     const struct pathspec *pathspec)
 {
        int dtype;
        struct dirent *de = cdir->de;
 
        if (!de)
                return treat_path_fast(dir, untracked, cdir, path,
-                                      baselen, simplify);
+                                      baselen, pathspec);
        if (is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name, ".git"))
                return path_none;
        strbuf_setlen(path, baselen);
        strbuf_addstr(path, de->d_name);
-       if (simplify_away(path->buf, path->len, simplify))
+       if (simplify_away(path->buf, path->len, pathspec))
                return path_none;
 
        dtype = DTYPE(de);
-       return treat_one_path(dir, untracked, path, baselen, simplify, dtype, de);
+       return treat_one_path(dir, untracked, path, baselen, pathspec, dtype, de);
 }
 
 static void add_untracked(struct untracked_cache_dir *dir, const char *name)
@@ -1660,7 +1761,7 @@ static void close_cached_dir(struct cached_dir *cdir)
 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                                    const char *base, int baselen,
                                    struct untracked_cache_dir *untracked, int check_only,
-                                   const struct path_simplify *simplify)
+                                   const struct pathspec *pathspec)
 {
        struct cached_dir cdir;
        enum path_treatment state, subdir_state, dir_state = path_none;
@@ -1676,20 +1777,25 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
 
        while (!read_cached_dir(&cdir)) {
                /* check how the file or directory should be treated */
-               state = treat_path(dir, untracked, &cdir, &path, baselen, simplify);
+               state = treat_path(dir, untracked, &cdir, &path,
+                                  baselen, pathspec);
 
                if (state > dir_state)
                        dir_state = state;
 
                /* recurse into subdir if instructed by treat_path */
-               if (state == path_recurse) {
+               if ((state == path_recurse) ||
+                       ((state == path_untracked) &&
+                        (dir->flags & DIR_SHOW_IGNORED_TOO) &&
+                        (get_dtype(cdir.de, path.buf, path.len) == DT_DIR))) {
                        struct untracked_cache_dir *ud;
                        ud = lookup_untracked(dir->untracked, untracked,
                                              path.buf + baselen,
                                              path.len - baselen);
                        subdir_state =
-                               read_directory_recursive(dir, path.buf, path.len,
-                                                        ud, check_only, simplify);
+                               read_directory_recursive(dir, path.buf,
+                                                        path.len, ud,
+                                                        check_only, pathspec);
                        if (subdir_state > dir_state)
                                dir_state = subdir_state;
                }
@@ -1713,7 +1819,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
                        else if ((dir->flags & DIR_SHOW_IGNORED_TOO) ||
                                ((dir->flags & DIR_COLLECT_IGNORED) &&
                                exclude_matches_pathspec(path.buf, path.len,
-                                       simplify)))
+                                                        pathspec)))
                                dir_add_ignored(dir, path.buf, path.len);
                        break;
 
@@ -1736,7 +1842,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
        return dir_state;
 }
 
-static int cmp_name(const void *p1, const void *p2)
+int cmp_dir_entry(const void *p1, const void *p2)
 {
        const struct dir_entry *e1 = *(const struct dir_entry **)p1;
        const struct dir_entry *e2 = *(const struct dir_entry **)p2;
@@ -1744,36 +1850,17 @@ static int cmp_name(const void *p1, const void *p2)
        return name_compare(e1->name, e1->len, e2->name, e2->len);
 }
 
-static struct path_simplify *create_simplify(const char **pathspec)
+/* check if *out lexically strictly contains *in */
+int check_dir_entry_contains(const struct dir_entry *out, const struct dir_entry *in)
 {
-       int nr, alloc = 0;
-       struct path_simplify *simplify = NULL;
-
-       if (!pathspec)
-               return NULL;
-
-       for (nr = 0 ; ; nr++) {
-               const char *match;
-               ALLOC_GROW(simplify, nr + 1, alloc);
-               match = *pathspec++;
-               if (!match)
-                       break;
-               simplify[nr].path = match;
-               simplify[nr].len = simple_length(match);
-       }
-       simplify[nr].path = NULL;
-       simplify[nr].len = 0;
-       return simplify;
-}
-
-static void free_simplify(struct path_simplify *simplify)
-{
-       free(simplify);
+       return (out->len < in->len) &&
+               (out->name[out->len - 1] == '/') &&
+               !memcmp(out->name, in->name, out->len);
 }
 
 static int treat_leading_path(struct dir_struct *dir,
                              const char *path, int len,
-                             const struct path_simplify *simplify)
+                             const struct pathspec *pathspec)
 {
        struct strbuf sb = STRBUF_INIT;
        int baselen, rc = 0;
@@ -1797,9 +1884,9 @@ static int treat_leading_path(struct dir_struct *dir,
                strbuf_add(&sb, path, baselen);
                if (!is_directory(sb.buf))
                        break;
-               if (simplify_away(sb.buf, sb.len, simplify))
+               if (simplify_away(sb.buf, sb.len, pathspec))
                        break;
-               if (treat_one_path(dir, NULL, &sb, baselen, simplify,
+               if (treat_one_path(dir, NULL, &sb, baselen, pathspec,
                                   DT_DIR, NULL) == path_none)
                        break; /* do not recurse into it */
                if (len <= baselen) {
@@ -1967,33 +2054,14 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
        return root;
 }
 
-int read_directory(struct dir_struct *dir, const char *path, int len, const struct pathspec *pathspec)
+int read_directory(struct dir_struct *dir, const char *path,
+                  int len, const struct pathspec *pathspec)
 {
-       struct path_simplify *simplify;
        struct untracked_cache_dir *untracked;
 
-       /*
-        * Check out create_simplify()
-        */
-       if (pathspec)
-               GUARD_PATHSPEC(pathspec,
-                              PATHSPEC_FROMTOP |
-                              PATHSPEC_MAXDEPTH |
-                              PATHSPEC_LITERAL |
-                              PATHSPEC_GLOB |
-                              PATHSPEC_ICASE |
-                              PATHSPEC_EXCLUDE);
-
        if (has_symlink_leading_path(path, len))
                return dir->nr;
 
-       /*
-        * exclude patterns are treated like positive ones in
-        * create_simplify. Usually exclude patterns should be a
-        * subset of positive ones, which has no impacts on
-        * create_simplify().
-        */
-       simplify = create_simplify(pathspec ? pathspec->_raw : NULL);
        untracked = validate_untracked_cache(dir, len, pathspec);
        if (!untracked)
                /*
@@ -2001,11 +2069,34 @@ int read_directory(struct dir_struct *dir, const char *path, int len, const stru
                 * e.g. prep_exclude()
                 */
                dir->untracked = NULL;
-       if (!len || treat_leading_path(dir, path, len, simplify))
-               read_directory_recursive(dir, path, len, untracked, 0, simplify);
-       free_simplify(simplify);
-       qsort(dir->entries, dir->nr, sizeof(struct dir_entry *), cmp_name);
-       qsort(dir->ignored, dir->ignored_nr, sizeof(struct dir_entry *), cmp_name);
+       if (!len || treat_leading_path(dir, path, len, pathspec))
+               read_directory_recursive(dir, path, len, untracked, 0, pathspec);
+       QSORT(dir->entries, dir->nr, cmp_dir_entry);
+       QSORT(dir->ignored, dir->ignored_nr, cmp_dir_entry);
+
+       /*
+        * If DIR_SHOW_IGNORED_TOO is set, read_directory_recursive() will
+        * also pick up untracked contents of untracked dirs; by default
+        * we discard these, but given DIR_KEEP_UNTRACKED_CONTENTS we do not.
+        */
+       if ((dir->flags & DIR_SHOW_IGNORED_TOO) &&
+                    !(dir->flags & DIR_KEEP_UNTRACKED_CONTENTS)) {
+               int i, j;
+
+               /* remove from dir->entries untracked contents of untracked dirs */
+               for (i = j = 0; j < dir->nr; j++) {
+                       if (i &&
+                           check_dir_entry_contains(dir->entries[i - 1], dir->entries[j])) {
+                               free(dir->entries[j]);
+                               dir->entries[j] = NULL;
+                       } else {
+                               dir->entries[i++] = dir->entries[j];
+                       }
+               }
+
+               dir->nr = i;
+       }
+
        if (dir->untracked) {
                static struct trace_key trace_untracked_stats = TRACE_KEY_INIT(UNTRACKED_STATS);
                trace_printf_key(&trace_untracked_stats,
@@ -2194,8 +2285,6 @@ static GIT_PATH_FUNC(git_path_info_exclude, "info/exclude")
 
 void setup_standard_excludes(struct dir_struct *dir)
 {
-       const char *path;
-
        dir->exclude_per_dir = ".gitignore";
 
        /* core.excludefile defaulting to $XDG_HOME/git/ignore */
@@ -2206,10 +2295,12 @@ void setup_standard_excludes(struct dir_struct *dir)
                                         dir->untracked ? &dir->ss_excludes_file : NULL);
 
        /* per repository user preference */
-       path = git_path_info_exclude();
-       if (!access_or_warn(path, R_OK, 0))
-               add_excludes_from_file_1(dir, path,
-                                        dir->untracked ? &dir->ss_info_exclude : NULL);
+       if (startup_info->have_repository) {
+               const char *path = git_path_info_exclude();
+               if (!access_or_warn(path, R_OK, 0))
+                       add_excludes_from_file_1(dir, path,
+                                                dir->untracked ? &dir->ss_info_exclude : NULL);
+       }
 }
 
 int remove_path(const char *name)
@@ -2705,3 +2796,50 @@ void untracked_cache_add_to_index(struct index_state *istate,
 {
        untracked_cache_invalidate_path(istate, path);
 }
+
+/* Update gitfile and core.worktree setting to connect work tree and git dir */
+void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
+{
+       struct strbuf gitfile_sb = STRBUF_INIT;
+       struct strbuf cfg_sb = STRBUF_INIT;
+       struct strbuf rel_path = STRBUF_INIT;
+       char *git_dir, *work_tree;
+
+       /* Prepare .git file */
+       strbuf_addf(&gitfile_sb, "%s/.git", work_tree_);
+       if (safe_create_leading_directories_const(gitfile_sb.buf))
+               die(_("could not create directories for %s"), gitfile_sb.buf);
+
+       /* Prepare config file */
+       strbuf_addf(&cfg_sb, "%s/config", git_dir_);
+       if (safe_create_leading_directories_const(cfg_sb.buf))
+               die(_("could not create directories for %s"), cfg_sb.buf);
+
+       git_dir = real_pathdup(git_dir_, 1);
+       work_tree = real_pathdup(work_tree_, 1);
+
+       /* Write .git file */
+       write_file(gitfile_sb.buf, "gitdir: %s",
+                  relative_path(git_dir, work_tree, &rel_path));
+       /* Update core.worktree setting */
+       git_config_set_in_file(cfg_sb.buf, "core.worktree",
+                              relative_path(work_tree, git_dir, &rel_path));
+
+       strbuf_release(&gitfile_sb);
+       strbuf_release(&cfg_sb);
+       strbuf_release(&rel_path);
+       free(work_tree);
+       free(git_dir);
+}
+
+/*
+ * Migrate the git directory of the given path from old_git_dir to new_git_dir.
+ */
+void relocate_gitdir(const char *path, const char *old_git_dir, const char *new_git_dir)
+{
+       if (rename(old_git_dir, new_git_dir) < 0)
+               die_errno(_("could not migrate git directory from '%s' to '%s'"),
+                       old_git_dir, new_git_dir);
+
+       connect_work_tree_and_git_dir(path, new_git_dir);
+}
diff --git a/dir.h b/dir.h
index da1a858b3a12daba5bd348fcaa342534edaacdb6..edb5fda586444762e50397409815962e65f22415 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -151,7 +151,8 @@ struct dir_struct {
                DIR_NO_GITLINKS = 1<<3,
                DIR_COLLECT_IGNORED = 1<<4,
                DIR_SHOW_IGNORED_TOO = 1<<5,
-               DIR_COLLECT_KILLED_ONLY = 1<<6
+               DIR_COLLECT_KILLED_ONLY = 1<<6,
+               DIR_KEEP_UNTRACKED_CONTENTS = 1<<7
        } flags;
        struct dir_entry **entries;
        struct dir_entry **ignored;
@@ -304,6 +305,10 @@ extern int git_fnmatch(const struct pathspec_item *item,
                       const char *pattern, const char *string,
                       int prefix);
 
+extern int submodule_path_match(const struct pathspec *ps,
+                               const char *submodule_name,
+                               char *seen);
+
 static inline int ce_path_match(const struct cache_entry *ce,
                                const struct pathspec *pathspec,
                                char *seen)
@@ -322,6 +327,9 @@ static inline int dir_path_match(const struct dir_entry *ent,
                              has_trailing_dir);
 }
 
+int cmp_dir_entry(const void *p1, const void *p2);
+int check_dir_entry_contains(const struct dir_entry *out, const struct dir_entry *in);
+
 void untracked_cache_invalidate_path(struct index_state *, const char *);
 void untracked_cache_remove_from_index(struct index_state *, const char *);
 void untracked_cache_add_to_index(struct index_state *, const char *);
@@ -331,4 +339,8 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
 void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);
 void add_untracked_cache(struct index_state *istate);
 void remove_untracked_cache(struct index_state *istate);
+extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
+extern void relocate_gitdir(const char *path,
+                           const char *old_git_dir,
+                           const char *new_git_dir);
 #endif
diff --git a/entry.c b/entry.c
index 519e04227b72f92a338836ce457d2a5be2b80218..d2b512da90a3cc84d592a2024cc8dac363c9418d 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -2,6 +2,7 @@
 #include "blob.h"
 #include "dir.h"
 #include "streaming.h"
+#include "submodule.h"
 
 static void create_directories(const char *path, int path_len,
                               const struct checkout *state)
@@ -82,7 +83,7 @@ static int create_file(const char *path, unsigned int mode)
 static void *read_blob_entry(const struct cache_entry *ce, unsigned long *size)
 {
        enum object_type type;
-       void *new = read_sha1_file(ce->sha1, &type, size);
+       void *new = read_sha1_file(ce->oid.hash, &type, size);
 
        if (new) {
                if (type == OBJ_BLOB)
@@ -127,7 +128,7 @@ static int streaming_write_entry(const struct cache_entry *ce, char *path,
        if (fd < 0)
                return -1;
 
-       result |= stream_blob_to_fd(fd, ce->sha1, filter, 1);
+       result |= stream_blob_to_fd(fd, &ce->oid, filter, 1);
        *fstat_done = fstat_output(fd, state, statbuf);
        result |= close(fd);
 
@@ -146,9 +147,11 @@ static int write_entry(struct cache_entry *ce,
        unsigned long size;
        size_t wrote, newsize = 0;
        struct stat st;
+       const struct submodule *sub;
 
        if (ce_mode_s_ifmt == S_IFREG) {
-               struct stream_filter *filter = get_stream_filter(ce->name, ce->sha1);
+               struct stream_filter *filter = get_stream_filter(ce->name,
+                                                                ce->oid.hash);
                if (filter &&
                    !streaming_write_entry(ce, path, filter,
                                           state, to_tempfile,
@@ -162,7 +165,7 @@ static int write_entry(struct cache_entry *ce,
                new = read_blob_entry(ce, &size);
                if (!new)
                        return error("unable to read sha1 file of %s (%s)",
-                               path, sha1_to_hex(ce->sha1));
+                               path, oid_to_hex(&ce->oid));
 
                if (ce_mode_s_ifmt == S_IFLNK && has_symlinks && !to_tempfile) {
                        ret = symlink(new, path);
@@ -202,6 +205,10 @@ static int write_entry(struct cache_entry *ce,
                        return error("cannot create temporary submodule %s", path);
                if (mkdir(path, 0777) < 0)
                        return error("cannot create submodule directory %s", path);
+               sub = submodule_from_ce(ce);
+               if (sub)
+                       return submodule_move_head(ce->name,
+                               NULL, oid_to_hex(&ce->oid), SUBMODULE_MOVE_HEAD_FORCE);
                break;
        default:
                return error("unknown file mode for %s in index", path);
@@ -258,7 +265,31 @@ int checkout_entry(struct cache_entry *ce,
        strbuf_add(&path, ce->name, ce_namelen(ce));
 
        if (!check_path(path.buf, path.len, &st, state->base_dir_len)) {
+               const struct submodule *sub;
                unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
+               /*
+                * Needs to be checked before !changed returns early,
+                * as the possibly empty directory was not changed
+                */
+               sub = submodule_from_ce(ce);
+               if (sub) {
+                       int err;
+                       if (!is_submodule_populated_gently(ce->name, &err)) {
+                               struct stat sb;
+                               if (lstat(ce->name, &sb))
+                                       die(_("could not stat file '%s'"), ce->name);
+                               if (!(st.st_mode & S_IFDIR))
+                                       unlink_or_warn(ce->name);
+
+                               return submodule_move_head(ce->name,
+                                       NULL, oid_to_hex(&ce->oid),
+                                       SUBMODULE_MOVE_HEAD_FORCE);
+                       } else
+                               return submodule_move_head(ce->name,
+                                       "HEAD", oid_to_hex(&ce->oid),
+                                       SUBMODULE_MOVE_HEAD_FORCE);
+               }
+
                if (!changed)
                        return 0;
                if (!state->force) {
index ca72464a985021e58b898bb0b1f9af6c4a5282ac..1f0bda5afabe901bea250e7dabcc39c5325baf88 100644 (file)
@@ -16,12 +16,11 @@ int trust_executable_bit = 1;
 int trust_ctime = 1;
 int check_stat = 1;
 int has_symlinks = 1;
-int minimum_abbrev = 4, default_abbrev = 7;
+int minimum_abbrev = 4, default_abbrev = -1;
 int ignore_case;
 int assume_unchanged;
 int prefer_symlink_refs;
 int is_bare_repository_cfg = -1; /* unspecified */
-int log_all_ref_updates = -1; /* unspecified */
 int warn_ambiguous_refs = 1;
 int warn_on_object_refname_ambiguity = 1;
 int ref_paranoia = -1;
@@ -34,13 +33,12 @@ const char *git_attributes_file;
 const char *git_hooks_path;
 int zlib_compression_level = Z_BEST_SPEED;
 int core_compression_level;
-int core_compression_seen;
+int pack_compression_level = Z_DEFAULT_COMPRESSION;
 int fsync_object_files;
 size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
 size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
 size_t delta_base_cache_limit = 96 * 1024 * 1024;
 unsigned long big_file_threshold = 512 * 1024 * 1024;
-const char *pager_program;
 int pager_use_color = 1;
 const char *editor_program;
 const char *askpass_program;
@@ -65,6 +63,7 @@ int merge_log_config = -1;
 int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
 unsigned long pack_size_limit_cfg;
 enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
+enum log_refs_config log_all_ref_updates = LOG_REFS_UNSET;
 
 #ifndef PROTECT_HFS_DEFAULT
 #define PROTECT_HFS_DEFAULT 0
@@ -100,6 +99,8 @@ static char *work_tree;
 static const char *namespace;
 static size_t namespace_len;
 
+static const char *super_prefix;
+
 static const char *git_dir, *git_common_dir;
 static char *git_object_dir, *git_index_file, *git_graft_file;
 int git_db_env, git_index_env, git_graft_env, git_common_dir_env;
@@ -120,6 +121,7 @@ const char * const local_repo_env[] = {
        NO_REPLACE_OBJECTS_ENVIRONMENT,
        GIT_REPLACE_REF_BASE_ENVIRONMENT,
        GIT_PREFIX_ENVIRONMENT,
+       GIT_SUPER_PREFIX_ENVIRONMENT,
        GIT_SHALLOW_FILE_ENVIRONMENT,
        GIT_COMMON_DIR_ENVIRONMENT,
        NULL
@@ -165,8 +167,11 @@ static void setup_git_env(void)
        const char *replace_ref_base;
 
        git_dir = getenv(GIT_DIR_ENVIRONMENT);
-       if (!git_dir)
+       if (!git_dir) {
+               if (!startup_info->have_repository)
+                       BUG("setup_git_env called without repository");
                git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
+       }
        gitfile = read_gitfile(git_dir);
        git_dir = xstrdup(gitfile ? gitfile : git_dir);
        if (get_common_dir(&sb, git_dir))
@@ -196,6 +201,13 @@ int is_bare_repository(void)
        return is_bare_repository_cfg && !get_git_work_tree();
 }
 
+int have_git_dir(void)
+{
+       return startup_info->have_repository
+               || git_dir
+               || getenv(GIT_DIR_ENVIRONMENT);
+}
+
 const char *get_git_dir(void)
 {
        if (!git_dir)
@@ -222,6 +234,16 @@ const char *strip_namespace(const char *namespaced_ref)
        return namespaced_ref + namespace_len;
 }
 
+const char *get_super_prefix(void)
+{
+       static int initialized;
+       if (!initialized) {
+               super_prefix = getenv(GIT_SUPER_PREFIX_ENVIRONMENT);
+               initialized = 1;
+       }
+       return super_prefix;
+}
+
 static int git_work_tree_initialized;
 
 /*
@@ -240,7 +262,7 @@ void set_git_work_tree(const char *new_work_tree)
                return;
        }
        git_work_tree_initialized = 1;
-       work_tree = xstrdup(real_path(new_work_tree));
+       work_tree = real_pathdup(new_work_tree, 1);
 }
 
 const char *get_git_work_tree(void)
@@ -255,7 +277,7 @@ char *get_object_directory(void)
        return git_object_dir;
 }
 
-int odb_mkstemp(char *template, size_t limit, const char *pattern)
+int odb_mkstemp(struct strbuf *template, const char *pattern)
 {
        int fd;
        /*
@@ -263,32 +285,28 @@ int odb_mkstemp(char *template, size_t limit, const char *pattern)
         * restrictive except to remove write permission.
         */
        int mode = 0444;
-       snprintf(template, limit, "%s/%s",
-                get_object_directory(), pattern);
-       fd = git_mkstemp_mode(template, mode);
+       git_path_buf(template, "objects/%s", pattern);
+       fd = git_mkstemp_mode(template->buf, mode);
        if (0 <= fd)
                return fd;
 
        /* slow path */
        /* some mkstemp implementations erase template on failure */
-       snprintf(template, limit, "%s/%s",
-                get_object_directory(), pattern);
-       safe_create_leading_directories(template);
-       return xmkstemp_mode(template, mode);
+       git_path_buf(template, "objects/%s", pattern);
+       safe_create_leading_directories(template->buf);
+       return xmkstemp_mode(template->buf, mode);
 }
 
-int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1)
+int odb_pack_keep(const char *name)
 {
        int fd;
 
-       snprintf(name, namesz, "%s/pack/pack-%s.keep",
-                get_object_directory(), sha1_to_hex(sha1));
        fd = open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
        if (0 <= fd)
                return fd;
 
        /* slow path */
-       safe_create_leading_directories(name);
+       safe_create_leading_directories_const(name);
        return open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
 }
 
@@ -345,3 +363,8 @@ int get_shared_repository(void)
        }
        return the_shared_repository;
 }
+
+void reset_shared_repository(void)
+{
+       need_shared_repository_from_config = 1;
+}
index 61f6a43579f5e3fc98e562fe6f0c6d8c118e0ded..f73210973f12256f120351ef6826c64b62e51880 100644 (file)
@@ -142,8 +142,8 @@ int ewah_read_mmap(struct ewah_bitmap *self, const void *map, size_t len)
         * the endianness conversion in a separate pass to ensure
         * we're loading 8-byte aligned words.
         */
-       memcpy(self->buffer, ptr, self->buffer_size * sizeof(uint64_t));
-       ptr += self->buffer_size * sizeof(uint64_t);
+       memcpy(self->buffer, ptr, self->buffer_size * sizeof(eword_t));
+       ptr += self->buffer_size * sizeof(eword_t);
 
        for (i = 0; i < self->buffer_size; ++i)
                self->buffer[i] = ntohll(self->buffer[i]);
index 19ac2146d0c49be8f5ef3739664dc3105544b4c2..fb94aeba9cef2893ea7173e5634640e596659474 100644 (file)
@@ -64,17 +64,19 @@ void git_set_argv_exec_path(const char *exec_path)
 /* Returns the highest-priority, location to look for git programs. */
 const char *git_exec_path(void)
 {
-       const char *env;
+       static char *cached_exec_path;
 
        if (argv_exec_path)
                return argv_exec_path;
 
-       env = getenv(EXEC_PATH_ENVIRONMENT);
-       if (env && *env) {
-               return env;
+       if (!cached_exec_path) {
+               const char *env = getenv(EXEC_PATH_ENVIRONMENT);
+               if (env && *env)
+                       cached_exec_path = xstrdup(env);
+               else
+                       cached_exec_path = system_path(GIT_EXEC_PATH);
        }
-
-       return system_path(GIT_EXEC_PATH);
+       return cached_exec_path;
 }
 
 static void add_path(struct strbuf *out, const char *path)
index bf53ac95da04327aa2b83ff2943d51e6d0c731db..cf58f875b889eb0360df1f58cacf4f4017c6c10f 100644 (file)
@@ -284,8 +284,6 @@ static unsigned long max_depth = 10;
 static off_t max_packsize;
 static int unpack_limit = 100;
 static int force_update;
-static int pack_compression_level = Z_DEFAULT_COMPRESSION;
-static int pack_compression_seen;
 
 /* Stats and misc. counters */
 static uintmax_t alloc_count;
@@ -892,14 +890,15 @@ static struct tree_content *dup_tree_content(struct tree_content *s)
 
 static void start_packfile(void)
 {
-       static char tmp_file[PATH_MAX];
+       struct strbuf tmp_file = STRBUF_INIT;
        struct packed_git *p;
        struct pack_header hdr;
        int pack_fd;
 
-       pack_fd = odb_mkstemp(tmp_file, sizeof(tmp_file),
-                             "pack/tmp_pack_XXXXXX");
-       FLEX_ALLOC_STR(p, pack_name, tmp_file);
+       pack_fd = odb_mkstemp(&tmp_file, "pack/tmp_pack_XXXXXX");
+       FLEX_ALLOC_STR(p, pack_name, tmp_file.buf);
+       strbuf_release(&tmp_file);
+
        p->pack_fd = pack_fd;
        p->do_not_close = 1;
        pack_file = sha1fd(pack_fd, p->pack_name);
@@ -942,41 +941,40 @@ static const char *create_index(void)
 
 static char *keep_pack(const char *curr_index_name)
 {
-       static char name[PATH_MAX];
        static const char *keep_msg = "fast-import";
+       struct strbuf name = STRBUF_INIT;
        int keep_fd;
 
-       keep_fd = odb_pack_keep(name, sizeof(name), pack_data->sha1);
+       odb_pack_name(&name, pack_data->sha1, "keep");
+       keep_fd = odb_pack_keep(name.buf);
        if (keep_fd < 0)
                die_errno("cannot create keep file");
        write_or_die(keep_fd, keep_msg, strlen(keep_msg));
        if (close(keep_fd))
                die_errno("failed to write keep file");
 
-       snprintf(name, sizeof(name), "%s/pack/pack-%s.pack",
-                get_object_directory(), sha1_to_hex(pack_data->sha1));
-       if (finalize_object_file(pack_data->pack_name, name))
+       odb_pack_name(&name, pack_data->sha1, "pack");
+       if (finalize_object_file(pack_data->pack_name, name.buf))
                die("cannot store pack file");
 
-       snprintf(name, sizeof(name), "%s/pack/pack-%s.idx",
-                get_object_directory(), sha1_to_hex(pack_data->sha1));
-       if (finalize_object_file(curr_index_name, name))
+       odb_pack_name(&name, pack_data->sha1, "idx");
+       if (finalize_object_file(curr_index_name, name.buf))
                die("cannot store index file");
        free((void *)curr_index_name);
-       return name;
+       return strbuf_detach(&name, NULL);
 }
 
 static void unkeep_all_packs(void)
 {
-       static char name[PATH_MAX];
+       struct strbuf name = STRBUF_INIT;
        int k;
 
        for (k = 0; k < pack_id; k++) {
                struct packed_git *p = all_packs[k];
-               snprintf(name, sizeof(name), "%s/pack/pack-%s.keep",
-                        get_object_directory(), sha1_to_hex(p->sha1));
-               unlink_or_warn(name);
+               odb_pack_name(&name, p->sha1, "keep");
+               unlink_or_warn(name.buf);
        }
+       strbuf_release(&name);
 }
 
 static int loosen_small_pack(const struct packed_git *p)
@@ -1035,6 +1033,7 @@ static void end_packfile(void)
                        die("core git rejected index %s", idx_name);
                all_packs[pack_id] = new_p;
                install_packed_git(new_p);
+               free(idx_name);
 
                /* Print the boundary */
                if (pack_edges) {
@@ -1175,7 +1174,8 @@ static int store_object(
                delta_count_by_type[type]++;
                e->depth = last->depth + 1;
 
-               hdrlen = encode_in_pack_object_header(OBJ_OFS_DELTA, deltalen, hdr);
+               hdrlen = encode_in_pack_object_header(hdr, sizeof(hdr),
+                                                     OBJ_OFS_DELTA, deltalen);
                sha1write(pack_file, hdr, hdrlen);
                pack_size += hdrlen;
 
@@ -1186,7 +1186,8 @@ static int store_object(
                pack_size += sizeof(hdr) - pos;
        } else {
                e->depth = 0;
-               hdrlen = encode_in_pack_object_header(type, dat->len, hdr);
+               hdrlen = encode_in_pack_object_header(hdr, sizeof(hdr),
+                                                     type, dat->len);
                sha1write(pack_file, hdr, hdrlen);
                pack_size += hdrlen;
        }
@@ -1239,9 +1240,7 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
        sha1file_checkpoint(pack_file, &checkpoint);
        offset = checkpoint.offset;
 
-       hdrlen = snprintf((char *)out_buf, out_sz, "blob %" PRIuMAX, len) + 1;
-       if (out_sz <= hdrlen)
-               die("impossibly large object header");
+       hdrlen = xsnprintf((char *)out_buf, out_sz, "blob %" PRIuMAX, len) + 1;
 
        git_SHA1_Init(&c);
        git_SHA1_Update(&c, out_buf, hdrlen);
@@ -1250,9 +1249,7 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
 
        git_deflate_init(&s, pack_compression_level);
 
-       hdrlen = encode_in_pack_object_header(OBJ_BLOB, len, out_buf);
-       if (out_sz <= hdrlen)
-               die("impossibly large object header");
+       hdrlen = encode_in_pack_object_header(out_buf, out_sz, OBJ_BLOB, len);
 
        s.next_out = out_buf + hdrlen;
        s.avail_out = out_sz - hdrlen;
@@ -1460,9 +1457,9 @@ static void mktree(struct tree_content *t, int v, struct strbuf *b)
        unsigned int i;
 
        if (!v)
-               qsort(t->entries,t->entry_count,sizeof(t->entries[0]),tecmp0);
+               QSORT(t->entries, t->entry_count, tecmp0);
        else
-               qsort(t->entries,t->entry_count,sizeof(t->entries[0]),tecmp1);
+               QSORT(t->entries, t->entry_count, tecmp1);
 
        for (i = 0; i < t->entry_count; i++) {
                if (t->entries[i]->versions[v].mode)
@@ -1754,7 +1751,7 @@ static int update_branch(struct branch *b)
 
        if (is_null_sha1(b->sha1)) {
                if (b->delete)
-                       delete_ref(b->name, NULL, 0);
+                       delete_ref(NULL, b->name, NULL, 0);
                return 0;
        }
        if (read_ref(b->name, old_sha1))
@@ -2220,13 +2217,17 @@ static uintmax_t do_change_note_fanout(
                char *fullpath, unsigned int fullpath_len,
                unsigned char fanout)
 {
-       struct tree_content *t = root->tree;
+       struct tree_content *t;
        struct tree_entry *e, leaf;
        unsigned int i, tmp_hex_sha1_len, tmp_fullpath_len;
        uintmax_t num_notes = 0;
        unsigned char sha1[20];
        char realpath[60];
 
+       if (!root->tree)
+               load_tree(root);
+       t = root->tree;
+
        for (i = 0; t && i < t->entry_count; i++) {
                e = t->entries[i];
                tmp_hex_sha1_len = hex_sha1_len + e->name->str_len;
@@ -2278,8 +2279,6 @@ static uintmax_t do_change_note_fanout(
                                leaf.tree);
                } else if (S_ISDIR(e->versions[1].mode)) {
                        /* This is a subdir that may contain note entries */
-                       if (!e->tree)
-                               load_tree(e);
                        num_notes += do_change_note_fanout(orig_root, e,
                                hex_sha1, tmp_hex_sha1_len,
                                fullpath, tmp_fullpath_len, fanout);
@@ -3003,7 +3002,7 @@ static void parse_get_mark(const char *p)
        if (!oe)
                die("Unknown mark: %s", command_buf.buf);
 
-       snprintf(output, sizeof(output), "%s\n", sha1_to_hex(oe->idx.sha1));
+       xsnprintf(output, sizeof(output), "%s\n", sha1_to_hex(oe->idx.sha1));
        cat_blob_write(output, 41);
 }
 
@@ -3203,7 +3202,7 @@ static char* make_fast_import_path(const char *path)
 {
        if (!relative_marks_paths || is_absolute_path(path))
                return xstrdup(path);
-       return xstrdup(git_path("info/fast-import/%s", path));
+       return git_pathdup("info/fast-import/%s", path);
 }
 
 static void option_import_marks(const char *marks,
@@ -3381,15 +3380,6 @@ static void git_pack_config(void)
                if (max_depth > MAX_DEPTH)
                        max_depth = MAX_DEPTH;
        }
-       if (!git_config_get_int("pack.compression", &pack_compression_level)) {
-               if (pack_compression_level == -1)
-                       pack_compression_level = Z_DEFAULT_COMPRESSION;
-               else if (pack_compression_level < 0 ||
-                        pack_compression_level > Z_BEST_COMPRESSION)
-                       git_die_config("pack.compression",
-                                       "bad pack compression level %d", pack_compression_level);
-               pack_compression_seen = 1;
-       }
        if (!git_config_get_int("pack.indexversion", &indexversion_value)) {
                pack_idx_opts.version = indexversion_value;
                if (pack_idx_opts.version > 2)
@@ -3454,8 +3444,6 @@ int cmd_main(int argc, const char **argv)
        setup_git_directory();
        reset_pack_idx_option(&pack_idx_opts);
        git_pack_config();
-       if (!pack_compression_seen && core_compression_seen)
-               pack_compression_level = core_compression_level;
 
        alloc_objects(object_entry_alloc);
        strbuf_init(&command_buf, 0);
index 413937e7404d163883d5d0456ebefc4e1504cd87..afb8b05024823981be9bedfaa70f7301c6f7076c 100644 (file)
@@ -21,6 +21,8 @@ static int fetch_unpack_limit = -1;
 static int unpack_limit = 100;
 static int prefer_ofs_delta = 1;
 static int no_done;
+static int deepen_since_ok;
+static int deepen_not_ok;
 static int fetch_fsck_objects = -1;
 static int transfer_fsck_objects = -1;
 static int agent_supported;
@@ -33,6 +35,7 @@ static const char *alternate_shallow_file;
 #define COMMON_REF     (1U << 2)
 #define SEEN           (1U << 3)
 #define POPPED         (1U << 4)
+#define ALTERNATE      (1U << 5)
 
 static int marked;
 
@@ -50,6 +53,56 @@ static int non_common_revs, multi_ack, use_sideband;
 #define ALLOW_REACHABLE_SHA1   02
 static unsigned int allow_unadvertised_object_request;
 
+__attribute__((format (printf, 2, 3)))
+static inline void print_verbose(const struct fetch_pack_args *args,
+                                const char *fmt, ...)
+{
+       va_list params;
+
+       if (!args->verbose)
+               return;
+
+       va_start(params, fmt);
+       vfprintf(stderr, fmt, params);
+       va_end(params);
+       fputc('\n', stderr);
+}
+
+struct alternate_object_cache {
+       struct object **items;
+       size_t nr, alloc;
+};
+
+static void cache_one_alternate(const char *refname,
+                               const struct object_id *oid,
+                               void *vcache)
+{
+       struct alternate_object_cache *cache = vcache;
+       struct object *obj = parse_object(oid->hash);
+
+       if (!obj || (obj->flags & ALTERNATE))
+               return;
+
+       obj->flags |= ALTERNATE;
+       ALLOC_GROW(cache->items, cache->nr + 1, cache->alloc);
+       cache->items[cache->nr++] = obj;
+}
+
+static void for_each_cached_alternate(void (*cb)(struct object *))
+{
+       static int initialized;
+       static struct alternate_object_cache cache;
+       size_t i;
+
+       if (!initialized) {
+               for_each_alternate_ref(cache_one_alternate, &cache);
+               initialized = 1;
+       }
+
+       for (i = 0; i < cache.nr; i++)
+               cb(cache.items[i]);
+}
+
 static void rev_list_push(struct commit *commit, int mark)
 {
        if (!(commit->object.flags & mark)) {
@@ -182,7 +235,7 @@ enum ack_type {
 
 static void consume_shallow_list(struct fetch_pack_args *args, int fd)
 {
-       if (args->stateless_rpc && args->depth > 0) {
+       if (args->stateless_rpc && args->deepen) {
                /* If we sent a depth we will get back "duplicate"
                 * shallow and unshallow commands every time there
                 * is a block of have lines exchanged.
@@ -193,7 +246,7 @@ static void consume_shallow_list(struct fetch_pack_args *args, int fd)
                                continue;
                        if (starts_with(line, "unshallow "))
                                continue;
-                       die("git fetch-pack: expected shallow list");
+                       die(_("git fetch-pack: expected shallow list"));
                }
        }
 }
@@ -205,7 +258,7 @@ static enum ack_type get_ack(int fd, unsigned char *result_sha1)
        const char *arg;
 
        if (!len)
-               die("git fetch-pack: expected ACK/NAK, got EOF");
+               die(_("git fetch-pack: expected ACK/NAK, got EOF"));
        if (!strcmp(line, "NAK"))
                return NAK;
        if (skip_prefix(line, "ACK ", &arg)) {
@@ -223,7 +276,9 @@ static enum ack_type get_ack(int fd, unsigned char *result_sha1)
                        return ACK;
                }
        }
-       die("git fetch_pack: expected ACK/NAK, got '%s'", line);
+       if (skip_prefix(line, "ERR ", &arg))
+               die(_("remote error: %s"), arg);
+       die(_("git fetch-pack: expected ACK/NAK, got '%s'"), line);
 }
 
 static void send_request(struct fetch_pack_args *args,
@@ -236,9 +291,9 @@ static void send_request(struct fetch_pack_args *args,
                write_or_die(fd, buf->buf, buf->len);
 }
 
-static void insert_one_alternate_ref(const struct ref *ref, void *unused)
+static void insert_one_alternate_object(struct object *obj)
 {
-       rev_list_insert_ref(NULL, ref->old_oid.hash);
+       rev_list_insert_ref(NULL, obj->oid.hash);
 }
 
 #define INITIAL_FLUSH 16
@@ -275,13 +330,13 @@ static int find_common(struct fetch_pack_args *args,
        size_t state_len = 0;
 
        if (args->stateless_rpc && multi_ack == 1)
-               die("--stateless-rpc requires multi_ack_detailed");
+               die(_("--stateless-rpc requires multi_ack_detailed"));
        if (marked)
                for_each_ref(clear_marks, NULL);
        marked = 1;
 
        for_each_ref(rev_list_insert_ref_oid, NULL);
-       for_each_alternate_ref(insert_one_alternate_ref, NULL);
+       for_each_cached_alternate(insert_one_alternate_object);
 
        fetching = 0;
        for ( ; refs ; refs = refs->next) {
@@ -312,10 +367,13 @@ static int find_common(struct fetch_pack_args *args,
                        if (no_done)            strbuf_addstr(&c, " no-done");
                        if (use_sideband == 2)  strbuf_addstr(&c, " side-band-64k");
                        if (use_sideband == 1)  strbuf_addstr(&c, " side-band");
+                       if (args->deepen_relative) strbuf_addstr(&c, " deepen-relative");
                        if (args->use_thin_pack) strbuf_addstr(&c, " thin-pack");
                        if (args->no_progress)   strbuf_addstr(&c, " no-progress");
                        if (args->include_tag)   strbuf_addstr(&c, " include-tag");
                        if (prefer_ofs_delta)   strbuf_addstr(&c, " ofs-delta");
+                       if (deepen_since_ok)    strbuf_addstr(&c, " deepen-since");
+                       if (deepen_not_ok)      strbuf_addstr(&c, " deepen-not");
                        if (agent_supported)    strbuf_addf(&c, " agent=%s",
                                                            git_user_agent_sanitized());
                        packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
@@ -335,10 +393,21 @@ static int find_common(struct fetch_pack_args *args,
                write_shallow_commits(&req_buf, 1, NULL);
        if (args->depth > 0)
                packet_buf_write(&req_buf, "deepen %d", args->depth);
+       if (args->deepen_since) {
+               unsigned long max_age = approxidate(args->deepen_since);
+               packet_buf_write(&req_buf, "deepen-since %lu", max_age);
+       }
+       if (args->deepen_not) {
+               int i;
+               for (i = 0; i < args->deepen_not->nr; i++) {
+                       struct string_list_item *s = args->deepen_not->items + i;
+                       packet_buf_write(&req_buf, "deepen-not %s", s->string);
+               }
+       }
        packet_buf_flush(&req_buf);
        state_len = req_buf.len;
 
-       if (args->depth > 0) {
+       if (args->deepen) {
                char *line;
                const char *arg;
                unsigned char sha1[20];
@@ -347,23 +416,23 @@ static int find_common(struct fetch_pack_args *args,
                while ((line = packet_read_line(fd[0], NULL))) {
                        if (skip_prefix(line, "shallow ", &arg)) {
                                if (get_sha1_hex(arg, sha1))
-                                       die("invalid shallow line: %s", line);
+                                       die(_("invalid shallow line: %s"), line);
                                register_shallow(sha1);
                                continue;
                        }
                        if (skip_prefix(line, "unshallow ", &arg)) {
                                if (get_sha1_hex(arg, sha1))
-                                       die("invalid unshallow line: %s", line);
+                                       die(_("invalid unshallow line: %s"), line);
                                if (!lookup_object(sha1))
-                                       die("object not found: %s", line);
+                                       die(_("object not found: %s"), line);
                                /* make sure that it is parsed as shallow */
                                if (!parse_object(sha1))
-                                       die("error in object: %s", line);
+                                       die(_("error in object: %s"), line);
                                if (unregister_shallow(sha1))
-                                       die("no shallow found: %s", line);
+                                       die(_("no shallow found: %s"), line);
                                continue;
                        }
-                       die("expected shallow/unshallow, got %s", line);
+                       die(_("expected shallow/unshallow, got %s"), line);
                }
        } else if (!args->stateless_rpc)
                send_request(args, fd[1], &req_buf);
@@ -380,8 +449,7 @@ static int find_common(struct fetch_pack_args *args,
        retval = -1;
        while ((sha1 = get_rev())) {
                packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
-               if (args->verbose)
-                       fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
+               print_verbose(args, "have %s", sha1_to_hex(sha1));
                in_vain++;
                if (flush_at <= ++count) {
                        int ack;
@@ -402,9 +470,9 @@ static int find_common(struct fetch_pack_args *args,
                        consume_shallow_list(args, fd[0]);
                        do {
                                ack = get_ack(fd[0], result_sha1);
-                               if (args->verbose && ack)
-                                       fprintf(stderr, "got ack %d %s\n", ack,
-                                                       sha1_to_hex(result_sha1));
+                               if (ack)
+                                       print_verbose(args, _("got %s %d %s"), "ack",
+                                                     ack, sha1_to_hex(result_sha1));
                                switch (ack) {
                                case ACK:
                                        flushes = 0;
@@ -417,7 +485,7 @@ static int find_common(struct fetch_pack_args *args,
                                        struct commit *commit =
                                                lookup_commit(result_sha1);
                                        if (!commit)
-                                               die("invalid commit %s", sha1_to_hex(result_sha1));
+                                               die(_("invalid commit %s"), sha1_to_hex(result_sha1));
                                        if (args->stateless_rpc
                                         && ack == ACK_common
                                         && !(commit->object.flags & COMMON)) {
@@ -450,8 +518,7 @@ static int find_common(struct fetch_pack_args *args,
                        } while (ack);
                        flushes--;
                        if (got_continue && MAX_IN_VAIN < in_vain) {
-                               if (args->verbose)
-                                       fprintf(stderr, "giving up\n");
+                               print_verbose(args, _("giving up"));
                                break; /* give up */
                        }
                }
@@ -461,8 +528,7 @@ done:
                packet_buf_write(&req_buf, "done\n");
                send_request(args, fd[1], &req_buf);
        }
-       if (args->verbose)
-               fprintf(stderr, "done\n");
+       print_verbose(args, _("done"));
        if (retval != 0) {
                multi_ack = 0;
                flushes++;
@@ -474,9 +540,8 @@ done:
        while (flushes || multi_ack) {
                int ack = get_ack(fd[0], result_sha1);
                if (ack) {
-                       if (args->verbose)
-                               fprintf(stderr, "got ack (%d) %s\n", ack,
-                                       sha1_to_hex(result_sha1));
+                       print_verbose(args, _("got %s (%d) %s"), "ack",
+                                     ack, sha1_to_hex(result_sha1));
                        if (ack == ACK)
                                return 0;
                        multi_ack = 1;
@@ -521,9 +586,8 @@ static void mark_recent_complete_commits(struct fetch_pack_args *args,
                                         unsigned long cutoff)
 {
        while (complete && cutoff <= complete->item->date) {
-               if (args->verbose)
-                       fprintf(stderr, "Marking %s as complete\n",
-                               oid_to_hex(&complete->item->object.oid));
+               print_verbose(args, _("Marking %s as complete"),
+                             oid_to_hex(&complete->item->object.oid));
                pop_most_recent_commit(&complete, COMPLETE);
        }
 }
@@ -552,14 +616,14 @@ static void filter_refs(struct fetch_pack_args *args,
                                        break; /* definitely do not have it */
                                else if (cmp == 0) {
                                        keep = 1; /* definitely have it */
-                                       sought[i]->matched = 1;
+                                       sought[i]->match_status = REF_MATCHED;
                                }
                                i++;
                        }
                }
 
                if (!keep && args->fetch_all &&
-                   (!args->depth || !starts_with(ref->name, "refs/tags/")))
+                   (!args->deepen || !starts_with(ref->name, "refs/tags/")))
                        keep = 1;
 
                if (keep) {
@@ -572,30 +636,32 @@ static void filter_refs(struct fetch_pack_args *args,
        }
 
        /* Append unmatched requests to the list */
-       if ((allow_unadvertised_object_request &
-           (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1))) {
-               for (i = 0; i < nr_sought; i++) {
-                       unsigned char sha1[20];
+       for (i = 0; i < nr_sought; i++) {
+               unsigned char sha1[20];
 
-                       ref = sought[i];
-                       if (ref->matched)
-                               continue;
-                       if (get_sha1_hex(ref->name, sha1) ||
-                           ref->name[40] != '\0' ||
-                           hashcmp(sha1, ref->old_oid.hash))
-                               continue;
+               ref = sought[i];
+               if (ref->match_status != REF_NOT_MATCHED)
+                       continue;
+               if (get_sha1_hex(ref->name, sha1) ||
+                   ref->name[40] != '\0' ||
+                   hashcmp(sha1, ref->old_oid.hash))
+                       continue;
 
-                       ref->matched = 1;
+               if ((allow_unadvertised_object_request &
+                   (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1))) {
+                       ref->match_status = REF_MATCHED;
                        *newtail = copy_ref(ref);
                        newtail = &(*newtail)->next;
+               } else {
+                       ref->match_status = REF_UNADVERTISED_NOT_ALLOWED;
                }
        }
        *refs = newlist;
 }
 
-static void mark_alternate_complete(const struct ref *ref, void *unused)
+static void mark_alternate_complete(struct object *obj)
 {
-       mark_complete(ref->old_oid.hash);
+       mark_complete(obj->oid.hash);
 }
 
 static int everything_local(struct fetch_pack_args *args,
@@ -629,9 +695,9 @@ static int everything_local(struct fetch_pack_args *args,
                }
        }
 
-       if (!args->depth) {
+       if (!args->deepen) {
                for_each_ref(mark_complete_oid, NULL);
-               for_each_alternate_ref(mark_alternate_complete, NULL);
+               for_each_cached_alternate(mark_alternate_complete);
                commit_list_sort_by_date(&complete);
                if (cutoff)
                        mark_recent_complete_commits(args, cutoff);
@@ -664,18 +730,12 @@ static int everything_local(struct fetch_pack_args *args,
                o = lookup_object(remote);
                if (!o || !(o->flags & COMPLETE)) {
                        retval = 0;
-                       if (!args->verbose)
-                               continue;
-                       fprintf(stderr,
-                               "want %s (%s)\n", sha1_to_hex(remote),
-                               ref->name);
+                       print_verbose(args, "want %s (%s)", sha1_to_hex(remote),
+                                     ref->name);
                        continue;
                }
-               if (!args->verbose)
-                       continue;
-               fprintf(stderr,
-                       "already have %s (%s)\n", sha1_to_hex(remote),
-                       ref->name);
+               print_verbose(args, _("already have %s (%s)"), sha1_to_hex(remote),
+                             ref->name);
        }
        return retval;
 }
@@ -712,8 +772,7 @@ static int get_pack(struct fetch_pack_args *args,
                demux.out = -1;
                demux.isolate_sigpipe = 1;
                if (start_async(&demux))
-                       die("fetch-pack: unable to fork off sideband"
-                           " demultiplexer");
+                       die(_("fetch-pack: unable to fork off sideband demultiplexer"));
        }
        else
                demux.out = xd[0];
@@ -721,7 +780,7 @@ static int get_pack(struct fetch_pack_args *args,
        if (!args->keep_pack && unpack_limit) {
 
                if (read_pack_header(demux.out, &header))
-                       die("protocol error: bad pack header");
+                       die(_("protocol error: bad pack header"));
                pass_header = 1;
                if (ntohl(header.hdr_entries) < unpack_limit)
                        do_keep = 0;
@@ -745,8 +804,8 @@ static int get_pack(struct fetch_pack_args *args,
                if (args->use_thin_pack)
                        argv_array_push(&cmd.args, "--fix-thin");
                if (args->lock_pack || unpack_limit) {
-                       char hostname[256];
-                       if (gethostname(hostname, sizeof(hostname)))
+                       char hostname[HOST_NAME_MAX + 1];
+                       if (xgethostname(hostname, sizeof(hostname)))
                                xsnprintf(hostname, sizeof(hostname), "localhost");
                        argv_array_pushf(&cmd.args,
                                        "--keep=fetch-pack %"PRIuMAX " on %s",
@@ -777,7 +836,7 @@ static int get_pack(struct fetch_pack_args *args,
        cmd.in = demux.out;
        cmd.git_cmd = 1;
        if (start_command(&cmd))
-               die("fetch-pack: unable to fork off %s", cmd_name);
+               die(_("fetch-pack: unable to fork off %s"), cmd_name);
        if (do_keep && pack_lockfile) {
                *pack_lockfile = index_pack_lockfile(cmd.out);
                close(cmd.out);
@@ -793,9 +852,9 @@ static int get_pack(struct fetch_pack_args *args,
                        args->check_self_contained_and_connected &&
                        ret == 0;
        else
-               die("%s failed", cmd_name);
+               die(_("%s failed"), cmd_name);
        if (use_sideband && finish_async(&demux))
-               die("error in sideband demultiplexer");
+               die(_("error in sideband demultiplexer"));
        return 0;
 }
 
@@ -819,44 +878,39 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
        int agent_len;
 
        sort_ref_list(&ref, ref_compare_name);
-       qsort(sought, nr_sought, sizeof(*sought), cmp_ref_by_name);
+       QSORT(sought, nr_sought, cmp_ref_by_name);
 
        if ((args->depth > 0 || is_repository_shallow()) && !server_supports("shallow"))
-               die("Server does not support shallow clients");
+               die(_("Server does not support shallow clients"));
+       if (args->depth > 0 || args->deepen_since || args->deepen_not)
+               args->deepen = 1;
        if (server_supports("multi_ack_detailed")) {
-               if (args->verbose)
-                       fprintf(stderr, "Server supports multi_ack_detailed\n");
+               print_verbose(args, _("Server supports multi_ack_detailed"));
                multi_ack = 2;
                if (server_supports("no-done")) {
-                       if (args->verbose)
-                               fprintf(stderr, "Server supports no-done\n");
+                       print_verbose(args, _("Server supports no-done"));
                        if (args->stateless_rpc)
                                no_done = 1;
                }
        }
        else if (server_supports("multi_ack")) {
-               if (args->verbose)
-                       fprintf(stderr, "Server supports multi_ack\n");
+               print_verbose(args, _("Server supports multi_ack"));
                multi_ack = 1;
        }
        if (server_supports("side-band-64k")) {
-               if (args->verbose)
-                       fprintf(stderr, "Server supports side-band-64k\n");
+               print_verbose(args, _("Server supports side-band-64k"));
                use_sideband = 2;
        }
        else if (server_supports("side-band")) {
-               if (args->verbose)
-                       fprintf(stderr, "Server supports side-band\n");
+               print_verbose(args, _("Server supports side-band"));
                use_sideband = 1;
        }
        if (server_supports("allow-tip-sha1-in-want")) {
-               if (args->verbose)
-                       fprintf(stderr, "Server supports allow-tip-sha1-in-want\n");
+               print_verbose(args, _("Server supports allow-tip-sha1-in-want"));
                allow_unadvertised_object_request |= ALLOW_TIP_SHA1;
        }
        if (server_supports("allow-reachable-sha1-in-want")) {
-               if (args->verbose)
-                       fprintf(stderr, "Server supports allow-reachable-sha1-in-want\n");
+               print_verbose(args, _("Server supports allow-reachable-sha1-in-want"));
                allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1;
        }
        if (!server_supports("thin-pack"))
@@ -865,18 +919,27 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
                args->no_progress = 0;
        if (!server_supports("include-tag"))
                args->include_tag = 0;
-       if (server_supports("ofs-delta")) {
-               if (args->verbose)
-                       fprintf(stderr, "Server supports ofs-delta\n");
-       } else
+       if (server_supports("ofs-delta"))
+               print_verbose(args, _("Server supports ofs-delta"));
+       else
                prefer_ofs_delta = 0;
 
        if ((agent_feature = server_feature_value("agent", &agent_len))) {
                agent_supported = 1;
-               if (args->verbose && agent_len)
-                       fprintf(stderr, "Server version is %.*s\n",
-                               agent_len, agent_feature);
+               if (agent_len)
+                       print_verbose(args, _("Server version is %.*s"),
+                                     agent_len, agent_feature);
        }
+       if (server_supports("deepen-since"))
+               deepen_since_ok = 1;
+       else if (args->deepen_since)
+               die(_("Server does not support --shallow-since"));
+       if (server_supports("deepen-not"))
+               deepen_not_ok = 1;
+       else if (args->deepen_not)
+               die(_("Server does not support --shallow-exclude"));
+       if (!server_supports("deepen-relative") && args->deepen_relative)
+               die(_("Server does not support --deepen"));
 
        if (everything_local(args, &ref, sought, nr_sought)) {
                packet_flush(fd[1]);
@@ -887,11 +950,11 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
                        /* When cloning, it is not unusual to have
                         * no common commit.
                         */
-                       warning("no common commits");
+                       warning(_("no common commits"));
 
        if (args->stateless_rpc)
                packet_flush(fd[1]);
-       if (args->depth > 0)
+       if (args->deepen)
                setup_alternate_shallow(&shallow_lock, &alternate_shallow_file,
                                        NULL);
        else if (si->nr_ours || si->nr_theirs)
@@ -899,7 +962,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
        else
                alternate_shallow_file = NULL;
        if (get_pack(args, fd, pack_lockfile))
-               die("git fetch-pack: fetch failed.");
+               die(_("git fetch-pack: fetch failed."));
 
  all_done:
        return ref;
@@ -954,11 +1017,11 @@ static void update_shallow(struct fetch_pack_args *args,
                           struct ref **sought, int nr_sought,
                           struct shallow_info *si)
 {
-       struct sha1_array ref = SHA1_ARRAY_INIT;
+       struct oid_array ref = OID_ARRAY_INIT;
        int *status;
        int i;
 
-       if (args->depth > 0 && alternate_shallow_file) {
+       if (args->deepen && alternate_shallow_file) {
                if (*alternate_shallow_file == '\0') { /* --unshallow */
                        unlink_or_warn(git_path_shallow());
                        rollback_lock_file(&shallow_lock);
@@ -977,18 +1040,18 @@ static void update_shallow(struct fetch_pack_args *args,
                 * shallow points that exist in the pack (iow in repo
                 * after get_pack() and reprepare_packed_git())
                 */
-               struct sha1_array extra = SHA1_ARRAY_INIT;
-               unsigned char (*sha1)[20] = si->shallow->sha1;
+               struct oid_array extra = OID_ARRAY_INIT;
+               struct object_id *oid = si->shallow->oid;
                for (i = 0; i < si->shallow->nr; i++)
-                       if (has_sha1_file(sha1[i]))
-                               sha1_array_append(&extra, sha1[i]);
+                       if (has_object_file(&oid[i]))
+                               oid_array_append(&extra, &oid[i]);
                if (extra.nr) {
                        setup_alternate_shallow(&shallow_lock,
                                                &alternate_shallow_file,
                                                &extra);
                        commit_lock_file(&shallow_lock);
                }
-               sha1_array_clear(&extra);
+               oid_array_clear(&extra);
                return;
        }
 
@@ -999,7 +1062,7 @@ static void update_shallow(struct fetch_pack_args *args,
        if (!si->nr_ours && !si->nr_theirs)
                return;
        for (i = 0; i < nr_sought; i++)
-               sha1_array_append(&ref, sought[i]->old_oid.hash);
+               oid_array_append(&ref, &sought[i]->old_oid);
        si->ref = &ref;
 
        if (args->update_shallow) {
@@ -1009,23 +1072,23 @@ static void update_shallow(struct fetch_pack_args *args,
                 * shallow roots that are actually reachable from new
                 * refs.
                 */
-               struct sha1_array extra = SHA1_ARRAY_INIT;
-               unsigned char (*sha1)[20] = si->shallow->sha1;
+               struct oid_array extra = OID_ARRAY_INIT;
+               struct object_id *oid = si->shallow->oid;
                assign_shallow_commits_to_refs(si, NULL, NULL);
                if (!si->nr_ours && !si->nr_theirs) {
-                       sha1_array_clear(&ref);
+                       oid_array_clear(&ref);
                        return;
                }
                for (i = 0; i < si->nr_ours; i++)
-                       sha1_array_append(&extra, sha1[si->ours[i]]);
+                       oid_array_append(&extra, &oid[si->ours[i]]);
                for (i = 0; i < si->nr_theirs; i++)
-                       sha1_array_append(&extra, sha1[si->theirs[i]]);
+                       oid_array_append(&extra, &oid[si->theirs[i]]);
                setup_alternate_shallow(&shallow_lock,
                                        &alternate_shallow_file,
                                        &extra);
                commit_lock_file(&shallow_lock);
-               sha1_array_clear(&extra);
-               sha1_array_clear(&ref);
+               oid_array_clear(&extra);
+               oid_array_clear(&ref);
                return;
        }
 
@@ -1041,7 +1104,7 @@ static void update_shallow(struct fetch_pack_args *args,
                                sought[i]->status = REF_STATUS_REJECT_SHALLOW;
        }
        free(status);
-       sha1_array_clear(&ref);
+       oid_array_clear(&ref);
 }
 
 struct ref *fetch_pack(struct fetch_pack_args *args,
@@ -1049,7 +1112,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
                       const struct ref *ref,
                       const char *dest,
                       struct ref **sought, int nr_sought,
-                      struct sha1_array *shallow,
+                      struct oid_array *shallow,
                       char **pack_lockfile)
 {
        struct ref *ref_cpy;
@@ -1061,7 +1124,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
 
        if (!ref) {
                packet_flush(fd[1]);
-               die("no matching remote head");
+               die(_("no matching remote head"));
        }
        prepare_shallow_info(&si, shallow);
        ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought,
@@ -1071,3 +1134,26 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
        clear_shallow_info(&si);
        return ref_cpy;
 }
+
+int report_unmatched_refs(struct ref **sought, int nr_sought)
+{
+       int i, ret = 0;
+
+       for (i = 0; i < nr_sought; i++) {
+               if (!sought[i])
+                       continue;
+               switch (sought[i]->match_status) {
+               case REF_MATCHED:
+                       continue;
+               case REF_NOT_MATCHED:
+                       error(_("no such remote ref %s"), sought[i]->name);
+                       break;
+               case REF_UNADVERTISED_NOT_ALLOWED:
+                       error(_("Server does not allow request for unadvertised object %s"),
+                             sought[i]->name);
+                       break;
+               }
+               ret = 1;
+       }
+       return ret;
+}
index bb7fd76e5939d812f1f89b787324ae6ec519ca15..b6aeb43a8e21437581e0e834e77754922f8c6ee9 100644 (file)
@@ -4,12 +4,15 @@
 #include "string-list.h"
 #include "run-command.h"
 
-struct sha1_array;
+struct oid_array;
 
 struct fetch_pack_args {
        const char *uploadpack;
        int unpacklimit;
        int depth;
+       const char *deepen_since;
+       const struct string_list *deepen_not;
+       unsigned deepen_relative:1;
        unsigned quiet:1;
        unsigned keep_pack:1;
        unsigned lock_pack:1;
@@ -25,6 +28,7 @@ struct fetch_pack_args {
        unsigned self_contained_and_connected:1;
        unsigned cloning:1;
        unsigned update_shallow:1;
+       unsigned deepen:1;
 };
 
 /*
@@ -38,7 +42,13 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
                       const char *dest,
                       struct ref **sought,
                       int nr_sought,
-                      struct sha1_array *shallow,
+                      struct oid_array *shallow,
                       char **pack_lockfile);
 
+/*
+ * Print an appropriate error message for each sought ref that wasn't
+ * matched.  Return 0 if all sought refs were matched, otherwise 1.
+ */
+int report_unmatched_refs(struct ref **sought, int nr_sought);
+
 #endif
diff --git a/fsck.c b/fsck.c
index c9cf3de8d315c05cd238529ba20fe3925c993ec1..e6152e4e6d426bd92ae7ae063346f25f85ddd8de 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -132,10 +132,10 @@ static int fsck_msg_type(enum fsck_msg_id msg_id,
 
 static void init_skiplist(struct fsck_options *options, const char *path)
 {
-       static struct sha1_array skiplist = SHA1_ARRAY_INIT;
+       static struct oid_array skiplist = OID_ARRAY_INIT;
        int sorted, fd;
-       char buffer[41];
-       unsigned char sha1[20];
+       char buffer[GIT_MAX_HEXSZ + 1];
+       struct object_id oid;
 
        if (options->skiplist)
                sorted = options->skiplist->sorted;
@@ -148,17 +148,18 @@ static void init_skiplist(struct fsck_options *options, const char *path)
        if (fd < 0)
                die("Could not open skip list: %s", path);
        for (;;) {
+               const char *p;
                int result = read_in_full(fd, buffer, sizeof(buffer));
                if (result < 0)
                        die_errno("Could not read '%s'", path);
                if (!result)
                        break;
-               if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n')
+               if (parse_oid_hex(buffer, &oid, &p) || *p != '\n')
                        die("Invalid SHA-1: %s", buffer);
-               sha1_array_append(&skiplist, sha1);
+               oid_array_append(&skiplist, &oid);
                if (sorted && skiplist.nr > 1 &&
-                               hashcmp(skiplist.sha1[skiplist.nr - 2],
-                                       sha1) > 0)
+                               oidcmp(&skiplist.oid[skiplist.nr - 2],
+                                      &oid) > 0)
                        sorted = 0;
        }
        close(fd);
@@ -279,7 +280,7 @@ static int report(struct fsck_options *options, struct object *object,
                return 0;
 
        if (options->skiplist && object &&
-                       sha1_array_lookup(options->skiplist, object->oid.hash) >= 0)
+                       oid_array_lookup(options->skiplist, &object->oid) >= 0)
                return 0;
 
        if (msg_type == FSCK_FATAL)
@@ -347,8 +348,9 @@ static int fsck_walk_tree(struct tree *tree, void *data, struct fsck_options *op
                return -1;
 
        name = get_object_name(options, &tree->object);
-       init_tree_desc(&desc, tree->buffer, tree->size);
-       while (tree_entry(&desc, &entry)) {
+       if (init_tree_desc_gently(&desc, tree->buffer, tree->size))
+               return -1;
+       while (tree_entry_gently(&desc, &entry)) {
                struct object *obj;
                int result;
 
@@ -457,6 +459,10 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options)
 {
        if (!obj)
                return -1;
+
+       if (obj->type == OBJ_NONE)
+               parse_object(obj->oid.hash);
+
        switch (obj->type) {
        case OBJ_BLOB:
                return 0;
@@ -520,7 +526,7 @@ static int verify_ordered(unsigned mode1, const char *name1, unsigned mode2, con
 
 static int fsck_tree(struct tree *item, struct fsck_options *options)
 {
-       int retval;
+       int retval = 0;
        int has_null_sha1 = 0;
        int has_full_path = 0;
        int has_empty_name = 0;
@@ -535,7 +541,10 @@ static int fsck_tree(struct tree *item, struct fsck_options *options)
        unsigned o_mode;
        const char *o_name;
 
-       init_tree_desc(&desc, item->buffer, item->size);
+       if (init_tree_desc_gently(&desc, item->buffer, item->size)) {
+               retval += report(options, &item->object, FSCK_MSG_BAD_TREE, "cannot be parsed as a tree");
+               return retval;
+       }
 
        o_mode = 0;
        o_name = NULL;
@@ -556,7 +565,10 @@ static int fsck_tree(struct tree *item, struct fsck_options *options)
                               is_hfs_dotgit(name) ||
                               is_ntfs_dotgit(name));
                has_zero_pad |= *(char *)desc.buffer == '0';
-               update_tree_entry(&desc);
+               if (update_tree_entry_gently(&desc)) {
+                       retval += report(options, &item->object, FSCK_MSG_BAD_TREE, "cannot be parsed as a tree");
+                       break;
+               }
 
                switch (mode) {
                /*
@@ -597,7 +609,6 @@ static int fsck_tree(struct tree *item, struct fsck_options *options)
                o_name = name;
        }
 
-       retval = 0;
        if (has_null_sha1)
                retval += report(options, &item->object, FSCK_MSG_NULL_SHA1, "contains entries pointing to null sha1");
        if (has_full_path)
diff --git a/fsck.h b/fsck.h
index 1891c1863be85c0607a86023e3da3d39d0dae22c..4525510d99abfc0ae523e0d556345db84fc8c302 100644 (file)
--- a/fsck.h
+++ b/fsck.h
@@ -34,7 +34,7 @@ struct fsck_options {
        fsck_error error_func;
        unsigned strict:1;
        int *msg_type;
-       struct sha1_array *skiplist;
+       struct oid_array *skiplist;
        struct decoration *object_names;
 };
 
index 642cce1ac6e158207f4273d4e1bf1e7928865b18..c55c612455205a045bbcae134fa6eeb2c2a3a5bb 100755 (executable)
@@ -4,6 +4,7 @@ use 5.008;
 use strict;
 use warnings;
 use Git;
+use Git::I18N;
 
 binmode(STDOUT, ":raw");
 
@@ -45,7 +46,7 @@ my ($diff_new_color) =
 my $normal_color = $repo->get_color("", "reset");
 
 my $diff_algorithm = $repo->config('diff.algorithm');
-my $diff_compaction_heuristic = $repo->config_bool('diff.compactionheuristic');
+my $diff_indent_heuristic = $repo->config_bool('diff.indentheuristic');
 my $diff_filter = $repo->config('interactive.difffilter');
 
 my $use_readkey = 0;
@@ -91,6 +92,7 @@ sub colored {
 }
 
 # command line options
+my $patch_mode_only;
 my $patch_mode;
 my $patch_mode_revision;
 
@@ -103,9 +105,6 @@ my %patch_modes = (
                DIFF => 'diff-files -p',
                APPLY => sub { apply_patch 'apply --cached', @_; },
                APPLY_CHECK => 'apply --cached',
-               VERB => 'Stage',
-               TARGET => '',
-               PARTICIPLE => 'staging',
                FILTER => 'file-only',
                IS_REVERSE => 0,
        },
@@ -113,9 +112,6 @@ my %patch_modes = (
                DIFF => 'diff-index -p HEAD',
                APPLY => sub { apply_patch 'apply --cached', @_; },
                APPLY_CHECK => 'apply --cached',
-               VERB => 'Stash',
-               TARGET => '',
-               PARTICIPLE => 'stashing',
                FILTER => undef,
                IS_REVERSE => 0,
        },
@@ -123,9 +119,6 @@ my %patch_modes = (
                DIFF => 'diff-index -p --cached',
                APPLY => sub { apply_patch 'apply -R --cached', @_; },
                APPLY_CHECK => 'apply -R --cached',
-               VERB => 'Unstage',
-               TARGET => '',
-               PARTICIPLE => 'unstaging',
                FILTER => 'index-only',
                IS_REVERSE => 1,
        },
@@ -133,9 +126,6 @@ my %patch_modes = (
                DIFF => 'diff-index -R -p --cached',
                APPLY => sub { apply_patch 'apply --cached', @_; },
                APPLY_CHECK => 'apply --cached',
-               VERB => 'Apply',
-               TARGET => ' to index',
-               PARTICIPLE => 'applying',
                FILTER => 'index-only',
                IS_REVERSE => 0,
        },
@@ -143,9 +133,6 @@ my %patch_modes = (
                DIFF => 'diff-files -p',
                APPLY => sub { apply_patch 'apply -R', @_; },
                APPLY_CHECK => 'apply -R',
-               VERB => 'Discard',
-               TARGET => ' from worktree',
-               PARTICIPLE => 'discarding',
                FILTER => 'file-only',
                IS_REVERSE => 1,
        },
@@ -153,9 +140,6 @@ my %patch_modes = (
                DIFF => 'diff-index -p',
                APPLY => sub { apply_patch_for_checkout_commit '-R', @_ },
                APPLY_CHECK => 'apply -R',
-               VERB => 'Discard',
-               TARGET => ' from index and worktree',
-               PARTICIPLE => 'discarding',
                FILTER => undef,
                IS_REVERSE => 1,
        },
@@ -163,15 +147,13 @@ my %patch_modes = (
                DIFF => 'diff-index -R -p',
                APPLY => sub { apply_patch_for_checkout_commit '', @_ },
                APPLY_CHECK => 'apply',
-               VERB => 'Apply',
-               TARGET => ' to index and worktree',
-               PARTICIPLE => 'applying',
                FILTER => undef,
                IS_REVERSE => 0,
        },
 );
 
-my %patch_mode_flavour = %{$patch_modes{stage}};
+$patch_mode = 'stage';
+my %patch_mode_flavour = %{$patch_modes{$patch_mode}};
 
 sub run_cmd_pipe {
        if ($^O eq 'MSWin32') {
@@ -252,8 +234,9 @@ sub list_untracked {
        run_cmd_pipe(qw(git ls-files --others --exclude-standard --), @ARGV);
 }
 
-my $status_fmt = '%12s %12s %s';
-my $status_head = sprintf($status_fmt, 'staged', 'unstaged', 'path');
+# TRANSLATORS: you can adjust this to align "git add -i" status menu
+my $status_fmt = __('%12s %12s %s');
+my $status_head = sprintf($status_fmt, __('staged'), __('unstaged'), __('path'));
 
 {
        my $initial;
@@ -292,26 +275,17 @@ sub list_modified {
        my ($only) = @_;
        my (%data, @return);
        my ($add, $del, $adddel, $file);
-       my @tracked = ();
-
-       if (@ARGV) {
-               @tracked = map {
-                       chomp $_;
-                       unquote_path($_);
-               } run_cmd_pipe(qw(git ls-files --), @ARGV);
-               return if (!@tracked);
-       }
 
        my $reference = get_diff_reference($patch_mode_revision);
        for (run_cmd_pipe(qw(git diff-index --cached
                             --numstat --summary), $reference,
-                            '--', @tracked)) {
+                            '--', @ARGV)) {
                if (($add, $del, $file) =
                    /^([-\d]+)  ([-\d]+)        (.*)/) {
                        my ($change, $bin);
                        $file = unquote_path($file);
                        if ($add eq '-' && $del eq '-') {
-                               $change = 'binary';
+                               $change = __('binary');
                                $bin = 1;
                        }
                        else {
@@ -320,7 +294,7 @@ sub list_modified {
                        $data{$file} = {
                                INDEX => $change,
                                BINARY => $bin,
-                               FILE => 'nothing',
+                               FILE => __('nothing'),
                        }
                }
                elsif (($adddel, $file) =
@@ -330,13 +304,13 @@ sub list_modified {
                }
        }
 
-       for (run_cmd_pipe(qw(git diff-files --numstat --summary --raw --), @tracked)) {
+       for (run_cmd_pipe(qw(git diff-files --numstat --summary --raw --), @ARGV)) {
                if (($add, $del, $file) =
                    /^([-\d]+)  ([-\d]+)        (.*)/) {
                        $file = unquote_path($file);
                        my ($change, $bin);
                        if ($add eq '-' && $del eq '-') {
-                               $change = 'binary';
+                               $change = __('binary');
                                $bin = 1;
                        }
                        else {
@@ -356,7 +330,7 @@ sub list_modified {
                        $file = unquote_path($2);
                        if (!exists $data{$file}) {
                                $data{$file} = +{
-                                       INDEX => 'unchanged',
+                                       INDEX => __('unchanged'),
                                        BINARY => 0,
                                };
                        }
@@ -371,10 +345,10 @@ sub list_modified {
 
                if ($only) {
                        if ($only eq 'index-only') {
-                               next if ($it->{INDEX} eq 'unchanged');
+                               next if ($it->{INDEX} eq __('unchanged'));
                        }
                        if ($only eq 'file-only') {
-                               next if ($it->{FILE} eq 'nothing');
+                               next if ($it->{FILE} eq __('nothing'));
                        }
                }
                push @return, +{
@@ -612,12 +586,12 @@ sub list_and_choose {
                        else {
                                $bottom = $top = find_unique($choice, @stuff);
                                if (!defined $bottom) {
-                                       error_msg "Huh ($choice)?\n";
+                                       error_msg sprintf(__("Huh (%s)?\n"), $choice);
                                        next TOPLOOP;
                                }
                        }
                        if ($opts->{SINGLETON} && $bottom != $top) {
-                               error_msg "Huh ($choice)?\n";
+                               error_msg sprintf(__("Huh (%s)?\n"), $choice);
                                next TOPLOOP;
                        }
                        for ($i = $bottom-1; $i <= $top-1; $i++) {
@@ -636,7 +610,7 @@ sub list_and_choose {
 }
 
 sub singleton_prompt_help_cmd {
-       print colored $help_color, <<\EOF ;
+       print colored $help_color, __ <<'EOF' ;
 Prompt help:
 1          - select a numbered item
 foo        - select item based on unique prefix
@@ -645,7 +619,7 @@ EOF
 }
 
 sub prompt_help_cmd {
-       print colored $help_color, <<\EOF ;
+       print colored $help_color, __ <<'EOF' ;
 Prompt help:
 1          - select a single item
 3-5        - select a range of items
@@ -666,12 +640,18 @@ sub status_cmd {
 sub say_n_paths {
        my $did = shift @_;
        my $cnt = scalar @_;
-       print "$did ";
-       if (1 < $cnt) {
-               print "$cnt paths\n";
-       }
-       else {
-               print "one path\n";
+       if ($did eq 'added') {
+               printf(__n("added %d path\n", "added %d paths\n",
+                          $cnt), $cnt);
+       } elsif ($did eq 'updated') {
+               printf(__n("updated %d path\n", "updated %d paths\n",
+                          $cnt), $cnt);
+       } elsif ($did eq 'reverted') {
+               printf(__n("reverted %d path\n", "reverted %d paths\n",
+                          $cnt), $cnt);
+       } else {
+               printf(__n("touched %d path\n", "touched %d paths\n",
+                          $cnt), $cnt);
        }
 }
 
@@ -679,7 +659,7 @@ sub update_cmd {
        my @mods = list_modified('file-only');
        return if (!@mods);
 
-       my @update = list_and_choose({ PROMPT => 'Update',
+       my @update = list_and_choose({ PROMPT => __('Update'),
                                       HEADER => $status_head, },
                                     @mods);
        if (@update) {
@@ -691,7 +671,7 @@ sub update_cmd {
 }
 
 sub revert_cmd {
-       my @update = list_and_choose({ PROMPT => 'Revert',
+       my @update = list_and_choose({ PROMPT => __('Revert'),
                                       HEADER => $status_head, },
                                     list_modified());
        if (@update) {
@@ -714,7 +694,7 @@ sub revert_cmd {
                                    $_->{INDEX_ADDDEL} eq 'create') {
                                        system(qw(git update-index --force-remove --),
                                               $_->{VALUE});
-                                       print "note: $_->{VALUE} is untracked now.\n";
+                                       printf(__("note: %s is untracked now.\n"), $_->{VALUE});
                                }
                        }
                }
@@ -725,13 +705,13 @@ sub revert_cmd {
 }
 
 sub add_untracked_cmd {
-       my @add = list_and_choose({ PROMPT => 'Add untracked' },
+       my @add = list_and_choose({ PROMPT => __('Add untracked') },
                                  list_untracked());
        if (@add) {
                system(qw(git update-index --add --), @add);
                say_n_paths('added', @add);
        } else {
-               print "No untracked files.\n";
+               print __("No untracked files.\n");
        }
        print "\n";
 }
@@ -750,8 +730,8 @@ sub parse_diff {
        if (defined $diff_algorithm) {
                splice @diff_cmd, 1, 0, "--diff-algorithm=${diff_algorithm}";
        }
-       if ($diff_compaction_heuristic) {
-               splice @diff_cmd, 1, 0, "--compaction-heuristic";
+       if ($diff_indent_heuristic) {
+               splice @diff_cmd, 1, 0, "--indent-heuristic";
        }
        if (defined $patch_mode_revision) {
                push @diff_cmd, get_diff_reference($patch_mode_revision);
@@ -1045,29 +1025,55 @@ sub color_diff {
        } @_;
 }
 
+my %edit_hunk_manually_modes = (
+       stage => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for staging."),
+       stash => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for stashing."),
+       reset_head => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for unstaging."),
+       reset_nothead => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for applying."),
+       checkout_index => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for discarding."),
+       checkout_head => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for discarding."),
+       checkout_nothead => N__(
+"If the patch applies cleanly, the edited hunk will immediately be
+marked for applying."),
+);
+
 sub edit_hunk_manually {
        my ($oldtext) = @_;
 
        my $hunkfile = $repo->repo_path . "/addp-hunk-edit.diff";
        my $fh;
        open $fh, '>', $hunkfile
-               or die "failed to open hunk edit file for writing: " . $!;
-       print $fh "# Manual hunk edit mode -- see bottom for a quick guide\n";
+               or die sprintf(__("failed to open hunk edit file for writing: %s"), $!);
+       print $fh Git::comment_lines __("Manual hunk edit mode -- see bottom for a quick guide.\n");
        print $fh @$oldtext;
-       my $participle = $patch_mode_flavour{PARTICIPLE};
        my $is_reverse = $patch_mode_flavour{IS_REVERSE};
        my ($remove_plus, $remove_minus) = $is_reverse ? ('-', '+') : ('+', '-');
-       print $fh <<EOF;
-# ---
-# To remove '$remove_minus' lines, make them ' ' lines (context).
-# To remove '$remove_plus' lines, delete them.
-# Lines starting with # will be removed.
-#
-# If the patch applies cleanly, the edited hunk will immediately be
-# marked for $participle. If it does not apply cleanly, you will be given
-# an opportunity to edit again. If all lines of the hunk are removed,
-# then the edit is aborted and the hunk is left unchanged.
+       my $comment_line_char = Git::get_comment_line_char;
+       print $fh Git::comment_lines sprintf(__ <<EOF, $remove_minus, $remove_plus, $comment_line_char),
+---
+To remove '%s' lines, make them ' ' lines (context).
+To remove '%s' lines, delete them.
+Lines starting with %s will be removed.
 EOF
+__($edit_hunk_manually_modes{$patch_mode}),
+# TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+__ <<EOF2 ;
+If it does not apply cleanly, you will be given an opportunity to
+edit again.  If all lines of the hunk are removed, then the edit is
+aborted and the hunk is left unchanged.
+EOF2
        close $fh;
 
        chomp(my $editor = run_cmd_pipe(qw(git var GIT_EDITOR)));
@@ -1078,8 +1084,8 @@ EOF
        }
 
        open $fh, '<', $hunkfile
-               or die "failed to open hunk edit file for reading: " . $!;
-       my @newtext = grep { !/^#/ } <$fh>;
+               or die sprintf(__("failed to open hunk edit file for reading: %s"), $!);
+       my @newtext = grep { !/^\Q$comment_line_char\E/ } <$fh>;
        close $fh;
        unlink $hunkfile;
 
@@ -1134,6 +1140,7 @@ sub prompt_yesno {
        while (1) {
                print colored $prompt_color, $prompt;
                my $line = prompt_single_character;
+               return undef unless defined $line;
                return 0 if $line =~ /^n/i;
                return 1 if $line =~ /^y/i;
        }
@@ -1163,22 +1170,66 @@ sub edit_hunk_loop {
                }
                else {
                        prompt_yesno(
-                               'Your edited hunk does not apply. Edit again '
-                               . '(saying "no" discards!) [y/n]? '
+                               # TRANSLATORS: do not translate [y/n]
+                               # The program will only accept that input
+                               # at this point.
+                               # Consider translating (saying "no" discards!) as
+                               # (saying "n" for "no" discards!) if the translation
+                               # of the word "no" does not start with n.
+                               __('Your edited hunk does not apply. Edit again '
+                                  . '(saying "no" discards!) [y/n]? ')
                                ) or return undef;
                }
        }
 }
 
+my %help_patch_modes = (
+       stage => N__(
+"y - stage this hunk
+n - do not stage this hunk
+q - quit; do not stage this hunk or any of the remaining ones
+a - stage this hunk and all later hunks in the file
+d - do not stage this hunk or any of the later hunks in the file"),
+       stash => N__(
+"y - stash this hunk
+n - do not stash this hunk
+q - quit; do not stash this hunk or any of the remaining ones
+a - stash this hunk and all later hunks in the file
+d - do not stash this hunk or any of the later hunks in the file"),
+       reset_head => N__(
+"y - unstage this hunk
+n - do not unstage this hunk
+q - quit; do not unstage this hunk or any of the remaining ones
+a - unstage this hunk and all later hunks in the file
+d - do not unstage this hunk or any of the later hunks in the file"),
+       reset_nothead => N__(
+"y - apply this hunk to index
+n - do not apply this hunk to index
+q - quit; do not apply this hunk or any of the remaining ones
+a - apply this hunk and all later hunks in the file
+d - do not apply this hunk or any of the later hunks in the file"),
+       checkout_index => N__(
+"y - discard this hunk from worktree
+n - do not discard this hunk from worktree
+q - quit; do not discard this hunk or any of the remaining ones
+a - discard this hunk and all later hunks in the file
+d - do not discard this hunk or any of the later hunks in the file"),
+       checkout_head => N__(
+"y - discard this hunk from index and worktree
+n - do not discard this hunk from index and worktree
+q - quit; do not discard this hunk or any of the remaining ones
+a - discard this hunk and all later hunks in the file
+d - do not discard this hunk or any of the later hunks in the file"),
+       checkout_nothead => N__(
+"y - apply this hunk to index and worktree
+n - do not apply this hunk to index and worktree
+q - quit; do not apply this hunk or any of the remaining ones
+a - apply this hunk and all later hunks in the file
+d - do not apply this hunk or any of the later hunks in the file"),
+);
+
 sub help_patch_cmd {
-       my $verb = lc $patch_mode_flavour{VERB};
-       my $target = $patch_mode_flavour{TARGET};
-       print colored $help_color, <<EOF ;
-y - $verb this hunk$target
-n - do not $verb this hunk$target
-q - quit; do not $verb this hunk or any of the remaining ones
-a - $verb this hunk and all later hunks in the file
-d - do not $verb this hunk or any of the later hunks in the file
+       print colored $help_color, __($help_patch_modes{$patch_mode}), "\n", __ <<EOF ;
 g - select a hunk to go to
 / - search for a hunk matching the given regex
 j - leave this hunk undecided, see next undecided hunk
@@ -1210,11 +1261,11 @@ sub apply_patch_for_checkout_commit {
                run_git_apply 'apply '.$reverse, @_;
                return 1;
        } elsif (!$applies_index) {
-               print colored $error_color, "The selected hunks do not apply to the index!\n";
-               if (prompt_yesno "Apply them to the worktree anyway? ") {
+               print colored $error_color, __("The selected hunks do not apply to the index!\n");
+               if (prompt_yesno __("Apply them to the worktree anyway? ")) {
                        return run_git_apply 'apply '.$reverse, @_;
                } else {
-                       print colored $error_color, "Nothing was applied.\n";
+                       print colored $error_color, __("Nothing was applied.\n");
                        return 0;
                }
        } else {
@@ -1225,7 +1276,7 @@ sub apply_patch_for_checkout_commit {
 
 sub patch_update_cmd {
        my @all_mods = list_modified($patch_mode_flavour{FILTER});
-       error_msg "ignoring unmerged: $_->{VALUE}\n"
+       error_msg sprintf(__("ignoring unmerged: %s\n"), $_->{VALUE})
                for grep { $_->{UNMERGED} } @all_mods;
        @all_mods = grep { !$_->{UNMERGED} } @all_mods;
 
@@ -1234,17 +1285,17 @@ sub patch_update_cmd {
 
        if (!@mods) {
                if (@all_mods) {
-                       print STDERR "Only binary files changed.\n";
+                       print STDERR __("Only binary files changed.\n");
                } else {
-                       print STDERR "No changes.\n";
+                       print STDERR __("No changes.\n");
                }
                return 0;
        }
-       if ($patch_mode) {
+       if ($patch_mode_only) {
                @them = @mods;
        }
        else {
-               @them = list_and_choose({ PROMPT => 'Patch update',
+               @them = list_and_choose({ PROMPT => __('Patch update'),
                                          HEADER => $status_head, },
                                        @mods);
        }
@@ -1294,6 +1345,44 @@ sub display_hunks {
        return $i;
 }
 
+my %patch_update_prompt_modes = (
+       stage => {
+               mode => N__("Stage mode change [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Stage deletion [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Stage this hunk [y,n,q,a,d,/%s,?]? "),
+       },
+       stash => {
+               mode => N__("Stash mode change [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Stash deletion [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Stash this hunk [y,n,q,a,d,/%s,?]? "),
+       },
+       reset_head => {
+               mode => N__("Unstage mode change [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Unstage deletion [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Unstage this hunk [y,n,q,a,d,/%s,?]? "),
+       },
+       reset_nothead => {
+               mode => N__("Apply mode change to index [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Apply deletion to index [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Apply this hunk to index [y,n,q,a,d,/%s,?]? "),
+       },
+       checkout_index => {
+               mode => N__("Discard mode change from worktree [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Discard deletion from worktree [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "),
+       },
+       checkout_head => {
+               mode => N__("Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "),
+       },
+       checkout_nothead => {
+               mode => N__("Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "),
+               deletion => N__("Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "),
+               hunk => N__("Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "),
+       },
+);
+
 sub patch_update_file {
        my $quit = 0;
        my ($ix, $num);
@@ -1366,12 +1455,9 @@ sub patch_update_file {
                for (@{$hunk[$ix]{DISPLAY}}) {
                        print;
                }
-               print colored $prompt_color, $patch_mode_flavour{VERB},
-                 ($hunk[$ix]{TYPE} eq 'mode' ? ' mode change' :
-                  $hunk[$ix]{TYPE} eq 'deletion' ? ' deletion' :
-                  ' this hunk'),
-                 $patch_mode_flavour{TARGET},
-                 " [y,n,q,a,d,/$other,?]? ";
+               print colored $prompt_color,
+                       sprintf(__($patch_update_prompt_modes{$patch_mode}{$hunk[$ix]{TYPE}}), $other);
+
                my $line = prompt_single_character;
                last unless defined $line;
                if ($line) {
@@ -1394,12 +1480,12 @@ sub patch_update_file {
                                my $response = $1;
                                my $no = $ix > 10 ? $ix - 10 : 0;
                                while ($response eq '') {
-                                       my $extra = "";
                                        $no = display_hunks(\@hunk, $no);
                                        if ($no < $num) {
-                                               $extra = " (<ret> to see more)";
+                                               print __("go to which hunk (<ret> to see more)? ");
+                                       } else {
+                                               print __("go to which hunk? ");
                                        }
-                                       print "go to which hunk$extra? ";
                                        $response = <STDIN>;
                                        if (!defined $response) {
                                                $response = '';
@@ -1407,11 +1493,13 @@ sub patch_update_file {
                                        chomp $response;
                                }
                                if ($response !~ /^\s*\d+\s*$/) {
-                                       error_msg "Invalid number: '$response'\n";
+                                       error_msg sprintf(__("Invalid number: '%s'\n"),
+                                                            $response);
                                } elsif (0 < $response && $response <= $num) {
                                        $ix = $response - 1;
                                } else {
-                                       error_msg "Sorry, only $num hunks available.\n";
+                                       error_msg sprintf(__n("Sorry, only %d hunk available.\n",
+                                                             "Sorry, only %d hunks available.\n", $num), $num);
                                }
                                next;
                        }
@@ -1436,7 +1524,7 @@ sub patch_update_file {
                        elsif ($line =~ m|^/(.*)|) {
                                my $regex = $1;
                                if ($1 eq "") {
-                                       print colored $prompt_color, "search for regex? ";
+                                       print colored $prompt_color, __("search for regex? ");
                                        $regex = <STDIN>;
                                        if (defined $regex) {
                                                chomp $regex;
@@ -1449,7 +1537,7 @@ sub patch_update_file {
                                if ($@) {
                                        my ($err,$exp) = ($@, $1);
                                        $err =~ s/ at .*git-add--interactive line \d+, <STDIN> line \d+.*$//;
-                                       error_msg "Malformed search regexp $exp: $err\n";
+                                       error_msg sprintf(__("Malformed search regexp %s: %s\n"), $exp, $err);
                                        next;
                                }
                                my $iy = $ix;
@@ -1459,7 +1547,7 @@ sub patch_update_file {
                                        $iy++;
                                        $iy = 0 if ($iy >= $num);
                                        if ($ix == $iy) {
-                                               error_msg "No hunk matches the given pattern\n";
+                                               error_msg __("No hunk matches the given pattern\n");
                                                last;
                                        }
                                }
@@ -1471,7 +1559,7 @@ sub patch_update_file {
                                        $ix--;
                                }
                                else {
-                                       error_msg "No previous hunk\n";
+                                       error_msg __("No previous hunk\n");
                                }
                                next;
                        }
@@ -1480,7 +1568,7 @@ sub patch_update_file {
                                        $ix++;
                                }
                                else {
-                                       error_msg "No next hunk\n";
+                                       error_msg __("No next hunk\n");
                                }
                                next;
                        }
@@ -1493,21 +1581,23 @@ sub patch_update_file {
                                        }
                                }
                                else {
-                                       error_msg "No previous hunk\n";
+                                       error_msg __("No previous hunk\n");
                                }
                                next;
                        }
                        elsif ($line =~ /^j/) {
                                if ($other !~ /j/) {
-                                       error_msg "No next hunk\n";
+                                       error_msg __("No next hunk\n");
                                        next;
                                }
                        }
                        elsif ($other =~ /s/ && $line =~ /^s/) {
                                my @split = split_hunk($hunk[$ix]{TEXT}, $hunk[$ix]{DISPLAY});
                                if (1 < @split) {
-                                       print colored $header_color, "Split into ",
-                                       scalar(@split), " hunks.\n";
+                                       print colored $header_color, sprintf(
+                                               __n("Split into %d hunk.\n",
+                                                   "Split into %d hunks.\n",
+                                                   scalar(@split)), scalar(@split));
                                }
                                splice (@hunk, $ix, 1, @split);
                                $num = scalar @hunk;
@@ -1557,28 +1647,30 @@ sub diff_cmd {
        my @mods = list_modified('index-only');
        @mods = grep { !($_->{BINARY}) } @mods;
        return if (!@mods);
-       my (@them) = list_and_choose({ PROMPT => 'Review diff',
+       my (@them) = list_and_choose({ PROMPT => __('Review diff'),
                                     IMMEDIATE => 1,
                                     HEADER => $status_head, },
                                   @mods);
        return if (!@them);
-       my $reference = is_initial_commit() ? get_empty_tree() : 'HEAD';
+       my $reference = (is_initial_commit()) ? get_empty_tree() : 'HEAD';
        system(qw(git diff -p --cached), $reference, '--',
                map { $_->{VALUE} } @them);
 }
 
 sub quit_cmd {
-       print "Bye.\n";
+       print __("Bye.\n");
        exit(0);
 }
 
 sub help_cmd {
-       print colored $help_color, <<\EOF ;
+# TRANSLATORS: please do not translate the command names
+# 'status', 'update', 'revert', etc.
+       print colored $help_color, __ <<'EOF' ;
 status        - show paths with changes
 update        - add working tree state to the staged set of changes
 revert        - revert staged set of changes back to the HEAD version
 patch         - pick hunks and update selectively
-diff         - view diff between HEAD and index
+diff          - view diff between HEAD and index
 add untracked - add contents of untracked files to the staged set of changes
 EOF
 }
@@ -1591,39 +1683,40 @@ sub process_args {
                        if ($1 eq 'reset') {
                                $patch_mode = 'reset_head';
                                $patch_mode_revision = 'HEAD';
-                               $arg = shift @ARGV or die "missing --";
+                               $arg = shift @ARGV or die __("missing --");
                                if ($arg ne '--') {
                                        $patch_mode_revision = $arg;
                                        $patch_mode = ($arg eq 'HEAD' ?
                                                       'reset_head' : 'reset_nothead');
-                                       $arg = shift @ARGV or die "missing --";
+                                       $arg = shift @ARGV or die __("missing --");
                                }
                        } elsif ($1 eq 'checkout') {
-                               $arg = shift @ARGV or die "missing --";
+                               $arg = shift @ARGV or die __("missing --");
                                if ($arg eq '--') {
                                        $patch_mode = 'checkout_index';
                                } else {
                                        $patch_mode_revision = $arg;
                                        $patch_mode = ($arg eq 'HEAD' ?
                                                       'checkout_head' : 'checkout_nothead');
-                                       $arg = shift @ARGV or die "missing --";
+                                       $arg = shift @ARGV or die __("missing --");
                                }
                        } elsif ($1 eq 'stage' or $1 eq 'stash') {
                                $patch_mode = $1;
-                               $arg = shift @ARGV or die "missing --";
+                               $arg = shift @ARGV or die __("missing --");
                        } else {
-                               die "unknown --patch mode: $1";
+                               die sprintf(__("unknown --patch mode: %s"), $1);
                        }
                } else {
                        $patch_mode = 'stage';
-                       $arg = shift @ARGV or die "missing --";
+                       $arg = shift @ARGV or die __("missing --");
                }
-               die "invalid argument $arg, expecting --"
-                   unless $arg eq "--";
+               die sprintf(__("invalid argument %s, expecting --"),
+                              $arg) unless $arg eq "--";
                %patch_mode_flavour = %{$patch_modes{$patch_mode}};
+               $patch_mode_only = 1;
        }
        elsif ($arg ne "--") {
-               die "invalid argument $arg, expecting --";
+               die sprintf(__("invalid argument %s, expecting --"), $arg);
        }
 }
 
@@ -1638,10 +1731,10 @@ sub main_loop {
                   [ 'help', \&help_cmd, ],
        );
        while (1) {
-               my ($it) = list_and_choose({ PROMPT => 'What now',
+               my ($it) = list_and_choose({ PROMPT => __('What now'),
                                             SINGLETON => 1,
                                             LIST_FLAT => 4,
-                                            HEADER => '*** Commands ***',
+                                            HEADER => __('*** Commands ***'),
                                             ON_EOF => \&quit_cmd,
                                             IMMEDIATE => 1 }, @cmd);
                if ($it) {
@@ -1657,7 +1750,7 @@ sub main_loop {
 
 process_args();
 refresh();
-if ($patch_mode) {
+if ($patch_mode_only) {
        patch_update_cmd();
 }
 else {
index d89a78616b6934a529473080df97990bfb8632e1..199042ac91466783201bdd483bad9f89c78db122 100644 (file)
@@ -441,8 +441,10 @@ static inline int const_error(void)
 
 extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
 extern void set_error_routine(void (*routine)(const char *err, va_list params));
+extern void (*get_error_routine(void))(const char *err, va_list params);
+extern void set_warn_routine(void (*routine)(const char *warn, va_list params));
+extern void (*get_warn_routine(void))(const char *warn, va_list params);
 extern void set_die_is_recursing_routine(int (*routine)(void));
-extern void set_error_handle(FILE *);
 
 extern int starts_with(const char *str, const char *prefix);
 
@@ -524,6 +526,16 @@ static inline int ends_with(const char *str, const char *suffix)
        return strip_suffix(str, suffix, &len);
 }
 
+#define SWAP(a, b) do {                                                \
+       void *_swap_a_ptr = &(a);                               \
+       void *_swap_b_ptr = &(b);                               \
+       unsigned char _swap_buffer[sizeof(a)];                  \
+       memcpy(_swap_buffer, _swap_a_ptr, sizeof(a));           \
+       memcpy(_swap_a_ptr, _swap_b_ptr, sizeof(a) +            \
+              BUILD_ASSERT_OR_ZERO(sizeof(a) == sizeof(b)));   \
+       memcpy(_swap_b_ptr, _swap_buffer, sizeof(a));           \
+} while (0)
+
 #if defined(NO_MMAP) || defined(USE_WIN32_MMAP)
 
 #ifndef PROT_READ
@@ -626,11 +638,6 @@ extern int gitsetenv(const char *, const char *, int);
 extern char *gitmkdtemp(char *);
 #endif
 
-#ifdef NO_MKSTEMPS
-#define mkstemps gitmkstemps
-extern int gitmkstemps(char *, int);
-#endif
-
 #ifdef NO_UNSETENV
 #define unsetenv gitunsetenv
 extern void gitunsetenv(const char *);
@@ -790,8 +797,6 @@ extern FILE *xfopen(const char *path, const char *mode);
 extern FILE *xfdopen(int fd, const char *mode);
 extern int xmkstemp(char *template);
 extern int xmkstemp_mode(char *template, int mode);
-extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
-extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
 extern char *xgetcwd(void);
 extern FILE *fopen_for_writing(const char *path);
 
@@ -878,6 +883,12 @@ static inline size_t xsize_t(off_t len)
 __attribute__((format (printf, 3, 4)))
 extern int xsnprintf(char *dst, size_t max, const char *fmt, ...);
 
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 256
+#endif
+
+extern int xgethostname(char *buf, size_t len);
+
 /* in ctype.c, for kwset users */
 extern const unsigned char tolower_trans_tbl[256];
 
@@ -977,6 +988,25 @@ void git_qsort(void *base, size_t nmemb, size_t size,
 #define qsort git_qsort
 #endif
 
+#define QSORT(base, n, compar) sane_qsort((base), (n), sizeof(*(base)), compar)
+static inline void sane_qsort(void *base, size_t nmemb, size_t size,
+                             int(*compar)(const void *, const void *))
+{
+       if (nmemb > 1)
+               qsort(base, nmemb, size, compar);
+}
+
+#ifndef HAVE_ISO_QSORT_S
+int git_qsort_s(void *base, size_t nmemb, size_t size,
+               int (*compar)(const void *, const void *, void *), void *ctx);
+#define qsort_s git_qsort_s
+#endif
+
+#define QSORT_S(base, n, compar, ctx) do {                     \
+       if (qsort_s((base), (n), sizeof(*(base)), compar, ctx)) \
+               die("BUG: qsort_s() failed");                   \
+} while (0)
+
 #ifndef REG_STARTEND
 #error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd"
 #endif
@@ -1033,6 +1063,15 @@ static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size,
 #define HAVE_VARIADIC_MACROS 1
 #endif
 
+#ifdef HAVE_VARIADIC_MACROS
+__attribute__((format (printf, 3, 4))) NORETURN
+void BUG_fl(const char *file, int line, const char *fmt, ...);
+#define BUG(...) BUG_fl(__FILE__, __LINE__, __VA_ARGS__)
+#else
+__attribute__((format (printf, 1, 2))) NORETURN
+void BUG(const char *fmt, ...);
+#endif
+
 /*
  * Preserves errno, prints a message, but gives no warning for ENOENT.
  * Returns 0 on success, which includes trying to unlink an object that does
index 86b2ff1e07614846465109dcb4b9afed11013839..aafaf708dace3493bee23370a6af9535a38e4c99 100755 (executable)
@@ -46,6 +46,8 @@ git_commit_non_empty_tree()
 {
        if test $# = 3 && test "$1" = $(git rev-parse "$3^{tree}"); then
                map "$3"
+       elif test $# = 1 && test "$1" = 4b825dc642cb6eb9a060e54bf8d69288fbee4904; then
+               :
        else
                git commit-tree "$@"
        fi
@@ -237,7 +239,7 @@ git rev-parse --no-flags --revs-only --symbolic-full-name \
 sed -e '/^^/d' "$tempdir"/raw-heads >"$tempdir"/heads
 
 test -s "$tempdir"/heads ||
-       die "Which ref do you want to rewrite?"
+       die "You must specify a ref to rewrite."
 
 GIT_INDEX_FILE="$(pwd)/../index"
 export GIT_INDEX_FILE
index 33d07c06bd90833ce56bc64c13bdc08c1997c3fb..59cd41dbff72e3073f5ef0380350ec9ea3c4af5b 100644 (file)
@@ -2,3 +2,4 @@
 *           encoding=US-ASCII
 git-gui.sh  encoding=UTF-8
 /po/*.po    encoding=UTF-8
+/GIT-VERSION-GEN eol=lf
index a88b6824b908d89ee185b84ed92b9c122b0118dd..92373d251a84f448bd673bbb8dd888a64fd2f777 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=0.20.GITGUI
+DEF_VER=0.21.GITGUI
 
 LF='
 '
index 4f00bdd3d69babe8a58c4989406eaa6fb5f36a50..fe30be38dc8c534cabf8a0f7145c41aecd1e6989 100644 (file)
@@ -259,7 +259,7 @@ lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS
         rm -f $@ ; \
         echo '# Autogenerated by git-gui Makefile' >$@ && \
         echo >>$@ && \
-        $(foreach p,$(PRELOAD_FILES) $(ALL_LIBFILES),echo '$(subst lib/,,$p)' >>$@ &&) \
+        $(foreach p,$(PRELOAD_FILES) $(sort $(ALL_LIBFILES)),echo '$(subst lib/,,$p)' >>$@ &&) \
         echo >>$@ ; \
        fi
 
index 11048c7a0e94f598b168de98d18fda9aea420c7d..5bc21b878d413e27de8e3d54e66a138ff41c7daa 100755 (executable)
@@ -275,6 +275,10 @@ proc is_Cygwin {} {
                                set _iscygwin 0
                        } else {
                                set _iscygwin 1
+                               # Handle MSys2 which is only cygwin when MSYSTEM is MSYS.
+                               if {[info exists ::env(MSYSTEM)] && $::env(MSYSTEM) ne "MSYS"} {
+                                       set _iscygwin 0
+                               }
                        }
                } else {
                        set _iscygwin 0
@@ -530,28 +534,10 @@ proc _lappend_nice {cmd_var} {
 }
 
 proc git {args} {
-       set opt [list]
-
-       while {1} {
-               switch -- [lindex $args 0] {
-               --nice {
-                       _lappend_nice opt
-               }
-
-               default {
-                       break
-               }
-
-               }
-
-               set args [lrange $args 1 end]
-       }
-
-       set cmdp [_git_cmd [lindex $args 0]]
-       set args [lrange $args 1 end]
-
-       _trace_exec [concat $opt $cmdp $args]
-       set result [eval exec $opt $cmdp $args]
+       set fd [eval [list git_read] $args]
+       fconfigure $fd -translation binary -encoding utf-8
+       set result [string trimright [read $fd] "\n"]
+       close $fd
        if {$::_trace} {
                puts stderr "< $result"
        }
@@ -1107,7 +1093,7 @@ git-version proc _parse_config {arr_name args} {
                                [list git_read config] \
                                $args \
                                [list --null --list]]
-                       fconfigure $fd_rc -translation binary
+                       fconfigure $fd_rc -translation binary -encoding utf-8
                        set buf [read $fd_rc]
                        close $fd_rc
                }
@@ -1616,11 +1602,13 @@ proc run_prepare_commit_msg_hook {} {
        if {[file isfile [gitdir MERGE_MSG]]} {
                set pcm_source "merge"
                set fd_mm [open [gitdir MERGE_MSG] r]
+               fconfigure $fd_mm -encoding utf-8
                puts -nonewline $fd_pcm [read $fd_mm]
                close $fd_mm
        } elseif {[file isfile [gitdir SQUASH_MSG]]} {
                set pcm_source "squash"
                set fd_sm [open [gitdir SQUASH_MSG] r]
+               fconfigure $fd_sm -encoding utf-8
                puts -nonewline $fd_pcm [read $fd_sm]
                close $fd_sm
        } else {
@@ -1685,7 +1673,7 @@ proc read_diff_index {fd after} {
                set i [split [string range $buf_rdi $c [expr {$z1 - 2}]] { }]
                set p [string range $buf_rdi $z1 [expr {$z2 - 1}]]
                merge_state \
-                       [encoding convertfrom $p] \
+                       [encoding convertfrom utf-8 $p] \
                        [lindex $i 4]? \
                        [list [lindex $i 0] [lindex $i 2]] \
                        [list]
@@ -1718,7 +1706,7 @@ proc read_diff_files {fd after} {
                set i [split [string range $buf_rdf $c [expr {$z1 - 2}]] { }]
                set p [string range $buf_rdf $z1 [expr {$z2 - 1}]]
                merge_state \
-                       [encoding convertfrom $p] \
+                       [encoding convertfrom utf-8 $p] \
                        ?[lindex $i 4] \
                        [list] \
                        [list [lindex $i 0] [lindex $i 2]]
@@ -1741,7 +1729,7 @@ proc read_ls_others {fd after} {
        set pck [split $buf_rlo "\0"]
        set buf_rlo [lindex $pck end]
        foreach p [lrange $pck 0 end-1] {
-               set p [encoding convertfrom $p]
+               set p [encoding convertfrom utf-8 $p]
                if {[string index $p end] eq {/}} {
                        set p [string range $p 0 end-1]
                }
@@ -2505,13 +2493,28 @@ proc force_first_diff {after} {
        }
 }
 
-proc toggle_or_diff {w x y} {
+proc toggle_or_diff {mode w args} {
        global file_states file_lists current_diff_path ui_index ui_workdir
        global last_clicked selected_paths
 
-       set pos [split [$w index @$x,$y] .]
-       set lno [lindex $pos 0]
-       set col [lindex $pos 1]
+       if {$mode eq "click"} {
+               foreach {x y} $args break
+               set pos [split [$w index @$x,$y] .]
+               foreach {lno col} $pos break
+       } else {
+               if {$last_clicked ne {}} {
+                       set lno [lindex $last_clicked 1]
+               } else {
+                       set lno [expr {int([lindex [$w tag ranges in_diff] 0])}]
+               }
+               if {$mode eq "toggle"} {
+                       set col 0; set y 2
+               } else {
+                       incr lno [expr {$mode eq "up" ? -1 : 1}]
+                       set col 1
+               }
+       }
+
        set path [lindex $file_lists($w) [expr {$lno - 1}]]
        if {$path eq {}} {
                set last_clicked {}
@@ -2519,6 +2522,7 @@ proc toggle_or_diff {w x y} {
        }
 
        set last_clicked [list $w $lno]
+       focus $w
        array unset selected_paths
        $ui_index tag remove in_sel 0.0 end
        $ui_workdir tag remove in_sel 0.0 end
@@ -2598,7 +2602,7 @@ proc add_range_to_selection {w x y} {
        global file_lists last_clicked selected_paths
 
        if {[lindex $last_clicked 0] ne $w} {
-               toggle_or_diff $w $x $y
+               toggle_or_diff click $w $x $y
                return
        }
 
@@ -3007,7 +3011,7 @@ bind all <$M1B-Key-W> {destroy [winfo toplevel %W]}
 
 set subcommand_args {}
 proc usage {} {
-       set s "usage: $::argv0 $::subcommand $::subcommand_args"
+       set s "[mc usage:] $::argv0 $::subcommand $::subcommand_args"
        if {[tk windowingsystem] eq "win32"} {
                wm withdraw .
                tk_messageBox -icon info -message $s \
@@ -3139,7 +3143,7 @@ gui {
        # fall through to setup UI for commits
 }
 default {
-       set err "usage: $argv0 \[{blame|browser|citool}\]"
+       set err "[mc usage:] $argv0 \[{blame|browser|citool}\]"
        if {[tk windowingsystem] eq "win32"} {
                wm withdraw .
                tk_messageBox -icon error -message $err \
@@ -3178,16 +3182,38 @@ if {$use_ttk} {
 }
 pack .vpane -anchor n -side top -fill both -expand 1
 
+# -- Working Directory File List
+
+textframe .vpane.files.workdir -height 100 -width 200
+tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \
+       -background lightsalmon -foreground black
+ttext $ui_workdir -background white -foreground black \
+       -borderwidth 0 \
+       -width 20 -height 10 \
+       -wrap none \
+       -takefocus 1 -highlightthickness 1\
+       -cursor $cursor_ptr \
+       -xscrollcommand {.vpane.files.workdir.sx set} \
+       -yscrollcommand {.vpane.files.workdir.sy set} \
+       -state disabled
+${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview]
+${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview]
+pack .vpane.files.workdir.title -side top -fill x
+pack .vpane.files.workdir.sx -side bottom -fill x
+pack .vpane.files.workdir.sy -side right -fill y
+pack $ui_workdir -side left -fill both -expand 1
+
 # -- Index File List
 #
-${NS}::frame .vpane.files.index -height 100 -width 200
+textframe .vpane.files.index -height 100 -width 200
 tlabel .vpane.files.index.title \
        -text [mc "Staged Changes (Will Commit)"] \
        -background lightgreen -foreground black
-text $ui_index -background white -foreground black \
+ttext $ui_index -background white -foreground black \
        -borderwidth 0 \
        -width 20 -height 10 \
        -wrap none \
+       -takefocus 1 -highlightthickness 1\
        -cursor $cursor_ptr \
        -xscrollcommand {.vpane.files.index.sx set} \
        -yscrollcommand {.vpane.files.index.sy set} \
@@ -3199,26 +3225,8 @@ pack .vpane.files.index.sx -side bottom -fill x
 pack .vpane.files.index.sy -side right -fill y
 pack $ui_index -side left -fill both -expand 1
 
-# -- Working Directory File List
+# -- Insert the workdir and index into the panes
 #
-${NS}::frame .vpane.files.workdir -height 100 -width 200
-tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \
-       -background lightsalmon -foreground black
-text $ui_workdir -background white -foreground black \
-       -borderwidth 0 \
-       -width 20 -height 10 \
-       -wrap none \
-       -cursor $cursor_ptr \
-       -xscrollcommand {.vpane.files.workdir.sx set} \
-       -yscrollcommand {.vpane.files.workdir.sy set} \
-       -state disabled
-${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview]
-${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview]
-pack .vpane.files.workdir.title -side top -fill x
-pack .vpane.files.workdir.sx -side bottom -fill x
-pack .vpane.files.workdir.sy -side right -fill y
-pack $ui_workdir -side left -fill both -expand 1
-
 .vpane.files add .vpane.files.workdir
 .vpane.files add .vpane.files.index
 if {!$use_ttk} {
@@ -3301,7 +3309,7 @@ if {![is_enabled nocommit]} {
 #
 ${NS}::frame .vpane.lower.commarea.buffer
 ${NS}::frame .vpane.lower.commarea.buffer.header
-set ui_comm .vpane.lower.commarea.buffer.t
+set ui_comm .vpane.lower.commarea.buffer.frame.t
 set ui_coml .vpane.lower.commarea.buffer.header.l
 
 if {![is_enabled nocommit]} {
@@ -3344,20 +3352,25 @@ if {![is_enabled nocommit]} {
        pack .vpane.lower.commarea.buffer.header.new -side right
 }
 
-text $ui_comm -background white -foreground black \
+textframe .vpane.lower.commarea.buffer.frame
+ttext $ui_comm -background white -foreground black \
        -borderwidth 1 \
        -undo true \
        -maxundo 20 \
        -autoseparators true \
+       -takefocus 1 \
+       -highlightthickness 1 \
        -relief sunken \
        -width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \
        -font font_diff \
-       -yscrollcommand {.vpane.lower.commarea.buffer.sby set}
-${NS}::scrollbar .vpane.lower.commarea.buffer.sby \
+       -yscrollcommand {.vpane.lower.commarea.buffer.frame.sby set}
+${NS}::scrollbar .vpane.lower.commarea.buffer.frame.sby \
        -command [list $ui_comm yview]
-pack .vpane.lower.commarea.buffer.header -side top -fill x
-pack .vpane.lower.commarea.buffer.sby -side right -fill y
+
+pack .vpane.lower.commarea.buffer.frame.sby -side right -fill y
 pack $ui_comm -side left -fill y
+pack .vpane.lower.commarea.buffer.header -side top -fill x
+pack .vpane.lower.commarea.buffer.frame -side left -fill y
 pack .vpane.lower.commarea.buffer -side left -fill y
 
 # -- Commit Message Buffer Context Menu
@@ -3455,12 +3468,13 @@ bind_button3 .vpane.lower.diff.header.path "tk_popup $ctxm %X %Y"
 
 # -- Diff Body
 #
-${NS}::frame .vpane.lower.diff.body
+textframe .vpane.lower.diff.body
 set ui_diff .vpane.lower.diff.body.t
-text $ui_diff -background white -foreground black \
+ttext $ui_diff -background white -foreground black \
        -borderwidth 0 \
        -width 80 -height 5 -wrap none \
        -font font_diff \
+       -takefocus 1 -highlightthickness 1 \
        -xscrollcommand {.vpane.lower.diff.body.sbx set} \
        -yscrollcommand {.vpane.lower.diff.body.sby set} \
        -state disabled
@@ -3815,10 +3829,10 @@ bind .   <$M1B-Key-r> ui_do_rescan
 bind .   <$M1B-Key-R> ui_do_rescan
 bind .   <$M1B-Key-s> do_signoff
 bind .   <$M1B-Key-S> do_signoff
-bind .   <$M1B-Key-t> do_add_selection
-bind .   <$M1B-Key-T> do_add_selection
-bind .   <$M1B-Key-u> do_unstage_selection
-bind .   <$M1B-Key-U> do_unstage_selection
+bind .   <$M1B-Key-t> { toggle_or_diff toggle %W }
+bind .   <$M1B-Key-T> { toggle_or_diff toggle %W }
+bind .   <$M1B-Key-u> { toggle_or_diff toggle %W }
+bind .   <$M1B-Key-U> { toggle_or_diff toggle %W }
 bind .   <$M1B-Key-j> do_revert_selection
 bind .   <$M1B-Key-J> do_revert_selection
 bind .   <$M1B-Key-i> do_add_all
@@ -3830,9 +3844,11 @@ bind .   <$M1B-Key-plus> {show_more_context;break}
 bind .   <$M1B-Key-KP_Add> {show_more_context;break}
 bind .   <$M1B-Key-Return> do_commit
 foreach i [list $ui_index $ui_workdir] {
-       bind $i <Button-1>       "toggle_or_diff         $i %x %y; break"
-       bind $i <$M1B-Button-1>  "add_one_to_selection   $i %x %y; break"
-       bind $i <Shift-Button-1> "add_range_to_selection $i %x %y; break"
+       bind $i <Button-1>       { toggle_or_diff click %W %x %y; break }
+       bind $i <$M1B-Button-1>  { add_one_to_selection %W %x %y; break }
+       bind $i <Shift-Button-1> { add_range_to_selection %W %x %y; break }
+       bind $i <Key-Up>         { toggle_or_diff up %W; break }
+       bind $i <Key-Down>       { toggle_or_diff down %W; break }
 }
 unset i
 
index b1d15f46218e793866bee9300684663e2c04fd29..a1aeb8b96e2df47c776bd1bb373fac6c5189a3ae 100644 (file)
@@ -70,7 +70,7 @@ constructor new {i_commit i_path i_jump} {
        set path   $i_path
 
        make_toplevel top w
-       wm title $top [append "[appname] ([reponame]): " [mc "File Viewer"]]
+       wm title $top [mc "%s (%s): File Viewer" [appname] [reponame]]
 
        set font_w [font measure font_diff "0"]
 
index 2e459a82976c6bf77cf1e9f2f1edeae8872a3364..d06037decc1a44ad0f0c153cd461a22a138f35ea 100644 (file)
@@ -13,7 +13,7 @@ constructor dialog {} {
        global use_ttk NS
        make_dialog top w
        wm withdraw $w
-       wm title $top [append "[appname] ([reponame]): " [mc "Checkout Branch"]]
+       wm title $top [mc "%s (%s): Checkout Branch" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
index 4bb907705c5f1ea5a33596a9bbbb2ef5ccf66b9a..ba367d551d217f12cfae3c2f99cd19da58f1226f 100644 (file)
@@ -20,7 +20,7 @@ constructor dialog {} {
 
        make_dialog top w
        wm withdraw $w
-       wm title $top [append "[appname] ([reponame]): " [mc "Create Branch"]]
+       wm title $top [mc "%s (%s): Create Branch" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
index 867938ec6a63ba77cc6efd700080e194d23d620f..a5051637bbc2388c4aab14479ded14d2c41df314 100644 (file)
@@ -13,7 +13,7 @@ constructor dialog {} {
 
        make_dialog top w
        wm withdraw $w
-       wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch"]]
+       wm title $top [mc "%s (%s): Delete Branch" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
@@ -128,7 +128,7 @@ method _delete {} {
                set b [lindex $i 0]
                set o [lindex $i 1]
                if {[catch {git branch -D $b} err]} {
-                       append failed " - $b: $err\n"
+                       append failed [mc " - %s:" $b] " $err\n"
                }
        }
 
index 6e510ec2e39305e6d89de61ab2c925bcbc821a65..3a2d79a9cc3a1ade90db21721f75266d797c26f0 100644 (file)
@@ -12,7 +12,7 @@ constructor dialog {} {
 
        make_dialog top w
        wm withdraw $w
-       wm title $top [append "[appname] ([reponame]): " [mc "Rename Branch"]]
+       wm title $top [mc "%s (%s): Rename Branch" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
index 0328338fda22c90c674630e0351982ff1bb2fbc4..a98298366763d841d3f88e4478f0afdc6e9a5653 100644 (file)
@@ -24,7 +24,7 @@ constructor new {commit {path {}}} {
        global cursor_ptr M1B use_ttk NS
        make_dialog top w
        wm withdraw $top
-       wm title $top [append "[appname] ([reponame]): " [mc "File Browser"]]
+       wm title $top [mc "%s (%s): File Browser" [appname] [reponame]]
 
        if {$path ne {}} {
                if {[string index $path end] ne {/}} {
@@ -197,7 +197,7 @@ method _ls {tree_id {name {}}} {
        $w conf -state disabled
 
        set fd [git_read ls-tree -z $tree_id]
-       fconfigure $fd -blocking 0 -translation binary -encoding binary
+       fconfigure $fd -blocking 0 -translation binary -encoding utf-8
        fileevent $fd readable [cb _read $fd]
 }
 
@@ -272,7 +272,7 @@ constructor dialog {} {
        global use_ttk NS
        make_dialog top w
        wm withdraw $top
-       wm title $top [append "[appname] ([reponame]): " [mc "Browse Branch Files"]]
+       wm title $top [mc "%s (%s): Browse Branch Files" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
                wm transient $top .
index 01d2cc280ba7832840cb8ef64844daa88ebd9670..83620b7cbc3a194fb17d395c17c10c9dd7f1683f 100644 (file)
@@ -2,7 +2,7 @@
 # Copyright (C) 2006, 2007 Shawn Pearce
 
 proc load_last_commit {} {
-       global HEAD PARENT MERGE_HEAD commit_type ui_comm
+       global HEAD PARENT MERGE_HEAD commit_type ui_comm commit_author
        global repo_config
 
        if {[llength $PARENT] == 0} {
@@ -34,6 +34,8 @@ You are currently in the middle of a merge that has not been fully completed.  Y
                                        lappend parents [string range $line 7 end]
                                } elseif {[string match {encoding *} $line]} {
                                        set enc [string tolower [string range $line 9 end]]
+                               } elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} {
+                                       set commit_author [list name $name email $email date $time]
                                }
                        }
                        set msg [read $fd]
@@ -106,9 +108,10 @@ proc do_signoff {} {
 }
 
 proc create_new_commit {} {
-       global commit_type ui_comm
+       global commit_type ui_comm commit_author
 
        set commit_type normal
+       unset -nocomplain commit_author
        $ui_comm delete 0.0 end
        $ui_comm edit reset
        $ui_comm edit modified false
@@ -322,11 +325,12 @@ proc commit_writetree {curHEAD msg_p} {
 }
 
 proc commit_committree {fd_wt curHEAD msg_p} {
-       global HEAD PARENT MERGE_HEAD commit_type
+       global HEAD PARENT MERGE_HEAD commit_type commit_author
        global current_branch
        global ui_comm selected_commit_type
        global file_states selected_paths rescan_active
        global repo_config
+       global env
 
        gets $fd_wt tree_id
        if {[catch {close $fd_wt} err]} {
@@ -366,6 +370,9 @@ A rescan will be automatically started now.
                }
        }
 
+       if {[info exists commit_author]} {
+               set old_author [commit_author_ident $commit_author]
+       }
        # -- Create the commit.
        #
        set cmd [list commit-tree $tree_id]
@@ -381,8 +388,14 @@ A rescan will be automatically started now.
                error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"]
                ui_status [mc "Commit failed."]
                unlock_index
+               unset -nocomplain commit_author
+               commit_author_reset $old_author
                return
        }
+       if {[info exists commit_author]} {
+               unset -nocomplain commit_author
+               commit_author_reset $old_author
+       }
 
        # -- Update the HEAD ref.
        #
@@ -509,3 +522,20 @@ proc commit_postcommit_wait {fd_ph cmt_id} {
        }
        fconfigure $fd_ph -blocking 0
 }
+
+proc commit_author_ident {details} {
+       global env
+       array set author $details
+       set old [array get env GIT_AUTHOR_*]
+       set env(GIT_AUTHOR_NAME) $author(name)
+       set env(GIT_AUTHOR_EMAIL) $author(email)
+       set env(GIT_AUTHOR_DATE) $author(date)
+       return $old
+}
+proc commit_author_reset {details} {
+       global env
+       unset env(GIT_AUTHOR_NAME) env(GIT_AUTHOR_EMAIL) env(GIT_AUTHOR_DATE)
+       if {$details ne {}} {
+               array set env $details
+       }
+}
index 1f187ed286f877eab84ea2bc13ae210de9660e21..85783081e0d887a7c7857f07670847ef1bc0629d 100644 (file)
@@ -54,7 +54,7 @@ proc do_stats {} {
                        set value "$value[lindex $s 2]"
                }
 
-               ${NS}::label $w.stat.l_$name -text "$label:" -anchor w
+               ${NS}::label $w.stat.l_$name -text [mc "%s:" $label] -anchor w
                ${NS}::label $w.stat.v_$name -text $value -anchor w
                grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5}
        }
@@ -63,7 +63,7 @@ proc do_stats {} {
        bind $w <Visibility> "grab $w; focus $w.buttons.close"
        bind $w <Key-Escape> [list destroy $w]
        bind $w <Key-Return> [list destroy $w]
-       wm title $w [append "[appname] ([reponame]): " [mc "Database Statistics"]]
+       wm title $w [mc "%s (%s): Database Statistics" [appname] [reponame]]
        wm deiconify $w
        tkwait window $w
 }
index 0d569862156d9e984f3c04f5662880148f92bc21..4cae10a4c7f197aab9ae0bc145254a8d4a1bae50 100644 (file)
@@ -127,6 +127,9 @@ proc show_diff {path w {lno {}} {scroll_pos {}} {callback {}}} {
        } else {
                start_show_diff $cont_info
        }
+
+       global current_diff_path selected_paths
+       set selected_paths($current_diff_path) 1
 }
 
 proc show_unmerged_diff {cont_info} {
@@ -220,10 +223,9 @@ proc show_other_diff {path w m cont_info} {
                }
                $ui_diff conf -state normal
                if {$type eq {submodule}} {
-                       $ui_diff insert end [append \
-                               "* " \
-                               [mc "Git Repository (subproject)"] \
-                               "\n"] d_info
+                       $ui_diff insert end \
+                               "* [mc "Git Repository (subproject)"]\n" \
+                               d_info
                } elseif {![catch {set type [exec file $path]}]} {
                        set n [string length $path]
                        if {[string equal -length $n $path $type]} {
@@ -608,7 +610,7 @@ proc apply_hunk {x y} {
                puts -nonewline $p $current_diff_header
                puts -nonewline $p [$ui_diff get $s_lno $e_lno]
                close $p} err]} {
-               error_popup [append $failed_msg "\n\n$err"]
+               error_popup "$failed_msg\n\n$err"
                unlock_index
                return
        }
@@ -826,7 +828,7 @@ proc apply_range_or_line {x y} {
                puts -nonewline $p $current_diff_header
                puts -nonewline $p $wholepatch
                close $p} err]} {
-               error_popup [append $failed_msg "\n\n$err"]
+               error_popup "$failed_msg\n\n$err"
        }
 
        unlock_index
index c0fa69af561b7789cdcfea46b14bf6d2646f5962..8968a57f33e37584e3589f03918db2cb89db24e9 100644 (file)
@@ -17,7 +17,7 @@ proc error_popup {msg} {
        set cmd [list tk_messageBox \
                -icon error \
                -type ok \
-               -title [append "$title: " [mc "error"]] \
+               -title [mc "%s: error" $title] \
                -message $msg]
        if {[winfo ismapped [_error_parent]]} {
                lappend cmd -parent [_error_parent]
@@ -33,7 +33,7 @@ proc warn_popup {msg} {
        set cmd [list tk_messageBox \
                -icon warning \
                -type ok \
-               -title [append "$title: " [mc "warning"]] \
+               -title [mc "%s: warning" $title] \
                -message $msg]
        if {[winfo ismapped [_error_parent]]} {
                lappend cmd -parent [_error_parent]
@@ -77,7 +77,7 @@ proc hook_failed_popup {hook msg {is_fatal 1}} {
        wm withdraw $w
 
        ${NS}::frame $w.m
-       ${NS}::label $w.m.l1 -text "$hook hook failed:" \
+       ${NS}::label $w.m.l1 -text [mc "%s hook failed:" $hook] \
                -anchor w \
                -justify left \
                -font font_uibold
@@ -113,7 +113,7 @@ proc hook_failed_popup {hook msg {is_fatal 1}} {
 
        bind $w <Visibility> "grab $w; focus $w"
        bind $w <Key-Return> "destroy $w"
-       wm title $w [strcat "[appname] ([reponame]): " [mc "error"]]
+       wm title $w [mc "%s (%s): error" [appname] [reponame]]
        wm deiconify $w
        tkwait window $w
 }
index 74a81a7b42779c006fb0c0060724359fca2b33d9..b588db11d9fc46b6c4c33274c3c5f969dfe43e5e 100644 (file)
@@ -115,7 +115,7 @@ proc write_update_indexinfo {fd pathList totalCnt batch after} {
                set info [lindex $s 2]
                if {$info eq {}} continue
 
-               puts -nonewline $fd "$info\t[encoding convertto $path]\0"
+               puts -nonewline $fd "$info\t[encoding convertto utf-8 $path]\0"
                display_file $path $new
        }
 
@@ -186,7 +186,7 @@ proc write_update_index {fd pathList totalCnt batch after} {
                ?M {set new M_}
                ?? {continue}
                }
-               puts -nonewline $fd "[encoding convertto $path]\0"
+               puts -nonewline $fd "[encoding convertto utf-8 $path]\0"
                display_file $path $new
        }
 
@@ -247,7 +247,7 @@ proc write_checkout_index {fd pathList totalCnt batch after} {
                ?M -
                ?T -
                ?D {
-                       puts -nonewline $fd "[encoding convertto $path]\0"
+                       puts -nonewline $fd "[encoding convertto utf-8 $path]\0"
                        display_file $path ?_
                }
                }
@@ -291,7 +291,7 @@ proc do_unstage_selection {} {
 
        if {[array size selected_paths] > 0} {
                unstage_helper \
-                       {Unstaging selected files from commit} \
+                       [mc "Unstaging selected files from commit"] \
                        [array names selected_paths]
        } elseif {$current_diff_path ne {}} {
                unstage_helper \
@@ -343,7 +343,7 @@ proc do_add_selection {} {
 
        if {[array size selected_paths] > 0} {
                add_helper \
-                       {Adding selected files} \
+                       [mc "Adding selected files"] \
                        [array names selected_paths]
        } elseif {$current_diff_path ne {}} {
                add_helper \
@@ -385,7 +385,7 @@ proc do_add_all {} {
                        set paths [concat $paths $untracked_paths]
                }
        }
-       add_helper {Adding all changed files} $paths
+       add_helper [mc "Adding all changed files"] $paths
 }
 
 proc revert_helper {txt paths} {
index 5ab6f8f10210a0e394315e247a2895d4577569f4..9f253db5b37e5633c19914248a58a3f2feb3c512 100644 (file)
@@ -112,7 +112,16 @@ method _start {} {
        close $fh
        set _last_merged_branch $branch
 
-       set cmd [list git merge --strategy=recursive FETCH_HEAD]
+       if {[git-version >= "2.5.0"]} {
+               set cmd [list git merge --strategy=recursive FETCH_HEAD]
+       } else {
+               set cmd [list git]
+               lappend cmd merge
+               lappend cmd --strategy=recursive
+               lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]]
+               lappend cmd HEAD
+               lappend cmd $name
+       }
 
        ui_status [mc "Merging %s and %s..." $current_branch $stitle]
        set cons [console::new [mc "Merge"] "merge $stitle"]
@@ -144,7 +153,7 @@ constructor dialog {} {
        }
 
        make_dialog top w
-       wm title $top [append "[appname] ([reponame]): " [mc "Merge"]]
+       wm title $top [mc "%s (%s): Merge" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
index b5b6b2fea6c29ce7f1deb9e2c23060b92fbd83e4..e43971bfa3e0084e1a306fc82111895a301f905e 100644 (file)
@@ -179,7 +179,7 @@ proc do_options {} {
                        i-* {
                                regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max
                                ${NS}::frame $w.$f.$optid
-                               ${NS}::label $w.$f.$optid.l -text "$text:"
+                               ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text]
                                pack $w.$f.$optid.l -side left -anchor w -fill x
                                tspinbox $w.$f.$optid.v \
                                        -textvariable ${f}_config_new($name) \
@@ -194,7 +194,7 @@ proc do_options {} {
                        c -
                        t {
                                ${NS}::frame $w.$f.$optid
-                               ${NS}::label $w.$f.$optid.l -text "$text:"
+                               ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text]
                                ${NS}::entry $w.$f.$optid.v \
                                        -width 20 \
                                        -textvariable ${f}_config_new($name)
@@ -217,7 +217,7 @@ proc do_options {} {
                        s {
                                set opts [eval [lindex $option 3]]
                                ${NS}::frame $w.$f.$optid
-                               ${NS}::label $w.$f.$optid.l -text "$text:"
+                               ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text]
                                if {$use_ttk} {
                                        ttk::combobox $w.$f.$optid.v \
                                                -textvariable ${f}_config_new($name) \
@@ -279,7 +279,7 @@ proc do_options {} {
                        [font configure $font -size]
 
                ${NS}::frame $w.global.$name
-               ${NS}::label $w.global.$name.l -text "$text:"
+               ${NS}::label $w.global.$name.l -text [mc "%s:" $text]
                ${NS}::button $w.global.$name.b \
                        -text [mc "Change Font"] \
                        -command [list \
index 4e5c7844188ee2eab0c9f6e00835b99c69bbdfc2..ef77ed7399c5b0cc1bdd06f1471d275ffd0ab3ad 100644 (file)
@@ -246,22 +246,22 @@ proc update_all_remotes_menu_entry {} {
        if {$have_remote > 1} {
                make_sure_remote_submenues_exist $remote_m
                if {[$fetch_m type end] eq "command" \
-                       && [$fetch_m entrycget end -label] ne "All"} {
+                               && [$fetch_m entrycget end -label] ne [mc "All"]} {
 
                        $fetch_m insert end separator
                        $fetch_m insert end command \
-                               -label "All" \
+                               -label [mc "All"] \
                                -command fetch_from_all
 
                        $prune_m insert end separator
                        $prune_m insert end command \
-                               -label "All" \
+                               -label [mc "All"] \
                                -command prune_from_all
                }
        } else {
                if {[winfo exists $fetch_m]} {
                        if {[$fetch_m type end] eq "command" \
-                               && [$fetch_m entrycget end -label] eq "All"} {
+                                       && [$fetch_m entrycget end -label] eq [mc "All"]} {
 
                                delete_from_menu $fetch_m end
                                delete_from_menu $fetch_m end
index 50029d0ceeee0fdab884754022e3015b3925f6f7..480a6b30d0a9c9aa4f667a618b0e852d637432dd 100644 (file)
@@ -17,7 +17,7 @@ constructor dialog {} {
 
        make_dialog top w
        wm withdraw $top
-       wm title $top [append "[appname] ([reponame]): " [mc "Add Remote"]]
+       wm title $top [mc "%s (%s): Add Remote" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
index fcc06d03a1dfc4919f762d70e2809f29dab77390..5ba9fcadd17f315a4a47220f91f81ba964d64b08 100644 (file)
@@ -26,7 +26,7 @@ constructor dialog {} {
        global all_remotes M1B use_ttk NS
 
        make_dialog top w
-       wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch Remotely"]]
+       wm title $top [mc "%s (%s): Delete Branch Remotely" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
index 78878ef89d11210d614fc8b3d2957705611bdaa3..97d1d7aa02686606912dd5ff7b512343083a17c0 100644 (file)
@@ -5,17 +5,20 @@ proc do_windows_shortcut {} {
        global _gitworktree
        set fn [tk_getSaveFile \
                -parent . \
-               -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \
+               -title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
                -initialfile "Git [reponame].lnk"]
        if {$fn != {}} {
                if {[file extension $fn] ne {.lnk}} {
                        set fn ${fn}.lnk
                }
+               # Use git-gui.exe if available (ie: git-for-windows)
+               set cmdLine [auto_execok git-gui.exe]
+               if {$cmdLine eq {}} {
+                       set cmdLine [list [info nameofexecutable] \
+                                                        [file normalize $::argv0]]
+               }
                if {[catch {
-                               win32_create_lnk $fn [list \
-                                       [info nameofexecutable] \
-                                       [file normalize $::argv0] \
-                                       ] \
+                               win32_create_lnk $fn $cmdLine \
                                        [file normalize $_gitworktree]
                        } err]} {
                        error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
@@ -37,7 +40,7 @@ proc do_cygwin_shortcut {} {
        }
        set fn [tk_getSaveFile \
                -parent . \
-               -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \
+               -title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
                -initialdir $desktop \
                -initialfile "Git [reponame].lnk"]
        if {$fn != {}} {
@@ -69,7 +72,7 @@ proc do_macosx_app {} {
 
        set fn [tk_getSaveFile \
                -parent . \
-               -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \
+               -title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
                -initialdir [file join $env(HOME) Desktop] \
                -initialfile "Git [reponame].app"]
        if {$fn != {}} {
index 8b88d3678b7ddd802260f47bcfeff8a895d93f3f..351a712c8c503eb5a04466afb8aa5acd7f0259f5 100644 (file)
@@ -78,6 +78,57 @@ proc InitTheme {} {
        }
 }
 
+# Define a style used for the surround of text widgets.
+proc InitEntryFrame {} {
+       ttk::style theme settings default {
+               ttk::style layout EntryFrame {
+                       EntryFrame.field -sticky nswe -border 0 -children {
+                               EntryFrame.fill -sticky nswe -children {
+                                       EntryFrame.padding -sticky nswe
+                               }
+                       }
+               }
+               ttk::style configure EntryFrame -padding 1 -relief sunken
+               ttk::style map EntryFrame -background {}
+       }
+       ttk::style theme settings classic {
+               ttk::style configure EntryFrame -padding 2 -relief sunken
+               ttk::style map EntryFrame -background {}
+       }
+       ttk::style theme settings alt {
+               ttk::style configure EntryFrame -padding 2
+               ttk::style map EntryFrame -background {}
+       }
+       ttk::style theme settings clam {
+               ttk::style configure EntryFrame -padding 2
+               ttk::style map EntryFrame -background {}
+       }
+
+       # Ignore errors for missing native themes
+       catch {
+               ttk::style theme settings winnative {
+                       ttk::style configure EntryFrame -padding 2
+               }
+               ttk::style theme settings xpnative {
+                       ttk::style configure EntryFrame -padding 1
+                       ttk::style element create EntryFrame.field vsapi \
+                               EDIT 1 {disabled 4 focus 3 active 2 {} 1} -padding 1
+               }
+               ttk::style theme settings vista {
+                       ttk::style configure EntryFrame -padding 2
+                       ttk::style element create EntryFrame.field vsapi \
+                               EDIT 6 {disabled 4 focus 3 active 2 {} 1} -padding 2
+               }
+       }
+
+       bind EntryFrame <Enter> {%W instate !disabled {%W state active}}
+       bind EntryFrame <Leave> {%W state !active}
+       bind EntryFrame <<ThemeChanged>> {
+               set pad [ttk::style lookup EntryFrame -padding]
+               %W configure -padding [expr {$pad eq {} ? 1 : $pad}]
+       }
+}
+
 proc gold_frame {w args} {
        global use_ttk
        if {$use_ttk} {
@@ -123,7 +174,7 @@ proc paddedlabel {w args} {
 # place a themed frame over the surface.
 proc Dialog {w args} {
        eval [linsert $args 0 toplevel $w -class Dialog]
-       catch {wm attributes $w -type dialog}   
+       catch {wm attributes $w -type dialog}
        pave_toplevel $w
        return $w
 }
@@ -193,6 +244,40 @@ proc tspinbox {w args} {
        }
 }
 
+# Create a text widget with any theme specific properties.
+proc ttext {w args} {
+       global use_ttk
+       if {$use_ttk} {
+               switch -- [ttk::style theme use] {
+                       "vista" - "xpnative" {
+                               lappend args -highlightthickness 0 -borderwidth 0
+                       }
+               }
+       }
+       set w [eval [linsert $args 0 text $w]]
+       if {$use_ttk} {
+               if {[winfo class [winfo parent $w]] eq "EntryFrame"} {
+                       bind $w <FocusIn> {[winfo parent %W] state focus}
+                       bind $w <FocusOut> {[winfo parent %W] state !focus}
+               }
+       }
+       return $w
+}
+
+# themed frame suitable for surrounding a text field.
+proc textframe {w args} {
+       global use_ttk
+       if {$use_ttk} {
+               if {[catch {ttk::style layout EntryFrame}]} {
+                       InitEntryFrame
+               }
+               eval [linsert $args 0 ttk::frame $w -class EntryFrame -style EntryFrame]
+       } else {
+               eval [linsert $args 0 frame $w]
+       }
+       return $w
+}
+
 proc tentry {w args} {
        global use_ttk
        if {$use_ttk} {
index 6ec94113db7d8c75d78e5300469bb8154e37c940..413f1a170079e0cec78ecdbd1adb7baeb83406f2 100644 (file)
@@ -69,6 +69,7 @@ proc tools_populate_one {fullname} {
 proc tools_exec {fullname} {
        global repo_config env current_diff_path
        global current_branch is_detached
+       global selected_paths
 
        if {[is_config_true "guitool.$fullname.needsfile"]} {
                if {$current_diff_path eq {}} {
@@ -100,6 +101,7 @@ proc tools_exec {fullname} {
 
        set env(GIT_GUITOOL) $fullname
        set env(FILENAME) $current_diff_path
+       set env(FILENAMES) [join [array names selected_paths] \n]
        if {$is_detached} {
                set env(CUR_BRANCH) ""
        } else {
@@ -121,6 +123,7 @@ proc tools_exec {fullname} {
 
        unset env(GIT_GUITOOL)
        unset env(FILENAME)
+       unset env(FILENAMES)
        unset env(CUR_BRANCH)
        catch { unset env(ARGS) }
        catch { unset env(REVISION) }
index 7eeda9daf23161a0abbe4abcc857ebfb0e18f9de..c05413ce432d2d37cc2461f1f1a739001c2220f4 100644 (file)
@@ -19,7 +19,7 @@ constructor dialog {} {
        global repo_config use_ttk NS
 
        make_dialog top w
-       wm title $top [append "[appname] ([reponame]): " [mc "Add Tool"]]
+       wm title $top [mc "%s (%s): Add Tool" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
                wm transient $top .
@@ -184,7 +184,7 @@ constructor dialog {} {
        load_config 1
 
        make_dialog top w
-       wm title $top [append "[appname] ([reponame]): " [mc "Remove Tool"]]
+       wm title $top [mc "%s (%s): Remove Tool" [appname] [reponame]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
                wm transient $top .
@@ -280,7 +280,7 @@ constructor dialog {fullname} {
        }
 
        make_dialog top w -autodelete 0
-       wm title $top [append "[appname] ([reponame]): " $title]
+       wm title $top "[mc "%s (%s):" [appname] [reponame]] $title"
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
                wm transient $top .
index e5d211edea05cbfb856e81a9d683a5fb0f4f4b20..a1a424aab540663957c96a37cd277ae666287051 100644 (file)
@@ -226,7 +226,7 @@ proc do_push_anywhere {} {
        bind $w <Visibility> "grab $w; focus $w.buttons.create"
        bind $w <Key-Escape> "destroy $w"
        bind $w <Key-Return> [list start_push_anywhere_action $w]
-       wm title $w [append "[appname] ([reponame]): " [mc "Push"]]
+       wm title $w [mc "%s (%s): Push" [appname] [reponame]]
        wm deiconify $w
        tkwait window $w
 }
index 4d9b039dc2813d6771915a61bfc3c353f16bb5a9..5af78f15a86db955903979900190a6f7bbbf7882 100644 (file)
@@ -1,15 +1,15 @@
 # Bulgarian translation of git-gui po-file.
-# Copyright (C) 2012, 2013, 2014, 2015 Alexander Shopov <ash@kambanaria.org>.
+# Copyright (C) 2012, 2013, 2014, 2015, 2016 Alexander Shopov <ash@kambanaria.org>.
 # This file is distributed under the same license as the git package.
-# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014, 2015.
+# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014, 2015, 2016.
 #
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: git-gui master\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-07 07:37+0300\n"
-"PO-Revision-Date: 2015-04-07 07:46+0300\n"
+"POT-Creation-Date: 2016-10-13 15:16+0300\n"
+"PO-Revision-Date: 2016-10-13 15:16+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -18,33 +18,33 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: git-gui.sh:861
+#: git-gui.sh:865
 #, tcl-format
 msgid "Invalid font specified in %s:"
 msgstr "Указан е неправилен шрифт в „%s“:"
 
-#: git-gui.sh:915
+#: git-gui.sh:919
 msgid "Main Font"
 msgstr "Основен шрифт"
 
-#: git-gui.sh:916
+#: git-gui.sh:920
 msgid "Diff/Console Font"
 msgstr "Шрифт за разликите/конзолата"
 
-#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048
-#: git-gui.sh:1067 git-gui.sh:3125
+#: git-gui.sh:935 git-gui.sh:949 git-gui.sh:962 git-gui.sh:1052 git-gui.sh:1071
+#: git-gui.sh:3147
 msgid "git-gui: fatal error"
 msgstr "git-gui: фатална грешка"
 
-#: git-gui.sh:932
+#: git-gui.sh:936
 msgid "Cannot find git in PATH."
 msgstr "Командата git липсва в пътя (PATH)."
 
-#: git-gui.sh:959
+#: git-gui.sh:963
 msgid "Cannot parse Git version string:"
 msgstr "Низът с версията на Git не може да бъде интерпретиран:"
 
-#: git-gui.sh:984
+#: git-gui.sh:988
 #, tcl-format
 msgid ""
 "Git version cannot be determined.\n"
@@ -63,503 +63,506 @@ msgstr ""
 "\n"
 "Да се приеме ли, че „%s“ е версия „1.5.0“?\n"
 
-#: git-gui.sh:1281
+#: git-gui.sh:1285
 msgid "Git directory not found:"
 msgstr "Директорията на Git не е открита:"
 
-#: git-gui.sh:1315
+#: git-gui.sh:1319
 msgid "Cannot move to top of working directory:"
 msgstr "Не може да се премине към родителската  директория."
 
-#: git-gui.sh:1323
+#: git-gui.sh:1327
 msgid "Cannot use bare repository:"
 msgstr "Голо хранилище не може да се използва:"
 
-#: git-gui.sh:1331
+#: git-gui.sh:1335
 msgid "No working directory"
 msgstr "Работната директория липсва"
 
-#: git-gui.sh:1503 lib/checkout_op.tcl:306
+#: git-gui.sh:1507 lib/checkout_op.tcl:306
 msgid "Refreshing file status..."
 msgstr "Обновяване на състоянието на файла…"
 
-#: git-gui.sh:1563
+#: git-gui.sh:1567
 msgid "Scanning for modified files ..."
 msgstr "Проверка за променени файлове…"
 
-#: git-gui.sh:1639
+#: git-gui.sh:1645
 msgid "Calling prepare-commit-msg hook..."
 msgstr "Куката „prepare-commit-msg“ се изпълнява в момента…"
 
-#: git-gui.sh:1656
+#: git-gui.sh:1662
 msgid "Commit declined by prepare-commit-msg hook."
 msgstr "Подаването е отхвърлено от куката „prepare-commit-msg“."
 
-#: git-gui.sh:1814 lib/browser.tcl:252
+#: git-gui.sh:1820 lib/browser.tcl:252
 msgid "Ready."
 msgstr "Готово."
 
-#: git-gui.sh:1978
+#: git-gui.sh:1984
 #, tcl-format
 msgid ""
 "Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files."
 msgstr ""
-"Достигнат е максималният брой файлове за показване (gui.maxfilesdisplayed = "
-"%s). Файловете са общо %s."
+"Достигнат е максималният размер на списъка за извеждане(gui."
+"maxfilesdisplayed = %s), съответно не са показани всички %s файла."
 
-#: git-gui.sh:2101
+#: git-gui.sh:2107
 msgid "Unmodified"
 msgstr "Непроменен"
 
-#: git-gui.sh:2103
+#: git-gui.sh:2109
 msgid "Modified, not staged"
 msgstr "Променен, но не е в индекса"
 
-#: git-gui.sh:2104 git-gui.sh:2116
+#: git-gui.sh:2110 git-gui.sh:2122
 msgid "Staged for commit"
 msgstr "В индекса за подаване"
 
-#: git-gui.sh:2105 git-gui.sh:2117
+#: git-gui.sh:2111 git-gui.sh:2123
 msgid "Portions staged for commit"
 msgstr "Части са в индекса за подаване"
 
-#: git-gui.sh:2106 git-gui.sh:2118
+#: git-gui.sh:2112 git-gui.sh:2124
 msgid "Staged for commit, missing"
 msgstr "В индекса за подаване, но липсва"
 
-#: git-gui.sh:2108
+#: git-gui.sh:2114
 msgid "File type changed, not staged"
 msgstr "Видът на файла е сменен, но не е в индекса"
 
-#: git-gui.sh:2109 git-gui.sh:2110
+#: git-gui.sh:2115 git-gui.sh:2116
 msgid "File type changed, old type staged for commit"
-msgstr "Ð\92идÑ\8aÑ\82 Ð½Ð° Ñ\84айла Ðµ Ñ\81менен, Ð½Ð¾ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а Ðµ Ð²Ñ\81е Ð¾Ñ\89е Ñ\81Ñ\82аÑ\80иÑ\8fÑ\82"
+msgstr "Ð\92идÑ\8aÑ\82 Ð½Ð° Ñ\84айла Ðµ Ñ\81менен, Ð½Ð¾ Ð½Ð¾Ð²Ð¸Ñ\8fÑ\82 Ð²Ð¸Ð´ Ð½Ðµ Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: git-gui.sh:2111
+#: git-gui.sh:2117
 msgid "File type changed, staged"
 msgstr "Видът на файла е сменен и е в индекса"
 
-#: git-gui.sh:2112
+#: git-gui.sh:2118
 msgid "File type change staged, modification not staged"
-msgstr "Видът на файла е сменен, но промяната не е в индекса"
+msgstr "Видът на файла е сменен в индекса, но не и съдържанието"
 
-#: git-gui.sh:2113
+#: git-gui.sh:2119
 msgid "File type change staged, file missing"
-msgstr "Видът на файла е сменен, файлът липсва"
+msgstr "Видът на файла е сменен в индекса, но файлът липсва"
 
-#: git-gui.sh:2115
+#: git-gui.sh:2121
 msgid "Untracked, not staged"
 msgstr "Неследен"
 
-#: git-gui.sh:2120
+#: git-gui.sh:2126
 msgid "Missing"
 msgstr "Липсващ"
 
-#: git-gui.sh:2121
+#: git-gui.sh:2127
 msgid "Staged for removal"
 msgstr "В индекса за изтриване"
 
-#: git-gui.sh:2122
+#: git-gui.sh:2128
 msgid "Staged for removal, still present"
 msgstr "В индекса за изтриване, но още го има"
 
-#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127
-#: git-gui.sh:2128 git-gui.sh:2129
+#: git-gui.sh:2130 git-gui.sh:2131 git-gui.sh:2132 git-gui.sh:2133
+#: git-gui.sh:2134 git-gui.sh:2135
 msgid "Requires merge resolution"
 msgstr "Изисква коригиране при сливане"
 
-#: git-gui.sh:2164
+#: git-gui.sh:2170
 msgid "Starting gitk... please wait..."
 msgstr "Стартиране на „gitk“…, изчакайте…"
 
-#: git-gui.sh:2176
+#: git-gui.sh:2182
 msgid "Couldn't find gitk in PATH"
 msgstr "Командата „gitk“ липсва в пътищата, определени от променливата PATH."
 
-#: git-gui.sh:2235
+#: git-gui.sh:2241
 msgid "Couldn't find git gui in PATH"
 msgstr ""
 "Командата „git gui“ липсва в пътищата, определени от променливата PATH."
 
-#: git-gui.sh:2654 lib/choose_repository.tcl:41
+#: git-gui.sh:2676 lib/choose_repository.tcl:41
 msgid "Repository"
 msgstr "Хранилище"
 
-#: git-gui.sh:2655
+#: git-gui.sh:2677
 msgid "Edit"
 msgstr "Редактиране"
 
-#: git-gui.sh:2657 lib/choose_rev.tcl:567
+#: git-gui.sh:2679 lib/choose_rev.tcl:567
 msgid "Branch"
 msgstr "Клон"
 
-#: git-gui.sh:2660 lib/choose_rev.tcl:554
+#: git-gui.sh:2682 lib/choose_rev.tcl:554
 msgid "Commit@@noun"
 msgstr "Подаване"
 
-#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170
+#: git-gui.sh:2685 lib/merge.tcl:127 lib/merge.tcl:174
 msgid "Merge"
 msgstr "Сливане"
 
-#: git-gui.sh:2664 lib/choose_rev.tcl:563
+#: git-gui.sh:2686 lib/choose_rev.tcl:563
 msgid "Remote"
 msgstr "Отдалечено хранилище"
 
-#: git-gui.sh:2667
+#: git-gui.sh:2689
 msgid "Tools"
 msgstr "Команди"
 
-#: git-gui.sh:2676
+#: git-gui.sh:2698
 msgid "Explore Working Copy"
 msgstr "Разглеждане на работното копие"
 
-#: git-gui.sh:2682
+#: git-gui.sh:2704
 msgid "Git Bash"
 msgstr "Bash за Git"
 
-#: git-gui.sh:2692
+#: git-gui.sh:2714
 msgid "Browse Current Branch's Files"
 msgstr "Разглеждане на файловете в текущия клон"
 
-#: git-gui.sh:2696
+#: git-gui.sh:2718
 msgid "Browse Branch Files..."
 msgstr "Разглеждане на текущия клон…"
 
-#: git-gui.sh:2701
+#: git-gui.sh:2723
 msgid "Visualize Current Branch's History"
 msgstr "Визуализация на историята на текущия клон"
 
-#: git-gui.sh:2705
+#: git-gui.sh:2727
 msgid "Visualize All Branch History"
 msgstr "Визуализация на историята на всички клонове"
 
-#: git-gui.sh:2712
+#: git-gui.sh:2734
 #, tcl-format
 msgid "Browse %s's Files"
-msgstr "Разглеждане на файловете в %s"
+msgstr "Разглеждане на файловете в „%s“"
 
-#: git-gui.sh:2714
+#: git-gui.sh:2736
 #, tcl-format
 msgid "Visualize %s's History"
-msgstr "Визуализация на историята на %s"
+msgstr "Визуализация на историята на „%s“"
 
-#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66
+#: git-gui.sh:2741 lib/database.tcl:40
 msgid "Database Statistics"
 msgstr "Статистика на базата от данни"
 
-#: git-gui.sh:2722 lib/database.tcl:33
+#: git-gui.sh:2744 lib/database.tcl:33
 msgid "Compress Database"
 msgstr "Компресиране на базата от данни"
 
-#: git-gui.sh:2725
+#: git-gui.sh:2747
 msgid "Verify Database"
 msgstr "Проверка на базата от данни"
 
-#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8
-#: lib/shortcut.tcl:40 lib/shortcut.tcl:72
+#: git-gui.sh:2754 git-gui.sh:2758 git-gui.sh:2762
 msgid "Create Desktop Icon"
 msgstr "Добавяне на икона на работния плот"
 
-#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201
+#: git-gui.sh:2770 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201
 msgid "Quit"
 msgstr "Спиране на програмата"
 
-#: git-gui.sh:2756
+#: git-gui.sh:2778
 msgid "Undo"
 msgstr "Отмяна"
 
-#: git-gui.sh:2759
+#: git-gui.sh:2781
 msgid "Redo"
 msgstr "Повторение"
 
-#: git-gui.sh:2763 git-gui.sh:3368
+#: git-gui.sh:2785 git-gui.sh:3399
 msgid "Cut"
 msgstr "Отрязване"
 
-#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530
+#: git-gui.sh:2788 git-gui.sh:3402 git-gui.sh:3476 git-gui.sh:3562
 #: lib/console.tcl:69
 msgid "Copy"
 msgstr "Копиране"
 
-#: git-gui.sh:2769 git-gui.sh:3374
+#: git-gui.sh:2791 git-gui.sh:3405
 msgid "Paste"
 msgstr "Поставяне"
 
-#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39
-#: lib/branch_delete.tcl:28
+#: git-gui.sh:2794 git-gui.sh:3408 lib/branch_delete.tcl:28
+#: lib/remote_branch_delete.tcl:39
 msgid "Delete"
 msgstr "Изтриване"
 
-#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71
+#: git-gui.sh:2798 git-gui.sh:3412 git-gui.sh:3566 lib/console.tcl:71
 msgid "Select All"
 msgstr "Избиране на всичко"
 
-#: git-gui.sh:2785
+#: git-gui.sh:2807
 msgid "Create..."
 msgstr "Създаване…"
 
-#: git-gui.sh:2791
+#: git-gui.sh:2813
 msgid "Checkout..."
 msgstr "Изтегляне…"
 
-#: git-gui.sh:2797
+#: git-gui.sh:2819
 msgid "Rename..."
 msgstr "Преименуване…"
 
-#: git-gui.sh:2802
+#: git-gui.sh:2824
 msgid "Delete..."
 msgstr "Изтриване…"
 
-#: git-gui.sh:2807
+#: git-gui.sh:2829
 msgid "Reset..."
 msgstr "Отмяна на промените…"
 
-#: git-gui.sh:2817
+#: git-gui.sh:2839
 msgid "Done"
 msgstr "Готово"
 
-#: git-gui.sh:2819
+#: git-gui.sh:2841
 msgid "Commit@@verb"
 msgstr "Подаване"
 
-#: git-gui.sh:2828 git-gui.sh:3309
+#: git-gui.sh:2850 git-gui.sh:3335
 msgid "New Commit"
 msgstr "Ново подаване"
 
-#: git-gui.sh:2836 git-gui.sh:3316
+#: git-gui.sh:2858 git-gui.sh:3342
 msgid "Amend Last Commit"
 msgstr "Поправяне на последното подаване"
 
-#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101
+#: git-gui.sh:2868 git-gui.sh:3296 lib/remote_branch_delete.tcl:101
 msgid "Rescan"
 msgstr "Обновяване"
 
-#: git-gui.sh:2852
+#: git-gui.sh:2874
 msgid "Stage To Commit"
 msgstr "Към индекса за подаване"
 
-#: git-gui.sh:2858
+#: git-gui.sh:2880
 msgid "Stage Changed Files To Commit"
 msgstr "Всички променени файлове към индекса за подаване"
 
-#: git-gui.sh:2864
+#: git-gui.sh:2886
 msgid "Unstage From Commit"
 msgstr "Изваждане от индекса за подаване"
 
-#: git-gui.sh:2870 lib/index.tcl:442
+#: git-gui.sh:2892 lib/index.tcl:442
 msgid "Revert Changes"
 msgstr "Връщане на оригинала"
 
-#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612
+#: git-gui.sh:2900 git-gui.sh:3613 git-gui.sh:3644
 msgid "Show Less Context"
 msgstr "По-малко контекст"
 
-#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616
+#: git-gui.sh:2904 git-gui.sh:3617 git-gui.sh:3648
 msgid "Show More Context"
 msgstr "Повече контекст"
 
-#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392
+#: git-gui.sh:2911 git-gui.sh:3309 git-gui.sh:3423
 msgid "Sign Off"
 msgstr "Подписване"
 
-#: git-gui.sh:2905
+#: git-gui.sh:2927
 msgid "Local Merge..."
 msgstr "Локално сливане…"
 
-#: git-gui.sh:2910
+#: git-gui.sh:2932
 msgid "Abort Merge..."
 msgstr "Преустановяване на сливане…"
 
-#: git-gui.sh:2922 git-gui.sh:2950
+#: git-gui.sh:2944 git-gui.sh:2972
 msgid "Add..."
 msgstr "Добавяне…"
 
-#: git-gui.sh:2926
+#: git-gui.sh:2948
 msgid "Push..."
-msgstr "Избутване…"
+msgstr "Изтласкване…"
 
-#: git-gui.sh:2930
+#: git-gui.sh:2952
 msgid "Delete Branch..."
 msgstr "Изтриване на клон…"
 
-#: git-gui.sh:2940 git-gui.sh:3563
+#: git-gui.sh:2962 git-gui.sh:3595
 msgid "Options..."
 msgstr "Опции…"
 
-#: git-gui.sh:2951
+#: git-gui.sh:2973
 msgid "Remove..."
 msgstr "Премахване…"
 
-#: git-gui.sh:2960 lib/choose_repository.tcl:55
+#: git-gui.sh:2982 lib/choose_repository.tcl:55
 msgid "Help"
 msgstr "Помощ"
 
-#: git-gui.sh:2964 git-gui.sh:2968 lib/choose_repository.tcl:49
-#: lib/choose_repository.tcl:58 lib/about.tcl:14
+#: git-gui.sh:2986 git-gui.sh:2990 lib/about.tcl:14
+#: lib/choose_repository.tcl:49 lib/choose_repository.tcl:58
 #, tcl-format
 msgid "About %s"
 msgstr "Относно %s"
 
-#: git-gui.sh:2992
+#: git-gui.sh:3014
 msgid "Online Documentation"
 msgstr "Документация в Интернет"
 
-#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61
+#: git-gui.sh:3017 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61
 msgid "Show SSH Key"
 msgstr "Показване на ключа за SSH"
 
-#: git-gui.sh:3014 git-gui.sh:3146
+#: git-gui.sh:3032 git-gui.sh:3164
+msgid "usage:"
+msgstr "употреба:"
+
+#: git-gui.sh:3036 git-gui.sh:3168
 msgid "Usage"
 msgstr "Употреба"
 
-#: git-gui.sh:3095 lib/blame.tcl:573
+#: git-gui.sh:3117 lib/blame.tcl:573
 msgid "Error"
 msgstr "Грешка"
 
-#: git-gui.sh:3126
+#: git-gui.sh:3148
 #, tcl-format
 msgid "fatal: cannot stat path %s: No such file or directory"
 msgstr ""
 "ФАТАЛНА ГРЕШКА: пътят %s не може да бъде открит: такъв файл или директория "
 "няма"
 
-#: git-gui.sh:3159
+#: git-gui.sh:3181
 msgid "Current Branch:"
 msgstr "Текущ клон:"
 
-#: git-gui.sh:3185
-msgid "Staged Changes (Will Commit)"
-msgstr "Промени в индекса (за подаване)"
-
-#: git-gui.sh:3205
+#: git-gui.sh:3206
 msgid "Unstaged Changes"
 msgstr "Промени извън индекса"
 
-#: git-gui.sh:3276
+#: git-gui.sh:3228
+msgid "Staged Changes (Will Commit)"
+msgstr "Промени в индекса (за подаване)"
+
+#: git-gui.sh:3302
 msgid "Stage Changed"
 msgstr "Индексът е променен"
 
-#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229
+#: git-gui.sh:3321 lib/transport.tcl:137
 msgid "Push"
 msgstr "Изтласкване"
 
-#: git-gui.sh:3330
+#: git-gui.sh:3356
 msgid "Initial Commit Message:"
 msgstr "Първоначално съобщение при подаване:"
 
-#: git-gui.sh:3331
+#: git-gui.sh:3357
 msgid "Amended Commit Message:"
 msgstr "Поправено съобщение при подаване:"
 
-#: git-gui.sh:3332
+#: git-gui.sh:3358
 msgid "Amended Initial Commit Message:"
 msgstr "Поправено първоначално съобщение при подаване:"
 
-#: git-gui.sh:3333
+#: git-gui.sh:3359
 msgid "Amended Merge Commit Message:"
 msgstr "Поправено съобщение при подаване със сливане:"
 
-#: git-gui.sh:3334
+#: git-gui.sh:3360
 msgid "Merge Commit Message:"
 msgstr "Съобщение при подаване със сливане:"
 
-#: git-gui.sh:3335
+#: git-gui.sh:3361
 msgid "Commit Message:"
 msgstr "Съобщение при подаване:"
 
-#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73
+#: git-gui.sh:3415 git-gui.sh:3570 lib/console.tcl:73
 msgid "Copy All"
 msgstr "Копиране на всичко"
 
-#: git-gui.sh:3408 lib/blame.tcl:105
+#: git-gui.sh:3439 lib/blame.tcl:105
 msgid "File:"
 msgstr "Файл:"
 
-#: git-gui.sh:3526
+#: git-gui.sh:3558
 msgid "Refresh"
 msgstr "Обновяване"
 
-#: git-gui.sh:3547
+#: git-gui.sh:3579
 msgid "Decrease Font Size"
 msgstr "По-едър шрифт"
 
-#: git-gui.sh:3551
+#: git-gui.sh:3583
 msgid "Increase Font Size"
 msgstr "По-дребен шрифт"
 
-#: git-gui.sh:3559 lib/blame.tcl:294
+#: git-gui.sh:3591 lib/blame.tcl:294
 msgid "Encoding"
 msgstr "Кодиране"
 
-#: git-gui.sh:3570
+#: git-gui.sh:3602
 msgid "Apply/Reverse Hunk"
 msgstr "Прилагане/връщане на парче"
 
-#: git-gui.sh:3575
+#: git-gui.sh:3607
 msgid "Apply/Reverse Line"
 msgstr "Прилагане/връщане на ред"
 
-#: git-gui.sh:3594
+#: git-gui.sh:3626
 msgid "Run Merge Tool"
 msgstr "Изпълнение на програмата за сливане"
 
-#: git-gui.sh:3599
+#: git-gui.sh:3631
 msgid "Use Remote Version"
 msgstr "Версия от отдалеченото хранилище"
 
-#: git-gui.sh:3603
+#: git-gui.sh:3635
 msgid "Use Local Version"
 msgstr "Локална версия"
 
-#: git-gui.sh:3607
+#: git-gui.sh:3639
 msgid "Revert To Base"
 msgstr "Връщане към родителската версия"
 
-#: git-gui.sh:3625
+#: git-gui.sh:3657
 msgid "Visualize These Changes In The Submodule"
 msgstr "Визуализиране на промените в подмодула"
 
-#: git-gui.sh:3629
+#: git-gui.sh:3661
 msgid "Visualize Current Branch History In The Submodule"
 msgstr "Визуализация на историята на текущия клон в историята за подмодула"
 
-#: git-gui.sh:3633
+#: git-gui.sh:3665
 msgid "Visualize All Branch History In The Submodule"
 msgstr "Визуализация на историята на всички клони в историята за подмодула"
 
-#: git-gui.sh:3638
+#: git-gui.sh:3670
 msgid "Start git gui In The Submodule"
 msgstr "Стартиране на „git gui“ за подмодула"
 
-#: git-gui.sh:3673
+#: git-gui.sh:3705
 msgid "Unstage Hunk From Commit"
 msgstr "Изваждане на парчето от подаването"
 
-#: git-gui.sh:3675
+#: git-gui.sh:3707
 msgid "Unstage Lines From Commit"
 msgstr "Изваждане на редовете от подаването"
 
-#: git-gui.sh:3677
+#: git-gui.sh:3709
 msgid "Unstage Line From Commit"
 msgstr "Изваждане на реда от подаването"
 
-#: git-gui.sh:3680
+#: git-gui.sh:3712
 msgid "Stage Hunk For Commit"
 msgstr "Добавяне на парчето за подаване"
 
-#: git-gui.sh:3682
+#: git-gui.sh:3714
 msgid "Stage Lines For Commit"
 msgstr "Добавяне на редовете за подаване"
 
-#: git-gui.sh:3684
+#: git-gui.sh:3716
 msgid "Stage Line For Commit"
 msgstr "Добавяне на реда за подаване"
 
-#: git-gui.sh:3709
+#: git-gui.sh:3741
 msgid "Initializing..."
 msgstr "Инициализиране…"
 
-#: git-gui.sh:3852
+#: git-gui.sh:3886
 #, tcl-format
 msgid ""
 "Possible environment issues exist.\n"
@@ -576,7 +579,7 @@ msgstr ""
 "от %s:\n"
 "\n"
 
-#: git-gui.sh:3881
+#: git-gui.sh:3915
 msgid ""
 "\n"
 "This is due to a known issue with the\n"
@@ -586,7 +589,7 @@ msgstr ""
 "Това е познат проблем и се дължи на\n"
 "версията на Tcl включена в Cygwin."
 
-#: git-gui.sh:3886
+#: git-gui.sh:3920
 #, tcl-format
 msgid ""
 "\n"
@@ -602,199 +605,126 @@ msgstr ""
 "е да поставите настройките „user.name“ и\n"
 "„user.email“ в личния си файл „~/.gitconfig“.\n"
 
-#: lib/spellcheck.tcl:57
-msgid "Unsupported spell checker"
-msgstr "Тази програма за проверка на правописа не се поддържа"
-
-#: lib/spellcheck.tcl:65
-msgid "Spell checking is unavailable"
-msgstr "Липсва програма за проверка на правописа"
-
-#: lib/spellcheck.tcl:68
-msgid "Invalid spell checking configuration"
-msgstr "Неправилни настройки на проверката на правописа"
+#: lib/about.tcl:26
+msgid "git-gui - a graphical user interface for Git."
+msgstr "git-gui — графичен интерфейс за Git."
 
-#: lib/spellcheck.tcl:70
+#: lib/blame.tcl:73
 #, tcl-format
-msgid "Reverting dictionary to %s."
-msgstr "Ползване на речник за език „%s“."
-
-#: lib/spellcheck.tcl:73
-msgid "Spell checker silently failed on startup"
-msgstr "Програмата за правопис даже не стартира успешно."
-
-#: lib/spellcheck.tcl:80
-msgid "Unrecognized spell checker"
-msgstr "Непозната програма за проверка на правописа"
-
-#: lib/spellcheck.tcl:186
-msgid "No Suggestions"
-msgstr "Няма предложения"
-
-#: lib/spellcheck.tcl:388
-msgid "Unexpected EOF from spell checker"
-msgstr "Неочакван край на файл от програмата за проверка на правописа"
-
-#: lib/spellcheck.tcl:392
-msgid "Spell Checker Failed"
-msgstr "Грешка в програмата за проверка на правописа"
-
-#: lib/remote_add.tcl:20
-msgid "Add Remote"
-msgstr "Добавяне на отдалечено хранилище"
-
-#: lib/remote_add.tcl:25
-msgid "Add New Remote"
-msgstr "Добавяне на отдалечено хранилище"
-
-#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
-msgid "Add"
-msgstr "Добавяне"
-
-#: lib/remote_add.tcl:34 lib/browser.tcl:292 lib/branch_checkout.tcl:30
-#: lib/transport.tcl:141 lib/branch_rename.tcl:32 lib/choose_font.tcl:45
-#: lib/option.tcl:127 lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202
-#: lib/tools_dlg.tcl:345 lib/remote_branch_delete.tcl:43
-#: lib/checkout_op.tcl:579 lib/branch_create.tcl:37 lib/branch_delete.tcl:34
-#: lib/merge.tcl:174
-msgid "Cancel"
-msgstr "Отказване"
-
-#: lib/remote_add.tcl:39
-msgid "Remote Details"
-msgstr "Данни за отдалеченото хранилище"
-
-#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44
-msgid "Name:"
-msgstr "Име:"
+msgid "%s (%s): File Viewer"
+msgstr "%s (%s): Преглед на файлове"
 
-#: lib/remote_add.tcl:50
-msgid "Location:"
-msgstr "Ð\9cеÑ\81Ñ\82оположение:"
+#: lib/blame.tcl:79
+msgid "Commit:"
+msgstr "Ð\9fодаване:"
 
-#: lib/remote_add.tcl:60
-msgid "Further Action"
-msgstr "СледваÑ\89о Ð´ÐµÐ¹Ñ\81Ñ\82вие"
+#: lib/blame.tcl:280
+msgid "Copy Commit"
+msgstr "Ð\9aопиÑ\80ане Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½е"
 
-#: lib/remote_add.tcl:63
-msgid "Fetch Immediately"
-msgstr "Ð\9dезабавно Ð´Ð¾Ñ\81Ñ\82авÑ\8fне"
+#: lib/blame.tcl:284
+msgid "Find Text..."
+msgstr "ТÑ\8aÑ\80Ñ\81ене Ð½Ð° Ñ\82екÑ\81Ñ\82â\80¦"
 
-#: lib/remote_add.tcl:69
-msgid "Initialize Remote Repository and Push"
-msgstr "Ð\98ниÑ\86иализиÑ\80ане Ð½Ð° Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е Ð¸ Ð¸Ð·Ñ\82лаÑ\81кване Ð½Ð° Ð¿Ñ\80омениÑ\82е"
+#: lib/blame.tcl:288
+msgid "Goto Line..."
+msgstr "Ð\9aÑ\8aм Ñ\80едâ\80¦"
 
-#: lib/remote_add.tcl:75
-msgid "Do Nothing Else Now"
-msgstr "Ð\94а Ð½Ðµ Ñ\81е Ð¿Ñ\80ави Ð½Ð¸Ñ\89о"
+#: lib/blame.tcl:297
+msgid "Do Full Copy Detection"
+msgstr "Ð\9fÑ\8aлно Ñ\82Ñ\8aÑ\80Ñ\81ене Ð½Ð° ÐºÐ¾Ð¿Ð¸Ñ\80ане"
 
-#: lib/remote_add.tcl:100
-msgid "Please supply a remote name."
-msgstr "Ð\97адайÑ\82е Ð¸Ð¼Ðµ Ð·Ð° Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е."
+#: lib/blame.tcl:301
+msgid "Show History Context"
+msgstr "Ð\9fоказване Ð½Ð° ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82а Ð¾Ñ\82 Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а"
 
-#: lib/remote_add.tcl:113
-#, tcl-format
-msgid "'%s' is not an acceptable remote name."
-msgstr "Отдалечено хранилище не може да се казва „%s“."
+#: lib/blame.tcl:304
+msgid "Blame Parent Commit"
+msgstr "Анотиране на родителското подаване"
 
-#: lib/remote_add.tcl:124
+#: lib/blame.tcl:466
 #, tcl-format
-msgid "Failed to add remote '%s' of location '%s'."
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð´Ð¾Ð±Ð°Ð²Ñ\8fне Ð½Ð° Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð°Ð´Ñ\80еÑ\81 â\80\9e%sâ\80\9c."
+msgid "Reading %s..."
+msgstr "ЧеÑ\82е Ñ\81е â\80\9e%sâ\80\9câ\80¦"
 
-#: lib/remote_add.tcl:132 lib/transport.tcl:6
-#, tcl-format
-msgid "fetch %s"
-msgstr "доставяне на „%s“"
+#: lib/blame.tcl:594
+msgid "Loading copy/move tracking annotations..."
+msgstr "Зареждане на анотациите за проследяване на копирането/преместването…"
 
-#: lib/remote_add.tcl:133
-#, tcl-format
-msgid "Fetching the %s"
-msgstr "Доставяне на „%s“"
+#: lib/blame.tcl:614
+msgid "lines annotated"
+msgstr "реда анотирани"
 
-#: lib/remote_add.tcl:156
-#, tcl-format
-msgid "Do not know how to initialize repository at location '%s'."
-msgstr "Хранилището с местоположение „%s“ не може да бъде инициализирано."
+#: lib/blame.tcl:806
+msgid "Loading original location annotations..."
+msgstr "Зареждане на анотациите за първоначалното местоположение…"
 
-#: lib/remote_add.tcl:162 lib/transport.tcl:54 lib/transport.tcl:92
-#: lib/transport.tcl:110
-#, tcl-format
-msgid "push %s"
-msgstr "изтласкване на „%s“"
+#: lib/blame.tcl:809
+msgid "Annotation complete."
+msgstr "Анотирането завърши."
 
-#: lib/remote_add.tcl:163
-#, tcl-format
-msgid "Setting up the %s (at %s)"
-msgstr "Добавяне на хранилище „%s“ (с адрес „%s“)"
+#: lib/blame.tcl:839
+msgid "Busy"
+msgstr "Операцията не е завършила"
 
-#: lib/browser.tcl:17
-msgid "Starting..."
-msgstr "СÑ\82аÑ\80Ñ\82иÑ\80анеâ\80¦"
+#: lib/blame.tcl:840
+msgid "Annotation process is already running."
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\82еÑ\87е Ð¿Ñ\80оÑ\86еÑ\81 Ð½Ð° Ð°Ð½Ð¾Ñ\82иÑ\80ане."
 
-#: lib/browser.tcl:27
-msgid "File Browser"
-msgstr "Файлов Ð±Ñ\80аÑ\83зÑ\8aÑ\80"
+#: lib/blame.tcl:879
+msgid "Running thorough copy detection..."
+msgstr "Ð\98зпÑ\8aлнÑ\8fва Ñ\81е Ñ\86Ñ\8fлоÑ\81Ñ\82ен Ð¿Ñ\80оÑ\86еÑ\81 Ð½Ð° Ð¾Ñ\82кÑ\80иване Ð½Ð° ÐºÐ¾Ð¿Ð¸Ñ\80анеâ\80¦"
 
-#: lib/browser.tcl:132 lib/browser.tcl:149
-#, tcl-format
-msgid "Loading %s..."
-msgstr "Зареждане на „%s“…"
+#: lib/blame.tcl:947
+msgid "Loading annotation..."
+msgstr "Зареждане на анотации…"
 
-#: lib/browser.tcl:193
-msgid "[Up To Parent]"
-msgstr "[Към родителя]"
+#: lib/blame.tcl:1000
+msgid "Author:"
+msgstr "Автор:"
 
-#: lib/browser.tcl:275 lib/browser.tcl:282
-msgid "Browse Branch Files"
-msgstr "Разглеждане Ð½Ð° Ñ\84айловеÑ\82е Ð² ÐºÐ»Ð¾Ð½Ð°"
+#: lib/blame.tcl:1004
+msgid "Committer:"
+msgstr "Ð\9fодал:"
 
-#: lib/browser.tcl:288 lib/choose_repository.tcl:422
-#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518
-#: lib/choose_repository.tcl:1074
-msgid "Browse"
-msgstr "Разглеждане"
+#: lib/blame.tcl:1009
+msgid "Original File:"
+msgstr "Първоначален файл:"
 
-#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321
-msgid "Revision"
-msgstr "Ð\92еÑ\80Ñ\81иÑ\8f"
+#: lib/blame.tcl:1057
+msgid "Cannot find HEAD commit:"
+msgstr "Ð\9fодаванеÑ\82о Ð·Ð° Ð²Ñ\80Ñ\8aÑ\85 â\80\9eHEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82кÑ\80ие:"
 
-#: lib/tools.tcl:75
-#, tcl-format
-msgid "Running %s requires a selected file."
-msgstr "За изпълнението на „%s“ трябва да изберете файл."
+#: lib/blame.tcl:1112
+msgid "Cannot find parent commit:"
+msgstr "Родителското подаване не може да бъде открито"
 
-#: lib/tools.tcl:91
-#, tcl-format
-msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
-msgstr "Сигурни ли сте, че искате да изпълните „%1$s“ върху файла „%2$s“?"
+#: lib/blame.tcl:1127
+msgid "Unable to display parent"
+msgstr "Родителят не може да бъде показан"
 
-#: lib/tools.tcl:95
-#, tcl-format
-msgid "Are you sure you want to run %s?"
-msgstr "Сигурни ли сте, че искате да изпълните „%s“?"
+#: lib/blame.tcl:1128 lib/diff.tcl:358
+msgid "Error loading diff:"
+msgstr "Грешка при зареждане на разлика:"
 
-#: lib/tools.tcl:116
-#, tcl-format
-msgid "Tool: %s"
-msgstr "Команда: %s"
+#: lib/blame.tcl:1269
+msgid "Originally By:"
+msgstr "Първоначално от:"
 
-#: lib/tools.tcl:117
-#, tcl-format
-msgid "Running: %s"
-msgstr "Изпълнение: %s"
+#: lib/blame.tcl:1275
+msgid "In File:"
+msgstr "Във файл:"
 
-#: lib/tools.tcl:155
-#, tcl-format
-msgid "Tool completed successfully: %s"
-msgstr "Командата завърши успешно: %s"
+#: lib/blame.tcl:1280
+msgid "Copied Or Moved Here By:"
+msgstr "Копирано или преместено тук от:"
 
-#: lib/tools.tcl:157
+#: lib/branch_checkout.tcl:16
 #, tcl-format
-msgid "Tool failed: %s"
-msgstr "Командата върна грешка: %s"
+msgid "%s (%s): Checkout Branch"
+msgstr "%s (%s): Клон за изтегляне"
 
-#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21
+#: lib/branch_checkout.tcl:21
 msgid "Checkout Branch"
 msgstr "Клон за изтегляне"
 
@@ -802,7 +732,19 @@ msgstr "Клон за изтегляне"
 msgid "Checkout"
 msgstr "Изтегляне"
 
-#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69
+#: lib/branch_checkout.tcl:30 lib/branch_create.tcl:37 lib/branch_delete.tcl:34
+#: lib/branch_rename.tcl:32 lib/browser.tcl:292 lib/checkout_op.tcl:579
+#: lib/choose_font.tcl:45 lib/merge.tcl:178 lib/option.tcl:127
+#: lib/remote_add.tcl:34 lib/remote_branch_delete.tcl:43 lib/tools_dlg.tcl:41
+#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/transport.tcl:141
+msgid "Cancel"
+msgstr "Отказване"
+
+#: lib/branch_checkout.tcl:35 lib/browser.tcl:297 lib/tools_dlg.tcl:321
+msgid "Revision"
+msgstr "Версия"
+
+#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:69 lib/option.tcl:310
 msgid "Options"
 msgstr "Опции"
 
@@ -814,167 +756,129 @@ msgstr "Изтегляне на промените от следения кло
 msgid "Detach From Local Branch"
 msgstr "Изтриване от локалния клон"
 
-#: lib/transport.tcl:7
+#: lib/branch_create.tcl:23
 #, tcl-format
-msgid "Fetching new changes from %s"
-msgstr "Доставяне на промените от „%s“"
+msgid "%s (%s): Create Branch"
+msgstr "%s (%s): Създаване на клон"
 
-#: lib/transport.tcl:18
-#, tcl-format
-msgid "remote prune %s"
-msgstr "окастряне на следящите клони към „%s“"
-
-#: lib/transport.tcl:19
-#, tcl-format
-msgid "Pruning tracking branches deleted from %s"
-msgstr "Окастряне на следящите клони на изтритите клони от „%s“"
-
-#: lib/transport.tcl:25
-msgid "fetch all remotes"
-msgstr "доставяне на всички отдалечени хранилища"
-
-#: lib/transport.tcl:26
-msgid "Fetching new changes from all remotes"
-msgstr "Доставяне на новите промени от всички отдалечени хранилища"
-
-#: lib/transport.tcl:40
-msgid "remote prune all remotes"
-msgstr "окастряне на всички следящи клони"
+#: lib/branch_create.tcl:28
+msgid "Create New Branch"
+msgstr "Създаване на нов клон"
 
-#: lib/transport.tcl:41
-msgid "Pruning tracking branches deleted from all remotes"
-msgstr ""
-"Окастряне на всички клони, които следят изтрити клони от отдалечени хранилища"
+#: lib/branch_create.tcl:33 lib/choose_repository.tcl:407
+msgid "Create"
+msgstr "Създаване"
 
-#: lib/transport.tcl:55
-#, tcl-format
-msgid "Pushing changes to %s"
-msgstr "Изтласкване на промените към „%s“"
+#: lib/branch_create.tcl:42
+msgid "Branch Name"
+msgstr "Име на клона"
 
-#: lib/transport.tcl:93
-#, tcl-format
-msgid "Mirroring to %s"
-msgstr "Изтласкване на всичко към „%s“"
+#: lib/branch_create.tcl:44 lib/remote_add.tcl:41 lib/tools_dlg.tcl:51
+msgid "Name:"
+msgstr "Име:"
 
-#: lib/transport.tcl:111
-#, tcl-format
-msgid "Pushing %s %s to %s"
-msgstr "Изтласкване на %s „%s“ към „%s“"
+#: lib/branch_create.tcl:57
+msgid "Match Tracking Branch Name"
+msgstr "Съвпадане по името на следения клон"
 
-#: lib/transport.tcl:132
-msgid "Push Branches"
-msgstr "Ð\9aлони Ð·Ð° Ð¸Ð·Ñ\82лаÑ\81кване"
+#: lib/branch_create.tcl:66
+msgid "Starting Revision"
+msgstr "Ð\9dаÑ\87ална Ð²ÐµÑ\80Ñ\81иÑ\8f"
 
-#: lib/transport.tcl:147
-msgid "Source Branches"
-msgstr "Ð\9aлони-изÑ\82оÑ\87ниÑ\86и"
+#: lib/branch_create.tcl:72
+msgid "Update Existing Branch:"
+msgstr "Ð\9eбновÑ\8fване Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89 ÐºÐ»Ð¾Ð½:"
 
-#: lib/transport.tcl:162
-msgid "Destination Repository"
-msgstr "Целево Ñ\85Ñ\80анилиÑ\89е"
+#: lib/branch_create.tcl:75
+msgid "No"
+msgstr "Ð\9dе"
 
-#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51
-msgid "Remote:"
-msgstr "Ð\9eÑ\82далеÑ\87ено Ñ\85Ñ\80анилиÑ\89е:"
+#: lib/branch_create.tcl:80
+msgid "Fast Forward Only"
+msgstr "Само Ñ\82Ñ\80ивиално Ð¿Ñ\80евÑ\8aÑ\80Ñ\82аÑ\89о Ñ\81ливане"
 
-#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72
-msgid "Arbitrary Location:"
-msgstr "Ð\9fÑ\80оизволно Ð¼ÐµÑ\81Ñ\82оположение:"
+#: lib/branch_create.tcl:85 lib/checkout_op.tcl:571
+msgid "Reset"
+msgstr "Ð\9eÑ\82наÑ\87ало"
 
-#: lib/transport.tcl:205
-msgid "Transfer Options"
-msgstr "Ð\9dаÑ\81Ñ\82Ñ\80ойки Ð¿Ñ\80и Ð¿Ñ\80енаÑ\81Ñ\8fнеÑ\82о"
+#: lib/branch_create.tcl:97
+msgid "Checkout After Creation"
+msgstr "Ð\9fÑ\80еминаване ÐºÑ\8aм ÐºÐ»Ð¾Ð½Ð° Ñ\81лед Ñ\81Ñ\8aздаванеÑ\82о Ð¼Ñ\83"
 
-#: lib/transport.tcl:207
-msgid "Force overwrite existing branch (may discard changes)"
-msgstr ""
-"Изрично презаписване на съществуващ клон (някои промени може да бъдат "
-"загубени)"
+#: lib/branch_create.tcl:132
+msgid "Please select a tracking branch."
+msgstr "Изберете клон за следени."
 
-#: lib/transport.tcl:211
-msgid "Use thin pack (for slow network connections)"
-msgstr "Максимална компресия (за бавни мрежови връзки)"
+#: lib/branch_create.tcl:141
+#, tcl-format
+msgid "Tracking branch %s is not a branch in the remote repository."
+msgstr "Следящият клон — „%s“, не съществува в отдалеченото хранилище."
 
-#: lib/transport.tcl:215
-msgid "Include tags"
-msgstr "Ð\92клÑ\8eÑ\87ване Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е"
+#: lib/branch_create.tcl:154 lib/branch_rename.tcl:92
+msgid "Please supply a branch name."
+msgstr "Ð\94айÑ\82е Ð¸Ð¼Ðµ Ð½Ð° ÐºÐ»Ð¾Ð½Ð°."
 
-#: lib/status_bar.tcl:87
+#: lib/branch_create.tcl:165 lib/branch_rename.tcl:112
 #, tcl-format
-msgid "%s ... %*i of %*i %s (%3i%%)"
-msgstr "%s… %*i от общо %*i %s (%3i%%)"
+msgid "'%s' is not an acceptable branch name."
+msgstr "„%s“ не може да се използва за име на клон."
 
-#: lib/remote.tcl:200
-msgid "Push to"
-msgstr "Изтласкване към"
+#: lib/branch_delete.tcl:16
+#, tcl-format
+msgid "%s (%s): Delete Branch"
+msgstr "%s (%s): Изтриване на клон"
 
-#: lib/remote.tcl:218
-msgid "Remove Remote"
-msgstr "Ð\9fÑ\80емаÑ\85ване Ð½Ð° Ð¾Ñ\82далеÑ\87ено Ñ\85Ñ\80анилиÑ\89е"
+#: lib/branch_delete.tcl:21
+msgid "Delete Local Branch"
+msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° Ð»Ð¾ÐºÐ°Ð»ÐµÐ½ ÐºÐ»Ð¾Ð½"
 
-#: lib/remote.tcl:223
-msgid "Prune from"
-msgstr "Ð\9eкаÑ\81Ñ\82Ñ\80Ñ\8fне Ð¾Ñ\82"
+#: lib/branch_delete.tcl:39
+msgid "Local Branches"
+msgstr "Ð\9bокални ÐºÐ»Ð¾Ð½Ð¸"
 
-#: lib/remote.tcl:228
-msgid "Fetch from"
-msgstr "Ð\94оÑ\81Ñ\82авÑ\8fне Ð¾Ñ\82"
+#: lib/branch_delete.tcl:51
+msgid "Delete Only If Merged Into"
+msgstr "Ð\98зÑ\82Ñ\80иване, Ñ\81амо Ð°ÐºÐ¾ Ð¿Ñ\80омениÑ\82е Ñ\81а Ñ\81леÑ\82и Ð¸ Ð´Ñ\80Ñ\83гаде"
 
-#: lib/sshkey.tcl:31
-msgid "No keys found."
-msgstr "Ð\9dе Ñ\81а Ð¾Ñ\82кÑ\80иÑ\82и ÐºÐ»Ñ\8eÑ\87ове."
+#: lib/branch_delete.tcl:53 lib/remote_branch_delete.tcl:120
+msgid "Always (Do not perform merge checks)"
+msgstr "Ð\92инаги (без Ð¿Ñ\80овеÑ\80ка Ð·Ð° Ñ\81ливане)"
 
-#: lib/sshkey.tcl:34
+#: lib/branch_delete.tcl:103
 #, tcl-format
-msgid "Found a public key in: %s"
-msgstr "Открит е публичен ключ в „%s“"
-
-#: lib/sshkey.tcl:40
-msgid "Generate Key"
-msgstr "Генериране на ключ"
-
-#: lib/sshkey.tcl:55 lib/checkout_op.tcl:146 lib/console.tcl:81
-#: lib/database.tcl:30
-msgid "Close"
-msgstr "Затваряне"
-
-#: lib/sshkey.tcl:58
-msgid "Copy To Clipboard"
-msgstr "Копиране към системния буфер"
+msgid "The following branches are not completely merged into %s:"
+msgstr "Не всички промени в клоните са слети в „%s“:"
 
-#: lib/sshkey.tcl:72
-msgid "Your OpenSSH Public Key"
-msgstr "Публичният ви ключ за OpenSSH"
+#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:218
+msgid ""
+"Recovering deleted branches is difficult.\n"
+"\n"
+"Delete the selected branches?"
+msgstr ""
+"Възстановяването на изтрити клони може да е трудно.\n"
+"\n"
+"Сигурни ли сте, че искате да триете?"
 
-#: lib/sshkey.tcl:80
-msgid "Generating..."
-msgstr "Генериране…"
+#: lib/branch_delete.tcl:131
+#, tcl-format
+msgid " - %s:"
+msgstr " — „%s:“"
 
-#: lib/sshkey.tcl:86
+#: lib/branch_delete.tcl:141
 #, tcl-format
 msgid ""
-"Could not start ssh-keygen:\n"
-"\n"
+"Failed to delete branches:\n"
 "%s"
 msgstr ""
-"Програмата „ssh-keygen“ не може да бъде стартирана:\n"
-"\n"
+"Неуспешно триене на клони:\n"
 "%s"
 
-#: lib/sshkey.tcl:113
-msgid "Generation failed."
-msgstr "Неуспешно генериране."
-
-#: lib/sshkey.tcl:120
-msgid "Generation succeeded, but no keys found."
-msgstr "Генерирането завърши успешно, а не са намерени ключове."
-
-#: lib/sshkey.tcl:123
+#: lib/branch_rename.tcl:15
 #, tcl-format
-msgid "Your key is in: %s"
-msgstr "Ключът ви е в „%s“"
+msgid "%s (%s): Rename Branch"
+msgstr "%s (%s): Преименуване на клон"
 
-#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23
+#: lib/branch_rename.tcl:23
 msgid "Rename Branch"
 msgstr "Преименуване на клон"
 
@@ -994,426 +898,777 @@ msgstr "Ново име:"
 msgid "Please select a branch to rename."
 msgstr "Изберете клон за преименуване."
 
-#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154
-msgid "Please supply a branch name."
-msgstr "Дайте име на клона."
-
 #: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202
 #, tcl-format
 msgid "Branch '%s' already exists."
 msgstr "Клонът „%s“ вече съществува."
 
-#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165
-#, tcl-format
-msgid "'%s' is not an acceptable branch name."
-msgstr "„%s“ не може да се използва за име на клон."
-
 #: lib/branch_rename.tcl:123
 #, tcl-format
 msgid "Failed to rename '%s'."
 msgstr "Неуспешно преименуване на „%s“."
 
-#: lib/choose_font.tcl:41
-msgid "Select"
-msgstr "Избор"
-
-#: lib/choose_font.tcl:55
-msgid "Font Family"
-msgstr "Шрифт"
+#: lib/browser.tcl:17
+msgid "Starting..."
+msgstr "Стартиране…"
 
-#: lib/choose_font.tcl:76
-msgid "Font Size"
-msgstr "Размер"
+#: lib/browser.tcl:27
+#, tcl-format
+msgid "%s (%s): File Browser"
+msgstr "%s (%s): Файлов браузър"
 
-#: lib/choose_font.tcl:93
-msgid "Font Example"
-msgstr "Мостра"
+#: lib/browser.tcl:132 lib/browser.tcl:149
+#, tcl-format
+msgid "Loading %s..."
+msgstr "Зареждане на „%s“…"
 
-#: lib/choose_font.tcl:105
-msgid ""
-"This is example text.\n"
-"If you like this text, it can be your font."
-msgstr ""
-"Това е примерен текст.\n"
-"Ако ви харесва как изглежда, изберете шрифта."
+#: lib/browser.tcl:193
+msgid "[Up To Parent]"
+msgstr "[Към родителя]"
 
-#: lib/option.tcl:11
+#: lib/browser.tcl:275
 #, tcl-format
-msgid "Invalid global encoding '%s'"
-msgstr "Неправилно глобално кодиране „%s“"
+msgid "%s (%s): Browse Branch Files"
+msgstr "%s (%s): Разглеждане на файловете в клона"
 
-#: lib/option.tcl:19
-#, tcl-format
-msgid "Invalid repo encoding '%s'"
-msgstr "Неправилно кодиране „%s“ на хранилището"
+#: lib/browser.tcl:282
+msgid "Browse Branch Files"
+msgstr "Разглеждане на файловете в клона"
 
-#: lib/option.tcl:119
-msgid "Restore Defaults"
-msgstr "Стандартни настройки"
+#: lib/browser.tcl:288 lib/choose_repository.tcl:422
+#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518
+#: lib/choose_repository.tcl:1074
+msgid "Browse"
+msgstr "Разглеждане"
 
-#: lib/option.tcl:123
-msgid "Save"
-msgstr "Запазване"
+#: lib/checkout_op.tcl:85
+#, tcl-format
+msgid "Fetching %s from %s"
+msgstr "Доставяне на „%s“ от „%s“"
 
-#: lib/option.tcl:133
+#: lib/checkout_op.tcl:133
 #, tcl-format
-msgid "%s Repository"
-msgstr "Хранилище „%s“"
+msgid "fatal: Cannot resolve %s"
+msgstr "фатална грешка: „%s“ не може да се открие"
 
-#: lib/option.tcl:134
-msgid "Global (All Repositories)"
-msgstr "Глобално (за всички хранилища)"
+#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:30
+#: lib/sshkey.tcl:55
+msgid "Close"
+msgstr "Затваряне"
 
-#: lib/option.tcl:140
-msgid "User Name"
-msgstr "Потребителско име"
+#: lib/checkout_op.tcl:175
+#, tcl-format
+msgid "Branch '%s' does not exist."
+msgstr "Клонът „%s“ не съществува."
 
-#: lib/option.tcl:141
-msgid "Email Address"
-msgstr "Адрес на е-поща"
+#: lib/checkout_op.tcl:194
+#, tcl-format
+msgid "Failed to configure simplified git-pull for '%s'."
+msgstr "Неуспешно настройване на опростен git-pull за „%s“."
 
-#: lib/option.tcl:143
-msgid "Summarize Merge Commits"
-msgstr "Обобщаване на подаванията при сливане"
+#: lib/checkout_op.tcl:229
+#, tcl-format
+msgid ""
+"Branch '%s' already exists.\n"
+"\n"
+"It cannot fast-forward to %s.\n"
+"A merge is required."
+msgstr ""
+"Клонът „%s“ съществува.\n"
+"\n"
+"Той не може да бъде тривиално слят до „%s“.\n"
+"Необходимо е сливане."
 
-#: lib/option.tcl:144
-msgid "Merge Verbosity"
-msgstr "Подробности при сливанията"
+#: lib/checkout_op.tcl:243
+#, tcl-format
+msgid "Merge strategy '%s' not supported."
+msgstr "Стратегия за сливане  „%s“ не се поддържа."
 
-#: lib/option.tcl:145
-msgid "Show Diffstat After Merge"
-msgstr "Извеждане на статистика след сливанията"
+#: lib/checkout_op.tcl:262
+#, tcl-format
+msgid "Failed to update '%s'."
+msgstr "Неуспешно обновяване на „%s“."
 
-#: lib/option.tcl:146
-msgid "Use Merge Tool"
-msgstr "Ð\98зползване Ð½Ð° Ð¿Ñ\80огÑ\80ама Ð·Ð° Ñ\81ливане"
+#: lib/checkout_op.tcl:274
+msgid "Staging area (index) is already locked."
+msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð²ÐµÑ\87е Ðµ Ð·Ð°ÐºÐ»Ñ\8eÑ\87ен."
 
-#: lib/option.tcl:148
-msgid "Trust File Modification Timestamps"
-msgstr "Доверие във времето на промяна на файловете"
+#: lib/checkout_op.tcl:289
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before the current branch can be changed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"Състоянието при последната проверка не отговаря на състоянието на "
+"хранилището.\n"
+"\n"
+"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
+"трябва да бъде проверено, преди да се премине към нов клон.\n"
+"\n"
+"Автоматично ще започне нова проверка.\n"
 
-#: lib/option.tcl:149
-msgid "Prune Tracking Branches During Fetch"
-msgstr "Окастряне на следящите клонове при доставяне"
+#: lib/checkout_op.tcl:345
+#, tcl-format
+msgid "Updating working directory to '%s'..."
+msgstr "Работната директория се привежда към „%s“…"
 
-#: lib/option.tcl:150
-msgid "Match Tracking Branches"
-msgstr "Напасване на следящите клонове"
+#: lib/checkout_op.tcl:346
+msgid "files checked out"
+msgstr "файла са изтеглени"
 
-#: lib/option.tcl:151
-msgid "Use Textconv For Diffs and Blames"
+#: lib/checkout_op.tcl:376
+#, tcl-format
+msgid "Aborted checkout of '%s' (file level merging is required)."
 msgstr ""
-"Преобразуване на текста с „textconv“ при анотиране и извеждане на разлики"
+"Преустановяване на изтеглянето на „%s“ (необходимо е пофайлово сливане)."
 
-#: lib/option.tcl:152
-msgid "Blame Copy Only On Changed Files"
-msgstr "Ð\90ноÑ\82иÑ\80ане Ð½Ð° ÐºÐ¾Ð¿Ð¸ÐµÑ\82о Ñ\81амо Ð¿Ð¾ Ð¿Ñ\80оменениÑ\82е Ñ\84айлове"
+#: lib/checkout_op.tcl:377
+msgid "File level merge required."
+msgstr "Ð\9dеобÑ\85одимо Ðµ Ð¿Ð¾Ñ\84айлово Ñ\81ливане."
 
-#: lib/option.tcl:153
-msgid "Maximum Length of Recent Repositories List"
-msgstr "Максимална дължина на списъка със скоро ползвани хранилища"
+#: lib/checkout_op.tcl:381
+#, tcl-format
+msgid "Staying on branch '%s'."
+msgstr "Оставане върху клона „%s“."
 
-#: lib/option.tcl:154
-msgid "Minimum Letters To Blame Copy On"
-msgstr "Минимален брой знаци за анотиране на копието"
+#: lib/checkout_op.tcl:452
+msgid ""
+"You are no longer on a local branch.\n"
+"\n"
+"If you wanted to be on a branch, create one now starting from 'This Detached "
+"Checkout'."
+msgstr ""
+"Вече не сте на локален клон.\n"
+"\n"
+"Ако искате да сте на клон, създайте базиран на „Това несвързано изтегляне“."
 
-#: lib/option.tcl:155
-msgid "Blame History Context Radius (days)"
-msgstr "Исторически обхват за анотиране в дни"
+#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507
+#, tcl-format
+msgid "Checked out '%s'."
+msgstr "„%s“ е изтеглен."
 
-#: lib/option.tcl:156
-msgid "Number of Diff Context Lines"
-msgstr "Брой редове за контекста при извеждане на разликите"
+#: lib/checkout_op.tcl:535
+#, tcl-format
+msgid "Resetting '%s' to '%s' will lose the following commits:"
+msgstr ""
+"Зануляването на „%s“ към „%s“ ще доведе до загубването на следните подавания:"
 
-#: lib/option.tcl:157
-msgid "Additional Diff Parameters"
-msgstr "Ð\94опÑ\8aлниÑ\82елни Ð°Ñ\80гÑ\83менÑ\82и ÐºÑ\8aм â\80\9egit diffâ\80\9c"
+#: lib/checkout_op.tcl:557
+msgid "Recovering lost commits may not be easy."
+msgstr "Ð\92Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ð·Ð°Ð³Ñ\83бениÑ\82е Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ñ\82Ñ\80Ñ\83дно."
 
-#: lib/option.tcl:158
-msgid "Commit Message Text Width"
-msgstr "Широчина на текста на съобщението при подаване"
+#: lib/checkout_op.tcl:562
+#, tcl-format
+msgid "Reset '%s'?"
+msgstr "Зануляване на „%s“?"
 
-#: lib/option.tcl:159
-msgid "New Branch Name Template"
-msgstr "Шаблон Ð·Ð° Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ð½Ð¾Ð²Ð¸Ñ\82е ÐºÐ»Ð¾Ð½Ð¸"
+#: lib/checkout_op.tcl:567 lib/merge.tcl:170 lib/tools_dlg.tcl:336
+msgid "Visualize"
+msgstr "Ð\92изÑ\83ализаÑ\86иÑ\8f"
 
-#: lib/option.tcl:160
-msgid "Default File Contents Encoding"
-msgstr "Стандартно кодиране на файловете"
+#: lib/checkout_op.tcl:635
+#, tcl-format
+msgid ""
+"Failed to set current branch.\n"
+"\n"
+"This working directory is only partially switched.  We successfully updated "
+"your files, but failed to update an internal Git file.\n"
+"\n"
+"This should not have occurred.  %s will now close and give up."
+msgstr ""
+"Неуспешно задаване на текущия клон.\n"
+"\n"
+"Работната директория е само частично обновена: файловете са обновени "
+"успешно, но някой от вътрешните, служебни файлове на Git не е бил.\n"
+"\n"
+"Това състояние е аварийно и не трябва да се случва. Програмата „%s“ ще "
+"преустанови работа."
 
-#: lib/option.tcl:161
-msgid "Warn before committing to a detached head"
-msgstr "Ð\9fÑ\80едÑ\83пÑ\80еждаване Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о Ð¿Ñ\80и Ð½ÐµÑ\81вÑ\8aÑ\80зан Ð²Ñ\80Ñ\8aÑ\85"
+#: lib/choose_font.tcl:41
+msgid "Select"
+msgstr "Ð\98збоÑ\80"
 
-#: lib/option.tcl:162
-msgid "Staging of untracked files"
-msgstr "Ð\92каÑ\80ване Ð½Ð° Ð½ÐµÑ\81ледени Ñ\84айлове Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: lib/choose_font.tcl:55
+msgid "Font Family"
+msgstr "ШÑ\80иÑ\84Ñ\82"
 
-#: lib/option.tcl:163
-msgid "Show untracked files"
-msgstr "Ð\9fоказване Ð½Ð° Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове"
+#: lib/choose_font.tcl:76
+msgid "Font Size"
+msgstr "РазмеÑ\80"
 
-#: lib/option.tcl:164
-msgid "Tab spacing"
-msgstr "РазмеÑ\80 Ð½Ð° Ñ\82абÑ\83лаÑ\86иÑ\8fÑ\82а Ð² Ð¸Ð½Ñ\82еÑ\80вали"
+#: lib/choose_font.tcl:93
+msgid "Font Example"
+msgstr "Ð\9cоÑ\81Ñ\82Ñ\80а"
 
-#: lib/option.tcl:210
-msgid "Change"
-msgstr "Смяна"
+#: lib/choose_font.tcl:105
+msgid ""
+"This is example text.\n"
+"If you like this text, it can be your font."
+msgstr ""
+"Това е примерен текст.\n"
+"Ако ви харесва как изглежда, изберете шрифта."
+
+#: lib/choose_repository.tcl:33
+msgid "Git Gui"
+msgstr "ГПИ на Git"
+
+#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412
+msgid "Create New Repository"
+msgstr "Създаване на ново хранилище"
+
+#: lib/choose_repository.tcl:98
+msgid "New..."
+msgstr "Ново…"
+
+#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496
+msgid "Clone Existing Repository"
+msgstr "Клониране на съществуващо хранилище"
+
+#: lib/choose_repository.tcl:116
+msgid "Clone..."
+msgstr "Клониране…"
+
+#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064
+msgid "Open Existing Repository"
+msgstr "Отваряне на съществуващо хранилище"
+
+#: lib/choose_repository.tcl:129
+msgid "Open..."
+msgstr "Отваряне…"
+
+#: lib/choose_repository.tcl:142
+msgid "Recent Repositories"
+msgstr "Скоро ползвани"
+
+#: lib/choose_repository.tcl:148
+msgid "Open Recent Repository:"
+msgstr "Отваряне на хранилище ползвано наскоро:"
+
+#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323
+#: lib/choose_repository.tcl:330
+#, tcl-format
+msgid "Failed to create repository %s:"
+msgstr "Неуспешно създаване на хранилището „%s“:"
+
+#: lib/choose_repository.tcl:417
+msgid "Directory:"
+msgstr "Директория:"
+
+#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573
+#: lib/choose_repository.tcl:1098
+msgid "Git Repository"
+msgstr "Хранилище на Git"
+
+#: lib/choose_repository.tcl:472
+#, tcl-format
+msgid "Directory %s already exists."
+msgstr "Вече съществува директория „%s“."
+
+#: lib/choose_repository.tcl:476
+#, tcl-format
+msgid "File %s already exists."
+msgstr "Вече съществува файл „%s“."
+
+#: lib/choose_repository.tcl:491
+msgid "Clone"
+msgstr "Клониране"
+
+#: lib/choose_repository.tcl:504
+msgid "Source Location:"
+msgstr "Адрес на източника:"
+
+#: lib/choose_repository.tcl:513
+msgid "Target Directory:"
+msgstr "Целева директория:"
+
+#: lib/choose_repository.tcl:523
+msgid "Clone Type:"
+msgstr "Вид клониране:"
+
+#: lib/choose_repository.tcl:528
+msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
+msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)"
+
+#: lib/choose_repository.tcl:533
+msgid "Full Copy (Slower, Redundant Backup)"
+msgstr "Пълно (бавно, пълноценно резервно копие)"
+
+#: lib/choose_repository.tcl:538
+msgid "Shared (Fastest, Not Recommended, No Backup)"
+msgstr "Споделено (най-бързо, не се препоръчва, не прави резервно копие)"
+
+#: lib/choose_repository.tcl:545
+msgid "Recursively clone submodules too"
+msgstr "Рекурсивно клониране и на подмодулите"
+
+#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626
+#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842
+#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112
+#, tcl-format
+msgid "Not a Git repository: %s"
+msgstr "Това не е хранилище на Git: %s"
+
+#: lib/choose_repository.tcl:615
+msgid "Standard only available for local repository."
+msgstr "Само локални хранилища могат да се клонират стандартно"
+
+#: lib/choose_repository.tcl:619
+msgid "Shared only available for local repository."
+msgstr "Само локални хранилища могат да се клонират споделено"
+
+#: lib/choose_repository.tcl:640
+#, tcl-format
+msgid "Location %s already exists."
+msgstr "Местоположението „%s“ вече съществува."
+
+#: lib/choose_repository.tcl:651
+msgid "Failed to configure origin"
+msgstr "Неуспешно настройване на хранилището-източник"
+
+#: lib/choose_repository.tcl:663
+msgid "Counting objects"
+msgstr "Преброяване на обекти"
+
+#: lib/choose_repository.tcl:664
+msgid "buckets"
+msgstr "клетки"
+
+#: lib/choose_repository.tcl:688
+#, tcl-format
+msgid "Unable to copy objects/info/alternates: %s"
+msgstr "Обектите/информацията/синонимите не могат да бъдат копирани: %s"
+
+#: lib/choose_repository.tcl:724
+#, tcl-format
+msgid "Nothing to clone from %s."
+msgstr "Няма какво да се клонира от „%s“."
+
+#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940
+#: lib/choose_repository.tcl:952
+msgid "The 'master' branch has not been initialized."
+msgstr "Основният клон — „master“ не е инициализиран."
+
+#: lib/choose_repository.tcl:739
+msgid "Hardlinks are unavailable.  Falling back to copying."
+msgstr "Не се поддържат твърди връзки. Преминава се към копиране."
+
+#: lib/choose_repository.tcl:751
+#, tcl-format
+msgid "Cloning from %s"
+msgstr "Клониране на „%s“"
+
+#: lib/choose_repository.tcl:782
+msgid "Copying objects"
+msgstr "Копиране на обекти"
+
+#: lib/choose_repository.tcl:783
+msgid "KiB"
+msgstr "KiB"
+
+#: lib/choose_repository.tcl:807
+#, tcl-format
+msgid "Unable to copy object: %s"
+msgstr "Неуспешно копиране на обект: %s"
+
+#: lib/choose_repository.tcl:817
+msgid "Linking objects"
+msgstr "Създаване на връзки към обектите"
+
+#: lib/choose_repository.tcl:818
+msgid "objects"
+msgstr "обекти"
+
+#: lib/choose_repository.tcl:826
+#, tcl-format
+msgid "Unable to hardlink object: %s"
+msgstr "Неуспешно създаване на твърда връзка към обект: %s"
+
+#: lib/choose_repository.tcl:881
+msgid "Cannot fetch branches and objects.  See console output for details."
+msgstr ""
+"Клоните и обектите не могат да бъдат изтеглени. За повече информация "
+"погледнете изхода на конзолата."
+
+#: lib/choose_repository.tcl:892
+msgid "Cannot fetch tags.  See console output for details."
+msgstr ""
+"Етикетите не могат да бъдат изтеглени. За повече информация погледнете "
+"изхода на конзолата."
+
+#: lib/choose_repository.tcl:916
+msgid "Cannot determine HEAD.  See console output for details."
+msgstr ""
+"Върхът „HEAD“ не може да бъде определен. За повече информация погледнете "
+"изхода на конзолата."
+
+#: lib/choose_repository.tcl:925
+#, tcl-format
+msgid "Unable to cleanup %s"
+msgstr "„%s“ не може да се зачисти"
+
+#: lib/choose_repository.tcl:931
+msgid "Clone failed."
+msgstr "Неуспешно клониране."
+
+#: lib/choose_repository.tcl:938
+msgid "No default branch obtained."
+msgstr "Не е получен клон по подразбиране."
+
+#: lib/choose_repository.tcl:949
+#, tcl-format
+msgid "Cannot resolve %s as a commit."
+msgstr "Няма подаване отговарящо на „%s“."
+
+#: lib/choose_repository.tcl:961
+msgid "Creating working directory"
+msgstr "Създаване на работната директория"
+
+#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136
+#: lib/index.tcl:207
+msgid "files"
+msgstr "файлове"
+
+#: lib/choose_repository.tcl:981
+msgid "Cannot clone submodules."
+msgstr "Подмодулите не могат да се клонират."
+
+#: lib/choose_repository.tcl:990
+msgid "Cloning submodules"
+msgstr "Клониране на подмодули"
+
+#: lib/choose_repository.tcl:1015
+msgid "Initial file checkout failed."
+msgstr "Неуспешно първоначално изтегляне."
+
+#: lib/choose_repository.tcl:1059
+msgid "Open"
+msgstr "Отваряне"
+
+#: lib/choose_repository.tcl:1069
+msgid "Repository:"
+msgstr "Хранилище:"
+
+#: lib/choose_repository.tcl:1118
+#, tcl-format
+msgid "Failed to open repository %s:"
+msgstr "Неуспешно отваряне на хранилището „%s“:"
+
+#: lib/choose_rev.tcl:52
+msgid "This Detached Checkout"
+msgstr "Това несвързано изтегляне"
+
+#: lib/choose_rev.tcl:60
+msgid "Revision Expression:"
+msgstr "Израз за версия:"
+
+#: lib/choose_rev.tcl:72
+msgid "Local Branch"
+msgstr "Локален клон"
 
-#: lib/option.tcl:254
-msgid "Spelling Dictionary:"
-msgstr "Ð\9fÑ\80авопиÑ\81ен Ñ\80еÑ\87ник:"
+#: lib/choose_rev.tcl:77
+msgid "Tracking Branch"
+msgstr "СледÑ\8fÑ\89 ÐºÐ»Ð¾Ð½"
 
-#: lib/option.tcl:284
-msgid "Change Font"
-msgstr "СмÑ\8fна Ð½Ð° Ñ\88Ñ\80иÑ\84Ñ\82а"
+#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
+msgid "Tag"
+msgstr "Ð\95Ñ\82икеÑ\82"
 
-#: lib/option.tcl:288
+#: lib/choose_rev.tcl:321
 #, tcl-format
-msgid "Choose %s"
-msgstr "Ð\98збоÑ\80 Ð½Ð° â\80\9e%sâ\80\9c"
+msgid "Invalid revision: %s"
+msgstr "Ð\9dепÑ\80авилна Ð²ÐµÑ\80Ñ\81иÑ\8f: %s"
 
-#: lib/option.tcl:294
-msgid "pt."
-msgstr "тчк."
+#: lib/choose_rev.tcl:342
+msgid "No revision selected."
+msgstr "Не е избрана версия."
 
-#: lib/option.tcl:308
-msgid "Preferences"
-msgstr "Ð\9dаÑ\81Ñ\82Ñ\80ойки"
+#: lib/choose_rev.tcl:350
+msgid "Revision expression is empty."
+msgstr "Ð\98зÑ\80азÑ\8aÑ\82 Ð·Ð° Ð²ÐµÑ\80Ñ\81иÑ\8f Ðµ Ð¿Ñ\80азен."
 
-#: lib/option.tcl:345
-msgid "Failed to completely save options:"
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð·Ð°Ð¿Ð°Ð·Ð²Ð°Ð½Ðµ Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е:"
+#: lib/choose_rev.tcl:537
+msgid "Updated"
+msgstr "Ð\9eбновен"
 
-#: lib/encoding.tcl:443
-msgid "Default"
-msgstr "СÑ\82андаÑ\80Ñ\82ноÑ\82о"
+#: lib/choose_rev.tcl:565
+msgid "URL"
+msgstr "Ð\90дÑ\80еÑ\81"
 
-#: lib/encoding.tcl:448
-#, tcl-format
-msgid "System (%s)"
-msgstr "Системното (%s)"
+#: lib/commit.tcl:9
+msgid ""
+"There is nothing to amend.\n"
+"\n"
+"You are about to create the initial commit.  There is no commit before this "
+"to amend.\n"
+msgstr ""
+"Няма какво да се поправи.\n"
+"\n"
+"Ще създадете първоначалното подаване. Преди него няма други подавания, които "
+"да поправите.\n"
 
-#: lib/encoding.tcl:459 lib/encoding.tcl:465
-msgid "Other"
-msgstr "Друго"
+#: lib/commit.tcl:18
+msgid ""
+"Cannot amend while merging.\n"
+"\n"
+"You are currently in the middle of a merge that has not been fully "
+"completed.  You cannot amend the prior commit unless you first abort the "
+"current merge activity.\n"
+msgstr ""
+"По време на сливане не може да поправяте.\n"
+"\n"
+"В момента все още не сте завършили операция по сливане. Не може да поправите "
+"предишното подаване, освен ако първо не преустановите текущото сливане.\n"
 
-#: lib/mergetool.tcl:8
-msgid "Force resolution to the base version?"
-msgstr "Ð\94а Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ð±Ð°Ð·Ð¾Ð²Ð°Ñ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f"
+#: lib/commit.tcl:48
+msgid "Error loading commit data for amend:"
+msgstr "Ð\93Ñ\80еÑ\88ка Ð¿Ñ\80и Ð·Ð°Ñ\80еждане Ð½Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\80авÑ\8fÑ\82:"
 
-#: lib/mergetool.tcl:9
-msgid "Force resolution to this branch?"
-msgstr "Ð\94а Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\82а Ð¾Ñ\82 Ñ\82ози ÐºÐ»Ð¾Ð½"
+#: lib/commit.tcl:75
+msgid "Unable to obtain your identity:"
+msgstr "Ð\98денÑ\82иÑ\84икаÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð¿Ñ\80еделена:"
 
-#: lib/mergetool.tcl:10
-msgid "Force resolution to the other branch?"
-msgstr "Ð\94а Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\82а Ð¾Ñ\82 Ð´Ñ\80Ñ\83гиÑ\8f ÐºÐ»Ð¾Ð½"
+#: lib/commit.tcl:80
+msgid "Invalid GIT_COMMITTER_IDENT:"
+msgstr "Ð\9dепÑ\80авилно Ð¿Ð¾Ð»Ðµ â\80\9eGIT_COMMITTER_IDENTâ\80\9c:"
 
-#: lib/mergetool.tcl:14
+#: lib/commit.tcl:129
 #, tcl-format
+msgid "warning: Tcl does not support encoding '%s'."
+msgstr "предупреждение: Tcl не поддържа кодирането „%s“."
+
+#: lib/commit.tcl:149
 msgid ""
-"Note that the diff shows only conflicting changes.\n"
+"Last scanned state does not match repository state.\n"
 "\n"
-"%s will be overwritten.\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before another commit can be created.\n"
 "\n"
-"This operation can be undone only by restarting the merge."
+"The rescan will be automatically started now.\n"
 msgstr ""
-"Разликата показва само разликите с конфликт.\n"
+"Състоянието при последната проверка не отговаря на състоянието на "
+"хранилището.\n"
 "\n"
-"Файлът „%s“ ще бъде презаписан.\n"
+"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
+"трябва да бъде проверено преди ново подаване.\n"
 "\n"
-"Тази Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8f Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82менена Ñ\81амо Ñ\87Ñ\80ез Ð·Ð°Ð¿Ð¾Ñ\87ване Ð½Ð° Ñ\81ливанеÑ\82о Ð½Ð°Ð½Ð¾Ð²Ð¾."
+"Ð\90вÑ\82омаÑ\82иÑ\87но Ñ\89е Ð·Ð°Ð¿Ð¾Ñ\87не Ð½Ð¾Ð²Ð° Ð¿Ñ\80овеÑ\80ка.\n"
 
-#: lib/mergetool.tcl:45
+#: lib/commit.tcl:173
 #, tcl-format
-msgid "File %s seems to have unresolved conflicts, still stage?"
+msgid ""
+"Unmerged files cannot be committed.\n"
+"\n"
+"File %s has merge conflicts.  You must resolve them and stage the file "
+"before committing.\n"
 msgstr ""
-"Изглежда, че все още има некоригирани конфликти във файла „%s“. Да се добави "
-"ли файлът към индекса?"
+"Неслетите файлове не могат да бъдат подавани.\n"
+"\n"
+"Във файла „%s“ има конфликти при сливане. За да го подадете, трябва първо да "
+"коригирате конфликтите и да добавите файла към индекса за подаване.\n"
 
-#: lib/mergetool.tcl:60
+#: lib/commit.tcl:181
 #, tcl-format
-msgid "Adding resolution for %s"
-msgstr "Добавяне на корекция на конфликтите в „%s“"
-
-#: lib/mergetool.tcl:141
-msgid "Cannot resolve deletion or link conflicts using a tool"
+msgid ""
+"Unknown file state %s detected.\n"
+"\n"
+"File %s cannot be committed by this program.\n"
 msgstr ""
-"Конфликтите при символни връзки или изтриване не могат да бъдат коригирани с "
-"външна програма."
-
-#: lib/mergetool.tcl:146
-msgid "Conflict file does not exist"
-msgstr "Файлът, в който е конфликтът, не съществува"
-
-#: lib/mergetool.tcl:246
-#, tcl-format
-msgid "Not a GUI merge tool: '%s'"
-msgstr "Това не е графична програма за сливане: „%s“"
-
-#: lib/mergetool.tcl:275
-#, tcl-format
-msgid "Unsupported merge tool '%s'"
-msgstr "Неподдържана програма за сливане: „%s“"
-
-#: lib/mergetool.tcl:310
-msgid "Merge tool is already running, terminate it?"
-msgstr "Програмата за сливане вече е стартирана. Да бъде ли изключена?"
+"Непознато състояние на файл „%s“.\n"
+"\n"
+"Файлът „%s“ не може да бъде подаден чрез текущата програма.\n"
 
-#: lib/mergetool.tcl:330
-#, tcl-format
+#: lib/commit.tcl:189
 msgid ""
-"Error retrieving versions:\n"
-"%s"
+"No changes to commit.\n"
+"\n"
+"You must stage at least 1 file before you can commit.\n"
 msgstr ""
-"Грешка при изтеглянето на версии:\n"
-"%s"
+"Няма промени за подаване.\n"
+"\n"
+"Трябва да добавите поне един файл към индекса, за да подадете.\n"
 
-#: lib/mergetool.tcl:350
-#, tcl-format
+#: lib/commit.tcl:204
 msgid ""
-"Could not start the merge tool:\n"
+"Please supply a commit message.\n"
 "\n"
-"%s"
+"A good commit message has the following format:\n"
+"\n"
+"- First line: Describe in one sentence what you did.\n"
+"- Second line: Blank\n"
+"- Remaining lines: Describe why this change is good.\n"
 msgstr ""
-"Ð\9fÑ\80огÑ\80амаÑ\82а Ð·Ð° Ñ\81ливане Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80ана:\n"
+"Ð\97адайÑ\82е Ð´Ð¾Ð±Ñ\80о Ñ\81Ñ\8aобÑ\89ение Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ.\n"
 "\n"
-"%s"
-
-#: lib/mergetool.tcl:354
-msgid "Running merge tool..."
-msgstr "Стартиране на програмата за сливане…"
+"Използвайте следния формат:\n"
+"\n"
+"● Първи ред: описание в едно изречение на промяната.\n"
+"● Втори ред: празен.\n"
+"● Останалите редове: опишете защо се налага тази промяна.\n"
 
-#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
-msgid "Merge tool failed."
-msgstr "Ð\93Ñ\80еÑ\88ка Ð² Ð¿Ñ\80огÑ\80амаÑ\82а Ð·Ð° Ñ\81ливане."
+#: lib/commit.tcl:235
+msgid "Calling pre-commit hook..."
+msgstr "Ð\98зпÑ\8aлнÑ\8fване Ð½Ð° ÐºÑ\83каÑ\82а Ð¿Ñ\80еди Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµâ\80¦"
 
-#: lib/tools_dlg.tcl:22
-msgid "Add Tool"
-msgstr "Ð\94обавÑ\8fне Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+#: lib/commit.tcl:250
+msgid "Commit declined by pre-commit hook."
+msgstr "Ð\9fодаванеÑ\82о Ðµ Ð¾Ñ\82Ñ\85вÑ\8aÑ\80лено Ð¾Ñ\82 ÐºÑ\83каÑ\82а Ð¿Ñ\80еди Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ."
 
-#: lib/tools_dlg.tcl:28
-msgid "Add New Tool Command"
-msgstr "Добавяне на команда"
+#: lib/commit.tcl:269
+msgid ""
+"You are about to commit on a detached head. This is a potentially dangerous "
+"thing to do because if you switch to another branch you will lose your "
+"changes and it can be difficult to retrieve them later from the reflog. You "
+"should probably cancel this commit and create a new branch to continue.\n"
+" \n"
+" Do you really want to proceed with your Commit?"
+msgstr ""
+"Ще подадете към несвързан, отделѐн указател „HEAD“. Това е опасно, защото "
+"при преминаването към клон ще загубите промените си, като единственият начин "
+"да ги върнете ще е чрез журнала на указателите (reflog). Най-вероятно трябва "
+"да не правите това подаване, а да създадете нов клон, преди да продължите.\n"
+" \n"
+"Сигурни ли сте, че искате да извършите текущото подаване?"
 
-#: lib/tools_dlg.tcl:34
-msgid "Add globally"
-msgstr "Ð\93лобално Ð´Ð¾Ð±Ð°Ð²Ñ\8fне"
+#: lib/commit.tcl:290
+msgid "Calling commit-msg hook..."
+msgstr "Ð\98зпÑ\8aлнÑ\8fване Ð½Ð° ÐºÑ\83каÑ\82а Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµâ\80¦"
 
-#: lib/tools_dlg.tcl:46
-msgid "Tool Details"
-msgstr "Подробности за командата"
+#: lib/commit.tcl:305
+msgid "Commit declined by commit-msg hook."
+msgstr "Подаването е отхвърлено от куката за съобщението при подаване."
 
-#: lib/tools_dlg.tcl:49
-msgid "Use '/' separators to create a submenu tree:"
-msgstr "Ð\97а Ñ\81Ñ\8aздаване Ð½Ð° Ð¿Ð¾Ð´Ð¼ÐµÐ½Ñ\8eÑ\82а Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ\82е Ð·Ð½Ð°ÐºÐ° â\80\9e\80\9c Ð·Ð° Ñ\80азделиÑ\82ел:"
+#: lib/commit.tcl:318
+msgid "Committing changes..."
+msgstr "Ð\9fодаване Ð½Ð° Ð¿Ñ\80омениÑ\82еâ\80¦"
 
-#: lib/tools_dlg.tcl:60
-msgid "Command:"
-msgstr "Ð\9aоманда:"
+#: lib/commit.tcl:334
+msgid "write-tree failed:"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð·Ð°Ð¿Ð°Ð·Ð²Ð°Ð½Ðµ Ð½Ð° Ð´Ñ\8aÑ\80воÑ\82о (write-tree):"
 
-#: lib/tools_dlg.tcl:71
-msgid "Show a dialog before running"
-msgstr "Ð\9fÑ\80еди Ð¸Ð·Ð¿Ñ\8aлнение Ð´Ð° Ñ\81е Ð¸Ð·Ð²ÐµÐ¶Ð´Ð° Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð² Ð¿Ñ\80озоÑ\80еÑ\86"
+#: lib/commit.tcl:335 lib/commit.tcl:382 lib/commit.tcl:403
+msgid "Commit failed."
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ."
 
-#: lib/tools_dlg.tcl:77
-msgid "Ask the user to select a revision (sets $REVISION)"
-msgstr "Потребителят да укаже версия (задаване на променливата $REVISION)"
+#: lib/commit.tcl:352
+#, tcl-format
+msgid "Commit %s appears to be corrupt"
+msgstr "Подаването „%s“ изглежда повредено"
 
-#: lib/tools_dlg.tcl:82
-msgid "Ask the user for additional arguments (sets $ARGS)"
+#: lib/commit.tcl:357
+msgid ""
+"No changes to commit.\n"
+"\n"
+"No files were modified by this commit and it was not a merge commit.\n"
+"\n"
+"A rescan will be automatically started now.\n"
 msgstr ""
-"Потребителят да укаже допълнителни аргументи (задаване на променливата $ARGS)"
+"Няма промени за подаване.\n"
+"\n"
+"В това подаване не са променяни никакви файлове, а и не е подаване със "
+"сливане.\n"
+"\n"
+"Автоматично ще започне нова проверка.\n"
 
-#: lib/tools_dlg.tcl:89
-msgid "Don't show the command output window"
-msgstr "Ð\91ез Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ð½Ðµ Ð½Ð° Ð¿Ñ\80озоÑ\80еÑ\86 Ñ\81 Ð¸Ð·Ñ\85ода Ð¾Ñ\82 ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а"
+#: lib/commit.tcl:364
+msgid "No changes to commit."
+msgstr "Ð\9dÑ\8fма Ð¿Ñ\80омени Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ."
 
-#: lib/tools_dlg.tcl:94
-msgid "Run only if a diff is selected ($FILENAME not empty)"
-msgstr ""
-"Стартиране само след избор на разлика (променливата $FILENAME не е празна)"
+#: lib/commit.tcl:381
+msgid "commit-tree failed:"
+msgstr "неуспешно подаване на дървото (commit-tree):"
 
-#: lib/tools_dlg.tcl:118
-msgid "Please supply a name for the tool."
-msgstr "Ð\97адайÑ\82е Ð¸Ð¼Ðµ Ð·Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а."
+#: lib/commit.tcl:402
+msgid "update-ref failed:"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване Ð½Ð° Ñ\83казаÑ\82елиÑ\82е (update-ref):"
 
-#: lib/tools_dlg.tcl:126
+#: lib/commit.tcl:495
 #, tcl-format
-msgid "Tool '%s' already exists."
-msgstr "Ð\9aомандаÑ\82а â\80\9e%sâ\80\9c Ð²ÐµÑ\87е Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва."
+msgid "Created commit %s: %s"
+msgstr "УÑ\81пеÑ\88но Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ %s: %s"
 
-#: lib/tools_dlg.tcl:148
-#, tcl-format
-msgid ""
-"Could not add tool:\n"
-"%s"
-msgstr ""
-"Командата не може да бъде добавена:\n"
-"%s"
+#: lib/console.tcl:59
+msgid "Working... please wait..."
+msgstr "В момента се извършва действие, изчакайте…"
 
-#: lib/tools_dlg.tcl:187
-msgid "Remove Tool"
-msgstr "Ð\9fÑ\80емаÑ\85ване Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+#: lib/console.tcl:186
+msgid "Success"
+msgstr "УÑ\81пеÑ\85"
 
-#: lib/tools_dlg.tcl:193
-msgid "Remove Tool Commands"
-msgstr "Ð\9fÑ\80емаÑ\85ване Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
+#: lib/console.tcl:200
+msgid "Error: Command Failed"
+msgstr "Ð\93Ñ\80еÑ\88ка: Ð½ÐµÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
 
-#: lib/tools_dlg.tcl:198
-msgid "Remove"
-msgstr "Ð\9fÑ\80емаÑ\85ване"
+#: lib/database.tcl:42
+msgid "Number of loose objects"
+msgstr "Ð\91Ñ\80ой Ð½ÐµÐ¿Ð°ÐºÐµÑ\82иÑ\80ани Ð¾Ð±ÐµÐºÑ\82и"
 
-#: lib/tools_dlg.tcl:231
-msgid "(Blue denotes repository-local tools)"
-msgstr "(командите към локалното хранилище са обозначени в синьо)"
+#: lib/database.tcl:43
+msgid "Disk space used by loose objects"
+msgstr "Дисково пространство заето от непакетирани обекти"
 
-#: lib/tools_dlg.tcl:292
-#, tcl-format
-msgid "Run Command: %s"
-msgstr "Изпълнение на командата „%s“"
+#: lib/database.tcl:44
+msgid "Number of packed objects"
+msgstr "Брой пакетирани обекти"
 
-#: lib/tools_dlg.tcl:306
-msgid "Arguments"
-msgstr "Ð\90Ñ\80гÑ\83менти"
+#: lib/database.tcl:45
+msgid "Number of packs"
+msgstr "Ð\91Ñ\80ой Ð¿Ð°ÐºÐµти"
 
-#: lib/tools_dlg.tcl:336 lib/checkout_op.tcl:567 lib/merge.tcl:166
-msgid "Visualize"
-msgstr "Ð\92изÑ\83ализаÑ\86иÑ\8f"
+#: lib/database.tcl:46
+msgid "Disk space used by packed objects"
+msgstr "Ð\94иÑ\81ково Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82во Ð·Ð°ÐµÑ\82о Ð¾Ñ\82 Ð¿Ð°ÐºÐµÑ\82иÑ\80ани Ð¾Ð±ÐµÐºÑ\82и"
 
-#: lib/tools_dlg.tcl:341
-msgid "OK"
-msgstr "Ð\94обÑ\80е"
+#: lib/database.tcl:47
+msgid "Packed objects waiting for pruning"
+msgstr "Ð\9fакеÑ\82иÑ\80ани Ð¾Ð±ÐµÐºÑ\82и Ð·Ð° Ð¾ÐºÐ°Ñ\81Ñ\82Ñ\80Ñ\8fне"
 
-#: lib/search.tcl:48
-msgid "Find:"
-msgstr "ТÑ\8aÑ\80Ñ\81ене:"
+#: lib/database.tcl:48
+msgid "Garbage files"
+msgstr "Файлове Ð·Ð° Ð±Ð¾ÐºÐ»Ñ\83ка"
 
-#: lib/search.tcl:50
-msgid "Next"
-msgstr "Следваща поява"
+#: lib/database.tcl:57 lib/option.tcl:182 lib/option.tcl:197 lib/option.tcl:220
+#: lib/option.tcl:282
+#, tcl-format
+msgid "%s:"
+msgstr "%s:"
 
-#: lib/search.tcl:51
-msgid "Prev"
-msgstr "Предишна поява"
+#: lib/database.tcl:66
+#, tcl-format
+msgid "%s (%s): Database Statistics"
+msgstr "%s (%s): Статистика на базата от данни"
 
-#: lib/search.tcl:52
-msgid "RegExp"
-msgstr "Рег. Ð¸Ð·Ñ\80аз"
+#: lib/database.tcl:72
+msgid "Compressing the object database"
+msgstr "Ð\9aомпÑ\80еÑ\81иÑ\80ане Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а Ñ\81 Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
 
-#: lib/search.tcl:54
-msgid "Case"
-msgstr "РегиÑ\81Ñ\82Ñ\8aÑ\80"
+#: lib/database.tcl:83
+msgid "Verifying the object database with fsck-objects"
+msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а Ñ\81 Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ñ\81 Ð¿Ñ\80огÑ\80амаÑ\82а â\80\9efsck-objectsâ\80\9c"
 
-#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
-msgid "Cannot write shortcut:"
-msgstr "Клавишната комбинация не може да бъде запазена:"
+#: lib/database.tcl:107
+#, tcl-format
+msgid ""
+"This repository currently has approximately %i loose objects.\n"
+"\n"
+"To maintain optimal performance it is strongly recommended that you compress "
+"the database.\n"
+"\n"
+"Compress the database now?"
+msgstr ""
+"В това хранилище в момента има към %i непакетирани обекти.\n"
+"\n"
+"За добра производителност се препоръчва да компресирате базата с данни за "
+"обектите.\n"
+"\n"
+"Да се започне ли компресирането?"
 
-#: lib/shortcut.tcl:137
-msgid "Cannot write icon:"
-msgstr "Иконата не може да бъде запазена:"
+#: lib/date.tcl:25
+#, tcl-format
+msgid "Invalid date from Git: %s"
+msgstr "Неправилни данни от Git: %s"
 
 #: lib/diff.tcl:77
 #, tcl-format
@@ -1443,7 +1698,7 @@ msgstr ""
 msgid "Loading diff of %s..."
 msgstr "Зареждане на разликите в „%s“…"
 
-#: lib/diff.tcl:140
+#: lib/diff.tcl:143
 msgid ""
 "LOCAL: deleted\n"
 "REMOTE:\n"
@@ -1451,7 +1706,7 @@ msgstr ""
 "ЛОКАЛНО: изтрит\n"
 "ОТДАЛЕЧЕНО:\n"
 
-#: lib/diff.tcl:145
+#: lib/diff.tcl:148
 msgid ""
 "REMOTE: deleted\n"
 "LOCAL:\n"
@@ -1459,32 +1714,32 @@ msgstr ""
 "ОТДАЛЕЧЕНО: изтрит\n"
 "ЛОКАЛНО:\n"
 
-#: lib/diff.tcl:152
+#: lib/diff.tcl:155
 msgid "LOCAL:\n"
 msgstr "ЛОКАЛНО:\n"
 
-#: lib/diff.tcl:155
+#: lib/diff.tcl:158
 msgid "REMOTE:\n"
 msgstr "ОТДАЛЕЧЕНО:\n"
 
-#: lib/diff.tcl:217 lib/diff.tcl:355
+#: lib/diff.tcl:220 lib/diff.tcl:357
 #, tcl-format
 msgid "Unable to display %s"
 msgstr "Файлът „%s“ не може да бъде показан"
 
-#: lib/diff.tcl:218
+#: lib/diff.tcl:221
 msgid "Error loading file:"
 msgstr "Грешка при зареждане на файл:"
 
-#: lib/diff.tcl:225
+#: lib/diff.tcl:227
 msgid "Git Repository (subproject)"
 msgstr "Хранилище на Git (подмодул)"
 
-#: lib/diff.tcl:237
+#: lib/diff.tcl:239
 msgid "* Binary file (not showing content)."
 msgstr "● Двоичен файл (съдържанието не се показва)."
 
-#: lib/diff.tcl:242
+#: lib/diff.tcl:244
 #, tcl-format
 msgid ""
 "* Untracked file is %d bytes.\n"
@@ -1493,1222 +1748,1060 @@ msgstr ""
 "● Неследеният файл е %d байта.\n"
 "● Показват се само първите %d байта.\n"
 
-#: lib/diff.tcl:248
-#, tcl-format
-msgid ""
-"\n"
-"* Untracked file clipped here by %s.\n"
-"* To see the entire file, use an external editor.\n"
-msgstr ""
-"\n"
-"● Неследеният файл е отрязан дотук от програмата „%s“.\n"
-"● Използвайте външен редактор, за да видите целия файл.\n"
-
-#: lib/diff.tcl:356 lib/blame.tcl:1128
-msgid "Error loading diff:"
-msgstr "Грешка при зареждане на разлика:"
-
-#: lib/diff.tcl:578
-msgid "Failed to unstage selected hunk."
-msgstr "Избраното парче не може да бъде извадено от индекса."
-
-#: lib/diff.tcl:585
-msgid "Failed to stage selected hunk."
-msgstr "Избраното парче не може да бъде добавено към индекса."
-
-#: lib/diff.tcl:664
-msgid "Failed to unstage selected line."
-msgstr "Избраният ред не може да бъде изваден от индекса."
-
-#: lib/diff.tcl:672
-msgid "Failed to stage selected line."
-msgstr "Избраният ред не може да бъде добавен към индекса."
-
-#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
-msgid "Delete Branch Remotely"
-msgstr "Изтриване на отдалечения клон"
-
-#: lib/remote_branch_delete.tcl:48
-msgid "From Repository"
-msgstr "От хранилище"
-
-#: lib/remote_branch_delete.tcl:88
-msgid "Branches"
-msgstr "Клони"
-
-#: lib/remote_branch_delete.tcl:110
-msgid "Delete Only If"
-msgstr "Изтриване, само ако"
-
-#: lib/remote_branch_delete.tcl:112
-msgid "Merged Into:"
-msgstr "Слят в:"
-
-#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53
-msgid "Always (Do not perform merge checks)"
-msgstr "Винаги (без проверка за сливане)"
-
-#: lib/remote_branch_delete.tcl:153
-msgid "A branch is required for 'Merged Into'."
-msgstr "За данните „Слят в“ е необходимо да зададете клон."
-
-#: lib/remote_branch_delete.tcl:185
-#, tcl-format
-msgid ""
-"The following branches are not completely merged into %s:\n"
-"\n"
-" - %s"
-msgstr ""
-"Следните клони не са слети напълно в „%s“:\n"
-"\n"
-" ● %s"
-
-#: lib/remote_branch_delete.tcl:190
+#: lib/diff.tcl:250
 #, tcl-format
 msgid ""
-"One or more of the merge tests failed because you have not fetched the "
-"necessary commits.  Try fetching from %s first."
-msgstr ""
-"Поне една от пробите за сливане е неуспешна, защото не сте доставили всички "
-"необходими подавания. Пробвайте първо да доставите подаванията от „%s“."
-
-#: lib/remote_branch_delete.tcl:208
-msgid "Please select one or more branches to delete."
-msgstr "Изберете поне един клон за изтриване."
-
-#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115
-msgid ""
-"Recovering deleted branches is difficult.\n"
-"\n"
-"Delete the selected branches?"
-msgstr ""
-"Възстановяването на изтрити клони може да е трудно.\n"
 "\n"
-"Сигурни ли сте, че искате да триете?"
-
-#: lib/remote_branch_delete.tcl:227
-#, tcl-format
-msgid "Deleting branches from %s"
-msgstr "Изтриване на клони от „%s“"
-
-#: lib/remote_branch_delete.tcl:300
-msgid "No repository selected."
-msgstr "Не е избрано хранилище."
-
-#: lib/remote_branch_delete.tcl:305
-#, tcl-format
-msgid "Scanning %s..."
-msgstr "Претърсване на „%s“…"
-
-#: lib/choose_repository.tcl:33
-msgid "Git Gui"
-msgstr "ГПИ на Git"
-
-#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412
-msgid "Create New Repository"
-msgstr "Създаване на ново хранилище"
-
-#: lib/choose_repository.tcl:98
-msgid "New..."
-msgstr "Ново…"
-
-#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496
-msgid "Clone Existing Repository"
-msgstr "Клониране на съществуващо хранилище"
+"* Untracked file clipped here by %s.\n"
+"* To see the entire file, use an external editor.\n"
+msgstr ""
+"\n"
+"● Неследеният файл е отрязан дотук от програмата „%s“.\n"
+"● Използвайте външен редактор, за да видите целия файл.\n"
 
-#: lib/choose_repository.tcl:116
-msgid "Clone..."
-msgstr "Ð\9aлониÑ\80анеâ\80¦"
+#: lib/diff.tcl:580
+msgid "Failed to unstage selected hunk."
+msgstr "Ð\98збÑ\80аноÑ\82о Ð¿Ð°Ñ\80Ñ\87е Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ð²Ð°Ð´ÐµÐ½Ð¾ Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а."
 
-#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064
-msgid "Open Existing Repository"
-msgstr "Ð\9eÑ\82ваÑ\80Ñ\8fне Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89о Ñ\85Ñ\80анилиÑ\89е"
+#: lib/diff.tcl:587
+msgid "Failed to stage selected hunk."
+msgstr "Ð\98збÑ\80аноÑ\82о Ð¿Ð°Ñ\80Ñ\87е Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¾ ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а."
 
-#: lib/choose_repository.tcl:129
-msgid "Open..."
-msgstr "Ð\9eÑ\82ваÑ\80Ñ\8fнеâ\80¦"
+#: lib/diff.tcl:666
+msgid "Failed to unstage selected line."
+msgstr "Ð\98збÑ\80аниÑ\8fÑ\82 Ñ\80ед Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ð²Ð°Ð´ÐµÐ½ Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а."
 
-#: lib/choose_repository.tcl:142
-msgid "Recent Repositories"
-msgstr "СкоÑ\80о Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸"
+#: lib/diff.tcl:674
+msgid "Failed to stage selected line."
+msgstr "Ð\98збÑ\80аниÑ\8fÑ\82 Ñ\80ед Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð´Ð¾Ð±Ð°Ð²ÐµÐ½ ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а."
 
-#: lib/choose_repository.tcl:148
-msgid "Open Recent Repository:"
-msgstr "Ð\9eÑ\82ваÑ\80Ñ\8fне Ð½Ð° Ñ\85Ñ\80анилиÑ\89е Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¾ Ð½Ð°Ñ\81коÑ\80о:"
+#: lib/encoding.tcl:443
+msgid "Default"
+msgstr "СÑ\82андаÑ\80Ñ\82ноÑ\82о"
 
-#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323
-#: lib/choose_repository.tcl:330
+#: lib/encoding.tcl:448
 #, tcl-format
-msgid "Failed to create repository %s:"
-msgstr "Неуспешно създаване на хранилището „%s“:"
-
-#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33
-msgid "Create"
-msgstr "Създаване"
+msgid "System (%s)"
+msgstr "Системното (%s)"
 
-#: lib/choose_repository.tcl:417
-msgid "Directory:"
-msgstr "Директория:"
+#: lib/encoding.tcl:459 lib/encoding.tcl:465
+msgid "Other"
+msgstr "Друго"
 
-#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573
-#: lib/choose_repository.tcl:1098
-msgid "Git Repository"
-msgstr "Хранилище на Git"
+#: lib/error.tcl:20
+#, tcl-format
+msgid "%s: error"
+msgstr "%s: грешка"
 
-#: lib/choose_repository.tcl:472
+#: lib/error.tcl:36
 #, tcl-format
-msgid "Directory %s already exists."
-msgstr "Вече съществува директория „%s“."
+msgid "%s: warning"
+msgstr "%s: предупреждение"
 
-#: lib/choose_repository.tcl:476
+#: lib/error.tcl:80
 #, tcl-format
-msgid "File %s already exists."
-msgstr "Вече съществува файл „%s“."
+msgid "%s hook failed:"
+msgstr "%s: грешка от куката"
 
-#: lib/choose_repository.tcl:491
-msgid "Clone"
-msgstr "Ð\9aлониÑ\80ане"
+#: lib/error.tcl:96
+msgid "You must correct the above errors before committing."
+msgstr "Ð\9fÑ\80еди Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð´Ð°Ð´ÐµÑ\82е, ÐºÐ¾Ñ\80игиÑ\80айÑ\82е Ð³Ð¾Ñ\80ниÑ\82е Ð³Ñ\80еÑ\88ки."
 
-#: lib/choose_repository.tcl:504
-msgid "Source Location:"
-msgstr "Адрес на източника:"
+#: lib/error.tcl:116
+#, tcl-format
+msgid "%s (%s): error"
+msgstr "%s (%s): грешка"
 
-#: lib/choose_repository.tcl:513
-msgid "Target Directory:"
-msgstr "Целева Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f:"
+#: lib/index.tcl:6
+msgid "Unable to unlock the index."
+msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82клÑ\8eÑ\87ен."
 
-#: lib/choose_repository.tcl:523
-msgid "Clone Type:"
-msgstr "Ð\92ид ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане:"
+#: lib/index.tcl:17
+msgid "Index Error"
+msgstr "Ð\93Ñ\80еÑ\88ка Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: lib/choose_repository.tcl:528
-msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
-msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)"
+#: lib/index.tcl:19
+msgid ""
+"Updating the Git index failed.  A rescan will be automatically started to "
+"resynchronize git-gui."
+msgstr ""
+"Неуспешно обновяване на индекса на Git. Автоматично ще започне нова проверка "
+"за синхронизирането на git-gui."
 
-#: lib/choose_repository.tcl:533
-msgid "Full Copy (Slower, Redundant Backup)"
-msgstr "Ð\9fÑ\8aлно (бавно, Ð¿Ñ\8aлноÑ\86енно Ñ\80езеÑ\80вно ÐºÐ¾Ð¿Ð¸Ðµ)"
+#: lib/index.tcl:30
+msgid "Continue"
+msgstr "Ð\9fÑ\80одÑ\8aлжаване"
 
-#: lib/choose_repository.tcl:538
-msgid "Shared (Fastest, Not Recommended, No Backup)"
-msgstr "Споделено (най-бÑ\8aÑ\80зо, Ð½Ðµ Ñ\81е Ð¿Ñ\80епоÑ\80Ñ\8aÑ\87ва, Ð½Ðµ Ð¿Ñ\80ави Ñ\80езеÑ\80вно ÐºÐ¾Ð¿Ð¸Ðµ)"
+#: lib/index.tcl:33
+msgid "Unlock Index"
+msgstr "Ð\9eÑ\82клÑ\8eÑ\87ване Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: lib/choose_repository.tcl:545
-msgid "Recursively clone submodules too"
-msgstr "РекÑ\83Ñ\80Ñ\81ивно ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане Ð¸ Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лиÑ\82е"
+#: lib/index.tcl:294
+msgid "Unstaging selected files from commit"
+msgstr "Ð\98зваждане Ð½Ð° Ð¸Ð·Ð±Ñ\80аниÑ\82е Ñ\84айлове Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
 
-#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626
-#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842
-#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112
+#: lib/index.tcl:298
 #, tcl-format
-msgid "Not a Git repository: %s"
-msgstr "Това Ð½Ðµ Ðµ Ñ\85Ñ\80анилиÑ\89е Ð½Ð° Git: %s"
+msgid "Unstaging %s from commit"
+msgstr "Ð\98зваждане Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
 
-#: lib/choose_repository.tcl:615
-msgid "Standard only available for local repository."
-msgstr "Само Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸ Ñ\85Ñ\80анилиÑ\89а Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ñ\81е ÐºÐ»Ð¾Ð½Ð¸Ñ\80аÑ\82 Ñ\81Ñ\82андаÑ\80Ñ\82но"
+#: lib/index.tcl:337
+msgid "Ready to commit."
+msgstr "Ð\93оÑ\82овноÑ\81Ñ\82 Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ."
 
-#: lib/choose_repository.tcl:619
-msgid "Shared only available for local repository."
-msgstr "Само Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸ Ñ\85Ñ\80анилиÑ\89а Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ñ\81е ÐºÐ»Ð¾Ð½Ð¸Ñ\80аÑ\82 Ñ\81поделено"
+#: lib/index.tcl:346
+msgid "Adding selected files"
+msgstr "Ð\94обавÑ\8fне Ð½Ð° Ð¸Ð·Ð±Ñ\80аниÑ\82е Ñ\84айлове"
 
-#: lib/choose_repository.tcl:640
+#: lib/index.tcl:350
 #, tcl-format
-msgid "Location %s already exists."
-msgstr "Местоположението „%s“ вече съществува."
-
-#: lib/choose_repository.tcl:651
-msgid "Failed to configure origin"
-msgstr "Неуспешно настройване на хранилището-източник"
+msgid "Adding %s"
+msgstr "Добавяне на „%s“"
 
-#: lib/choose_repository.tcl:663
-msgid "Counting objects"
-msgstr "Преброяване на обекти"
+#: lib/index.tcl:380
+#, tcl-format
+msgid "Stage %d untracked files?"
+msgstr "Да се добавят ли %d неследени файла към индекса?"
 
-#: lib/choose_repository.tcl:664
-msgid "buckets"
-msgstr "клеÑ\82ки"
+#: lib/index.tcl:388
+msgid "Adding all changed files"
+msgstr "Ð\94обавÑ\8fне Ð½Ð° Ð²Ñ\81иÑ\87ки Ð¿Ñ\80оменени Ñ\84айлове"
 
-#: lib/choose_repository.tcl:688
+#: lib/index.tcl:428
 #, tcl-format
-msgid "Unable to copy objects/info/alternates: %s"
-msgstr "Ð\9eбекÑ\82иÑ\82е/инÑ\84оÑ\80маÑ\86иÑ\8fÑ\82а/Ñ\81инонимиÑ\82е Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 ÐºÐ¾Ð¿Ð¸Ñ\80ани: %s"
+msgid "Revert changes in file %s?"
+msgstr "Ð\94а Ñ\81е Ð¼Ð°Ñ\85наÑ\82 Ð»Ð¸ Ð¿Ñ\80омениÑ\82е Ð²Ñ\8aв Ñ\84айла â\80\9e%sâ\80\9c?"
 
-#: lib/choose_repository.tcl:724
+#: lib/index.tcl:430
 #, tcl-format
-msgid "Nothing to clone from %s."
-msgstr "Няма какво да се клонира от „%s“."
-
-#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940
-#: lib/choose_repository.tcl:952
-msgid "The 'master' branch has not been initialized."
-msgstr "Основният клон — „master“ не е инициализиран."
-
-#: lib/choose_repository.tcl:739
-msgid "Hardlinks are unavailable.  Falling back to copying."
-msgstr "Не се поддържат твърди връзки. Преминава се към копиране."
+msgid "Revert changes in these %i files?"
+msgstr "Да се махнат ли промените в тези %i файла?"
 
-#: lib/choose_repository.tcl:751
-#, tcl-format
-msgid "Cloning from %s"
-msgstr "Клониране на „%s“"
+#: lib/index.tcl:438
+msgid "Any unstaged changes will be permanently lost by the revert."
+msgstr ""
+"Всички промени, които не са били вкарани в индекса, ще бъдат безвъзвратно "
+"загубени."
 
-#: lib/choose_repository.tcl:782
-msgid "Copying objects"
-msgstr "Ð\9aопиÑ\80ане Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и"
+#: lib/index.tcl:441
+msgid "Do Nothing"
+msgstr "Ð\9dиÑ\89о Ð´Ð° Ð½Ðµ Ñ\81е Ð¿Ñ\80ави"
 
-#: lib/choose_repository.tcl:783
-msgid "KiB"
-msgstr "KiB"
+#: lib/index.tcl:459
+msgid "Reverting selected files"
+msgstr "Махане на промените в избраните файлове"
 
-#: lib/choose_repository.tcl:807
+#: lib/index.tcl:463
 #, tcl-format
-msgid "Unable to copy object: %s"
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но ÐºÐ¾Ð¿Ð¸Ñ\80ане Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: %s"
+msgid "Reverting %s"
+msgstr "Ð\9cаÑ\85ане Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð² â\80\9e%sâ\80\9c"
 
-#: lib/choose_repository.tcl:817
-msgid "Linking objects"
-msgstr "СÑ\8aздаване Ð½Ð° Ð²Ñ\80Ñ\8aзки ÐºÑ\8aм Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
+#: lib/line.tcl:17
+msgid "Goto Line:"
+msgstr "Ð\9aÑ\8aм Ñ\80ед:"
 
-#: lib/choose_repository.tcl:818
-msgid "objects"
-msgstr "обекÑ\82и"
+#: lib/line.tcl:23
+msgid "Go"
+msgstr "Ð\9fÑ\80идвижване"
 
-#: lib/choose_repository.tcl:826
-#, tcl-format
-msgid "Unable to hardlink object: %s"
-msgstr "Неуспешно създаване на твърда връзка към обект: %s"
+#: lib/merge.tcl:13
+msgid ""
+"Cannot merge while amending.\n"
+"\n"
+"You must finish amending this commit before starting any type of merge.\n"
+msgstr ""
+"По време на поправяне не може да сливане.\n"
+"\n"
+"Трябва да завършите поправянето на текущото подаване, преди да започнете "
+"сливане.\n"
 
-#: lib/choose_repository.tcl:881
-msgid "Cannot fetch branches and objects.  See console output for details."
+#: lib/merge.tcl:27
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before a merge can be performed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
 msgstr ""
-"Клоните и обектите не могат да бъдат изтеглени. За повече информация "
-"погледнете изхода на конзолата."
+"Последно установеното състояние не отговаря на това в хранилището.\n"
+"\n"
+"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
+"трябва да бъде проверено, преди да се извърши сливане.\n"
+"\n"
+"Автоматично ще започне нова проверка.\n"
+"\n"
 
-#: lib/choose_repository.tcl:892
-msgid "Cannot fetch tags.  See console output for details."
+#: lib/merge.tcl:45
+#, tcl-format
+msgid ""
+"You are in the middle of a conflicted merge.\n"
+"\n"
+"File %s has merge conflicts.\n"
+"\n"
+"You must resolve them, stage the file, and commit to complete the current "
+"merge.  Only then can you begin another merge.\n"
 msgstr ""
-"Етикетите не могат да бъдат изтеглени. За повече информация погледнете "
-"изхода на конзолата."
+"В момента тече сливане, но има конфликти.\n"
+"\n"
+"Погледнете файла „%s“.\n"
+"\n"
+"Трябва да коригирате конфликтите в него, да го добавите към индекса и да "
+"завършите текущото сливане чрез подаване. Чак тогава може да започнете ново "
+"сливане.\n"
 
-#: lib/choose_repository.tcl:916
-msgid "Cannot determine HEAD.  See console output for details."
+#: lib/merge.tcl:55
+#, tcl-format
+msgid ""
+"You are in the middle of a change.\n"
+"\n"
+"File %s is modified.\n"
+"\n"
+"You should complete the current commit before starting a merge.  Doing so "
+"will help you abort a failed merge, should the need arise.\n"
 msgstr ""
-"Върхът „HEAD“ не може да бъде определен. За повече информация погледнете "
-"изхода на конзолата."
+"В момента тече подаване.\n"
+"\n"
+"Файлът „%s“ е променен.\n"
+"\n"
+"Трябва да завършите текущото подаване, преди да започнете сливане. Така ще "
+"можете лесно да преустановите сливането, ако възникне нужда.\n"
 
-#: lib/choose_repository.tcl:925
+#: lib/merge.tcl:108
 #, tcl-format
-msgid "Unable to cleanup %s"
-msgstr "„%s“ не може да се зачисти"
+msgid "%s of %s"
+msgstr "%s от общо %s"
 
-#: lib/choose_repository.tcl:931
-msgid "Clone failed."
-msgstr "Неуспешно клониране."
+#: lib/merge.tcl:126
+#, tcl-format
+msgid "Merging %s and %s..."
+msgstr "Сливане на „%s“ и „%s“…"
 
-#: lib/choose_repository.tcl:938
-msgid "No default branch obtained."
-msgstr "Ð\9dе Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87ен ÐºÐ»Ð¾Ð½ Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане."
+#: lib/merge.tcl:137
+msgid "Merge completed successfully."
+msgstr "СливанеÑ\82о Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88и Ñ\83Ñ\81пеÑ\88но."
 
-#: lib/choose_repository.tcl:949
-#, tcl-format
-msgid "Cannot resolve %s as a commit."
-msgstr "Няма подаване отговарящо на „%s“."
+#: lib/merge.tcl:139
+msgid "Merge failed.  Conflict resolution is required."
+msgstr "Неуспешно сливане — има конфликти за коригиране."
 
-#: lib/choose_repository.tcl:961
-msgid "Creating working directory"
-msgstr "Създаване на работната директория"
+#: lib/merge.tcl:156
+#, tcl-format
+msgid "%s (%s): Merge"
+msgstr "%s (%s): Сливане"
 
-#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136
-#: lib/index.tcl:207
-msgid "files"
-msgstr "файлове"
+#: lib/merge.tcl:164
+#, tcl-format
+msgid "Merge Into %s"
+msgstr "Сливане в „%s“"
 
-#: lib/choose_repository.tcl:981
-msgid "Cannot clone submodules."
-msgstr "Ð\9fодмодÑ\83лиÑ\82е Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ñ\81е ÐºÐ»Ð¾Ð½Ð¸Ñ\80аÑ\82."
+#: lib/merge.tcl:183
+msgid "Revision To Merge"
+msgstr "Ð\92еÑ\80Ñ\81иÑ\8f Ð·Ð° Ñ\81ливане"
 
-#: lib/choose_repository.tcl:990
-msgid "Cloning submodules"
-msgstr "Клониране на подмодулите"
+#: lib/merge.tcl:218
+msgid ""
+"Cannot abort while amending.\n"
+"\n"
+"You must finish amending this commit.\n"
+msgstr ""
+"Поправянето не може да бъде преустановено.\n"
+"\n"
+"Трябва да завършите поправката на това подаване.\n"
 
-#: lib/choose_repository.tcl:1015
-msgid "Initial file checkout failed."
-msgstr "Неуспешно първоначално изтегляне."
+#: lib/merge.tcl:228
+msgid ""
+"Abort merge?\n"
+"\n"
+"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with aborting the current merge?"
+msgstr ""
+"Да се преустанови ли сливането?\n"
+"\n"
+"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n"
+"\n"
+"Наистина ли да се преустанови сливането?"
 
-#: lib/choose_repository.tcl:1059
-msgid "Open"
-msgstr "Отваряне"
+#: lib/merge.tcl:234
+msgid ""
+"Reset changes?\n"
+"\n"
+"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with resetting the current changes?"
+msgstr ""
+"Да се занулят ли промените?\n"
+"\n"
+"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n"
+"\n"
+"Наистина ли да се занулят промените?"
 
-#: lib/choose_repository.tcl:1069
-msgid "Repository:"
-msgstr "Ð¥Ñ\80анилиÑ\89е:"
+#: lib/merge.tcl:245
+msgid "Aborting"
+msgstr "Ð\9fÑ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване"
 
-#: lib/choose_repository.tcl:1118
-#, tcl-format
-msgid "Failed to open repository %s:"
-msgstr "Неуспешно отваряне на хранилището „%s“:"
+#: lib/merge.tcl:245
+msgid "files reset"
+msgstr "файла със занулени промени"
 
-#: lib/about.tcl:26
-msgid "git-gui - a graphical user interface for Git."
-msgstr "git-gui — графичен интерфейс за Git."
+#: lib/merge.tcl:273
+msgid "Abort failed."
+msgstr "Неуспешно преустановяване."
 
-#: lib/checkout_op.tcl:85
-#, tcl-format
-msgid "Fetching %s from %s"
-msgstr "Доставяне на „%s“ от „%s“"
+#: lib/merge.tcl:275
+msgid "Abort completed.  Ready."
+msgstr "Успешно преустановяване. Готовност за следващо действие."
 
-#: lib/checkout_op.tcl:133
-#, tcl-format
-msgid "fatal: Cannot resolve %s"
-msgstr "фатална грешка: „%s“ не може да се открие"
+#: lib/mergetool.tcl:8
+msgid "Force resolution to the base version?"
+msgstr "Да се използва базовата версия"
 
-#: lib/checkout_op.tcl:175
-#, tcl-format
-msgid "Branch '%s' does not exist."
-msgstr "Клонът „%s“ не съществува."
+#: lib/mergetool.tcl:9
+msgid "Force resolution to this branch?"
+msgstr "Да се използва версията от този клон"
 
-#: lib/checkout_op.tcl:194
-#, tcl-format
-msgid "Failed to configure simplified git-pull for '%s'."
-msgstr "Неуспешно настройване на опростен git-pull за „%s“."
+#: lib/mergetool.tcl:10
+msgid "Force resolution to the other branch?"
+msgstr "Да се използва версията от другия клон"
 
-#: lib/checkout_op.tcl:229
+#: lib/mergetool.tcl:14
 #, tcl-format
 msgid ""
-"Branch '%s' already exists.\n"
+"Note that the diff shows only conflicting changes.\n"
 "\n"
-"It cannot fast-forward to %s.\n"
-"A merge is required."
+"%s will be overwritten.\n"
+"\n"
+"This operation can be undone only by restarting the merge."
 msgstr ""
-"Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва.\n"
+"РазликаÑ\82а Ð¿Ð¾ÐºÐ°Ð·Ð²Ð° Ñ\81амо Ñ\80азликиÑ\82е Ñ\81 ÐºÐ¾Ð½Ñ\84ликÑ\82.\n"
 "\n"
-"Той не може да бъде тривиално слят до „%s“.\n"
-"Необходимо е сливане."
+"Файлът „%s“ ще бъде презаписан.\n"
+"\n"
+"Тази операция може да бъде отменена само чрез започване на сливането наново."
 
-#: lib/checkout_op.tcl:243
+#: lib/mergetool.tcl:45
 #, tcl-format
-msgid "Merge strategy '%s' not supported."
-msgstr "Стратегия за сливане  „%s“ не се поддържа."
+msgid "File %s seems to have unresolved conflicts, still stage?"
+msgstr ""
+"Изглежда, че все още има некоригирани конфликти във файла „%s“. Да се добави "
+"ли файлът към индекса?"
 
-#: lib/checkout_op.tcl:262
+#: lib/mergetool.tcl:60
 #, tcl-format
-msgid "Failed to update '%s'."
-msgstr "Неуспешно обновяване на „%s“."
-
-#: lib/checkout_op.tcl:274
-msgid "Staging area (index) is already locked."
-msgstr "Индексът вече е заключен."
+msgid "Adding resolution for %s"
+msgstr "Добавяне на корекция на конфликтите в „%s“"
 
-#: lib/checkout_op.tcl:289
-msgid ""
-"Last scanned state does not match repository state.\n"
-"\n"
-"Another Git program has modified this repository since the last scan.  A "
-"rescan must be performed before the current branch can be changed.\n"
-"\n"
-"The rescan will be automatically started now.\n"
+#: lib/mergetool.tcl:141
+msgid "Cannot resolve deletion or link conflicts using a tool"
 msgstr ""
-"Състоянието при последната проверка не отговаря на състоянието на "
-"хранилището.\n"
-"\n"
-"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
-"трябва да бъде проверено, преди да се премине към нов клон.\n"
-"\n"
-"Автоматично ще започне нова проверка.\n"
+"Конфликтите при символни връзки или изтриване не могат да бъдат коригирани с "
+"външна програма."
 
-#: lib/checkout_op.tcl:345
-#, tcl-format
-msgid "Updating working directory to '%s'..."
-msgstr "Работната директория се привежда към „%s“…"
+#: lib/mergetool.tcl:146
+msgid "Conflict file does not exist"
+msgstr "Файлът, в който е конфликтът, не съществува"
 
-#: lib/checkout_op.tcl:346
-msgid "files checked out"
-msgstr "файла са изтеглени"
+#: lib/mergetool.tcl:246
+#, tcl-format
+msgid "Not a GUI merge tool: '%s'"
+msgstr "Това не е графична програма за сливане: „%s“"
 
-#: lib/checkout_op.tcl:376
+#: lib/mergetool.tcl:275
 #, tcl-format
-msgid "Aborted checkout of '%s' (file level merging is required)."
-msgstr ""
-"Преустановяване на изтеглянето на „%s“ (необходимо е пофайлово сливане)."
+msgid "Unsupported merge tool '%s'"
+msgstr "Неподдържана програма за сливане: „%s“"
 
-#: lib/checkout_op.tcl:377
-msgid "File level merge required."
-msgstr "Ð\9dеобÑ\85одимо Ðµ Ð¿Ð¾Ñ\84айлово Ñ\81ливане."
+#: lib/mergetool.tcl:310
+msgid "Merge tool is already running, terminate it?"
+msgstr "Ð\9fÑ\80огÑ\80амаÑ\82а Ð·Ð° Ñ\81ливане Ð²ÐµÑ\87е Ðµ Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80ана. Ð\94а Ð±Ñ\8aде Ð»Ð¸ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ена?"
 
-#: lib/checkout_op.tcl:381
+#: lib/mergetool.tcl:330
 #, tcl-format
-msgid "Staying on branch '%s'."
-msgstr "Оставане върху клона „%s“."
+msgid ""
+"Error retrieving versions:\n"
+"%s"
+msgstr ""
+"Грешка при изтеглянето на версии:\n"
+"%s"
 
-#: lib/checkout_op.tcl:452
+#: lib/mergetool.tcl:350
+#, tcl-format
 msgid ""
-"You are no longer on a local branch.\n"
+"Could not start the merge tool:\n"
 "\n"
-"If you wanted to be on a branch, create one now starting from 'This Detached "
-"Checkout'."
+"%s"
 msgstr ""
-"Ð\92еÑ\87е Ð½Ðµ Ñ\81Ñ\82е Ð½Ð° Ð»Ð¾ÐºÐ°Ð»ÐµÐ½ ÐºÐ»Ð¾Ð½.\n"
+"Ð\9fÑ\80огÑ\80амаÑ\82а Ð·Ð° Ñ\81ливане Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80ана:\n"
 "\n"
-"Ако искате да сте на клон, създайте базиран на „Това несвързано изтегляне“."
+"%s"
 
-#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507
+#: lib/mergetool.tcl:354
+msgid "Running merge tool..."
+msgstr "Стартиране на програмата за сливане…"
+
+#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
+msgid "Merge tool failed."
+msgstr "Грешка в програмата за сливане."
+
+#: lib/option.tcl:11
 #, tcl-format
-msgid "Checked out '%s'."
-msgstr "„%s“ е изтеглен."
+msgid "Invalid global encoding '%s'"
+msgstr "Неправилно глобално кодиране „%s“"
 
-#: lib/checkout_op.tcl:535
+#: lib/option.tcl:19
 #, tcl-format
-msgid "Resetting '%s' to '%s' will lose the following commits:"
-msgstr ""
-"Зануляването на „%s“ към „%s“ ще доведе до загубването на следните подавания:"
+msgid "Invalid repo encoding '%s'"
+msgstr "Неправилно кодиране „%s“ на хранилището"
 
-#: lib/checkout_op.tcl:557
-msgid "Recovering lost commits may not be easy."
-msgstr "Ð\92Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ð·Ð°Ð³Ñ\83бениÑ\82е Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ñ\82Ñ\80Ñ\83дно."
+#: lib/option.tcl:119
+msgid "Restore Defaults"
+msgstr "СÑ\82андаÑ\80Ñ\82ни Ð½Ð°Ñ\81Ñ\82Ñ\80ойки"
 
-#: lib/checkout_op.tcl:562
+#: lib/option.tcl:123
+msgid "Save"
+msgstr "Запазване"
+
+#: lib/option.tcl:133
 #, tcl-format
-msgid "Reset '%s'?"
-msgstr "Ð\97анÑ\83лÑ\8fване Ð½Ð° â\80\9e%sâ\80\9c?"
+msgid "%s Repository"
+msgstr "Ð¥Ñ\80анилиÑ\89е â\80\9e%sâ\80\9c"
 
-#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85
-msgid "Reset"
-msgstr "Ð\9eÑ\82наÑ\87ало"
+#: lib/option.tcl:134
+msgid "Global (All Repositories)"
+msgstr "Ð\93лобално (за Ð²Ñ\81иÑ\87ки Ñ\85Ñ\80анилиÑ\89а)"
 
-#: lib/checkout_op.tcl:635
-#, tcl-format
-msgid ""
-"Failed to set current branch.\n"
-"\n"
-"This working directory is only partially switched.  We successfully updated "
-"your files, but failed to update an internal Git file.\n"
-"\n"
-"This should not have occurred.  %s will now close and give up."
-msgstr ""
-"Неуспешно задаване на текущия клон.\n"
-"\n"
-"Работната директория е само частично обновена: файловете са обновени "
-"успешно, но някой от вътрешните, служебни файлове на Git не е бил.\n"
-"\n"
-"Това състояние е аварийно и не трябва да се случва. Програмата „%s“ ще "
-"преустанови работа."
+#: lib/option.tcl:140
+msgid "User Name"
+msgstr "Потребителско име"
 
-#: lib/branch_create.tcl:23
-msgid "Create Branch"
-msgstr "СÑ\8aздаване Ð½Ð° ÐºÐ»Ð¾Ð½"
+#: lib/option.tcl:141
+msgid "Email Address"
+msgstr "Ð\90дÑ\80еÑ\81 Ð½Ð° Ðµ-поÑ\89а"
 
-#: lib/branch_create.tcl:28
-msgid "Create New Branch"
-msgstr "СÑ\8aздаване Ð½Ð° Ð½Ð¾Ð² ÐºÐ»Ð¾Ð½"
+#: lib/option.tcl:143
+msgid "Summarize Merge Commits"
+msgstr "Ð\9eбобÑ\89аване Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8fÑ\82а Ð¿Ñ\80и Ñ\81ливане"
 
-#: lib/branch_create.tcl:42
-msgid "Branch Name"
-msgstr "Ð\98ме Ð½Ð° ÐºÐ»Ð¾Ð½а"
+#: lib/option.tcl:144
+msgid "Merge Verbosity"
+msgstr "Ð\9fодÑ\80обноÑ\81Ñ\82и Ð¿Ñ\80и Ñ\81ливаниÑ\8fÑ\82а"
 
-#: lib/branch_create.tcl:57
-msgid "Match Tracking Branch Name"
-msgstr "СÑ\8aвпадане Ð¿Ð¾ Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ñ\81ледениÑ\8f ÐºÐ»Ð¾Ð½"
+#: lib/option.tcl:145
+msgid "Show Diffstat After Merge"
+msgstr "Ð\98звеждане Ð½Ð° Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ика Ñ\81лед Ñ\81ливаниÑ\8fÑ\82а"
 
-#: lib/branch_create.tcl:66
-msgid "Starting Revision"
-msgstr "Ð\9dаÑ\87ална Ð²ÐµÑ\80Ñ\81иÑ\8f"
+#: lib/option.tcl:146
+msgid "Use Merge Tool"
+msgstr "Ð\98зползване Ð½Ð° Ð¿Ñ\80огÑ\80ама Ð·Ð° Ñ\81ливане"
 
-#: lib/branch_create.tcl:72
-msgid "Update Existing Branch:"
-msgstr "Ð\9eбновÑ\8fване Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89 ÐºÐ»Ð¾Ð½:"
+#: lib/option.tcl:148
+msgid "Trust File Modification Timestamps"
+msgstr "Ð\94овеÑ\80ие Ð²Ñ\8aв Ð²Ñ\80емеÑ\82о Ð½Ð° Ð¿Ñ\80омÑ\8fна Ð½Ð° Ñ\84айловеÑ\82е"
 
-#: lib/branch_create.tcl:75
-msgid "No"
-msgstr "Ð\9dе"
+#: lib/option.tcl:149
+msgid "Prune Tracking Branches During Fetch"
+msgstr "Ð\9eкаÑ\81Ñ\82Ñ\80Ñ\8fне Ð½Ð° Ñ\81ледÑ\8fÑ\89иÑ\82е ÐºÐ»Ð¾Ð½Ð¾Ð²Ðµ Ð¿Ñ\80и Ð´Ð¾Ñ\81Ñ\82авÑ\8fне"
 
-#: lib/branch_create.tcl:80
-msgid "Fast Forward Only"
-msgstr "Само Ñ\82Ñ\80ивиално Ð¿Ñ\80евÑ\8aÑ\80Ñ\82аÑ\89о Ñ\81ливане"
+#: lib/option.tcl:150
+msgid "Match Tracking Branches"
+msgstr "Ð\9dапаÑ\81ване Ð½Ð° Ñ\81ледÑ\8fÑ\89иÑ\82е ÐºÐ»Ð¾Ð½Ð¾Ð²е"
 
-#: lib/branch_create.tcl:97
-msgid "Checkout After Creation"
-msgstr "Ð\9fÑ\80еминаване ÐºÑ\8aм ÐºÐ»Ð¾Ð½Ð° Ñ\81лед Ñ\81Ñ\8aздаванеÑ\82о Ð¼Ñ\83"
+#: lib/option.tcl:151
+msgid "Use Textconv For Diffs and Blames"
+msgstr "Ð\98зползване Ð½Ð° â\80\9etextconvâ\80\9c Ð·Ð° Ñ\80азликиÑ\82е Ð¸ Ð°Ð½Ð¾Ñ\82иÑ\80анеÑ\82о"
 
-#: lib/branch_create.tcl:132
-msgid "Please select a tracking branch."
-msgstr "Ð\98збеÑ\80еÑ\82е ÐºÐ»Ð¾Ð½ Ð·Ð° Ñ\81ледени."
+#: lib/option.tcl:152
+msgid "Blame Copy Only On Changed Files"
+msgstr "Ð\90ноÑ\82иÑ\80ане Ð½Ð° ÐºÐ¾Ð¿Ð¸ÐµÑ\82о Ñ\81амо Ð¿Ð¾ Ð¿Ñ\80оменениÑ\82е Ñ\84айлове"
 
-#: lib/branch_create.tcl:141
-#, tcl-format
-msgid "Tracking branch %s is not a branch in the remote repository."
-msgstr "Следящият клон — „%s“, не съществува в отдалеченото хранилище."
+#: lib/option.tcl:153
+msgid "Maximum Length of Recent Repositories List"
+msgstr "Максимален брой на списъка „Скоро ползвани“ хранилища"
 
-#: lib/console.tcl:59
-msgid "Working... please wait..."
-msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ð´ÐµÐ¹Ñ\81Ñ\82вие, Ð¸Ð·Ñ\87акайÑ\82еâ\80¦"
+#: lib/option.tcl:154
+msgid "Minimum Letters To Blame Copy On"
+msgstr "Ð\9cинимален Ð±Ñ\80ой Ð·Ð½Ð°Ñ\86и Ð·Ð° Ð°Ð½Ð¾Ñ\82иÑ\80ане Ð½Ð° ÐºÐ¾Ð¿Ð¸ÐµÑ\82о"
 
-#: lib/console.tcl:186
-msgid "Success"
-msgstr "УÑ\81пеÑ\85"
+#: lib/option.tcl:155
+msgid "Blame History Context Radius (days)"
+msgstr "Ð\98Ñ\81Ñ\82оÑ\80иÑ\87еÑ\81ки Ð¾Ð±Ñ\85ваÑ\82 Ð·Ð° Ð°Ð½Ð¾Ñ\82иÑ\80ане Ð² Ð´Ð½Ð¸"
 
-#: lib/console.tcl:200
-msgid "Error: Command Failed"
-msgstr "Ð\93Ñ\80еÑ\88ка: Ð½ÐµÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+#: lib/option.tcl:156
+msgid "Number of Diff Context Lines"
+msgstr "Ð\91Ñ\80ой Ñ\80едове Ð·Ð° ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82а Ð½Ð° Ñ\80азликиÑ\82е"
 
-#: lib/choose_rev.tcl:52
-msgid "This Detached Checkout"
-msgstr "Това Ð½ÐµÑ\81вÑ\8aÑ\80зано Ð¸Ð·Ñ\82еглÑ\8fне"
+#: lib/option.tcl:157
+msgid "Additional Diff Parameters"
+msgstr "Ð\90Ñ\80гÑ\83менÑ\82и ÐºÑ\8aм ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а Ð·Ð° Ñ\80азликиÑ\82е"
 
-#: lib/choose_rev.tcl:60
-msgid "Revision Expression:"
-msgstr "Ð\98зÑ\80аз Ð·Ð° Ð²ÐµÑ\80Ñ\81иÑ\8f:"
+#: lib/option.tcl:158
+msgid "Commit Message Text Width"
+msgstr "ШиÑ\80оÑ\87ина Ð½Ð° Ñ\82екÑ\81Ñ\82а Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: lib/choose_rev.tcl:72
-msgid "Local Branch"
-msgstr "Ð\9bокален ÐºÐ»Ð¾Ð½"
+#: lib/option.tcl:159
+msgid "New Branch Name Template"
+msgstr "Шаблон Ð·Ð° Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ð½Ð¾Ð²Ð¸Ñ\82е ÐºÐ»Ð¾Ð½Ð¸"
 
-#: lib/choose_rev.tcl:77
-msgid "Tracking Branch"
-msgstr "СледÑ\8fÑ\89 ÐºÐ»Ð¾Ð½"
+#: lib/option.tcl:160
+msgid "Default File Contents Encoding"
+msgstr "Ð\9aодиÑ\80ане Ð½Ð° Ñ\84айловеÑ\82е"
 
-#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
-msgid "Tag"
-msgstr "Ð\95Ñ\82икеÑ\82"
+#: lib/option.tcl:161
+msgid "Warn before committing to a detached head"
+msgstr "Ð\9fÑ\80едÑ\83пÑ\80еждаване Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ ÐºÑ\8aм Ð½ÐµÑ\81вÑ\8aÑ\80зан Ñ\83казаÑ\82ел"
 
-#: lib/choose_rev.tcl:321
-#, tcl-format
-msgid "Invalid revision: %s"
-msgstr "Неправилна версия: %s"
+#: lib/option.tcl:162
+msgid "Staging of untracked files"
+msgstr "Добавяне на неследените файлове към индекса"
 
-#: lib/choose_rev.tcl:342
-msgid "No revision selected."
-msgstr "Ð\9dе Ðµ Ð¸Ð·Ð±Ñ\80ана Ð²ÐµÑ\80Ñ\81иÑ\8f."
+#: lib/option.tcl:163
+msgid "Show untracked files"
+msgstr "Ð\9fоказване Ð½Ð° Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове"
 
-#: lib/choose_rev.tcl:350
-msgid "Revision expression is empty."
-msgstr "Ð\98зÑ\80азÑ\8aÑ\82 Ð·Ð° Ð²ÐµÑ\80Ñ\81иÑ\8f Ðµ Ð¿Ñ\80азен."
+#: lib/option.tcl:164
+msgid "Tab spacing"
+msgstr "ШиÑ\80ина Ð½Ð° Ñ\82абÑ\83лаÑ\86иÑ\8fÑ\82а"
 
-#: lib/choose_rev.tcl:537
-msgid "Updated"
-msgstr "Ð\9eбновен"
+#: lib/option.tcl:210
+msgid "Change"
+msgstr "СмÑ\8fна"
 
-#: lib/choose_rev.tcl:565
-msgid "URL"
-msgstr "Ð\90дÑ\80еÑ\81"
+#: lib/option.tcl:254
+msgid "Spelling Dictionary:"
+msgstr "Ð\9fÑ\80авопиÑ\81ен Ñ\80еÑ\87ник:"
 
-#: lib/line.tcl:17
-msgid "Goto Line:"
-msgstr "Ð\9aÑ\8aм Ñ\80ед:"
+#: lib/option.tcl:284
+msgid "Change Font"
+msgstr "СмÑ\8fна Ð½Ð° Ñ\88Ñ\80иÑ\84Ñ\82а"
 
-#: lib/line.tcl:23
-msgid "Go"
-msgstr "Придвижване"
+#: lib/option.tcl:288
+#, tcl-format
+msgid "Choose %s"
+msgstr "Избор на „%s“"
 
-#: lib/commit.tcl:9
-msgid ""
-"There is nothing to amend.\n"
-"\n"
-"You are about to create the initial commit.  There is no commit before this "
-"to amend.\n"
-msgstr ""
-"Няма какво да се поправи.\n"
-"\n"
-"Ще създадете първоначалното подаване. Преди него няма други подавания, които "
-"да поправите.\n"
+#: lib/option.tcl:294
+msgid "pt."
+msgstr "тчк."
 
-#: lib/commit.tcl:18
-msgid ""
-"Cannot amend while merging.\n"
-"\n"
-"You are currently in the middle of a merge that has not been fully "
-"completed.  You cannot amend the prior commit unless you first abort the "
-"current merge activity.\n"
-msgstr ""
-"По време на сливане не може да поправяте.\n"
-"\n"
-"В момента все още не сте завършили операция по сливане. Не може да поправите "
-"предишното подаване, освен ако първо не преустановите текущото сливане.\n"
+#: lib/option.tcl:308
+msgid "Preferences"
+msgstr "Настройки"
 
-#: lib/commit.tcl:48
-msgid "Error loading commit data for amend:"
-msgstr "Ð\93Ñ\80еÑ\88ка Ð¿Ñ\80и Ð·Ð°Ñ\80еждане Ð½Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\80авÑ\8fÑ\82:"
+#: lib/option.tcl:345
+msgid "Failed to completely save options:"
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð·Ð°Ð¿Ð°Ð·Ð²Ð°Ð½Ðµ Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е:"
 
-#: lib/commit.tcl:75
-msgid "Unable to obtain your identity:"
-msgstr "Ð\98денÑ\82иÑ\84икаÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð¿Ñ\80еделена:"
+#: lib/remote.tcl:200
+msgid "Push to"
+msgstr "Ð\98зÑ\82лаÑ\81кване ÐºÑ\8aм"
 
-#: lib/commit.tcl:80
-msgid "Invalid GIT_COMMITTER_IDENT:"
-msgstr "Ð\9dепÑ\80авилно Ð¿Ð¾Ð»Ðµ â\80\9eGIT_COMMITTER_IDENTâ\80\9c:"
+#: lib/remote.tcl:218
+msgid "Remove Remote"
+msgstr "Ð\9fÑ\80емаÑ\85ване Ð½Ð° Ð¾Ñ\82далеÑ\87ено Ñ\85Ñ\80анилиÑ\89е"
 
-#: lib/commit.tcl:129
-#, tcl-format
-msgid "warning: Tcl does not support encoding '%s'."
-msgstr "предупреждение: Tcl не поддържа кодирането „%s“."
+#: lib/remote.tcl:223
+msgid "Prune from"
+msgstr "Окастряне от"
+
+#: lib/remote.tcl:228
+msgid "Fetch from"
+msgstr "Доставяне от"
 
-#: lib/commit.tcl:149
-msgid ""
-"Last scanned state does not match repository state.\n"
-"\n"
-"Another Git program has modified this repository since the last scan.  A "
-"rescan must be performed before another commit can be created.\n"
-"\n"
-"The rescan will be automatically started now.\n"
-msgstr ""
-"Състоянието при последната проверка не отговаря на състоянието на "
-"хранилището.\n"
-"\n"
-"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
-"трябва да бъде проверено преди ново подаване.\n"
-"\n"
-"Автоматично ще започне нова проверка.\n"
+#: lib/remote.tcl:253 lib/remote.tcl:258
+msgid "All"
+msgstr "Всички"
 
-#: lib/commit.tcl:173
+#: lib/remote_add.tcl:20
 #, tcl-format
-msgid ""
-"Unmerged files cannot be committed.\n"
-"\n"
-"File %s has merge conflicts.  You must resolve them and stage the file "
-"before committing.\n"
-msgstr ""
-"Неслетите файлове не могат да бъдат подавани.\n"
-"\n"
-"Във файла „%s“ има конфликти при сливане. За да го подадете, трябва първо да "
-"коригирате конфликтите и да добавите файла към индекса за подаване.\n"
+msgid "%s (%s): Add Remote"
+msgstr "%s (%s): Добавяне на отдалечено хранилище"
 
-#: lib/commit.tcl:181
-#, tcl-format
-msgid ""
-"Unknown file state %s detected.\n"
-"\n"
-"File %s cannot be committed by this program.\n"
-msgstr ""
-"Непознато състояние на файл „%s“.\n"
-"\n"
-"Файлът „%s“ не може да бъде подаден чрез текущата програма.\n"
+#: lib/remote_add.tcl:25
+msgid "Add New Remote"
+msgstr "Добавяне на отдалечено хранилище"
 
-#: lib/commit.tcl:189
-msgid ""
-"No changes to commit.\n"
-"\n"
-"You must stage at least 1 file before you can commit.\n"
-msgstr ""
-"Няма промени за подаване.\n"
-"\n"
-"Трябва да добавите поне един файл към индекса, за да подадете.\n"
+#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
+msgid "Add"
+msgstr "Добавяне"
 
-#: lib/commit.tcl:204
-msgid ""
-"Please supply a commit message.\n"
-"\n"
-"A good commit message has the following format:\n"
-"\n"
-"- First line: Describe in one sentence what you did.\n"
-"- Second line: Blank\n"
-"- Remaining lines: Describe why this change is good.\n"
-msgstr ""
-"Задайте добро съобщение при подаване.\n"
-"\n"
-"Използвайте следния формат:\n"
-"\n"
-"● Първи ред: описание в едно изречение на промяната.\n"
-"● Втори ред: празен.\n"
-"● Останалите редове: опишете защо се налага тази промяна.\n"
+#: lib/remote_add.tcl:39
+msgid "Remote Details"
+msgstr "Данни за отдалеченото хранилище"
 
-#: lib/commit.tcl:235
-msgid "Calling pre-commit hook..."
-msgstr "Ð\98зпÑ\8aлнÑ\8fване Ð½Ð° ÐºÑ\83каÑ\82а Ð¿Ñ\80еди Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµâ\80¦"
+#: lib/remote_add.tcl:50
+msgid "Location:"
+msgstr "Ð\9cеÑ\81Ñ\82оположение:"
 
-#: lib/commit.tcl:250
-msgid "Commit declined by pre-commit hook."
-msgstr "Ð\9fодаванеÑ\82о Ðµ Ð¾Ñ\82Ñ\85вÑ\8aÑ\80лено Ð¾Ñ\82 ÐºÑ\83каÑ\82а Ð¿Ñ\80еди Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ."
+#: lib/remote_add.tcl:60
+msgid "Further Action"
+msgstr "СледваÑ\89о Ð´ÐµÐ¹Ñ\81Ñ\82вие"
 
-#: lib/commit.tcl:269
-msgid ""
-"You are about to commit on a detached head. This is a potentially dangerous "
-"thing to do because if you switch to another branch you will lose your "
-"changes and it can be difficult to retrieve them later from the reflog. You "
-"should probably cancel this commit and create a new branch to continue.\n"
-" \n"
-" Do you really want to proceed with your Commit?"
-msgstr ""
-"Ще подавате към несвързан връх. Това е опасно — при изтеглянето на друг клон "
-"ще изгубите промените си. След това може да е невъзможно да ги възстановите "
-"от журнала на указателите „reflog“. Най-вероятно трябва да отмените това "
-"подаване и да създадете клон, в който да подадете.\n"
-" \n"
-"Сигурни ли сте, че искате да подадете към несвързан връх?"
+#: lib/remote_add.tcl:63
+msgid "Fetch Immediately"
+msgstr "Незабавно доставяне"
 
-#: lib/commit.tcl:290
-msgid "Calling commit-msg hook..."
-msgstr "Ð\98зпÑ\8aлнÑ\8fване Ð½Ð° ÐºÑ\83каÑ\82а Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµâ\80¦"
+#: lib/remote_add.tcl:69
+msgid "Initialize Remote Repository and Push"
+msgstr "Ð\98ниÑ\86иализиÑ\80ане Ð½Ð° Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е Ð¸ Ð¸Ð·Ñ\82лаÑ\81кване Ð½Ð° Ð¿Ñ\80омениÑ\82е"
 
-#: lib/commit.tcl:305
-msgid "Commit declined by commit-msg hook."
-msgstr "Ð\9fодаванеÑ\82о Ðµ Ð¾Ñ\82Ñ\85вÑ\8aÑ\80лено Ð¾Ñ\82 ÐºÑ\83каÑ\82а Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ."
+#: lib/remote_add.tcl:75
+msgid "Do Nothing Else Now"
+msgstr "Ð\94а Ð½Ðµ Ñ\81е Ð¿Ñ\80ави Ð½Ð¸Ñ\89о"
 
-#: lib/commit.tcl:318
-msgid "Committing changes..."
-msgstr "Ð\9fодаване Ð½Ð° Ð¿Ñ\80омениÑ\82еâ\80¦"
+#: lib/remote_add.tcl:100
+msgid "Please supply a remote name."
+msgstr "Ð\97адайÑ\82е Ð¸Ð¼Ðµ Ð·Ð° Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е."
 
-#: lib/commit.tcl:334
-msgid "write-tree failed:"
-msgstr "неуспешно запазване на дървото (write-tree):"
+#: lib/remote_add.tcl:113
+#, tcl-format
+msgid "'%s' is not an acceptable remote name."
+msgstr "Отдалечено хранилище не може да се казва „%s“."
 
-#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400
-msgid "Commit failed."
-msgstr "Неуспешно подаване."
+#: lib/remote_add.tcl:124
+#, tcl-format
+msgid "Failed to add remote '%s' of location '%s'."
+msgstr "Неуспешно добавяне на отдалеченото хранилище „%s“ от адрес „%s“."
 
-#: lib/commit.tcl:352
+#: lib/remote_add.tcl:132 lib/transport.tcl:6
 #, tcl-format
-msgid "Commit %s appears to be corrupt"
-msgstr "Ð\9fодаванеÑ\82о â\80\9e%sâ\80\9c Ð¸Ð·Ð³Ð»ÐµÐ¶Ð´Ð° Ð¿Ð¾Ð²Ñ\80едено"
+msgid "fetch %s"
+msgstr "доÑ\81Ñ\82авÑ\8fне Ð½Ð° â\80\9e%sâ\80\9c"
 
-#: lib/commit.tcl:357
-msgid ""
-"No changes to commit.\n"
-"\n"
-"No files were modified by this commit and it was not a merge commit.\n"
-"\n"
-"A rescan will be automatically started now.\n"
-msgstr ""
-"Няма промени за подаване.\n"
-"\n"
-"В това подаване не са променяни никакви файлове, а и не е подаване със "
-"сливане.\n"
-"\n"
-"Автоматично ще започне нова проверка.\n"
+#: lib/remote_add.tcl:133
+#, tcl-format
+msgid "Fetching the %s"
+msgstr "Доставяне на „%s“"
 
-#: lib/commit.tcl:364
-msgid "No changes to commit."
-msgstr "Няма промени за подаване."
+#: lib/remote_add.tcl:156
+#, tcl-format
+msgid "Do not know how to initialize repository at location '%s'."
+msgstr "Хранилището с местоположение „%s“ не може да бъде инициализирано."
 
-#: lib/commit.tcl:378
-msgid "commit-tree failed:"
-msgstr "неуспешно подаване на дървото (commit-tree):"
+#: lib/remote_add.tcl:162 lib/transport.tcl:54 lib/transport.tcl:92
+#: lib/transport.tcl:110
+#, tcl-format
+msgid "push %s"
+msgstr "изтласкване на „%s“"
 
-#: lib/commit.tcl:399
-msgid "update-ref failed:"
-msgstr "неуспешно обновяване на указателите (update-ref):"
+#: lib/remote_add.tcl:163
+#, tcl-format
+msgid "Setting up the %s (at %s)"
+msgstr "Добавяне на хранилище „%s“ (с адрес „%s“)"
 
-#: lib/commit.tcl:492
+#: lib/remote_branch_delete.tcl:29
 #, tcl-format
-msgid "Created commit %s: %s"
-msgstr "Успешно подаване %s: %s"
+msgid "%s (%s): Delete Branch Remotely"
+msgstr "%s (%s): Изтриване на отдалечения клон"
 
-#: lib/branch_delete.tcl:16
-msgid "Delete Branch"
-msgstr "Изтриване на клон"
+#: lib/remote_branch_delete.tcl:34
+msgid "Delete Branch Remotely"
+msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° Ð¾Ñ\82далеÑ\87ениÑ\8f ÐºÐ»Ð¾Ð½"
 
-#: lib/branch_delete.tcl:21
-msgid "Delete Local Branch"
-msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° Ð»Ð¾ÐºÐ°Ð»ÐµÐ½ ÐºÐ»Ð¾Ð½"
+#: lib/remote_branch_delete.tcl:48
+msgid "From Repository"
+msgstr "Ð\9eÑ\82 Ñ\85Ñ\80анилиÑ\89е"
 
-#: lib/branch_delete.tcl:39
-msgid "Local Branches"
-msgstr "Ð\9bокални ÐºÐ»Ð¾Ð½Ð¸"
+#: lib/remote_branch_delete.tcl:51 lib/transport.tcl:165
+msgid "Remote:"
+msgstr "Ð\9eÑ\82далеÑ\87ено Ñ\85Ñ\80анилиÑ\89е:"
 
-#: lib/branch_delete.tcl:51
-msgid "Delete Only If Merged Into"
-msgstr "Ð\98зÑ\82Ñ\80иване, Ñ\81амо Ð°ÐºÐ¾ Ð¿Ñ\80омениÑ\82е Ñ\81а Ñ\81леÑ\82и Ð¸ Ð´Ñ\80Ñ\83гаде"
+#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:187
+msgid "Arbitrary Location:"
+msgstr "Ð\9fÑ\80оизволно Ð¼ÐµÑ\81Ñ\82оположение:"
 
-#: lib/branch_delete.tcl:103
-#, tcl-format
-msgid "The following branches are not completely merged into %s:"
-msgstr "Не всички промени в клоните са слети в „%s“:"
+#: lib/remote_branch_delete.tcl:88
+msgid "Branches"
+msgstr "Клони"
 
-#: lib/branch_delete.tcl:141
+#: lib/remote_branch_delete.tcl:110
+msgid "Delete Only If"
+msgstr "Изтриване, само ако"
+
+#: lib/remote_branch_delete.tcl:112
+msgid "Merged Into:"
+msgstr "Слят в:"
+
+#: lib/remote_branch_delete.tcl:153
+msgid "A branch is required for 'Merged Into'."
+msgstr "За данните „Слят в“ е необходимо да зададете клон."
+
+#: lib/remote_branch_delete.tcl:185
 #, tcl-format
 msgid ""
-"Failed to delete branches:\n"
-"%s"
+"The following branches are not completely merged into %s:\n"
+"\n"
+" - %s"
 msgstr ""
-"Неуспешно триене на клони:\n"
-"%s"
+"Следните клони не са слети напълно в „%s“:\n"
+"\n"
+" ● %s"
 
-#: lib/blame.tcl:73
-msgid "File Viewer"
-msgstr "Преглед на файлове"
+#: lib/remote_branch_delete.tcl:190
+#, tcl-format
+msgid ""
+"One or more of the merge tests failed because you have not fetched the "
+"necessary commits.  Try fetching from %s first."
+msgstr ""
+"Поне една от пробите за сливане е неуспешна, защото не сте доставили всички "
+"необходими подавания. Пробвайте първо да доставите подаванията от „%s“."
 
-#: lib/blame.tcl:79
-msgid "Commit:"
-msgstr "Ð\9fодаване:"
+#: lib/remote_branch_delete.tcl:208
+msgid "Please select one or more branches to delete."
+msgstr "Ð\98збеÑ\80еÑ\82е Ð¿Ð¾Ð½Ðµ ÐµÐ´Ð¸Ð½ ÐºÐ»Ð¾Ð½ Ð·Ð° Ð¸Ð·Ñ\82Ñ\80иване."
 
-#: lib/blame.tcl:280
-msgid "Copy Commit"
-msgstr "Копиране на подаване"
+#: lib/remote_branch_delete.tcl:227
+#, tcl-format
+msgid "Deleting branches from %s"
+msgstr "Изтриване на клони от „%s“"
 
-#: lib/blame.tcl:284
-msgid "Find Text..."
-msgstr "ТÑ\8aÑ\80Ñ\81ене Ð½Ð° Ñ\82екÑ\81Ñ\82â\80¦"
+#: lib/remote_branch_delete.tcl:300
+msgid "No repository selected."
+msgstr "Ð\9dе Ðµ Ð¸Ð·Ð±Ñ\80ано Ñ\85Ñ\80анилиÑ\89е."
 
-#: lib/blame.tcl:288
-msgid "Goto Line..."
-msgstr "Към ред…"
+#: lib/remote_branch_delete.tcl:305
+#, tcl-format
+msgid "Scanning %s..."
+msgstr "Претърсване на „%s“…"
 
-#: lib/blame.tcl:297
-msgid "Do Full Copy Detection"
-msgstr "Ð\9fÑ\8aлно Ñ\82Ñ\8aÑ\80Ñ\81ене Ð½Ð° ÐºÐ¾Ð¿Ð¸Ñ\80ане"
+#: lib/search.tcl:48
+msgid "Find:"
+msgstr "ТÑ\8aÑ\80Ñ\81ене:"
 
-#: lib/blame.tcl:301
-msgid "Show History Context"
-msgstr "Ð\9fоказване Ð½Ð° ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82а Ð¾Ñ\82 Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а"
+#: lib/search.tcl:50
+msgid "Next"
+msgstr "СледваÑ\89а Ð¿Ð¾Ñ\8fва"
 
-#: lib/blame.tcl:304
-msgid "Blame Parent Commit"
-msgstr "Ð\90ноÑ\82иÑ\80ане Ð½Ð° Ñ\80одиÑ\82елÑ\81коÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: lib/search.tcl:51
+msgid "Prev"
+msgstr "Ð\9fÑ\80едиÑ\88на Ð¿Ð¾Ñ\8fва"
 
-#: lib/blame.tcl:466
-#, tcl-format
-msgid "Reading %s..."
-msgstr "Чете се „%s“…"
+#: lib/search.tcl:52
+msgid "RegExp"
+msgstr "РегИзр"
 
-#: lib/blame.tcl:594
-msgid "Loading copy/move tracking annotations..."
-msgstr "Ð\97аÑ\80еждане Ð½Ð° Ð°Ð½Ð¾Ñ\82аÑ\86ииÑ\82е Ð·Ð° Ð¿Ñ\80оÑ\81ледÑ\8fване Ð½Ð° ÐºÐ¾Ð¿Ð¸Ñ\80анеÑ\82о/пÑ\80емеÑ\81Ñ\82ванеÑ\82оâ\80¦"
+#: lib/search.tcl:54
+msgid "Case"
+msgstr "Ð\93лавни/малки"
 
-#: lib/blame.tcl:614
-msgid "lines annotated"
-msgstr "реда анотирани"
+#: lib/shortcut.tcl:8 lib/shortcut.tcl:43 lib/shortcut.tcl:75
+#, tcl-format
+msgid "%s (%s): Create Desktop Icon"
+msgstr "%s (%s): Добавяне на икона на работния плот"
 
-#: lib/blame.tcl:806
-msgid "Loading original location annotations..."
-msgstr "Ð\97аÑ\80еждане Ð½Ð° Ð°Ð½Ð¾Ñ\82аÑ\86ииÑ\82е Ð·Ð° Ð¿Ñ\8aÑ\80вонаÑ\87алноÑ\82о Ð¼ÐµÑ\81Ñ\82оположениеâ\80¦"
+#: lib/shortcut.tcl:24 lib/shortcut.tcl:65
+msgid "Cannot write shortcut:"
+msgstr "Ð\9aлавиÑ\88наÑ\82а ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ\86иÑ\8f Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð°:"
 
-#: lib/blame.tcl:809
-msgid "Annotation complete."
-msgstr "Ð\90ноÑ\82иÑ\80анеÑ\82о Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88и."
+#: lib/shortcut.tcl:140
+msgid "Cannot write icon:"
+msgstr "Ð\98конаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð°:"
 
-#: lib/blame.tcl:839
-msgid "Busy"
-msgstr "Ð\9eпеÑ\80аÑ\86иÑ\8fÑ\82а Ð½Ðµ Ðµ Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88ила"
+#: lib/spellcheck.tcl:57
+msgid "Unsupported spell checker"
+msgstr "Тази Ð¿Ñ\80огÑ\80ама Ð·Ð° Ð¿Ñ\80овеÑ\80ка Ð½Ð° Ð¿Ñ\80авопиÑ\81а Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа"
 
-#: lib/blame.tcl:840
-msgid "Annotation process is already running."
-msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\82еÑ\87е Ð¿Ñ\80оÑ\86еÑ\81 Ð½Ð° Ð°Ð½Ð¾Ñ\82иÑ\80ане."
+#: lib/spellcheck.tcl:65
+msgid "Spell checking is unavailable"
+msgstr "Ð\9bипÑ\81ва Ð¿Ñ\80огÑ\80ама Ð·Ð° Ð¿Ñ\80овеÑ\80ка Ð½Ð° Ð¿Ñ\80авопиÑ\81а"
 
-#: lib/blame.tcl:879
-msgid "Running thorough copy detection..."
-msgstr "Ð\98зпÑ\8aлнÑ\8fва Ñ\81е Ñ\86Ñ\8fлоÑ\81Ñ\82ен Ð¿Ñ\80оÑ\86еÑ\81 Ð½Ð° Ð¾Ñ\82кÑ\80иване Ð½Ð° ÐºÐ¾Ð¿Ð¸Ñ\80анеâ\80¦"
+#: lib/spellcheck.tcl:68
+msgid "Invalid spell checking configuration"
+msgstr "Ð\9dепÑ\80авилни Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ð½Ð° Ð¿Ñ\80овеÑ\80каÑ\82а Ð½Ð° Ð¿Ñ\80авопиÑ\81а"
 
-#: lib/blame.tcl:947
-msgid "Loading annotation..."
-msgstr "Зареждане на анотации…"
+#: lib/spellcheck.tcl:70
+#, tcl-format
+msgid "Reverting dictionary to %s."
+msgstr "Ползване на речник за език „%s“."
 
-#: lib/blame.tcl:1000
-msgid "Author:"
-msgstr "Ð\90вÑ\82оÑ\80:"
+#: lib/spellcheck.tcl:73
+msgid "Spell checker silently failed on startup"
+msgstr "Ð\9fÑ\80огÑ\80амаÑ\82а Ð·Ð° Ð¿Ñ\80авопиÑ\81 Ð´Ð°Ð¶Ðµ Ð½Ðµ Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80а Ñ\83Ñ\81пеÑ\88но."
 
-#: lib/blame.tcl:1004
-msgid "Committer:"
-msgstr "Ð\9fодал:"
+#: lib/spellcheck.tcl:80
+msgid "Unrecognized spell checker"
+msgstr "Ð\9dепознаÑ\82а Ð¿Ñ\80огÑ\80ама Ð·Ð° Ð¿Ñ\80овеÑ\80ка Ð½Ð° Ð¿Ñ\80авопиÑ\81а"
 
-#: lib/blame.tcl:1009
-msgid "Original File:"
-msgstr "Ð\9fÑ\8aÑ\80вонаÑ\87ален Ñ\84айл:"
+#: lib/spellcheck.tcl:186
+msgid "No Suggestions"
+msgstr "Ð\9dÑ\8fма Ð¿Ñ\80едложениÑ\8f"
 
-#: lib/blame.tcl:1057
-msgid "Cannot find HEAD commit:"
-msgstr "Ð\9fодаванеÑ\82о Ð·Ð° Ð²Ñ\80Ñ\8aÑ\85 â\80\9eHEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82кÑ\80ие:"
+#: lib/spellcheck.tcl:388
+msgid "Unexpected EOF from spell checker"
+msgstr "Ð\9dеоÑ\87акван ÐºÑ\80ай Ð½Ð° Ñ\84айл Ð¾Ñ\82 Ð¿Ñ\80огÑ\80амаÑ\82а Ð·Ð° Ð¿Ñ\80овеÑ\80ка Ð½Ð° Ð¿Ñ\80авопиÑ\81а"
 
-#: lib/blame.tcl:1112
-msgid "Cannot find parent commit:"
-msgstr "РодиÑ\82елÑ\81коÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82о"
+#: lib/spellcheck.tcl:392
+msgid "Spell Checker Failed"
+msgstr "Ð\93Ñ\80еÑ\88ка Ð² Ð¿Ñ\80огÑ\80амаÑ\82а Ð·Ð° Ð¿Ñ\80овеÑ\80ка Ð½Ð° Ð¿Ñ\80авопиÑ\81а"
 
-#: lib/blame.tcl:1127
-msgid "Unable to display parent"
-msgstr "РодиÑ\82елÑ\8fÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½"
+#: lib/sshkey.tcl:31
+msgid "No keys found."
+msgstr "Ð\9dе Ñ\81а Ð¾Ñ\82кÑ\80иÑ\82и ÐºÐ»Ñ\8eÑ\87ове."
 
-#: lib/blame.tcl:1269
-msgid "Originally By:"
-msgstr "Първоначално от:"
+#: lib/sshkey.tcl:34
+#, tcl-format
+msgid "Found a public key in: %s"
+msgstr "Открит е публичен ключ в „%s“"
 
-#: lib/blame.tcl:1275
-msgid "In File:"
-msgstr "Ð\92Ñ\8aв Ñ\84айл:"
+#: lib/sshkey.tcl:40
+msgid "Generate Key"
+msgstr "Ð\93енеÑ\80иÑ\80ане Ð½Ð° ÐºÐ»Ñ\8eÑ\87"
 
-#: lib/blame.tcl:1280
-msgid "Copied Or Moved Here By:"
-msgstr "Ð\9aопиÑ\80ано Ð¸Ð»Ð¸ Ð¿Ñ\80емеÑ\81Ñ\82ено Ñ\82Ñ\83к Ð¾Ñ\82:"
+#: lib/sshkey.tcl:58
+msgid "Copy To Clipboard"
+msgstr "Ð\9aопиÑ\80ане ÐºÑ\8aм Ñ\81иÑ\81Ñ\82емниÑ\8f Ð±Ñ\83Ñ\84еÑ\80"
 
-#: lib/index.tcl:6
-msgid "Unable to unlock the index."
-msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82клÑ\8eÑ\87ен."
+#: lib/sshkey.tcl:72
+msgid "Your OpenSSH Public Key"
+msgstr "Ð\9fÑ\83блиÑ\87ниÑ\8fÑ\82 Ð²Ð¸ ÐºÐ»Ñ\8eÑ\87 Ð·Ð° OpenSSH"
 
-#: lib/index.tcl:17
-msgid "Index Error"
-msgstr "Грешка в индекса"
+#: lib/sshkey.tcl:80
+msgid "Generating..."
+msgstr "Генериране…"
 
-#: lib/index.tcl:19
+#: lib/sshkey.tcl:86
+#, tcl-format
 msgid ""
-"Updating the Git index failed.  A rescan will be automatically started to "
-"resynchronize git-gui."
+"Could not start ssh-keygen:\n"
+"\n"
+"%s"
 msgstr ""
-"Неуспешно обновяване на индекса на Git. Автоматично ще започне нова проверка "
-"за синхронизирането на git-gui."
+"Програмата „ssh-keygen“ не може да бъде стартирана:\n"
+"\n"
+"%s"
 
-#: lib/index.tcl:30
-msgid "Continue"
-msgstr "Ð\9fÑ\80одÑ\8aлжаване"
+#: lib/sshkey.tcl:113
+msgid "Generation failed."
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð³ÐµÐ½ÐµÑ\80иÑ\80ане."
 
-#: lib/index.tcl:33
-msgid "Unlock Index"
-msgstr "Ð\9eÑ\82клÑ\8eÑ\87ване Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: lib/sshkey.tcl:120
+msgid "Generation succeeded, but no keys found."
+msgstr "Ð\93енеÑ\80иÑ\80анеÑ\82о Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88и Ñ\83Ñ\81пеÑ\88но, Ð° Ð½Ðµ Ñ\81а Ð½Ð°Ð¼ÐµÑ\80ени ÐºÐ»Ñ\8eÑ\87ове."
 
-#: lib/index.tcl:298
+#: lib/sshkey.tcl:123
 #, tcl-format
-msgid "Unstaging %s from commit"
-msgstr "Ð\98зваждане Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
+msgid "Your key is in: %s"
+msgstr "Ð\9aлÑ\8eÑ\87Ñ\8aÑ\82 Ð²Ð¸ Ðµ Ð² â\80\9e%sâ\80\9c"
 
-#: lib/index.tcl:337
-msgid "Ready to commit."
-msgstr "Готовност за подаване."
+#: lib/status_bar.tcl:87
+#, tcl-format
+msgid "%s ... %*i of %*i %s (%3i%%)"
+msgstr "%s… %*i от общо %*i %s (%3i%%)"
 
-#: lib/index.tcl:350
+#: lib/tools.tcl:76
 #, tcl-format
-msgid "Adding %s"
-msgstr "Ð\94обавÑ\8fне Ð½Ð° â\80\9e%sâ\80\9c"
+msgid "Running %s requires a selected file."
+msgstr "Ð\97а Ð¸Ð·Ð¿Ñ\8aлнениеÑ\82о Ð½Ð° â\80\9e%sâ\80\9c Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ð¸Ð·Ð±ÐµÑ\80еÑ\82е Ñ\84айл."
 
-#: lib/index.tcl:380
+#: lib/tools.tcl:92
 #, tcl-format
-msgid "Stage %d untracked files?"
-msgstr "Ð\94а Ñ\81е Ð²ÐºÐ°Ñ\80аÑ\82 Ð»Ð¸ %d Ð½ÐµÑ\81ледени Ñ\84айла Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а?"
+msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
+msgstr "СигÑ\83Ñ\80ни Ð»Ð¸ Ñ\81Ñ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ð´Ð° Ð¸Ð·Ð¿Ñ\8aлниÑ\82е â\80\9e%1$sâ\80\9c Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ñ\84айла â\80\9e%2$sâ\80\9c?"
 
-#: lib/index.tcl:428
+#: lib/tools.tcl:96
 #, tcl-format
-msgid "Revert changes in file %s?"
-msgstr "Ð\94а Ñ\81е Ð¼Ð°Ñ\85наÑ\82 Ð»Ð¸ Ð¿Ñ\80омениÑ\82е Ð²Ñ\8aв Ñ\84айла „%s“?"
+msgid "Are you sure you want to run %s?"
+msgstr "СигÑ\83Ñ\80ни Ð»Ð¸ Ñ\81Ñ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ð´Ð° Ð¸Ð·Ð¿Ñ\8aлниÑ\82е „%s“?"
 
-#: lib/index.tcl:430
+#: lib/tools.tcl:118
 #, tcl-format
-msgid "Revert changes in these %i files?"
-msgstr "Ð\94а Ñ\81е Ð¼Ð°Ñ\85наÑ\82 Ð»Ð¸ Ð¿Ñ\80омениÑ\82е Ð² Ñ\82ези %i Ñ\84айла?"
+msgid "Tool: %s"
+msgstr "Ð\9aоманда: %s"
 
-#: lib/index.tcl:438
-msgid "Any unstaged changes will be permanently lost by the revert."
+#: lib/tools.tcl:119
+#, tcl-format
+msgid "Running: %s"
+msgstr "Изпълнение: %s"
+
+#: lib/tools.tcl:158
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "Командата завърши успешно: %s"
+
+#: lib/tools.tcl:160
+#, tcl-format
+msgid "Tool failed: %s"
+msgstr "Командата върна грешка: %s"
+
+#: lib/tools_dlg.tcl:22
+#, tcl-format
+msgid "%s (%s): Add Tool"
+msgstr "%s (%s): Добавяне на команда"
+
+#: lib/tools_dlg.tcl:28
+msgid "Add New Tool Command"
+msgstr "Добавяне на команда"
+
+#: lib/tools_dlg.tcl:34
+msgid "Add globally"
+msgstr "Глобално добавяне"
+
+#: lib/tools_dlg.tcl:46
+msgid "Tool Details"
+msgstr "Подробности за командата"
+
+#: lib/tools_dlg.tcl:49
+msgid "Use '/' separators to create a submenu tree:"
+msgstr "За създаване на подменюта използвайте знака „/“ за разделител:"
+
+#: lib/tools_dlg.tcl:60
+msgid "Command:"
+msgstr "Команда:"
+
+#: lib/tools_dlg.tcl:71
+msgid "Show a dialog before running"
+msgstr "Преди изпълнение да се извежда диалогов прозорец"
+
+#: lib/tools_dlg.tcl:77
+msgid "Ask the user to select a revision (sets $REVISION)"
+msgstr "Потребителят да укаже версия (задаване на променливата $REVISION)"
+
+#: lib/tools_dlg.tcl:82
+msgid "Ask the user for additional arguments (sets $ARGS)"
 msgstr ""
-"Всички промени, които не са били вкарани в индекса, ще бъдат безвъзвратно "
-"загубени."
+"Потребителят да укаже допълнителни аргументи (задаване на променливата $ARGS)"
 
-#: lib/index.tcl:441
-msgid "Do Nothing"
-msgstr "Нищо да не се прави"
+#: lib/tools_dlg.tcl:89
+msgid "Don't show the command output window"
+msgstr "Без показване на прозорец с изхода от командата"
+
+#: lib/tools_dlg.tcl:94
+msgid "Run only if a diff is selected ($FILENAME not empty)"
+msgstr ""
+"Стартиране само след избор на разлика (променливата $FILENAME не е празна)"
 
-#: lib/index.tcl:459
-msgid "Reverting selected files"
-msgstr "Ð\9cаÑ\85ане Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð² Ð¸Ð·Ð±Ñ\80аниÑ\82е Ñ\84айлове"
+#: lib/tools_dlg.tcl:118
+msgid "Please supply a name for the tool."
+msgstr "Ð\97адайÑ\82е Ð¸Ð¼Ðµ Ð·Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а."
 
-#: lib/index.tcl:463
+#: lib/tools_dlg.tcl:126
 #, tcl-format
-msgid "Reverting %s"
-msgstr "Ð\9cаÑ\85ане Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð² â\80\9e%sâ\80\9c"
+msgid "Tool '%s' already exists."
+msgstr "Ð\9aомандаÑ\82а â\80\9e%sâ\80\9c Ð²ÐµÑ\87е Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва."
 
-#: lib/date.tcl:25
+#: lib/tools_dlg.tcl:148
 #, tcl-format
-msgid "Invalid date from Git: %s"
-msgstr "Неправилни данни от Git: %s"
-
-#: lib/database.tcl:42
-msgid "Number of loose objects"
-msgstr "Брой непакетирани обекти"
+msgid ""
+"Could not add tool:\n"
+"%s"
+msgstr ""
+"Командата не може да бъде добавена:\n"
+"%s"
 
-#: lib/database.tcl:43
-msgid "Disk space used by loose objects"
-msgstr "Дисково пространство заето от непакетирани обекти"
+#: lib/tools_dlg.tcl:187
+#, tcl-format
+msgid "%s (%s): Remove Tool"
+msgstr "%s (%s): Премахване на команда"
 
-#: lib/database.tcl:44
-msgid "Number of packed objects"
-msgstr "Ð\91Ñ\80ой Ð¿Ð°ÐºÐµÑ\82иÑ\80ани Ð¾Ð±ÐµÐºÑ\82и"
+#: lib/tools_dlg.tcl:193
+msgid "Remove Tool Commands"
+msgstr "Ð\9fÑ\80емаÑ\85ване Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´и"
 
-#: lib/database.tcl:45
-msgid "Number of packs"
-msgstr "Ð\91Ñ\80ой Ð¿Ð°ÐºÐµÑ\82и"
+#: lib/tools_dlg.tcl:198
+msgid "Remove"
+msgstr "Ð\9fÑ\80емаÑ\85ване"
 
-#: lib/database.tcl:46
-msgid "Disk space used by packed objects"
-msgstr "Дисково пространство заето от пакетирани обекти"
+#: lib/tools_dlg.tcl:231
+msgid "(Blue denotes repository-local tools)"
+msgstr "(командите към локалното хранилище са обозначени в синьо)"
 
-#: lib/database.tcl:47
-msgid "Packed objects waiting for pruning"
-msgstr "Пакетирани обекти за окастряне"
+#: lib/tools_dlg.tcl:283
+#, tcl-format
+msgid "%s (%s):"
+msgstr "%s (%s):"
 
-#: lib/database.tcl:48
-msgid "Garbage files"
-msgstr "Файлове за боклука"
+#: lib/tools_dlg.tcl:292
+#, tcl-format
+msgid "Run Command: %s"
+msgstr "Изпълнение на командата „%s“"
 
-#: lib/database.tcl:72
-msgid "Compressing the object database"
-msgstr "Ð\9aомпÑ\80еÑ\81иÑ\80ане Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а Ñ\81 Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
+#: lib/tools_dlg.tcl:306
+msgid "Arguments"
+msgstr "Ð\90Ñ\80гÑ\83менÑ\82и"
 
-#: lib/database.tcl:83
-msgid "Verifying the object database with fsck-objects"
-msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а Ñ\81 Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ñ\81 Ð¿Ñ\80огÑ\80амаÑ\82а â\80\9efsck-objectsâ\80\9c"
+#: lib/tools_dlg.tcl:341
+msgid "OK"
+msgstr "Ð\94обÑ\80е"
 
-#: lib/database.tcl:107
+#: lib/transport.tcl:7
 #, tcl-format
-msgid ""
-"This repository currently has approximately %i loose objects.\n"
-"\n"
-"To maintain optimal performance it is strongly recommended that you compress "
-"the database.\n"
-"\n"
-"Compress the database now?"
-msgstr ""
-"В това хранилище в момента има към %i непакетирани обекти.\n"
-"\n"
-"За добра производителност се препоръчва да компресирате базата с данни за "
-"обектите.\n"
-"\n"
-"Да се започне ли компресирането?"
+msgid "Fetching new changes from %s"
+msgstr "Доставяне на промените от „%s“"
 
-#: lib/error.tcl:20 lib/error.tcl:116
-msgid "error"
-msgstr "грешка"
+#: lib/transport.tcl:18
+#, tcl-format
+msgid "remote prune %s"
+msgstr "окастряне на следящите клони към „%s“"
 
-#: lib/error.tcl:36
-msgid "warning"
-msgstr "предупреждение"
+#: lib/transport.tcl:19
+#, tcl-format
+msgid "Pruning tracking branches deleted from %s"
+msgstr "Окастряне на следящите клони на изтритите клони от „%s“"
 
-#: lib/error.tcl:96
-msgid "You must correct the above errors before committing."
-msgstr "Ð\9fÑ\80еди Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð´Ð°Ð´ÐµÑ\82е, ÐºÐ¾Ñ\80игиÑ\80айÑ\82е Ð³Ð¾Ñ\80ниÑ\82е Ð³Ñ\80еÑ\88ки."
+#: lib/transport.tcl:25
+msgid "fetch all remotes"
+msgstr "доÑ\81Ñ\82авÑ\8fне Ð¾Ñ\82 Ð²Ñ\81иÑ\87ки Ð¾Ñ\82далеÑ\87ени"
 
-#: lib/merge.tcl:13
-msgid ""
-"Cannot merge while amending.\n"
-"\n"
-"You must finish amending this commit before starting any type of merge.\n"
-msgstr ""
-"По време на поправяне не може да сливане.\n"
-"\n"
-"Трябва да завършите поправянето на текущото подаване, преди да започнете "
-"сливане.\n"
+#: lib/transport.tcl:26
+msgid "Fetching new changes from all remotes"
+msgstr "Доставяне на промените от всички отдалечени хранилища"
 
-#: lib/merge.tcl:27
-msgid ""
-"Last scanned state does not match repository state.\n"
-"\n"
-"Another Git program has modified this repository since the last scan.  A "
-"rescan must be performed before a merge can be performed.\n"
-"\n"
-"The rescan will be automatically started now.\n"
-msgstr ""
-"Последно установеното състояние не отговаря на това в хранилището.\n"
-"\n"
-"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
-"трябва да бъде проверено, преди да се извърши сливане.\n"
-"\n"
-"Автоматично ще започне нова проверка.\n"
-"\n"
+#: lib/transport.tcl:40
+msgid "remote prune all remotes"
+msgstr "окастряне на следящите изтрити"
 
-#: lib/merge.tcl:45
-#, tcl-format
-msgid ""
-"You are in the middle of a conflicted merge.\n"
-"\n"
-"File %s has merge conflicts.\n"
-"\n"
-"You must resolve them, stage the file, and commit to complete the current "
-"merge.  Only then can you begin another merge.\n"
+#: lib/transport.tcl:41
+msgid "Pruning tracking branches deleted from all remotes"
 msgstr ""
-"В момента тече сливане, но има конфликти.\n"
-"\n"
-"Погледнете файла „%s“.\n"
-"\n"
-"Трябва да коригирате конфликтите в него, да го добавите към индекса и да "
-"завършите текущото сливане чрез подаване. Чак тогава може да започнете ново "
-"сливане.\n"
+"Окастряне на следящите клони на изтритите клони от всички отдалечени "
+"хранилища"
 
-#: lib/merge.tcl:55
+#: lib/transport.tcl:55
 #, tcl-format
-msgid ""
-"You are in the middle of a change.\n"
-"\n"
-"File %s is modified.\n"
-"\n"
-"You should complete the current commit before starting a merge.  Doing so "
-"will help you abort a failed merge, should the need arise.\n"
-msgstr ""
-"В момента тече подаване.\n"
-"\n"
-"Файлът „%s“ е променен.\n"
-"\n"
-"Трябва да завършите текущото подаване, преди да започнете сливане. Така ще "
-"можете лесно да преустановите сливането, ако възникне нужда.\n"
+msgid "Pushing changes to %s"
+msgstr "Изтласкване на промените към „%s“"
 
-#: lib/merge.tcl:108
+#: lib/transport.tcl:93
 #, tcl-format
-msgid "%s of %s"
-msgstr "%s от общо %s"
+msgid "Mirroring to %s"
+msgstr "Изтласкване на всичко към „%s“"
 
-#: lib/merge.tcl:122
+#: lib/transport.tcl:111
 #, tcl-format
-msgid "Merging %s and %s..."
-msgstr "Сливане на „%s“ и „%s“…"
-
-#: lib/merge.tcl:133
-msgid "Merge completed successfully."
-msgstr "Сливането завърши успешно."
-
-#: lib/merge.tcl:135
-msgid "Merge failed.  Conflict resolution is required."
-msgstr "Неуспешно сливане — има конфликти за коригиране."
+msgid "Pushing %s %s to %s"
+msgstr "Изтласкване на %s „%s“ към „%s“"
 
-#: lib/merge.tcl:160
-#, tcl-format
-msgid "Merge Into %s"
-msgstr "Сливане в „%s“"
+#: lib/transport.tcl:132
+msgid "Push Branches"
+msgstr "Клони за изтласкване"
 
-#: lib/merge.tcl:179
-msgid "Revision To Merge"
-msgstr "Ð\92еÑ\80Ñ\81иÑ\8f Ð·Ð° Ñ\81ливане"
+#: lib/transport.tcl:147
+msgid "Source Branches"
+msgstr "Ð\9aлони-изÑ\82оÑ\87ниÑ\86и"
 
-#: lib/merge.tcl:214
-msgid ""
-"Cannot abort while amending.\n"
-"\n"
-"You must finish amending this commit.\n"
-msgstr ""
-"Поправянето не може да бъде преустановено.\n"
-"\n"
-"Трябва да завършите поправката на това подаване.\n"
+#: lib/transport.tcl:162
+msgid "Destination Repository"
+msgstr "Целево хранилище"
 
-#: lib/merge.tcl:224
-msgid ""
-"Abort merge?\n"
-"\n"
-"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
-"\n"
-"Continue with aborting the current merge?"
-msgstr ""
-"Да се преустанови ли сливането?\n"
-"\n"
-"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n"
-"\n"
-"Наистина ли да се преустанови сливането?"
+#: lib/transport.tcl:205
+msgid "Transfer Options"
+msgstr "Настройки при пренасянето"
 
-#: lib/merge.tcl:230
-msgid ""
-"Reset changes?\n"
-"\n"
-"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
-"\n"
-"Continue with resetting the current changes?"
+#: lib/transport.tcl:207
+msgid "Force overwrite existing branch (may discard changes)"
 msgstr ""
-"Да се занулят ли промените?\n"
-"\n"
-"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n"
-"\n"
-"Наистина ли да се занулят промените?"
-
-#: lib/merge.tcl:241
-msgid "Aborting"
-msgstr "Преустановяване"
+"Изрично презаписване на съществуващ клон (някои промени може да бъдат "
+"загубени)"
 
-#: lib/merge.tcl:241
-msgid "files reset"
-msgstr "файла със занулени промени"
+#: lib/transport.tcl:211
+msgid "Use thin pack (for slow network connections)"
+msgstr "Максимална компресия (за бавни мрежови връзки)"
 
-#: lib/merge.tcl:269
-msgid "Abort failed."
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване."
+#: lib/transport.tcl:215
+msgid "Include tags"
+msgstr "Ð\92клÑ\8eÑ\87ване Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е"
 
-#: lib/merge.tcl:271
-msgid "Abort completed.  Ready."
-msgstr "Успешно преустановяване. Готовност за следващо действие."
+#: lib/transport.tcl:229
+#, tcl-format
+msgid "%s (%s): Push"
+msgstr "%s (%s): Изтласкване"
diff --git a/git-gui/po/glossary/pt_pt.po b/git-gui/po/glossary/pt_pt.po
new file mode 100644 (file)
index 0000000..adc3b54
--- /dev/null
@@ -0,0 +1,293 @@
+# Portuguese translations for git-gui glossary.
+# Copyright (C) 2016 Shawn Pearce, et al.
+# This file is distributed under the same license as the git package.
+# Vasco Almeida <vascomalmeida@sapo.pt>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: git-gui glossary\n"
+"POT-Creation-Date: 2016-05-06 10:22+0000\n"
+"PO-Revision-Date: 2016-05-06 12:32+0000\n"
+"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
+"Language-Team: Portuguese\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)"
+msgid ""
+"English Term (Dear translator: This file will never be visible to the user!)"
+msgstr ""
+"Outro SCM em português:\n"
+"http://svn.code.sf.net/p/tortoisesvn/code/trunk/Languages/pt/TortoiseUI.po e "
+"\n"
+"http://svn.code.sf.net/p/tortoisesvn/code/trunk/Languages/pt/TortoiseDoc.po\n"
+" em html: https://tortoisesvn.net/docs/release/TortoiseSVN_pt/index.html\n"
+"\n"
+"https://translations.launchpad.net/tortoisehg (medíocre)"
+
+#. ""
+msgid "amend"
+msgstr "emendar"
+
+#. ""
+msgid "annotate"
+msgstr "anotar"
+
+#. "A 'branch' is an active line of development."
+msgid "branch [noun]"
+msgstr "ramo"
+
+#. ""
+msgid "branch [verb]"
+msgstr "criar ramo"
+
+#. ""
+msgid "checkout [noun]"
+msgstr "extração"
+
+#. "The action of updating the working tree to a revision which was stored in the object database."
+msgid "checkout [verb]"
+msgstr "extrair"
+
+#. ""
+msgid "clone [verb]"
+msgstr "clonar"
+
+#. "A single point in the git history."
+msgid "commit [noun]"
+msgstr "commit"
+
+#. "The action of storing a new snapshot of the project's state in the git history."
+msgid "commit [verb]"
+msgstr "submeter"
+
+#. ""
+msgid "diff [noun]"
+msgstr "diferenças"
+
+#. ""
+msgid "diff [verb]"
+msgstr "mostrar diferenças"
+
+#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have."
+msgid "fast forward merge"
+msgstr "integração por avanço rápido"
+
+#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too."
+msgid "fetch"
+msgstr "obter"
+
+#. "One context of consecutive lines in a whole patch, which consists of many such hunks"
+msgid "hunk"
+msgstr "excerto"
+
+#. "A collection of files. The index is a stored version of your working tree."
+msgid "index (in git-gui: staging area)"
+msgstr "índice"
+
+#. "A successful merge results in the creation of a new commit representing the result of the merge."
+msgid "merge [noun]"
+msgstr "integração"
+
+#. "To bring the contents of another branch into the current branch."
+msgid "merge [verb]"
+msgstr "integrar"
+
+#. ""
+msgid "message"
+msgstr "mensagem"
+
+#. "Deletes all stale tracking branches under <name>. These stale branches have already been removed from the remote repository referenced by <name>, but are still locally available in 'remotes/<name>'."
+msgid "prune"
+msgstr "podar"
+
+#. "Pulling a branch means to fetch it and merge it."
+msgid "pull"
+msgstr "puxar"
+
+#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)"
+msgid "push"
+msgstr "publicar"
+
+#. ""
+msgid "redo"
+msgstr "refazer"
+
+#. "An other repository ('remote'). One might have a set of remotes whose branches one tracks."
+msgid "remote"
+msgstr "remoto"
+
+#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)"
+msgid "repository"
+msgstr "repositório"
+
+#. ""
+msgid "reset"
+msgstr "repor"
+
+#. ""
+msgid "revert"
+msgstr "reverter"
+
+#. "A particular state of files and directories which was stored in the object database."
+msgid "revision"
+msgstr "revisão"
+
+#. ""
+msgid "sign off"
+msgstr "assinar por baixo"
+
+#. ""
+msgid "staging area"
+msgstr "área de estágio"
+
+#. ""
+msgid "status"
+msgstr "estado"
+
+#. "A ref pointing to a tag or commit object"
+msgid "tag [noun]"
+msgstr "tag"
+
+#. ""
+msgid "tag [verb]"
+msgstr "criar tag"
+
+#. "A regular git branch that is used to follow changes from another repository."
+msgid "tracking branch"
+msgstr "ramo de monitorização"
+
+#. ""
+msgid "undo"
+msgstr "desfazer"
+
+#. ""
+msgid "update"
+msgstr "atualizar"
+
+#. ""
+msgid "verify"
+msgstr "verificar"
+
+#. "The tree of actual checked out files."
+msgid "working copy, working tree"
+msgstr "cópia de trabalho, árvore de trabalho"
+
+#. "a commit that succeeds the current one in git's graph of commits (not necessarily directly)"
+msgid "ancestor"
+msgstr "antecessor"
+
+#. "prematurely stop and abandon an operation"
+msgid "abort"
+msgstr "abortar"
+
+#. "a repository with only .git directory, without working directory"
+msgid "bare repository"
+msgstr "repositório nu"
+
+#. "a parent version of the current file"
+msgid "base"
+msgstr "base"
+
+#. "get the authors responsible for each line in a file"
+msgid "blame"
+msgstr "culpar"
+
+#. "to select and apply a single commit without merging"
+msgid "cherry-pick"
+msgstr "efetuar cherry-pick (escolher-a-dedo?, selecionar?)"
+
+#. "a commit that directly succeeds the current one in git's graph of commits"
+msgid "child"
+msgstr "filho"
+
+#. "clean the state of the git repository, often after manually stopped operation"
+msgid "cleanup"
+msgstr "limpar"
+
+#. "a message that gets attached with any commit"
+msgid "commit message"
+msgstr "mensagem de commit"
+
+#. "a commit that precedes the current one in git's graph of commits (not necessarily directly)"
+msgid "descendant"
+msgstr "descendente"
+
+#. "checkout of a revision rather than a some head"
+msgid "detached checkout"
+msgstr "extração destacada"
+
+#. "any merge strategy that works on a file by file basis"
+msgid "file level merging"
+msgstr "integração ao nível de ficheiros"
+
+#. "the last revision in a branch"
+msgid "head"
+msgstr "cabeça"
+
+#. "script that gets executed automatically on some event"
+msgid "hook"
+msgstr "gancho"
+
+#. "the first checkout during a clone operation"
+msgid "initial checkout"
+msgstr "extração inicial"
+
+#. "a branch that resides in the local git repository"
+msgid "local branch"
+msgstr "ramo local"
+
+#. "a Git object that is not part of any pack"
+msgid "loose object"
+msgstr "objeto solto"
+
+#. "a branch called by convention 'master' that exists in a newly created git repository"
+msgid "master branch"
+msgstr "ramo mestre"
+
+#. "a remote called by convention 'origin' that the current git repository has been cloned from"
+msgid "origin"
+msgstr "origem"
+
+#. "a file containing many git objects packed together"
+msgid "pack [noun]"
+msgstr "pacote"
+
+#. "a Git object part of some pack"
+msgid "packed object"
+msgstr "objeto compactado"
+
+#. "a commit that directly precedes the current one in git's graph of commits"
+msgid "parent"
+msgstr "pai"
+
+#. "the log file containing all states of the HEAD reference (in other words past pristine states of the working copy)"
+msgid "reflog"
+msgstr "reflog"
+
+#. "decide which changes from alternative versions of a file should persist in Git"
+msgid "resolve (a conflict)"
+msgstr "resolver (um conflito)"
+
+#. "abandon changes and go to pristine version"
+msgid "revert changes"
+msgstr "reverter alterações"
+
+#. "expression that signifies a revision in git"
+msgid "revision expression"
+msgstr "expressão de revisão"
+
+#. "add some content of files and directories to the staging area in preparation for a commit"
+msgid "stage/unstage"
+msgstr "preparar/retirar"
+
+#. "temporarily save changes in a stack without committing"
+msgid "stash"
+msgstr "empilhar"
+
+#. "file whose content is tracked/not tracked by git"
+msgid "tracked/untracked"
+msgstr "controlado/não controlado"
diff --git a/git-gui/po/pt_pt.po b/git-gui/po/pt_pt.po
new file mode 100644 (file)
index 0000000..0ef3c79
--- /dev/null
@@ -0,0 +1,2716 @@
+# Portuguese translations for git-gui package.
+# Copyright (C) 2016 Shawn Pearce, et al.
+# This file is distributed under the same license as the git package.
+# Vasco Almeida <vascomalmeida@sapo.pt>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: git-gui\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-05-06 09:36+0000\n"
+"PO-Revision-Date: 2016-05-06 13:09+0000\n"
+"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
+"Language-Team: Portuguese\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: git-gui.sh:861
+#, tcl-format
+msgid "Invalid font specified in %s:"
+msgstr "Tipo de letra inválido especificado em %s:"
+
+#: git-gui.sh:915
+msgid "Main Font"
+msgstr "Tipo de letra principal"
+
+#: git-gui.sh:916
+msgid "Diff/Console Font"
+msgstr "Tipo de letra Diferenças/Consola"
+
+#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048
+#: git-gui.sh:1067 git-gui.sh:3125
+msgid "git-gui: fatal error"
+msgstr "git-gui: erro fatal"
+
+#: git-gui.sh:932
+msgid "Cannot find git in PATH."
+msgstr "Não é possível encontrar o git em PATH."
+
+#: git-gui.sh:959
+msgid "Cannot parse Git version string:"
+msgstr "Não é possível analisar a versão do Git:"
+
+#: git-gui.sh:984
+#, tcl-format
+msgid ""
+"Git version cannot be determined.\n"
+"\n"
+"%s claims it is version '%s'.\n"
+"\n"
+"%s requires at least Git 1.5.0 or later.\n"
+"\n"
+"Assume '%s' is version 1.5.0?\n"
+msgstr ""
+"A versão do Git não pôde ser determinada.\n"
+"\n"
+"%s alega que está na versão '%s'.\n"
+"\n"
+"%s requer pelo menos Git 1.5.0 ou mais recente.\n"
+"\n"
+"Assumir que '%s' está na versão 1.5.0?\n"
+
+#: git-gui.sh:1281
+msgid "Git directory not found:"
+msgstr "Diretório Git não encontrado:"
+
+#: git-gui.sh:1315
+msgid "Cannot move to top of working directory:"
+msgstr "Não é possível mover para o topo do diretório de trabalho:"
+
+#: git-gui.sh:1323
+msgid "Cannot use bare repository:"
+msgstr "Não é possível usar repositório nu:"
+
+#: git-gui.sh:1331
+msgid "No working directory"
+msgstr "Nenhum diretório de trabalho"
+
+#: git-gui.sh:1503 lib/checkout_op.tcl:306
+msgid "Refreshing file status..."
+msgstr "A atualizar estado do ficheiro..."
+
+#: git-gui.sh:1563
+msgid "Scanning for modified files ..."
+msgstr "A procurar por ficheiros modificados..."
+
+#: git-gui.sh:1639
+msgid "Calling prepare-commit-msg hook..."
+msgstr ""
+"A invocar gancho preparar-mensagem-de-commit (prepare-commit-msg hook)..."
+
+#: git-gui.sh:1656
+msgid "Commit declined by prepare-commit-msg hook."
+msgstr ""
+"Commit recusado pelo gancho preparar-mensagem-de-commit (prepare-commit-msg "
+"hook)."
+
+#: git-gui.sh:1814 lib/browser.tcl:252
+msgid "Ready."
+msgstr "Pronto."
+
+#: git-gui.sh:1978
+#, tcl-format
+msgid ""
+"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files."
+msgstr ""
+"Limite de visualização (gui.maxfilesdisplayed = %s) atingido, não são "
+"mostrados todos os %s ficheiros."
+
+#: git-gui.sh:2101
+msgid "Unmodified"
+msgstr "Não modificado"
+
+#: git-gui.sh:2103
+msgid "Modified, not staged"
+msgstr "Modificado, não preparado"
+
+#: git-gui.sh:2104 git-gui.sh:2116
+msgid "Staged for commit"
+msgstr "Preparado para commit"
+
+#: git-gui.sh:2105 git-gui.sh:2117
+msgid "Portions staged for commit"
+msgstr "Porções preparadas para commit"
+
+#: git-gui.sh:2106 git-gui.sh:2118
+msgid "Staged for commit, missing"
+msgstr "Preparado para commit, em falta"
+
+#: git-gui.sh:2108
+msgid "File type changed, not staged"
+msgstr "Tipo de ficheiro modificado, não preparado"
+
+#: git-gui.sh:2109 git-gui.sh:2110
+msgid "File type changed, old type staged for commit"
+msgstr "Tipo de ficheiro modificado, tipo antigo preparado para commit"
+
+#: git-gui.sh:2111
+msgid "File type changed, staged"
+msgstr "Tipo de ficheiro modificado, preparado"
+
+#: git-gui.sh:2112
+msgid "File type change staged, modification not staged"
+msgstr "Tipo de ficheiro modificado, modificação não preparada"
+
+#: git-gui.sh:2113
+msgid "File type change staged, file missing"
+msgstr "Tipo de ficheiro modificado, ficheiro em falta"
+
+#: git-gui.sh:2115
+msgid "Untracked, not staged"
+msgstr "Não controlado, não preparado"
+
+#: git-gui.sh:2120
+msgid "Missing"
+msgstr "Em falta"
+
+#: git-gui.sh:2121
+msgid "Staged for removal"
+msgstr "Preparado para remoção"
+
+#: git-gui.sh:2122
+msgid "Staged for removal, still present"
+msgstr "Preparado para remoção, ainda presente"
+
+#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127
+#: git-gui.sh:2128 git-gui.sh:2129
+msgid "Requires merge resolution"
+msgstr "Requer resolução de integração"
+
+#: git-gui.sh:2164
+msgid "Starting gitk... please wait..."
+msgstr "A iniciar gitk... aguarde..."
+
+#: git-gui.sh:2176
+msgid "Couldn't find gitk in PATH"
+msgstr "Não foi possível encontrar gitk em PATH"
+
+#: git-gui.sh:2235
+msgid "Couldn't find git gui in PATH"
+msgstr "Não foi possível encontrar git gui em PATH"
+
+#: git-gui.sh:2654 lib/choose_repository.tcl:41
+msgid "Repository"
+msgstr "Repositório"
+
+#: git-gui.sh:2655
+msgid "Edit"
+msgstr "Editar"
+
+#: git-gui.sh:2657 lib/choose_rev.tcl:567
+msgid "Branch"
+msgstr "Ramo"
+
+#: git-gui.sh:2660 lib/choose_rev.tcl:554
+msgid "Commit@@noun"
+msgstr "Commit"
+
+#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170
+msgid "Merge"
+msgstr "Integrar"
+
+#: git-gui.sh:2664 lib/choose_rev.tcl:563
+msgid "Remote"
+msgstr "Remoto"
+
+#: git-gui.sh:2667
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: git-gui.sh:2676
+msgid "Explore Working Copy"
+msgstr "Explorar cópia de trabalho"
+
+#: git-gui.sh:2682
+msgid "Git Bash"
+msgstr "Git Bash"
+
+#: git-gui.sh:2692
+msgid "Browse Current Branch's Files"
+msgstr "Navegar pelos ficheiro do ramo atual"
+
+#: git-gui.sh:2696
+msgid "Browse Branch Files..."
+msgstr "Navegar pelos ficheiros do ramo..."
+
+#: git-gui.sh:2701
+msgid "Visualize Current Branch's History"
+msgstr "Visualizar histórico do ramo atual"
+
+#: git-gui.sh:2705
+msgid "Visualize All Branch History"
+msgstr "Visualizar histórico de todos os ramos"
+
+#: git-gui.sh:2712
+#, tcl-format
+msgid "Browse %s's Files"
+msgstr "Navegar pelos ficheiro de %s"
+
+#: git-gui.sh:2714
+#, tcl-format
+msgid "Visualize %s's History"
+msgstr "Visualizar histórico de %s"
+
+#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66
+msgid "Database Statistics"
+msgstr "Estatísticas da base de dados"
+
+#: git-gui.sh:2722 lib/database.tcl:33
+msgid "Compress Database"
+msgstr "Comprimir base de dados"
+
+#: git-gui.sh:2725
+msgid "Verify Database"
+msgstr "Verificar base de dados"
+
+#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8
+#: lib/shortcut.tcl:40 lib/shortcut.tcl:72
+msgid "Create Desktop Icon"
+msgstr "Criar ícone no ambiente de trabalho"
+
+#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201
+msgid "Quit"
+msgstr "Sair"
+
+#: git-gui.sh:2756
+msgid "Undo"
+msgstr "Desfazer"
+
+#: git-gui.sh:2759
+msgid "Redo"
+msgstr "Refazer"
+
+#: git-gui.sh:2763 git-gui.sh:3368
+msgid "Cut"
+msgstr "Cortar"
+
+#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530
+#: lib/console.tcl:69
+msgid "Copy"
+msgstr "Copiar"
+
+#: git-gui.sh:2769 git-gui.sh:3374
+msgid "Paste"
+msgstr "Colar"
+
+#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39
+#: lib/branch_delete.tcl:28
+msgid "Delete"
+msgstr "Eliminar"
+
+#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71
+msgid "Select All"
+msgstr "Selecionar tudo"
+
+#: git-gui.sh:2785
+msgid "Create..."
+msgstr "Criar..."
+
+#: git-gui.sh:2791
+msgid "Checkout..."
+msgstr "Extrair..."
+
+#: git-gui.sh:2797
+msgid "Rename..."
+msgstr "Mudar nome..."
+
+#: git-gui.sh:2802
+msgid "Delete..."
+msgstr "Eliminar..."
+
+#: git-gui.sh:2807
+msgid "Reset..."
+msgstr "Repor..."
+
+#: git-gui.sh:2817
+msgid "Done"
+msgstr "Concluído"
+
+#: git-gui.sh:2819
+msgid "Commit@@verb"
+msgstr "Submeter"
+
+#: git-gui.sh:2828 git-gui.sh:3309
+msgid "New Commit"
+msgstr "Novo commit"
+
+#: git-gui.sh:2836 git-gui.sh:3316
+msgid "Amend Last Commit"
+msgstr "Emendar último commit"
+
+#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101
+msgid "Rescan"
+msgstr "Reanalisar"
+
+#: git-gui.sh:2852
+msgid "Stage To Commit"
+msgstr "Preparar para commit"
+
+#: git-gui.sh:2858
+msgid "Stage Changed Files To Commit"
+msgstr "Preparar ficheiros modificados para commit"
+
+#: git-gui.sh:2864
+msgid "Unstage From Commit"
+msgstr "Retirar do commit"
+
+#: git-gui.sh:2870 lib/index.tcl:442
+msgid "Revert Changes"
+msgstr "Reverter alterações"
+
+#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612
+msgid "Show Less Context"
+msgstr "Mostrar menos contexto"
+
+#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616
+msgid "Show More Context"
+msgstr "Mostrar mais contexto"
+
+#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392
+msgid "Sign Off"
+msgstr "Assinar por baixo"
+
+#: git-gui.sh:2905
+msgid "Local Merge..."
+msgstr "Integração local..."
+
+#: git-gui.sh:2910
+msgid "Abort Merge..."
+msgstr "Abortar integração..."
+
+#: git-gui.sh:2922 git-gui.sh:2950
+msgid "Add..."
+msgstr "Adicionar..."
+
+#: git-gui.sh:2926
+msgid "Push..."
+msgstr "Publicar..."
+
+#: git-gui.sh:2930
+msgid "Delete Branch..."
+msgstr "Eliminar ramo..."
+
+#: git-gui.sh:2940 git-gui.sh:3563
+msgid "Options..."
+msgstr "Opções..."
+
+#: git-gui.sh:2951
+msgid "Remove..."
+msgstr "Remover..."
+
+#: git-gui.sh:2960 lib/choose_repository.tcl:55
+msgid "Help"
+msgstr "Ajuda"
+
+#: git-gui.sh:2964 git-gui.sh:2968 lib/choose_repository.tcl:49
+#: lib/choose_repository.tcl:58 lib/about.tcl:14
+#, tcl-format
+msgid "About %s"
+msgstr "Sobre %s"
+
+#: git-gui.sh:2992
+msgid "Online Documentation"
+msgstr "Documentação online"
+
+#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61
+msgid "Show SSH Key"
+msgstr "Mostrar chave SSH"
+
+#: git-gui.sh:3014 git-gui.sh:3146
+msgid "Usage"
+msgstr "Utilização"
+
+#: git-gui.sh:3095 lib/blame.tcl:573
+msgid "Error"
+msgstr "Erro"
+
+#: git-gui.sh:3126
+#, tcl-format
+msgid "fatal: cannot stat path %s: No such file or directory"
+msgstr ""
+"fatal: não é possível obter estado do caminho %s: Ficheiro ou diretório "
+"inexistente"
+
+#: git-gui.sh:3159
+msgid "Current Branch:"
+msgstr "Ramo atual:"
+
+#: git-gui.sh:3185
+msgid "Staged Changes (Will Commit)"
+msgstr "Alterações preparadas (para commit)"
+
+#: git-gui.sh:3205
+msgid "Unstaged Changes"
+msgstr "Alterações não preparadas"
+
+#: git-gui.sh:3276
+msgid "Stage Changed"
+msgstr "Preparar modificados"
+
+#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229
+msgid "Push"
+msgstr "Publicar"
+
+#: git-gui.sh:3330
+msgid "Initial Commit Message:"
+msgstr "Mensagem de commit inicial:"
+
+#: git-gui.sh:3331
+msgid "Amended Commit Message:"
+msgstr "Mensagem de commit emendada:"
+
+#: git-gui.sh:3332
+msgid "Amended Initial Commit Message:"
+msgstr "Mensagem de commit inicial emendada:"
+
+#: git-gui.sh:3333
+msgid "Amended Merge Commit Message:"
+msgstr "Mensagem de commit de integração emendada:"
+
+#: git-gui.sh:3334
+msgid "Merge Commit Message:"
+msgstr "Mensagem de commit de integração:"
+
+#: git-gui.sh:3335
+msgid "Commit Message:"
+msgstr "Mensagem de commit:"
+
+#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73
+msgid "Copy All"
+msgstr "Copiar tudo"
+
+#: git-gui.sh:3408 lib/blame.tcl:105
+msgid "File:"
+msgstr "Ficheiro:"
+
+#: git-gui.sh:3526
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: git-gui.sh:3547
+msgid "Decrease Font Size"
+msgstr "Diminuir tamanho de letra"
+
+#: git-gui.sh:3551
+msgid "Increase Font Size"
+msgstr "Aumentar tamanho de letra"
+
+#: git-gui.sh:3559 lib/blame.tcl:294
+msgid "Encoding"
+msgstr "Codificação"
+
+#: git-gui.sh:3570
+msgid "Apply/Reverse Hunk"
+msgstr "Aplicar/Reverter excerto"
+
+#: git-gui.sh:3575
+msgid "Apply/Reverse Line"
+msgstr "Aplicar/Reverter linha"
+
+#: git-gui.sh:3594
+msgid "Run Merge Tool"
+msgstr "Executar ferramenta de integração"
+
+#: git-gui.sh:3599
+msgid "Use Remote Version"
+msgstr "Usar a versão remota"
+
+#: git-gui.sh:3603
+msgid "Use Local Version"
+msgstr "Usar a versão local"
+
+#: git-gui.sh:3607
+msgid "Revert To Base"
+msgstr "Reverter para a base"
+
+#: git-gui.sh:3625
+msgid "Visualize These Changes In The Submodule"
+msgstr "Visualizar estas alterações no submódulo"
+
+#: git-gui.sh:3629
+msgid "Visualize Current Branch History In The Submodule"
+msgstr "Visualizar histórico do ramo atual no submódulo"
+
+#: git-gui.sh:3633
+msgid "Visualize All Branch History In The Submodule"
+msgstr "Visualizar histórico de todos os ramos no submódulo"
+
+#: git-gui.sh:3638
+msgid "Start git gui In The Submodule"
+msgstr "Iniciar git gui no submódulo"
+
+#: git-gui.sh:3673
+msgid "Unstage Hunk From Commit"
+msgstr "Retirar excerto do commit"
+
+#: git-gui.sh:3675
+msgid "Unstage Lines From Commit"
+msgstr "Retirar linhas do commit"
+
+#: git-gui.sh:3677
+msgid "Unstage Line From Commit"
+msgstr "Retirar linha do commit"
+
+#: git-gui.sh:3680
+msgid "Stage Hunk For Commit"
+msgstr "Preparar excerto para commit"
+
+#: git-gui.sh:3682
+msgid "Stage Lines For Commit"
+msgstr "Preparar linhas para commit"
+
+#: git-gui.sh:3684
+msgid "Stage Line For Commit"
+msgstr "Preparar linha para commit"
+
+#: git-gui.sh:3709
+msgid "Initializing..."
+msgstr "A inicializar..."
+
+#: git-gui.sh:3852
+#, tcl-format
+msgid ""
+"Possible environment issues exist.\n"
+"\n"
+"The following environment variables are probably\n"
+"going to be ignored by any Git subprocess run\n"
+"by %s:\n"
+"\n"
+msgstr ""
+"Existem possíveis erros de ambiente.\n"
+"\n"
+"As seguintes variáveis de ambiente serão provavelmente\n"
+"ignoradas pelos subprocessos do Git executados\n"
+"por %s:\n"
+"\n"
+
+#: git-gui.sh:3881
+msgid ""
+"\n"
+"This is due to a known issue with the\n"
+"Tcl binary distributed by Cygwin."
+msgstr ""
+"\n"
+"Devido a um problema conhecido com o\n"
+"binário Tcl distribuído pelo Cygwin."
+
+#: git-gui.sh:3886
+#, tcl-format
+msgid ""
+"\n"
+"\n"
+"A good replacement for %s\n"
+"is placing values for the user.name and\n"
+"user.email settings into your personal\n"
+"~/.gitconfig file.\n"
+msgstr ""
+"\n"
+"\n"
+"Um bom substituto para %s\n"
+"é colocar valores das definições user.name e\n"
+"user.email no ficheiro pessoal ~/.gitconfig.\n"
+
+#: lib/line.tcl:17
+msgid "Goto Line:"
+msgstr "Ir para a linha:"
+
+#: lib/line.tcl:23
+msgid "Go"
+msgstr "Ir"
+
+#: lib/console.tcl:59
+msgid "Working... please wait..."
+msgstr "A processar... aguarde..."
+
+#: lib/console.tcl:81 lib/checkout_op.tcl:146 lib/sshkey.tcl:55
+#: lib/database.tcl:30
+msgid "Close"
+msgstr "Fechar"
+
+#: lib/console.tcl:186
+msgid "Success"
+msgstr "Sucesso"
+
+#: lib/console.tcl:200
+msgid "Error: Command Failed"
+msgstr "Erro: falha ao executar comando"
+
+#: lib/checkout_op.tcl:85
+#, tcl-format
+msgid "Fetching %s from %s"
+msgstr "A obter %s de %s"
+
+#: lib/checkout_op.tcl:133
+#, tcl-format
+msgid "fatal: Cannot resolve %s"
+msgstr "fatal: Não é possível resolver %s"
+
+#: lib/checkout_op.tcl:175
+#, tcl-format
+msgid "Branch '%s' does not exist."
+msgstr "O ramo '%s' não existe."
+
+#: lib/checkout_op.tcl:194
+#, tcl-format
+msgid "Failed to configure simplified git-pull for '%s'."
+msgstr "Falha ao configurar git-pull simplificado de '%s'."
+
+#: lib/checkout_op.tcl:202 lib/branch_rename.tcl:102
+#, tcl-format
+msgid "Branch '%s' already exists."
+msgstr "O ramo '%s' já existe."
+
+#: lib/checkout_op.tcl:229
+#, tcl-format
+msgid ""
+"Branch '%s' already exists.\n"
+"\n"
+"It cannot fast-forward to %s.\n"
+"A merge is required."
+msgstr ""
+"O ramo '%s' já existe.\n"
+"\n"
+"Não pode ser avançado rapidamente para %s.\n"
+"Integração necessária."
+
+#: lib/checkout_op.tcl:243
+#, tcl-format
+msgid "Merge strategy '%s' not supported."
+msgstr "A estratégia de integração '%s' não é suportada."
+
+#: lib/checkout_op.tcl:262
+#, tcl-format
+msgid "Failed to update '%s'."
+msgstr "Falha ao atualizar '%s'."
+
+#: lib/checkout_op.tcl:274
+msgid "Staging area (index) is already locked."
+msgstr "A área de estágio (índice) já está bloqueada."
+
+#: lib/checkout_op.tcl:289
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before the current branch can be changed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"O último estado analisado não corresponde ao estado do repositório.\n"
+"\n"
+"Outro programa Git modificou este repositório deste a última análise. Deve-"
+"se reanalisar antes do ramo atual poder ser alterado.\n"
+"\n"
+"Irá-se reanalisar automaticamente agora.\n"
+
+#: lib/checkout_op.tcl:345
+#, tcl-format
+msgid "Updating working directory to '%s'..."
+msgstr "A atualizar o diretório de trabalho para '%s'..."
+
+#: lib/checkout_op.tcl:346
+msgid "files checked out"
+msgstr "ficheiros extraídos"
+
+#: lib/checkout_op.tcl:376
+#, tcl-format
+msgid "Aborted checkout of '%s' (file level merging is required)."
+msgstr ""
+"Extração de '%s' abortada (é necessário integrar ao nível de ficheiros)."
+
+#: lib/checkout_op.tcl:377
+msgid "File level merge required."
+msgstr "Integração ao nível de ficheiros necessária."
+
+#: lib/checkout_op.tcl:381
+#, tcl-format
+msgid "Staying on branch '%s'."
+msgstr "Permanecer no ramo '%s'."
+
+#: lib/checkout_op.tcl:452
+msgid ""
+"You are no longer on a local branch.\n"
+"\n"
+"If you wanted to be on a branch, create one now starting from 'This Detached "
+"Checkout'."
+msgstr ""
+"Já não se encontra num ramo local.\n"
+"\n"
+"Se queria estar sobre um ramo, crie um a partir de 'Esta extração destacada'."
+
+#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507
+#, tcl-format
+msgid "Checked out '%s'."
+msgstr "'%s' extraído."
+
+#: lib/checkout_op.tcl:535
+#, tcl-format
+msgid "Resetting '%s' to '%s' will lose the following commits:"
+msgstr "Ao repor '%s' para '%s' perderá os seguintes commits:"
+
+#: lib/checkout_op.tcl:557
+msgid "Recovering lost commits may not be easy."
+msgstr "Recuperar commits perdidos pode não ser fácil."
+
+#: lib/checkout_op.tcl:562
+#, tcl-format
+msgid "Reset '%s'?"
+msgstr "Repor '%s'?"
+
+#: lib/checkout_op.tcl:567 lib/tools_dlg.tcl:336 lib/merge.tcl:166
+msgid "Visualize"
+msgstr "Visualizar"
+
+#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85
+msgid "Reset"
+msgstr "Repor"
+
+#: lib/checkout_op.tcl:579 lib/transport.tcl:141 lib/remote_add.tcl:34
+#: lib/browser.tcl:292 lib/branch_checkout.tcl:30 lib/choose_font.tcl:45
+#: lib/option.tcl:127 lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202
+#: lib/tools_dlg.tcl:345 lib/branch_rename.tcl:32
+#: lib/remote_branch_delete.tcl:43 lib/branch_create.tcl:37
+#: lib/branch_delete.tcl:34 lib/merge.tcl:174
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: lib/checkout_op.tcl:635
+#, tcl-format
+msgid ""
+"Failed to set current branch.\n"
+"\n"
+"This working directory is only partially switched.  We successfully updated "
+"your files, but failed to update an internal Git file.\n"
+"\n"
+"This should not have occurred.  %s will now close and give up."
+msgstr ""
+"Falha ao definir ramo atual.\n"
+"\n"
+"Apenas se mudou o diretório de trabalho parcialmente. Os ficheiros foram "
+"atualizados com sucesso, mas não foi possível atualizar o ficheiro Git "
+"interno.\n"
+"\n"
+"Não devia ter ocorrido. %s irá terminar e desistir."
+
+#: lib/transport.tcl:6 lib/remote_add.tcl:132
+#, tcl-format
+msgid "fetch %s"
+msgstr "obter %s"
+
+#: lib/transport.tcl:7
+#, tcl-format
+msgid "Fetching new changes from %s"
+msgstr "Obter novas alterações de %s"
+
+#: lib/transport.tcl:18
+#, tcl-format
+msgid "remote prune %s"
+msgstr "poda remota de %s"
+
+#: lib/transport.tcl:19
+#, tcl-format
+msgid "Pruning tracking branches deleted from %s"
+msgstr "A podar ramos de monitorização eliminados de %s"
+
+#: lib/transport.tcl:25
+msgid "fetch all remotes"
+msgstr "obter de todos os remotos"
+
+#: lib/transport.tcl:26
+msgid "Fetching new changes from all remotes"
+msgstr "A obter novas alterações de todos os remotos"
+
+#: lib/transport.tcl:40
+msgid "remote prune all remotes"
+msgstr "poda remota de todos os remotos"
+
+#: lib/transport.tcl:41
+msgid "Pruning tracking branches deleted from all remotes"
+msgstr "A podar ramos de monitorização eliminados de todos os remotos"
+
+#: lib/transport.tcl:54 lib/transport.tcl:92 lib/transport.tcl:110
+#: lib/remote_add.tcl:162
+#, tcl-format
+msgid "push %s"
+msgstr "publicar %s"
+
+#: lib/transport.tcl:55
+#, tcl-format
+msgid "Pushing changes to %s"
+msgstr "A publicar alterações em %s"
+
+#: lib/transport.tcl:93
+#, tcl-format
+msgid "Mirroring to %s"
+msgstr "A espelhar em %s"
+
+#: lib/transport.tcl:111
+#, tcl-format
+msgid "Pushing %s %s to %s"
+msgstr "A publicar %s %s em %s"
+
+#: lib/transport.tcl:132
+msgid "Push Branches"
+msgstr "Publicar ramos"
+
+#: lib/transport.tcl:147
+msgid "Source Branches"
+msgstr "Ramos de origem"
+
+#: lib/transport.tcl:162
+msgid "Destination Repository"
+msgstr "Repositório de destino"
+
+#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51
+msgid "Remote:"
+msgstr "Remoto:"
+
+#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72
+msgid "Arbitrary Location:"
+msgstr "Localização arbitrária:"
+
+#: lib/transport.tcl:205
+msgid "Transfer Options"
+msgstr "Opções de transferência"
+
+#: lib/transport.tcl:207
+msgid "Force overwrite existing branch (may discard changes)"
+msgstr "Forçar substituição de ramos existente (pode descartar alterações)"
+
+#: lib/transport.tcl:211
+msgid "Use thin pack (for slow network connections)"
+msgstr "Usar pacote fino (para conexões de rede lentas)"
+
+#: lib/transport.tcl:215
+msgid "Include tags"
+msgstr "Incluir tags"
+
+#: lib/remote_add.tcl:20
+msgid "Add Remote"
+msgstr "Adicionar remoto"
+
+#: lib/remote_add.tcl:25
+msgid "Add New Remote"
+msgstr "Adicionar novo remoto"
+
+#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
+msgid "Add"
+msgstr "Adicionar"
+
+#: lib/remote_add.tcl:39
+msgid "Remote Details"
+msgstr "Detalhes do remoto"
+
+#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44
+msgid "Name:"
+msgstr "Nome:"
+
+#: lib/remote_add.tcl:50
+msgid "Location:"
+msgstr "Localização:"
+
+#: lib/remote_add.tcl:60
+msgid "Further Action"
+msgstr "Ação adicional"
+
+#: lib/remote_add.tcl:63
+msgid "Fetch Immediately"
+msgstr "Obter imediatamente"
+
+#: lib/remote_add.tcl:69
+msgid "Initialize Remote Repository and Push"
+msgstr "Inicializar repositório remoto e publicar"
+
+#: lib/remote_add.tcl:75
+msgid "Do Nothing Else Now"
+msgstr "Não fazer mais nada agora"
+
+#: lib/remote_add.tcl:100
+msgid "Please supply a remote name."
+msgstr "Forneça um nome para o remoto."
+
+#: lib/remote_add.tcl:113
+#, tcl-format
+msgid "'%s' is not an acceptable remote name."
+msgstr "'%s' não pode ser aceite como nome de remoto."
+
+#: lib/remote_add.tcl:124
+#, tcl-format
+msgid "Failed to add remote '%s' of location '%s'."
+msgstr "Falha ao adicionar remoto '%s' localizado em '%s'."
+
+#: lib/remote_add.tcl:133
+#, tcl-format
+msgid "Fetching the %s"
+msgstr "A obter de %s"
+
+#: lib/remote_add.tcl:156
+#, tcl-format
+msgid "Do not know how to initialize repository at location '%s'."
+msgstr "Não se sabe como inicializar o repositório localizado em '%s'."
+
+#: lib/remote_add.tcl:163
+#, tcl-format
+msgid "Setting up the %s (at %s)"
+msgstr "A configurar %s (em %s)"
+
+#: lib/browser.tcl:17
+msgid "Starting..."
+msgstr "A iniciar..."
+
+#: lib/browser.tcl:27
+msgid "File Browser"
+msgstr "Navegador de ficheiros"
+
+#: lib/browser.tcl:132 lib/browser.tcl:149
+#, tcl-format
+msgid "Loading %s..."
+msgstr "A carregar %s..."
+
+#: lib/browser.tcl:193
+msgid "[Up To Parent]"
+msgstr "[Subir]"
+
+#: lib/browser.tcl:275 lib/browser.tcl:282
+msgid "Browse Branch Files"
+msgstr "Navegar pelos ficheiros do ramo"
+
+#: lib/browser.tcl:288 lib/choose_repository.tcl:422
+#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518
+#: lib/choose_repository.tcl:1074
+msgid "Browse"
+msgstr "Navegar"
+
+#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321
+msgid "Revision"
+msgstr "Revisão"
+
+#: lib/tools.tcl:75
+#, tcl-format
+msgid "Running %s requires a selected file."
+msgstr "Deve selecionar um ficheiro para executar %s."
+
+#: lib/tools.tcl:91
+#, tcl-format
+msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
+msgstr "Tem a certeza que pretende executar %1$s sobre o ficheiro \"%2$s\"?"
+
+#: lib/tools.tcl:95
+#, tcl-format
+msgid "Are you sure you want to run %s?"
+msgstr "Tem a certeza que pretende executar %s?"
+
+#: lib/tools.tcl:116
+#, tcl-format
+msgid "Tool: %s"
+msgstr "Ferramenta: %s"
+
+#: lib/tools.tcl:117
+#, tcl-format
+msgid "Running: %s"
+msgstr "A executar: %s"
+
+#: lib/tools.tcl:155
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "A ferramenta concluí com sucesso: %s"
+
+#: lib/tools.tcl:157
+#, tcl-format
+msgid "Tool failed: %s"
+msgstr "A ferramenta falhou: %s"
+
+#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21
+msgid "Checkout Branch"
+msgstr "Extrair ramo"
+
+#: lib/branch_checkout.tcl:26
+msgid "Checkout"
+msgstr "Extrair"
+
+#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69
+msgid "Options"
+msgstr "Opções"
+
+#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
+msgid "Fetch Tracking Branch"
+msgstr "Obter ramo de monitorização"
+
+#: lib/branch_checkout.tcl:47
+msgid "Detach From Local Branch"
+msgstr "Destacar do ramo local"
+
+#: lib/spellcheck.tcl:57
+msgid "Unsupported spell checker"
+msgstr "Corretor ortográfico não suportado"
+
+#: lib/spellcheck.tcl:65
+msgid "Spell checking is unavailable"
+msgstr "Correção ortográfica indisponível"
+
+#: lib/spellcheck.tcl:68
+msgid "Invalid spell checking configuration"
+msgstr "Configuração inválida do corretor ortográfico"
+
+#: lib/spellcheck.tcl:70
+#, tcl-format
+msgid "Reverting dictionary to %s."
+msgstr "A reverter dicionário para %s."
+
+#: lib/spellcheck.tcl:73
+msgid "Spell checker silently failed on startup"
+msgstr "O corretor ortográfico falhou silenciosamente ao iniciar"
+
+#: lib/spellcheck.tcl:80
+msgid "Unrecognized spell checker"
+msgstr "Corretor ortográfico não reconhecido"
+
+#: lib/spellcheck.tcl:186
+msgid "No Suggestions"
+msgstr "Sem sugestões"
+
+#: lib/spellcheck.tcl:388
+msgid "Unexpected EOF from spell checker"
+msgstr "EOF (fim de ficheiro) inesperado do corretor ortográfico"
+
+#: lib/spellcheck.tcl:392
+msgid "Spell Checker Failed"
+msgstr "Corretor ortográfico falhou"
+
+#: lib/status_bar.tcl:87
+#, tcl-format
+msgid "%s ... %*i of %*i %s (%3i%%)"
+msgstr "%s ... %*i de %*i %s (%3i%%)"
+
+#: lib/diff.tcl:77
+#, tcl-format
+msgid ""
+"No differences detected.\n"
+"\n"
+"%s has no changes.\n"
+"\n"
+"The modification date of this file was updated by another application, but "
+"the content within the file was not changed.\n"
+"\n"
+"A rescan will be automatically started to find other files which may have "
+"the same state."
+msgstr ""
+"Nenhum diferença detetada.\n"
+"\n"
+"%s não tem alterações.\n"
+"\n"
+"A data de modificação deste ficheiro foi atualizada por outra aplicação, mas "
+"o conteúdo no interior do ficheiro não foi alterado.\n"
+"\n"
+"Irá-se reanalisar automaticamente para encontrar outros ficheiros que "
+"estejam no mesmo estado."
+
+#: lib/diff.tcl:117
+#, tcl-format
+msgid "Loading diff of %s..."
+msgstr "A carregar diferenças de %s..."
+
+#: lib/diff.tcl:140
+msgid ""
+"LOCAL: deleted\n"
+"REMOTE:\n"
+msgstr ""
+"LOCAL: eliminado\n"
+"REMOTO:\n"
+
+#: lib/diff.tcl:145
+msgid ""
+"REMOTE: deleted\n"
+"LOCAL:\n"
+msgstr ""
+"REMOTO: eliminado\n"
+"LOCAL:\n"
+
+#: lib/diff.tcl:152
+msgid "LOCAL:\n"
+msgstr "LOCAL:\n"
+
+#: lib/diff.tcl:155
+msgid "REMOTE:\n"
+msgstr "REMOTO:\n"
+
+#: lib/diff.tcl:217 lib/diff.tcl:355
+#, tcl-format
+msgid "Unable to display %s"
+msgstr "Não é possível mostrar %s"
+
+#: lib/diff.tcl:218
+msgid "Error loading file:"
+msgstr "Erro ao carregar ficheiro:"
+
+#: lib/diff.tcl:225
+msgid "Git Repository (subproject)"
+msgstr "Repositório Git (subprojeto)"
+
+#: lib/diff.tcl:237
+msgid "* Binary file (not showing content)."
+msgstr "* Ficheiro binário (conteúdo não exibido)."
+
+#: lib/diff.tcl:242
+#, tcl-format
+msgid ""
+"* Untracked file is %d bytes.\n"
+"* Showing only first %d bytes.\n"
+msgstr ""
+"* O ficheiro não controlado tem %d bytes.\n"
+"* Exibido apenas os primeiros %d bytes.\n"
+
+#: lib/diff.tcl:248
+#, tcl-format
+msgid ""
+"\n"
+"* Untracked file clipped here by %s.\n"
+"* To see the entire file, use an external editor.\n"
+msgstr ""
+"\n"
+"* Ficheiro não controlado recortado aqui por %s.\n"
+"* Para ver o ficheiro inteiro, use um editor externo.\n"
+
+#: lib/diff.tcl:356 lib/blame.tcl:1128
+msgid "Error loading diff:"
+msgstr "Erro ao carregar diferenças:"
+
+#: lib/diff.tcl:578
+msgid "Failed to unstage selected hunk."
+msgstr "Falha ao retirar excerto selecionado do índice."
+
+#: lib/diff.tcl:585
+msgid "Failed to stage selected hunk."
+msgstr "Falha ao preparar excerto selecionado."
+
+#: lib/diff.tcl:664
+msgid "Failed to unstage selected line."
+msgstr "Falha ao retirar linha selecionada do índice."
+
+#: lib/diff.tcl:672
+msgid "Failed to stage selected line."
+msgstr "Falha ao preparar linha selecionada."
+
+#: lib/remote.tcl:200
+msgid "Push to"
+msgstr "Publicar em"
+
+#: lib/remote.tcl:218
+msgid "Remove Remote"
+msgstr "Remover remoto"
+
+#: lib/remote.tcl:223
+msgid "Prune from"
+msgstr "Podar de"
+
+#: lib/remote.tcl:228
+msgid "Fetch from"
+msgstr "Obter de"
+
+#: lib/choose_font.tcl:41
+msgid "Select"
+msgstr "Selecionar"
+
+#: lib/choose_font.tcl:55
+msgid "Font Family"
+msgstr "Família de tipo de letra"
+
+#: lib/choose_font.tcl:76
+msgid "Font Size"
+msgstr "Tamanho de letra"
+
+#: lib/choose_font.tcl:93
+msgid "Font Example"
+msgstr "Exemplo do tipo de letra"
+
+#: lib/choose_font.tcl:105
+msgid ""
+"This is example text.\n"
+"If you like this text, it can be your font."
+msgstr ""
+"Este texto é um exemplo.\n"
+"Se gostar deste texto, pode defini-lo como tipo de letra."
+
+#: lib/option.tcl:11
+#, tcl-format
+msgid "Invalid global encoding '%s'"
+msgstr "Codificação global '%s' inválida"
+
+#: lib/option.tcl:19
+#, tcl-format
+msgid "Invalid repo encoding '%s'"
+msgstr "Codificação do repositório '%s' inválida"
+
+#: lib/option.tcl:119
+msgid "Restore Defaults"
+msgstr "Restaurar predefinições"
+
+#: lib/option.tcl:123
+msgid "Save"
+msgstr "Guardar"
+
+#: lib/option.tcl:133
+#, tcl-format
+msgid "%s Repository"
+msgstr "Repositório %s"
+
+#: lib/option.tcl:134
+msgid "Global (All Repositories)"
+msgstr "Global (todos os repositórios)"
+
+#: lib/option.tcl:140
+msgid "User Name"
+msgstr "Nome de utilizador"
+
+#: lib/option.tcl:141
+msgid "Email Address"
+msgstr "Endereço de e-mail"
+
+#: lib/option.tcl:143
+msgid "Summarize Merge Commits"
+msgstr "Resumir commits de integração"
+
+#: lib/option.tcl:144
+msgid "Merge Verbosity"
+msgstr "Verbosidade de integração"
+
+#: lib/option.tcl:145
+msgid "Show Diffstat After Merge"
+msgstr "Mostrar estatísticas de diferenças depois de integrar"
+
+#: lib/option.tcl:146
+msgid "Use Merge Tool"
+msgstr "Usar ferramenta de integração"
+
+#: lib/option.tcl:148
+msgid "Trust File Modification Timestamps"
+msgstr "Confiar na data de modificação dos ficheiros"
+
+#: lib/option.tcl:149
+msgid "Prune Tracking Branches During Fetch"
+msgstr "Podar ramos de monitorização ao obter"
+
+#: lib/option.tcl:150
+msgid "Match Tracking Branches"
+msgstr "Corresponder ramos de monitorização"
+
+#: lib/option.tcl:151
+msgid "Use Textconv For Diffs and Blames"
+msgstr "Usar textconv para mostrar diferenças e culpar"
+
+#: lib/option.tcl:152
+msgid "Blame Copy Only On Changed Files"
+msgstr "Detetar cópia apenas em ficheiros modificados"
+
+#: lib/option.tcl:153
+msgid "Maximum Length of Recent Repositories List"
+msgstr "Comprimento máximo da lista de repositórios recentes"
+
+#: lib/option.tcl:154
+msgid "Minimum Letters To Blame Copy On"
+msgstr "Número mínimo de letras para detetar cópia"
+
+#: lib/option.tcl:155
+msgid "Blame History Context Radius (days)"
+msgstr "Raio de contexto histórico para culpar (dias)"
+
+#: lib/option.tcl:156
+msgid "Number of Diff Context Lines"
+msgstr "Número de linhas de contexto ao mostrar diferenças"
+
+#: lib/option.tcl:157
+msgid "Additional Diff Parameters"
+msgstr "Parâmetros de diff adicionais"
+
+#: lib/option.tcl:158
+msgid "Commit Message Text Width"
+msgstr "Largura do texto da mensagem de commit"
+
+#: lib/option.tcl:159
+msgid "New Branch Name Template"
+msgstr "Modelo para nome de novo ramo"
+
+#: lib/option.tcl:160
+msgid "Default File Contents Encoding"
+msgstr "Codificação predefinida dos conteúdos de ficheiros"
+
+#: lib/option.tcl:161
+msgid "Warn before committing to a detached head"
+msgstr "Avisar antes de submeter numa cabeça destacada"
+
+#: lib/option.tcl:162
+msgid "Staging of untracked files"
+msgstr "Preparar ficheiros não controlados"
+
+#: lib/option.tcl:163
+msgid "Show untracked files"
+msgstr "Mostrar ficheiros não controlados"
+
+#: lib/option.tcl:164
+msgid "Tab spacing"
+msgstr "Espaçamento da tabulação"
+
+#: lib/option.tcl:210
+msgid "Change"
+msgstr "Alterar"
+
+#: lib/option.tcl:254
+msgid "Spelling Dictionary:"
+msgstr "Dicionário ortográfico:"
+
+#: lib/option.tcl:284
+msgid "Change Font"
+msgstr "Alterar tipo de letra"
+
+#: lib/option.tcl:288
+#, tcl-format
+msgid "Choose %s"
+msgstr "Escolher %s"
+
+#: lib/option.tcl:294
+msgid "pt."
+msgstr "pt."
+
+#: lib/option.tcl:308
+msgid "Preferences"
+msgstr "Preferências"
+
+#: lib/option.tcl:345
+msgid "Failed to completely save options:"
+msgstr "Falha ao guardar todas as opções:"
+
+#: lib/mergetool.tcl:8
+msgid "Force resolution to the base version?"
+msgstr "Forçar resolução para a versão base?"
+
+#: lib/mergetool.tcl:9
+msgid "Force resolution to this branch?"
+msgstr "Forçar resolução para este ramo?"
+
+#: lib/mergetool.tcl:10
+msgid "Force resolution to the other branch?"
+msgstr "Forçar resolução para o outro ramo?"
+
+#: lib/mergetool.tcl:14
+#, tcl-format
+msgid ""
+"Note that the diff shows only conflicting changes.\n"
+"\n"
+"%s will be overwritten.\n"
+"\n"
+"This operation can be undone only by restarting the merge."
+msgstr ""
+"Note que as diferenças mostram apenas alterações em conflito.\n"
+"\n"
+"%s será substituído.\n"
+"\n"
+"Esta operação só pode ser anulada reiniciando a integração."
+
+#: lib/mergetool.tcl:45
+#, tcl-format
+msgid "File %s seems to have unresolved conflicts, still stage?"
+msgstr ""
+"O ficheiro %s parece ter conflitos não resolvidos, prepará-lo mesmo assim?"
+
+#: lib/mergetool.tcl:60
+#, tcl-format
+msgid "Adding resolution for %s"
+msgstr "A adicionar resolução de %s"
+
+#: lib/mergetool.tcl:141
+msgid "Cannot resolve deletion or link conflicts using a tool"
+msgstr ""
+"Não é possível resolver conflitos de exclusão ou ligação usando uma "
+"ferramenta"
+
+#: lib/mergetool.tcl:146
+msgid "Conflict file does not exist"
+msgstr "O ficheiro em conflito não existe"
+
+#: lib/mergetool.tcl:246
+#, tcl-format
+msgid "Not a GUI merge tool: '%s'"
+msgstr "Não é uma ferramenta GUI de integração: '%s'"
+
+#: lib/mergetool.tcl:275
+#, tcl-format
+msgid "Unsupported merge tool '%s'"
+msgstr "Ferramenta de integração '%s' não suportada"
+
+#: lib/mergetool.tcl:310
+msgid "Merge tool is already running, terminate it?"
+msgstr "A ferramenta de integração já está a executar, terminá-la?"
+
+#: lib/mergetool.tcl:330
+#, tcl-format
+msgid ""
+"Error retrieving versions:\n"
+"%s"
+msgstr ""
+"Erro ao obter versões:\n"
+"%s"
+
+#: lib/mergetool.tcl:350
+#, tcl-format
+msgid ""
+"Could not start the merge tool:\n"
+"\n"
+"%s"
+msgstr ""
+"Não foi possível iniciar a ferramenta de integração:\n"
+"\n"
+"%s"
+
+#: lib/mergetool.tcl:354
+msgid "Running merge tool..."
+msgstr "A executar a ferramenta de integração..."
+
+#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
+msgid "Merge tool failed."
+msgstr "A ferramenta de integração falhou."
+
+#: lib/tools_dlg.tcl:22
+msgid "Add Tool"
+msgstr "Adicionar ferramenta"
+
+#: lib/tools_dlg.tcl:28
+msgid "Add New Tool Command"
+msgstr "Adicionar novo comando de ferramenta"
+
+#: lib/tools_dlg.tcl:34
+msgid "Add globally"
+msgstr "Adicionar globalmente"
+
+#: lib/tools_dlg.tcl:46
+msgid "Tool Details"
+msgstr "Detalhes da ferramenta"
+
+#: lib/tools_dlg.tcl:49
+msgid "Use '/' separators to create a submenu tree:"
+msgstr "Use separadores '/' para criar uma árvore de submenus:"
+
+#: lib/tools_dlg.tcl:60
+msgid "Command:"
+msgstr "Comando:"
+
+#: lib/tools_dlg.tcl:71
+msgid "Show a dialog before running"
+msgstr "Mostrar um diálogo antes de executar"
+
+#: lib/tools_dlg.tcl:77
+msgid "Ask the user to select a revision (sets $REVISION)"
+msgstr "Pedir ao utilizador para selecionar uma revisão (define $REVISION)"
+
+#: lib/tools_dlg.tcl:82
+msgid "Ask the user for additional arguments (sets $ARGS)"
+msgstr "Pedir ao utilizador argumentos adicionais (define $ARGS)"
+
+#: lib/tools_dlg.tcl:89
+msgid "Don't show the command output window"
+msgstr "Não mostrar a janela com a saída do comando"
+
+#: lib/tools_dlg.tcl:94
+msgid "Run only if a diff is selected ($FILENAME not empty)"
+msgstr "Executar só se for selecionada um diferença ($FILENAME não vazio)"
+
+#: lib/tools_dlg.tcl:118
+msgid "Please supply a name for the tool."
+msgstr "Forneça um nome para a ferramenta."
+
+#: lib/tools_dlg.tcl:126
+#, tcl-format
+msgid "Tool '%s' already exists."
+msgstr "A ferramenta '%s' já existe."
+
+#: lib/tools_dlg.tcl:148
+#, tcl-format
+msgid ""
+"Could not add tool:\n"
+"%s"
+msgstr ""
+"Não foi possível adicionar ferramenta:\n"
+"%s"
+
+#: lib/tools_dlg.tcl:187
+msgid "Remove Tool"
+msgstr "Remover ferramenta"
+
+#: lib/tools_dlg.tcl:193
+msgid "Remove Tool Commands"
+msgstr "Remover comandos de ferramenta"
+
+#: lib/tools_dlg.tcl:198
+msgid "Remove"
+msgstr "Remover"
+
+#: lib/tools_dlg.tcl:231
+msgid "(Blue denotes repository-local tools)"
+msgstr "(Azul denota ferramentas locais do repositório)"
+
+#: lib/tools_dlg.tcl:292
+#, tcl-format
+msgid "Run Command: %s"
+msgstr "Executar comando: %s"
+
+#: lib/tools_dlg.tcl:306
+msgid "Arguments"
+msgstr "Argumentos"
+
+#: lib/tools_dlg.tcl:341
+msgid "OK"
+msgstr "OK"
+
+#: lib/search.tcl:48
+msgid "Find:"
+msgstr "Procurar:"
+
+#: lib/search.tcl:50
+msgid "Next"
+msgstr "Seguinte"
+
+#: lib/search.tcl:51
+msgid "Prev"
+msgstr "Anterior"
+
+#: lib/search.tcl:52
+msgid "RegExp"
+msgstr "ExpReg"
+
+#: lib/search.tcl:54
+msgid "Case"
+msgstr "Maiúsculas"
+
+#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
+msgid "Cannot write shortcut:"
+msgstr "Não é possível escrever atalho:"
+
+#: lib/shortcut.tcl:137
+msgid "Cannot write icon:"
+msgstr "Não é possível escrever ícone:"
+
+#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23
+msgid "Rename Branch"
+msgstr "Mudar nome de ramo"
+
+#: lib/branch_rename.tcl:28
+msgid "Rename"
+msgstr "Mudar nome"
+
+#: lib/branch_rename.tcl:38
+msgid "Branch:"
+msgstr "Ramo:"
+
+#: lib/branch_rename.tcl:46
+msgid "New Name:"
+msgstr "Novo nome:"
+
+#: lib/branch_rename.tcl:81
+msgid "Please select a branch to rename."
+msgstr "Selecione um ramo para mudar de nome."
+
+#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154
+msgid "Please supply a branch name."
+msgstr "Indique um nome para o ramo."
+
+#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165
+#, tcl-format
+msgid "'%s' is not an acceptable branch name."
+msgstr "'%s' não pode ser aceite como nome de ramo."
+
+#: lib/branch_rename.tcl:123
+#, tcl-format
+msgid "Failed to rename '%s'."
+msgstr "Falha ao mudar o nome de '%s'."
+
+#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
+msgid "Delete Branch Remotely"
+msgstr "Remover ramo remotamente"
+
+#: lib/remote_branch_delete.tcl:48
+msgid "From Repository"
+msgstr "Do repositório"
+
+#: lib/remote_branch_delete.tcl:88
+msgid "Branches"
+msgstr "Ramos"
+
+#: lib/remote_branch_delete.tcl:110
+msgid "Delete Only If"
+msgstr "Eliminar só se"
+
+#: lib/remote_branch_delete.tcl:112
+msgid "Merged Into:"
+msgstr "Integrar em:"
+
+#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53
+msgid "Always (Do not perform merge checks)"
+msgstr "Sempre (não realizar verificação de integração)"
+
+#: lib/remote_branch_delete.tcl:153
+msgid "A branch is required for 'Merged Into'."
+msgstr "É necessário um ramo em 'Integrar em'."
+
+#: lib/remote_branch_delete.tcl:185
+#, tcl-format
+msgid ""
+"The following branches are not completely merged into %s:\n"
+"\n"
+" - %s"
+msgstr ""
+"Os seguintes ramos não foram completamente integrados em %s:\n"
+"\n"
+" - %s"
+
+#: lib/remote_branch_delete.tcl:190
+#, tcl-format
+msgid ""
+"One or more of the merge tests failed because you have not fetched the "
+"necessary commits.  Try fetching from %s first."
+msgstr ""
+"Um ou mais testes de integração falharam porque não obteve os commits "
+"necessários. Tente primeiro obter de %s."
+
+#: lib/remote_branch_delete.tcl:208
+msgid "Please select one or more branches to delete."
+msgstr "Selecione um ou mais ramos para eliminar."
+
+#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115
+msgid ""
+"Recovering deleted branches is difficult.\n"
+"\n"
+"Delete the selected branches?"
+msgstr ""
+"Recuperar ramos eliminados é difícil.\n"
+"\n"
+"Eliminar os ramos selecionado?"
+
+#: lib/remote_branch_delete.tcl:227
+#, tcl-format
+msgid "Deleting branches from %s"
+msgstr "A eliminar ramos de %s"
+
+#: lib/remote_branch_delete.tcl:300
+msgid "No repository selected."
+msgstr "Nenhum repositório selecionado."
+
+#: lib/remote_branch_delete.tcl:305
+#, tcl-format
+msgid "Scanning %s..."
+msgstr "A analisar %s..."
+
+#: lib/choose_repository.tcl:33
+msgid "Git Gui"
+msgstr "Git Gui"
+
+#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412
+msgid "Create New Repository"
+msgstr "Criar novo repositório"
+
+#: lib/choose_repository.tcl:98
+msgid "New..."
+msgstr "Novo..."
+
+#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496
+msgid "Clone Existing Repository"
+msgstr "Clonar repositório existente"
+
+#: lib/choose_repository.tcl:116
+msgid "Clone..."
+msgstr "Clonar..."
+
+#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064
+msgid "Open Existing Repository"
+msgstr "Abrir repositório existente"
+
+#: lib/choose_repository.tcl:129
+msgid "Open..."
+msgstr "Abrir..."
+
+#: lib/choose_repository.tcl:142
+msgid "Recent Repositories"
+msgstr "Repositórios recentes"
+
+#: lib/choose_repository.tcl:148
+msgid "Open Recent Repository:"
+msgstr "Abrir repositório recente:"
+
+#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323
+#: lib/choose_repository.tcl:330
+#, tcl-format
+msgid "Failed to create repository %s:"
+msgstr "Falha ao criar o repositório %s:"
+
+#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33
+msgid "Create"
+msgstr "Criar"
+
+#: lib/choose_repository.tcl:417
+msgid "Directory:"
+msgstr "Diretório:"
+
+#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573
+#: lib/choose_repository.tcl:1098
+msgid "Git Repository"
+msgstr "Repositório Git"
+
+#: lib/choose_repository.tcl:472
+#, tcl-format
+msgid "Directory %s already exists."
+msgstr "O diretório %s já existe."
+
+#: lib/choose_repository.tcl:476
+#, tcl-format
+msgid "File %s already exists."
+msgstr "O ficheiro %s já existe."
+
+#: lib/choose_repository.tcl:491
+msgid "Clone"
+msgstr "Clonar"
+
+#: lib/choose_repository.tcl:504
+msgid "Source Location:"
+msgstr "Localização de origem:"
+
+#: lib/choose_repository.tcl:513
+msgid "Target Directory:"
+msgstr "Diretório de destino:"
+
+#: lib/choose_repository.tcl:523
+msgid "Clone Type:"
+msgstr "Tipo de clone:"
+
+#: lib/choose_repository.tcl:528
+msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
+msgstr "Padrão (rápido, semi-redundante, ligações fixas)"
+
+#: lib/choose_repository.tcl:533
+msgid "Full Copy (Slower, Redundant Backup)"
+msgstr "Cópia Total (lento, cópia de segurança redundante)"
+
+#: lib/choose_repository.tcl:538
+msgid "Shared (Fastest, Not Recommended, No Backup)"
+msgstr "Partilhado (mais rápido, não recomendado, sem cópia)"
+
+#: lib/choose_repository.tcl:545
+msgid "Recursively clone submodules too"
+msgstr "Clonar recursivamente submódulos também"
+
+#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626
+#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842
+#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112
+#, tcl-format
+msgid "Not a Git repository: %s"
+msgstr "Não é um repositório Git: %s"
+
+#: lib/choose_repository.tcl:615
+msgid "Standard only available for local repository."
+msgstr "Padrão só disponível em repositórios locais."
+
+#: lib/choose_repository.tcl:619
+msgid "Shared only available for local repository."
+msgstr "Partilhado só disponível em repositórios locais."
+
+#: lib/choose_repository.tcl:640
+#, tcl-format
+msgid "Location %s already exists."
+msgstr "A localização %s já existe."
+
+#: lib/choose_repository.tcl:651
+msgid "Failed to configure origin"
+msgstr "Falha ao configurar origem"
+
+#: lib/choose_repository.tcl:663
+msgid "Counting objects"
+msgstr "A contar objetos"
+
+#: lib/choose_repository.tcl:664
+msgid "buckets"
+msgstr "baldes"
+
+#: lib/choose_repository.tcl:688
+#, tcl-format
+msgid "Unable to copy objects/info/alternates: %s"
+msgstr "Não é possível copiar objects/info/alternates: %s"
+
+#: lib/choose_repository.tcl:724
+#, tcl-format
+msgid "Nothing to clone from %s."
+msgstr "Nada para clonar de %s."
+
+#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940
+#: lib/choose_repository.tcl:952
+msgid "The 'master' branch has not been initialized."
+msgstr "O ramo 'master' não foi inicializado."
+
+#: lib/choose_repository.tcl:739
+msgid "Hardlinks are unavailable.  Falling back to copying."
+msgstr "Ligações fixas indisponíveis. A recorrer a cópia."
+
+#: lib/choose_repository.tcl:751
+#, tcl-format
+msgid "Cloning from %s"
+msgstr "A clonar de %s"
+
+#: lib/choose_repository.tcl:782
+msgid "Copying objects"
+msgstr "A copiar objetos"
+
+#: lib/choose_repository.tcl:783
+msgid "KiB"
+msgstr "KiB"
+
+#: lib/choose_repository.tcl:807
+#, tcl-format
+msgid "Unable to copy object: %s"
+msgstr "Não é possível copiar objeto: %s"
+
+#: lib/choose_repository.tcl:817
+msgid "Linking objects"
+msgstr "A ligar objetos"
+
+#: lib/choose_repository.tcl:818
+msgid "objects"
+msgstr "objetos"
+
+#: lib/choose_repository.tcl:826
+#, tcl-format
+msgid "Unable to hardlink object: %s"
+msgstr "Não é possível criar ligação fixa de objeto: %s"
+
+#: lib/choose_repository.tcl:881
+msgid "Cannot fetch branches and objects.  See console output for details."
+msgstr ""
+"Não é possível obter ramos e objetos. Ver saída na consola para detalhes."
+
+#: lib/choose_repository.tcl:892
+msgid "Cannot fetch tags.  See console output for details."
+msgstr "Não é possível obter tags. Ver saída na consola para detalhes."
+
+#: lib/choose_repository.tcl:916
+msgid "Cannot determine HEAD.  See console output for details."
+msgstr "Não é possível determinar HEAD. Ver saída na consola para detalhes."
+
+#: lib/choose_repository.tcl:925
+#, tcl-format
+msgid "Unable to cleanup %s"
+msgstr "Não foi possível limpar %s"
+
+#: lib/choose_repository.tcl:931
+msgid "Clone failed."
+msgstr "Falha ao clonar."
+
+#: lib/choose_repository.tcl:938
+msgid "No default branch obtained."
+msgstr "Não foi obtido nenhum ramo predefinido."
+
+#: lib/choose_repository.tcl:949
+#, tcl-format
+msgid "Cannot resolve %s as a commit."
+msgstr "Não é possível resolver %s como um commit."
+
+#: lib/choose_repository.tcl:961
+msgid "Creating working directory"
+msgstr "A criar diretório de trabalho"
+
+#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136
+#: lib/index.tcl:207
+msgid "files"
+msgstr "ficheiros"
+
+#: lib/choose_repository.tcl:981
+msgid "Cannot clone submodules."
+msgstr "Não é possível clonar submódulos."
+
+#: lib/choose_repository.tcl:990
+msgid "Cloning submodules"
+msgstr "A clonar submódulos"
+
+#: lib/choose_repository.tcl:1015
+msgid "Initial file checkout failed."
+msgstr "Falha de extração inicial de ficheiro."
+
+#: lib/choose_repository.tcl:1059
+msgid "Open"
+msgstr "Abrir"
+
+#: lib/choose_repository.tcl:1069
+msgid "Repository:"
+msgstr "Repositório:"
+
+#: lib/choose_repository.tcl:1118
+#, tcl-format
+msgid "Failed to open repository %s:"
+msgstr "Falha ao abrir o repositório %s:"
+
+#: lib/about.tcl:26
+msgid "git-gui - a graphical user interface for Git."
+msgstr "git-gui - uma interface gráfica do Git."
+
+#: lib/blame.tcl:73
+msgid "File Viewer"
+msgstr "Visualizador de ficheiros"
+
+#: lib/blame.tcl:79
+msgid "Commit:"
+msgstr "Commit:"
+
+#: lib/blame.tcl:280
+msgid "Copy Commit"
+msgstr "Copiar commit"
+
+#: lib/blame.tcl:284
+msgid "Find Text..."
+msgstr "Procurar texto..."
+
+#: lib/blame.tcl:288
+msgid "Goto Line..."
+msgstr "Ir para a linha..."
+
+#: lib/blame.tcl:297
+msgid "Do Full Copy Detection"
+msgstr "Efetuar deteção de cópia integral"
+
+#: lib/blame.tcl:301
+msgid "Show History Context"
+msgstr "Mostrar contexto histórico"
+
+#: lib/blame.tcl:304
+msgid "Blame Parent Commit"
+msgstr "Culpar commit pai"
+
+#: lib/blame.tcl:466
+#, tcl-format
+msgid "Reading %s..."
+msgstr "A ler %s..."
+
+#: lib/blame.tcl:594
+msgid "Loading copy/move tracking annotations..."
+msgstr "A carregar anotações de cópia/movimento..."
+
+#: lib/blame.tcl:614
+msgid "lines annotated"
+msgstr "linhas anotadas"
+
+#: lib/blame.tcl:806
+msgid "Loading original location annotations..."
+msgstr "A carregar anotações da localização original..."
+
+#: lib/blame.tcl:809
+msgid "Annotation complete."
+msgstr "Anotação concluída."
+
+#: lib/blame.tcl:839
+msgid "Busy"
+msgstr "A processar"
+
+#: lib/blame.tcl:840
+msgid "Annotation process is already running."
+msgstr "O processo de anotação já está em execução."
+
+#: lib/blame.tcl:879
+msgid "Running thorough copy detection..."
+msgstr "A executar deteção de cópia integral..."
+
+#: lib/blame.tcl:947
+msgid "Loading annotation..."
+msgstr "A carregar anotação..."
+
+#: lib/blame.tcl:1000
+msgid "Author:"
+msgstr "Autor:"
+
+#: lib/blame.tcl:1004
+msgid "Committer:"
+msgstr "Committer:"
+
+#: lib/blame.tcl:1009
+msgid "Original File:"
+msgstr "Ficheiro original:"
+
+#: lib/blame.tcl:1057
+msgid "Cannot find HEAD commit:"
+msgstr "Não é possível encontrar commit HEAD:"
+
+#: lib/blame.tcl:1112
+msgid "Cannot find parent commit:"
+msgstr "Não é possível encontrar commit pai:"
+
+#: lib/blame.tcl:1127
+msgid "Unable to display parent"
+msgstr "Não é possível mostrar pai"
+
+#: lib/blame.tcl:1269
+msgid "Originally By:"
+msgstr "Originalmente por:"
+
+#: lib/blame.tcl:1275
+msgid "In File:"
+msgstr "No ficheiro:"
+
+#: lib/blame.tcl:1280
+msgid "Copied Or Moved Here By:"
+msgstr "Copiado ou Movido para aqui por:"
+
+#: lib/sshkey.tcl:31
+msgid "No keys found."
+msgstr "Nenhum chave encontrada."
+
+#: lib/sshkey.tcl:34
+#, tcl-format
+msgid "Found a public key in: %s"
+msgstr "Chave pública encontrada em: %s"
+
+#: lib/sshkey.tcl:40
+msgid "Generate Key"
+msgstr "Gerar chave"
+
+#: lib/sshkey.tcl:58
+msgid "Copy To Clipboard"
+msgstr "Copiar para a área de transferência"
+
+#: lib/sshkey.tcl:72
+msgid "Your OpenSSH Public Key"
+msgstr "A sua chave OpenSSH pública"
+
+#: lib/sshkey.tcl:80
+msgid "Generating..."
+msgstr "A gerar..."
+
+#: lib/sshkey.tcl:86
+#, tcl-format
+msgid ""
+"Could not start ssh-keygen:\n"
+"\n"
+"%s"
+msgstr ""
+"Não foi possível iniciar ssh-keygen:\n"
+"\n"
+"%s"
+
+#: lib/sshkey.tcl:113
+msgid "Generation failed."
+msgstr "Falha ao gerar."
+
+#: lib/sshkey.tcl:120
+msgid "Generation succeeded, but no keys found."
+msgstr "Gerada com sucesso, mas não foi encontrada nenhum chave."
+
+#: lib/sshkey.tcl:123
+#, tcl-format
+msgid "Your key is in: %s"
+msgstr "A sua chave encontra-se em: %s"
+
+#: lib/branch_create.tcl:23
+msgid "Create Branch"
+msgstr "Criar ramo"
+
+#: lib/branch_create.tcl:28
+msgid "Create New Branch"
+msgstr "Cria novo ramo"
+
+#: lib/branch_create.tcl:42
+msgid "Branch Name"
+msgstr "Nome do ramo"
+
+#: lib/branch_create.tcl:57
+msgid "Match Tracking Branch Name"
+msgstr "Corresponder ao nome do ramo de monitorização"
+
+#: lib/branch_create.tcl:66
+msgid "Starting Revision"
+msgstr "Revisão inicial"
+
+#: lib/branch_create.tcl:72
+msgid "Update Existing Branch:"
+msgstr "Atualizar ramo existente:"
+
+#: lib/branch_create.tcl:75
+msgid "No"
+msgstr "Não"
+
+#: lib/branch_create.tcl:80
+msgid "Fast Forward Only"
+msgstr "Apenas avanço rápido (fast-forward)"
+
+#: lib/branch_create.tcl:97
+msgid "Checkout After Creation"
+msgstr "Extrair depois de criar"
+
+#: lib/branch_create.tcl:132
+msgid "Please select a tracking branch."
+msgstr "Selecione um ramo de monitorização."
+
+#: lib/branch_create.tcl:141
+#, tcl-format
+msgid "Tracking branch %s is not a branch in the remote repository."
+msgstr "O ramo de monitorização %s não é um ramo no repositório remoto."
+
+#: lib/commit.tcl:9
+msgid ""
+"There is nothing to amend.\n"
+"\n"
+"You are about to create the initial commit.  There is no commit before this "
+"to amend.\n"
+msgstr ""
+"Não há nada para emendar.\n"
+"\n"
+"Está prestes a criar o commit inicial. Não há nenhum commit antes deste para "
+"emendar.\n"
+
+#: lib/commit.tcl:18
+msgid ""
+"Cannot amend while merging.\n"
+"\n"
+"You are currently in the middle of a merge that has not been fully "
+"completed.  You cannot amend the prior commit unless you first abort the "
+"current merge activity.\n"
+msgstr ""
+"Não é possível emendar ao mesmo tempo que se integra.\n"
+"\n"
+"Há uma integração em curso que não foi concluída. Não pode emendar o commit "
+"anterior a não ser que primeiro aborte a atividade da integração atual.\n"
+
+#: lib/commit.tcl:48
+msgid "Error loading commit data for amend:"
+msgstr "Erro ao carregar dados do commit para emendar:"
+
+#: lib/commit.tcl:75
+msgid "Unable to obtain your identity:"
+msgstr "Não é possível obter a sua identidade:"
+
+#: lib/commit.tcl:80
+msgid "Invalid GIT_COMMITTER_IDENT:"
+msgstr "GIT_COMMITTER_IDENT inválido:"
+
+#: lib/commit.tcl:129
+#, tcl-format
+msgid "warning: Tcl does not support encoding '%s'."
+msgstr "aviso: Tcl não suporta a codificação '%s'."
+
+#: lib/commit.tcl:149
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before another commit can be created.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"O último estado analisado não corresponde ao estado do repositório.\n"
+"\n"
+"Outro programa Git modificou este repositório deste a última análise. Deve-"
+"se reanalisar antes que se possa criar outro commit.\n"
+"\n"
+"Irá-se reanalisar automaticamente agora.\n"
+
+#: lib/commit.tcl:173
+#, tcl-format
+msgid ""
+"Unmerged files cannot be committed.\n"
+"\n"
+"File %s has merge conflicts.  You must resolve them and stage the file "
+"before committing.\n"
+msgstr ""
+"Não pode fazer commit de ficheiros não integrados.\n"
+"\n"
+"O ficheiro %s tem conflitos de integração. Deve resolvê-los e preparar o "
+"ficheiro antes de submeter.\n"
+
+#: lib/commit.tcl:181
+#, tcl-format
+msgid ""
+"Unknown file state %s detected.\n"
+"\n"
+"File %s cannot be committed by this program.\n"
+msgstr ""
+"Detetado estado de ficheiro %s desconhecido.\n"
+"\n"
+"Este programa não pode submeter o ficheiro %s.\n"
+
+#: lib/commit.tcl:189
+msgid ""
+"No changes to commit.\n"
+"\n"
+"You must stage at least 1 file before you can commit.\n"
+msgstr ""
+"Nenhum alteração para submeter.\n"
+"\n"
+"Deve preparar pelo menos 1 ficheiro antes de submeter.\n"
+
+#: lib/commit.tcl:204
+msgid ""
+"Please supply a commit message.\n"
+"\n"
+"A good commit message has the following format:\n"
+"\n"
+"- First line: Describe in one sentence what you did.\n"
+"- Second line: Blank\n"
+"- Remaining lines: Describe why this change is good.\n"
+msgstr ""
+"Forneça uma mensagem de commit.\n"
+"\n"
+"Um boa mensagem de commit tem o seguinte formato:\n"
+"\n"
+"- Primeira linha: descreve numa frase o que fez.\n"
+"- Segunda linha: em branco.\n"
+"- Linhas restantes: descreve porque esta alteração é vantajosa.\n"
+
+#: lib/commit.tcl:235
+msgid "Calling pre-commit hook..."
+msgstr "A invocar gancho de pré-commit (pre-commit hook)..."
+
+#: lib/commit.tcl:250
+msgid "Commit declined by pre-commit hook."
+msgstr "Commit recusado pela retina de pré-commit (pre-commit hook)."
+
+#: lib/commit.tcl:269
+msgid ""
+"You are about to commit on a detached head. This is a potentially dangerous "
+"thing to do because if you switch to another branch you will lose your "
+"changes and it can be difficult to retrieve them later from the reflog. You "
+"should probably cancel this commit and create a new branch to continue.\n"
+" \n"
+" Do you really want to proceed with your Commit?"
+msgstr ""
+"Está prestes a submeter numa cabeça destacada. Fazê-lo é potencialmente "
+"perigoso, porque, se mudar para outro ramo, perderá as suas alterações e "
+"pode ser difícil recuperá-las do reflog posteriormente. Provavelmente deve "
+"cancelar este commit e criar um novo ramo para continuar.\n"
+"\n"
+"Pretende mesmo continuar com o commit?"
+
+#: lib/commit.tcl:290
+msgid "Calling commit-msg hook..."
+msgstr "A invocar gancho de mensagem-de-commit (commit-msg hook)..."
+
+#: lib/commit.tcl:305
+msgid "Commit declined by commit-msg hook."
+msgstr "Commit recusado pelo gancho de mensagem-de-commit (commit-msg hook)."
+
+#: lib/commit.tcl:318
+msgid "Committing changes..."
+msgstr "A submeter alterações..."
+
+#: lib/commit.tcl:334
+msgid "write-tree failed:"
+msgstr "write-tree falhou:"
+
+#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400
+msgid "Commit failed."
+msgstr "Falha ao submeter."
+
+#: lib/commit.tcl:352
+#, tcl-format
+msgid "Commit %s appears to be corrupt"
+msgstr "O commit %s parece estar corrompido"
+
+#: lib/commit.tcl:357
+msgid ""
+"No changes to commit.\n"
+"\n"
+"No files were modified by this commit and it was not a merge commit.\n"
+"\n"
+"A rescan will be automatically started now.\n"
+msgstr ""
+"Não há alterações para submeter.\n"
+"\n"
+"Nenhum ficheiro foi modificado por este commit e não era um commit de "
+"integração.\n"
+"\n"
+"Irá-se reanalisar agora automaticamente.\n"
+
+#: lib/commit.tcl:364
+msgid "No changes to commit."
+msgstr "Não há alterações para submeter."
+
+#: lib/commit.tcl:378
+msgid "commit-tree failed:"
+msgstr "commit-tree falhou:"
+
+#: lib/commit.tcl:399
+msgid "update-ref failed:"
+msgstr "update-ref falhou:"
+
+#: lib/commit.tcl:492
+#, tcl-format
+msgid "Created commit %s: %s"
+msgstr "Commit %s criado: %s"
+
+#: lib/branch_delete.tcl:16
+msgid "Delete Branch"
+msgstr "Eliminar ramo"
+
+#: lib/branch_delete.tcl:21
+msgid "Delete Local Branch"
+msgstr "Eliminar ramo local"
+
+#: lib/branch_delete.tcl:39
+msgid "Local Branches"
+msgstr "Ramos locais"
+
+#: lib/branch_delete.tcl:51
+msgid "Delete Only If Merged Into"
+msgstr "Eliminar só se foi integrado"
+
+#: lib/branch_delete.tcl:103
+#, tcl-format
+msgid "The following branches are not completely merged into %s:"
+msgstr "Os seguintes ramos não foram completamente integrados em %s:"
+
+#: lib/branch_delete.tcl:141
+#, tcl-format
+msgid ""
+"Failed to delete branches:\n"
+"%s"
+msgstr ""
+"Falha ao eliminar ramos:\n"
+"%s"
+
+#: lib/index.tcl:6
+msgid "Unable to unlock the index."
+msgstr "Não é possível desbloquear o índice."
+
+#: lib/index.tcl:17
+msgid "Index Error"
+msgstr "Erro de Índice"
+
+#: lib/index.tcl:19
+msgid ""
+"Updating the Git index failed.  A rescan will be automatically started to "
+"resynchronize git-gui."
+msgstr ""
+"Falha ao atualizar o índice do Git. Irá-se reanalisar automaticamente para "
+"ressincronizar o git-gui."
+
+#: lib/index.tcl:30
+msgid "Continue"
+msgstr "Continuar"
+
+#: lib/index.tcl:33
+msgid "Unlock Index"
+msgstr "Desbloquear índice"
+
+#: lib/index.tcl:294
+msgid "Unstaging selected files from commit"
+msgstr "A retirar ficheiros selecionados do commit"
+
+#: lib/index.tcl:298
+#, tcl-format
+msgid "Unstaging %s from commit"
+msgstr "A retirar %s do commit"
+
+#: lib/index.tcl:337
+msgid "Ready to commit."
+msgstr "Pronto para submeter."
+
+#: lib/index.tcl:346
+msgid "Adding selected files"
+msgstr "A adicionar ficheiros selecionados"
+
+#: lib/index.tcl:350
+#, tcl-format
+msgid "Adding %s"
+msgstr "A adicionar %s"
+
+#: lib/index.tcl:380
+#, tcl-format
+msgid "Stage %d untracked files?"
+msgstr "Preparar %d ficheiros não controlados?"
+
+#: lib/index.tcl:388
+msgid "Adding all changed files"
+msgstr "A adicionar todos os ficheiros controlados"
+
+#: lib/index.tcl:428
+#, tcl-format
+msgid "Revert changes in file %s?"
+msgstr "Reverter alterações no ficheiro %s?"
+
+#: lib/index.tcl:430
+#, tcl-format
+msgid "Revert changes in these %i files?"
+msgstr "Reverter alterações nestes %i ficheiros?"
+
+#: lib/index.tcl:438
+msgid "Any unstaged changes will be permanently lost by the revert."
+msgstr ""
+"Qualquer alteração não preparada será permanentemente perdida ao reverter."
+
+#: lib/index.tcl:441
+msgid "Do Nothing"
+msgstr "Não fazer nada"
+
+#: lib/index.tcl:459
+msgid "Reverting selected files"
+msgstr "A reverter ficheiros selecionados"
+
+#: lib/index.tcl:463
+#, tcl-format
+msgid "Reverting %s"
+msgstr "A reverter %s"
+
+#: lib/encoding.tcl:443
+msgid "Default"
+msgstr "Predefinição"
+
+#: lib/encoding.tcl:448
+#, tcl-format
+msgid "System (%s)"
+msgstr "Sistema (%s)"
+
+#: lib/encoding.tcl:459 lib/encoding.tcl:465
+msgid "Other"
+msgstr "Outro"
+
+#: lib/date.tcl:25
+#, tcl-format
+msgid "Invalid date from Git: %s"
+msgstr "Data do Git inválida: %s"
+
+#: lib/choose_rev.tcl:52
+msgid "This Detached Checkout"
+msgstr "Esta extração destacada"
+
+#: lib/choose_rev.tcl:60
+msgid "Revision Expression:"
+msgstr "Expressão de revisão:"
+
+#: lib/choose_rev.tcl:72
+msgid "Local Branch"
+msgstr "Ramo local"
+
+#: lib/choose_rev.tcl:77
+msgid "Tracking Branch"
+msgstr "Ramo de monitorização"
+
+#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
+msgid "Tag"
+msgstr "Tag"
+
+#: lib/choose_rev.tcl:321
+#, tcl-format
+msgid "Invalid revision: %s"
+msgstr "Revisão inválida: %s"
+
+#: lib/choose_rev.tcl:342
+msgid "No revision selected."
+msgstr "Nenhum revisão selecionada."
+
+#: lib/choose_rev.tcl:350
+msgid "Revision expression is empty."
+msgstr "A expressão de revisão está vazia."
+
+#: lib/choose_rev.tcl:537
+msgid "Updated"
+msgstr "Atualizado"
+
+#: lib/choose_rev.tcl:565
+msgid "URL"
+msgstr "URL"
+
+#: lib/database.tcl:42
+msgid "Number of loose objects"
+msgstr "Número de objetos soltos"
+
+#: lib/database.tcl:43
+msgid "Disk space used by loose objects"
+msgstr "Espaço em disco usados por objetos soltos"
+
+#: lib/database.tcl:44
+msgid "Number of packed objects"
+msgstr "Número de objetos compactados"
+
+#: lib/database.tcl:45
+msgid "Number of packs"
+msgstr "Números de pacotes"
+
+#: lib/database.tcl:46
+msgid "Disk space used by packed objects"
+msgstr "Espaço em disco usado por objetos compactados"
+
+#: lib/database.tcl:47
+msgid "Packed objects waiting for pruning"
+msgstr "Objetos compactados à espera de poda"
+
+#: lib/database.tcl:48
+msgid "Garbage files"
+msgstr "Ficheiros de lixo"
+
+#: lib/database.tcl:72
+msgid "Compressing the object database"
+msgstr "A comprimir a base de dados de objetos"
+
+#: lib/database.tcl:83
+msgid "Verifying the object database with fsck-objects"
+msgstr "A verificar a base de dados de objetos com fsck-objects"
+
+#: lib/database.tcl:107
+#, tcl-format
+msgid ""
+"This repository currently has approximately %i loose objects.\n"
+"\n"
+"To maintain optimal performance it is strongly recommended that you compress "
+"the database.\n"
+"\n"
+"Compress the database now?"
+msgstr ""
+"Este repositório tem aproximadamente %i objetos soltos.\n"
+"\n"
+"Para manter o desempenho ótimo é veemente recomendado que comprima a base de "
+"dados.\n"
+"\n"
+"Comprimir a base de dados agora?"
+
+#: lib/error.tcl:20 lib/error.tcl:116
+msgid "error"
+msgstr "erro"
+
+#: lib/error.tcl:36
+msgid "warning"
+msgstr "aviso"
+
+#: lib/error.tcl:96
+msgid "You must correct the above errors before committing."
+msgstr "Deve corrigir os erros acima antes de submeter."
+
+#: lib/merge.tcl:13
+msgid ""
+"Cannot merge while amending.\n"
+"\n"
+"You must finish amending this commit before starting any type of merge.\n"
+msgstr ""
+"Não possível integrar ao mesmo tempo que se emenda.\n"
+"\n"
+"Deve acabar de emendar este commit antes de iniciar qualquer tipo de "
+"integração.\n"
+
+#: lib/merge.tcl:27
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan.  A "
+"rescan must be performed before a merge can be performed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"O último estado analisado não corresponde ao estado do repositório.\n"
+"\n"
+"Outro programa Git modificou este repositório deste a última análise. Deve-"
+"se reanalisar antes de se poder integrar.\n"
+"\n"
+"Irá-se reanalisar agora automaticamente.\n"
+
+#: lib/merge.tcl:45
+#, tcl-format
+msgid ""
+"You are in the middle of a conflicted merge.\n"
+"\n"
+"File %s has merge conflicts.\n"
+"\n"
+"You must resolve them, stage the file, and commit to complete the current "
+"merge.  Only then can you begin another merge.\n"
+msgstr ""
+"Integração com conflitos em curso.\n"
+"\n"
+"O ficheiro %s tem conflitos de integração.\n"
+"\n"
+"Deve resolvê-los, preparar o ficheiro e submeter para concluir a integração "
+"atual. Só então pode iniciar outra integração.\n"
+
+#: lib/merge.tcl:55
+#, tcl-format
+msgid ""
+"You are in the middle of a change.\n"
+"\n"
+"File %s is modified.\n"
+"\n"
+"You should complete the current commit before starting a merge.  Doing so "
+"will help you abort a failed merge, should the need arise.\n"
+msgstr ""
+"Tem alterações presentes.\n"
+"\n"
+"O ficheiro %s foi modificado.\n"
+"\n"
+"Deve concluir o commit atual antes de iniciar uma integração. Assim, ajuda-o "
+"a abortar uma integração falhada, caso necessário.\n"
+
+#: lib/merge.tcl:108
+#, tcl-format
+msgid "%s of %s"
+msgstr "%s de %s"
+
+#: lib/merge.tcl:122
+#, tcl-format
+msgid "Merging %s and %s..."
+msgstr "A integrar %s e %s..."
+
+#: lib/merge.tcl:133
+msgid "Merge completed successfully."
+msgstr "Integração concluída com sucesso."
+
+#: lib/merge.tcl:135
+msgid "Merge failed.  Conflict resolution is required."
+msgstr "Integração falhada. É necessário resolver conflitos."
+
+#: lib/merge.tcl:160
+#, tcl-format
+msgid "Merge Into %s"
+msgstr "Integrar em %s"
+
+#: lib/merge.tcl:179
+msgid "Revision To Merge"
+msgstr "Revisão a integrar"
+
+#: lib/merge.tcl:214
+msgid ""
+"Cannot abort while amending.\n"
+"\n"
+"You must finish amending this commit.\n"
+msgstr ""
+"Não é possível abortar enquanto se emenda.\n"
+"\n"
+"Deve acabar de emendar este commit.\n"
+
+#: lib/merge.tcl:224
+msgid ""
+"Abort merge?\n"
+"\n"
+"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with aborting the current merge?"
+msgstr ""
+"Abortar integração?\n"
+"\n"
+"Ao abortar a integração atual perderá *TODAS* as alteração que não foram "
+"submetidas.\n"
+"\n"
+"Continuar a abortar a integração atual?"
+
+#: lib/merge.tcl:230
+msgid ""
+"Reset changes?\n"
+"\n"
+"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with resetting the current changes?"
+msgstr ""
+"Repor alterações?\n"
+"\n"
+"Ao repor as alterações perderá *TODAS* as alterações não submetidas.\n"
+"\n"
+"Continuar a repor as alterações atuais?"
+
+#: lib/merge.tcl:241
+msgid "Aborting"
+msgstr "A abortar"
+
+#: lib/merge.tcl:241
+msgid "files reset"
+msgstr "ficheiros repostos"
+
+#: lib/merge.tcl:269
+msgid "Abort failed."
+msgstr "Falha ao abortar."
+
+#: lib/merge.tcl:271
+msgid "Abort completed.  Ready."
+msgstr "Aborto concluído. Pronto."
+
+#~ msgid "Displaying only %s of %s files."
+#~ msgstr "A mostrar apenas %s de %s ficheiros."
+
+#~ msgid "Case-Sensitive"
+#~ msgstr "Distinguir Maiúsculas"
index ca4343b40cd9a166fc9c3526d68b6182057e71a3..9f5305c43eeb75c0e1b672efebe6a5aedca1a6ca 100644 (file)
@@ -1,19 +1,22 @@
 # Translation of git-gui to russian
 # Copyright (C) 2007 Shawn Pearce
 # This file is distributed under the same license as the git-gui package.
-# Irina Riesen <irina.riesen@gmail.com>, 2007.
-#
+# Translators:
+# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016
+# Irina Riesen <irina.riesen@gmail.com>, 2007
 msgid ""
 msgstr ""
-"Project-Id-Version: git-gui\n"
+"Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-01-26 15:47-0800\n"
-"PO-Revision-Date: 2007-10-22 22:30-0200\n"
-"Last-Translator: Alex Riesen <raa.lkml@gmail.com>\n"
-"Language-Team: Russian Translation <git@vger.kernel.org>\n"
+"PO-Revision-Date: 2016-06-30 12:39+0000\n"
+"Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
+"Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 
 #: git-gui.sh:41 git-gui.sh:793 git-gui.sh:807 git-gui.sh:820 git-gui.sh:903
 #: git-gui.sh:922
@@ -51,14 +54,7 @@ msgid ""
 "%s requires at least Git 1.5.0 or later.\n"
 "\n"
 "Assume '%s' is version 1.5.0?\n"
-msgstr ""
-"Невозможно определить версию Git\n"
-"\n"
-"%s указывает на версию '%s'.\n"
-"\n"
-"для %s требуется версия Git, начиная с 1.5.0\n"
-"\n"
-"Принять '%s' как версию 1.5.0?\n"
+msgstr "Невозможно определить версию Git\n\n%s указывает на версию «%s».\n\nдля %s требуется версия Git, начиная с 1.5.0\n\nПредположить, что «%s» и есть версия 1.5.0?\n"
 
 #: git-gui.sh:1128
 msgid "Git directory not found:"
@@ -78,20 +74,19 @@ msgstr "Отсутствует рабочий каталог"
 
 #: git-gui.sh:1334 lib/checkout_op.tcl:306
 msgid "Refreshing file status..."
-msgstr "Обновление информации о состоянии файлов..."
+msgstr "Обновление информации о состоянии файлов"
 
 #: git-gui.sh:1390
 msgid "Scanning for modified files ..."
-msgstr "Поиск измененных файлов..."
+msgstr "Поиск измененных файлов"
 
 #: git-gui.sh:1454
 msgid "Calling prepare-commit-msg hook..."
-msgstr "Вызов программы поддержки репозитория prepare-commit-msg..."
+msgstr "Вызов перехватчика prepare-commit-msg…"
 
 #: git-gui.sh:1471
 msgid "Commit declined by prepare-commit-msg hook."
-msgstr ""
-"Сохранение прервано программой поддержки репозитория prepare-commit-msg"
+msgstr "Коммит прерван перехватчиком prepare-commit-msg."
 
 #: git-gui.sh:1629 lib/browser.tcl:246
 msgid "Ready."
@@ -108,31 +103,31 @@ msgstr "Не изменено"
 
 #: git-gui.sh:1915
 msgid "Modified, not staged"
-msgstr "Ð\98зменено, Ð½Ðµ Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овлено"
+msgstr "Ð\98зменено, Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е"
 
 #: git-gui.sh:1916 git-gui.sh:1924
 msgid "Staged for commit"
-msgstr "Ð\9fодгоÑ\82овлено Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "Ð\92 Ð¸Ð½Ð´ÐµÐºÑ\81е Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
 #: git-gui.sh:1917 git-gui.sh:1925
 msgid "Portions staged for commit"
-msgstr "ЧаÑ\81Ñ\82и, Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овленнÑ\8bе Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "ЧаÑ\81Ñ\82и, Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
 #: git-gui.sh:1918 git-gui.sh:1926
 msgid "Staged for commit, missing"
-msgstr "Ð\9fодгоÑ\82овлено Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f, отсутствует"
+msgstr "Ð\92 Ð¸Ð½Ð´ÐµÐºÑ\81е Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а, отсутствует"
 
 #: git-gui.sh:1920
 msgid "File type changed, not staged"
-msgstr "Тип Ñ\84айла Ð¸Ð·Ð¼ÐµÐ½Ñ\91н, Ð½Ðµ Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овлено"
+msgstr "Тип Ñ\84айла Ð¸Ð·Ð¼ÐµÐ½Ñ\91н, Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е"
 
 #: git-gui.sh:1921
 msgid "File type changed, staged"
-msgstr "Тип Ñ\84айла Ð¸Ð·Ð¼ÐµÐ½Ñ\91н, Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овлено"
+msgstr "Тип Ñ\84айла Ð¸Ð·Ð¼ÐµÐ½Ñ\91н, Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е"
 
 #: git-gui.sh:1923
 msgid "Untracked, not staged"
-msgstr "Ð\9dе Ð¾Ñ\82Ñ\81леживаеÑ\82Ñ\81Ñ\8f, Ð½Ðµ Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овлено"
+msgstr "Ð\9dе Ð¾Ñ\82Ñ\81леживаеÑ\82Ñ\81Ñ\8f, Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е"
 
 #: git-gui.sh:1928
 msgid "Missing"
@@ -140,11 +135,11 @@ msgstr "Отсутствует"
 
 #: git-gui.sh:1929
 msgid "Staged for removal"
-msgstr "Ð\9fодгоÑ\82овлено для удаления"
+msgstr "Ð\92 Ð¸Ð½Ð´ÐµÐºÑ\81е для удаления"
 
 #: git-gui.sh:1930
 msgid "Staged for removal, still present"
-msgstr "Ð\9fодгоÑ\82овлено для удаления, еще не удалено"
+msgstr "Ð\92 Ð¸Ð½Ð´ÐµÐºÑ\81е для удаления, еще не удалено"
 
 #: git-gui.sh:1932 git-gui.sh:1933 git-gui.sh:1934 git-gui.sh:1935
 #: git-gui.sh:1936 git-gui.sh:1937
@@ -153,7 +148,7 @@ msgstr "Требуется разрешение конфликта при сли
 
 #: git-gui.sh:1972
 msgid "Starting gitk... please wait..."
-msgstr "Запускается gitk... Подождите, пожалуйста..."
+msgstr "Запускается gitk… Подождите, пожалуйста…"
 
 #: git-gui.sh:1984
 msgid "Couldn't find gitk in PATH"
@@ -173,11 +168,11 @@ msgstr "Редактировать"
 
 #: git-gui.sh:2458 lib/choose_rev.tcl:561
 msgid "Branch"
-msgstr "Ð\92еÑ\82вÑ\8c"
+msgstr "Ð\92еÑ\82ка"
 
 #: git-gui.sh:2461 lib/choose_rev.tcl:548
 msgid "Commit@@noun"
-msgstr "СоÑ\81Ñ\82оÑ\8fние"
+msgstr "Ð\9aоммиÑ\82"
 
 #: git-gui.sh:2464 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
 msgid "Merge"
@@ -197,29 +192,29 @@ msgstr "Просмотр рабочего каталога"
 
 #: git-gui.sh:2483
 msgid "Browse Current Branch's Files"
-msgstr "Ð\9fÑ\80оÑ\81моÑ\82Ñ\80еÑ\82Ñ\8c Ñ\84айлÑ\8b Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\82ви"
+msgstr "Ð\9fÑ\80оÑ\81моÑ\82Ñ\80еÑ\82Ñ\8c Ñ\84айлÑ\8b Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\82ки"
 
 #: git-gui.sh:2487
 msgid "Browse Branch Files..."
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ñ\84айлÑ\8b Ð²ÐµÑ\82ви..."
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ñ\84айлÑ\8b Ð²ÐµÑ\82киâ\80¦"
 
 #: git-gui.sh:2492
 msgid "Visualize Current Branch's History"
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\82ви"
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\82ки"
 
 #: git-gui.sh:2496
 msgid "Visualize All Branch History"
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ð²Ñ\81еÑ\85 Ð²ÐµÑ\82вей"
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ð²Ñ\81еÑ\85 Ð²ÐµÑ\82ок"
 
 #: git-gui.sh:2503
 #, tcl-format
 msgid "Browse %s's Files"
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ñ\84айлÑ\8b Ð²ÐµÑ\82ви %s"
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ñ\84айлÑ\8b Ð²ÐµÑ\82ки %s"
 
 #: git-gui.sh:2505
 #, tcl-format
 msgid "Visualize %s's History"
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ð²ÐµÑ\82ви %s"
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ð²ÐµÑ\82ки %s"
 
 #: git-gui.sh:2510 lib/database.tcl:27 lib/database.tcl:67
 msgid "Database Statistics"
@@ -274,23 +269,23 @@ msgstr "Выделить все"
 
 #: git-gui.sh:2576
 msgid "Create..."
-msgstr "Создать..."
+msgstr "Создать"
 
 #: git-gui.sh:2582
 msgid "Checkout..."
-msgstr "Перейти..."
+msgstr "Перейти"
 
 #: git-gui.sh:2588
 msgid "Rename..."
-msgstr "Переименовать..."
+msgstr "Переименовать"
 
 #: git-gui.sh:2593
 msgid "Delete..."
-msgstr "Удалить..."
+msgstr "Удалить"
 
 #: git-gui.sh:2598
 msgid "Reset..."
-msgstr "Сбросить..."
+msgstr "Сбросить"
 
 #: git-gui.sh:2608
 msgid "Done"
@@ -298,15 +293,15 @@ msgstr "Завершено"
 
 #: git-gui.sh:2610
 msgid "Commit@@verb"
-msgstr "СоÑ\85Ñ\80анить"
+msgstr "Ð\97акоммиÑ\82ить"
 
 #: git-gui.sh:2619 git-gui.sh:3050
 msgid "New Commit"
-msgstr "Новое состояние"
+msgstr "Новый коммит"
 
 #: git-gui.sh:2627 git-gui.sh:3057
 msgid "Amend Last Commit"
-msgstr "Ð\98Ñ\81пÑ\80авиÑ\82Ñ\8c Ð¿Ð¾Ñ\81леднее Ñ\81оÑ\81Ñ\82оÑ\8fние"
+msgstr "Ð\98Ñ\81пÑ\80авиÑ\82Ñ\8c Ð¿Ð¾Ñ\81ледний ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82"
 
 #: git-gui.sh:2637 git-gui.sh:3011 lib/remote_branch_delete.tcl:99
 msgid "Rescan"
@@ -314,19 +309,19 @@ msgstr "Перечитать"
 
 #: git-gui.sh:2643
 msgid "Stage To Commit"
-msgstr "Ð\9fодгоÑ\82овиÑ\82Ñ\8c Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "Ð\94обавиÑ\82Ñ\8c Ð² Ð¸Ð½Ð´ÐµÐºÑ\81"
 
 #: git-gui.sh:2649
 msgid "Stage Changed Files To Commit"
-msgstr "Ð\9fодгоÑ\82овиÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ\8bе Ñ\84айлÑ\8b Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "Ð\94обавиÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½Ñ\91ннÑ\8bе Ñ\84айлÑ\8b Ð² Ð¸Ð½Ð´ÐµÐºÑ\81"
 
 #: git-gui.sh:2655
 msgid "Unstage From Commit"
-msgstr "УбÑ\80аÑ\82Ñ\8c Ð¸Ð· Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овленного"
+msgstr "УбÑ\80аÑ\82Ñ\8c Ð¸Ð· Ð¸Ð·Ð´ÐµÐºÑ\81а"
 
 #: git-gui.sh:2661 lib/index.tcl:412
 msgid "Revert Changes"
-msgstr "Отменить изменения"
+msgstr "Обратить изменения"
 
 #: git-gui.sh:2669 git-gui.sh:3310 git-gui.sh:3341
 msgid "Show Less Context"
@@ -342,31 +337,31 @@ msgstr "Вставить Signed-off-by"
 
 #: git-gui.sh:2696
 msgid "Local Merge..."
-msgstr "Локальное слияние..."
+msgstr "Локальное слияние"
 
 #: git-gui.sh:2701
 msgid "Abort Merge..."
-msgstr "Прервать слияние..."
+msgstr "Прервать слияние"
 
 #: git-gui.sh:2713 git-gui.sh:2741
 msgid "Add..."
-msgstr "Добавить..."
+msgstr "Добавить"
 
 #: git-gui.sh:2717
 msgid "Push..."
-msgstr "Отправить..."
+msgstr "Отправить"
 
 #: git-gui.sh:2721
 msgid "Delete Branch..."
-msgstr "УдалиÑ\82Ñ\8c Ð²ÐµÑ\82вÑ\8c..."
+msgstr "УдалиÑ\82Ñ\8c Ð²ÐµÑ\82кÑ\83â\80¦"
 
 #: git-gui.sh:2731 git-gui.sh:3292
 msgid "Options..."
-msgstr "Настройки..."
+msgstr "Настройки"
 
 #: git-gui.sh:2742
 msgid "Remove..."
-msgstr "Удалить..."
+msgstr "Удалить"
 
 #: git-gui.sh:2751 lib/choose_repository.tcl:50
 msgid "Help"
@@ -393,11 +388,11 @@ msgstr "критическая ошибка: %s: нет такого файла
 
 #: git-gui.sh:2926
 msgid "Current Branch:"
-msgstr "ТекÑ\83Ñ\89аÑ\8f Ð²ÐµÑ\82вÑ\8c:"
+msgstr "ТекÑ\83Ñ\89аÑ\8f Ð²ÐµÑ\82ка:"
 
 #: git-gui.sh:2947
 msgid "Staged Changes (Will Commit)"
-msgstr "Ð\9fодгоÑ\82овлено (бÑ\83деÑ\82 Ñ\81оÑ\85Ñ\80анено)"
+msgstr "Ð\98зменениÑ\8f Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е (бÑ\83дÑ\83Ñ\82 Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\87енÑ\8b)"
 
 #: git-gui.sh:2967
 msgid "Unstaged Changes"
@@ -405,7 +400,7 @@ msgstr "Изменено (не будет сохранено)"
 
 #: git-gui.sh:3017
 msgid "Stage Changed"
-msgstr "Ð\9fодгоÑ\82овиÑ\82Ñ\8c Ð²Ñ\81е"
+msgstr "Ð\98ндекÑ\81иÑ\80оваÑ\82Ñ\8c Ð²Ñ\81Ñ\91"
 
 #: git-gui.sh:3036 lib/transport.tcl:104 lib/transport.tcl:193
 msgid "Push"
@@ -413,27 +408,27 @@ msgstr "Отправить"
 
 #: git-gui.sh:3071
 msgid "Initial Commit Message:"
-msgstr "Ð\9aомменÑ\82аÑ\80ий Ðº Ð¿ÐµÑ\80вомÑ\83 Ñ\81оÑ\81Ñ\82оÑ\8fниÑ\8e:"
+msgstr "СообÑ\89ение Ð¿ÐµÑ\80вого ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
 
 #: git-gui.sh:3072
 msgid "Amended Commit Message:"
-msgstr "Ð\9aомменÑ\82аÑ\80ий Ðº Ð¸Ñ\81пÑ\80авленномÑ\83 Ñ\81оÑ\81Ñ\82оÑ\8fниÑ\8e:"
+msgstr "СообÑ\89ение Ð¸Ñ\81пÑ\80авленного ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
 
 #: git-gui.sh:3073
 msgid "Amended Initial Commit Message:"
-msgstr "Ð\9aомменÑ\82аÑ\80ий Ðº Ð¸Ñ\81пÑ\80авленномÑ\83 Ð¿ÐµÑ\80вонаÑ\87алÑ\8cномÑ\83 Ñ\81оÑ\81Ñ\82оÑ\8fниÑ\8e:"
+msgstr "СообÑ\89ение Ð¸Ñ\81пÑ\80авленного Ð¿ÐµÑ\80вого ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
 
 #: git-gui.sh:3074
 msgid "Amended Merge Commit Message:"
-msgstr "Ð\9aомменÑ\82аÑ\80ий Ðº Ð¸Ñ\81пÑ\80авленномÑ\83 Ñ\81лиÑ\8fниÑ\8e:"
+msgstr "СообÑ\89ение Ð¸Ñ\81пÑ\80авленного Ñ\81лиÑ\8fниÑ\8f:"
 
 #: git-gui.sh:3075
 msgid "Merge Commit Message:"
-msgstr "Ð\9aомменÑ\82аÑ\80ий Ðº Ñ\81лиÑ\8fниÑ\8e:"
+msgstr "СообÑ\89ение Ñ\81лиÑ\8fниÑ\8f:"
 
 #: git-gui.sh:3076
 msgid "Commit Message:"
-msgstr "Ð\9aомменÑ\82аÑ\80ий Ðº Ñ\81оÑ\81Ñ\82оÑ\8fниÑ\8e:"
+msgstr "СообÑ\89ение ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
 
 #: git-gui.sh:3125 git-gui.sh:3267 lib/console.tcl:73
 msgid "Copy All"
@@ -481,51 +476,51 @@ msgstr "Взять локальную версию"
 
 #: git-gui.sh:3336
 msgid "Revert To Base"
-msgstr "Отменить изменения"
+msgstr "Обратить изменения"
 
 #: git-gui.sh:3354
 msgid "Visualize These Changes In The Submodule"
-msgstr ""
+msgstr "Показать эти изменения подмодуля"
 
 #: git-gui.sh:3358
 msgid "Visualize Current Branch History In The Submodule"
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\82ви подмодуля"
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\82ки подмодуля"
 
 #: git-gui.sh:3362
 msgid "Visualize All Branch History In The Submodule"
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ð²Ñ\81еÑ\85 Ð²ÐµÑ\82вей подмодуля"
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8e Ð²Ñ\81еÑ\85 Ð²ÐµÑ\82ок подмодуля"
 
 #: git-gui.sh:3367
 msgid "Start git gui In The Submodule"
-msgstr ""
+msgstr "Запустить git gui в подмодуле"
 
 #: git-gui.sh:3389
 msgid "Unstage Hunk From Commit"
-msgstr "Ð\9dе Ñ\81оÑ\85Ñ\80анÑ\8fÑ\82Ñ\8c Ñ\87аÑ\81Ñ\82Ñ\8c"
+msgstr "УбÑ\80аÑ\82Ñ\8c Ð±Ð»Ð¾Ðº Ð¸Ð· Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
 #: git-gui.sh:3391
 msgid "Unstage Lines From Commit"
-msgstr "УбÑ\80аÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80оки Ð¸Ð· Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овленного"
+msgstr "УбÑ\80аÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80оки Ð¸Ð· Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
 #: git-gui.sh:3393
 msgid "Unstage Line From Commit"
-msgstr "УбÑ\80аÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80окÑ\83 Ð¸Ð· Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овленного"
+msgstr "УбÑ\80аÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80окÑ\83 Ð¸Ð· Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
 #: git-gui.sh:3396
 msgid "Stage Hunk For Commit"
-msgstr "Ð\9fодгоÑ\82овиÑ\82Ñ\8c Ñ\87аÑ\81Ñ\82Ñ\8c Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "Ð\94обавиÑ\82Ñ\8c Ð±Ð»Ð¾Ðº Ð² Ð¸Ð½Ð´ÐµÐºÑ\81"
 
 #: git-gui.sh:3398
 msgid "Stage Lines For Commit"
-msgstr "Ð\9fодгоÑ\82овиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80оки Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "Ð\94обавиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80оки Ð² Ð¸Ð½Ð´ÐµÐºÑ\81"
 
 #: git-gui.sh:3400
 msgid "Stage Line For Commit"
-msgstr "Ð\9fодгоÑ\82овиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80окÑ\83 Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "Ð\94обавиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80окÑ\83 Ð² Ð¸Ð½Ð´ÐµÐºÑ\81"
 
 #: git-gui.sh:3424
 msgid "Initializing..."
-msgstr "Инициализация..."
+msgstr "Инициализация"
 
 #: git-gui.sh:3541
 #, tcl-format
@@ -536,23 +531,14 @@ msgid ""
 "going to be ignored by any Git subprocess run\n"
 "by %s:\n"
 "\n"
-msgstr ""
-"Возможны ошибки в переменных окружения.\n"
-"\n"
-"Переменные окружения, которые возможно\n"
-"будут проигнорированы командами Git,\n"
-"запущенными из %s\n"
-"\n"
+msgstr "Возможны ошибки в переменных окружения.\n\nПеременные окружения, которые возможно\nбудут проигнорированы командами Git,\nзапущенными из %s\n\n"
 
 #: git-gui.sh:3570
 msgid ""
 "\n"
 "This is due to a known issue with the\n"
 "Tcl binary distributed by Cygwin."
-msgstr ""
-"\n"
-"Это известная проблема с Tcl,\n"
-"распространяемым Cygwin."
+msgstr "\nЭто известная проблема с Tcl,\nраспространяемым Cygwin."
 
 #: git-gui.sh:3575
 #, tcl-format
@@ -563,13 +549,7 @@ msgid ""
 "is placing values for the user.name and\n"
 "user.email settings into your personal\n"
 "~/.gitconfig file.\n"
-msgstr ""
-"\n"
-"\n"
-"Вместо использования %s можно\n"
-"сохранить значения user.name и\n"
-"user.email в Вашем персональном\n"
-"файле ~/.gitconfig.\n"
+msgstr "\n\nВместо использования %s можно\nсохранить значения user.name и\nuser.email в Вашем персональном\nфайле ~/.gitconfig.\n"
 
 #: lib/about.tcl:26
 msgid "git-gui - a graphical user interface for Git."
@@ -581,15 +561,15 @@ msgstr "Просмотр файла"
 
 #: lib/blame.tcl:78
 msgid "Commit:"
-msgstr "СоÑ\85Ñ\80аненное Ñ\81оÑ\81Ñ\82оÑ\8fние:"
+msgstr "Ð\9aоммиÑ\82:"
 
 #: lib/blame.tcl:271
 msgid "Copy Commit"
-msgstr "Скопировать SHA-1"
+msgstr "Ð\9aопировать SHA-1"
 
 #: lib/blame.tcl:275
 msgid "Find Text..."
-msgstr "Найти текст..."
+msgstr "Найти текст"
 
 #: lib/blame.tcl:284
 msgid "Do Full Copy Detection"
@@ -601,16 +581,16 @@ msgstr "Показать исторический контекст"
 
 #: lib/blame.tcl:291
 msgid "Blame Parent Commit"
-msgstr "РаÑ\81Ñ\81моÑ\82Ñ\80еÑ\82Ñ\8c Ñ\81оÑ\81Ñ\82оÑ\8fние Ð¿Ñ\80едка"
+msgstr "Ð\90вÑ\82оÑ\80Ñ\8b Ñ\80одиÑ\82елÑ\8cÑ\81кого ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
 #: lib/blame.tcl:450
 #, tcl-format
 msgid "Reading %s..."
-msgstr "Чтение %s..."
+msgstr "Чтение %s"
 
 #: lib/blame.tcl:557
 msgid "Loading copy/move tracking annotations..."
-msgstr "Загрузка аннотации копирований/переименований..."
+msgstr "Загрузка аннотации копирований/переименований"
 
 #: lib/blame.tcl:577
 msgid "lines annotated"
@@ -618,7 +598,7 @@ msgstr "строк прокомментировано"
 
 #: lib/blame.tcl:769
 msgid "Loading original location annotations..."
-msgstr "Загрузка аннотаций первоначального положения объекта..."
+msgstr "Загрузка аннотаций первоначального положения объекта"
 
 #: lib/blame.tcl:772
 msgid "Annotation complete."
@@ -634,11 +614,11 @@ msgstr "Аннотация уже запущена"
 
 #: lib/blame.tcl:842
 msgid "Running thorough copy detection..."
-msgstr "Выполнение полного поиска копий..."
+msgstr "Выполнение полного поиска копий"
 
 #: lib/blame.tcl:910
 msgid "Loading annotation..."
-msgstr "Загрузка аннотации..."
+msgstr "Загрузка аннотации"
 
 #: lib/blame.tcl:963
 msgid "Author:"
@@ -646,7 +626,7 @@ msgstr "Автор:"
 
 #: lib/blame.tcl:967
 msgid "Committer:"
-msgstr "СоÑ\85Ñ\80анил:"
+msgstr "Ð\9aоммиÑ\82еÑ\80:"
 
 #: lib/blame.tcl:972
 msgid "Original File:"
@@ -654,11 +634,11 @@ msgstr "Исходный файл:"
 
 #: lib/blame.tcl:1020
 msgid "Cannot find HEAD commit:"
-msgstr "Невозможно найти текущее состояние:"
+msgstr "Не удалось найти текущее состояние:"
 
 #: lib/blame.tcl:1075
 msgid "Cannot find parent commit:"
-msgstr "Невозможно найти состояние предка:"
+msgstr "Не удалось найти родительское состояние:"
 
 #: lib/blame.tcl:1090
 msgid "Unable to display parent"
@@ -682,7 +662,7 @@ msgstr "Скопировано/перемещено в:"
 
 #: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
 msgid "Checkout Branch"
-msgstr "Ð\9fеÑ\80ейÑ\82и Ð½Ð° Ð²ÐµÑ\82вÑ\8c"
+msgstr "Ð\9fеÑ\80ейÑ\82и Ð½Ð° Ð²ÐµÑ\82кÑ\83"
 
 #: lib/branch_checkout.tcl:23
 msgid "Checkout"
@@ -707,19 +687,19 @@ msgstr "Настройки"
 
 #: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92
 msgid "Fetch Tracking Branch"
-msgstr "Ð\9fолÑ\83Ñ\87иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸Ð· Ð²Ð½ÐµÑ\88ней Ð²ÐµÑ\82ви"
+msgstr "Ð\98звлеÑ\87Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸Ð· Ð²Ð½ÐµÑ\88ней Ð²ÐµÑ\82ки"
 
 #: lib/branch_checkout.tcl:44
 msgid "Detach From Local Branch"
-msgstr "Ð\9eÑ\82Ñ\81оединиÑ\82Ñ\8c Ð¾Ñ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cной Ð²ÐµÑ\82ви"
+msgstr "Ð\9eÑ\82Ñ\81оединиÑ\82Ñ\8c Ð¾Ñ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cной Ð²ÐµÑ\82ки"
 
 #: lib/branch_create.tcl:22
 msgid "Create Branch"
-msgstr "Создание ветви"
+msgstr "Создать ветку"
 
 #: lib/branch_create.tcl:27
 msgid "Create New Branch"
-msgstr "СоздаÑ\82Ñ\8c Ð½Ð¾Ð²Ñ\83Ñ\8e Ð²ÐµÑ\82вÑ\8c"
+msgstr "СоздаÑ\82Ñ\8c Ð½Ð¾Ð²Ñ\83Ñ\8e Ð²ÐµÑ\82кÑ\83"
 
 #: lib/branch_create.tcl:31 lib/choose_repository.tcl:381
 msgid "Create"
@@ -727,7 +707,7 @@ msgstr "Создать"
 
 #: lib/branch_create.tcl:40
 msgid "Branch Name"
-msgstr "Ð\9dазвание Ð²ÐµÑ\82ви"
+msgstr "Ð\98мÑ\8f Ð²ÐµÑ\82ки"
 
 #: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50
 msgid "Name:"
@@ -735,7 +715,7 @@ msgstr "Название:"
 
 #: lib/branch_create.tcl:58
 msgid "Match Tracking Branch Name"
-msgstr "Ð\92зÑ\8fÑ\82Ñ\8c Ð¸Ð· Ð¸Ð¼ÐµÐ½ Ð²ÐµÑ\82вей Ñ\81лежениÑ\8f"
+msgstr "СооÑ\82веÑ\82Ñ\81Ñ\82воваÑ\82Ñ\8c Ð¸Ð¼ÐµÐ½Ð¸ Ð¾Ñ\82Ñ\81леживаемой Ð²ÐµÑ\82ки"
 
 #: lib/branch_create.tcl:66
 msgid "Starting Revision"
@@ -743,7 +723,7 @@ msgstr "Начальная версия"
 
 #: lib/branch_create.tcl:72
 msgid "Update Existing Branch:"
-msgstr "Ð\9eбновиÑ\82Ñ\8c Ð¸Ð¼ÐµÑ\8eÑ\89Ñ\83Ñ\8eÑ\81Ñ\8f Ð²ÐµÑ\82вÑ\8c:"
+msgstr "Ð\9eбновиÑ\82Ñ\8c Ð¸Ð¼ÐµÑ\8eÑ\89Ñ\83Ñ\8eÑ\81Ñ\8f Ð²ÐµÑ\82кÑ\83:"
 
 #: lib/branch_create.tcl:75
 msgid "No"
@@ -763,33 +743,33 @@ msgstr "После создания сделать текущей"
 
 #: lib/branch_create.tcl:131
 msgid "Please select a tracking branch."
-msgstr "УкажиÑ\82е Ð²ÐµÑ\82вÑ\8c Ñ\81лежениÑ\8f."
+msgstr "УкажиÑ\82е Ð¾Ñ\82леживаемÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83."
 
 #: lib/branch_create.tcl:140
 #, tcl-format
 msgid "Tracking branch %s is not a branch in the remote repository."
-msgstr "Ð\92еÑ\82вÑ\8c Ñ\81лежениÑ\8f %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð²ÐµÑ\82вÑ\8cÑ\8e Ð²Ð¾ внешнем репозитории."
+msgstr "Ð\9eÑ\82Ñ\81леживаемаÑ\8f Ð²ÐµÑ\82ка %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð²ÐµÑ\82кой Ð½Ð° внешнем репозитории."
 
 #: lib/branch_create.tcl:153 lib/branch_rename.tcl:86
 msgid "Please supply a branch name."
-msgstr "УкажиÑ\82е Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ð²ÐµÑ\82ви."
+msgstr "УкажиÑ\82е Ð¸Ð¼Ñ\8f Ð²ÐµÑ\82ки."
 
 #: lib/branch_create.tcl:164 lib/branch_rename.tcl:106
 #, tcl-format
 msgid "'%s' is not an acceptable branch name."
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ð²ÐµÑ\82ви '%s'."
+msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое Ð¸Ð¼Ñ\8f Ð²ÐµÑ\82ки Â«%s»."
 
 #: lib/branch_delete.tcl:15
 msgid "Delete Branch"
-msgstr "Удаление Ð²ÐµÑ\82ви"
+msgstr "Удаление Ð²ÐµÑ\82ки"
 
 #: lib/branch_delete.tcl:20
 msgid "Delete Local Branch"
-msgstr "УдалиÑ\82Ñ\8c Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82вÑ\8c"
+msgstr "УдалиÑ\82Ñ\8c Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83"
 
 #: lib/branch_delete.tcl:37
 msgid "Local Branches"
-msgstr "Ð\9bокалÑ\8cнÑ\8bе Ð²ÐµÑ\82ви"
+msgstr "Ð\9bокалÑ\8cнÑ\8bе Ð²ÐµÑ\82ки"
 
 #: lib/branch_delete.tcl:52
 msgid "Delete Only If Merged Into"
@@ -802,30 +782,25 @@ msgstr "Всегда (не выполнять проверку на слияни
 #: lib/branch_delete.tcl:103
 #, tcl-format
 msgid "The following branches are not completely merged into %s:"
-msgstr "Ð\92еÑ\82ви, которые не полностью сливаются с %s:"
+msgstr "Ð\92еÑ\82ки, которые не полностью сливаются с %s:"
 
 #: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:217
 msgid ""
 "Recovering deleted branches is difficult.\n"
 "\n"
 "Delete the selected branches?"
-msgstr ""
-"Восстановить удаленные ветви сложно.\n"
-"\n"
-"Продолжить?"
+msgstr "Восстановить удаленные ветки сложно.\n\nПродолжить?"
 
 #: lib/branch_delete.tcl:141
 #, tcl-format
 msgid ""
 "Failed to delete branches:\n"
 "%s"
-msgstr ""
-"Не удалось удалить ветви:\n"
-"%s"
+msgstr "Не удалось удалить ветки:\n%s"
 
 #: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22
 msgid "Rename Branch"
-msgstr "Ð\9fеÑ\80еименование Ð²ÐµÑ\82ви"
+msgstr "Ð\9fеÑ\80еименование Ð²ÐµÑ\82ки"
 
 #: lib/branch_rename.tcl:26
 msgid "Rename"
@@ -833,7 +808,7 @@ msgstr "Переименовать"
 
 #: lib/branch_rename.tcl:36
 msgid "Branch:"
-msgstr "Ð\92еÑ\82вÑ\8c:"
+msgstr "Ð\92еÑ\82ка:"
 
 #: lib/branch_rename.tcl:39
 msgid "New Name:"
@@ -841,21 +816,21 @@ msgstr "Новое название:"
 
 #: lib/branch_rename.tcl:75
 msgid "Please select a branch to rename."
-msgstr "УкажиÑ\82е Ð²ÐµÑ\82вÑ\8c для переименования."
+msgstr "УкажиÑ\82е Ð²ÐµÑ\82кÑ\83 для переименования."
 
 #: lib/branch_rename.tcl:96 lib/checkout_op.tcl:202
 #, tcl-format
 msgid "Branch '%s' already exists."
-msgstr "Ð\92еÑ\82вÑ\8c '%s' уже существует."
+msgstr "Ð\92еÑ\82ка Â«%s» уже существует."
 
 #: lib/branch_rename.tcl:117
 #, tcl-format
 msgid "Failed to rename '%s'."
-msgstr "Не удалось переименовать '%s'. "
+msgstr "Не удалось переименовать «%s». "
 
 #: lib/browser.tcl:17
 msgid "Starting..."
-msgstr "Запуск..."
+msgstr "Запуск"
 
 #: lib/browser.tcl:26
 msgid "File Browser"
@@ -864,7 +839,7 @@ msgstr "Просмотр списка файлов"
 #: lib/browser.tcl:126 lib/browser.tcl:143
 #, tcl-format
 msgid "Loading %s..."
-msgstr "Загрузка %s..."
+msgstr "Загрузка %s"
 
 #: lib/browser.tcl:187
 msgid "[Up To Parent]"
@@ -872,7 +847,7 @@ msgstr "[На уровень выше]"
 
 #: lib/browser.tcl:267 lib/browser.tcl:273
 msgid "Browse Branch Files"
-msgstr "Ð\9fоказаÑ\82Ñ\8c Ñ\84айлÑ\8b Ð²ÐµÑ\82ви"
+msgstr "Ð\9fоказаÑ\82Ñ\8c Ñ\84айлÑ\8b Ð²ÐµÑ\82ки"
 
 #: lib/browser.tcl:278 lib/choose_repository.tcl:398
 #: lib/choose_repository.tcl:486 lib/choose_repository.tcl:497
@@ -883,7 +858,7 @@ msgstr "Показать"
 #: lib/checkout_op.tcl:85
 #, tcl-format
 msgid "Fetching %s from %s"
-msgstr "Ð\9fолÑ\83чение %s из %s "
+msgstr "Ð\98звлечение %s из %s "
 
 #: lib/checkout_op.tcl:133
 #, tcl-format
@@ -898,12 +873,12 @@ msgstr "Закрыть"
 #: lib/checkout_op.tcl:175
 #, tcl-format
 msgid "Branch '%s' does not exist."
-msgstr "Ð\92еÑ\82вÑ\8c '%s' Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 "
+msgstr "Ð\92еÑ\82ка Â«%s» Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82."
 
 #: lib/checkout_op.tcl:194
 #, tcl-format
 msgid "Failed to configure simplified git-pull for '%s'."
-msgstr "Ошибка создания упрощённой конфигурации git pull для '%s'."
+msgstr "Ошибка создания упрощённой конфигурации git pull для «%s»."
 
 #: lib/checkout_op.tcl:229
 #, tcl-format
@@ -912,21 +887,17 @@ msgid ""
 "\n"
 "It cannot fast-forward to %s.\n"
 "A merge is required."
-msgstr ""
-"Ветвь '%s' уже существует.\n"
-"\n"
-"Она не может быть прокручена(fast-forward) к %s.\n"
-"Требуется слияние."
+msgstr "Ветка «%s» уже существует.\n\nОна не может быть перемотана вперед к %s.\nТребуется слияние."
 
 #: lib/checkout_op.tcl:243
 #, tcl-format
 msgid "Merge strategy '%s' not supported."
-msgstr "Неизвестная стратегия слияния: '%s'."
+msgstr "Неизвестная стратегия слияния «%s»."
 
 #: lib/checkout_op.tcl:262
 #, tcl-format
 msgid "Failed to update '%s'."
-msgstr "Не удалось обновить '%s'."
+msgstr "Не удалось обновить «%s»."
 
 #: lib/checkout_op.tcl:274
 msgid "Staging area (index) is already locked."
@@ -936,22 +907,15 @@ msgstr "Рабочая область заблокирована другим п
 msgid ""
 "Last scanned state does not match repository state.\n"
 "\n"
-"Another Git program has modified this repository since the last scan.  A "
-"rescan must be performed before the current branch can be changed.\n"
+"Another Git program has modified this repository since the last scan.  A rescan must be performed before the current branch can be changed.\n"
 "\n"
 "The rescan will be automatically started now.\n"
-msgstr ""
-"Последнее прочитанное состояние репозитория не соответствует текущему.\n"
-"\n"
-"С момента последней проверки репозиторий был изменен другой программой Git. "
-"Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь.\n"
-"\n"
-"Это будет сделано сейчас автоматически.\n"
+msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем текущая ветка может быть изменена.\n\nЭто будет сделано сейчас автоматически.\n"
 
 #: lib/checkout_op.tcl:345
 #, tcl-format
 msgid "Updating working directory to '%s'..."
-msgstr "Обновление рабочего каталога из '%s'..."
+msgstr "Обновление рабочего каталога из «%s»…"
 
 #: lib/checkout_op.tcl:346
 msgid "files checked out"
@@ -960,7 +924,7 @@ msgstr "файлы извлечены"
 #: lib/checkout_op.tcl:376
 #, tcl-format
 msgid "Aborted checkout of '%s' (file level merging is required)."
-msgstr "Прерван переход на '%s' (требуется слияние содержания файлов)"
+msgstr "Прерван переход на «%s» (требуется слияние содержимого файлов)"
 
 #: lib/checkout_op.tcl:377
 msgid "File level merge required."
@@ -969,38 +933,33 @@ msgstr "Требуется слияние содержания файлов."
 #: lib/checkout_op.tcl:381
 #, tcl-format
 msgid "Staying on branch '%s'."
-msgstr "Ð\92еÑ\82вÑ\8c '%s' Ð¾Ñ\81Ñ\82ается текущей."
+msgstr "Ð\92еÑ\82ка Â«%s» Ð¾Ñ\81Ñ\82аÑ\91тся текущей."
 
 #: lib/checkout_op.tcl:452
 msgid ""
 "You are no longer on a local branch.\n"
 "\n"
-"If you wanted to be on a branch, create one now starting from 'This Detached "
-"Checkout'."
-msgstr ""
-"Вы находитесь не в локальной ветви.\n"
-"\n"
-"Если вы хотите снова вернуться к какой-нибудь ветви, создайте ее сейчас, "
-"начиная с 'Текущего отсоединенного состояния'."
+"If you wanted to be on a branch, create one now starting from 'This Detached Checkout'."
+msgstr "Вы более не находитесь на локальной ветке.\n\nЕсли вы хотите снова вернуться к какой-нибудь ветке, создайте её сейчас, начиная с «Текущего отсоединенного состояния»."
 
 #: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507
 #, tcl-format
 msgid "Checked out '%s'."
-msgstr "Ветвь '%s' сделана текущей."
+msgstr "Выполнен переход на «%s»."
 
 #: lib/checkout_op.tcl:535
 #, tcl-format
 msgid "Resetting '%s' to '%s' will lose the following commits:"
-msgstr "Сброс '%s' в '%s' приведет к потере следующих сохраненных состояний: "
+msgstr "Сброс «%s»  на «%s» приведет к потере следующих коммитов:"
 
 #: lib/checkout_op.tcl:557
 msgid "Recovering lost commits may not be easy."
-msgstr "Восстановить потерянные сохраненные состояния будет сложно."
+msgstr "Восстановить потерянные коммиты будет сложно."
 
 #: lib/checkout_op.tcl:562
 #, tcl-format
 msgid "Reset '%s'?"
-msgstr "Сбросить '%s'?"
+msgstr "Сбросить «%s»?"
 
 #: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:343
 msgid "Visualize"
@@ -1011,17 +970,10 @@ msgstr "Наглядно"
 msgid ""
 "Failed to set current branch.\n"
 "\n"
-"This working directory is only partially switched.  We successfully updated "
-"your files, but failed to update an internal Git file.\n"
+"This working directory is only partially switched.  We successfully updated your files, but failed to update an internal Git file.\n"
 "\n"
 "This should not have occurred.  %s will now close and give up."
-msgstr ""
-"Не удалось установить текущую ветвь.\n"
-"\n"
-"Ваш рабочий каталог обновлен только частично. Были обновлены все файлы кроме "
-"служебных файлов Git. \n"
-"\n"
-"Этого не должно было произойти. %s завершается."
+msgstr "Не удалось установить текущую ветку.\n\nВаш рабочий каталог обновлён только частично. Были обновлены все файлы кроме служебных файлов Git. \n\nЭтого не должно было произойти. %s завершается."
 
 #: lib/choose_font.tcl:39
 msgid "Select"
@@ -1043,9 +995,7 @@ msgstr "Пример текста"
 msgid ""
 "This is example text.\n"
 "If you like this text, it can be your font."
-msgstr ""
-"Это пример текста.\n"
-"Если Вам нравится этот текст, это может быть Ваш шрифт."
+msgstr "Это пример текста.\nЕсли Вам нравится этот текст, это может быть Ваш шрифт."
 
 #: lib/choose_repository.tcl:28
 msgid "Git Gui"
@@ -1057,7 +1007,7 @@ msgstr "Создать новый репозиторий"
 
 #: lib/choose_repository.tcl:93
 msgid "New..."
-msgstr "Новый..."
+msgstr "Новый"
 
 #: lib/choose_repository.tcl:100 lib/choose_repository.tcl:471
 msgid "Clone Existing Repository"
@@ -1065,7 +1015,7 @@ msgstr "Склонировать существующий репозиторий
 
 #: lib/choose_repository.tcl:106
 msgid "Clone..."
-msgstr "СклониÑ\80оваÑ\82Ñ\8c..."
+msgstr "Ð\9aлониÑ\80оваÑ\82Ñ\8câ\80¦"
 
 #: lib/choose_repository.tcl:113 lib/choose_repository.tcl:1016
 msgid "Open Existing Repository"
@@ -1073,7 +1023,7 @@ msgstr "Выбрать существующий репозиторий"
 
 #: lib/choose_repository.tcl:119
 msgid "Open..."
-msgstr "Открыть..."
+msgstr "Открыть"
 
 #: lib/choose_repository.tcl:132
 msgid "Recent Repositories"
@@ -1126,7 +1076,7 @@ msgstr "Тип клона:"
 
 #: lib/choose_repository.tcl:508
 msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
-msgstr "Стандартный (Быстрый, полуизбыточный, \"жесткие\" ссылки)"
+msgstr "Стандартный (Быстрый, полуизбыточный, «жесткие» ссылки)"
 
 #: lib/choose_repository.tcl:514
 msgid "Full Copy (Slower, Redundant Backup)"
@@ -1166,7 +1116,7 @@ msgstr "Считаю объекты"
 
 #: lib/choose_repository.tcl:641
 msgid "buckets"
-msgstr ""
+msgstr "блоки"
 
 #: lib/choose_repository.tcl:665
 #, tcl-format
@@ -1181,11 +1131,11 @@ msgstr "Нечего клонировать с %s."
 #: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917
 #: lib/choose_repository.tcl:929
 msgid "The 'master' branch has not been initialized."
-msgstr "Не инициализирована ветвь 'master'."
+msgstr "Не инициализирована ветвь «master»."
 
 #: lib/choose_repository.tcl:716
 msgid "Hardlinks are unavailable.  Falling back to copying."
-msgstr "\"Жесткие ссылки\" недоступны. Будет использовано копирование."
+msgstr "«Жесткие ссылки» недоступны. Будет использовано копирование."
 
 #: lib/choose_repository.tcl:728
 #, tcl-format
@@ -1216,16 +1166,15 @@ msgstr "объекты"
 #: lib/choose_repository.tcl:803
 #, tcl-format
 msgid "Unable to hardlink object: %s"
-msgstr "Не могу \"жестко связать\" объект: %s"
+msgstr "Не могу создать «жесткую ссылку» на объект: %s"
 
 #: lib/choose_repository.tcl:858
 msgid "Cannot fetch branches and objects.  See console output for details."
-msgstr ""
-"Не могу получить ветви и объекты. Дополнительная информация на консоли."
+msgstr "Не удалось извлечь ветки и объекты. Дополнительная информация на консоли."
 
 #: lib/choose_repository.tcl:869
 msgid "Cannot fetch tags.  See console output for details."
-msgstr "Не могу получить метки. Дополнительная информация на консоли."
+msgstr "Не удалось извлечь метки. Дополнительная информация на консоли."
 
 #: lib/choose_repository.tcl:893
 msgid "Cannot determine HEAD.  See console output for details."
@@ -1242,12 +1191,12 @@ msgstr "Клонирование не удалось."
 
 #: lib/choose_repository.tcl:915
 msgid "No default branch obtained."
-msgstr "Ð\9dе Ð±Ñ\8bло Ð¿Ð¾Ð»Ñ\83Ñ\87ено Ð²ÐµÑ\82ви Ð¿Ð¾ Ñ\83молÑ\87аниÑ\8e."
+msgstr "Ð\92еÑ\82ка Ð¿Ð¾ Ñ\83молÑ\87аниÑ\8e Ð½Ðµ Ð±Ñ\8bла Ð¿Ð¾Ð»Ñ\83Ñ\87ена."
 
 #: lib/choose_repository.tcl:926
 #, tcl-format
 msgid "Cannot resolve %s as a commit."
-msgstr "Не могу распознать %s как состояние."
+msgstr "Не могу распознать %s как коммит."
 
 #: lib/choose_repository.tcl:938
 msgid "Creating working directory"
@@ -1285,11 +1234,11 @@ msgstr "Выражение для определения версии:"
 
 #: lib/choose_rev.tcl:74
 msgid "Local Branch"
-msgstr "Ð\9bокалÑ\8cнаÑ\8f Ð²ÐµÑ\82вÑ\8c:"
+msgstr "Ð\9bокалÑ\8cнаÑ\8f Ð²ÐµÑ\82ка:"
 
 #: lib/choose_rev.tcl:79
 msgid "Tracking Branch"
-msgstr "Ð\92еÑ\82вÑ\8c Ñ\81лежениÑ\8f"
+msgstr "Ð\9eÑ\82Ñ\81леживаемаÑ\8f Ð²ÐµÑ\82ка"
 
 #: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538
 msgid "Tag"
@@ -1320,29 +1269,19 @@ msgstr "Ссылка"
 msgid ""
 "There is nothing to amend.\n"
 "\n"
-"You are about to create the initial commit.  There is no commit before this "
-"to amend.\n"
-msgstr ""
-"Отсутствует состояние для исправления.\n"
-"\n"
-"Вы создаете первое состояние в репозитории, здесь еще нечего исправлять.\n"
+"You are about to create the initial commit.  There is no commit before this to amend.\n"
+msgstr "Отсутствует коммиты для исправления.\n\nВы создаете начальный коммит, здесь еще нечего исправлять.\n"
 
 #: lib/commit.tcl:18
 msgid ""
 "Cannot amend while merging.\n"
 "\n"
-"You are currently in the middle of a merge that has not been fully "
-"completed.  You cannot amend the prior commit unless you first abort the "
-"current merge activity.\n"
-msgstr ""
-"Невозможно исправить состояние во время операции слияния.\n"
-"\n"
-"Текущее слияние не завершено. Невозможно исправить предыдущее сохраненное "
-"состояние, не прерывая эту операцию.\n"
+"You are currently in the middle of a merge that has not been fully completed.  You cannot amend the prior commit unless you first abort the current merge activity.\n"
+msgstr "Невозможно исправить коммит во время слияния.\n\nТекущее слияние не завершено. Невозможно исправить предыдуий коммит, не прерывая эту операцию.\n"
 
 #: lib/commit.tcl:48
 msgid "Error loading commit data for amend:"
-msgstr "Ошибка при загрузке данных для исправления сохраненного состояния:"
+msgstr "Ошибка при загрузке данных для исправления коммита:"
 
 #: lib/commit.tcl:75
 msgid "Unable to obtain your identity:"
@@ -1350,41 +1289,29 @@ msgstr "Невозможно получить информацию об авто
 
 #: lib/commit.tcl:80
 msgid "Invalid GIT_COMMITTER_IDENT:"
-msgstr "Ð\9dевеÑ\80ный GIT_COMMITTER_IDENT:"
+msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имый GIT_COMMITTER_IDENT:"
 
 #: lib/commit.tcl:129
 #, tcl-format
 msgid "warning: Tcl does not support encoding '%s'."
-msgstr "предупреждение: Tcl не поддерживает кодировку '%s'."
+msgstr "предупреждение: Tcl не поддерживает кодировку «%s»."
 
 #: lib/commit.tcl:149
 msgid ""
 "Last scanned state does not match repository state.\n"
 "\n"
-"Another Git program has modified this repository since the last scan.  A "
-"rescan must be performed before another commit can be created.\n"
+"Another Git program has modified this repository since the last scan.  A rescan must be performed before another commit can be created.\n"
 "\n"
 "The rescan will be automatically started now.\n"
-msgstr ""
-"Последнее прочитанное состояние репозитория не соответствует текущему.\n"
-"\n"
-"С момента последней проверки репозиторий был изменен другой программой Git. "
-"Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь. \n"
-"\n"
-"Это будет сделано сейчас автоматически.\n"
+msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь. \n\nЭто будет сделано сейчас автоматически.\n"
 
 #: lib/commit.tcl:172
 #, tcl-format
 msgid ""
 "Unmerged files cannot be committed.\n"
 "\n"
-"File %s has merge conflicts.  You must resolve them and stage the file "
-"before committing.\n"
-msgstr ""
-"Нельзя сохранить файлы с незавершённой операцией слияния.\n"
-"\n"
-"Для файла %s возник конфликт слияния. Разрешите конфликт и добавьте к "
-"подготовленным файлам перед сохранением.\n"
+"File %s has merge conflicts.  You must resolve them and stage the file before committing.\n"
+msgstr "Нельзя выполнить коммит с незавершённой операцией слияния.\n\nДля файла %s возник конфликт слияния. Разрешите конфликт и добавьте их в индекс перед выполнением коммита.\n"
 
 #: lib/commit.tcl:180
 #, tcl-format
@@ -1392,20 +1319,14 @@ msgid ""
 "Unknown file state %s detected.\n"
 "\n"
 "File %s cannot be committed by this program.\n"
-msgstr ""
-"Обнаружено неизвестное состояние файла %s.\n"
-"\n"
-"Файл %s не может быть сохранен данной программой.\n"
+msgstr "Обнаружено неизвестное состояние файла %s.\n\nФайл %s не может быть закоммичен этой программой.\n"
 
 #: lib/commit.tcl:188
 msgid ""
 "No changes to commit.\n"
 "\n"
 "You must stage at least 1 file before you can commit.\n"
-msgstr ""
-"Отсутствуют изменения для сохранения.\n"
-"\n"
-"Подготовьте хотя бы один файл до создания сохраненного состояния.\n"
+msgstr "Отсутствуют изменения для сохранения.\n\nДобавьте в индекс хотя бы один файл перед выполнением коммита.\n"
 
 #: lib/commit.tcl:203
 msgid ""
@@ -1416,34 +1337,27 @@ msgid ""
 "- First line: Describe in one sentence what you did.\n"
 "- Second line: Blank\n"
 "- Remaining lines: Describe why this change is good.\n"
-msgstr ""
-"Напишите комментарий к сохраненному состоянию.\n"
-"\n"
-"Рекомендуется следующий формат комментария:\n"
-"\n"
-"- первая строка: краткое описание сделанных изменений.\n"
-"- вторая строка пустая\n"
-"- оставшиеся строки: опишите, что дают ваши изменения.\n"
+msgstr "Укажите сообщение коммита.\n\nРекомендуется следующий формат сообщения:\n\n- в первой строке краткое описание сделанных изменений\n- вторая строка пустая\n- в оставшихся строках опишите, что дают ваши изменения\n"
 
 #: lib/commit.tcl:234
 msgid "Calling pre-commit hook..."
-msgstr "Вызов программы поддержки репозитория pre-commit..."
+msgstr "Вызов перехватчика pre-commit…"
 
 #: lib/commit.tcl:249
 msgid "Commit declined by pre-commit hook."
-msgstr "СоÑ\85Ñ\80анение Ð¿Ñ\80еÑ\80вано Ð¿Ñ\80огÑ\80аммой Ð¿Ð¾Ð´Ð´ÐµÑ\80жки Ñ\80епозиÑ\82оÑ\80иÑ\8f pre-commit"
+msgstr "Ð\9aоммиÑ\82 Ð¿Ñ\80еÑ\80ван Ð¿ÐµÑ\80еваÑ\82Ñ\87иком pre-commit."
 
 #: lib/commit.tcl:272
 msgid "Calling commit-msg hook..."
-msgstr "Вызов программы поддержки репозитория commit-msg..."
+msgstr "Вызов перехватчика commit-msg…"
 
 #: lib/commit.tcl:287
 msgid "Commit declined by commit-msg hook."
-msgstr "СоÑ\85Ñ\80анение Ð¿Ñ\80еÑ\80вано Ð¿Ñ\80огÑ\80аммой Ð¿Ð¾Ð´Ð´ÐµÑ\80жки Ñ\80епозиÑ\82оÑ\80иÑ\8f commit-msg"
+msgstr "Ð\9aоммиÑ\82 Ð¿Ñ\80еÑ\80ван Ð¿ÐµÑ\80еваÑ\82Ñ\87иком commit-msg"
 
 #: lib/commit.tcl:300
 msgid "Committing changes..."
-msgstr "СоÑ\85Ñ\80анение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹..."
+msgstr "Ð\9aоммиÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹â\80¦"
 
 #: lib/commit.tcl:316
 msgid "write-tree failed:"
@@ -1451,12 +1365,12 @@ msgstr "Программа write-tree завершилась с ошибкой:"
 
 #: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382
 msgid "Commit failed."
-msgstr "СоÑ\85Ñ\80аниÑ\82Ñ\8c Ñ\81оÑ\81Ñ\82оÑ\8fние Ð½Ðµ Ñ\83далоÑ\81Ñ\8c."
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f."
 
 #: lib/commit.tcl:334
 #, tcl-format
 msgid "Commit %s appears to be corrupt"
-msgstr "СоÑ\81Ñ\82оÑ\8fние %s Ð²Ñ\8bглÑ\8fдиÑ\82 Ð¿Ð¾Ð²Ñ\80ежденнÑ\8bм"
+msgstr "Ð\9aоммиÑ\82 %s Ð¿Ð¾Ñ\85оже Ð¿Ð¾Ð²Ñ\80ежден"
 
 #: lib/commit.tcl:339
 msgid ""
@@ -1465,16 +1379,11 @@ msgid ""
 "No files were modified by this commit and it was not a merge commit.\n"
 "\n"
 "A rescan will be automatically started now.\n"
-msgstr ""
-"Отсутствуют изменения для сохранения.\n"
-"\n"
-"Ни один файл не был изменен и не было слияния.\n"
-"\n"
-"Сейчас автоматически запустится перечитывание репозитория.\n"
+msgstr "Нет изменения для коммита.\n\nНи один файл не был изменен и не было слияния.\n\nСейчас автоматически запустится перечитывание репозитория.\n"
 
 #: lib/commit.tcl:346
 msgid "No changes to commit."
-msgstr "Ð\9eÑ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f."
+msgstr "Ð\9dеÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
 
 #: lib/commit.tcl:360
 msgid "commit-tree failed:"
@@ -1487,11 +1396,11 @@ msgstr "Программа update-ref завершилась с ошибкой:"
 #: lib/commit.tcl:469
 #, tcl-format
 msgid "Created commit %s: %s"
-msgstr "Создано состояние %s: %s "
+msgstr "Создан коммит %s: %s "
 
 #: lib/console.tcl:59
 msgid "Working... please wait..."
-msgstr "В процессе... пожалуйста, ждите..."
+msgstr "В процессе… пожалуйста, ждите…"
 
 #: lib/console.tcl:186
 msgid "Success"
@@ -1542,16 +1451,10 @@ msgstr "Проверка базы объектов при помощи fsck"
 msgid ""
 "This repository currently has approximately %i loose objects.\n"
 "\n"
-"To maintain optimal performance it is strongly recommended that you compress "
-"the database.\n"
+"To maintain optimal performance it is strongly recommended that you compress the database.\n"
 "\n"
 "Compress the database now?"
-msgstr ""
-"Этот репозиторий сейчас содержит примерно %i свободных объектов\n"
-"\n"
-"Для лучшей производительности рекомендуется сжать базу данных.\n"
-"\n"
-"Сжать базу данных сейчас?"
+msgstr "Этот репозиторий сейчас содержит примерно %i свободных объектов\n\nДля лучшей производительности рекомендуется сжать базу данных.\n\nСжать базу данных сейчас?"
 
 #: lib/date.tcl:25
 #, tcl-format
@@ -1565,41 +1468,27 @@ msgid ""
 "\n"
 "%s has no changes.\n"
 "\n"
-"The modification date of this file was updated by another application, but "
-"the content within the file was not changed.\n"
-"\n"
-"A rescan will be automatically started to find other files which may have "
-"the same state."
-msgstr ""
-"Изменений не обнаружено.\n"
+"The modification date of this file was updated by another application, but the content within the file was not changed.\n"
 "\n"
-"в %s отсутствуют изменения.\n"
-"\n"
-"Дата изменения файла была обновлена другой программой, но содержимое файла "
-"осталось прежним.\n"
-"\n"
-"Сейчас будет запущено перечитывание репозитория, чтобы найти подобные файлы."
+"A rescan will be automatically started to find other files which may have the same state."
+msgstr "Изменений не обнаружено.\n\nв %s отсутствуют изменения.\n\nДата изменения файла была обновлена другой программой, но содержимое файла осталось прежним.\n\nСейчас будет запущено перечитывание репозитория, чтобы найти подобные файлы."
 
 #: lib/diff.tcl:104
 #, tcl-format
 msgid "Loading diff of %s..."
-msgstr "Загрузка изменений в %s..."
+msgstr "Загрузка изменений %s…"
 
 #: lib/diff.tcl:125
 msgid ""
 "LOCAL: deleted\n"
 "REMOTE:\n"
-msgstr ""
-"ЛОКАЛЬНО: удалён\n"
-"ВНЕШНИЙ:\n"
+msgstr "ЛОКАЛЬНО: удалён\nВНЕШНИЙ:\n"
 
 #: lib/diff.tcl:130
 msgid ""
 "REMOTE: deleted\n"
 "LOCAL:\n"
-msgstr ""
-"ВНЕШНИЙ: удалён\n"
-"ЛОКАЛЬНО:\n"
+msgstr "ВНЕШНИЙ: удалён\nЛОКАЛЬНО:\n"
 
 #: lib/diff.tcl:137
 msgid "LOCAL:\n"
@@ -1631,9 +1520,7 @@ msgstr "* Двоичный файл (содержимое не показано)
 msgid ""
 "* Untracked file is %d bytes.\n"
 "* Showing only first %d bytes.\n"
-msgstr ""
-"* Размер неподготовленного файла %d байт.\n"
-"* Показано первых %d байт.\n"
+msgstr "* Размер неотслеживаемого файла %d байт.\n* Показано первых %d байт.\n"
 
 #: lib/diff.tcl:233
 #, tcl-format
@@ -1641,10 +1528,7 @@ msgid ""
 "\n"
 "* Untracked file clipped here by %s.\n"
 "* To see the entire file, use an external editor.\n"
-msgstr ""
-"\n"
-"* Неподготовленный файл обрезан: %s.\n"
-"* Чтобы увидеть весь файл, используйте программу-редактор.\n"
+msgstr "\n* Неотслеживаемый файл обрезан: %s.\n* Чтобы увидеть весь файл, используйте внешний редактор.\n"
 
 #: lib/diff.tcl:482
 msgid "Failed to unstage selected hunk."
@@ -1652,7 +1536,7 @@ msgstr "Не удалось исключить выбранную часть."
 
 #: lib/diff.tcl:489
 msgid "Failed to stage selected hunk."
-msgstr "Не удалось подготовить к сохранению выбранную часть."
+msgstr "Не удалось проиндексировать выбранный блок изменений."
 
 #: lib/diff.tcl:568
 msgid "Failed to unstage selected line."
@@ -1660,7 +1544,7 @@ msgstr "Не удалось исключить выбранную строку."
 
 #: lib/diff.tcl:576
 msgid "Failed to stage selected line."
-msgstr "Не удалось подготовить к сохранению выбранную строку."
+msgstr "Не удалось проиндексировать выбранную строку."
 
 #: lib/encoding.tcl:443
 msgid "Default"
@@ -1685,7 +1569,7 @@ msgstr "предупреждение"
 
 #: lib/error.tcl:94
 msgid "You must correct the above errors before committing."
-msgstr "Прежде чем сохранить, исправьте вышеуказанные ошибки."
+msgstr "Перед коммитом, исправьте вышеуказанные ошибки."
 
 #: lib/index.tcl:6
 msgid "Unable to unlock the index."
@@ -1699,9 +1583,7 @@ msgstr "Ошибка в индексе"
 msgid ""
 "Updating the Git index failed.  A rescan will be automatically started to "
 "resynchronize git-gui."
-msgstr ""
-"Не удалось обновить индекс Git. Состояние репозитория будет перечитано "
-"автоматически."
+msgstr "Не удалось обновить индекс Git. Состояние репозитория будет перечитано автоматически."
 
 #: lib/index.tcl:28
 msgid "Continue"
@@ -1714,32 +1596,30 @@ msgstr "Разблокировать индекс"
 #: lib/index.tcl:289
 #, tcl-format
 msgid "Unstaging %s from commit"
-msgstr "Удаление %s Ð¸Ð· Ð¿Ð¾Ð´Ð³Ð¾Ñ\82овленного"
+msgstr "Удаление %s Ð¸Ð· Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
 #: lib/index.tcl:328
 msgid "Ready to commit."
-msgstr "Ð\9fодгоÑ\82овлено Ð´Ð»Ñ\8f Ñ\81оÑ\85Ñ\80анениÑ\8f"
+msgstr "Ð\93оÑ\82ов Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
 
 #: lib/index.tcl:341
 #, tcl-format
 msgid "Adding %s"
-msgstr "Добавление %s..."
+msgstr "Добавление %s"
 
 #: lib/index.tcl:398
 #, tcl-format
 msgid "Revert changes in file %s?"
-msgstr "Отменить изменения в файле %s?"
+msgstr "Обратить изменения в файле %s?"
 
 #: lib/index.tcl:400
 #, tcl-format
 msgid "Revert changes in these %i files?"
-msgstr "Отменить изменения в %i файле(-ах)?"
+msgstr "Обратить изменения в %i файле(-ах)?"
 
 #: lib/index.tcl:408
 msgid "Any unstaged changes will be permanently lost by the revert."
-msgstr ""
-"Любые изменения, не подготовленные к сохранению, будут потеряны при данной "
-"операции."
+msgstr "Любые непроиндексированные изменения, будут потеряны при обращении изменений."
 
 #: lib/index.tcl:411
 msgid "Do Nothing"
@@ -1747,38 +1627,28 @@ msgstr "Ничего не делать"
 
 #: lib/index.tcl:429
 msgid "Reverting selected files"
-msgstr "Удаление изменений в выбранных файлах"
+msgstr "Ð\9eбÑ\80аÑ\89ение изменений в выбранных файлах"
 
 #: lib/index.tcl:433
 #, tcl-format
 msgid "Reverting %s"
-msgstr "Отмена изменений в %s"
+msgstr "Обращение изменений в %s"
 
 #: lib/merge.tcl:13
 msgid ""
 "Cannot merge while amending.\n"
 "\n"
 "You must finish amending this commit before starting any type of merge.\n"
-msgstr ""
-"Невозможно выполнить слияние во время исправления.\n"
-"\n"
-"Завершите исправление данного состояния перед выполнением операции слияния.\n"
+msgstr "Невозможно выполнить слияние во время исправления.\n\nЗавершите исправление данного коммита перед выполнением операции слияния.\n"
 
 #: lib/merge.tcl:27
 msgid ""
 "Last scanned state does not match repository state.\n"
 "\n"
-"Another Git program has modified this repository since the last scan.  A "
-"rescan must be performed before a merge can be performed.\n"
+"Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.\n"
 "\n"
 "The rescan will be automatically started now.\n"
-msgstr ""
-"Последнее прочитанное состояние репозитория не соответствует текущему.\n"
-"\n"
-"С момента последней проверки репозиторий был изменен другой программой Git. "
-"Необходимо перечитать репозиторий, прежде чем изменять текущую ветвь.\n"
-"\n"
-"Это будет сделано сейчас автоматически.\n"
+msgstr "Последнее прочитанное состояние репозитория не соответствует текущему.\n\nС момента последней проверки репозиторий был изменен другой программой Git. Необходимо перечитать репозиторий, прежде чем слияние может быть сделано.\n\nЭто будет сделано сейчас автоматически.\n"
 
 #: lib/merge.tcl:45
 #, tcl-format
@@ -1787,15 +1657,8 @@ msgid ""
 "\n"
 "File %s has merge conflicts.\n"
 "\n"
-"You must resolve them, stage the file, and commit to complete the current "
-"merge.  Only then can you begin another merge.\n"
-msgstr ""
-"Предыдущее слияние не завершено из-за конфликта.\n"
-"\n"
-"Для файла %s возник конфликт слияния.\n"
-"\n"
-"Разрешите конфликт, подготовьте файл и сохраните. Только после этого можно "
-"начать следующее слияние.\n"
+"You must resolve them, stage the file, and commit to complete the current merge.  Only then can you begin another merge.\n"
+msgstr "Предыдущее слияние не завершено из-за конфликта.\n\nДля файла %s возник конфликт слияния.\n\nРазрешите конфликт, добавьте файл в индекс и закоммитьте. Только после этого можно начать следующее слияние.\n"
 
 #: lib/merge.tcl:55
 #, tcl-format
@@ -1804,15 +1667,8 @@ msgid ""
 "\n"
 "File %s is modified.\n"
 "\n"
-"You should complete the current commit before starting a merge.  Doing so "
-"will help you abort a failed merge, should the need arise.\n"
-msgstr ""
-"Изменения не сохранены.\n"
-"\n"
-"Файл %s изменен.\n"
-"\n"
-"Подготовьте и сохраните изменения перед началом слияния. В случае "
-"необходимости это позволит прервать операцию слияния.\n"
+"You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.\n"
+msgstr "Вы находитесь в процессе изменений.\n\nФайл %s изменён.\n\nВы должны завершить текущий коммит перед началом слияния. В случае необходимости, это позволит прервать операцию слияния.\n"
 
 #: lib/merge.tcl:107
 #, tcl-format
@@ -1822,7 +1678,7 @@ msgstr "%s из %s"
 #: lib/merge.tcl:120
 #, tcl-format
 msgid "Merging %s and %s..."
-msgstr "Слияние %s и %s..."
+msgstr "Слияние %s и %s"
 
 #: lib/merge.tcl:131
 msgid "Merge completed successfully."
@@ -1846,10 +1702,7 @@ msgid ""
 "Cannot abort while amending.\n"
 "\n"
 "You must finish amending this commit.\n"
-msgstr ""
-"Невозможно прервать исправление.\n"
-"\n"
-"Завершите текущее исправление сохраненного состояния.\n"
+msgstr "Невозможно прервать исправление.\n\nЗавершите текущее исправление коммита.\n"
 
 #: lib/merge.tcl:222
 msgid ""
@@ -1858,12 +1711,7 @@ msgid ""
 "Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
 "\n"
 "Continue with aborting the current merge?"
-msgstr ""
-"Прервать операцию слияния?\n"
-"\n"
-"Прерывание этой операции приведет к потере *ВСЕХ* несохраненных изменений.\n"
-"\n"
-"Продолжить?"
+msgstr "Прервать операцию слияния?\n\nПрерывание текущего слияния приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
 
 #: lib/merge.tcl:228
 msgid ""
@@ -1872,12 +1720,7 @@ msgid ""
 "Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
 "\n"
 "Continue with resetting the current changes?"
-msgstr ""
-"Прервать операцию слияния?\n"
-"\n"
-"Прерывание этой операции приведет к потере *ВСЕХ* несохраненных изменений.\n"
-"\n"
-"Продолжить?"
+msgstr "Сбросить изменения?\n\nСброс изменений приведет к потере *ВСЕХ* несохраненных изменений.\n\nПродолжить?"
 
 #: lib/merge.tcl:239
 msgid "Aborting"
@@ -1901,11 +1744,11 @@ msgstr "Использовать базовую версию для разреш
 
 #: lib/mergetool.tcl:9
 msgid "Force resolution to this branch?"
-msgstr "Использовать версию этой ветви для разрешения конфликта?"
+msgstr "Использовать версию из этой ветки для разрешения конфликта?"
 
 #: lib/mergetool.tcl:10
 msgid "Force resolution to the other branch?"
-msgstr "Ð\98Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð²ÐµÑ\80Ñ\81иÑ\8e Ð´Ñ\80Ñ\83гой Ð²ÐµÑ\82ви для разрешения конфликта?"
+msgstr "Ð\98Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð²ÐµÑ\80Ñ\81иÑ\8e Ð¸Ð· Ð´Ñ\80Ñ\83гой Ð²ÐµÑ\82ки для разрешения конфликта?"
 
 #: lib/mergetool.tcl:14
 #, tcl-format
@@ -1915,19 +1758,12 @@ msgid ""
 "%s will be overwritten.\n"
 "\n"
 "This operation can be undone only by restarting the merge."
-msgstr ""
-"Внимание! Список изменений показывает только конфликтующие отличия.\n"
-"\n"
-"%s будет переписан.\n"
-"\n"
-"Это действие можно отменить только перезапуском операции слияния."
+msgstr "Внимание! Список изменений показывает только конфликтующие отличия.\n\n%s будет переписан.\n\nЭто действие можно отменить только перезапуском операции слияния."
 
 #: lib/mergetool.tcl:45
 #, tcl-format
 msgid "File %s seems to have unresolved conflicts, still stage?"
-msgstr ""
-"Файл %s, похоже, содержит необработанные конфликты. Продолжить подготовку к "
-"сохранению?"
+msgstr "Похоже, что файл %s содержит неразрешенные конфликты. Продолжить индексацию?"
 
 #: lib/mergetool.tcl:60
 #, tcl-format
@@ -1936,8 +1772,7 @@ msgstr "Добавляю результат разрешения для %s"
 
 #: lib/mergetool.tcl:141
 msgid "Cannot resolve deletion or link conflicts using a tool"
-msgstr ""
-"Программа слияния не обрабатывает конфликты с удалением или участием ссылок"
+msgstr "Программа слияния не обрабатывает конфликты с удалением или участием ссылок"
 
 #: lib/mergetool.tcl:146
 msgid "Conflict file does not exist"
@@ -1946,12 +1781,12 @@ msgstr "Конфликтующий файл не существует"
 #: lib/mergetool.tcl:264
 #, tcl-format
 msgid "Not a GUI merge tool: '%s'"
-msgstr "'%s' не является программой слияния"
+msgstr "«%s» не является программой слияния"
 
 #: lib/mergetool.tcl:268
 #, tcl-format
 msgid "Unsupported merge tool '%s'"
-msgstr "Ð\9dеизвеÑ\81Ñ\82наÑ\8f Ð¿Ñ\80огÑ\80амма Ñ\81лиÑ\8fниÑ\8f '%s'"
+msgstr "Ð\9dеподдеÑ\80живаемаÑ\8f Ð¿Ñ\80огÑ\80амма Ñ\81лиÑ\8fниÑ\8f Â«%s»"
 
 #: lib/mergetool.tcl:303
 msgid "Merge tool is already running, terminate it?"
@@ -1962,9 +1797,7 @@ msgstr "Программа слияния уже работает. Прерва
 msgid ""
 "Error retrieving versions:\n"
 "%s"
-msgstr ""
-"Ошибка получения версий:\n"
-"%s"
+msgstr "Ошибка получения версий:\n%s"
 
 #: lib/mergetool.tcl:343
 #, tcl-format
@@ -1972,14 +1805,11 @@ msgid ""
 "Could not start the merge tool:\n"
 "\n"
 "%s"
-msgstr ""
-"Ошибка запуска программы слияния:\n"
-"\n"
-"%s"
+msgstr "Ошибка запуска программы слияния:\n\n%s"
 
 #: lib/mergetool.tcl:347
 msgid "Running merge tool..."
-msgstr "Запуск программы слияния..."
+msgstr "Запуск программы слияния"
 
 #: lib/mergetool.tcl:375 lib/mergetool.tcl:383
 msgid "Merge tool failed."
@@ -1988,12 +1818,12 @@ msgstr "Ошибка выполнения программы слияния."
 #: lib/option.tcl:11
 #, tcl-format
 msgid "Invalid global encoding '%s'"
-msgstr "Ð\9eÑ\88ибка Ð² Ð³Ð»Ð¾Ð±Ð°Ð»Ñ\8cной Ñ\83Ñ\81Ñ\82ановке ÐºÐ¾Ð´Ð¸Ñ\80овки '%s'"
+msgstr "Ð\9dевеÑ\80наÑ\8f Ð³Ð»Ð¾Ð±Ð°Ð»Ñ\8cнаÑ\8f ÐºÐ¾Ð´Ð¸Ñ\80овка Â«%s»"
 
 #: lib/option.tcl:19
 #, tcl-format
 msgid "Invalid repo encoding '%s'"
-msgstr "Неверная кодировка репозитория: '%s'"
+msgstr "Неверная кодировка репозитория «%s»"
 
 #: lib/option.tcl:117
 msgid "Restore Defaults"
@@ -2022,7 +1852,7 @@ msgstr "Адрес электронной почты"
 
 #: lib/option.tcl:141
 msgid "Summarize Merge Commits"
-msgstr "Суммарный комментарий при слиянии"
+msgstr "Суммарное сообщение при слиянии"
 
 #: lib/option.tcl:142
 msgid "Merge Verbosity"
@@ -2042,11 +1872,11 @@ msgstr "Доверять времени модификации файла"
 
 #: lib/option.tcl:147
 msgid "Prune Tracking Branches During Fetch"
-msgstr "ЧиÑ\81Ñ\82ка Ð²ÐµÑ\82вей Ñ\81лежениÑ\8f Ð¿Ñ\80и Ð¿Ð¾Ð»Ñ\83чении изменений"
+msgstr "ЧиÑ\81Ñ\82ка Ð¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 Ð²ÐµÑ\82ок Ð¿Ñ\80и Ð¸Ð·Ð²Ð»Ðµчении изменений"
 
 #: lib/option.tcl:148
 msgid "Match Tracking Branches"
-msgstr "Ð\98мÑ\8f Ð½Ð¾Ð²Ð¾Ð¹ Ð²ÐµÑ\82ви Ð²Ð·Ñ\8fÑ\82Ñ\8c Ð¸Ð· Ð¸Ð¼ÐµÐ½ Ð²ÐµÑ\82вей Ñ\81лежениÑ\8f"
+msgstr "Такое Ð¶Ðµ Ð¸Ð¼Ñ\8f, ÐºÐ°Ðº Ð¸ Ñ\83 Ð¾Ñ\82Ñ\81леживаемой Ð²ÐµÑ\82ки"
 
 #: lib/option.tcl:149
 msgid "Blame Copy Only On Changed Files"
@@ -2066,11 +1896,11 @@ msgstr "Число строк в контексте diff"
 
 #: lib/option.tcl:153
 msgid "Commit Message Text Width"
-msgstr "Ширина текста комментария"
+msgstr "Ширина текста сообщения коммита"
 
 #: lib/option.tcl:154
 msgid "New Branch Name Template"
-msgstr "Шаблон Ð´Ð»Ñ\8f Ð¸Ð¼ÐµÐ½Ð¸ Ð½Ð¾Ð²Ð¾Ð¹ Ð²ÐµÑ\82ви"
+msgstr "Шаблон Ð´Ð»Ñ\8f Ð¸Ð¼ÐµÐ½Ð¸ Ð½Ð¾Ð²Ð¾Ð¹ Ð²ÐµÑ\82ки"
 
 #: lib/option.tcl:155
 msgid "Default File Contents Encoding"
@@ -2093,7 +1923,6 @@ msgstr "Изменить"
 msgid "Choose %s"
 msgstr "Выберите %s"
 
-# carbon copy
 #: lib/option.tcl:264
 msgid "pt."
 msgstr "pt."
@@ -2116,7 +1945,7 @@ msgstr "Чистка"
 
 #: lib/remote.tcl:173
 msgid "Fetch from"
-msgstr "Ð\9fолÑ\83чение из"
+msgstr "Ð\98звлечение из"
 
 #: lib/remote.tcl:215
 msgid "Push to"
@@ -2132,7 +1961,7 @@ msgstr "Добавить внешний репозиторий"
 
 #: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36
 msgid "Add"
-msgstr ""
+msgstr "Добавить"
 
 #: lib/remote_add.tcl:37
 msgid "Remote Details"
@@ -2148,7 +1977,7 @@ msgstr "Следующая операция"
 
 #: lib/remote_add.tcl:65
 msgid "Fetch Immediately"
-msgstr "Скачать сразу"
+msgstr "Сразу извлечь изменения"
 
 #: lib/remote_add.tcl:71
 msgid "Initialize Remote Repository and Push"
@@ -2165,27 +1994,27 @@ msgstr "Укажите название внешнего репозитория.
 #: lib/remote_add.tcl:114
 #, tcl-format
 msgid "'%s' is not an acceptable remote name."
-msgstr "Недопустимое название внешнего репозитория '%s'."
+msgstr "«%s» не является допустимым именем внешнего репозитория."
 
 #: lib/remote_add.tcl:125
 #, tcl-format
 msgid "Failed to add remote '%s' of location '%s'."
-msgstr "Не удалось добавить '%s' из '%s'. "
+msgstr "Не удалось добавить «%s» из «%s». "
 
 #: lib/remote_add.tcl:133 lib/transport.tcl:6
 #, tcl-format
 msgid "fetch %s"
-msgstr "полÑ\83чение %s"
+msgstr "извлечение %s"
 
 #: lib/remote_add.tcl:134
 #, tcl-format
 msgid "Fetching the %s"
-msgstr "Ð\9fолÑ\83чение %s"
+msgstr "Ð\98звлечение %s"
 
 #: lib/remote_add.tcl:157
 #, tcl-format
 msgid "Do not know how to initialize repository at location '%s'."
-msgstr "Невозможно инициализировать репозиторий в '%s'."
+msgstr "Невозможно инициализировать репозиторий в «%s»."
 
 #: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63
 #: lib/transport.tcl:81
@@ -2200,7 +2029,7 @@ msgstr "Настройка %s (в %s)"
 
 #: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
 msgid "Delete Branch Remotely"
-msgstr "Удаление Ð²ÐµÑ\82ви во внешнем репозитории"
+msgstr "Удаление Ð²ÐµÑ\82ки во внешнем репозитории"
 
 #: lib/remote_branch_delete.tcl:47
 msgid "From Repository"
@@ -2216,7 +2045,7 @@ msgstr "Указанное положение:"
 
 #: lib/remote_branch_delete.tcl:84
 msgid "Branches"
-msgstr "Ð\92еÑ\82ви"
+msgstr "Ð\92еÑ\82ки"
 
 #: lib/remote_branch_delete.tcl:109
 msgid "Delete Only If"
@@ -2228,7 +2057,7 @@ msgstr "Слияние с:"
 
 #: lib/remote_branch_delete.tcl:152
 msgid "A branch is required for 'Merged Into'."
-msgstr "Для опции 'Слияние с' требуется указать ветвь."
+msgstr "Для операции «Слияние с» требуется указать ветку."
 
 #: lib/remote_branch_delete.tcl:184
 #, tcl-format
@@ -2236,28 +2065,23 @@ msgid ""
 "The following branches are not completely merged into %s:\n"
 "\n"
 " - %s"
-msgstr ""
-"Следующие ветви могут быть объединены с %s при помощи операции слияния:\n"
-"\n"
-" - %s"
+msgstr "Следующие ветки могут быть объединены с %s при помощи операции слияния:\n\n - %s"
 
 #: lib/remote_branch_delete.tcl:189
 #, tcl-format
 msgid ""
 "One or more of the merge tests failed because you have not fetched the "
 "necessary commits.  Try fetching from %s first."
-msgstr ""
-"Некоторые тесты на слияние не прошли, потому что Вы не получили необходимые "
-"состояния. Попытайтесь получить их из %s."
+msgstr "Некоторые тесты на слияние не прошли, потому что вы не извлекли необходимые коммиты. Попытайтесь извлечь их из %s."
 
 #: lib/remote_branch_delete.tcl:207
 msgid "Please select one or more branches to delete."
-msgstr "УкажиÑ\82е Ð¾Ð´Ð½Ñ\83 Ð¸Ð»Ð¸ Ð½ÐµÑ\81колÑ\8cко Ð²ÐµÑ\82вей для удаления."
+msgstr "УкажиÑ\82е Ð¾Ð´Ð½Ñ\83 Ð¸Ð»Ð¸ Ð½ÐµÑ\81колÑ\8cко Ð²ÐµÑ\82ок для удаления."
 
 #: lib/remote_branch_delete.tcl:226
 #, tcl-format
 msgid "Deleting branches from %s"
-msgstr "Удаление Ð²ÐµÑ\82вей из %s"
+msgstr "Удаление Ð²ÐµÑ\82ок из %s"
 
 #: lib/remote_branch_delete.tcl:292
 msgid "No repository selected."
@@ -2266,7 +2090,7 @@ msgstr "Не указан репозиторий."
 #: lib/remote_branch_delete.tcl:297
 #, tcl-format
 msgid "Scanning %s..."
-msgstr "Перечитывание %s... "
+msgstr "Перечитывание %s"
 
 #: lib/search.tcl:21
 msgid "Find:"
@@ -2352,7 +2176,7 @@ msgstr "Ваш публичный ключ OpenSSH"
 
 #: lib/sshkey.tcl:78
 msgid "Generating..."
-msgstr "Создание..."
+msgstr "Создание"
 
 #: lib/sshkey.tcl:84
 #, tcl-format
@@ -2360,10 +2184,7 @@ msgid ""
 "Could not start ssh-keygen:\n"
 "\n"
 "%s"
-msgstr ""
-"Ошибка запуска ssh-keygen:\n"
-"\n"
-"%s"
+msgstr "Ошибка запуска ssh-keygen:\n\n%s"
 
 #: lib/sshkey.tcl:111
 msgid "Generation failed."
@@ -2381,7 +2202,7 @@ msgstr "Ваш ключ находится в: %s"
 #: lib/status_bar.tcl:83
 #, tcl-format
 msgid "%s ... %*i of %*i %s (%3i%%)"
-msgstr "%s ... %*i из %*i %s (%3i%%)"
+msgstr "%s  %*i из %*i %s (%3i%%)"
 
 #: lib/tools.tcl:75
 #, tcl-format
@@ -2431,7 +2252,7 @@ msgstr "Описание вспомогательной операции"
 
 #: lib/tools_dlg.tcl:48
 msgid "Use '/' separators to create a submenu tree:"
-msgstr "Используйте '/' для создания подменю"
+msgstr "Используйте «/» для создания подменю"
 
 #: lib/tools_dlg.tcl:61
 msgid "Command:"
@@ -2464,16 +2285,14 @@ msgstr "Укажите название вспомогательной опер
 #: lib/tools_dlg.tcl:129
 #, tcl-format
 msgid "Tool '%s' already exists."
-msgstr "Вспомогательная операция '%s' уже существует."
+msgstr "Вспомогательная операция «%s» уже существует."
 
 #: lib/tools_dlg.tcl:151
 #, tcl-format
 msgid ""
 "Could not add tool:\n"
 "%s"
-msgstr ""
-"Ошибка добавления программы:\n"
-"%s"
+msgstr "Ошибка добавления программы:\n%s"
 
 #: lib/tools_dlg.tcl:190
 msgid "Remove Tool"
@@ -2507,9 +2326,8 @@ msgstr "OK"
 #: lib/transport.tcl:7
 #, tcl-format
 msgid "Fetching new changes from %s"
-msgstr "Ð\9fолÑ\83чение изменений из %s "
+msgstr "Ð\98звлечение изменений из %s "
 
-# carbon copy
 #: lib/transport.tcl:18
 #, tcl-format
 msgid "remote prune %s"
@@ -2518,7 +2336,7 @@ msgstr "чистка внешнего %s"
 #: lib/transport.tcl:19
 #, tcl-format
 msgid "Pruning tracking branches deleted from %s"
-msgstr "ЧиÑ\81Ñ\82ка Ð²ÐµÑ\82вей Ñ\81лежениÑ\8f, Ñ\83даленных из %s"
+msgstr "ЧиÑ\81Ñ\82ка Ð¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 Ð²ÐµÑ\82ок, Ñ\83далÑ\91нных из %s"
 
 #: lib/transport.tcl:26
 #, tcl-format
@@ -2537,11 +2355,11 @@ msgstr "Отправка %s %s в %s"
 
 #: lib/transport.tcl:100
 msgid "Push Branches"
-msgstr "Ð\9eÑ\82пÑ\80авиÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ð²ÐµÑ\82вÑ\8fÑ\85"
+msgstr "Ð\9eÑ\82пÑ\80авиÑ\82Ñ\8c Ð²ÐµÑ\82ки"
 
 #: lib/transport.tcl:114
 msgid "Source Branches"
-msgstr "Ð\98Ñ\81Ñ\85однÑ\8bе Ð²ÐµÑ\82ви"
+msgstr "Ð\98Ñ\81Ñ\85однÑ\8bе Ð²ÐµÑ\82ки"
 
 #: lib/transport.tcl:131
 msgid "Destination Repository"
@@ -2553,7 +2371,7 @@ msgstr "Настройки отправки"
 
 #: lib/transport.tcl:171
 msgid "Force overwrite existing branch (may discard changes)"
-msgstr "Ð\9dамеÑ\80енно Ð¿ÐµÑ\80епиÑ\81аÑ\82Ñ\8c Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ð²ÐµÑ\82вÑ\8c (возможна потеря изменений)"
+msgstr "Ð\9fÑ\80инÑ\83диÑ\82елÑ\8cно Ð¿ÐµÑ\80езапиÑ\81аÑ\82Ñ\8c Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 (возможна потеря изменений)"
 
 #: lib/transport.tcl:175
 msgid "Use thin pack (for slow network connections)"
index 9abd00be212b3e55883c0f9fa0487c7b31a6039f..9a8b97a2aba9aa9fabb095558c03cb8f27df3d50 100644 (file)
@@ -125,16 +125,7 @@ setup_user_tool () {
        }
 
        merge_cmd () {
-               trust_exit_code=$(git config --bool \
-                       "mergetool.$1.trustExitCode" || echo false)
-               if test "$trust_exit_code" = "false"
-               then
-                       touch "$BACKUP"
-                       ( eval $merge_tool_cmd )
-                       check_unchanged
-               else
-                       ( eval $merge_tool_cmd )
-               fi
+               ( eval $merge_tool_cmd )
        }
 }
 
@@ -162,6 +153,28 @@ setup_tool () {
                echo "$1"
        }
 
+       # Most tools' exit codes cannot be trusted, so By default we ignore
+       # their exit code and check the merged file's modification time in
+       # check_unchanged() to determine whether or not the merge was
+       # successful.  The return value from run_merge_cmd, by default, is
+       # determined by check_unchanged().
+       #
+       # When a tool's exit code can be trusted then the return value from
+       # run_merge_cmd is simply the tool's exit code, and check_unchanged()
+       # is not called.
+       #
+       # The return value of exit_code_trustable() tells us whether or not we
+       # can trust the tool's exit code.
+       #
+       # User-defined and built-in tools default to false.
+       # Built-in tools advertise that their exit code is trustable by
+       # redefining exit_code_trustable() to true.
+
+       exit_code_trustable () {
+               false
+       }
+
+
        if ! test -f "$MERGE_TOOLS_DIR/$tool"
        then
                setup_user_tool
@@ -197,6 +210,19 @@ get_merge_tool_cmd () {
        fi
 }
 
+trust_exit_code () {
+       if git config --bool "mergetool.$1.trustExitCode"
+       then
+               :; # OK
+       elif exit_code_trustable
+       then
+               echo true
+       else
+               echo false
+       fi
+}
+
+
 # Entry point for running tools
 run_merge_tool () {
        # If GIT_PREFIX is empty then we cannot use it in tools
@@ -225,7 +251,15 @@ run_diff_cmd () {
 
 # Run a either a configured or built-in merge tool
 run_merge_cmd () {
-       merge_cmd "$1"
+       mergetool_trust_exit_code=$(trust_exit_code "$1")
+       if test "$mergetool_trust_exit_code" = "true"
+       then
+               merge_cmd "$1"
+       else
+               touch "$BACKUP"
+               merge_cmd "$1"
+               check_unchanged
+       fi
 }
 
 list_merge_tool_candidates () {
index bf862705d8c654a5dd58ec70d6781583b7dbefc3..c062e3de3a503bd01203f2a6aef63eea63cae5c5 100755 (executable)
@@ -3,12 +3,13 @@
 # This program resolves merge conflicts in git
 #
 # Copyright (c) 2006 Theodore Y. Ts'o
+# Copyright (c) 2009-2016 David Aguilar
 #
 # This file is licensed under the GPL v2, or a later version
 # at the discretion of Junio C Hamano.
 #
 
-USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [file to merge] ...'
+USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [-O<orderfile>] [file to merge] ...'
 SUBDIRECTORY_OK=Yes
 NONGIT_OK=Yes
 OPTIONS_SPEC=
@@ -365,51 +366,6 @@ merge_file () {
        return 0
 }
 
-prompt=$(git config --bool mergetool.prompt)
-guessed_merge_tool=false
-
-while test $# != 0
-do
-       case "$1" in
-       --tool-help=*)
-               TOOL_MODE=${1#--tool-help=}
-               show_tool_help
-               ;;
-       --tool-help)
-               show_tool_help
-               ;;
-       -t|--tool*)
-               case "$#,$1" in
-               *,*=*)
-                       merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
-                       ;;
-               1,*)
-                       usage ;;
-               *)
-                       merge_tool="$2"
-                       shift ;;
-               esac
-               ;;
-       -y|--no-prompt)
-               prompt=false
-               ;;
-       --prompt)
-               prompt=true
-               ;;
-       --)
-               shift
-               break
-               ;;
-       -*)
-               usage
-               ;;
-       *)
-               break
-               ;;
-       esac
-       shift
-done
-
 prompt_after_failed_merge () {
        while true
        do
@@ -426,57 +382,126 @@ prompt_after_failed_merge () {
        done
 }
 
-git_dir_init
-require_work_tree
+print_noop_and_exit () {
+       echo "No files need merging"
+       exit 0
+}
+
+main () {
+       prompt=$(git config --bool mergetool.prompt)
+       guessed_merge_tool=false
+       orderfile=
+
+       while test $# != 0
+       do
+               case "$1" in
+               --tool-help=*)
+                       TOOL_MODE=${1#--tool-help=}
+                       show_tool_help
+                       ;;
+               --tool-help)
+                       show_tool_help
+                       ;;
+               -t|--tool*)
+                       case "$#,$1" in
+                       *,*=*)
+                               merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
+                               ;;
+                       1,*)
+                               usage ;;
+                       *)
+                               merge_tool="$2"
+                               shift ;;
+                       esac
+                       ;;
+               -y|--no-prompt)
+                       prompt=false
+                       ;;
+               --prompt)
+                       prompt=true
+                       ;;
+               -O*)
+                       orderfile="${1#-O}"
+                       ;;
+               --)
+                       shift
+                       break
+                       ;;
+               -*)
+                       usage
+                       ;;
+               *)
+                       break
+                       ;;
+               esac
+               shift
+       done
+
+       git_dir_init
+       require_work_tree
 
-if test -z "$merge_tool"
-then
-       # Check if a merge tool has been configured
-       merge_tool=$(get_configured_merge_tool)
-       # Try to guess an appropriate merge tool if no tool has been set.
        if test -z "$merge_tool"
        then
-               merge_tool=$(guess_merge_tool) || exit
-               guessed_merge_tool=true
+               # Check if a merge tool has been configured
+               merge_tool=$(get_configured_merge_tool)
+               # Try to guess an appropriate merge tool if no tool has been set.
+               if test -z "$merge_tool"
+               then
+                       merge_tool=$(guess_merge_tool) || exit
+                       guessed_merge_tool=true
+               fi
        fi
-fi
-merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
-merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
-
-files=
+       merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
+       merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
 
-if test $# -eq 0
-then
+       prefix=$(git rev-parse --show-prefix) || exit 1
        cd_to_toplevel
 
-       if test -e "$GIT_DIR/MERGE_RR"
+       if test -n "$orderfile"
        then
-               files=$(git rerere remaining)
-       else
-               files=$(git ls-files -u | sed -e 's/^[^ ]*      //' | sort -u)
+               orderfile=$(
+                       git rev-parse --prefix "$prefix" -- "$orderfile" |
+                       sed -e 1d
+               )
        fi
-else
-       files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]*      //' | sort -u)
-fi
 
-if test -z "$files"
-then
-       echo "No files need merging"
-       exit 0
-fi
+       if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR"
+       then
+               set -- $(git rerere remaining)
+               if test $# -eq 0
+               then
+                       print_noop_and_exit
+               fi
+       elif test $# -ge 0
+       then
+               # rev-parse provides the -- needed for 'set'
+               eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
+       fi
 
-printf "Merging:\n"
-printf "%s\n" "$files"
+       files=$(git -c core.quotePath=false \
+               diff --name-only --diff-filter=U \
+               ${orderfile:+"-O$orderfile"} -- "$@")
 
-rc=0
-for i in $files
-do
-       printf "\n"
-       if ! merge_file "$i"
+       if test -z "$files"
        then
-               rc=1
-               prompt_after_failed_merge || exit 1
+               print_noop_and_exit
        fi
-done
 
-exit $rc
+       printf "Merging:\n"
+       printf "%s\n" "$files"
+
+       rc=0
+       for i in $files
+       do
+               printf "\n"
+               if ! merge_file "$i"
+               then
+                       rc=1
+                       prompt_after_failed_merge || exit 1
+               fi
+       done
+
+       exit $rc
+}
+
+main "$@"
index fd5ca524626c40823371422e52a3457fd1d45579..8d151da91b9699e804f4d28b865af7f44138bfc1 100755 (executable)
--- a/git-p4.py
+++ b/git-p4.py
@@ -25,6 +25,7 @@ import stat
 import zipfile
 import zlib
 import ctypes
+import errno
 
 try:
     from subprocess import CalledProcessError
@@ -78,6 +79,13 @@ def p4_build_cmd(cmd):
     if len(client) > 0:
         real_cmd += ["-c", client]
 
+    retries = gitConfigInt("git-p4.retries")
+    if retries is None:
+        # Perform 3 retries by default
+        retries = 3
+    if retries > 0:
+        # Provide a way to not pass this option by setting git-p4.retries to 0
+        real_cmd += ["-r", str(retries)]
 
     if isinstance(cmd,basestring):
         real_cmd = ' '.join(real_cmd) + ' ' + cmd
@@ -85,6 +93,16 @@ def p4_build_cmd(cmd):
         real_cmd += cmd
     return real_cmd
 
+def git_dir(path):
+    """ Return TRUE if the given path is a git directory (/path/to/dir/.git).
+        This won't automatically add ".git" to a directory.
+    """
+    d = read_pipe(["git", "--git-dir", path, "rev-parse", "--git-dir"], True).strip()
+    if not d or len(d) == 0:
+        return None
+    else:
+        return d
+
 def chdir(path, is_client_path=False):
     """Do chdir to the given path, and set the PWD environment
        variable for use by P4.  It does not look at getcwd() output.
@@ -142,17 +160,42 @@ def p4_write_pipe(c, stdin):
     real_cmd = p4_build_cmd(c)
     return write_pipe(real_cmd, stdin)
 
-def read_pipe(c, ignore_error=False):
+def read_pipe_full(c):
+    """ Read output from  command. Returns a tuple
+        of the return status, stdout text and stderr
+        text.
+    """
     if verbose:
         sys.stderr.write('Reading pipe: %s\n' % str(c))
 
     expand = isinstance(c,basestring)
     p = subprocess.Popen(c, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=expand)
     (out, err) = p.communicate()
-    if p.returncode != 0 and not ignore_error:
-        die('Command failed: %s\nError: %s' % (str(c), err))
+    return (p.returncode, out, err)
+
+def read_pipe(c, ignore_error=False):
+    """ Read output from  command. Returns the output text on
+        success. On failure, terminates execution, unless
+        ignore_error is True, when it returns an empty string.
+    """
+    (retcode, out, err) = read_pipe_full(c)
+    if retcode != 0:
+        if ignore_error:
+            out = ""
+        else:
+            die('Command failed: %s\nError: %s' % (str(c), err))
     return out
 
+def read_pipe_text(c):
+    """ Read output from a command with trailing whitespace stripped.
+        On error, returns None.
+    """
+    (retcode, out, err) = read_pipe_full(c)
+    if retcode != 0:
+        return None
+    else:
+        return out.rstrip()
+
 def p4_read_pipe(c, ignore_error=False):
     real_cmd = p4_build_cmd(c)
     return read_pipe(real_cmd, ignore_error)
@@ -262,6 +305,10 @@ def p4_revert(f):
 def p4_reopen(type, f):
     p4_system(["reopen", "-t", type, wildcard_encode(f)])
 
+def p4_reopen_in_change(changelist, files):
+    cmd = ["reopen", "-c", str(changelist)] + files
+    p4_system(cmd)
+
 def p4_move(src, dest):
     p4_system(["move", "-k", wildcard_encode(src), wildcard_encode(dest)])
 
@@ -555,18 +602,10 @@ def p4Where(depotPath):
     return clientPath
 
 def currentGitBranch():
-    retcode = system(["git", "symbolic-ref", "-q", "HEAD"], ignore_error=True)
-    if retcode != 0:
-        # on a detached head
-        return None
-    else:
-        return read_pipe(["git", "name-rev", "HEAD"]).split(" ")[1].strip()
+    return read_pipe_text(["git", "symbolic-ref", "--short", "-q", "HEAD"])
 
 def isValidGitDir(path):
-    if (os.path.exists(path + "/HEAD")
-        and os.path.exists(path + "/refs") and os.path.exists(path + "/objects")):
-        return True;
-    return False
+    return git_dir(path) != None
 
 def parseRevision(ref):
     return read_pipe("git rev-parse %s" % ref).strip()
@@ -655,7 +694,7 @@ def gitConfigInt(key):
 def gitConfigList(key):
     if not _gitConfig.has_key(key):
         s = read_pipe(["git", "config", "--get-all", key], ignore_error=True)
-        _gitConfig[key] = s.strip().split(os.linesep)
+        _gitConfig[key] = s.strip().splitlines()
         if _gitConfig[key] == ['']:
             _gitConfig[key] = []
     return _gitConfig[key]
@@ -822,7 +861,7 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
                 die("cannot use --changes-block-size with non-numeric revisions")
             block_size = None
 
-    changes = []
+    changes = set()
 
     # Retrieve changes a block at a time, to prevent running
     # into a MaxResults/MaxScanRows error from the server.
@@ -841,7 +880,7 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
 
         # Insert changes in chronological order
         for line in reversed(p4_read_pipe_lines(cmd)):
-            changes.append(int(line.split(" ")[1]))
+            changes.add(int(line.split(" ")[1]))
 
         if not block_size:
             break
@@ -1005,18 +1044,20 @@ class LargeFileSystem(object):
            steps."""
         if self.exceedsLargeFileThreshold(relPath, contents) or self.hasLargeFileExtension(relPath):
             contentTempFile = self.generateTempFile(contents)
-            (git_mode, contents, localLargeFile) = self.generatePointer(contentTempFile)
-
-            # Move temp file to final location in large file system
-            largeFileDir = os.path.dirname(localLargeFile)
-            if not os.path.isdir(largeFileDir):
-                os.makedirs(largeFileDir)
-            shutil.move(contentTempFile, localLargeFile)
-            self.addLargeFile(relPath)
-            if gitConfigBool('git-p4.largeFilePush'):
-                self.pushFile(localLargeFile)
-            if verbose:
-                sys.stderr.write("%s moved to large file system (%s)\n" % (relPath, localLargeFile))
+            (pointer_git_mode, contents, localLargeFile) = self.generatePointer(contentTempFile)
+            if pointer_git_mode:
+                git_mode = pointer_git_mode
+            if localLargeFile:
+                # Move temp file to final location in large file system
+                largeFileDir = os.path.dirname(localLargeFile)
+                if not os.path.isdir(largeFileDir):
+                    os.makedirs(largeFileDir)
+                shutil.move(contentTempFile, localLargeFile)
+                self.addLargeFile(relPath)
+                if gitConfigBool('git-p4.largeFilePush'):
+                    self.pushFile(localLargeFile)
+                if verbose:
+                    sys.stderr.write("%s moved to large file system (%s)\n" % (relPath, localLargeFile))
         return (git_mode, contents)
 
 class MockLFS(LargeFileSystem):
@@ -1056,6 +1097,9 @@ class GitLFS(LargeFileSystem):
            the actual content. Return also the new location of the actual
            content.
            """
+        if os.path.getsize(contentFile) == 0:
+            return (None, '', None)
+
         pointerProcess = subprocess.Popen(
             ['git', 'lfs', 'pointer', '--file=' + contentFile],
             stdout=subprocess.PIPE
@@ -1098,10 +1142,10 @@ class GitLFS(LargeFileSystem):
                 '# Git LFS (see https://git-lfs.github.com/)\n',
                 '#\n',
             ] +
-            ['*.' + f.replace(' ', '[[:space:]]') + ' filter=lfs -text\n'
+            ['*.' + f.replace(' ', '[[:space:]]') + ' filter=lfs diff=lfs merge=lfs -text\n'
                 for f in sorted(gitConfigList('git-p4.largeFileExtensions'))
             ] +
-            ['/' + f.replace(' ', '[[:space:]]') + ' filter=lfs -text\n'
+            ['/' + f.replace(' ', '[[:space:]]') + ' filter=lfs diff=lfs merge=lfs -text\n'
                 for f in sorted(self.largeFiles) if not self.hasLargeFileExtension(f)
             ]
         )
@@ -1289,6 +1333,12 @@ class P4Submit(Command, P4UserMap):
                 optparse.make_option("--conflict", dest="conflict_behavior",
                                      choices=self.conflict_behavior_choices),
                 optparse.make_option("--branch", dest="branch"),
+                optparse.make_option("--shelve", dest="shelve", action="store_true",
+                                     help="Shelve instead of submit. Shelved files are reverted, "
+                                     "restoring the workspace to the state before the shelve"),
+                optparse.make_option("--update-shelve", dest="update_shelve", action="store", type="int",
+                                     metavar="CHANGELIST",
+                                     help="update an existing shelved changelist, implies --shelve")
         ]
         self.description = "Submit changes from git to the perforce depot."
         self.usage += " [name of git branch to submit into perforce depot]"
@@ -1296,6 +1346,8 @@ class P4Submit(Command, P4UserMap):
         self.detectRenames = False
         self.preserveUser = gitConfigBool("git-p4.preserveUser")
         self.dry_run = False
+        self.shelve = False
+        self.update_shelve = None
         self.prepare_p4_only = False
         self.conflict_behavior = None
         self.isWindows = (platform.system() == "Windows")
@@ -1464,7 +1516,7 @@ class P4Submit(Command, P4UserMap):
                     return 1
         return 0
 
-    def prepareSubmitTemplate(self):
+    def prepareSubmitTemplate(self, changelist=None):
         """Run "p4 change -o" to grab a change specification template.
            This does not use "p4 -G", as it is nice to keep the submission
            template in original order, since a human might edit it.
@@ -1476,7 +1528,11 @@ class P4Submit(Command, P4UserMap):
 
         template = ""
         inFilesSection = False
-        for line in p4_read_pipe_lines(['change', '-o']):
+        args = ['change', '-o']
+        if changelist:
+            args.append(str(changelist))
+
+        for line in p4_read_pipe_lines(args):
             if line.endswith("\r\n"):
                 line = line[:-2] + "\n"
             if inFilesSection:
@@ -1538,7 +1594,7 @@ class P4Submit(Command, P4UserMap):
             if response == 'n':
                 return False
 
-    def get_diff_description(self, editedFiles, filesToAdd):
+    def get_diff_description(self, editedFiles, filesToAdd, symlinks):
         # diff
         if os.environ.has_key("P4DIFF"):
             del(os.environ["P4DIFF"])
@@ -1553,10 +1609,17 @@ class P4Submit(Command, P4UserMap):
             newdiff += "==== new file ====\n"
             newdiff += "--- /dev/null\n"
             newdiff += "+++ %s\n" % newFile
-            f = open(newFile, "r")
-            for line in f.readlines():
-                newdiff += "+" + line
-            f.close()
+
+            is_link = os.path.islink(newFile)
+            expect_link = newFile in symlinks
+
+            if is_link and expect_link:
+                newdiff += "+%s\n" % os.readlink(newFile)
+            else:
+                f = open(newFile, "r")
+                for line in f.readlines():
+                    newdiff += "+" + line
+                f.close()
 
         return (diff + newdiff).replace('\r\n', '\n')
 
@@ -1574,12 +1637,16 @@ class P4Submit(Command, P4UserMap):
         filesToDelete = set()
         editedFiles = set()
         pureRenameCopy = set()
+        symlinks = set()
         filesToChangeExecBit = {}
+        all_files = list()
 
         for line in diff:
             diff = parseDiffTreeEntry(line)
             modifier = diff['status']
             path = diff['src']
+            all_files.append(path)
+
             if modifier == "M":
                 p4_edit(path)
                 if isModeExecChanged(diff['src_mode'], diff['dst_mode']):
@@ -1590,6 +1657,11 @@ class P4Submit(Command, P4UserMap):
                 filesToChangeExecBit[path] = diff['dst_mode']
                 if path in filesToDelete:
                     filesToDelete.remove(path)
+
+                dst_mode = int(diff['dst_mode'], 8)
+                if dst_mode == 0120000:
+                    symlinks.add(path)
+
             elif modifier == "D":
                 filesToDelete.add(path)
                 if path in filesToAdd:
@@ -1705,6 +1777,10 @@ class P4Submit(Command, P4UserMap):
             mode = filesToChangeExecBit[f]
             setP4ExecBit(f, mode)
 
+        if self.update_shelve:
+            print("all_files = %s" % str(all_files))
+            p4_reopen_in_change(self.update_shelve, all_files)
+
         #
         # Build p4 change description, starting with the contents
         # of the git commit message.
@@ -1713,7 +1789,7 @@ class P4Submit(Command, P4UserMap):
         logMessage = logMessage.strip()
         (logMessage, jobs) = self.separate_jobs_from_description(logMessage)
 
-        template = self.prepareSubmitTemplate()
+        template = self.prepareSubmitTemplate(self.update_shelve)
         submitTemplate = self.prepareLogMessage(template, logMessage, jobs)
 
         if self.preserveUser:
@@ -1727,7 +1803,7 @@ class P4Submit(Command, P4UserMap):
         separatorLine = "######## everything below this line is just the diff #######\n"
         if not self.prepare_p4_only:
             submitTemplate += separatorLine
-            submitTemplate += self.get_diff_description(editedFiles, filesToAdd)
+            submitTemplate += self.get_diff_description(editedFiles, filesToAdd, symlinks)
 
         (handle, fileName) = tempfile.mkstemp()
         tmpFile = os.fdopen(handle, "w+b")
@@ -1785,7 +1861,17 @@ class P4Submit(Command, P4UserMap):
                 if self.isWindows:
                     message = message.replace("\r\n", "\n")
                 submitTemplate = message[:message.index(separatorLine)]
-                p4_write_pipe(['submit', '-i'], submitTemplate)
+
+                if self.update_shelve:
+                    p4_write_pipe(['shelve', '-r', '-i'], submitTemplate)
+                elif self.shelve:
+                    p4_write_pipe(['shelve', '-i'], submitTemplate)
+                else:
+                    p4_write_pipe(['submit', '-i'], submitTemplate)
+                    # The rename/copy happened by applying a patch that created a
+                    # new file.  This leaves it writable, which confuses p4.
+                    for f in pureRenameCopy:
+                        p4_sync(f, "-f")
 
                 if self.preserveUser:
                     if p4User:
@@ -1795,23 +1881,20 @@ class P4Submit(Command, P4UserMap):
                         changelist = self.lastP4Changelist()
                         self.modifyChangelistUser(changelist, p4User)
 
-                # The rename/copy happened by applying a patch that created a
-                # new file.  This leaves it writable, which confuses p4.
-                for f in pureRenameCopy:
-                    p4_sync(f, "-f")
                 submitted = True
 
         finally:
             # skip this patch
-            if not submitted:
-                print "Submission cancelled, undoing p4 changes."
-                for f in editedFiles:
+            if not submitted or self.shelve:
+                if self.shelve:
+                    print ("Reverting shelved files.")
+                else:
+                    print ("Submission cancelled, undoing p4 changes.")
+                for f in editedFiles | filesToDelete:
                     p4_revert(f)
                 for f in filesToAdd:
                     p4_revert(f)
                     os.remove(f)
-                for f in filesToDelete:
-                    p4_revert(f)
 
         os.remove(fileName)
         return submitted
@@ -1907,6 +1990,9 @@ class P4Submit(Command, P4UserMap):
         if len(self.origin) == 0:
             self.origin = upstream
 
+        if self.update_shelve:
+            self.shelve = True
+
         if self.preserveUser:
             if not self.canChangeChangelists():
                 die("Cannot preserve user names without p4 super-user or admin permissions")
@@ -2067,13 +2153,13 @@ class P4Submit(Command, P4UserMap):
                         break
 
         chdir(self.oldWorkingDirectory)
-
+        shelved_applied = "shelved" if self.shelve else "applied"
         if self.dry_run:
             pass
         elif self.prepare_p4_only:
             pass
         elif len(commits) == len(applied):
-            print "All commits applied!"
+            print ("All commits {0}!".format(shelved_applied))
 
             sync = P4Sync()
             if self.branch:
@@ -2085,9 +2171,9 @@ class P4Submit(Command, P4UserMap):
 
         else:
             if len(applied) == 0:
-                print "No commits applied."
+                print ("No commits {0}.".format(shelved_applied))
             else:
-                print "Applied only the commits marked with '*':"
+                print ("{0} only the commits marked with '*':".format(shelved_applied.capitalize()))
                 for c in commits:
                     if c in applied:
                         star = "*"
@@ -2418,11 +2504,24 @@ class P4Sync(Command, P4UserMap):
             self.gitStream.write(d)
         self.gitStream.write('\n')
 
+    def encodeWithUTF8(self, path):
+        try:
+            path.decode('ascii')
+        except:
+            encoding = 'utf8'
+            if gitConfig('git-p4.pathEncoding'):
+                encoding = gitConfig('git-p4.pathEncoding')
+            path = path.decode(encoding, 'replace').encode('utf8', 'replace')
+            if self.verbose:
+                print 'Path with non-ASCII characters detected. Used %s to encode: %s ' % (encoding, path)
+        return path
+
     # output one file from the P4 stream
     # - helper for streamP4Files
 
     def streamOneP4File(self, file, contents):
         relPath = self.stripRepoPath(file['depotFile'], self.branchPrefixes)
+        relPath = self.encodeWithUTF8(relPath)
         if verbose:
             size = int(self.stream_file['fileSize'])
             sys.stdout.write('\r%s --> %s (%i MB)\n' % (file['depotFile'], relPath, size/1024/1024))
@@ -2495,16 +2594,6 @@ class P4Sync(Command, P4UserMap):
             text = regexp.sub(r'$\1$', text)
             contents = [ text ]
 
-        try:
-            relPath.decode('ascii')
-        except:
-            encoding = 'utf8'
-            if gitConfig('git-p4.pathEncoding'):
-                encoding = gitConfig('git-p4.pathEncoding')
-            relPath = relPath.decode(encoding, 'replace').encode('utf8', 'replace')
-            if self.verbose:
-                print 'Path with non-ASCII characters detected. Used %s to encode: %s ' % (encoding, relPath)
-
         if self.largeFileSystem:
             (git_mode, contents) = self.largeFileSystem.processContent(git_mode, relPath, contents)
 
@@ -2512,6 +2601,7 @@ class P4Sync(Command, P4UserMap):
 
     def streamOneP4Deletion(self, file):
         relPath = self.stripRepoPath(file['path'], self.branchPrefixes)
+        relPath = self.encodeWithUTF8(relPath)
         if verbose:
             sys.stdout.write("delete %s\n" % relPath)
             sys.stdout.flush()
@@ -3682,6 +3772,7 @@ def main():
         if cmd.gitdir == None:
             cmd.gitdir = os.path.abspath(".git")
             if not isValidGitDir(cmd.gitdir):
+                # "rev-parse --git-dir" without arguments will try $PWD/.git
                 cmd.gitdir = read_pipe("git rev-parse --git-dir").strip()
                 if os.path.exists(cmd.gitdir):
                     cdup = read_pipe("git rev-parse --show-cdup").strip()
@@ -3694,6 +3785,7 @@ def main():
             else:
                 die("fatal: cannot locate git repository at %s" % cmd.gitdir)
 
+        # so git commands invoked from the P4 workspace will succeed
         os.environ["GIT_DIR"] = cmd.gitdir
 
     if not cmd.run(args):
index ca994c5c545cb0394fc5d355ecb6ea2fe5f1f193..90b1fbe9cf6e8dfb2f4331916809fa40bf9050d2 100644 (file)
@@ -5,7 +5,7 @@
 # Copyright (c) 2006 Johannes E. Schindelin
 #
 # The original idea comes from Eric W. Biederman, in
-# http://article.gmane.org/gmane.comp.version-control.git/22407
+# https://public-inbox.org/git/m1odwkyuf5.fsf_-_@ebiederm.dsl.xmission.com/
 #
 # The file containing rebase commands, comments, and empty lines.
 # This file is created by "git rebase -i" then edited by the user.  As
@@ -93,8 +93,17 @@ eval '
 GIT_CHERRY_PICK_HELP="$resolvemsg"
 export GIT_CHERRY_PICK_HELP
 
-comment_char=$(git config --get core.commentchar 2>/dev/null | cut -c1)
-: ${comment_char:=#}
+comment_char=$(git config --get core.commentchar 2>/dev/null)
+case "$comment_char" in
+'' | auto)
+       comment_char="#"
+       ;;
+?)
+       ;;
+*)
+       comment_char=$(echo "$comment_char" | cut -c1)
+       ;;
+esac
 
 warn () {
        printf '%s\n' "$*" >&2
@@ -416,7 +425,7 @@ update_squash_messages () {
        if test -f "$squash_msg"; then
                mv "$squash_msg" "$squash_msg".bak || exit
                count=$(($(sed -n \
-                       -e "1s/^$comment_char.*\([0-9][0-9]*\).*/\1/p" \
+                       -e "1s/^$comment_char[^0-9]*\([0-9][0-9]*\).*/\1/p" \
                        -e "q" < "$squash_msg".bak)+1))
                {
                        printf '%s\n' "$comment_char $(eval_ngettext \
@@ -428,7 +437,8 @@ update_squash_messages () {
                        }' <"$squash_msg".bak
                } >"$squash_msg"
        else
-               commit_message HEAD > "$fixup_msg" || die "$(gettext "Cannot write \$fixup_msg")"
+               commit_message HEAD >"$fixup_msg" ||
+               die "$(eval_gettext "Cannot write \$fixup_msg")"
                count=2
                {
                        printf '%s\n' "$comment_char $(gettext "This is a combination of 2 commits.")"
@@ -1059,6 +1069,10 @@ git_rebase__interactive () {
 
 case "$action" in
 continue)
+       if test ! -d "$rewritten"
+       then
+               exec git rebase--helper ${force_rebase:+--no-ff} --continue
+       fi
        # do we have anything to commit?
        if git diff-index --cached --quiet HEAD --
        then
@@ -1118,6 +1132,10 @@ first and then run 'git rebase --continue' again.")"
 skip)
        git rerere clear
 
+       if test ! -d "$rewritten"
+       then
+               exec git rebase--helper ${force_rebase:+--no-ff} --continue
+       fi
        do_rest
        return 0
        ;;
@@ -1304,6 +1322,11 @@ expand_todo_ids
 test -d "$rewritten" || test -n "$force_rebase" || skip_unnecessary_picks
 
 checkout_onto
+if test -z "$rebase_root" && test ! -d "$rewritten"
+then
+       require_clean_work_tree "rebase"
+       exec git rebase--helper ${force_rebase:+--no-ff} --continue
+fi
 do_rest
 
 }
index 04f6e44bc8c779d7f4c60c19066820533279324a..2cf73b88e8e83ca34b9eb319dbc2b0a220139b0f 100755 (executable)
@@ -34,6 +34,7 @@ root!              rebase all reachable commits up to the root(s)
 autosquash         move commits that begin with squash!/fixup! under -i
 committer-date-is-author-date! passed to 'git am'
 ignore-date!       passed to 'git am'
+signoff            passed to 'git am'
 whitespace=!       passed to 'git apply'
 ignore-whitespace! passed to 'git apply'
 C=!                passed to 'git apply'
@@ -43,6 +44,7 @@ continue!          continue
 abort!             abort and check out the original branch
 skip!              skip current patch and continue
 edit-todo!         edit the todo list during an interactive rebase
+quit!              abort but keep HEAD where it is
 "
 . git-sh-setup
 set_reflog_action rebase
@@ -164,14 +166,14 @@ apply_autostash () {
                stash_sha1=$(cat "$state_dir/autostash")
                if git stash apply $stash_sha1 2>&1 >/dev/null
                then
-                       echo "$(gettext 'Applied autostash.')"
+                       echo "$(gettext 'Applied autostash.')" >&2
                else
                        git stash store -m "autostash" -q $stash_sha1 ||
                        die "$(eval_gettext "Cannot store \$stash_sha1")"
                        gettext 'Applying autostash resulted in conflicts.
 Your changes are safe in the stash.
 You can run "git stash pop" or "git stash drop" at any time.
-'
+' >&2
                fi
        fi
 }
@@ -241,7 +243,7 @@ do
        --verify)
                ok_to_skip_pre_rebase=
                ;;
-       --continue|--skip|--abort|--edit-todo)
+       --continue|--skip|--abort|--quit|--edit-todo)
                test $total_argc -eq 2 || usage
                action=${1##--}
                ;;
@@ -320,7 +322,7 @@ do
        --ignore-whitespace)
                git_am_opt="$git_am_opt $1"
                ;;
-       --committer-date-is-author-date|--ignore-date)
+       --committer-date-is-author-date|--ignore-date|--signoff|--no-signoff)
                git_am_opt="$git_am_opt $1"
                force_rebase=t
                ;;
@@ -399,6 +401,9 @@ abort)
        finish_rebase
        exit
        ;;
+quit)
+       exec rm -rf "$state_dir"
+       ;;
 edit-todo)
        run_specific_rebase
        ;;
diff --git a/git-relink.perl b/git-relink.perl
deleted file mode 100755 (executable)
index 236a352..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/perl
-# Copyright 2005, Ryan Anderson <ryan@michonline.com>
-# Distribution permitted under the GPL v2, as distributed
-# by the Free Software Foundation.
-# Later versions of the GPL at the discretion of Linus Torvalds
-#
-# Scan two git object-trees, and hardlink any common objects between them.
-
-use 5.008;
-use strict;
-use warnings;
-use Getopt::Long;
-
-sub get_canonical_form($);
-sub do_scan_directory($$$);
-sub compare_two_files($$);
-sub usage();
-sub link_two_files($$);
-
-# stats
-my $total_linked = 0;
-my $total_already = 0;
-my ($linked,$already);
-
-my $fail_on_different_sizes = 0;
-my $help = 0;
-GetOptions("safe" => \$fail_on_different_sizes,
-          "help" => \$help);
-
-usage() if $help;
-
-my (@dirs) = @ARGV;
-
-usage() if (!defined $dirs[0] || !defined $dirs[1]);
-
-$_ = get_canonical_form($_) foreach (@dirs);
-
-my $master_dir = pop @dirs;
-
-opendir(D,$master_dir . "objects/")
-       or die "Failed to open $master_dir/objects/ : $!";
-
-my @hashdirs = grep { ($_ eq 'pack') || /^[0-9a-f]{2}$/ } readdir(D);
-
-foreach my $repo (@dirs) {
-       $linked = 0;
-       $already = 0;
-       printf("Searching '%s' and '%s' for common objects and hardlinking them...\n",
-               $master_dir,$repo);
-
-       foreach my $hashdir (@hashdirs) {
-               do_scan_directory($master_dir, $hashdir, $repo);
-       }
-
-       printf("Linked %d files, %d were already linked.\n",$linked, $already);
-
-       $total_linked += $linked;
-       $total_already += $already;
-}
-
-printf("Totals: Linked %d files, %d were already linked.\n",
-       $total_linked, $total_already);
-
-
-sub do_scan_directory($$$) {
-       my ($srcdir, $subdir, $dstdir) = @_;
-
-       my $sfulldir = sprintf("%sobjects/%s/",$srcdir,$subdir);
-       my $dfulldir = sprintf("%sobjects/%s/",$dstdir,$subdir);
-
-       opendir(S,$sfulldir)
-               or die "Failed to opendir $sfulldir: $!";
-
-       foreach my $file (grep(!/\.{1,2}$/, readdir(S))) {
-               my $sfilename = $sfulldir . $file;
-               my $dfilename = $dfulldir . $file;
-
-               compare_two_files($sfilename,$dfilename);
-
-       }
-       closedir(S);
-}
-
-sub compare_two_files($$) {
-       my ($sfilename, $dfilename) = @_;
-
-       # Perl's stat returns relevant information as follows:
-       # 0 = dev number
-       # 1 = inode number
-       # 7 = size
-       my @sstatinfo = stat($sfilename);
-       my @dstatinfo = stat($dfilename);
-
-       if (@sstatinfo == 0 && @dstatinfo == 0) {
-               die sprintf("Stat of both %s and %s failed: %s\n",$sfilename, $dfilename, $!);
-
-       } elsif (@dstatinfo == 0) {
-               return;
-       }
-
-       if ( ($sstatinfo[0] == $dstatinfo[0]) &&
-            ($sstatinfo[1] != $dstatinfo[1])) {
-               if ($sstatinfo[7] == $dstatinfo[7]) {
-                       link_two_files($sfilename, $dfilename);
-
-               } else {
-                       my $err = sprintf("ERROR: File sizes are not the same, cannot relink %s to %s.\n",
-                               $sfilename, $dfilename);
-                       if ($fail_on_different_sizes) {
-                               die $err;
-                       } else {
-                               warn $err;
-                       }
-               }
-
-       } elsif ( ($sstatinfo[0] == $dstatinfo[0]) &&
-            ($sstatinfo[1] == $dstatinfo[1])) {
-               $already++;
-       }
-}
-
-sub get_canonical_form($) {
-       my $dir = shift;
-       my $original = $dir;
-
-       die "$dir is not a directory." unless -d $dir;
-
-       $dir .= "/" unless $dir =~ m#/$#;
-       $dir .= ".git/" unless $dir =~ m#\.git/$#;
-
-       die "$original does not have a .git/ subdirectory.\n" unless -d $dir;
-
-       return $dir;
-}
-
-sub link_two_files($$) {
-       my ($sfilename, $dfilename) = @_;
-       my $tmpdname = sprintf("%s.old",$dfilename);
-       rename($dfilename,$tmpdname)
-               or die sprintf("Failure renaming %s to %s: %s",
-                       $dfilename, $tmpdname, $!);
-
-       if (! link($sfilename,$dfilename)) {
-               my $failtxt = "";
-               unless (rename($tmpdname,$dfilename)) {
-                       $failtxt = sprintf(
-                               "Git Repository containing %s is probably corrupted, " .
-                               "please copy '%s' to '%s' to fix.\n",
-                               $tmpdname, $dfilename);
-               }
-
-               die sprintf("Failed to link %s to %s: %s\n%s" .
-                       $sfilename, $dfilename,
-                       $!, $dfilename, $failtxt);
-       }
-
-       unlink($tmpdname)
-               or die sprintf("Unlink of %s failed: %s\n",
-                       $dfilename, $!);
-
-       $linked++;
-}
-
-
-sub usage() {
-       print("usage: git relink [--safe] <dir>... <master_dir> \n");
-       print("All directories should contain a .git/objects/ subdirectory.\n");
-       print("Options\n");
-       print("\t--safe\t" .
-               "Stops if two objects with the same hash exist but " .
-               "have different sizes.  Default is to warn and continue.\n");
-       exit(1);
-}
index d5500fde4658410db477008617730cb5799f310e..eebd33276da9028afa1f2ed3b03e60f037d7e646 100755 (executable)
@@ -4,9 +4,6 @@
 # This file is licensed under the GPL v2, or a later version
 # at the discretion of Linus Torvalds.
 
-USAGE='<start> <url> [<end>]'
-LONG_USAGE='Summarizes the changes between two commits to the standard output,
-and includes the given URL in the generated summary.'
 SUBDIRECTORY_OK='Yes'
 OPTIONS_KEEPDASHDASH=
 OPTIONS_STUCKLONG=
index da81be40cb7f9af1a960be2c22f8e75c9d16822e..d326238c0a069c3c5d008497f72c9f2ffcc326c3 100755 (executable)
@@ -28,6 +28,7 @@ use File::Temp qw/ tempdir tempfile /;
 use File::Spec::Functions qw(catfile);
 use Error qw(:try);
 use Git;
+use Git::I18N;
 
 Getopt::Long::Configure qw/ pass_through /;
 
@@ -117,20 +118,20 @@ sub format_2822_time {
        my $localmin = $localtm[1] + $localtm[2] * 60;
        my $gmtmin = $gmttm[1] + $gmttm[2] * 60;
        if ($localtm[0] != $gmttm[0]) {
-               die "local zone differs from GMT by a non-minute interval\n";
+               die __("local zone differs from GMT by a non-minute interval\n");
        }
        if ((($gmttm[6] + 1) % 7) == $localtm[6]) {
                $localmin += 1440;
        } elsif ((($gmttm[6] - 1) % 7) == $localtm[6]) {
                $localmin -= 1440;
        } elsif ($gmttm[6] != $localtm[6]) {
-               die "local time offset greater than or equal to 24 hours\n";
+               die __("local time offset greater than or equal to 24 hours\n");
        }
        my $offset = $localmin - $gmtmin;
        my $offhour = $offset / 60;
        my $offmin = abs($offset % 60);
        if (abs($offhour) >= 24) {
-               die ("local time offset greater than or equal to 24 hours\n");
+               die __("local time offset greater than or equal to 24 hours\n");
        }
 
        return sprintf("%s, %2d %s %d %02d:%02d:%02d %s%02d%02d",
@@ -198,13 +199,13 @@ sub do_edit {
                map {
                        system('sh', '-c', $editor.' "$@"', $editor, $_);
                        if (($? & 127) || ($? >> 8)) {
-                               die("the editor exited uncleanly, aborting everything");
+                               die(__("the editor exited uncleanly, aborting everything"));
                        }
                } @_;
        } else {
                system('sh', '-c', $editor.' "$@"', $editor, @_);
                if (($? & 127) || ($? >> 8)) {
-                       die("the editor exited uncleanly, aborting everything");
+                       die(__("the editor exited uncleanly, aborting everything"));
                }
        }
 }
@@ -278,10 +279,13 @@ sub signal_handler {
        # tmp files from --compose
        if (defined $compose_filename) {
                if (-e $compose_filename) {
-                       print "'$compose_filename' contains an intermediate version of the email you were composing.\n";
+                       printf __("'%s' contains an intermediate version ".
+                                 "of the email you were composing.\n"),
+                                 $compose_filename;
                }
                if (-e ($compose_filename . ".final")) {
-                       print "'$compose_filename.final' contains the composed email.\n"
+                       printf __("'%s.final' contains the composed email.\n"),
+                                 $compose_filename;
                }
        }
 
@@ -298,7 +302,7 @@ my $help;
 my $rc = GetOptions("h" => \$help,
                     "dump-aliases" => \$dump_aliases);
 usage() unless $rc;
-die "--dump-aliases incompatible with other options\n"
+die __("--dump-aliases incompatible with other options\n")
     if !$help and $dump_aliases and @ARGV;
 $rc = GetOptions(
                    "sender|from=s" => \$sender,
@@ -361,7 +365,7 @@ unless ($rc) {
     usage();
 }
 
-die "Cannot run git format-patch from outside a repository\n"
+die __("Cannot run git format-patch from outside a repository\n")
        if $format_patch and not $repo;
 
 # Now, let's fill any that aren't set in with defaults:
@@ -430,7 +434,7 @@ $smtp_encryption = '' unless (defined $smtp_encryption);
 my(%suppress_cc);
 if (@suppress_cc) {
        foreach my $entry (@suppress_cc) {
-               die "Unknown --suppress-cc field: '$entry'\n"
+               die sprintf(__("Unknown --suppress-cc field: '%s'\n"), $entry)
                        unless $entry =~ /^(?:all|cccmd|cc|author|self|sob|body|bodycc)$/;
                $suppress_cc{$entry} = 1;
        }
@@ -459,7 +463,7 @@ my $confirm_unconfigured = !defined $confirm;
 if ($confirm_unconfigured) {
        $confirm = scalar %suppress_cc ? 'compose' : 'auto';
 };
-die "Unknown --confirm setting: '$confirm'\n"
+die sprintf(__("Unknown --confirm setting: '%s'\n"), $confirm)
        unless $confirm =~ /^(?:auto|cc|compose|always|never)/;
 
 # Debugging, print out the suppressions.
@@ -491,16 +495,16 @@ my %aliases;
 sub parse_sendmail_alias {
        local $_ = shift;
        if (/"/) {
-               print STDERR "warning: sendmail alias with quotes is not supported: $_\n";
+               printf STDERR __("warning: sendmail alias with quotes is not supported: %s\n"), $_;
        } elsif (/:include:/) {
-               print STDERR "warning: `:include:` not supported: $_\n";
+               printf STDERR __("warning: `:include:` not supported: %s\n"), $_;
        } elsif (/[\/|]/) {
-               print STDERR "warning: `/file` or `|pipe` redirection not supported: $_\n";
+               printf STDERR __("warning: `/file` or `|pipe` redirection not supported: %s\n"), $_;
        } elsif (/^(\S+?)\s*:\s*(.+)$/) {
                my ($alias, $addr) = ($1, $2);
                $aliases{$alias} = [ split_addrs($addr) ];
        } else {
-               print STDERR "warning: sendmail line is not recognized: $_\n";
+               printf STDERR __("warning: sendmail line is not recognized: %s\n"), $_;
        }
 }
 
@@ -581,11 +585,11 @@ sub is_format_patch_arg {
                if (defined($format_patch)) {
                        return $format_patch;
                }
-               die(<<EOF);
-File '$f' exists but it could also be the range of commits
+               die sprintf(__ <<EOF, $f, $f);
+File '%s' exists but it could also be the range of commits
 to produce patches for.  Please disambiguate by...
 
-    * Saying "./$f" if you mean a file; or
+    * Saying "./%s" if you mean a file; or
     * Giving --format-patch option if you mean a range.
 EOF
        } catch Git::Error::Command with {
@@ -603,7 +607,7 @@ while (defined(my $f = shift @ARGV)) {
                @ARGV = ();
        } elsif (-d $f and !is_format_patch_arg($f)) {
                opendir my $dh, $f
-                       or die "Failed to opendir $f: $!";
+                       or die sprintf(__("Failed to opendir %s: %s"), $f, $!);
 
                push @files, grep { -f $_ } map { catfile($f, $_) }
                                sort readdir $dh;
@@ -616,7 +620,7 @@ while (defined(my $f = shift @ARGV)) {
 }
 
 if (@rev_list_opts) {
-       die "Cannot run git format-patch from outside a repository\n"
+       die __("Cannot run git format-patch from outside a repository\n")
                unless $repo;
        push @files, $repo->command('format-patch', '-o', tempdir(CLEANUP => 1), @rev_list_opts);
 }
@@ -627,7 +631,8 @@ if ($validate) {
        foreach my $f (@files) {
                unless (-p $f) {
                        my $error = validate_patch($f);
-                       $error and die "fatal: $f: $error\nwarning: no patches were sent\n";
+                       $error and die sprintf(__("fatal: %s: %s\nwarning: no patches were sent\n"),
+                                                 $f, $error);
                }
        }
 }
@@ -637,7 +642,7 @@ if (@files) {
                print $_,"\n" for (@files);
        }
 } else {
-       print STDERR "\nNo patch files specified!\n\n";
+       print STDERR __("\nNo patch files specified!\n\n");
        usage();
 }
 
@@ -650,7 +655,7 @@ sub get_patch_subject {
                return "GIT: $1\n";
        }
        close $fh;
-       die "No subject line in $fn ?";
+       die sprintf(__("No subject line in %s?"), $fn);
 }
 
 if ($compose) {
@@ -660,25 +665,27 @@ if ($compose) {
                tempfile(".gitsendemail.msg.XXXXXX", DIR => $repo->repo_path()) :
                tempfile(".gitsendemail.msg.XXXXXX", DIR => "."))[1];
        open my $c, ">", $compose_filename
-               or die "Failed to open for writing $compose_filename: $!";
+               or die sprintf(__("Failed to open for writing %s: %s"), $compose_filename, $!);
 
 
        my $tpl_sender = $sender || $repoauthor || $repocommitter || '';
        my $tpl_subject = $initial_subject || '';
        my $tpl_reply_to = $initial_reply_to || '';
 
-       print $c <<EOT;
+       print $c <<EOT1, Git::prefix_lines("GIT: ", __ <<EOT2), <<EOT3;
 From $tpl_sender # This line is ignored.
-GIT: Lines beginning in "GIT:" will be removed.
-GIT: Consider including an overall diffstat or table of contents
-GIT: for the patch you are writing.
-GIT:
-GIT: Clear the body content if you don't wish to send a summary.
+EOT1
+Lines beginning in "GIT:" will be removed.
+Consider including an overall diffstat or table of contents
+for the patch you are writing.
+
+Clear the body content if you don't wish to send a summary.
+EOT2
 From: $tpl_sender
 Subject: $tpl_subject
 In-Reply-To: $tpl_reply_to
 
-EOT
+EOT3
        for my $f (@files) {
                print $c get_patch_subject($f);
        }
@@ -691,10 +698,10 @@ EOT
        }
 
        open my $c2, ">", $compose_filename . ".final"
-               or die "Failed to open $compose_filename.final : " . $!;
+               or die sprintf(__("Failed to open %s.final: %s"), $compose_filename, $!);
 
        open $c, "<", $compose_filename
-               or die "Failed to open $compose_filename : " . $!;
+               or die sprintf(__("Failed to open %s: %s"), $compose_filename, $!);
 
        my $need_8bit_cte = file_has_nonascii($compose_filename);
        my $in_body = 0;
@@ -729,7 +736,7 @@ EOT
                        $sender = $1;
                        next;
                } elsif (/^(?:To|Cc|Bcc):/i) {
-                       print "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n";
+                       print __("To/Cc/Bcc fields are not interpreted yet, they have been ignored\n");
                        next;
                }
                print $c2 $_;
@@ -738,7 +745,7 @@ EOT
        close $c2;
 
        if ($summary_empty) {
-               print "Summary email is empty, skipping it\n";
+               print __("Summary email is empty, skipping it\n");
                $compose = -1;
        }
 } elsif ($annotate) {
@@ -768,7 +775,9 @@ sub ask {
                        return $resp;
                }
                if ($confirm_only) {
-                       my $yesno = $term->readline("Are you sure you want to use <$resp> [y/N]? ");
+                       my $yesno = $term->readline(
+                               # TRANSLATORS: please keep [y/N] as is.
+                               sprintf(__("Are you sure you want to use <%s> [y/N]? "), $resp));
                        if (defined $yesno && $yesno =~ /y/i) {
                                return $resp;
                        }
@@ -797,12 +806,12 @@ foreach my $f (@files) {
 }
 
 if (!defined $auto_8bit_encoding && scalar %broken_encoding) {
-       print "The following files are 8bit, but do not declare " .
-               "a Content-Transfer-Encoding.\n";
+       print __("The following files are 8bit, but do not declare " .
+                "a Content-Transfer-Encoding.\n");
        foreach my $f (sort keys %broken_encoding) {
                print "    $f\n";
        }
-       $auto_8bit_encoding = ask("Which 8bit encoding should I declare [UTF-8]? ",
+       $auto_8bit_encoding = ask(__("Which 8bit encoding should I declare [UTF-8]? "),
                                  valid_re => qr/.{4}/, confirm_only => 1,
                                  default => "UTF-8");
 }
@@ -810,9 +819,9 @@ if (!defined $auto_8bit_encoding && scalar %broken_encoding) {
 if (!$force) {
        for my $f (@files) {
                if (get_patch_subject($f) =~ /\Q*** SUBJECT HERE ***\E/) {
-                       die "Refusing to send because the patch\n\t$f\n"
+                       die sprintf(__("Refusing to send because the patch\n\t%s\n"
                                . "has the template subject '*** SUBJECT HERE ***'. "
-                               . "Pass --force if you really want to send.\n";
+                               . "Pass --force if you really want to send.\n"), $f);
                }
        }
 }
@@ -829,7 +838,7 @@ if (defined $sender) {
 # But it's a no-op to run sanitize_address on an already sanitized address.
 $sender = sanitize_address($sender);
 
-my $to_whom = "To whom should the emails be sent (if anyone)?";
+my $to_whom = __("To whom should the emails be sent (if anyone)?");
 my $prompting = 0;
 if (!@initial_to && !defined $to_cmd) {
        my $to = ask("$to_whom ",
@@ -847,7 +856,7 @@ my %EXPANDED_ALIASES;
 sub expand_one_alias {
        my $alias = shift;
        if ($EXPANDED_ALIASES{$alias}) {
-               die "fatal: alias '$alias' expands to itself\n";
+               die sprintf(__("fatal: alias '%s' expands to itself\n"), $alias);
        }
        local $EXPANDED_ALIASES{$alias} = 1;
        return $aliases{$alias} ? expand_aliases(@{$aliases{$alias}}) : $alias;
@@ -859,7 +868,7 @@ sub expand_one_alias {
 
 if ($thread && !defined $initial_reply_to && $prompting) {
        $initial_reply_to = ask(
-               "Message-ID to be used as In-Reply-To for the first email (if any)? ",
+               __("Message-ID to be used as In-Reply-To for the first email (if any)? "),
                default => "",
                valid_re => qr/\@.*\./, confirm_only => 1);
 }
@@ -909,7 +918,7 @@ sub extract_valid_address {
 sub extract_valid_address_or_die {
        my $address = shift;
        $address = extract_valid_address($address);
-       die "error: unable to extract a valid address from: $address\n"
+       die sprintf(__("error: unable to extract a valid address from: %s\n"), $address)
                if !$address;
        return $address;
 }
@@ -917,8 +926,11 @@ sub extract_valid_address_or_die {
 sub validate_address {
        my $address = shift;
        while (!extract_valid_address($address)) {
-               print STDERR "error: unable to extract a valid address from: $address\n";
-               $_ = ask("What to do with this address? ([q]uit|[d]rop|[e]dit): ",
+               printf STDERR __("error: unable to extract a valid address from: %s\n"), $address;
+               # TRANSLATORS: Make sure to include [q] [d] [e] in your
+               # translation. The program will only accept English input
+               # at this point.
+               $_ = ask(__("What to do with this address? ([q]uit|[d]rop|[e]dit): "),
                        valid_re => qr/^(?:quit|q|drop|d|edit|e)/i,
                        default => 'q');
                if (/^d/i) {
@@ -1219,7 +1231,7 @@ sub ssl_verify_params {
                return (SSL_verify_mode => SSL_VERIFY_PEER(),
                        SSL_ca_file => $smtp_ssl_cert_path);
        } else {
-               die "CA path \"$smtp_ssl_cert_path\" does not exist";
+               die sprintf(__("CA path \"%s\" does not exist"), $smtp_ssl_cert_path);
        }
 }
 
@@ -1293,20 +1305,26 @@ Message-Id: $message_id
                if ($needs_confirm eq "inform") {
                        $confirm_unconfigured = 0; # squelch this message for the rest of this run
                        $ask_default = "y"; # assume yes on EOF since user hasn't explicitly asked for confirmation
-                       print "    The Cc list above has been expanded by additional\n";
-                       print "    addresses found in the patch commit message. By default\n";
-                       print "    send-email prompts before sending whenever this occurs.\n";
-                       print "    This behavior is controlled by the sendemail.confirm\n";
-                       print "    configuration setting.\n";
-                       print "\n";
-                       print "    For additional information, run 'git send-email --help'.\n";
-                       print "    To retain the current behavior, but squelch this message,\n";
-                       print "    run 'git config --global sendemail.confirm auto'.\n\n";
+                       print __ <<EOF ;
+    The Cc list above has been expanded by additional
+    addresses found in the patch commit message. By default
+    send-email prompts before sending whenever this occurs.
+    This behavior is controlled by the sendemail.confirm
+    configuration setting.
+
+    For additional information, run 'git send-email --help'.
+    To retain the current behavior, but squelch this message,
+    run 'git config --global sendemail.confirm auto'.
+
+EOF
                }
-               $_ = ask("Send this email? ([y]es|[n]o|[q]uit|[a]ll): ",
+               # TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+               # translation. The program will only accept English input
+               # at this point.
+               $_ = ask(__("Send this email? ([y]es|[n]o|[q]uit|[a]ll): "),
                         valid_re => qr/^(?:yes|y|no|n|quit|q|all|a)/i,
                         default => $ask_default);
-               die "Send this email reply required" unless defined $_;
+               die __("Send this email reply required") unless defined $_;
                if (/^n/i) {
                        return 0;
                } elsif (/^q/i) {
@@ -1332,13 +1350,15 @@ Message-Id: $message_id
        } else {
 
                if (!defined $smtp_server) {
-                       die "The required SMTP server is not properly defined."
+                       die __("The required SMTP server is not properly defined.")
                }
 
+               require Net::SMTP;
+               my $use_net_smtp_ssl = version->parse($Net::SMTP::VERSION) < version->parse("2.34");
+               $smtp_domain ||= maildomain();
+
                if ($smtp_encryption eq 'ssl') {
                        $smtp_server_port ||= 465; # ssmtp
-                       require Net::SMTP::SSL;
-                       $smtp_domain ||= maildomain();
                        require IO::Socket::SSL;
 
                        # Suppress "variable accessed once" warning.
@@ -1350,40 +1370,54 @@ Message-Id: $message_id
                        # Net::SMTP::SSL->new() does not forward any SSL options
                        IO::Socket::SSL::set_client_defaults(
                                ssl_verify_params());
-                       $smtp ||= Net::SMTP::SSL->new($smtp_server,
-                                                     Hello => $smtp_domain,
-                                                     Port => $smtp_server_port,
-                                                     Debug => $debug_net_smtp);
+
+                       if ($use_net_smtp_ssl) {
+                               require Net::SMTP::SSL;
+                               $smtp ||= Net::SMTP::SSL->new($smtp_server,
+                                                             Hello => $smtp_domain,
+                                                             Port => $smtp_server_port,
+                                                             Debug => $debug_net_smtp);
+                       }
+                       else {
+                               $smtp ||= Net::SMTP->new($smtp_server,
+                                                        Hello => $smtp_domain,
+                                                        Port => $smtp_server_port,
+                                                        Debug => $debug_net_smtp,
+                                                        SSL => 1);
+                       }
                }
                else {
-                       require Net::SMTP;
-                       $smtp_domain ||= maildomain();
                        $smtp_server_port ||= 25;
                        $smtp ||= Net::SMTP->new($smtp_server,
                                                 Hello => $smtp_domain,
                                                 Debug => $debug_net_smtp,
                                                 Port => $smtp_server_port);
                        if ($smtp_encryption eq 'tls' && $smtp) {
-                               require Net::SMTP::SSL;
-                               $smtp->command('STARTTLS');
-                               $smtp->response();
-                               if ($smtp->code == 220) {
+                               if ($use_net_smtp_ssl) {
+                                       $smtp->command('STARTTLS');
+                                       $smtp->response();
+                                       if ($smtp->code != 220) {
+                                               die sprintf(__("Server does not support STARTTLS! %s"), $smtp->message);
+                                       }
+                                       require Net::SMTP::SSL;
                                        $smtp = Net::SMTP::SSL->start_SSL($smtp,
                                                                          ssl_verify_params())
-                                               or die "STARTTLS failed! ".IO::Socket::SSL::errstr();
-                                       $smtp_encryption = '';
-                                       # Send EHLO again to receive fresh
-                                       # supported commands
-                                       $smtp->hello($smtp_domain);
-                               } else {
-                                       die "Server does not support STARTTLS! ".$smtp->message;
+                                               or die sprintf(__("STARTTLS failed! %s"), IO::Socket::SSL::errstr());
+                               }
+                               else {
+                                       $smtp->starttls(ssl_verify_params())
+                                               or die sprintf(__("STARTTLS failed! %s"), IO::Socket::SSL::errstr());
                                }
+                               $smtp_encryption = '';
+                               # Send EHLO again to receive fresh
+                               # supported commands
+                               $smtp->hello($smtp_domain);
                        }
                }
 
                if (!$smtp) {
-                       die "Unable to initialize SMTP properly. Check config and use --smtp-debug. ",
-                           "VALUES: server=$smtp_server ",
+                       die __("Unable to initialize SMTP properly. Check config and use --smtp-debug."),
+                           " VALUES: server=$smtp_server ",
                            "encryption=$smtp_encryption ",
                            "hello=$smtp_domain",
                            defined $smtp_server_port ? " port=$smtp_server_port" : "";
@@ -1400,12 +1434,12 @@ Message-Id: $message_id
                        $smtp->datasend("$line") or die $smtp->message;
                }
                $smtp->dataend() or die $smtp->message;
-               $smtp->code =~ /250|200/ or die "Failed to send $subject\n".$smtp->message;
+               $smtp->code =~ /250|200/ or die sprintf(__("Failed to send %s\n"), $subject).$smtp->message;
        }
        if ($quiet) {
-               printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject);
+               printf($dry_run ? __("Dry-Sent %s\n") : __("Sent %s\n"), $subject);
        } else {
-               print (($dry_run ? "Dry-" : "")."OK. Log says:\n");
+               print($dry_run ? __("Dry-OK. Log says:\n") : __("OK. Log says:\n"));
                if (!file_name_is_absolute($smtp_server)) {
                        print "Server: $smtp_server\n";
                        print "MAIL FROM:<$raw_from>\n";
@@ -1417,10 +1451,10 @@ Message-Id: $message_id
                }
                print $header, "\n";
                if ($smtp) {
-                       print "Result: ", $smtp->code, ' ',
+                       print __("Result: "), $smtp->code, ' ',
                                ($smtp->message =~ /\n([^\n]+\n)$/s), "\n";
                } else {
-                       print "Result: OK\n";
+                       print __("Result: OK\n");
                }
        }
 
@@ -1433,7 +1467,7 @@ $subject = $initial_subject;
 $message_num = 0;
 
 foreach my $t (@files) {
-       open my $fh, "<", $t or die "can't open file $t";
+       open my $fh, "<", $t or die sprintf(__("can't open file %s"), $t);
 
        my $author = undef;
        my $sauthor = undef;
@@ -1480,13 +1514,13 @@ foreach my $t (@files) {
                                $sauthor = sanitize_address($author);
                                next if $suppress_cc{'author'};
                                next if $suppress_cc{'self'} and $sauthor eq $sender;
-                               printf("(mbox) Adding cc: %s from line '%s'\n",
+                               printf(__("(mbox) Adding cc: %s from line '%s'\n"),
                                        $1, $_) unless $quiet;
                                push @cc, $1;
                        }
                        elsif (/^To:\s+(.*)$/i) {
                                foreach my $addr (parse_address_line($1)) {
-                                       printf("(mbox) Adding to: %s from line '%s'\n",
+                                       printf(__("(mbox) Adding to: %s from line '%s'\n"),
                                                $addr, $_) unless $quiet;
                                        push @to, $addr;
                                }
@@ -1500,7 +1534,7 @@ foreach my $t (@files) {
                                        } else {
                                                next if ($suppress_cc{'cc'});
                                        }
-                                       printf("(mbox) Adding cc: %s from line '%s'\n",
+                                       printf(__("(mbox) Adding cc: %s from line '%s'\n"),
                                                $addr, $_) unless $quiet;
                                        push @cc, $addr;
                                }
@@ -1534,7 +1568,7 @@ foreach my $t (@files) {
                        # So let's support that, too.
                        $input_format = 'lots';
                        if (@cc == 0 && !$suppress_cc{'cc'}) {
-                               printf("(non-mbox) Adding cc: %s from line '%s'\n",
+                               printf(__("(non-mbox) Adding cc: %s from line '%s'\n"),
                                        $_, $_) unless $quiet;
                                push @cc, $_;
                        } elsif (!defined $subject) {
@@ -1545,7 +1579,7 @@ foreach my $t (@files) {
        # Now parse the message body
        while(<$fh>) {
                $message .=  $_;
-               if (/^(Signed-off-by|Cc): (.*)$/i) {
+               if (/^(Signed-off-by|Cc): ([^>]*>?)/i) {
                        chomp;
                        my ($what, $c) = ($1, $2);
                        chomp $c;
@@ -1557,7 +1591,7 @@ foreach my $t (@files) {
                                next if $suppress_cc{'bodycc'} and $what =~ /Cc/i;
                        }
                        push @cc, $c;
-                       printf("(body) Adding cc: %s from line '%s'\n",
+                       printf(__("(body) Adding cc: %s from line '%s'\n"),
                                $c, $_) unless $quiet;
                }
        }
@@ -1655,18 +1689,18 @@ sub recipients_cmd {
 
        my @addresses = ();
        open my $fh, "-|", "$cmd \Q$file\E"
-           or die "($prefix) Could not execute '$cmd'";
+           or die sprintf(__("(%s) Could not execute '%s'"), $prefix, $cmd);
        while (my $address = <$fh>) {
                $address =~ s/^\s*//g;
                $address =~ s/\s*$//g;
                $address = sanitize_address($address);
                next if ($address eq $sender and $suppress_cc{'self'});
                push @addresses, $address;
-               printf("($prefix) Adding %s: %s from: '%s'\n",
-                      $what, $address, $cmd) unless $quiet;
+               printf(__("(%s) Adding %s: %s from: '%s'\n"),
+                      $prefix, $what, $address, $cmd) unless $quiet;
                }
        close $fh
-           or die "($prefix) failed to close pipe to '$cmd'";
+           or die sprintf(__("(%s) failed to close pipe to '%s'"), $prefix, $cmd);
        return @addresses;
 }
 
@@ -1693,7 +1727,7 @@ sub apply_transfer_encoding {
        $message = MIME::Base64::decode($message)
                if ($from eq 'base64');
 
-       die "cannot send message as 7bit"
+       die __("cannot send message as 7bit")
                if ($to eq '7bit' and $message =~ /[^[:ascii:]]/);
        return $message
                if ($to eq '7bit' or $to eq '8bit');
@@ -1701,7 +1735,7 @@ sub apply_transfer_encoding {
                if ($to eq 'quoted-printable');
        return MIME::Base64::encode($message, "\n")
                if ($to eq 'base64');
-       die "invalid transfer encoding";
+       die __("invalid transfer encoding");
 }
 
 sub unique_email_list {
@@ -1720,10 +1754,10 @@ sub unique_email_list {
 sub validate_patch {
        my $fn = shift;
        open(my $fh, '<', $fn)
-               or die "unable to open $fn: $!\n";
+               or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
        while (my $line = <$fh>) {
                if (length($line) > 998) {
-                       return "$.: patch contains a line longer than 998 characters";
+                       return sprintf(__("%s: patch contains a line longer than 998 characters"), $.);
                }
        }
        return;
@@ -1739,10 +1773,11 @@ sub handle_backup {
            (substr($file, 0, $lastlen) eq $last) &&
            ($suffix = substr($file, $lastlen)) !~ /^[a-z0-9]/i) {
                if (defined $known_suffix && $suffix eq $known_suffix) {
-                       print "Skipping $file with backup suffix '$known_suffix'.\n";
+                       printf(__("Skipping %s with backup suffix '%s'.\n"), $file, $known_suffix);
                        $skip = 1;
                } else {
-                       my $answer = ask("Do you really want to send $file? (y|N): ",
+                       # TRANSLATORS: please keep "[y|N]" as is.
+                       my $answer = ask(sprintf(__("Do you really want to send %s? [y|N]: "), $file),
                                         valid_re => qr/^(?:y|n)/i,
                                         default => 'n');
                        $skip = ($answer ne 'y');
@@ -1770,7 +1805,7 @@ sub handle_backup_files {
 sub file_has_nonascii {
        my $fn = shift;
        open(my $fh, '<', $fn)
-               or die "unable to open $fn: $!\n";
+               or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
        while (my $line = <$fh>) {
                return 1 if $line =~ /[^[:ascii:]]/;
        }
@@ -1780,7 +1815,7 @@ sub file_has_nonascii {
 sub body_or_subject_has_nonascii {
        my $fn = shift;
        open(my $fh, '<', $fn)
-               or die "unable to open $fn: $!\n";
+               or die sprintf(__("unable to open %s: %s\n"), $fn, $!);
        while (my $line = <$fh>) {
                last if $line =~ /^$/;
                return 1 if $line =~ /^Subject.*[^[:ascii:]]/;
index 240c7ebcd1449935d359e12b8bae817179f567bf..378928518b2c42ee3adb69b52d3b0eb63fca8ac3 100644 (file)
@@ -196,14 +196,14 @@ require_work_tree_exists () {
        if test "z$(git rev-parse --is-bare-repository)" != zfalse
        then
                program_name=$0
-               die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
+               die "$(eval_gettext "fatal: \$program_name cannot be used without a working tree.")"
        fi
 }
 
 require_work_tree () {
        test "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = true || {
                program_name=$0
-               die "$(gettext "fatal: \$program_name cannot be used without a working tree.")"
+               die "$(eval_gettext "fatal: \$program_name cannot be used without a working tree.")"
        }
 }
 
index 826af183d489d06468f03ee8002e05da0d7ffd34..e7b85932d6ba62ec9f581c692a321ac24e52dcac 100755 (executable)
@@ -7,8 +7,11 @@ USAGE="list [<options>]
    or: $dashless drop [-q|--quiet] [<stash>]
    or: $dashless ( pop | apply ) [--index] [-q|--quiet] [<stash>]
    or: $dashless branch <branchname> [<stash>]
-   or: $dashless [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
-                      [-u|--include-untracked] [-a|--all] [<message>]]
+   or: $dashless save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
+                     [-u|--include-untracked] [-a|--all] [<message>]
+   or: $dashless [push [--patch] [-k|--[no-]keep-index] [-q|--quiet]
+                      [-u|--include-untracked] [-a|--all] [-m <message>]
+                      [-- <pathspec>...]]
    or: $dashless clear"
 
 SUBDIRECTORY_OK=Yes
@@ -16,6 +19,7 @@ OPTIONS_SPEC=
 START_DIR=$(pwd)
 . git-sh-setup
 require_work_tree
+prefix=$(git rev-parse --show-prefix) || exit 1
 cd_to_toplevel
 
 TMP="$GIT_DIR/.git-stash.$$"
@@ -33,15 +37,15 @@ else
 fi
 
 no_changes () {
-       git diff-index --quiet --cached HEAD --ignore-submodules -- &&
-       git diff-files --quiet --ignore-submodules &&
+       git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
+       git diff-files --quiet --ignore-submodules -- "$@" &&
        (test -z "$untracked" || test -z "$(untracked_files)")
 }
 
 untracked_files () {
        excl_opt=--exclude-standard
        test "$untracked" = "all" && excl_opt=
-       git ls-files -o -z $excl_opt
+       git ls-files -o -z $excl_opt -- "$@"
 }
 
 clear_stash () {
@@ -56,11 +60,29 @@ clear_stash () {
 }
 
 create_stash () {
-       stash_msg="$1"
-       untracked="$2"
+       stash_msg=
+       untracked=
+       while test $# != 0
+       do
+               case "$1" in
+               -m|--message)
+                       shift
+                       stash_msg=${1?"BUG: create_stash () -m requires an argument"}
+                       ;;
+               -u|--include-untracked)
+                       shift
+                       untracked=${1?"BUG: create_stash () -u requires an argument"}
+                       ;;
+               --)
+                       shift
+                       break
+                       ;;
+               esac
+               shift
+       done
 
        git update-index -q --refresh
-       if no_changes
+       if no_changes "$@"
        then
                exit 0
        fi
@@ -92,7 +114,7 @@ create_stash () {
                # Untracked files are stored by themselves in a parentless commit, for
                # ease of unpacking later.
                u_commit=$(
-                       untracked_files | (
+                       untracked_files "$@" | (
                                GIT_INDEX_FILE="$TMPindex" &&
                                export GIT_INDEX_FILE &&
                                rm -f "$TMPindex" &&
@@ -100,7 +122,7 @@ create_stash () {
                                u_tree=$(git write-tree) &&
                                printf 'untracked files on %s\n' "$msg" | git commit-tree $u_tree  &&
                                rm -f "$TMPindex"
-               ) ) || die "Cannot save the untracked files"
+               ) ) || die "$(gettext "Cannot save the untracked files")"
 
                untracked_commit_option="-p $u_commit";
        else
@@ -115,7 +137,7 @@ create_stash () {
                        git read-tree --index-output="$TMPindex" -m $i_tree &&
                        GIT_INDEX_FILE="$TMPindex" &&
                        export GIT_INDEX_FILE &&
-                       git diff --name-only -z HEAD -- >"$TMP-stagenames" &&
+                       git diff-index --name-only -z HEAD -- "$@" >"$TMP-stagenames" &&
                        git update-index -z --add --remove --stdin <"$TMP-stagenames" &&
                        git write-tree &&
                        rm -f "$TMPindex"
@@ -129,7 +151,7 @@ create_stash () {
 
                # find out what the user wants
                GIT_INDEX_FILE="$TMP-index" \
-                       git add--interactive --patch=stash -- &&
+                       git add--interactive --patch=stash -- "$@" &&
 
                # state of the working tree
                w_tree=$(GIT_INDEX_FILE="$TMP-index" git write-tree) ||
@@ -189,10 +211,11 @@ store_stash () {
        return $ret
 }
 
-save_stash () {
+push_stash () {
        keep_index=
        patch_mode=
        untracked=
+       stash_msg=
        while test $# != 0
        do
                case "$1" in
@@ -216,6 +239,11 @@ save_stash () {
                -a|--all)
                        untracked=all
                        ;;
+               -m|--message)
+                       shift
+                       test -z ${1+x} && usage
+                       stash_msg=$1
+                       ;;
                --help)
                        show_help
                        ;;
@@ -246,39 +274,52 @@ save_stash () {
                shift
        done
 
+       eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
+
        if test -n "$patch_mode" && test -n "$untracked"
        then
-           die "Can't use --patch and --include-untracked or --all at the same time"
+               die "$(gettext "Can't use --patch and --include-untracked or --all at the same time")"
        fi
 
-       stash_msg="$*"
+       test -n "$untracked" || git ls-files --error-unmatch -- "$@" >/dev/null || exit 1
 
        git update-index -q --refresh
-       if no_changes
+       if no_changes "$@"
        then
                say "$(gettext "No local changes to save")"
                exit 0
        fi
+
        git reflog exists $ref_stash ||
                clear_stash || die "$(gettext "Cannot initialize stash")"
 
-       create_stash "$stash_msg" $untracked
+       create_stash -m "$stash_msg" -u "$untracked" -- "$@"
        store_stash -m "$stash_msg" -q $w_commit ||
        die "$(gettext "Cannot save the current status")"
        say "$(eval_gettext "Saved working directory and index state \$stash_msg")"
 
        if test -z "$patch_mode"
        then
-               git reset --hard ${GIT_QUIET:+-q}
+               if test $# != 0
+               then
+                       git reset -q -- "$@"
+                       git ls-files -z --modified -- "$@" |
+                       git checkout-index -z --force --stdin
+                       git clean --force -q -d -- "$@"
+               else
+                       git reset --hard -q
+               fi
                test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
                if test -n "$untracked"
                then
-                       git clean --force --quiet -d $CLEAN_X_OPTION
+                       git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
                fi
 
                if test "$keep_index" = "t" && test -n "$i_tree"
                then
-                       git read-tree --reset -u $i_tree
+                       git read-tree --reset $i_tree
+                       git ls-files -z --modified -- "$@" |
+                       git checkout-index -z --force --stdin
                fi
        else
                git apply -R < "$TMP-patch" ||
@@ -286,11 +327,41 @@ save_stash () {
 
                if test "$keep_index" != "t"
                then
-                       git reset
+                       git reset -q -- "$@"
                fi
        fi
 }
 
+save_stash () {
+       push_options=
+       while test $# != 0
+       do
+               case "$1" in
+               --)
+                       shift
+                       break
+                       ;;
+               -*)
+                       # pass all options through to push_stash
+                       push_options="$push_options $1"
+                       ;;
+               *)
+                       break
+                       ;;
+               esac
+               shift
+       done
+
+       stash_msg="$*"
+
+       if test -z "$stash_msg"
+       then
+               push_stash $push_options
+       else
+               push_stash $push_options -m "$stash_msg"
+       fi
+}
+
 have_stash () {
        git rev-parse --verify --quiet $ref_stash >/dev/null
 }
@@ -384,9 +455,8 @@ parse_flags_and_rev()
        i_tree=
        u_tree=
 
-       REV=$(git rev-parse --no-flags --symbolic --sq "$@") || exit 1
-
        FLAGS=
+       REV=
        for opt
        do
                case "$opt" in
@@ -404,6 +474,9 @@ parse_flags_and_rev()
                                        die "$(eval_gettext "unknown option: \$opt")"
                                FLAGS="${FLAGS}${FLAGS:+ }$opt"
                        ;;
+                       *)
+                               REV="${REV}${REV:+ }'$opt'"
+                       ;;
                esac
        done
 
@@ -422,6 +495,15 @@ parse_flags_and_rev()
                ;;
        esac
 
+       case "$1" in
+               *[!0-9]*)
+                       :
+               ;;
+               *)
+                       set -- "${ref_stash}@{$1}"
+               ;;
+       esac
+
        REV=$(git rev-parse --symbolic --verify --quiet "$1") || {
                reference="$1"
                die "$(eval_gettext "\$reference is not a valid reference")"
@@ -494,7 +576,7 @@ apply_stash () {
                GIT_INDEX_FILE="$TMPindex" git-read-tree "$u_tree" &&
                GIT_INDEX_FILE="$TMPindex" git checkout-index --all &&
                rm -f "$TMPindex" ||
-               die 'Could not restore untracked files from stash'
+               die "$(gettext "Could not restore untracked files from stash")"
        fi
 
        eval "
@@ -579,18 +661,21 @@ apply_to_branch () {
        }
 }
 
+test "$1" = "-p" && set "push" "$@"
+
 PARSE_CACHE='--not-parsed'
-# The default command is "save" if nothing but options are given
+# The default command is "push" if nothing but options are given
 seen_non_option=
 for opt
 do
        case "$opt" in
+       --) break ;;
        -*) ;;
        *) seen_non_option=t; break ;;
        esac
 done
 
-test -n "$seen_non_option" || set "save" "$@"
+test -n "$seen_non_option" || set "push" "$@"
 
 # Main command set
 case "$1" in
@@ -606,6 +691,10 @@ save)
        shift
        save_stash "$@"
        ;;
+push)
+       shift
+       push_stash "$@"
+       ;;
 apply)
        shift
        apply_stash "$@"
@@ -616,7 +705,7 @@ clear)
        ;;
 create)
        shift
-       create_stash "$*" && echo "$w_commit"
+       create_stash -m "$*" && echo "$w_commit"
        ;;
 store)
        shift
@@ -637,7 +726,7 @@ branch)
 *)
        case $# in
        0)
-               save_stash &&
+               push_stash &&
                say "$(gettext "(To restore them type \"git stash apply\")")"
                ;;
        *)
index b57f87de658b627c48ec672faaab3dc6aac3b505..c0d0e9a4c63495d4522666b6edf984c01c0cfa23 100755 (executable)
@@ -12,7 +12,8 @@ USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <re
    or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
    or: $dashless [--quiet] foreach [--recursive] <command>
-   or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
+   or: $dashless [--quiet] sync [--recursive] [--] [<path>...]
+   or: $dashless [--quiet] absorbgitdirs [--] [<path>...]"
 OPTIONS_SPEC=
 SUBDIRECTORY_OK=Yes
 . git-sh-setup
@@ -21,14 +22,10 @@ require_work_tree
 wt_prefix=$(git rev-parse --show-prefix)
 cd_to_toplevel
 
-# Restrict ourselves to a vanilla subset of protocols; the URLs
-# we get are under control of a remote repository, and we do not
-# want them kicking off arbitrary git-remote-* programs.
-#
-# If the user has already specified a set of allowed protocols,
-# we assume they know what they're doing and use that instead.
-: ${GIT_ALLOW_PROTOCOL=file:git:http:https:ssh}
-export GIT_ALLOW_PROTOCOL
+# Tell the rest of git that any URLs we get don't come
+# directly from the user, so it can apply policy as appropriate.
+GIT_PROTOCOL_FROM_USER=0
+export GIT_PROTOCOL_FROM_USER
 
 command=
 branch=
@@ -44,6 +41,7 @@ update=
 prefix=
 custom_name=
 depth=
+progress=
 
 die_if_unmatched ()
 {
@@ -206,8 +204,14 @@ cmd_add()
                        tstart
                        s|/*$||
                ')
-       git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
-       die "$(eval_gettext "'\$sm_path' already exists in the index")"
+       if test -z "$force"
+       then
+               git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
+               die "$(eval_gettext "'\$sm_path' already exists in the index")"
+       else
+               git ls-files -s "$sm_path" | sane_grep -v "^160000" > /dev/null 2>&1 &&
+               die "$(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")"
+       fi
 
        if test -z "$force" && ! git add --dry-run --ignore-missing "$sm_path" > /dev/null 2>&1
        then
@@ -274,6 +278,20 @@ or you are unsure what this means choose another name with the '--name' option."
        fi &&
        git add --force .gitmodules ||
        die "$(eval_gettext "Failed to register submodule '\$sm_path'")"
+
+       # NEEDSWORK: In a multi-working-tree world, this needs to be
+       # set in the per-worktree config.
+       if git config --get submodule.active >/dev/null
+       then
+               # If the submodule being adding isn't already covered by the
+               # current configured pathspec, set the submodule's active flag
+               if ! git submodule--helper is-active "$sm_path"
+               then
+                       git config submodule."$sm_name".active "true"
+               fi
+       else
+               git config submodule."$sm_name".active "true"
+       fi
 }
 
 #
@@ -314,7 +332,7 @@ cmd_foreach()
                git submodule--helper list --prefix "$wt_prefix" ||
                echo "#unmatched" $?
        } |
-       while read mode sha1 stage sm_path
+       while read -r mode sha1 stage sm_path
        do
                die_if_unmatched "$mode" "$sha1"
                if test -e "$sm_path"/.git
@@ -373,7 +391,7 @@ cmd_init()
                shift
        done
 
-       git ${wt_prefix:+-C "$wt_prefix"} submodule--helper init ${GIT_QUIET:+--quiet} ${prefix:+--prefix "$prefix"} "$@"
+       git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper init ${GIT_QUIET:+--quiet}  "$@"
 }
 
 #
@@ -423,7 +441,7 @@ cmd_deinit()
                git submodule--helper list --prefix "$wt_prefix" "$@" ||
                echo "#unmatched" $?
        } |
-       while read mode sha1 stage sm_path
+       while read -r mode sha1 stage sm_path
        do
                die_if_unmatched "$mode" "$sha1"
                name=$(git submodule--helper name "$sm_path") || exit
@@ -498,6 +516,9 @@ cmd_update()
                -q|--quiet)
                        GIT_QUIET=1
                        ;;
+               --progress)
+                       progress="--progress"
+                       ;;
                -i|--init)
                        init=1
                        ;;
@@ -573,17 +594,18 @@ cmd_update()
 
        {
        git submodule--helper update-clone ${GIT_QUIET:+--quiet} \
+               ${progress:+"$progress"} \
                ${wt_prefix:+--prefix "$wt_prefix"} \
                ${prefix:+--recursive-prefix "$prefix"} \
                ${update:+--update "$update"} \
-               ${reference:+--reference "$reference"} \
+               ${reference:+"$reference"} \
                ${depth:+--depth "$depth"} \
                ${recommend_shallow:+"$recommend_shallow"} \
                ${jobs:+$jobs} \
                "$@" || echo "#unmatched" $?
        } | {
        err=
-       while read mode sha1 stage just_cloned sm_path
+       while read -r mode sha1 stage just_cloned sm_path
        do
                die_if_unmatched "$mode" "$sha1"
 
@@ -605,7 +627,10 @@ cmd_update()
                if test $just_cloned -eq 1
                then
                        subsha1=
-                       update_module=checkout
+                       case "$update_module" in
+                       merge | rebase | none)
+                               update_module=checkout ;;
+                       esac
                else
                        subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
                                git rev-parse --verify HEAD) ||
@@ -822,7 +847,7 @@ cmd_summary() {
        # Get modified modules cared by user
        modules=$(git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- "$@" |
                sane_egrep '^:([0-7]* )?160000' |
-               while read mod_src mod_dst sha1_src sha1_dst status sm_path
+               while read -r mod_src mod_dst sha1_src sha1_dst status sm_path
                do
                        # Always show modules deleted or type-changed (blob<->module)
                        if test "$status" = D || test "$status" = T
@@ -848,7 +873,7 @@ cmd_summary() {
        git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- $modules |
        sane_egrep '^:([0-7]* )?160000' |
        cut -c2- |
-       while read mod_src mod_dst sha1_src sha1_dst status name
+       while read -r mod_src mod_dst sha1_src sha1_dst status name
        do
                if test -z "$cached" &&
                        test $sha1_dst = 0000000000000000000000000000000000000000
@@ -995,18 +1020,17 @@ cmd_status()
                git submodule--helper list --prefix "$wt_prefix" "$@" ||
                echo "#unmatched" $?
        } |
-       while read mode sha1 stage sm_path
+       while read -r mode sha1 stage sm_path
        do
                die_if_unmatched "$mode" "$sha1"
                name=$(git submodule--helper name "$sm_path") || exit
-               url=$(git config submodule."$name".url)
                displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
                if test "$stage" = U
                then
                        say "U$sha1 $displaypath"
                        continue
                fi
-               if test -z "$url" ||
+               if ! git submodule--helper is-active "$sm_path" ||
                {
                        ! test -d "$sm_path"/.git &&
                        ! test -f "$sm_path"/.git
@@ -1076,9 +1100,16 @@ cmd_sync()
                git submodule--helper list --prefix "$wt_prefix" "$@" ||
                echo "#unmatched" $?
        } |
-       while read mode sha1 stage sm_path
+       while read -r mode sha1 stage sm_path
        do
                die_if_unmatched "$mode" "$sha1"
+
+               # skip inactive submodules
+               if ! git submodule--helper is-active "$sm_path"
+               then
+                       continue
+               fi
+
                name=$(git submodule--helper name "$sm_path")
                url=$(git config -f .gitmodules --get submodule."$name".url)
 
@@ -1101,31 +1132,33 @@ cmd_sync()
                        ;;
                esac
 
-               if git config "submodule.$name.url" >/dev/null 2>/dev/null
+               displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
+               say "$(eval_gettext "Synchronizing submodule url for '\$displaypath'")"
+               git config submodule."$name".url "$super_config_url"
+
+               if test -e "$sm_path"/.git
                then
-                       displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
-                       say "$(eval_gettext "Synchronizing submodule url for '\$displaypath'")"
-                       git config submodule."$name".url "$super_config_url"
+               (
+                       sanitize_submodule_env
+                       cd "$sm_path"
+                       remote=$(get_default_remote)
+                       git config remote."$remote".url "$sub_origin_url"
 
-                       if test -e "$sm_path"/.git
+                       if test -n "$recursive"
                        then
-                       (
-                               sanitize_submodule_env
-                               cd "$sm_path"
-                               remote=$(get_default_remote)
-                               git config remote."$remote".url "$sub_origin_url"
-
-                               if test -n "$recursive"
-                               then
-                                       prefix="$prefix$sm_path/"
-                                       eval cmd_sync
-                               fi
-                       )
+                               prefix="$prefix$sm_path/"
+                               eval cmd_sync
                        fi
+               )
                fi
        done
 }
 
+cmd_absorbgitdirs()
+{
+       git submodule--helper absorb-git-dirs --prefix "$wt_prefix" "$@"
+}
+
 # This loop parses the command line arguments to find the
 # subcommand name to dispatch.  Parsing of the subcommand specific
 # options are primarily done by the subcommand implementations.
@@ -1135,7 +1168,7 @@ cmd_sync()
 while test $# != 0 && test -z "$command"
 do
        case "$1" in
-       add | foreach | init | deinit | update | status | summary | sync)
+       add | foreach | init | deinit | update | status | summary | sync | absorbgitdirs)
                command=$1
                ;;
        -q|--quiet)
index 4d41d220a0da3a2357d63dbb6ba59514bb3f0462..d2404184ba2edc1ac330898ca610ad5e5df8d6c9 100755 (executable)
@@ -44,6 +44,7 @@ use Git qw(
        command_close_pipe
        command_bidi_pipe
        command_close_bidi_pipe
+       get_record
 );
 
 BEGIN {
@@ -1174,10 +1175,10 @@ sub cmd_branch {
        ::_req_svn();
        require SVN::Client;
 
+       my ($config, $baton, undef) = Git::SVN::Ra::prepare_config_once();
        my $ctx = SVN::Client->new(
-               config => SVN::Core::config_get_config(
-                       $Git::SVN::Ra::config_dir
-               ),
+               auth => $baton,
+               config => $config,
                log_msg => sub {
                        ${ $_[0] } = defined $_message
                                ? $_message
@@ -1699,7 +1700,7 @@ sub cmd_gc {
                     "files will not be compressed.\n";
        }
        File::Find::find({ wanted => \&gc_directory, no_chdir => 1},
-                        "$ENV{GIT_DIR}/svn");
+                        Git::SVN::svn_dir());
 }
 
 ########################### utility functions #########################
@@ -1733,7 +1734,7 @@ sub post_fetch_checkout {
        return unless verify_ref('HEAD^0');
 
        return if $ENV{GIT_DIR} !~ m#^(?:.*/)?\.git$#;
-       my $index = $ENV{GIT_INDEX_FILE} || "$ENV{GIT_DIR}/index";
+       my $index = command_oneline(qw(rev-parse --git-path index));
        return if -f $index;
 
        return if command_oneline(qw/rev-parse --is-inside-work-tree/) eq 'false';
@@ -1835,8 +1836,9 @@ sub get_tree_from_treeish {
 sub get_commit_entry {
        my ($treeish) = shift;
        my %log_entry = ( log => '', tree => get_tree_from_treeish($treeish) );
-       my $commit_editmsg = "$ENV{GIT_DIR}/COMMIT_EDITMSG";
-       my $commit_msg = "$ENV{GIT_DIR}/COMMIT_MSG";
+       my @git_path = qw(rev-parse --git-path);
+       my $commit_editmsg = command_oneline(@git_path, 'COMMIT_EDITMSG');
+       my $commit_msg = command_oneline(@git_path, 'COMMIT_MSG');
        open my $log_fh, '>', $commit_editmsg or croak $!;
 
        my $type = command_oneline(qw/cat-file -t/, $treeish);
@@ -1880,10 +1882,9 @@ sub get_commit_entry {
        {
                require Encode;
                # SVN requires messages to be UTF-8 when entering the repo
-               local $/;
                open $log_fh, '<', $commit_msg or croak $!;
                binmode $log_fh;
-               chomp($log_entry{log} = <$log_fh>);
+               chomp($log_entry{log} = get_record($log_fh, undef));
 
                my $enc = Git::config('i18n.commitencoding') || 'UTF-8';
                my $msg = $log_entry{log};
diff --git a/git.c b/git.c
index 7acf290e2385ab35c10db4dd318af51106b12b7b..58ef570294da1ffc8fed38609d140833426dd14f 100644 (file)
--- a/git.c
+++ b/git.c
@@ -16,50 +16,6 @@ const char git_more_info_string[] =
           "to read about a specific subcommand or concept.");
 
 static int use_pager = -1;
-static char *orig_cwd;
-static const char *env_names[] = {
-       GIT_DIR_ENVIRONMENT,
-       GIT_WORK_TREE_ENVIRONMENT,
-       GIT_IMPLICIT_WORK_TREE_ENVIRONMENT,
-       GIT_PREFIX_ENVIRONMENT
-};
-static char *orig_env[4];
-static int save_restore_env_balance;
-
-static void save_env_before_alias(void)
-{
-       int i;
-
-       assert(save_restore_env_balance == 0);
-       save_restore_env_balance = 1;
-       orig_cwd = xgetcwd();
-       for (i = 0; i < ARRAY_SIZE(env_names); i++) {
-               orig_env[i] = getenv(env_names[i]);
-               orig_env[i] = xstrdup_or_null(orig_env[i]);
-       }
-}
-
-static void restore_env(int external_alias)
-{
-       int i;
-
-       assert(save_restore_env_balance == 1);
-       save_restore_env_balance = 0;
-       if (!external_alias && orig_cwd && chdir(orig_cwd))
-               die_errno("could not move to %s", orig_cwd);
-       free(orig_cwd);
-       for (i = 0; i < ARRAY_SIZE(env_names); i++) {
-               if (external_alias &&
-                   !strcmp(env_names[i], GIT_PREFIX_ENVIRONMENT))
-                       continue;
-               if (orig_env[i]) {
-                       setenv(env_names[i], orig_env[i], 1);
-                       free(orig_env[i]);
-               } else {
-                       unsetenv(env_names[i]);
-               }
-       }
-}
 
 static void commit_pager_choice(void) {
        switch (use_pager) {
@@ -163,6 +119,20 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
                        setenv(GIT_WORK_TREE_ENVIRONMENT, cmd, 1);
                        if (envchanged)
                                *envchanged = 1;
+               } else if (!strcmp(cmd, "--super-prefix")) {
+                       if (*argc < 2) {
+                               fprintf(stderr, "No prefix given for --super-prefix.\n" );
+                               usage(git_usage_string);
+                       }
+                       setenv(GIT_SUPER_PREFIX_ENVIRONMENT, (*argv)[1], 1);
+                       if (envchanged)
+                               *envchanged = 1;
+                       (*argv)++;
+                       (*argc)--;
+               } else if (skip_prefix(cmd, "--super-prefix=", &cmd)) {
+                       setenv(GIT_SUPER_PREFIX_ENVIRONMENT, cmd, 1);
+                       if (envchanged)
+                               *envchanged = 1;
                } else if (!strcmp(cmd, "--bare")) {
                        char *cwd = xgetcwd();
                        is_bare_repository_cfg = 1;
@@ -236,19 +206,18 @@ static int handle_alias(int *argcp, const char ***argv)
        const char **new_argv;
        const char *alias_command;
        char *alias_string;
-       int unused_nongit;
-
-       save_env_before_alias();
-       setup_git_directory_gently(&unused_nongit);
 
        alias_command = (*argv)[0];
        alias_string = alias_lookup(alias_command);
        if (alias_string) {
                if (alias_string[0] == '!') {
                        struct child_process child = CHILD_PROCESS_INIT;
+                       int nongit_ok;
+
+                       /* Aliases expect GIT_PREFIX, GIT_DIR etc to be set */
+                       setup_git_directory_gently(&nongit_ok);
 
                        commit_pager_choice();
-                       restore_env(1);
 
                        child.use_shell = 1;
                        argv_array_push(&child.args, alias_string + 1);
@@ -294,8 +263,6 @@ static int handle_alias(int *argcp, const char ***argv)
                ret = 1;
        }
 
-       restore_env(0);
-
        errno = saved_errno;
 
        return ret;
@@ -309,6 +276,7 @@ static int handle_alias(int *argcp, const char ***argv)
  * RUN_SETUP for reading from the configuration file.
  */
 #define NEED_WORK_TREE         (1<<3)
+#define SUPPORT_SUPER_PREFIX   (1<<4)
 
 struct cmd_struct {
        const char *cmd;
@@ -343,6 +311,11 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
        }
        commit_pager_choice();
 
+       if (!help && get_super_prefix()) {
+               if (!(p->option & SUPPORT_SUPER_PREFIX))
+                       die("%s doesn't support --super-prefix", p->cmd);
+       }
+
        if (!help && p->option & NEED_WORK_TREE)
                setup_work_tree();
 
@@ -374,7 +347,7 @@ static struct cmd_struct commands[] = {
        { "am", cmd_am, RUN_SETUP | NEED_WORK_TREE },
        { "annotate", cmd_annotate, RUN_SETUP },
        { "apply", cmd_apply, RUN_SETUP_GENTLY },
-       { "archive", cmd_archive },
+       { "archive", cmd_archive, RUN_SETUP_GENTLY },
        { "bisect--helper", cmd_bisect__helper, RUN_SETUP },
        { "blame", cmd_blame, RUN_SETUP },
        { "branch", cmd_branch, RUN_SETUP },
@@ -402,6 +375,7 @@ static struct cmd_struct commands[] = {
        { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },
        { "diff-index", cmd_diff_index, RUN_SETUP },
        { "diff-tree", cmd_diff_tree, RUN_SETUP },
+       { "difftool", cmd_difftool, RUN_SETUP | NEED_WORK_TREE },
        { "fast-export", cmd_fast_export, RUN_SETUP },
        { "fetch", cmd_fetch, RUN_SETUP },
        { "fetch-pack", cmd_fetch_pack, RUN_SETUP },
@@ -412,7 +386,7 @@ static struct cmd_struct commands[] = {
        { "fsck-objects", cmd_fsck, RUN_SETUP },
        { "gc", cmd_gc, RUN_SETUP },
        { "get-tar-commit-id", cmd_get_tar_commit_id },
-       { "grep", cmd_grep, RUN_SETUP_GENTLY },
+       { "grep", cmd_grep, RUN_SETUP_GENTLY | SUPPORT_SUPER_PREFIX },
        { "hash-object", cmd_hash_object },
        { "help", cmd_help },
        { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
@@ -420,10 +394,10 @@ static struct cmd_struct commands[] = {
        { "init-db", cmd_init_db },
        { "interpret-trailers", cmd_interpret_trailers, RUN_SETUP_GENTLY },
        { "log", cmd_log, RUN_SETUP },
-       { "ls-files", cmd_ls_files, RUN_SETUP },
+       { "ls-files", cmd_ls_files, RUN_SETUP | SUPPORT_SUPER_PREFIX },
        { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY },
        { "ls-tree", cmd_ls_tree, RUN_SETUP },
-       { "mailinfo", cmd_mailinfo },
+       { "mailinfo", cmd_mailinfo, RUN_SETUP_GENTLY },
        { "mailsplit", cmd_mailsplit },
        { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
        { "merge-base", cmd_merge_base, RUN_SETUP },
@@ -443,13 +417,14 @@ static struct cmd_struct commands[] = {
        { "pack-objects", cmd_pack_objects, RUN_SETUP },
        { "pack-redundant", cmd_pack_redundant, RUN_SETUP },
        { "pack-refs", cmd_pack_refs, RUN_SETUP },
-       { "patch-id", cmd_patch_id },
+       { "patch-id", cmd_patch_id, RUN_SETUP_GENTLY },
        { "pickaxe", cmd_blame, RUN_SETUP },
        { "prune", cmd_prune, RUN_SETUP },
        { "prune-packed", cmd_prune_packed, RUN_SETUP },
        { "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
        { "push", cmd_push, RUN_SETUP },
-       { "read-tree", cmd_read_tree, RUN_SETUP },
+       { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},
+       { "rebase--helper", cmd_rebase__helper, RUN_SETUP | NEED_WORK_TREE },
        { "receive-pack", cmd_receive_pack },
        { "reflog", cmd_reflog, RUN_SETUP },
        { "remote", cmd_remote, RUN_SETUP },
@@ -471,7 +446,7 @@ static struct cmd_struct commands[] = {
        { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
        { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
        { "stripspace", cmd_stripspace },
-       { "submodule--helper", cmd_submodule__helper, RUN_SETUP },
+       { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX},
        { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
        { "tag", cmd_tag, RUN_SETUP },
        { "unpack-file", cmd_unpack_file, RUN_SETUP },
@@ -521,57 +496,67 @@ static void strip_extension(const char **argv)
 
 static void handle_builtin(int argc, const char **argv)
 {
+       struct argv_array args = ARGV_ARRAY_INIT;
        const char *cmd;
        struct cmd_struct *builtin;
 
        strip_extension(argv);
        cmd = argv[0];
 
-       /* Turn "git cmd --help" into "git help cmd" */
+       /* Turn "git cmd --help" into "git help --exclude-guides cmd" */
        if (argc > 1 && !strcmp(argv[1], "--help")) {
+               int i;
+
                argv[1] = argv[0];
                argv[0] = cmd = "help";
+
+               for (i = 0; i < argc; i++) {
+                       argv_array_push(&args, argv[i]);
+                       if (!i)
+                               argv_array_push(&args, "--exclude-guides");
+               }
+
+               argc++;
+               argv = args.argv;
        }
 
        builtin = get_builtin(cmd);
        if (builtin)
                exit(run_builtin(builtin, argc, argv));
+       argv_array_clear(&args);
 }
 
 static void execv_dashed_external(const char **argv)
 {
-       struct strbuf cmd = STRBUF_INIT;
-       const char *tmp;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        int status;
 
+       if (get_super_prefix())
+               die("%s doesn't support --super-prefix", argv[0]);
+
        if (use_pager == -1)
                use_pager = check_pager_config(argv[0]);
        commit_pager_choice();
 
-       strbuf_addf(&cmd, "git-%s", argv[0]);
+       argv_array_pushf(&cmd.args, "git-%s", argv[0]);
+       argv_array_pushv(&cmd.args, argv + 1);
+       cmd.clean_on_exit = 1;
+       cmd.wait_after_clean = 1;
+       cmd.silent_exec_failure = 1;
 
-       /*
-        * argv[0] must be the git command, but the argv array
-        * belongs to the caller, and may be reused in
-        * subsequent loop iterations. Save argv[0] and
-        * restore it on error.
-        */
-       tmp = argv[0];
-       argv[0] = cmd.buf;
-
-       trace_argv_printf(argv, "trace: exec:");
+       trace_argv_printf(cmd.args.argv, "trace: exec:");
 
        /*
-        * if we fail because the command is not found, it is
-        * OK to return. Otherwise, we just pass along the status code.
+        * If we fail because the command is not found, it is
+        * OK to return. Otherwise, we just pass along the status code,
+        * or our usual generic code if we were not even able to exec
+        * the program.
         */
-       status = run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE | RUN_CLEAN_ON_EXIT);
-       if (status >= 0 || errno != ENOENT)
+       status = run_command(&cmd);
+       if (status >= 0)
                exit(status);
-
-       argv[0] = tmp;
-
-       strbuf_release(&cmd);
+       else if (errno != ENOENT)
+               exit(128);
 }
 
 static int run_argv(int *argcp, const char ***argv)
index 5acdc900abdfb3ccc1ad7616fecb098ce6f060e2..5bdd52a6ebfa722fe077ec6a3160f9bbd8ff6a2b 100644 (file)
@@ -50,6 +50,7 @@ endif
 all:: gitk-wish $(ALL_MSGFILES)
 
 install:: all
+       $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
        $(INSTALL) -m 755 gitk-wish '$(DESTDIR_SQ)$(bindir_SQ)'/gitk
        $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(msgsdir_SQ)'
        $(foreach p,$(ALL_MSGFILES), $(INSTALL) -m 644 $p '$(DESTDIR_SQ)$(msgsdir_SQ)' &&) true
index 805a1c703040d4b08fc0d6992c92e2a044c5ddc5..a14d7a16b2dd1162fa8572d776f4adee8a0ce91f 100755 (executable)
@@ -2,7 +2,7 @@
 # Tcl ignores the next line -*- tcl -*- \
 exec wish "$0" -- "$@"
 
-# Copyright © 2005-2014 Paul Mackerras.  All rights reserved.
+# Copyright © 2005-2016 Paul Mackerras.  All rights reserved.
 # This program is free software; it may be used, copied, modified
 # and distributed under the terms of the GNU General Public Licence,
 # either version 2, or (at your option) any later version.
@@ -588,7 +588,7 @@ proc updatecommits {} {
 proc reloadcommits {} {
     global curview viewcomplete selectedline currentid thickerline
     global showneartags treediffs commitinterest cached_commitrow
-    global targetid
+    global targetid commitinfo
 
     set selid {}
     if {$selectedline ne {}} {
@@ -609,6 +609,7 @@ proc reloadcommits {} {
        getallcommits
     }
     clear_display
+    unset -nocomplain commitinfo
     unset -nocomplain commitinterest
     unset -nocomplain cached_commitrow
     unset -nocomplain targetid
@@ -1315,7 +1316,7 @@ proc commitonrow {row} {
 
 proc closevarcs {v} {
     global varctok varccommits varcid parents children
-    global cmitlisted commitidx vtokmod
+    global cmitlisted commitidx vtokmod curview numcommits
 
     set missing_parents 0
     set scripts {}
@@ -1340,6 +1341,9 @@ proc closevarcs {v} {
            }
            lappend varccommits($v,$b) $p
            incr commitidx($v)
+           if {$v == $curview} {
+               set numcommits $commitidx($v)
+           }
            set scripts [check_interest $p $scripts]
        }
     }
@@ -2265,7 +2269,7 @@ proc makewindow {} {
        set h [expr {[font metrics uifont -linespace] + 2}]
        set progresscanv .tf.bar.progress
        canvas $progresscanv -relief sunken -height $h -borderwidth 2
-       set progressitem [$progresscanv create rect -1 0 0 $h -fill lime]
+       set progressitem [$progresscanv create rect -1 0 0 $h -fill "#00ff00"]
        set fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow]
        set rprogitem [$progresscanv create rect -1 0 0 $h -fill red]
     }
@@ -2403,7 +2407,7 @@ proc makewindow {} {
 
     set ctext .bleft.bottom.ctext
     text $ctext -background $bgcolor -foreground $fgcolor \
-       -state disabled -font textfont \
+       -state disabled -undo 0 -font textfont \
        -yscrollcommand scrolltext -wrap none \
        -xscrollcommand ".bleft.bottom.sbhorizontal set"
     if {$have_tk85} {
@@ -2664,6 +2668,7 @@ proc makewindow {} {
     set headctxmenu .headctxmenu
     makemenu $headctxmenu {
        {mc "Check out this branch" command cobranch}
+       {mc "Rename this branch" command mvbranch}
        {mc "Remove this branch" command rmbranch}
        {mc "Copy branch name" command {clipboard clear; clipboard append $headmenuhead}}
     }
@@ -3033,7 +3038,7 @@ proc about {} {
     message $w.m -text [mc "
 Gitk - a commit viewer for git
 
-Copyright \u00a9 2005-2014 Paul Mackerras
+Copyright \u00a9 2005-2016 Paul Mackerras
 
 Use and redistribute under the terms of the GNU General Public License"] \
            -justify center -aspect 400 -border 2 -bg $bgcolor -relief groove
@@ -3397,7 +3402,7 @@ set rectmask {
        0x00, 0x00, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f,
        0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0x00, 0x00};
 }
-image create bitmap reficon-H -background black -foreground lime \
+image create bitmap reficon-H -background black -foreground "#00ff00" \
     -data $rectdata -maskdata $rectmask
 image create bitmap reficon-o -background black -foreground "#ddddff" \
     -data $rectdata -maskdata $rectmask
@@ -8069,7 +8074,11 @@ proc getblobdiffline {bdf ids} {
     $ctext conf -state normal
     while {[incr nr] <= 1000 && [gets $bdf line] >= 0} {
        if {$ids != $diffids || $bdf != $blobdifffd($ids)} {
+           # Older diff read. Abort it.
            catch {close $bdf}
+           if {$ids != $diffids} {
+               array unset blobdifffd $ids
+           }
            return 0
        }
        parseblobdiffline $ids $line
@@ -8078,6 +8087,7 @@ proc getblobdiffline {bdf ids} {
     blobdiffmaybeseehere [eof $bdf]
     if {[eof $bdf]} {
        catch {close $bdf}
+       array unset blobdifffd $ids
        return 0
     }
     return [expr {$nr >= 1000? 2: 1}]
@@ -9452,26 +9462,63 @@ proc wrcomcan {} {
 }
 
 proc mkbranch {} {
-    global rowmenuid mkbrtop NS
+    global NS rowmenuid
+
+    set top .branchdialog
+
+    set val(name) ""
+    set val(id) $rowmenuid
+    set val(command) [list mkbrgo $top]
+
+    set ui(title) [mc "Create branch"]
+    set ui(accept) [mc "Create"]
+
+    branchdia $top val ui
+}
+
+proc mvbranch {} {
+    global NS
+    global headmenuid headmenuhead
+
+    set top .branchdialog
+
+    set val(name) $headmenuhead
+    set val(id) $headmenuid
+    set val(command) [list mvbrgo $top $headmenuhead]
+
+    set ui(title) [mc "Rename branch %s" $headmenuhead]
+    set ui(accept) [mc "Rename"]
+
+    branchdia $top val ui
+}
+
+proc branchdia {top valvar uivar} {
+    global NS commitinfo
+    upvar $valvar val $uivar ui
 
-    set top .makebranch
     catch {destroy $top}
     ttk_toplevel $top
     make_transient $top .
-    ${NS}::label $top.title -text [mc "Create new branch"]
+    ${NS}::label $top.title -text $ui(title)
     grid $top.title - -pady 10
     ${NS}::label $top.id -text [mc "ID:"]
     ${NS}::entry $top.sha1 -width 40
-    $top.sha1 insert 0 $rowmenuid
+    $top.sha1 insert 0 $val(id)
     $top.sha1 conf -state readonly
     grid $top.id $top.sha1 -sticky w
+    ${NS}::entry $top.head -width 60
+    $top.head insert 0 [lindex $commitinfo($val(id)) 0]
+    $top.head conf -state readonly
+    grid x $top.head -sticky ew
+    grid columnconfigure $top 1 -weight 1
     ${NS}::label $top.nlab -text [mc "Name:"]
     ${NS}::entry $top.name -width 40
+    $top.name insert 0 $val(name)
     grid $top.nlab $top.name -sticky w
     ${NS}::frame $top.buts
-    ${NS}::button $top.buts.go -text [mc "Create"] -command [list mkbrgo $top]
+    ${NS}::button $top.buts.go -text $ui(accept) -command $val(command)
     ${NS}::button $top.buts.can -text [mc "Cancel"] -command "catch {destroy $top}"
-    bind $top <Key-Return> [list mkbrgo $top]
+    bind $top <Key-Return> $val(command)
     bind $top <Key-Escape> "catch {destroy $top}"
     grid $top.buts.go $top.buts.can
     grid columnconfigure $top.buts 0 -weight 1 -uniform a
@@ -9526,6 +9573,46 @@ proc mkbrgo {top} {
     }
 }
 
+proc mvbrgo {top prevname} {
+    global headids idheads mainhead mainheadid
+
+    set name [$top.name get]
+    set id [$top.sha1 get]
+    set cmdargs {}
+    if {$name eq $prevname} {
+       catch {destroy $top}
+       return
+    }
+    if {$name eq {}} {
+       error_popup [mc "Please specify a new name for the branch"] $top
+       return
+    }
+    catch {destroy $top}
+    lappend cmdargs -m $prevname $name
+    nowbusy renamebranch
+    update
+    if {[catch {
+       eval exec git branch $cmdargs
+    } err]} {
+       notbusy renamebranch
+       error_popup $err
+    } else {
+       notbusy renamebranch
+       removehead $id $prevname
+       removedhead $id $prevname
+       set headids($name) $id
+       lappend idheads($id) $name
+       addedhead $id $name
+       if {$prevname eq $mainhead} {
+           set mainhead $name
+           set mainheadid $id
+       }
+       redrawtags $id
+       dispneartags 0
+       run refill_reflist
+    }
+}
+
 proc exec_citool {tool_args {baseid {}}} {
     global commitinfo env
 
@@ -9751,20 +9838,25 @@ proc readresetstat {fd} {
 
 # context menu for a head
 proc headmenu {x y id head} {
-    global headmenuid headmenuhead headctxmenu mainhead
+    global headmenuid headmenuhead headctxmenu mainhead headids
 
     stopfinding
     set headmenuid $id
     set headmenuhead $head
-    set state normal
+    array set state {0 normal 1 normal 2 normal}
     if {[string match "remotes/*" $head]} {
-       set state disabled
+       set localhead [string range $head [expr [string last / $head] + 1] end]
+       if {[info exists headids($localhead)]} {
+           set state(0) disabled
+       }
+       array set state {1 disabled 2 disabled}
     }
     if {$head eq $mainhead} {
-       set state disabled
+       array set state {0 disabled 2 disabled}
+    }
+    foreach i {0 1 2} {
+       $headctxmenu entryconfigure $i -state $state($i)
     }
-    $headctxmenu entryconfigure 0 -state $state
-    $headctxmenu entryconfigure 1 -state $state
     tk_popup $headctxmenu $x $y
 }
 
@@ -9773,11 +9865,27 @@ proc cobranch {} {
     global showlocalchanges
 
     # check the tree is clean first??
+    set newhead $headmenuhead
+    set command [list | git checkout]
+    if {[string match "remotes/*" $newhead]} {
+       set remote $newhead
+       set newhead [string range $newhead [expr [string last / $newhead] + 1] end]
+       # The following check is redundant - the menu option should
+       # be disabled to begin with...
+       if {[info exists headids($newhead)]} {
+           error_popup [mc "A local branch named %s exists already" $newhead]
+           return
+       }
+       lappend command -b $newhead --track $remote
+    } else {
+       lappend command $newhead
+    }
+    lappend command 2>@1
     nowbusy checkout [mc "Checking out"]
     update
     dohidelocalchanges
     if {[catch {
-       set fd [open [list | git checkout $headmenuhead 2>@1] r]
+       set fd [open $command r]
     } err]} {
        notbusy checkout
        error_popup $err
@@ -9785,12 +9893,12 @@ proc cobranch {} {
            dodiffindex
        }
     } else {
-       filerun $fd [list readcheckoutstat $fd $headmenuhead $headmenuid]
+       filerun $fd [list readcheckoutstat $fd $newhead $headmenuid]
     }
 }
 
 proc readcheckoutstat {fd newhead newheadid} {
-    global mainhead mainheadid headids showlocalchanges progresscoords
+    global mainhead mainheadid headids idheads showlocalchanges progresscoords
     global viewmainheadid curview
 
     if {[gets $fd line] >= 0} {
@@ -9805,8 +9913,14 @@ proc readcheckoutstat {fd newhead newheadid} {
     notbusy checkout
     if {[catch {close $fd} err]} {
        error_popup $err
+       return
     }
     set oldmainid $mainheadid
+    if {! [info exists headids($newhead)]} {
+       set headids($newhead) $newheadid
+       lappend idheads($newheadid) $newhead
+       addedhead $newheadid $newhead
+    }
     set mainhead $newhead
     set mainheadid $newheadid
     set viewmainheadid($curview) $newheadid
@@ -12188,7 +12302,7 @@ if {[tk windowingsystem] eq "aqua"} {
     set extdifftool "meld"
 }
 
-set colors {lime red blue magenta darkgrey brown orange}
+set colors {"#00ff00" red blue magenta darkgrey brown orange}
 if {[tk windowingsystem] eq "win32"} {
     set uicolor SystemButtonFace
     set uifgcolor SystemButtonText
@@ -12206,12 +12320,12 @@ if {[tk windowingsystem] eq "win32"} {
 }
 set diffcolors {red "#00a000" blue}
 set diffcontext 3
-set mergecolors {red blue lime purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
+set mergecolors {red blue "#00ff00" purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
 set ignorespace 0
 set worddiff ""
 set markbgcolor "#e0e0ff"
 
-set headbgcolor lime
+set headbgcolor "#00ff00"
 set headfgcolor black
 set headoutlinecolor black
 set remotebgcolor #ffddaa
@@ -12226,7 +12340,7 @@ set linehoverfgcolor black
 set linehoveroutlinecolor black
 set mainheadcirclecolor yellow
 set workingfilescirclecolor red
-set indexcirclecolor lime
+set indexcirclecolor "#00ff00"
 set circlecolors {white blue gray blue blue}
 set linkfgcolor blue
 set circleoutlinecolor $fgcolor
index 99aa77aa63bd24af12a2ccee120b2a1db7307781..407d5550b1aba947549ad509a641134c34f28d46 100644 (file)
@@ -371,14 +371,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk — визуализация на подаванията в Git\n"
 "\n"
-"Авторски права: © 2005-2014 Paul Mackerras\n"
+"Авторски права: © 2005-2016 Paul Mackerras\n"
 "\n"
 "Използвайте и разпространявайте при условията на ОПЛ на ГНУ"
 
index 5ad066f7ce84c4be7801a467498ee3de3abccbf9..87dfc18b4406b202221b7e09894f0372988e728d 100644 (file)
@@ -1,5 +1,5 @@
 # Translation of gitk
-# Copyright (C) 2005-2014 Paul Mackerras
+# Copyright (C) 2005-2016 Paul Mackerras
 # This file is distributed under the same license as the gitk package.
 # Alex Henrie <alexhenrie24@gmail.com>, 2015.
 #
@@ -365,14 +365,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - visualitzador de comissions per al git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Useu-lo i redistribuïu-lo sota els termes de la Llicència Pública General GNU"
 
index bde749ed8ac7391746e06a00742c44905f7e686e..5db38248289baa42f1732a6f72566652d5819289 100644 (file)
@@ -363,14 +363,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - eine Visualisierung der Git-Historie\n"
 "\n"
-"Copyright \\u00a9 2005-2014 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Benutzung und Weiterverbreitung gemäß den Bedingungen der GNU General Public "
 "License"
index ddcb0a5f68dc27127d72f2a42f6d77d2bbf7c23f..fef3bbafeead3e6f25300efa219ad1304596cf78 100644 (file)
@@ -370,14 +370,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - un visualizador de revisiones para git\n"
 "\n"
-"Copyright \\u00a9 2005-2010 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Uso y redistribución permitidos según los términos de la Licencia Pública "
 "General de GNU (GNU GPL)"
index c44f994fa5807036043e2ebe197e832c9d2e3e1f..e4fac932e5b0f6267076943c8244196e31bbd678 100644 (file)
@@ -372,14 +372,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - visualisateur de commit pour git\n"
 "\n"
-"Copyright \\u00a9 2005-2014 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Utilisation et redistribution soumises aux termes de la GNU General Public License"
 
index 66fd75ba5b1634f13f067e4aab3cc1d921ca804b..79ec5a565674b0bc3fcec50588bb845afbde07a3 100644 (file)
@@ -366,14 +366,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - commit nézegető a githez\n"
 "\n"
-"Szerzői jog \\u00a9 2005-2010 Paul Mackerras\n"
+"Szerzői jog \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Használd és terjeszd a GNU General Public License feltételei mellett"
 
index b5f002db7d52d3106d3a52dbb03047ad67233b62..b58d23eb2b9253808282e31d44125e98098584e0 100644 (file)
@@ -367,14 +367,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - un visualizzatore di revisioni per git\n"
 "\n"
-"Copyright \\u00a9 2005-2010 Paul Mackerras\n"
+"Copyright \\u00a9 2005-2016 Paul Mackerras\n"
 "\n"
 "Utilizzo e redistribuzione permessi sotto i termini della GNU General Public "
 "License"
index f143753db0b27cf0dfd1ef28ba89372c921feb7b..ca3c29b457bd375ff5f42bdc321d809f4cd301dc 100644 (file)
@@ -2,16 +2,17 @@
 # Copyright (C) 2005-2015 Paul Mackerras
 # This file is distributed under the same license as the gitk package.
 #
-# YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>, 2015.
 # Mizar <mizar.jp@gmail.com>, 2009.
 # Junio C Hamano <gitster@pobox.com>, 2009.
+# YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>, 2015.
+# Satoshi Yasushima <s.yasushima@gmail.com>, 2016.
 msgid ""
 msgstr ""
 "Project-Id-Version: gitk\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-05-17 14:32+1000\n"
 "PO-Revision-Date: 2015-11-12 13:00+0900\n"
-"Last-Translator: YOKOTA Hiroshi <yokota@netlab.cs.tsukuba.ac.jp>\n"
+"Last-Translator: Satoshi Yasushima <s.yasushima@gmail.com>\n"
 "Language-Team: Japanese\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
@@ -314,11 +315,11 @@ msgstr "マークを付けたコミットと比較する"
 
 #: gitk:2630 gitk:2641
 msgid "Diff this -> marked commit"
-msgstr "これと選択したコミットのdiffを見る"
+msgstr "これとマークを付けたコミットのdiffを見る"
 
 #: gitk:2631 gitk:2642
 msgid "Diff marked commit -> this"
-msgstr "選択したコミットとこれのdiffを見る"
+msgstr "マークを付けたコミットとこれのdiffを見る"
 
 #: gitk:2632
 msgid "Revert this commit"
@@ -373,14 +374,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - gitコミットビューア\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "使用および再配布は GNU General Public License に従ってください"
 
index 3f78f1b7482614098e295f3f1ffb6c0925ae6383..1feb34854b32ccd03c0eaf15adbd488d3573aef4 100644 (file)
@@ -368,14 +368,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - um visualizador de revisões para o git \n"
 "\n"
-"Copyright ©9 2005-2010 Paul Mackerras\n"
+"Copyright ©9 2005-2016 Paul Mackerras\n"
 "\n"
 "Uso e distribuição segundo os termos da Licença Pública Geral GNU"
 
diff --git a/gitk-git/po/pt_pt.po b/gitk-git/po/pt_pt.po
new file mode 100644 (file)
index 0000000..f680ea8
--- /dev/null
@@ -0,0 +1,1376 @@
+# Portuguese translations for gitk package.
+# Copyright (C) 2016 Paul Mackerras
+# This file is distributed under the same license as the gitk package.
+# Vasco Almeida <vascomalmeida@sapo.pt>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: gitk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-04-15 16:52+0000\n"
+"PO-Revision-Date: 2016-05-06 15:35+0000\n"
+"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
+"Language-Team: Portuguese\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: gitk:140
+msgid "Couldn't get list of unmerged files:"
+msgstr "Não foi possível obter lista de ficheiros não integrados:"
+
+#: gitk:212 gitk:2399
+msgid "Color words"
+msgstr "Colorir palavras"
+
+#: gitk:217 gitk:2399 gitk:8239 gitk:8272
+msgid "Markup words"
+msgstr "Marcar palavras"
+
+#: gitk:324
+msgid "Error parsing revisions:"
+msgstr "Erro ao analisar revisões:"
+
+#: gitk:380
+msgid "Error executing --argscmd command:"
+msgstr "Erro ao executar o comando de --argscmd:"
+
+#: gitk:393
+msgid "No files selected: --merge specified but no files are unmerged."
+msgstr ""
+"Nenhum ficheiro selecionado: --merge especificado mas não há ficheiros por "
+"integrar."
+
+#: gitk:396
+msgid ""
+"No files selected: --merge specified but no unmerged files are within file "
+"limit."
+msgstr ""
+"Nenhum ficheiro selecionado: --merge especificado mas não há ficheiros por "
+"integrar ao nível de ficheiro."
+
+#: gitk:418 gitk:566
+msgid "Error executing git log:"
+msgstr "Erro ao executar git log:"
+
+#: gitk:436 gitk:582
+msgid "Reading"
+msgstr "A ler"
+
+#: gitk:496 gitk:4544
+msgid "Reading commits..."
+msgstr "A ler commits..."
+
+#: gitk:499 gitk:1637 gitk:4547
+msgid "No commits selected"
+msgstr "Nenhum commit selecionado"
+
+#: gitk:1445 gitk:4064 gitk:12469
+msgid "Command line"
+msgstr "Linha de comandos"
+
+#: gitk:1511
+msgid "Can't parse git log output:"
+msgstr "Não é possível analisar a saída de git log:"
+
+#: gitk:1740
+msgid "No commit information available"
+msgstr "Não há informação disponível sobre o commit"
+
+#: gitk:1903 gitk:1932 gitk:4334 gitk:9702 gitk:11274 gitk:11554
+msgid "OK"
+msgstr "OK"
+
+#: gitk:1934 gitk:4336 gitk:9215 gitk:9294 gitk:9424 gitk:9473 gitk:9704
+#: gitk:11275 gitk:11555
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: gitk:2083
+msgid "&Update"
+msgstr "At&ualizar"
+
+#: gitk:2084
+msgid "&Reload"
+msgstr "&Recarregar"
+
+#: gitk:2085
+msgid "Reread re&ferences"
+msgstr "Reler re&ferências"
+
+#: gitk:2086
+msgid "&List references"
+msgstr "&Listar referências"
+
+#: gitk:2088
+msgid "Start git &gui"
+msgstr "Iniciar git &gui"
+
+#: gitk:2090
+msgid "&Quit"
+msgstr "&Sair"
+
+#: gitk:2082
+msgid "&File"
+msgstr "&Ficheiro"
+
+#: gitk:2094
+msgid "&Preferences"
+msgstr "&Preferências"
+
+#: gitk:2093
+msgid "&Edit"
+msgstr "&Editar"
+
+#: gitk:2098
+msgid "&New view..."
+msgstr "&Nova vista..."
+
+#: gitk:2099
+msgid "&Edit view..."
+msgstr "&Editar vista..."
+
+#: gitk:2100
+msgid "&Delete view"
+msgstr "Elimina&r vista"
+
+#: gitk:2102
+msgid "&All files"
+msgstr "&Todos os ficheiros"
+
+#: gitk:2097
+msgid "&View"
+msgstr "&Ver"
+
+#: gitk:2107 gitk:2117
+msgid "&About gitk"
+msgstr "&Sobre gitk"
+
+#: gitk:2108 gitk:2122
+msgid "&Key bindings"
+msgstr "&Atalhos"
+
+#: gitk:2106 gitk:2121
+msgid "&Help"
+msgstr "&Ajuda"
+
+#: gitk:2199 gitk:8671
+msgid "SHA1 ID:"
+msgstr "ID SHA1:"
+
+#: gitk:2243
+msgid "Row"
+msgstr "Linha"
+
+#: gitk:2281
+msgid "Find"
+msgstr "Procurar"
+
+#: gitk:2309
+msgid "commit"
+msgstr "commit"
+
+#: gitk:2313 gitk:2315 gitk:4706 gitk:4729 gitk:4753 gitk:6774 gitk:6846
+#: gitk:6931
+msgid "containing:"
+msgstr "contendo:"
+
+#: gitk:2316 gitk:3545 gitk:3550 gitk:4782
+msgid "touching paths:"
+msgstr "altera os caminhos:"
+
+#: gitk:2317 gitk:4796
+msgid "adding/removing string:"
+msgstr "adiciona/remove a cadeia:"
+
+#: gitk:2318 gitk:4798
+msgid "changing lines matching:"
+msgstr "altera linhas com:"
+
+#: gitk:2327 gitk:2329 gitk:4785
+msgid "Exact"
+msgstr "Exato"
+
+#: gitk:2329 gitk:4873 gitk:6742
+msgid "IgnCase"
+msgstr "IgnMaiúsculas"
+
+#: gitk:2329 gitk:4755 gitk:4871 gitk:6738
+msgid "Regexp"
+msgstr "Expr. regular"
+
+#: gitk:2331 gitk:2332 gitk:4893 gitk:4923 gitk:4930 gitk:6867 gitk:6935
+msgid "All fields"
+msgstr "Todos os campos"
+
+#: gitk:2332 gitk:4890 gitk:4923 gitk:6805
+msgid "Headline"
+msgstr "Cabeçalho"
+
+#: gitk:2333 gitk:4890 gitk:6805 gitk:6935 gitk:7408
+msgid "Comments"
+msgstr "Comentários"
+
+#: gitk:2333 gitk:4890 gitk:4895 gitk:4930 gitk:6805 gitk:7343 gitk:8849
+#: gitk:8864
+msgid "Author"
+msgstr "Autor"
+
+#: gitk:2333 gitk:4890 gitk:6805 gitk:7345
+msgid "Committer"
+msgstr "Committer"
+
+#: gitk:2367
+msgid "Search"
+msgstr "Pesquisar"
+
+#: gitk:2375
+msgid "Diff"
+msgstr "Diff"
+
+#: gitk:2377
+msgid "Old version"
+msgstr "Versão antiga"
+
+#: gitk:2379
+msgid "New version"
+msgstr "Versão nova"
+
+#: gitk:2382
+msgid "Lines of context"
+msgstr "Linhas de contexto"
+
+#: gitk:2392
+msgid "Ignore space change"
+msgstr "Ignorar espaços"
+
+#: gitk:2396 gitk:2398 gitk:7978 gitk:8225
+msgid "Line diff"
+msgstr "Diff de linha"
+
+#: gitk:2463
+msgid "Patch"
+msgstr "Patch"
+
+#: gitk:2465
+msgid "Tree"
+msgstr "Árvore"
+
+#: gitk:2635 gitk:2656
+msgid "Diff this -> selected"
+msgstr "Diff este -> seleção"
+
+#: gitk:2636 gitk:2657
+msgid "Diff selected -> this"
+msgstr "Diff seleção -> este"
+
+#: gitk:2637 gitk:2658
+msgid "Make patch"
+msgstr "Gerar patch"
+
+#: gitk:2638 gitk:9273
+msgid "Create tag"
+msgstr "Criar tag"
+
+#: gitk:2639
+msgid "Copy commit summary"
+msgstr "Copiar sumário do commit"
+
+#: gitk:2640 gitk:9404
+msgid "Write commit to file"
+msgstr "Escrever commit num ficheiro"
+
+#: gitk:2641 gitk:9461
+msgid "Create new branch"
+msgstr "Criar novo ramo"
+
+#: gitk:2642
+msgid "Cherry-pick this commit"
+msgstr "Efetuar cherry-pick deste commit"
+
+#: gitk:2643
+msgid "Reset HEAD branch to here"
+msgstr "Repor ramo HEAD para aqui"
+
+#: gitk:2644
+msgid "Mark this commit"
+msgstr "Marcar este commit"
+
+#: gitk:2645
+msgid "Return to mark"
+msgstr "Voltar à marca"
+
+#: gitk:2646
+msgid "Find descendant of this and mark"
+msgstr "Encontrar descendeste deste e da marca"
+
+#: gitk:2647
+msgid "Compare with marked commit"
+msgstr "Comparar com o commit marcado"
+
+#: gitk:2648 gitk:2659
+msgid "Diff this -> marked commit"
+msgstr "Diff este -> commit marcado"
+
+#: gitk:2649 gitk:2660
+msgid "Diff marked commit -> this"
+msgstr "Diff commit marcado -> este"
+
+#: gitk:2650
+msgid "Revert this commit"
+msgstr "Reverter este commit"
+
+#: gitk:2666
+msgid "Check out this branch"
+msgstr "Extrair este ramo"
+
+#: gitk:2667
+msgid "Remove this branch"
+msgstr "Remover este ramo"
+
+#: gitk:2668
+msgid "Copy branch name"
+msgstr "Copiar nome do ramo"
+
+#: gitk:2675
+msgid "Highlight this too"
+msgstr "Realçar este também"
+
+#: gitk:2676
+msgid "Highlight this only"
+msgstr "Realçar apenas este"
+
+#: gitk:2677
+msgid "External diff"
+msgstr "Diff externo"
+
+#: gitk:2678
+msgid "Blame parent commit"
+msgstr "Culpar commit pai"
+
+#: gitk:2679
+msgid "Copy path"
+msgstr "Copiar caminho"
+
+#: gitk:2686
+msgid "Show origin of this line"
+msgstr "Mostrar origem deste ficheiro"
+
+#: gitk:2687
+msgid "Run git gui blame on this line"
+msgstr "Executar git gui blame sobre esta linha"
+
+#: gitk:3031
+msgid "About gitk"
+msgstr "Sobre gitk"
+
+#: gitk:3033
+msgid ""
+"\n"
+"Gitk - a commit viewer for git\n"
+"\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
+"\n"
+"Use and redistribute under the terms of the GNU General Public License"
+msgstr ""
+"\n"
+"Gitk - um visualizador de commits do git\n"
+"\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
+"\n"
+"Use e redistribua sob os termos da GNU General Public License"
+
+#: gitk:3041 gitk:3108 gitk:9890
+msgid "Close"
+msgstr "Fechar"
+
+#: gitk:3062
+msgid "Gitk key bindings"
+msgstr "Atalhos do gitk"
+
+#: gitk:3065
+msgid "Gitk key bindings:"
+msgstr "Atalhos do gitk:"
+
+#: gitk:3067
+#, tcl-format
+msgid "<%s-Q>\t\tQuit"
+msgstr "<%s-Q>\t\tSair"
+
+#: gitk:3068
+#, tcl-format
+msgid "<%s-W>\t\tClose window"
+msgstr "<%s-W>\t\tFechar janela"
+
+#: gitk:3069
+msgid "<Home>\t\tMove to first commit"
+msgstr "<Home>\t\tMover para o primeiro commit"
+
+#: gitk:3070
+msgid "<End>\t\tMove to last commit"
+msgstr "<End>\t\tMover para o último commit"
+
+#: gitk:3071
+msgid "<Up>, p, k\tMove up one commit"
+msgstr "<Cima>, p, k\tMover para o commit acima"
+
+#: gitk:3072
+msgid "<Down>, n, j\tMove down one commit"
+msgstr "<Baixo>, n, j\tMover para o commit abaixo"
+
+#: gitk:3073
+msgid "<Left>, z, h\tGo back in history list"
+msgstr "<Esquerda>, z, h\tRecuar no histórico"
+
+#: gitk:3074
+msgid "<Right>, x, l\tGo forward in history list"
+msgstr "<Direita>, x, l\tAvançar no histórico"
+
+#: gitk:3075
+#, tcl-format
+msgid "<%s-n>\tGo to n-th parent of current commit in history list"
+msgstr "<%s-n>\tIr para o n-ésimo pai do commit atual no histórico"
+
+#: gitk:3076
+msgid "<PageUp>\tMove up one page in commit list"
+msgstr "<PageUp>\tMover a lista de commits uma página para cima"
+
+#: gitk:3077
+msgid "<PageDown>\tMove down one page in commit list"
+msgstr "<PageDown>\tMover a lista de commits uma página para baixo"
+
+#: gitk:3078
+#, tcl-format
+msgid "<%s-Home>\tScroll to top of commit list"
+msgstr "<%s-Home>\tDeslocar para o topo da lista"
+
+#: gitk:3079
+#, tcl-format
+msgid "<%s-End>\tScroll to bottom of commit list"
+msgstr "<%s-End>\tDeslocar para o fim da lista"
+
+#: gitk:3080
+#, tcl-format
+msgid "<%s-Up>\tScroll commit list up one line"
+msgstr "<%s-Cima>\tDeslocar a lista de commits uma linha para cima"
+
+#: gitk:3081
+#, tcl-format
+msgid "<%s-Down>\tScroll commit list down one line"
+msgstr "<%s-Baixo>\tDeslocar a lista de commits uma linha para baixo"
+
+#: gitk:3082
+#, tcl-format
+msgid "<%s-PageUp>\tScroll commit list up one page"
+msgstr "<%s-PageUp>\tDeslocar a lista de commits uma página para cima"
+
+#: gitk:3083
+#, tcl-format
+msgid "<%s-PageDown>\tScroll commit list down one page"
+msgstr "<%s-PageDown>\tDeslocar a lista de commits uma página para baixo"
+
+#: gitk:3084
+msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
+msgstr "<Shift-Cima>\tProcurar para trás (para cima, commits posteriores)"
+
+#: gitk:3085
+msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
+msgstr "<Shift-Baixo>\tProcurar para a frente (para baixo, commits anteriores)"
+
+#: gitk:3086
+msgid "<Delete>, b\tScroll diff view up one page"
+msgstr "<Delete>, b\tDeslocar vista diff uma página para cima"
+
+#: gitk:3087
+msgid "<Backspace>\tScroll diff view up one page"
+msgstr "<Retrocesso>\tDeslocar vista diff uma página para cima"
+
+#: gitk:3088
+msgid "<Space>\t\tScroll diff view down one page"
+msgstr "<Espaço>\tDeslocar vista diff uma página para baixo"
+
+#: gitk:3089
+msgid "u\t\tScroll diff view up 18 lines"
+msgstr "u\t\tDeslocar vista diff 18 linhas para cima"
+
+#: gitk:3090
+msgid "d\t\tScroll diff view down 18 lines"
+msgstr "d\t\tDeslocar vista diff 18 linhas para baixo"
+
+#: gitk:3091
+#, tcl-format
+msgid "<%s-F>\t\tFind"
+msgstr "<%s-F>\t\tProcurar"
+
+#: gitk:3092
+#, tcl-format
+msgid "<%s-G>\t\tMove to next find hit"
+msgstr "<%s-G>\t\tMover para a ocorrência seguinte"
+
+#: gitk:3093
+msgid "<Return>\tMove to next find hit"
+msgstr "<Return>\tMover para a ocorrência seguinte"
+
+#: gitk:3094
+msgid "g\t\tGo to commit"
+msgstr "g\t\tIr para o commit"
+
+#: gitk:3095
+msgid "/\t\tFocus the search box"
+msgstr "/\t\tFocar a caixa de pesquisa"
+
+#: gitk:3096
+msgid "?\t\tMove to previous find hit"
+msgstr "?\t\tMover para a ocorrência anterior"
+
+#: gitk:3097
+msgid "f\t\tScroll diff view to next file"
+msgstr "f\t\tDeslocar vista diff para o ficheiro seguinte"
+
+#: gitk:3098
+#, tcl-format
+msgid "<%s-S>\t\tSearch for next hit in diff view"
+msgstr "<%s-S>\t\tProcurar pela ocorrência seguinte na vista diff"
+
+#: gitk:3099
+#, tcl-format
+msgid "<%s-R>\t\tSearch for previous hit in diff view"
+msgstr "<%s-R>\t\tProcurar pela ocorrência anterior na vista diff"
+
+#: gitk:3100
+#, tcl-format
+msgid "<%s-KP+>\tIncrease font size"
+msgstr "<%s-KP+>\tAumentar o tamanho da letra"
+
+#: gitk:3101
+#, tcl-format
+msgid "<%s-plus>\tIncrease font size"
+msgstr "<%s-mais>\tAumentar o tamanho da letra"
+
+#: gitk:3102
+#, tcl-format
+msgid "<%s-KP->\tDecrease font size"
+msgstr "<%s-KP->\tDiminuir o tamanho da letra"
+
+#: gitk:3103
+#, tcl-format
+msgid "<%s-minus>\tDecrease font size"
+msgstr "<%s-menos>\tDiminuir o tamanho da letra"
+
+#: gitk:3104
+msgid "<F5>\t\tUpdate"
+msgstr "<F5>\t\tAtualizar"
+
+#: gitk:3569 gitk:3578
+#, tcl-format
+msgid "Error creating temporary directory %s:"
+msgstr "Erro ao criar ficheiro temporário %s:"
+
+#: gitk:3591
+#, tcl-format
+msgid "Error getting \"%s\" from %s:"
+msgstr "Erro ao obter \"%s\" de %s:"
+
+#: gitk:3654
+msgid "command failed:"
+msgstr "o comando falhou:"
+
+#: gitk:3803
+msgid "No such commit"
+msgstr "Commit inexistente"
+
+#: gitk:3817
+msgid "git gui blame: command failed:"
+msgstr "git gui blame: o comando falhou:"
+
+#: gitk:3848
+#, tcl-format
+msgid "Couldn't read merge head: %s"
+msgstr "Não foi possível ler a cabeça de integração: %s"
+
+#: gitk:3856
+#, tcl-format
+msgid "Error reading index: %s"
+msgstr "Erro ao ler o índice: %s"
+
+#: gitk:3881
+#, tcl-format
+msgid "Couldn't start git blame: %s"
+msgstr "Não foi possível iniciar git blame: %s"
+
+#: gitk:3884 gitk:6773
+msgid "Searching"
+msgstr "A procurar"
+
+#: gitk:3916
+#, tcl-format
+msgid "Error running git blame: %s"
+msgstr "Erro ao executar git blame: %s"
+
+#: gitk:3944
+#, tcl-format
+msgid "That line comes from commit %s,  which is not in this view"
+msgstr "Essa linha provém do commit %s, que não está nesta vista"
+
+#: gitk:3958
+msgid "External diff viewer failed:"
+msgstr "Visualizador diff externo falhou:"
+
+#: gitk:4062
+msgid "All files"
+msgstr "Todos os ficheiros"
+
+#: gitk:4086
+msgid "View"
+msgstr "Vista"
+
+#: gitk:4089
+msgid "Gitk view definition"
+msgstr "Definição de vistas do gitk"
+
+#: gitk:4093
+msgid "Remember this view"
+msgstr "Recordar esta vista"
+
+#: gitk:4094
+msgid "References (space separated list):"
+msgstr "Referências (lista separada por espaço):"
+
+#: gitk:4095
+msgid "Branches & tags:"
+msgstr "Ramos e tags:"
+
+#: gitk:4096
+msgid "All refs"
+msgstr "Todas as referências"
+
+#: gitk:4097
+msgid "All (local) branches"
+msgstr "Todos os ramos (locais)"
+
+#: gitk:4098
+msgid "All tags"
+msgstr "Todas as tags"
+
+#: gitk:4099
+msgid "All remote-tracking branches"
+msgstr "Todos os ramos remotos de monitorização"
+
+#: gitk:4100
+msgid "Commit Info (regular expressions):"
+msgstr "Informação Sobre o Commit (expressões regulares):"
+
+#: gitk:4101
+msgid "Author:"
+msgstr "Autor:"
+
+#: gitk:4102
+msgid "Committer:"
+msgstr "Committer:"
+
+#: gitk:4103
+msgid "Commit Message:"
+msgstr "Mensagem de Commit:"
+
+#: gitk:4104
+msgid "Matches all Commit Info criteria"
+msgstr "Corresponde a todos os critérios da Informação Sobre o Commit"
+
+#: gitk:4105
+msgid "Matches no Commit Info criteria"
+msgstr "Não corresponde a nenhum critério da Informação Sobre o Commit"
+
+#: gitk:4106
+msgid "Changes to Files:"
+msgstr "Alterações nos Ficheiros:"
+
+#: gitk:4107
+msgid "Fixed String"
+msgstr "Cadeia Fixa"
+
+#: gitk:4108
+msgid "Regular Expression"
+msgstr "Expressão Regular"
+
+#: gitk:4109
+msgid "Search string:"
+msgstr "Procurar pela cadeia:"
+
+#: gitk:4110
+msgid ""
+"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
+"15:27:38\"):"
+msgstr ""
+"Datas de Commit (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
+"15:27:38\"):"
+
+#: gitk:4111
+msgid "Since:"
+msgstr "Desde:"
+
+#: gitk:4112
+msgid "Until:"
+msgstr "Até:"
+
+#: gitk:4113
+msgid "Limit and/or skip a number of revisions (positive integer):"
+msgstr "Limitar e/ou ignorar um número de revisões (inteiro positivo):"
+
+#: gitk:4114
+msgid "Number to show:"
+msgstr "Número a mostrar:"
+
+#: gitk:4115
+msgid "Number to skip:"
+msgstr "Número a ignorar:"
+
+#: gitk:4116
+msgid "Miscellaneous options:"
+msgstr "Opções diversas:"
+
+#: gitk:4117
+msgid "Strictly sort by date"
+msgstr "Ordenar estritamente pela data"
+
+#: gitk:4118
+msgid "Mark branch sides"
+msgstr "Marcar lado dos ramos"
+
+#: gitk:4119
+msgid "Limit to first parent"
+msgstr "Restringir ao primeiro pai"
+
+#: gitk:4120
+msgid "Simple history"
+msgstr "Histórico simples"
+
+#: gitk:4121
+msgid "Additional arguments to git log:"
+msgstr "Argumentos adicionais ao git log:"
+
+#: gitk:4122
+msgid "Enter files and directories to include, one per line:"
+msgstr "Introduza ficheiros e diretórios para incluir, um por linha:"
+
+#: gitk:4123
+msgid "Command to generate more commits to include:"
+msgstr "Comando para gerar mais commits para incluir:"
+
+#: gitk:4247
+msgid "Gitk: edit view"
+msgstr "Gitk: editar vista"
+
+#: gitk:4255
+msgid "-- criteria for selecting revisions"
+msgstr "-- critério para selecionar revisões"
+
+#: gitk:4260
+msgid "View Name"
+msgstr "Nome da Vista"
+
+#: gitk:4335
+msgid "Apply (F5)"
+msgstr "Aplicar (F5)"
+
+#: gitk:4373
+msgid "Error in commit selection arguments:"
+msgstr "Erro nos argumentos de seleção de commits:"
+
+#: gitk:4428 gitk:4481 gitk:4943 gitk:4957 gitk:6227 gitk:12410 gitk:12411
+msgid "None"
+msgstr "Nenhum"
+
+#: gitk:5040 gitk:5045
+msgid "Descendant"
+msgstr "Descendente"
+
+#: gitk:5041
+msgid "Not descendant"
+msgstr "Não descendente"
+
+#: gitk:5048 gitk:5053
+msgid "Ancestor"
+msgstr "Antecessor"
+
+#: gitk:5049
+msgid "Not ancestor"
+msgstr "Não antecessor"
+
+#: gitk:5343
+msgid "Local changes checked in to index but not committed"
+msgstr "Alterações locais preparadas no índice mas não submetidas"
+
+#: gitk:5379
+msgid "Local uncommitted changes, not checked in to index"
+msgstr "Alterações locais não submetidas, não preparadas no índice"
+
+#: gitk:7153
+msgid "and many more"
+msgstr "e muitos mais"
+
+#: gitk:7156
+msgid "many"
+msgstr "muitos"
+
+#: gitk:7347
+msgid "Tags:"
+msgstr "Tags:"
+
+#: gitk:7364 gitk:7370 gitk:8844
+msgid "Parent"
+msgstr "Pai"
+
+#: gitk:7375
+msgid "Child"
+msgstr "Filho"
+
+#: gitk:7384
+msgid "Branch"
+msgstr "Ramo"
+
+#: gitk:7387
+msgid "Follows"
+msgstr "Sucede"
+
+#: gitk:7390
+msgid "Precedes"
+msgstr "Precede"
+
+#: gitk:7985
+#, tcl-format
+msgid "Error getting diffs: %s"
+msgstr "Erro ao obter diferenças: %s"
+
+#: gitk:8669
+msgid "Goto:"
+msgstr "Ir para:"
+
+#: gitk:8690
+#, tcl-format
+msgid "Short SHA1 id %s is ambiguous"
+msgstr "O id SHA1 abreviado %s é ambíguo"
+
+#: gitk:8697
+#, tcl-format
+msgid "Revision %s is not known"
+msgstr "A revisão %s não é conhecida"
+
+#: gitk:8707
+#, tcl-format
+msgid "SHA1 id %s is not known"
+msgstr "O id SHA1 %s não é conhecido"
+
+#: gitk:8709
+#, tcl-format
+msgid "Revision %s is not in the current view"
+msgstr "A revisão %s não se encontra na vista atual"
+
+#: gitk:8851 gitk:8866
+msgid "Date"
+msgstr "Data"
+
+#: gitk:8854
+msgid "Children"
+msgstr "Filhos"
+
+#: gitk:8917
+#, tcl-format
+msgid "Reset %s branch to here"
+msgstr "Repor o ramo %s para aqui"
+
+#: gitk:8919
+msgid "Detached head: can't reset"
+msgstr "Cabeça destacada: não é possível repor"
+
+#: gitk:9024 gitk:9030
+msgid "Skipping merge commit "
+msgstr "A ignorar commit de integração "
+
+#: gitk:9039 gitk:9044
+msgid "Error getting patch ID for "
+msgstr "Erro ao obter ID de patch de "
+
+#: gitk:9040 gitk:9045
+msgid " - stopping\n"
+msgstr " - a interromper\n"
+
+#: gitk:9050 gitk:9053 gitk:9061 gitk:9075 gitk:9084
+msgid "Commit "
+msgstr "Commit "
+
+#: gitk:9054
+msgid ""
+" is the same patch as\n"
+"       "
+msgstr ""
+" é o mesmo patch que\n"
+"       "
+
+#: gitk:9062
+msgid ""
+" differs from\n"
+"       "
+msgstr ""
+" difere de\n"
+"       "
+
+#: gitk:9064
+msgid ""
+"Diff of commits:\n"
+"\n"
+msgstr ""
+"Diferença dos commits:\n"
+"\n"
+
+#: gitk:9076 gitk:9085
+#, tcl-format
+msgid " has %s children - stopping\n"
+msgstr " tem %s filhos - a interromper\n"
+
+#: gitk:9104
+#, tcl-format
+msgid "Error writing commit to file: %s"
+msgstr "Erro ao escrever commit no ficheiro: %s"
+
+#: gitk:9110
+#, tcl-format
+msgid "Error diffing commits: %s"
+msgstr "Erro ao calcular as diferenças dos commits: %s"
+
+#: gitk:9156
+msgid "Top"
+msgstr "Topo"
+
+#: gitk:9157
+msgid "From"
+msgstr "De"
+
+#: gitk:9162
+msgid "To"
+msgstr "Para"
+
+#: gitk:9186
+msgid "Generate patch"
+msgstr "Gerar patch"
+
+#: gitk:9188
+msgid "From:"
+msgstr "De:"
+
+#: gitk:9197
+msgid "To:"
+msgstr "Para:"
+
+#: gitk:9206
+msgid "Reverse"
+msgstr "Reverter"
+
+#: gitk:9208 gitk:9418
+msgid "Output file:"
+msgstr "Ficheiro de saída:"
+
+#: gitk:9214
+msgid "Generate"
+msgstr "Gerar"
+
+#: gitk:9252
+msgid "Error creating patch:"
+msgstr "Erro ao criar patch:"
+
+#: gitk:9275 gitk:9406 gitk:9463
+msgid "ID:"
+msgstr "ID:"
+
+#: gitk:9284
+msgid "Tag name:"
+msgstr "Nome da tag:"
+
+#: gitk:9287
+msgid "Tag message is optional"
+msgstr "A mensagem da tag é opcional"
+
+#: gitk:9289
+msgid "Tag message:"
+msgstr "Mensagem da tag:"
+
+#: gitk:9293 gitk:9472
+msgid "Create"
+msgstr "Criar"
+
+#: gitk:9311
+msgid "No tag name specified"
+msgstr "Nenhum nome de tag especificado"
+
+#: gitk:9315
+#, tcl-format
+msgid "Tag \"%s\" already exists"
+msgstr "A tag \"%s\" já existe"
+
+#: gitk:9325
+msgid "Error creating tag:"
+msgstr "Erro ao criar tag:"
+
+#: gitk:9415
+msgid "Command:"
+msgstr "Comando:"
+
+#: gitk:9423
+msgid "Write"
+msgstr "Escrever"
+
+#: gitk:9441
+msgid "Error writing commit:"
+msgstr "Erro ao escrever commit:"
+
+#: gitk:9468
+msgid "Name:"
+msgstr "Nome:"
+
+#: gitk:9491
+msgid "Please specify a name for the new branch"
+msgstr "Especifique um nome para o novo ramo"
+
+#: gitk:9496
+#, tcl-format
+msgid "Branch '%s' already exists. Overwrite?"
+msgstr "O ramo '%s' já existe. Substituí-lo?"
+
+#: gitk:9563
+#, tcl-format
+msgid "Commit %s is already included in branch %s -- really re-apply it?"
+msgstr "O commit %s já está incluído no ramo %s -- reaplicá-lo mesmo assim?"
+
+#: gitk:9568
+msgid "Cherry-picking"
+msgstr "A efetuar cherry-pick"
+
+#: gitk:9577
+#, tcl-format
+msgid ""
+"Cherry-pick failed because of local changes to file '%s'.\n"
+"Please commit, reset or stash your changes and try again."
+msgstr ""
+"Falha ao efetuar cherry-pick devido a alterações locais no ficheiro '%s'.\n"
+"Submeta, empilhe ou reponha as alterações e tente de novo."
+
+#: gitk:9583
+msgid ""
+"Cherry-pick failed because of merge conflict.\n"
+"Do you wish to run git citool to resolve it?"
+msgstr ""
+"Falha ao efetuar cherry-pick devido a conflito de integração.\n"
+"Deseja executar git citool para resolvê-lo?"
+
+#: gitk:9599 gitk:9657
+msgid "No changes committed"
+msgstr "Não foi submetida nenhum alteração"
+
+#: gitk:9626
+#, tcl-format
+msgid "Commit %s is not included in branch %s -- really revert it?"
+msgstr "O commit %s não está incluído no ramo %s -- revertê-lo mesmo assim?"
+
+#: gitk:9631
+msgid "Reverting"
+msgstr "A reverter"
+
+#: gitk:9639
+#, tcl-format
+msgid ""
+"Revert failed because of local changes to the following files:%s Please "
+"commit, reset or stash  your changes and try again."
+msgstr ""
+"Falha ao reverter devido a alterações locais nos seguintes ficheiros:%s "
+"Submeta, empilhe ou reponha as alterações e tente de novo."
+
+#: gitk:9643
+msgid ""
+"Revert failed because of merge conflict.\n"
+" Do you wish to run git citool to resolve it?"
+msgstr ""
+"Falha ao reverter devido a conflito de integração.\n"
+"Deseja executar git citool para resolvê-lo?"
+
+#: gitk:9686
+msgid "Confirm reset"
+msgstr "Confirmar reposição"
+
+#: gitk:9688
+#, tcl-format
+msgid "Reset branch %s to %s?"
+msgstr "Repor o ramo %s para %s?"
+
+#: gitk:9690
+msgid "Reset type:"
+msgstr "Tipo de reposição:"
+
+#: gitk:9693
+msgid "Soft: Leave working tree and index untouched"
+msgstr "Suave: Deixar a árvore de trabalho e o índice intactos"
+
+#: gitk:9696
+msgid "Mixed: Leave working tree untouched, reset index"
+msgstr "Misto: Deixar a árvore de trabalho intacta, repor índice"
+
+#: gitk:9699
+msgid ""
+"Hard: Reset working tree and index\n"
+"(discard ALL local changes)"
+msgstr ""
+"Forte: Repor árvore de trabalho e índice\n"
+"(descartar TODAS as alterações locais)"
+
+#: gitk:9716
+msgid "Resetting"
+msgstr "A repor"
+
+#: gitk:9776
+msgid "Checking out"
+msgstr "A extrair"
+
+#: gitk:9829
+msgid "Cannot delete the currently checked-out branch"
+msgstr "Não é possível eliminar o ramo atual extraído"
+
+#: gitk:9835
+#, tcl-format
+msgid ""
+"The commits on branch %s aren't on any other branch.\n"
+"Really delete branch %s?"
+msgstr ""
+"Os commits no ramo %s não estão presentes em mais nenhum ramo.\n"
+"Eliminar o ramo %s mesmo assim?"
+
+#: gitk:9866
+#, tcl-format
+msgid "Tags and heads: %s"
+msgstr "Tags e cabeças: %s"
+
+#: gitk:9883
+msgid "Filter"
+msgstr "Filtrar"
+
+#: gitk:10179
+msgid ""
+"Error reading commit topology information; branch and preceding/following "
+"tag information will be incomplete."
+msgstr ""
+"Erro ao ler informação de topologia do commit; a informação do ramo e da tag "
+"precedente/seguinte ficará incompleta."
+
+#: gitk:11156
+msgid "Tag"
+msgstr "Tag"
+
+#: gitk:11160
+msgid "Id"
+msgstr "Id"
+
+#: gitk:11243
+msgid "Gitk font chooser"
+msgstr "Escolha de tipo de letra do gitk"
+
+#: gitk:11260
+msgid "B"
+msgstr "B"
+
+#: gitk:11263
+msgid "I"
+msgstr "I"
+
+#: gitk:11381
+msgid "Commit list display options"
+msgstr "Opções de visualização da lista de commits"
+
+#: gitk:11384
+msgid "Maximum graph width (lines)"
+msgstr "Largura máxima do gráfico (linhas)"
+
+#: gitk:11388
+#, no-tcl-format
+msgid "Maximum graph width (% of pane)"
+msgstr "Largura máxima do gráfico (% do painel)"
+
+#: gitk:11391
+msgid "Show local changes"
+msgstr "Mostrar alterações locais"
+
+#: gitk:11394
+msgid "Auto-select SHA1 (length)"
+msgstr "Selecionar automaticamente SHA1 (largura)"
+
+#: gitk:11398
+msgid "Hide remote refs"
+msgstr "Ocultar referências remotas"
+
+#: gitk:11402
+msgid "Diff display options"
+msgstr "Opções de visualização de diferenças"
+
+#: gitk:11404
+msgid "Tab spacing"
+msgstr "Espaçamento da tabulação"
+
+#: gitk:11407
+msgid "Display nearby tags/heads"
+msgstr "Mostrar tags/cabeças próximas"
+
+#: gitk:11410
+msgid "Maximum # tags/heads to show"
+msgstr "Nº máximo de tags/cabeças a mostrar"
+
+#: gitk:11413
+msgid "Limit diffs to listed paths"
+msgstr "Limitar diferenças aos caminhos listados"
+
+#: gitk:11416
+msgid "Support per-file encodings"
+msgstr "Suportar codificação por cada ficheiro"
+
+#: gitk:11422 gitk:11569
+msgid "External diff tool"
+msgstr "Ferramenta diff externa"
+
+#: gitk:11423
+msgid "Choose..."
+msgstr "Escolher..."
+
+#: gitk:11428
+msgid "General options"
+msgstr "Opções gerais"
+
+#: gitk:11431
+msgid "Use themed widgets"
+msgstr "Usar widgets com estilo"
+
+#: gitk:11433
+msgid "(change requires restart)"
+msgstr "(alteração exige reiniciar)"
+
+#: gitk:11435
+msgid "(currently unavailable)"
+msgstr "(não disponível de momento)"
+
+#: gitk:11446
+msgid "Colors: press to choose"
+msgstr "Cores: pressione para escolher"
+
+#: gitk:11449
+msgid "Interface"
+msgstr "Interface"
+
+#: gitk:11450
+msgid "interface"
+msgstr "interface"
+
+#: gitk:11453
+msgid "Background"
+msgstr "Fundo"
+
+#: gitk:11454 gitk:11484
+msgid "background"
+msgstr "fundo"
+
+#: gitk:11457
+msgid "Foreground"
+msgstr "Primeiro plano"
+
+#: gitk:11458
+msgid "foreground"
+msgstr "primeiro plano"
+
+#: gitk:11461
+msgid "Diff: old lines"
+msgstr "Diff: linhas antigas"
+
+#: gitk:11462
+msgid "diff old lines"
+msgstr "diff linhas antigas"
+
+#: gitk:11466
+msgid "Diff: new lines"
+msgstr "Diff: linhas novas"
+
+#: gitk:11467
+msgid "diff new lines"
+msgstr "diff linhas novas"
+
+#: gitk:11471
+msgid "Diff: hunk header"
+msgstr "Diff: cabeçalho do excerto"
+
+#: gitk:11473
+msgid "diff hunk header"
+msgstr "diff cabeçalho do excerto"
+
+#: gitk:11477
+msgid "Marked line bg"
+msgstr "Fundo da linha marcada"
+
+#: gitk:11479
+msgid "marked line background"
+msgstr "fundo da linha marcada"
+
+#: gitk:11483
+msgid "Select bg"
+msgstr "Selecionar fundo"
+
+#: gitk:11492
+msgid "Fonts: press to choose"
+msgstr "Tipo de letra: pressione para escolher"
+
+#: gitk:11494
+msgid "Main font"
+msgstr "Tipo de letra principal"
+
+#: gitk:11495
+msgid "Diff display font"
+msgstr "Tipo de letra ao mostrar diferenças"
+
+#: gitk:11496
+msgid "User interface font"
+msgstr "Tipo de letra da interface de utilizador"
+
+#: gitk:11518
+msgid "Gitk preferences"
+msgstr "Preferências do gitk"
+
+#: gitk:11527
+msgid "General"
+msgstr "Geral"
+
+#: gitk:11528
+msgid "Colors"
+msgstr "Cores"
+
+#: gitk:11529
+msgid "Fonts"
+msgstr "Tipos de letra"
+
+#: gitk:11579
+#, tcl-format
+msgid "Gitk: choose color for %s"
+msgstr "Gitk: escolher cor de %s"
+
+#: gitk:12092
+msgid ""
+"Sorry, gitk cannot run with this version of Tcl/Tk.\n"
+" Gitk requires at least Tcl/Tk 8.4."
+msgstr ""
+"Não é possível executar o gitk com esta versão do Tcl/Tk.\n"
+"O gitk requer pelo menos Tcl/Tk 8.4."
+
+#: gitk:12302
+msgid "Cannot find a git repository here."
+msgstr "Não foi encontrado nenhum repositório git aqui."
+
+#: gitk:12349
+#, tcl-format
+msgid "Ambiguous argument '%s': both revision and filename"
+msgstr "Argumento '%s' ambíguo: pode ser uma revisão ou um ficheiro"
+
+#: gitk:12361
+msgid "Bad arguments to gitk:"
+msgstr "Argumentos do gitk incorretos:"
index 17ed026aa7da7c636457c302b2c28f7b866ae45a..9b08c263eadea7226a70d92d072f7a581da2bd20 100644 (file)
@@ -3,15 +3,15 @@
 # Translators:
 # 0xAX <kuleshovmail@gmail.com>, 2014
 # Alex Riesen <raa.lkml@gmail.com>, 2015
-# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015
+# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016
 # Dmitry Potapov <dpotapov@gmail.com>, 2009
 # Skip <bsvskip@rambler.ru>, 2011
 msgid ""
 msgstr ""
 "Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-05-17 14:32+1000\n"
-"PO-Revision-Date: 2015-10-12 10:14+0000\n"
+"POT-Creation-Date: 2016-12-15 00:18+0200\n"
+"PO-Revision-Date: 2016-12-14 22:23+0000\n"
 "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
@@ -24,11 +24,11 @@ msgstr ""
 msgid "Couldn't get list of unmerged files:"
 msgstr "Невозможно получить список файлов незавершённой операции слияния:"
 
-#: gitk:212 gitk:2381
+#: gitk:212 gitk:2403
 msgid "Color words"
 msgstr "Цветные слова"
 
-#: gitk:217 gitk:2381 gitk:8220 gitk:8253
+#: gitk:217 gitk:2403 gitk:8249 gitk:8282
 msgid "Markup words"
 msgstr "Помеченые слова"
 
@@ -58,1272 +58,1314 @@ msgstr "Ошибка запуска git log:"
 msgid "Reading"
 msgstr "Чтение"
 
-#: gitk:496 gitk:4525
+#: gitk:496 gitk:4549
 msgid "Reading commits..."
 msgstr "Чтение коммитов..."
 
-#: gitk:499 gitk:1637 gitk:4528
+#: gitk:499 gitk:1641 gitk:4552
 msgid "No commits selected"
 msgstr "Ничего не выбрано"
 
-#: gitk:1445 gitk:4045 gitk:12432
+#: gitk:1449 gitk:4069 gitk:12583
 msgid "Command line"
 msgstr "Командная строка"
 
-#: gitk:1511
+#: gitk:1515
 msgid "Can't parse git log output:"
 msgstr "Ошибка обработки вывода команды git log:"
 
-#: gitk:1740
+#: gitk:1744
 msgid "No commit information available"
 msgstr "Нет информации о коммите"
 
-#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521
+#: gitk:1907 gitk:1936 gitk:4339 gitk:9789 gitk:11388 gitk:11668
 msgid "OK"
 msgstr "Ok"
 
-#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671
-#: gitk:11242 gitk:11522
+#: gitk:1938 gitk:4341 gitk:9225 gitk:9304 gitk:9434 gitk:9520 gitk:9791
+#: gitk:11389 gitk:11669
 msgid "Cancel"
 msgstr "Отмена"
 
-#: gitk:2069
+#: gitk:2087
 msgid "&Update"
 msgstr "Обновить"
 
-#: gitk:2070
+#: gitk:2088
 msgid "&Reload"
 msgstr "Перечитать"
 
-#: gitk:2071
+#: gitk:2089
 msgid "Reread re&ferences"
 msgstr "Обновить список ссылок"
 
-#: gitk:2072
+#: gitk:2090
 msgid "&List references"
 msgstr "Список ссылок"
 
-#: gitk:2074
+#: gitk:2092
 msgid "Start git &gui"
 msgstr "Запустить git gui"
 
-#: gitk:2076
+#: gitk:2094
 msgid "&Quit"
 msgstr "Завершить"
 
-#: gitk:2068
+#: gitk:2086
 msgid "&File"
 msgstr "Файл"
 
-#: gitk:2080
+#: gitk:2098
 msgid "&Preferences"
 msgstr "Настройки"
 
-#: gitk:2079
+#: gitk:2097
 msgid "&Edit"
 msgstr "Редактировать"
 
-#: gitk:2084
+#: gitk:2102
 msgid "&New view..."
 msgstr "Новое представление..."
 
-#: gitk:2085
+#: gitk:2103
 msgid "&Edit view..."
 msgstr "Редактировать представление..."
 
-#: gitk:2086
+#: gitk:2104
 msgid "&Delete view"
 msgstr "Удалить представление"
 
-#: gitk:2088 gitk:4043
+#: gitk:2106
 msgid "&All files"
 msgstr "Все файлы"
 
-#: gitk:2083 gitk:4067
+#: gitk:2101
 msgid "&View"
 msgstr "Представление"
 
-#: gitk:2093 gitk:2103 gitk:3012
+#: gitk:2111 gitk:2121
 msgid "&About gitk"
 msgstr "О gitk"
 
-#: gitk:2094 gitk:2108
+#: gitk:2112 gitk:2126
 msgid "&Key bindings"
 msgstr "Назначения клавиатуры"
 
-#: gitk:2092 gitk:2107
+#: gitk:2110 gitk:2125
 msgid "&Help"
 msgstr "Подсказка"
 
-#: gitk:2185 gitk:8652
+#: gitk:2203 gitk:8681
 msgid "SHA1 ID:"
 msgstr "SHA1 ID:"
 
-#: gitk:2229
+#: gitk:2247
 msgid "Row"
 msgstr "Строка"
 
-#: gitk:2267
+#: gitk:2285
 msgid "Find"
 msgstr "Поиск"
 
-#: gitk:2295
+#: gitk:2313
 msgid "commit"
 msgstr "коммит"
 
-#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827
-#: gitk:6912
+#: gitk:2317 gitk:2319 gitk:4711 gitk:4734 gitk:4758 gitk:6779 gitk:6851
+#: gitk:6936
 msgid "containing:"
 msgstr "содержащее:"
 
-#: gitk:2302 gitk:3526 gitk:3531 gitk:4763
+#: gitk:2320 gitk:3550 gitk:3555 gitk:4787
 msgid "touching paths:"
 msgstr "касательно файлов:"
 
-#: gitk:2303 gitk:4777
+#: gitk:2321 gitk:4801
 msgid "adding/removing string:"
 msgstr "добавив/удалив строку:"
 
-#: gitk:2304 gitk:4779
+#: gitk:2322 gitk:4803
 msgid "changing lines matching:"
 msgstr "изменяя совпадающие строки:"
 
-#: gitk:2313 gitk:2315 gitk:4766
+#: gitk:2331 gitk:2333 gitk:4790
 msgid "Exact"
 msgstr "Точно"
 
-#: gitk:2315 gitk:4854 gitk:6723
+#: gitk:2333 gitk:4878 gitk:6747
 msgid "IgnCase"
 msgstr "Игнорировать большие/маленькие"
 
-#: gitk:2315 gitk:4736 gitk:4852 gitk:6719
+#: gitk:2333 gitk:4760 gitk:4876 gitk:6743
 msgid "Regexp"
 msgstr "Регулярные выражения"
 
-#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916
+#: gitk:2335 gitk:2336 gitk:4898 gitk:4928 gitk:4935 gitk:6872 gitk:6940
 msgid "All fields"
 msgstr "Во всех полях"
 
-#: gitk:2318 gitk:4871 gitk:4904 gitk:6786
+#: gitk:2336 gitk:4895 gitk:4928 gitk:6810
 msgid "Headline"
 msgstr "Заголовок"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389
+#: gitk:2337 gitk:4895 gitk:6810 gitk:6940 gitk:7413
 msgid "Comments"
 msgstr "Комментарии"
 
-#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830
-#: gitk:8845
+#: gitk:2337 gitk:4895 gitk:4900 gitk:4935 gitk:6810 gitk:7348 gitk:8859
+#: gitk:8874
 msgid "Author"
 msgstr "Автор"
 
-#: gitk:2319 gitk:4871 gitk:6786 gitk:7326
+#: gitk:2337 gitk:4895 gitk:6810 gitk:7350
 msgid "Committer"
 msgstr "Коммитер"
 
-#: gitk:2350
+#: gitk:2371
 msgid "Search"
 msgstr "Найти"
 
-#: gitk:2358
+#: gitk:2379
 msgid "Diff"
 msgstr "Сравнить"
 
-#: gitk:2360
+#: gitk:2381
 msgid "Old version"
 msgstr "Старая версия"
 
-#: gitk:2362
+#: gitk:2383
 msgid "New version"
 msgstr "Новая версия"
 
-#: gitk:2364
+#: gitk:2386
 msgid "Lines of context"
 msgstr "Строк контекста"
 
-#: gitk:2374
+#: gitk:2396
 msgid "Ignore space change"
 msgstr "Игнорировать пробелы"
 
-#: gitk:2378 gitk:2380 gitk:7959 gitk:8206
+#: gitk:2400 gitk:2402 gitk:7983 gitk:8235
 msgid "Line diff"
 msgstr "Изменения строк"
 
-#: gitk:2445
+#: gitk:2467
 msgid "Patch"
 msgstr "Патч"
 
-#: gitk:2447
+#: gitk:2469
 msgid "Tree"
 msgstr "Файлы"
 
-#: gitk:2617 gitk:2637
+#: gitk:2639 gitk:2660
 msgid "Diff this -> selected"
 msgstr "Сравнить этот коммит с выделенным"
 
-#: gitk:2618 gitk:2638
+#: gitk:2640 gitk:2661
 msgid "Diff selected -> this"
 msgstr "Сравнить выделенный с этим коммитом"
 
-#: gitk:2619 gitk:2639
+#: gitk:2641 gitk:2662
 msgid "Make patch"
 msgstr "Создать патч"
 
-#: gitk:2620 gitk:9254
+#: gitk:2642 gitk:9283
 msgid "Create tag"
 msgstr "Создать метку"
 
-#: gitk:2621 gitk:9371
+#: gitk:2643
+msgid "Copy commit summary"
+msgstr "Копировать информацию о коммите"
+
+#: gitk:2644 gitk:9414
 msgid "Write commit to file"
 msgstr "Сохранить коммит в файл"
 
-#: gitk:2622 gitk:9428
+#: gitk:2645
 msgid "Create new branch"
 msgstr "Создать ветку"
 
-#: gitk:2623
+#: gitk:2646
 msgid "Cherry-pick this commit"
-msgstr "Ð\9eÑ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его Ð´Ð»Ñ\8f Ñ\8dÑ\82ого ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
+msgstr "Ð\9aопиÑ\80оваÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð² Ñ\82екÑ\83Ñ\89Ñ\83Ñ\8e Ð²ÐµÑ\82кÑ\83"
 
-#: gitk:2624
+#: gitk:2647
 msgid "Reset HEAD branch to here"
 msgstr "Установить HEAD на этот коммит"
 
-#: gitk:2625
+#: gitk:2648
 msgid "Mark this commit"
 msgstr "Пометить этот коммит"
 
-#: gitk:2626
+#: gitk:2649
 msgid "Return to mark"
 msgstr "Вернуться на пометку"
 
-#: gitk:2627
+#: gitk:2650
 msgid "Find descendant of this and mark"
 msgstr "Найти и пометить потомка этого коммита"
 
-#: gitk:2628
+#: gitk:2651
 msgid "Compare with marked commit"
 msgstr "Сравнить с помеченным коммитом"
 
-#: gitk:2629 gitk:2640
+#: gitk:2652 gitk:2663
 msgid "Diff this -> marked commit"
 msgstr "Сравнить выделенное с помеченным коммитом"
 
-#: gitk:2630 gitk:2641
+#: gitk:2653 gitk:2664
 msgid "Diff marked commit -> this"
 msgstr "Сравнить помеченный с этим коммитом"
 
-#: gitk:2631
+#: gitk:2654
 msgid "Revert this commit"
-msgstr "Ð\92озвÑ\80аÑ\82 этого коммита"
+msgstr "Ð\9eбÑ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f этого коммита"
 
-#: gitk:2647
+#: gitk:2670
 msgid "Check out this branch"
 msgstr "Перейти на эту ветку"
 
-#: gitk:2648
+#: gitk:2671
+msgid "Rename this branch"
+msgstr "Переименовать эту ветку"
+
+#: gitk:2672
 msgid "Remove this branch"
 msgstr "Удалить эту ветку"
 
-#: gitk:2649
+#: gitk:2673
 msgid "Copy branch name"
 msgstr "Копировать имя ветки"
 
-#: gitk:2656
+#: gitk:2680
 msgid "Highlight this too"
 msgstr "Подсветить этот тоже"
 
-#: gitk:2657
+#: gitk:2681
 msgid "Highlight this only"
 msgstr "Подсветить только этот"
 
-#: gitk:2658
+#: gitk:2682
 msgid "External diff"
 msgstr "Программа сравнения"
 
-#: gitk:2659
+#: gitk:2683
 msgid "Blame parent commit"
 msgstr "Авторы изменений родительского коммита"
 
-#: gitk:2660
+#: gitk:2684
 msgid "Copy path"
 msgstr "Копировать путь"
 
-#: gitk:2667
+#: gitk:2691
 msgid "Show origin of this line"
 msgstr "Показать источник этой строки"
 
-#: gitk:2668
+#: gitk:2692
 msgid "Run git gui blame on this line"
 msgstr "Запустить git gui blame для этой строки"
 
-#: gitk:3014
+#: gitk:3036
+msgid "About gitk"
+msgstr "О gitk"
+
+#: gitk:3038
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright  2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
-msgstr "\nGitk - программа просмотра истории репозиториев git\n\n©  2005-2014 Paul Mackerras\n\nИспользование и распространение согласно условиям GNU General Public License"
+msgstr "\nGitk — программа просмотра истории репозиториев git\n\n© 2005-2016 Paul Mackerras\n\nИспользование и распространение согласно условиям GNU General Public License"
 
-#: gitk:3022 gitk:3089 gitk:9857
+#: gitk:3046 gitk:3113 gitk:10004
 msgid "Close"
 msgstr "Закрыть"
 
-#: gitk:3043
+#: gitk:3067
 msgid "Gitk key bindings"
 msgstr "Назначения клавиатуры в Gitk"
 
-#: gitk:3046
+#: gitk:3070
 msgid "Gitk key bindings:"
 msgstr "Назначения клавиатуры в Gitk:"
 
-#: gitk:3048
+#: gitk:3072
 #, tcl-format
 msgid "<%s-Q>\t\tQuit"
 msgstr "<%s-Q>\t\tЗавершить"
 
-#: gitk:3049
+#: gitk:3073
 #, tcl-format
 msgid "<%s-W>\t\tClose window"
 msgstr "<%s-W>\t\tЗакрыть окно"
 
-#: gitk:3050
+#: gitk:3074
 msgid "<Home>\t\tMove to first commit"
 msgstr "<Home>\t\tПерейти к первому коммиту"
 
-#: gitk:3051
+#: gitk:3075
 msgid "<End>\t\tMove to last commit"
 msgstr "<End>\t\tПерейти к последнему коммиту"
 
-#: gitk:3052
+#: gitk:3076
 msgid "<Up>, p, k\tMove up one commit"
 msgstr "<Up>, p, k\tПерейти на один коммит вверх"
 
-#: gitk:3053
+#: gitk:3077
 msgid "<Down>, n, j\tMove down one commit"
 msgstr "<Down>, n, j\tПерейти на один коммит вниз"
 
-#: gitk:3054
+#: gitk:3078
 msgid "<Left>, z, h\tGo back in history list"
 msgstr "<Left>, z, h\tПоказать ранее посещённое состояние"
 
-#: gitk:3055
+#: gitk:3079
 msgid "<Right>, x, l\tGo forward in history list"
 msgstr "<Right>, x, l\tПоказать следующий посещённый коммит"
 
-#: gitk:3056
+#: gitk:3080
 #, tcl-format
 msgid "<%s-n>\tGo to n-th parent of current commit in history list"
 msgstr "<%s-n>\tПерейти на n родителя от текущего коммита"
 
-#: gitk:3057
+#: gitk:3081
 msgid "<PageUp>\tMove up one page in commit list"
 msgstr "<PageUp>\tПерейти на страницу выше в списке коммитов"
 
-#: gitk:3058
+#: gitk:3082
 msgid "<PageDown>\tMove down one page in commit list"
 msgstr "<PageDown>\tПерейти на страницу ниже в списке коммитов"
 
-#: gitk:3059
+#: gitk:3083
 #, tcl-format
 msgid "<%s-Home>\tScroll to top of commit list"
 msgstr "<%s-Home>\tПерейти на начало списка коммитов"
 
-#: gitk:3060
+#: gitk:3084
 #, tcl-format
 msgid "<%s-End>\tScroll to bottom of commit list"
 msgstr "<%s-End>\tПерейти на конец списка коммитов"
 
-#: gitk:3061
+#: gitk:3085
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
 msgstr "<%s-Up>\tПровернуть список коммитов вверх"
 
-#: gitk:3062
+#: gitk:3086
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
 msgstr "<%s-Down>\tПровернуть список коммитов вниз"
 
-#: gitk:3063
+#: gitk:3087
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
 msgstr "<%s-PageUp>\tПровернуть список коммитов на страницу вверх"
 
-#: gitk:3064
+#: gitk:3088
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
 msgstr "<%s-PageDown>\tПровернуть список коммитов на страницу вниз"
 
-#: gitk:3065
+#: gitk:3089
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
 msgstr "<Shift-Up>\tПоиск в обратном порядке (вверх, среди новых коммитов)"
 
-#: gitk:3066
+#: gitk:3090
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
 msgstr "<Shift-Down>\tПоиск (вниз, среди старых коммитов)"
 
-#: gitk:3067
+#: gitk:3091
 msgid "<Delete>, b\tScroll diff view up one page"
 msgstr "<Delete>, b\tПрокрутить список изменений на страницу выше"
 
-#: gitk:3068
+#: gitk:3092
 msgid "<Backspace>\tScroll diff view up one page"
 msgstr "<Backspace>\tПрокрутить список изменений на страницу выше"
 
-#: gitk:3069
+#: gitk:3093
 msgid "<Space>\t\tScroll diff view down one page"
 msgstr "<Leertaste>\t\tПрокрутить список изменений на страницу ниже"
 
-#: gitk:3070
+#: gitk:3094
 msgid "u\t\tScroll diff view up 18 lines"
 msgstr "u\t\tПрокрутить список изменений на 18 строк вверх"
 
-#: gitk:3071
+#: gitk:3095
 msgid "d\t\tScroll diff view down 18 lines"
 msgstr "d\t\tПрокрутить список изменений на 18 строк вниз"
 
-#: gitk:3072
+#: gitk:3096
 #, tcl-format
 msgid "<%s-F>\t\tFind"
 msgstr "<%s-F>\t\tПоиск"
 
-#: gitk:3073
+#: gitk:3097
 #, tcl-format
 msgid "<%s-G>\t\tMove to next find hit"
 msgstr "<%s-G>\t\tПерейти к следующему найденному коммиту"
 
-#: gitk:3074
+#: gitk:3098
 msgid "<Return>\tMove to next find hit"
 msgstr "<Return>\tПерейти к следующему найденному коммиту"
 
-#: gitk:3075
+#: gitk:3099
 msgid "g\t\tGo to commit"
 msgstr "g\t\tПерейти на коммит"
 
-#: gitk:3076
+#: gitk:3100
 msgid "/\t\tFocus the search box"
 msgstr "/\t\tПерейти к полю поиска"
 
-#: gitk:3077
+#: gitk:3101
 msgid "?\t\tMove to previous find hit"
 msgstr "?\t\tПерейти к предыдущему найденному коммиту"
 
-#: gitk:3078
+#: gitk:3102
 msgid "f\t\tScroll diff view to next file"
 msgstr "f\t\tПрокрутить список изменений к следующему файлу"
 
-#: gitk:3079
+#: gitk:3103
 #, tcl-format
 msgid "<%s-S>\t\tSearch for next hit in diff view"
 msgstr "<%s-S>\t\tПродолжить поиск в списке изменений"
 
-#: gitk:3080
+#: gitk:3104
 #, tcl-format
 msgid "<%s-R>\t\tSearch for previous hit in diff view"
 msgstr "<%s-R>\t\tПерейти к предыдущему найденному тексту в списке изменений"
 
-#: gitk:3081
+#: gitk:3105
 #, tcl-format
 msgid "<%s-KP+>\tIncrease font size"
 msgstr "<%s-KP+>\tУвеличить размер шрифта"
 
-#: gitk:3082
+#: gitk:3106
 #, tcl-format
 msgid "<%s-plus>\tIncrease font size"
 msgstr "<%s-plus>\tУвеличить размер шрифта"
 
-#: gitk:3083
+#: gitk:3107
 #, tcl-format
 msgid "<%s-KP->\tDecrease font size"
 msgstr "<%s-KP->\tУменьшить размер шрифта"
 
-#: gitk:3084
+#: gitk:3108
 #, tcl-format
 msgid "<%s-minus>\tDecrease font size"
 msgstr "<%s-minus>\tУменьшить размер шрифта"
 
-#: gitk:3085
+#: gitk:3109
 msgid "<F5>\t\tUpdate"
 msgstr "<F5>\t\tОбновить"
 
-#: gitk:3550 gitk:3559
+#: gitk:3574 gitk:3583
 #, tcl-format
 msgid "Error creating temporary directory %s:"
 msgstr "Ошибка создания временного каталога %s:"
 
-#: gitk:3572
+#: gitk:3596
 #, tcl-format
 msgid "Error getting \"%s\" from %s:"
 msgstr "Ошибка получения «%s» из %s:"
 
-#: gitk:3635
+#: gitk:3659
 msgid "command failed:"
 msgstr "ошибка выполнения команды:"
 
-#: gitk:3784
+#: gitk:3808
 msgid "No such commit"
 msgstr "Коммит не найден"
 
-#: gitk:3798
+#: gitk:3822
 msgid "git gui blame: command failed:"
 msgstr "git gui blame: ошибка выполнения команды:"
 
-#: gitk:3829
+#: gitk:3853
 #, tcl-format
 msgid "Couldn't read merge head: %s"
 msgstr "Ошибка чтения MERGE_HEAD: %s"
 
-#: gitk:3837
+#: gitk:3861
 #, tcl-format
 msgid "Error reading index: %s"
 msgstr "Ошибка чтения индекса: %s"
 
-#: gitk:3862
+#: gitk:3886
 #, tcl-format
 msgid "Couldn't start git blame: %s"
 msgstr "Ошибка запуска git blame: %s"
 
-#: gitk:3865 gitk:6754
+#: gitk:3889 gitk:6778
 msgid "Searching"
 msgstr "Поиск"
 
-#: gitk:3897
+#: gitk:3921
 #, tcl-format
 msgid "Error running git blame: %s"
 msgstr "Ошибка выполнения git blame: %s"
 
-#: gitk:3925
+#: gitk:3949
 #, tcl-format
 msgid "That line comes from commit %s,  which is not in this view"
 msgstr "Эта строка принадлежит коммиту %s, который не показан в этом представлении"
 
-#: gitk:3939
+#: gitk:3963
 msgid "External diff viewer failed:"
 msgstr "Ошибка выполнения программы сравнения:"
 
-#: gitk:4070
+#: gitk:4067
+msgid "All files"
+msgstr "Все файлы"
+
+#: gitk:4091
+msgid "View"
+msgstr "Представление"
+
+#: gitk:4094
 msgid "Gitk view definition"
 msgstr "Gitk определение представлений"
 
-#: gitk:4074
+#: gitk:4098
 msgid "Remember this view"
 msgstr "Запомнить представление"
 
-#: gitk:4075
+#: gitk:4099
 msgid "References (space separated list):"
 msgstr "Ссылки (разделённые пробелом):"
 
-#: gitk:4076
+#: gitk:4100
 msgid "Branches & tags:"
 msgstr "Ветки и метки"
 
-#: gitk:4077
+#: gitk:4101
 msgid "All refs"
 msgstr "Все ссылки"
 
-#: gitk:4078
+#: gitk:4102
 msgid "All (local) branches"
 msgstr "Все (локальные) ветки"
 
-#: gitk:4079
+#: gitk:4103
 msgid "All tags"
 msgstr "Все метки"
 
-#: gitk:4080
+#: gitk:4104
 msgid "All remote-tracking branches"
 msgstr "Все внешние отслеживаемые ветки"
 
-#: gitk:4081
+#: gitk:4105
 msgid "Commit Info (regular expressions):"
 msgstr "Информация о коммите (регулярные выражения):"
 
-#: gitk:4082
+#: gitk:4106
 msgid "Author:"
 msgstr "Автор:"
 
-#: gitk:4083
+#: gitk:4107
 msgid "Committer:"
 msgstr "Коммитер:"
 
-#: gitk:4084
+#: gitk:4108
 msgid "Commit Message:"
 msgstr "Сообщение коммита:"
 
-#: gitk:4085
+#: gitk:4109
 msgid "Matches all Commit Info criteria"
 msgstr "Совпадает со всеми условиями информации о коммите"
 
-#: gitk:4086
+#: gitk:4110
 msgid "Matches no Commit Info criteria"
 msgstr "Не совпадает с условиями информации о коммите"
 
-#: gitk:4087
+#: gitk:4111
 msgid "Changes to Files:"
 msgstr "Изменения файлов:"
 
-#: gitk:4088
+#: gitk:4112
 msgid "Fixed String"
 msgstr "Обычная строка"
 
-#: gitk:4089
+#: gitk:4113
 msgid "Regular Expression"
 msgstr "Регулярное выражение:"
 
-#: gitk:4090
+#: gitk:4114
 msgid "Search string:"
 msgstr "Строка для поиска:"
 
-#: gitk:4091
+#: gitk:4115
 msgid ""
 "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
 msgstr "Даты коммита («2 недели назад», «2009-03-17 15:27:38», «17 марта 2009 15:27:38»):"
 
-#: gitk:4092
+#: gitk:4116
 msgid "Since:"
 msgstr "С даты:"
 
-#: gitk:4093
+#: gitk:4117
 msgid "Until:"
 msgstr "По дату:"
 
-#: gitk:4094
+#: gitk:4118
 msgid "Limit and/or skip a number of revisions (positive integer):"
 msgstr "Ограничить и/или пропустить количество редакций (положительное число):"
 
-#: gitk:4095
+#: gitk:4119
 msgid "Number to show:"
 msgstr "Показать количество:"
 
-#: gitk:4096
+#: gitk:4120
 msgid "Number to skip:"
 msgstr "Пропустить количество:"
 
-#: gitk:4097
+#: gitk:4121
 msgid "Miscellaneous options:"
 msgstr "Различные опции:"
 
-#: gitk:4098
+#: gitk:4122
 msgid "Strictly sort by date"
 msgstr "Строгая сортировка по дате"
 
-#: gitk:4099
+#: gitk:4123
 msgid "Mark branch sides"
 msgstr "Отметить стороны веток"
 
-#: gitk:4100
+#: gitk:4124
 msgid "Limit to first parent"
 msgstr "Ограничить первым предком"
 
-#: gitk:4101
+#: gitk:4125
 msgid "Simple history"
 msgstr "Упрощенная история"
 
-#: gitk:4102
+#: gitk:4126
 msgid "Additional arguments to git log:"
 msgstr "Дополнительные аргументы для git log:"
 
-#: gitk:4103
+#: gitk:4127
 msgid "Enter files and directories to include, one per line:"
 msgstr "Файлы и каталоги для ограничения истории, по одному на строку:"
 
-#: gitk:4104
+#: gitk:4128
 msgid "Command to generate more commits to include:"
 msgstr "Дополнительная команда для списка коммитов:"
 
-#: gitk:4228
+#: gitk:4252
 msgid "Gitk: edit view"
 msgstr "Gitk: изменить представление"
 
-#: gitk:4236
+#: gitk:4260
 msgid "-- criteria for selecting revisions"
 msgstr "— критерий поиска редакций"
 
-#: gitk:4241
+#: gitk:4265
 msgid "View Name"
 msgstr "Имя представления"
 
-#: gitk:4316
+#: gitk:4340
 msgid "Apply (F5)"
 msgstr "Применить (F5)"
 
-#: gitk:4354
+#: gitk:4378
 msgid "Error in commit selection arguments:"
 msgstr "Ошибка в параметрах выбора коммитов:"
 
-#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374
+#: gitk:4433 gitk:4486 gitk:4948 gitk:4962 gitk:6232 gitk:12524 gitk:12525
 msgid "None"
 msgstr "Ни одного"
 
-#: gitk:5021 gitk:5026
+#: gitk:5045 gitk:5050
 msgid "Descendant"
 msgstr "Порождённое"
 
-#: gitk:5022
+#: gitk:5046
 msgid "Not descendant"
 msgstr "Не порождённое"
 
-#: gitk:5029 gitk:5034
+#: gitk:5053 gitk:5058
 msgid "Ancestor"
 msgstr "Предок"
 
-#: gitk:5030
+#: gitk:5054
 msgid "Not ancestor"
 msgstr "Не предок"
 
-#: gitk:5324
+#: gitk:5348
 msgid "Local changes checked in to index but not committed"
 msgstr "Проиндексированные изменения"
 
-#: gitk:5360
+#: gitk:5384
 msgid "Local uncommitted changes, not checked in to index"
 msgstr "Непроиндексированные изменения"
 
-#: gitk:7134
+#: gitk:7158
 msgid "and many more"
 msgstr "и многое другое"
 
-#: gitk:7137
+#: gitk:7161
 msgid "many"
 msgstr "много"
 
-#: gitk:7328
+#: gitk:7352
 msgid "Tags:"
 msgstr "Метки:"
 
-#: gitk:7345 gitk:7351 gitk:8825
+#: gitk:7369 gitk:7375 gitk:8854
 msgid "Parent"
 msgstr "Предок"
 
-#: gitk:7356
+#: gitk:7380
 msgid "Child"
 msgstr "Потомок"
 
-#: gitk:7365
+#: gitk:7389
 msgid "Branch"
 msgstr "Ветка"
 
-#: gitk:7368
+#: gitk:7392
 msgid "Follows"
 msgstr "Следует за"
 
-#: gitk:7371
+#: gitk:7395
 msgid "Precedes"
 msgstr "Предшествует"
 
-#: gitk:7966
+#: gitk:7990
 #, tcl-format
 msgid "Error getting diffs: %s"
 msgstr "Ошибка получения изменений: %s"
 
-#: gitk:8650
+#: gitk:8679
 msgid "Goto:"
 msgstr "Перейти к:"
 
-#: gitk:8671
+#: gitk:8700
 #, tcl-format
 msgid "Short SHA1 id %s is ambiguous"
 msgstr "Сокращённый SHA1 идентификатор %s неоднозначен"
 
-#: gitk:8678
+#: gitk:8707
 #, tcl-format
 msgid "Revision %s is not known"
 msgstr "Редакция %s не найдена"
 
-#: gitk:8688
+#: gitk:8717
 #, tcl-format
 msgid "SHA1 id %s is not known"
 msgstr "SHA1 идентификатор %s не найден"
 
-#: gitk:8690
+#: gitk:8719
 #, tcl-format
 msgid "Revision %s is not in the current view"
 msgstr "Редакция %s не найдена в текущем представлении"
 
-#: gitk:8832 gitk:8847
+#: gitk:8861 gitk:8876
 msgid "Date"
 msgstr "Дата"
 
-#: gitk:8835
+#: gitk:8864
 msgid "Children"
 msgstr "Потомки"
 
-#: gitk:8898
+#: gitk:8927
 #, tcl-format
 msgid "Reset %s branch to here"
 msgstr "Сбросить ветку %s на этот коммит"
 
-#: gitk:8900
+#: gitk:8929
 msgid "Detached head: can't reset"
 msgstr "Коммит не принадлежит ни одной ветке, сбросить невозможно"
 
-#: gitk:9005 gitk:9011
+#: gitk:9034 gitk:9040
 msgid "Skipping merge commit "
 msgstr "Пропускаю коммит-слияние"
 
-#: gitk:9020 gitk:9025
+#: gitk:9049 gitk:9054
 msgid "Error getting patch ID for "
 msgstr "Не удалось получить идентификатор патча для "
 
-#: gitk:9021 gitk:9026
+#: gitk:9050 gitk:9055
 msgid " - stopping\n"
 msgstr " — останов\n"
 
-#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065
+#: gitk:9060 gitk:9063 gitk:9071 gitk:9085 gitk:9094
 msgid "Commit "
 msgstr "Коммит"
 
-#: gitk:9035
+#: gitk:9064
 msgid ""
 " is the same patch as\n"
 "       "
 msgstr " такой же патч, как и\n       "
 
-#: gitk:9043
+#: gitk:9072
 msgid ""
 " differs from\n"
 "       "
 msgstr " отличается от\n       "
 
-#: gitk:9045
+#: gitk:9074
 msgid ""
 "Diff of commits:\n"
 "\n"
 msgstr "Различия коммитов:\n\n"
 
-#: gitk:9057 gitk:9066
+#: gitk:9086 gitk:9095
 #, tcl-format
 msgid " has %s children - stopping\n"
 msgstr " является %s потомком — останов\n"
 
-#: gitk:9085
+#: gitk:9114
 #, tcl-format
 msgid "Error writing commit to file: %s"
 msgstr "Произошла ошибка при записи коммита в файл: %s"
 
-#: gitk:9091
+#: gitk:9120
 #, tcl-format
 msgid "Error diffing commits: %s"
 msgstr "Произошла ошибка при выводе различий коммитов: %s"
 
-#: gitk:9137
+#: gitk:9166
 msgid "Top"
 msgstr "Верх"
 
-#: gitk:9138
+#: gitk:9167
 msgid "From"
 msgstr "От"
 
-#: gitk:9143
+#: gitk:9172
 msgid "To"
 msgstr "До"
 
-#: gitk:9167
+#: gitk:9196
 msgid "Generate patch"
 msgstr "Создать патч"
 
-#: gitk:9169
+#: gitk:9198
 msgid "From:"
 msgstr "От:"
 
-#: gitk:9178
+#: gitk:9207
 msgid "To:"
 msgstr "До:"
 
-#: gitk:9187
+#: gitk:9216
 msgid "Reverse"
 msgstr "В обратном порядке"
 
-#: gitk:9189 gitk:9385
+#: gitk:9218 gitk:9428
 msgid "Output file:"
 msgstr "Файл для сохранения:"
 
-#: gitk:9195
+#: gitk:9224
 msgid "Generate"
 msgstr "Создать"
 
-#: gitk:9233
+#: gitk:9262
 msgid "Error creating patch:"
 msgstr "Ошибка создания патча:"
 
-#: gitk:9256 gitk:9373 gitk:9430
+#: gitk:9285 gitk:9416 gitk:9504
 msgid "ID:"
 msgstr "ID:"
 
-#: gitk:9265
+#: gitk:9294
 msgid "Tag name:"
 msgstr "Имя метки:"
 
-#: gitk:9268
+#: gitk:9297
 msgid "Tag message is optional"
 msgstr "Описание метки указывать не обязательно"
 
-#: gitk:9270
+#: gitk:9299
 msgid "Tag message:"
 msgstr "Описание метки:"
 
-#: gitk:9274 gitk:9439
+#: gitk:9303 gitk:9474
 msgid "Create"
 msgstr "Создать"
 
-#: gitk:9292
+#: gitk:9321
 msgid "No tag name specified"
 msgstr "Не задано имя метки"
 
-#: gitk:9296
+#: gitk:9325
 #, tcl-format
 msgid "Tag \"%s\" already exists"
 msgstr "Метка «%s» уже существует"
 
-#: gitk:9306
+#: gitk:9335
 msgid "Error creating tag:"
 msgstr "Ошибка создания метки:"
 
-#: gitk:9382
+#: gitk:9425
 msgid "Command:"
 msgstr "Команда:"
 
-#: gitk:9390
+#: gitk:9433
 msgid "Write"
 msgstr "Запись"
 
-#: gitk:9408
+#: gitk:9451
 msgid "Error writing commit:"
 msgstr "Произошла ошибка при записи коммита:"
 
-#: gitk:9435
+#: gitk:9473
+msgid "Create branch"
+msgstr "Создать ветку"
+
+#: gitk:9489
+#, tcl-format
+msgid "Rename branch %s"
+msgstr "Переименовать ветку %s"
+
+#: gitk:9490
+msgid "Rename"
+msgstr "Переименовать"
+
+#: gitk:9514
 msgid "Name:"
 msgstr "Имя:"
 
-#: gitk:9458
+#: gitk:9538
 msgid "Please specify a name for the new branch"
 msgstr "Укажите имя для новой ветки"
 
-#: gitk:9463
+#: gitk:9543
 #, tcl-format
 msgid "Branch '%s' already exists. Overwrite?"
 msgstr "Ветка «%s» уже существует. Переписать?"
 
-#: gitk:9530
+#: gitk:9587
+msgid "Please specify a new name for the branch"
+msgstr "Укажите имя для новой ветки"
+
+#: gitk:9650
 #, tcl-format
 msgid "Commit %s is already included in branch %s -- really re-apply it?"
 msgstr "Коммит %s уже включён в ветку %s. Продолжить операцию?"
 
-#: gitk:9535
+#: gitk:9655
 msgid "Cherry-picking"
-msgstr "Ð\9aопиÑ\80ование Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+msgstr "Ð\9aопиÑ\80ование ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
-#: gitk:9544
+#: gitk:9664
 #, tcl-format
 msgid ""
 "Cherry-pick failed because of local changes to file '%s'.\n"
 "Please commit, reset or stash your changes and try again."
-msgstr "Ð\9eÑ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½ Ð¸Ð·-за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\84айле Â«%s».\nÐ\97акомитьте, сбросьте или спрячьте изменения и повторите операцию."
+msgstr "Ð\9aопиÑ\80ование ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ Ð¸Ð·-за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\84айле Â«%s».\nÐ\97акоммитьте, сбросьте или спрячьте изменения и повторите операцию."
 
-#: gitk:9550
+#: gitk:9670
 msgid ""
 "Cherry-pick failed because of merge conflict.\n"
 "Do you wish to run git citool to resolve it?"
 msgstr "Копирование изменений невозможно из-за незавершённой операции слияния.\nЗапустить git citool для завершения этой операции?"
 
-#: gitk:9566 gitk:9624
+#: gitk:9686 gitk:9744
 msgid "No changes committed"
 msgstr "Изменения не закоммичены"
 
-#: gitk:9593
+#: gitk:9713
 #, tcl-format
 msgid "Commit %s is not included in branch %s -- really revert it?"
 msgstr "Коммит %s не включён в ветку %s. Продолжить операцию?"
 
-#: gitk:9598
+#: gitk:9718
 msgid "Reverting"
-msgstr "Ð\92озвÑ\80аÑ\82 изменений"
+msgstr "Ð\9eбÑ\80аÑ\89ение изменений"
 
-#: gitk:9606
+#: gitk:9726
 #, tcl-format
 msgid ""
 "Revert failed because of local changes to the following files:%s Please "
 "commit, reset or stash  your changes and try again."
-msgstr "Возврат изменений коммита не удался из-за локальных изменений в указанных файлах: %s\nЗакомитьте, сбросьте или спрячьте изменения и повторите операцию."
+msgstr "Ð\92озвÑ\80аÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð½Ðµ Ñ\83далÑ\81Ñ\8f Ð¸Ð·-за Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\83казаннÑ\8bÑ\85 Ñ\84айлаÑ\85: %s\nÐ\97акоммиÑ\82Ñ\8cÑ\82е, Ñ\81бÑ\80оÑ\81Ñ\8cÑ\82е Ð¸Ð»Ð¸ Ñ\81пÑ\80Ñ\8fÑ\87Ñ\8cÑ\82е Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸ Ð¿Ð¾Ð²Ñ\82оÑ\80иÑ\82е Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8e."
 
-#: gitk:9610
+#: gitk:9730
 msgid ""
 "Revert failed because of merge conflict.\n"
 " Do you wish to run git citool to resolve it?"
 msgstr "Возврат изменений невозможен из-за незавершённой операции слияния.\nЗапустить git citool для завершения этой операции?"
 
-#: gitk:9653
+#: gitk:9773
 msgid "Confirm reset"
 msgstr "Подтвердите операцию перехода"
 
-#: gitk:9655
+#: gitk:9775
 #, tcl-format
 msgid "Reset branch %s to %s?"
 msgstr "Сбросить ветку %s на коммит %s?"
 
-#: gitk:9657
+#: gitk:9777
 msgid "Reset type:"
 msgstr "Тип операции перехода:"
 
-#: gitk:9660
+#: gitk:9780
 msgid "Soft: Leave working tree and index untouched"
 msgstr "Лёгкий: оставить рабочий каталог и индекс неизменными"
 
-#: gitk:9663
+#: gitk:9783
 msgid "Mixed: Leave working tree untouched, reset index"
 msgstr "Смешанный: оставить рабочий каталог неизменным, установить индекс"
 
-#: gitk:9666
+#: gitk:9786
 msgid ""
 "Hard: Reset working tree and index\n"
 "(discard ALL local changes)"
 msgstr "Жесткий: переписать индекс и рабочий каталог\n(все изменения в рабочем каталоге будут потеряны)"
 
-#: gitk:9683
+#: gitk:9803
 msgid "Resetting"
 msgstr "Сброс"
 
-#: gitk:9743
+#: gitk:9876
+#, tcl-format
+msgid "A local branch named %s exists already"
+msgstr "Локальная ветка с именем %s уже существует"
+
+#: gitk:9884
 msgid "Checking out"
 msgstr "Переход"
 
-#: gitk:9796
+#: gitk:9943
 msgid "Cannot delete the currently checked-out branch"
 msgstr "Активная ветка не может быть удалена"
 
-#: gitk:9802
+#: gitk:9949
 #, tcl-format
 msgid ""
 "The commits on branch %s aren't on any other branch.\n"
 "Really delete branch %s?"
 msgstr "Коммиты из ветки %s не принадлежат больше никакой другой ветке.\nДействительно удалить ветку %s?"
 
-#: gitk:9833
+#: gitk:9980
 #, tcl-format
 msgid "Tags and heads: %s"
 msgstr "Метки и ветки: %s"
 
-#: gitk:9850
+#: gitk:9997
 msgid "Filter"
 msgstr "Фильтровать"
 
-#: gitk:10146
+#: gitk:10293
 msgid ""
 "Error reading commit topology information; branch and preceding/following "
 "tag information will be incomplete."
 msgstr "Ошибка чтения истории проекта; информация о ветках и коммитах вокруг меток (до/после) может быть неполной."
 
-#: gitk:11123
+#: gitk:11270
 msgid "Tag"
 msgstr "Метка"
 
-#: gitk:11127
+#: gitk:11274
 msgid "Id"
 msgstr "Id"
 
-#: gitk:11210
+#: gitk:11357
 msgid "Gitk font chooser"
 msgstr "Шрифт Gitk"
 
-#: gitk:11227
+#: gitk:11374
 msgid "B"
 msgstr "Ж"
 
-#: gitk:11230
+#: gitk:11377
 msgid "I"
 msgstr "К"
 
-#: gitk:11348
+#: gitk:11495
 msgid "Commit list display options"
 msgstr "Параметры показа списка коммитов"
 
-#: gitk:11351
+#: gitk:11498
 msgid "Maximum graph width (lines)"
 msgstr "Макс. ширина графа (строк)"
 
-#: gitk:11355
+#: gitk:11502
 #, no-tcl-format
 msgid "Maximum graph width (% of pane)"
 msgstr "Макс. ширина графа (% ширины панели)"
 
-#: gitk:11358
+#: gitk:11505
 msgid "Show local changes"
 msgstr "Показывать изменения в рабочем каталоге"
 
-#: gitk:11361
+#: gitk:11508
 msgid "Auto-select SHA1 (length)"
 msgstr "Автоматически выделить SHA1 (длинна)"
 
-#: gitk:11365
+#: gitk:11512
 msgid "Hide remote refs"
 msgstr "Скрыть внешние ссылки"
 
-#: gitk:11369
+#: gitk:11516
 msgid "Diff display options"
 msgstr "Параметры показа изменений"
 
-#: gitk:11371
+#: gitk:11518
 msgid "Tab spacing"
 msgstr "Ширина табуляции"
 
-#: gitk:11374
+#: gitk:11521
 msgid "Display nearby tags/heads"
 msgstr "Показывать близкие метки/ветки"
 
-#: gitk:11377
+#: gitk:11524
 msgid "Maximum # tags/heads to show"
 msgstr "Показывать максимальное количество меток/веток"
 
-#: gitk:11380
+#: gitk:11527
 msgid "Limit diffs to listed paths"
 msgstr "Ограничить показ изменений выбранными файлами"
 
-#: gitk:11383
+#: gitk:11530
 msgid "Support per-file encodings"
 msgstr "Поддержка кодировок в отдельных файлах"
 
-#: gitk:11389 gitk:11536
+#: gitk:11536 gitk:11683
 msgid "External diff tool"
 msgstr "Программа для показа изменений"
 
-#: gitk:11390
+#: gitk:11537
 msgid "Choose..."
 msgstr "Выберите..."
 
-#: gitk:11395
+#: gitk:11542
 msgid "General options"
 msgstr "Общие опции"
 
-#: gitk:11398
+#: gitk:11545
 msgid "Use themed widgets"
 msgstr "Использовать стили виджетов"
 
-#: gitk:11400
+#: gitk:11547
 msgid "(change requires restart)"
 msgstr "(изменение потребует перезапуск)"
 
-#: gitk:11402
+#: gitk:11549
 msgid "(currently unavailable)"
 msgstr "(недоступно в данный момент)"
 
-#: gitk:11413
+#: gitk:11560
 msgid "Colors: press to choose"
 msgstr "Цвета: нажмите для выбора"
 
-#: gitk:11416
+#: gitk:11563
 msgid "Interface"
 msgstr "Интерфейс"
 
-#: gitk:11417
+#: gitk:11564
 msgid "interface"
 msgstr "интерфейс"
 
-#: gitk:11420
+#: gitk:11567
 msgid "Background"
 msgstr "Фон"
 
-#: gitk:11421 gitk:11451
+#: gitk:11568 gitk:11598
 msgid "background"
 msgstr "фон"
 
-#: gitk:11424
+#: gitk:11571
 msgid "Foreground"
 msgstr "Передний план"
 
-#: gitk:11425
+#: gitk:11572
 msgid "foreground"
 msgstr "передний план"
 
-#: gitk:11428
+#: gitk:11575
 msgid "Diff: old lines"
 msgstr "Изменения: старый текст"
 
-#: gitk:11429
+#: gitk:11576
 msgid "diff old lines"
 msgstr "старый текст изменения"
 
-#: gitk:11433
+#: gitk:11580
 msgid "Diff: new lines"
 msgstr "Изменения: новый текст"
 
-#: gitk:11434
+#: gitk:11581
 msgid "diff new lines"
 msgstr "новый текст изменения"
 
-#: gitk:11438
+#: gitk:11585
 msgid "Diff: hunk header"
 msgstr "Изменения: заголовок блока"
 
-#: gitk:11440
+#: gitk:11587
 msgid "diff hunk header"
 msgstr "заголовок блока изменений"
 
-#: gitk:11444
+#: gitk:11591
 msgid "Marked line bg"
 msgstr "Фон выбранной строки"
 
-#: gitk:11446
+#: gitk:11593
 msgid "marked line background"
 msgstr "фон выбранной строки"
 
-#: gitk:11450
+#: gitk:11597
 msgid "Select bg"
 msgstr "Выберите фон"
 
-#: gitk:11459
+#: gitk:11606
 msgid "Fonts: press to choose"
 msgstr "Шрифт: нажмите для выбора"
 
-#: gitk:11461
+#: gitk:11608
 msgid "Main font"
 msgstr "Основной шрифт"
 
-#: gitk:11462
+#: gitk:11609
 msgid "Diff display font"
 msgstr "Шрифт показа изменений"
 
-#: gitk:11463
+#: gitk:11610
 msgid "User interface font"
 msgstr "Шрифт интерфейса"
 
-#: gitk:11485
+#: gitk:11632
 msgid "Gitk preferences"
 msgstr "Настройки Gitk"
 
-#: gitk:11494
+#: gitk:11641
 msgid "General"
 msgstr "Общие"
 
-#: gitk:11495
+#: gitk:11642
 msgid "Colors"
 msgstr "Цвета"
 
-#: gitk:11496
+#: gitk:11643
 msgid "Fonts"
 msgstr "Шрифты"
 
-#: gitk:11546
+#: gitk:11693
 #, tcl-format
 msgid "Gitk: choose color for %s"
 msgstr "Gitk: выберите цвет для %s"
 
-#: gitk:12059
+#: gitk:12206
 msgid ""
 "Sorry, gitk cannot run with this version of Tcl/Tk.\n"
 " Gitk requires at least Tcl/Tk 8.4."
 msgstr "К сожалению gitk не может работать с этой версий Tcl/Tk.\nТребуется как минимум Tcl/Tk 8.4."
 
-#: gitk:12269
+#: gitk:12416
 msgid "Cannot find a git repository here."
 msgstr "Git-репозитарий не найден в текущем каталоге."
 
-#: gitk:12316
+#: gitk:12463
 #, tcl-format
 msgid "Ambiguous argument '%s': both revision and filename"
 msgstr "Неоднозначный аргумент «%s»: существует как редакция и как имя файла"
 
-#: gitk:12328
+#: gitk:12475
 msgid "Bad arguments to gitk:"
 msgstr "Неправильные аргументы для gitk:"
index d9d4e87a44a5cddafe957f276248ceec3c3ebc40..2a06fe5bbcf826c4a3312b0cff1e1ff53cf69490 100644 (file)
@@ -374,14 +374,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - en incheckningsvisare för git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Använd och vidareförmedla enligt villkoren i GNU General Public License"
 
@@ -1385,21 +1385,6 @@ msgstr "Felaktiga argument till gitk:"
 #~ msgid "mc"
 #~ msgstr "mc"
 
-#~ msgid ""
-#~ "\n"
-#~ "Gitk - a commit viewer for git\n"
-#~ "\n"
-#~ "Copyright © 2005-2015 Paul Mackerras\n"
-#~ "\n"
-#~ "Use and redistribute under the terms of the GNU General Public License"
-#~ msgstr ""
-#~ "\n"
-#~ "Gitk - en incheckningsvisare för git\n"
-#~ "\n"
-#~ "Copyright © 2005-2015 Paul Mackerras\n"
-#~ "\n"
-#~ "Använd och vidareförmedla enligt villkoren i GNU General Public License"
-
 #~ msgid "next"
 #~ msgstr "nästa"
 
index 8966812368a626e8da9f42012b69f233b4181642..59674986604891d9901e87c163e61dd39db14184 100644 (file)
@@ -363,14 +363,14 @@ msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2014 Paul Mackerras\n"
+"Copyright © 2005-2016 Paul Mackerras\n"
 "\n"
 "Use and redistribute under the terms of the GNU General Public License"
 msgstr ""
 "\n"
 "Gitk - ứng dụng để xem các lần chuyển giao dành cho git\n"
 "\n"
-"Bản quyền © 2005-2014 Paul Mackerras\n"
+"Bản quyền © 2005-2016 Paul Mackerras\n"
 "\n"
 "Dùng và phân phối lại phần mềm này theo các điều khoản của Giấy Phép Công GNU"
 
index 33d701d8525fd9334e4a899a807c8f8f0164dcc5..d8209c7a02d8753af4724f385a4ea783384536f6 100755 (executable)
@@ -1616,7 +1616,7 @@ sub esc_path {
        return $str;
 }
 
-# Sanitize for use in XHTML + application/xml+xhtm (valid XML 1.0)
+# Sanitize for use in XHTML + application/xml+xhtml (valid XML 1.0)
 sub sanitize {
        my $str = shift;
 
@@ -2036,10 +2036,24 @@ sub format_log_line_html {
        my $line = shift;
 
        $line = esc_html($line, -nbsp=>1);
-       $line =~ s{\b([0-9a-fA-F]{8,40})\b}{
+       $line =~ s{
+        \b
+        (
+            # The output of "git describe", e.g. v2.10.0-297-gf6727b0
+            # or hadoop-20160921-113441-20-g094fb7d
+            (?<!-) # see strbuf_check_tag_ref(). Tags can't start with -
+            [A-Za-z0-9.-]+
+            (?!\.) # refs can't end with ".", see check_refname_format()
+            -g[0-9a-fA-F]{7,40}
+            |
+            # Just a normal looking Git SHA1
+            [0-9a-fA-F]{7,40}
+        )
+        \b
+    }{
                $cgi->a({-href => href(action=>"object", hash=>$1),
                                        -class => "text"}, $1);
-       }eg;
+       }egx;
 
        return $line;
 }
@@ -3913,7 +3927,7 @@ sub blob_contenttype {
 # guess file syntax for syntax highlighting; return undef if no highlighting
 # the name of syntax can (in the future) depend on syntax highlighter used
 sub guess_file_syntax {
-       my ($highlight, $mimetype, $file_name) = @_;
+       my ($highlight, $file_name) = @_;
        return undef unless ($highlight && defined $file_name);
        my $basename = basename($file_name, '.in');
        return $highlight_basename{$basename}
@@ -3931,15 +3945,16 @@ sub guess_file_syntax {
 # or return original FD if no highlighting
 sub run_highlighter {
        my ($fd, $highlight, $syntax) = @_;
-       return $fd unless ($highlight && defined $syntax);
+       return $fd unless ($highlight);
 
        close $fd;
+       my $syntax_arg = (defined $syntax) ? "--syntax $syntax" : "--force";
        open $fd, quote_command(git_cmd(), "cat-file", "blob", $hash)." | ".
                  quote_command($^X, '-CO', '-MEncode=decode,FB_DEFAULT', '-pse',
                    '$_ = decode($fe, $_, FB_DEFAULT) if !utf8::decode($_);',
                    '--', "-fe=$fallback_encoding")." | ".
                  quote_command($highlight_bin).
-                 " --replace-tabs=8 --fragment --syntax $syntax |"
+                 " --replace-tabs=8 --fragment $syntax_arg |"
                or die_error(500, "Couldn't open file or run syntax highlighter");
        return $fd;
 }
@@ -7062,9 +7077,8 @@ sub git_blob {
        $have_blame &&= ($mimetype =~ m!^text/!);
 
        my $highlight = gitweb_check_feature('highlight');
-       my $syntax = guess_file_syntax($highlight, $mimetype, $file_name);
-       $fd = run_highlighter($fd, $highlight, $syntax)
-               if $syntax;
+       my $syntax = guess_file_syntax($highlight, $file_name);
+       $fd = run_highlighter($fd, $highlight, $syntax);
 
        git_header_html(undef, $expires);
        my $formats_nav = '';
@@ -7117,7 +7131,7 @@ sub git_blob {
                        $line = untabify($line);
                        printf qq!<div class="pre"><a id="l%i" href="%s#l%i" class="linenr">%4i</a> %s</div>\n!,
                               $nr, esc_attr(href(-replay => 1)), $nr, $nr,
-                              $syntax ? sanitize($line) : esc_html($line, -nbsp=>1);
+                              $highlight ? sanitize($line) : esc_html($line, -nbsp=>1);
                }
        }
        close $fd
@@ -8071,7 +8085,7 @@ sub git_search_help {
 <p><strong>Pattern</strong> is by default a normal string that is matched precisely (but without
 regard to case, except in the case of pickaxe). However, when you check the <em>re</em> checkbox,
 the pattern entered is recognized as the POSIX extended
-<a href="http://en.wikipedia.org/wiki/Regular_expression">regular expression</a> (also case
+<a href="https://en.wikipedia.org/wiki/Regular_expression">regular expression</a> (also case
 insensitive).</p>
 <dl>
 <dt><b>commit</b></dt>
index 8672edaf4823daafbfa1c51b37faca11250374d4..e44cc27da15f03629989ee0083664d0af09c55b3 100644 (file)
@@ -33,6 +33,10 @@ static struct {
        { 'B', "\n[GNUPG:] BADSIG " },
        { 'U', "\n[GNUPG:] TRUST_NEVER" },
        { 'U', "\n[GNUPG:] TRUST_UNDEFINED" },
+       { 'E', "\n[GNUPG:] ERRSIG "},
+       { 'X', "\n[GNUPG:] EXPSIG "},
+       { 'Y', "\n[GNUPG:] EXPKEYSIG "},
+       { 'R', "\n[GNUPG:] REVKEYSIG "},
 };
 
 void parse_gpg_output(struct signature_check *sigc)
@@ -54,9 +58,12 @@ void parse_gpg_output(struct signature_check *sigc)
                /* The trust messages are not followed by key/signer information */
                if (sigc->result != 'U') {
                        sigc->key = xmemdupz(found, 16);
-                       found += 17;
-                       next = strchrnul(found, '\n');
-                       sigc->signer = xmemdupz(found, next - found);
+                       /* The ERRSIG message is not followed by signer information */
+                       if (sigc-> result != 'E') {
+                               found += 17;
+                               next = strchrnul(found, '\n');
+                               sigc->signer = xmemdupz(found, next - found);
+                       }
                }
        }
 }
index ea68885ad5b73aa63acc936eee52a61252420892..d2d4fd3a656e3f4953aea5eda3eea435f37f237e 100644 (file)
@@ -1,8 +1,9 @@
 #ifndef GPG_INTERFACE_H
 #define GPG_INTERFACE_H
 
-#define GPG_VERIFY_VERBOSE     1
-#define GPG_VERIFY_RAW         2
+#define GPG_VERIFY_VERBOSE             1
+#define GPG_VERIFY_RAW                 2
+#define GPG_VERIFY_OMIT_STATUS 4
 
 struct signature_check {
        char *payload;
diff --git a/graph.c b/graph.c
index 4200f747e7bdd65e02856c5a02c88c690fd9dd96..8b9049dd2c725f58314042deebfb69030e4321d3 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -2,8 +2,8 @@
 #include "commit.h"
 #include "color.h"
 #include "graph.h"
-#include "diff.h"
 #include "revision.h"
+#include "argv-array.h"
 
 /* Internal API */
 
@@ -28,8 +28,15 @@ static void graph_padding_line(struct git_graph *graph, struct strbuf *sb);
  * responsible for printing this line's graph (perhaps via
  * graph_show_commit() or graph_show_oneline()) before calling
  * graph_show_strbuf().
+ *
+ * Note that unlike some other graph display functions, you must pass the file
+ * handle directly. It is assumed that this is the same file handle as the
+ * file specified by the graph diff options. This is necessary so that
+ * graph_show_strbuf can be called even with a NULL graph.
  */
-static void graph_show_strbuf(struct git_graph *graph, struct strbuf const *sb);
+static void graph_show_strbuf(struct git_graph *graph,
+                             FILE *file,
+                             struct strbuf const *sb);
 
 /*
  * TODO:
@@ -59,9 +66,40 @@ enum graph_state {
        GRAPH_COLLAPSING
 };
 
+static void graph_show_line_prefix(const struct diff_options *diffopt)
+{
+       if (!diffopt || !diffopt->line_prefix)
+               return;
+
+       fwrite(diffopt->line_prefix,
+              sizeof(char),
+              diffopt->line_prefix_length,
+              diffopt->file);
+}
+
 static const char **column_colors;
 static unsigned short column_colors_max;
 
+static void parse_graph_colors_config(struct argv_array *colors, const char *string)
+{
+       const char *end, *start;
+
+       start = string;
+       end = string + strlen(string);
+       while (start < end) {
+               const char *comma = strchrnul(start, ',');
+               char color[COLOR_MAXLEN];
+
+               if (!color_parse_mem(start, comma - start, color))
+                       argv_array_push(colors, color);
+               else
+                       warning(_("ignore invalid color '%.*s' in log.graphColors"),
+                               (int)(comma - start), start);
+               start = comma + 1;
+       }
+       argv_array_push(colors, GIT_COLOR_RESET);
+}
+
 void graph_set_column_colors(const char **colors, unsigned short colors_max)
 {
        column_colors = colors;
@@ -195,21 +233,48 @@ static struct strbuf *diff_output_prefix_callback(struct diff_options *opt, void
        static struct strbuf msgbuf = STRBUF_INIT;
 
        assert(opt);
-       assert(graph);
 
-       opt->output_prefix_length = graph->width;
        strbuf_reset(&msgbuf);
-       graph_padding_line(graph, &msgbuf);
+       if (opt->line_prefix)
+               strbuf_add(&msgbuf, opt->line_prefix,
+                          opt->line_prefix_length);
+       if (graph)
+               graph_padding_line(graph, &msgbuf);
        return &msgbuf;
 }
 
+static const struct diff_options *default_diffopt;
+
+void graph_setup_line_prefix(struct diff_options *diffopt)
+{
+       default_diffopt = diffopt;
+
+       /* setup an output prefix callback if necessary */
+       if (diffopt && !diffopt->output_prefix)
+               diffopt->output_prefix = diff_output_prefix_callback;
+}
+
+
 struct git_graph *graph_init(struct rev_info *opt)
 {
        struct git_graph *graph = xmalloc(sizeof(struct git_graph));
 
-       if (!column_colors)
-               graph_set_column_colors(column_colors_ansi,
-                                       column_colors_ansi_max);
+       if (!column_colors) {
+               char *string;
+               if (git_config_get_string("log.graphcolors", &string)) {
+                       /* not configured -- use default */
+                       graph_set_column_colors(column_colors_ansi,
+                                               column_colors_ansi_max);
+               } else {
+                       static struct argv_array custom_colors = ARGV_ARRAY_INIT;
+                       argv_array_clear(&custom_colors);
+                       parse_graph_colors_config(&custom_colors, string);
+                       free(string);
+                       /* graph_set_column_colors takes a max-index, not a count */
+                       graph_set_column_colors(custom_colors.argv,
+                                               custom_colors.argc - 1);
+               }
+       }
 
        graph->commit = NULL;
        graph->revs = opt;
@@ -245,7 +310,6 @@ struct git_graph *graph_init(struct rev_info *opt)
         */
        opt->diffopt.output_prefix = diff_output_prefix_callback;
        opt->diffopt.output_prefix_data = graph;
-       opt->diffopt.output_prefix_length = 0;
 
        return graph;
 }
@@ -433,7 +497,6 @@ static void graph_update_width(struct git_graph *graph,
 static void graph_update_columns(struct git_graph *graph)
 {
        struct commit_list *parent;
-       struct column *tmp_columns;
        int max_new_columns;
        int mapping_idx;
        int i, seen_this, is_commit_in_columns;
@@ -446,11 +509,8 @@ static void graph_update_columns(struct git_graph *graph)
         * We'll re-use the old columns array as storage to compute the new
         * columns list for the commit after this one.
         */
-       tmp_columns = graph->columns;
-       graph->columns = graph->new_columns;
+       SWAP(graph->columns, graph->new_columns);
        graph->num_columns = graph->num_new_columns;
-
-       graph->new_columns = tmp_columns;
        graph->num_new_columns = 0;
 
        /*
@@ -967,7 +1027,6 @@ static void graph_output_post_merge_line(struct git_graph *graph, struct strbuf
 static void graph_output_collapsing_line(struct git_graph *graph, struct strbuf *sb)
 {
        int i;
-       int *tmp_mapping;
        short used_horizontal = 0;
        int horizontal_edge = -1;
        int horizontal_edge_target = -1;
@@ -1102,9 +1161,7 @@ static void graph_output_collapsing_line(struct git_graph *graph, struct strbuf
        /*
         * Swap mapping and new_mapping
         */
-       tmp_mapping = graph->mapping;
-       graph->mapping = graph->new_mapping;
-       graph->new_mapping = tmp_mapping;
+       SWAP(graph->mapping, graph->new_mapping);
 
        /*
         * If graph->mapping indicates that all of the branch lines
@@ -1193,6 +1250,8 @@ void graph_show_commit(struct git_graph *graph)
        struct strbuf msgbuf = STRBUF_INIT;
        int shown_commit_line = 0;
 
+       graph_show_line_prefix(default_diffopt);
+
        if (!graph)
                return;
 
@@ -1210,8 +1269,10 @@ void graph_show_commit(struct git_graph *graph)
                shown_commit_line = graph_next_line(graph, &msgbuf);
                fwrite(msgbuf.buf, sizeof(char), msgbuf.len,
                        graph->revs->diffopt.file);
-               if (!shown_commit_line)
+               if (!shown_commit_line) {
                        putc('\n', graph->revs->diffopt.file);
+                       graph_show_line_prefix(&graph->revs->diffopt);
+               }
                strbuf_setlen(&msgbuf, 0);
        }
 
@@ -1222,6 +1283,8 @@ void graph_show_oneline(struct git_graph *graph)
 {
        struct strbuf msgbuf = STRBUF_INIT;
 
+       graph_show_line_prefix(default_diffopt);
+
        if (!graph)
                return;
 
@@ -1234,6 +1297,8 @@ void graph_show_padding(struct git_graph *graph)
 {
        struct strbuf msgbuf = STRBUF_INIT;
 
+       graph_show_line_prefix(default_diffopt);
+
        if (!graph)
                return;
 
@@ -1247,6 +1312,8 @@ int graph_show_remainder(struct git_graph *graph)
        struct strbuf msgbuf = STRBUF_INIT;
        int shown = 0;
 
+       graph_show_line_prefix(default_diffopt);
+
        if (!graph)
                return 0;
 
@@ -1260,27 +1327,24 @@ int graph_show_remainder(struct git_graph *graph)
                strbuf_setlen(&msgbuf, 0);
                shown = 1;
 
-               if (!graph_is_commit_finished(graph))
+               if (!graph_is_commit_finished(graph)) {
                        putc('\n', graph->revs->diffopt.file);
-               else
+                       graph_show_line_prefix(&graph->revs->diffopt);
+               } else {
                        break;
+               }
        }
        strbuf_release(&msgbuf);
 
        return shown;
 }
 
-
-static void graph_show_strbuf(struct git_graph *graph, struct strbuf const *sb)
+static void graph_show_strbuf(struct git_graph *graph,
+                             FILE *file,
+                             struct strbuf const *sb)
 {
        char *p;
 
-       if (!graph) {
-               fwrite(sb->buf, sizeof(char), sb->len,
-                       graph->revs->diffopt.file);
-               return;
-       }
-
        /*
         * Print the strbuf line by line,
         * and display the graph info before each line but the first.
@@ -1295,7 +1359,7 @@ static void graph_show_strbuf(struct git_graph *graph, struct strbuf const *sb)
                } else {
                        len = (sb->buf + sb->len) - p;
                }
-               fwrite(p, sizeof(char), len, graph->revs->diffopt.file);
+               fwrite(p, sizeof(char), len, file);
                if (next_p && *next_p != '\0')
                        graph_show_oneline(graph);
                p = next_p;
@@ -1303,29 +1367,20 @@ static void graph_show_strbuf(struct git_graph *graph, struct strbuf const *sb)
 }
 
 void graph_show_commit_msg(struct git_graph *graph,
+                          FILE *file,
                           struct strbuf const *sb)
 {
        int newline_terminated;
 
-       if (!graph) {
-               /*
-                * If there's no graph, just print the message buffer.
-                *
-                * The message buffer for CMIT_FMT_ONELINE and
-                * CMIT_FMT_USERFORMAT are already missing a terminating
-                * newline.  All of the other formats should have it.
-                */
-               fwrite(sb->buf, sizeof(char), sb->len,
-                       graph->revs->diffopt.file);
-               return;
-       }
-
-       newline_terminated = (sb->len && sb->buf[sb->len - 1] == '\n');
-
        /*
         * Show the commit message
         */
-       graph_show_strbuf(graph, sb);
+       graph_show_strbuf(graph, file, sb);
+
+       if (!graph)
+               return;
+
+       newline_terminated = (sb->len && sb->buf[sb->len - 1] == '\n');
 
        /*
         * If there is more output needed for this commit, show it now
@@ -1337,7 +1392,7 @@ void graph_show_commit_msg(struct git_graph *graph,
                 * new line.
                 */
                if (!newline_terminated)
-                       putc('\n', graph->revs->diffopt.file);
+                       putc('\n', file);
 
                graph_show_remainder(graph);
 
@@ -1345,6 +1400,6 @@ void graph_show_commit_msg(struct git_graph *graph,
                 * If sb ends with a newline, our output should too.
                 */
                if (newline_terminated)
-                       putc('\n', graph->revs->diffopt.file);
+                       putc('\n', file);
        }
 }
diff --git a/graph.h b/graph.h
index 3f48c19b6208712233f80c1afae3783951e967a9..af623390b6058d16677bb81223b2038148d07a6d 100644 (file)
--- a/graph.h
+++ b/graph.h
@@ -1,9 +1,22 @@
 #ifndef GRAPH_H
 #define GRAPH_H
+#include "diff.h"
 
 /* A graph is a pointer to this opaque structure */
 struct git_graph;
 
+/*
+ * Called to setup global display of line_prefix diff option.
+ *
+ * Passed a diff_options structure which indicates the line_prefix and the
+ * file to output the prefix to. This is sort of a hack used so that the
+ * line_prefix will be honored by all flows which also honor "--graph"
+ * regardless of whether a graph has actually been setup. The normal graph
+ * flow will honor the exact diff_options passed, but a NULL graph will cause
+ * display of a line_prefix to stdout.
+ */
+void graph_setup_line_prefix(struct diff_options *diffopt);
+
 /*
  * Set up a custom scheme for column colors.
  *
@@ -113,7 +126,14 @@ int graph_show_remainder(struct git_graph *graph);
  * missing a terminating newline (including if it is empty), the output
  * printed by graph_show_commit_msg() will also be missing a terminating
  * newline.
+ *
+ * Note that unlike some other graph display functions, you must pass the file
+ * handle directly. It is assumed that this is the same file handle as the
+ * file specified by the graph diff options. This is necessary so that
+ * graph_show_commit_msg can be called even with a NULL graph.
  */
-void graph_show_commit_msg(struct git_graph *graph, struct strbuf const *sb);
+void graph_show_commit_msg(struct git_graph *graph,
+                          FILE *file,
+                          struct strbuf const *sb);
 
 #endif /* GRAPH_H */
diff --git a/grep.c b/grep.c
index 1194d35b5d06d7960d4464884952e755914e2519..47cee4506703f5dd2b7db84e09dae93adf99fbaf 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -12,6 +12,11 @@ static int grep_source_is_binary(struct grep_source *gs);
 
 static struct grep_opt grep_defaults;
 
+static void std_output(struct grep_opt *opt, const void *buf, size_t size)
+{
+       fwrite(buf, size, 1, stdout);
+}
+
 /*
  * Initialize the grep_defaults template with hardcoded defaults.
  * We could let the compiler do this, but without C99 initializers
@@ -42,6 +47,7 @@ void init_grep_defaults(void)
        color_set(opt->color_selected, "");
        color_set(opt->color_sep, GIT_COLOR_CYAN);
        opt->color = -1;
+       opt->output = std_output;
 }
 
 static int parse_pattern_type_arg(const char *opt, const char *arg)
@@ -152,6 +158,7 @@ void grep_init(struct grep_opt *opt, const char *prefix)
        opt->pathname = def->pathname;
        opt->regflags = def->regflags;
        opt->relative = def->relative;
+       opt->output = def->output;
 
        color_set(opt->color_context, def->color_context);
        color_set(opt->color_filename, def->color_filename);
@@ -1164,7 +1171,7 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
        }
        if (opt->linenum) {
                char buf[32];
-               snprintf(buf, sizeof(buf), "%d", lno);
+               xsnprintf(buf, sizeof(buf), "%d", lno);
                output_color(opt, buf, strlen(buf), opt->color_lineno);
                output_sep(opt, sign);
        }
@@ -1379,11 +1386,6 @@ static int look_ahead(struct grep_opt *opt,
        return 0;
 }
 
-static void std_output(struct grep_opt *opt, const void *buf, size_t size)
-{
-       fwrite(buf, size, 1, stdout);
-}
-
 static int fill_textconv_grep(struct userdiff_driver *driver,
                              struct grep_source *gs)
 {
@@ -1651,7 +1653,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle
                                     opt->color_filename);
                        output_sep(opt, ':');
                }
-               snprintf(buf, sizeof(buf), "%u\n", count);
+               xsnprintf(buf, sizeof(buf), "%u\n", count);
                opt->output(opt, buf, strlen(buf));
                return 1;
        }
@@ -1735,12 +1737,23 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
        case GREP_SOURCE_FILE:
                gs->identifier = xstrdup(identifier);
                break;
+       case GREP_SOURCE_SUBMODULE:
+               if (!identifier) {
+                       gs->identifier = NULL;
+                       break;
+               }
+               /*
+                * FALL THROUGH
+                * If the identifier is non-NULL (in the submodule case) it
+                * will be a SHA1 that needs to be copied.
+                */
        case GREP_SOURCE_SHA1:
                gs->identifier = xmalloc(20);
                hashcpy(gs->identifier, identifier);
                break;
        case GREP_SOURCE_BUF:
                gs->identifier = NULL;
+               break;
        }
 }
 
@@ -1760,6 +1773,7 @@ void grep_source_clear_data(struct grep_source *gs)
        switch (gs->type) {
        case GREP_SOURCE_FILE:
        case GREP_SOURCE_SHA1:
+       case GREP_SOURCE_SUBMODULE:
                free(gs->buf);
                gs->buf = NULL;
                gs->size = 0;
@@ -1831,8 +1845,10 @@ static int grep_source_load(struct grep_source *gs)
                return grep_source_load_sha1(gs);
        case GREP_SOURCE_BUF:
                return gs->buf ? 0 : -1;
+       case GREP_SOURCE_SUBMODULE:
+               break;
        }
-       die("BUG: invalid grep_source type");
+       die("BUG: invalid grep_source type to load");
 }
 
 void grep_source_load_driver(struct grep_source *gs)
diff --git a/grep.h b/grep.h
index 5856a23e4620773cbda2e2944f93946c2701f923..267534ca24df532505854e1af31c53ed01bab24e 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -161,6 +161,7 @@ struct grep_source {
                GREP_SOURCE_SHA1,
                GREP_SOURCE_FILE,
                GREP_SOURCE_BUF,
+               GREP_SOURCE_SUBMODULE,
        } type;
        void *identifier;
 
diff --git a/hash.h b/hash.h
new file mode 100644 (file)
index 0000000..a11fc92
--- /dev/null
+++ b/hash.h
@@ -0,0 +1,16 @@
+#ifndef HASH_H
+#define HASH_H
+
+#if defined(SHA1_PPC)
+#include "ppc/sha1.h"
+#elif defined(SHA1_APPLE)
+#include <CommonCrypto/CommonDigest.h>
+#elif defined(SHA1_OPENSSL)
+#include <openssl/sha.h>
+#elif defined(SHA1_DC)
+#include "sha1dc/sha1.h"
+#else /* SHA1_BLK */
+#include "block-sha1/sha1.h"
+#endif
+
+#endif
index b10b642229ca0c3e6eb27142f080921dd5c3aece..7d1044eb5de0faf69a151ca16c1a21500d9d8a10 100644 (file)
--- a/hashmap.c
+++ b/hashmap.c
@@ -50,6 +50,23 @@ unsigned int memihash(const void *buf, size_t len)
        return hash;
 }
 
+/*
+ * Incoporate another chunk of data into a memihash
+ * computation.
+ */
+unsigned int memihash_cont(unsigned int hash_seed, const void *buf, size_t len)
+{
+       unsigned int hash = hash_seed;
+       unsigned char *ucbuf = (unsigned char *) buf;
+       while (len--) {
+               unsigned int c = *ucbuf++;
+               if (c >= 'a' && c <= 'z')
+                       c -= 'a' - 'A';
+               hash = (hash * FNV32_PRIME) ^ c;
+       }
+       return hash;
+}
+
 #define HASHMAP_INITIAL_SIZE 64
 /* grow / shrink by 2^2 */
 #define HASHMAP_RESIZE_BITS 2
@@ -87,11 +104,19 @@ static inline unsigned int bucket(const struct hashmap *map,
        return key->hash & (map->tablesize - 1);
 }
 
+int hashmap_bucket(const struct hashmap *map, unsigned int hash)
+{
+       return hash & (map->tablesize - 1);
+}
+
 static void rehash(struct hashmap *map, unsigned int newsize)
 {
        unsigned int i, oldsize = map->tablesize;
        struct hashmap_entry **oldtable = map->table;
 
+       if (map->disallow_rehash)
+               return;
+
        alloc_table(map, newsize);
        for (i = 0; i < oldsize; i++) {
                struct hashmap_entry *e = oldtable[i];
@@ -124,7 +149,9 @@ void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function,
                size_t initial_size)
 {
        unsigned int size = HASHMAP_INITIAL_SIZE;
-       map->size = 0;
+
+       memset(map, 0, sizeof(*map));
+
        map->cmpfn = equals_function ? equals_function : always_equal;
 
        /* calculate initial table size and allocate the table */
index ab7958ae333bcc635ba2ac8e40ee8aa6d8814ab4..de6022a3a916605d8e3330b23259110dd3522c7d 100644 (file)
--- a/hashmap.h
+++ b/hashmap.h
@@ -12,6 +12,7 @@ extern unsigned int strhash(const char *buf);
 extern unsigned int strihash(const char *buf);
 extern unsigned int memhash(const void *buf, size_t len);
 extern unsigned int memihash(const void *buf, size_t len);
+extern unsigned int memihash_cont(unsigned int hash_seed, const void *buf, size_t len);
 
 static inline unsigned int sha1hash(const unsigned char *sha1)
 {
@@ -38,6 +39,7 @@ struct hashmap {
        struct hashmap_entry **table;
        hashmap_cmp_fn cmpfn;
        unsigned int size, tablesize, grow_at, shrink_at;
+       unsigned disallow_rehash : 1;
 };
 
 struct hashmap_iter {
@@ -76,6 +78,29 @@ static inline void *hashmap_get_from_hash(const struct hashmap *map,
        return hashmap_get(map, &key, keydata);
 }
 
+int hashmap_bucket(const struct hashmap *map, unsigned int hash);
+
+/*
+ * Disallow/allow rehashing of the hashmap.
+ * This is useful if the caller knows that the hashmap
+ * needs multi-threaded access.  The caller is still
+ * required to guard/lock searches and inserts in a
+ * manner appropriate to their usage.  This simply
+ * prevents the table from being unexpectedly re-mapped.
+ *
+ * If is up to the caller to ensure that the hashmap is
+ * initialized to a reasonable size to prevent poor
+ * performance.
+ *
+ * When value=1, prevent future rehashes on adds and deleted.
+ * When value=0, allow future rehahses.  This DOES NOT force
+ * a rehash now.
+ */
+static inline void hashmap_disallow_rehash(struct hashmap *map, unsigned value)
+{
+       map->disallow_rehash = value;
+}
+
 /* hashmap_iter functions */
 
 extern void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter);
diff --git a/help.c b/help.c
index 2ff3b5a7745dbb7937896fb2303c9299387929de..b44c55ec2da515d12c1327f01202621738fa8653 100644 (file)
--- a/help.c
+++ b/help.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "builtin.h"
 #include "exec_cmd.h"
+#include "run-command.h"
 #include "levenshtein.h"
 #include "help.h"
 #include "common-cmds.h"
@@ -96,33 +97,6 @@ static void pretty_print_cmdnames(struct cmdnames *cmds, unsigned int colopts)
        string_list_clear(&list, 0);
 }
 
-static int is_executable(const char *name)
-{
-       struct stat st;
-
-       if (stat(name, &st) || /* stat, not lstat */
-           !S_ISREG(st.st_mode))
-               return 0;
-
-#if defined(GIT_WINDOWS_NATIVE)
-{      /* cannot trust the executable bit, peek into the file instead */
-       char buf[3] = { 0 };
-       int n;
-       int fd = open(name, O_RDONLY);
-       st.st_mode &= ~S_IXUSR;
-       if (fd >= 0) {
-               n = read(fd, buf, 2);
-               if (n == 2)
-                       /* DOS executables start with "MZ" */
-                       if (!strcmp(buf, "#!") || !strcmp(buf, "MZ"))
-                               st.st_mode |= S_IXUSR;
-               close(fd);
-       }
-}
-#endif
-       return st.st_mode & S_IXUSR;
-}
-
 static void list_commands_in_dir(struct cmdnames *cmds,
                                         const char *path,
                                         const char *prefix)
@@ -170,8 +144,7 @@ void load_command_list(const char *prefix,
 
        if (exec_path) {
                list_commands_in_dir(main_cmds, exec_path, prefix);
-               qsort(main_cmds->names, main_cmds->cnt,
-                     sizeof(*main_cmds->names), cmdname_compare);
+               QSORT(main_cmds->names, main_cmds->cnt, cmdname_compare);
                uniq(main_cmds);
        }
 
@@ -190,8 +163,7 @@ void load_command_list(const char *prefix,
                }
                free(paths);
 
-               qsort(other_cmds->names, other_cmds->cnt,
-                     sizeof(*other_cmds->names), cmdname_compare);
+               QSORT(other_cmds->names, other_cmds->cnt, cmdname_compare);
                uniq(other_cmds);
        }
        exclude_cmds(other_cmds, main_cmds);
@@ -238,8 +210,7 @@ void list_common_cmds_help(void)
                        longest = strlen(common_cmds[i].name);
        }
 
-       qsort(common_cmds, ARRAY_SIZE(common_cmds),
-               sizeof(common_cmds[0]), cmd_group_cmp);
+       QSORT(common_cmds, ARRAY_SIZE(common_cmds), cmd_group_cmp);
 
        puts(_("These are common Git commands used in various situations:"));
 
@@ -318,14 +289,13 @@ const char *help_unknown_cmd(const char *cmd)
        memset(&other_cmds, 0, sizeof(other_cmds));
        memset(&aliases, 0, sizeof(aliases));
 
-       git_config(git_unknown_cmd_config, NULL);
+       read_early_config(git_unknown_cmd_config, NULL);
 
        load_command_list("git-", &main_cmds, &other_cmds);
 
        add_cmd_list(&main_cmds, &aliases);
        add_cmd_list(&main_cmds, &other_cmds);
-       qsort(main_cmds.names, main_cmds.cnt,
-             sizeof(*main_cmds.names), cmdname_compare);
+       QSORT(main_cmds.names, main_cmds.cnt, cmdname_compare);
        uniq(&main_cmds);
 
        /* This abuses cmdname->len for levenshtein distance */
@@ -359,8 +329,7 @@ const char *help_unknown_cmd(const char *cmd)
                        levenshtein(cmd, candidate, 0, 2, 1, 3) + 1;
        }
 
-       qsort(main_cmds.names, main_cmds.cnt,
-             sizeof(*main_cmds.names), levenshtein_compare);
+       QSORT(main_cmds.names, main_cmds.cnt, levenshtein_compare);
 
        if (!main_cmds.cnt)
                die(_("Uh oh. Your system reports no Git commands at all."));
@@ -401,8 +370,8 @@ const char *help_unknown_cmd(const char *cmd)
 
        if (SIMILAR_ENOUGH(best_similarity)) {
                fprintf_ln(stderr,
-                          Q_("\nDid you mean this?",
-                             "\nDid you mean one of these?",
+                          Q_("\nThe most similar command is",
+                             "\nThe most similar commands are",
                           n));
 
                for (i = 0; i < n; i++)
diff --git a/hex.c b/hex.c
index 845b01a874b45314a22e6000bb4e7762c3dd846a..28b44118cbf2c75b26d017a34ecfdf65dbf4c7eb 100644 (file)
--- a/hex.c
+++ b/hex.c
@@ -53,6 +53,14 @@ int get_oid_hex(const char *hex, struct object_id *oid)
        return get_sha1_hex(hex, oid->hash);
 }
 
+int parse_oid_hex(const char *hex, struct object_id *oid, const char **end)
+{
+       int ret = get_oid_hex(hex, oid);
+       if (!ret)
+               *end = hex + GIT_SHA1_HEXSZ;
+       return ret;
+}
+
 char *sha1_to_hex_r(char *buffer, const unsigned char *sha1)
 {
        static const char hex[] = "0123456789abcdef";
@@ -77,7 +85,7 @@ char *oid_to_hex_r(char *buffer, const struct object_id *oid)
 char *sha1_to_hex(const unsigned char *sha1)
 {
        static int bufno;
-       static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
+       static char hexbuffer[4][GIT_MAX_HEXSZ + 1];
        bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer);
        return sha1_to_hex_r(hexbuffer[bufno], sha1);
 }
index adc8c8c3da6aaabe9f279b2a9841fc924ae39c1d..eef0a361f4f9bcc7f8fb278268334cb40a32fcb3 100644 (file)
@@ -464,7 +464,7 @@ static void get_info_refs(struct strbuf *hdr, char *arg)
                hdr_str(hdr, content_type, buf.buf);
                end_headers(hdr);
 
-               packet_write(1, "# service=git-%s\n", svc->name);
+               packet_write_fmt(1, "# service=git-%s\n", svc->name);
                packet_flush(1);
 
                argv[0] = svc->name;
index 704b1c837c9feaa1215e5fd9767c04275a4c1beb..f0e3108f716f8376ba924c4db1ea6f44b8bd60b9 100644 (file)
@@ -1431,11 +1431,9 @@ static void one_remote_ref(const char *refname)
         */
        if (repo->can_update_info_refs && !has_object_file(&ref->old_oid)) {
                obj = lookup_unknown_object(ref->old_oid.hash);
-               if (obj) {
-                       fprintf(stderr, "  fetch %s for %s\n",
-                               oid_to_hex(&ref->old_oid), refname);
-                       add_fetch_request(obj);
-               }
+               fprintf(stderr, "  fetch %s for %s\n",
+                       oid_to_hex(&ref->old_oid), refname);
+               add_fetch_request(obj);
        }
 
        ref->next = remote_refs;
index 0b2425531a8120fb29f37ee473a1e6e974959605..ee049cb13df6ed6a64b1980004100a5dd55dde51 100644 (file)
@@ -3,6 +3,7 @@
 #include "walker.h"
 #include "http.h"
 #include "list.h"
+#include "transport.h"
 
 struct alt_base {
        char *base;
@@ -160,6 +161,37 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
 #endif
 }
 
+static int is_alternate_allowed(const char *url)
+{
+       const char *protocols[] = {
+               "http", "https", "ftp", "ftps"
+       };
+       int i;
+
+       if (http_follow_config != HTTP_FOLLOW_ALWAYS) {
+               warning("alternate disabled by http.followRedirects: %s", url);
+               return 0;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(protocols); i++) {
+               const char *end;
+               if (skip_prefix(url, protocols[i], &end) &&
+                   starts_with(end, "://"))
+                       break;
+       }
+
+       if (i >= ARRAY_SIZE(protocols)) {
+               warning("ignoring alternate with unknown protocol: %s", url);
+               return 0;
+       }
+       if (!is_transport_allowed(protocols[i], 0)) {
+               warning("ignoring alternate with restricted protocol: %s", url);
+               return 0;
+       }
+
+       return 1;
+}
+
 static void process_alternates_response(void *callback_data)
 {
        struct alternates_request *alt_req =
@@ -269,23 +301,30 @@ static void process_alternates_response(void *callback_data)
                                        okay = 1;
                                }
                        }
-                       /* skip "objects\n" at end */
                        if (okay) {
                                struct strbuf target = STRBUF_INIT;
                                strbuf_add(&target, base, serverlen);
-                               strbuf_add(&target, data + i, posn - i - 7);
-                               if (walker->get_verbosely)
-                                       fprintf(stderr, "Also look at %s\n",
+                               strbuf_add(&target, data + i, posn - i);
+                               if (!strbuf_strip_suffix(&target, "objects")) {
+                                       warning("ignoring alternate that does"
+                                               " not end in 'objects': %s",
+                                               target.buf);
+                                       strbuf_release(&target);
+                               } else if (is_alternate_allowed(target.buf)) {
+                                       warning("adding alternate object store: %s",
                                                target.buf);
-                               newalt = xmalloc(sizeof(*newalt));
-                               newalt->next = NULL;
-                               newalt->base = strbuf_detach(&target, NULL);
-                               newalt->got_indices = 0;
-                               newalt->packs = NULL;
-
-                               while (tail->next != NULL)
-                                       tail = tail->next;
-                               tail->next = newalt;
+                                       newalt = xmalloc(sizeof(*newalt));
+                                       newalt->next = NULL;
+                                       newalt->base = strbuf_detach(&target, NULL);
+                                       newalt->got_indices = 0;
+                                       newalt->packs = NULL;
+
+                                       while (tail->next != NULL)
+                                               tail = tail->next;
+                                       tail->next = newalt;
+                               } else {
+                                       strbuf_release(&target);
+                               }
                        }
                }
                i = posn + 1;
@@ -480,10 +519,13 @@ static int fetch_object(struct walker *walker, unsigned char *sha1)
         * we turned off CURLOPT_FAILONERROR to avoid losing a
         * persistent connection and got CURLE_OK.
         */
-       if (req->http_code == 404 && req->curl_result == CURLE_OK &&
+       if (req->http_code >= 300 && req->curl_result == CURLE_OK &&
                        (starts_with(req->url, "http://") ||
-                        starts_with(req->url, "https://")))
+                        starts_with(req->url, "https://"))) {
                req->curl_result = CURLE_HTTP_RETURNED_ERROR;
+               xsnprintf(req->errorstr, sizeof(req->errorstr),
+                         "HTTP request failed");
+       }
 
        if (obj_req->state == ABORTED) {
                ret = error("Request for %s aborted", hex);
diff --git a/http.c b/http.c
index bd0dba23a037bfff48ea88b916c8f5a650c08176..d2e11ec6f012d3b2a9570f0c322aebf53a13cc0a 100644 (file)
--- a/http.c
+++ b/http.c
@@ -19,7 +19,7 @@ long int git_curl_ipresolve;
 #endif
 int active_requests;
 int http_is_verbose;
-size_t http_post_buffer = 16 * LARGE_PACKET_MAX;
+ssize_t http_post_buffer = 16 * LARGE_PACKET_MAX;
 
 #if LIBCURL_VERSION_NUM >= 0x070a06
 #define LIBCURL_CAN_HANDLE_AUTH_ANY
@@ -90,6 +90,18 @@ static struct {
         * here, too
         */
 };
+#if LIBCURL_VERSION_NUM >= 0x071600
+static const char *curl_deleg;
+static struct {
+       const char *name;
+       long curl_deleg_param;
+} curl_deleg_levels[] = {
+       { "none", CURLGSSAPI_DELEGATION_NONE },
+       { "policy", CURLGSSAPI_DELEGATION_POLICY_FLAG },
+       { "always", CURLGSSAPI_DELEGATION_FLAG },
+};
+#endif
+
 static struct credential proxy_auth = CREDENTIAL_INIT;
 static const char *curl_proxyuserpwd;
 static const char *curl_cookie_file;
@@ -97,7 +109,9 @@ static int curl_save_cookies;
 struct credential http_auth = CREDENTIAL_INIT;
 static int http_proactive_auth;
 static const char *user_agent;
-static int curl_empty_auth;
+static int curl_empty_auth = -1;
+
+enum http_follow_config http_follow_config = HTTP_FOLLOW_INITIAL;
 
 #if LIBCURL_VERSION_NUM >= 0x071700
 /* Use CURLOPT_KEYPASSWD as is */
@@ -111,6 +125,14 @@ static struct credential cert_auth = CREDENTIAL_INIT;
 static int ssl_cert_password_required;
 #ifdef LIBCURL_CAN_HANDLE_AUTH_ANY
 static unsigned long http_auth_methods = CURLAUTH_ANY;
+static int http_auth_methods_restricted;
+/* Modes for which empty_auth cannot actually help us. */
+static unsigned long empty_auth_useless =
+       CURLAUTH_BASIC
+#ifdef CURLAUTH_DIGEST_IE
+       | CURLAUTH_DIGEST_IE
+#endif
+       | CURLAUTH_DIGEST;
 #endif
 
 static struct curl_slist *pragma_header;
@@ -309,7 +331,9 @@ static int http_options(const char *var, const char *value, void *cb)
        }
 
        if (!strcmp("http.postbuffer", var)) {
-               http_post_buffer = git_config_int(var, value);
+               http_post_buffer = git_config_ssize_t(var, value);
+               if (http_post_buffer < 0)
+                       warning(_("negative value for http.postbuffer; defaulting to %d"), LARGE_PACKET_MAX);
                if (http_post_buffer < LARGE_PACKET_MAX)
                        http_post_buffer = LARGE_PACKET_MAX;
                return 0;
@@ -319,10 +343,22 @@ static int http_options(const char *var, const char *value, void *cb)
                return git_config_string(&user_agent, var, value);
 
        if (!strcmp("http.emptyauth", var)) {
-               curl_empty_auth = git_config_bool(var, value);
+               if (value && !strcmp("auto", value))
+                       curl_empty_auth = -1;
+               else
+                       curl_empty_auth = git_config_bool(var, value);
                return 0;
        }
 
+       if (!strcmp("http.delegation", var)) {
+#if LIBCURL_VERSION_NUM >= 0x071600
+               return git_config_string(&curl_deleg, var, value);
+#else
+               warning(_("Delegation control is not supported with cURL < 7.22.0"));
+               return 0;
+#endif
+       }
+
        if (!strcmp("http.pinnedpubkey", var)) {
 #if LIBCURL_VERSION_NUM >= 0x072c00
                return git_config_pathname(&ssl_pinnedkey, var, value);
@@ -345,14 +381,51 @@ static int http_options(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (!strcmp("http.followredirects", var)) {
+               if (value && !strcmp(value, "initial"))
+                       http_follow_config = HTTP_FOLLOW_INITIAL;
+               else if (git_config_bool(var, value))
+                       http_follow_config = HTTP_FOLLOW_ALWAYS;
+               else
+                       http_follow_config = HTTP_FOLLOW_NONE;
+               return 0;
+       }
+
        /* Fall back on the default ones */
        return git_default_config(var, value, cb);
 }
 
+static int curl_empty_auth_enabled(void)
+{
+       if (curl_empty_auth >= 0)
+               return curl_empty_auth;
+
+#ifndef LIBCURL_CAN_HANDLE_AUTH_ANY
+       /*
+        * Our libcurl is too old to do AUTH_ANY in the first place;
+        * just default to turning the feature off.
+        */
+#else
+       /*
+        * In the automatic case, kick in the empty-auth
+        * hack as long as we would potentially try some
+        * method more exotic than "Basic" or "Digest".
+        *
+        * But only do this when this is our second or
+        * subsequent request, as by then we know what
+        * methods are available.
+        */
+       if (http_auth_methods_restricted &&
+           (http_auth_methods & ~empty_auth_useless))
+               return 1;
+#endif
+       return 0;
+}
+
 static void init_curl_http_auth(CURL *result)
 {
        if (!http_auth.username || !*http_auth.username) {
-               if (curl_empty_auth)
+               if (curl_empty_auth_enabled())
                        curl_easy_setopt(result, CURLOPT_USERPWD, ":");
                return;
        }
@@ -603,11 +676,25 @@ void setup_curl_trace(CURL *handle)
        curl_easy_setopt(handle, CURLOPT_DEBUGDATA, NULL);
 }
 
+static long get_curl_allowed_protocols(int from_user)
+{
+       long allowed_protocols = 0;
+
+       if (is_transport_allowed("http", from_user))
+               allowed_protocols |= CURLPROTO_HTTP;
+       if (is_transport_allowed("https", from_user))
+               allowed_protocols |= CURLPROTO_HTTPS;
+       if (is_transport_allowed("ftp", from_user))
+               allowed_protocols |= CURLPROTO_FTP;
+       if (is_transport_allowed("ftps", from_user))
+               allowed_protocols |= CURLPROTO_FTPS;
+
+       return allowed_protocols;
+}
 
 static CURL *get_curl_handle(void)
 {
        CURL *result = curl_easy_init();
-       long allowed_protocols = 0;
 
        if (!result)
                die("curl_easy_init failed");
@@ -629,6 +716,22 @@ static CURL *get_curl_handle(void)
        curl_easy_setopt(result, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
 #endif
 
+#if LIBCURL_VERSION_NUM >= 0x071600
+       if (curl_deleg) {
+               int i;
+               for (i = 0; i < ARRAY_SIZE(curl_deleg_levels); i++) {
+                       if (!strcmp(curl_deleg, curl_deleg_levels[i].name)) {
+                               curl_easy_setopt(result, CURLOPT_GSSAPI_DELEGATION,
+                                               curl_deleg_levels[i].curl_deleg_param);
+                               break;
+                       }
+               }
+               if (i == ARRAY_SIZE(curl_deleg_levels))
+                       warning("Unknown delegation method '%s': using default",
+                               curl_deleg);
+       }
+#endif
+
        if (http_proactive_auth)
                init_curl_http_auth(result);
 
@@ -680,7 +783,6 @@ static CURL *get_curl_handle(void)
                                 curl_low_speed_time);
        }
 
-       curl_easy_setopt(result, CURLOPT_FOLLOWLOCATION, 1);
        curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20);
 #if LIBCURL_VERSION_NUM >= 0x071301
        curl_easy_setopt(result, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
@@ -688,19 +790,13 @@ static CURL *get_curl_handle(void)
        curl_easy_setopt(result, CURLOPT_POST301, 1);
 #endif
 #if LIBCURL_VERSION_NUM >= 0x071304
-       if (is_transport_allowed("http"))
-               allowed_protocols |= CURLPROTO_HTTP;
-       if (is_transport_allowed("https"))
-               allowed_protocols |= CURLPROTO_HTTPS;
-       if (is_transport_allowed("ftp"))
-               allowed_protocols |= CURLPROTO_FTP;
-       if (is_transport_allowed("ftps"))
-               allowed_protocols |= CURLPROTO_FTPS;
-       curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS, allowed_protocols);
+       curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS,
+                        get_curl_allowed_protocols(0));
+       curl_easy_setopt(result, CURLOPT_PROTOCOLS,
+                        get_curl_allowed_protocols(-1));
 #else
-       if (transport_restrict_protocols())
-               warning("protocol restrictions not applied to curl redirects because\n"
-                       "your curl version is too old (>= 7.19.4)");
+       warning("protocol restrictions not applied to curl redirects because\n"
+               "your curl version is too old (>= 7.19.4)");
 #endif
        if (getenv("GIT_CURL_VERBOSE"))
                curl_easy_setopt(result, CURLOPT_VERBOSE, 1L);
@@ -742,8 +838,14 @@ static CURL *get_curl_handle(void)
                }
        }
 
-       if (curl_http_proxy) {
-               curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy);
+       if (curl_http_proxy && curl_http_proxy[0] == '\0') {
+               /*
+                * Handle case with the empty http.proxy value here to keep
+                * common code clean.
+                * NB: empty option disables proxying at all.
+                */
+               curl_easy_setopt(result, CURLOPT_PROXY, "");
+       } else if (curl_http_proxy) {
 #if LIBCURL_VERSION_NUM >= 0x071800
                if (starts_with(curl_http_proxy, "socks5h"))
                        curl_easy_setopt(result,
@@ -767,6 +869,9 @@ static CURL *get_curl_handle(void)
                        strbuf_release(&url);
                }
 
+               if (!proxy_auth.host)
+                       die("Invalid proxy URL '%s'", curl_http_proxy);
+
                curl_easy_setopt(result, CURLOPT_PROXY, proxy_auth.host);
 #if LIBCURL_VERSION_NUM >= 0x071304
                var_override(&curl_no_proxy, getenv("NO_PROXY"));
@@ -1007,13 +1112,23 @@ struct active_request_slot *get_active_slot(void)
        curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1);
        curl_easy_setopt(slot->curl, CURLOPT_RANGE, NULL);
 
+       /*
+        * Default following to off unless "ALWAYS" is configured; this gives
+        * callers a sane starting point, and they can tweak for individual
+        * HTTP_FOLLOW_* cases themselves.
+        */
+       if (http_follow_config == HTTP_FOLLOW_ALWAYS)
+               curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
+       else
+               curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 0);
+
 #if LIBCURL_VERSION_NUM >= 0x070a08
        curl_easy_setopt(slot->curl, CURLOPT_IPRESOLVE, git_curl_ipresolve);
 #endif
 #ifdef LIBCURL_CAN_HANDLE_AUTH_ANY
        curl_easy_setopt(slot->curl, CURLOPT_HTTPAUTH, http_auth_methods);
 #endif
-       if (http_auth.password || curl_empty_auth)
+       if (http_auth.password || curl_empty_auth_enabled())
                init_curl_http_auth(slot->curl);
 
        return slot;
@@ -1249,9 +1364,12 @@ static int handle_curl_result(struct slot_results *results)
         * If we see a failing http code with CURLE_OK, we have turned off
         * FAILONERROR (to keep the server's custom error response), and should
         * translate the code into failure here.
+        *
+        * Likewise, if we see a redirect (30x code), that means we turned off
+        * redirect-following, and we should treat the result as an error.
         */
        if (results->curl_result == CURLE_OK &&
-           results->http_code >= 400) {
+           results->http_code >= 300) {
                results->curl_result = CURLE_HTTP_RETURNED_ERROR;
                /*
                 * Normally curl will already have put the "reason phrase"
@@ -1259,9 +1377,9 @@ static int handle_curl_result(struct slot_results *results)
                 * FAILONERROR it is lost, so we can give only the numeric
                 * status code.
                 */
-               snprintf(curl_errorstr, sizeof(curl_errorstr),
-                        "The requested URL returned error: %ld",
-                        results->http_code);
+               xsnprintf(curl_errorstr, sizeof(curl_errorstr),
+                         "The requested URL returned error: %ld",
+                         results->http_code);
        }
 
        if (results->curl_result == CURLE_OK) {
@@ -1278,6 +1396,10 @@ static int handle_curl_result(struct slot_results *results)
                } else {
 #ifdef LIBCURL_CAN_HANDLE_AUTH_ANY
                        http_auth_methods &= ~CURLAUTH_GSSNEGOTIATE;
+                       if (results->auth_avail) {
+                               http_auth_methods &= results->auth_avail;
+                               http_auth_methods_restricted = 1;
+                       }
 #endif
                        return HTTP_REAUTH;
                }
@@ -1299,8 +1421,8 @@ int run_one_slot(struct active_request_slot *slot,
 {
        slot->results = results;
        if (!start_active_slot(slot)) {
-               snprintf(curl_errorstr, sizeof(curl_errorstr),
-                        "failed to start HTTP request");
+               xsnprintf(curl_errorstr, sizeof(curl_errorstr),
+                         "failed to start HTTP request");
                return HTTP_START_FAILED;
        }
 
@@ -1570,6 +1692,9 @@ static int http_request(const char *url,
                strbuf_addstr(&buf, " no-cache");
        if (options && options->keep_error)
                curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0);
+       if (options && options->initial_request &&
+           http_follow_config == HTTP_FOLLOW_INITIAL)
+               curl_easy_setopt(slot->curl, CURLOPT_FOLLOWLOCATION, 1);
 
        headers = curl_slist_append(headers, buf.buf);
 
@@ -1618,16 +1743,16 @@ static int http_request(const char *url,
  *
  * Note that this assumes a sane redirect scheme. It's entirely possible
  * in the example above to end up at a URL that does not even end in
- * "info/refs".  In such a case we simply punt, as there is not much we can
- * do (and such a scheme is unlikely to represent a real git repository,
- * which means we are likely about to abort anyway).
+ * "info/refs".  In such a case we die. There's not much we can do, such a
+ * scheme is unlikely to represent a real git repository, and failing to
+ * rewrite the base opens options for malicious redirects to do funny things.
  */
 static int update_url_from_redirect(struct strbuf *base,
                                    const char *asked,
                                    const struct strbuf *got)
 {
        const char *tail;
-       size_t tail_len;
+       size_t new_len;
 
        if (!strcmp(asked, got->buf))
                return 0;
@@ -1636,14 +1761,16 @@ static int update_url_from_redirect(struct strbuf *base,
                die("BUG: update_url_from_redirect: %s is not a superset of %s",
                    asked, base->buf);
 
-       tail_len = strlen(tail);
-
-       if (got->len < tail_len ||
-           strcmp(tail, got->buf + got->len - tail_len))
-               return 0; /* insane redirect scheme */
+       new_len = got->len;
+       if (!strip_suffix_mem(got->buf, &new_len, tail))
+               die(_("unable to update url base from redirection:\n"
+                     "  asked for: %s\n"
+                     "   redirect: %s"),
+                   asked, got->buf);
 
        strbuf_reset(base);
-       strbuf_add(base, got->buf, got->len - tail_len);
+       strbuf_add(base, got->buf, new_len);
+
        return 1;
 }
 
@@ -1653,6 +1780,9 @@ static int http_request_reauth(const char *url,
 {
        int ret = http_request(url, result, target, options);
 
+       if (ret != HTTP_OK && ret != HTTP_REAUTH)
+               return ret;
+
        if (options && options->effective_url && options->base_url) {
                if (update_url_from_redirect(options->base_url,
                                             url, options->effective_url)) {
@@ -1991,7 +2121,7 @@ static size_t fwrite_sha1_file(char *ptr, size_t eltsize, size_t nmemb,
                if (c != CURLE_OK)
                        die("BUG: curl_easy_getinfo for HTTP code failed: %s",
                                curl_easy_strerror(c));
-               if (slot->http_code >= 400)
+               if (slot->http_code >= 300)
                        return size;
        }
 
diff --git a/http.h b/http.h
index 5ab9d9c329378f4f254c9d912dd7f05105ea6695..f7bd3b26b0da70e44402579e4912a1b20dcef16e 100644 (file)
--- a/http.h
+++ b/http.h
@@ -111,11 +111,18 @@ extern struct curl_slist *http_copy_default_headers(void);
 extern long int git_curl_ipresolve;
 extern int active_requests;
 extern int http_is_verbose;
-extern size_t http_post_buffer;
+extern ssize_t http_post_buffer;
 extern struct credential http_auth;
 
 extern char curl_errorstr[CURL_ERROR_SIZE];
 
+enum http_follow_config {
+       HTTP_FOLLOW_NONE,
+       HTTP_FOLLOW_ALWAYS,
+       HTTP_FOLLOW_INITIAL
+};
+extern enum http_follow_config http_follow_config;
+
 static inline int missing__target(int code, int result)
 {
        return  /* file:// URL -- do we ever use one??? */
@@ -139,7 +146,8 @@ extern char *get_remote_object_url(const char *url, const char *hex,
 /* Options for http_get_*() */
 struct http_get_options {
        unsigned no_cache:1,
-                keep_error:1;
+                keep_error:1,
+                initial_request:1;
 
        /* If non-NULL, returns the content-type of the response. */
        struct strbuf *content_type;
diff --git a/ident.c b/ident.c
index d17b5bd341eccd604c849201fb1f13153be9736e..bea871c8e02b7173eeba5527d22f5ae7783c011e 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -120,9 +120,9 @@ static int canonical_name(const char *host, struct strbuf *out)
 
 static void add_domainname(struct strbuf *out, int *is_bogus)
 {
-       char buf[1024];
+       char buf[HOST_NAME_MAX + 1];
 
-       if (gethostname(buf, sizeof(buf))) {
+       if (xgethostname(buf, sizeof(buf))) {
                warning_errno("cannot get host name");
                strbuf_addstr(out, "(none)");
                *is_bogus = 1;
@@ -153,7 +153,7 @@ static void copy_email(const struct passwd *pw, struct strbuf *email,
 
 const char *ident_default_name(void)
 {
-       if (!git_default_name.len) {
+       if (!(ident_config_given & IDENT_NAME_GIVEN) && !git_default_name.len) {
                copy_gecos(xgetpwuid_self(&default_name_is_bogus), &git_default_name);
                strbuf_trim(&git_default_name);
        }
@@ -162,7 +162,7 @@ const char *ident_default_name(void)
 
 const char *ident_default_email(void)
 {
-       if (!git_default_email.len) {
+       if (!(ident_config_given & IDENT_MAIL_GIVEN) && !git_default_email.len) {
                const char *email = getenv("EMAIL");
 
                if (email && email[0]) {
@@ -203,6 +203,15 @@ static int crud(unsigned char c)
                c == '\'';
 }
 
+static int has_non_crud(const char *str)
+{
+       for (; *str; str++) {
+               if (!crud(*str))
+                       return 1;
+       }
+       return 0;
+}
+
 /*
  * Copy over a string to the destination, but avoid special
  * characters ('\n', '<' and '>') and remove crud at the end
@@ -331,17 +340,17 @@ person_only:
 }
 
 static const char *env_hint =
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account\'s default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n";
+N_("\n"
+   "*** Please tell me who you are.\n"
+   "\n"
+   "Run\n"
+   "\n"
+   "  git config --global user.email \"you@example.com\"\n"
+   "  git config --global user.name \"Your Name\"\n"
+   "\n"
+   "to set your account\'s default identity.\n"
+   "Omit --global to set the identity only in this repository.\n"
+   "\n");
 
 const char *fmt_ident(const char *name, const char *email,
                      const char *date_str, int flag)
@@ -351,44 +360,46 @@ const char *fmt_ident(const char *name, const char *email,
        int want_date = !(flag & IDENT_NO_DATE);
        int want_name = !(flag & IDENT_NO_NAME);
 
+       if (!email) {
+               if (strict && ident_use_config_only
+                   && !(ident_config_given & IDENT_MAIL_GIVEN)) {
+                       fputs(_(env_hint), stderr);
+                       die(_("no email was given and auto-detection is disabled"));
+               }
+               email = ident_default_email();
+               if (strict && default_email_is_bogus) {
+                       fputs(_(env_hint), stderr);
+                       die(_("unable to auto-detect email address (got '%s')"), email);
+               }
+       }
+
        if (want_name) {
                int using_default = 0;
                if (!name) {
                        if (strict && ident_use_config_only
                            && !(ident_config_given & IDENT_NAME_GIVEN)) {
-                               fputs(env_hint, stderr);
-                               die("no name was given and auto-detection is disabled");
+                               fputs(_(env_hint), stderr);
+                               die(_("no name was given and auto-detection is disabled"));
                        }
                        name = ident_default_name();
                        using_default = 1;
                        if (strict && default_name_is_bogus) {
-                               fputs(env_hint, stderr);
-                               die("unable to auto-detect name (got '%s')", name);
+                               fputs(_(env_hint), stderr);
+                               die(_("unable to auto-detect name (got '%s')"), name);
                        }
                }
                if (!*name) {
                        struct passwd *pw;
                        if (strict) {
                                if (using_default)
-                                       fputs(env_hint, stderr);
-                               die("empty ident name (for <%s>) not allowed", email);
+                                       fputs(_(env_hint), stderr);
+                               die(_("empty ident name (for <%s>) not allowed"), email);
                        }
                        pw = xgetpwuid_self(NULL);
                        name = pw->pw_name;
                }
-       }
-
-       if (!email) {
-               if (strict && ident_use_config_only
-                   && !(ident_config_given & IDENT_MAIL_GIVEN)) {
-                       fputs(env_hint, stderr);
-                       die("no email was given and auto-detection is disabled");
-               }
-               email = ident_default_email();
-               if (strict && default_email_is_bogus) {
-                       fputs(env_hint, stderr);
-                       die("unable to auto-detect email address (got '%s')", email);
-               }
+               if (strict && !has_non_crud(name))
+                       die(_("name consists only of disallowed characters: %s"), name);
        }
 
        strbuf_reset(&ident);
@@ -403,7 +414,7 @@ const char *fmt_ident(const char *name, const char *email,
                strbuf_addch(&ident, ' ');
                if (date_str && date_str[0]) {
                        if (parse_date(date_str, &ident) < 0)
-                               die("invalid date format: %s", date_str);
+                               die(_("invalid date format: %s"), date_str);
                }
                else
                        strbuf_addstr(&ident, ident_default_date());
index 5c7e27a89459a9a63018cc469262c82891c6f7b7..857591660f485d65dec3390b22dd2083c94d7a44 100644 (file)
@@ -964,7 +964,7 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *f
                int gai;
                char portstr[6];
 
-               snprintf(portstr, sizeof(portstr), "%d", srvc->port);
+               xsnprintf(portstr, sizeof(portstr), "%d", srvc->port);
 
                memset(&hints, 0, sizeof(hints));
                hints.ai_socktype = SOCK_STREAM;
index 916e7248701dad2a8beb870887a5ed7d3874ff41..b9087814b8ccd0082efc41c617e33e8046ea17d5 100644 (file)
@@ -43,9 +43,10 @@ void range_set_release(struct range_set *rs)
 static void range_set_copy(struct range_set *dst, struct range_set *src)
 {
        range_set_init(dst, src->nr);
-       memcpy(dst->ranges, src->ranges, src->nr*sizeof(struct range_set));
+       COPY_ARRAY(dst->ranges, src->ranges, src->nr);
        dst->nr = src->nr;
 }
+
 static void range_set_move(struct range_set *dst, struct range_set *src)
 {
        range_set_release(dst);
@@ -113,7 +114,7 @@ void sort_and_merge_range_set(struct range_set *rs)
        int i;
        int o = 0; /* output cursor */
 
-       qsort(rs->ranges, rs->nr, sizeof(struct range), range_cmp);
+       QSORT(rs->ranges, rs->nr, range_cmp);
 
        for (i = 0; i < rs->nr; i++) {
                if (rs->ranges[i].start == rs->ranges[i].end)
@@ -144,7 +145,7 @@ void sort_and_merge_range_set(struct range_set *rs)
 static void range_set_union(struct range_set *out,
                             struct range_set *a, struct range_set *b)
 {
-       int i = 0, j = 0, o = 0;
+       int i = 0, j = 0;
        struct range *ra = a->ranges;
        struct range *rb = b->ranges;
        /* cannot make an alias of out->ranges: it may change during grow */
@@ -167,16 +168,15 @@ static void range_set_union(struct range_set *out,
                        new = &rb[j++];
                if (new->start == new->end)
                        ; /* empty range */
-               else if (!o || out->ranges[o-1].end < new->start) {
+               else if (!out->nr || out->ranges[out->nr-1].end < new->start) {
                        range_set_grow(out, 1);
-                       out->ranges[o].start = new->start;
-                       out->ranges[o].end = new->end;
-                       o++;
-               } else if (out->ranges[o-1].end < new->end) {
-                       out->ranges[o-1].end = new->end;
+                       out->ranges[out->nr].start = new->start;
+                       out->ranges[out->nr].end = new->end;
+                       out->nr++;
+               } else if (out->ranges[out->nr-1].end < new->end) {
+                       out->ranges[out->nr-1].end = new->end;
                }
        }
-       out->nr = o;
 }
 
 /*
@@ -1125,6 +1125,7 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
        changed = process_all_files(&parent_range, rev, &queue, range);
        if (parent)
                add_line_range(rev, parent, parent_range);
+       free_line_log_data(parent_range);
        return changed;
 }
 
index de4e32f9424fbc0770756c3f61751fc69bfeb17e..323399d16cfa828adce913c9ff994e860ce2e7a5 100644 (file)
@@ -269,8 +269,7 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb,
                return -1;
 
        if (*begin && *end && *end < *begin) {
-               long tmp;
-               tmp = *end; *end = *begin; *begin = tmp;
+               SWAP(*end, *begin);
        }
 
        return 0;
index ad8be42f912b456492ca1704ce067fea4713401a..ac0d4a5d78d956f09aa0082b286babc36f04b593 100644 (file)
@@ -336,15 +336,6 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr
        return &ll_merge_drv[LL_TEXT_MERGE];
 }
 
-static int git_path_check_merge(const char *path, struct git_attr_check check[2])
-{
-       if (!check[0].attr) {
-               check[0].attr = git_attr("merge");
-               check[1].attr = git_attr("conflict-marker-size");
-       }
-       return git_check_attr(path, 2, check);
-}
-
 static void normalize_file(mmfile_t *mm, const char *path)
 {
        struct strbuf strbuf = STRBUF_INIT;
@@ -362,7 +353,7 @@ int ll_merge(mmbuffer_t *result_buf,
             mmfile_t *theirs, const char *their_label,
             const struct ll_merge_options *opts)
 {
-       static struct git_attr_check check[2];
+       static struct attr_check *check;
        static const struct ll_merge_options default_opts;
        const char *ll_driver_name = NULL;
        int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
@@ -376,10 +367,14 @@ int ll_merge(mmbuffer_t *result_buf,
                normalize_file(ours, path);
                normalize_file(theirs, path);
        }
-       if (!git_path_check_merge(path, check)) {
-               ll_driver_name = check[0].value;
-               if (check[1].value) {
-                       marker_size = atoi(check[1].value);
+
+       if (!check)
+               check = attr_check_initl("merge", "conflict-marker-size", NULL);
+
+       if (!git_check_attr(path, check)) {
+               ll_driver_name = check->items[0].value;
+               if (check->items[1].value) {
+                       marker_size = atoi(check->items[1].value);
                        if (marker_size <= 0)
                                marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
                }
@@ -398,13 +393,13 @@ int ll_merge(mmbuffer_t *result_buf,
 
 int ll_merge_marker_size(const char *path)
 {
-       static struct git_attr_check check;
+       static struct attr_check *check;
        int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
 
-       if (!check.attr)
-               check.attr = git_attr("conflict-marker-size");
-       if (!git_check_attr(path, 1, &check) && check.value) {
-               marker_size = atoi(check.value);
+       if (!check)
+               check = attr_check_initl("conflict-marker-size", NULL);
+       if (!git_check_attr(path, check) && check->items[0].value) {
+               marker_size = atoi(check->items[0].value);
                if (marker_size <= 0)
                        marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
        }
index 9268cdf325f3881104d6d12ef31639536b15dcb2..aa69210d8b3a9063517d2d84153dc3ba738bef30 100644 (file)
@@ -174,8 +174,16 @@ int hold_lock_file_for_update_timeout(struct lock_file *lk, const char *path,
                                      int flags, long timeout_ms)
 {
        int fd = lock_file_timeout(lk, path, flags, timeout_ms);
-       if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
-               unable_to_lock_die(path, errno);
+       if (fd < 0) {
+               if (flags & LOCK_DIE_ON_ERROR)
+                       unable_to_lock_die(path, errno);
+               if (flags & LOCK_REPORT_ON_ERROR) {
+                       struct strbuf buf = STRBUF_INIT;
+                       unable_to_lock_message(path, errno, &buf);
+                       error("%s", buf.buf);
+                       strbuf_release(&buf);
+               }
+       }
        return fd;
 }
 
index d26ad27b2b2df207872cb20ce9cc0299ee0aff8e..7b715f9e7754882061dde0220d13fdc7d0d6c252 100644 (file)
@@ -129,10 +129,16 @@ struct lock_file {
 /*
  * If a lock is already taken for the file, `die()` with an error
  * message. If this flag is not specified, trying to lock a file that
- * is already locked returns -1 to the caller.
+ * is already locked silently returns -1 to the caller, or ...
  */
 #define LOCK_DIE_ON_ERROR 1
 
+/*
+ * ... this flag can be passed instead to return -1 and give the usual
+ * error message upon an error.
+ */
+#define LOCK_REPORT_ON_ERROR 4
+
 /*
  * Usually symbolic links in the destination path are resolved. This
  * means that (1) the lockfile is created by adding ".lock" to the
index bfb735c84556f0c6f4d3f17dc4ed18774b8db817..4618dd04ca1b6bd2bf53481f39851fb4e5d02336 100644 (file)
@@ -332,35 +332,31 @@ void fmt_output_commit(struct strbuf *filename,
        strbuf_release(&subject);
 }
 
+void fmt_output_email_subject(struct strbuf *sb, struct rev_info *opt)
+{
+       if (opt->total > 0) {
+               strbuf_addf(sb, "Subject: [%s%s%0*d/%d] ",
+                           opt->subject_prefix,
+                           *opt->subject_prefix ? " " : "",
+                           digits_in_number(opt->total),
+                           opt->nr, opt->total);
+       } else if (opt->total == 0 && opt->subject_prefix && *opt->subject_prefix) {
+               strbuf_addf(sb, "Subject: [%s] ",
+                           opt->subject_prefix);
+       } else {
+               strbuf_addstr(sb, "Subject: ");
+       }
+}
+
 void log_write_email_headers(struct rev_info *opt, struct commit *commit,
-                            const char **subject_p,
                             const char **extra_headers_p,
                             int *need_8bit_cte_p)
 {
-       const char *subject = NULL;
        const char *extra_headers = opt->extra_headers;
        const char *name = oid_to_hex(opt->zero_commit ?
                                      &null_oid : &commit->object.oid);
 
        *need_8bit_cte_p = 0; /* unknown */
-       if (opt->total > 0) {
-               static char buffer[64];
-               snprintf(buffer, sizeof(buffer),
-                        "Subject: [%s%s%0*d/%d] ",
-                        opt->subject_prefix,
-                        *opt->subject_prefix ? " " : "",
-                        digits_in_number(opt->total),
-                        opt->nr, opt->total);
-               subject = buffer;
-       } else if (opt->total == 0 && opt->subject_prefix && *opt->subject_prefix) {
-               static char buffer[256];
-               snprintf(buffer, sizeof(buffer),
-                        "Subject: [%s] ",
-                        opt->subject_prefix);
-               subject = buffer;
-       } else {
-               subject = "Subject: ";
-       }
 
        fprintf(opt->diffopt.file, "From %s Mon Sep 17 00:00:00 2001\n", name);
        graph_show_oneline(opt->graph);
@@ -417,7 +413,6 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
                opt->diffopt.stat_sep = buffer;
                strbuf_release(&filename);
        }
-       *subject_p = subject;
        *extra_headers_p = extra_headers;
 }
 
@@ -602,8 +597,10 @@ void show_log(struct rev_info *opt)
         */
 
        if (cmit_fmt_is_mail(opt->commit_format)) {
-               log_write_email_headers(opt, commit, &ctx.subject, &extra_headers,
+               log_write_email_headers(opt, commit, &extra_headers,
                                        &ctx.need_8bit_cte);
+               ctx.rev = opt;
+               ctx.print_email_subject = 1;
        } else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
                fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), opt->diffopt.file);
                if (opt->commit_format != CMIT_FMT_ONELINE)
@@ -715,10 +712,7 @@ void show_log(struct rev_info *opt)
        else
                opt->missing_newline = 0;
 
-       if (opt->graph)
-               graph_show_commit_msg(opt->graph, &msgbuf);
-       else
-               fwrite(msgbuf.buf, sizeof(char), msgbuf.len, opt->diffopt.file);
+       graph_show_commit_msg(opt->graph, opt->diffopt.file, &msgbuf);
        if (opt->use_terminator && !commit_format_is_empty(opt->commit_format)) {
                if (!opt->missing_newline)
                        graph_show_padding(opt->graph);
index c8116e60cde34032da6f2044881d5a4970cd96fe..48f11fb740ddf670cac819cb733cbc736cc30d0e 100644 (file)
@@ -22,7 +22,6 @@ void format_decorations_extended(struct strbuf *sb, const struct commit *commit,
                             format_decorations_extended((strbuf), (commit), (color), " (", ", ", ")")
 void show_decorations(struct rev_info *opt, struct commit *commit);
 void log_write_email_headers(struct rev_info *opt, struct commit *commit,
-                            const char **subject_p,
                             const char **extra_headers_p,
                             int *need_8bit_cte_p);
 void load_ref_decorations(int flags);
@@ -30,5 +29,6 @@ void load_ref_decorations(int flags);
 #define FORMAT_PATCH_NAME_MAX 64
 void fmt_output_commit(struct strbuf *, struct commit *, struct rev_info *);
 void fmt_output_subject(struct strbuf *, const char *subject, struct rev_info *);
+void fmt_output_email_subject(struct strbuf *, struct rev_info *);
 
 #endif
index b4118a02757212871e3402532ab5c422a5ba043f..f92cb9f729ca05ae1e80c9c27bc102dbb64a8dc0 100644 (file)
@@ -577,26 +577,26 @@ static int check_header(struct mailinfo *mi,
                goto check_header_out;
        }
 
-       /* for inbody stuff */
-       if (starts_with(line->buf, ">From") && isspace(line->buf[5])) {
-               ret = is_format_patch_separator(line->buf + 1, line->len - 1);
-               goto check_header_out;
-       }
-       if (starts_with(line->buf, "[PATCH]") && isspace(line->buf[7])) {
-               for (i = 0; header[i]; i++) {
-                       if (!strcmp("Subject", header[i])) {
-                               handle_header(&hdr_data[i], line);
-                               ret = 1;
-                               goto check_header_out;
-                       }
-               }
-       }
-
 check_header_out:
        strbuf_release(&sb);
        return ret;
 }
 
+/*
+ * Returns 1 if the given line or any line beginning with the given line is an
+ * in-body header (that is, check_header will succeed when passed
+ * mi->s_hdr_data).
+ */
+static int is_inbody_header(const struct mailinfo *mi,
+                           const struct strbuf *line)
+{
+       int i;
+       for (i = 0; header[i]; i++)
+               if (!mi->s_hdr_data[i] && cmp_header(line, header[i]))
+                       return 1;
+       return 0;
+}
+
 static void decode_transfer_encoding(struct mailinfo *mi, struct strbuf *line)
 {
        struct strbuf *ret;
@@ -654,37 +654,35 @@ static inline int patchbreak(const struct strbuf *line)
        return 0;
 }
 
-static int is_scissors_line(const struct strbuf *line)
+static int is_scissors_line(const char *line)
 {
-       size_t i, len = line->len;
+       const char *c;
        int scissors = 0, gap = 0;
-       int first_nonblank = -1;
-       int last_nonblank = 0, visible, perforation = 0, in_perforation = 0;
-       const char *buf = line->buf;
+       const char *first_nonblank = NULL, *last_nonblank = NULL;
+       int visible, perforation = 0, in_perforation = 0;
 
-       for (i = 0; i < len; i++) {
-               if (isspace(buf[i])) {
+       for (c = line; *c; c++) {
+               if (isspace(*c)) {
                        if (in_perforation) {
                                perforation++;
                                gap++;
                        }
                        continue;
                }
-               last_nonblank = i;
-               if (first_nonblank < 0)
-                       first_nonblank = i;
-               if (buf[i] == '-') {
+               last_nonblank = c;
+               if (first_nonblank == NULL)
+                       first_nonblank = c;
+               if (*c == '-') {
                        in_perforation = 1;
                        perforation++;
                        continue;
                }
-               if (i + 1 < len &&
-                   (!memcmp(buf + i, ">8", 2) || !memcmp(buf + i, "8<", 2) ||
-                    !memcmp(buf + i, ">%", 2) || !memcmp(buf + i, "%<", 2))) {
+               if ((!memcmp(c, ">8", 2) || !memcmp(c, "8<", 2) ||
+                    !memcmp(c, ">%", 2) || !memcmp(c, "%<", 2))) {
                        in_perforation = 1;
                        perforation += 2;
                        scissors += 2;
-                       i++;
+                       c++;
                        continue;
                }
                in_perforation = 0;
@@ -699,23 +697,77 @@ static int is_scissors_line(const struct strbuf *line)
         * than half of the perforation.
         */
 
-       visible = last_nonblank - first_nonblank + 1;
+       if (first_nonblank && last_nonblank)
+               visible = last_nonblank - first_nonblank + 1;
+       else
+               visible = 0;
        return (scissors && 8 <= visible &&
                visible < perforation * 3 &&
                gap * 2 < perforation);
 }
 
+static void flush_inbody_header_accum(struct mailinfo *mi)
+{
+       if (!mi->inbody_header_accum.len)
+               return;
+       if (!check_header(mi, &mi->inbody_header_accum, mi->s_hdr_data, 0))
+               die("BUG: inbody_header_accum, if not empty, must always contain a valid in-body header");
+       strbuf_reset(&mi->inbody_header_accum);
+}
+
+static int check_inbody_header(struct mailinfo *mi, const struct strbuf *line)
+{
+       if (mi->inbody_header_accum.len &&
+           (line->buf[0] == ' ' || line->buf[0] == '\t')) {
+               if (mi->use_scissors && is_scissors_line(line->buf)) {
+                       /*
+                        * This is a scissors line; do not consider this line
+                        * as a header continuation line.
+                        */
+                       flush_inbody_header_accum(mi);
+                       return 0;
+               }
+               strbuf_strip_suffix(&mi->inbody_header_accum, "\n");
+               strbuf_addbuf(&mi->inbody_header_accum, line);
+               return 1;
+       }
+
+       flush_inbody_header_accum(mi);
+
+       if (starts_with(line->buf, ">From") && isspace(line->buf[5]))
+               return is_format_patch_separator(line->buf + 1, line->len - 1);
+       if (starts_with(line->buf, "[PATCH]") && isspace(line->buf[7])) {
+               int i;
+               for (i = 0; header[i]; i++)
+                       if (!strcmp("Subject", header[i])) {
+                               handle_header(&mi->s_hdr_data[i], line);
+                               return 1;
+                       }
+               return 0;
+       }
+       if (is_inbody_header(mi, line)) {
+               strbuf_addbuf(&mi->inbody_header_accum, line);
+               return 1;
+       }
+       return 0;
+}
+
 static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)
 {
        assert(!mi->filter_stage);
 
        if (mi->header_stage) {
-               if (!line->len || (line->len == 1 && line->buf[0] == '\n'))
+               if (!line->len || (line->len == 1 && line->buf[0] == '\n')) {
+                       if (mi->inbody_header_accum.len) {
+                               flush_inbody_header_accum(mi);
+                               mi->header_stage = 0;
+                       }
                        return 0;
+               }
        }
 
        if (mi->use_inbody_headers && mi->header_stage) {
-               mi->header_stage = check_header(mi, line, mi->s_hdr_data, 0);
+               mi->header_stage = check_inbody_header(mi, line);
                if (mi->header_stage)
                        return 0;
        } else
@@ -728,7 +780,7 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)
        if (convert_to_utf8(mi, line, mi->charset.buf))
                return 0; /* mi->input_error already set */
 
-       if (mi->use_scissors && is_scissors_line(line)) {
+       if (mi->use_scissors && is_scissors_line(line->buf)) {
                int i;
 
                strbuf_setlen(&mi->log_message, 0);
@@ -830,7 +882,10 @@ static int read_one_header_line(struct strbuf *line, FILE *in)
        for (;;) {
                int peek;
 
-               peek = fgetc(in); ungetc(peek, in);
+               peek = fgetc(in);
+               if (peek == EOF)
+                       break;
+               ungetc(peek, in);
                if (peek != ' ' && peek != '\t')
                        break;
                if (strbuf_getline_lf(&continuation, in))
@@ -968,6 +1023,8 @@ static void handle_body(struct mailinfo *mi, struct strbuf *line)
                        break;
        } while (!strbuf_getwholeline(line, mi->input, '\n'));
 
+       flush_inbody_header_accum(mi);
+
 handle_body_out:
        strbuf_release(&prev);
 }
@@ -1045,6 +1102,10 @@ int mailinfo(struct mailinfo *mi, const char *msg, const char *patch)
 
        do {
                peek = fgetc(mi->input);
+               if (peek == EOF) {
+                       fclose(cmitmsg);
+                       return error("empty patch: '%s'", patch);
+               }
        } while (isspace(peek));
        ungetc(peek, mi->input);
 
@@ -1083,6 +1144,7 @@ void setup_mailinfo(struct mailinfo *mi)
        strbuf_init(&mi->email, 0);
        strbuf_init(&mi->charset, 0);
        strbuf_init(&mi->log_message, 0);
+       strbuf_init(&mi->inbody_header_accum, 0);
        mi->header_stage = 1;
        mi->use_inbody_headers = 1;
        mi->content_top = mi->content;
@@ -1096,6 +1158,7 @@ void clear_mailinfo(struct mailinfo *mi)
        strbuf_release(&mi->name);
        strbuf_release(&mi->email);
        strbuf_release(&mi->charset);
+       strbuf_release(&mi->inbody_header_accum);
        free(mi->message_id);
 
        for (i = 0; mi->p_hdr_data[i]; i++)
index 93776a7e05a68c49951e9e8e062c164c364d5d45..04a25351d6d39c4d0bb00943bb23ee99e8d41bcf 100644 (file)
@@ -27,6 +27,7 @@ struct mailinfo {
        int patch_lines;
        int filter_stage; /* still reading log or are we copying patch? */
        int header_stage; /* still checking in-body headers? */
+       struct strbuf inbody_header_accum;
        struct strbuf **p_hdr_data;
        struct strbuf **s_hdr_data;
 
index aa92e30f639027b5e4a661d3691493be5713f631..62decd51cc74a9197abbda28dc8efd6f83287a6b 100644 (file)
@@ -235,6 +235,8 @@ static int add_cacheinfo(struct merge_options *o,
                struct cache_entry *nce;
 
                nce = refresh_cache_entry(ce, CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING);
+               if (!nce)
+                       return err(o, _("addinfo_cache failed for path '%s'"), path);
                if (nce != ce)
                        ret = add_cache_entry(nce, options);
        }
@@ -382,18 +384,16 @@ static struct string_list *get_unmerged(void)
                }
                e = item->util;
                e->stages[ce_stage(ce)].mode = ce->ce_mode;
-               hashcpy(e->stages[ce_stage(ce)].oid.hash, ce->sha1);
+               oidcpy(&e->stages[ce_stage(ce)].oid, &ce->oid);
        }
 
        return unmerged;
 }
 
-static int string_list_df_name_compare(const void *a, const void *b)
+static int string_list_df_name_compare(const char *one, const char *two)
 {
-       const struct string_list_item *one = a;
-       const struct string_list_item *two = b;
-       int onelen = strlen(one->string);
-       int twolen = strlen(two->string);
+       int onelen = strlen(one);
+       int twolen = strlen(two);
        /*
         * Here we only care that entries for D/F conflicts are
         * adjacent, in particular with the file of the D/F conflict
@@ -406,8 +406,8 @@ static int string_list_df_name_compare(const void *a, const void *b)
         * since in other cases any changes in their order due to
         * sorting cause no problems for us.
         */
-       int cmp = df_name_compare(one->string, onelen, S_IFDIR,
-                                 two->string, twolen, S_IFDIR);
+       int cmp = df_name_compare(one, onelen, S_IFDIR,
+                                 two, twolen, S_IFDIR);
        /*
         * Now that 'foo' and 'foo/bar' compare equal, we have to make sure
         * that 'foo' comes before 'foo/bar'.
@@ -451,8 +451,8 @@ static void record_df_conflict_files(struct merge_options *o,
                string_list_append(&df_sorted_entries, next->string)->util =
                                   next->util;
        }
-       qsort(df_sorted_entries.items, entries->nr, sizeof(*entries->items),
-             string_list_df_name_compare);
+       df_sorted_entries.cmp = string_list_df_name_compare;
+       string_list_sort(&df_sorted_entries);
 
        string_list_clear(&o->df_conflict_file_set, 1);
        for (i = 0; i < df_sorted_entries.nr; i++) {
@@ -664,7 +664,13 @@ static char *unique_path(struct merge_options *o, const char *path, const char *
        return strbuf_detach(&newpath, NULL);
 }
 
-static int dir_in_way(const char *path, int check_working_copy)
+/**
+ * Check whether a directory in the index is in the way of an incoming
+ * file.  Return 1 if so.  If check_working_copy is non-zero, also
+ * check the working directory.  If empty_ok is non-zero, also return
+ * 0 in the case where the working-tree dir exists but is empty.
+ */
+static int dir_in_way(const char *path, int check_working_copy, int empty_ok)
 {
        int pos;
        struct strbuf dirpath = STRBUF_INIT;
@@ -684,7 +690,8 @@ static int dir_in_way(const char *path, int check_working_copy)
        }
 
        strbuf_release(&dirpath);
-       return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode);
+       return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode) &&
+               !(empty_ok && is_empty_dir(path));
 }
 
 static int was_tracked(const char *path)
@@ -910,9 +917,9 @@ static int merge_3way(struct merge_options *o,
                name2 = mkpathdup("%s", branch2);
        }
 
-       read_mmblob(&orig, one->oid.hash);
-       read_mmblob(&src1, a->oid.hash);
-       read_mmblob(&src2, b->oid.hash);
+       read_mmblob(&orig, &one->oid);
+       read_mmblob(&src1, &a->oid);
+       read_mmblob(&src2, &b->oid);
 
        merge_status = ll_merge(result_buf, a->path, &orig, base_name,
                                &src1, name1, &src2, name2, &ll_opts);
@@ -1054,16 +1061,20 @@ static int merge_file_one(struct merge_options *o,
 }
 
 static int handle_change_delete(struct merge_options *o,
-                                const char *path,
+                                const char *path, const char *old_path,
                                 const struct object_id *o_oid, int o_mode,
-                                const struct object_id *a_oid, int a_mode,
-                                const struct object_id *b_oid, int b_mode,
+                                const struct object_id *changed_oid,
+                                int changed_mode,
+                                const char *change_branch,
+                                const char *delete_branch,
                                 const char *change, const char *change_past)
 {
-       char *renamed = NULL;
+       char *alt_path = NULL;
+       const char *update_path = path;
        int ret = 0;
-       if (dir_in_way(path, !o->call_depth)) {
-               renamed = unique_path(o, path, a_oid ? o->branch1 : o->branch2);
+
+       if (dir_in_way(path, !o->call_depth, 0)) {
+               update_path = alt_path = unique_path(o, path, change_branch);
        }
 
        if (o->call_depth) {
@@ -1074,43 +1085,43 @@ static int handle_change_delete(struct merge_options *o,
                 */
                ret = remove_file_from_cache(path);
                if (!ret)
-                       ret = update_file(o, 0, o_oid, o_mode,
-                                         renamed ? renamed : path);
-       } else if (!a_oid) {
-               if (!renamed) {
-                       output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
-                              "and %s in %s. Version %s of %s left in tree."),
-                              change, path, o->branch1, change_past,
-                              o->branch2, o->branch2, path);
-                       ret = update_file(o, 0, b_oid, b_mode, path);
-               } else {
-                       output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
-                              "and %s in %s. Version %s of %s left in tree at %s."),
-                              change, path, o->branch1, change_past,
-                              o->branch2, o->branch2, path, renamed);
-                       ret = update_file(o, 0, b_oid, b_mode, renamed);
-               }
+                       ret = update_file(o, 0, o_oid, o_mode, update_path);
        } else {
-               if (!renamed) {
-                       output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
-                              "and %s in %s. Version %s of %s left in tree."),
-                              change, path, o->branch2, change_past,
-                              o->branch1, o->branch1, path);
+               if (!alt_path) {
+                       if (!old_path) {
+                               output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+                                      "and %s in %s. Version %s of %s left in tree."),
+                                      change, path, delete_branch, change_past,
+                                      change_branch, change_branch, path);
+                       } else {
+                               output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+                                      "and %s to %s in %s. Version %s of %s left in tree."),
+                                      change, old_path, delete_branch, change_past, path,
+                                      change_branch, change_branch, path);
+                       }
                } else {
-                       output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
-                              "and %s in %s. Version %s of %s left in tree at %s."),
-                              change, path, o->branch2, change_past,
-                              o->branch1, o->branch1, path, renamed);
-                       ret = update_file(o, 0, a_oid, a_mode, renamed);
+                       if (!old_path) {
+                               output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+                                      "and %s in %s. Version %s of %s left in tree at %s."),
+                                      change, path, delete_branch, change_past,
+                                      change_branch, change_branch, path, alt_path);
+                       } else {
+                               output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
+                                      "and %s to %s in %s. Version %s of %s left in tree at %s."),
+                                      change, old_path, delete_branch, change_past, path,
+                                      change_branch, change_branch, path, alt_path);
+                       }
                }
                /*
-                * No need to call update_file() on path when !renamed, since
-                * that would needlessly touch path.  We could call
-                * update_file_flags() with update_cache=0 and update_wd=0,
-                * but that's a no-op.
+                * No need to call update_file() on path when change_branch ==
+                * o->branch1 && !alt_path, since that would needlessly touch
+                * path.  We could call update_file_flags() with update_cache=0
+                * and update_wd=0, but that's a no-op.
                 */
+               if (change_branch != o->branch1 || alt_path)
+                       ret = update_file(o, 0, changed_oid, changed_mode, update_path);
        }
-       free(renamed);
+       free(alt_path);
 
        return ret;
 }
@@ -1118,28 +1129,17 @@ static int handle_change_delete(struct merge_options *o,
 static int conflict_rename_delete(struct merge_options *o,
                                   struct diff_filepair *pair,
                                   const char *rename_branch,
-                                  const char *other_branch)
+                                  const char *delete_branch)
 {
        const struct diff_filespec *orig = pair->one;
        const struct diff_filespec *dest = pair->two;
-       const struct object_id *a_oid = NULL;
-       const struct object_id *b_oid = NULL;
-       int a_mode = 0;
-       int b_mode = 0;
-
-       if (rename_branch == o->branch1) {
-               a_oid = &dest->oid;
-               a_mode = dest->mode;
-       } else {
-               b_oid = &dest->oid;
-               b_mode = dest->mode;
-       }
 
        if (handle_change_delete(o,
                                 o->call_depth ? orig->path : dest->path,
+                                o->call_depth ? NULL : orig->path,
                                 &orig->oid, orig->mode,
-                                a_oid, a_mode,
-                                b_oid, b_mode,
+                                &dest->oid, dest->mode,
+                                rename_branch, delete_branch,
                                 _("rename"), _("renamed")))
                return -1;
 
@@ -1195,7 +1195,7 @@ static int handle_file(struct merge_options *o,
                remove_file(o, 0, rename->path, 0);
                dst_name = unique_path(o, rename->path, cur_branch);
        } else {
-               if (dir_in_way(rename->path, !o->call_depth)) {
+               if (dir_in_way(rename->path, !o->call_depth, 0)) {
                        dst_name = unique_path(o, rename->path, cur_branch);
                        output(o, 1, _("%s is a directory in %s adding as %s instead"),
                               rename->path, other_branch, dst_name);
@@ -1383,14 +1383,11 @@ static int process_renames(struct merge_options *o,
                        branch1 = o->branch1;
                        branch2 = o->branch2;
                } else {
-                       struct rename *tmp;
                        renames1 = b_renames;
                        renames2Dst = &a_by_dst;
                        branch1 = o->branch2;
                        branch2 = o->branch1;
-                       tmp = ren2;
-                       ren2 = ren1;
-                       ren1 = tmp;
+                       SWAP(ren2, ren1);
                }
 
                if (ren1->processed)
@@ -1658,11 +1655,27 @@ static int handle_modify_delete(struct merge_options *o,
                                 struct object_id *a_oid, int a_mode,
                                 struct object_id *b_oid, int b_mode)
 {
+       const char *modify_branch, *delete_branch;
+       struct object_id *changed_oid;
+       int changed_mode;
+
+       if (a_oid) {
+               modify_branch = o->branch1;
+               delete_branch = o->branch2;
+               changed_oid = a_oid;
+               changed_mode = a_mode;
+       } else {
+               modify_branch = o->branch2;
+               delete_branch = o->branch1;
+               changed_oid = b_oid;
+               changed_mode = b_mode;
+       }
+
        return handle_change_delete(o,
-                                   path,
+                                   path, NULL,
                                    o_oid, o_mode,
-                                   a_oid, a_mode,
-                                   b_oid, b_mode,
+                                   changed_oid, changed_mode,
+                                   modify_branch, delete_branch,
                                    _("modify"), _("modified"));
 }
 
@@ -1704,7 +1717,8 @@ static int merge_content(struct merge_options *o,
                         o->branch2 == rename_conflict_info->branch1) ?
                        pair1->two->path : pair1->one->path;
 
-               if (dir_in_way(path, !o->call_depth))
+               if (dir_in_way(path, !o->call_depth,
+                              S_ISGITLINK(pair1->two->mode)))
                        df_conflict_remains = 1;
        }
        if (merge_file_special_markers(o, &one, &a, &b,
@@ -1862,7 +1876,8 @@ static int process_entry(struct merge_options *o,
                        oid = b_oid;
                        conf = _("directory/file");
                }
-               if (dir_in_way(path, !o->call_depth)) {
+               if (dir_in_way(path, !o->call_depth,
+                              S_ISGITLINK(a_mode))) {
                        char *new_path = unique_path(o, path, add_branch);
                        clean_merge = 0;
                        output(o, 1, _("CONFLICT (%s): There is a directory with name %s in %s. "
@@ -2124,7 +2139,7 @@ int merge_recursive_generic(struct merge_options *o,
                }
        }
 
-       hold_locked_index(lock, 1);
+       hold_locked_index(lock, LOCK_DIE_ON_ERROR);
        clean = merge_recursive(o, head_commit, next_commit, ca,
                        result);
        if (clean < 0)
diff --git a/merge.c b/merge.c
index 5db7d56b90c3413bbd831f90de73d3306e10ce2f..04ee5fc911c8d8134decb5c1a400576ae5681bf6 100644 (file)
--- a/merge.c
+++ b/merge.c
@@ -57,7 +57,8 @@ int checkout_fast_forward(const unsigned char *head,
 
        refresh_cache(REFRESH_QUIET);
 
-       hold_locked_index(lock_file, 1);
+       if (hold_locked_index(lock_file, LOCK_REPORT_ON_ERROR) < 0)
+               return -1;
 
        memset(&trees, 0, sizeof(trees));
        memset(&opts, 0, sizeof(opts));
@@ -90,7 +91,9 @@ int checkout_fast_forward(const unsigned char *head,
        }
        if (unpack_trees(nr_trees, t, &opts))
                return -1;
-       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
-               die(_("unable to write new index file"));
+       if (write_locked_index(&the_index, lock_file, COMMIT_LOCK)) {
+               rollback_lock_file(lock_file);
+               return error(_("unable to write new index file"));
+       }
        return 0;
 }
index 64f97c5e9755d54ace864cb53bf0e7844f530f49..e2407b65b70d1e622979cdb2fe0e425ba6403ee1 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -wait -merge -3 -a1 \
@@ -12,7 +11,6 @@ merge_cmd () {
                "$merge_tool_path" -wait -2 \
                        "$LOCAL" "$REMOTE" "$MERGED" >/dev/null 2>&1
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index b6319d206e2333e42469486604d4635e846e5faa..3a69e60faa9c95dcf388cd295d040e9b88e0defd 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \
@@ -12,7 +11,6 @@ merge_cmd () {
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
                        -mergeoutput="$MERGED"
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index 3f0486bc807133f50abcaab27c991d4a806ec63c..9f60e8da6527cf28dcc5ad4a3e5f7f0ca9442cb4 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" -BF="$BASE" \
@@ -12,7 +11,6 @@ merge_cmd () {
                "$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" \
                        -RF="$MERGED"
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index b3c71b6236e343dd3b268a2288af853804b3acf6..ee6f374bceb8e14af5b424e64fbe9787006091e8 100644 (file)
@@ -16,6 +16,10 @@ merge_cmd () {
        fi >/dev/null 2>&1
 }
 
-translate_merge_tool_path() {
+translate_merge_tool_path () {
        echo DeltaWalker
 }
+
+exit_code_trustable () {
+       true
+}
index f138cb4e731018b40426337eb8062f40512df088..9b6355b98a71da2627b68c6543cea4f2515b8d54 100644 (file)
@@ -12,3 +12,7 @@ merge_cmd () {
                        --result="$MERGED" "$LOCAL" "$REMOTE"
        fi
 }
+
+exit_code_trustable () {
+       true
+}
index 02e0843f47e09a7cc6cdd2a9c70e36773ecc96af..5a3ae8b5695d3141ff0310a706495ea52037b464 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" \
@@ -13,5 +12,4 @@ merge_cmd () {
                "$merge_tool_path" \
                        "$LOCAL" "$MERGED" "$REMOTE" | cat
        fi
-       check_unchanged
 }
index 13c2e439def45fe6cf58ae4345355894463ba34f..6c5101c4f729d49c544436e9262ca75e4ce6cddd 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \
@@ -12,5 +11,4 @@ merge_cmd () {
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
                        --default --mode=merge2 --to="$MERGED"
        fi
-       check_unchanged
 }
index 7b895fdb1f9955eb470a2614e0634bfcd26d90c9..d1ce513ff5d3b3db14dd1270d2181099e1134c2c 100644 (file)
@@ -20,3 +20,7 @@ merge_cmd () {
 translate_merge_tool_path() {
        echo emacs
 }
+
+exit_code_trustable () {
+       true
+}
index 7b524d4088ff198d70c5e40a378011f2e515770e..e72b06fc4d8ff76e06a0b972ae28df73efd4180d 100644 (file)
@@ -3,14 +3,12 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -merge "$LOCAL" "$BASE" "$REMOTE" -o:"$MERGED" -nh
        else
                "$merge_tool_path" -merge "$LOCAL" "$REMOTE" -o:"$MERGED" -nh
        fi
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index 793d1293b16c9b28a9ec5c70ec7fa0875ab0da54..0264ed5b20b29fec0fc5586408f88b0e8755d212 100644 (file)
@@ -21,3 +21,7 @@ merge_cmd () {
                >/dev/null 2>&1
        fi
 }
+
+exit_code_trustable () {
+       true
+}
index 433686c12a088195bbf21b2e409c21df199ba988..e8c0bfa678547258ff0f330ae756f3621e6aadc7 100644 (file)
@@ -5,3 +5,7 @@ can_merge () {
 diff_cmd () {
        "$merge_tool_path" "$LOCAL" "$REMOTE"
 }
+
+exit_code_trustable () {
+       true
+}
index 83ebdfb4c328ac79af38bfe935f0dbfa7fb6f53b..7a08470f8836e14824a215b29e0c3a5dbeba9c17 100644 (file)
@@ -7,15 +7,14 @@ merge_cmd () {
        then
                check_meld_for_output_version
        fi
-       touch "$BACKUP"
+
        if test "$meld_has_output_option" = true
        then
-               "$merge_tool_path" --output "$MERGED" \
+               "$merge_tool_path" --output="$MERGED" \
                        "$LOCAL" "$BASE" "$REMOTE"
        else
                "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
        fi
-       check_unchanged
 }
 
 # Check whether we should use 'meld --output <file>'
index 0942b2a733592d3f0a5a39b4fc1defd635eb7b04..b608dd6de30aaab9b30729145029761330f9fb55 100644 (file)
@@ -3,7 +3,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
@@ -12,5 +11,4 @@ merge_cmd () {
                "$merge_tool_path" "$LOCAL" "$REMOTE" \
                        -merge "$MERGED" | cat
        fi
-       check_unchanged
 }
index 5a608abf9c77f436ab1472592e3d5777ef83805d..7a5b291dd28ad5b60ca0492480b800aaa9cc929e 100644 (file)
@@ -20,14 +20,12 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if ! $base_present
        then
                cp -- "$LOCAL" "$BASE"
                create_virtual_base "$BASE" "$REMOTE"
        fi
        "$merge_tool_path" "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
-       check_unchanged
 }
 
 create_empty_file () {
index 618c438e8765a485ffcc70a105fb0cf46010540c..eee5cb57e3ccf7f1ad7ad150c37a8b6d7ab6d436 100644 (file)
@@ -10,3 +10,7 @@ merge_cmd () {
                "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE"
        fi
 }
+
+exit_code_trustable () {
+       true
+}
index 3b89f1c82dc944fcbec889d24e8e7032fda612fc..d7ab666a59a2c8690861146bb6ae4874ed48e0de 100644 (file)
@@ -5,7 +5,6 @@ can_diff () {
 merge_cmd () {
        if $base_present
        then
-               touch "$BACKUP"
                basename="$(basename "$merge_tool_path" .exe)"
                if test "$basename" = "tortoisegitmerge"
                then
@@ -17,7 +16,6 @@ merge_cmd () {
                                -base:"$BASE" -mine:"$LOCAL" \
                                -theirs:"$REMOTE" -merged:"$MERGED"
                fi
-               check_unchanged
        else
                echo "$merge_tool_path cannot be used without a base" 1>&2
                return 1
index 74ea6d54793f62188cd88e93f1adfe74c5957dda..10d86f3e19304125cecf06ddad928b9ffe2d0c08 100644 (file)
@@ -4,7 +4,6 @@ diff_cmd () {
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        case "$1" in
        gvimdiff|vimdiff)
                if $base_present
@@ -31,7 +30,6 @@ merge_cmd () {
                fi
                ;;
        esac
-       check_unchanged
 }
 
 translate_merge_tool_path() {
@@ -44,3 +42,7 @@ translate_merge_tool_path() {
                ;;
        esac
 }
+
+exit_code_trustable () {
+       true
+}
index f3819d316a2c05d9fe1f850d6ac20b04d9df0417..74d03259fdf157c9ee07eec7b2c40727f5ce49dc 100644 (file)
@@ -6,10 +6,8 @@ diff_cmd () {
 merge_cmd () {
        # mergetool.winmerge.trustExitCode is implicitly false.
        # touch $BACKUP so that we can check_unchanged.
-       touch "$BACKUP"
        "$merge_tool_path" -u -e -dl Local -dr Remote \
                "$LOCAL" "$REMOTE" "$MERGED"
-       check_unchanged
 }
 
 translate_merge_tool_path() {
index 05b443394ba166a82a22abfcf27865b4627405e2..ce5b8e9f296233470d18feae929772235e4f12f2 100644 (file)
@@ -1,25 +1,23 @@
 diff_cmd () {
        "$merge_tool_path" \
                -R 'Accel.Search: "Ctrl+F"' \
-               -R 'Accel.SearchForward: "Ctrl-G"' \
+               -R 'Accel.SearchForward: "Ctrl+G"' \
                "$LOCAL" "$REMOTE"
 }
 
 merge_cmd () {
-       touch "$BACKUP"
        if $base_present
        then
                "$merge_tool_path" -X --show-merged-pane \
-                       -R 'Accel.SaveAsMerged: "Ctrl-S"' \
+                       -R 'Accel.SaveAsMerged: "Ctrl+S"' \
                        -R 'Accel.Search: "Ctrl+F"' \
-                       -R 'Accel.SearchForward: "Ctrl-G"' \
+                       -R 'Accel.SearchForward: "Ctrl+G"' \
                        --merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
        else
                "$merge_tool_path" -X $extra \
-                       -R 'Accel.SaveAsMerged: "Ctrl-S"' \
+                       -R 'Accel.SaveAsMerged: "Ctrl+S"' \
                        -R 'Accel.Search: "Ctrl+F"' \
-                       -R 'Accel.SearchForward: "Ctrl-G"' \
+                       -R 'Accel.SearchForward: "Ctrl+G"' \
                        --merged-file "$MERGED" "$LOCAL" "$REMOTE"
        fi
-       check_unchanged
 }
index 6d9f23e932559c58c9ebf4679a6035889f726ed2..39309efb7f9e21eb7a039b6b17cdb0d9f1859820 100644 (file)
@@ -23,15 +23,21 @@ static int dir_entry_cmp(const struct dir_entry *e1,
                        name ? name : e2->name, e1->namelen);
 }
 
-static struct dir_entry *find_dir_entry(struct index_state *istate,
-               const char *name, unsigned int namelen)
+static struct dir_entry *find_dir_entry__hash(struct index_state *istate,
+               const char *name, unsigned int namelen, unsigned int hash)
 {
        struct dir_entry key;
-       hashmap_entry_init(&key, memihash(name, namelen));
+       hashmap_entry_init(&key, hash);
        key.namelen = namelen;
        return hashmap_get(&istate->dir_hash, &key, name);
 }
 
+static struct dir_entry *find_dir_entry(struct index_state *istate,
+               const char *name, unsigned int namelen)
+{
+       return find_dir_entry__hash(istate, name, namelen, memihash(name, namelen));
+}
+
 static struct dir_entry *hash_dir_entry(struct index_state *istate,
                struct cache_entry *ce, int namelen)
 {
@@ -112,20 +118,495 @@ static int cache_entry_cmp(const struct cache_entry *ce1,
        return remove ? !(ce1 == ce2) : 0;
 }
 
-static void lazy_init_name_hash(struct index_state *istate)
+static int lazy_try_threaded = 1;
+static int lazy_nr_dir_threads;
+
+#ifdef NO_PTHREADS
+
+static inline int lookup_lazy_params(struct index_state *istate)
 {
-       int nr;
+       return 0;
+}
+
+static inline void threaded_lazy_init_name_hash(
+       struct index_state *istate)
+{
+}
+
+#else
+
+#include "thread-utils.h"
+
+/*
+ * Set a minimum number of cache_entries that we will handle per
+ * thread and use that to decide how many threads to run (upto
+ * the number on the system).
+ *
+ * For guidance setting the lower per-thread bound, see:
+ *     t/helper/test-lazy-init-name-hash --analyze
+ */
+#define LAZY_THREAD_COST (2000)
+
+/*
+ * We use n mutexes to guard n partitions of the "istate->dir_hash"
+ * hashtable.  Since "find" and "insert" operations will hash to a
+ * particular bucket and modify/search a single chain, we can say
+ * that "all chains mod n" are guarded by the same mutex -- rather
+ * than having a single mutex to guard the entire table.  (This does
+ * require that we disable "rehashing" on the hashtable.)
+ *
+ * So, a larger value here decreases the probability of a collision
+ * and the time that each thread must wait for the mutex.
+ */
+#define LAZY_MAX_MUTEX   (32)
+
+static pthread_mutex_t *lazy_dir_mutex_array;
+
+/*
+ * An array of lazy_entry items is used by the n threads in
+ * the directory parse (first) phase to (lock-free) store the
+ * intermediate results.  These values are then referenced by
+ * the 2 threads in the second phase.
+ */
+struct lazy_entry {
+       struct dir_entry *dir;
+       unsigned int hash_dir;
+       unsigned int hash_name;
+};
+
+/*
+ * Decide if we want to use threads (if available) to load
+ * the hash tables.  We set "lazy_nr_dir_threads" to zero when
+ * it is not worth it.
+ */
+static int lookup_lazy_params(struct index_state *istate)
+{
+       int nr_cpus;
+
+       lazy_nr_dir_threads = 0;
+
+       if (!lazy_try_threaded)
+               return 0;
+
+       /*
+        * If we are respecting case, just use the original
+        * code to build the "istate->name_hash".  We don't
+        * need the complexity here.
+        */
+       if (!ignore_case)
+               return 0;
+
+       nr_cpus = online_cpus();
+       if (nr_cpus < 2)
+               return 0;
+
+       if (istate->cache_nr < 2 * LAZY_THREAD_COST)
+               return 0;
+
+       if (istate->cache_nr < nr_cpus * LAZY_THREAD_COST)
+               nr_cpus = istate->cache_nr / LAZY_THREAD_COST;
+       lazy_nr_dir_threads = nr_cpus;
+       return lazy_nr_dir_threads;
+}
+
+/*
+ * Initialize n mutexes for use when searching and inserting
+ * into "istate->dir_hash".  All "dir" threads are trying
+ * to insert partial pathnames into the hash as they iterate
+ * over their portions of the index, so lock contention is
+ * high.
+ *
+ * However, the hashmap is going to put items into bucket
+ * chains based on their hash values.  Use that to create n
+ * mutexes and lock on mutex[bucket(hash) % n].  This will
+ * decrease the collision rate by (hopefully) by a factor of n.
+ */
+static void init_dir_mutex(void)
+{
+       int j;
+
+       lazy_dir_mutex_array = xcalloc(LAZY_MAX_MUTEX, sizeof(pthread_mutex_t));
+
+       for (j = 0; j < LAZY_MAX_MUTEX; j++)
+               init_recursive_mutex(&lazy_dir_mutex_array[j]);
+}
+
+static void cleanup_dir_mutex(void)
+{
+       int j;
+
+       for (j = 0; j < LAZY_MAX_MUTEX; j++)
+               pthread_mutex_destroy(&lazy_dir_mutex_array[j]);
+
+       free(lazy_dir_mutex_array);
+}
+
+static void lock_dir_mutex(int j)
+{
+       pthread_mutex_lock(&lazy_dir_mutex_array[j]);
+}
+
+static void unlock_dir_mutex(int j)
+{
+       pthread_mutex_unlock(&lazy_dir_mutex_array[j]);
+}
+
+static inline int compute_dir_lock_nr(
+       const struct hashmap *map,
+       unsigned int hash)
+{
+       return hashmap_bucket(map, hash) % LAZY_MAX_MUTEX;
+}
+
+static struct dir_entry *hash_dir_entry_with_parent_and_prefix(
+       struct index_state *istate,
+       struct dir_entry *parent,
+       struct strbuf *prefix)
+{
+       struct dir_entry *dir;
+       unsigned int hash;
+       int lock_nr;
+
+       /*
+        * Either we have a parent directory and path with slash(es)
+        * or the directory is an immediate child of the root directory.
+        */
+       assert((parent != NULL) ^ (strchr(prefix->buf, '/') == NULL));
+
+       if (parent)
+               hash = memihash_cont(parent->ent.hash,
+                       prefix->buf + parent->namelen,
+                       prefix->len - parent->namelen);
+       else
+               hash = memihash(prefix->buf, prefix->len);
+
+       lock_nr = compute_dir_lock_nr(&istate->dir_hash, hash);
+       lock_dir_mutex(lock_nr);
+
+       dir = find_dir_entry__hash(istate, prefix->buf, prefix->len, hash);
+       if (!dir) {
+               FLEX_ALLOC_MEM(dir, name, prefix->buf, prefix->len);
+               hashmap_entry_init(dir, hash);
+               dir->namelen = prefix->len;
+               dir->parent = parent;
+               hashmap_add(&istate->dir_hash, dir);
+
+               if (parent) {
+                       unlock_dir_mutex(lock_nr);
+
+                       /* All I really need here is an InterlockedIncrement(&(parent->nr)) */
+                       lock_nr = compute_dir_lock_nr(&istate->dir_hash, parent->ent.hash);
+                       lock_dir_mutex(lock_nr);
+                       parent->nr++;
+               }
+       }
+
+       unlock_dir_mutex(lock_nr);
 
+       return dir;
+}
+
+/*
+ * handle_range_1() and handle_range_dir() are derived from
+ * clear_ce_flags_1() and clear_ce_flags_dir() in unpack-trees.c
+ * and handle the iteration over the entire array of index entries.
+ * They use recursion for adjacent entries in the same parent
+ * directory.
+ */
+static int handle_range_1(
+       struct index_state *istate,
+       int k_start,
+       int k_end,
+       struct dir_entry *parent,
+       struct strbuf *prefix,
+       struct lazy_entry *lazy_entries);
+
+static int handle_range_dir(
+       struct index_state *istate,
+       int k_start,
+       int k_end,
+       struct dir_entry *parent,
+       struct strbuf *prefix,
+       struct lazy_entry *lazy_entries,
+       struct dir_entry **dir_new_out)
+{
+       int rc, k;
+       int input_prefix_len = prefix->len;
+       struct dir_entry *dir_new;
+
+       dir_new = hash_dir_entry_with_parent_and_prefix(istate, parent, prefix);
+
+       strbuf_addch(prefix, '/');
+
+       /*
+        * Scan forward in the index array for index entries having the same
+        * path prefix (that are also in this directory).
+        */
+       if (k_start + 1 >= k_end)
+               k = k_end;
+       else if (strncmp(istate->cache[k_start + 1]->name, prefix->buf, prefix->len) > 0)
+               k = k_start + 1;
+       else if (strncmp(istate->cache[k_end - 1]->name, prefix->buf, prefix->len) == 0)
+               k = k_end;
+       else {
+               int begin = k_start;
+               int end = k_end;
+               while (begin < end) {
+                       int mid = (begin + end) >> 1;
+                       int cmp = strncmp(istate->cache[mid]->name, prefix->buf, prefix->len);
+                       if (cmp == 0) /* mid has same prefix; look in second part */
+                               begin = mid + 1;
+                       else if (cmp > 0) /* mid is past group; look in first part */
+                               end = mid;
+                       else
+                               die("cache entry out of order");
+               }
+               k = begin;
+       }
+
+       /*
+        * Recurse and process what we can of this subset [k_start, k).
+        */
+       rc = handle_range_1(istate, k_start, k, dir_new, prefix, lazy_entries);
+
+       strbuf_setlen(prefix, input_prefix_len);
+
+       *dir_new_out = dir_new;
+       return rc;
+}
+
+static int handle_range_1(
+       struct index_state *istate,
+       int k_start,
+       int k_end,
+       struct dir_entry *parent,
+       struct strbuf *prefix,
+       struct lazy_entry *lazy_entries)
+{
+       int input_prefix_len = prefix->len;
+       int k = k_start;
+
+       while (k < k_end) {
+               struct cache_entry *ce_k = istate->cache[k];
+               const char *name, *slash;
+
+               if (prefix->len && strncmp(ce_k->name, prefix->buf, prefix->len))
+                       break;
+
+               name = ce_k->name + prefix->len;
+               slash = strchr(name, '/');
+
+               if (slash) {
+                       int len = slash - name;
+                       int processed;
+                       struct dir_entry *dir_new;
+
+                       strbuf_add(prefix, name, len);
+                       processed = handle_range_dir(istate, k, k_end, parent, prefix, lazy_entries, &dir_new);
+                       if (processed) {
+                               k += processed;
+                               strbuf_setlen(prefix, input_prefix_len);
+                               continue;
+                       }
+
+                       strbuf_addch(prefix, '/');
+                       processed = handle_range_1(istate, k, k_end, dir_new, prefix, lazy_entries);
+                       k += processed;
+                       strbuf_setlen(prefix, input_prefix_len);
+                       continue;
+               }
+
+               /*
+                * It is too expensive to take a lock to insert "ce_k"
+                * into "istate->name_hash" and increment the ref-count
+                * on the "parent" dir.  So we defer actually updating
+                * permanent data structures until phase 2 (where we
+                * can change the locking requirements) and simply
+                * accumulate our current results into the lazy_entries
+                * data array).
+                *
+                * We do not need to lock the lazy_entries array because
+                * we have exclusive access to the cells in the range
+                * [k_start,k_end) that this thread was given.
+                */
+               lazy_entries[k].dir = parent;
+               if (parent) {
+                       lazy_entries[k].hash_name = memihash_cont(
+                               parent->ent.hash,
+                               ce_k->name + parent->namelen,
+                               ce_namelen(ce_k) - parent->namelen);
+                       lazy_entries[k].hash_dir = parent->ent.hash;
+               } else {
+                       lazy_entries[k].hash_name = memihash(ce_k->name, ce_namelen(ce_k));
+               }
+
+               k++;
+       }
+
+       return k - k_start;
+}
+
+struct lazy_dir_thread_data {
+       pthread_t pthread;
+       struct index_state *istate;
+       struct lazy_entry *lazy_entries;
+       int k_start;
+       int k_end;
+};
+
+static void *lazy_dir_thread_proc(void *_data)
+{
+       struct lazy_dir_thread_data *d = _data;
+       struct strbuf prefix = STRBUF_INIT;
+       handle_range_1(d->istate, d->k_start, d->k_end, NULL, &prefix, d->lazy_entries);
+       strbuf_release(&prefix);
+       return NULL;
+}
+
+struct lazy_name_thread_data {
+       pthread_t pthread;
+       struct index_state *istate;
+       struct lazy_entry *lazy_entries;
+};
+
+static void *lazy_name_thread_proc(void *_data)
+{
+       struct lazy_name_thread_data *d = _data;
+       int k;
+
+       for (k = 0; k < d->istate->cache_nr; k++) {
+               struct cache_entry *ce_k = d->istate->cache[k];
+               ce_k->ce_flags |= CE_HASHED;
+               hashmap_entry_init(ce_k, d->lazy_entries[k].hash_name);
+               hashmap_add(&d->istate->name_hash, ce_k);
+       }
+
+       return NULL;
+}
+
+static inline void lazy_update_dir_ref_counts(
+       struct index_state *istate,
+       struct lazy_entry *lazy_entries)
+{
+       int k;
+
+       for (k = 0; k < istate->cache_nr; k++) {
+               if (lazy_entries[k].dir)
+                       lazy_entries[k].dir->nr++;
+       }
+}
+
+static void threaded_lazy_init_name_hash(
+       struct index_state *istate)
+{
+       int nr_each;
+       int k_start;
+       int t;
+       struct lazy_entry *lazy_entries;
+       struct lazy_dir_thread_data *td_dir;
+       struct lazy_name_thread_data *td_name;
+
+       k_start = 0;
+       nr_each = DIV_ROUND_UP(istate->cache_nr, lazy_nr_dir_threads);
+
+       lazy_entries = xcalloc(istate->cache_nr, sizeof(struct lazy_entry));
+       td_dir = xcalloc(lazy_nr_dir_threads, sizeof(struct lazy_dir_thread_data));
+       td_name = xcalloc(1, sizeof(struct lazy_name_thread_data));
+
+       init_dir_mutex();
+
+       /*
+        * Phase 1:
+        * Build "istate->dir_hash" using n "dir" threads (and a read-only index).
+        */
+       for (t = 0; t < lazy_nr_dir_threads; t++) {
+               struct lazy_dir_thread_data *td_dir_t = td_dir + t;
+               td_dir_t->istate = istate;
+               td_dir_t->lazy_entries = lazy_entries;
+               td_dir_t->k_start = k_start;
+               k_start += nr_each;
+               if (k_start > istate->cache_nr)
+                       k_start = istate->cache_nr;
+               td_dir_t->k_end = k_start;
+               if (pthread_create(&td_dir_t->pthread, NULL, lazy_dir_thread_proc, td_dir_t))
+                       die("unable to create lazy_dir_thread");
+       }
+       for (t = 0; t < lazy_nr_dir_threads; t++) {
+               struct lazy_dir_thread_data *td_dir_t = td_dir + t;
+               if (pthread_join(td_dir_t->pthread, NULL))
+                       die("unable to join lazy_dir_thread");
+       }
+
+       /*
+        * Phase 2:
+        * Iterate over all index entries and add them to the "istate->name_hash"
+        * using a single "name" background thread.
+        * (Testing showed it wasn't worth running more than 1 thread for this.)
+        *
+        * Meanwhile, finish updating the parent directory ref-counts for each
+        * index entry using the current thread.  (This step is very fast and
+        * doesn't need threading.)
+        */
+       td_name->istate = istate;
+       td_name->lazy_entries = lazy_entries;
+       if (pthread_create(&td_name->pthread, NULL, lazy_name_thread_proc, td_name))
+               die("unable to create lazy_name_thread");
+
+       lazy_update_dir_ref_counts(istate, lazy_entries);
+
+       if (pthread_join(td_name->pthread, NULL))
+               die("unable to join lazy_name_thread");
+
+       cleanup_dir_mutex();
+
+       free(td_name);
+       free(td_dir);
+       free(lazy_entries);
+}
+
+#endif
+
+static void lazy_init_name_hash(struct index_state *istate)
+{
        if (istate->name_hash_initialized)
                return;
        hashmap_init(&istate->name_hash, (hashmap_cmp_fn) cache_entry_cmp,
                        istate->cache_nr);
-       hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp, 0);
-       for (nr = 0; nr < istate->cache_nr; nr++)
-               hash_index_entry(istate, istate->cache[nr]);
+       hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp,
+                       istate->cache_nr);
+
+       if (lookup_lazy_params(istate)) {
+               hashmap_disallow_rehash(&istate->dir_hash, 1);
+               threaded_lazy_init_name_hash(istate);
+               hashmap_disallow_rehash(&istate->dir_hash, 0);
+       } else {
+               int nr;
+               for (nr = 0; nr < istate->cache_nr; nr++)
+                       hash_index_entry(istate, istate->cache[nr]);
+       }
+
        istate->name_hash_initialized = 1;
 }
 
+/*
+ * A test routine for t/helper/ sources.
+ *
+ * Returns the number of threads used or 0 when
+ * the non-threaded code path was used.
+ *
+ * Requesting threading WILL NOT override guards
+ * in lookup_lazy_params().
+ */
+int test_lazy_init_name_hash(struct index_state *istate, int try_threaded)
+{
+       lazy_nr_dir_threads = 0;
+       lazy_try_threaded = try_threaded;
+
+       lazy_init_name_hash(istate);
+
+       return lazy_nr_dir_threads;
+}
+
 void add_name_hash(struct index_state *istate, struct cache_entry *ce)
 {
        if (istate->name_hash_initialized)
index 97fc42f64bcd7a46d4f7818b4ad96ee6622fbec1..32caaaff7477d3640c81a19c54c1c92ffb8ca8b1 100644 (file)
@@ -12,7 +12,7 @@
 #include "notes-utils.h"
 
 struct notes_merge_pair {
-       unsigned char obj[20], base[20], local[20], remote[20];
+       struct object_id obj, base, local, remote;
 };
 
 void init_notes_merge_options(struct notes_merge_options *o)
@@ -75,7 +75,7 @@ static struct notes_merge_pair *find_notes_merge_pair_pos(
        int i = last_index < len ? last_index : len - 1;
        int prev_cmp = 0, cmp = -1;
        while (i >= 0 && i < len) {
-               cmp = hashcmp(obj, list[i].obj);
+               cmp = hashcmp(obj, list[i].obj.hash);
                if (!cmp) /* obj belongs @ i */
                        break;
                else if (cmp < 0 && prev_cmp <= 0) /* obj belongs < i */
@@ -108,9 +108,10 @@ static struct notes_merge_pair *find_notes_merge_pair_pos(
        return list + i;
 }
 
-static unsigned char uninitialized[20] =
+static struct object_id uninitialized = {
        "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
-       "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
+       "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
+};
 
 static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
                                                 const unsigned char *base,
@@ -149,25 +150,25 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
                mp = find_notes_merge_pair_pos(changes, len, obj, 1, &occupied);
                if (occupied) {
                        /* We've found an addition/deletion pair */
-                       assert(!hashcmp(mp->obj, obj));
+                       assert(!hashcmp(mp->obj.hash, obj));
                        if (is_null_oid(&p->one->oid)) { /* addition */
-                               assert(is_null_sha1(mp->remote));
-                               hashcpy(mp->remote, p->two->oid.hash);
+                               assert(is_null_oid(&mp->remote));
+                               oidcpy(&mp->remote, &p->two->oid);
                        } else if (is_null_oid(&p->two->oid)) { /* deletion */
-                               assert(is_null_sha1(mp->base));
-                               hashcpy(mp->base, p->one->oid.hash);
+                               assert(is_null_oid(&mp->base));
+                               oidcpy(&mp->base, &p->one->oid);
                        } else
                                assert(!"Invalid existing change recorded");
                } else {
-                       hashcpy(mp->obj, obj);
-                       hashcpy(mp->base, p->one->oid.hash);
-                       hashcpy(mp->local, uninitialized);
-                       hashcpy(mp->remote, p->two->oid.hash);
+                       hashcpy(mp->obj.hash, obj);
+                       oidcpy(&mp->base, &p->one->oid);
+                       oidcpy(&mp->local, &uninitialized);
+                       oidcpy(&mp->remote, &p->two->oid);
                        len++;
                }
                trace_printf("\t\tStored remote change for %s: %.7s -> %.7s\n",
-                      sha1_to_hex(mp->obj), sha1_to_hex(mp->base),
-                      sha1_to_hex(mp->remote));
+                      oid_to_hex(&mp->obj), oid_to_hex(&mp->base),
+                      oid_to_hex(&mp->remote));
        }
        diff_flush(&opt);
        clear_pathspec(&opt.pathspec);
@@ -216,7 +217,7 @@ static void diff_tree_local(struct notes_merge_options *o,
                        continue;
                }
 
-               assert(!hashcmp(mp->obj, obj));
+               assert(!hashcmp(mp->obj.hash, obj));
                if (is_null_oid(&p->two->oid)) { /* deletion */
                        /*
                         * Either this is a true deletion (1), or it is part
@@ -227,8 +228,8 @@ static void diff_tree_local(struct notes_merge_options *o,
                         * (3) mp->local is uninitialized; set it to null_sha1
                         *     (will be overwritten by following addition)
                         */
-                       if (!hashcmp(mp->local, uninitialized))
-                               hashclr(mp->local);
+                       if (!oidcmp(&mp->local, &uninitialized))
+                               oidclr(&mp->local);
                } else if (is_null_oid(&p->one->oid)) { /* addition */
                        /*
                         * Either this is a true addition (1), or it is part
@@ -238,22 +239,22 @@ static void diff_tree_local(struct notes_merge_options *o,
                         * (2) mp->local is uninitialized; set to p->two->sha1
                         * (3) mp->local is null_sha1;     set to p->two->sha1
                         */
-                       assert(is_null_sha1(mp->local) ||
-                              !hashcmp(mp->local, uninitialized));
-                       hashcpy(mp->local, p->two->oid.hash);
+                       assert(is_null_oid(&mp->local) ||
+                              !oidcmp(&mp->local, &uninitialized));
+                       oidcpy(&mp->local, &p->two->oid);
                } else { /* modification */
                        /*
                         * This is a true modification. p->one->sha1 shall
                         * match mp->base, and mp->local shall be uninitialized.
                         * Set mp->local to p->two->sha1.
                         */
-                       assert(!hashcmp(p->one->oid.hash, mp->base));
-                       assert(!hashcmp(mp->local, uninitialized));
-                       hashcpy(mp->local, p->two->oid.hash);
+                       assert(!oidcmp(&p->one->oid, &mp->base));
+                       assert(!oidcmp(&mp->local, &uninitialized));
+                       oidcpy(&mp->local, &p->two->oid);
                }
                trace_printf("\t\tStored local change for %s: %.7s -> %.7s\n",
-                      sha1_to_hex(mp->obj), sha1_to_hex(mp->base),
-                      sha1_to_hex(mp->local));
+                      oid_to_hex(&mp->obj), oid_to_hex(&mp->base),
+                      oid_to_hex(&mp->local));
        }
        diff_flush(&opt);
        clear_pathspec(&opt.pathspec);
@@ -269,15 +270,15 @@ static void check_notes_merge_worktree(struct notes_merge_options *o)
                if (file_exists(git_path(NOTES_MERGE_WORKTREE)) &&
                    !is_empty_dir(git_path(NOTES_MERGE_WORKTREE))) {
                        if (advice_resolve_conflict)
-                               die("You have not concluded your previous "
+                               die(_("You have not concluded your previous "
                                    "notes merge (%s exists).\nPlease, use "
                                    "'git notes merge --commit' or 'git notes "
                                    "merge --abort' to commit/abort the "
                                    "previous merge before you start a new "
-                                   "notes merge.", git_path("NOTES_MERGE_*"));
+                                   "notes merge."), git_path("NOTES_MERGE_*"));
                        else
-                               die("You have not concluded your notes merge "
-                                   "(%s exists).", git_path("NOTES_MERGE_*"));
+                               die(_("You have not concluded your notes merge "
+                                   "(%s exists)."), git_path("NOTES_MERGE_*"));
                }
 
                if (safe_create_leading_directories_const(git_path(
@@ -343,11 +344,11 @@ static int ll_merge_in_worktree(struct notes_merge_options *o,
        mmfile_t base, local, remote;
        int status;
 
-       read_mmblob(&base, p->base);
-       read_mmblob(&local, p->local);
-       read_mmblob(&remote, p->remote);
+       read_mmblob(&base, &p->base);
+       read_mmblob(&local, &p->local);
+       read_mmblob(&remote, &p->remote);
 
-       status = ll_merge(&result_buf, sha1_to_hex(p->obj), &base, NULL,
+       status = ll_merge(&result_buf, oid_to_hex(&p->obj), &base, NULL,
                          &local, o->local_ref, &remote, o->remote_ref, NULL);
 
        free(base.ptr);
@@ -357,7 +358,7 @@ static int ll_merge_in_worktree(struct notes_merge_options *o,
        if ((status < 0) || !result_buf.ptr)
                die("Failed to execute internal merge");
 
-       write_buf_to_worktree(p->obj, result_buf.ptr, result_buf.size);
+       write_buf_to_worktree(p->obj.hash, result_buf.ptr, result_buf.size);
        free(result_buf.ptr);
 
        return status;
@@ -372,51 +373,52 @@ static int merge_one_change_manual(struct notes_merge_options *o,
 
        trace_printf("\t\t\tmerge_one_change_manual(obj = %.7s, base = %.7s, "
               "local = %.7s, remote = %.7s)\n",
-              sha1_to_hex(p->obj), sha1_to_hex(p->base),
-              sha1_to_hex(p->local), sha1_to_hex(p->remote));
+              oid_to_hex(&p->obj), oid_to_hex(&p->base),
+              oid_to_hex(&p->local), oid_to_hex(&p->remote));
 
        /* add "Conflicts:" section to commit message first time through */
        if (!o->has_worktree)
                strbuf_addstr(&(o->commit_msg), "\n\nConflicts:\n");
 
-       strbuf_addf(&(o->commit_msg), "\t%s\n", sha1_to_hex(p->obj));
+       strbuf_addf(&(o->commit_msg), "\t%s\n", oid_to_hex(&p->obj));
 
        if (o->verbosity >= 2)
-               printf("Auto-merging notes for %s\n", sha1_to_hex(p->obj));
+               printf("Auto-merging notes for %s\n", oid_to_hex(&p->obj));
        check_notes_merge_worktree(o);
-       if (is_null_sha1(p->local)) {
+       if (is_null_oid(&p->local)) {
                /* D/F conflict, checkout p->remote */
-               assert(!is_null_sha1(p->remote));
+               assert(!is_null_oid(&p->remote));
                if (o->verbosity >= 1)
                        printf("CONFLICT (delete/modify): Notes for object %s "
                                "deleted in %s and modified in %s. Version from %s "
                                "left in tree.\n",
-                               sha1_to_hex(p->obj), lref, rref, rref);
-               write_note_to_worktree(p->obj, p->remote);
-       } else if (is_null_sha1(p->remote)) {
+                               oid_to_hex(&p->obj), lref, rref, rref);
+               write_note_to_worktree(p->obj.hash, p->remote.hash);
+       } else if (is_null_oid(&p->remote)) {
                /* D/F conflict, checkout p->local */
-               assert(!is_null_sha1(p->local));
+               assert(!is_null_oid(&p->local));
                if (o->verbosity >= 1)
                        printf("CONFLICT (delete/modify): Notes for object %s "
                                "deleted in %s and modified in %s. Version from %s "
                                "left in tree.\n",
-                               sha1_to_hex(p->obj), rref, lref, lref);
-               write_note_to_worktree(p->obj, p->local);
+                               oid_to_hex(&p->obj), rref, lref, lref);
+               write_note_to_worktree(p->obj.hash, p->local.hash);
        } else {
                /* "regular" conflict, checkout result of ll_merge() */
                const char *reason = "content";
-               if (is_null_sha1(p->base))
+               if (is_null_oid(&p->base))
                        reason = "add/add";
-               assert(!is_null_sha1(p->local));
-               assert(!is_null_sha1(p->remote));
+               assert(!is_null_oid(&p->local));
+               assert(!is_null_oid(&p->remote));
                if (o->verbosity >= 1)
                        printf("CONFLICT (%s): Merge conflict in notes for "
-                               "object %s\n", reason, sha1_to_hex(p->obj));
+                               "object %s\n", reason,
+                               oid_to_hex(&p->obj));
                ll_merge_in_worktree(o, p);
        }
 
        trace_printf("\t\t\tremoving from partial merge result\n");
-       remove_note(t, p->obj);
+       remove_note(t, p->obj.hash);
 
        return 1;
 }
@@ -435,29 +437,29 @@ static int merge_one_change(struct notes_merge_options *o,
        case NOTES_MERGE_RESOLVE_OURS:
                if (o->verbosity >= 2)
                        printf("Using local notes for %s\n",
-                                               sha1_to_hex(p->obj));
+                                               oid_to_hex(&p->obj));
                /* nothing to do */
                return 0;
        case NOTES_MERGE_RESOLVE_THEIRS:
                if (o->verbosity >= 2)
                        printf("Using remote notes for %s\n",
-                                               sha1_to_hex(p->obj));
-               if (add_note(t, p->obj, p->remote, combine_notes_overwrite))
+                                               oid_to_hex(&p->obj));
+               if (add_note(t, p->obj.hash, p->remote.hash, combine_notes_overwrite))
                        die("BUG: combine_notes_overwrite failed");
                return 0;
        case NOTES_MERGE_RESOLVE_UNION:
                if (o->verbosity >= 2)
                        printf("Concatenating local and remote notes for %s\n",
-                                                       sha1_to_hex(p->obj));
-               if (add_note(t, p->obj, p->remote, combine_notes_concatenate))
+                                                       oid_to_hex(&p->obj));
+               if (add_note(t, p->obj.hash, p->remote.hash, combine_notes_concatenate))
                        die("failed to concatenate notes "
                            "(combine_notes_concatenate)");
                return 0;
        case NOTES_MERGE_RESOLVE_CAT_SORT_UNIQ:
                if (o->verbosity >= 2)
                        printf("Concatenating unique lines in local and remote "
-                               "notes for %s\n", sha1_to_hex(p->obj));
-               if (add_note(t, p->obj, p->remote, combine_notes_cat_sort_uniq))
+                               "notes for %s\n", oid_to_hex(&p->obj));
+               if (add_note(t, p->obj.hash, p->remote.hash, combine_notes_cat_sort_uniq))
                        die("failed to concatenate notes "
                            "(combine_notes_cat_sort_uniq)");
                return 0;
@@ -475,20 +477,21 @@ static int merge_changes(struct notes_merge_options *o,
        for (i = 0; i < *num_changes; i++) {
                struct notes_merge_pair *p = changes + i;
                trace_printf("\t\t%.7s: %.7s -> %.7s/%.7s\n",
-                      sha1_to_hex(p->obj), sha1_to_hex(p->base),
-                      sha1_to_hex(p->local), sha1_to_hex(p->remote));
+                      oid_to_hex(&p->obj), oid_to_hex(&p->base),
+                      oid_to_hex(&p->local),
+                      oid_to_hex(&p->remote));
 
-               if (!hashcmp(p->base, p->remote)) {
+               if (!oidcmp(&p->base, &p->remote)) {
                        /* no remote change; nothing to do */
                        trace_printf("\t\t\tskipping (no remote change)\n");
-               } else if (!hashcmp(p->local, p->remote)) {
+               } else if (!oidcmp(&p->local, &p->remote)) {
                        /* same change in local and remote; nothing to do */
                        trace_printf("\t\t\tskipping (local == remote)\n");
-               } else if (!hashcmp(p->local, uninitialized) ||
-                          !hashcmp(p->local, p->base)) {
+               } else if (!oidcmp(&p->local, &uninitialized) ||
+                          !oidcmp(&p->local, &p->base)) {
                        /* no local change; adopt remote change */
                        trace_printf("\t\t\tno local change, adopted remote\n");
-                       if (add_note(t, p->obj, p->remote,
+                       if (add_note(t, p->obj.hash, p->remote.hash,
                                     combine_notes_overwrite))
                                die("BUG: combine_notes_overwrite failed");
                } else {
@@ -673,7 +676,7 @@ int notes_merge_commit(struct notes_merge_options *o,
        const char *msg = strstr(buffer, "\n\n");
        int baselen;
 
-       strbuf_addstr(&path, git_path(NOTES_MERGE_WORKTREE));
+       git_path_buf(&path, NOTES_MERGE_WORKTREE);
        if (o->verbosity >= 3)
                printf("Committing notes in notes merge worktree at %s\n",
                        path.buf);
@@ -738,7 +741,7 @@ int notes_merge_abort(struct notes_merge_options *o)
        struct strbuf buf = STRBUF_INIT;
        int ret;
 
-       strbuf_addstr(&buf, git_path(NOTES_MERGE_WORKTREE));
+       git_path_buf(&buf, NOTES_MERGE_WORKTREE);
        if (o->verbosity >= 3)
                printf("Removing notes merge worktree at %s/*\n", buf.buf);
        ret = remove_dir_recursively(&buf, REMOVE_DIR_KEEP_TOPLEVEL);
index 24a33616a47737e6ae8cf917080cbb314dcf2762..8f9ad7d1f85015cafc9175408d8264d08ea9581f 100644 (file)
@@ -132,8 +132,11 @@ struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd)
                c->mode_from_env = 1;
                c->combine = parse_combine_notes_fn(rewrite_mode_env);
                if (!c->combine)
-                       /* TRANSLATORS: The first %s is the name of the
-                          environment variable, the second %s is its value */
+                       /*
+                        * TRANSLATORS: The first %s is the name of
+                        * the environment variable, the second %s is
+                        * its value.
+                        */
                        error(_("Bad %s value: '%s'"), GIT_NOTES_REWRITE_MODE_ENVIRONMENT,
                                        rewrite_mode_env);
        }
diff --git a/notes.c b/notes.c
index df4660fe62ae64356950ca51c1acead0398f93f1..542563b280ad305da1452d57653728b9005874e6 100644 (file)
--- a/notes.c
+++ b/notes.c
@@ -153,8 +153,8 @@ static struct leaf_node *note_tree_find(struct notes_tree *t,
  * How to consolidate an int_node:
  * If there are > 1 non-NULL entries, give up and return non-zero.
  * Otherwise replace the int_node at the given index in the given parent node
- * with the only entry (or a NULL entry if no entries) from the given tree,
- * and return 0.
+ * with the only NOTE entry (or a NULL entry if no entries) from the given
+ * tree, and return 0.
  */
 static int note_tree_consolidate(struct int_node *tree,
        struct int_node *parent, unsigned char index)
@@ -173,6 +173,8 @@ static int note_tree_consolidate(struct int_node *tree,
                }
        }
 
+       if (p && (GET_PTR_TYPE(p) != PTR_TYPE_NOTE))
+               return -2;
        /* replace tree with p in parent[index] */
        parent->a[index] = p;
        free(tree);
@@ -993,7 +995,7 @@ const char *default_notes_ref(void)
 void init_notes(struct notes_tree *t, const char *notes_ref,
                combine_notes_fn combine_notes, int flags)
 {
-       unsigned char sha1[20], object_sha1[20];
+       struct object_id oid, object_oid;
        unsigned mode;
        struct leaf_node root_tree;
 
@@ -1017,16 +1019,16 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
        t->dirty = 0;
 
        if (flags & NOTES_INIT_EMPTY || !notes_ref ||
-           get_sha1_treeish(notes_ref, object_sha1))
+           get_sha1_treeish(notes_ref, object_oid.hash))
                return;
-       if (flags & NOTES_INIT_WRITABLE && read_ref(notes_ref, object_sha1))
+       if (flags & NOTES_INIT_WRITABLE && read_ref(notes_ref, object_oid.hash))
                die("Cannot use notes ref %s", notes_ref);
-       if (get_tree_entry(object_sha1, "", sha1, &mode))
+       if (get_tree_entry(object_oid.hash, "", oid.hash, &mode))
                die("Failed to read notes tree referenced by %s (%s)",
-                   notes_ref, sha1_to_hex(object_sha1));
+                   notes_ref, oid_to_hex(&object_oid));
 
        hashclr(root_tree.key_sha1);
-       hashcpy(root_tree.val_sha1, sha1);
+       hashcpy(root_tree.val_sha1, oid.hash);
        load_subtree(t, &root_tree, t->root, 0);
 }
 
index 67d9a9e2211fc2f6ab5772bfe58e42a2a95e469d..e680d881a45756eb234a80a9909c24a7b146c1f7 100644 (file)
--- a/object.c
+++ b/object.c
@@ -104,9 +104,7 @@ struct object *lookup_object(const unsigned char *sha1)
                 * that we do not need to walk the hash table the next
                 * time we look for it.
                 */
-               struct object *tmp = obj_hash[i];
-               obj_hash[i] = obj_hash[first];
-               obj_hash[first] = tmp;
+               SWAP(obj_hash[i], obj_hash[first]);
        }
        return obj;
 }
index f8b644263ff7e3b244bc1804b8527f87f7dbcf84..f52957dcb34a3340de2d398014ad4605e7620360 100644 (file)
--- a/object.h
+++ b/object.h
@@ -29,9 +29,9 @@ struct object_array {
 /*
  * object flag allocation:
  * revision.h:      0---------10                                26
- * fetch-pack.c:    0---4
+ * fetch-pack.c:    0---5
  * walker.c:        0-2
- * upload-pack.c:               11----------------19
+ * upload-pack.c:       4       11----------------19
  * builtin/blame.c:               12-13
  * bisect.c:                               16
  * bundle.c:                               16
diff --git a/oidset.c b/oidset.c
new file mode 100644 (file)
index 0000000..ac169f0
--- /dev/null
+++ b/oidset.c
@@ -0,0 +1,49 @@
+#include "cache.h"
+#include "oidset.h"
+
+struct oidset_entry {
+       struct hashmap_entry hash;
+       struct object_id oid;
+};
+
+static int oidset_hashcmp(const void *va, const void *vb,
+                         const void *vkey)
+{
+       const struct oidset_entry *a = va, *b = vb;
+       const struct object_id *key = vkey;
+       return oidcmp(&a->oid, key ? key : &b->oid);
+}
+
+int oidset_contains(const struct oidset *set, const struct object_id *oid)
+{
+       struct hashmap_entry key;
+
+       if (!set->map.cmpfn)
+               return 0;
+
+       hashmap_entry_init(&key, sha1hash(oid->hash));
+       return !!hashmap_get(&set->map, &key, oid);
+}
+
+int oidset_insert(struct oidset *set, const struct object_id *oid)
+{
+       struct oidset_entry *entry;
+
+       if (!set->map.cmpfn)
+               hashmap_init(&set->map, oidset_hashcmp, 0);
+
+       if (oidset_contains(set, oid))
+               return 1;
+
+       entry = xmalloc(sizeof(*entry));
+       hashmap_entry_init(&entry->hash, sha1hash(oid->hash));
+       oidcpy(&entry->oid, oid);
+
+       hashmap_add(&set->map, entry);
+       return 0;
+}
+
+void oidset_clear(struct oidset *set)
+{
+       hashmap_free(&set->map, 1);
+}
diff --git a/oidset.h b/oidset.h
new file mode 100644 (file)
index 0000000..b7eaab5
--- /dev/null
+++ b/oidset.h
@@ -0,0 +1,45 @@
+#ifndef OIDSET_H
+#define OIDSET_H
+
+/**
+ * This API is similar to sha1-array, in that it maintains a set of object ids
+ * in a memory-efficient way. The major differences are:
+ *
+ *   1. It uses a hash, so we can do online duplicate removal, rather than
+ *      sort-and-uniq at the end. This can reduce memory footprint if you have
+ *      a large list of oids with many duplicates.
+ *
+ *   2. The per-unique-oid memory footprint is slightly higher due to hash
+ *      table overhead.
+ */
+
+/**
+ * A single oidset; should be zero-initialized (or use OIDSET_INIT).
+ */
+struct oidset {
+       struct hashmap map;
+};
+
+#define OIDSET_INIT { { NULL } }
+
+/**
+ * Returns true iff `set` contains `oid`.
+ */
+int oidset_contains(const struct oidset *set, const struct object_id *oid);
+
+/**
+ * Insert the oid into the set; a copy is made, so "oid" does not need
+ * to persist after this function is called.
+ *
+ * Returns 1 if the oid was already in the set, 0 otherwise. This can be used
+ * to perform an efficient check-and-add.
+ */
+int oidset_insert(struct oidset *set, const struct object_id *oid);
+
+/**
+ * Remove all entries from the oidset, freeing any resources associated with
+ * it.
+ */
+void oidset_clear(struct oidset *set);
+
+#endif /* OIDSET_H */
index c30bcd06cbd516eb04e9b55b27b5f091ede61439..e313f4f2bc69f967ec4354e80cd62b329c7bcb21 100644 (file)
@@ -385,8 +385,7 @@ void bitmap_writer_select_commits(struct commit **indexed_commits,
 {
        unsigned int i = 0, j, next;
 
-       qsort(indexed_commits, indexed_commits_nr, sizeof(indexed_commits[0]),
-             date_compare);
+       QSORT(indexed_commits, indexed_commits_nr, date_compare);
 
        if (writer.show_progress)
                writer.progress = start_progress("Selecting bitmap commits", 0);
@@ -509,18 +508,16 @@ void bitmap_writer_finish(struct pack_idx_entry **index,
                          const char *filename,
                          uint16_t options)
 {
-       static char tmp_file[PATH_MAX];
        static uint16_t default_version = 1;
        static uint16_t flags = BITMAP_OPT_FULL_DAG;
+       struct strbuf tmp_file = STRBUF_INIT;
        struct sha1file *f;
 
        struct bitmap_disk_header header;
 
-       int fd = odb_mkstemp(tmp_file, sizeof(tmp_file), "pack/tmp_bitmap_XXXXXX");
+       int fd = odb_mkstemp(&tmp_file, "pack/tmp_bitmap_XXXXXX");
 
-       if (fd < 0)
-               die_errno("unable to create '%s'", tmp_file);
-       f = sha1fd(fd, tmp_file);
+       f = sha1fd(fd, tmp_file.buf);
 
        memcpy(header.magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE));
        header.version = htons(default_version);
@@ -540,9 +537,11 @@ void bitmap_writer_finish(struct pack_idx_entry **index,
 
        sha1close(f, NULL, CSUM_FSYNC);
 
-       if (adjust_shared_perm(tmp_file))
+       if (adjust_shared_perm(tmp_file.buf))
                die_errno("unable to make temporary bitmap file readable");
 
-       if (rename(tmp_file, filename))
+       if (rename(tmp_file.buf, filename))
                die_errno("unable to rename temporary bitmap file to '%s'", filename);
+
+       strbuf_release(&tmp_file);
 }
index b949e517167dbac6c4c347e0a2cbdf8ca2dabbcf..294cfa43a4458c6758b8ac1529e48374931b66c8 100644 (file)
@@ -266,7 +266,7 @@ static int open_pack_bitmap_1(struct packed_git *packfile)
                return -1;
 
        idx_name = pack_bitmap_filename(packfile);
-       fd = git_open_noatime(idx_name);
+       fd = git_open(idx_name);
        free(idx_name);
 
        if (fd < 0)
@@ -627,7 +627,7 @@ static void show_objects_for_type(
                        sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr);
 
                        if (bitmap_git.hashes)
-                               hash = ntohl(bitmap_git.hashes[entry->nr]);
+                               hash = get_be32(bitmap_git.hashes + entry->nr);
 
                        show_reach(sha1, object_type, 0, hash, bitmap_git.pack, entry->offset);
                }
index c5c7763323156232748314723e39deb92b93fa4e..27f70d345fbf1b339cb4bad1011253cece1bf619 100644 (file)
@@ -96,7 +96,7 @@ static int verify_packfile(struct packed_git *p,
                entries[i].offset = nth_packed_object_offset(p, i);
                entries[i].nr = i;
        }
-       qsort(entries, nr_objects, sizeof(*entries), compare_entries);
+       QSORT(entries, nr_objects, compare_entries);
 
        for (i = 0; i < nr_objects; i++) {
                void *data;
index d1b98b30ffc468421a4eb82661d037f90cf580f2..03f1191659dab55b2c4c440c347101a3cdbd4650 100644 (file)
@@ -27,6 +27,19 @@ struct object_entry {
        unsigned no_try_delta:1;
        unsigned tagged:1; /* near the very tip of refs */
        unsigned filled:1; /* assigned write-order */
+
+       /*
+        * State flags for depth-first search used for analyzing delta cycles.
+        *
+        * The depth is measured in delta-links to the base (so if A is a delta
+        * against B, then A has a depth of 1, and B a depth of 0).
+        */
+       enum {
+               DFS_NONE = 0,
+               DFS_ACTIVE,
+               DFS_DONE
+       } dfs_state;
+       int depth;
 };
 
 struct packing_data {
index 6bc7c940335cdf2d31cb38c2db6f8f6c985d3c3b..1b7ebd8d7eefbcc646867db3e52536b4aac42208 100644 (file)
@@ -59,7 +59,6 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
         * be a no-op, as everybody lands in the same zero-th bucket.
         */
        for (bits = 0; max >> bits; bits += DIGIT_SIZE) {
-               struct revindex_entry *swap;
                unsigned i;
 
                memset(pos, 0, BUCKETS * sizeof(*pos));
@@ -97,9 +96,7 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
                 * Now "to" contains the most sorted list, so we swap "from" and
                 * "to" for the next iteration.
                 */
-               swap = from;
-               from = to;
-               to = swap;
+               SWAP(from, to);
        }
 
        /*
index ea0b78813081236401efbf5f102e7f89a7d5ed7b..fa97b72559883a38be147fab737f6b7adae5975b 100644 (file)
@@ -61,8 +61,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
                        if (objects[i]->offset > last_obj_offset)
                                last_obj_offset = objects[i]->offset;
                }
-               qsort(sorted_by_sha, nr_objects, sizeof(sorted_by_sha[0]),
-                     sha1_compare);
+               QSORT(sorted_by_sha, nr_objects, sha1_compare);
        }
        else
                sorted_by_sha = list = last = NULL;
@@ -72,15 +71,15 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
                f = sha1fd_check(index_name);
        } else {
                if (!index_name) {
-                       static char tmp_file[PATH_MAX];
-                       fd = odb_mkstemp(tmp_file, sizeof(tmp_file), "pack/tmp_idx_XXXXXX");
-                       index_name = xstrdup(tmp_file);
+                       struct strbuf tmp_file = STRBUF_INIT;
+                       fd = odb_mkstemp(&tmp_file, "pack/tmp_idx_XXXXXX");
+                       index_name = strbuf_detach(&tmp_file, NULL);
                } else {
                        unlink(index_name);
                        fd = open(index_name, O_CREAT|O_EXCL|O_WRONLY, 0600);
+                       if (fd < 0)
+                               die_errno("unable to create '%s'", index_name);
                }
-               if (fd < 0)
-                       die_errno("unable to create '%s'", index_name);
                f = sha1fd(fd, index_name);
        }
 
@@ -305,7 +304,8 @@ char *index_pack_lockfile(int ip_out)
  *  - each byte afterwards: low seven bits are size continuation,
  *    with the high bit being "size continues"
  */
-int encode_in_pack_object_header(enum object_type type, uintmax_t size, unsigned char *hdr)
+int encode_in_pack_object_header(unsigned char *hdr, int hdr_len,
+                                enum object_type type, uintmax_t size)
 {
        int n = 1;
        unsigned char c;
@@ -316,6 +316,8 @@ int encode_in_pack_object_header(enum object_type type, uintmax_t size, unsigned
        c = (type << 4) | (size & 15);
        size >>= 4;
        while (size) {
+               if (n == hdr_len)
+                       die("object size is too enormous to format");
                *hdr++ = c | 0x80;
                c = size & 0x7f;
                size >>= 7;
@@ -327,11 +329,11 @@ int encode_in_pack_object_header(enum object_type type, uintmax_t size, unsigned
 
 struct sha1file *create_tmp_packfile(char **pack_tmp_name)
 {
-       char tmpname[PATH_MAX];
+       struct strbuf tmpname = STRBUF_INIT;
        int fd;
 
-       fd = odb_mkstemp(tmpname, sizeof(tmpname), "pack/tmp_pack_XXXXXX");
-       *pack_tmp_name = xstrdup(tmpname);
+       fd = odb_mkstemp(&tmpname, "pack/tmp_pack_XXXXXX");
+       *pack_tmp_name = strbuf_detach(&tmpname, NULL);
        return sha1fd(fd, *pack_tmp_name);
 }
 
diff --git a/pack.h b/pack.h
index 0e77429df5e53a753271843aa8abc16f38708ccc..5c2158746ed60f5c1d4f89dce04312e5992b959d 100644 (file)
--- a/pack.h
+++ b/pack.h
@@ -84,7 +84,14 @@ extern int verify_pack(struct packed_git *, verify_fn fn, struct progress *, uin
 extern off_t write_pack_header(struct sha1file *f, uint32_t);
 extern void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t, unsigned char *, off_t);
 extern char *index_pack_lockfile(int fd);
-extern int encode_in_pack_object_header(enum object_type, uintmax_t, unsigned char *);
+
+/*
+ * The "hdr" output buffer should be at least this big, which will handle sizes
+ * up to 2^67.
+ */
+#define MAX_PACK_OBJECT_HEADER 10
+extern int encode_in_pack_object_header(unsigned char *hdr, int hdr_len,
+                                       enum object_type, uintmax_t);
 
 #define PH_ERROR_EOF           (-1)
 #define PH_ERROR_PACK_SIGNATURE        (-2)
diff --git a/pager.c b/pager.c
index 6470b8180df7e0de51a0d71ac47f8c078d226923..c113d898a4ab184cf5ad5ea04dc66365fdf8a8f8 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -6,12 +6,8 @@
 #define DEFAULT_PAGER "less"
 #endif
 
-/*
- * This is split up from the rest of git so that we can do
- * something different on Windows.
- */
-
 static struct child_process pager_process = CHILD_PROCESS_INIT;
+static const char *pager_program;
 
 static void wait_for_pager(int in_signal)
 {
@@ -40,6 +36,13 @@ static void wait_for_pager_signal(int signo)
        raise(signo);
 }
 
+static int core_pager_config(const char *var, const char *value, void *data)
+{
+       if (!strcmp(var, "core.pager"))
+               return git_config_string(&pager_program, var, value);
+       return 0;
+}
+
 const char *git_pager(int stdout_is_tty)
 {
        const char *pager;
@@ -50,7 +53,7 @@ const char *git_pager(int stdout_is_tty)
        pager = getenv("GIT_PAGER");
        if (!pager) {
                if (!pager_program)
-                       git_config(git_default_config, NULL);
+                       read_early_config(core_pager_config, NULL);
                pager = pager_program;
        }
        if (!pager)
@@ -132,9 +135,7 @@ void setup_pager(void)
 
 int pager_in_use(void)
 {
-       const char *env;
-       env = getenv("GIT_PAGER_IN_USE");
-       return env ? git_config_bool("GIT_PAGER_IN_USE", env) : 0;
+       return git_env_bool("GIT_PAGER_IN_USE", 0);
 }
 
 /*
@@ -180,23 +181,42 @@ int decimal_width(uintmax_t number)
        return width;
 }
 
-/* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
-int check_pager_config(const char *cmd)
+struct pager_command_config_data {
+       const char *cmd;
+       int want;
+       char *value;
+};
+
+static int pager_command_config(const char *var, const char *value, void *vdata)
 {
-       int want = -1;
-       struct strbuf key = STRBUF_INIT;
-       const char *value = NULL;
-       strbuf_addf(&key, "pager.%s", cmd);
-       if (git_config_key_is_valid(key.buf) &&
-           !git_config_get_value(key.buf, &value)) {
-               int b = git_config_maybe_bool(key.buf, value);
+       struct pager_command_config_data *data = vdata;
+       const char *cmd;
+
+       if (skip_prefix(var, "pager.", &cmd) && !strcmp(cmd, data->cmd)) {
+               int b = git_config_maybe_bool(var, value);
                if (b >= 0)
-                       want = b;
+                       data->want = b;
                else {
-                       want = 1;
-                       pager_program = xstrdup(value);
+                       data->want = 1;
+                       data->value = xstrdup(value);
                }
        }
-       strbuf_release(&key);
-       return want;
+
+       return 0;
+}
+
+/* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
+int check_pager_config(const char *cmd)
+{
+       struct pager_command_config_data data;
+
+       data.cmd = cmd;
+       data.want = -1;
+       data.value = NULL;
+
+       read_early_config(pager_command_config, &data);
+
+       if (data.value)
+               pager_program = data.value;
+       return data.want;
 }
index 16818830e97e099286f3aa259378de1b8e9fc322..7419780a9b644e74107eec31d1c75156374920b8 100644 (file)
@@ -96,17 +96,17 @@ int parse_opt_commits(const struct option *opt, const char *arg, int unset)
 
 int parse_opt_object_name(const struct option *opt, const char *arg, int unset)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
 
        if (unset) {
-               sha1_array_clear(opt->value);
+               oid_array_clear(opt->value);
                return 0;
        }
        if (!arg)
                return -1;
-       if (get_sha1(arg, sha1))
+       if (get_oid(arg, &oid))
                return error(_("malformed object name '%s'"), arg);
-       sha1_array_append(opt->value, sha1);
+       oid_array_append(opt->value, &oid);
        return 0;
 }
 
@@ -158,6 +158,18 @@ int parse_opt_noop_cb(const struct option *opt, const char *arg, int unset)
        return 0;
 }
 
+/**
+ * Report that the option is unknown, so that other code can handle
+ * it. This can be used as a callback together with
+ * OPTION_LOWLEVEL_CALLBACK to allow an option to be documented in the
+ * "-h" output even if it's not being handled directly by
+ * parse_options().
+ */
+int parse_opt_unknown_cb(const struct option *opt, const char *arg, int unset)
+{
+       return -2;
+}
+
 /**
  * Recreates the command-line option in the strbuf.
  */
index 312a85dbdef5723ef805917f5a556b75a55a7041..e5ad34a2c3f7c7d7fdb65171f8a142a2becc64bb 100644 (file)
@@ -40,7 +40,7 @@ static void fix_filename(const char *prefix, const char **file)
        if (!file || !*file || !prefix || is_absolute_path(*file)
            || !strcmp("-", *file))
                return;
-       *file = xstrdup(prefix_filename(prefix, strlen(prefix), *file));
+       *file = prefix_filename(prefix, *file);
 }
 
 static int opt_command_mode_error(const struct option *opt,
@@ -589,8 +589,10 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx,
 
        fprintf_ln(outfile, _("usage: %s"), _(*usagestr++));
        while (*usagestr && **usagestr)
-               /* TRANSLATORS: the colon here should align with the
-                  one in "usage: %s" translation */
+               /*
+                * TRANSLATORS: the colon here should align with the
+                * one in "usage: %s" translation.
+                */
                fprintf_ln(outfile, _("   or: %s"), _(*usagestr++));
        while (*usagestr) {
                if (**usagestr)
@@ -661,7 +663,7 @@ void NORETURN usage_msg_opt(const char *msg,
                   const char * const *usagestr,
                   const struct option *options)
 {
-       fprintf(stderr, "%s\n\n", msg);
+       fprintf(stderr, "fatal: %s\n\n", msg);
        usage_with_options(usagestr, options);
 }
 
index 78f8384c56b02cbabcc586b3ee082cb1cb12e764..af711227ae3aac7af07de0322a364ccac03b819d 100644 (file)
@@ -228,6 +228,7 @@ extern int parse_opt_commits(const struct option *, const char *, int);
 extern int parse_opt_tertiary(const struct option *, const char *, int);
 extern int parse_opt_string_list(const struct option *, const char *, int);
 extern int parse_opt_noop_cb(const struct option *, const char *, int);
+extern int parse_opt_unknown_cb(const struct option *, const char *, int);
 extern int parse_opt_passthru(const struct option *, const char *, int);
 extern int parse_opt_passthru_argv(const struct option *, const char *, int);
 
@@ -257,7 +258,9 @@ extern int parse_opt_passthru_argv(const struct option *, const char *, int);
          PARSE_OPT_LASTARG_DEFAULT | flag, \
          parse_opt_commits, (intptr_t) "HEAD" \
        }
-#define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, 0)
-#define OPT_WITH(v, h) _OPT_CONTAINS_OR_WITH("with", v, h, PARSE_OPT_HIDDEN)
+#define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, PARSE_OPT_NONEG)
+#define OPT_NO_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("no-contains", v, h, PARSE_OPT_NONEG)
+#define OPT_WITH(v, h) _OPT_CONTAINS_OR_WITH("with", v, h, PARSE_OPT_HIDDEN | PARSE_OPT_NONEG)
+#define OPT_WITHOUT(v, h) _OPT_CONTAINS_OR_WITH("without", v, h, PARSE_OPT_HIDDEN | PARSE_OPT_NONEG)
 
 #endif
index ce285c2e0c552ecf725c87052846d755507bd9db..92eba7a059e89873e2d94fd5ee37a92b887bde4c 100644 (file)
@@ -71,7 +71,7 @@ static int init_patch_id_entry(struct patch_id *patch,
                               struct commit *commit,
                               struct patch_ids *ids)
 {
-       unsigned char header_only_patch_id[GIT_SHA1_RAWSZ];
+       unsigned char header_only_patch_id[GIT_MAX_RAWSZ];
 
        patch->commit = commit;
        if (commit_patch_id(commit, &ids->diffopts, header_only_patch_id, 1))
@@ -99,11 +99,12 @@ struct patch_id *has_commit_patch_id(struct commit *commit,
 struct patch_id *add_commit_patch_id(struct commit *commit,
                                     struct patch_ids *ids)
 {
-       struct patch_id *key = xcalloc(1, sizeof(*key));
+       struct patch_id *key;
 
        if (!patch_id_defined(commit))
                return NULL;
 
+       key = xcalloc(1, sizeof(*key));
        if (init_patch_id_entry(key, commit, ids)) {
                free(key);
                return NULL;
index 0f34ea11eadffea14620ea2ad45d69894469aef7..b9e5751f8e2f6ef17bfa444fe6d8f3f2c6b7bb85 100644 (file)
@@ -3,7 +3,7 @@
 
 struct patch_id {
        struct hashmap_entry ent;
-       unsigned char patch_id[GIT_SHA1_RAWSZ];
+       unsigned char patch_id[GIT_MAX_RAWSZ];
        struct commit *commit;
 };
 
diff --git a/path.c b/path.c
index 9bfaeda2071636ec8a5a5ee32491494f5f83211c..c1cb1cf6273f4a5a7ed91d495c55a7d283497460 100644 (file)
--- a/path.c
+++ b/path.c
@@ -6,6 +6,7 @@
 #include "string-list.h"
 #include "dir.h"
 #include "worktree.h"
+#include "submodule-config.h"
 
 static int get_st_mode_bits(const char *path, int *mode)
 {
@@ -469,25 +470,20 @@ const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...)
        return pathname->buf;
 }
 
-static void do_submodule_path(struct strbuf *buf, const char *path,
-                             const char *fmt, va_list args)
+/* Returns 0 on success, negative on failure. */
+static int do_submodule_path(struct strbuf *buf, const char *path,
+                            const char *fmt, va_list args)
 {
-       const char *git_dir;
        struct strbuf git_submodule_common_dir = STRBUF_INIT;
        struct strbuf git_submodule_dir = STRBUF_INIT;
+       int ret;
 
-       strbuf_addstr(buf, path);
-       strbuf_complete(buf, '/');
-       strbuf_addstr(buf, ".git");
-
-       git_dir = read_gitfile(buf->buf);
-       if (git_dir) {
-               strbuf_reset(buf);
-               strbuf_addstr(buf, git_dir);
-       }
-       strbuf_addch(buf, '/');
-       strbuf_addbuf(&git_submodule_dir, buf);
+       ret = submodule_to_gitdir(&git_submodule_dir, path);
+       if (ret)
+               goto cleanup;
 
+       strbuf_complete(&git_submodule_dir, '/');
+       strbuf_addbuf(buf, &git_submodule_dir);
        strbuf_vaddf(buf, fmt, args);
 
        if (get_common_dir_noenv(&git_submodule_common_dir, git_submodule_dir.buf))
@@ -495,27 +491,37 @@ static void do_submodule_path(struct strbuf *buf, const char *path,
 
        strbuf_cleanup_path(buf);
 
+cleanup:
        strbuf_release(&git_submodule_dir);
        strbuf_release(&git_submodule_common_dir);
+       return ret;
 }
 
 char *git_pathdup_submodule(const char *path, const char *fmt, ...)
 {
+       int err;
        va_list args;
        struct strbuf buf = STRBUF_INIT;
        va_start(args, fmt);
-       do_submodule_path(&buf, path, fmt, args);
+       err = do_submodule_path(&buf, path, fmt, args);
        va_end(args);
+       if (err) {
+               strbuf_release(&buf);
+               return NULL;
+       }
        return strbuf_detach(&buf, NULL);
 }
 
-void strbuf_git_path_submodule(struct strbuf *buf, const char *path,
-                              const char *fmt, ...)
+int strbuf_git_path_submodule(struct strbuf *buf, const char *path,
+                             const char *fmt, ...)
 {
+       int err;
        va_list args;
        va_start(args, fmt);
-       do_submodule_path(buf, path, fmt, args);
+       err = do_submodule_path(buf, path, fmt, args);
        va_end(args);
+
+       return err;
 }
 
 static void do_git_common_path(struct strbuf *buf,
@@ -611,8 +617,10 @@ static struct passwd *getpw_str(const char *username, size_t len)
  * Return a string with ~ and ~user expanded via getpw*.  If buf != NULL,
  * then it is a newly allocated string. Returns NULL on getpw failure or
  * if path is NULL.
+ *
+ * If real_home is true, real_path($HOME) is used in the expansion.
  */
-char *expand_user_path(const char *path)
+char *expand_user_path(const char *path, int real_home)
 {
        struct strbuf user_path = STRBUF_INIT;
        const char *to_copy = path;
@@ -627,7 +635,10 @@ char *expand_user_path(const char *path)
                        const char *home = getenv("HOME");
                        if (!home)
                                goto return_null;
-                       strbuf_addstr(&user_path, home);
+                       if (real_home)
+                               strbuf_addstr(&user_path, real_path(home));
+                       else
+                               strbuf_addstr(&user_path, home);
 #ifdef GIT_WINDOWS_NATIVE
                        convert_slashes(user_path.buf);
 #endif
@@ -696,7 +707,7 @@ const char *enter_repo(const char *path, int strict)
                strbuf_add(&validated_path, path, len);
 
                if (used_path.buf[0] == '~') {
-                       char *newpath = expand_user_path(used_path.buf);
+                       char *newpath = expand_user_path(used_path.buf, 0);
                        if (!newpath)
                                return NULL;
                        strbuf_attach(&used_path, newpath, strlen(newpath),
@@ -964,7 +975,7 @@ const char *remove_leading_path(const char *in, const char *prefix)
  *
  * Performs the following normalizations on src, storing the result in dst:
  * - Ensures that components are separated by '/' (Windows only)
- * - Squashes sequences of '/'.
+ * - Squashes sequences of '/' except "//server/share" on Windows
  * - Removes "." components.
  * - Removes ".." components, and the components the precede them.
  * Returns failure (non-zero) if a ".." component appears as first path
@@ -987,17 +998,22 @@ const char *remove_leading_path(const char *in, const char *prefix)
 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len)
 {
        char *dst0;
-       int i;
+       const char *end;
 
-       for (i = has_dos_drive_prefix(src); i > 0; i--)
-               *dst++ = *src++;
+       /*
+        * Copy initial part of absolute path: "/", "C:/", "//server/share/".
+        */
+       end = src + offset_1st_component(src);
+       while (src < end) {
+               char c = *src++;
+               if (is_dir_sep(c))
+                       c = '/';
+               *dst++ = c;
+       }
        dst0 = dst;
 
-       if (is_dir_sep(*src)) {
-               *dst++ = '/';
-               while (is_dir_sep(*src))
-                       src++;
-       }
+       while (is_dir_sep(*src))
+               src++;
 
        for (;;) {
                char c = *src;
@@ -1240,6 +1256,21 @@ char *xdg_config_home(const char *filename)
        return NULL;
 }
 
+char *xdg_cache_home(const char *filename)
+{
+       const char *home, *cache_home;
+
+       assert(filename);
+       cache_home = getenv("XDG_CACHE_HOME");
+       if (cache_home && *cache_home)
+               return mkpathdup("%s/git/%s", cache_home, filename);
+
+       home = getenv("HOME");
+       if (home)
+               return mkpathdup("%s/.cache/git/%s", home, filename);
+       return NULL;
+}
+
 GIT_PATH_FUNC(git_path_cherry_pick_head, "CHERRY_PICK_HEAD")
 GIT_PATH_FUNC(git_path_revert_head, "REVERT_HEAD")
 GIT_PATH_FUNC(git_path_squash_msg, "SQUASH_MSG")
index 49a53607bb004e8ccc34e6a18eadc8dfc2e7879d..50f76fff458e45f57ae67c3474de8378f390f978 100644 (file)
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "dir.h"
 #include "pathspec.h"
+#include "attr.h"
 
 /*
  * Finds which of the given pathspecs match items in the index.
@@ -67,20 +68,20 @@ static struct pathspec_magic {
        char mnemonic; /* this cannot be ':'! */
        const char *name;
 } pathspec_magic[] = {
-       { PATHSPEC_FROMTOP, '/', "top" },
-       { PATHSPEC_LITERAL,   0, "literal" },
-       { PATHSPEC_GLOB,   '\0', "glob" },
-       { PATHSPEC_ICASE,  '\0', "icase" },
-       { PATHSPEC_EXCLUDE, '!', "exclude" },
+       { PATHSPEC_FROMTOP,  '/', "top" },
+       { PATHSPEC_LITERAL, '\0', "literal" },
+       { PATHSPEC_GLOB,    '\0', "glob" },
+       { PATHSPEC_ICASE,   '\0', "icase" },
+       { PATHSPEC_EXCLUDE,  '!', "exclude" },
+       { PATHSPEC_ATTR,    '\0', "attr" },
 };
 
-static void prefix_short_magic(struct strbuf *sb, int prefixlen,
-                              unsigned short_magic)
+static void prefix_magic(struct strbuf *sb, int prefixlen, unsigned magic)
 {
        int i;
        strbuf_addstr(sb, ":(");
        for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
-               if (short_magic & pathspec_magic[i].bit) {
+               if (magic & pathspec_magic[i].bit) {
                        if (sb->buf[sb->len - 1] != '(')
                                strbuf_addch(sb, ',');
                        strbuf_addstr(sb, pathspec_magic[i].name);
@@ -88,54 +89,171 @@ static void prefix_short_magic(struct strbuf *sb, int prefixlen,
        strbuf_addf(sb, ",prefix:%d)", prefixlen);
 }
 
-/*
- * Take an element of a pathspec and check for magic signatures.
- * Append the result to the prefix. Return the magic bitmap.
- *
- * For now, we only parse the syntax and throw out anything other than
- * "top" magic.
- *
- * NEEDSWORK: This needs to be rewritten when we start migrating
- * get_pathspec() users to use the "struct pathspec" interface.  For
- * example, a pathspec element may be marked as case-insensitive, but
- * the prefix part must always match literally, and a single stupid
- * string cannot express such a case.
- */
-static unsigned prefix_pathspec(struct pathspec_item *item,
-                               unsigned *p_short_magic,
-                               const char **raw, unsigned flags,
-                               const char *prefix, int prefixlen,
-                               const char *elt)
+static size_t strcspn_escaped(const char *s, const char *stop)
 {
-       static int literal_global = -1;
-       static int glob_global = -1;
-       static int noglob_global = -1;
-       static int icase_global = -1;
-       unsigned magic = 0, short_magic = 0, global_magic = 0;
-       const char *copyfrom = elt, *long_magic_end = NULL;
-       char *match;
-       int i, pathspec_prefix = -1;
+       const char *i;
+
+       for (i = s; *i; i++) {
+               /* skip the escaped character */
+               if (i[0] == '\\' && i[1]) {
+                       i++;
+                       continue;
+               }
+
+               if (strchr(stop, *i))
+                       break;
+       }
+       return i - s;
+}
+
+static inline int invalid_value_char(const char ch)
+{
+       if (isalnum(ch) || strchr(",-_", ch))
+               return 0;
+       return -1;
+}
+
+static char *attr_value_unescape(const char *value)
+{
+       const char *src;
+       char *dst, *ret;
+
+       ret = xmallocz(strlen(value));
+       for (src = value, dst = ret; *src; src++, dst++) {
+               if (*src == '\\') {
+                       if (!src[1])
+                               die(_("Escape character '\\' not allowed as "
+                                     "last character in attr value"));
+                       src++;
+               }
+               if (invalid_value_char(*src))
+                       die("cannot use '%c' for value matching", *src);
+               *dst = *src;
+       }
+       *dst = '\0';
+       return ret;
+}
+
+static void parse_pathspec_attr_match(struct pathspec_item *item, const char *value)
+{
+       struct string_list_item *si;
+       struct string_list list = STRING_LIST_INIT_DUP;
+
+       if (item->attr_check || item->attr_match)
+               die(_("Only one 'attr:' specification is allowed."));
+
+       if (!value || !*value)
+               die(_("attr spec must not be empty"));
+
+       string_list_split(&list, value, ' ', -1);
+       string_list_remove_empty_items(&list, 0);
+
+       item->attr_check = attr_check_alloc();
+       item->attr_match = xcalloc(list.nr, sizeof(struct attr_match));
+
+       for_each_string_list_item(si, &list) {
+               size_t attr_len;
+               char *attr_name;
+               const struct git_attr *a;
+
+               int j = item->attr_match_nr++;
+               const char *attr = si->string;
+               struct attr_match *am = &item->attr_match[j];
+
+               switch (*attr) {
+               case '!':
+                       am->match_mode = MATCH_UNSPECIFIED;
+                       attr++;
+                       attr_len = strlen(attr);
+                       break;
+               case '-':
+                       am->match_mode = MATCH_UNSET;
+                       attr++;
+                       attr_len = strlen(attr);
+                       break;
+               default:
+                       attr_len = strcspn(attr, "=");
+                       if (attr[attr_len] != '=')
+                               am->match_mode = MATCH_SET;
+                       else {
+                               const char *v = &attr[attr_len + 1];
+                               am->match_mode = MATCH_VALUE;
+                               am->value = attr_value_unescape(v);
+                       }
+                       break;
+               }
+
+               attr_name = xmemdupz(attr, attr_len);
+               a = git_attr(attr_name);
+               if (!a)
+                       die(_("invalid attribute name %s"), attr_name);
+
+               attr_check_append(item->attr_check, a);
+
+               free(attr_name);
+       }
+
+       if (item->attr_check->nr != item->attr_match_nr)
+               die("BUG: should have same number of entries");
+
+       string_list_clear(&list, 0);
+}
+
+static inline int get_literal_global(void)
+{
+       static int literal = -1;
+
+       if (literal < 0)
+               literal = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
+
+       return literal;
+}
+
+static inline int get_glob_global(void)
+{
+       static int glob = -1;
+
+       if (glob < 0)
+               glob = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
+
+       return glob;
+}
+
+static inline int get_noglob_global(void)
+{
+       static int noglob = -1;
+
+       if (noglob < 0)
+               noglob = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT, 0);
+
+       return noglob;
+}
+
+static inline int get_icase_global(void)
+{
+       static int icase = -1;
+
+       if (icase < 0)
+               icase = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
+
+       return icase;
+}
+
+static int get_global_magic(int element_magic)
+{
+       int global_magic = 0;
 
-       if (literal_global < 0)
-               literal_global = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
-       if (literal_global)
+       if (get_literal_global())
                global_magic |= PATHSPEC_LITERAL;
 
-       if (glob_global < 0)
-               glob_global = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
-       if (glob_global)
+       /* --glob-pathspec is overridden by :(literal) */
+       if (get_glob_global() && !(element_magic & PATHSPEC_LITERAL))
                global_magic |= PATHSPEC_GLOB;
 
-       if (noglob_global < 0)
-               noglob_global = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT, 0);
-
-       if (glob_global && noglob_global)
+       if (get_glob_global() && get_noglob_global())
                die(_("global 'glob' and 'noglob' pathspec settings are incompatible"));
 
-
-       if (icase_global < 0)
-               icase_global = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
-       if (icase_global)
+       if (get_icase_global())
                global_magic |= PATHSPEC_ICASE;
 
        if ((global_magic & PATHSPEC_LITERAL) &&
@@ -143,84 +261,219 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
                die(_("global 'literal' pathspec setting is incompatible "
                      "with all other global pathspec settings"));
 
-       if (flags & PATHSPEC_LITERAL_PATH)
-               global_magic = 0;
+       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
+       if (get_noglob_global() && !(element_magic & PATHSPEC_GLOB))
+               global_magic |= PATHSPEC_LITERAL;
 
-       if (elt[0] != ':' || literal_global ||
-           (flags & PATHSPEC_LITERAL_PATH)) {
-               ; /* nothing to do */
-       } else if (elt[1] == '(') {
-               /* longhand */
-               const char *nextat;
-               for (copyfrom = elt + 2;
-                    *copyfrom && *copyfrom != ')';
-                    copyfrom = nextat) {
-                       size_t len = strcspn(copyfrom, ",)");
-                       if (copyfrom[len] == ',')
-                               nextat = copyfrom + len + 1;
-                       else
-                               /* handle ')' and '\0' */
-                               nextat = copyfrom + len;
-                       if (!len)
-                               continue;
-                       for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
-                               if (strlen(pathspec_magic[i].name) == len &&
-                                   !strncmp(pathspec_magic[i].name, copyfrom, len)) {
-                                       magic |= pathspec_magic[i].bit;
-                                       break;
-                               }
-                               if (starts_with(copyfrom, "prefix:")) {
-                                       char *endptr;
-                                       pathspec_prefix = strtol(copyfrom + 7,
-                                                                &endptr, 10);
-                                       if (endptr - copyfrom != len)
-                                               die(_("invalid parameter for pathspec magic 'prefix'"));
-                                       /* "i" would be wrong, but it does not matter */
-                                       break;
-                               }
+       return global_magic;
+}
+
+/*
+ * Parse the pathspec element looking for long magic
+ *
+ * saves all magic in 'magic'
+ * if prefix magic is used, save the prefix length in 'prefix_len'
+ * returns the position in 'elem' after all magic has been parsed
+ */
+static const char *parse_long_magic(unsigned *magic, int *prefix_len,
+                                   struct pathspec_item *item,
+                                   const char *elem)
+{
+       const char *pos;
+       const char *nextat;
+
+       for (pos = elem + 2; *pos && *pos != ')'; pos = nextat) {
+               size_t len = strcspn_escaped(pos, ",)");
+               int i;
+
+               if (pos[len] == ',')
+                       nextat = pos + len + 1; /* handle ',' */
+               else
+                       nextat = pos + len; /* handle ')' and '\0' */
+
+               if (!len)
+                       continue;
+
+               if (starts_with(pos, "prefix:")) {
+                       char *endptr;
+                       *prefix_len = strtol(pos + 7, &endptr, 10);
+                       if (endptr - pos != len)
+                               die(_("invalid parameter for pathspec magic 'prefix'"));
+                       continue;
+               }
+
+               if (starts_with(pos, "attr:")) {
+                       char *attr_body = xmemdupz(pos + 5, len - 5);
+                       parse_pathspec_attr_match(item, attr_body);
+                       *magic |= PATHSPEC_ATTR;
+                       free(attr_body);
+                       continue;
+               }
+
+               for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
+                       if (strlen(pathspec_magic[i].name) == len &&
+                           !strncmp(pathspec_magic[i].name, pos, len)) {
+                               *magic |= pathspec_magic[i].bit;
+                               break;
                        }
-                       if (ARRAY_SIZE(pathspec_magic) <= i)
-                               die(_("Invalid pathspec magic '%.*s' in '%s'"),
-                                   (int) len, copyfrom, elt);
                }
-               if (*copyfrom != ')')
-                       die(_("Missing ')' at the end of pathspec magic in '%s'"), elt);
-               long_magic_end = copyfrom;
-               copyfrom++;
-       } else {
-               /* shorthand */
-               for (copyfrom = elt + 1;
-                    *copyfrom && *copyfrom != ':';
-                    copyfrom++) {
-                       char ch = *copyfrom;
 
-                       if (!is_pathspec_magic(ch))
+               if (ARRAY_SIZE(pathspec_magic) <= i)
+                       die(_("Invalid pathspec magic '%.*s' in '%s'"),
+                           (int) len, pos, elem);
+       }
+
+       if (*pos != ')')
+               die(_("Missing ')' at the end of pathspec magic in '%s'"),
+                   elem);
+       pos++;
+
+       return pos;
+}
+
+/*
+ * Parse the pathspec element looking for short magic
+ *
+ * saves all magic in 'magic'
+ * returns the position in 'elem' after all magic has been parsed
+ */
+static const char *parse_short_magic(unsigned *magic, const char *elem)
+{
+       const char *pos;
+
+       for (pos = elem + 1; *pos && *pos != ':'; pos++) {
+               char ch = *pos;
+               int i;
+
+               /* Special case alias for '!' */
+               if (ch == '^') {
+                       *magic |= PATHSPEC_EXCLUDE;
+                       continue;
+               }
+
+               if (!is_pathspec_magic(ch))
+                       break;
+
+               for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
+                       if (pathspec_magic[i].mnemonic == ch) {
+                               *magic |= pathspec_magic[i].bit;
                                break;
-                       for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
-                               if (pathspec_magic[i].mnemonic == ch) {
-                                       short_magic |= pathspec_magic[i].bit;
-                                       break;
-                               }
-                       if (ARRAY_SIZE(pathspec_magic) <= i)
-                               die(_("Unimplemented pathspec magic '%c' in '%s'"),
-                                   ch, elt);
+                       }
                }
-               if (*copyfrom == ':')
-                       copyfrom++;
+
+               if (ARRAY_SIZE(pathspec_magic) <= i)
+                       die(_("Unimplemented pathspec magic '%c' in '%s'"),
+                           ch, elem);
        }
 
-       magic |= short_magic;
-       *p_short_magic = short_magic;
+       if (*pos == ':')
+               pos++;
 
-       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
-       if (noglob_global && !(magic & PATHSPEC_GLOB))
-               global_magic |= PATHSPEC_LITERAL;
+       return pos;
+}
 
-       /* --glob-pathspec is overridden by :(literal) */
-       if ((global_magic & PATHSPEC_GLOB) && (magic & PATHSPEC_LITERAL))
-               global_magic &= ~PATHSPEC_GLOB;
+static const char *parse_element_magic(unsigned *magic, int *prefix_len,
+                                      struct pathspec_item *item,
+                                      const char *elem)
+{
+       if (elem[0] != ':' || get_literal_global())
+               return elem; /* nothing to do */
+       else if (elem[1] == '(')
+               /* longhand */
+               return parse_long_magic(magic, prefix_len, item, elem);
+       else
+               /* shorthand */
+               return parse_short_magic(magic, elem);
+}
 
-       magic |= global_magic;
+static void strip_submodule_slash_cheap(struct pathspec_item *item)
+{
+       if (item->len >= 1 && item->match[item->len - 1] == '/') {
+               int i = cache_name_pos(item->match, item->len - 1);
+
+               if (i >= 0 && S_ISGITLINK(active_cache[i]->ce_mode)) {
+                       item->len--;
+                       item->match[item->len] = '\0';
+               }
+       }
+}
+
+static void strip_submodule_slash_expensive(struct pathspec_item *item)
+{
+       int i;
+
+       for (i = 0; i < active_nr; i++) {
+               struct cache_entry *ce = active_cache[i];
+               int ce_len = ce_namelen(ce);
+
+               if (!S_ISGITLINK(ce->ce_mode))
+                       continue;
+
+               if (item->len <= ce_len || item->match[ce_len] != '/' ||
+                   memcmp(ce->name, item->match, ce_len))
+                       continue;
+
+               if (item->len == ce_len + 1) {
+                       /* strip trailing slash */
+                       item->len--;
+                       item->match[item->len] = '\0';
+               } else {
+                       die(_("Pathspec '%s' is in submodule '%.*s'"),
+                           item->original, ce_len, ce->name);
+               }
+       }
+}
+
+static void die_inside_submodule_path(struct pathspec_item *item)
+{
+       int i;
+
+       for (i = 0; i < active_nr; i++) {
+               struct cache_entry *ce = active_cache[i];
+               int ce_len = ce_namelen(ce);
+
+               if (!S_ISGITLINK(ce->ce_mode))
+                       continue;
+
+               if (item->len < ce_len ||
+                   !(item->match[ce_len] == '/' || item->match[ce_len] == '\0') ||
+                   memcmp(ce->name, item->match, ce_len))
+                       continue;
+
+               die(_("Pathspec '%s' is in submodule '%.*s'"),
+                   item->original, ce_len, ce->name);
+       }
+}
+
+/*
+ * Perform the initialization of a pathspec_item based on a pathspec element.
+ */
+static void init_pathspec_item(struct pathspec_item *item, unsigned flags,
+                              const char *prefix, int prefixlen,
+                              const char *elt)
+{
+       unsigned magic = 0, element_magic = 0;
+       const char *copyfrom = elt;
+       char *match;
+       int pathspec_prefix = -1;
+
+       item->attr_check = NULL;
+       item->attr_match = NULL;
+       item->attr_match_nr = 0;
+
+       /* PATHSPEC_LITERAL_PATH ignores magic */
+       if (flags & PATHSPEC_LITERAL_PATH) {
+               magic = PATHSPEC_LITERAL;
+       } else {
+               copyfrom = parse_element_magic(&element_magic,
+                                              &pathspec_prefix,
+                                              item,
+                                              elt);
+               magic |= element_magic;
+               magic |= get_global_magic(element_magic);
+       }
+
+       item->magic = magic;
 
        if (pathspec_prefix >= 0 &&
            (prefixlen || (prefix && *prefix)))
@@ -229,6 +482,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
        if ((magic & PATHSPEC_LITERAL) && (magic & PATHSPEC_GLOB))
                die(_("%s: 'literal' and 'glob' are incompatible"), elt);
 
+       /* Create match string which will be used for pathspec matching */
        if (pathspec_prefix >= 0) {
                match = xstrdup(copyfrom);
                prefixlen = pathspec_prefix;
@@ -236,69 +490,47 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
                match = xstrdup(copyfrom);
                prefixlen = 0;
        } else {
-               match = prefix_path_gently(prefix, prefixlen, &prefixlen, copyfrom);
+               match = prefix_path_gently(prefix, prefixlen,
+                                          &prefixlen, copyfrom);
                if (!match)
                        die(_("%s: '%s' is outside repository"), elt, copyfrom);
        }
-       *raw = item->match = match;
+
+       item->match = match;
+       item->len = strlen(item->match);
+       item->prefix = prefixlen;
+
        /*
         * Prefix the pathspec (keep all magic) and assign to
         * original. Useful for passing to another command.
         */
-       if (flags & PATHSPEC_PREFIX_ORIGIN) {
+       if ((flags & PATHSPEC_PREFIX_ORIGIN) &&
+           !get_literal_global()) {
                struct strbuf sb = STRBUF_INIT;
-               if (prefixlen && !literal_global) {
-                       /* Preserve the actual prefix length of each pattern */
-                       if (short_magic)
-                               prefix_short_magic(&sb, prefixlen, short_magic);
-                       else if (long_magic_end) {
-                               strbuf_add(&sb, elt, long_magic_end - elt);
-                               strbuf_addf(&sb, ",prefix:%d)", prefixlen);
-                       } else
-                               strbuf_addf(&sb, ":(prefix:%d)", prefixlen);
-               }
+
+               /* Preserve the actual prefix length of each pattern */
+               prefix_magic(&sb, prefixlen, element_magic);
+
                strbuf_addstr(&sb, match);
                item->original = strbuf_detach(&sb, NULL);
-       } else
-               item->original = elt;
-       item->len = strlen(item->match);
-       item->prefix = prefixlen;
-
-       if ((flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP) &&
-           (item->len >= 1 && item->match[item->len - 1] == '/') &&
-           (i = cache_name_pos(item->match, item->len - 1)) >= 0 &&
-           S_ISGITLINK(active_cache[i]->ce_mode)) {
-               item->len--;
-               match[item->len] = '\0';
+       } else {
+               item->original = xstrdup(elt);
        }
 
+       if (flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP)
+               strip_submodule_slash_cheap(item);
+
        if (flags & PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE)
-               for (i = 0; i < active_nr; i++) {
-                       struct cache_entry *ce = active_cache[i];
-                       int ce_len = ce_namelen(ce);
-
-                       if (!S_ISGITLINK(ce->ce_mode))
-                               continue;
-
-                       if (item->len <= ce_len || match[ce_len] != '/' ||
-                           memcmp(ce->name, match, ce_len))
-                               continue;
-                       if (item->len == ce_len + 1) {
-                               /* strip trailing slash */
-                               item->len--;
-                               match[item->len] = '\0';
-                       } else
-                               die (_("Pathspec '%s' is in submodule '%.*s'"),
-                                    elt, ce_len, ce->name);
-               }
+               strip_submodule_slash_expensive(item);
 
-       if (magic & PATHSPEC_LITERAL)
+       if (magic & PATHSPEC_LITERAL) {
                item->nowildcard_len = item->len;
-       else {
+       else {
                item->nowildcard_len = simple_length(item->match);
                if (item->nowildcard_len < prefixlen)
                        item->nowildcard_len = prefixlen;
        }
+
        item->flags = 0;
        if (magic & PATHSPEC_GLOB) {
                /*
@@ -313,9 +545,18 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
        }
 
        /* sanity checks, pathspec matchers assume these are sane */
-       assert(item->nowildcard_len <= item->len &&
-              item->prefix         <= item->len);
-       return magic;
+       if (item->nowildcard_len > item->len ||
+           item->prefix         > item->len) {
+               /*
+                * This case can be triggered by the user pointing us to a
+                * pathspec inside a submodule, which is an input error.
+                * Detect that here and complain, but fallback in the
+                * non-submodule case to a BUG, as we have no idea what
+                * would trigger that.
+                */
+               die_inside_submodule_path(item);
+               die ("BUG: item->nowildcard_len > item->len || item->prefix > item->len)");
+       }
 }
 
 static int pathspec_item_cmp(const void *a_, const void *b_)
@@ -328,22 +569,22 @@ static int pathspec_item_cmp(const void *a_, const void *b_)
 }
 
 static void NORETURN unsupported_magic(const char *pattern,
-                                      unsigned magic,
-                                      unsigned short_magic)
+                                      unsigned magic)
 {
        struct strbuf sb = STRBUF_INIT;
-       int i, n;
-       for (n = i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
+       int i;
+       for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
                const struct pathspec_magic *m = pathspec_magic + i;
                if (!(magic & m->bit))
                        continue;
                if (sb.len)
-                       strbuf_addch(&sb, ' ');
-               if (short_magic & m->bit)
-                       strbuf_addf(&sb, "'%c'", m->mnemonic);
+                       strbuf_addstr(&sb, ", ");
+
+               if (m->mnemonic)
+                       strbuf_addf(&sb, _("'%s' (mnemonic: '%c')"),
+                                   m->name, m->mnemonic);
                else
                        strbuf_addf(&sb, "'%s'", m->name);
-               n++;
        }
        /*
         * We may want to substitute "this command" with a command
@@ -364,7 +605,7 @@ void parse_pathspec(struct pathspec *pathspec,
 {
        struct pathspec_item *item;
        const char *entry = argv ? *argv : NULL;
-       int i, n, prefixlen, nr_exclude = 0;
+       int i, n, prefixlen, warn_empty_string, nr_exclude = 0;
 
        memset(pathspec, 0, sizeof(*pathspec));
 
@@ -381,8 +622,6 @@ void parse_pathspec(struct pathspec *pathspec,
 
        /* No arguments with prefix -> prefix pathspec */
        if (!entry) {
-               static const char *raw[2];
-
                if (flags & PATHSPEC_PREFER_FULL)
                        return;
 
@@ -390,43 +629,39 @@ void parse_pathspec(struct pathspec *pathspec,
                        die("BUG: PATHSPEC_PREFER_CWD requires arguments");
 
                pathspec->items = item = xcalloc(1, sizeof(*item));
-               item->match = prefix;
-               item->original = prefix;
+               item->match = xstrdup(prefix);
+               item->original = xstrdup(prefix);
                item->nowildcard_len = item->len = strlen(prefix);
                item->prefix = item->len;
-               raw[0] = prefix;
-               raw[1] = NULL;
                pathspec->nr = 1;
-               pathspec->_raw = raw;
                return;
        }
 
        n = 0;
-       while (argv[n])
+       warn_empty_string = 1;
+       while (argv[n]) {
+               if (*argv[n] == '\0' && warn_empty_string) {
+                       warning(_("empty strings as pathspecs will be made invalid in upcoming releases. "
+                                 "please use . instead if you meant to match all paths"));
+                       warn_empty_string = 0;
+               }
                n++;
+       }
 
        pathspec->nr = n;
-       ALLOC_ARRAY(pathspec->items, n);
+       ALLOC_ARRAY(pathspec->items, n + 1);
        item = pathspec->items;
-       pathspec->_raw = argv;
        prefixlen = prefix ? strlen(prefix) : 0;
 
        for (i = 0; i < n; i++) {
-               unsigned short_magic;
                entry = argv[i];
 
-               item[i].magic = prefix_pathspec(item + i, &short_magic,
-                                               argv + i, flags,
-                                               prefix, prefixlen, entry);
-               if ((flags & PATHSPEC_LITERAL_PATH) &&
-                   !(magic_mask & PATHSPEC_LITERAL))
-                       item[i].magic |= PATHSPEC_LITERAL;
+               init_pathspec_item(item + i, flags, prefix, prefixlen, entry);
+
                if (item[i].magic & PATHSPEC_EXCLUDE)
                        nr_exclude++;
                if (item[i].magic & magic_mask)
-                       unsupported_magic(entry,
-                                         item[i].magic & magic_mask,
-                                         short_magic);
+                       unsupported_magic(entry, item[i].magic & magic_mask);
 
                if ((flags & PATHSPEC_SYMLINK_LEADING_PATH) &&
                    has_symlink_leading_path(item[i].match, item[i].len)) {
@@ -438,58 +673,66 @@ void parse_pathspec(struct pathspec *pathspec,
                pathspec->magic |= item[i].magic;
        }
 
-       if (nr_exclude == n)
-               die(_("There is nothing to exclude from by :(exclude) patterns.\n"
-                     "Perhaps you forgot to add either ':/' or '.' ?"));
-
+       /*
+        * If everything is an exclude pattern, add one positive pattern
+        * that matches everyting. We allocated an extra one for this.
+        */
+       if (nr_exclude == n) {
+               int plen = (!(flags & PATHSPEC_PREFER_CWD)) ? 0 : prefixlen;
+               init_pathspec_item(item + n, 0, prefix, plen, "");
+               pathspec->nr++;
+       }
 
        if (pathspec->magic & PATHSPEC_MAXDEPTH) {
                if (flags & PATHSPEC_KEEP_ORDER)
                        die("BUG: PATHSPEC_MAXDEPTH_VALID and PATHSPEC_KEEP_ORDER are incompatible");
-               qsort(pathspec->items, pathspec->nr,
-                     sizeof(struct pathspec_item), pathspec_item_cmp);
+               QSORT(pathspec->items, pathspec->nr, pathspec_item_cmp);
        }
 }
 
-/*
- * N.B. get_pathspec() is deprecated in favor of the "struct pathspec"
- * based interface - see pathspec.c:parse_pathspec().
- *
- * Arguments:
- *  - prefix - a path relative to the root of the working tree
- *  - pathspec - a list of paths underneath the prefix path
- *
- * Iterates over pathspec, prepending each path with prefix,
- * and return the resulting list.
- *
- * If pathspec is empty, return a singleton list containing prefix.
- *
- * If pathspec and prefix are both empty, return an empty list.
- *
- * This is typically used by built-in commands such as add.c, in order
- * to normalize argv arguments provided to the built-in into a list of
- * paths to process, all relative to the root of the working tree.
- */
-const char **get_pathspec(const char *prefix, const char **pathspec)
-{
-       struct pathspec ps;
-       parse_pathspec(&ps,
-                      PATHSPEC_ALL_MAGIC &
-                      ~(PATHSPEC_FROMTOP | PATHSPEC_LITERAL),
-                      PATHSPEC_PREFER_CWD,
-                      prefix, pathspec);
-       return ps._raw;
-}
-
 void copy_pathspec(struct pathspec *dst, const struct pathspec *src)
 {
+       int i, j;
+
        *dst = *src;
        ALLOC_ARRAY(dst->items, dst->nr);
        COPY_ARRAY(dst->items, src->items, dst->nr);
+
+       for (i = 0; i < dst->nr; i++) {
+               struct pathspec_item *d = &dst->items[i];
+               struct pathspec_item *s = &src->items[i];
+
+               d->match = xstrdup(s->match);
+               d->original = xstrdup(s->original);
+
+               ALLOC_ARRAY(d->attr_match, d->attr_match_nr);
+               COPY_ARRAY(d->attr_match, s->attr_match, d->attr_match_nr);
+               for (j = 0; j < d->attr_match_nr; j++) {
+                       const char *value = s->attr_match[j].value;
+                       d->attr_match[j].value = xstrdup_or_null(value);
+               }
+
+               d->attr_check = attr_check_dup(s->attr_check);
+       }
 }
 
 void clear_pathspec(struct pathspec *pathspec)
 {
+       int i, j;
+
+       for (i = 0; i < pathspec->nr; i++) {
+               free(pathspec->items[i].match);
+               free(pathspec->items[i].original);
+
+               for (j = 0; j < pathspec->items[i].attr_match_nr; j++)
+                       free(pathspec->items[i].attr_match[j].value);
+               free(pathspec->items[i].attr_match);
+
+               if (pathspec->items[i].attr_check)
+                       attr_check_free(pathspec->items[i].attr_check);
+       }
+
        free(pathspec->items);
        pathspec->items = NULL;
+       pathspec->nr = 0;
 }
index 59809e4793a20e3030462ec23bff2b5358283282..55e976972cecfa5f0c204266c5d2a3a4d3d306a0 100644 (file)
@@ -8,30 +8,42 @@
 #define PATHSPEC_GLOB          (1<<3)
 #define PATHSPEC_ICASE         (1<<4)
 #define PATHSPEC_EXCLUDE       (1<<5)
+#define PATHSPEC_ATTR          (1<<6)
 #define PATHSPEC_ALL_MAGIC       \
        (PATHSPEC_FROMTOP       | \
         PATHSPEC_MAXDEPTH      | \
         PATHSPEC_LITERAL       | \
         PATHSPEC_GLOB          | \
         PATHSPEC_ICASE         | \
-        PATHSPEC_EXCLUDE)
+        PATHSPEC_EXCLUDE       | \
+        PATHSPEC_ATTR)
 
 #define PATHSPEC_ONESTAR 1     /* the pathspec pattern satisfies GFNM_ONESTAR */
 
 struct pathspec {
-       const char **_raw; /* get_pathspec() result, not freed by clear_pathspec() */
        int nr;
        unsigned int has_wildcard:1;
        unsigned int recursive:1;
        unsigned magic;
        int max_depth;
        struct pathspec_item {
-               const char *match;
-               const char *original;
+               char *match;
+               char *original;
                unsigned magic;
                int len, prefix;
                int nowildcard_len;
                int flags;
+               int attr_match_nr;
+               struct attr_match {
+                       char *value;
+                       enum attr_match_mode {
+                               MATCH_SET,
+                               MATCH_UNSET,
+                               MATCH_VALUE,
+                               MATCH_UNSPECIFIED
+                       } match_mode;
+               } *attr_match;
+               struct attr_check *attr_check;
        } *items;
 };
 
index 864123fe8e61f7469b58fef06a04edeb561edd53..bfce1f795dfa5fea05f4f96637a1ae2333038735 100644 (file)
@@ -59,7 +59,7 @@ require Exporter;
                 command_bidi_pipe command_close_bidi_pipe
                 version exec_path html_path hash_object git_cmd_try
                 remote_refs prompt
-                get_tz_offset
+                get_tz_offset get_record
                 credential credential_read credential_write
                 temp_acquire temp_is_locked temp_release temp_reset temp_path);
 
@@ -538,6 +538,20 @@ sub get_tz_offset {
        return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
 }
 
+=item get_record ( FILEHANDLE, INPUT_RECORD_SEPARATOR )
+
+Read one record from FILEHANDLE delimited by INPUT_RECORD_SEPARATOR,
+removing any trailing INPUT_RECORD_SEPARATOR.
+
+=cut
+
+sub get_record {
+       my ($fh, $rs) = @_;
+       local $/ = $rs;
+       my $rec = <$fh>;
+       chomp $rec if defined $rs;
+       $rec;
+}
 
 =item prompt ( PROMPT , ISPASSWORD  )
 
@@ -1424,6 +1438,44 @@ sub END {
 
 } # %TEMP_* Lexical Context
 
+=item prefix_lines ( PREFIX, STRING [, STRING... ])
+
+Prefixes lines in C<STRING> with C<PREFIX>.
+
+=cut
+
+sub prefix_lines {
+       my $prefix = shift;
+       my $string = join("\n", @_);
+       $string =~ s/^/$prefix/mg;
+       return $string;
+}
+
+=item get_comment_line_char ( )
+
+Gets the core.commentchar configuration value.
+The value falls-back to '#' if core.commentchar is set to 'auto'.
+
+=cut
+
+sub get_comment_line_char {
+       my $comment_line_char = config("core.commentchar") || '#';
+       $comment_line_char = '#' if ($comment_line_char eq 'auto');
+       $comment_line_char = '#' if (length($comment_line_char) != 1);
+       return $comment_line_char;
+}
+
+=item comment_lines ( STRING [, STRING... ])
+
+Comments lines following core.commentchar configuration.
+
+=cut
+
+sub comment_lines {
+       my $comment_line_char = get_comment_line_char;
+       return prefix_lines("$comment_line_char ", @_);
+}
+
 =back
 
 =head1 ERROR HANDLING
index f889fd6da91d2d9b6a7469442a02e5478f094f8d..c41425c8d07a4b9a223ef3fb71e24ff526cb9fc9 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
        }
 }
 
-our @EXPORT = qw(__);
+our @EXPORT = qw(__ __n N__);
 our @EXPORT_OK = @EXPORT;
 
 sub __bootstrap_locale_messages {
@@ -44,6 +44,7 @@ BEGIN
        eval {
                __bootstrap_locale_messages();
                *__ = \&Locale::Messages::gettext;
+               *__n = \&Locale::Messages::ngettext;
                1;
        } or do {
                # Tell test.pl that we couldn't load the gettext library.
@@ -51,7 +52,10 @@ BEGIN
 
                # Just a fall-through no-op
                *__ = sub ($) { $_[0] };
+               *__n = sub ($$$) { $_[2] == 1 ? $_[0] : $_[1] };
        };
+
+       sub N__($) { return shift; }
 }
 
 1;
@@ -70,6 +74,9 @@ Git::I18N - Perl interface to Git's Gettext localizations
 
        printf __("The following error occurred: %s\n"), $error;
 
+       printf __n("commited %d file\n", "commited %d files\n", $files), $files;
+
+
 =head1 DESCRIPTION
 
 Git's internal Perl interface to gettext via L<Locale::Messages>. If
@@ -87,6 +94,16 @@ it.
 L<Locale::Messages>'s gettext function if all goes well, otherwise our
 passthrough fallback function.
 
+=head2 __n($$$)
+
+L<Locale::Messages>'s ngettext function or passthrough fallback function.
+
+=head2 N__($)
+
+No-operation that only returns its argument. Use this if you want xgettext to
+extract the text to the pot template but do not want to trigger retrival of the
+translation at run time.
+
 =head1 AUTHOR
 
 E<AElig>var ArnfjE<ouml>rE<eth> Bjarmason <avarab@gmail.com>
index 018beb85a09d6ef524c326c3ec947982c05bf556..98518f4ddb4c031417e313dcf4daaa68e9955be0 100644 (file)
@@ -490,7 +490,7 @@ sub refname {
        #
        # Additionally, % must be escaped because it is used for escaping
        # and we want our escaped refname to be reversible
-       $refname =~ s{([ \%~\^:\?\*\[\t])}{sprintf('%%%02X',ord($1))}eg;
+       $refname =~ s{([ \%~\^:\?\*\[\t\\])}{sprintf('%%%02X',ord($1))}eg;
 
        # no slash-separated component can begin with a dot .
        # /.* becomes /%2E*
@@ -807,10 +807,15 @@ sub get_fetch_range {
        (++$min, $max);
 }
 
+sub svn_dir {
+       command_oneline(qw(rev-parse --git-path svn));
+}
+
 sub tmp_config {
        my (@args) = @_;
-       my $old_def_config = "$ENV{GIT_DIR}/svn/config";
-       my $config = "$ENV{GIT_DIR}/svn/.metadata";
+       my $svn_dir = svn_dir();
+       my $old_def_config = "$svn_dir/config";
+       my $config = "$svn_dir/.metadata";
        if (! -f $config && -f $old_def_config) {
                rename $old_def_config, $config or
                       die "Failed rename $old_def_config => $config: $!\n";
@@ -1658,7 +1663,17 @@ sub tie_for_persistent_memoization {
        if ($memo_backend > 0) {
                tie %$hash => 'Git::SVN::Memoize::YAML', "$path.yaml";
        } else {
-               tie %$hash => 'Memoize::Storable', "$path.db", 'nstore';
+               # first verify that any existing file can actually be loaded
+               # (it may have been saved by an incompatible version)
+               my $db = "$path.db";
+               if (-e $db) {
+                       use Storable qw(retrieve);
+
+                       if (!eval { retrieve($db); 1 }) {
+                               unlink $db or die "unlink $db failed: $!";
+                       }
+               }
+               tie %$hash => 'Memoize::Storable', $db, 'nstore';
        }
 }
 
@@ -1671,7 +1686,7 @@ sub tie_for_persistent_memoization {
                return if $memoized;
                $memoized = 1;
 
-               my $cache_path = "$ENV{GIT_DIR}/svn/.caches/";
+               my $cache_path = svn_dir() . '/.caches/';
                mkpath([$cache_path]) unless -d $cache_path;
 
                my %lookup_svn_merge_cache;
@@ -1712,7 +1727,7 @@ sub tie_for_persistent_memoization {
        sub clear_memoized_mergeinfo_caches {
                die "Only call this method in non-memoized context" if ($memoized);
 
-               my $cache_path = "$ENV{GIT_DIR}/svn/.caches/";
+               my $cache_path = svn_dir() . '/.caches/';
                return unless -d $cache_path;
 
                for my $cache_file (("$cache_path/lookup_svn_merge",
@@ -2446,12 +2461,13 @@ sub _new {
                             "refs/remotes/$prefix$default_ref_id";
        }
        $_[1] = $repo_id;
-       my $dir = "$ENV{GIT_DIR}/svn/$ref_id";
+       my $svn_dir = svn_dir();
+       my $dir = "$svn_dir/$ref_id";
 
-       # Older repos imported by us used $GIT_DIR/svn/foo instead of
-       # $GIT_DIR/svn/refs/remotes/foo when tracking refs/remotes/foo
+       # Older repos imported by us used $svn_dir/foo instead of
+       # $svn_dir/refs/remotes/foo when tracking refs/remotes/foo
        if ($ref_id =~ m{^refs/remotes/(.+)}) {
-               my $old_dir = "$ENV{GIT_DIR}/svn/$1";
+               my $old_dir = "$svn_dir/$1";
                if (-d $old_dir && ! -d $dir) {
                        $dir = $old_dir;
                }
@@ -2461,7 +2477,7 @@ sub _new {
        mkpath([$dir]);
        my $obj = bless {
                ref_id => $ref_id, dir => $dir, index => "$dir/index",
-               config => "$ENV{GIT_DIR}/svn/config",
+               config => "$svn_dir/config",
                map_root => "$dir/.rev_map", repo_id => $repo_id }, $class;
 
        # Ensure it gets canonicalized
index 4c4199afecac2c5fc6d918cf0d3b75449504b808..0df16ed72688f77058f471fddfdd25809d8926ae 100644 (file)
@@ -7,7 +7,9 @@ use SVN::Delta;
 use Carp qw/croak/;
 use Git qw/command command_oneline command_noisy command_output_pipe
            command_input_pipe command_close_pipe
-           command_bidi_pipe command_close_bidi_pipe/;
+           command_bidi_pipe command_close_bidi_pipe
+           get_record/;
+
 BEGIN {
        @ISA = qw(SVN::Delta::Editor);
 }
@@ -57,11 +59,9 @@ sub generate_diff {
        push @diff_tree, "-l$_rename_limit" if defined $_rename_limit;
        push @diff_tree, $tree_a, $tree_b;
        my ($diff_fh, $ctx) = command_output_pipe(@diff_tree);
-       local $/ = "\0";
        my $state = 'meta';
        my @mods;
-       while (<$diff_fh>) {
-               chomp $_; # this gets rid of the trailing "\0"
+       while (defined($_ = get_record($diff_fh, "\0"))) {
                if ($state eq 'meta' && /^:(\d{6})\s(\d{6})\s
                                        ($::sha1)\s($::sha1)\s
                                        ([MTCRAD])\d*$/xo) {
@@ -173,9 +173,7 @@ sub rmdirs {
 
        my ($fh, $ctx) = command_output_pipe(qw/ls-tree --name-only -r -z/,
                                             $self->{tree_b});
-       local $/ = "\0";
-       while (<$fh>) {
-               chomp;
+       while (defined($_ = get_record($fh, "\0"))) {
                my @dn = split m#/#, $_;
                while (pop @dn) {
                        delete $rm->{join '/', @dn};
index d8c21ad91549b4e52ce95c5e694db2f53f9931c9..64e900a0e910eea63943dfd129e595697b81c542 100644 (file)
@@ -9,7 +9,8 @@ use Carp qw/croak/;
 use File::Basename qw/dirname/;
 use Git qw/command command_oneline command_noisy command_output_pipe
            command_input_pipe command_close_pipe
-           command_bidi_pipe command_close_bidi_pipe/;
+           command_bidi_pipe command_close_bidi_pipe
+           get_record/;
 BEGIN {
        @ISA = qw(SVN::Delta::Editor);
 }
@@ -86,11 +87,9 @@ sub _mark_empty_symlinks {
        my $printed_warning;
        chomp(my $empty_blob = `git hash-object -t blob --stdin < /dev/null`);
        my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r -z/, $cmt);
-       local $/ = "\0";
        my $pfx = defined($switch_path) ? $switch_path : $git_svn->path;
        $pfx .= '/' if length($pfx);
-       while (<$ls>) {
-               chomp;
+       while (defined($_ = get_record($ls, "\0"))) {
                s/\A100644 blob $empty_blob\t//o or next;
                unless ($printed_warning) {
                        print STDERR "Scanning for empty symlinks, ",
@@ -179,9 +178,7 @@ sub delete_entry {
                my ($ls, $ctx) = command_output_pipe(qw/ls-tree
                                                     -r --name-only -z/,
                                                     $tree);
-               local $/ = "\0";
-               while (<$ls>) {
-                       chomp;
+               while (defined($_ = get_record($ls, "\0"))) {
                        my $rmpath = "$gpath/$_";
                        $self->{gii}->remove($rmpath);
                        print "\tD\t$rmpath\n" unless $::_q;
@@ -247,9 +244,7 @@ sub add_directory {
                my ($ls, $ctx) = command_output_pipe(qw/ls-tree
                                                     -r --name-only -z/,
                                                     $self->{c});
-               local $/ = "\0";
-               while (<$ls>) {
-                       chomp;
+               while (defined($_ = get_record($ls, "\0"))) {
                        $self->{gii}->remove($_);
                        print "\tD\t$_\n" unless $::_q;
                        push @deleted_gpath, $gpath;
index cf6ffa7581310986b7618da36346dc499a9fb098..dc90f6a6214281386c401235827a8fd268994eeb 100644 (file)
@@ -44,7 +44,9 @@ use Git qw(
        command_noisy
        command_output_pipe
        command_close_pipe
+       command_oneline
 );
+use Git::SVN;
 
 sub migrate_from_v0 {
        my $git_dir = $ENV{GIT_DIR};
@@ -55,7 +57,9 @@ sub migrate_from_v0 {
                chomp;
                my ($id, $orig_ref) = ($_, $_);
                next unless $id =~ s#^refs/heads/(.+)-HEAD$#$1#;
-               next unless -f "$git_dir/$id/info/url";
+               my $info_url = command_oneline(qw(rev-parse --git-path),
+                                               "$id/info/url");
+               next unless -f $info_url;
                my $new_ref = "refs/remotes/$id";
                if (::verify_ref("$new_ref^0")) {
                        print STDERR "W: $orig_ref is probably an old ",
@@ -82,7 +86,7 @@ sub migrate_from_v1 {
        my $git_dir = $ENV{GIT_DIR};
        my $migrated = 0;
        return $migrated unless -d $git_dir;
-       my $svn_dir = "$git_dir/svn";
+       my $svn_dir = Git::SVN::svn_dir();
 
        # just in case somebody used 'svn' as their $id at some point...
        return $migrated if -d $svn_dir && ! -f "$svn_dir/info/url";
@@ -97,27 +101,28 @@ sub migrate_from_v1 {
                my $x = $_;
                next unless $x =~ s#^refs/remotes/##;
                chomp $x;
-               next unless -f "$git_dir/$x/info/url";
-               my $u = eval { ::file_to_s("$git_dir/$x/info/url") };
+               my $info_url = command_oneline(qw(rev-parse --git-path),
+                                               "$x/info/url");
+               next unless -f $info_url;
+               my $u = eval { ::file_to_s($info_url) };
                next unless $u;
-               my $dn = dirname("$git_dir/svn/$x");
+               my $dn = dirname("$svn_dir/$x");
                mkpath([$dn]) unless -d $dn;
                if ($x eq 'svn') { # they used 'svn' as GIT_SVN_ID:
-                       mkpath(["$git_dir/svn/svn"]);
+                       mkpath(["$svn_dir/svn"]);
                        print STDERR " - $git_dir/$x/info => ",
-                                       "$git_dir/svn/$x/info\n";
-                       rename "$git_dir/$x/info", "$git_dir/svn/$x/info" or
+                                       "$svn_dir/$x/info\n";
+                       rename "$git_dir/$x/info", "$svn_dir/$x/info" or
                               croak "$!: $x";
                        # don't worry too much about these, they probably
                        # don't exist with repos this old (save for index,
                        # and we can easily regenerate that)
                        foreach my $f (qw/unhandled.log index .rev_db/) {
-                               rename "$git_dir/$x/$f", "$git_dir/svn/$x/$f";
+                               rename "$git_dir/$x/$f", "$svn_dir/$x/$f";
                        }
                } else {
-                       print STDERR " - $git_dir/$x => $git_dir/svn/$x\n";
-                       rename "$git_dir/$x", "$git_dir/svn/$x" or
-                              croak "$!: $x";
+                       print STDERR " - $git_dir/$x => $svn_dir/$x\n";
+                       rename "$git_dir/$x", "$svn_dir/$x" or croak "$!: $x";
                }
                $migrated++;
        }
@@ -139,9 +144,10 @@ sub read_old_urls {
                        push @dir, $_;
                }
        }
+       my $svn_dir = Git::SVN::svn_dir();
        foreach (@dir) {
                my $x = $_;
-               $x =~ s!^\Q$ENV{GIT_DIR}\E/svn/!!o;
+               $x =~ s!^\Q$svn_dir\E/!!o;
                read_old_urls($l_map, $x, $_);
        }
 }
@@ -150,7 +156,7 @@ sub migrate_from_v2 {
        my @cfg = command(qw/config -l/);
        return if grep /^svn-remote\..+\.url=/, @cfg;
        my %l_map;
-       read_old_urls(\%l_map, '', "$ENV{GIT_DIR}/svn");
+       read_old_urls(\%l_map, '', Git::SVN::svn_dir());
        my $migrated = 0;
 
        require Git::SVN;
@@ -239,7 +245,8 @@ sub minimize_connections {
                }
        }
        if (@emptied) {
-               my $file = $ENV{GIT_CONFIG} || "$ENV{GIT_DIR}/config";
+               my $file = $ENV{GIT_CONFIG} ||
+                       command_oneline(qw(rev-parse --git-path config));
                print STDERR <<EOF;
 The following [svn-remote] sections in your config file ($file) are empty
 and can be safely removed:
index e7646968011234c09e1565577357a7678c015762..56ad9870bcfdfae68bd0fb5b57aa73e208bcb0fd 100644 (file)
@@ -606,7 +606,7 @@ sub minimize_url {
                        my $latest = $ra->get_latest_revnum;
                        $ra->get_log("", $latest, 0, 1, 0, 1, sub {});
                };
-       } while ($@ && ($c = shift @components));
+       } while ($@ && defined($c = shift @components));
 
        return canonicalize_url($url);
 }
index 30489c60b1d3f8acc002fad31aa68b528757c8da..d4b6bfe076341d64bb948e4932655b927a369bc0 100644 (file)
@@ -91,16 +91,34 @@ void packet_flush(int fd)
        write_or_die(fd, "0000", 4);
 }
 
+int packet_flush_gently(int fd)
+{
+       packet_trace("0000", 4, 1);
+       if (write_in_full(fd, "0000", 4) == 4)
+               return 0;
+       return error("flush packet write failed");
+}
+
 void packet_buf_flush(struct strbuf *buf)
 {
        packet_trace("0000", 4, 1);
        strbuf_add(buf, "0000", 4);
 }
 
-#define hex(a) (hexchar[(a) & 15])
-static void format_packet(struct strbuf *out, const char *fmt, va_list args)
+static void set_packet_header(char *buf, const int size)
 {
        static char hexchar[] = "0123456789abcdef";
+
+       #define hex(a) (hexchar[(a) & 15])
+       buf[0] = hex(size >> 12);
+       buf[1] = hex(size >> 8);
+       buf[2] = hex(size >> 4);
+       buf[3] = hex(size);
+       #undef hex
+}
+
+static void format_packet(struct strbuf *out, const char *fmt, va_list args)
+{
        size_t orig_len, n;
 
        orig_len = out->len;
@@ -111,23 +129,63 @@ static void format_packet(struct strbuf *out, const char *fmt, va_list args)
        if (n > LARGE_PACKET_MAX)
                die("protocol error: impossibly long line");
 
-       out->buf[orig_len + 0] = hex(n >> 12);
-       out->buf[orig_len + 1] = hex(n >> 8);
-       out->buf[orig_len + 2] = hex(n >> 4);
-       out->buf[orig_len + 3] = hex(n);
+       set_packet_header(&out->buf[orig_len], n);
        packet_trace(out->buf + orig_len + 4, n - 4, 1);
 }
 
-void packet_write(int fd, const char *fmt, ...)
+static int packet_write_fmt_1(int fd, int gently,
+                             const char *fmt, va_list args)
+{
+       struct strbuf buf = STRBUF_INIT;
+       ssize_t count;
+
+       format_packet(&buf, fmt, args);
+       count = write_in_full(fd, buf.buf, buf.len);
+       if (count == buf.len)
+               return 0;
+
+       if (!gently) {
+               check_pipe(errno);
+               die_errno("packet write with format failed");
+       }
+       return error("packet write with format failed");
+}
+
+void packet_write_fmt(int fd, const char *fmt, ...)
 {
-       static struct strbuf buf = STRBUF_INIT;
        va_list args;
 
-       strbuf_reset(&buf);
        va_start(args, fmt);
-       format_packet(&buf, fmt, args);
+       packet_write_fmt_1(fd, 0, fmt, args);
+       va_end(args);
+}
+
+int packet_write_fmt_gently(int fd, const char *fmt, ...)
+{
+       int status;
+       va_list args;
+
+       va_start(args, fmt);
+       status = packet_write_fmt_1(fd, 1, fmt, args);
        va_end(args);
-       write_or_die(fd, buf.buf, buf.len);
+       return status;
+}
+
+static int packet_write_gently(const int fd_out, const char *buf, size_t size)
+{
+       static char packet_write_buffer[LARGE_PACKET_MAX];
+       size_t packet_size;
+
+       if (size > sizeof(packet_write_buffer) - 4)
+               return error("packet write failed - data exceeds max packet size");
+
+       packet_trace(buf, size, 1);
+       packet_size = size + 4;
+       set_packet_header(packet_write_buffer, packet_size);
+       memcpy(packet_write_buffer + 4, buf, size);
+       if (write_in_full(fd_out, packet_write_buffer, packet_size) == packet_size)
+               return 0;
+       return error("packet write failed");
 }
 
 void packet_buf_write(struct strbuf *buf, const char *fmt, ...)
@@ -139,6 +197,46 @@ void packet_buf_write(struct strbuf *buf, const char *fmt, ...)
        va_end(args);
 }
 
+int write_packetized_from_fd(int fd_in, int fd_out)
+{
+       static char buf[LARGE_PACKET_DATA_MAX];
+       int err = 0;
+       ssize_t bytes_to_write;
+
+       while (!err) {
+               bytes_to_write = xread(fd_in, buf, sizeof(buf));
+               if (bytes_to_write < 0)
+                       return COPY_READ_ERROR;
+               if (bytes_to_write == 0)
+                       break;
+               err = packet_write_gently(fd_out, buf, bytes_to_write);
+       }
+       if (!err)
+               err = packet_flush_gently(fd_out);
+       return err;
+}
+
+int write_packetized_from_buf(const char *src_in, size_t len, int fd_out)
+{
+       int err = 0;
+       size_t bytes_written = 0;
+       size_t bytes_to_write;
+
+       while (!err) {
+               if ((len - bytes_written) > LARGE_PACKET_DATA_MAX)
+                       bytes_to_write = LARGE_PACKET_DATA_MAX;
+               else
+                       bytes_to_write = len - bytes_written;
+               if (bytes_to_write == 0)
+                       break;
+               err = packet_write_gently(fd_out, src_in + bytes_written, bytes_to_write);
+               bytes_written += bytes_to_write;
+       }
+       if (!err)
+               err = packet_flush_gently(fd_out);
+       return err;
+}
+
 static int get_packet_data(int fd, char **src_buf, size_t *src_size,
                           void *dst, unsigned size, int options)
 {
@@ -229,3 +327,35 @@ char *packet_read_line_buf(char **src, size_t *src_len, int *dst_len)
 {
        return packet_read_line_generic(-1, src, src_len, dst_len);
 }
+
+ssize_t read_packetized_to_strbuf(int fd_in, struct strbuf *sb_out)
+{
+       int packet_len;
+
+       size_t orig_len = sb_out->len;
+       size_t orig_alloc = sb_out->alloc;
+
+       for (;;) {
+               strbuf_grow(sb_out, LARGE_PACKET_DATA_MAX);
+               packet_len = packet_read(fd_in, NULL, NULL,
+                       /* strbuf_grow() above always allocates one extra byte to
+                        * store a '\0' at the end of the string. packet_read()
+                        * writes a '\0' extra byte at the end, too. Let it know
+                        * that there is already room for the extra byte.
+                        */
+                       sb_out->buf + sb_out->len, LARGE_PACKET_DATA_MAX+1,
+                       PACKET_READ_GENTLE_ON_EOF);
+               if (packet_len <= 0)
+                       break;
+               sb_out->len += packet_len;
+       }
+
+       if (packet_len < 0) {
+               if (orig_alloc == 0)
+                       strbuf_release(sb_out);
+               else
+                       strbuf_setlen(sb_out, orig_len);
+               return packet_len;
+       }
+       return sb_out->len - orig_len;
+}
index 3cb9d91baaa5bbd09e1ca55e8754e1c4edb6bd97..18eac6483095319806f4c9b301b0f84e0c68d38c 100644 (file)
  * side can't, we stay with pure read/write interfaces.
  */
 void packet_flush(int fd);
-void packet_write(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
+void packet_write_fmt(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
 void packet_buf_flush(struct strbuf *buf);
 void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
+int packet_flush_gently(int fd);
+int packet_write_fmt_gently(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
+int write_packetized_from_fd(int fd_in, int fd_out);
+int write_packetized_from_buf(const char *src_in, size_t len, int fd_out);
 
 /*
  * Read a packetized line into the buffer, which must be at least size bytes
@@ -75,8 +79,14 @@ char *packet_read_line(int fd, int *size);
  */
 char *packet_read_line_buf(char **src_buf, size_t *src_len, int *size);
 
+/*
+ * Reads a stream of variable sized packets until a flush packet is detected.
+ */
+ssize_t read_packetized_to_strbuf(int fd_in, struct strbuf *sb_out);
+
 #define DEFAULT_PACKET_MAX 1000
 #define LARGE_PACKET_MAX 65520
+#define LARGE_PACKET_DATA_MAX (LARGE_PACKET_MAX - 4)
 extern char packet_buffer[LARGE_PACKET_MAX];
 
 #endif
index d3e63bc4806d1fa4547bbd743c6395ec8b9311cf..b221402ae3761b9f7ee8be409a46e24a4490c9ec 100644 (file)
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -6,8 +6,9 @@ Repository:     https://github.com/git-l10n/git-po
 Leader:                Alexander Shopov <ash@kambanaria.org>
 
 Language:      ca (Catalan)
-Repository:    https://github.com/alexhenrie/git-po
-Leader:                Alex Henrie <alexhenrie24@gmail.com>
+Repository:    https://github.com/Softcatala/git-po
+Leader:                Jordi Mas <jmas@softcatala.org>
+Members:       Alex Henrie <alexhenrie24@gmail.com>
 
 Language:      de (German)
 Repository:    https://github.com/ralfth/git-po-de
index ce75f39936a035deb5b7a8dcaedbb161df0531b9..66e2b7ea252bd0144a1ba396111809ecd5703cd2 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -1,15 +1,20 @@
 # Bulgarian translation of git po-file.
-# Copyright (C) 2014, 2015 Alexander Shopov <ash@kambanaria.org>.
+# Copyright (C) 2014, 2015, 2016, 2017 Alexander Shopov <ash@kambanaria.org>.
 # This file is distributed under the same license as the git package.
-# Alexander Shopov <ash@kambanaria.org>, 2014, 2015.
+# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2016, 2017.
 #
 # ========================
 # DICTIONARY TO MERGE IN GIT GUI
 # ------------------------
-# range Ð¸Ð½Ñ\82еÑ\80вал
+# range Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½
 # unreachable object недостижим обект
 # dangling objects обект извън клон
-# fast-forward тривиално сливане
+# fast-forward превъртане
+# tree-level merge тривиално сливане (различни файлове са променяни, слива се като дърво)
+# automatic merge автоманично сливаве (еднакви файлове са променяни, но в неприпокриващи се части)
+# real merge същинско сливане (а не превъртане)
+# three-way merge тройно сливане
+# octopus merge множествено сливане
 # stale remote старо хранилище
 # rebase пребазирам
 # force (push) принудително изтласквам
 # topic branch тематичен клон
 # empty head връх без история
 # tree-ish указател към дърво
-# three-way merge тройно сливане
 # dirty нечист, мръсен (файл, индекс)
-# fallback  резервен вариант
+# fallback резервен вариант
 # pathspec magic опция за магически пътища
 # bitmap index индекс на база битови маски
 # mark маркер
 # plumbing команди от системно ниво
 # porcelain команди от потребителско ниво
 # pack [noun] пакетен файл - fixme in glossary
+# repack препакетирам
 # mainline базово подаване - при cherry-pick на merge - към коя версия да се изчислява разликата
 # token лексема
 # trailer епилог/завършек на съобщение
 # peeled tag - проследен етикет - когато етикет сочи към друг етикет, а не подаване и проследяваме подобно на символна връзка
 # strip - премахвам (за компонент при филтриране)
 # unrelated histories - независими истории
+# inexact rename detection търсене на преименувания на обекти съчетани с промени
+# hunk парче
+# binary patch двоична кръпка
+# reverse-apply прилагам в обратна посока
+# todo file команден файл
+# alternate алтернативен източник
+# superproject обхващащ проект
+# split index разделяне на индекса
 # ----
-# „$var“ - може да не сработва за shell  има gettext и eval_gettext - проверка - намират се лесно по „$
+# „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$
 # ========================
 # „“…— ●≫ѝ→
 #
 # ========================
 # GENERATE STATS
 # ------------------------
-# grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//'  -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT
+# grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT
 # sort -u OUT > UNIQUE
-# for i in `cat UNIQUE`; do echo   `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS
+# for i in `cat UNIQUE`; do echo `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS
 #
 # ========================
 # FIND NON FULLY TRANSLATED
 # ------------------------
-# msgattrib  --untranslated bg.po > untranslated.po
-# msgattrib  --only-fuzzy bg.po > fuzzy.po
+# msgattrib --untranslated bg.po > untranslated.po
+# msgattrib --only-fuzzy bg.po > fuzzy.po
 # msgcat.exe untranslated.po fuzzy.po > new.po
-# grep ^#: new.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//'  -e 's%.*/%%' -e 's/[.][^.]*$//' | sort -u
-#
-# ========================
-# MOST IMPORTANT name asc ordering
-# ------------------------
-# add, blame, branch, checkout, clone, commit, common-cmds, config, diff, fetch, fsck, gc, git-rebase, git-stash, grep, log, mv, parse-options, push, reflog, remote, reset, revert, rm, wt-status
-#
-# ========================
-# IMPORTANT strings, name asc ordering
-# ------------------------
-# apply, archive, check-ignore, clean, date, describe, git-am, git-bisect, git-submodule, hash-object, init-db, ls-tree, merge, merge-base, merge-file, merge-recursive, name-rev, pathspec, show-ref, tag
+# grep ^#: new.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' | sort -u
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: git master\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-05-24 23:42+0800\n"
-"PO-Revision-Date: 2016-05-29 15:23+0300\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
+"PO-Revision-Date: 2017-05-07 09:24+0200\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -127,13013 +130,16571 @@ msgstr ""
 msgid "hint: %.*s\n"
 msgstr "Подсказка: %.*s\n"
 
-# TRANSFER
-#: advice.c:88
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
+msgstr "Отбирането на подавания е блокирано от неслети файлове."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr "Подаването е блокирано от неслети файлове."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+msgstr "Сливането е блокирано от неслети файлове."
+
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
+msgstr "Издърпването е блокирано от неслети файлове."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+msgstr "Отмяната е блокирана от неслети файлове."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr "Действието „%s“ е блокирано от неслети файлове."
+
+#: advice.c:101
 msgid ""
 "Fix them up in the work tree, and then use 'git add/rm <file>'\n"
 "as appropriate to mark resolution and make a commit."
 msgstr ""
 "Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“\n"
-"за да отбележите коригирането им. След това извършете подаването."
+"за да отбележите коригирането им.  След това извършете подаването."
+
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
+msgstr "Изход от програмата заради некоригиран конфликт."
 
-#: advice.c:101 builtin/merge.c:1238
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
+msgstr "Не сте завършили сливане.  (Указателят „MERGE_HEAD“ съществува)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Промените трябва да се подадат преди сливане."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
 msgstr "Изход от програмата заради незавършено сливане."
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
-
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
-
-#: archive.c:14
+#: advice.c:123
+#, c-format
 msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+"Note: checking out '%s'.\n"
+"\n"
+"You are in 'detached HEAD' state. You can look around, make experimental\n"
+"changes and commit them, and you can discard any commits you make in this\n"
+"state without impacting any branches by performing another checkout.\n"
+"\n"
+"If you want to create a new branch to retain commits you create, you may\n"
+"do so (now or later) by using -b with the checkout command again. Example:\n"
+"\n"
+"  git checkout -b <new-branch-name>\n"
+"\n"
 msgstr ""
-"git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО "
-"[ПЪТ…]"
-
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
+"Бележка: изтегляне на „%s“.\n"
+"\n"
+"Указателят „HEAD“ не е свързан.  Може да разглеждате, да правите произволни\n"
+"промени и да ги подавате.  Ако изтеглите нещо друго, всички промени ще "
+"бъдат\n"
+"забравени и никой клон няма да се промени.\n"
+"\n"
+"Ако искате да създадете нов клон, за да запазите подаванията си, можете да\n"
+"направите това като зададете име на клон към опцията „-b“ на командата\n"
+"„commit“. Например:\n"
+"\n"
+"  git checkout -b ИМЕ_НА_НОВ_КЛОН\n"
+"\n"
 
-#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
+#: apply.c:57
 #, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "пътят „%s“ не съвпада с никой файл"
-
-#: archive.c:429
-msgid "fmt"
-msgstr "ФОРМАТ"
-
-#: archive.c:429
-msgid "archive format"
-msgstr "ФОРМАТ на архива"
-
-#: archive.c:430 builtin/log.c:1395
-msgid "prefix"
-msgstr "ПРЕФИКС"
-
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "добавяне на този ПРЕФИКС към всеки път в архива"
-
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2548 builtin/blame.c:2549
-#: builtin/config.c:60 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:459
-#: builtin/ls-files.c:462 builtin/notes.c:398 builtin/notes.c:561
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "ФАЙЛ"
-
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "запазване на архива в този ФАЙЛ"
-
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "изчитане на „.gitattributes“ в работната директория"
-
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "извеждане на архивираните файлове на стандартната грешка"
-
-#: archive.c:437
-msgid "store only"
-msgstr "само съхранение без компресиране"
+msgid "unrecognized whitespace option '%s'"
+msgstr "непозната опция за знаците за интервали „%s“"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "бързо компресиране"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "непозната опция за игнориране на знаците за интервали „%s“"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "добÑ\80о ÐºÐ¾Ð¼Ð¿Ñ\80еÑ\81иÑ\80ане"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "опÑ\86ииÑ\82е â\80\9e--rejectâ\80\9c Ð¸ â\80\9e--3wayâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "извеждане Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жаниÑ\82е Ñ\84оÑ\80маÑ\82и"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "опÑ\86ииÑ\82е â\80\9e--cachedâ\80\9c Ð¸ â\80\9e--3wayâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:776
-msgid "repo"
-msgstr "хранилище"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "като „--3way“, но извън хранилище"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "изÑ\82еглÑ\8fне Ð½Ð° Ð°Ñ\80Ñ\85ива Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87еноÑ\82о Ð¥Ð Ð\90Ð\9dÐ\98Ð\9bÐ\98ЩÐ\95"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "каÑ\82о â\80\9e--indexâ\80\9c, Ð½Ð¾ Ð¸Ð·Ð²Ñ\8aн Ñ\85Ñ\80анилиÑ\89е"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "команда"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "каÑ\82о â\80\9e--cachedâ\80\9c, Ð½Ð¾ Ð¸Ð·Ð²Ñ\8aн Ñ\85Ñ\80анилиÑ\89е"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "път към отдалечената команда „git-upload-archive“"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Отрицателните шаблони се игнорират в атрибутите на git.\n"
-"Ако ви трябва начална удивителна, ползвайте „\\!“."
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
 
-#: branch.c:53
+#: apply.c:938
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"След корекция на грешката, можете да обновите\n"
-"информацията за следения клон чрез:\n"
-"git branch --set-upstream-to=%s%s%s"
+msgid "unable to find filename in patch at line %d"
+msgstr "Липсва име на файл на ред %d от кръпката"
 
-#: branch.c:67
+#: apply.c:977
 #, c-format
-msgid "Not setting branch %s as its own upstream."
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
-"Клонът „%s“ не може да служи като източник за собствената си синхронизация."
+"git apply: лош изход от командата „git-diff“ — на ред %2$d се очакваше „/dev/"
+"null“, а бе получен „%1$s“"
 
-#: branch.c:93
+#: apply.c:983
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
-"Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“ чрез "
-"пÑ\80ебазиÑ\80ане."
+"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
+"непÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð½Ð¾Ð² Ñ\84айл"
 
-#: branch.c:94
+#: apply.c:984
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“."
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
+"неправилно име на стар файл"
 
-#: branch.c:98
+#: apply.c:990
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
-"Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране."
+"git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
+"null“"
 
-#: branch.c:99
+#: apply.c:1488
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾Ñ\82о Ñ\85Ñ\80анилиÑ\89е."
+msgid "recount: unexpected line: %.*s"
+msgstr "пÑ\80и Ð¿Ð¾Ð²Ñ\82оÑ\80ноÑ\82о Ð¿Ñ\80ебÑ\80оÑ\8fване Ð±Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87ен Ð½ÐµÐ¾Ñ\87акван Ñ\80ед: â\80\9e%.*sâ\80\9c"
 
-#: branch.c:104
+#: apply.c:1557
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране."
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "част от кръпка без заглавна част на ред %d: %.*s"
 
-#: branch.c:105
+#: apply.c:1577
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Клонът „%s“ ще следи отдалечения указател „%s“."
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"След съкращаването на %d-та част от компонентите на пътя, в заглавната част "
+"на „git diff“ липсва информация за име на файл (ред: %d)"
+msgstr[1] ""
+"След съкращаването на първите %d части от компонентите на пътя, в заглавната "
+"част на „git diff“ липсва информация за име на файл (ред: %d)"
 
-#: branch.c:109
+#: apply.c:1589
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране."
+msgid "git diff header lacks filename information (line %d)"
+msgstr ""
+"в заглавната част на „git diff“ липсва информация за име на файл (ред: %d)"
 
-#: branch.c:110
-#, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Клонът „%s“ ще следи локалния указател „%s“."
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "новият файл зависи от старото съдържание на файла"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Ð\9dаÑ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ñ\81ледениÑ\8f ÐºÐ»Ð¾Ð½ Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 Ð·Ð°Ð¿Ð¸Ñ\81ани"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "изÑ\82Ñ\80иÑ\82иÑ\8fÑ\82 Ñ\84айл Ð½Ðµ Ðµ Ð¿Ñ\80азен"
 
-#: branch.c:156
+#: apply.c:1795
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Ð\9dÑ\8fма Ñ\81ледене: Ð´Ð²Ñ\83Ñ\81миÑ\81лена Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ñ\83казаÑ\82елÑ\8f â\80\9e%sâ\80\9c"
+msgid "corrupt patch at line %d"
+msgstr "гÑ\80еÑ\88ка Ð² ÐºÑ\80Ñ\8aпкаÑ\82а Ð½Ð° Ñ\80ед %d"
 
-#: branch.c:185
+#: apply.c:1832
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "„%s“ не е позволено име за клон."
+msgid "new file %s depends on old contents"
+msgstr "новият файл „%s“ зависи от старото съдържание на файла"
 
-#: branch.c:190
+#: apply.c:1834
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Вече съществува клон с име „%s“."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Текущият клон не може да бъде принудително обновен."
+msgid "deleted file %s still has contents"
+msgstr "изтритият файл „%s“ не е празен"
 
-#: branch.c:218
+#: apply.c:1837
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
 
-#: branch.c:220
+#: apply.c:1984
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "заявеният отдалечен клон „%s“ не съществува"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Ако искате да базирате работата си на клон от отдалечено хранилище, може \n"
-"да се наложи да изпълните „git fetch“, за да получите информацията за него.\n"
-"\n"
-"Ако искате да изтласкате нов, локален клон, който да следи отдалечен клон,\n"
-"може да използвате „git push -u“, за да настроите към кой клон да се "
-"изтласква."
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "грешка в двоичната кръпка на ред %d: %.*s"
 
-#: branch.c:266
+#: apply.c:2021
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Ð\9dепÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: â\80\9e%sâ\80\9c"
+msgid "unrecognized binary patch at line %d"
+msgstr "неÑ\80азпознаÑ\82а Ð´Ð²Ð¾Ð¸Ñ\87наÑ\82а ÐºÑ\80Ñ\8aпка Ð½Ð° Ñ\80ед %d"
 
-#: branch.c:286
+#: apply.c:2182
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Ð\94вÑ\83Ñ\81миÑ\81лено Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: â\80\9e%sâ\80\9c"
+msgid "patch with only garbage at line %d"
+msgstr "кÑ\80Ñ\8aпкаÑ\82а Ðµ Ñ\81 Ð¸Ð·Ñ\86Ñ\8fло Ð¿Ð¾Ð²Ñ\80едени Ð´Ð°Ð½Ð½Ð¸ Ð½Ð° Ñ\80ед %d"
 
-#: branch.c:291
+#: apply.c:2265
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Неправилно място за начало на клон: „%s“"
+msgid "unable to read symlink %s"
+msgstr "символната връзка „%s“ не може да бъде прочетена"
 
-#: branch.c:345
+#: apply.c:2269
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "„%s“ вече е изтеглен в „%s“"
+msgid "unable to open or read %s"
+msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: branch.c:364
+#: apply.c:2922
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð½Ð° Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
+msgid "invalid start of line: '%c'"
+msgstr "непÑ\80авилно Ð½Ð°Ñ\87ало Ð½Ð° Ñ\80ед: â\80\9e%câ\80\9c"
 
-#: bundle.c:34
+#: apply.c:3041
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "Файлът „%s“ не изглежда да е пратка на git версия 2"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] ""
+"%d-то парче код бе успешно приложено на ред %d (отместване от %d ред)."
+msgstr[1] ""
+"%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
 
-#: bundle.c:61
+#: apply.c:3053
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "непозната заглавна част: %s%s (%d)"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr ""
+"Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
 
-#: bundle.c:87 builtin/commit.c:777
+#: apply.c:3059
 #, c-format
-msgid "could not open '%s'"
-msgstr "„%s“ не може да се отвори"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "В хранилището липсват следните необходими подавания:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:627 sequencer.c:1073
-#: builtin/blame.c:2755 builtin/commit.c:1056 builtin/log.c:340
-#: builtin/log.c:863 builtin/log.c:1308 builtin/log.c:1633 builtin/log.c:1875
-#: builtin/merge.c:361 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "неуспешно настройване на обхождането на версиите"
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"при търсене за:\n"
+"%.*s"
 
-#: bundle.c:185
+#: apply.c:3081
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Пратката съдържа следния указател:"
-msgstr[1] "Пратката съдържа следните %d указатели:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Пратката съдържа пълна история."
+msgid "missing binary patch data for '%s'"
+msgstr "липсват данните за двоичната кръпка за „%s“"
 
-#: bundle.c:194
+#: apply.c:3089
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Пратката изисква следния указател:"
-msgstr[1] "Пратката изисква следните %d указатели:"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr ""
+"двоичната кръпка не може да се приложи в обратна посока, когато обратното "
+"парче за „%s“ липсва"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Командата „git pack-objects“ не може да бъде стартирана"
+#: apply.c:3135
+#, c-format
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "към „%s“ не може да се приложи двоична кръпка без пълен индекс"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "Командата „git pack-objects“ не завърши успешно"
+#: apply.c:3145
+#, c-format
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "кръпката съответства на „%s“ (%s), който не съвпада по съдържание."
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "Командата „git rev-list“ не завърши успешно"
+#: apply.c:3153
+#, c-format
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "кръпката съответства на „%s“, който трябва да е празен, но не е"
 
-#: bundle.c:353
+#: apply.c:3171
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
+msgid "the necessary postimage %s for '%s' cannot be read"
 msgstr ""
-"указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
+"необходимият резултат след операцията  — „%s“ за „%s“ не може да бъде "
+"прочетен"
 
-#: bundle.c:443 builtin/log.c:163 builtin/log.c:1538 builtin/shortlog.c:273
+#: apply.c:3184
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "непознат аргумент: %s"
-
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Създаването на празна пратка е невъзможно."
+msgid "binary patch does not apply to '%s'"
+msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
 
-#: bundle.c:463
+#: apply.c:3190
 #, c-format
-msgid "cannot create '%s'"
-msgstr "Файлът „%s“ не може да бъде създаден"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"двоичната кръпка за „%s“ води до неправилни резултати (очакваше се: „%s“, а "
+"бе получено: „%s“)"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "Командата „git index-pack“ не завърши успешно"
+#: apply.c:3211
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
 
-#: color.c:275
+#: apply.c:3333
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "неправилна стойност за цвят: %.*s"
+msgid "cannot checkout %s"
+msgstr "„%s“ не може да се изтегли"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1504
-#: builtin/am.c:2134
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid "could not parse %s"
-msgstr "„%s“ не може да се анализира"
+msgid "failed to read %s"
+msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: commit.c:42
+#: apply.c:3389
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s не е подаване!"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "изчитане на „%s“ след проследяване на символна връзка"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "паметта свърши"
+#: apply.c:3418 apply.c:3658
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "обектът с път „%s“ е преименуван или изтрит"
 
-#: config.c:475 config.c:477
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "неправилен ред %d в настройката %s „%s“"
+msgid "%s: does not exist in index"
+msgstr "„%s“ не съществува в индекса"
 
-#: config.c:593
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "неправилна числова стойност „%s“ за настройката „%s“ в %s „%s“: %s"
+msgid "%s: does not match index"
+msgstr "„%s“ не съответства на индекса"
 
-#: config.c:595
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr ""
+"в хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
+"сливане."
+
+#: apply.c:3548
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "непÑ\80авилна Ñ\87иÑ\81лова Ñ\81Ñ\82ойноÑ\81Ñ\82 â\80\9e%sâ\80\9c Ð·Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкаÑ\82а â\80\9e%sâ\80\9c: %s"
+msgid "Falling back to three-way merge...\n"
+msgstr "Ð\9fÑ\80еминаване ÐºÑ\8aм Ñ\82Ñ\80ойно Ñ\81ливанеâ\80¦\n"
 
-#: config.c:680
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
+msgid "cannot read the current contents of '%s'"
+msgstr "текущото съдържание на „%s“ не може да бъде прочетено"
 
-#: config.c:761 config.c:772
+#: apply.c:3580
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "непÑ\80авилно Ð½Ð¸Ð²Ð¾ Ð½Ð° ÐºÐ¾Ð¼Ð¿Ñ\80еÑ\81иÑ\80ане: %d"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80еминаване ÐºÑ\8aм Ñ\82Ñ\80ойно Ñ\81ливанеâ\80¦\n"
 
-#: config.c:890
+#: apply.c:3594
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "непÑ\80авилен Ñ\80ежим Ð·Ð° Ñ\81Ñ\8aздаванеÑ\82о Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и: %s"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Ð\9aонÑ\84ликÑ\82и Ð¿Ñ\80и Ð¿Ñ\80илаганеÑ\82о Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а ÐºÑ\8aм â\80\9e%sâ\80\9c.\n"
 
-#: config.c:1228
-msgid "unable to parse command-line config"
-msgstr "неправилни настройки от командния ред"
+#: apply.c:3599
+#, c-format
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Кръпката бе приложена чисто към „%s“.\n"
 
-#: config.c:1284
-msgid "unknown error occured while reading the configuration files"
-msgstr "неоÑ\87аквана Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¸Ð·Ñ\87иÑ\82анеÑ\82о Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ионниÑ\82е Ñ\84айлове"
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "изÑ\82Ñ\80иваÑ\89аÑ\82а ÐºÑ\80Ñ\8aпка Ð¾Ñ\81Ñ\82авÑ\8f Ñ\84айла Ð½ÐµÐ¿Ñ\80азен"
 
-#: config.c:1629
+#: apply.c:3697
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "неразпозната стойност „%s“ от командния ред"
+msgid "%s: wrong type"
+msgstr "„%s“: неправилен вид"
 
-#: config.c:1631
+#: apply.c:3699
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
+msgid "%s has type %o, expected %o"
+msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
 
-#: config.c:1690
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "%s has multiple values"
-msgstr "зададени Ñ\81а Ð½Ñ\8fколко Ñ\81Ñ\82ойноÑ\81Ñ\82и Ð·Ð° „%s“"
+msgid "invalid path '%s'"
+msgstr "непÑ\80авилен Ð¿Ñ\8aÑ\82: „%s“"
 
-#: config.c:2224
+#: apply.c:3908
 #, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "„%s“ не може да се зададе да е „%s“"
+msgid "%s: already exists in index"
+msgstr "„%s“: вече съществува в индекса"
 
-#: config.c:2226
+#: apply.c:3911
 #, c-format
-msgid "could not unset '%s'"
-msgstr "„%s“ не може да се премахне"
-
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Командата „git rev-list“ не може да бъде изпълнена."
-
-#: connected.c:89
-msgid "failed write to rev-list"
-msgstr "неуспешен запис на списъка с версиите"
+msgid "%s: already exists in working directory"
+msgstr "„%s“: вече съществува в работното дърво"
 
-#: connected.c:96
-msgid "failed to close rev-list's stdin"
-msgstr "стандартният вход на списъка с версиите не може да бъде затворен"
+#: apply.c:3931
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
 
-#: date.c:95
-msgid "in the future"
-msgstr "в бъдещето"
+#: apply.c:3936
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr ""
+"новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
 
-#: date.c:101
+#: apply.c:3956
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "преди %lu секунда"
-msgstr[1] "преди %lu секунди"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "засегнатият файл „%s“ е след символна връзка"
 
-#: date.c:108
+#: apply.c:3960
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "преди %lu минута"
-msgstr[1] "преди %lu минути"
+msgid "%s: patch does not apply"
+msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: date.c:115
+#: apply.c:3975
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "преди %lu час"
-msgstr[1] "преди %lu часа"
+msgid "Checking patch %s..."
+msgstr "Проверяване на кръпката „%s“…"
 
-#: date.c:122
+#: apply.c:4066
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "преди %lu ден"
-msgstr[1] "преди %lu дена"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr ""
+"информацията за сумата по SHA1 за подмодула липсва или не е достатъчна (%s)."
 
-#: date.c:128
+#: apply.c:4073
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "преди %lu седмица"
-msgstr[1] "преди %lu седмици"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "смяна на режима на достъпа на „%s“, който не е в текущия връх „HEAD“"
 
-#: date.c:135
+#: apply.c:4076
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "преди %lu месец"
-msgstr[1] "преди %lu месеца"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "информацията за сумата по SHA1 липсва или не е достатъчна (%s)."
 
-#: date.c:146
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu година"
-msgstr[1] "%lu години"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4085
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "преди %s и %lu месец"
-msgstr[1] "преди %s и %lu месеца"
+msgid "could not add %s to temporary index"
+msgstr "„%s“ не може да се добави към временния индекс"
 
-#: date.c:154 date.c:159
+#: apply.c:4095
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "преди %lu година"
-msgstr[1] "преди %lu години"
+msgid "could not write temporary index to %s"
+msgstr "временният индекс не може да се запази в „%s“"
 
-#: diffcore-order.c:24
+#: apply.c:4233
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
+msgid "unable to remove %s from index"
+msgstr "„%s“ не може да се извади от индекса"
 
-#: diffcore-rename.c:538
-msgid "Performing inexact rename detection"
-msgstr "Търсене на преименувания на обекти съчетани с промени"
+#: apply.c:4268
+#, c-format
+msgid "corrupt patch for submodule %s"
+msgstr "повредена кръпка за модула „%s“"
 
-#: diff.c:116
+#: apply.c:4274
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgid "unable to stat newly created file '%s'"
 msgstr ""
-"  Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
-"директории\n"
+"не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
 
-#: diff.c:121
+#: apply.c:4282
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Непознат параметър „%s“ за статистиката по директории'\n"
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+"не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
 
-#: diff.c:225
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Ð\9dепознаÑ\82а Ñ\81Ñ\82ойноÑ\81Ñ\82 â\80\9e%sâ\80\9c Ð·Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкаÑ\82а â\80\9ediff.submodule“"
+msgid "unable to add cache entry for %s"
+msgstr "не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´Ð¾Ð±Ð°Ð²Ð¸ Ð·Ð°Ð¿Ð¸Ñ\81 Ð² ÐºÐµÑ\88а Ð·Ð° â\80\9e%s“"
 
-#: diff.c:277
+#: apply.c:4329
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Грешки в настройката „diff.dirstat“:\n"
-"%s"
+msgid "failed to write to '%s'"
+msgstr "в „%s“ не може да се пише"
 
-#: diff.c:3007
+#: apply.c:4333
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-"външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
-
-#: diff.c:3405
-msgid "--follow requires exactly one pathspec"
-msgstr "Опцията „--follow“ изисква точно един път"
+msgid "closing file '%s'"
+msgstr "затваряне на файла „%s“"
 
-#: diff.c:3568
+#: apply.c:4403
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"Неразпознат параметър към опцията „--dirstat/-X“:\n"
-"%s"
+msgid "unable to write file '%s' mode %o"
+msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
 
-#: diff.c:3582
+#: apply.c:4501
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Ð\9dеÑ\80азпознаÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\8aÑ\80 ÐºÑ\8aм Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--submoduleâ\80\9c: â\80\9e%sâ\80\9c"
+msgid "Applied patch %s cleanly."
+msgstr "Ð\9aÑ\80Ñ\8aпкаÑ\82а â\80\9e%sâ\80\9c Ð±Ðµ Ð¿Ñ\80иложена Ñ\87иÑ\81Ñ\82о."
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "имеÑ\82о Ð¸ Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\82а Ð½Ð° Ñ\8fдÑ\80оÑ\82о Ð½Ðµ Ð±Ñ\8fÑ\85а Ð¿Ð¾Ð»Ñ\83Ñ\87ени"
+#: apply.c:4509
+msgid "internal error"
+msgstr "вÑ\8aÑ\82Ñ\80еÑ\88на Ð³Ñ\80еÑ\88ка"
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr ""
-"Кеша за неследените файлове е изключен на тази система или местоположение."
-
-#: gpg-interface.c:166 gpg-interface.c:235
-msgid "could not run gpg."
-msgstr "Програмата „gpg“ не може да бъде стартирана."
-
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "Програмата „gpg“ не прие подадените данни."
-
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "Програмата „gpg“ не подписа данните."
-
-#: gpg-interface.c:222
+#: apply.c:4512
 #, c-format
-msgid "could not create temporary file '%s'"
-msgstr "Програмата не успя да създаде временния файл „%s“"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Прилагане на кръпката „%%s“ с %d отхвърлено парче…"
+msgstr[1] "Прилагане на кръпката „%%s“ с %d отхвърлени парчета…"
 
-#: gpg-interface.c:224
+#: apply.c:4523
 #, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
 
-#: grep.c:1718
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
+msgid "cannot open %s"
+msgstr "„%s“ не може да бъде отворен"
 
-#: grep.c:1735 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: apply.c:4545
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
+msgid "Hunk #%d applied cleanly."
+msgstr "%d-то парче бе успешно приложено."
 
-#: grep.c:1746
+#: apply.c:4549
 #, c-format
-msgid "'%s': short read"
-msgstr "„%s“: изчитането върна по-малко байтове от заявените"
+msgid "Rejected hunk #%d."
+msgstr "%d-то парче бе отхвърлено."
 
-#: help.c:205
+#: apply.c:4659
 #, c-format
-msgid "available git commands in '%s'"
-msgstr "налиÑ\87ни ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ Ð½Ð° git Ð¾Ñ\82 „%s“"
+msgid "Skipped patch '%s'."
+msgstr "Ð\9fÑ\80опÑ\83Ñ\81наÑ\82а ÐºÑ\80Ñ\8aпка: „%s“"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "команди Ð½Ð° git Ð¾Ñ\82 Ð´Ñ\80Ñ\83ги Ð´Ð¸Ñ\80екÑ\82оÑ\80ии Ð¾Ñ\82 â\80\9e$PATHâ\80\9c"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "непознаÑ\82 Ð²Ñ\85од"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Това Ñ\81а Ð½Ð°Ð¹-Ñ\87еÑ\81Ñ\82о Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸Ñ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ Ð½Ð° Git:"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð¸Ñ\81ан"
 
-#: help.c:309
+#: apply.c:4823
 #, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-"Изглежда, че „%s“ е команда на git, но тя не може да\n"
-"бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
-
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
+msgid "can't open patch '%s': %s"
+msgstr "кръпката „%s“ не може да бъде отворена: %s"
 
-#: help.c:388
+#: apply.c:4850
 #, c-format
-msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
-msgstr ""
-"ПРЕДУПРЕЖДЕНИЕ: Пробвахте да изпълните команда на Git на име „%s“, а такава "
-"не\n"
-"съществува. Изпълнението автоматично продължава, като се счита, че имате "
-"предвид „%s“"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
+msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
 
-#: help.c:393
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "след %0.1f секунди…"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d ред добавя грешки в знаците за интервали."
+msgstr[1] "%d реда добавят грешки в знаците за интервали."
 
-#: help.c:400
+#: apply.c:4864
 #, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: „%s“ не е команда на git. Погледнете изхода от „git --help“."
-
-#: help.c:404 help.c:464
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
 msgstr[0] ""
-"\n"
-"Команда с подобно име е:"
+"Добавен е %d ред след корекцията на грешките в знаците за интервали."
 msgstr[1] ""
-"\n"
-"Команди с подобно име са:"
+"Добавени са %d реда след корекцията на грешките в знаците за интервали."
 
-#: help.c:460
-#, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s — %s"
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "Новият индекс не може да бъде записан"
 
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-"Файлът-ключалка „%s.lock“ не може да бъде създаден: %s\n"
-"\n"
-"Изглежда, че и друг процес на git е пуснат в това хранилище, напр.\n"
-"редактор, стартиран с „git commit“. Уверете се, че всички подобни\n"
-"процеси са спрени и опитайте отново. Ако това не помогне, вероятната\n"
-"причина е, че някой процес на git в това хранилище е забил. За да\n"
-"продължите работа, ще трябва ръчно да изтриете файла:"
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "път"
 
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "Файлът-ключалка „%s.lock“ не може да бъде създаден: %s"
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "без прилагане на промените напасващи на дадения път"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "кеÑ\88Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "пÑ\80илагане Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð°Ð¿Ð°Ñ\81ваÑ\89и Ð½Ð° Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\8f Ð¿Ñ\8aÑ\82"
 
-#: merge.c:94 builtin/am.c:2007 builtin/am.c:2042 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "неуспешно записване на новия индекс"
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
+msgstr "БРОЙ"
 
-#: merge-recursive.c:189
-#, c-format
-msgid "(bad commit)\n"
-msgstr "(лошо подаване)\n"
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
 
-#: merge-recursive.c:209
-#, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "неуспешно изпълнение на „addinfo_cache“ за пътя „%s“"
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "игнориране на редовете добавени от тази кръпка"
 
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "гÑ\80еÑ\88ка Ð¿Ñ\80и Ð¸Ð·Ð³Ñ\80аждане Ð½Ð° Ð´Ñ\8aÑ\80веÑ\82ата"
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "извеждане Ð½Ð° Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ика Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð±ÐµÐ· Ð¿Ñ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпката"
 
-#: merge-recursive.c:689
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr "грешка при създаването на пътя „%s“%s"
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "извеждане на броя на добавените и изтритите редове"
 
-#: merge-recursive.c:700
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ": възможно е да има конфликт директория/файл."
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
 
-#: merge-recursive.c:725
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-"преустановяване на действието, за да не се изтрие неследеният файл „%s“"
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
 
-#: merge-recursive.c:765
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr "обектът „%s“ (%s) не може да бъде прочетен"
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "прилагане на кръпката без промяна на работното дърво"
 
-#: merge-recursive.c:767
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е"
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
 
-#: merge-recursive.c:790 builtin/clone.c:376
-#, c-format
-msgid "failed to open '%s'"
-msgstr "директорията „%s“ не може да бъде отворена"
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr ""
+"кръпката да бъде приложена.  Опцията се комбинира с „--check“/„--stat“/„--"
+"summary“"
 
-#: merge-recursive.c:798
-#, c-format
-msgid "failed to symlink '%s'"
-msgstr "неуспешно създаване на символната връзка „%s“"
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
 
-#: merge-recursive.c:801
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
 msgstr ""
-"не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
+"създаване на временен индекс на база на включената информация за индекса"
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "Неуспешно вътрешно сливане"
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
+msgstr "разделяне на пътищата с нулевия знак „NUL“"
 
-#: merge-recursive.c:943
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "„%s“ не може да се добави в базата с данни"
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "в Ð´Ñ\8aÑ\80воÑ\82о Ð¸Ð¼Ð° Ð½ÐµÐ¿Ð¾Ð´Ð´Ñ\8aÑ\80жан Ð²Ð¸Ð´ Ð¾Ð±ÐµÐºÑ\82"
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
+msgstr "дейÑ\81Ñ\82вие"
 
-#: merge-recursive.c:1034 merge-recursive.c:1048
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
-"е оставена в дървото."
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
 
-#: merge-recursive.c:1040 merge-recursive.c:1053
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
 msgstr ""
-"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
-"е оставена в дървото: %s."
+"игнориране на промените в знаците за интервали при откриване на контекста"
 
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "пÑ\80еименÑ\83ване"
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "пÑ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а Ð² Ð¾Ð±Ñ\80аÑ\82на Ð¿Ð¾Ñ\81ока"
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "пÑ\80еименÑ\83ван"
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "без Ð¸Ð·Ð¸Ñ\81кване Ð½Ð° Ð´Ð¾Ñ\80и Ð¸ ÐµÐ´Ð¸Ð½ Ñ\80ед ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82"
 
-#: merge-recursive.c:1150
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
 
-#: merge-recursive.c:1172
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
-"„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s."
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "позволяване на застъпващи се парчета"
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr " (некоригиран конфликт)"
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "повече подробности"
 
-#: merge-recursive.c:1231
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
-"„%s“, а „%s“ е преименуван на „%s“ в „%s“"
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
 
-#: merge-recursive.c:1261
-#, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
 
-#: merge-recursive.c:1460
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr ""
-"КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
-"„%s“ е добавен в „%s“"
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
 
-#: merge-recursive.c:1470
-#, c-format
-msgid "Adding merged %s"
-msgstr "Добавяне на слетия „%s“"
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
-#, c-format
-msgid "Adding as %s instead"
-msgstr "Добавяне като „%s“"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
 
-#: merge-recursive.c:1526
-#, c-format
-msgid "cannot read object %s"
-msgstr "обектът „%s“ не може да се прочете"
-
-#: merge-recursive.c:1529
-#, c-format
-msgid "object %s is not a blob"
-msgstr "обектът „%s“ не е BLOB"
-
-#: merge-recursive.c:1581
-msgid "modify"
-msgstr "промяна"
-
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "променен"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "съдържание"
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО "
+"[ПЪТ…]"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "добавяне/добавяне"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
 
-#: merge-recursive.c:1632
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "Ð\9fÑ\80еÑ\81каÑ\87ане Ð½Ð° â\80\9e%sâ\80\9c (Ñ\81леÑ\82иÑ\8fÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82 Ðµ Ð¸Ð´ÐµÐ½Ñ\82иÑ\87ен Ñ\81Ñ\8aÑ\81 Ñ\81егаÑ\88ниÑ\8f)"
+msgid "pathspec '%s' did not match any files"
+msgstr "пÑ\8aÑ\82Ñ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ñ\81Ñ\8aвпада Ñ\81 Ð½Ð¸ÐºÐ¾Ð¹ Ñ\84айл"
 
-#: merge-recursive.c:1646
-#, c-format
-msgid "Auto-merging %s"
-msgstr "Автоматично сливане на „%s“"
+#: archive.c:417
+msgid "fmt"
+msgstr "ФОРМАТ"
 
-#: merge-recursive.c:1650 git-submodule.sh:941
-msgid "submodule"
-msgstr "Ð\9fÐ\9eÐ\94Ð\9cÐ\9eÐ\94УÐ\9b"
+#: archive.c:417
+msgid "archive format"
+msgstr "ФÐ\9eРÐ\9cÐ\90Т Ð½Ð° Ð°Ñ\80Ñ\85ива"
 
-#: merge-recursive.c:1651
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "ПРЕФИКС"
 
-#: merge-recursive.c:1737
-#, c-format
-msgid "Removing %s"
-msgstr "Изтриване на „%s“"
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "добавяне на този ПРЕФИКС към всеки път в архива"
 
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "файл/директория"
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "ФАЙЛ"
 
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "диÑ\80екÑ\82оÑ\80иÑ\8f\84айл"
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "запазване Ð½Ð° Ð°Ñ\80Ñ\85ива Ð² Ñ\82ози Ð¤Ð\90Ð\99Ð\9b"
 
-#: merge-recursive.c:1773
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-"КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“. Добавяне на „%s“ "
-"като „%s“"
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr "изчитане на „.gitattributes“ в работната директория"
 
-#: merge-recursive.c:1781
-#, c-format
-msgid "Adding %s"
-msgstr "Добавяне на „%s“"
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "извеждане на архивираните файлове на стандартната грешка"
 
-#: merge-recursive.c:1798
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Фатална грешка при сливане, а такава не трябва да възниква!"
+#: archive.c:425
+msgid "store only"
+msgstr "само съхранение без компресиране"
 
-#: merge-recursive.c:1817
-msgid "Already up-to-date!"
-msgstr "Ð\92еÑ\87е Ðµ Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½Ð¾!"
+#: archive.c:426
+msgid "compress faster"
+msgstr "бÑ\8aÑ\80зо ÐºÐ¾Ð¼Ð¿Ñ\80еÑ\81иÑ\80ане"
 
-#: merge-recursive.c:1826
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
+#: archive.c:434
+msgid "compress better"
+msgstr "добро компресиране"
 
-#: merge-recursive.c:1856
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr ""
-"Пътят „%s“ не е обработен, това е грешка в Git, докладвайте я на "
-"разработчиците, като пратите е-писмо на адрес: „git@vger.kernel.org“."
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "извеждане на списъка с поддържаните формати"
 
-#: merge-recursive.c:1904
-msgid "Merging:"
-msgstr "Сливане:"
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "хранилище"
 
-#: merge-recursive.c:1917
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "открит е %u общ предшественик:"
-msgstr[1] "открити са %u общи предшественици:"
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
 
-#: merge-recursive.c:1954
-msgid "merge returned no commit"
-msgstr "сливането не върна подаване"
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "команда"
 
-#: merge-recursive.c:2011
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr "Неуспешен анализ на обекта „%s“"
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "път към отдалечената команда „git-upload-archive“"
 
-#: merge-recursive.c:2022 builtin/merge.c:649 builtin/merge.c:831
-msgid "Unable to write index."
-msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "Ð\9dеоÑ\87аквана Ð¾Ð¿Ñ\86иÑ\8f â\80\9e--remoteâ\80\9c"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-"Неинициализирано или нереферирано дърво за бележки не може да бъде подадено"
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "Опцията „--exec“ изисква „--remote“"
 
-#: notes-utils.c:100
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Неправилна стойност за „notes.rewriteMode“: „%s“"
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "Неочаквана опция „--output“"
 
-#: notes-utils.c:110
+#: archive.c:475
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-"Бележките в „%s“ няма да бъдат презаписани, защото са извън „refs/notes/“."
+msgid "Unknown archive format '%s'"
+msgstr "Непознат формат на архив: „%s“"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: archive.c:482
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Ð\97ададена Ðµ Ð»Ð¾Ñ\88а Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð½Ð° Ð¿Ñ\80оменливаÑ\82а â\80\9e%sâ\80\9c: â\80\9e%sâ\80\9c"
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Ð\90Ñ\80гÑ\83менÑ\82Ñ\8aÑ\82 Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð·Ð° Ñ\84оÑ\80маÌ\80Ñ\82а â\80\9e%sâ\80\9c: -%d"
 
-#: object.c:242
+#: attr.c:212
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "обектът „%s“ не може да бъде анализиран"
+msgid "%.*s is not a valid attribute name"
+msgstr "„%.*s“ е неправилно име за атрибут"
 
-#: parse-options.c:572
-msgid "..."
-msgstr "…"
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Отрицателните шаблони се игнорират в атрибутите на git.\n"
+"Ако ви трябва начална удивителна, ползвайте „\\!“."
 
-#: parse-options.c:590
+#: bisect.c:444
 #, c-format
-msgid "usage: %s"
-msgstr "употреба: %s"
+msgid "Could not open file '%s'"
+msgstr "Файлът „%s“ не може да се отвори"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: bisect.c:449
 #, c-format
-msgid "   or: %s"
-msgstr "     или: %s"
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Неправилно цитирано съдържание във файла „%s“: %s"
 
-#: parse-options.c:597
+#: bisect.c:657
 #, c-format
-msgid "    %s"
-msgstr "    %s"
-
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-ЧИСЛО"
+msgid "We cannot bisect more!\n"
+msgstr "Повече не може да се търси двоично!\n"
 
-#: parse-options-cb.c:108
+#: bisect.c:710
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "непÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82 „%s“"
+msgid "Not a valid commit name %s"
+msgstr "Ð\9dепÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ „%s“"
 
-#: path.c:796
+#: bisect.c:734
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
-
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr "глобалните настройки за пътища „glob“ и „noglob“ са несъвместими"
-
-#: pathspec.c:143
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
 msgstr ""
-"глобалнаÑ\82а Ð½Ð°Ñ\81Ñ\82Ñ\80ойка Ð·Ð° Ð´Ð¾Ñ\81ловни Ð¿Ñ\8aÑ\82иÑ\89а â\80\9eliteralâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð²Ñ\81иÑ\87ки "
-"дÑ\80Ñ\83ги Ð³Ð»Ð¾Ð±Ð°Ð»Ð½Ð¸ Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ð·Ð° Ð¿Ñ\8aÑ\82иÑ\89а"
+"Ð\9dепÑ\80авилна Ð±Ð°Ð·Ð° Ð·Ð° Ñ\81ливане: %s.\n"
+"СледоваÑ\82елно Ð³Ñ\80еÑ\88каÑ\82а Ðµ ÐºÐ¾Ñ\80игиÑ\80ана Ð¼ÐµÐ¶Ð´Ñ\83 â\80\9e%sâ\80\9c Ð¸ [%s].\n"
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "неправилен параметър за опцията за магически пътища „prefix“"
+#: bisect.c:739
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"Нова база за сливане: %s.\n"
+"Свойството е променено между „%s“ и [%s].\n"
 
-#: pathspec.c:183
+#: bisect.c:744
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "Неправилна стойност за опцията за магически пътища „%.*s“ в „%s“"
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"Базата за сливане „%s“ е %s.\n"
+"Следователно първото %s подаване е между „%s“ и [%s].\n"
 
-#: pathspec.c:187
+#: bisect.c:752
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "Знакът „)“ липсва в опцията за магически пътища в „%s“"
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Някои от указателите от „%s“ не са предшественици на указателя „%s“.\n"
+"Двоичното търсене с git bisect няма да работи правилно.\n"
+"Дали не сте объркали указателите „%s“ и „%s“?\n"
 
-#: pathspec.c:205
+#: bisect.c:765
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Магическите пътища „%c“ са без реализация за „%s“"
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"базата за сливане между „%s“ и [%s] трябва да бъде прескочена.\n"
+"Не може да сме сигурни, че първото %s подаване е между „%s“ и „%s“.\n"
+"Двоичното търсене продължава."
 
-#: pathspec.c:230
+#: bisect.c:800
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: опциите „literal“ и „glob“ са несъвместими"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Двоично търсене: трябва да се провери база за сливане\n"
 
-#: pathspec.c:241
+#: bisect.c:851
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: „%s“ е извън хранилището"
+msgid "a %s revision is needed"
+msgstr "необходима е версия „%s“"
 
-#: pathspec.c:291
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Пътят „%s“ е в подмодула „%.*s“"
+msgid "could not create file '%s'"
+msgstr "файлът „%s“ не може да бъде създаден"
 
-#: pathspec.c:353
+#: bisect.c:919
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr "%s: магическите пътища не се поддържат от командата „%s“"
+msgid "could not read file '%s'"
+msgstr "файлът „%s“ не може да бъде прочетен"
+
+#: bisect.c:949
+msgid "reading bisect refs failed"
+msgstr "неуспешно прочитане на указателите за двоично търсене"
 
-#: pathspec.c:433
+#: bisect.c:969
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "пътят „%s“ е след символна връзка"
+msgid "%s was both %s and %s\n"
+msgstr "„%s“ e както „%s“, така и „%s“\n"
 
-#: pathspec.c:442
+#: bisect.c:977
+#, c-format
 msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 msgstr ""
-"Ð\9dиÑ\89о Ð½Ðµ Ñ\81е Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ва Ð¾Ñ\82 Ñ\88аблониÑ\82е Ð·Ð° Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ване.\n"
-"Това Ñ\87еÑ\81Ñ\82о Ñ\81е Ñ\81лÑ\83Ñ\87ва, Ð°ÐºÐ¾ Ñ\81Ñ\82е Ð·Ð°Ð±Ñ\80авили Ð´Ð° Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82е â\80\9e:/â\80\9c Ð¸Ð»Ð¸ â\80\9e\80\9c."
+"Ð\9bипÑ\81ва Ð¿Ð¾Ð´Ñ\85одÑ\8fÑ\89о Ð·Ð° Ñ\82еÑ\81Ñ\82ване Ð¿Ð¾Ð´Ð°ване.\n"
+"Ð\9fÑ\80овеÑ\80еÑ\82е Ð¿Ð°Ñ\80амеÑ\82Ñ\80иÑ\82е Ð·Ð° Ð¿Ñ\8aÑ\82иÑ\89аÑ\82а.\n"
 
-#: pretty.c:971
-msgid "unable to parse --pretty format"
-msgstr "аргументът към опцията „--pretty“ не може да се анализира"
+#: bisect.c:996
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(приблизително %d стъпка)"
+msgstr[1] "(приблизително %d стъпки)"
 
-#: progress.c:235
-msgid "done"
-msgstr "действието завърши"
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Двоично търсене: остава %d версия след тази %s\n"
+msgstr[1] "Двоично търсене: остават %d версии след тази %s\n"
 
-#: read-cache.c:1281
+#: branch.c:53
 #, c-format
 msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
 msgstr ""
-"Зададена е неправилна стойност на настройката „index.version“.\n"
-"Ще се ползва версия %i"
+"\n"
+"След корекция на грешката, можете да обновите\n"
+"информацията за следения клон чрез:\n"
+"git branch --set-upstream-to=%s%s%s"
 
-#: read-cache.c:1291
+#: branch.c:67
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+msgid "Not setting branch %s as its own upstream."
 msgstr ""
-"Зададена е неправилна стойност на променливата на средата "
-"„GIT_INDEX_VERSION“.\n"
-"Ще се ползва версия %i"
+"Клонът „%s“ не може да служи като източник за собствената си синхронизация."
 
-#: refs.c:543 builtin/merge.c:764 builtin/merge.c:883 builtin/merge.c:985
-#: builtin/merge.c:995
+#: branch.c:93
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "„%s“ не може да бъде отворен за запис"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“ чрез "
+"пребазиране."
 
-#: refs/files-backend.c:2243
+#: branch.c:94
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82: %s"
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е â\80\9e%sâ\80\9c."
 
-#: refs/files-backend.c:2246
+#: branch.c:98
 #, c-format
-msgid "could not delete references: %s"
-msgstr "Указателите не може да бъдат изтрити: %s"
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr ""
+"Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране."
 
-#: refs/files-backend.c:2255
+#: branch.c:99
 #, c-format
-msgid "could not remove reference %s"
-msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82"
+msgid "Branch %s set up to track local branch %s."
+msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾Ñ\82о Ñ\85Ñ\80анилиÑ\89е."
 
-#: ref-filter.c:55
+#: branch.c:104
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "оÑ\87акван Ñ\84оÑ\80маÑ\82: %%(color:ЦÐ\92ЯТ)"
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди Ð¾Ñ\82далеÑ\87ениÑ\8f Ñ\83казаÑ\82ел â\80\9e%sâ\80\9c Ñ\87Ñ\80ез Ð¿Ñ\80ебазиÑ\80ане."
 
-#: ref-filter.c:57
+#: branch.c:105
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "непознаÑ\82 Ñ\86вÑ\8fÑ\82: %%(color:%s)"
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди Ð¾Ñ\82далеÑ\87ениÑ\8f Ñ\83казаÑ\82ел â\80\9e%sâ\80\9c."
 
-#: ref-filter.c:71
+#: branch.c:109
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "непознаÑ\82 Ñ\84оÑ\80маÑ\82: %%(%s)"
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr "Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ñ\89е Ñ\81леди Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ\8f Ñ\83казаÑ\82ел â\80\9e%sâ\80\9c Ñ\87Ñ\80ез Ð¿Ñ\80ебазиÑ\80ане."
 
-#: ref-filter.c:77
+#: branch.c:110
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) не приема аргументи"
+msgid "Branch %s set up to track local ref %s."
+msgstr "Клонът „%s“ ще следи локалния указател „%s“."
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Настройките за следения клон не могат да бъдат записани"
 
-#: ref-filter.c:84
+#: branch.c:156
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) не приема аргументи"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Няма следене: информацията за указателя „%s“ не е еднозначна"
 
-#: ref-filter.c:101
+#: branch.c:185
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "очаква се положителна стойност за „contents:lines=%s“"
+msgid "'%s' is not a valid branch name."
+msgstr "„%s“ не е позволено име за клон."
 
-#: ref-filter.c:103
+#: branch.c:190
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "непознат аргумент за %%(contents): %s"
+msgid "A branch named '%s' already exists."
+msgstr "Вече съществува клон с име „%s“."
+
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Текущият клон не може да бъде принудително обновен."
 
-#: ref-filter.c:113
+#: branch.c:218
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "непознаÑ\82 Ð°Ñ\80гÑ\83менÑ\82 Ð·Ð° %%(objectname): %s"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr "Ð\97ададениÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ð·Ð° Ñ\81леденеÑ\82о Ñ\81а Ð³Ñ\80еÑ\88ни â\80\94 Ð½Ð°Ñ\87алоÑ\82о â\80\9e%sâ\80\9c Ð½Ðµ Ðµ ÐºÐ»Ð¾Ð½."
 
-#: ref-filter.c:135
+#: branch.c:220
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "заявеният отдалечен клон „%s“ не съществува"
+
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Ако искате да базирате работата си на клон от отдалечено хранилище, може \n"
+"да се наложи да изпълните „git fetch“, за да получите информацията за него.\n"
+"\n"
+"Ако искате да изтласкате нов, локален клон, който да следи отдалечен клон,\n"
+"може да използвате „git push -u“, за да настроите към кой клон да се "
+"изтласква."
 
-#: ref-filter.c:147
+#: branch.c:265
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "непознаÑ\82а Ð¿Ð¾Ð·Ð¸Ñ\86иÑ\8f: %s"
+msgid "Not a valid object name: '%s'."
+msgstr "Ð\9dепÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: â\80\9e%sâ\80\9c"
 
-#: ref-filter.c:151
+#: branch.c:285
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "непознаÑ\82а Ñ\88иÑ\80оÑ\87ина: %s"
+msgid "Ambiguous object name: '%s'."
+msgstr "Ð\98меÑ\82о Ð½Ð° Ð¾Ð±ÐµÐºÑ\82 Ð½Ðµ Ðµ ÐµÐ´Ð½Ð¾Ð·Ð½Ð°Ñ\87но: â\80\9e%sâ\80\9c"
 
-#: ref-filter.c:157
+#: branch.c:290
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "непознаÑ\82 Ð°Ñ\80гÑ\83менÑ\82 Ð·Ð° %%(align): %s"
+msgid "Not a valid branch point: '%s'."
+msgstr "Ð\9dепÑ\80авилно Ð¼Ñ\8fÑ\81Ñ\82о Ð·Ð° Ð½Ð°Ñ\87ало Ð½Ð° ÐºÐ»Ð¾Ð½: â\80\9e%sâ\80\9c"
 
-#: ref-filter.c:161
+#: branch.c:344
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "очаква се положителна широчина с лексемата „%%(align)“"
+msgid "'%s' is already checked out at '%s'"
+msgstr "„%s“ вече е изтеглен в „%s“"
 
-#: ref-filter.c:244
+#: branch.c:364
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "непÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: â\80\9e%.*sâ\80\9c"
+msgid "HEAD of working tree %s is not updated"
+msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð½Ð° Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
 
-#: ref-filter.c:270
+#: bundle.c:34
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "непознаÑ\82о Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: â\80\9e%.*sâ\80\9c"
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "ФайлÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¸Ð·Ð³Ð»ÐµÐ¶Ð´Ð° Ð´Ð° Ðµ Ð¿Ñ\80аÑ\82ка Ð½Ð° git Ð²ÐµÑ\80Ñ\81иÑ\8f 2"
 
-#: ref-filter.c:372
+#: bundle.c:61
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "гÑ\80еÑ\88ка Ð²Ñ\8aв Ñ\84оÑ\80маÌ\80Ñ\82а: Ð»ÐµÐºÑ\81емаÑ\82а %%(end) Ðµ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð° Ð±ÐµÐ· Ñ\81Ñ\8aоÑ\82веÑ\82наÑ\82а Ñ\9d"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "непознаÑ\82а Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð° Ñ\87аÑ\81Ñ\82: %s%s (%d)"
 
-#: ref-filter.c:424
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
 #, c-format
-msgid "malformed format string %s"
-msgstr "неправилен низ за форматиране „%s“"
+msgid "could not open '%s'"
+msgstr "„%s“ не може да се отвори"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr "„:strip=“ изисква аргумент цяло, положително число"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "В хранилището липсват следните необходими подавания:"
 
-#: ref-filter.c:883
-#, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "указателят „%s“ не разполага с %ld компоненти за премахване (:strip)"
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "неуспешно настройване на обхождането на версиите"
 
-#: ref-filter.c:1046
+#: bundle.c:185
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "непознато „%.*s“, формат „%s“"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "Пратката съдържа следния указател:"
+msgstr[1] "Пратката съдържа следните %d указатели:"
 
-#: ref-filter.c:1066 ref-filter.c:1097
-#, c-format
-msgid "missing object %s for %s"
-msgstr "обектът „%s“ липсва за „%s“"
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Пратката съдържа пълна история."
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: bundle.c:194
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "неуспешно анализиране чрез „parse_object_buffer“ на „%s“ за „%s“"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "Пратката изисква следния указател:"
+msgstr[1] "Пратката изисква следните %d указатели:"
 
-#: ref-filter.c:1311
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "обект със сгрешен формат при „%s“"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Командата „git pack-objects“ не може да бъде стартирана"
 
-#: ref-filter.c:1373
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "игнориране на указателя с грешно име „%s“"
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "Командата „git pack-objects“ не завърши успешно"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "Командата „git rev-list“ не завърши успешно"
 
-#: ref-filter.c:1378
+#: bundle.c:353
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "игнориране на повредения указател „%s“"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr ""
+"указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
 
-#: ref-filter.c:1651
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "грешка във форма̀та: липсва лексемата %%(end)"
+msgid "unrecognized argument: %s"
+msgstr "непознат аргумент: %s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Създаването на празна пратка е невъзможно."
 
-#: ref-filter.c:1705
+#: bundle.c:463
 #, c-format
-msgid "malformed object name %s"
-msgstr "неправилно име на обект „%s“"
+msgid "cannot create '%s'"
+msgstr "Файлът „%s“ не може да бъде създаден"
+
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "Командата „git index-pack“ не завърши успешно"
 
-#: remote.c:746
+#: color.c:300
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "Ð\9dевÑ\8aзможно Ðµ Ð´Ð° Ñ\81е Ð´Ð¾Ñ\81Ñ\82авÑ\8fÑ\82 ÐµÐ´Ð½Ð¾Ð²Ñ\80еменно Ð¸ â\80\9e%sâ\80\9c, Ð¸ â\80\9e%sâ\80\9c ÐºÑ\8aм â\80\9e%sâ\80\9c"
+msgid "invalid color value: %.*s"
+msgstr "непÑ\80авилна Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð·Ð° Ñ\86вÑ\8fÑ\82: %.*s"
 
-#: remote.c:750
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "â\80\9e%sâ\80\9c Ð¾Ð±Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¾ Ñ\81леди â\80\9e%sâ\80\9c, Ð° Ð½Ðµ â\80\9e%sâ\80\9c"
+msgid "could not parse %s"
+msgstr "â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80а"
 
-#: remote.c:754
+#: commit.c:42
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "„%s“ следи както „%s“, така и „%s“"
+msgid "%s %s is not a commit!"
+msgstr "%s %s не е подаване!"
 
-#: remote.c:762
-msgid "Internal error"
-msgstr "Вътрешна грешка"
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: съобщението при подаване не е кодирано с UTF-8.\n"
+"Може да поправите подаването заедно със съобщението или може да\n"
+"зададете ползваното кодиране в настройката „i18n.commitencoding“.\n"
 
-#: remote.c:1678 remote.c:1721
-msgid "HEAD does not point to a branch"
-msgstr "Указателят „HEAD“ не сочи към клон"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "паметта свърши"
+
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr "относителните условни изрази за вмъкване трябва да идват от файлове"
 
-#: remote.c:1687
+#: config.c:711
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "няма клон на име „%s“"
+msgid "bad config line %d in blob %s"
+msgstr "неправилен ред за настройки %d в BLOB „%s“"
 
-#: remote.c:1690
+#: config.c:715
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "не е зададен клон-източник за клона „%s“"
+msgid "bad config line %d in file %s"
+msgstr "неправилен ред за настройки %d във файла „%s“"
 
-#: remote.c:1696
+#: config.c:719
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "клонÑ\8aÑ\82-изÑ\82оÑ\87ник â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ñ\81Ñ\8aÑ\85Ñ\80анен ÐºÐ°Ñ\82о Ñ\81ледÑ\8fÑ\89 ÐºÐ»Ð¾Ð½"
+msgid "bad config line %d in standard input"
+msgstr "непÑ\80авилен Ñ\80ед Ð·Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойки %d Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од"
 
-#: remote.c:1711
+#: config.c:723
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-"липсва локален следящ клон за местоположението за изтласкване „%s“ в "
-"хранилището „%s“"
+msgid "bad config line %d in submodule-blob %s"
+msgstr "неправилен ред за настройки %d в BLOB за подмодул „%s“"
 
-#: remote.c:1726
+#: config.c:727
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "няма информация клонът „%s“ да следи някой друг"
+msgid "bad config line %d in command line %s"
+msgstr "неправилен ред за настройки %d на командния ред „%s“"
 
-#: remote.c:1737
+#: config.c:731
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "указателят за изтласкване на „%s“ не включва „%s“"
+msgid "bad config line %d in %s"
+msgstr "неправилен ред за настройки %d в „%s“"
 
-#: remote.c:1750
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
+#: config.c:859
+msgid "out of range"
+msgstr "извън диапазона"
 
-#: remote.c:1772
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "пÑ\80оÑ\81Ñ\82оÑ\82о (simple) Ð¸Ð·Ñ\82лаÑ\81кване Ð½Ðµ Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82ва Ð½Ð° ÐµÐ´Ð½Ð° Ñ\86ел"
+#: config.c:859
+msgid "invalid unit"
+msgstr "непÑ\80авилна Ð¼ÐµÑ\80на ÐµÐ´Ð¸Ð½Ð¸Ñ\86а"
 
-#: remote.c:2074
+#: config.c:865
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
-
-#: remote.c:2078
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "неправилна числова стойност „%s“ за „%s“: %s"
 
-#: remote.c:2081
+#: config.c:870
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Ð\9aлонÑ\8aÑ\82 Ðµ Ð°ÐºÑ\82Ñ\83ализиÑ\80ан ÐºÑ\8aм â\80\9e%sâ\80\9c.\n"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "непÑ\80авилна Ñ\87иÑ\81лова Ñ\81Ñ\82ойноÑ\81Ñ\82 â\80\9e%sâ\80\9c Ð·Ð° â\80\9e%sâ\80\9c Ð² BLOB â\80\9e%sâ\80\9c: %s"
 
-#: remote.c:2085
+#: config.c:873
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Клонът ви е с %2$d подаване пред „%1$s“.\n"
-msgstr[1] "Клонът ви е с %2$d подавания пред „%1$s“.\n"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ във файла „%s“: %s"
 
-#: remote.c:2091
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (публикувайте локалните си промени чрез „git push“)\n"
+#: config.c:876
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ на стандартния вход: %s"
 
-#: remote.c:2094
+#: config.c:879
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-"Клонът ви е с %2$d подаване зад „%1$s“ и може да бъде тривиално слят.\n"
-msgstr[1] ""
-"Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде тривиално слят.\n"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ в BLOB от подмодул „%s“: %s"
 
-#: remote.c:2102
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (обновете локалния си клон чрез „git pull“)\n"
+#: config.c:882
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ на командния ред „%s“: %s"
 
-#: remote.c:2105
+#: config.c:885
 #, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"Текущият клон се е отделил от „%s“,\n"
-"двата имат съответно по %d и %d несъвпадащи подавания.\n"
-msgstr[1] ""
-"Текущият клон се е отделил от „%s“,\n"
-"двата имат съответно по %d и %d несъвпадащи подавания.\n"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "неправилна числова стойност „%s“ за „%s“ в %s: %s"
 
-#: remote.c:2115
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
+#: config.c:980
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
 
-#: revision.c:2142
-msgid "your current branch appears to be broken"
-msgstr "Текущият клон е повреден"
+#: config.c:1075 config.c:1086
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "неправилно ниво на компресиране: %d"
 
-#: revision.c:2145
+#: config.c:1203
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "ТекÑ\83Ñ\89иÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c Ðµ Ð±ÐµÐ· Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f "
+msgid "invalid mode for object creation: %s"
+msgstr "непÑ\80авилен Ñ\80ежим Ð·Ð° Ñ\81Ñ\8aздаванеÑ\82о Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и: %s"
 
-#: revision.c:2339
-msgid "--first-parent is incompatible with --bisect"
-msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими"
+#: config.c:1359
+#, c-format
+msgid "bad pack compression level %d"
+msgstr "неправилно ниво на компресиране при пакетиране: %d"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "неуспешно отваряне на „/dev/null“"
+#: config.c:1557
+msgid "unable to parse command-line config"
+msgstr "неправилни настройки от командния ред"
 
-#: run-command.c:94
-#, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "неуспешно изпълнение на dup2(%d,%d)"
+#: config.c:1611
+msgid "unknown error occurred while reading the configuration files"
+msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-msgstr "сертификатът за изтласкване не може да бъде подписан"
+#: config.c:1970
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "Неправилен %s: „%s“"
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "отсрещната страна не поддържа изтласкване с опцията „--signed“"
+#: config.c:1991
+#, c-format
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr ""
+"непозната стойност „%s“ за настройката „core.untrackedCache“. Ще се ползва "
+"стандартната стойност „keep“ (запазване)"
 
-#: send-pack.c:406
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
+#: config.c:2017
+#, c-format
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
 msgstr ""
-"отсрещната страна не поддържа изтласкване с опцията „--signed“, затова не се "
-"използва сертификат"
+"стойността на „splitIndex.maxPercentChange“ трябва да е между 1 и 100, а не "
+"%d"
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“"
+#: config.c:2028
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "неразпозната стойност „%s“ от командния ред"
 
-# FIXME git add <path…> for consistence
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"след коригирането на конфликтите, отбележете съответните\n"
-"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
+#: config.c:2030
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"след коригирането на конфликтите, отбележете съответните\n"
-"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“, след което\n"
-"подайте резултата с командата „git commit'“."
+#: config.c:2089
+#, c-format
+msgid "%s has multiple values"
+msgstr "зададени са няколко стойности за „%s“"
 
-# FIXME - must be the same as Could not write to '%s' above
-#: sequencer.c:190 sequencer.c:833 sequencer.c:912
+#: config.c:2423 config.c:2648
 #, c-format
-msgid "Could not write to %s"
-msgstr "„%s“ не може да бъде записан"
+msgid "fstat on %s failed"
+msgstr "неуспешно изпълнение на „fstat“ върху „%s“"
+
+#: config.c:2541
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "„%s“ не може да се зададе да е „%s“"
 
-#: sequencer.c:193
+#: config.c:2543 builtin/remote.c:774
 #, c-format
-msgid "Error wrapping up %s"
-msgstr "Обработката на „%s“ не завърши успешно."
+msgid "could not unset '%s'"
+msgstr "„%s“ не може да се премахне"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Ð\9bокалниÑ\82е Ð²Ð¸ Ð¿Ñ\80омени Ñ\89е Ð±Ñ\8aдаÑ\82 Ð¿Ñ\80езапиÑ\81ани Ð¿Ñ\80и Ð¾Ñ\82биÑ\80анеÑ\82о Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f."
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Ð\9eÑ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е Ð¿Ñ\80екÑ\8aÑ\81на Ð²Ñ\80Ñ\8aзкаÑ\82а Ð²ÐµÐ´Ð½Ð°Ð³Ð° Ñ\81лед Ð¾Ñ\82ваÑ\80Ñ\8fнеÑ\82о Ñ\9d"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Локалните ви промени ще бъдат презаписани при отмяната на подавания."
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"Не може да се чете от отдалеченото хранилище.\n"
+"\n"
+"Проверете дали то съществува и дали имате права\n"
+"за достъп."
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Подайте или скатайте промените, за да продължите"
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Проверка на връзката"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: новият индекс не може да бъде запазен"
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Командата „git rev-list“ не може да бъде изпълнена."
 
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Ð\9fодаванеÑ\82о Ñ\81оÑ\87ено Ð¾Ñ\82 Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82о\n"
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "неÑ\83Ñ\81пеÑ\88ен Ð·Ð°Ð¿Ð¸Ñ\81 Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð²ÐµÑ\80Ñ\81ииÑ\82е"
 
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Дървото на кеша не може да бъде обновено\n"
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "стандартният вход на списъка с версиите не може да бъде затворен"
 
-#: sequencer.c:390
+#: convert.c:201
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Подаването „%s“ не може да бъде анализирано\n"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"Всяка последователност от знаци „CRLF“ ще бъдe заменена с „LF“ в „%s“.\n"
+"Файлът ще остане с първоначалните знаци за край на ред в работната ви "
+"директория."
 
-#: sequencer.c:395
+#: convert.c:205
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "РодиÑ\82елÑ\81коÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80ано\n"
+msgid "CRLF would be replaced by LF in %s."
+msgstr "Ð\92Ñ\81Ñ\8fка Ð¿Ð¾Ñ\81ледоваÑ\82елноÑ\81Ñ\82 Ð¾Ñ\82 Ð·Ð½Ð°Ñ\86и â\80\9eCRLFâ\80\9c Ñ\89е Ð±Ñ\8aдe Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ð° Ñ\81 â\80\9eLFâ\80\9c Ð² â\80\9e%sâ\80\9c."
 
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Индексът не е слят."
-
-#: sequencer.c:479
+#: convert.c:211
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Подаването „%s“ е сливане, но не е дадена опцията „-m“"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"Всеки знак „LF“ ще бъдe заменен с последователността от знаци „CRLF“ в "
+"„%s“.\n"
+"Файлът ще остане с първоначалните знаци за край на ред в работната ви "
+"директория."
 
-#: sequencer.c:487
+#: convert.c:215
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Подаването „%s“ няма родител %d"
+msgid "LF would be replaced by CRLF in %s"
+msgstr ""
+"Всеки знак „LF“ ще бъдe заменен с последователността от знаци „CRLF“ в „%s“."
+
+#: date.c:97
+msgid "in the future"
+msgstr "в бъдещето"
 
-#: sequencer.c:491
+#: date.c:103
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Указано е базово подаване, но подаването „%s“ не е сливане."
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "преди %lu секунда"
+msgstr[1] "преди %lu секунди"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#: date.c:110
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: неразпозната стойност за родителското подаване „%s“"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "преди %lu минута"
+msgstr[1] "преди %lu минути"
 
-#: sequencer.c:508
+#: date.c:117
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Неуспешно извличане на съобщението за подаване на „%s“"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "преди %lu час"
+msgstr[1] "преди %lu часа"
 
-#: sequencer.c:594
+#: date.c:124
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "подаването „%s“… не може да бъде отменено: „%s“"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "преди %lu ден"
+msgstr[1] "преди %lu дена"
 
-#: sequencer.c:595
+#: date.c:130
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "подаването „%s“… не може да бъде приложено: „%s“"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "преди %lu седмица"
+msgstr[1] "преди %lu седмици"
 
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "зададено е празно множество от подавания"
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "преди %lu месец"
+msgstr[1] "преди %lu месеца"
 
-#: sequencer.c:638
+#: date.c:148
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: неуспешно изчитане на индекса"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu година"
+msgstr[1] "%lu години"
 
-#: sequencer.c:642
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: неуспешно обновяване на индекса"
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "преди %s и %lu месец"
+msgstr[1] "преди %s и %lu месеца"
 
-#: sequencer.c:702
+#: date.c:156 date.c:161
 #, c-format
-msgid "Cannot %s during a %s"
-msgstr "По време на „%1$s“ не може да се извърши „%2$s“"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "преди %lu година"
+msgstr[1] "преди %lu години"
 
-#: sequencer.c:724
+#: diffcore-order.c:24
 #, c-format
-msgid "Could not parse line %d."
-msgstr "%d-ят ред не може да се анализира."
+msgid "failed to read orderfile '%s'"
+msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
 
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Ð\9dикое Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8fÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ñ\80азпознае."
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "ТÑ\8aÑ\80Ñ\81ене Ð½Ð° Ð¿Ñ\80еименÑ\83ваниÑ\8f Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и Ñ\81Ñ\8aÑ\87еÑ\82ани Ñ\81 Ð¿Ñ\80омени"
 
-# FIXME Could not open %s. - full stop for consistence with next message
-#: sequencer.c:741
+#: diff.c:62
 #, c-format
-msgid "Could not open %s"
-msgstr "„%s“ не може да се прочете."
+msgid "option '%s' requires a value"
+msgstr "опцията „%s“ изисква стойност"
 
-#: sequencer.c:745
+#: diff.c:124
 #, c-format
-msgid "Could not read %s."
-msgstr "„%s“ не може да се отвори."
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr ""
+"  Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
+"директории\n"
 
-#: sequencer.c:752
+#: diff.c:129
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Файлът с описание на предстоящите действия — „%s“ не може да се ползва"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Непознат параметър „%s“ за статистиката по директории'\n"
 
-#: sequencer.c:782
+#: diff.c:281
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Неправилен ключ: „%s“"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: diff.c:344
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Неправилна стойност за „%s“: „%s“"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"Грешки в настройката „diff.dirstat“:\n"
+"%s"
 
-#: sequencer.c:795
+#: diff.c:3102
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Неправилно съдържание на файла с опции: „%s“"
+msgid "external diff died, stopping at %s"
+msgstr ""
+"външната програма за разлики завърши неуспешно.  Спиране на работата при „%s“"
 
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
 msgstr ""
-"в момента вече се извършва отбиране на подавания или пребазиране на клона"
+"Опциите „--name-only“, „--name-status“, „--check“ и „-s“ са несъвместими "
+"една с друга"
 
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "използвайÑ\82е â\80\9egit cherry-pick (--continue | --quit | --abort)â\80\9c"
+#: diff.c:3518
+msgid "--follow requires exactly one pathspec"
+msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e--followâ\80\9c Ð¸Ð·Ð¸Ñ\81ква Ñ\82оÑ\87но ÐµÐ´Ð¸Ð½ Ð¿Ñ\8aÑ\82"
 
-#: sequencer.c:819
+#: diff.c:3681
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Директорията за секвенсора „%s“ не може да бъде създадена"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"Неразпознат параметър към опцията „--dirstat/-X“:\n"
+"%s"
 
-#: sequencer.c:835 sequencer.c:916
+#: diff.c:3695
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Ð\9eбÑ\80абоÑ\82каÑ\82а Ð½Ð° â\80\9e%sâ\80\9c Ð½Ðµ Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88и Ñ\83Ñ\81пеÑ\88но."
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Ð\9dеÑ\80азпознаÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\8aÑ\80 ÐºÑ\8aм Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--submoduleâ\80\9c: â\80\9e%sâ\80\9c"
 
-#: sequencer.c:854 sequencer.c:986
-msgid "no cherry-pick or revert in progress"
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
 msgstr ""
-"в момента не се извършва отбиране на подавания или пребазиране на клона"
-
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
+"търсенето на преименувания на обекти съчетани с промени се прескача поради "
+"многото файлове."
 
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
 msgstr ""
-"действието не може да бъде преустановено, когато сте на клон, който тепърва "
-"предстои да бъде създаден"
-
-#: sequencer.c:878 builtin/fetch.c:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s"
-msgstr "„%s“ не може да бъде отворен"
+"установени са точните копия на променените пътища поради многото файлове."
 
-#: sequencer.c:880
+#: diff.c:4725
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "файлът „%s“ не може да бъде прочетен: %s"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr "задайте променливата „%s“ да е поне %d и отново изпълнете командата."
 
-#: sequencer.c:881
-msgid "unexpected end of file"
-msgstr "неоÑ\87акван ÐºÑ\80ай Ð½Ð° Ñ\84айл"
+#: dir.c:1899
+msgid "failed to get kernel name and information"
+msgstr "имеÑ\82о Ð¸ Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\82а Ð½Ð° Ñ\8fдÑ\80оÑ\82о Ð½Ðµ Ð±Ñ\8fÑ\85а Ð¿Ð¾Ð»Ñ\83Ñ\87ени"
 
-#: sequencer.c:887
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+#: dir.c:2018
+msgid "Untracked cache is disabled on this system or location."
 msgstr ""
-"запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
-"повреден"
+"Кеша за неследените файлове е изключен на тази система или местоположение."
 
-#: sequencer.c:909
+#: dir.c:2776 dir.c:2781
 #, c-format
-msgid "Could not format %s."
-msgstr "ФайлÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ñ\84оÑ\80маÑ\82иÑ\80а Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\85одÑ\8fÑ\89иÑ\8f Ð½Ð°Ñ\87ин."
+msgid "could not create directories for %s"
+msgstr "диÑ\80екÑ\82оÑ\80ииÑ\82е Ð·Ð° â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aдаÑ\82 Ñ\81Ñ\8aздадени"
 
-#: sequencer.c:1054
+#: dir.c:2806
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: не може да се отбере „%s“"
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "директорията на git не може да се мигрира от „%s“ до „%s“"
 
-#: sequencer.c:1057
+#: entry.c:280
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: неправилна версия"
+msgid "could not stat file '%s'"
+msgstr "неуспешно изпълнение на „stat“ върху файла „%s“"
 
-#: sequencer.c:1091
-msgid "Can't revert as initial commit"
-msgstr "Първоначалното подаване не може да бъде отменено"
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: очаква се плитък списък"
 
-#: sequencer.c:1092
-msgid "Can't cherry-pick into empty head"
-msgstr "При празен връх не могат да се отбират подавания"
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен „EOF“"
 
-#: setup.c:248
+#: fetch-pack.c:280 builtin/archive.c:63
 #, c-format
-msgid "failed to read %s"
-msgstr "файлът „%s“ не може да бъде прочетен"
+msgid "remote error: %s"
+msgstr "отдалечена грешка: %s"
 
-#: setup.c:468
+#: fetch-pack.c:281
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Очаква се версия на хранилището на git <= %d, а не %d"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: очакваше се „ACK“/„NAK“, а бе получен „%s“"
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "открити са непознати разширения в хранилището:"
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "опцията „--stateless-rpc“ изисква  „multi_ack_detailed“"
 
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-"отместване преди края на пакетния файл (възможно е индексът да е повреден)"
+#: fetch-pack.c:419
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "неправилен плитък ред: „%s“"
 
-#: sha1_file.c:2458
+#: fetch-pack.c:425
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-"отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
-"индексът да е повреден)"
+msgid "invalid unshallow line: %s"
+msgstr "неправилен неплитък ред: „%s“"
 
-#: sha1_file.c:2462
+#: fetch-pack.c:427
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-"отместване преди края на индекса на пакетния файл „%s“ (възможно е индексът "
-"да е отрязан)"
+msgid "object not found: %s"
+msgstr "обектът „%s“ липсва"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-"При нормална работа Git никога не създава указатели, които завършват с 40\n"
-"шестнадесетични знака, защото стандартно те ще бъдат прескачани.\n"
-"Възможно е такива указатели да са създадени случайно. Например:\n"
-"\n"
-"  git checkout -b $BRANCH $(git rev-parse…)\n"
-"\n"
-"където стойността на променливата на средата BRANCH е празна, при което се\n"
-"създава подобен указател. Прегледайте тези указатели и ги изтрийте. Можете "
-"да\n"
-"спрете това съобщение като изпълните командата:\n"
-"„git config advice.objectNameWarning false“"
+#: fetch-pack.c:430
+#, c-format
+msgid "error in object: %s"
+msgstr "грешка в обекта: „%s“"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо "
-"коригирайте конфликтите"
+#: fetch-pack.c:432
+#, c-format
+msgid "no shallow found: %s"
+msgstr "не е открит плитък обект: %s"
 
-#: submodule.c:68 submodule.c:102
+#: fetch-pack.c:435
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Ð\92Ñ\8aв Ñ\84айла â\80\9e.gitmodulesâ\80\9c Ð»Ð¸Ð¿Ñ\81ва Ñ\80аздел Ð·Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f â\80\9epath=%sâ\80\9c"
+msgid "expected shallow/unshallow, got %s"
+msgstr "оÑ\87аква Ñ\81е Ð¿Ð»Ð¸Ñ\82Ñ\8aк Ð¸Ð»Ð¸ Ð½Ðµ Ð¾Ð±ÐµÐºÑ\82, Ð° Ð±Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87ено: %s"
 
-#: submodule.c:76
+#: fetch-pack.c:474
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Ð\97апиÑ\81Ñ\8aÑ\82 â\80\9e%sâ\80\9c Ð²Ñ\8aв Ñ\84айла â\80\9e.gitmodulesâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оменен"
+msgid "got %s %d %s"
+msgstr "полÑ\83Ñ\87ено Ð±Ðµ %s %d %s"
 
-#: submodule.c:109
+#: fetch-pack.c:488
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Ð\97апиÑ\81Ñ\8aÑ\82 â\80\9e%sâ\80\9c Ð²Ñ\8aв Ñ\84айла â\80\9e.gitmodulesâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82"
+msgid "invalid commit %s"
+msgstr "непÑ\80авилно Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ: â\80\9e%sâ\80\9c"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ð´Ð¾Ð±Ð°Ð²Ñ\8fне Ð½Ð° Ð¿Ñ\80оменениÑ\8f Ñ\84айл â\80\9e.gitmodulesâ\80\9c Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: fetch-pack.c:521
+msgid "giving up"
+msgstr "пÑ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "Ð\9dаÑ\81Ñ\82Ñ\80ойкаÑ\82а â\80\9esubmodule.fetchJobsâ\80\9c Ð½Ðµ Ð¿Ñ\80иема Ð¾Ñ\82Ñ\80иÑ\86аÑ\82елни Ñ\81Ñ\82ойноÑ\81Ñ\82и"
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
+msgstr "дейÑ\81Ñ\82виеÑ\82о Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88и"
 
-#: submodule-config.c:355
+#: fetch-pack.c:543
 #, c-format
-msgid "invalid value for %s"
-msgstr "Ð\9dепÑ\80авилна Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð·Ð° â\80\9e%sâ\80\9c"
+msgid "got %s (%d) %s"
+msgstr "полÑ\83Ñ\87ено Ð±Ðµ %s (%d) %s"
 
-#: trailer.c:237
+#: fetch-pack.c:589
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88ваÑ\89аÑ\82а ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° â\80\9e%sâ\80\9c"
+msgid "Marking %s as complete"
+msgstr "Ð\9eÑ\82белÑ\8fзване Ð½Ð° â\80\9e%sâ\80\9c ÐºÐ°Ñ\82о Ð¿Ñ\8aлно"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: fetch-pack.c:737
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "неправилна стойност „%s“ за настройката „%s“"
+msgid "already have %s (%s)"
+msgstr "вече има „%s“ (%s)"
+
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: не може да се създаде процес за демултиплексора"
+
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
+msgstr "протоколна грешка: неправилна заглавна част на пакет"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: fetch-pack.c:839
 #, c-format
-msgid "more than one %s"
-msgstr "стойността „%s“ се повтаря в настройките"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: не може да се създаде процес за „%s“"
 
-#: trailer.c:582
+#: fetch-pack.c:855
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "пÑ\80азна Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88ваÑ\89а Ð»ÐµÐºÑ\81ема Ð² ÐµÐ¿Ð¸Ð»Ð¾Ð³Ð° â\80\9e%.*s“"
+msgid "%s failed"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° â\80\9e%s“"
 
-#: trailer.c:702
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
+msgstr "грешка в демултиплексора"
+
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
+msgstr "Сървърът не поддържа плитки клиенти"
+
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
+msgstr "Сървърът поддържа „multi_ack_detailed“"
+
+#: fetch-pack.c:891
+msgid "Server supports no-done"
+msgstr "Сървърът поддържа „no-done“"
+
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
+msgstr "Сървърът поддържа „multi_ack“"
+
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
+msgstr "Сървърът поддържа „side-band-64k“"
+
+#: fetch-pack.c:905
+msgid "Server supports side-band"
+msgstr "Сървърът поддържа „side-band“"
+
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Сървърът поддържа „allow-tip-sha1-in-want“"
+
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Сървърът поддържа „allow-reachable-sha1-in-want“"
+
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
+msgstr "Сървърът поддържа „ofs-delta“"
+
+#: fetch-pack.c:930
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "вÑ\85одниÑ\8fÑ\82 Ñ\84айл â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
+msgid "Server version is %.*s"
+msgstr "Ð\92еÑ\80Ñ\81иÑ\8fÑ\82а Ð½Ð° Ñ\81Ñ\8aÑ\80вÑ\8aÑ\80а Ðµ: %.*s"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "оÑ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ñ\87еÑ\82е"
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
+msgstr "СÑ\8aÑ\80вÑ\8aÑ\80Ñ\8aÑ\82 Ð½Ðµ Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--shallow-sinceâ\80\9c"
 
-#: trailer.c:857 builtin/am.c:42
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
+msgstr "Сървърът не поддържа опцията „--shallow-exclude“"
+
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
+msgstr "Сървърът не поддържа опцията „--deepen“"
+
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr "няма общи подавания"
+
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: неуспешно доставяне."
+
+#: fetch-pack.c:1127
+msgid "no matching remote head"
+msgstr "не може да бъде открит подходящ връх от отдалеченото хранилище"
+
+#: fetch-pack.c:1149
 #, c-format
-msgid "could not stat %s"
-msgstr "Не може да се получи информация чрез „stat“ за „%s“"
+msgid "no such remote ref %s"
+msgstr "такъв отдалечен указател няма: %s"
 
-#: trailer.c:859
+#: fetch-pack.c:1152
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "„%s“ не е обикновен файл"
+msgid "Server does not allow request for unadvertised object %s"
+msgstr "Сървърът не позволява заявка за необявен „%s“"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "Програмата „gpg“ не подписа данните."
 
-#: trailer.c:861
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "не може да се създаде временен файл"
+
+#: gpg-interface.c:217
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "„%s“: няма права за записване на файла"
+msgid "failed writing detached signature to '%s'"
+msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "временният файл не може да се отвори"
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "прескачане на неправилния цвят „%.*s“ в „log.graphColors“"
 
-#: trailer.c:912
+#: grep.c:1796
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "временният файл не може да се преименува на „%s“"
+msgid "'%s': unable to read %s"
+msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
 
-#: transport-helper.c:1041
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
-msgid "Could not read ref %s"
-msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80оÑ\87еÑ\82е."
+msgid "failed to stat '%s'"
+msgstr "не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾Ð»Ñ\83Ñ\87ена Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ñ\87Ñ\80ез â\80\9estatâ\80\9c Ð·Ð° â\80\9e%sâ\80\9c"
 
-#: unpack-trees.c:64
+#: grep.c:1824
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you can switch branches."
-msgstr ""
-"Изтеглянето ще презапише локалните промени на тези файлове:\n"
-"%%sПодайте или скатайте промените, за да преминете към нов клон."
+msgid "'%s': short read"
+msgstr "„%s“: изчитането върна по-малко байтове от заявените"
 
-#: unpack-trees.c:66
+#: help.c:218
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"Изтеглянето ще презапише локалните промени на тези файлове:\n"
-"%%s"
+msgid "available git commands in '%s'"
+msgstr "налични команди на git от „%s“"
+
+#: help.c:225
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "команди на git от други директории от „$PATH“"
+
+#: help.c:256
+msgid "These are common Git commands used in various situations:"
+msgstr "Това са най-често използваните команди на Git:"
 
-#: unpack-trees.c:69
+#: help.c:321
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you can merge."
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
-"Сливането ще презапише локалните промени на тези файлове:\n"
-"%%sПодайте или скатайте промените, за да слеете."
+"Изглежда, че „%s“ е команда на git, но тя не може да\n"
+"бъде изпълнена.  Вероятно пакетът „git-%s“ е повреден."
+
+#: help.c:376
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
 
-#: unpack-trees.c:71
+#: help.c:398
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
-"Сливането ще презапише локалните промени на тези файлове:\n"
-"%%s"
+"ПРЕДУПРЕЖДЕНИЕ: Пробвахте да изпълните команда на Git на име „%s“, а такава "
+"не\n"
+"съществува.  Изпълнението автоматично продължава, като се счита, че имате "
+"предвид „%s“"
 
-#: unpack-trees.c:74
+#: help.c:403
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you can %s."
-msgstr ""
-"„%s“ ще презапише локалните промени на тези файлове:\n"
-"%%sПодайте или скатайте промените, за да извършите „%s“."
+msgid "in %0.1f seconds automatically..."
+msgstr "след %0.1f секунди…"
 
-#: unpack-trees.c:76
+#: help.c:410
 #, c-format
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: „%s“ не е команда на git.  Погледнете изхода от „git --help“."
+
+#: help.c:414 help.c:480
 msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"„%s“ ще презапише локалните промени на тези файлове:\n"
-"%%s"
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Команда с подобно име е:"
+msgstr[1] ""
+"\n"
+"Команди с подобно име са:"
 
-#: unpack-trees.c:81
+#: help.c:476
 #, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s — %s"
+
+#: ident.c:343
 msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
 msgstr ""
-"Обновяването на тези директории ще изтрие неследените файлове в тях:\n"
-"%s"
+"\n"
+"●●● Въведете самоличност.\n"
+"\n"
+"Изпълнете:\n"
+"\n"
+"  git config --global user.email \"ИМЕ@example.com\"\n"
+"  git config --global user.name \"ВАШЕТО ИМЕ\"\n"
+"\n"
+"и въведете данни за себе си.\n"
+"Ако пропуснете опцията „--global“, самоличността е само за текущото "
+"хранилище.\n"
+"\n"
+
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "липсва адрес за е-поща, а автоматичното отгатване е изключено"
 
-#: unpack-trees.c:85
+#: ident.c:372
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you can switch branches."
+msgid "unable to auto-detect email address (got '%s')"
 msgstr ""
-"Ð\98зÑ\82еглÑ\8fнеÑ\82о Ñ\89е Ð¸Ð·Ñ\82Ñ\80ие Ñ\82ези Ð½ÐµÑ\81ледени Ñ\84айлове Ð² Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во:\n"
-"%%sПреместете ги или ги изтрийте, за да преминете на друг клон."
+"адÑ\80еÑ\81Ñ\8aÑ\82 Ð·Ð° Ðµ-поÑ\89а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82гаÑ\82наÑ\82 (най-добÑ\80оÑ\82о Ð¿Ñ\80едположение Ð±Ðµ "
+"„%s“)"
 
-#: unpack-trees.c:87
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "липсва име, а автоматичното отгатване е изключено"
+
+#: ident.c:388
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
-"%%s"
+msgid "unable to auto-detect name (got '%s')"
+msgstr "името не може да бъде отгатнато (най-доброто предположение бе „%s“)"
 
-#: unpack-trees.c:90
+#: ident.c:396
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you can merge."
-msgstr ""
-"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
-"%%sПреместете ги или ги изтрийте, за да слеете."
+msgid "empty ident name (for <%s>) not allowed"
+msgstr "не може да се ползва празно име като идентификатор (за <%s>)"
 
-#: unpack-trees.c:92
+#: ident.c:402
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
-"%%s"
+msgid "name consists only of disallowed characters: %s"
+msgstr "името съдържа само непозволени знаци: „%s“"
 
-#: unpack-trees.c:95
+#: ident.c:417 builtin/commit.c:611
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you can %s."
-msgstr ""
-"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
-"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
+msgid "invalid date format: %s"
+msgstr "неправилен формат на дата: %s"
 
-#: unpack-trees.c:97
+#: lockfile.c:152
 #, c-format
 msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
 msgstr ""
-"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
-"%%s"
+"Файлът-ключалка „%s.lock“ не може да бъде създаден: %s\n"
+"\n"
+"Изглежда, че и друг процес на git е пуснат в това хранилище, напр.\n"
+"редактор, стартиран с „git commit“.  Уверете се, че всички подобни\n"
+"процеси са спрени и опитайте отново.  Ако това не помогне, вероятната\n"
+"причина е, че някой процес на git в това хранилище е забил.  За да\n"
+"продължите работа, ще трябва ръчно да изтриете файла:"
 
-#: unpack-trees.c:102
+#: lockfile.c:160
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you can switch branches."
-msgstr ""
-"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
-"%%sПреместете ги или ги изтрийте, за да смените клон."
+msgid "Unable to create '%s.lock': %s"
+msgstr "Файлът-ключалка „%s.lock“ не може да бъде създаден: %s"
 
-#: unpack-trees.c:104
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "кешът не може да бъде прочетен"
+
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
+msgid "unable to write new index file"
+msgstr "неуспешно записване на новия индекс"
+
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(лошо подаване)\n"
+
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
-"%%s"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "неуспешно изпълнение на „addinfo_cache“ за пътя „%s“"
+
+#: merge-recursive.c:303
+msgid "error building trees"
+msgstr "грешка при изграждане на дърветата"
 
-#: unpack-trees.c:107
+#: merge-recursive.c:727
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you can merge."
-msgstr ""
-"Сливането ще презапише тези неследени файлове в работното дърво:\n"
-"%%sПреместете ги или ги изтрийте, за да слеете."
+msgid "failed to create path '%s'%s"
+msgstr "грешка при създаването на пътя „%s“%s"
 
-#: unpack-trees.c:109
+#: merge-recursive.c:738
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Сливането ще презапише тези неследени файлове в работното дърво:\n"
-"%%s"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
+
+#: merge-recursive.c:752 merge-recursive.c:771
+msgid ": perhaps a D/F conflict?"
+msgstr ": възможно е да има конфликт директория/файл."
 
-#: unpack-trees.c:112
+#: merge-recursive.c:761
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you can %s."
+msgid "refusing to lose untracked file at '%s'"
 msgstr ""
-"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
-"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
+"преустановяване на действието, за да не се изтрие неследеният файл „%s“"
 
-#: unpack-trees.c:114
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
-"%%s"
+msgid "cannot read object %s '%s'"
+msgstr "обектът „%s“ (%s) не може да бъде прочетен"
 
-#: unpack-trees.c:121
+#: merge-recursive.c:805
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "Ð\97апиÑ\81Ñ\8aÑ\82 Ð·Ð° â\80\9e%sâ\80\9c Ñ\81Ñ\8aвпада Ñ\81 Ñ\82ози Ð·Ð° â\80\9e%sâ\80\9c. Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80иÑ\81вои."
+msgid "blob expected for %s '%s'"
+msgstr "обекÑ\82Ñ\8aÑ\82 â\80\9e%sâ\80\9c (%s) Ñ\81е Ð¾Ñ\87акваÑ\88е Ð´Ð° Ðµ BLOB, Ð° Ð½Ðµ Ðµ"
 
-#: unpack-trees.c:124
+#: merge-recursive.c:829
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"Частичното изтегляне не може да бъде обновено: следните записи не са "
-"актуални:\n"
-"%s"
+msgid "failed to open '%s': %s"
+msgstr "„%s“ не може да се отвори: %s"
 
-#: unpack-trees.c:126
+#: merge-recursive.c:840
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
+msgid "failed to symlink '%s': %s"
+msgstr "неуспешно създаване на символната връзка „%s“: %s"
+
+#: merge-recursive.c:845
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
-"Обновяването на частичното изтегляне ще презапише тези файлове в работното "
-"дърво:\n"
-"%s"
+"не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
+
+#: merge-recursive.c:985
+msgid "Failed to execute internal merge"
+msgstr "Неуспешно вътрешно сливане"
+
+#: merge-recursive.c:989
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "„%s“ не може да се добави в базата с данни"
 
-#: unpack-trees.c:128
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
-"Обновяването на частичното изтегляне ще изтрие тези файлове в работното "
-"дърво:\n"
-"%s"
+"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s.  Версия %s на „%s“ "
+"е оставена в дървото."
 
-#: unpack-trees.c:205
+#: merge-recursive.c:1097
 #, c-format
-msgid "Aborting\n"
-msgstr "Преустановяване на действието\n"
-
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Изтегляне на файлове"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
+msgstr ""
+"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ е преименуван на „%s“ в "
+"%s.  Версия %s на „%s“ е оставена в дървото."
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "неправилна схема за адрес или суфиксът „://“ липсва"
+#: merge-recursive.c:1104
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s.  Версия %s на „%s“ "
+"е оставена в дървото: %s."
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: merge-recursive.c:1109
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "неправилна екранираща последователност „%XX“"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
+msgstr ""
+"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ е преименуван на „%s“ в "
+"%s.  Версия %s на „%s“ е оставена в дървото: %s."
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "не Ðµ Ñ\83казана Ð¼Ð°Ñ\88ина, Ð° Ñ\81Ñ\85емаÑ\82а Ð½Ðµ Ðµ â\80\9efile:â\80\9c"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "пÑ\80еименÑ\83ване"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "пÑ\80и Ñ\81Ñ\85ема â\80\9efile:â\80\9c Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\83казваÑ\82е Ð½Ð¾Ð¼ÐµÑ\80 Ð½Ð° Ð¿Ð¾Ñ\80Ñ\82"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "пÑ\80еименÑ\83ван"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "неправилни знаци в името на машина"
+#: merge-recursive.c:1200
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "неправилен номер на порт"
+#: merge-recursive.c:1225
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
+"„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s."
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "неправилна част от пътя „..“"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (некоригиран конфликт)"
 
-#: wrapper.c:222 wrapper.c:381
+#: merge-recursive.c:1292
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "„%s“ не може да бъде отворен и за четене, и за запис"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr ""
+"КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
+"„%s“, а „%s“ е преименуван на „%s“ в „%s“"
 
-#: wrapper.c:224 wrapper.c:383 builtin/am.c:779
+#: merge-recursive.c:1325
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "„%s“ не може да бъде отворен за запис"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/am.c:772
-#: builtin/am.c:860 builtin/commit.c:1711 builtin/merge.c:1086
-#: builtin/pull.c:407
+#: merge-recursive.c:1528
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "файлът не може да бъде прочетен: „%s“"
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr ""
+"КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
+"„%s“ е добавен в „%s“"
 
-#: wrapper.c:594 wrapper.c:615
+#: merge-recursive.c:1543
 #, c-format
-msgid "unable to access '%s'"
-msgstr "няма достъп до „%s“"
-
-#: wrapper.c:623
-msgid "unable to get current working directory"
-msgstr "текущата работна директория е недостъпна"
+msgid "Adding merged %s"
+msgstr "Добавяне на слетия „%s“"
 
-#: wrapper.c:650
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
-msgid "could not open %s for writing"
-msgstr "„%s“ не може да бъде отворен за запис"
+msgid "Adding as %s instead"
+msgstr "Добавяне като „%s“"
 
-# FIXME - must be the same as Could not write to '%s' above
-#: wrapper.c:661 builtin/am.c:410
+#: merge-recursive.c:1607
 #, c-format
-msgid "could not write to %s"
-msgstr "„%s“ не може да бъде записан"
+msgid "cannot read object %s"
+msgstr "обектът „%s“ не може да се прочете"
 
-#: wrapper.c:667
+#: merge-recursive.c:1610
 #, c-format
-msgid "could not close %s"
-msgstr "„%s“ не може да се затвори"
+msgid "object %s is not a blob"
+msgstr "обектът „%s“ не е BLOB"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Ð\9dеÑ\81леÑ\82и Ð¿Ñ\8aÑ\82иÑ\89а:"
+#: merge-recursive.c:1679
+msgid "modify"
+msgstr "пÑ\80омÑ\8fна"
 
-#: wt-status.c:177 wt-status.c:204
-#, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
+#: merge-recursive.c:1679
+msgid "modified"
+msgstr "променен"
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-"  (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
+#: merge-recursive.c:1689
+msgid "content"
+msgstr "съдържание"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-"  (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
+#: merge-recursive.c:1696
+msgid "add/add"
+msgstr "добавяне/добавяне"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
-"конфликта)"
+#: merge-recursive.c:1732
+#, c-format
+msgid "Skipped %s (merged same as existing)"
+msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-"  (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
+#: merge-recursive.c:1746
+#, c-format
+msgid "Auto-merging %s"
+msgstr "Автоматично сливане на „%s“"
 
-#: wt-status.c:198 wt-status.c:881
-msgid "Changes to be committed:"
-msgstr "Промени, които ще бъдат подадени:"
+#: merge-recursive.c:1750 git-submodule.sh:944
+msgid "submodule"
+msgstr "ПОДМОДУЛ"
 
-#: wt-status.c:216 wt-status.c:890
-msgid "Changes not staged for commit:"
-msgstr "Промени, които не са в индекса за подаване:"
+#: merge-recursive.c:1751
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-"  (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
+#: merge-recursive.c:1845
+#, c-format
+msgid "Removing %s"
+msgstr "Изтриване на „%s“"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-"  (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
+#: merge-recursive.c:1871
+msgid "file/directory"
+msgstr "файл/директория"
 
-#: wt-status.c:223
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
-msgstr ""
-"  (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
-"работното дърво)"
+#: merge-recursive.c:1877
+msgid "directory/file"
+msgstr "директория/файл"
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: merge-recursive.c:1883
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
-"  (подайте или отхвърлете неследеното или промененото съдържание в "
-"подмодÑ\83лиÑ\82е)"
+"КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“.  Добавяне на „%s“ "
+"каÑ\82о â\80\9e%sâ\80\9c"
 
-#: wt-status.c:237
+#: merge-recursive.c:1892
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-"  (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
+msgid "Adding %s"
+msgstr "Добавяне на „%s“"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "изÑ\82Ñ\80иÑ\82и Ð² Ð´Ð²Ð°Ñ\82а Ñ\81лÑ\83Ñ\87аÑ\8f:"
+#: merge-recursive.c:1929
+msgid "Already up-to-date!"
+msgstr "Ð\92еÑ\87е Ðµ Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½Ð¾!"
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "добавени от вас:"
+#: merge-recursive.c:1938
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "изÑ\82Ñ\80иÑ\82и Ð¾Ñ\82 Ñ\82Ñ\8fÑ\85:"
+#: merge-recursive.c:2021
+msgid "Merging:"
+msgstr "Сливане:"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "добавени от тях:"
+#: merge-recursive.c:2034
+#, c-format
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "открит е %u общ предшественик:"
+msgstr[1] "открити са %u общи предшественици:"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "изтрити от вас:"
+#: merge-recursive.c:2073
+msgid "merge returned no commit"
+msgstr "сливането не върна подаване"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "добавени и в двата случая:"
+#: merge-recursive.c:2136
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "Неуспешен анализ на обекта „%s“"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "пÑ\80оменени Ð¸ Ð² Ð´Ð²Ð°Ñ\82а Ñ\81лÑ\83Ñ\87аÑ\8f:"
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
+msgid "Unable to write index."
+msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
 
-#: wt-status.c:266
+#: notes-merge.c:273
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "грешка: състоянието на промяната „%x“ не може да бъде обработено"
-
-#: wt-status.c:274
-msgid "new file:"
-msgstr "нов файл:"
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
+msgstr ""
+"Не сте завършили предишното сливане на бележки.  (Указателят „%s“ "
+"съществува).\n"
+"За да завършите предишното сливане, изпълнете:\n"
+"\n"
+"    git notes merge --commit\n"
+"\n"
+"За да отмените предишното сливане, изпълнете:\n"
+"\n"
+"    git notes merge --abort"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "копиран:"
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr ""
+"Не сте завършили сливането на бележките.  (Указателят „%s“ съществува)."
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "изтрит:"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr ""
+"Неинициализирано или нереферирано дърво за бележки не може да бъде подадено"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "променен:"
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Неправилна стойност за „notes.rewriteMode“: „%s“"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "преименуван:"
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr ""
+"Бележките в „%s“ няма да бъдат презаписани, защото са извън „refs/notes/“."
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "смяна на вида:"
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
+#, c-format
+msgid "Bad %s value: '%s'"
+msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "непозната промяна:"
+#: object.c:240
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "обектът „%s“ не може да бъде анализиран"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "неслят:"
+#: parse-options.c:572
+msgid "..."
+msgstr ""
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "нови подавания, "
-
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "променено съдържание, "
-
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "неследено съдържание, "
-
-#: wt-status.c:391
+#: parse-options.c:590
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено"
-
-#: wt-status.c:755
-msgid "Submodules changed but not updated:"
-msgstr "Подмодулите са променени, но не са обновени:"
+msgid "usage: %s"
+msgstr "употреба: %s"
 
-#: wt-status.c:757
-msgid "Submodule changes to be committed:"
-msgstr "Промени в подмодулите за подаване:"
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
+#, c-format
+msgid "   or: %s"
+msgstr "     или: %s"
 
-#: wt-status.c:838
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr ""
-"Не променяйте горния ред.\n"
-"Всичко отдолу ще бъде изтрито."
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
+msgstr "    %s"
 
-#: wt-status.c:949
-msgid "You have unmerged paths."
-msgstr "Някои пътища не са слети."
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-ЧИСЛО"
 
-#: wt-status.c:952
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "неправилно име на обект „%s“"
 
-#: wt-status.c:956
-msgid "All conflicts fixed but you are still merging."
-msgstr "Всички конфликти са решени, но продължавате сливането."
+#: path.c:810
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
 
-#: wt-status.c:959
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (използвайте „git commit“, за да завършите сливането)"
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
+msgstr ""
+"Екраниращият знак „\\“не може да е последен знак в стойността на атрибут"
 
-#: wt-status.c:969
-msgid "You are in the middle of an am session."
-msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ð¿Ñ\80илагаÑ\82е Ð¿Ð¾Ñ\80едиÑ\86а Ð¾Ñ\82 ÐºÑ\80Ñ\8aпки Ñ\87Ñ\80ез â\80\9egit am“."
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
+msgstr "Ð\9fозволено Ðµ Ñ\81амо ÐµÐ´Ð½Ð¾ Ñ\83казване Ð½Ð° â\80\9eattr:“."
 
-#: wt-status.c:972
-msgid "The current patch is empty."
-msgstr "Текущата кръпка е празна."
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "„attr:“ трябва да указва стойност"
 
-#: wt-status.c:976
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
+#: pathspec.c:189
+#, c-format
+msgid "invalid attribute name %s"
+msgstr "неправилно име на атрибут: „%s“"
 
-#: wt-status.c:978
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
+#: pathspec.c:254
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "глобалните настройки за пътища „glob“ и „noglob“ са несъвместими"
 
-#: wt-status.c:980
-msgid "  (use \"git am --abort\" to restore the original branch)"
+#: pathspec.c:261
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
-"  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
+"глобалната настройка за дословни пътища „literal“ е несъвместима с всички "
+"други глобални настройки за пътища"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "Ð\9dе Ñ\81а Ð¸Ð·Ð¿Ñ\8aлнени ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸."
+#: pathspec.c:301
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "непÑ\80авилен Ð¿Ð°Ñ\80амеÑ\82Ñ\8aÑ\80 Ð·Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а Ð·Ð° Ð¼Ð°Ð³Ð¸Ñ\87еÑ\81ки Ð¿Ñ\8aÑ\82иÑ\89а â\80\9eprefixâ\80\9c"
 
-#: wt-status.c:1108
+#: pathspec.c:322
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Последна изпълнена команда (изпълнена е общо %d команда):"
-msgstr[1] "Последна изпълнена команда (изпълнени са общо %d команди):"
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "Неправилна стойност за опцията за магически пътища „%.*s“ в „%s“"
 
-#: wt-status.c:1119
+#: pathspec.c:327
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  повече информация има във файла „%s“)"
-
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Не остават повече команди."
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "Знакът „)“ липсва в опцията за магически пътища в „%s“"
 
-#: wt-status.c:1127
+#: pathspec.c:365
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Следваща команда за изпълнение (остава още %d команда):"
-msgstr[1] "Следваща команда за изпълнение (остават още %d команди):"
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Магическите пътища „%c“ са без реализация за „%s“"
 
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr ""
-"  (използвайте „git rebase --edit-todo“, за да разгледате и редактирате)"
+#: pathspec.c:421 pathspec.c:443
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Пътят „%s“ е в подмодула „%.*s“"
 
-#: wt-status.c:1148
+#: pathspec.c:483
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "В момента пребазирате клона „%s“ върху „%s“."
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: опциите „literal“ и „glob“ са несъвместими"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "В момента пребазирате."
+#: pathspec.c:496
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: „%s“ е извън хранилището"
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (коригирайте конфликтите и използвайте „git rebase --continue“)"
+#: pathspec.c:584
+#, c-format
+msgid "'%s' (mnemonic: '%c')"
+msgstr "„%s“ (клавиш: „%c“)"
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
+#: pathspec.c:594
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: магическите пътища не се поддържат от командата „%s“"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
-"  (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
+"възможно е празните низове да се окажат неправилни шаблони за пътища в "
+"следващи версии на Git.  Ако искате съвпадение с всички пътища, използвайте: "
+"„.“"
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
-
-#: wt-status.c:1181
+#: pathspec.c:668
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "пътят „%s“ е след символна връзка"
 
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\80азделÑ\8fÑ\82е Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð´Ð¾ÐºÐ°Ñ\82о Ð¿Ñ\80ебазиÑ\80аÑ\82е."
+#: pretty.c:982
+msgid "unable to parse --pretty format"
+msgstr "аÑ\80гÑ\83менÑ\82Ñ\8aÑ\82 ÐºÑ\8aм Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--prettyâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80а"
 
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+#: read-cache.c:1442
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"  (След като работното ви дърво стане чисто, използвайте „git rebase --"
-"continue“)"
+"Зададена е неправилна стойност на настройката „index.version“.\n"
+"Ще се ползва версия %i"
 
-#: wt-status.c:1193
+#: read-cache.c:1452
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
+"Зададена е неправилна стойност на променливата на средата "
+"„GIT_INDEX_VERSION“.\n"
+"Ще се ползва версия %i"
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "В момента редактирате подаване докато пребазирате."
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
+#, c-format
+msgid "could not stat '%s'"
+msgstr "неуспешно изпълнение на „stat“ върху „%s“"
 
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-"  (използвайте „git commit --amend“, за да редактирате текущото подаване)"
+#: read-cache.c:2388
+#, c-format
+msgid "unable to open git dir: %s"
+msgstr "не може да се отвори директорията на git: %s"
 
-#: wt-status.c:1203
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-"  (използвайте „git rebase --continue“, след като завършите промените си)"
+#: read-cache.c:2400
+#, c-format
+msgid "unable to unlink: %s"
+msgstr "неуспешно изтриване на „%s“"
 
-#: wt-status.c:1213
+#: refs.c:620 builtin/merge.c:844
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "В момента отбирате подаването „%s“."
+msgid "Could not open '%s' for writing"
+msgstr "„%s“ не може да бъде отворен за запис"
 
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
+msgstr "обновяванията на указатели са забранени в среди под карантина"
 
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
+#: refs/files-backend.c:1631
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "Указателят „%s“ не може да бъде изтрит: %s"
 
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-"  (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
-"отбиране)"
+#: refs/files-backend.c:1634
+#, c-format
+msgid "could not delete references: %s"
+msgstr "Указателите не може да бъдат изтрити: %s"
 
-#: wt-status.c:1232
+#: refs/files-backend.c:1643
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ð¾Ñ\82менÑ\8fÑ\82е Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ â\80\9e%sâ\80\9c."
+msgid "could not remove reference %s"
+msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82"
 
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (коригирайте конфликтите и изпълнете „git revert --continue“)"
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "изтрит"
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (всички конфликти са коригирани, изпълнете „git revert --continue“)"
+#: ref-filter.c:36
+#, c-format
+msgid "ahead %d"
+msgstr "напред с %d"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-"  (използвайте „git revert --abort“, за да преустановите отмяната на "
-"подаване)"
+#: ref-filter.c:37
+#, c-format
+msgid "behind %d"
+msgstr "назад с %d"
 
-#: wt-status.c:1253
+#: ref-filter.c:38
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\82Ñ\8aÑ\80Ñ\81иÑ\82е Ð´Ð²Ð¾Ð¸Ñ\87но, ÐºÐ°Ñ\82о Ñ\81Ñ\82е Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80али Ð¾Ñ\82 ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c."
+msgid "ahead %d, behind %d"
+msgstr "напÑ\80ед Ñ\81 %d, Ð½Ð°Ð·Ð°Ð´ Ñ\81 %d"
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "В момента търсите двоично."
+#: ref-filter.c:104
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "очакван формат: %%(color:ЦВЯТ)"
 
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr ""
-"  (използвайте „git bisect reset“, за да се върнете към първоначалното "
-"състояние и клон)"
+#: ref-filter.c:106
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "непознат цвят: %%(color:%s)"
 
-#: wt-status.c:1460
-msgid "On branch "
-msgstr "На клон "
+#: ref-filter.c:120
+#, c-format
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "очаква се цяло число за „refname:lstrip=%s“"
 
-#: wt-status.c:1466
-msgid "interactive rebase in progress; onto "
-msgstr "извършвате интерактивно пребазиране върху "
+#: ref-filter.c:124
+#, c-format
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "очаква се цяло число за „refname:rstrip=%s“"
 
-#: wt-status.c:1468
-msgid "rebase in progress; onto "
-msgstr "извършвате пребазиране върху "
+#: ref-filter.c:126
+#, c-format
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "непознат аргумент за „%%(%s)“: %s"
 
-#: wt-status.c:1473
-msgid "HEAD detached at "
-msgstr "Указателят „HEAD“ не е свързан и е при "
+#: ref-filter.c:166
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) не приема аргументи"
 
-#: wt-status.c:1475
-msgid "HEAD detached from "
-msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
+#: ref-filter.c:173
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) не приема аргументи"
 
-#: wt-status.c:1478
-msgid "Not currently on any branch."
-msgstr "Извън всички клони."
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) не приема аргументи"
 
-#: wt-status.c:1496
-msgid "Initial commit"
-msgstr "Първоначално подаване"
+#: ref-filter.c:199
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "очаква се положителна стойност за „contents:lines=%s“"
 
-#: wt-status.c:1510
-msgid "Untracked files"
-msgstr "Неследени файлове"
+#: ref-filter.c:201
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "непознат аргумент за %%(contents): %s"
 
-#: wt-status.c:1512
-msgid "Ignored files"
-msgstr "Игнорирани файлове"
+#: ref-filter.c:214
+#, c-format
+msgid "positive value expected objectname:short=%s"
+msgstr "очаква се положителна стойност за „objectname:short=%s“"
 
-#: wt-status.c:1516
+#: ref-filter.c:218
 #, c-format
-msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr ""
-"Бяха необходими %.2f секунди за изброяването на неследените файлове.\n"
-"Добавянето на опцията „-uno“ към командата „git status“, ще ускори\n"
-"изпълнението, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
-"За повече подробности погледнете „git status help“."
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "непознат аргумент за %%(objectname): %s"
 
-#: wt-status.c:1522
+#: ref-filter.c:245
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Неследените файлове не са изведени%s"
-
-#: wt-status.c:1524
-msgid " (use -u option to show untracked files)"
-msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
-
-#: wt-status.c:1530
-msgid "No changes"
-msgstr "Няма промени"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)"
 
-#: wt-status.c:1535
+#: ref-filter.c:257
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr ""
-"към индекса за подаване не са добавени промени (използвайте „git add“ и/или "
-"„git commit -a“)\n"
+msgid "unrecognized position:%s"
+msgstr "непозната позиция: %s"
 
-#: wt-status.c:1538
+#: ref-filter.c:261
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "кÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ñ\81а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ Ð¿Ñ\80омени\n"
+msgid "unrecognized width:%s"
+msgstr "непознаÑ\82а Ñ\88иÑ\80оÑ\87ина: %s"
 
-#: wt-status.c:1541
+#: ref-filter.c:267
 #, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr ""
-"към индекса за подаване не са добавени промени, но има нови файлове "
-"(използвайте „git add“, за да започне тяхното следене)\n"
+msgid "unrecognized %%(align) argument: %s"
+msgstr "непознат аргумент за %%(align): %s"
 
-#: wt-status.c:1544
+#: ref-filter.c:271
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "кÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ñ\81а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ Ð¿Ñ\80омени, Ð½Ð¾ Ð¸Ð¼Ð° Ð½Ð¾Ð²Ð¸ Ñ\84айлове\n"
+msgid "positive width expected with the %%(align) atom"
+msgstr "оÑ\87аква Ñ\81е Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ\82елна Ñ\88иÑ\80оÑ\87ина Ñ\81 Ð»ÐµÐºÑ\81емаÑ\82а â\80\9e%%(align)â\80\9c"
 
-#: wt-status.c:1547
+#: ref-filter.c:286
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-"липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
-"„git add“, за да започне тяхното следене)\n"
+msgid "unrecognized %%(if) argument: %s"
+msgstr "непознат аргумент за „%%(if)“: %s"
 
-#: wt-status.c:1550 wt-status.c:1555
+#: ref-filter.c:371
 #, c-format
-msgid "nothing to commit\n"
-msgstr "липÑ\81ваÑ\82 ÐºÐ°ÐºÐ²Ð¸Ñ\82о Ð¸ Ð´Ð° Ðµ Ð¿Ñ\80омени\n"
+msgid "malformed field name: %.*s"
+msgstr "непÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: â\80\9e%.*sâ\80\9c"
 
-#: wt-status.c:1553
+#: ref-filter.c:397
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr ""
-"липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
-"неследените файлове)\n"
+msgid "unknown field name: %.*s"
+msgstr "непознато име на обект: „%.*s“"
 
-#: wt-status.c:1557
+#: ref-filter.c:501
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
-
-#: wt-status.c:1664
-msgid "Initial commit on "
-msgstr "Първоначално подаване на клон"
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "формат: лексемата %%(if) е използвана без съответната ѝ %%(then)"
 
-#: wt-status.c:1668
-msgid "HEAD (no branch)"
-msgstr "HEAD (извън клон)"
-
-#: wt-status.c:1697
-msgid "gone"
-msgstr "изтрит"
+#: ref-filter.c:561
+#, c-format
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "формат: лексемата %%(then) е използвана без съответната ѝ %%(if)"
 
-#: wt-status.c:1699 wt-status.c:1707
-msgid "behind "
-msgstr "назад с "
+#: ref-filter.c:563
+#, c-format
+msgid "format: %%(then) atom used more than once"
+msgstr "формат: лексемата %%(then) е използвана повече от един път"
 
-#: wt-status.c:1702 wt-status.c:1705
-msgid "ahead "
-msgstr "напред с "
+#: ref-filter.c:565
+#, c-format
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "формат: лексемата %%(then) е използвана след %%(else)"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: ref-filter.c:591
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "неуспешно изтриване на „%s“"
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(if)"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
+#: ref-filter.c:593
+#, c-format
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "формат: лексемата %%(else) е използвана без съответната ѝ %%(then)"
 
-#: builtin/add.c:65
+#: ref-filter.c:595
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "неочакван изходен код при генериране на разлика: %c"
+msgid "format: %%(else) atom used more than once"
+msgstr "формат: лексемата %%(else) е използвана повече от един път"
 
-#: builtin/add.c:70 builtin/commit.c:280
-msgid "updating files failed"
-msgstr "неуспешно обновяване на файловете"
+#: ref-filter.c:608
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "формат: лексемата %%(end) е използвана без съответната ѝ"
 
-#: builtin/add.c:80
+#: ref-filter.c:663
 #, c-format
-msgid "remove '%s'\n"
-msgstr "изÑ\82Ñ\80иване Ð½Ð° â\80\9e%sâ\80\9c\n"
+msgid "malformed format string %s"
+msgstr "непÑ\80авилен Ð½Ð¸Ð· Ð·Ð° Ñ\84оÑ\80маÑ\82иÑ\80ане â\80\9e%sâ\80\9c"
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
+#: ref-filter.c:1247
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(извън клон, пребазиране на „%s“)"
 
-#: builtin/add.c:194 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Индексът не може да бъде прочетен"
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(извън клон, двоично търсене от „%s“)"
 
-#: builtin/add.c:205
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Файлът „%s“ не може да бъде отворен за запис."
+msgid "(HEAD detached at %s)"
+msgstr "(Указателят „HEAD“ не е свързан и е при „%s“)"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "Кръпката не може да бъде записана"
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "Указателят „HEAD“ не е свързан и е отделѐн от „%s“"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "неуспешно редактиране на кръпка"
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(извън клон)"
 
-#: builtin/add.c:215
+#: ref-filter.c:1420 ref-filter.c:1451
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
-
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Празна кръпка, преустановяване на действието."
+msgid "missing object %s for %s"
+msgstr "обектът „%s“ липсва за „%s“"
 
-#: builtin/add.c:222
+#: ref-filter.c:1423 ref-filter.c:1454
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Ð\9aÑ\80Ñ\8aпкаÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80иложена"
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80ане Ñ\87Ñ\80ез â\80\9eparse_object_bufferâ\80\9c Ð½Ð° â\80\9e%sâ\80\9c Ð·Ð° â\80\9e%sâ\80\9c"
 
-#: builtin/add.c:232
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-"Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
+#: ref-filter.c:1692
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "обект със сгрешен формат при „%s“"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:511
-#: builtin/remote.c:1332 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "пробно изпълнeние"
+#: ref-filter.c:1759
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "игнориране на указателя с грешно име „%s“"
 
-#: builtin/add.c:250 builtin/apply.c:4563 builtin/check-ignore.c:19
-#: builtin/commit.c:1333 builtin/count-objects.c:85 builtin/fsck.c:557
-#: builtin/log.c:1826 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "повече подробности"
+#: ref-filter.c:1764
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "игнориране на повредения указател „%s“"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "интерактивно отбиране на промени"
+#: ref-filter.c:2028
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "грешка във форма̀та: липсва лексемата %%(end)"
 
-#: builtin/add.c:253 builtin/checkout.c:1154 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "интерактивен избор на парчета код"
+#: ref-filter.c:2109
+#, c-format
+msgid "malformed object name %s"
+msgstr "неправилно име на обект „%s“"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "редактиране на текущата разлика и прилагане"
+#: remote.c:754
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "добавяне и на иначе игнорираните файлове"
+#: remote.c:758
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "„%s“ обикновено следи „%s“, а не „%s“"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "обновяване на следените файлове"
+#: remote.c:762
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "„%s“ следи както „%s“, така и „%s“"
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
-msgstr "оÑ\82белÑ\8fзване Ñ\81амо Ð½Ð° Ñ\84акÑ\82а, Ñ\87е Ð¿Ñ\8aÑ\82Ñ\8fÑ\82 Ñ\89е Ð±Ñ\8aде Ð´Ð¾Ð±Ð°Ð²ÐµÐ½ Ð¿Ð¾-кÑ\8aÑ\81но"
+#: remote.c:770
+msgid "Internal error"
+msgstr "Ð\92Ñ\8aÑ\82Ñ\80еÑ\88на Ð³Ñ\80еÑ\88ка"
 
-#: builtin/add.c:258
-msgid "add changes from all tracked and untracked files"
-msgstr "добавÑ\8fне Ð½Ð° Ð²Ñ\81иÑ\87ки Ð¿Ñ\80омени Ð² Ñ\81ледениÑ\82е Ð¸ Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове"
+#: remote.c:1685 remote.c:1787
+msgid "HEAD does not point to a branch"
+msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð½Ðµ Ñ\81оÑ\87и ÐºÑ\8aм ÐºÐ»Ð¾Ð½"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-"игнориране на пътищата, които са изтрити от работното дърво (същото като „--"
-"no-all“)"
+#: remote.c:1694
+#, c-format
+msgid "no such branch: '%s'"
+msgstr "няма клон на име „%s“"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "без добавяне на нови файлове, само обновяване на индекса"
+#: remote.c:1697
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "не е зададен клон-източник за клона „%s“"
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-"прескачане на файловете, които не могат да бъдат добавени поради грешки"
+#: remote.c:1703
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
+#: remote.c:1718
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
-"пÑ\80овеÑ\80ка, Ñ\87е Ð¿Ñ\80и Ð¿Ñ\80обно Ð¸Ð·Ð¿Ñ\8aлнение Ð²Ñ\81иÑ\87ки Ñ\84айлове, Ð´Ð¾Ñ\80и Ð¸ Ð¸Ð·Ñ\82Ñ\80иÑ\82иÑ\82е, Ñ\81е "
-"игнорират"
+"липÑ\81ва Ð»Ð¾ÐºÐ°Ð»ÐµÐ½ Ñ\81ледÑ\8fÑ\89 ÐºÐ»Ð¾Ð½ Ð·Ð° Ð¼ÐµÑ\81Ñ\82оположениеÑ\82о Ð·Ð° Ð¸Ð·Ñ\82лаÑ\81кване â\80\9e%sâ\80\9c Ð² "
+"хранилището „%s“"
 
-#: builtin/add.c:287
+#: remote.c:1730
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Използвайте опцията „-f“, за да ги добавите наистина.\n"
-
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "неуспешно добавяне на файлове"
+msgid "branch '%s' has no remote for pushing"
+msgstr "няма информация клонът „%s“ да следи някой друг"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "опциите „-A“ и „-u“ са несъвместими"
+#: remote.c:1741
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "указателят за изтласкване на „%s“ не включва „%s“"
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
+#: remote.c:1754
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Нищо не е зададено и нищо не е добавено.\n"
+#: remote.c:1776
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "простото (simple) изтласкване не съответства на една цел"
 
-#: builtin/add.c:353
+#: remote.c:2081
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Ð\92еÑ\80оÑ\8fÑ\82но Ð¸Ñ\81каÑ\85Ñ\82е Ð´Ð° Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82е â\80\9egit add .â\80\9c?\n"
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "Този ÐºÐ»Ð¾Ð½ Ñ\81леди â\80\9e%sâ\80\9c, Ð½Ð¾ Ñ\81ледениÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ Ðµ Ð¸Ð·Ñ\82Ñ\80иÑ\82.\n"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:339 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "файлът с индекса е повреден"
+#: remote.c:2085
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
 
-#: builtin/add.c:439 builtin/apply.c:4661 builtin/mv.c:283 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "Новият индекс не може да бъде записан"
+#: remote.c:2088
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Клонът е актуализиран към „%s“.\n"
 
-#: builtin/am.c:256 builtin/commit.c:749 builtin/merge.c:1089
+#: remote.c:2092
 #, c-format
-msgid "could not read '%s'"
-msgstr "файлът „%s“ не може да бъде прочетен"
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Клонът ви е с %2$d подаване пред „%1$s“.\n"
+msgstr[1] "Клонът ви е с %2$d подавания пред „%1$s“.\n"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "скриптът за автор не може да се анализира"
+#: remote.c:2098
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (публикувайте локалните си промени чрез „git push“)\n"
 
-#: builtin/am.c:507
+#: remote.c:2101
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "„%s“ бе изтрит от куката „applypatch-msg“"
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] "Клонът ви е с %2$d подаване зад „%1$s“ и може да бъде превъртян.\n"
+msgstr[1] "Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде превъртян.\n"
 
-#: builtin/am.c:548 builtin/notes.c:300
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Даденият входен ред е с неправилен формат: „%s“."
+#: remote.c:2109
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (обновете локалния си клон чрез „git pull“)\n"
 
-#: builtin/am.c:585 builtin/notes.c:315
+#: remote.c:2112
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Бележката не може да се копира от „%s“ към „%s“"
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"Текущият клон се е отделил от „%s“,\n"
+"двата имат съответно по %d и %d несъвпадащи подавания.\n"
+msgstr[1] ""
+"Текущият клон се е отделил от „%s“,\n"
+"двата имат съответно по %d и %d несъвпадащи подавания.\n"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "неуспешно изпълнение на „fseek“"
+#: remote.c:2122
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
 
-#: builtin/am.c:788
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "кръпката „%s“ не може да се анализира"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "Текущият клон е повреден"
 
-#: builtin/am.c:853
-msgid "Only one StGIT patch series can be applied at once"
-msgstr ""
-"Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
+#: revision.c:2161
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "Текущият клон „%s“ е без подавания "
 
-#: builtin/am.c:900
-msgid "invalid timestamp"
-msgstr "непÑ\80авилна Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð·Ð° Ð²Ñ\80еме"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "опÑ\86ииÑ\82е â\80\9e--first-parentâ\80\9c Ð¸ â\80\9e--bisectâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
 
-#: builtin/am.c:903 builtin/am.c:911
-msgid "invalid Date line"
-msgstr "неправилен ред за дата „Date“"
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "неуспешно отваряне на „/dev/null“"
 
-#: builtin/am.c:908
-msgid "invalid timezone offset"
-msgstr "неправилно отместване на часовия пояс"
+#: run-command.c:127
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "неуспешно изпълнение на dup2(%d,%d)"
 
-#: builtin/am.c:995
-msgid "Patch format detection failed."
-msgstr "Форматът на кръпката не може да бъде определен."
+#: send-pack.c:150
+#, c-format
+msgid "unable to parse remote unpack status: %s"
+msgstr ""
+"състоянието от отдалеченото разпакетиране не може да бъде анализирано: %s"
 
-#: builtin/am.c:1000 builtin/clone.c:380
+#: send-pack.c:152
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "диÑ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздадена"
+msgid "remote unpack failed: %s"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð¾Ñ\82далеÑ\87ено Ñ\80азпакеÑ\82иÑ\80ане: %s"
 
-#: builtin/am.c:1004
-msgid "Failed to split patches."
-msgstr "Кръпките не могат да бъдат разделени."
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
+msgstr "сертификатът за изтласкване не може да бъде подписан"
 
-#: builtin/am.c:1136 builtin/commit.c:365
-msgid "unable to write index file"
-msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð¸Ñ\81ан"
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
+msgstr "оÑ\82Ñ\81Ñ\80еÑ\89наÑ\82а Ñ\81Ñ\82Ñ\80ана Ð½Ðµ Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð¸Ð·Ñ\82лаÑ\81кване Ñ\81 Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--signedâ\80\9c"
 
-#: builtin/am.c:1187
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "След коригирането на този проблем изпълнете „%s --continue“."
+#: send-pack.c:430
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr ""
+"отсрещната страна не поддържа изтласкване с опцията „--signed“, затова не се "
+"използва сертификат"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "Ако предпочитате да прескочите тази кръпка, изпълнете „%s --skip“."
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
+msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr "За да се върнете към първоначалното състояние, изпълнете „%s --abort“."
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
+msgstr "отсрещната страна не поддържа опции при изтласкване"
 
-#: builtin/am.c:1327
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Ð\9fÑ\80азна ÐºÑ\80Ñ\8aпка. Ð\94али Ð½Ðµ Ðµ Ñ\80азделена Ð¿Ð¾Ð³Ñ\80еÑ\88но?"
+#: sequencer.c:215
+msgid "revert"
+msgstr "оÑ\82мÑ\8fна"
 
-#: builtin/am.c:1401 builtin/log.c:1516
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "грешна идентичност: %s"
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "отбиране"
+
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
 
-#: builtin/am.c:1428
+#: sequencer.c:221
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "подаванеÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80ано: %s"
+msgid "Unknown action: %d"
+msgstr "Ð\9dеизвеÑ\81Ñ\82но Ð´ÐµÐ¹Ñ\81Ñ\82вие: %d"
 
-#: builtin/am.c:1630
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
-"В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
-"сливане."
-
-#: builtin/am.c:1632
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Базовото дърво се реконструира от информацията в индекса…"
+"след коригирането на конфликтите, отбележете съответните\n"
+"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
 
-#: builtin/am.c:1651
+#: sequencer.c:281
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
 msgstr ""
-"Кръпката не може да се приложи към обектите BLOB в индекса.\n"
-"Да не би да сте я редактирали на ръка?"
+"след коригирането на конфликтите, отбележете съответните\n"
+"пътища с „git add ПЪТ…“ или „git rm ПЪТ…“, след което\n"
+"подайте резултата с командата „git commit'“."
 
-#: builtin/am.c:1657
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
+#: sequencer.c:294 sequencer.c:1682
+#, c-format
+msgid "could not lock '%s'"
+msgstr "„%s“ не може да се заключи"
 
-#: builtin/am.c:1672
-msgid "Failed to merge in the changes."
-msgstr "Неуспешно сливане на промените."
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
+#, c-format
+msgid "could not write to '%s'"
+msgstr "в „%s“ не може да се пише"
 
-#: builtin/am.c:1696 builtin/merge.c:636
-msgid "git write-tree failed to write a tree"
-msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
+#: sequencer.c:301
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "краят на ред не може да се запише в „%s“"
 
-#: builtin/am.c:1703
-msgid "applying to an empty history"
-msgstr "прилагане върху празна история"
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "„%s“ не може да се завърши."
 
-#: builtin/am.c:1716 builtin/commit.c:1775 builtin/merge.c:841
-#: builtin/merge.c:866
-msgid "failed to write commit object"
-msgstr "обектът за подаването не може да бъде записан"
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
+#, c-format
+msgid "could not read '%s'"
+msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: builtin/am.c:1748 builtin/am.c:1752
+#: sequencer.c:355
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80одÑ\8aлжи â\80\94 â\80\9e%sâ\80\9c Ð½Ðµ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва."
+msgid "your local changes would be overwritten by %s."
+msgstr "локалниÑ\82е Ð²Ð¸ Ð¿Ñ\80омени Ñ\89е Ð±Ñ\8aдаÑ\82 Ð¿Ñ\80езапиÑ\81ани Ð¿Ñ\80и %s."
 
-#: builtin/am.c:1768
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"За интерактивно изпълнение е необходимо стандартният\n"
-"изход да е свързан с терминал, а в момента не е."
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "подайте или скатайте промените, за да продължите"
 
-#: builtin/am.c:1773
-msgid "Commit Body is:"
-msgstr "Тялото на кръпката за прилагане е:"
+#: sequencer.c:388
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: превъртане"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
 #.
-#: builtin/am.c:1783
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
-"на всичко:"
+#: sequencer.c:470
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: новият индекс не може да бъде запазен"
+
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "подаването сочено от указателя „HEAD“ не може да бъде открито\n"
 
-#: builtin/am.c:1833
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "дървото на кеша не може да бъде обновено\n"
+
+#: sequencer.c:592
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
-"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
+"в това работно дърво има скатани промени.\n"
+"Ако искате да ги слеете с предишното подаване, изпълнете:\n"
+"\n"
+"    git commit --amend %s\n"
+"\n"
+"Ако искате да създадете ново подаване, изпълнете:\n"
+"\n"
+"    git commit %s\n"
+"\n"
+"И в двата случая продължавате след това с командата:\n"
+"\n"
+"    git rebase --continue\n"
 
-#: builtin/am.c:1868 builtin/am.c:1940
+#: sequencer.c:694
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Прилагане: %.*s"
-
-#: builtin/am.c:1884
-msgid "No changes -- Patch already applied."
-msgstr "Без промени — кръпката вече е приложена."
+msgid "could not parse commit %s\n"
+msgstr "подаването „%s“ не може да бъде анализирано\n"
 
-#: builtin/am.c:1892
+#: sequencer.c:699
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Неуспешно прилагане на кръпка при %s %.*s“"
+msgid "could not parse parent commit %s\n"
+msgstr "родителското подаване „%s“ не може да бъде анализирано\n"
 
-#: builtin/am.c:1898
+#: sequencer.c:821
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "Дубликат на проблемната кръпка се намира в: %s"
-
-#: builtin/am.c:1943
 msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"Ð\91ез Ð¿Ñ\80омени â\80\94 Ð²Ñ\8aзможно Ðµ Ð´Ð° Ð½Ðµ Ñ\81Ñ\82е Ð¸Ð·Ð¿Ñ\8aлнили â\80\9egit addâ\80\9c.\n"
-"Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
-"кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
+"неоÑ\87акван Ð¿Ñ\8aÑ\80ви Ñ\80ед Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ñ\81маÑ\87кване:\n"
+"\n"
+"    %.*s"
 
-#: builtin/am.c:1950
+#: sequencer.c:827
+#, c-format
 msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"Индексът все още съдържа неслети промени.\n"
-"Възможно е да не сте изпълнили „git add“."
+"неправилен първи ред на съобщението при смачкване:\n"
+"\n"
+"    %.*s"
 
-#: builtin/am.c:2058 builtin/am.c:2062 builtin/am.c:2074 builtin/reset.c:308
-#: builtin/reset.c:316
+#: sequencer.c:833 sequencer.c:858
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "„%s“ не е разпознат като обект."
+msgid "This is a combination of %d commits."
+msgstr "Това е обединение от %d подавания"
 
-#: builtin/am.c:2110
-msgid "failed to clean index"
-msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\87иÑ\81Ñ\82ен"
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "Ð\97а Ñ\81маÑ\87кване Ð²Ð¸ Ñ\82Ñ\80Ñ\8fбва Ñ\83казаÑ\82ел â\80\9eHEADâ\80\9c"
 
-#: builtin/am.c:2144
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "указателят „HEAD“ не може да се прочете"
+
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
 msgstr ""
-"Изглежда указателят „HEAD“ е променен и не сочи към същия обект както по "
-"времето\n"
-"на последното неуспешно изпълнение на „git am“. Указателят се задава да сочи "
-"към\n"
-"„ORIG_HEAD“"
+"съобщението за подаване към указателя „HEAD“ не може да бъде прочетено: %s"
 
-#: builtin/am.c:2205
+#: sequencer.c:852
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Неправилна стойност за „--patch-format“: „%s“"
+msgid "cannot write '%s'"
+msgstr "„%s“ не може да се запази"
 
-#: builtin/am.c:2238
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [ОПЦИЯ…] [ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА]…"
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "Това е 1-то съобщение при подаване:"
 
-#: builtin/am.c:2239
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)"
+#: sequencer.c:869
+#, c-format
+msgid "could not read commit message of %s"
+msgstr "съобщението за подаване към „%s“ не може да бъде прочетено"
 
-#: builtin/am.c:2245
-msgid "run interactively"
-msgstr "интерактивна работа"
+#: sequencer.c:876
+#, c-format
+msgid "This is the commit message #%d:"
+msgstr "Това е съобщение при подаване №${%d}:"
 
-#: builtin/am.c:2247
-msgid "historical option -- no-op"
-msgstr "изоставена опция, съществува по исторически причини, нищо не прави"
+#: sequencer.c:881
+#, c-format
+msgid "The commit message #%d will be skipped:"
+msgstr "Съобщение при подаване №${%d} ще бъде прескочено:"
 
-#: builtin/am.c:2249
-msgid "allow fall back on 3way merging if needed"
-msgstr "да се преминава към тройно сливане при нужда."
+#: sequencer.c:886
+#, c-format
+msgid "unknown command: %d"
+msgstr "непозната команда: %d"
 
-#: builtin/am.c:2250 builtin/init-db.c:478 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "без извеждане на информация"
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "индексът не е слят."
 
-#: builtin/am.c:2252
-msgid "add a Signed-off-by line to the commit message"
-msgstr "добавяне на ред за подпис „Signed-off-by“ в съобщението за подаване"
+#: sequencer.c:970
+#, c-format
+msgid "commit %s is a merge but no -m option was given."
+msgstr "подаването „%s“ е сливане, но не е дадена опцията „-m“"
 
-#: builtin/am.c:2255
-msgid "recode into utf8 (default)"
-msgstr "прекодиране в UTF-8 (стандартно)"
+#: sequencer.c:978
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "подаването „%s“ няма родител %d"
 
-#: builtin/am.c:2257
-msgid "pass -k flag to git-mailinfo"
-msgstr "подаване на опцията „-k“ на командата „git-mailinfo“"
+#: sequencer.c:982
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "указано е базово подаване, но подаването „%s“ не е сливане."
 
-#: builtin/am.c:2259
-msgid "pass -b flag to git-mailinfo"
-msgstr "подаване на опцията „-b“ на командата „git-mailinfo“"
+#: sequencer.c:988
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "неуспешно извличане на съобщението за подаване на „%s“"
 
-#: builtin/am.c:2261
-msgid "pass -m flag to git-mailinfo"
-msgstr "подаване на опцията „-m“ на командата „git-mailinfo“"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: неразпозната стойност за родителското подаване „%s“"
 
-#: builtin/am.c:2263
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr ""
-"подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“"
+#: sequencer.c:1071 sequencer.c:1827
+#, c-format
+msgid "could not rename '%s' to '%s'"
+msgstr "„%s“ не може да се преименува на „%s“"
 
-#: builtin/am.c:2266
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr ""
-"без подаване на опцията „--keep-cr“ на командата „git-mailsplit“ независимо "
-"от „am.keepcr“"
+#: sequencer.c:1122
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "подаването „%s“… не може да бъде отменено: „%s“"
 
-#: builtin/am.c:2269
-msgid "strip everything before a scissors line"
-msgstr "пропускане на всичко преди реда за отрязване"
+#: sequencer.c:1123
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "подаването „%s“… не може да бъде приложено: „%s“"
 
-#: builtin/am.c:2270 builtin/apply.c:4546
-msgid "action"
-msgstr "дейÑ\81Ñ\82вие"
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "зададено Ðµ Ð¿Ñ\80азно Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82во Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
 
-#: builtin/am.c:2271 builtin/am.c:2274 builtin/am.c:2277 builtin/am.c:2280
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292
-#: builtin/am.c:2298
-msgid "pass it through git-apply"
-msgstr "прекарване през „git-apply“"
+#: sequencer.c:1175
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: неуспешно изчитане на индекса"
 
-#: builtin/am.c:2279 builtin/apply.c:4570
-msgid "root"
-msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
+#: sequencer.c:1182
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: неуспешно обновяване на индекса"
 
-#: builtin/am.c:2282 builtin/am.c:2285 builtin/apply.c:4508
-#: builtin/apply.c:4511 builtin/clone.c:90 builtin/fetch.c:95
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:404 builtin/submodule--helper.c:485
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:767
-#: builtin/submodule--helper.c:770
-msgid "path"
-msgstr "път"
+#: sequencer.c:1303
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "неправилен ред %d: %.*s"
 
-#: builtin/am.c:2288 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:199 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "БРОЙ"
+#: sequencer.c:1311
+#, c-format
+msgid "cannot '%s' without a previous commit"
+msgstr "Без предишно подаване не може да се изпълни „%s“"
 
-#: builtin/am.c:2291 builtin/apply.c:4514
-msgid "num"
-msgstr "БРОЙ"
+#: sequencer.c:1344
+#, c-format
+msgid "could not read '%s'."
+msgstr "от „%s“ не може да се чете."
 
-#: builtin/am.c:2294 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "ФОРМАТ"
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "коригирайте това чрез „git rebase --edit-todo“."
 
-#: builtin/am.c:2295
-msgid "format the patch(es) are in"
-msgstr "формат на кръпките"
+#: sequencer.c:1358
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "неизползваем файл с описание на предстоящите действия: „%s“"
 
-#: builtin/am.c:2301
-msgid "override error message when patch failure occurs"
-msgstr "избÑ\80ано Ð¾Ñ\82 Ð²Ð°Ñ\81 Ñ\81Ñ\8aобÑ\89ение Ð·Ð° Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпки"
+#: sequencer.c:1363
+msgid "no commits parsed."
+msgstr "никое Ð¾Ñ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8fÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ñ\80азпознае."
 
-#: builtin/am.c:2303
-msgid "continue applying patches after resolving a conflict"
-msgstr "продължаване на прилагането на кръпки след коригирането на конфликт"
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
+msgstr ""
+"по време на отмяна на подаване не може да се извърши отбиране на подаване."
 
-#: builtin/am.c:2306
-msgid "synonyms for --continue"
-msgstr "синоними на „--continue“"
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
+msgstr "по време на отбиране не може да се извърши отмяна на подаване."
 
-#: builtin/am.c:2309
-msgid "skip the current patch"
-msgstr "прескачане на текущата кръпка"
+#: sequencer.c:1439
+#, c-format
+msgid "invalid key: %s"
+msgstr "неправилен ключ: „%s“"
 
-#: builtin/am.c:2312
-msgid "restore the original branch and abort the patching operation."
-msgstr ""
-"възстановяване на първоначалното състояние на клона и преустановяване на "
-"прилагането на кръпката."
+#: sequencer.c:1442
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "неправилна стойност за „%s“: „%s“"
 
-#: builtin/am.c:2316
-msgid "lie about committer date"
-msgstr "дата за подаване различна от първоначалната"
+#: sequencer.c:1499
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "неправилен файл с опции: „%s“"
 
-#: builtin/am.c:2318
-msgid "use current timestamp for author date"
-msgstr "използване на текущото време като това за автор"
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
+msgstr ""
+"в момента вече се извършва отбиране на подавания или пребазиране на клона"
 
-#: builtin/am.c:2320 builtin/commit.c:1609 builtin/merge.c:228
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“"
 
-#: builtin/am.c:2321
-msgid "GPG-sign commits"
-msgstr "подписване на подаванията с GPG"
+#: sequencer.c:1541
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "директорията за секвенсора „%s“ не може да бъде създадена"
 
-#: builtin/am.c:2324
-msgid "(internal use for git-rebase)"
-msgstr "(ползва се вътрешно за „git-rebase“)"
+#: sequencer.c:1555
+msgid "could not lock HEAD"
+msgstr "указателят „HEAD“ не може да се заключи"
 
-#: builtin/am.c:2339
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
 msgstr ""
-"Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
-"ще бъдат премахнати в бъдеще. Не ги ползвайте."
+"в момента не се извършва отбиране на подавания или пребазиране на клона"
 
-#: builtin/am.c:2346
-msgid "failed to read the index"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ñ\87иÑ\82ане Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
+msgstr "Ð\9fодаванеÑ\82о Ñ\81оÑ\87ено Ð¾Ñ\82 Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82о"
 
-#: builtin/am.c:2361
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
 msgstr ""
-"пÑ\80едиÑ\88наÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð·Ð° Ð¿Ñ\80ебазиÑ\80ане â\80\9e%sâ\80\9c Ð²Ñ\81е Ð¾Ñ\89е Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва, Ð° Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½ "
-"файл „mbox“."
+"дейÑ\81Ñ\82виеÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80еÑ\83Ñ\81Ñ\82ановено, ÐºÐ¾Ð³Ð°Ñ\82о Ñ\81Ñ\82е Ð½Ð° ÐºÐ»Ð¾Ð½, ÐºÐ¾Ð¹Ñ\82о Ñ\82епÑ\8aÑ\80ва "
+"предстои да бъде създаден"
 
-#: builtin/am.c:2385
+#: sequencer.c:1635 builtin/grep.c:910
 #, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-"Открита е излишна директория „%s“.\n"
-"Можете да я изтриете с командата „git am --abort“."
+msgid "cannot open '%s'"
+msgstr "„%s“ не може да бъде отворен"
 
-#: builtin/am.c:2391
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "В момента не тече операция по коригиране и няма как да се продължи."
+#: sequencer.c:1637
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "„%s“ не може да бъде прочетен: %s"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [ОПЦИЯ…] [КРЪПКА…]"
+#: sequencer.c:1638
+msgid "unexpected end of file"
+msgstr "неочакван край на файл"
 
-#: builtin/apply.c:111
+#: sequencer.c:1644
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "непозната опция за знаците за интервали „%s“"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr ""
+"запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
+"повреден"
 
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "непозната опция за игнориране на знаците за интервали „%s“"
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr ""
+"Изглежда указателят „HEAD“ е променен.  Проверете към какво сочи.\n"
+"Не се правят промени."
 
-#: builtin/apply.c:818
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
+msgstr "указателят „HEAD“ не може да бъде прочетен"
 
-#: builtin/apply.c:827
+#: sequencer.c:1832 builtin/difftool.c:616
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
+msgid "could not copy '%s' to '%s'"
+msgstr "„%s“ не може да се копира като „%s“"
 
-#: builtin/apply.c:908
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "Липсва име на файл на ред %d от кръпката"
+#: sequencer.c:1848
+msgid "could not read index"
+msgstr "индексът не може да бъде прочетен"
 
-#: builtin/apply.c:937
+#: sequencer.c:1853
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %2$d се очакваше „/dev/"
-"null“, а бе получен „%1$s“"
+"неуспешно изпълнение: %s\n"
+"%sМоже да коригирате проблема, след което изпълнете:\n"
+"\n"
+"    git rebase --continue\n"
+"\n"
+
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "и промени индекса и/или работното дърво\n"
 
-#: builtin/apply.c:942
+#: sequencer.c:1865
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
-"неправилно име на нов файл"
+"Успешно изпълнение: %s\n"
+"Остават още промени в индекса или работното дърво.\n"
+"Трябва да ги подадете или скатаете и след това изпълнете:\n"
+"\n"
+"    git rebase --continue\n"
+"\n"
 
-#: builtin/apply.c:943
+#: sequencer.c:1920 git-rebase.sh:169
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
-"неправилно име на стар файл"
+msgid "Applied autostash."
+msgstr "Автоматично скатаното е приложено."
 
-#: builtin/apply.c:949
+#: sequencer.c:1932
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-"git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
-"null“"
+msgid "cannot store %s"
+msgstr "„%s“ не може да бъде запазен"
 
-#: builtin/apply.c:1406
+#: sequencer.c:1934 git-rebase.sh:173
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"Прилагането на автоматично скатаното доведе до конфликти.  Промените ви са\n"
+"надеждно скатани.  Можете да пробвате да ги приложите чрез „git stash pop“\n"
+"или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
 
-#: builtin/apply.c:1463
+#: sequencer.c:2016
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "част от кръпка без заглавна част на ред %d: %.*s"
+msgid "Stopped at %s...  %.*s\n"
+msgstr "Спиране при „%s“…  %.*s\n"
 
-#: builtin/apply.c:1480
+#: sequencer.c:2058
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"След съкращаването на %d-та част от компонентите на пътя, в заглавната част "
-"на „git diff“ липсва информация за име на файл (ред: %d)"
-msgstr[1] ""
-"След съкращаването на първите %d части от компонентите на пътя, в заглавната "
-"част на „git diff“ липсва информация за име на файл (ред: %d)"
+msgid "unknown command %d"
+msgstr "непозната команда %d"
 
-#: builtin/apply.c:1646
-msgid "new file depends on old contents"
-msgstr "новият файл зависи от старото съдържание на файла"
+#: sequencer.c:2088
+msgid "could not read orig-head"
+msgstr "указателят за „orig-head“ не може да се прочете"
 
-#: builtin/apply.c:1648
-msgid "deleted file still has contents"
-msgstr "изтритият файл не е празен"
+#: sequencer.c:2092
+msgid "could not read 'onto'"
+msgstr "указателят за „onto“ не може да се прочете"
 
-#: builtin/apply.c:1674
+#: sequencer.c:2099
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "грешка в кръпката на ред %d"
+msgid "could not update %s"
+msgstr "„%s“ не може да се обнови"
 
-#: builtin/apply.c:1710
+#: sequencer.c:2106
 #, c-format
-msgid "new file %s depends on old contents"
-msgstr "новият файл „%s“ зависи от старото съдържание на файла"
+msgid "could not update HEAD to %s"
+msgstr "„HEAD“ не може да бъде обновен до „%s“"
 
-#: builtin/apply.c:1712
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "изтритият файл „%s“ не е празен"
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
+msgstr "не може да пребазирате, защото има промени, които не са в индекса."
 
-#: builtin/apply.c:1715
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "указателят „CHERRY_PICK_HEAD“ не може да бъде изтрит"
 
-#: builtin/apply.c:1861
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "грешка в двоичната кръпка на ред %d: %.*s"
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
+msgstr "несъществуващо подаване не може да се поправи"
 
-#: builtin/apply.c:1895
+#: sequencer.c:2206
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "неразпозната двоичната кръпка на ред %d"
+msgid "invalid file: '%s'"
+msgstr "неправилен файл: „%s“"
 
-#: builtin/apply.c:2048
+#: sequencer.c:2208
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "кÑ\80Ñ\8aпкаÑ\82а Ðµ Ñ\81 Ð¸Ð·Ñ\86Ñ\8fло Ð¿Ð¾Ð²Ñ\80едени Ð´Ð°Ð½Ð½Ð¸ Ð½Ð° Ñ\80ед %d"
+msgid "invalid contents: '%s'"
+msgstr "непÑ\80авилно Ñ\81Ñ\8aдÑ\8aÑ\80жание: â\80\9e%sâ\80\9c"
 
-#: builtin/apply.c:2138
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "символната връзка „%s“ не може да бъде прочетена"
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
+msgstr ""
+"\n"
+"В работното дърво има неподадени промени.  Първо ги подайте, а след това\n"
+"отново изпълнете „git rebase --continue“."
 
-#: builtin/apply.c:2142
-#, c-format
-msgid "unable to open or read %s"
-msgstr "файлът „%s“ не може да бъде отворен или прочетен"
+#: sequencer.c:2221
+msgid "could not commit staged changes."
+msgstr "промените в индекса не могат да бъдат подадени."
 
-#: builtin/apply.c:2775
+#: sequencer.c:2301
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "неправилно начало на ред: „%c“"
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: не може да се отбере „%s“"
 
-#: builtin/apply.c:2894
+#: sequencer.c:2305
 #, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-"%d-то парче код бе успешно приложено на ред %d (отместване от %d ред)."
-msgstr[1] ""
-"%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
+msgid "%s: bad revision"
+msgstr "%s: неправилна версия"
+
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
+msgstr "първоначалното подаване не може да бъде отменено"
 
-#: builtin/apply.c:2906
+#: setup.c:165
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 msgstr ""
-"Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
+"%s: в това работно дърво няма такъв път.\n"
+"За да указвате пътища, които локално не съществуват, използвайте:\n"
+"\n"
+"    git КОМАНДА -- ПЪТ…"
 
-#: builtin/apply.c:2912
+#: setup.c:178
 #, c-format
 msgid ""
-"while searching for:\n"
-"%.*s"
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"при търсене за:\n"
-"%.*s"
+"нееднозначен аргумент „%s: непозната версия или пътят не е част от работното "
+"дърво.\n"
+"Разделяйте пътищата от версиите с „--“, ето така:\n"
+"\n"
+"    git КОМАНДА [ВЕРСИЯ…] -- [ФАЙЛ…]"
 
-#: builtin/apply.c:2932
+#: setup.c:228
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "липсват данните за двоичната кръпка за „%s“"
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"нееднозначен аргумент „%s: както версия, така и път.\n"
+"Разделяйте пътищата от версиите с „--“, ето така:\n"
+"\n"
+"    git КОМАНДА [ВЕРСИЯ…] -- [ФАЙЛ…]"
 
-#: builtin/apply.c:3033
+#: setup.c:475
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Очаква се версия на хранилището на git <= %d, а не %d"
+
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "открити са непознати разширения в хранилището:"
 
-#: builtin/apply.c:3039
+#: setup.c:776
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgid "Not a git repository (or any of the parent directories): %s"
 msgstr ""
-"двоичната кръпка за „%s“ води до неправилни резултати (очакваше се SHA1: "
-"„%s“, а бе получено: „%s“)"
+"Нито тази, нито която и да е от по-горните директории, не е хранилище на "
+"git: %s"
+
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "Процесът не може да се върне към предишната работна директория"
+
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "Текущата работна директория не може да бъде прочетена"
 
-#: builtin/apply.c:3060
+#: setup.c:1022 setup.c:1028
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпка: â\80\9e%s:%ld“"
+msgid "Cannot change to '%s'"
+msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð²Ð»ÐµÐ·Ðµ Ð² Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e%s“"
 
-#: builtin/apply.c:3184
+#: setup.c:1041
 #, c-format
-msgid "cannot checkout %s"
-msgstr "„%s“ не може да се изтегли"
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Нито тази, нито която и да е от по-горните директории (до точката на "
+"монтиране „%s“), не е хранилище на git.\n"
+"Git работи в рамките на една файлова система, защото променливата на средата "
+"„GIT_DISCOVERY_ACROSS_FILESYSTEM“ не е зададена."
 
-#: builtin/apply.c:3229 builtin/apply.c:3240 builtin/apply.c:3285
+#: setup.c:1106
 #, c-format
-msgid "read of %s failed"
-msgstr "неуспешно прочитане на „%s“"
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Зададеният в „core.sharedRepository“ режим за достъп до файлове е неправилен "
+"(0%.3o).\n"
+"Собственикът на файла трябва да има права за писане и четене."
 
-#: builtin/apply.c:3237
+#: sha1_file.c:559
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "изÑ\87иÑ\82ане Ð½Ð° â\80\9e%sâ\80\9c Ñ\81лед Ð¿Ñ\80оÑ\81ледÑ\8fване Ð½Ð° Ñ\81имволна Ð²Ñ\80Ñ\8aзка"
+msgid "path '%s' does not exist"
+msgstr "пÑ\8aÑ\82Ñ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва."
 
-#: builtin/apply.c:3265 builtin/apply.c:3487
+#: sha1_file.c:585
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "обекÑ\82Ñ\8aÑ\82 Ñ\81 Ð¿Ñ\8aÑ\82 â\80\9e%sâ\80\9c Ðµ Ð¿Ñ\80еименÑ\83ван Ð¸Ð»Ð¸ Ð¸Ð·Ñ\82Ñ\80иÑ\82"
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "вÑ\81е Ð¾Ñ\89е Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа ÐµÑ\82алонно Ñ\85Ñ\80анилиÑ\89е â\80\9e%sâ\80\9c ÐºÐ°Ñ\82о Ñ\81вÑ\8aÑ\80зано."
 
-#: builtin/apply.c:3346 builtin/apply.c:3501
+#: sha1_file.c:591
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "„%s“ не съществува в индекса"
+msgid "reference repository '%s' is not a local repository."
+msgstr "еталонното хранилище „%s“ не е локално"
 
-#: builtin/apply.c:3350 builtin/apply.c:3493 builtin/apply.c:3515
+#: sha1_file.c:597
 #, c-format
-msgid "%s: %s"
-msgstr "„%s“: %s"
+msgid "reference repository '%s' is shallow"
+msgstr "еталонното хранилище „%s“ е плитко"
 
-#: builtin/apply.c:3355 builtin/apply.c:3509
+#: sha1_file.c:605
 #, c-format
-msgid "%s: does not match index"
-msgstr "„%s“ не съответства на индекса"
+msgid "reference repository '%s' is grafted"
+msgstr "еталонното хранилище „%s“ е с присаждане"
 
-#: builtin/apply.c:3457
-msgid "removal patch leaves file contents"
-msgstr "изтриващата кръпка оставя файла непразен"
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr ""
+"отместване преди края на пакетния файл (възможно е индексът да е повреден)"
 
-#: builtin/apply.c:3526
+#: sha1_file.c:2721
 #, c-format
-msgid "%s: wrong type"
-msgstr "„%s“: неправилен вид"
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr ""
+"отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
+"индексът да е повреден)"
 
-#: builtin/apply.c:3528
+#: sha1_file.c:2725
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr ""
+"отместване преди края на индекса на пакетния файл „%s“ (възможно е индексът "
+"да е отрязан)"
 
-#: builtin/apply.c:3687 builtin/apply.c:3689
+#: sha1_name.c:409
 #, c-format
-msgid "invalid path '%s'"
-msgstr "непÑ\80авилен Ð¿Ñ\8aÑ\82: â\80\9e%sâ\80\9c"
+msgid "short SHA1 %s is ambiguous"
+msgstr "кÑ\8aÑ\81иÑ\8fÑ\82 SHA1 â\80\9e%sâ\80\9c Ð½Ðµ Ðµ ÐµÐ´Ð½Ð¾Ð·Ð½Ð°Ñ\87ен"
 
-#: builtin/apply.c:3744
-#, c-format
-msgid "%s: already exists in index"
-msgstr "„%s“: вече съществува в индекса"
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "Възможностите са:"
+
+#: sha1_name.c:580
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"При нормална работа Git никога не създава указатели, които завършват с 40\n"
+"шестнадесетични знака, защото стандартно те ще бъдат прескачани.\n"
+"Възможно е такива указатели да са създадени случайно.  Например:\n"
+"\n"
+"  git checkout -b $BRANCH $(git rev-parse…)\n"
+"\n"
+"където стойността на променливата на средата BRANCH е празна, при което се\n"
+"създава подобен указател. Прегледайте тези указатели и ги изтрийте.  Можете "
+"да\n"
+"спрете това съобщение като изпълните командата:\n"
+"„git config advice.objectNameWarning false“"
+
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"Неслетите файлове „.gitmodules“ не могат да бъдат променяни.  Първо "
+"коригирайте конфликтите"
 
-#: builtin/apply.c:3747
+#: submodule.c:71 submodule.c:105
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "„%s“: вече съществува в работното дърво"
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Във файла „.gitmodules“ липсва раздел за директория „path=%s“"
 
-#: builtin/apply.c:3767
+#: submodule.c:79
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "новиÑ\82е Ð¿Ñ\80ава Ð·Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aп (%o) Ð½Ð° â\80\9e%sâ\80\9c Ð½Ðµ Ñ\81Ñ\8aвпадаÑ\82 Ñ\81Ñ\8aÑ\81 Ñ\81Ñ\82аÑ\80иÑ\82е (%o)"
+msgid "Could not update .gitmodules entry %s"
+msgstr "Ð\97апиÑ\81Ñ\8aÑ\82 â\80\9e%sâ\80\9c Ð²Ñ\8aв Ñ\84айла â\80\9e.gitmodulesâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оменен"
 
-#: builtin/apply.c:3772
+#: submodule.c:112
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-"новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде изтрит"
+
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "неуспешно добавяне на променения файл „.gitmodules“ в индекса"
+
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "Настройката „submodule.fetchJobs“ не приема отрицателни стойности"
 
-#: builtin/apply.c:3792
+#: submodule.c:1194
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "засегнатият файл „%s“ е след символна връзка"
+msgid "'%s' not recognized as a git repository"
+msgstr "„%s“ не е хранилище на git"
 
-#: builtin/apply.c:3796
+#: submodule.c:1332
 #, c-format
-msgid "%s: patch does not apply"
-msgstr "Ð\9aÑ\80Ñ\8aпкаÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80иложена"
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "командаÑ\82а â\80\9egit statusâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ñ\8aлни Ð² Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c"
 
-#: builtin/apply.c:3810
+#: submodule.c:1345
 #, c-format
-msgid "Checking patch %s..."
-msgstr "Ð\9fÑ\80овеÑ\80Ñ\8fване Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а â\80\9e%sâ\80\9câ\80¦"
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "командаÑ\82а â\80\9egit statusâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ñ\8aлни Ð² Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c"
 
-#: builtin/apply.c:3903 builtin/checkout.c:233 builtin/reset.c:135
+#: submodule.c:1421
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ñ\81Ñ\8aздаване Ð½Ð° Ð·Ð°Ð¿Ð¸Ñ\81 Ð² ÐºÐµÑ\88а Ñ\87Ñ\80ез â\80\9emake_cache_entryâ\80\9c Ð·Ð° â\80\9e%sâ\80\9c"
+msgid "submodule '%s' has dirty index"
+msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ñ\87иÑ\81Ñ\82"
 
-#: builtin/apply.c:4046
+#: submodule.c:1678
 #, c-format
-msgid "unable to remove %s from index"
-msgstr "„%s“ не може да се извади от индекса"
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr ""
+"не се поддържа „relocate_gitdir“ за подмодула „%s“, който има повече от едно "
+"работно дърво"
 
-#: builtin/apply.c:4075
+#: submodule.c:1690 submodule.c:1746
 #, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "повÑ\80едена ÐºÑ\80Ñ\8aпка Ð·Ð° Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c"
+msgid "could not lookup name for submodule '%s'"
+msgstr "имеÑ\82о Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð½Ð°Ð¼ÐµÑ\80ено"
 
-#: builtin/apply.c:4079
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
 #, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-"не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
+msgid "could not create directory '%s'"
+msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: builtin/apply.c:4084
+#: submodule.c:1697
 #, c-format
-msgid "unable to create backing store for newly created file %s"
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
 msgstr ""
-"не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
+"Мигриране на директорията на git — „%s%s“ от:\n"
+"„%s“ към\n"
+"„%s“\n"
 
-#: builtin/apply.c:4087 builtin/apply.c:4195
+#: submodule.c:1781
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "не може да се добави запис в кеша за „%s“"
+msgid "could not recurse into submodule '%s'"
+msgstr "неуспешна обработка на поддиректориите в подмодула „%s“"
 
-#: builtin/apply.c:4120
+#: submodule.c:1825
+msgid "could not start ls-files in .."
+msgstr "„ls-stat“ не може да се стартира в „..“"
+
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "ГРЕШКА: полученият низ за пътя не съвпада с върнатото от „cwd“"
+
+#: submodule.c:1864
 #, c-format
-msgid "closing file '%s'"
-msgstr "затваряне на файла „%s“"
+msgid "ls-tree returned unexpected return code %d"
+msgstr "„ls-tree“ завърши с неочакван изходен код: %d"
 
-#: builtin/apply.c:4169
+#: submodule-config.c:380
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
+msgid "invalid value for %s"
+msgstr "Неправилна стойност за „%s“"
 
-#: builtin/apply.c:4256
+#: trailer.c:240
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Ð\9aÑ\80Ñ\8aпкаÑ\82а â\80\9e%sâ\80\9c Ð±Ðµ Ð¿Ñ\80иложена Ñ\87иÑ\81Ñ\82о."
+msgid "running trailer command '%s' failed"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88ваÑ\89аÑ\82а ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° â\80\9e%sâ\80\9c"
 
-#: builtin/apply.c:4264
-msgid "internal error"
-msgstr "вътрешна грешка"
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "непозната стойност „%s“ за настройката „%s“"
 
-#: builtin/apply.c:4267
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Прилагане на кръпката „%%s“ с %d отхвърлено парче…"
-msgstr[1] "Прилагане на кръпката „%%s“ с %d отхвърлени парчета…"
+msgid "more than one %s"
+msgstr "стойността „%s“ се повтаря в настройките"
 
-#: builtin/apply.c:4277
+#: trailer.c:702
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "празна завършваща лексема в епилога „%.*s“"
 
-#: builtin/apply.c:4285
+#: trailer.c:722
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "файлът „%s“ не може да бъде отворен: %s"
+msgid "could not read input file '%s'"
+msgstr "входният файл „%s“ не може да бъде прочетен"
+
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "от стандартния вход не може да се чете"
 
-#: builtin/apply.c:4298
+#: trailer.c:949 builtin/am.c:44
 #, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "%d-то парче бе успешно приложено."
+msgid "could not stat %s"
+msgstr "Не може да се получи информация чрез „stat“ за „%s“"
 
-#: builtin/apply.c:4301
+#: trailer.c:951
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "%d-то парче бе отхвърлено."
+msgid "file %s is not a regular file"
+msgstr "„%s“ не е обикновен файл"
 
-#: builtin/apply.c:4387
+#: trailer.c:953
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "Пропусната кръпка: „%s“"
+msgid "file %s is not writable by user"
+msgstr "„%s“: няма права за записване на файла"
 
-#: builtin/apply.c:4395
-msgid "unrecognized input"
-msgstr "непознаÑ\82 Ð²Ñ\85од"
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "вÑ\80еменниÑ\8fÑ\82 Ñ\84айл Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82воÑ\80и"
 
-#: builtin/apply.c:4406
-msgid "unable to read index file"
-msgstr "индексът не може да бъде записан"
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "временният файл не може да се преименува на „%s“"
 
-#: builtin/apply.c:4509
-msgid "don't apply changes matching the given path"
-msgstr "без прилагане на промените напасващи на дадения път"
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Клонът „%s“ ще следи „%s“ от „%s“\n"
 
-#: builtin/apply.c:4512
-msgid "apply changes matching the given path"
-msgstr "прилагане на промените напасващи на дадения път"
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: неправилна опция за дълбочина: %s"
 
-#: builtin/apply.c:4515
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Следните пътища за подмодули съдържат промени,\n"
+"които липсват от всички отдалечени хранилища:\n"
 
-#: builtin/apply.c:4518
-msgid "ignore additions made by the patch"
-msgstr "игнориране на редовете добавени от тази кръпка"
+#: transport.c:893
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Пробвайте да ги изтласкате чрез командата:\n"
+"\n"
+"    git push --recurse-submodules=on-demand\n"
+"\n"
+"или отидете в съответната директория и изпълнете:\n"
+"\n"
+"    git push\n"
+"\n"
 
-#: builtin/apply.c:4520
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "извеждане Ð½Ð° Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ика Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð±ÐµÐ· Ð¿Ñ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а"
+#: transport.c:901
+msgid "Aborting."
+msgstr "Ð\9fÑ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване Ð½Ð° Ð´ÐµÐ¹Ñ\81Ñ\82виеÑ\82о."
 
-#: builtin/apply.c:4524
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "извеждане на броя на добавените и изтритите редове"
+#: transport-helper.c:1080
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Указателят „%s“ не може да се прочете."
 
-#: builtin/apply.c:4526
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "извеждане Ð½Ð° Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ика Ð½Ð° Ð²Ñ\85одниÑ\82е Ð´Ð°Ð½Ð½Ð¸ Ð±ÐµÐ· Ð¿Ñ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "пÑ\80екалено ÐºÑ\80аÑ\82Ñ\8aк Ð¾Ð±ÐµÐºÑ\82-дÑ\8aÑ\80во"
 
-#: builtin/apply.c:4528
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "пÑ\80овеÑ\80ка Ð´Ð°Ð»Ð¸ ÐºÑ\80Ñ\8aпкаÑ\82а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80иложи, Ð±ÐµÐ· Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\82елно Ð¿Ñ\80илагане"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "непÑ\80авилни Ð¿Ñ\80ава Ð·Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð² Ð·Ð°Ð¿Ð¸Ñ\81 Ð² Ð´Ñ\8aÑ\80во"
 
-#: builtin/apply.c:4530
-msgid "make sure the patch is applicable to the current index"
-msgstr "пÑ\80овеÑ\80ка Ð´Ð°Ð»Ð¸ ÐºÑ\80Ñ\8aпкаÑ\82а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80иложена ÐºÑ\8aм Ñ\82екÑ\83Ñ\89иÑ\8f Ð¸Ð½Ð´ÐµÐºÑ\81"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "пÑ\80азно Ð¸Ð¼Ðµ Ð½Ð° Ñ\84айл Ð² Ð·Ð°Ð¿Ð¸Ñ\81 Ð² Ð´Ñ\8aÑ\80во"
 
-#: builtin/apply.c:4532
-msgid "apply a patch without touching the working tree"
-msgstr "пÑ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а Ð±ÐµÐ· Ð¿Ñ\80омÑ\8fна Ð½Ð° Ñ\80абоÑ\82ноÑ\82о дърво"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "пÑ\80екалено ÐºÑ\80аÑ\82Ñ\8aк Ñ\84айл-дърво"
 
-#: builtin/apply.c:4534
-msgid "accept a patch that touches outside the working area"
-msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr ""
+"Изтеглянето ще презапише локалните промени на тези файлове:\n"
+"%%sПодайте или скатайте промените, за да преминете към нов клон."
 
-#: builtin/apply.c:4536
-msgid "also apply the patch (use with --stat/--summary/--check)"
+#: unpack-trees.c:106
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
 msgstr ""
-"кÑ\80Ñ\8aпкаÑ\82а Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80иложена. Ð\9eпÑ\86иÑ\8fÑ\82а Ñ\81е ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ\80а Ñ\81 â\80\9e--checkâ\80\9c\80\9e--statâ\80\9c\80\9e--"
-"summary“"
+"Ð\98зÑ\82еглÑ\8fнеÑ\82о Ñ\89е Ð¿Ñ\80езапиÑ\88е Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ\82е Ð¿Ñ\80омени Ð½Ð° Ñ\82ези Ñ\84айлове:\n"
+"%%s"
 
-#: builtin/apply.c:4538
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"Сливането ще презапише локалните промени на тези файлове:\n"
+"%%sПодайте или скатайте промените, за да слеете."
 
-#: builtin/apply.c:4540
-msgid "build a temporary index based on embedded index information"
+#: unpack-trees.c:111
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
-"създаване на временен индекс на база на включената информация за индекса"
+"Сливането ще презапише локалните промени на тези файлове:\n"
+"%%s"
 
-#: builtin/apply.c:4543 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "разделяне на пътищата с нулевия знак „NUL“"
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"„%s“ ще презапише локалните промени на тези файлове:\n"
+"%%sПодайте или скатайте промените, за да извършите „%s“."
 
-#: builtin/apply.c:4545
-msgid "ensure at least <n> lines of context match"
-msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
+#: unpack-trees.c:116
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"„%s“ ще презапише локалните промени на тези файлове:\n"
+"%%s"
 
-#: builtin/apply.c:4547
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
+#: unpack-trees.c:121
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
+msgstr ""
+"Обновяването на следните директории ще изтрие неследените файлове в тях:\n"
+"%s"
 
-#: builtin/apply.c:4550 builtin/apply.c:4553
-msgid "ignore changes in whitespace when finding context"
+#: unpack-trees.c:125
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
-"игнориране на промените в знаците за интервали при откриване на контекста"
+"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да преминете на друг клон."
 
-#: builtin/apply.c:4556
-msgid "apply the patch in reverse"
-msgstr "прилагане на кръпката в обратна посока"
+#: unpack-trees.c:127
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
+"%%s"
 
-#: builtin/apply.c:4558
-msgid "don't expect at least one line of context"
-msgstr "без изискване на дори и един ред контекст"
+#: unpack-trees.c:130
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да слеете."
 
-#: builtin/apply.c:4560
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
+#: unpack-trees.c:132
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
+"%%s"
 
-#: builtin/apply.c:4562
-msgid "allow overlapping hunks"
-msgstr "позволяване на застъпващи се парчета"
+#: unpack-trees.c:135
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
 
-#: builtin/apply.c:4565
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
+#: unpack-trees.c:137
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
+"%%s"
 
-#: builtin/apply.c:4568
-msgid "do not trust the line counts in the hunk headers"
-msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
+#: unpack-trees.c:142
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да смените клон."
 
-#: builtin/apply.c:4571
-msgid "prepend <root> to all filenames"
-msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
+#: unpack-trees.c:144
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
+"%%s"
 
-#: builtin/apply.c:4593
-msgid "--3way outside a repository"
-msgstr "като „--3way“, но извън хранилище"
+#: unpack-trees.c:147
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Сливането ще презапише тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да слеете."
 
-#: builtin/apply.c:4601
-msgid "--index outside a repository"
-msgstr "като „--index“, но извън хранилище"
+#: unpack-trees.c:149
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Сливането ще презапише тези неследени файлове в работното дърво:\n"
+"%%s"
 
-#: builtin/apply.c:4604
-msgid "--cached outside a repository"
-msgstr "като „--cached“, но извън хранилище"
+#: unpack-trees.c:152
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
 
-#: builtin/apply.c:4623
+#: unpack-trees.c:154
 #, c-format
-msgid "can't open patch '%s'"
-msgstr "кръпката „%s“ не може да бъде отворена"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
+"%%s"
 
-#: builtin/apply.c:4637
+#: unpack-trees.c:161
 #, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
-msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Записът за „%s“ съвпада с този за „%s“.  Не може да се присвои."
 
-#: builtin/apply.c:4643 builtin/apply.c:4653
+#: unpack-trees.c:164
 #, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d ред добавя грешки в знаците за интервали."
-msgstr[1] "%d реда добавят грешки в знаците за интервали."
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"Частичното изтегляне не може да бъде обновено: следните записи не са "
+"актуални:\n"
+"%s"
 
-#: builtin/archive.c:17
+#: unpack-trees.c:166
 #, c-format
-msgid "could not create archive file '%s'"
-msgstr "архивният файл „%s“ не може да бъде създаден"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Обновяването на частичното изтегляне ще презапише тези файлове в работното "
+"дърво:\n"
+"%s"
 
-#: builtin/archive.c:20
-msgid "could not redirect output"
-msgstr "изходът не може да бъде пренасочен"
+#: unpack-trees.c:168
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Обновяването на частичното изтегляне ще изтрие тези файлове в работното "
+"дърво:\n"
+"%s"
 
-#: builtin/archive.c:37
-msgid "git archive: Remote with no URL"
-msgstr "git archive: Липсва адрес за отдалеченото хранилище"
+#: unpack-trees.c:170
+#, c-format
+msgid ""
+"Cannot update submodule:\n"
+"%s"
+msgstr ""
+"Подмодулът не може да бъде обновен:\n"
+"„%s“"
 
-#: builtin/archive.c:58
-msgid "git archive: expected ACK/NAK, got EOF"
-msgstr "git archive: очакваше се „ACK“/„NAK“, а бе получен „EOF“"
+#: unpack-trees.c:247
+#, c-format
+msgid "Aborting\n"
+msgstr "Преустановяване на действието\n"
 
-#: builtin/archive.c:61
+#: unpack-trees.c:272
 #, c-format
-msgid "git archive: NACK %s"
-msgstr "git archive: получен е „NACK“ — %s"
+msgid "submodule update strategy not supported for submodule '%s'"
+msgstr "подмодулът „%s“ не поддържа стратегията за обновяване като подмодул"
 
-#: builtin/archive.c:63
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "Изтегляне на файлове"
+
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "неправилна схема за адрес или суфиксът „://“ липсва"
+
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
 #, c-format
-msgid "remote error: %s"
-msgstr "оÑ\82далеÑ\87ена Ð³Ñ\80еÑ\88ка: %s"
+msgid "invalid %XX escape sequence"
+msgstr "непÑ\80авилна ÐµÐºÑ\80аниÑ\80аÑ\89а Ð¿Ð¾Ñ\81ледоваÑ\82елноÑ\81Ñ\82 â\80\9e%XXâ\80\9c"
 
-#: builtin/archive.c:64
-msgid "git archive: protocol error"
-msgstr "git archive: протоколна грешка"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "не е указана машина, а схемата не е „file:“"
 
-#: builtin/archive.c:68
-msgid "git archive: expected a flush"
-msgstr "git archive: очакваше се изчистване на буферите чрез „flush“"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "при схема „file:“ не можете да указвате номер на порт"
 
-#: builtin/bisect--helper.c:7
-msgid "git bisect--helper --next-all [--no-checkout]"
-msgstr "git bisect--helper --next-all [--no-checkout]"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "неправилни знаци в името на машина"
 
-#: builtin/bisect--helper.c:17
-msgid "perform 'git bisect next'"
-msgstr "извÑ\8aÑ\80Ñ\88ване Ð½Ð° â\80\9egit bisect nextâ\80\9c"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "непÑ\80авилен Ð½Ð¾Ð¼ÐµÑ\80 Ð½Ð° Ð¿Ð¾Ñ\80Ñ\82"
 
-#: builtin/bisect--helper.c:19
-msgid "update BISECT_HEAD instead of checking out the current commit"
-msgstr ""
-"обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "неправилна част от пътя „..“"
 
-#: builtin/blame.c:33
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
-msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗА_ВЕРСИЯТА…] [ВЕРСИЯ] [--] ФАЙЛ"
+#: worktree.c:285
+#, c-format
+msgid "failed to read '%s'"
+msgstr "„%s“ не може да бъде прочетен"
 
-#: builtin/blame.c:38
-msgid "<rev-opts> are documented in git-rev-list(1)"
-msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "„%s“ не може да бъде отворен и за четене, и за запис"
 
-#: builtin/blame.c:1782
-msgid "Blaming lines"
-msgstr "Анотирани редове"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "„%s“ не може да бъде отворен за запис"
 
-#: builtin/blame.c:2531
-msgid "Show blame entries as we find them, incrementally"
-msgstr "Извеждане на анотациите с намирането им, последователно"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "файлът не може да бъде прочетен: „%s“"
 
-# FIXME SHA-1 -> SHA1
-#: builtin/blame.c:2532
-msgid "Show blank SHA-1 for boundary commits (Default: off)"
-msgstr ""
-"Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
-"е изключена)"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
+msgstr "няма достъп до „%s“"
 
-#: builtin/blame.c:2533
-msgid "Do not treat root commits as boundaries (Default: off)"
-msgstr ""
-"Началните подавания да не се считат за гранични (стандартно опцията е "
-"изключена)"
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "текущата работна директория е недостъпна"
 
-#: builtin/blame.c:2534
-msgid "Show work cost statistics"
-msgstr "Извеждане на статистика за извършените действия"
+#: wrapper.c:634
+#, c-format
+msgid "could not write to %s"
+msgstr "„%s“ не може да бъде записан"
 
-#: builtin/blame.c:2535
-msgid "Force progress reporting"
-msgstr "Принудително извеждане на напредъка"
+#: wrapper.c:636
+#, c-format
+msgid "could not close %s"
+msgstr "„%s“ не може да се затвори"
 
-#: builtin/blame.c:2536
-msgid "Show output score for blame entries"
-msgstr "Ð\98звеждане Ð½Ð° Ð´Ð¾Ð¿Ñ\8aлниÑ\82елна Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ð¾Ð¿Ñ\80еделÑ\8fнеÑ\82о Ð½Ð° Ð°Ð½Ð¾Ñ\82аÑ\86ииÑ\82е"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Ð\9dеÑ\81леÑ\82и Ð¿Ñ\8aÑ\82иÑ\89а:"
 
-#: builtin/blame.c:2537
-msgid "Show original filename (Default: auto)"
-msgstr ""
-"Извеждане на първоначалното име на файл (стандартно това е автоматично)"
+#: wt-status.c:178 wt-status.c:205
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: builtin/blame.c:2538
-msgid "Show original linenumber (Default: off)"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
-"Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
-
-#: builtin/blame.c:2539
-msgid "Show in a format designed for machine consumption"
-msgstr "Извеждане във формат за по-нататъшна обработка"
+"  (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: builtin/blame.c:2540
-msgid "Show porcelain format with per-line commit information"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
-"Извеждане във формат за команди от потребителско ниво с информация на всеки "
-"ред"
+"  (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: builtin/blame.c:2541
-msgid "Use the same output mode as git-annotate (Default: off)"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
-"Използване на същия формат като „git-annotate“ (стандартно опцията е "
-"изклÑ\8eÑ\87ена)"
+"  (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
+"конÑ\84ликÑ\82а)"
 
-#: builtin/blame.c:2542
-msgid "Show raw timestamp (Default: off)"
-msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr ""
+"  (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: builtin/blame.c:2543
-msgid "Show long commit SHA1 (Default: off)"
-msgstr "Ð\98звеждане Ð½Ð° Ð¿Ñ\8aлниÑ\82е Ñ\81Ñ\83ми Ð¿Ð¾ SHA1 (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¾Ð¿Ñ\86иÑ\8fÑ\82а Ðµ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ена)"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "Ð\9fÑ\80омени, ÐºÐ¾Ð¸Ñ\82о Ñ\89е Ð±Ñ\8aдаÑ\82 Ð¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸:"
 
-#: builtin/blame.c:2544
-msgid "Suppress author name and timestamp (Default: off)"
-msgstr "Ð\91ез Ð¸Ð¼Ðµ Ð½Ð° Ð°Ð²Ñ\82оÑ\80 Ð¸ Ð²Ñ\80еме Ð½Ð° Ð¿Ñ\80омÑ\8fна (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¾Ð¿Ñ\86иÑ\8fÑ\82а Ðµ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ена)"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "Ð\9fÑ\80омени, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81а Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ:"
 
-#: builtin/blame.c:2545
-msgid "Show author email instead of name (Default: off)"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
-"Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
-"изключена)"
-
-#: builtin/blame.c:2546
-msgid "Ignore whitespace differences"
-msgstr "Без разлики в знаците за интервали"
-
-#: builtin/blame.c:2547
-msgid "Spend extra cycles to find better match"
-msgstr "Допълнителни изчисления за по-добри резултати"
-
-#: builtin/blame.c:2548
-msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
-
-#: builtin/blame.c:2549
-msgid "Use <file>'s contents as the final image"
-msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
-
-#: builtin/blame.c:2550 builtin/blame.c:2551
-msgid "score"
-msgstr "напасване на редовете"
+"  (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: builtin/blame.c:2550
-msgid "Find line copies within and across files"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
-"Търсене на копирани редове както в рамките на един файл, така и от един файл "
-"към друг"
+"  (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: builtin/blame.c:2551
-msgid "Find line movements within and across files"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
-"Търсене на преместени редове както в рамките на един файл, така и от един "
-"файл към друг"
-
-#: builtin/blame.c:2552
-msgid "n,m"
-msgstr "n,m"
+"  (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
+"работното дърво)"
 
-#: builtin/blame.c:2552
-msgid "Process only line range n,m, counting from 1"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
-"Информация само за редовете в интервала от n до m включително. Броенето "
-"запоÑ\87ва Ð¾Ñ\82 1"
+"  (подайте или отхвърлете неследеното или промененото съдържание в "
+"подмодÑ\83лиÑ\82е)"
 
-#. TRANSLATORS: This string is used to tell us the maximum
-#. display width for a relative timestamp in "git blame"
-#. output.  For C locale, "4 years, 11 months ago", which
-#. takes 22 places, is the longest among various forms of
-#. relative timestamps, but your language may need more or
-#. fewer display columns.
-#: builtin/blame.c:2641
-msgid "4 years, 11 months ago"
-msgstr "преди 4 години и 11 месеца"
+#: wt-status.c:238
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr ""
+"  (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
 
-#: builtin/branch.c:26
-msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
-msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "изтрити в двата случая:"
 
-#: builtin/branch.c:27
-msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
-msgstr "git branch [ОПЦИЯ…] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "добавени от вас:"
 
-#: builtin/branch.c:28
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
-msgstr "git branch [ОПЦИЯ…] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "изтрити от тях:"
 
-#: builtin/branch.c:29
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
-msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "добавени от тях:"
 
-#: builtin/branch.c:30
-msgid "git branch [<options>] [-r | -a] [--points-at]"
-msgstr "git branch [ОПЦИЯ…] [-r | -a] [--points-at]"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "изтрити от вас:"
 
-#: builtin/branch.c:143
-#, c-format
-msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
-msgstr ""
-"изтриване на клона „%s“, който е слят към „%s“,\n"
-"         но още не е слят към върха „HEAD“."
+#: wt-status.c:263
+msgid "both added:"
+msgstr "добавени и в двата случая:"
 
-#: builtin/branch.c:147
-#, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
-msgstr ""
-"отказване на изтриване на клона „%s“, който не е слят към\n"
-"         „%s“, но е слят към върха „HEAD“."
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "променени и в двата случая:"
 
-#: builtin/branch.c:161
-#, c-format
-msgid "Couldn't look up commit object for '%s'"
-msgstr "Обектът-подаване за „%s“ не може да бъде открит"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "нов файл:"
 
-#: builtin/branch.c:165
-#, c-format
-msgid ""
-"The branch '%s' is not fully merged.\n"
-"If you are sure you want to delete it, run 'git branch -D %s'."
-msgstr ""
-"Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
-"да го изтриете, изпълнете „git branch -D %s“."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "копиран:"
 
-#: builtin/branch.c:178
-msgid "Update of config-file failed"
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ионниÑ\8f Ñ\84айл"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "изÑ\82Ñ\80иÑ\82:"
 
-#: builtin/branch.c:206
-msgid "cannot use -a with -d"
-msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e-aâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-dâ\80\9c"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "пÑ\80оменен:"
 
-#: builtin/branch.c:212
-msgid "Couldn't look up commit object for HEAD"
-msgstr "Ð\9eбекÑ\82Ñ\8aÑ\82-подаване, Ñ\81оÑ\87ен Ð¾Ñ\82 Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c, Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "пÑ\80еименÑ\83ван:"
 
-#: builtin/branch.c:226
-#, c-format
-msgid "Cannot delete branch '%s' checked out at '%s'"
-msgstr "Не можете да изтриете клона „%s“, който е изтеглен в пътя „%s“"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "смяна на вида:"
 
-#: builtin/branch.c:241
-#, c-format
-msgid "remote-tracking branch '%s' not found."
-msgstr "следящият клон „%s“ не може да бъде открит."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "непозната промяна:"
 
-#: builtin/branch.c:242
-#, c-format
-msgid "branch '%s' not found."
-msgstr "клонът „%s“ не може да бъде открит."
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "неслят:"
 
-#: builtin/branch.c:257
-#, c-format
-msgid "Error deleting remote-tracking branch '%s'"
-msgstr "Грешка при изтриването на следящия клон „%s“"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "нови подавания, "
 
-#: builtin/branch.c:258
-#, c-format
-msgid "Error deleting branch '%s'"
-msgstr "Грешка при изтриването на клона „%s“"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "променено съдържание, "
 
-#: builtin/branch.c:265
-#, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
-msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "неследено съдържание, "
 
-#: builtin/branch.c:266
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
-msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "Подмодулите са променени, но не са обновени:"
 
-#: builtin/branch.c:309
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: изтрит]"
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "Промени в подмодулите за подаване:"
 
-#: builtin/branch.c:314
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
+#: wt-status.c:914
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"Не променяйте горния ред.\n"
+"Всичко отдолу ще бъде изтрито."
 
-#: builtin/branch.c:319
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: назад с %d]"
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "Някои пътища не са слети."
 
-#: builtin/branch.c:321
-#, c-format
-msgid "[behind %d]"
-msgstr "[назад с %d]"
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
 
-#: builtin/branch.c:325
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: напред с %d]"
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (използвайте „git merge --abort“, за да преустановите сливането)"
 
-#: builtin/branch.c:327
-#, c-format
-msgid "[ahead %d]"
-msgstr "[напред с %d]"
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "Всички конфликти са решени, но продължавате сливането."
 
-#: builtin/branch.c:330
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: напред с %d, назад с %d]"
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (използвайте „git commit“, за да завършите сливането)"
 
-#: builtin/branch.c:333
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[напред с %d, назад с %d]"
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "В момента прилагате поредица от кръпки чрез „git am“."
 
-#: builtin/branch.c:346
-msgid " **** invalid ref ****"
-msgstr " ●●● неправилен указател ●●●"
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "Текущата кръпка е празна."
 
-#: builtin/branch.c:372
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(извън клон, пребазиране на „%s“)"
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
 
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(извън клон, двоично търсене от „%s“)"
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
 
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:381
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(Указателят „HEAD“ не е свързан и е при „%s“)"
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr ""
+"  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
 
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:386
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "Указателят „HEAD“ не е свързан и е отделѐн от „%s“"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "„git-rebase-todo“ липсва."
 
-#: builtin/branch.c:390
-msgid "(no branch)"
-msgstr "(извън клон)"
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "Не са изпълнени команди."
 
-#: builtin/branch.c:541
+#: wt-status.c:1194
 #, c-format
-msgid "Branch %s is being rebased at %s"
-msgstr "Клонът „%s“ се пребазира върху „%s“"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Последна изпълнена команда (изпълнена е общо %d команда):"
+msgstr[1] "Последна изпълнена команда (изпълнени са общо %d команди):"
 
-#: builtin/branch.c:545
+#: wt-status.c:1205
 #, c-format
-msgid "Branch %s is being bisected at %s"
-msgstr "Търси се двоично в клона „%s“ при „%s“"
+msgid "  (see more in file %s)"
+msgstr "  повече информация има във файла „%s“)"
 
-#: builtin/branch.c:560
-msgid "cannot rename the current branch while not on any."
-msgstr ""
-"не можете да преименувате текущия клон, защото сте извън който и да е клон"
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "Не остават повече команди."
 
-#: builtin/branch.c:570
+#: wt-status.c:1213
 #, c-format
-msgid "Invalid branch name: '%s'"
-msgstr "Неправилно име на клон: „%s“"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Следваща команда за изпълнение (остава още %d команда):"
+msgstr[1] "Следваща команда за изпълнение (остават още %d команди):"
 
-#: builtin/branch.c:587
-msgid "Branch rename failed"
-msgstr "Неуспешно преименуване на клон"
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr ""
+"  (използвайте „git rebase --edit-todo“, за да разгледате и редактирате)"
 
-#: builtin/branch.c:591
+#: wt-status.c:1234
 #, c-format
-msgid "Renamed a misnamed branch '%s' away"
-msgstr "Ð\9dа ÐºÐ»Ð¾Ð½Ð° Ñ\81 Ð½ÐµÐ¿Ñ\80авилно Ð¸Ð¼Ðµ â\80\9e%sâ\80\9c Ðµ Ð´Ð°Ð´ÐµÐ½Ð¾ Ñ\81лÑ\83жебно Ð¸Ð¼Ðµ"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ð¿Ñ\80ебазиÑ\80аÑ\82е ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð²Ñ\8aÑ\80Ñ\85Ñ\83 â\80\9e%sâ\80\9c."
 
-#: builtin/branch.c:594
-#, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "В момента пребазирате."
 
-#: builtin/branch.c:601
-msgid "Branch is renamed, but update of config-file failed"
-msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (коригирайте конфликтите и използвайте „git rebase --continue“)"
 
-#: builtin/branch.c:623
-msgid "could not write branch description template"
-msgstr "шаблонът за описание на клон не бе записан"
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
 
-#: builtin/branch.c:651
-msgid "Generic options"
-msgstr "Общи настройки"
-
-#: builtin/branch.c:653
-msgid "show hash and subject, give twice for upstream branch"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
-"извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони"
-
-#: builtin/branch.c:654
-msgid "suppress informational messages"
-msgstr "без информационни съобщения"
-
-#: builtin/branch.c:655
-msgid "set up tracking mode (see git-pull(1))"
-msgstr "задаване на режима на следене (виж git-pull(1))"
+"  (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
 
-#: builtin/branch.c:657
-msgid "change upstream info"
-msgstr "смяна на следения клон"
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
 
-#: builtin/branch.c:659
-msgid "upstream"
-msgstr "клон-източник"
+#: wt-status.c:1267
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: builtin/branch.c:659
-msgid "change the upstream info"
-msgstr "смяна на клона-източник"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
+msgstr "В момента разделяте подаване докато пребазирате."
 
-#: builtin/branch.c:661
-msgid "use colored output"
-msgstr "цветен изход"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (След като работното ви дърво стане чисто, използвайте „git rebase --"
+"continue“)"
 
-#: builtin/branch.c:662
-msgid "act on remote-tracking branches"
-msgstr "действие върху следящите клони"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: builtin/branch.c:664 builtin/branch.c:665
-msgid "print only branches that contain the commit"
-msgstr "извеждане Ñ\81амо Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ñ\82ова Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\80едакÑ\82иÑ\80аÑ\82е Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð´Ð¾ÐºÐ°Ñ\82о Ð¿Ñ\80ебазиÑ\80аÑ\82е."
 
-#: builtin/branch.c:668
-msgid "Specific git-branch actions:"
-msgstr "Специални действия на „git-branch“:"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr ""
+"  (използвайте „git commit --amend“, за да редактирате текущото подаване)"
 
-#: builtin/branch.c:669
-msgid "list both remote-tracking and local branches"
-msgstr "извеждане както на следящите, така и на локалните клони"
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (използвайте „git rebase --continue“, след като завършите промените си)"
 
-#: builtin/branch.c:671
-msgid "delete fully merged branch"
-msgstr "изтриване на клони, които са напълно слети"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "В момента отбирате подаването „%s“."
 
-#: builtin/branch.c:672
-msgid "delete branch (even if not merged)"
-msgstr "изтриване и на клони, които не са напълно слети"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
 
-#: builtin/branch.c:673
-msgid "move/rename a branch and its reflog"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
-"преместване/преименуване на клон и принадлежащият му журнал на указателите"
-
-#: builtin/branch.c:674
-msgid "move/rename a branch, even if target exists"
-msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
+"  (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
 
-#: builtin/branch.c:675
-msgid "list branch names"
-msgstr "извеждане на имената на клоните"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
+"отбиране)"
 
-#: builtin/branch.c:676
-msgid "create the branch's reflog"
-msgstr "създаване на журнала на указателите на клона"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "В момента отменяте подаване „%s“."
 
-#: builtin/branch.c:678
-msgid "edit the description for the branch"
-msgstr "редактиране на описанието на клона"
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (коригирайте конфликтите и изпълнете „git revert --continue“)"
 
-#: builtin/branch.c:679
-msgid "force creation, move/rename, deletion"
-msgstr "принудително създаване, преместване, преименуване, изтриване"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (всички конфликти са коригирани, изпълнете „git revert --continue“)"
 
-#: builtin/branch.c:680
-msgid "print only branches that are merged"
-msgstr "извеждане само на слетите клони"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr ""
+"  (използвайте „git revert --abort“, за да преустановите отмяната на "
+"подаване)"
 
-#: builtin/branch.c:681
-msgid "print only branches that are not merged"
-msgstr "извеждане само на неслетите клони"
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
 
-#: builtin/branch.c:682
-msgid "list branches in columns"
-msgstr "извеждане Ð¿Ð¾ ÐºÐ¾Ð»Ð¾Ð½Ð¸"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\82Ñ\8aÑ\80Ñ\81иÑ\82е Ð´Ð²Ð¾Ð¸Ñ\87но."
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
-msgid "key"
-msgstr "КЛЮЧ"
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr ""
+"  (използвайте „git bisect reset“, за да се върнете към първоначалното "
+"състояние и клон)"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
-msgid "field name to sort on"
-msgstr "име Ð½Ð° Ð¿Ð¾Ð»ÐµÑ\82о, Ð¿Ð¾ ÐºÐ¾ÐµÑ\82о Ð´Ð° Ðµ Ð¿Ð¾Ð´Ñ\80едбаÑ\82а"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "Ð\9dа ÐºÐ»Ð¾Ð½ "
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:401
-#: builtin/notes.c:404 builtin/notes.c:564 builtin/notes.c:567
-#: builtin/tag.c:369
-msgid "object"
-msgstr "ОБЕКТ"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "извършвате интерактивно пребазиране върху "
 
-#: builtin/branch.c:687
-msgid "print only branches of the object"
-msgstr "извеждане само на клоните на ОБЕКТА"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "извършвате пребазиране върху "
 
-#: builtin/branch.c:705
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82кÑ\80ие ÐºÑ\8aм ÐºÐ°ÐºÐ²Ð¾ Ñ\81оÑ\87и Ñ\83казаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c"
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð½Ðµ Ðµ Ñ\81вÑ\8aÑ\80зан Ð¸ Ðµ Ð¿Ñ\80и "
 
-#: builtin/branch.c:709 builtin/clone.c:707
-msgid "HEAD not found below refs/heads!"
-msgstr "Ð\92 Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9erefs/headsâ\80\9c Ð»Ð¸Ð¿Ñ\81ва Ñ\84айл â\80\9eHEADâ\80\9c"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð½Ðµ Ðµ Ñ\81вÑ\8aÑ\80зан Ð¸ Ðµ Ð¾Ñ\82делеÌ\80н Ð¾Ñ\82 "
 
-#: builtin/branch.c:729
-msgid "--column and --verbose are incompatible"
-msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--columnâ\80\9c Ð¸ â\80\9e--verboseâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "Ð\98звÑ\8aн Ð²Ñ\81иÑ\87ки ÐºÐ»Ð¾Ð½Ð¸."
 
-#: builtin/branch.c:740 builtin/branch.c:782
-msgid "branch name required"
-msgstr "Ð\9dеобÑ\85одимо Ðµ Ð¸Ð¼Ðµ Ð½Ð° ÐºÐ»Ð¾Ð½"
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "Ð\9fÑ\8aÑ\80вонаÑ\87ално Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/branch.c:758
-msgid "Cannot give description to detached HEAD"
-msgstr "Не може да зададете описание на „HEAD“ извън клон"
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "Неследени файлове"
 
-#: builtin/branch.c:763
-msgid "cannot edit description of more than one branch"
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\80едакÑ\82иÑ\80аÑ\82е Ð¾Ð¿Ð¸Ñ\81аниеÑ\82о Ð½Ð° Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ñ\82 ÐµÐ´Ð¸Ð½ ÐºÐ»Ð¾Ð½ ÐµÐ´Ð½Ð¾Ð²Ñ\80еменно"
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "Ð\98гноÑ\80иÑ\80ани Ñ\84айлове"
 
-#: builtin/branch.c:770
+#: wt-status.c:1599
 #, c-format
-msgid "No commit on branch '%s' yet."
-msgstr "В клона „%s“ все още няма подавания."
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+"Бяха необходими %.2f секунди за изброяването на неследените файлове.\n"
+"Добавянето на опцията „-uno“ към командата „git status“, ще ускори\n"
+"изпълнението, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
+"За повече подробности погледнете „git status help“."
 
-#: builtin/branch.c:773
+#: wt-status.c:1605
 #, c-format
-msgid "No branch named '%s'."
-msgstr "Ð\9bипÑ\81ва ÐºÐ»Ð¾Ð½ Ð½Ð° Ð¸Ð¼Ðµ â\80\9e%sâ\80\9c."
+msgid "Untracked files not listed%s"
+msgstr "Ð\9dеÑ\81ледениÑ\82е Ñ\84айлове Ð½Ðµ Ñ\81а Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸%s"
 
-#: builtin/branch.c:788
-msgid "too many branches for a rename operation"
-msgstr "Прекалено много клони за преименуване"
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
 
-#: builtin/branch.c:793
-msgid "too many branches to set new upstream"
-msgstr "Ð\97ададени Ñ\81а Ð¿Ñ\80екалено Ð¼Ð½Ð¾Ð³Ð¾ ÐºÐ»Ð¾Ð½Ð¸ Ð·Ð° Ñ\81ледене"
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "Ð\9dÑ\8fма Ð¿Ñ\80омени"
 
-#: builtin/branch.c:797
+#: wt-status.c:1618
 #, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
-"СледеноÑ\82о Ð¾Ñ\82 â\80\9eHEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð·Ð°Ð´Ð°Ð´Ðµ Ð´Ð° Ðµ â\80\9e%sâ\80\9c, Ð·Ð°Ñ\89оÑ\82о Ñ\82о Ð½Ðµ Ñ\81оÑ\87и ÐºÑ\8aм "
-"никой клон."
+"кÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ñ\81а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ Ð¿Ñ\80омени (използвайÑ\82е â\80\9egit addâ\80\9c Ð¸/или "
+"„git commit -a“)\n"
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: wt-status.c:1621
 #, c-format
-msgid "no such branch '%s'"
-msgstr "Ð\9dÑ\8fма ÐºÐ»Ð¾Ð½ Ð½Ð° Ð¸Ð¼Ðµ â\80\9e%sâ\80\9c."
+msgid "no changes added to commit\n"
+msgstr "кÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ñ\81а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ Ð¿Ñ\80омени\n"
 
-#: builtin/branch.c:804
+#: wt-status.c:1624
 #, c-format
-msgid "branch '%s' does not exist"
-msgstr "Не съществува клон на име „%s“."
-
-#: builtin/branch.c:816
-msgid "too many branches to unset upstream"
-msgstr "Прекалено много клони за махане на следене"
-
-#: builtin/branch.c:820
-msgid "could not unset upstream of HEAD when it does not point to any branch."
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
-"Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
+"към индекса за подаване не са добавени промени, но има нови файлове "
+"(използвайте „git add“, за да започне тяхното следене)\n"
 
-#: builtin/branch.c:826
+#: wt-status.c:1627
 #, c-format
-msgid "Branch '%s' has no upstream information"
-msgstr "Няма информация клонът „%s“ да следи някой друг"
-
-#: builtin/branch.c:840
-msgid "it does not make sense to create 'HEAD' manually"
-msgstr "Няма никакъв смисъл ръчно да създавате „HEAD“."
-
-#: builtin/branch.c:846
-msgid "-a and -r options to 'git branch' do not make sense with a branch name"
-msgstr "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
 
-#: builtin/branch.c:849
+#: wt-status.c:1630
 #, c-format
-msgid ""
-"The --set-upstream flag is deprecated and will be removed. Consider using --"
-"track or --set-upstream-to\n"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
-"Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e--set-upstreamâ\80\9c Ð²ÐµÑ\87е Ðµ Ð¾Ñ\81Ñ\82аÑ\80Ñ\8fла Ð¸ Ð¿Ñ\80едÑ\81Ñ\82ои Ð´Ð° Ð±Ñ\8aде Ð¼Ð°Ñ\85наÑ\82а. "
-"Използвайте „--track“ или „--set-upstream-to“\n"
+"липÑ\81ваÑ\82 ÐºÐ°ÐºÐ²Ð¸Ñ\82о Ð¸ Ð´Ð° Ðµ Ð¿Ñ\80омени (Ñ\81Ñ\8aздайÑ\82е Ð¸Ð»Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\80айÑ\82е Ñ\84айлове Ð¸ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ\82е "
+"„git add“, за да започне тяхното следене)\n"
 
-#: builtin/branch.c:866
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid ""
-"\n"
-"If you wanted to make '%s' track '%s', do this:\n"
-"\n"
-msgstr ""
-"\n"
-"За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n"
-"\n"
+msgid "nothing to commit\n"
+msgstr "липсват каквито и да е промени\n"
 
-#: builtin/bundle.c:51
+#: wt-status.c:1636
 #, c-format
-msgid "%s is okay\n"
-msgstr "Пратката „%s“ е наред\n"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
+"неследените файлове)\n"
 
-#: builtin/bundle.c:64
-msgid "Need a repository to create a bundle."
-msgstr "За създаването на пратка е необходимо хранилище."
+#: wt-status.c:1640
+#, c-format
+msgid "nothing to commit, working tree clean\n"
+msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
 
-#: builtin/bundle.c:68
-msgid "Need a repository to unbundle."
-msgstr "Ð\97а Ð¿Ñ\80иеманеÑ\82о Ð½Ð° Ð¿Ñ\80аÑ\82ка Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ñ\85Ñ\80анилиÑ\89е."
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "Ð\9fÑ\8aÑ\80вонаÑ\87ално Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ð° ÐºÐ»Ð¾Ð½"
 
-#: builtin/cat-file.c:428
-msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
-msgstr ""
-"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
-"p | ВИД | --textconv) ОБЕКТ"
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD (извън клон)"
 
-#: builtin/cat-file.c:429
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "назад с "
 
-#: builtin/cat-file.c:466
-msgid "<type> can be one of: blob, tree, commit, tag"
-msgstr ""
-"ВИДът може да е: „blob“ (обект BLOB), „tree“ (дърво), „commit“ (подаване), "
-"„tag“ (етикет)"
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "напред с "
 
-#: builtin/cat-file.c:467
-msgid "show object type"
-msgstr "извеждане на вида на обект"
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "не може да извършите „%s“, защото има промени, които не са в индекса."
 
-#: builtin/cat-file.c:468
-msgid "show object size"
-msgstr "извеждане Ð½Ð° Ñ\80азмеÑ\80а Ð½Ð° Ð¾Ð±ÐµÐºÑ\82"
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
+msgstr "оÑ\81вен Ñ\82ова Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а Ð¸Ð¼Ð° Ð½ÐµÐ¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸ Ð¿Ñ\80омени."
 
-#: builtin/cat-file.c:470
-msgid "exit with zero when there's no error"
-msgstr "изход с 0, когато няма грешка"
+#: wt-status.c:2288
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "не може да извършите „%s“, защото в индекса има неподадени промени."
 
-#: builtin/cat-file.c:471
-msgid "pretty-print object's content"
-msgstr "форматирано извеждане на съдържанието на обекта"
-
-#: builtin/cat-file.c:473
-msgid "for blob objects, run textconv on object's content"
-msgstr ""
-"да се стартира програмата зададена в настройката „textconv“ за преобразуване "
-"на съдържанието на обекта BLOB"
-
-#: builtin/cat-file.c:475
-msgid "allow -s and -t to work with broken/corrupt objects"
-msgstr "позволяване на опциите „-s“ и „-t“ да работят с повредени обекти"
-
-#: builtin/cat-file.c:476
-msgid "buffer --batch output"
-msgstr "буфериране на изхода от „--batch“"
-
-#: builtin/cat-file.c:478
-msgid "show info and content of objects fed from the standard input"
-msgstr ""
-"извеждане на информация и съдържание на обектите подадени на стандартния вход"
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "неуспешно изтриване на „%s“"
 
-#: builtin/cat-file.c:481
-msgid "show info about objects fed from the standard input"
-msgstr "извеждане на информация за обектите подадени на стандартния вход"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/cat-file.c:484
-msgid "follow in-tree symlinks (used with --batch or --batch-check)"
-msgstr ""
-"следване на символните връзки сочещи в дървото (ползва се с „--batch“ или „--"
-"batch-check“)"
+#: builtin/add.c:80
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "неочакван изходен код при генериране на разлика: %c"
 
-#: builtin/cat-file.c:486
-msgid "show all objects with --batch or --batch-check"
-msgstr "извеждане Ð½Ð° Ð²Ñ\81иÑ\87ки Ð¾Ð±ÐµÐºÑ\82и Ñ\81 â\80\9e--batchâ\80\9c Ð¸Ð»Ð¸ â\80\9e--batch-checkâ\80\9c"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване Ð½Ð° Ñ\84айловеÑ\82е"
 
-#: builtin/check-attr.c:11
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
-msgstr "git check-attr [-a | --all | АТРИБУТ…] [--] ПЪТ…"
+#: builtin/add.c:95
+#, c-format
+msgid "remove '%s'\n"
+msgstr "изтриване на „%s“\n"
 
-#: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
-msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…]"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
 
-#: builtin/check-attr.c:19
-msgid "report all attributes set on file"
-msgstr "извеждане Ð½Ð° Ð²Ñ\81иÑ\87ки Ð°Ñ\82Ñ\80ибÑ\83Ñ\82и, Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸ Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ñ\84айл"
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
 
-#: builtin/check-attr.c:20
-msgid "use .gitattributes only from the index"
-msgstr "използване на файла „.gitattributes“ само от индекса"
+#: builtin/add.c:220
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "Файлът „%s“ не може да бъде отворен за запис."
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
-msgid "read file names from stdin"
-msgstr "изÑ\87иÑ\82ане Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° Ñ\84айловеÑ\82е Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Ð\9aÑ\80Ñ\8aпкаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð¸Ñ\81ана"
 
-#: builtin/check-attr.c:23 builtin/check-ignore.c:24
-msgid "terminate input and output records by a NUL character"
-msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "неуспешно редактиране на кръпка"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1135 builtin/gc.c:325
-msgid "suppress progress reporting"
-msgstr "без показване на напредъка"
+#: builtin/add.c:230
+#, c-format
+msgid "Could not stat '%s'"
+msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
 
-#: builtin/check-ignore.c:26
-msgid "show non-matching input paths"
-msgstr "извеждане Ð½Ð° Ð½ÐµÑ\81Ñ\8aвпадаÑ\89иÑ\82е Ð¿Ñ\8aÑ\82иÑ\89а"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Ð\9fÑ\80азна ÐºÑ\80Ñ\8aпка, Ð¿Ñ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване Ð½Ð° Ð´ÐµÐ¹Ñ\81Ñ\82виеÑ\82о."
 
-#: builtin/check-ignore.c:28
-msgid "ignore index when checking"
-msgstr "прескачане на индекса при проверката"
+#: builtin/add.c:237
+#, c-format
+msgid "Could not apply '%s'"
+msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: builtin/check-ignore.c:154
-msgid "cannot specify pathnames with --stdin"
-msgstr "опцията „--stdin“ е несъвместима с имена на пътища"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr ""
+"Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
 
-#: builtin/check-ignore.c:157
-msgid "-z only makes sense with --stdin"
-msgstr "опцията „-z“ изисква „--stdin“"
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "пробно изпълнение"
 
-#: builtin/check-ignore.c:159
-msgid "no path specified"
-msgstr "не Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½ Ð¿Ñ\8aÑ\82"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "инÑ\82еÑ\80акÑ\82ивно Ð¾Ñ\82биÑ\80ане Ð½Ð° Ð¿Ñ\80омени"
 
-#: builtin/check-ignore.c:163
-msgid "--quiet is only valid with a single pathname"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--quietâ\80\9c Ð¸Ð·Ð¸Ñ\81ква Ð´Ð° Ðµ Ð¿Ð¾Ð´Ð°Ð´ÐµÐ½ Ñ\82оÑ\87но ÐµÐ´Ð¸Ð½ Ð¿Ñ\8aÑ\82"
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "инÑ\82еÑ\80акÑ\82ивен Ð¸Ð·Ð±Ð¾Ñ\80 Ð½Ð° Ð¿Ð°Ñ\80Ñ\87еÑ\82а ÐºÐ¾Ð´"
 
-#: builtin/check-ignore.c:165
-msgid "cannot have both --quiet and --verbose"
-msgstr "опциите „--quiet“ и „--verbose“ са несъвместими"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "редактиране на текущата разлика и прилагане"
 
-#: builtin/check-ignore.c:168
-msgid "--non-matching is only valid with --verbose"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--non-matchingâ\80\9c Ð¸Ð·Ð¸Ñ\81ква â\80\9e--verboseâ\80\9c"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "добавÑ\8fне Ð¸ Ð½Ð° Ð¸Ð½Ð°Ñ\87е Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ñ\84айлове"
 
-#: builtin/check-mailmap.c:8
-msgid "git check-mailmap [<options>] <contact>..."
-msgstr "git check-mailmap [ОПЦИЯ…] КОНТАКТ…"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "обновяване на следените файлове"
 
-#: builtin/check-mailmap.c:13
-msgid "also read contacts from stdin"
-msgstr "четене на контакти и от стандартния вход"
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "отбелязване само на факта, че пътят ще бъде добавен по-късно"
 
-#: builtin/check-mailmap.c:24
-#, c-format
-msgid "unable to parse contact: %s"
-msgstr "контактът не може да бъде анализиран: %s"
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "добавяне на всички промени в следените и неследените файлове"
 
-#: builtin/check-mailmap.c:47
-msgid "no contacts specified"
-msgstr "не са указани контакти"
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr ""
+"игнориране на пътищата, които са изтрити от работното дърво (същото като „--"
+"no-all“)"
 
-#: builtin/checkout-index.c:127
-msgid "git checkout-index [<options>] [--] [<file>...]"
-msgstr "git checkout-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "без добавяне на нови файлове, само обновяване на индекса"
 
-#: builtin/checkout-index.c:144
-msgid "stage should be between 1 and 3 or all"
-msgstr "етапът трябва да е „1“, „2“, „3“ или „all“ (всички)"
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr ""
+"прескачане на файловете, които не могат да бъдат добавени поради грешки"
 
-#: builtin/checkout-index.c:160
-msgid "check out all files in the index"
-msgstr "изтегляне на всички файлове в индекса"
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+"проверка, че при пробно изпълнение всички файлове, дори и изтритите, се "
+"игнорират"
 
-#: builtin/checkout-index.c:161
-msgid "force overwrite of existing files"
-msgstr "презаписване на файловете, дори и да съществуват"
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/checkout-index.c:163
-msgid "no warning for existing files and files not in index"
-msgstr "без Ð¿Ñ\80едÑ\83пÑ\80еждениÑ\8f Ð¿Ñ\80и Ð»Ð¸Ð¿Ñ\81ваÑ\89и Ñ\84айлове Ð¸ Ñ\84айлове Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "изÑ\80иÑ\87но Ð·Ð°Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ð° Ñ\81Ñ\82ойноÑ\81Ñ\82Ñ\82а Ð½Ð° Ñ\84лага Ð´Ð°Ð»Ð¸ Ñ\84айлÑ\8aÑ\82 Ðµ Ð¸Ð·Ð¿Ñ\8aлним"
 
-#: builtin/checkout-index.c:165
-msgid "don't checkout new files"
-msgstr "без изтегляне на нови файлове"
+#: builtin/add.c:305
+#, c-format
+msgid "Use -f if you really want to add them.\n"
+msgstr "Използвайте опцията „-f“, за да ги добавите наистина.\n"
 
-#: builtin/checkout-index.c:167
-msgid "update stat information in the index file"
-msgstr "обновÑ\8fване Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8fÑ\82а Ð¿Ð¾Ð»Ñ\83Ñ\87ена Ñ\87Ñ\80ез â\80\9estatâ\80\9c Ð·Ð° Ñ\84айловеÑ\82е Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð´Ð¾Ð±Ð°Ð²Ñ\8fне Ð½Ð° Ñ\84айлове"
 
-#: builtin/checkout-index.c:171
-msgid "read list of paths from the standard input"
-msgstr "изÑ\87иÑ\82ане Ð½Ð° Ð¿Ñ\8aÑ\82иÑ\89аÑ\82а Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "опÑ\86ииÑ\82е â\80\9e-Aâ\80\9c Ð¸ â\80\9e-uâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
 
-#: builtin/checkout-index.c:173
-msgid "write the content to temporary files"
-msgstr "запиÑ\81ване Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð²Ñ\8aв Ð²Ñ\80еменни Ñ\84айлове"
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e--ignore-missingâ\80\9c Ðµ Ñ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81амо Ñ\81 â\80\9e--dry-runâ\80\9c"
 
-#: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:491 builtin/submodule--helper.c:494
-#: builtin/submodule--helper.c:497 builtin/submodule--helper.c:500
-#: builtin/submodule--helper.c:774
-msgid "string"
-msgstr "НИЗ"
+#: builtin/add.c:359
+#, c-format
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "параметърът към „--chmod“ — „%s“ може да е или „-x“, или „+x“"
 
-#: builtin/checkout-index.c:175
-msgid "when creating files, prepend <string>"
-msgstr "при създаването на нови файлове да се добавя префикса НИЗ"
+#: builtin/add.c:374
+#, c-format
+msgid "Nothing specified, nothing added.\n"
+msgstr "Нищо не е зададено и нищо не е добавено.\n"
 
-#: builtin/checkout-index.c:177
-msgid "copy out the files from named stage"
-msgstr "копиране на файловете от това състояние на сливане"
+#: builtin/add.c:375
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Вероятно искахте да използвате „git add .“?\n"
 
-#: builtin/checkout.c:25
-msgid "git checkout [<options>] <branch>"
-msgstr "git checkout [ОПЦИЯ…] КЛОН"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "файлът с индекса е повреден"
 
-#: builtin/checkout.c:26
-msgid "git checkout [<options>] [<branch>] -- <file>..."
-msgstr "git checkout [ОПЦИЯ…] [КЛОН] -- ФАЙЛ…"
+#: builtin/am.c:412
+msgid "could not parse author script"
+msgstr "скриптът за автор не може да се анализира"
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/am.c:489
 #, c-format
-msgid "path '%s' does not have our version"
-msgstr "вашата версия липсва в пътя „%s“"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "„%s“ бе изтрит от куката „applypatch-msg“"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/am.c:530
 #, c-format
-msgid "path '%s' does not have their version"
-msgstr "чуждата версия липсва в пътя „%s“"
+msgid "Malformed input line: '%s'."
+msgstr "Даденият входен ред е с неправилен формат: „%s“."
 
-#: builtin/checkout.c:152
+#: builtin/am.c:567
 #, c-format
-msgid "path '%s' does not have all necessary versions"
-msgstr "нÑ\8fкоÑ\8f Ð¾Ñ\82 Ð½ÐµÐ¾Ð±Ñ\85одимиÑ\82е Ð²ÐµÑ\80Ñ\81ии Ð»Ð¸Ð¿Ñ\81ва Ð² Ð¿Ñ\8aÑ\82Ñ\8f „%s“"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Ð\91ележкаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е ÐºÐ¾Ð¿Ð¸Ñ\80а Ð¾Ñ\82 â\80\9e%sâ\80\9c ÐºÑ\8aм „%s“"
 
-#: builtin/checkout.c:196
-#, c-format
-msgid "path '%s' does not have necessary versions"
-msgstr "някоя от необходимите версии липсва в пътя „%s“"
+#: builtin/am.c:593
+msgid "fseek failed"
+msgstr "неуспешно изпълнение на „fseek“"
 
-#: builtin/checkout.c:213
+#: builtin/am.c:777
 #, c-format
-msgid "path '%s': cannot merge"
-msgstr "пÑ\8aÑ\82Ñ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81лÑ\8fн"
+msgid "could not parse patch '%s'"
+msgstr "кÑ\80Ñ\8aпкаÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80а"
 
-#: builtin/checkout.c:230
-#, c-format
-msgid "Unable to add merge result for '%s'"
-msgstr "Резултатът за „%s“ не може да бъде слян"
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
+msgstr ""
+"Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
-#, c-format
-msgid "'%s' cannot be used with updating paths"
-msgstr "Опцията „%s“ е несъвместима с обновяването на пътища"
+#: builtin/am.c:889
+msgid "invalid timestamp"
+msgstr "неправилна стойност за време"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
-#, c-format
-msgid "'%s' cannot be used with %s"
-msgstr "Опцията „%s“ е несъвместима с „%s“"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
+msgstr "неправилен ред за дата „Date“"
 
-#: builtin/checkout.c:268
-#, c-format
-msgid "Cannot update paths and switch to branch '%s' at the same time."
-msgstr ""
-"Невъзможно е едновременно да обновявате пътища и да преминете към клона „%s“."
+#: builtin/am.c:897
+msgid "invalid timezone offset"
+msgstr "неправилно отместване на часовия пояс"
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
-msgid "corrupt index file"
-msgstr "повÑ\80еден Ñ\84айл Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
+msgstr "ФоÑ\80маÑ\82Ñ\8aÑ\82 Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð¿Ñ\80еделен."
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/am.c:991 builtin/clone.c:397
 #, c-format
-msgid "path '%s' is unmerged"
-msgstr "пътят „%s“ не е слят"
-
-#: builtin/checkout.c:495
-msgid "you need to resolve your current index first"
-msgstr "първо трябва да коригирате индекса си"
-
-#: builtin/checkout.c:622
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
-msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
+msgid "failed to create directory '%s'"
+msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/checkout.c:660
-msgid "HEAD is now at"
-msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\81оÑ\87и ÐºÑ\8aм"
+#: builtin/am.c:995
+msgid "Failed to split patches."
+msgstr "Ð\9aÑ\80Ñ\8aпкиÑ\82е Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 Ñ\80азделени."
 
-#: builtin/checkout.c:664 builtin/clone.c:661
-msgid "unable to update HEAD"
-msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²Ðµн"
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð¸Ñ\81ан"
 
-#: builtin/checkout.c:668
+#: builtin/am.c:1178
 #, c-format
-msgid "Reset branch '%s'\n"
-msgstr "Ð\97анÑ\83лÑ\8fване Ð½Ð° ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c\n"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "След ÐºÐ¾Ñ\80игиÑ\80анеÑ\82о Ð½Ð° Ñ\82ози Ð¿Ñ\80облем Ð¸Ð·Ð¿Ñ\8aлнеÑ\82е â\80\9e%s --continueâ\80\9c."
 
-#: builtin/checkout.c:671
+#: builtin/am.c:1179
 #, c-format
-msgid "Already on '%s'\n"
-msgstr "Ð\92еÑ\87е Ñ\81Ñ\82е Ð½Ð° â\80\9e%sâ\80\9c\n"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Ð\90ко Ð¿Ñ\80едпоÑ\87иÑ\82аÑ\82е Ð´Ð° Ð¿Ñ\80еÑ\81коÑ\87иÑ\82е Ñ\82ази ÐºÑ\80Ñ\8aпка, Ð¸Ð·Ð¿Ñ\8aлнеÑ\82е â\80\9e%s --skipâ\80\9c."
 
-#: builtin/checkout.c:675
+#: builtin/am.c:1180
 #, c-format
-msgid "Switched to and reset branch '%s'\n"
-msgstr "Ð\9fÑ\80еминаване ÐºÑ\8aм ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¸ Ð·Ð°Ð½Ñ\83лÑ\8fване Ð½Ð° Ð¿Ñ\80омениÑ\82е\n"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr "Ð\97а Ð´Ð° Ñ\81е Ð²Ñ\8aÑ\80неÑ\82е ÐºÑ\8aм Ð¿Ñ\8aÑ\80вонаÑ\87алноÑ\82о Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fние, Ð¸Ð·Ð¿Ñ\8aлнеÑ\82е â\80\9e%s --abortâ\80\9c."
 
-#: builtin/checkout.c:677 builtin/checkout.c:1067
-#, c-format
-msgid "Switched to a new branch '%s'\n"
-msgstr "Преминахте към новия клон „%s“\n"
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Празна кръпка.  Дали не е разделена погрешно?"
 
-#: builtin/checkout.c:679
+#: builtin/am.c:1386 builtin/log.c:1557
 #, c-format
-msgid "Switched to branch '%s'\n"
-msgstr "Ð\9fÑ\80еминаÑ\85Ñ\82е ÐºÑ\8aм ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c\n"
+msgid "invalid ident line: %s"
+msgstr "гÑ\80еÑ\88на Ð¸Ð´ÐµÐ½Ñ\82иÑ\87ноÑ\81Ñ\82: %s"
 
-#: builtin/checkout.c:731
+#: builtin/am.c:1413
 #, c-format
-msgid " ... and %d more.\n"
-msgstr "… и още %d.\n"
+msgid "unable to parse commit %s"
+msgstr "подаването не може да бъде анализирано: %s"
 
-#: builtin/checkout.c:737
-#, c-format
-msgid ""
-"Warning: you are leaving %d commit behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgid_plural ""
-"Warning: you are leaving %d commits behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgstr[0] ""
-"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подаване, което не е свързано към никой клон:\n"
-"\n"
-"%s\n"
-msgstr[1] ""
-"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подавания, които не са свързани към никой "
-"клон:\n"
-"\n"
-"%s\n"
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
+"сливане."
 
-#: builtin/checkout.c:756
-#, c-format
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
+msgstr "Базовото дърво се реконструира от информацията в индекса…"
+
+#: builtin/am.c:1627
 msgid ""
-"If you want to keep it by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgid_plural ""
-"If you want to keep them by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgstr[0] ""
-"Ако все пак искате да запазите тази промяна чрез създаване на клон,\n"
-"сега е най-подходящият за това чрез командата:\n"
-"\n"
-" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
-"\n"
-msgstr[1] ""
-"Ако все пак искате да запазите тези промени чрез създаване на клон,\n"
-"сега е най-подходящият за това чрез командата:\n"
-"\n"
-" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
-"\n"
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Кръпката не може да се приложи към обектите BLOB в индекса.\n"
+"Да не би да сте я редактирали на ръка?"
 
-#: builtin/checkout.c:792
-msgid "internal error in revision walk"
-msgstr "вÑ\8aÑ\82Ñ\80еÑ\88на Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¾Ð±Ñ\85ожданеÑ\82о Ð½Ð° Ð²ÐµÑ\80Ñ\81ииÑ\82е"
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Ð\9fÑ\80еминаване ÐºÑ\8aм Ð¿Ñ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпка ÐºÑ\8aм Ð±Ð°Ð·Ð°Ñ\82а Ð¸ Ñ\82Ñ\80ойно Ñ\81ливанеâ\80¦"
 
-#: builtin/checkout.c:796
-msgid "Previous HEAD position was"
-msgstr "Ð\9fÑ\80еди Ñ\82ова â\80\9eHEADâ\80\9c Ñ\81оÑ\87еÑ\88е ÐºÑ\8aм"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ñ\81ливане Ð½Ð° Ð¿Ñ\80омениÑ\82е."
 
-#: builtin/checkout.c:823 builtin/checkout.c:1062
-msgid "You are on a branch yet to be born"
-msgstr "В момента сте на клон, който предстои да бъде създаден"
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
+
+#: builtin/am.c:1689
+msgid "applying to an empty history"
+msgstr "прилагане върху празна история"
+
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "обектът за подаването не може да бъде записан"
 
-#: builtin/checkout.c:968
+#: builtin/am.c:1735 builtin/am.c:1739
 #, c-format
-msgid "only one reference expected, %d given."
-msgstr "очакваше се един указател, а сте подали %d."
+msgid "cannot resume: %s does not exist."
+msgstr "не може да се продължи — „%s“ не съществува."
+
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"За интерактивно изпълнение е необходимо стандартният\n"
+"изход да е свързан с терминал, а в момента не е."
+
+#: builtin/am.c:1760
+msgid "Commit Body is:"
+msgstr "Тялото на кръпката за прилагане е:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr ""
+"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
+"на всичко:"
 
-#: builtin/checkout.c:1008 builtin/worktree.c:212
+#: builtin/am.c:1820
 #, c-format
-msgid "invalid reference: %s"
-msgstr "неправилен указател: %s"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr ""
+"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
 
-#: builtin/checkout.c:1037
+#: builtin/am.c:1860 builtin/am.c:1932
 #, c-format
-msgid "reference is not a tree: %s"
-msgstr "указателят не сочи към обект-дърво: %s"
+msgid "Applying: %.*s"
+msgstr "Прилагане: %.*s"
 
-#: builtin/checkout.c:1076
-msgid "paths cannot be used with switching branches"
-msgstr "задаванеÑ\82о Ð½Ð° Ð¿Ñ\8aÑ\82 Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82имо Ñ\81 Ð¿Ñ\80еминаванеÑ\82о Ð¾Ñ\82 ÐµÐ´Ð¸Ð½ ÐºÐ»Ð¾Ð½ ÐºÑ\8aм Ð´Ñ\80Ñ\83г"
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
+msgstr "Ð\91ез Ð¿Ñ\80омени â\80\94 ÐºÑ\80Ñ\8aпкаÑ\82а Ð²ÐµÑ\87е Ðµ Ð¿Ñ\80иложена."
 
-#: builtin/checkout.c:1079 builtin/checkout.c:1083
+#: builtin/am.c:1884
 #, c-format
-msgid "'%s' cannot be used with switching branches"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð¿Ñ\80еминаванеÑ\82о Ð¾Ñ\82 ÐµÐ´Ð¸Ð½ ÐºÐ»Ð¾Ð½ ÐºÑ\8aм Ð´Ñ\80Ñ\83г"
+msgid "Patch failed at %s %.*s"
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80илагане Ð½Ð° ÐºÑ\80Ñ\8aпка Ð¿Ñ\80и %s %.*sâ\80\9c"
 
-#: builtin/checkout.c:1087 builtin/checkout.c:1090 builtin/checkout.c:1095
-#: builtin/checkout.c:1098
+#: builtin/am.c:1890
 #, c-format
-msgid "'%s' cannot be used with '%s'"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 â\80\9e%sâ\80\9c"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "Ð\94Ñ\83бликаÑ\82 Ð½Ð° Ð¿Ñ\80облемнаÑ\82а ÐºÑ\80Ñ\8aпка Ñ\81е Ð½Ð°Ð¼Ð¸Ñ\80а Ð²: %s"
 
-#: builtin/checkout.c:1103
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
 msgstr ""
-"За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не "
-"е такъв"
+"Без промени — възможно е да не сте изпълнили „git add“.\n"
+"Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
+"кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
 
-#: builtin/checkout.c:1136 builtin/checkout.c:1138 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:323
-#: builtin/worktree.c:325
-msgid "branch"
-msgstr "клон"
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Индексът все още съдържа неслети промени.\n"
+"Възможно е да не сте изпълнили „git add“."
 
-#: builtin/checkout.c:1137
-msgid "create and checkout a new branch"
-msgstr "създаване и преминаване към нов клон"
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
+msgstr "„%s“ не е разпознат като обект."
 
-#: builtin/checkout.c:1139
-msgid "create/reset and checkout a branch"
-msgstr "създаване/зануляване на клон и преминаване към него"
+#: builtin/am.c:2102
+msgid "failed to clean index"
+msgstr "индексът не може да бъде изчистен"
 
-#: builtin/checkout.c:1140
-msgid "create reflog for new branch"
-msgstr "създаване на журнал на указателите за нов клон"
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Изглежда указателят „HEAD“ е променен и не сочи към същия обект както по "
+"времето\n"
+"на последното неуспешно изпълнение на „git am“.  Указателят се задава да "
+"сочи към\n"
+"„ORIG_HEAD“"
 
-#: builtin/checkout.c:1141
-msgid "detach the HEAD at named commit"
-msgstr "отделяне на указателя „HEAD“ към указаното подаване"
+#: builtin/am.c:2199
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Неправилна стойност за „--patch-format“: „%s“"
 
-#: builtin/checkout.c:1142
-msgid "set upstream info for new branch"
-msgstr "задаване на кой клон бива следен при създаването на новия клон"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [ОПЦИЯ…] [(ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА)…]"
 
-#: builtin/checkout.c:1144
-msgid "new-branch"
-msgstr "НОВ_КЛОН"
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)"
 
-#: builtin/checkout.c:1144
-msgid "new unparented branch"
-msgstr "нов ÐºÐ»Ð¾Ð½ Ð±ÐµÐ· Ñ\80одиÑ\82ел"
+#: builtin/am.c:2239
+msgid "run interactively"
+msgstr "инÑ\82еÑ\80акÑ\82ивна Ñ\80абоÑ\82а"
 
-#: builtin/checkout.c:1145
-msgid "checkout our version for unmerged files"
-msgstr "изтегляне на вашата версия на неслетите файлове"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
+msgstr "изоставена опция, съществува по исторически причини, нищо не прави"
 
-#: builtin/checkout.c:1147
-msgid "checkout their version for unmerged files"
-msgstr "изÑ\82еглÑ\8fне Ð½Ð° Ñ\87Ñ\83ждаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ð½Ð° Ð½ÐµÑ\81леÑ\82иÑ\82е Ñ\84айлове"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
+msgstr "да Ñ\81е Ð¿Ñ\80еминава ÐºÑ\8aм Ñ\82Ñ\80ойно Ñ\81ливане Ð¿Ñ\80и Ð½Ñ\83жда."
 
-#: builtin/checkout.c:1149
-msgid "force checkout (throw away local modifications)"
-msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "без извеждане на информация"
 
-#: builtin/checkout.c:1150
-msgid "perform a 3-way merge with the new branch"
-msgstr "извÑ\8aÑ\80Ñ\88ване Ð½Ð° Ñ\82Ñ\80ойно Ñ\81ливане Ñ\81 Ð½Ð¾Ð²Ð¸Ñ\8f ÐºÐ»Ð¾Ð½"
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
+msgstr "добавÑ\8fне Ð½Ð° Ñ\80ед Ð·Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 â\80\9eSigned-off-byâ\80\9c Ð² Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/checkout.c:1151 builtin/merge.c:230
-msgid "update ignored files (default)"
-msgstr "обновÑ\8fване Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ñ\84айлове (стандартно)"
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
+msgstr "пÑ\80екодиÑ\80ане Ð² UTF-8 (стандартно)"
 
-#: builtin/checkout.c:1152 builtin/log.c:1432 parse-options.h:250
-msgid "style"
-msgstr "СТÐ\98Ð\9b"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
+msgstr "подаване Ð½Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-kâ\80\9c Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-mailinfoâ\80\9c"
 
-#: builtin/checkout.c:1153
-msgid "conflict style (merge or diff3)"
-msgstr "дейÑ\81Ñ\82вие Ð¿Ñ\80и ÐºÐ¾Ð½Ñ\84ликÑ\82 (Ñ\81ливане Ð¸Ð»Ð¸ Ñ\82Ñ\80ойна Ñ\80азлика)"
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
+msgstr "подаване Ð½Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-bâ\80\9c Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-mailinfoâ\80\9c"
 
-#: builtin/checkout.c:1156
-msgid "do not limit pathspecs to sparse entries only"
-msgstr "без Ð¾Ð³Ñ\80аниÑ\87аване Ð½Ð° Ð¸Ð·Ð±Ñ\80оениÑ\82е Ð¿Ñ\8aÑ\82иÑ\89а Ñ\81амо Ð´Ð¾ Ñ\87аÑ\81Ñ\82иÑ\87но Ð¸Ð·Ñ\82еглениÑ\82е"
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
+msgstr "подаване Ð½Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-mâ\80\9c Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-mailinfoâ\80\9c"
 
-#: builtin/checkout.c:1158
-msgid "second guess 'git checkout <no-such-branch>'"
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr ""
-"опит за отгатване на име на клон след неуспешен опит с „git checkout "
-"НЕСЪЩЕСТВУВАЩ_КЛОН“"
-
-#: builtin/checkout.c:1160
-msgid "do not check if another worktree is holding the given ref"
-msgstr "без проверка дали друго работно дърво държи указателя"
+"подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“"
 
-#: builtin/checkout.c:1161 builtin/clone.c:60 builtin/fetch.c:116
-#: builtin/merge.c:227 builtin/pull.c:116 builtin/push.c:526
-#: builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "извеждане на напредъка"
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"без подаване на опцията „--keep-cr“ на командата „git-mailsplit“ независимо "
+"от „am.keepcr“"
 
-#: builtin/checkout.c:1192
-msgid "-b, -B and --orphan are mutually exclusive"
-msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e-bâ\80\9c, â\80\9e-Bâ\80\9c Ð¸ â\80\9e--orphanâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими ÐµÐ´Ð½Ð° Ñ\81 Ð´Ñ\80Ñ\83га"
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
+msgstr "пÑ\80опÑ\83Ñ\81кане Ð½Ð° Ð²Ñ\81иÑ\87ко Ð¿Ñ\80еди Ñ\80еда Ð·Ð° Ð¾Ñ\82Ñ\80Ñ\8fзване"
 
-#: builtin/checkout.c:1209
-msgid "--track needs a branch name"
-msgstr "опцията „--track“ изисква име на клон"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
+msgstr "прекарване през „git-apply“"
 
-#: builtin/checkout.c:1214
-msgid "Missing branch name; try -b"
-msgstr "Липсва име на клон, използвайте опцията „-b“"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "БРОЙ"
 
-#: builtin/checkout.c:1250
-msgid "invalid path specification"
-msgstr "указан е неправилен път"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "ФОРМАТ"
 
-#: builtin/checkout.c:1257
-#, c-format
-msgid ""
-"Cannot update paths and switch to branch '%s' at the same time.\n"
-"Did you intend to checkout '%s' which can not be resolved as commit?"
-msgstr ""
-"Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
-"Дали не искате да изтеглите „%s“, който не сочи към подаване?"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
+msgstr "формат на кръпките"
 
-#: builtin/checkout.c:1262
-#, c-format
-msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
+msgstr "избрано от вас съобщение за грешка при прилагане на кръпки"
 
-#: builtin/checkout.c:1266
-msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
-msgstr ""
-"git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“\n"
-"са несъвместими с изтегляне от индекса."
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
+msgstr "продължаване на прилагането на кръпки след коригирането на конфликт"
 
-#: builtin/clean.c:25
-msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
-msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШАБЛОН] [-x | -X] [--] ПЪТ…"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
+msgstr "синоними на „--continue“"
 
-#: builtin/clean.c:29
-#, c-format
-msgid "Removing %s\n"
-msgstr "Изтриване на „%s“\n"
+#: builtin/am.c:2303
+msgid "skip the current patch"
+msgstr "прескачане на текущата кръпка"
 
-#: builtin/clean.c:30
-#, c-format
-msgid "Would remove %s\n"
-msgstr "Файлът „%s“ ще бъде изтрит\n"
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
+msgstr ""
+"възстановяване на първоначалното състояние на клона и преустановяване на "
+"прилагането на кръпката."
 
-#: builtin/clean.c:31
-#, c-format
-msgid "Skipping repository %s\n"
-msgstr "Прескачане на хранилището „%s“\n"
+#: builtin/am.c:2310
+msgid "lie about committer date"
+msgstr "дата за подаване различна от първоначалната"
 
-#: builtin/clean.c:32
-#, c-format
-msgid "Would skip repository %s\n"
-msgstr "Хранилището „%s“ ще бъде прескочено\n"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
+msgstr "използване на текущото време като това за автор"
 
-#: builtin/clean.c:33
-#, c-format
-msgid "failed to remove %s"
-msgstr "файлът „%s“ не може да бъде изтрит"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
 
-#: builtin/clean.c:291
-msgid ""
-"Prompt help:\n"
-"1          - select a numbered item\n"
-"foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
-msgstr ""
-"Подсказка:\n"
-"1          — избор на обект според реда\n"
-"ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
-"           — (празно) нищо да не се избира"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
+msgstr "подписване на подаванията с GPG"
 
-#: builtin/clean.c:295
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
+msgstr "(ползва се вътрешно за „git-rebase“)"
+
+#: builtin/am.c:2333
 msgid ""
-"Prompt help:\n"
-"1          - select a single item\n"
-"3-5        - select a range of items\n"
-"2-3,6-9    - select multiple ranges\n"
-"foo        - select item based on unique prefix\n"
-"-...       - unselect specified items\n"
-"*          - choose all items\n"
-"           - (empty) finish selecting"
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
 msgstr ""
-"Подсказка:\n"
-"1          — избор на един обект\n"
-"3-5        — интервал за избор на обекти\n"
-"2-3,6-9    — множество интервали за избор на обекти\n"
-"ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
-"-…         — отмяна на избора на обекти\n"
-"*          — избиране на всички обекти\n"
-"           — (празно) завършване на избирането"
+"Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
+"ще бъдат премахнати в бъдеще.  Не ги ползвайте."
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "Неправилен избор (%s). Изберете отново."
+#: builtin/am.c:2340
+msgid "failed to read the index"
+msgstr "неуспешно изчитане на индекса"
 
-# FIXME - should we use >> or sth else
-#: builtin/clean.c:653
+#: builtin/am.c:2355
 #, c-format
-msgid "Input ignore patterns>> "
-msgstr "Шаблони за игнорирани елементи≫ "
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr ""
+"предишната директория за пребазиране „%s“ все още съществува, а е зададен "
+"файл „mbox“."
 
-#: builtin/clean.c:690
+#: builtin/am.c:2379
 #, c-format
-msgid "WARNING: Cannot find items matched by: %s"
-msgstr "ПРЕДУПРЕЖДЕНИЕ: Никой обект не напасва на „%s“"
-
-#: builtin/clean.c:711
-msgid "Select items to delete"
-msgstr "Избиране на обекти за изтриване"
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Открита е излишна директория „%s“.\n"
+"Можете да я изтриете с командата „git am --abort“."
 
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
-#, c-format
-msgid "Remove %s [y/N]? "
-msgstr "Да се изтрие ли „%s“? „y“ —  да, „N“ — НЕ"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "В момента не тече операция по коригиране и няма как да се продължи."
 
-# FIXME improve message
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Изход."
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [ОПЦИЯ…] [КРЪПКА…]"
 
-#: builtin/clean.c:785
-msgid ""
-"clean               - start cleaning\n"
-"filter by pattern   - exclude items from deletion\n"
-"select by numbers   - select items to be deleted by numbers\n"
-"ask each            - confirm each deletion (like \"rm -i\")\n"
-"quit                - stop cleaning\n"
-"help                - this screen\n"
-"?                   - help for prompt selection"
-msgstr ""
-"clean               — начало на изчистването\n"
-"filter by pattern   — шаблон за обекти, които да не се трият\n"
-"select by numbers   — номера на обекти, които да се трият\n"
-"ask each            — потвърждаване на всяко изтриване (подобно на „rm -i“)\n"
-"quit                — край на изчистването\n"
-"help                — този край\n"
-"?                   — подсказка за шаблоните"
+#: builtin/archive.c:17
+#, c-format
+msgid "could not create archive file '%s'"
+msgstr "архивният файл „%s“ не може да бъде създаден"
 
-#: builtin/clean.c:812
-msgid "*** Commands ***"
-msgstr "●●● Команди ●●●"
+#: builtin/archive.c:20
+msgid "could not redirect output"
+msgstr "изходът не може да бъде пренасочен"
 
-# FIXME improve message
-#: builtin/clean.c:813
-msgid "What now"
-msgstr "Избор на следващо действие"
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
+msgstr "git archive: Липсва адрес за отдалеченото хранилище"
 
-#: builtin/clean.c:821
-msgid "Would remove the following item:"
-msgid_plural "Would remove the following items:"
-msgstr[0] "Следният обект ще бъде изтрит:"
-msgstr[1] "Следните обекти ще бъдат изтрити:"
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
+msgstr "git archive: очакваше се „ACK“/„NAK“, а бе получен „EOF“"
 
-#: builtin/clean.c:838
-msgid "No more files to clean, exiting."
-msgstr "Файловете за изчистване свършиха. Изход от програмата."
+#: builtin/archive.c:61
+#, c-format
+msgid "git archive: NACK %s"
+msgstr "git archive: получен е „NACK“ — %s"
 
-#: builtin/clean.c:869
-msgid "do not print names of files removed"
-msgstr "без извеждане на имената на файловете, които ще бъдат изтрити"
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
+msgstr "git archive: протоколна грешка"
 
-#: builtin/clean.c:871
-msgid "force"
-msgstr "принудително изтриване"
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
+msgstr "git archive: очакваше се изчистване на буферите чрез „flush“"
 
-#: builtin/clean.c:872
-msgid "interactive cleaning"
-msgstr "интерактивно изтриване"
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr "git bisect--helper --next-all [--no-checkout]"
 
-#: builtin/clean.c:874
-msgid "remove whole directories"
-msgstr "изтриване на цели директории"
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr "извършване на „git bisect next“"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:456 builtin/name-rev.c:314 builtin/show-ref.c:182
-msgid "pattern"
-msgstr "ШАБЛОН"
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr ""
+"обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване"
 
-#: builtin/clean.c:876
-msgid "add <pattern> to ignore rules"
-msgstr "добавяне на ШАБЛОН от файлове, които да не се трият"
+#: builtin/blame.c:33
+msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
+msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗА_ВЕРСИЯТА…] [ВЕРСИЯ] [--] ФАЙЛ"
 
-#: builtin/clean.c:877
-msgid "remove ignored files, too"
-msgstr "изÑ\82Ñ\80иване Ð¸ Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ñ\84айлове"
+#: builtin/blame.c:38
+msgid "<rev-opts> are documented in git-rev-list(1)"
+msgstr "Ð\9eÐ\9fЦÐ\98Ð\98Ñ\82е_Ð\97Ð\90\92Ð\95РСÐ\98ЯТÐ\90 Ñ\81а Ð´Ð¾ÐºÑ\83менÑ\82иÑ\80ани Ð² Ñ\80Ñ\8aководÑ\81Ñ\82воÑ\82о git-rev-list(1)"
 
-#: builtin/clean.c:879
-msgid "remove only ignored files"
-msgstr "изÑ\82Ñ\80иване Ñ\81амо Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80ани Ñ\84айлове"
+#: builtin/blame.c:1777
+msgid "Blaming lines"
+msgstr "Ð\90ноÑ\82иÑ\80ани Ñ\80едове"
 
-#: builtin/clean.c:897
-msgid "-x and -X cannot be used together"
-msgstr "опÑ\86ииÑ\82е â\80\9e-xâ\80\9c Ð¸ â\80\9e-Xâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
+#: builtin/blame.c:2573
+msgid "Show blame entries as we find them, incrementally"
+msgstr "Ð\98звеждане Ð½Ð° Ð°Ð½Ð¾Ñ\82аÑ\86ииÑ\82е Ñ\81 Ð½Ð°Ð¼Ð¸Ñ\80анеÑ\82о Ð¸Ð¼, Ð¿Ð¾Ñ\81ледоваÑ\82елно"
 
-#: builtin/clean.c:901
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
+#: builtin/blame.c:2574
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
-"Ð\9dаÑ\81Ñ\82Ñ\80ойкаÑ\82а â\80\9eclean.requireForceâ\80\9c Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð° ÐºÐ°Ñ\82о Ð¸Ñ\81Ñ\82ина, ÐºÐ¾ÐµÑ\82о Ð¸Ð·Ð¸Ñ\81ква Ð½Ñ\8fкоÑ\8f "
-"оÑ\82 Ð¾Ð¿Ñ\86ииÑ\82е â\80\9e-iâ\80\9c, â\80\9e-nâ\80\9c Ð¸Ð»Ð¸ â\80\9e-fâ\80\9c. Ð\9dÑ\8fма Ð´Ð° Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88и Ð¸Ð·Ñ\87иÑ\81Ñ\82ване"
+"Ð\98звеждане Ð½Ð° Ð¿Ñ\80азни Ñ\81Ñ\83ми Ð¿Ð¾ SHA1 Ð·Ð° Ð³Ñ\80аниÑ\87ниÑ\82е Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¾Ð¿Ñ\86иÑ\8fÑ\82а "
+"е Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ена)"
 
-#: builtin/clean.c:904
-msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
+#: builtin/blame.c:2575
+msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
-"Настройката „clean.requireForce“ не е зададена, но стандартно е истина, "
-"което изисква някоя от опциите „-i“, „-n“ или „-f“. Няма да се извърши "
-"изчистване"
+"Началните подавания да не се считат за гранични (стандартно опцията е "
+"изключена)"
 
-#: builtin/clone.c:37
-msgid "git clone [<options>] [--] <repo> [<dir>]"
-msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
+#: builtin/blame.c:2576
+msgid "Show work cost statistics"
+msgstr "Извеждане на статистика за извършените действия"
 
-#: builtin/clone.c:62
-msgid "don't create a checkout"
-msgstr "без Ñ\81Ñ\8aздаване Ð½Ð° Ñ\80абоÑ\82но Ð´Ñ\8aÑ\80во"
+#: builtin/blame.c:2577
+msgid "Force progress reporting"
+msgstr "Ð\9fÑ\80инÑ\83диÑ\82елно Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð½Ð°Ð¿Ñ\80едÑ\8aка"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:473
-msgid "create a bare repository"
-msgstr "създаване на голо хранилище"
+#: builtin/blame.c:2578
+msgid "Show output score for blame entries"
+msgstr "Извеждане на допълнителна информация за определянето на анотациите"
 
-#: builtin/clone.c:67
-msgid "create a mirror repository (implies bare)"
+#: builtin/blame.c:2579
+msgid "Show original filename (Default: auto)"
 msgstr ""
-"създаване на хранилище-огледало (включва опцията „--bare“ за голо хранилище)"
+"Извеждане на първоначалното име на файл (стандартно това е автоматично)"
 
-#: builtin/clone.c:69
-msgid "to clone from a local repository"
-msgstr "клониране от локално хранилище"
+#: builtin/blame.c:2580
+msgid "Show original linenumber (Default: off)"
+msgstr ""
+"Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
 
-#: builtin/clone.c:71
-msgid "don't use local hardlinks, always copy"
-msgstr "без Ñ\82вÑ\8aÑ\80ди Ð²Ñ\80Ñ\8aзки, Ñ\84айловеÑ\82е Ð²Ð¸Ð½Ð°Ð³Ð¸ Ð´Ð° Ñ\81е ÐºÐ¾Ð¿Ð¸Ñ\80аÑ\82"
+#: builtin/blame.c:2581
+msgid "Show in a format designed for machine consumption"
+msgstr "Ð\98звеждане Ð²Ñ\8aв Ñ\84оÑ\80маÑ\82 Ð·Ð° Ð¿Ð¾-наÑ\82аÑ\82Ñ\8aÑ\88на Ð¾Ð±Ñ\80абоÑ\82ка"
 
-#: builtin/clone.c:73
-msgid "setup as shared repository"
-msgstr "настройване за споделено хранилище"
+#: builtin/blame.c:2582
+msgid "Show porcelain format with per-line commit information"
+msgstr ""
+"Извеждане във формат за команди от потребителско ниво с информация на всеки "
+"ред"
 
-#: builtin/clone.c:75 builtin/clone.c:77
-msgid "initialize submodules in the clone"
-msgstr "инициализиране на подмодулите при това клониране"
+#: builtin/blame.c:2583
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr ""
+"Използване на същия формат като „git-annotate“ (стандартно опцията е "
+"изключена)"
 
-#: builtin/clone.c:79
-msgid "number of submodules cloned in parallel"
-msgstr "бÑ\80ой Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли, ÐºÐ»Ð¾Ð½Ð¸Ñ\80ани Ð¿Ð°Ñ\80алелно"
+#: builtin/blame.c:2584
+msgid "Show raw timestamp (Default: off)"
+msgstr "Ð\98звеждане Ð½Ð° Ð½ÐµÑ\84оÑ\80маÑ\82иÑ\80ани Ð²Ñ\80емена (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¾Ð¿Ñ\86иÑ\8fÑ\82а Ðµ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ена)"
 
-#: builtin/clone.c:80 builtin/init-db.c:470
-msgid "template-directory"
-msgstr "диÑ\80екÑ\82оÑ\80иÑ\8f Ñ\81 Ñ\88аблони"
+#: builtin/blame.c:2585
+msgid "Show long commit SHA1 (Default: off)"
+msgstr "Ð\98звеждане Ð½Ð° Ð¿Ñ\8aлниÑ\82е Ñ\81Ñ\83ми Ð¿Ð¾ SHA1 (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¾Ð¿Ñ\86иÑ\8fÑ\82а Ðµ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ена)"
 
-#: builtin/clone.c:81 builtin/init-db.c:471
-msgid "directory from which templates will be used"
-msgstr "диÑ\80екÑ\82оÑ\80иÑ\8f, ÐºÐ¾Ñ\8fÑ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жа Ñ\88аблониÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82"
+#: builtin/blame.c:2586
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr "Ð\91ез Ð¸Ð¼Ðµ Ð½Ð° Ð°Ð²Ñ\82оÑ\80 Ð¸ Ð²Ñ\80еме Ð½Ð° Ð¿Ñ\80омÑ\8fна (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¾Ð¿Ñ\86иÑ\8fÑ\82а Ðµ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ена)"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:498
-#: builtin/submodule--helper.c:777
-msgid "reference repository"
-msgstr "еталонно хранилище"
+#: builtin/blame.c:2587
+msgid "Show author email instead of name (Default: off)"
+msgstr ""
+"Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
+"изключена)"
 
-#: builtin/clone.c:85
-msgid "use --reference only while cloning"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--referenceâ\80\9c Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ñ\81амо Ð¿Ñ\80и ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане"
+#: builtin/blame.c:2588
+msgid "Ignore whitespace differences"
+msgstr "Ð\91ез Ñ\80азлики Ð² Ð·Ð½Ð°Ñ\86иÑ\82е Ð·Ð° Ð¸Ð½Ñ\82еÑ\80вали"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
-msgid "name"
-msgstr "Ð\98Ð\9cÐ\95"
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "Ð\9fодобÑ\80Ñ\8fване Ð½Ð° Ñ\80азликиÑ\82е Ñ\87Ñ\80ез ÐµÐºÑ\81пеÑ\80именÑ\82ална ÐµÐ²Ñ\80иÑ\81Ñ\82ика"
 
-#: builtin/clone.c:87
-msgid "use <name> instead of 'origin' to track upstream"
-msgstr "използване Ð½Ð° Ñ\82ова Ð\98Ð\9cÐ\95 Ð²Ð¼ÐµÑ\81Ñ\82о â\80\9eoriginâ\80\9c Ð¿Ñ\80и Ð¿Ñ\80оÑ\81ледÑ\8fване Ð½Ð° ÐºÐ»Ð¾Ð½и"
+#: builtin/blame.c:2597
+msgid "Spend extra cycles to find better match"
+msgstr "Ð\94опÑ\8aлниÑ\82елни Ð¸Ð·Ñ\87иÑ\81лениÑ\8f Ð·Ð° Ð¿Ð¾-добÑ\80и Ñ\80езÑ\83лÑ\82аÑ\82и"
 
-#: builtin/clone.c:89
-msgid "checkout <branch> instead of the remote's HEAD"
-msgstr "изÑ\82еглÑ\8fне Ð½Ð° Ñ\82ози Ð\9aÐ\9bÐ\9eÐ\9d, Ð° Ð½Ðµ Ñ\81оÑ\87ениÑ\8fÑ\82 Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87ениÑ\8f Ñ\83казаÑ\82ел â\80\9eHEAD“"
+#: builtin/blame.c:2598
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr "Ð\98зÑ\87иÑ\82ане Ð½Ð° Ð²ÐµÑ\80Ñ\81ииÑ\82е Ð¾Ñ\82 Ð¤Ð\90Ð\99Ð\9b, Ð° Ð½Ðµ Ñ\87Ñ\80ез Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° â\80\9egit-rev-list“"
 
-#: builtin/clone.c:91
-msgid "path to git-upload-pack on the remote"
-msgstr "пÑ\8aÑ\82 ÐºÑ\8aм ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-upload-packâ\80\9c Ð½Ð° Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е"
+#: builtin/blame.c:2599
+msgid "Use <file>'s contents as the final image"
+msgstr "Ð\98зползване Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° Ð¤Ð\90Ð\99Ð\9bа ÐºÐ°Ñ\82о ÐºÑ\80айно Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸е"
 
-#: builtin/clone.c:92 builtin/fetch.c:117 builtin/grep.c:667 builtin/pull.c:201
-msgid "depth"
-msgstr "Ð\94ЪÐ\9bÐ\91Ð\9eЧÐ\98Ð\9dÐ\90"
+#: builtin/blame.c:2600 builtin/blame.c:2601
+msgid "score"
+msgstr "напаÑ\81ване Ð½Ð° Ñ\80едовеÑ\82е"
 
-#: builtin/clone.c:93
-msgid "create a shallow clone of that depth"
-msgstr "плитко клониране до тази ДЪЛБОЧИНА"
+#: builtin/blame.c:2600
+msgid "Find line copies within and across files"
+msgstr ""
+"Търсене на копирани редове както в рамките на един файл, така и от един файл "
+"към друг"
 
-#: builtin/clone.c:95
-msgid "clone only one branch, HEAD or --branch"
+#: builtin/blame.c:2601
+msgid "Find line movements within and across files"
 msgstr ""
-"клониÑ\80ане Ñ\81амо Ð½Ð° ÐµÐ´Ð¸Ð½ ÐºÐ»Ð¾Ð½ â\80\94 Ð¸Ð»Ð¸ Ñ\81оÑ\87ениÑ\8f Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87ениÑ\8f â\80\9eHEADâ\80\9c, Ð¸Ð»Ð¸ Ð¸Ð·Ñ\80иÑ\87но "
-"зададения с „--branch“"
+"ТÑ\8aÑ\80Ñ\81ене Ð½Ð° Ð¿Ñ\80емеÑ\81Ñ\82ени Ñ\80едове ÐºÐ°ÐºÑ\82о Ð² Ñ\80амкиÑ\82е Ð½Ð° ÐµÐ´Ð¸Ð½ Ñ\84айл, Ñ\82ака Ð¸ Ð¾Ñ\82 ÐµÐ´Ð¸Ð½ "
+"файл към друг"
 
-#: builtin/clone.c:97
-msgid "any cloned submodules will be shallow"
-msgstr "всички клонирани подмодули ще са плитки"
+#: builtin/blame.c:2602
+msgid "n,m"
+msgstr "n,m"
 
-#: builtin/clone.c:98 builtin/init-db.c:479
-msgid "gitdir"
-msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
+#: builtin/blame.c:2602
+msgid "Process only line range n,m, counting from 1"
+msgstr ""
+"Информация само за редовете в диапазона от n до m включително.  Броенето "
+"започва от 1"
 
-#: builtin/clone.c:99 builtin/init-db.c:480
-msgid "separate git dir from working tree"
-msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"опцията „--progress“ е несъвместима с „--incremental“ и форма̀та на командите "
+"от потребителско ниво"
 
-#: builtin/clone.c:100
-msgid "key=value"
-msgstr "КЛЮЧ=СТОЙНОСТ"
+#. TRANSLATORS: This string is used to tell us the maximum
+#. display width for a relative timestamp in "git blame"
+#. output.  For C locale, "4 years, 11 months ago", which
+#. takes 22 places, is the longest among various forms of
+#. relative timestamps, but your language may need more or
+#. fewer display columns.
+#: builtin/blame.c:2697
+msgid "4 years, 11 months ago"
+msgstr "преди 4 години и 11 месеца"
 
-#: builtin/clone.c:101
-msgid "set config inside the new repository"
-msgstr "задаване Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° Ð½Ð¾Ð²Ð¾Ñ\82о Ñ\85Ñ\80анилиÑ\89е"
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--contentsâ\80\9c Ð¸ â\80\9e--reverseâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
 
-#: builtin/clone.c:102 builtin/fetch.c:131 builtin/push.c:536
-msgid "use IPv4 addresses only"
-msgstr "само адреси IPv4"
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr "Опцията „--contents“ е несъвместима с име на обект от крайно подаване"
 
-#: builtin/clone.c:104 builtin/fetch.c:133 builtin/push.c:538
-msgid "use IPv6 addresses only"
-msgstr "само адреси IPv6"
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"Едновременното задаване на опциите „--reverse“ и „--first-parent“ изисква "
+"указването на крайно подаване"
 
-#: builtin/clone.c:241
+#: builtin/blame.c:2829
 msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
+"--reverse --first-parent together require range along first-parent chain"
 msgstr ""
-"Ð\98меÑ\82о Ð½Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8fÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82гаÑ\82наÑ\82о.\n"
-"Задайте директорията изрично на командния ред"
+"Ð\95дновÑ\80еменноÑ\82о Ð·Ð°Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ð° Ð¾Ð¿Ñ\86ииÑ\82е â\80\9e--reverseâ\80\9c Ð¸ â\80\9e--first-parentâ\80\9c Ð¸Ð·Ð¸Ñ\81ква "
+"указването на диапазон по веригата на първите наследници"
 
-#: builtin/clone.c:307
+#: builtin/blame.c:2840
 #, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "вÑ\81е Ð¾Ñ\89е Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа ÐµÑ\82алонно Ñ\85Ñ\80анилиÑ\89е â\80\9e%sâ\80\9c ÐºÐ°Ñ\82о Ñ\81вÑ\8aÑ\80зано."
+msgid "no such path %s in %s"
+msgstr "нÑ\8fма Ð¿Ñ\8aÑ\82 Ð½Ð° Ð¸Ð¼Ðµ â\80\9e%sâ\80\9c Ð² â\80\9e%sâ\80\9c"
 
-#: builtin/clone.c:309
+#: builtin/blame.c:2851
 #, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "еÑ\82алонноÑ\82о Ñ\85Ñ\80анилиÑ\89е â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾"
+msgid "cannot read blob %s for path %s"
+msgstr "обекÑ\82Ñ\8aÑ\82 BLOB â\80\9e%sâ\80\9c Ð² Ð¿Ñ\8aÑ\82Ñ\8f %s Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
 
-#: builtin/clone.c:314
+#: builtin/blame.c:2870
 #, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "еталонното хранилище „%s“ е плитко"
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "има само %2$lu ред във файла „%1$s“"
+msgstr[1] "има само %2$lu реда във файла „%1$s“"
 
-#: builtin/clone.c:317
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "еталонното хранилище „%s“ е с присаждане"
+#: builtin/branch.c:26
+msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
+msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/clone.c:384
-#, c-format
-msgid "%s exists and is not a directory"
-msgstr "„%s“ съществува и не е директория"
+#: builtin/branch.c:27
+msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
+msgstr "git branch [ОПЦИЯ…] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
 
-#: builtin/clone.c:398
-#, c-format
-msgid "failed to stat %s\n"
-msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
+#: builtin/branch.c:28
+msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
+msgstr "git branch [ОПЦИЯ…] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
 
-#: builtin/clone.c:420
-#, c-format
-msgid "failed to create link '%s'"
-msgstr "връзката „%s“ не може да бъде създадена"
+#: builtin/branch.c:29
+msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
+msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
 
-#: builtin/clone.c:424
-#, c-format
-msgid "failed to copy file to '%s'"
-msgstr "файлът не може да бъде копиран като „%s“"
+#: builtin/branch.c:30
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [ОПЦИЯ…] [-r | -a] [--points-at]"
 
-#: builtin/clone.c:449 builtin/clone.c:633
-#, c-format
-msgid "done.\n"
-msgstr "действието завърши.\n"
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [ОПЦИЯ…] [-r | -a] [--format]"
 
-#: builtin/clone.c:461
+#: builtin/branch.c:144
+#, c-format
 msgid ""
-"Clone succeeded, but checkout failed.\n"
-"You can inspect what was checked out with 'git status'\n"
-"and retry the checkout with 'git checkout -f HEAD'\n"
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
 msgstr ""
-"Клонирането бе успешно за разлика от подготовката на работното дърво\n"
-"за определен клон. Все пак можете да проверите кои файлове и от кой\n"
-"клон в момента са изтеглени с командата „git status“. Можете да\n"
-"завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
+"изтриване на клона „%s“, който е слят към „%s“,\n"
+"    но още не е слят към върха „HEAD“."
 
-#: builtin/clone.c:538
+#: builtin/branch.c:148
 #, c-format
-msgid "Could not find remote branch %s to clone."
+msgid ""
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
 msgstr ""
-"Ð\9aлонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е, ÐºÐ¾ÐµÑ\82о ÐºÐ»Ð¾Ð½Ð¸Ñ\80аÑ\82е,\n"
-"и който следва да бъде изтеглен, не съществува."
+"оÑ\82казване Ð½Ð° Ð¸Ð·Ñ\82Ñ\80иване Ð½Ð° ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c, ÐºÐ¾Ð¹Ñ\82о Ð½Ðµ Ðµ Ñ\81лÑ\8fÑ\82 ÐºÑ\8aм\n"
+"    „%s“, но е слят към върха „HEAD“."
 
-# FIXME translator note that the space at end is necesssary
-#: builtin/clone.c:628
+#: builtin/branch.c:162
 #, c-format
-msgid "Checking connectivity... "
-msgstr "Проверка на връзката… "
-
-#: builtin/clone.c:631
-msgid "remote did not send all necessary objects"
-msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
+msgid "Couldn't look up commit object for '%s'"
+msgstr "Обектът-подаване за „%s“ не може да бъде открит"
 
-# FIXME merge with next?
-#: builtin/clone.c:649
+#: builtin/branch.c:166
 #, c-format
-msgid "unable to update %s"
-msgstr "обектът „%s“ не може да бъде обновен"
-
-#: builtin/clone.c:698
-msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+msgid ""
+"The branch '%s' is not fully merged.\n"
+"If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
-"указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
-"което не съществува. Не може да се изтегли определен клон.\n"
-
-#: builtin/clone.c:729
-msgid "unable to checkout working tree"
-msgstr "работното дърво не може да бъде подготвено"
-
-#: builtin/clone.c:767
-msgid "unable to write parameters to config file"
-msgstr "настройките не могат да бъдат записани в конфигурационния файл"
-
-#: builtin/clone.c:830
-msgid "cannot repack to clean up"
-msgstr "не може да се извърши пакетиране за изчистване на файловете"
+"Клонът „%s“ не е слят напълно.  Ако сте сигурни, че искате\n"
+"да го изтриете, изпълнете „git branch -D %s“."
 
-#: builtin/clone.c:832
-msgid "cannot unlink temporary alternates file"
-msgstr "вÑ\80еменниÑ\8fÑ\82 Ñ\84айл Ð·Ð° Ð°Ð»Ñ\82еÑ\80наÑ\82ивни Ð¾Ð±ÐµÐºÑ\82и Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82"
+#: builtin/branch.c:179
+msgid "Update of config-file failed"
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ионниÑ\8f Ñ\84айл"
 
-#: builtin/clone.c:864 builtin/receive-pack.c:1731
-msgid "Too many arguments."
-msgstr "Ð\9fÑ\80екалено Ð¼Ð½Ð¾Ð³Ð¾ Ð°Ñ\80гÑ\83менÑ\82и."
+#: builtin/branch.c:210
+msgid "cannot use -a with -d"
+msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e-aâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-dâ\80\9c"
 
-#: builtin/clone.c:868
-msgid "You must specify a repository to clone."
-msgstr "ТÑ\80Ñ\8fбва Ð´Ð° Ñ\83кажеÑ\82е ÐºÐ¾Ðµ Ñ\85Ñ\80анилиÑ\89е Ð¸Ñ\81каÑ\82е Ð´Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\80аÑ\82е."
+#: builtin/branch.c:216
+msgid "Couldn't look up commit object for HEAD"
+msgstr "Ð\9eбекÑ\82Ñ\8aÑ\82-подаване, Ñ\81оÑ\87ен Ð¾Ñ\82 Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c, Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82"
 
-#: builtin/clone.c:879
+#: builtin/branch.c:230
 #, c-format
-msgid "--bare and --origin %s options are incompatible."
-msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
-
-#: builtin/clone.c:882
-msgid "--bare and --separate-git-dir are incompatible."
-msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "Не можете да изтриете клона „%s“, който е изтеглен в пътя „%s“"
 
-#: builtin/clone.c:895
+#: builtin/branch.c:245
 #, c-format
-msgid "repository '%s' does not exist"
-msgstr "не съществува хранилище „%s“"
+msgid "remote-tracking branch '%s' not found."
+msgstr "следящият клон „%s“ не може да бъде открит."
 
-#: builtin/clone.c:901 builtin/fetch.c:1174
+#: builtin/branch.c:246
 #, c-format
-msgid "depth %s is not a positive number"
-msgstr "дÑ\8aлбоÑ\87инаÑ\82а Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ðµ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ\82елно Ñ\86Ñ\8fло Ñ\87иÑ\81ло, Ð° Ð½Ðµ â\80\9e%sâ\80\9c"
+msgid "branch '%s' not found."
+msgstr "клонÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82."
 
-#: builtin/clone.c:911
+#: builtin/branch.c:261
 #, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
-msgstr "целевият път „%s“ съществува и не е празна директория."
+msgid "Error deleting remote-tracking branch '%s'"
+msgstr "Грешка при изтриването на следящия клон „%s“"
 
-#: builtin/clone.c:921
+#: builtin/branch.c:262
 #, c-format
-msgid "working tree '%s' already exists."
-msgstr "в â\80\9e%sâ\80\9c Ð²ÐµÑ\87е Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва Ñ\80абоÑ\82но Ð´Ñ\8aÑ\80во."
+msgid "Error deleting branch '%s'"
+msgstr "Ð\93Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¸Ð·Ñ\82Ñ\80иванеÑ\82о Ð½Ð° ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c"
 
-#: builtin/clone.c:936 builtin/clone.c:947 builtin/submodule--helper.c:547
-#: builtin/worktree.c:220 builtin/worktree.c:247
+#: builtin/branch.c:269
 #, c-format
-msgid "could not create leading directories of '%s'"
-msgstr "родителските директории на „%s“ не могат да бъдат създадени"
+msgid "Deleted remote-tracking branch %s (was %s).\n"
+msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/clone.c:939
+#: builtin/branch.c:270
 #, c-format
-msgid "could not create work tree dir '%s'"
-msgstr "работното дърво в „%s“ не може да бъде създадено."
+msgid "Deleted branch %s (was %s).\n"
+msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/clone.c:957
+#: builtin/branch.c:441
 #, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
+msgid "Branch %s is being rebased at %s"
+msgstr "Клонът „%s“ се пребазира върху „%s“"
 
-#: builtin/clone.c:959
+#: builtin/branch.c:445
 #, c-format
-msgid "Cloning into '%s'...\n"
-msgstr "Ð\9aлониÑ\80ане Ð¸ Ñ\81Ñ\8aздаване Ð½Ð° Ñ\85Ñ\80анилиÑ\89е Ð² â\80\9e%sâ\80\9câ\80¦\n"
+msgid "Branch %s is being bisected at %s"
+msgstr "ТÑ\8aÑ\80Ñ\81и Ñ\81е Ð´Ð²Ð¾Ð¸Ñ\87но Ð² ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c Ð¿Ñ\80и â\80\9e%sâ\80\9c"
 
-#: builtin/clone.c:998
-msgid "--depth is ignored in local clones; use file:// instead."
+#: builtin/branch.c:460
+msgid "cannot rename the current branch while not on any."
 msgstr ""
-"При локално клониране опцията „--depth“ се игнорира. Ползвайте схемата "
-"„file://“."
-
-#: builtin/clone.c:1001
-msgid "source repository is shallow, ignoring --local"
-msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира"
-
-#: builtin/clone.c:1006
-msgid "--local is ignored"
-msgstr "опцията „--local“ се игнорира"
+"не можете да преименувате текущия клон, защото сте извън който и да е клон"
 
-#: builtin/clone.c:1010
+#: builtin/branch.c:470
 #, c-format
-msgid "Don't know how to clone %s"
-msgstr "Не се поддържа клониране на връзки от вида „%s“ "
+msgid "Invalid branch name: '%s'"
+msgstr "Неправилно име на клон: „%s“"
 
-#: builtin/clone.c:1059 builtin/clone.c:1067
+#: builtin/branch.c:487
+msgid "Branch rename failed"
+msgstr "Неуспешно преименуване на клон"
+
+#: builtin/branch.c:490
 #, c-format
-msgid "Remote branch %s not found in upstream %s"
-msgstr "Ð\9eÑ\82далеÑ\87ениÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c Ð»Ð¸Ð¿Ñ\81ва Ð² ÐºÐ»Ð¾Ð½Ð¸Ñ\80аноÑ\82о Ñ\85Ñ\80анилиÑ\89е â\80\9e%sâ\80\9c"
+msgid "Renamed a misnamed branch '%s' away"
+msgstr "Ð\9dа ÐºÐ»Ð¾Ð½Ð° Ñ\81 Ð½ÐµÐ¿Ñ\80авилно Ð¸Ð¼Ðµ â\80\9e%sâ\80\9c Ðµ Ð´Ð°Ð´ÐµÐ½Ð¾ Ñ\81лÑ\83жебно Ð¸Ð¼Ðµ"
 
-#: builtin/clone.c:1070
-msgid "You appear to have cloned an empty repository."
-msgstr "Изглежда клонирахте празно хранилище."
+#: builtin/branch.c:493
+#, c-format
+msgid "Branch renamed to %s, but HEAD is not updated!"
+msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
 
-#: builtin/column.c:9
-msgid "git column [<options>]"
-msgstr "git column [ОПЦИЯ…]"
+#: builtin/branch.c:502
+msgid "Branch is renamed, but update of config-file failed"
+msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
 
-#: builtin/column.c:26
-msgid "lookup config vars"
-msgstr "извеждане на настройките"
+#: builtin/branch.c:518
+#, c-format
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr ""
+"Въведете описание на клона.\n"
+"  %s\n"
+"Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
 
-#: builtin/column.c:27 builtin/column.c:28
-msgid "layout to use"
-msgstr "как Ð´Ð° Ñ\81е Ð¿Ð¾Ð´Ñ\80еди Ñ\80езÑ\83лÑ\82аÑ\82а"
+#: builtin/branch.c:551
+msgid "Generic options"
+msgstr "Ð\9eбÑ\89и Ð½Ð°Ñ\81Ñ\82Ñ\80ойки"
 
-#: builtin/column.c:29
-msgid "Maximum width"
-msgstr "Максимална широчина"
+#: builtin/branch.c:553
+msgid "show hash and subject, give twice for upstream branch"
+msgstr ""
+"извеждане на хеша и темата.  Повтарянето на опцията прибавя отдалечените "
+"клони"
 
-#: builtin/column.c:30
-msgid "Padding space on left border"
-msgstr "Ð\9fоле Ð² Ð·Ð½Ð°Ñ\86и Ð¾Ñ\82лÑ\8fво"
+#: builtin/branch.c:554
+msgid "suppress informational messages"
+msgstr "без Ð¸Ð½Ñ\84оÑ\80маÑ\86ионни Ñ\81Ñ\8aобÑ\89ениÑ\8f"
 
-#: builtin/column.c:31
-msgid "Padding space on right border"
-msgstr "Ð\9fоле Ð² Ð·Ð½Ð°Ñ\86и Ð¾Ñ\82дÑ\8fÑ\81но"
+#: builtin/branch.c:555
+msgid "set up tracking mode (see git-pull(1))"
+msgstr "задаване Ð½Ð° Ñ\80ежима Ð½Ð° Ñ\81ледене (виж git-pull(1))"
 
-#: builtin/column.c:32
-msgid "Padding space between columns"
-msgstr "Поле в знаци между колоните"
+#: builtin/branch.c:557
+msgid "change upstream info"
+msgstr "смяна на следения клон"
 
-#: builtin/column.c:51
-msgid "--command must be the first argument"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--commandâ\80\9c Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ðµ Ð¿Ñ\8aÑ\80виÑ\8fÑ\82 Ð°Ñ\80гÑ\83менÑ\82"
+#: builtin/branch.c:559
+msgid "upstream"
+msgstr "клон-изÑ\82оÑ\87ник"
 
-#: builtin/commit.c:38
-msgid "git commit [<options>] [--] <pathspec>..."
-msgstr "git commit [ОПЦИЯ…] [--] ПЪТ…"
+#: builtin/branch.c:559
+msgid "change the upstream info"
+msgstr "смяна на клона-източник"
 
-#: builtin/commit.c:43
-msgid "git status [<options>] [--] <pathspec>..."
-msgstr "git status [ОПЦИЯ…] [--] ПЪТ…"
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "без клон-източник"
 
-#: builtin/commit.c:48
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
-"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
-"това съобщение като изрично зададете стойностите. Изпълнете следната "
-"команда\n"
-"и следвайте инструкциите в текстовия ви редактор, за да редактирате\n"
-"конфигурационния файл:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"След като направите това, можете да коригирате информацията за автора на\n"
-"текущото подаване чрез:\n"
-"\n"
-"    git commit --amend --reset-author\n"
+#: builtin/branch.c:561
+msgid "use colored output"
+msgstr "цветен изход"
 
-#: builtin/commit.c:61
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
-"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
-"това съобщение като изрично зададете стойностите:\n"
-"\n"
-"    git config --global user.name \"Вашето Име\"\n"
-"    git config --global user.email пенчо@example.com\n"
-"\n"
-"След като направите това, можете да коригирате информацията за автора на\n"
-"текущото подаване чрез:\n"
-"\n"
-"    git commit --amend --reset-author\n"
+#: builtin/branch.c:562
+msgid "act on remote-tracking branches"
+msgstr "действие върху следящите клони"
 
-#: builtin/commit.c:73
-msgid ""
-"You asked to amend the most recent commit, but doing so would make\n"
-"it empty. You can repeat your command with --allow-empty, or you can\n"
-"remove the commit entirely with \"git reset HEAD^\".\n"
-msgstr ""
-"Поискахте да поправите последното си подаване. Това действие ще превърне\n"
-"подаването в празно. Можете или да го повторите като разрешите такива "
-"подавания\n"
-"с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
-"„git reset HEAD^“.\n"
+#: builtin/branch.c:564 builtin/branch.c:566
+msgid "print only branches that contain the commit"
+msgstr "извеждане само на клоните, които съдържат това ПОДАВАНЕ"
 
-#: builtin/commit.c:78
-msgid ""
-"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
-"If you wish to commit it anyway, use:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
-msgstr ""
-"Предишното отбрано подаване вече е празно, като най-вероятната причина е\n"
-"корекция на конфликт. Ако все пак искате да го ползвате, използвайте "
-"командата:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "извеждане само на клоните, които не съдържат това ПОДАВАНЕ"
 
-#: builtin/commit.c:85
-msgid "Otherwise, please use 'git reset'\n"
-msgstr "Ð\92 Ð¿Ñ\80оÑ\82ивен Ñ\81лÑ\83Ñ\87ай Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit resetâ\80\9c\n"
+#: builtin/branch.c:570
+msgid "Specific git-branch actions:"
+msgstr "СпеÑ\86иални Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f Ð½Ð° â\80\9egit-branchâ\80\9c:"
 
-#: builtin/commit.c:88
-msgid ""
-"If you wish to skip this commit, use:\n"
-"\n"
-"    git reset\n"
-"\n"
-"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
-"the remaining commits.\n"
-msgstr ""
-"Ако искате да прескочите това подаване, използвайте командата:\n"
-"\n"
-"    git reset\n"
-"\n"
-"Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
-"останалите подавания.\n"
+#: builtin/branch.c:571
+msgid "list both remote-tracking and local branches"
+msgstr "извеждане както на следящите, така и на локалните клони"
 
-#: builtin/commit.c:307
-msgid "failed to unpack HEAD tree object"
-msgstr "вÑ\8aÑ\80Ñ\85овоÑ\82о Ð´Ñ\8aÑ\80во (HEAD tree object) Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ð²Ð°Ð´ÐµÐ½Ð¾ Ð¾Ñ\82 Ð¿Ð°ÐºÐµÑ\82"
+#: builtin/branch.c:573
+msgid "delete fully merged branch"
+msgstr "изÑ\82Ñ\80иване Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸, ÐºÐ¾Ð¸Ñ\82о Ñ\81а Ð½Ð°Ð¿Ñ\8aлно Ñ\81леÑ\82и"
 
-#: builtin/commit.c:348
-msgid "unable to create temporary index"
-msgstr "вÑ\80еменниÑ\8fÑ\82 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздаден"
+#: builtin/branch.c:574
+msgid "delete branch (even if not merged)"
+msgstr "изÑ\82Ñ\80иване Ð¸ Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81а Ð½Ð°Ð¿Ñ\8aлно Ñ\81леÑ\82и"
 
-#: builtin/commit.c:354
-msgid "interactive add failed"
-msgstr "неуспешно интерактивно добавяне"
+#: builtin/branch.c:575
+msgid "move/rename a branch and its reflog"
+msgstr ""
+"преместване/преименуване на клон и принадлежащият му журнал на указателите"
 
-#: builtin/commit.c:367
-msgid "unable to update temporary index"
-msgstr "вÑ\80еменниÑ\8fÑ\82 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
+#: builtin/branch.c:576
+msgid "move/rename a branch, even if target exists"
+msgstr "пÑ\80емеÑ\81Ñ\82ване/пÑ\80еименÑ\83ване Ð½Ð° ÐºÐ»Ð¾Ð½, Ð´Ð¾Ñ\80и Ð°ÐºÐ¾ Ð¸Ð¼Ð° Ð²ÐµÑ\87е ÐºÐ»Ð¾Ð½ Ñ\81 Ñ\82акова Ð¸Ð¼Ðµ"
 
-#: builtin/commit.c:369
-msgid "Failed to update main cache tree"
-msgstr "Ð\94Ñ\8aÑ\80воÑ\82о Ð½Ð° Ð¾Ñ\81новниÑ\8f ÐºÐµÑ\88 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½Ð¾"
+#: builtin/branch.c:577
+msgid "list branch names"
+msgstr "извеждане Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е"
 
-#: builtin/commit.c:393 builtin/commit.c:416 builtin/commit.c:465
-msgid "unable to write new_index file"
-msgstr "новият индекс не може да бъде записан"
+#: builtin/branch.c:578
+msgid "create the branch's reflog"
+msgstr "създаване на журнала на указателите на клона"
 
-#: builtin/commit.c:447
-msgid "cannot do a partial commit during a merge."
-msgstr "по време на сливане не може да се извърши частично подаване."
+#: builtin/branch.c:580
+msgid "edit the description for the branch"
+msgstr "редактиране на описанието на клона"
 
-#: builtin/commit.c:449
-msgid "cannot do a partial commit during a cherry-pick."
-msgstr "по време на отбиране не може да се извърши частично подаване."
+#: builtin/branch.c:581
+msgid "force creation, move/rename, deletion"
+msgstr "принудително създаване, преместване, преименуване, изтриване"
 
-#: builtin/commit.c:458
-msgid "cannot read the index"
-msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
+#: builtin/branch.c:582
+msgid "print only branches that are merged"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\81леÑ\82иÑ\82е ÐºÐ»Ð¾Ð½Ð¸"
 
-#: builtin/commit.c:477
-msgid "unable to write temporary index file"
-msgstr "вÑ\80еменниÑ\8fÑ\82 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð¸Ñ\81ан"
+#: builtin/branch.c:583
+msgid "print only branches that are not merged"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ð½ÐµÑ\81леÑ\82иÑ\82е ÐºÐ»Ð¾Ð½Ð¸"
 
-#: builtin/commit.c:582
-#, c-format
-msgid "commit '%s' lacks author header"
-msgstr "заглавната част за автор в подаването „%s“ липсва"
+#: builtin/branch.c:584
+msgid "list branches in columns"
+msgstr "извеждане по колони"
 
-#: builtin/commit.c:584
-#, c-format
-msgid "commit '%s' has malformed author line"
-msgstr "заглавната част за автор в подаването „%s“ е неправилна"
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
+msgid "key"
+msgstr "КЛЮЧ"
 
-#: builtin/commit.c:603
-msgid "malformed --author parameter"
-msgstr "непÑ\80авилен Ð¿Ð°Ñ\80амеÑ\82Ñ\8aÑ\80 ÐºÑ\8aм Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--authorâ\80\9c"
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
+msgid "field name to sort on"
+msgstr "име Ð½Ð° Ð¿Ð¾Ð»ÐµÑ\82о, Ð¿Ð¾ ÐºÐ¾ÐµÑ\82о Ð´Ð° Ðµ Ð¿Ð¾Ð´Ñ\80едбаÑ\82а"
 
-#: builtin/commit.c:611
-#, c-format
-msgid "invalid date format: %s"
-msgstr "неправилен формат на дата: %s"
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
+msgid "object"
+msgstr "ОБЕКТ"
 
-#: builtin/commit.c:655
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
-msgstr ""
-"не може да се избере знак за коментар — в текущото съобщение за подаване са "
-"използвани всички подобни знаци"
+#: builtin/branch.c:589
+msgid "print only branches of the object"
+msgstr "извеждане само на клоните на ОБЕКТА"
 
-#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1091
-#, c-format
-msgid "could not lookup commit %s"
-msgstr "следното подаване не може да бъде открито: %s"
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "подредбата и филтрирането третират еднакво малките и главните букви"
 
-#: builtin/commit.c:704 builtin/shortlog.c:285
-#, c-format
-msgid "(reading log message from standard input)\n"
-msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "ФОРМАТ за изхода"
 
-#: builtin/commit.c:706
-msgid "could not read log from standard input"
-msgstr "съобщението за подаване не бе прочетено стандартния вход"
+#: builtin/branch.c:611
+msgid "Failed to resolve HEAD as a valid ref."
+msgstr "Не може да се открие към какво сочи указателят „HEAD“"
 
-#: builtin/commit.c:710
-#, c-format
-msgid "could not read log file '%s'"
-msgstr "файлът със съобщението за подаване „%s“ не може да бъде прочетен"
+#: builtin/branch.c:615 builtin/clone.c:724
+msgid "HEAD not found below refs/heads!"
+msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
 
-#: builtin/commit.c:737 builtin/commit.c:745
-msgid "could not read SQUASH_MSG"
-msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено"
+#: builtin/branch.c:638
+msgid "--column and --verbose are incompatible"
+msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
 
-#: builtin/commit.c:742
-msgid "could not read MERGE_MSG"
-msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
+#: builtin/branch.c:649 builtin/branch.c:701
+msgid "branch name required"
+msgstr "Необходимо е име на клон"
 
-#: builtin/commit.c:796
-msgid "could not write commit template"
-msgstr "шаблонът за подаване не може да бъде запазен"
+#: builtin/branch.c:677
+msgid "Cannot give description to detached HEAD"
+msgstr "Не може да зададете описание на несвързан „HEAD“"
 
-# FIXME
-#: builtin/commit.c:814
-#, c-format
-msgid ""
-"\n"
-"It looks like you may be committing a merge.\n"
-"If this is not correct, please remove the file\n"
-"\t%s\n"
-"and try again.\n"
-msgstr ""
-"\n"
-"Изглежда, че подавате сливане. Ако това не е така, изтрийте файла:\n"
-"\n"
-"  %s\n"
-"и опитайте отново.\n"
+#: builtin/branch.c:682
+msgid "cannot edit description of more than one branch"
+msgstr "Не може да редактирате описанието на повече от един клон едновременно"
 
-# FIXME
-#: builtin/commit.c:819
+#: builtin/branch.c:689
 #, c-format
-msgid ""
-"\n"
-"It looks like you may be committing a cherry-pick.\n"
-"If this is not correct, please remove the file\n"
-"\t%s\n"
-"and try again.\n"
-msgstr ""
-"\n"
-"Изглежда, че извършвате отбрано подаване. Ако това не е така, изтрийте "
-"файла:\n"
-"\n"
-"  %s\n"
-"и опитайте отново.\n"
+msgid "No commit on branch '%s' yet."
+msgstr "В клона „%s“ все още няма подавания."
 
-#: builtin/commit.c:832
+#: builtin/branch.c:692
 #, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored, and an empty message aborts the commit.\n"
-msgstr ""
-"Въведете съобщението за подаване на промените. Редовете, които започват\n"
-"с „%c“, ще бъдат пропуснати, а празно съобщение преустановява подаването.\n"
+msgid "No branch named '%s'."
+msgstr "Липсва клон на име „%s“."
 
-#: builtin/commit.c:839
+#: builtin/branch.c:707
+msgid "too many branches for a rename operation"
+msgstr "Прекалено много клони за преименуване"
+
+#: builtin/branch.c:712
+msgid "too many branches to set new upstream"
+msgstr "Зададени са прекалено много клони за следене"
+
+#: builtin/branch.c:716
 #, c-format
 msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-"An empty message aborts the commit.\n"
+"could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
-"Въведете съобщението за подаване на промените. Редовете, които започват\n"
-"с „%c“, също ще бъдат включени — може да ги изтриете вие. Празно \n"
-"съобщение преустановява подаването.\n"
+"Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
+"никой клон."
 
-#: builtin/commit.c:859
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
-msgstr "%sАвтор:   %.*s <%.*s>"
+msgid "no such branch '%s'"
+msgstr "Няма клон на име „%s“."
 
-#: builtin/commit.c:867
+#: builtin/branch.c:723
 #, c-format
-msgid "%sDate:      %s"
-msgstr "%sДата:    %s"
+msgid "branch '%s' does not exist"
+msgstr "Не съществува клон на име „%s“."
 
-#: builtin/commit.c:874
+#: builtin/branch.c:735
+msgid "too many branches to unset upstream"
+msgstr "Прекалено много клони за махане на следене"
+
+#: builtin/branch.c:739
+msgid "could not unset upstream of HEAD when it does not point to any branch."
+msgstr ""
+"Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
+
+#: builtin/branch.c:745
 #, c-format
-msgid "%sCommitter: %.*s <%.*s>"
-msgstr "%sПодаващ: %.*s <%.*s>"
+msgid "Branch '%s' has no upstream information"
+msgstr "Няма информация клонът „%s“ да следи някой друг"
 
-#: builtin/commit.c:892
-msgid "Cannot read index"
-msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
+#: builtin/branch.c:759
+msgid "it does not make sense to create 'HEAD' manually"
+msgstr "Ð\9dÑ\8fма Ð½Ð¸ÐºÐ°ÐºÑ\8aв Ñ\81миÑ\81Ñ\8aл Ñ\80Ñ\8aÑ\87но Ð´Ð° Ñ\81Ñ\8aздаваÑ\82е â\80\9eHEADâ\80\9c."
 
-#: builtin/commit.c:949
-msgid "Error building trees"
-msgstr "Ð\93Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¸Ð·Ð³Ñ\80аждане Ð½Ð° Ð´Ñ\8aÑ\80веÑ\82аÑ\82а"
+#: builtin/branch.c:765
+msgid "-a and -r options to 'git branch' do not make sense with a branch name"
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e-aâ\80\9c Ð¸ â\80\9e-râ\80\9c Ð½Ð° â\80\9egit branchâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими Ñ\81 Ð¸Ð¼Ðµ Ð½Ð° ÐºÐ»Ð¾Ð½"
 
-#: builtin/commit.c:964 builtin/tag.c:266
+#: builtin/branch.c:768
 #, c-format
-msgid "Please supply the message using either -m or -F option.\n"
-msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr ""
+"Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната.  "
+"Използвайте „--track“ или „--set-upstream-to“\n"
 
-#: builtin/commit.c:1066
+#: builtin/branch.c:785
 #, c-format
-msgid "--author '%s' is not 'Name <email>' and matches no existing author"
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
 msgstr ""
-"Опцията „--author '%s'“ не отговаря на форма̀та „Име <е-поща>“ и не съвпада с "
-"никой автор"
+"\n"
+"За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n"
+"\n"
 
-#: builtin/commit.c:1081 builtin/commit.c:1321
+#: builtin/bundle.c:45
 #, c-format
-msgid "Invalid untracked files mode '%s'"
-msgstr "Неправилна стойност за неследените файлове: „%s“"
-
-#: builtin/commit.c:1118
-msgid "--long and -z are incompatible"
-msgstr "Опциите „--long“ и „-z“ са несъвместими."
-
-#: builtin/commit.c:1148
-msgid "Using both --reset-author and --author does not make sense"
-msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
+msgid "%s is okay\n"
+msgstr "Пратката „%s“ е наред\n"
 
-#: builtin/commit.c:1157
-msgid "You have nothing to amend."
-msgstr "Ð\9dÑ\8fма ÐºÐ°ÐºÐ²Ð¾ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾Ð¿Ñ\80авено."
+#: builtin/bundle.c:58
+msgid "Need a repository to create a bundle."
+msgstr "Ð\97а Ñ\81Ñ\8aздаванеÑ\82о Ð½Ð° Ð¿Ñ\80аÑ\82ка Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ñ\85Ñ\80анилиÑ\89е."
 
-#: builtin/commit.c:1160
-msgid "You are in the middle of a merge -- cannot amend."
-msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ñ\81ливане, Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð¿Ñ\80авÑ\8fÑ\82е."
+#: builtin/bundle.c:62
+msgid "Need a repository to unbundle."
+msgstr "Ð\97а Ð¿Ñ\80иеманеÑ\82о Ð½Ð° Ð¿Ñ\80аÑ\82ка Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ñ\85Ñ\80анилиÑ\89е."
 
-#: builtin/commit.c:1162
-msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr "В момента се извършва отбиране на подаване, не можете да поправяте."
+#: builtin/cat-file.c:513
+msgid ""
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
+msgstr ""
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | ВИД | --textconv --filters) [--path=ПЪТ] ОБЕКТ"
 
-#: builtin/commit.c:1165
-msgid "Options --squash and --fixup cannot be used together"
-msgstr "Опциите „--squash“ и „--fixup“ са несъвместими."
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/commit.c:1175
-msgid "Only one of -c/-C/-F/--fixup can be used."
-msgstr "Опциите „-c“, „-C“, „-F“ и „--fixup““ са несъвместими."
+#: builtin/cat-file.c:551
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr ""
+"ВИДът може да е: „blob“ (обект BLOB), „tree“ (дърво), „commit“ (подаване), "
+"„tag“ (етикет)"
 
-#: builtin/commit.c:1177
-msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
-msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e-mâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 â\80\9e-câ\80\9c, â\80\9e-Câ\80\9c, â\80\9e-Fâ\80\9c Ð¸ â\80\9e--fixupâ\80\9c."
+#: builtin/cat-file.c:552
+msgid "show object type"
+msgstr "извеждане Ð½Ð° Ð²Ð¸Ð´Ð° Ð½Ð° Ð¾Ð±ÐµÐºÑ\82"
 
-#: builtin/commit.c:1185
-msgid "--reset-author can be used only with -C, -c or --amend."
-msgstr ""
-"Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
-"„--amend“."
+#: builtin/cat-file.c:553
+msgid "show object size"
+msgstr "извеждане на размера на обект"
 
-#: builtin/commit.c:1202
-msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
-msgstr ""
-"Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
-"несъвместими."
+#: builtin/cat-file.c:555
+msgid "exit with zero when there's no error"
+msgstr "изход с 0, когато няма грешка"
 
-#: builtin/commit.c:1204
-msgid "No paths with --include/--only does not make sense."
-msgstr "Опциите „--include“ и „--only“ изискват аргументи."
+#: builtin/cat-file.c:556
+msgid "pretty-print object's content"
+msgstr "форматирано извеждане на съдържанието на обекта"
 
-# FIXME bad message
-#: builtin/commit.c:1206
-msgid "Clever... amending the last one with dirty index."
+#: builtin/cat-file.c:558
+msgid "for blob objects, run textconv on object's content"
 msgstr ""
-"Чудесно сте се сетили как да поправите съобщението на последното подаване "
-"при\n"
-"променен индекс. Споделете и с друг потребител трика с „git commit --amend -"
-"o“."
+"да се стартира програмата зададена в настройката „textconv“ за преобразуване "
+"на съдържанието на обекта BLOB"
 
-#: builtin/commit.c:1208
-msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
 msgstr ""
-"Зададени са изрични пътища без опциите „-i“ или „-o“. Приема се, че все едно "
-"сте\n"
-"ползвали опцията „--only“ с ПЪТища…"
-
-#: builtin/commit.c:1220 builtin/tag.c:474
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr "Несъществуващ режим на изчистване „%s“"
-
-#: builtin/commit.c:1225
-msgid "Paths with -a does not make sense."
-msgstr "Опцията „-a“ е несъвместима със задаването на пътища."
+"да се стартират програмите за преобразуване на съдържанието на обектите BLOB"
 
-#: builtin/commit.c:1335 builtin/commit.c:1621
-msgid "show status concisely"
-msgstr "кÑ\80аÑ\82ка Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о"
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "обекÑ\82 BLOB"
 
-#: builtin/commit.c:1337 builtin/commit.c:1623
-msgid "show branch information"
-msgstr "инÑ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е"
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "опÑ\86ииÑ\82е â\80\9e--textconvâ\80\9c\80\9e--filtersâ\80\9c Ð¸Ð·Ð¸Ñ\81кваÑ\82 Ð¿Ñ\8aÑ\82"
 
-#: builtin/commit.c:1339 builtin/commit.c:1625 builtin/push.c:512
-#: builtin/worktree.c:437
-msgid "machine-readable output"
-msgstr "формат на изхода за четене от програма"
+#: builtin/cat-file.c:564
+msgid "allow -s and -t to work with broken/corrupt objects"
+msgstr "позволяване на опциите „-s“ и „-t“ да работят с повредени обекти"
 
-#: builtin/commit.c:1342 builtin/commit.c:1627
-msgid "show status in long format (default)"
-msgstr "подÑ\80обна Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о (Ñ\81Ñ\82андаÑ\80Ñ\82но)"
+#: builtin/cat-file.c:565
+msgid "buffer --batch output"
+msgstr "бÑ\83Ñ\84еÑ\80иÑ\80ане Ð½Ð° Ð¸Ð·Ñ\85ода Ð¾Ñ\82 â\80\9e--batchâ\80\9c"
 
-#: builtin/commit.c:1345 builtin/commit.c:1630
-msgid "terminate entries with NUL"
-msgstr "разделяне на елементите с нулевия знак „NUL“"
+#: builtin/cat-file.c:567
+msgid "show info and content of objects fed from the standard input"
+msgstr ""
+"извеждане на информация и съдържание на обектите подадени на стандартния вход"
 
-#: builtin/commit.c:1347 builtin/commit.c:1633 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
-msgid "mode"
-msgstr "РЕЖИМ"
+#: builtin/cat-file.c:570
+msgid "show info about objects fed from the standard input"
+msgstr "извеждане на информация за обектите подадени на стандартния вход"
 
-#: builtin/commit.c:1348 builtin/commit.c:1633
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+#: builtin/cat-file.c:573
+msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
-"извеждане на неследените файлове. Възможните РЕЖИМи са „all“ (подробна "
-"информация), „normal“ (кратка информация), „no“ (без неследените файлове). "
-"Стандартният РЕЖИМ е: „all“."
+"следване на символните връзки сочещи в дървото (ползва се с „--batch“ или „--"
+"batch-check“)"
 
-#: builtin/commit.c:1351
-msgid "show ignored files"
-msgstr "извеждане Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ñ\84айлове"
+#: builtin/cat-file.c:575
+msgid "show all objects with --batch or --batch-check"
+msgstr "извеждане Ð½Ð° Ð²Ñ\81иÑ\87ки Ð¾Ð±ÐµÐºÑ\82и Ñ\81 â\80\9e--batchâ\80\9c Ð¸Ð»Ð¸ â\80\9e--batch-checkâ\80\9c"
 
-#: builtin/commit.c:1352 parse-options.h:155
-msgid "when"
-msgstr "КОГА"
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
+msgstr "git check-attr [-a | --all | АТРИБУТ…] [--] ПЪТ…"
 
-#: builtin/commit.c:1353
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
-"игнориране на промените в подмодулите. Опция с незадължителна стойност — "
-"една от „all“ (всички), „dirty“ (тези с неподадени промени), "
-"„untracked“ (неследени)"
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…]"
 
-#: builtin/commit.c:1355
-msgid "list untracked files in columns"
-msgstr "извеждане Ð½Ð° Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове Ð² ÐºÐ¾Ð»Ð¾Ð½Ð¸"
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr "извеждане Ð½Ð° Ð²Ñ\81иÑ\87ки Ð°Ñ\82Ñ\80ибÑ\83Ñ\82и, Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸ Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ñ\84айл"
 
-#: builtin/commit.c:1441
-msgid "couldn't look up newly created commit"
-msgstr "току що създаденото подаване не може да бъде открито"
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr "използване на файла „.gitattributes“ само от индекса"
 
-#: builtin/commit.c:1443
-msgid "could not parse newly created commit"
-msgstr "току що създаденото подаване не може да бъде анализирано"
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
+msgid "read file names from stdin"
+msgstr "изчитане на имената на файловете от стандартния вход"
 
-#: builtin/commit.c:1488
-msgid "detached HEAD"
-msgstr "несвързан връх „HEAD“"
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
+msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
 
-#: builtin/commit.c:1491
-msgid " (root-commit)"
-msgstr " (начално подаване)"
-
-#: builtin/commit.c:1591
-msgid "suppress summary after successful commit"
-msgstr "без информация след успешно подаване"
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
+msgid "suppress progress reporting"
+msgstr "без показване на напредъка"
 
-#: builtin/commit.c:1592
-msgid "show diff in commit message template"
-msgstr "добавÑ\8fне Ð½Ð° Ñ\80азликаÑ\82а ÐºÑ\8aм Ñ\88аблона Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
+msgstr "извеждане Ð½Ð° Ð½ÐµÑ\81Ñ\8aвпадаÑ\89иÑ\82е Ð¿Ñ\8aÑ\82иÑ\89а"
 
-#: builtin/commit.c:1594
-msgid "Commit message options"
-msgstr "Ð\9eпÑ\86ии Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
+msgstr "пÑ\80еÑ\81каÑ\87ане Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а Ð¿Ñ\80и Ð¿Ñ\80овеÑ\80каÑ\82а"
 
-#: builtin/commit.c:1595 builtin/tag.c:351
-msgid "read message from file"
-msgstr "взимане Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ð¤Ð\90Ð\99Ð\9b"
+#: builtin/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
+msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--stdinâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð¸Ð¼ÐµÐ½Ð° Ð½Ð° Ð¿Ñ\8aÑ\82иÑ\89а"
 
-#: builtin/commit.c:1596
-msgid "author"
-msgstr "Ð\90Ð\92ТÐ\9eР"
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
+msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e-zâ\80\9c Ð¸Ð·Ð¸Ñ\81ква â\80\9e--stdinâ\80\9c"
 
-#: builtin/commit.c:1596
-msgid "override author for commit"
-msgstr "задаване Ð½Ð° Ð\90Ð\92ТÐ\9eР Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
+#: builtin/check-ignore.c:159
+msgid "no path specified"
+msgstr "не Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½ Ð¿Ñ\8aÑ\82"
 
-#: builtin/commit.c:1597 builtin/gc.c:326
-msgid "date"
-msgstr "Ð\94Ð\90ТÐ\90"
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
+msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--quietâ\80\9c Ð¸Ð·Ð¸Ñ\81ква Ð´Ð° Ðµ Ð¿Ð¾Ð´Ð°Ð´ÐµÐ½ Ñ\82оÑ\87но ÐµÐ´Ð¸Ð½ Ð¿Ñ\8aÑ\82"
 
-#: builtin/commit.c:1597
-msgid "override date for commit"
-msgstr "задаване Ð½Ð° Ð\94Ð\90ТÐ\90 Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
+msgstr "опÑ\86ииÑ\82е â\80\9e--quietâ\80\9c Ð¸ â\80\9e--verboseâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
 
-#: builtin/commit.c:1598 builtin/merge.c:219 builtin/notes.c:395
-#: builtin/notes.c:558 builtin/tag.c:349
-msgid "message"
-msgstr "СЪОБЩЕНИЕ"
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
+msgstr "опцията „--non-matching“ изисква „--verbose“"
 
-#: builtin/commit.c:1598
-msgid "commit message"
-msgstr "СЪОБЩЕНИЕ при подаване"
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [<options>] <contact>..."
+msgstr "git check-mailmap [ОПЦИЯ…] КОНТАКТ…"
 
-#: builtin/commit.c:1599 builtin/commit.c:1600 builtin/commit.c:1601
-#: builtin/commit.c:1602 parse-options.h:256 ref-filter.h:79
-msgid "commit"
-msgstr "ПОДАВАНЕ"
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
+msgstr "четене на контакти и от стандартния вход"
 
-#: builtin/commit.c:1599
-msgid "reuse and edit message from specified commit"
-msgstr "преизползване и редактиране на съобщението от указаното ПОДАВАНЕ"
+#: builtin/check-mailmap.c:24
+#, c-format
+msgid "unable to parse contact: %s"
+msgstr "контактът не може да бъде анализиран: %s"
 
-#: builtin/commit.c:1600
-msgid "reuse message from specified commit"
-msgstr "пÑ\80еизползване Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ñ\83казаноÑ\82о Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
+msgstr "не Ñ\81а Ñ\83казани ÐºÐ¾Ð½Ñ\82акÑ\82и"
 
-#: builtin/commit.c:1601
-msgid "use autosquash formatted message to fixup specified commit"
-msgstr ""
-"използване на автоматичното съобщение при смачкване за вкарване на указаното "
-"ПОДАВАНЕ в предното без следа"
+#: builtin/checkout-index.c:127
+msgid "git checkout-index [<options>] [--] [<file>...]"
+msgstr "git checkout-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
 
-#: builtin/commit.c:1602
-msgid "use autosquash formatted message to squash specified commit"
-msgstr ""
-"използване на автоматичното съобщение при смачкване за смачкване на "
-"указаното ПОДАВАНЕ в предното"
+#: builtin/checkout-index.c:144
+msgid "stage should be between 1 and 3 or all"
+msgstr "етапът трябва да е „1“, „2“, „3“ или „all“ (всички)"
 
-#: builtin/commit.c:1603
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
-msgstr ""
-"смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
+#: builtin/checkout-index.c:160
+msgid "check out all files in the index"
+msgstr "изтегляне на всички файлове в индекса"
 
-#: builtin/commit.c:1604 builtin/log.c:1382 builtin/revert.c:86
-msgid "add Signed-off-by:"
-msgstr "добавÑ\8fне Ð½Ð° Ð¿Ð¾Ð»Ðµ Ð·Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 â\80\94 â\80\9eSigned-off-by:â\80\9c"
+#: builtin/checkout-index.c:161
+msgid "force overwrite of existing files"
+msgstr "пÑ\80езапиÑ\81ване Ð½Ð° Ñ\84айловеÑ\82е, Ð´Ð¾Ñ\80и Ð¸ Ð´Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\82"
 
-#: builtin/commit.c:1605
-msgid "use specified template file"
-msgstr "използване Ð½Ð° Ñ\83казаниÑ\8f Ñ\88аблонен Ð¤Ð\90Ð\99Ð\9b"
+#: builtin/checkout-index.c:163
+msgid "no warning for existing files and files not in index"
+msgstr "без Ð¿Ñ\80едÑ\83пÑ\80еждениÑ\8f Ð¿Ñ\80и Ð»Ð¸Ð¿Ñ\81ваÑ\89и Ñ\84айлове Ð¸ Ñ\84айлове Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: builtin/commit.c:1606
-msgid "force edit of commit"
-msgstr "редактиране на подаване"
+#: builtin/checkout-index.c:165
+msgid "don't checkout new files"
+msgstr "без изтегляне на нови файлове"
 
-#: builtin/commit.c:1607
-msgid "default"
-msgstr "стандартно"
+#: builtin/checkout-index.c:167
+msgid "update stat information in the index file"
+msgstr "обновяване на информацията получена чрез „stat“ за файловете в индекса"
 
-#: builtin/commit.c:1607 builtin/tag.c:354
-msgid "how to strip spaces and #comments from message"
-msgstr "кои Ð¿Ñ\80азни Ð·Ð½Ð°Ñ\86и Ð¸ #коменÑ\82аÑ\80и Ð´Ð° Ñ\81е Ð¼Ð°Ñ\85аÑ\82 Ð¾Ñ\82 Ñ\81Ñ\8aобÑ\89ениÑ\8fÑ\82а"
+#: builtin/checkout-index.c:171
+msgid "read list of paths from the standard input"
+msgstr "изÑ\87иÑ\82ане Ð½Ð° Ð¿Ñ\8aÑ\82иÑ\89аÑ\82а Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од"
 
-#: builtin/commit.c:1608
-msgid "include status in commit message template"
-msgstr "вмÑ\8aкване Ð½Ð° Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о Ð² Ñ\88аблона Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½е"
+#: builtin/checkout-index.c:173
+msgid "write the content to temporary files"
+msgstr "запиÑ\81ване Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð²Ñ\8aв Ð²Ñ\80еменни Ñ\84айлове"
 
-#: builtin/commit.c:1610 builtin/merge.c:229 builtin/pull.c:165
-#: builtin/revert.c:93
-msgid "GPG sign commit"
-msgstr "подписване на подаването с GPG"
+#: builtin/checkout-index.c:174 builtin/column.c:30
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
+msgid "string"
+msgstr "НИЗ"
 
-#: builtin/commit.c:1613
-msgid "Commit contents options"
-msgstr "Ð\9eпÑ\86ии Ð·Ð° Ð¸Ð·Ð±Ð¾Ñ\80 Ð½Ð° Ñ\84айлове Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: builtin/checkout-index.c:175
+msgid "when creating files, prepend <string>"
+msgstr "пÑ\80и Ñ\81Ñ\8aздаванеÑ\82о Ð½Ð° Ð½Ð¾Ð²Ð¸ Ñ\84айлове Ð´Ð° Ñ\81е Ð´Ð¾Ð±Ð°Ð²Ñ\8f Ð¿Ñ\80еÑ\84икÑ\81а Ð\9dÐ\98Ð\97"
 
-#: builtin/commit.c:1614
-msgid "commit all changed files"
-msgstr "подаване Ð½Ð° Ð²Ñ\81иÑ\87ки Ð¿Ñ\80оменени Ñ\84айлове"
+#: builtin/checkout-index.c:177
+msgid "copy out the files from named stage"
+msgstr "копиÑ\80ане Ð½Ð° Ñ\84айловеÑ\82е Ð¾Ñ\82 Ñ\82ова Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fние Ð½Ð° Ñ\81ливане"
 
-#: builtin/commit.c:1615
-msgid "add specified files to index for commit"
-msgstr "добавяне на указаните файлове към индекса за подаване"
+#: builtin/checkout.c:27
+msgid "git checkout [<options>] <branch>"
+msgstr "git checkout [ОПЦИЯ…] КЛОН"
 
-#: builtin/commit.c:1616
-msgid "interactively add files"
-msgstr "интерактивно добавяне на файлове"
+#: builtin/checkout.c:28
+msgid "git checkout [<options>] [<branch>] -- <file>..."
+msgstr "git checkout [ОПЦИЯ…] [КЛОН] -- ФАЙЛ…"
 
-#: builtin/commit.c:1617
-msgid "interactively add changes"
-msgstr "интерактивно добавяне на промени"
+#: builtin/checkout.c:153 builtin/checkout.c:186
+#, c-format
+msgid "path '%s' does not have our version"
+msgstr "вашата версия липсва в пътя „%s“"
 
-#: builtin/commit.c:1618
-msgid "commit only specified files"
-msgstr "подаване само на указаните файлове"
+#: builtin/checkout.c:155 builtin/checkout.c:188
+#, c-format
+msgid "path '%s' does not have their version"
+msgstr "чуждата версия липсва в пътя „%s“"
 
-#: builtin/commit.c:1619
-msgid "bypass pre-commit hook"
-msgstr "без изпълнение на куката преди подаване (pre-commit)"
+#: builtin/checkout.c:171
+#, c-format
+msgid "path '%s' does not have all necessary versions"
+msgstr "някоя от необходимите версии липсва в пътя „%s“"
 
-#: builtin/commit.c:1620
-msgid "show what would be committed"
-msgstr "отпечатване на това, което би било подадено"
+#: builtin/checkout.c:215
+#, c-format
+msgid "path '%s' does not have necessary versions"
+msgstr "някоя от необходимите версии липсва в пътя „%s“"
 
-#: builtin/commit.c:1631
-msgid "amend previous commit"
-msgstr "поправяне на предишното подаване"
+#: builtin/checkout.c:232
+#, c-format
+msgid "path '%s': cannot merge"
+msgstr "пътят „%s“ не може да бъде слян"
 
-#: builtin/commit.c:1632
-msgid "bypass post-rewrite hook"
-msgstr "без изпълнение на куката след презаписване (post-rewrite)"
+#: builtin/checkout.c:249
+#, c-format
+msgid "Unable to add merge result for '%s'"
+msgstr "Резултатът за „%s“ не може да бъде слян"
 
-#: builtin/commit.c:1637
-msgid "ok to record an empty change"
-msgstr "позволяване на празни подавания"
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
+#, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr "Опцията „%s“ е несъвместима с обновяването на пътища"
 
-#: builtin/commit.c:1639
-msgid "ok to record a change with an empty message"
-msgstr "позволяване на подавания с празни съобщения"
+#: builtin/checkout.c:281 builtin/checkout.c:284
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr "Опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/commit.c:1668
-msgid "could not parse HEAD commit"
-msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
+#: builtin/checkout.c:287
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr ""
+"Невъзможно е едновременно да обновявате пътища и да преминете към клона „%s“."
 
-#: builtin/commit.c:1718
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr "Ð\9fовÑ\80еден Ñ\84айл Ð·Ð° Ð²Ñ\8aÑ\80Ñ\85а Ð·Ð° Ñ\81ливанеÑ\82о â\80\9eMERGE_HEADâ\80\9c (%s)"
+msgid "path '%s' is unmerged"
+msgstr "пÑ\8aÑ\82Ñ\8fÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ñ\81лÑ\8fÑ\82"
 
-#: builtin/commit.c:1725
-msgid "could not read MERGE_MODE"
-msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
+#: builtin/checkout.c:513
+msgid "you need to resolve your current index first"
+msgstr "първо трябва да коригирате индекса си"
 
-#: builtin/commit.c:1744
+#: builtin/checkout.c:644
 #, c-format
-msgid "could not read commit message: %s"
-msgstr "съобщението за подаване не може да бъде прочетено: %s"
+msgid "Can not do reflog for '%s': %s\n"
+msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
 
-#: builtin/commit.c:1755
-#, c-format
-msgid "Aborting commit; you did not edit the message.\n"
-msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
+#: builtin/checkout.c:685
+msgid "HEAD is now at"
+msgstr "Указателят „HEAD“ в момента сочи към"
+
+#: builtin/checkout.c:689 builtin/clone.c:678
+msgid "unable to update HEAD"
+msgstr "Указателят „HEAD“ не може да бъде обновен"
 
-#: builtin/commit.c:1760
+#: builtin/checkout.c:693
 #, c-format
-msgid "Aborting commit due to empty commit message.\n"
-msgstr "Ð\9dеизвÑ\8aÑ\80Ñ\88ване Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð¿Ð¾Ñ\80ади Ð¿Ñ\80азно Ñ\81Ñ\8aобÑ\89ение.\n"
+msgid "Reset branch '%s'\n"
+msgstr "Ð\97анÑ\83лÑ\8fване Ð½Ð° ÐºÐ»Ð¾Ð½Ð° â\80\9e%sâ\80\9c\n"
 
-#: builtin/commit.c:1808
-msgid ""
-"Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full and quota is\n"
-"not exceeded, and then \"git reset HEAD\" to recover."
-msgstr ""
-"Хранилището е обновено, но новият файл за индекс „new_index“\n"
-"не е записан. Проверете дали дискът не е препълнен или не сте\n"
-"превишили дисковата си квота. След това изпълнете „git reset HEAD“."
+#: builtin/checkout.c:696
+#, c-format
+msgid "Already on '%s'\n"
+msgstr "Вече сте на „%s“\n"
 
-#: builtin/config.c:9
-msgid "git config [<options>]"
-msgstr "git config [ОПЦИЯ…]"
+#: builtin/checkout.c:700
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
+msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
 
-#: builtin/config.c:56
-msgid "Config file location"
-msgstr "Местоположение на конфигурационния файл"
+#: builtin/checkout.c:702 builtin/checkout.c:1090
+#, c-format
+msgid "Switched to a new branch '%s'\n"
+msgstr "Преминахте към новия клон „%s“\n"
 
-#: builtin/config.c:57
-msgid "use global config file"
-msgstr "използване на глобалния конфигурационен файл"
+#: builtin/checkout.c:704
+#, c-format
+msgid "Switched to branch '%s'\n"
+msgstr "Преминахте към клона „%s“\n"
 
-#: builtin/config.c:58
-msgid "use system config file"
-msgstr "използване на системния конфигурационен файл"
+#: builtin/checkout.c:755
+#, c-format
+msgid " ... and %d more.\n"
+msgstr "… и още %d.\n"
 
-#: builtin/config.c:59
-msgid "use repository config file"
-msgstr "използване на конфигурационния файл на хранилището"
+#: builtin/checkout.c:761
+#, c-format
+msgid ""
+"Warning: you are leaving %d commit behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgid_plural ""
+"Warning: you are leaving %d commits behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgstr[0] ""
+"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подаване, което не е свързано към никой клон:\n"
+"\n"
+"%s\n"
+msgstr[1] ""
+"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подавания, които не са свързани към никой "
+"клон:\n"
+"\n"
+"%s\n"
 
-#: builtin/config.c:60
-msgid "use given config file"
-msgstr "използване на зададения конфигурационен ФАЙЛ"
+#: builtin/checkout.c:780
+#, c-format
+msgid ""
+"If you want to keep it by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgid_plural ""
+"If you want to keep them by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgstr[0] ""
+"Ако все пак искате да запазите тази промяна чрез създаване на клон,\n"
+"сега е най-подходящият за това чрез командата:\n"
+"\n"
+" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
+"\n"
+msgstr[1] ""
+"Ако все пак искате да запазите тези промени чрез създаване на клон,\n"
+"сега е най-подходящият за това чрез командата:\n"
+"\n"
+" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
+"\n"
 
-#: builtin/config.c:61
-msgid "blob-id"
-msgstr "Ð\98Ð\94Ð\95Ð\9dТÐ\98ФÐ\98Ð\9aÐ\90ТÐ\9eР"
+#: builtin/checkout.c:816
+msgid "internal error in revision walk"
+msgstr "вÑ\8aÑ\82Ñ\80еÑ\88на Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¾Ð±Ñ\85ожданеÑ\82о Ð½Ð° Ð²ÐµÑ\80Ñ\81ииÑ\82е"
 
-#: builtin/config.c:61
-msgid "read config from given blob object"
-msgstr ""
-"изчитане на конфигурацията от BLOB с този ИДЕНТИФИКАТОР на съдържанието"
+#: builtin/checkout.c:820
+msgid "Previous HEAD position was"
+msgstr "Преди това „HEAD“ сочеше към"
 
-#: builtin/config.c:62
-msgid "Action"
-msgstr "Ð\94ейÑ\81Ñ\82вие"
+#: builtin/checkout.c:847 builtin/checkout.c:1085
+msgid "You are on a branch yet to be born"
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\81Ñ\82е Ð½Ð° ÐºÐ»Ð¾Ð½, ÐºÐ¾Ð¹Ñ\82о Ð¿Ñ\80едÑ\81Ñ\82ои Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздаден"
 
-#: builtin/config.c:63
-msgid "get value: name [value-regex]"
-msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
+#: builtin/checkout.c:991
+#, c-format
+msgid "only one reference expected, %d given."
+msgstr "очакваше се един указател, а сте подали %d."
 
-#: builtin/config.c:64
-msgid "get all values: key [value-regex]"
-msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
+#: builtin/checkout.c:1031 builtin/worktree.c:214
+#, c-format
+msgid "invalid reference: %s"
+msgstr "неправилен указател: %s"
 
-#: builtin/config.c:65
-msgid "get values for regexp: name-regex [value-regex]"
-msgstr ""
-"извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
-"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
+#: builtin/checkout.c:1060
+#, c-format
+msgid "reference is not a tree: %s"
+msgstr "указателят не сочи към обект-дърво: %s"
 
-#: builtin/config.c:66
-msgid "get value specific for the URL: section[.var] URL"
-msgstr "извеждане Ð½Ð° Ñ\81Ñ\82ойноÑ\81Ñ\82Ñ\82а Ð·Ð° Ñ\83казаниÑ\8f Ð°Ð´Ñ\80еÑ\81: Ð Ð\90Ð\97Ð\94Ð\95Ð\9b[.Ð\9fРÐ\9eÐ\9cÐ\95Ð\9dÐ\9bÐ\98Ð\92Ð\90] Ð\90Ð\94РÐ\95С"
+#: builtin/checkout.c:1099
+msgid "paths cannot be used with switching branches"
+msgstr "задаванеÑ\82о Ð½Ð° Ð¿Ñ\8aÑ\82 Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82имо Ñ\81 Ð¿Ñ\80еминаванеÑ\82о Ð¾Ñ\82 ÐµÐ´Ð¸Ð½ ÐºÐ»Ð¾Ð½ ÐºÑ\8aм Ð´Ñ\80Ñ\83г"
 
-#: builtin/config.c:67
-msgid "replace all matching variables: name value [value_regex]"
-msgstr ""
-"замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
-"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
+#, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
 
-#: builtin/config.c:68
-msgid "add a new variable: name value"
-msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
+#, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr "опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/config.c:69
-msgid "remove a variable: name [value-regex]"
-msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
+#: builtin/checkout.c:1126
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr ""
+"За да преминете към клон, подайте указател, който сочи към подаване.  „%s“ "
+"не е такъв"
 
-#: builtin/config.c:70
-msgid "remove all matches: name [value-regex]"
-msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
+msgid "branch"
+msgstr "клон"
 
-#: builtin/config.c:71
-msgid "rename section: old-name new-name"
-msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
+#: builtin/checkout.c:1160
+msgid "create and checkout a new branch"
+msgstr "създаване и преминаване към нов клон"
 
-#: builtin/config.c:72
-msgid "remove a section: name"
-msgstr "изтриване на раздел: ИМЕ"
+#: builtin/checkout.c:1162
+msgid "create/reset and checkout a branch"
+msgstr "създаване/зануляване на клон и преминаване към него"
 
-#: builtin/config.c:73
-msgid "list all"
-msgstr "изброяване на всички"
+#: builtin/checkout.c:1163
+msgid "create reflog for new branch"
+msgstr "създаване на журнал на указателите за нов клон"
 
-#: builtin/config.c:74
-msgid "open an editor"
-msgstr "оÑ\82ваÑ\80Ñ\8fне Ð½Ð° Ñ\80едакÑ\82оÑ\80"
+#: builtin/checkout.c:1164 builtin/worktree.c:333
+msgid "detach HEAD at named commit"
+msgstr "оÑ\82делÑ\8fне Ð½Ð° Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c ÐºÑ\8aм Ñ\83казаноÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/config.c:75
-msgid "find the color configured: slot [default]"
-msgstr "извеждане Ð½Ð° Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\8f Ñ\86вÑ\8fÑ\82: Ð½Ð¾Ð¼ÐµÑ\80 [Ñ\81Ñ\82андаÑ\80Ñ\82но]"
+#: builtin/checkout.c:1165
+msgid "set upstream info for new branch"
+msgstr "задаване Ð½Ð° ÐºÐ¾Ð¹ ÐºÐ»Ð¾Ð½ Ð±Ð¸Ð²Ð° Ñ\81леден Ð¿Ñ\80и Ñ\81Ñ\8aздаванеÑ\82о Ð½Ð° Ð½Ð¾Ð²Ð¸Ñ\8f ÐºÐ»Ð¾Ð½"
 
-#: builtin/config.c:76
-msgid "find the color setting: slot [stdout-is-tty]"
-msgstr "извеждане Ð½Ð° Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\8f Ñ\86вÑ\8fÑ\82: Ð½Ð¾Ð¼ÐµÑ\80 [Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8fÑ\82 Ð¸Ð·Ñ\85од Ðµ Ñ\82еÑ\80минал]"
+#: builtin/checkout.c:1167
+msgid "new-branch"
+msgstr "Ð\9dÐ\9eÐ\92\9aÐ\9bÐ\9eÐ\9d"
 
-#: builtin/config.c:77
-msgid "Type"
-msgstr "Ð\92ид"
+#: builtin/checkout.c:1167
+msgid "new unparented branch"
+msgstr "нов ÐºÐ»Ð¾Ð½ Ð±ÐµÐ· Ñ\80одиÑ\82ел"
 
-#: builtin/config.c:78
-msgid "value is \"true\" or \"false\""
-msgstr "СТÐ\9eÐ\99Ð\9dÐ\9eСТТÐ\90 Ðµ â\80\9etrueâ\80\9c (иÑ\81Ñ\82ина) Ð¸Ð»Ð¸ â\80\9efalseâ\80\9c (лÑ\8aжа)"
+#: builtin/checkout.c:1168
+msgid "checkout our version for unmerged files"
+msgstr "изÑ\82еглÑ\8fне Ð½Ð° Ð²Ð°Ñ\88аÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ð½Ð° Ð½ÐµÑ\81леÑ\82иÑ\82е Ñ\84айлове"
 
-#: builtin/config.c:79
-msgid "value is decimal number"
-msgstr "СТÐ\9eÐ\99Ð\9dÐ\9eСТТÐ\90 Ðµ Ñ\86Ñ\8fло, Ð´ÐµÑ\81еÑ\82иÑ\87но Ñ\87иÑ\81ло"
+#: builtin/checkout.c:1170
+msgid "checkout their version for unmerged files"
+msgstr "изÑ\82еглÑ\8fне Ð½Ð° Ñ\87Ñ\83ждаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ð½Ð° Ð½ÐµÑ\81леÑ\82иÑ\82е Ñ\84айлове"
 
-#: builtin/config.c:80
-msgid "value is --bool or --int"
-msgstr "СТÐ\9eÐ\99Ð\9dÐ\9eСТТÐ\90 Ðµ â\80\9e--boolâ\80\9c (бÑ\83лева) Ð¸Ð»Ð¸ â\80\9e--intâ\80\9c (деÑ\81еÑ\82иÑ\87но Ñ\86Ñ\8fло Ñ\87иÑ\81ло)"
+#: builtin/checkout.c:1172
+msgid "force checkout (throw away local modifications)"
+msgstr "пÑ\80инÑ\83диÑ\82елно Ð¸Ð·Ñ\82еглÑ\8fне (ваÑ\88иÑ\82е Ð¿Ñ\80омени Ñ\89е Ð±Ñ\8aдаÑ\82 Ð·Ð°Ð½Ñ\83лени)"
 
-#: builtin/config.c:81
-msgid "value is a path (file or directory name)"
-msgstr "СТÐ\9eÐ\99Ð\9dÐ\9eСТТÐ\90 Ðµ Ð¿Ñ\8aÑ\82 (до Ñ\84айл Ð¸Ð»Ð¸ Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f)"
+#: builtin/checkout.c:1173
+msgid "perform a 3-way merge with the new branch"
+msgstr "извÑ\8aÑ\80Ñ\88ване Ð½Ð° Ñ\82Ñ\80ойно Ñ\81ливане Ñ\81 Ð½Ð¾Ð²Ð¸Ñ\8f ÐºÐ»Ð¾Ð½"
 
-#: builtin/config.c:82
-msgid "Other"
-msgstr "Ð\94Ñ\80Ñ\83ги"
+#: builtin/checkout.c:1174 builtin/merge.c:234
+msgid "update ignored files (default)"
+msgstr "обновÑ\8fване Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ñ\84айлове (Ñ\81Ñ\82андаÑ\80Ñ\82но)"
 
-# FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo
-#: builtin/config.c:83
-msgid "terminate values with NUL byte"
-msgstr "разделяне на стойностите с нулевия знак „NUL“"
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
+msgid "style"
+msgstr "СТИЛ"
 
-#: builtin/config.c:84
-msgid "show variable names only"
-msgstr "извеждане Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° Ð¿Ñ\80оменливиÑ\82е"
+#: builtin/checkout.c:1176
+msgid "conflict style (merge or diff3)"
+msgstr "дейÑ\81Ñ\82вие Ð¿Ñ\80и ÐºÐ¾Ð½Ñ\84ликÑ\82 (Ñ\81ливане Ð¸Ð»Ð¸ Ñ\82Ñ\80ойна Ñ\80азлика)"
 
-#: builtin/config.c:85
-msgid "respect include directives on lookup"
-msgstr "пÑ\80и Ñ\82Ñ\8aÑ\80Ñ\81ене Ð´Ð° Ñ\81е Ñ\83важаÑ\82 Ð¸ Ð´Ð¸Ñ\80екÑ\82ивиÑ\82е Ð·Ð° Ð²ÐºÐ»Ñ\8eÑ\87ване"
+#: builtin/checkout.c:1179
+msgid "do not limit pathspecs to sparse entries only"
+msgstr "без Ð¾Ð³Ñ\80аниÑ\87аване Ð½Ð° Ð¸Ð·Ð±Ñ\80оениÑ\82е Ð¿Ñ\8aÑ\82иÑ\89а Ñ\81амо Ð´Ð¾ Ñ\87аÑ\81Ñ\82иÑ\87но Ð¸Ð·Ñ\82еглениÑ\82е"
 
-#: builtin/config.c:86
-msgid "show origin of config (file, standard input, blob, command line)"
+#: builtin/checkout.c:1181
+msgid "second guess 'git checkout <no-such-branch>'"
 msgstr ""
-"извеждане на мястото на задаване на настройката (файл, стандартен вход, "
-"обект BLOB, команден ред)"
-
-#: builtin/config.c:328
-msgid "unable to parse default color value"
-msgstr "неразпозната стойност на стандартния цвят"
+"опит за отгатване на име на клон след неуспешен опит с „git checkout "
+"НЕСЪЩЕСТВУВАЩ_КЛОН“"
 
-#: builtin/config.c:472
-#, c-format
-msgid ""
-"# This is Git's per-user configuration file.\n"
-"[user]\n"
-"# Please adapt and uncomment the following lines:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
-msgstr ""
-"# Това е потребителският ви конфигурационен файл за Git.\n"
-"[user]\n"
-"# Проверете и разкоментирайте следните два реда:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
+#: builtin/checkout.c:1183
+msgid "do not check if another worktree is holding the given ref"
+msgstr "без проверка дали друго работно дърво държи указателя"
 
-#: builtin/config.c:614
-#, c-format
-msgid "cannot create configuration file %s"
-msgstr "конфигурационният файл „%s“ не може да бъде създаден"
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
+msgid "force progress reporting"
+msgstr "извеждане на напредъка"
 
-#: builtin/count-objects.c:77
-msgid "git count-objects [-v] [-H | --human-readable]"
-msgstr "git count-objects [-v] [-H | --human-readable]"
+#: builtin/checkout.c:1224
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга"
 
-#: builtin/count-objects.c:87
-msgid "print sizes in human readable format"
-msgstr "извеждане Ð½Ð° Ñ\80азмеÑ\80иÑ\82е Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ð²Ñ\8aв Ñ\84оÑ\80маÑ\82 Ð»ÐµÑ\81но Ñ\87еÑ\82им Ð¾Ñ\82 Ñ\85оÑ\80а"
+#: builtin/checkout.c:1241
+msgid "--track needs a branch name"
+msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--trackâ\80\9c Ð¸Ð·Ð¸Ñ\81ква Ð¸Ð¼Ðµ Ð½Ð° ÐºÐ»Ð¾Ð½"
 
-# FIXME ... instead of *???
-#: builtin/describe.c:17
-msgid "git describe [<options>] [<commit-ish>...]"
-msgstr "git describe [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
+#: builtin/checkout.c:1246
+msgid "Missing branch name; try -b"
+msgstr "Липсва име на клон, използвайте опцията „-b“"
 
-#: builtin/describe.c:18
-msgid "git describe [<options>] --dirty"
-msgstr "git describe [ОПЦИЯ…] --dirty"
+#: builtin/checkout.c:1282
+msgid "invalid path specification"
+msgstr "указан е неправилен път"
 
-#: builtin/describe.c:217
+#: builtin/checkout.c:1289
 #, c-format
-msgid "annotated tag %s not available"
-msgstr "не съществува анотиран етикет „%s“"
+msgid ""
+"Cannot update paths and switch to branch '%s' at the same time.\n"
+"Did you intend to checkout '%s' which can not be resolved as commit?"
+msgstr ""
+"Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
+"Дали не искате да изтеглите „%s“, който не сочи към подаване?"
 
-#: builtin/describe.c:221
+#: builtin/checkout.c:1294
 #, c-format
-msgid "annotated tag %s has no embedded name"
-msgstr "в анотирания етикет „%s“ липсва вградено име"
+msgid "git checkout: --detach does not take a path argument '%s'"
+msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
 
-#: builtin/describe.c:223
-#, c-format
-msgid "tag '%s' is really '%s' here"
-msgstr "етикетът „%s“ тук е всъщност „%s“"
+#: builtin/checkout.c:1298
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
+msgstr ""
+"git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“\n"
+"са несъвместими с изтегляне от индекса."
+
+#: builtin/clean.c:25
+msgid ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШАБЛОН] [-x | -X] [--] ПЪТ…"
 
-#: builtin/describe.c:250 builtin/log.c:465
+#: builtin/clean.c:29
 #, c-format
-msgid "Not a valid object name %s"
-msgstr "Ð\9dепÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82 â\80\9e%sâ\80\9c"
+msgid "Removing %s\n"
+msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° â\80\9e%sâ\80\9c\n"
 
-#: builtin/describe.c:253
+#: builtin/clean.c:30
 #, c-format
-msgid "%s is not a valid '%s' object"
-msgstr "„%s“ е неправилен обект „%s“"
+msgid "Would remove %s\n"
+msgstr "Файлът „%s“ ще бъде изтрит\n"
 
-#: builtin/describe.c:270
+#: builtin/clean.c:31
 #, c-format
-msgid "no tag exactly matches '%s'"
-msgstr "никой ÐµÑ\82икеÑ\82 Ð½Ðµ Ð½Ð°Ð¿Ð°Ñ\81ва Ñ\82оÑ\87но â\80\9e%sâ\80\9c"
+msgid "Skipping repository %s\n"
+msgstr "Ð\9fÑ\80еÑ\81каÑ\87ане Ð½Ð° Ñ\85Ñ\80анилиÑ\89еÑ\82о â\80\9e%sâ\80\9c\n"
 
-#: builtin/describe.c:272
+#: builtin/clean.c:32
 #, c-format
-msgid "searching to describe %s\n"
-msgstr "търсене за описание на „%s“\n"
+msgid "Would skip repository %s\n"
+msgstr "Хранилището „%s“ ще бъде прескочено\n"
 
-#: builtin/describe.c:319
+#: builtin/clean.c:33
 #, c-format
-msgid "finished search at %s\n"
-msgstr "Ñ\82Ñ\8aÑ\80Ñ\81енеÑ\82о Ð¿Ñ\80иклÑ\8eÑ\87и Ð¿Ñ\80и â\80\9e%sâ\80\9c\n"
+msgid "failed to remove %s"
+msgstr "Ñ\84айлÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82"
 
-#: builtin/describe.c:346
+#: builtin/clean.c:297 git-add--interactive.perl:614
 #, c-format
 msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
+"Prompt help:\n"
+"1          - select a numbered item\n"
+"foo        - select item based on unique prefix\n"
+"           - (empty) select nothing\n"
 msgstr ""
-"Никой анотиран етикет не описва „%s“.\n"
-"Съществуват и неанотирани етикети. Пробвайте с опцията „--tags“."
+"Подсказка:\n"
+"1          — избор на обект според реда\n"
+"ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
+"           — (празно) нищо да не се избира\n"
 
-#: builtin/describe.c:350
+#: builtin/clean.c:301 git-add--interactive.perl:623
 #, c-format
 msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
+"Prompt help:\n"
+"1          - select a single item\n"
+"3-5        - select a range of items\n"
+"2-3,6-9    - select multiple ranges\n"
+"foo        - select item based on unique prefix\n"
+"-...       - unselect specified items\n"
+"*          - choose all items\n"
+"           - (empty) finish selecting\n"
 msgstr ""
-"Никой етикет не описва „%s“.\n"
-"Пробвайте с опцията „--always“ или създайте етикети."
+"Подсказка:\n"
+"1          — избор на един обект\n"
+"3-5        — диапазон за избор на обекти\n"
+"2-3,6-9    — множество диапазони за избор на обекти\n"
+"ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
+"-…         — отмяна на избора на обекти\n"
+"*          — избиране на всички обекти\n"
+"           — (празно) завършване на избирането\n"
+
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "Неправилен избор (%s).\n"
 
-# FIXME - plural
-#: builtin/describe.c:371
+#: builtin/clean.c:659
 #, c-format
-msgid "traversed %lu commits\n"
-msgstr "пÑ\80еÑ\82Ñ\8aÑ\80Ñ\81ени Ñ\81а %lu Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f\n"
+msgid "Input ignore patterns>> "
+msgstr "Шаблони Ð·Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80ани ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82иâ\89« "
 
-#: builtin/describe.c:374
+#: builtin/clean.c:696
 #, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-msgstr ""
-"открити са над %i етикета, изведени са последните %i,\n"
-"търсенето бе прекратено при „%s“.\n"
+msgid "WARNING: Cannot find items matched by: %s"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: Никой обект не напасва на „%s“"
 
-#: builtin/describe.c:396
-msgid "find the tag that comes after the commit"
-msgstr "оÑ\82кÑ\80иване Ð½Ð° ÐµÑ\82икеÑ\82а, ÐºÐ¾Ð¹Ñ\82о Ñ\81ледва Ð¿Ð¾Ð´Ð°ване"
+#: builtin/clean.c:717
+msgid "Select items to delete"
+msgstr "Ð\98збиÑ\80ане Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и Ð·Ð° Ð¸Ð·Ñ\82Ñ\80иване"
 
-#: builtin/describe.c:397
-msgid "debug search strategy on stderr"
+#. TRANSLATORS: Make sure to keep [y/N] as is
+#: builtin/clean.c:758
+#, c-format
+msgid "Remove %s [y/N]? "
+msgstr "Да се изтрие ли „%s“? „y“ —  да, „N“ — НЕ"
+
+#
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "Изход.\n"
+
+#: builtin/clean.c:791
+msgid ""
+"clean               - start cleaning\n"
+"filter by pattern   - exclude items from deletion\n"
+"select by numbers   - select items to be deleted by numbers\n"
+"ask each            - confirm each deletion (like \"rm -i\")\n"
+"quit                - stop cleaning\n"
+"help                - this screen\n"
+"?                   - help for prompt selection"
 msgstr ""
-"извеждане на информация за трасиране на стратегията за търсене на "
-"стандартната грешка"
+"clean               — начало на изчистването\n"
+"filter by pattern   — шаблон за обекти, които да не се трият\n"
+"select by numbers   — номера на обекти, които да се трият\n"
+"ask each            — потвърждаване на всяко изтриване (подобно на „rm -i“)\n"
+"quit                — край на изчистването\n"
+"help                — този край\n"
+"?                   — подсказка за шаблоните"
 
-#: builtin/describe.c:398
-msgid "use any ref"
-msgstr "използване на произволен указател"
+#: builtin/clean.c:818 git-add--interactive.perl:1736
+msgid "*** Commands ***"
+msgstr "●●● Команди ●●●"
 
-#: builtin/describe.c:399
-msgid "use any tag, even unannotated"
-msgstr "използване Ð½Ð° Ð²Ñ\81еки ÐµÑ\82икеÑ\82 â\80\94 Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82елно Ð¸ Ð½ÐµÐ°Ð½Ð¾Ñ\82иÑ\80аниÑ\82е"
+#: builtin/clean.c:819 git-add--interactive.perl:1733
+msgid "What now"
+msgstr "Ð\98збоÑ\80 Ð½Ð° Ñ\81ледваÑ\89о Ð´ÐµÐ¹Ñ\81Ñ\82вие"
 
-#: builtin/describe.c:400
-msgid "always use long format"
-msgstr "винаги да се ползва дългият формат"
+#: builtin/clean.c:827
+msgid "Would remove the following item:"
+msgid_plural "Would remove the following items:"
+msgstr[0] "Следният обект ще бъде изтрит:"
+msgstr[1] "Следните обекти ще бъдат изтрити:"
 
-#: builtin/describe.c:401
-msgid "only follow first parent"
-msgstr "пÑ\80оÑ\81ледÑ\8fване Ñ\81амо Ð½Ð° Ð¿Ñ\8aÑ\80виÑ\8f Ñ\80одиÑ\82ел"
+#: builtin/clean.c:844
+msgid "No more files to clean, exiting."
+msgstr "ФайловеÑ\82е Ð·Ð° Ð¸Ð·Ñ\87иÑ\81Ñ\82ване Ñ\81вÑ\8aÑ\80Ñ\88иÑ\85а.  Ð\98зÑ\85од Ð¾Ñ\82 Ð¿Ñ\80огÑ\80амаÑ\82а."
 
-#: builtin/describe.c:404
-msgid "only output exact matches"
-msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\82оÑ\87ниÑ\82е Ñ\81Ñ\8aвпадениÑ\8f"
+#: builtin/clean.c:875
+msgid "do not print names of files removed"
+msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° Ñ\84айловеÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\89е Ð±Ñ\8aдаÑ\82 Ð¸Ð·Ñ\82Ñ\80иÑ\82и"
 
-#: builtin/describe.c:406
-msgid "consider <n> most recent tags (default: 10)"
-msgstr "да Ñ\81е Ñ\82Ñ\8aÑ\80Ñ\81и Ñ\81амо Ð² Ñ\82ози Ð\91РÐ\9eÐ\99 Ð¿Ð¾Ñ\81ледни ÐµÑ\82икеÑ\82и (Ñ\81Ñ\82андаÑ\80Ñ\82но: 10)"
+#: builtin/clean.c:877
+msgid "force"
+msgstr "пÑ\80инÑ\83диÑ\82елно Ð¸Ð·Ñ\82Ñ\80иване"
 
-#: builtin/describe.c:408
-msgid "only consider tags matching <pattern>"
-msgstr "да Ñ\81е Ñ\82Ñ\8aÑ\80Ñ\81и Ñ\81амо Ð¸Ð·Ð¼ÐµÐ¶Ð´Ñ\83 ÐµÑ\82икеÑ\82иÑ\82е Ð½Ð°Ð¿Ð°Ñ\81ваÑ\89и Ñ\82ози Ð¨Ð\90Ð\91Ð\9bÐ\9eÐ\9d"
+#: builtin/clean.c:878
+msgid "interactive cleaning"
+msgstr "инÑ\82еÑ\80акÑ\82ивно Ð¸Ð·Ñ\82Ñ\80иване"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
-msgid "show abbreviated commit object as fallback"
-msgstr "извеждане на съкратено име на обект като резервен вариант"
+#: builtin/clean.c:880
+msgid "remove whole directories"
+msgstr "изтриване на цели директории"
 
-#: builtin/describe.c:411
-msgid "mark"
-msgstr "МАРКЕР"
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
+msgid "pattern"
+msgstr "ШАБЛОН"
 
-#: builtin/describe.c:412
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr "добавяне на такъв МАРКЕР на работното дърво (стандартно е „-dirty“)"
+#: builtin/clean.c:882
+msgid "add <pattern> to ignore rules"
+msgstr "добавяне на ШАБЛОН от файлове, които да не се трият"
 
-#: builtin/describe.c:430
-msgid "--long is incompatible with --abbrev=0"
-msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--longâ\80\9c Ð¸ â\80\9e--abbrev=0â\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
+#: builtin/clean.c:883
+msgid "remove ignored files, too"
+msgstr "изÑ\82Ñ\80иване Ð¸ Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ñ\84айлове"
 
-#: builtin/describe.c:456
-msgid "No names found, cannot describe anything."
-msgstr "Ð\9dе Ñ\81а Ð¾Ñ\82кÑ\80иÑ\82и Ð¸Ð¼ÐµÐ½Ð° â\80\94 Ð½Ð¸Ñ\89о Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð¿Ð¸Ñ\81ано."
+#: builtin/clean.c:885
+msgid "remove only ignored files"
+msgstr "изÑ\82Ñ\80иване Ñ\81амо Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80ани Ñ\84айлове"
 
-#: builtin/describe.c:476
-msgid "--dirty is incompatible with commit-ishes"
-msgstr "опцията „--dirty“ е несъвместима с указател към подаване"
+#: builtin/clean.c:903
+msgid "-x and -X cannot be used together"
+msgstr "опциите „-x“ и „-X“ са несъвместими"
 
-#: builtin/diff.c:86
-#, c-format
-msgid "'%s': not a regular file or symlink"
-msgstr "„%s“: не е нито обикновен файл, нито символна връзка"
+#: builtin/clean.c:907
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
+msgstr ""
+"Настройката „clean.requireForce“ е зададена като истина, което изисква някоя "
+"от опциите „-i“, „-n“ или „-f“.  Няма да се извърши изчистване"
 
-#: builtin/diff.c:237
-#, c-format
-msgid "invalid option: %s"
-msgstr "неправилна опция: %s"
+#: builtin/clean.c:910
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
+msgstr ""
+"Настройката „clean.requireForce“ не е зададена, но стандартно е истина, "
+"което изисква някоя от опциите „-i“, „-n“ или „-f“.  Няма да се извърши "
+"изчистване"
 
-#: builtin/diff.c:360
-msgid "Not a git repository"
-msgstr "Не е хранилище на Git"
+#: builtin/clone.c:37
+msgid "git clone [<options>] [--] <repo> [<dir>]"
+msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
 
-#: builtin/diff.c:403
-#, c-format
-msgid "invalid object '%s' given."
-msgstr "зададен е неправилен обект „%s“."
+#: builtin/clone.c:80
+msgid "don't create a checkout"
+msgstr "без създаване на работно дърво"
 
-#: builtin/diff.c:412
-#, c-format
-msgid "more than two blobs given: '%s'"
-msgstr "зададени са повече от 2 обекта BLOB: „%s“"
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
+msgid "create a bare repository"
+msgstr "създаване на голо хранилище"
 
-#: builtin/diff.c:419
-#, c-format
-msgid "unhandled object '%s' given."
-msgstr "зададен е неподдържан обект „%s“."
+#: builtin/clone.c:85
+msgid "create a mirror repository (implies bare)"
+msgstr ""
+"създаване на хранилище-огледало (включва опцията „--bare“ за голо хранилище)"
 
-#: builtin/fast-export.c:25
-msgid "git fast-export [rev-list-opts]"
-msgstr "git fast-export [ОПЦИИ_ЗА_СПИСЪКА_С_ВЕРСИИ]"
+#: builtin/clone.c:87
+msgid "to clone from a local repository"
+msgstr "клониране от локално хранилище"
 
-#: builtin/fast-export.c:980
-msgid "show progress after <n> objects"
-msgstr "СÑ\8aобÑ\89ение Ð·Ð° Ð½Ð°Ð¿Ñ\80едÑ\8aка Ð½Ð° Ð²Ñ\81еки Ñ\82акÑ\8aв Ð\91РÐ\9eÐ\99 Ð¾Ð±ÐµÐºÑ\82а"
+#: builtin/clone.c:89
+msgid "don't use local hardlinks, always copy"
+msgstr "без Ñ\82вÑ\8aÑ\80ди Ð²Ñ\80Ñ\8aзки, Ñ\84айловеÑ\82е Ð²Ð¸Ð½Ð°Ð³Ð¸ Ð´Ð° Ñ\81е ÐºÐ¾Ð¿Ð¸Ñ\80аÑ\82"
 
-#: builtin/fast-export.c:982
-msgid "select handling of signed tags"
-msgstr "Ð\9aак Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82ваÑ\82 Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81аниÑ\82е ÐµÑ\82икеÑ\82и"
+#: builtin/clone.c:91
+msgid "setup as shared repository"
+msgstr "наÑ\81Ñ\82Ñ\80ойване Ð·Ð° Ñ\81поделено Ñ\85Ñ\80анилиÑ\89е"
 
-#: builtin/fast-export.c:985
-msgid "select handling of tags that tag filtered objects"
-msgstr "Ð\9aак Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82ваÑ\82 ÐµÑ\82икеÑ\82иÑ\82е Ð½Ð° Ñ\84илÑ\82Ñ\80иÑ\80аниÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "пÑ\8aÑ\82"
 
-#: builtin/fast-export.c:988
-msgid "Dump marks to this file"
-msgstr "Ð\97апазване Ð½Ð° Ð¼Ð°Ñ\80кеÑ\80иÑ\82е Ð² Ñ\82ози Ð¤Ð\90Ð\99Ð\9b"
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "initialize submodules in the clone"
+msgstr "иниÑ\86иализиÑ\80ане Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лиÑ\82е Ð¿Ñ\80и Ñ\82ова ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане"
 
-#: builtin/fast-export.c:990
-msgid "Import marks from this file"
-msgstr "Ð\92наÑ\81Ñ\8fне Ð½Ð° Ð¼Ð°Ñ\80кеÑ\80иÑ\82е Ð¾Ñ\82 Ñ\82ози Ð¤Ð\90Ð\99Ð\9b"
+#: builtin/clone.c:100
+msgid "number of submodules cloned in parallel"
+msgstr "бÑ\80ой Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли, ÐºÐ»Ð¾Ð½Ð¸Ñ\80ани Ð¿Ð°Ñ\80алелно"
 
-#: builtin/fast-export.c:992
-msgid "Fake a tagger when tags lack one"
-msgstr "Ð\94а Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ð¸Ð·ÐºÑ\83Ñ\81Ñ\82вено Ð¸Ð¼Ðµ Ð½Ð° Ñ\87овек Ð¿Ñ\80и Ð»Ð¸Ð¿Ñ\81а Ð½Ð° Ð·Ð°Ð´Ð°Ð²Ð°Ñ\89 ÐµÑ\82икеÑ\82а"
+#: builtin/clone.c:101 builtin/init-db.c:475
+msgid "template-directory"
+msgstr "диÑ\80екÑ\82оÑ\80иÑ\8f Ñ\81 Ñ\88аблони"
 
-#: builtin/fast-export.c:994
-msgid "Output full tree for each commit"
-msgstr "Ð\98звеждане Ð½Ð° Ñ\86Ñ\8fлоÑ\82о Ð´Ñ\8aÑ\80во Ð·Ð° Ð²Ñ\81Ñ\8fко Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: builtin/clone.c:102 builtin/init-db.c:476
+msgid "directory from which templates will be used"
+msgstr "диÑ\80екÑ\82оÑ\80иÑ\8f, ÐºÐ¾Ñ\8fÑ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жа Ñ\88аблониÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82"
 
-#: builtin/fast-export.c:996
-msgid "Use the done feature to terminate the stream"
-msgstr "Използване на маркер за завършване на потока"
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
+msgid "reference repository"
+msgstr "еталонно хранилище"
 
-#: builtin/fast-export.c:997
-msgid "Skip output of blob data"
-msgstr "Ð\91ез Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е BLOB"
+#: builtin/clone.c:108
+msgid "use --reference only while cloning"
+msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--referenceâ\80\9c Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ñ\81амо Ð¿Ñ\80и ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане"
 
-#: builtin/fast-export.c:998
-msgid "refspec"
-msgstr "УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9b\9dÐ\90\92Ð\95РСÐ\98Я"
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
+msgid "name"
+msgstr "Ð\98Ð\9cÐ\95"
 
-#: builtin/fast-export.c:999
-msgid "Apply refspec to exported refs"
-msgstr "Прилагане на УКАЗАТЕЛя_НА_ВЕРСИЯ към изнесените указатели"
-
-#: builtin/fast-export.c:1000
-msgid "anonymize output"
-msgstr "анонимизиране на извежданата информация"
-
-#: builtin/fetch.c:20
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr "git fetch [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
-
-#: builtin/fetch.c:21
-msgid "git fetch [<options>] <group>"
-msgstr "git fetch [ОПЦИЯ…] ГРУПА"
-
-#: builtin/fetch.c:22
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)…]"
-
-#: builtin/fetch.c:23
-msgid "git fetch --all [<options>]"
-msgstr "git fetch --all [ОПЦИЯ…]"
-
-#: builtin/fetch.c:92 builtin/pull.c:174
-msgid "fetch from all remotes"
-msgstr "доставяне от всички отдалечени хранилища"
+#: builtin/clone.c:110
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr "използване на това ИМЕ вместо „origin“ при проследяване на клони"
 
-#: builtin/fetch.c:94 builtin/pull.c:177
-msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr "добавÑ\8fне ÐºÑ\8aм â\80\9e.git/FETCH_HEADâ\80\9c Ð²Ð¼ÐµÑ\81Ñ\82о Ð·Ð°Ð¼Ñ\8fна"
+#: builtin/clone.c:112
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr "изÑ\82еглÑ\8fне Ð½Ð° Ñ\82ози Ð\9aÐ\9bÐ\9eÐ\9d, Ð° Ð½Ðµ Ñ\81оÑ\87ениÑ\8fÑ\82 Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87ениÑ\8f Ñ\83казаÑ\82ел â\80\9eHEADâ\80\9c"
 
-#: builtin/fetch.c:96 builtin/pull.c:180
-msgid "path to upload pack on remote end"
-msgstr "оÑ\82далеÑ\87ен Ð¿Ñ\8aÑ\82, ÐºÑ\8aдеÑ\82о Ð´Ð° Ñ\81е ÐºÐ°Ñ\87и Ð¿Ð°ÐºÐµÑ\82Ñ\8aÑ\82"
+#: builtin/clone.c:114
+msgid "path to git-upload-pack on the remote"
+msgstr "пÑ\8aÑ\82 ÐºÑ\8aм ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-upload-packâ\80\9c Ð½Ð° Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е"
 
-#: builtin/fetch.c:97 builtin/pull.c:182
-msgid "force overwrite of local branch"
-msgstr "принудително презаписване на локалния клон"
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
+msgid "depth"
+msgstr "ДЪЛБОЧИНА"
 
-#: builtin/fetch.c:99
-msgid "fetch from multiple remotes"
-msgstr "доÑ\81Ñ\82авÑ\8fне Ð¾Ñ\82 Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82во Ð¾Ñ\82далеÑ\87ени Ñ\85Ñ\80анилиÑ\89а"
+#: builtin/clone.c:116
+msgid "create a shallow clone of that depth"
+msgstr "плиÑ\82ко ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане Ð´Ð¾ Ñ\82ази Ð\94ЪÐ\9bÐ\91Ð\9eЧÐ\98Ð\9dÐ\90"
 
-#: builtin/fetch.c:101 builtin/pull.c:184
-msgid "fetch all tags and associated objects"
-msgstr "доставяне на всички етикети и принадлежащи обекти"
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "ВРЕМЕ"
 
-#: builtin/fetch.c:103
-msgid "do not fetch all tags (--no-tags)"
-msgstr "без Ð´Ð¾Ñ\81Ñ\82авÑ\8fнеÑ\82о Ð½Ð° Ð²Ñ\81иÑ\87ки ÐµÑ\82икеÑ\82и â\80\9e--no-tagsâ\80\9c"
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr "плиÑ\82ко ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане Ð´Ð¾ Ð¼Ð¾Ð¼ÐµÐ½Ñ\82 Ð²Ñ\8aв Ð²Ñ\80емеÑ\82о"
 
-#: builtin/fetch.c:105
-msgid "number of submodules fetched in parallel"
-msgstr "бÑ\80ой Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли Ð´Ð¾Ñ\81Ñ\82авени Ð¿Ð°Ñ\80алелно"
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "веÑ\80Ñ\81иÑ\8f"
 
-#: builtin/fetch.c:107 builtin/pull.c:187
-msgid "prune remote-tracking branches no longer on remote"
-msgstr "окаÑ\81Ñ\82Ñ\80Ñ\8fне Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е Ñ\81ледÑ\8fÑ\89и Ð²ÐµÑ\87е Ð½ÐµÑ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89и Ð¾Ñ\82далеÑ\87ени ÐºÐ»Ð¾Ð½Ð¸"
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr "задÑ\8aлбоÑ\87аване Ð½Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ð¿Ð»Ð¸Ñ\82ко Ñ\85Ñ\80анилиÑ\89е Ð´Ð¾ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ваÑ\89 Ñ\83казаÑ\82ел"
 
-#: builtin/fetch.c:108 builtin/pull.c:190
-msgid "on-demand"
-msgstr "ПРИ НУЖДА"
+#: builtin/clone.c:122
+msgid "clone only one branch, HEAD or --branch"
+msgstr ""
+"клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
+"зададения с „--branch“"
 
-#: builtin/fetch.c:109 builtin/pull.c:191
-msgid "control recursive fetching of submodules"
-msgstr "управление на рекурсивното доставяне на подмодулите"
+#: builtin/clone.c:124
+msgid "any cloned submodules will be shallow"
+msgstr "всички клонирани подмодули ще са плитки"
 
-#: builtin/fetch.c:113 builtin/pull.c:199
-msgid "keep downloaded pack"
-msgstr "запазване Ð½Ð° Ð¸Ð·Ñ\82еглениÑ\82е Ð¿Ð°ÐºÐµÑ\82и Ñ\81 Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/clone.c:125 builtin/init-db.c:484
+msgid "gitdir"
+msgstr "СÐ\9bУÐ\96Ð\95Ð\91Ð\9dÐ\90\94Ð\98РÐ\95Ð\9aТÐ\9eРÐ\98Я"
 
-#: builtin/fetch.c:115
-msgid "allow updating of HEAD ref"
-msgstr "позволÑ\8fване Ð½Ð° Ð¾Ð±Ð½Ð¾Ð²Ñ\8fванеÑ\82о Ð½Ð° Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c"
+#: builtin/clone.c:126 builtin/init-db.c:485
+msgid "separate git dir from working tree"
+msgstr "оÑ\82делна Ð¡Ð\9bУÐ\96Ð\95Ð\91Ð\9dÐ\90\94Ð\98РÐ\95Ð\9aТÐ\9eРÐ\98Я Ð·Ð° git Ð¸Ð·Ð²Ñ\8aн Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во"
 
-#: builtin/fetch.c:118 builtin/pull.c:202
-msgid "deepen history of shallow clone"
-msgstr "задÑ\8aлбоÑ\87аване Ð½Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ð¿Ð»Ð¸Ñ\82ко Ñ\85Ñ\80анилиÑ\89е"
+#: builtin/clone.c:127
+msgid "key=value"
+msgstr "Ð\9aÐ\9bЮЧ=СТÐ\9eÐ\99Ð\9dÐ\9eСТ"
 
-#: builtin/fetch.c:120 builtin/pull.c:205
-msgid "convert to a complete repository"
-msgstr "пÑ\80евÑ\80Ñ\8aÑ\89ане Ð² Ð¿Ñ\8aлно хранилище"
+#: builtin/clone.c:128
+msgid "set config inside the new repository"
+msgstr "задаване Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° Ð½Ð¾Ð²Ð¾Ñ\82о хранилище"
 
-#: builtin/fetch.c:122 builtin/log.c:1399
-msgid "dir"
-msgstr "директория"
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
+msgid "use IPv4 addresses only"
+msgstr "само адреси IPv4"
 
-#: builtin/fetch.c:123
-msgid "prepend this to submodule path output"
-msgstr "добавяне на това пред пътя на подмодула"
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
+msgid "use IPv6 addresses only"
+msgstr "само адреси IPv6"
 
-#: builtin/fetch.c:126
-msgid "default mode for recursion"
-msgstr "стандартен режим на рекурсия"
+#: builtin/clone.c:268
+msgid ""
+"No directory name could be guessed.\n"
+"Please specify a directory on the command line"
+msgstr ""
+"Името на директорията не може да бъде отгатнато.\n"
+"Задайте директорията изрично на командния ред"
 
-#: builtin/fetch.c:128 builtin/pull.c:208
-msgid "accept refs that update .git/shallow"
-msgstr "приемане на указатели, които обновяват „.git/shallow“"
+#: builtin/clone.c:321
+#, c-format
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: не може да се добави алтернативен източник на „%s“: %s\n"
 
-#: builtin/fetch.c:129 builtin/pull.c:210
-msgid "refmap"
-msgstr "КАРТА_С_УКАЗАТЕЛИ"
+#: builtin/clone.c:393
+#, c-format
+msgid "failed to open '%s'"
+msgstr "директорията „%s“ не може да бъде отворена"
 
-#: builtin/fetch.c:130 builtin/pull.c:211
-msgid "specify fetch refmap"
-msgstr "указване на КАРТАта_С_УКАЗАТЕЛИ за доставяне"
+#: builtin/clone.c:401
+#, c-format
+msgid "%s exists and is not a directory"
+msgstr "„%s“ съществува и не е директория"
 
-#: builtin/fetch.c:386
-msgid "Couldn't find remote ref HEAD"
-msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
+#: builtin/clone.c:415
+#, c-format
+msgid "failed to stat %s\n"
+msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
 
-#: builtin/fetch.c:466
+#: builtin/clone.c:437
 #, c-format
-msgid "object %s not found"
-msgstr "обекÑ\82Ñ\8aÑ\82 â\80\9e%sâ\80\9c Ð»Ð¸Ð¿Ñ\81ва"
+msgid "failed to create link '%s'"
+msgstr "вÑ\80Ñ\8aзкаÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздадена"
 
-#: builtin/fetch.c:471
-msgid "[up to date]"
-msgstr "[актуализиран]"
+#: builtin/clone.c:441
+#, c-format
+msgid "failed to copy file to '%s'"
+msgstr "файлът не може да бъде копиран като „%s“"
 
-#: builtin/fetch.c:485
+#: builtin/clone.c:466
 #, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s → %s  (в текущия клон не може да се доставя)"
+msgid "done.\n"
+msgstr "действието завърши.\n"
 
-#: builtin/fetch.c:486 builtin/fetch.c:574
-msgid "[rejected]"
-msgstr "[отхвърлен]"
+#: builtin/clone.c:478
+msgid ""
+"Clone succeeded, but checkout failed.\n"
+"You can inspect what was checked out with 'git status'\n"
+"and retry the checkout with 'git checkout -f HEAD'\n"
+msgstr ""
+"Клонирането бе успешно за разлика от подготовката на работното дърво\n"
+"за определен клон.  Все пак можете да проверите кои файлове и от кой\n"
+"клон в момента са изтеглени с командата „git status“.  Можете да\n"
+"завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
 
-#: builtin/fetch.c:497
-msgid "[tag update]"
-msgstr "[обновяване на етикетите]"
+#: builtin/clone.c:555
+#, c-format
+msgid "Could not find remote branch %s to clone."
+msgstr ""
+"Клонът „%s“ от отдалеченото хранилище, което клонирате,\n"
+"и който следва да бъде изтеглен, не съществува."
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (локалните указатели не могат да бъдат обновени)"
+#: builtin/clone.c:650
+msgid "remote did not send all necessary objects"
+msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
 
-#: builtin/fetch.c:517
-msgid "[new tag]"
-msgstr "[нов етикет]"
+#: builtin/clone.c:666
+#, c-format
+msgid "unable to update %s"
+msgstr "обектът „%s“ не може да бъде обновен"
 
-#: builtin/fetch.c:520
-msgid "[new branch]"
-msgstr "[нов клон]"
+#: builtin/clone.c:715
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+msgstr ""
+"указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
+"което не съществува.  Не може да се изтегли определен клон.\n"
 
-#: builtin/fetch.c:523
-msgid "[new ref]"
-msgstr "[нов указател]"
+#: builtin/clone.c:746
+msgid "unable to checkout working tree"
+msgstr "работното дърво не може да бъде подготвено"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "локален Ñ\83казаÑ\82ел Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
+#: builtin/clone.c:786
+msgid "unable to write parameters to config file"
+msgstr "наÑ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 Ð·Ð°Ð¿Ð¸Ñ\81ани Ð² ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ионниÑ\8f Ñ\84айл"
 
-#: builtin/fetch.c:569
-msgid "forced update"
-msgstr "пÑ\80инÑ\83диÑ\82елно Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване"
+#: builtin/clone.c:849
+msgid "cannot repack to clean up"
+msgstr "не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88и Ð¿Ð°ÐºÐµÑ\82иÑ\80ане Ð·Ð° Ð¸Ð·Ñ\87иÑ\81Ñ\82ване Ð½Ð° Ñ\84айловеÑ\82е"
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(сливането не е тривиално)"
+#: builtin/clone.c:851
+msgid "cannot unlink temporary alternates file"
+msgstr "временният файл за алтернативни обекти не може да бъде изтрит"
 
-#: builtin/fetch.c:619
-#, c-format
-msgid "%s did not send all necessary objects\n"
-msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
+msgid "Too many arguments."
+msgstr "Прекалено много аргументи."
 
-#: builtin/fetch.c:637
-#, c-format
-msgid "reject %s because shallow roots are not allowed to be updated"
-msgstr ""
-"отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
-"обновявани"
+#: builtin/clone.c:888
+msgid "You must specify a repository to clone."
+msgstr "Трябва да укажете кое хранилище искате да клонирате."
 
-#: builtin/fetch.c:724 builtin/fetch.c:816
+#: builtin/clone.c:901
 #, c-format
-msgid "From %.*s\n"
-msgstr "Ð\9eÑ\82 %.*s\n"
+msgid "--bare and --origin %s options are incompatible."
+msgstr "опÑ\86ииÑ\82е â\80\9e--bareâ\80\9c Ð¸ â\80\9e--origin %sâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими."
 
-# FIXME - is the space necessary
-#: builtin/fetch.c:735
-#, c-format
-msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
-msgstr ""
-"някои локални указатели не могат да бъдат обновени. Изпълнете командата\n"
-"„git remote prune %s“, за да премахнете остарелите клони, които\n"
-"предизвикват конфликта"
+#: builtin/clone.c:904
+msgid "--bare and --separate-git-dir are incompatible."
+msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
 
-#: builtin/fetch.c:787
+#: builtin/clone.c:917
 #, c-format
-msgid "   (%s will become dangling)"
-msgstr "   (обектът „%s“ ще се окаже извън клон)"
+msgid "repository '%s' does not exist"
+msgstr "не съществува хранилище „%s“"
 
-#: builtin/fetch.c:788
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
-msgid "   (%s has become dangling)"
-msgstr "   (обектът „%s“ вече е извън клон)"
-
-#: builtin/fetch.c:820
-msgid "[deleted]"
-msgstr "[изтрит]"
-
-#: builtin/fetch.c:821 builtin/remote.c:1025
-msgid "(none)"
-msgstr "(нищо)"
+msgid "depth %s is not a positive number"
+msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
 
-#: builtin/fetch.c:841
+#: builtin/clone.c:933
 #, c-format
-msgid "Refusing to fetch into current branch %s of non-bare repository"
-msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо"
+msgid "destination path '%s' already exists and is not an empty directory."
+msgstr "целевият път „%s“ съществува и не е празна директория."
 
-#: builtin/fetch.c:860
+#: builtin/clone.c:943
 #, c-format
-msgid "Option \"%s\" value \"%s\" is not valid for %s"
-msgstr "СÑ\82ойноÑ\81Ñ\82Ñ\82а â\80\9e%2$sâ\80\9c Ð·Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e%1$sâ\80\9c Ð½Ðµ Ðµ Ñ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 â\80\9e%3$sâ\80\9c"
+msgid "working tree '%s' already exists."
+msgstr "в â\80\9e%sâ\80\9c Ð²ÐµÑ\87е Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва Ñ\80абоÑ\82но Ð´Ñ\8aÑ\80во."
 
-#: builtin/fetch.c:863
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
 #, c-format
-msgid "Option \"%s\" is ignored for %s\n"
-msgstr "Опцията „%s“ се игнорира при „%s“\n"
+msgid "could not create leading directories of '%s'"
+msgstr "родителските директории на „%s“ не могат да бъдат създадени"
 
-#: builtin/fetch.c:920
+#: builtin/clone.c:961
 #, c-format
-msgid "Don't know how to fetch from %s"
-msgstr "Не се поддържа доставяне от „%s“"
+msgid "could not create work tree dir '%s'"
+msgstr "работното дърво в „%s“ не може да бъде създадено."
 
-#: builtin/fetch.c:1080
+#: builtin/clone.c:973
 #, c-format
-msgid "Fetching %s\n"
-msgstr "Ð\94оÑ\81Ñ\82авÑ\8fне Ð½Ð° â\80\9e%sâ\80\9c\n"
+msgid "Cloning into bare repository '%s'...\n"
+msgstr "Ð\9aлониÑ\80ане Ð¸ Ñ\81Ñ\8aздаване Ð½Ð° Ð³Ð¾Ð»Ð¾ Ñ\85Ñ\80анилиÑ\89е Ð² â\80\9e%sâ\80\9câ\80¦\n"
 
-#: builtin/fetch.c:1082 builtin/remote.c:96
+#: builtin/clone.c:975
 #, c-format
-msgid "Could not fetch %s"
-msgstr "„%s“ не може да се достави"
+msgid "Cloning into '%s'...\n"
+msgstr "Клониране и създаване на хранилище в „%s“…\n"
 
-#: builtin/fetch.c:1100
+#: builtin/clone.c:999
 msgid ""
-"No remote repository specified.  Please, specify either a URL or a\n"
-"remote name from which new revisions should be fetched."
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
 msgstr ""
-"Ð\9dе Ñ\81Ñ\82е Ñ\83казали Ð¾Ñ\82далеÑ\87ено Ñ\85Ñ\80анилиÑ\89е. Ð\97адайÑ\82е Ð¸Ð»Ð¸ Ð°Ð´Ñ\80еÑ\81, Ð¸Ð»Ð¸ Ð¸Ð¼Ðµ\n"
-"на отдалечено хранилище, откъдето да се доставят новите версии."
+"Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e--recursiveâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð¾Ð¿Ñ\86ииÑ\82е â\80\9e--referenceâ\80\9c Ð¸ â\80\9e--reference-"
+"if-able“"
 
-#: builtin/fetch.c:1123
-msgid "You need to specify a tag name."
-msgstr "Трябва да укажете име на етикет."
+#: builtin/clone.c:1055
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr ""
+"При локално клониране опцията „--depth“ се прескача.  Ползвайте схемата "
+"„file://“."
 
-#: builtin/fetch.c:1165
-msgid "--depth and --unshallow cannot be used together"
-msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"При локално клониране опцията „--shallow-since“ се прескача.  Ползвайте "
+"схемата „file://“."
 
-#: builtin/fetch.c:1167
-msgid "--unshallow on a complete repository does not make sense"
-msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"При локално клониране опцията „--shallow-exclude“ се прескача.  Ползвайте "
+"схемата „file://“."
 
-#: builtin/fetch.c:1187
-msgid "fetch --all does not take a repository argument"
-msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
+#: builtin/clone.c:1062
+msgid "source repository is shallow, ignoring --local"
+msgstr "клонираното хранилище е плитко, затова опцията „--local“ се прескача"
 
-#: builtin/fetch.c:1189
-msgid "fetch --all does not make sense with refspecs"
-msgstr ""
-"към „git fetch --all“ не можете да добавите аргумент — указател на версия"
+#: builtin/clone.c:1067
+msgid "--local is ignored"
+msgstr "опцията „--local“ се прескача"
 
-#: builtin/fetch.c:1200
+#: builtin/clone.c:1071
 #, c-format
-msgid "No such remote or remote group: %s"
-msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
+msgid "Don't know how to clone %s"
+msgstr "Не се поддържа клониране на връзки от вида „%s“ "
 
-#: builtin/fetch.c:1208
-msgid "Fetching a group and specifying refspecs does not make sense"
-msgstr "Указването на група и указването на версия са несъвместими"
+#: builtin/clone.c:1126 builtin/clone.c:1134
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
+msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
 
-#: builtin/fmt-merge-msg.c:14
-msgid ""
-"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
-msgstr ""
-"git fmt-merge-msg [-m СЪОБЩЕНИЕ] [--log[=БРОЙ] | --no-log] [--file ФАЙЛ]"
+#: builtin/clone.c:1137
+msgid "You appear to have cloned an empty repository."
+msgstr "Изглежда клонирахте празно хранилище."
 
-#: builtin/fmt-merge-msg.c:667
-msgid "populate log with at most <n> entries from shortlog"
-msgstr ""
-"вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения "
-"журнал"
+#: builtin/column.c:9
+msgid "git column [<options>]"
+msgstr "git column [ОПЦИЯ…]"
 
-#: builtin/fmt-merge-msg.c:670
-msgid "alias for --log (deprecated)"
-msgstr "синоним на „--log“ (остаряло)"
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr "извеждане на настройките"
 
-#: builtin/fmt-merge-msg.c:673
-msgid "text"
-msgstr "ТÐ\95Ð\9aСТ"
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr "как Ð´Ð° Ñ\81е Ð¿Ð¾Ð´Ñ\80еди Ñ\80езÑ\83лÑ\82аÑ\82а"
 
-#: builtin/fmt-merge-msg.c:674
-msgid "use <text> as start of message"
-msgstr "за Ð½Ð°Ñ\87ало Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð° Ð¢Ð\95Ð\9aСТ"
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr "Ð\9cакÑ\81имална Ñ\88иÑ\80оÑ\87ина"
 
-#: builtin/fmt-merge-msg.c:675
-msgid "file to read from"
-msgstr "файл, от който да се чете"
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr "Поле в знаци отляво"
 
-#: builtin/for-each-ref.c:9
-msgid "git for-each-ref [<options>] [<pattern>]"
-msgstr "git for-each-ref [ОПЦИЯ…] [ШАБЛОН]"
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr "Поле в знаци отдясно"
 
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [--points-at <object>]"
-msgstr "git for-each-ref [--points ОБЕКТ]"
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr "Поле в знаци между колоните"
 
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref[(--merged | --no-merged) [ОБЕКТ]]"
+#: builtin/column.c:51
+msgid "--command must be the first argument"
+msgstr "опцията „--command“ трябва да е първият аргумент"
 
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains ОБЕКТ]"
+#: builtin/commit.c:38
+msgid "git commit [<options>] [--] <pathspec>..."
+msgstr "git commit [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/for-each-ref.c:27
-msgid "quote placeholders suitably for shells"
-msgstr "цитиране подходящо за командни интерпретатори на обвивката"
+#: builtin/commit.c:43
+msgid "git status [<options>] [--] <pathspec>..."
+msgstr "git status [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/for-each-ref.c:29
-msgid "quote placeholders suitably for perl"
-msgstr "цитиране подходящо за perl"
+#: builtin/commit.c:48
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
+"потребителя и името на машината. Проверете дали са верни.  Можете да спрете\n"
+"това съобщение като изрично зададете стойностите.  Изпълнете следната "
+"команда\n"
+"и следвайте инструкциите в текстовия ви редактор, за да редактирате\n"
+"конфигурационния файл:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"След като направите това, можете да коригирате информацията за автора на\n"
+"текущото подаване чрез:\n"
+"\n"
+"    git commit --amend --reset-author\n"
 
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for python"
-msgstr "цитиране подходящо за python"
+#: builtin/commit.c:61
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly:\n"
+"\n"
+"    git config --global user.name \"Your Name\"\n"
+"    git config --global user.email you@example.com\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
+"потребителя и името на машината. Проверете дали са верни.  Можете да спрете\n"
+"това съобщение като изрично зададете стойностите:\n"
+"\n"
+"    git config --global user.name \"Вашето Име\"\n"
+"    git config --global user.email пенчо@example.com\n"
+"\n"
+"След като направите това, можете да коригирате информацията за автора на\n"
+"текущото подаване чрез:\n"
+"\n"
+"    git commit --amend --reset-author\n"
 
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for Tcl"
-msgstr "цитиране подходящо за tcl"
+#: builtin/commit.c:73
+msgid ""
+"You asked to amend the most recent commit, but doing so would make\n"
+"it empty. You can repeat your command with --allow-empty, or you can\n"
+"remove the commit entirely with \"git reset HEAD^\".\n"
+msgstr ""
+"Поискахте да поправите последното си подаване.  Това действие ще превърне\n"
+"подаването в празно.  Можете или да го повторите като разрешите такива "
+"подавания\n"
+"с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
+"„git reset HEAD^“.\n"
 
-#: builtin/for-each-ref.c:36
-msgid "show only <n> matched refs"
-msgstr "извеждане само на този БРОЙ напаснати указатели"
+#: builtin/commit.c:78
+msgid ""
+"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
+"If you wish to commit it anyway, use:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
+msgstr ""
+"Предишното отбрано подаване вече е празно, като най-вероятната причина е\n"
+"корекция на конфликт.  Ако все пак искате да го ползвате, използвайте "
+"командата:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "ФÐ\9eРÐ\9cÐ\90Т Ð·Ð° Ð¸Ð·Ñ\85ода"
+#: builtin/commit.c:85
+msgid "Otherwise, please use 'git reset'\n"
+msgstr "Ð\92 Ð¿Ñ\80оÑ\82ивен Ñ\81лÑ\83Ñ\87ай Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit resetâ\80\9c\n"
 
-#: builtin/for-each-ref.c:41
-msgid "print only refs which points at the given object"
-msgstr "извеждане само на указателите, сочещи към ОБЕКТА"
+#: builtin/commit.c:88
+msgid ""
+"If you wish to skip this commit, use:\n"
+"\n"
+"    git reset\n"
+"\n"
+"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
+"the remaining commits.\n"
+msgstr ""
+"Ако искате да прескочите това подаване, използвайте командата:\n"
+"\n"
+"    git reset\n"
+"\n"
+"Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
+"останалите подавания.\n"
 
-#: builtin/for-each-ref.c:43
-msgid "print only refs that are merged"
-msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\81леÑ\82иÑ\82е Ñ\83казаÑ\82ели"
+#: builtin/commit.c:318
+msgid "failed to unpack HEAD tree object"
+msgstr "вÑ\8aÑ\80Ñ\85овоÑ\82о Ð´Ñ\8aÑ\80во (HEAD tree object) Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ð²Ð°Ð´ÐµÐ½Ð¾ Ð¾Ñ\82 Ð¿Ð°ÐºÐµÑ\82"
 
-#: builtin/for-each-ref.c:44
-msgid "print only refs that are not merged"
-msgstr "извеждане Ñ\81амо Ð½Ð° Ð½ÐµÑ\81леÑ\82иÑ\82е Ñ\83казаÑ\82ели"
+#: builtin/commit.c:359
+msgid "unable to create temporary index"
+msgstr "вÑ\80еменниÑ\8fÑ\82 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздаден"
 
-#: builtin/for-each-ref.c:45
-msgid "print only refs which contain the commit"
-msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\83казаÑ\82елиÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ñ\82ова Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
+#: builtin/commit.c:365
+msgid "interactive add failed"
+msgstr "неÑ\83Ñ\81пеÑ\88но Ð¸Ð½Ñ\82еÑ\80акÑ\82ивно Ð´Ð¾Ð±Ð°Ð²Ñ\8fне"
 
-#: builtin/fsck.c:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð²Ñ\80Ñ\8aзкаÑ\82а"
+#: builtin/commit.c:378
+msgid "unable to update temporary index"
+msgstr "вÑ\80еменниÑ\8fÑ\82 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
 
-#: builtin/fsck.c:486
-msgid "Checking object directories"
-msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80ииÑ\82е Ñ\81 Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/commit.c:380
+msgid "Failed to update main cache tree"
+msgstr "Ð\94Ñ\8aÑ\80воÑ\82о Ð½Ð° Ð¾Ñ\81новниÑ\8f ÐºÐµÑ\88 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½Ð¾"
 
-#: builtin/fsck.c:552
-msgid "git fsck [<options>] [<object>...]"
-msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
+msgid "unable to write new_index file"
+msgstr "новият индекс не може да бъде записан"
 
-#: builtin/fsck.c:558
-msgid "show unreachable objects"
-msgstr "показване на недостижимите обекти"
+#: builtin/commit.c:458
+msgid "cannot do a partial commit during a merge."
+msgstr "по време на сливане не може да се извърши частично подаване."
 
-#: builtin/fsck.c:559
-msgid "show dangling objects"
-msgstr "показване на обектите извън клоните"
+#: builtin/commit.c:460
+msgid "cannot do a partial commit during a cherry-pick."
+msgstr "по време на отбиране не може да се извърши частично подаване."
 
-#: builtin/fsck.c:560
-msgid "report tags"
-msgstr "показване Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е"
+#: builtin/commit.c:469
+msgid "cannot read the index"
+msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен"
 
-#: builtin/fsck.c:561
-msgid "report root nodes"
-msgstr "показване Ð½Ð° ÐºÐ¾Ñ\80еновиÑ\82е Ð²Ñ\8aзли"
+#: builtin/commit.c:488
+msgid "unable to write temporary index file"
+msgstr "вÑ\80еменниÑ\8fÑ\82 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð¸Ñ\81ан"
 
-#: builtin/fsck.c:562
-msgid "make index objects head nodes"
-msgstr "задаване на обекти от индекса да са коренови"
+#: builtin/commit.c:582
+#, c-format
+msgid "commit '%s' lacks author header"
+msgstr "заглавната част за автор в подаването „%s“ липсва"
 
-# FIXME bad message
-#: builtin/fsck.c:563
-msgid "make reflogs head nodes (default)"
-msgstr "пÑ\80оÑ\81ледÑ\8fване Ð½Ð° Ñ\83казаÑ\82елиÑ\82е Ð¾Ñ\82 Ð¶Ñ\83Ñ\80нала ÐºÐ°Ñ\82о Ð³Ð»Ð°Ð²Ð¸ (Ñ\81Ñ\82андаÑ\80Ñ\82но)"
+#: builtin/commit.c:584
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr "заглавнаÑ\82а Ñ\87аÑ\81Ñ\82 Ð·Ð° Ð°Ð²Ñ\82оÑ\80 Ð² Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о â\80\9e%sâ\80\9c Ðµ Ð½ÐµÐ¿Ñ\80авилна"
 
-#: builtin/fsck.c:564
-msgid "also consider packs and alternate objects"
-msgstr "допÑ\8aлниÑ\82елно Ð´Ð° Ñ\81е Ð¿Ñ\80овеÑ\80Ñ\8fваÑ\82 Ð¿Ð°ÐºÐµÑ\82иÑ\82е Ð¸ Ð°Ð»Ñ\82еÑ\80наÑ\82ивниÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/commit.c:603
+msgid "malformed --author parameter"
+msgstr "непÑ\80авилен Ð¿Ð°Ñ\80амеÑ\82Ñ\8aÑ\80 ÐºÑ\8aм Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--authorâ\80\9c"
 
-#: builtin/fsck.c:565
-msgid "check only connectivity"
-msgstr "проверка само на връзката"
+#: builtin/commit.c:655
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"не може да се избере знак за коментар — в текущото съобщение за подаване са "
+"използвани всички подобни знаци"
 
-#: builtin/fsck.c:566
-msgid "enable more strict checking"
-msgstr "по-строги проверки"
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
+#, c-format
+msgid "could not lookup commit %s"
+msgstr "следното подаване не може да бъде открито: %s"
 
-#: builtin/fsck.c:568
-msgid "write dangling objects in .git/lost-found"
-msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
+#: builtin/commit.c:704 builtin/shortlog.c:294
+#, c-format
+msgid "(reading log message from standard input)\n"
+msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
 
-#: builtin/fsck.c:569 builtin/prune.c:107
-msgid "show progress"
-msgstr "показване на напредъка"
+#: builtin/commit.c:706
+msgid "could not read log from standard input"
+msgstr "съобщението за подаване не бе прочетено стандартния вход"
 
-#: builtin/fsck.c:630
-msgid "Checking objects"
-msgstr "Проверка на обектите"
+#: builtin/commit.c:710
+#, c-format
+msgid "could not read log file '%s'"
+msgstr "файлът със съобщението за подаване „%s“ не може да бъде прочетен"
 
-# FIXME plural with ...
-#: builtin/gc.c:25
-msgid "git gc [<options>]"
-msgstr "git gc [ОПЦИЯ…]"
+#: builtin/commit.c:737 builtin/commit.c:745
+msgid "could not read SQUASH_MSG"
+msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено"
 
-#: builtin/gc.c:72
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr "Неправилен %s: „%s“"
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
 
-#: builtin/gc.c:139
-#, c-format
-msgid "insanely long object directory %.*s"
-msgstr "прекалено дълга директория с обекти „%.*s“"
+#: builtin/commit.c:796
+msgid "could not write commit template"
+msgstr "шаблонът за подаване не може да бъде запазен"
 
-#: builtin/gc.c:290
+#: builtin/commit.c:814
 #, c-format
 msgid ""
-"The last gc run reported the following. Please correct the root cause\n"
-"and remove %s.\n"
-"Automatic cleanup will not be performed until the file is removed.\n"
 "\n"
-"%s"
+"It looks like you may be committing a merge.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
 msgstr ""
-"При последното изпълнение на „git gc“ бе докладвана грешка. Коригирайте "
-"причината за\n"
-"нея и изтрийте „%s“.\n"
-"Автоматичното изчистване на боклука няма да работи, преди да изтриете "
-"файла.\n"
 "\n"
-"%s"
-
-#: builtin/gc.c:327
-msgid "prune unreferenced objects"
-msgstr "окастряне на обектите, към които нищо не сочи"
-
-#: builtin/gc.c:329
-msgid "be more thorough (increased runtime)"
-msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
-
-#: builtin/gc.c:330
-msgid "enable auto-gc mode"
-msgstr "включване на автоматичното събиране на боклука (auto-gc)"
-
-#: builtin/gc.c:331
-msgid "force running gc even if there may be another gc running"
-msgstr ""
-"изрично стартиране на събирането на боклука, дори и ако вече работи друго "
-"събиране"
-
-#: builtin/gc.c:373
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
-msgstr ""
-"Автоматично пакетиране на заден фон на хранилището за по-добра "
-"производителност.\n"
-
-#: builtin/gc.c:375
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
-msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n"
+"Изглежда, че подавате сливане.  Ако това не е така, изтрийте файла:\n"
+"\n"
+"  %s\n"
+"и опитайте отново.\n"
 
-#: builtin/gc.c:376
+#: builtin/commit.c:819
 #, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
+msgid ""
+"\n"
+"It looks like you may be committing a cherry-pick.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
 msgstr ""
-"Погледнете ръководството за повече информация как да изпълните „git help "
-"gc“.\n"
+"\n"
+"Изглежда, че извършвате отбрано подаване.  Ако това не е така, изтрийте "
+"файла:\n"
+"\n"
+"  %s\n"
+"и опитайте отново.\n"
 
-#: builtin/gc.c:397
+#: builtin/commit.c:832
 #, c-format
 msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be ignored, and an empty message aborts the commit.\n"
 msgstr ""
-"събирането на боклука вече е стартирано на машината „%s“ с идентификатор на\n"
-"процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
-"опцията „--force“)"
+"Въведете съобщението за подаване на промените.  Редовете, които започват\n"
+"с „%c“, ще бъдат пропуснати, а празно съобщение преустановява подаването.\n"
 
-#: builtin/gc.c:441
+#: builtin/commit.c:839
+#, c-format
 msgid ""
-"There are too many unreachable loose objects; run 'git prune' to remove them."
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be kept; you may remove them yourself if you want to.\n"
+"An empty message aborts the commit.\n"
 msgstr ""
-"Има прекалено много недостижими, непакетирани обекти.\n"
-"Използвайте „git prune“, за да ги окастрите."
-
-# FIXME plural ... options
-#: builtin/grep.c:23
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr "git grep [ОПЦИЯ…] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
+"Въведете съобщението за подаване на промените.  Редовете, които започват\n"
+"с „%c“, също ще бъдат включени — може да ги изтриете вие.  Празно \n"
+"съобщение преустановява подаването.\n"
 
-#: builtin/grep.c:219
+#: builtin/commit.c:859
 #, c-format
-msgid "grep: failed to create thread: %s"
-msgstr "grep: неуспешно създаване на нишка: %s"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sАвтор:   %.*s <%.*s>"
 
-#: builtin/grep.c:277
+#: builtin/commit.c:867
 #, c-format
-msgid "invalid number of threads specified (%d) for %s"
-msgstr "зададен е неправилен брой нишки (%d) за %s"
+msgid "%sDate:      %s"
+msgstr "%sДата:    %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/commit.c:874
 #, c-format
-msgid "unable to read tree (%s)"
-msgstr "дървото не може да бъде прочетено (%s)"
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sПодаващ: %.*s <%.*s>"
+
+#: builtin/commit.c:892
+msgid "Cannot read index"
+msgstr "Индексът не може да бъде прочетен"
+
+#: builtin/commit.c:954
+msgid "Error building trees"
+msgstr "Грешка при изграждане на дърветата"
 
-#: builtin/grep.c:502
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
-msgid "unable to grep from object of type %s"
-msgstr "не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ñ\8aлни â\80\9egrepâ\80\9c Ð¾Ñ\82 Ð¾Ð±ÐµÐºÑ\82 Ð¾Ñ\82 Ð²Ð¸Ð´Ð° %s"
+msgid "Please supply the message using either -m or -F option.\n"
+msgstr "Ð\9fодайÑ\82е Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ñ\81 Ð½Ñ\8fкоÑ\8f Ð¾Ñ\82 Ð¾Ð¿Ñ\86ииÑ\82е â\80\9e-mâ\80\9c Ð¸Ð»Ð¸ â\80\9e-Fâ\80\9c.\n"
 
-#: builtin/grep.c:560
+#: builtin/commit.c:1071
 #, c-format
-msgid "switch `%c' expects a numerical value"
-msgstr "опцията „%c“ очаква число за аргумент"
+msgid "--author '%s' is not 'Name <email>' and matches no existing author"
+msgstr ""
+"Опцията „--author '%s'“ не отговаря на форма̀та „Име <е-поща>“ и не съвпада с "
+"никой автор"
 
-#: builtin/grep.c:577
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
-msgid "cannot open '%s'"
-msgstr "„%s“ не може да бъде отворен"
+msgid "Invalid untracked files mode '%s'"
+msgstr "Неправилна стойност за неследените файлове: „%s“"
 
-#: builtin/grep.c:646
-msgid "search in index instead of in the work tree"
-msgstr "търсене в индекса, а не в работното дърво"
+#: builtin/commit.c:1124
+msgid "--long and -z are incompatible"
+msgstr "Опциите „--long“ и „-z“ са несъвместими."
 
-#: builtin/grep.c:648
-msgid "find in contents not managed by git"
-msgstr "търсене и във файловете, които не са под управлението на git"
+#: builtin/commit.c:1154
+msgid "Using both --reset-author and --author does not make sense"
+msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
 
-#: builtin/grep.c:650
-msgid "search in both tracked and untracked files"
-msgstr "търсене и в следените, и в неследените файлове"
+#: builtin/commit.c:1163
+msgid "You have nothing to amend."
+msgstr "Няма какво да бъде поправено."
 
-#: builtin/grep.c:652
-msgid "ignore files specified via '.gitignore'"
-msgstr "игноÑ\80иÑ\80ане Ð½Ð° Ñ\84айловеÑ\82е Ñ\83казани Ð² â\80\9e.gitignoreâ\80\9c"
+#: builtin/commit.c:1166
+msgid "You are in the middle of a merge -- cannot amend."
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ñ\81ливане, Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð¿Ñ\80авÑ\8fÑ\82е."
 
-#: builtin/grep.c:655
-msgid "show non-matching lines"
-msgstr "извеждане Ð½Ð° Ñ\80едовеÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81Ñ\8aвпадаÑ\82"
+#: builtin/commit.c:1168
+msgid "You are in the middle of a cherry-pick -- cannot amend."
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ð¾Ñ\82биÑ\80ане Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ, Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð¿Ñ\80авÑ\8fÑ\82е."
 
-#: builtin/grep.c:657
-msgid "case insensitive matching"
-msgstr "без Ð·Ð½Ð°Ñ\87ение Ð½Ð° Ñ\80егиÑ\81Ñ\82Ñ\8aÑ\80а Ð½Ð° Ð±Ñ\83квиÑ\82е (главни/малки)"
+#: builtin/commit.c:1171
+msgid "Options --squash and --fixup cannot be used together"
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--squashâ\80\9c Ð¸ â\80\9e--fixupâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими."
 
-#: builtin/grep.c:659
-msgid "match patterns only at word boundaries"
-msgstr "напаÑ\81ване Ð½Ð° Ñ\88аблониÑ\82е Ñ\81амо Ð¿Ð¾ Ð³Ñ\80аниÑ\86иÑ\82е Ð½Ð° Ð´Ñ\83миÑ\82е"
+#: builtin/commit.c:1181
+msgid "Only one of -c/-C/-F/--fixup can be used."
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e-câ\80\9c, â\80\9e-Câ\80\9c, â\80\9e-Fâ\80\9c Ð¸ â\80\9e--fixupâ\80\9câ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими."
 
-#: builtin/grep.c:661
-msgid "process binary files as text"
-msgstr "обÑ\80абоÑ\82ване Ð½Ð° Ð´Ð²Ð¾Ð¸Ñ\87ниÑ\82е Ñ\84айлове ÐºÐ°Ñ\82о Ñ\82екÑ\81Ñ\82ови"
+#: builtin/commit.c:1183
+msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
+msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e-mâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 â\80\9e-câ\80\9c, â\80\9e-Câ\80\9c, â\80\9e-Fâ\80\9c Ð¸ â\80\9e--fixupâ\80\9c."
 
-#: builtin/grep.c:663
-msgid "don't match patterns in binary files"
-msgstr "прескачане на двоичните файлове"
+#: builtin/commit.c:1191
+msgid "--reset-author can be used only with -C, -c or --amend."
+msgstr ""
+"Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
+"„--amend“."
 
-#: builtin/grep.c:666
-msgid "process binary files with textconv filters"
+#: builtin/commit.c:1208
+msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
-"обработване на двоичните файлове чрез филтри за преобразуване към текст"
+"Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
+"несъвместими."
 
-#: builtin/grep.c:668
-msgid "descend at most <depth> levels"
-msgstr "навлизане Ð¼Ð°ÐºÑ\81имално Ð½Ð° Ñ\82ази Ð\94ЪÐ\9bÐ\91Ð\9eЧÐ\98Ð\9dÐ\90 Ð² Ð´Ñ\8aÑ\80воÑ\82о"
+#: builtin/commit.c:1210
+msgid "No paths with --include/--only does not make sense."
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--includeâ\80\9c Ð¸ â\80\9e--onlyâ\80\9c Ð¸Ð·Ð¸Ñ\81кваÑ\82 Ð°Ñ\80гÑ\83менÑ\82и."
 
-#: builtin/grep.c:672
-msgid "use extended POSIX regular expressions"
-msgstr "разширени регулярни изрази по POSIX"
+#: builtin/commit.c:1212
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+msgstr ""
+"Зададени са изрични пътища без опциите „-i“ или „-o“.  Приема се, че все "
+"едно сте\n"
+"ползвали опцията „--only“ с ПЪТища…"
 
-#: builtin/grep.c:675
-msgid "use basic POSIX regular expressions (default)"
-msgstr "основни регулярни изрази по POSIX (стандартно)"
+#: builtin/commit.c:1224 builtin/tag.c:551
+#, c-format
+msgid "Invalid cleanup mode %s"
+msgstr "Несъществуващ режим на изчистване „%s“"
 
-#: builtin/grep.c:678
-msgid "interpret patterns as fixed strings"
-msgstr "шаблоните са дословни низове"
+#: builtin/commit.c:1229
+msgid "Paths with -a does not make sense."
+msgstr "Опцията „-a“ е несъвместима със задаването на пътища."
 
-#: builtin/grep.c:681
-msgid "use Perl-compatible regular expressions"
-msgstr "регулярни изрази на Perl"
+#: builtin/commit.c:1339 builtin/commit.c:1612
+msgid "show status concisely"
+msgstr "кратка информация за състоянието"
 
-#: builtin/grep.c:684
-msgid "show line numbers"
-msgstr "извеждане Ð½Ð° Ð½Ð¾Ð¼ÐµÑ\80аÑ\82а Ð½Ð° Ñ\80едовете"
+#: builtin/commit.c:1341 builtin/commit.c:1614
+msgid "show branch information"
+msgstr "инÑ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° ÐºÐ»Ð¾Ð½Ð¸те"
 
-#: builtin/grep.c:685
-msgid "don't show filenames"
-msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° Ñ\84айловеÑ\82е"
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "веÑ\80Ñ\81иÑ\8f"
 
-#: builtin/grep.c:686
-msgid "show filenames"
-msgstr "извеждане на имената на файловете"
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
+msgid "machine-readable output"
+msgstr "формат на изхода за четене от програма"
 
-#: builtin/grep.c:688
-msgid "show filenames relative to top directory"
-msgstr ""
-"извеждане на относителните имена на файловете спрямо основната директория на "
-"хранилището"
+#: builtin/commit.c:1346 builtin/commit.c:1618
+msgid "show status in long format (default)"
+msgstr "подробна информация за състоянието (стандартно)"
 
-#: builtin/grep.c:690
-msgid "show only filenames instead of matching lines"
-msgstr "извеждане само на имената на файловете без напасващите редове"
+#: builtin/commit.c:1349 builtin/commit.c:1621
+msgid "terminate entries with NUL"
+msgstr "разделяне на елементите с нулевия знак „NUL“"
 
-#: builtin/grep.c:692
-msgid "synonym for --files-with-matches"
-msgstr "синоним на „--files-with-matches“"
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
+msgid "mode"
+msgstr "РЕЖИМ"
 
-#: builtin/grep.c:695
-msgid "show only the names of files without match"
+#: builtin/commit.c:1352 builtin/commit.c:1624
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
-"извеждане само на имената на файловете, които не съдържат ред, напасващ на "
-"шаблона"
-
-#: builtin/grep.c:697
-msgid "print NUL after filenames"
-msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
-
-#: builtin/grep.c:699
-msgid "show the number of matches instead of matching lines"
-msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
+"извеждане на неследените файлове.  Възможните РЕЖИМи са „all“ (подробна "
+"информация), „normal“ (кратка информация), „no“ (без неследените файлове).  "
+"Стандартният РЕЖИМ е: „all“."
 
-#: builtin/grep.c:700
-msgid "highlight matches"
-msgstr "оÑ\86веÑ\82Ñ\8fване Ð½Ð° Ð½Ð°Ð¿Ð°Ñ\81ваниÑ\8fÑ\82а"
+#: builtin/commit.c:1355
+msgid "show ignored files"
+msgstr "извеждане Ð½Ð° Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ñ\84айлове"
 
-#: builtin/grep.c:702
-msgid "print empty line between matches from different files"
-msgstr "извеждане Ð½Ð° Ð¿Ñ\80азен Ñ\80ед Ð¼ÐµÐ¶Ð´Ñ\83 Ð½Ð°Ð¿Ð°Ñ\81ваниÑ\8fÑ\82а Ð¾Ñ\82 Ñ\80азлиÑ\87ни Ñ\84айлове"
+#: builtin/commit.c:1356 parse-options.h:155
+msgid "when"
+msgstr "Ð\9aÐ\9eÐ\93Ð\90"
 
-#: builtin/grep.c:704
-msgid "show filename only once above matches from same file"
+#: builtin/commit.c:1357
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
 msgstr ""
-"извеждане на името на файла само веднъж за всички напасвания от този файл"
+"игнориране на промените в подмодулите.  Опция с незадължителна стойност — "
+"една от „all“ (всички), „dirty“ (тези с неподадени промени), "
+"„untracked“ (неследени)"
 
-#: builtin/grep.c:707
-msgid "show <n> context lines before and after matches"
-msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
+#: builtin/commit.c:1359
+msgid "list untracked files in columns"
+msgstr "извеждане на неследените файлове в колони"
 
-#: builtin/grep.c:710
-msgid "show <n> context lines before matches"
-msgstr "извеждане на такъв БРОЙ редове преди напасванията"
+#: builtin/commit.c:1435
+msgid "couldn't look up newly created commit"
+msgstr "току що създаденото подаване не може да бъде открито"
 
-#: builtin/grep.c:712
-msgid "show <n> context lines after matches"
-msgstr "извеждане на такъв БРОЙ редове след напасванията"
+#: builtin/commit.c:1437
+msgid "could not parse newly created commit"
+msgstr "току що създаденото подаване не може да бъде анализирано"
 
-#: builtin/grep.c:714
-msgid "use <n> worker threads"
-msgstr "използване Ð½Ð° Ñ\82акÑ\8aв Ð\91РÐ\9eÐ\99 Ñ\80абоÑ\82еÑ\89и Ð½Ð¸Ñ\88ки"
+#: builtin/commit.c:1482
+msgid "detached HEAD"
+msgstr "неÑ\81вÑ\8aÑ\80зан Ð²Ñ\80Ñ\8aÑ\85 â\80\9eHEADâ\80\9c"
 
-#: builtin/grep.c:715
-msgid "shortcut for -C NUM"
-msgstr "синоним на „-C БРОЙ“"
+#: builtin/commit.c:1485
+msgid " (root-commit)"
+msgstr " (начално подаване)"
 
-#: builtin/grep.c:718
-msgid "show a line with the function name before matches"
-msgstr "извеждане Ð½Ð° Ñ\80ед Ñ\81 Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ñ\84Ñ\83нкÑ\86иÑ\8fÑ\82а, Ð² ÐºÐ¾Ñ\8fÑ\82о Ðµ Ð½Ð°Ð¿Ð°Ñ\81наÑ\82 Ñ\88аблона"
+#: builtin/commit.c:1582
+msgid "suppress summary after successful commit"
+msgstr "без Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ñ\81лед Ñ\83Ñ\81пеÑ\88но Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/grep.c:720
-msgid "show the surrounding function"
-msgstr "извеждане Ð½Ð° Ð¾Ð±Ñ\85ваÑ\89аÑ\89аÑ\82а Ñ\84Ñ\83нкÑ\86иÑ\8f"
+#: builtin/commit.c:1583
+msgid "show diff in commit message template"
+msgstr "добавÑ\8fне Ð½Ð° Ñ\80азликаÑ\82а ÐºÑ\8aм Ñ\88аблона Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/grep.c:723
-msgid "read patterns from file"
-msgstr "изÑ\87иÑ\82ане Ð½Ð° Ñ\88аблониÑ\82е Ð¾Ñ\82 Ð¤Ð\90Ð\99Ð\9b"
+#: builtin/commit.c:1585
+msgid "Commit message options"
+msgstr "Ð\9eпÑ\86ии Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/grep.c:725
-msgid "match <pattern>"
-msgstr "напаÑ\81ване Ð½Ð° Ð¨Ð\90Ð\91Ð\9bÐ\9eÐ\9d"
+#: builtin/commit.c:1586 builtin/tag.c:409
+msgid "read message from file"
+msgstr "взимане Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ð¤Ð\90Ð\99Ð\9b"
 
-#: builtin/grep.c:727
-msgid "combine patterns specified with -e"
-msgstr "комбиниÑ\80ане Ð½Ð° Ñ\88аблониÑ\82е Ñ\83казани Ñ\81 Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-eâ\80\9c"
+#: builtin/commit.c:1587
+msgid "author"
+msgstr "Ð\90Ð\92ТÐ\9eР"
 
-#: builtin/grep.c:739
-msgid "indicate hit with exit status without output"
-msgstr ""
-"без извеждане на стандартния изход. Изходният код указва наличието на "
-"напасване"
+#: builtin/commit.c:1587
+msgid "override author for commit"
+msgstr "задаване на АВТОР за подаването"
 
-#: builtin/grep.c:741
-msgid "show only matches from files that match all patterns"
-msgstr ""
-"извеждане на редове само от файловете, които напасват на всички шаблони"
+#: builtin/commit.c:1588 builtin/gc.c:357
+msgid "date"
+msgstr "ДАТА"
 
-#: builtin/grep.c:743
-msgid "show parse tree for grep expression"
-msgstr "извеждане Ð½Ð° Ð´Ñ\8aÑ\80воÑ\82о Ð·Ð° Ð°Ð½Ð°Ð»Ð¸Ð· Ð½Ð° Ñ\80егÑ\83лÑ\8fÑ\80ниÑ\8f Ð¸Ð·Ñ\80аз"
+#: builtin/commit.c:1588
+msgid "override date for commit"
+msgstr "задаване Ð½Ð° Ð\94Ð\90ТÐ\90 Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
 
-#: builtin/grep.c:747
-msgid "pager"
-msgstr "програма за преглед по страници"
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
+msgid "message"
+msgstr "СЪОБЩЕНИЕ"
 
-#: builtin/grep.c:747
-msgid "show matching files in the pager"
-msgstr "извеждане Ð½Ð° Ñ\81Ñ\8aвпадаÑ\89иÑ\82е Ñ\84айлове Ð² Ð¿Ñ\80огÑ\80ама Ð·Ð° Ð¿Ñ\80еглед Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и"
+#: builtin/commit.c:1589
+msgid "commit message"
+msgstr "СЪÐ\9eÐ\91ЩÐ\95Ð\9dÐ\98Ð\95 Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/grep.c:750
-msgid "allow calling of grep(1) (ignored by this build)"
-msgstr ""
-"позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
-"опция)"
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
+msgid "commit"
+msgstr "ПОДАВАНЕ"
 
-#: builtin/grep.c:813
-msgid "no pattern given."
-msgstr "липÑ\81ва Ñ\88аблон."
+#: builtin/commit.c:1590
+msgid "reuse and edit message from specified commit"
+msgstr "пÑ\80еизползване Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ñ\83казаноÑ\82о Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
-#: builtin/grep.c:845 builtin/index-pack.c:1477
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr "зададен е неправилен брой нишки: %d"
+#: builtin/commit.c:1591
+msgid "reuse message from specified commit"
+msgstr "преизползване на съобщението от указаното ПОДАВАНЕ"
 
-#: builtin/grep.c:875
-msgid "--open-files-in-pager only works on the worktree"
+#: builtin/commit.c:1592
+msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
-"опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво"
-
-#: builtin/grep.c:901
-msgid "--cached or --untracked cannot be used with --no-index."
-msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
+"използване на автоматичното съобщение при смачкване за вкарване на указаното "
+"ПОДАВАНЕ в предното без следа"
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
+#: builtin/commit.c:1593
+msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
-"опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии."
+"използване на автоматичното съобщение при смачкване за смачкване на "
+"указаното ПОДАВАНЕ в предното"
 
-#: builtin/grep.c:909
-msgid "--[no-]exclude-standard cannot be used for tracked contents."
+#: builtin/commit.c:1594
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
-"опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
-"файлове."
+"смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
 
-#: builtin/grep.c:917
-msgid "both --cached and trees are given."
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--cachedâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81Ñ\8aÑ\81 Ð·Ð°Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ð° Ð´Ñ\8aÑ\80во."
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
+msgid "add Signed-off-by:"
+msgstr "добавÑ\8fне Ð½Ð° Ð¿Ð¾Ð»Ðµ Ð·Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 â\80\94 â\80\9eSigned-off-by:â\80\9c"
 
-#: builtin/hash-object.c:81
-msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
-msgstr ""
-"git hash-object [-t ВИД] [-w] [--path=ФАЙЛ | --no-filters] [--stdin] [--] "
-"ФАЙЛ…"
+#: builtin/commit.c:1596
+msgid "use specified template file"
+msgstr "използване на указания шаблонен ФАЙЛ"
 
-#: builtin/hash-object.c:82
-msgid "git hash-object  --stdin-paths"
-msgstr "git hash-object --stdin-paths"
+#: builtin/commit.c:1597
+msgid "force edit of commit"
+msgstr "редактиране на подаване"
 
-#: builtin/hash-object.c:93
-msgid "type"
-msgstr "ВИД"
+#: builtin/commit.c:1598
+msgid "default"
+msgstr "стандартно"
 
-#: builtin/hash-object.c:93
-msgid "object type"
-msgstr "Ð\92Ð\98Ð\94 Ð½Ð° Ð¾Ð±ÐµÐºта"
+#: builtin/commit.c:1598 builtin/tag.c:412
+msgid "how to strip spaces and #comments from message"
+msgstr "кои Ð¿Ñ\80азни Ð·Ð½Ð°Ñ\86и Ð¸ #коменÑ\82аÑ\80и Ð´Ð° Ñ\81е Ð¼Ð°Ñ\85аÑ\82 Ð¾Ñ\82 Ñ\81Ñ\8aобÑ\89ениÑ\8fта"
 
-#: builtin/hash-object.c:94
-msgid "write the object into the object database"
-msgstr "запиÑ\81ване Ð½Ð° Ð¾Ð±ÐµÐºÑ\82а Ð² Ð±Ð°Ð·Ð°Ñ\82а Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
+#: builtin/commit.c:1599
+msgid "include status in commit message template"
+msgstr "вмÑ\8aкване Ð½Ð° Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о Ð² Ñ\88аблона Ð·Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½е"
 
-#: builtin/hash-object.c:96
-msgid "read the object from stdin"
-msgstr "изчитане на обекта от стандартния вход"
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
+msgid "GPG sign commit"
+msgstr "подписване на подаването с GPG"
 
-#: builtin/hash-object.c:98
-msgid "store file as is without filters"
-msgstr "запазване Ð½Ð° Ñ\84айла ÐºÐ°ÐºÑ\82о Ðµ â\80\94 Ð±ÐµÐ· Ñ\84илÑ\82Ñ\80и"
+#: builtin/commit.c:1604
+msgid "Commit contents options"
+msgstr "Ð\9eпÑ\86ии Ð·Ð° Ð¸Ð·Ð±Ð¾Ñ\80 Ð½Ð° Ñ\84айлове Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/hash-object.c:99
-msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
-msgstr ""
-"създаване и хеширане на произволни данни за повредени обекти за трасиране на "
-"Git"
+#: builtin/commit.c:1605
+msgid "commit all changed files"
+msgstr "подаване на всички променени файлове"
 
-#: builtin/hash-object.c:100
-msgid "process file as it were from this path"
-msgstr "обÑ\80абоÑ\82ване Ð½Ð° Ð¤Ð\90Ð\99Ð\9bа Ð²Ñ\81е ÐµÐ´Ð½Ð¾ Ðµ Ñ\81 Ñ\82ози Ð¿Ñ\8aÑ\82"
+#: builtin/commit.c:1606
+msgid "add specified files to index for commit"
+msgstr "добавÑ\8fне Ð½Ð° Ñ\83казаниÑ\82е Ñ\84айлове ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/help.c:41
-msgid "print all available commands"
-msgstr "показване Ð½Ð° Ð²Ñ\81иÑ\87ки Ð½Ð°Ð»Ð¸Ñ\87ни ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
+#: builtin/commit.c:1607
+msgid "interactively add files"
+msgstr "инÑ\82еÑ\80акÑ\82ивно Ð´Ð¾Ð±Ð°Ð²Ñ\8fне Ð½Ð° Ñ\84айлове"
 
-#: builtin/help.c:42
-msgid "print list of useful guides"
-msgstr "показване Ð½Ð° Ñ\81пиÑ\81Ñ\8aк Ñ\81 Ð¿Ñ\8aÑ\82еводиÑ\82ели"
+#: builtin/commit.c:1608
+msgid "interactively add changes"
+msgstr "инÑ\82еÑ\80акÑ\82ивно Ð´Ð¾Ð±Ð°Ð²Ñ\8fне Ð½Ð° Ð¿Ñ\80омени"
 
-#: builtin/help.c:43
-msgid "show man page"
-msgstr "показване Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ñ\82 Ñ\80Ñ\8aководÑ\81Ñ\82воÑ\82о"
+#: builtin/commit.c:1609
+msgid "commit only specified files"
+msgstr "подаване Ñ\81амо Ð½Ð° Ñ\83казаниÑ\82е Ñ\84айлове"
 
-#: builtin/help.c:44
-msgid "show manual in web browser"
-msgstr "показване на страница от ръководството в уеб браузър"
+#: builtin/commit.c:1610
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr ""
+"без изпълнение на куките преди подаване и при промяна на съобщението за "
+"подаване (pre-commit и commit-msg)"
 
-#: builtin/help.c:46
-msgid "show info page"
-msgstr "показване Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86ионна Ñ\81Ñ\82Ñ\80аниÑ\86а"
+#: builtin/commit.c:1611
+msgid "show what would be committed"
+msgstr "оÑ\82пеÑ\87аÑ\82ване Ð½Ð° Ñ\82ова, ÐºÐ¾ÐµÑ\82о Ð±Ð¸ Ð±Ð¸Ð»Ð¾ Ð¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¾"
 
-#: builtin/help.c:52
-msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
-msgstr "git help [--all] [--guides] [--man | --web | --info] [КОМАНДА]"
+#: builtin/commit.c:1622
+msgid "amend previous commit"
+msgstr "поправяне на предишното подаване"
 
-#: builtin/help.c:64
-#, c-format
-msgid "unrecognized help format '%s'"
-msgstr "непознат формат на помощта „%s“"
+#: builtin/commit.c:1623
+msgid "bypass post-rewrite hook"
+msgstr "без изпълнение на куката след презаписване (post-rewrite)"
 
-#: builtin/help.c:91
-msgid "Failed to start emacsclient."
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80ане Ð½Ð° â\80\9eemacsclientâ\80\9c."
+#: builtin/commit.c:1628
+msgid "ok to record an empty change"
+msgstr "позволÑ\8fване Ð½Ð° Ð¿Ñ\80азни Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
 
-#: builtin/help.c:104
-msgid "Failed to parse emacsclient version."
-msgstr "Ð\92еÑ\80Ñ\81иÑ\8fÑ\82а Ð½Ð° â\80\9eemacsclientâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80а."
+#: builtin/commit.c:1630
+msgid "ok to record a change with an empty message"
+msgstr "позволÑ\8fване Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f Ñ\81 Ð¿Ñ\80азни Ñ\81Ñ\8aобÑ\89ениÑ\8f"
 
-#: builtin/help.c:112
+#: builtin/commit.c:1659
+msgid "could not parse HEAD commit"
+msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
+
+#: builtin/commit.c:1707
 #, c-format
-msgid "emacsclient version '%d' too old (< 22)."
-msgstr "Прекалено стара версия на „emacsclient“ — %d (< 22)."
+msgid "Corrupt MERGE_HEAD file (%s)"
+msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)"
+
+#: builtin/commit.c:1714
+msgid "could not read MERGE_MODE"
+msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/commit.c:1733
 #, c-format
-msgid "failed to exec '%s'"
-msgstr "неуспешно изпълнение на „%s“"
+msgid "could not read commit message: %s"
+msgstr "съобщението за подаване не може да бъде прочетено: %s"
 
-#: builtin/help.c:205
+#: builtin/commit.c:1744
 #, c-format
-msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
-msgstr ""
-"„%s“: път към неподдържана програма за преглед на\n"
-" ръководството. Вместо нея пробвайте „man.<tool>.cmd“."
+msgid "Aborting commit; you did not edit the message.\n"
+msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
 
-#: builtin/help.c:217
+#: builtin/commit.c:1749
 #, c-format
+msgid "Aborting commit due to empty commit message.\n"
+msgstr "Неизвършване на подаване поради празно съобщение.\n"
+
+#: builtin/commit.c:1797
 msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
+"Repository has been updated, but unable to write\n"
+"new_index file. Check that disk is not full and quota is\n"
+"not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
-"„%s“: команда за поддържана програма за преглед на\n"
-" ръководството. Вместо нея пробвайте „man.<tool>.path“."
+"Хранилището е обновено, но новият файл за индекс „new_index“\n"
+"не е записан.  Проверете дали дискът не е препълнен или не сте\n"
+"превишили дисковата си квота.  След това изпълнете „git reset HEAD“."
 
-#: builtin/help.c:334
-#, c-format
-msgid "'%s': unknown man viewer."
-msgstr "„%s“: непозната програма за преглед на ръководството."
+#: builtin/config.c:9
+msgid "git config [<options>]"
+msgstr "git config [ОПЦИЯ…]"
 
-#: builtin/help.c:351
-msgid "no man viewer handled the request"
-msgstr "никоÑ\8f Ð¿Ñ\80огÑ\80ама Ð·Ð° Ð¿Ñ\80еглед Ð½Ð° Ñ\80Ñ\8aководÑ\81Ñ\82во Ð½Ðµ Ñ\83Ñ\81пÑ\8f Ð´Ð° Ð¾Ð±Ñ\80абоÑ\82и Ð·Ð°Ñ\8fвкаÑ\82а"
+#: builtin/config.c:56
+msgid "Config file location"
+msgstr "Ð\9cеÑ\81Ñ\82оположение Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ионниÑ\8f Ñ\84айл"
 
-#: builtin/help.c:359
-msgid "no info viewer handled the request"
-msgstr ""
-"никоя програма за преглед на информационните страници не успя да обработи "
-"заявката"
+#: builtin/config.c:57
+msgid "use global config file"
+msgstr "използване на глобалния конфигурационен файл"
 
-#: builtin/help.c:408
-msgid "Defining attributes per path"
-msgstr "Указване Ð½Ð° Ð°Ñ\82Ñ\80ибÑ\83Ñ\82и ÐºÑ\8aм Ð¿Ñ\8aÑ\82"
+#: builtin/config.c:58
+msgid "use system config file"
+msgstr "използване Ð½Ð° Ñ\81иÑ\81Ñ\82емниÑ\8f ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ионен Ñ\84айл"
 
-#: builtin/help.c:409
-msgid "Everyday Git With 20 Commands Or So"
-msgstr "Ð\95жедневиеÑ\82о Ð² Git Ð² Ñ\80амкиÑ\82е Ð½Ð° 20-ина ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
+#: builtin/config.c:59
+msgid "use repository config file"
+msgstr "използване Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ионниÑ\8f Ñ\84айл Ð½Ð° Ñ\85Ñ\80анилиÑ\89еÑ\82о"
 
-#: builtin/help.c:410
-msgid "A Git glossary"
-msgstr "Речник с термините на Git"
-
-#: builtin/help.c:411
-msgid "Specifies intentionally untracked files to ignore"
-msgstr "Указване на неследени файлове, които да бъдат нарочно пренебрегвани"
+#: builtin/config.c:60
+msgid "use given config file"
+msgstr "използване на зададения конфигурационен ФАЙЛ"
 
-#: builtin/help.c:412
-msgid "Defining submodule properties"
-msgstr "Ð\94еÑ\84иниÑ\80ане Ð½Ð° Ñ\81войÑ\81Ñ\82ваÑ\82а Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лиÑ\82е"
+#: builtin/config.c:61
+msgid "blob-id"
+msgstr "Ð\98Ð\94Ð\95Ð\9dТÐ\98ФÐ\98Ð\9aÐ\90ТÐ\9eР"
 
-#: builtin/help.c:413
-msgid "Specifying revisions and ranges for Git"
-msgstr "Указване на версии и интервали в Git"
+#: builtin/config.c:61
+msgid "read config from given blob object"
+msgstr ""
+"изчитане на конфигурацията от BLOB с този ИДЕНТИФИКАТОР на съдържанието"
 
-#: builtin/help.c:414
-msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
-msgstr "Ð\92Ñ\8aвеждаÑ\89 Ñ\83Ñ\80ок Ð·Ð° Git (веÑ\80Ñ\81ии Ð¿Ð¾Ð½Ðµ 1.5.1)"
+#: builtin/config.c:62
+msgid "Action"
+msgstr "Ð\94ейÑ\81Ñ\82вие"
 
-#: builtin/help.c:415
-msgid "An overview of recommended workflows with Git"
-msgstr "Ð\9eбÑ\89 Ð¿Ñ\80еглед Ð½Ð° Ð¿Ñ\80епоÑ\80Ñ\8aÑ\87ваниÑ\82е Ð½Ð°Ñ\87ини Ð·Ð° Ñ\80абоÑ\82а Ñ\81 Git"
+#: builtin/config.c:63
+msgid "get value: name [value-regex]"
+msgstr "извеждане Ð½Ð° Ñ\81Ñ\82ойноÑ\81Ñ\82: Ð\98Ð\9cÐ\95 [РÐ\95Ð\93УÐ\9bЯРÐ\95Ð\9d\98Ð\97РÐ\90Ð\97\97Ð\90_СТÐ\9eÐ\99Ð\9dÐ\9eСТТÐ\90]"
 
-#: builtin/help.c:427
-msgid "The common Git guides are:\n"
-msgstr "Ð\9fопÑ\83лÑ\8fÑ\80ниÑ\82е Ð¿Ñ\8aÑ\82еводиÑ\82ели Ð² Git Ñ\81а:\n"
+#: builtin/config.c:64
+msgid "get all values: key [value-regex]"
+msgstr "извеждане Ð½Ð° Ð²Ñ\81иÑ\87ки Ñ\81Ñ\82ойноÑ\81Ñ\82и: ÐºÐ»Ñ\8eÑ\87 [РÐ\95Ð\93УÐ\9bЯРÐ\95Ð\9d\98Ð\97РÐ\90Ð\97\97Ð\90_СТÐ\9eÐ\99Ð\9dÐ\9eСТТÐ\90]"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "употреба: %s%s"
+#: builtin/config.c:65
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr ""
+"извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
+"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/help.c:481
-#, c-format
-msgid "`git %s' is aliased to `%s'"
-msgstr "„git %s“ е синоним на „%s“"
+#: builtin/config.c:66
+msgid "get value specific for the URL: section[.var] URL"
+msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС"
 
-# FIXME merge with next?
-#: builtin/index-pack.c:152
-#, c-format
-msgid "unable to open %s"
-msgstr "обектът „%s“ не може да бъде отворен"
+#: builtin/config.c:67
+msgid "replace all matching variables: name value [value_regex]"
+msgstr ""
+"замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
+"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/index-pack.c:202
-#, c-format
-msgid "object type mismatch at %s"
-msgstr "неправилен вид на обекта „%s“"
+#: builtin/config.c:68
+msgid "add a new variable: name value"
+msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
 
-#: builtin/index-pack.c:222
-#, c-format
-msgid "did not receive expected object %s"
-msgstr "очакваният обект „%s“ не бе получен"
+#: builtin/config.c:69
+msgid "remove a variable: name [value-regex]"
+msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/index-pack.c:225
-#, c-format
-msgid "object %s: expected type %s, found %s"
-msgstr "неправилен вид на обекта „%s“: очакваше се „%s“, а бе получен „%s“"
+#: builtin/config.c:70
+msgid "remove all matches: name [value-regex]"
+msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/index-pack.c:267
-#, c-format
-msgid "cannot fill %d byte"
-msgid_plural "cannot fill %d bytes"
-msgstr[0] "не може да се запълни %d байт"
-msgstr[1] "не може да се запълнят %d байта"
+#: builtin/config.c:71
+msgid "rename section: old-name new-name"
+msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
 
-#: builtin/index-pack.c:277
-msgid "early EOF"
-msgstr "неоÑ\87акван ÐºÑ\80ай Ð½Ð° Ñ\84айл"
+#: builtin/config.c:72
+msgid "remove a section: name"
+msgstr "изÑ\82Ñ\80иване Ð½Ð° Ñ\80аздел: Ð\98Ð\9cÐ\95"
 
-#: builtin/index-pack.c:278
-msgid "read error on input"
-msgstr "гÑ\80еÑ\88ка Ð¿Ñ\80и Ñ\87еÑ\82ене Ð½Ð° Ð²Ñ\85одниÑ\82е Ð´Ð°Ð½Ð½и"
+#: builtin/config.c:73
+msgid "list all"
+msgstr "избÑ\80оÑ\8fване Ð½Ð° Ð²Ñ\81иÑ\87ки"
 
-#: builtin/index-pack.c:290
-msgid "used more bytes than were available"
-msgstr "използвани Ñ\81а Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ñ\82 Ð½Ð°Ð»Ð¸Ñ\87ниÑ\82е Ð±Ð°Ð¹Ñ\82ове"
+#: builtin/config.c:74
+msgid "open an editor"
+msgstr "оÑ\82ваÑ\80Ñ\8fне Ð½Ð° Ñ\80едакÑ\82оÑ\80"
 
-#: builtin/index-pack.c:297
-msgid "pack too large for current definition of off_t"
-msgstr "пакеÑ\82ниÑ\8fÑ\82 Ñ\84айл Ðµ Ð¿Ñ\80екалено Ð³Ð¾Ð»Ñ\8fм Ð·Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð½Ð° Ñ\82ипа â\80\9eoff_tâ\80\9c"
+#: builtin/config.c:75
+msgid "find the color configured: slot [default]"
+msgstr "извеждане Ð½Ð° Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\8f Ñ\86вÑ\8fÑ\82: Ð½Ð¾Ð¼ÐµÑ\80 [Ñ\81Ñ\82андаÑ\80Ñ\82но]"
 
-#: builtin/index-pack.c:313
-#, c-format
-msgid "unable to create '%s'"
-msgstr "пакетният файл „%s“ не може да бъде създаден"
+#: builtin/config.c:76
+msgid "find the color setting: slot [stdout-is-tty]"
+msgstr "извеждане на зададения цвят: номер [стандартният изход е терминал]"
 
-#: builtin/index-pack.c:318
-#, c-format
-msgid "cannot open packfile '%s'"
-msgstr "пакетният файл „%s“ не може да бъде отворен"
+#: builtin/config.c:77
+msgid "Type"
+msgstr "Вид"
 
-#: builtin/index-pack.c:332
-msgid "pack signature mismatch"
-msgstr "неÑ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82вие Ð² Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81а ÐºÑ\8aм Ð¿Ð°ÐºÐµÑ\82ниÑ\8f Ñ\84айл"
+#: builtin/config.c:78
+msgid "value is \"true\" or \"false\""
+msgstr "СТÐ\9eÐ\99Ð\9dÐ\9eСТТÐ\90 Ðµ â\80\9etrueâ\80\9c (иÑ\81Ñ\82ина) Ð¸Ð»Ð¸ â\80\9efalseâ\80\9c (лÑ\8aжа)"
 
-#: builtin/index-pack.c:334
-#, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr "не се поддържа пакетиране вeрсия „%<PRIu32>“"
+#: builtin/config.c:79
+msgid "value is decimal number"
+msgstr "СТОЙНОСТТА е цяло, десетично число"
 
-#: builtin/index-pack.c:352
-#, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "повреден обект в пакетния файл при отместване %lu: %s"
+#: builtin/config.c:80
+msgid "value is --bool or --int"
+msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)"
 
-#: builtin/index-pack.c:473
-#, c-format
-msgid "inflate returned %d"
-msgstr "декомпресирането с „inflate“ върна %d"
+#: builtin/config.c:81
+msgid "value is a path (file or directory name)"
+msgstr "СТОЙНОСТТА е път (до файл или директория)"
 
-#: builtin/index-pack.c:522
-msgid "offset value overflow for delta base object"
-msgstr "стойността на отместването за обекта-разлика води до препълване"
+#: builtin/config.c:82
+msgid "Other"
+msgstr "Други"
 
-#: builtin/index-pack.c:530
-msgid "delta base offset is out of bound"
-msgstr "Ñ\81Ñ\82ойноÑ\81Ñ\82Ñ\82а Ð½Ð° Ð¾Ñ\82меÑ\81Ñ\82ванеÑ\82о Ð·Ð° Ð¾Ð±ÐµÐºÑ\82а-Ñ\80азлика Ðµ Ð¸Ð·Ð²Ñ\8aн Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°"
+#: builtin/config.c:83
+msgid "terminate values with NUL byte"
+msgstr "Ñ\80азделÑ\8fне Ð½Ð° Ñ\81Ñ\82ойноÑ\81Ñ\82иÑ\82е Ñ\81 Ð½Ñ\83левиÑ\8f Ð·Ð½Ð°Ðº â\80\9eNULâ\80\9c"
 
-#: builtin/index-pack.c:538
-#, c-format
-msgid "unknown object type %d"
-msgstr "непознат вид обект %d"
+#: builtin/config.c:84
+msgid "show variable names only"
+msgstr "извеждане на имената на променливите"
 
-#: builtin/index-pack.c:569
-msgid "cannot pread pack file"
-msgstr "пакетният файл не може да бъде прочетен"
+#: builtin/config.c:85
+msgid "respect include directives on lookup"
+msgstr "при търсене да се уважат и директивите за включване"
 
-#: builtin/index-pack.c:571
-#, c-format
-msgid "premature end of pack file, %lu byte missing"
-msgid_plural "premature end of pack file, %lu bytes missing"
-msgstr[0] "неочакван край на файл, липсва %lu байт"
-msgstr[1] "неочакван край на файл, липсват %lu байта"
+#: builtin/config.c:86
+msgid "show origin of config (file, standard input, blob, command line)"
+msgstr ""
+"извеждане на мястото на задаване на настройката (файл, стандартен вход, "
+"обект BLOB, команден ред)"
 
-#: builtin/index-pack.c:597
-msgid "serious inflate inconsistency"
-msgstr "сериозна грешка при декомпресиране с „inflate“"
+#: builtin/config.c:328
+msgid "unable to parse default color value"
+msgstr "неразпозната стойност на стандартния цвят"
 
-#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772
-#: builtin/index-pack.c:806 builtin/index-pack.c:815
+#: builtin/config.c:472
 #, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[user]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
 msgstr ""
-"СЪВПАДЕНИЕ НА СТОЙНОСТИТЕ ЗА СУМИТЕ ЗА SHA1: „%s“ НА ДВА РАЗЛИЧНИ ОБЕКТА!"
-
-# FIXME merge with next?
-#: builtin/index-pack.c:746 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
-#, c-format
-msgid "unable to read %s"
-msgstr "обектът „%s“ не може да бъде прочетен"
+"# Това е потребителският ви конфигурационен файл за Git.\n"
+"[user]\n"
+"# Проверете и разкоментирайте следните два реда:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
 
-#: builtin/index-pack.c:812
+#: builtin/config.c:615
 #, c-format
-msgid "cannot read existing object %s"
-msgstr "съществуващият обект „%s“ не може да бъде прочетен"
+msgid "cannot create configuration file %s"
+msgstr "конфигурационният файл „%s“ не може да бъде създаден"
 
-#: builtin/index-pack.c:826
+#: builtin/config.c:627
 #, c-format
-msgid "invalid blob object %s"
-msgstr "неправилен обект BLOB „%s“"
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"множество стойности не могат да се заменят с една.\n"
+"За да промените „%s“, ползвайте регулярен израз или опциите „--add“ и „--"
+"replace-all“."
 
-# FIXME perhaps invalid object
-#: builtin/index-pack.c:840
-#, c-format
-msgid "invalid %s"
-msgstr "неправилен обект „%s“"
+#: builtin/count-objects.c:86
+msgid "git count-objects [-v] [-H | --human-readable]"
+msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/index-pack.c:843
-msgid "Error in object"
-msgstr "Ð\93Ñ\80еÑ\88ка Ð² Ð¾Ð±ÐµÐºÑ\82а"
+#: builtin/count-objects.c:96
+msgid "print sizes in human readable format"
+msgstr "извеждане Ð½Ð° Ñ\80азмеÑ\80иÑ\82е Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ð²Ñ\8aв Ñ\84оÑ\80маÑ\82 Ð»ÐµÑ\81но Ñ\87еÑ\82им Ð¾Ñ\82 Ñ\85оÑ\80а"
 
-#: builtin/index-pack.c:845
-#, c-format
-msgid "Not all child objects of %s are reachable"
-msgstr "Някои обекти, наследници на „%s“, не могат да бъдат достигнати"
+#: builtin/describe.c:18
+msgid "git describe [<options>] [<commit-ish>...]"
+msgstr "git describe [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
-#: builtin/index-pack.c:917 builtin/index-pack.c:948
-msgid "failed to apply delta"
-msgstr "разликата не може да бъде приложена"
+#: builtin/describe.c:19
+msgid "git describe [<options>] --dirty"
+msgstr "git describe [ОПЦИЯ…] --dirty"
 
-#: builtin/index-pack.c:1118
-msgid "Receiving objects"
-msgstr "Ð\9fолÑ\83Ñ\87аване Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/describe.c:53
+msgid "head"
+msgstr "оÑ\81новно"
 
-#: builtin/index-pack.c:1118
-msgid "Indexing objects"
-msgstr "Ð\98ндекÑ\81иÑ\80ане Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "кÑ\80аÑ\82ко"
 
-#: builtin/index-pack.c:1150
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr "пакеÑ\82ниÑ\8fÑ\82 Ñ\84айл Ðµ Ð¿Ð¾Ð²Ñ\80еден (нееднакви Ñ\81Ñ\83ми Ð¿Ð¾ SHA1)"
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "аноÑ\82иÑ\80ано"
 
-#: builtin/index-pack.c:1155
-msgid "cannot fstat packfile"
-msgstr "не може да се получи информация за пакетния файл с „fstat“"
+#: builtin/describe.c:250
+#, c-format
+msgid "annotated tag %s not available"
+msgstr "не съществува анотиран етикет „%s“"
 
-#: builtin/index-pack.c:1158
-msgid "pack has junk at the end"
-msgstr "в края на пакетния файл има повредени данни"
+#: builtin/describe.c:254
+#, c-format
+msgid "annotated tag %s has no embedded name"
+msgstr "в анотирания етикет „%s“ липсва вградено име"
 
-# FIXME WTF message
-#: builtin/index-pack.c:1169
-msgid "confusion beyond insanity in parse_pack_objects()"
-msgstr ""
-"фатална грешка във функцията „parse_pack_objects“. Това е грешка в Git, "
-"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
-"kernel.org“."
+#: builtin/describe.c:256
+#, c-format
+msgid "tag '%s' is really '%s' here"
+msgstr "етикетът „%s“ тук е всъщност „%s“"
 
-#: builtin/index-pack.c:1194
-msgid "Resolving deltas"
-msgstr "Откриване на съответните разлики"
+#: builtin/describe.c:283 builtin/log.c:487
+#, c-format
+msgid "Not a valid object name %s"
+msgstr "Неправилно име на обект „%s“"
 
-#: builtin/index-pack.c:1205
+#: builtin/describe.c:286
 #, c-format
-msgid "unable to create thread: %s"
-msgstr "не може да се създаде нишка: %s"
+msgid "%s is not a valid '%s' object"
+msgstr "„%s“ е неправилен обект „%s“"
 
-# FIXME WTF message
-#: builtin/index-pack.c:1247
-msgid "confusion beyond insanity"
-msgstr ""
-"фатална грешка във функцията „conclude_pack“. Това е грешка в Git, "
-"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
-"kernel.org“."
+#: builtin/describe.c:303
+#, c-format
+msgid "no tag exactly matches '%s'"
+msgstr "никой етикет не напасва точно „%s“"
 
-#: builtin/index-pack.c:1253
+#: builtin/describe.c:305
 #, c-format
-msgid "completed with %d local object"
-msgid_plural "completed with %d local objects"
-msgstr[0] "действието завърши с %d локален обект"
-msgstr[1] "действието завърши с %d локални обекта"
+msgid "searching to describe %s\n"
+msgstr "търсене за описание на „%s“\n"
 
-#: builtin/index-pack.c:1265
+#: builtin/describe.c:352
 #, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
-msgstr ""
-"Неочаквана последваща сума за грешки за „%s“ (причината може да е грешка в "
-"диска)"
+msgid "finished search at %s\n"
+msgstr "търсенето приключи при „%s“\n"
 
-#: builtin/index-pack.c:1269
+#: builtin/describe.c:379
 #, c-format
-msgid "pack has %d unresolved delta"
-msgid_plural "pack has %d unresolved deltas"
-msgstr[0] "в пакета има %d ненапасваща разлика"
-msgstr[1] "в пакета има %d ненапасващи разлики"
+msgid ""
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
+msgstr ""
+"Никой анотиран етикет не описва „%s“.\n"
+"Съществуват и неанотирани етикети.  Пробвайте с опцията „--tags“."
 
-#: builtin/index-pack.c:1293
+#: builtin/describe.c:383
 #, c-format
-msgid "unable to deflate appended object (%d)"
-msgstr "добавеният обект не може да се компресира с „deflate“: %d"
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
+msgstr ""
+"Никой етикет не описва „%s“.\n"
+"Пробвайте с опцията „--always“ или създайте етикети."
 
-#: builtin/index-pack.c:1369
+#: builtin/describe.c:413
 #, c-format
-msgid "local object %s is corrupt"
-msgstr "локалният обект „%s“ е повреден"
-
-#: builtin/index-pack.c:1393
-msgid "error while closing pack file"
-msgstr "грешка при затварянето на пакетния файл"
+msgid "traversed %lu commits\n"
+msgstr "претърсени са %lu подавания\n"
 
-#: builtin/index-pack.c:1406
+#: builtin/describe.c:416
 #, c-format
-msgid "cannot write keep file '%s'"
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
 msgstr ""
-"грешка при записването на файла „%s“, осигуряващ запазване на директория"
+"открити са над %i етикета, изведени са последните %i,\n"
+"търсенето бе прекратено при „%s“.\n"
 
-#: builtin/index-pack.c:1414
-#, c-format
-msgid "cannot close written keep file '%s'"
+#: builtin/describe.c:438
+msgid "find the tag that comes after the commit"
+msgstr "откриване на етикета, който следва подаване"
+
+#: builtin/describe.c:439
+msgid "debug search strategy on stderr"
 msgstr ""
-"гÑ\80еÑ\88ка Ð¿Ñ\80и Ð·Ð°Ñ\82ваÑ\80Ñ\8fнеÑ\82о Ð½Ð° Ð·Ð°Ð¿Ð¸Ñ\81аниÑ\8f Ñ\84айл â\80\9e%sâ\80\9c, Ð¾Ñ\81игÑ\83Ñ\80Ñ\8fваÑ\89 Ð·Ð°Ð¿Ð°Ð·Ð²Ð°не на "
-"директория"
+"извеждане Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ñ\82Ñ\80аÑ\81иÑ\80ане Ð½Ð° Ñ\81Ñ\82Ñ\80аÑ\82егиÑ\8fÑ\82а Ð·Ð° Ñ\82Ñ\8aÑ\80Ñ\81ене на "
+"стандартната грешка"
 
-#: builtin/index-pack.c:1427
-msgid "cannot store pack file"
-msgstr "пакеÑ\82ниÑ\8fÑ\82 Ñ\84айл Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð°Ð·ÐµÐ½"
+#: builtin/describe.c:440
+msgid "use any ref"
+msgstr "използване Ð½Ð° Ð¿Ñ\80оизволен Ñ\83казаÑ\82ел"
 
-#: builtin/index-pack.c:1438
-msgid "cannot store index file"
-msgstr "файлът за индекса не може да бъде съхранен"
+#: builtin/describe.c:441
+msgid "use any tag, even unannotated"
+msgstr "използване на всеки етикет — включително и неанотираните"
 
-#: builtin/index-pack.c:1471
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
-msgstr "зададена е неправилна версия пакетиране: „pack.indexversion=%<PRIu32>“"
+#: builtin/describe.c:442
+msgid "always use long format"
+msgstr "винаги да се ползва дългият формат"
 
-#: builtin/index-pack.c:1481 builtin/index-pack.c:1678
-#, c-format
-msgid "no threads support, ignoring %s"
-msgstr "липсва поддръжка за нишки. „%s“ ще се пренебрегне"
+#: builtin/describe.c:443
+msgid "only follow first parent"
+msgstr "проследяване само на първия родител"
 
-#: builtin/index-pack.c:1540
-#, c-format
-msgid "Cannot open existing pack file '%s'"
-msgstr "Съществуващият пакетен файл „%s“ не може да бъде отворен"
+#: builtin/describe.c:446
+msgid "only output exact matches"
+msgstr "извеждане само на точните съвпадения"
 
-#: builtin/index-pack.c:1542
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
-msgstr "Съществуващият индекс за пакетния файл „%s“ не може да бъде отворен"
+#: builtin/describe.c:448
+msgid "consider <n> most recent tags (default: 10)"
+msgstr "да се търси само в този БРОЙ последни етикети (стандартно: 10)"
 
-#: builtin/index-pack.c:1589
-#, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] "%d обект не е разлика"
-msgstr[1] "%d обекта не са разлика"
+#: builtin/describe.c:450
+msgid "only consider tags matching <pattern>"
+msgstr "да се търси само измежду етикетите напасващи този ШАБЛОН"
 
-#: builtin/index-pack.c:1596
-#, c-format
-msgid "chain length = %d: %lu object"
-msgid_plural "chain length = %d: %lu objects"
-msgstr[0] "дължината на веригата е %d: %lu обект"
-msgstr[1] "дължината на веригата е %d: %lu обекта"
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "да не се търси измежду етикетите напасващи този ШАБЛОН"
 
-#: builtin/index-pack.c:1609
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
+#: builtin/describe.c:454 builtin/name-rev.c:357
+msgid "show abbreviated commit object as fallback"
+msgstr "извеждане на съкратено име на обект като резервен вариант"
 
-# FIXME it is not the cwd it is the previous cwd
-#: builtin/index-pack.c:1638
-msgid "Cannot come back to cwd"
-msgstr "Процесът не може да се върне към предишната работна директория"
+#: builtin/describe.c:455 builtin/describe.c:458
+msgid "mark"
+msgstr "МАРКЕР"
 
-#: builtin/index-pack.c:1690 builtin/index-pack.c:1693
-#: builtin/index-pack.c:1705 builtin/index-pack.c:1709
-#, c-format
-msgid "bad %s"
-msgstr "неправилна стойност „%s“"
+#: builtin/describe.c:456
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr "добавяне на такъв МАРКЕР на работното дърво (стандартно е „-dirty“)"
 
-#: builtin/index-pack.c:1723
-msgid "--fix-thin cannot be used without --stdin"
-msgstr "опцията „--fix-thin“ изисква „--stdin“"
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr ""
+"добавяне на такъв МАРКЕР на счупеното работно дърво (стандартно е „-broken“)"
 
-#: builtin/index-pack.c:1731
-msgid "--verify with no packfile name given"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--verifyâ\80\9c Ð¸Ð·Ð¸Ñ\81ква Ð¸Ð¼Ðµ Ð½Ð° Ð¿Ð°ÐºÐµÑ\82ен Ñ\84айл"
+#: builtin/describe.c:477
+msgid "--long is incompatible with --abbrev=0"
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--longâ\80\9c Ð¸ â\80\9e--abbrev=0â\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
 
-#: builtin/init-db.c:55
-#, c-format
-msgid "cannot stat '%s'"
-msgstr "не може да се получи информация чрез „stat“ за директорията „%s“"
+#: builtin/describe.c:506
+msgid "No names found, cannot describe anything."
+msgstr "Не са открити имена — нищо не може да бъде описано."
 
-#: builtin/init-db.c:61
-#, c-format
-msgid "cannot stat template '%s'"
-msgstr "не може да се получи информация чрез „stat“ за шаблона „%s“"
+#: builtin/describe.c:549
+msgid "--dirty is incompatible with commit-ishes"
+msgstr "опцията „--dirty“ е несъвместима с указател към подаване"
 
-#: builtin/init-db.c:66
-#, c-format
-msgid "cannot opendir '%s'"
-msgstr "директорията „%s“ не може да бъде отворена"
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "опцията „--broken“ е несъвместима с указател към подаване"
 
-#: builtin/init-db.c:77
+#: builtin/diff.c:83
 #, c-format
-msgid "cannot readlink '%s'"
-msgstr "връзката „%s“ не може да бъде прочетена"
+msgid "'%s': not a regular file or symlink"
+msgstr "„%s“: не е нито обикновен файл, нито символна връзка"
 
-#: builtin/init-db.c:79
+#: builtin/diff.c:234
 #, c-format
-msgid "cannot symlink '%s' '%s'"
-msgstr "не може да се създаде символна връзка „%s“ в „%s“"
+msgid "invalid option: %s"
+msgstr "неправилна опция: %s"
+
+#: builtin/diff.c:358
+msgid "Not a git repository"
+msgstr "Не е хранилище на Git"
 
-#: builtin/init-db.c:85
+#: builtin/diff.c:401
 #, c-format
-msgid "cannot copy '%s' to '%s'"
-msgstr "„%s“ не може да се копира в „%s“"
+msgid "invalid object '%s' given."
+msgstr "зададен е неправилен обект „%s“."
 
-#: builtin/init-db.c:89
+#: builtin/diff.c:410
 #, c-format
-msgid "ignoring template %s"
-msgstr "игноÑ\80иÑ\80ане Ð½Ð° Ñ\88аблона „%s“"
+msgid "more than two blobs given: '%s'"
+msgstr "зададени Ñ\81а Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ñ\82 2 Ð¾Ð±ÐµÐºÑ\82а BLOB: „%s“"
 
-#: builtin/init-db.c:120
+#: builtin/diff.c:417
 #, c-format
-msgid "templates not found %s"
-msgstr "директорията с шаблоните не е открита: „%s“"
+msgid "unhandled object '%s' given."
+msgstr "зададен е неподдържан обект „%s“."
+
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr "git difftool [ОПЦИЯ…] [ПОДАВАНЕ [ПОДАВАНЕ]] [[--] ПЪТ…]"
 
-#: builtin/init-db.c:135
+#: builtin/difftool.c:241
 #, c-format
-msgid "not copying templates from '%s': %s"
-msgstr "шаблоните няма да бъдат копирани от „%s“: „%s“"
+msgid "failed: %d"
+msgstr "неуспешно действие с изходен код: %d"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
+#: builtin/difftool.c:283
 #, c-format
-msgid "%s already exists"
-msgstr "Директорията „%s“ вече съществува"
+msgid "could not read symlink %s"
+msgstr "символната връзка „%s“ не може да бъде прочетена"
 
-#: builtin/init-db.c:344
+#: builtin/difftool.c:285
 #, c-format
-msgid "unable to handle file type %d"
-msgstr "файлове от вид %d не се поддържат"
+msgid "could not read symlink file %s"
+msgstr "файлът, сочен от символната връзка „%s“, не може да бъде прочетен"
 
-#: builtin/init-db.c:347
+#: builtin/difftool.c:293
 #, c-format
-msgid "unable to move %s to %s"
-msgstr "„%s“ не може да се премести в „%s“"
+msgid "could not read object %s for symlink %s"
+msgstr "обектът „%s“ за символната връзка „%s“ не може да бъде прочетен"
 
-#. TRANSLATORS: The first '%s' is either "Reinitialized
-#. existing" or "Initialized empty", the second " shared" or
-#. "", and the last '%s%s' is the verbatim directory name.
-#: builtin/init-db.c:403
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"комбинираните формати на разликите („-c“ и „--cc“) не се поддържат\n"
+"в режима за разлики върху директории („-d“ и „--dir-diff“)."
+
+#: builtin/difftool.c:609
 #, c-format
-msgid "%s%s Git repository in %s%s\n"
-msgstr "%s%s хранилище на Git в „%s%s“\n"
+msgid "both files modified: '%s' and '%s'."
+msgstr "и двата файла са променени: „%s“ и „%s“."
 
-#: builtin/init-db.c:404
-msgid "Reinitialized existing"
-msgstr "Наново инициализирано, съществуващо"
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "работното дърво е изоставено."
 
-#: builtin/init-db.c:404
-msgid "Initialized empty"
-msgstr "Инициализирано празно"
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "в „%s“ има временни файлове."
 
-#: builtin/init-db.c:405
-msgid " shared"
-msgstr ", споделено"
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "възможно е да ги изчистите или възстановите"
 
-#: builtin/init-db.c:452
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
-msgstr ""
-"git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШАБЛОНИ] [--"
-"shared[=ПРАВА]] [ДИРЕКТОРИЯ]"
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "използвайте „diff.guitool“ вместо „diff.tool“"
 
-#: builtin/init-db.c:475
-msgid "permissions"
-msgstr "права"
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "разлика по директории"
 
-#: builtin/init-db.c:476
-msgid "specify that the git repository is to be shared amongst several users"
-msgstr ""
-"указване, че хранилището на Git ще бъде споделено от повече от един "
-"потребител"
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "стартиране на ПРОГРАМАта за разлики без предупреждение"
 
-#: builtin/init-db.c:510 builtin/init-db.c:515
-#, c-format
-msgid "cannot mkdir %s"
-msgstr "директорията „%s“ не може да бъде създадена"
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "следване на символните връзки при разлика по директории"
 
-#: builtin/init-db.c:519
-#, c-format
-msgid "cannot chdir to %s"
-msgstr "не може да се влезе в директорията „%s“"
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "ПРОГРАМА"
 
-#: builtin/init-db.c:540
-#, c-format
-msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
-msgstr ""
-"%s (или --work-tree=ДИРЕКТОРИЯ) изисква указването на %s (или --git-"
-"dir=ДИРЕКТОРИЯ)"
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "използване на указаната ПРОГРАМА"
 
-#: builtin/init-db.c:568
-#, c-format
-msgid "Cannot access work tree '%s'"
-msgstr "Работното дърво в „%s“ е недостъпно"
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr ""
+"извеждане на списък с всички ПРОГРАМи, които може да се ползват с опцията „--"
+"tool“"
 
-#: builtin/interpret-trailers.c:15
+#: builtin/difftool.c:686
 msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
 msgstr ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"Ð\9bÐ\95Ð\9aСÐ\95Ð\9cÐ\90[(=|:)СТÐ\9eÐ\99Ð\9dÐ\9eСТ])â\80¦] [ФÐ\90Ð\99Ð\9bâ\80¦]"
+"„git-difftool“ да спре работа, когато стартираната ПРОГРАМА завърши с "
+"ненÑ\83лев ÐºÐ¾Ð´"
 
-#: builtin/interpret-trailers.c:26
-msgid "edit files in place"
-msgstr "диÑ\80екÑ\82но Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\84айловеÑ\82е"
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "Ð\9aÐ\9eÐ\9cÐ\90Ð\9dÐ\94Ð\90"
 
-#: builtin/interpret-trailers.c:27
-msgid "trim empty trailers"
-msgstr "изÑ\87иÑ\81Ñ\82ване Ð½Ð° Ð¿Ñ\80азниÑ\82е ÐµÐ¿Ð¸Ð»Ð¾Ð·и"
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "команда Ð·Ð° Ñ\80азглеждане Ð½Ð° Ñ\80азлики"
 
-#: builtin/interpret-trailers.c:28
-msgid "trailer"
-msgstr "епилог"
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "не Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð° Ð¿Ñ\80огÑ\80ама Ð·Ð° â\80\9e--tool=Ð\9fРÐ\9eÐ\93РÐ\90Ð\9cÐ\90â\80\9c"
 
-#: builtin/interpret-trailers.c:29
-msgid "trailer(s) to add"
-msgstr "епилог(зи) Ð·Ð° Ð´Ð¾Ð±Ð°Ð²Ñ\8fне"
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "не Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Ð·Ð° â\80\9e--extcmd=Ð\9aÐ\9eÐ\9cÐ\90Ð\9dÐ\94Ð\90â\80\9c"
 
-#: builtin/interpret-trailers.c:42
-msgid "no input file given for in-place editing"
-msgstr "не е зададен входен файл за редактиране на място"
+#: builtin/fast-export.c:25
+msgid "git fast-export [rev-list-opts]"
+msgstr "git fast-export [ОПЦИИ_ЗА_СПИСЪКА_С_ВЕРСИИ]"
 
-#: builtin/log.c:43
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
-msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]"
+#: builtin/fast-export.c:980
+msgid "show progress after <n> objects"
+msgstr "Съобщение за напредъка на всеки такъв БРОЙ обекта"
 
-#: builtin/log.c:44
-msgid "git show [<options>] <object>..."
-msgstr "git show [ОПЦИЯ…] ОБЕКТ…"
+#: builtin/fast-export.c:982
+msgid "select handling of signed tags"
+msgstr "Как да се обработват подписаните етикети"
 
-#: builtin/log.c:83
-#, c-format
-msgid "invalid --decorate option: %s"
-msgstr "неправилна опция „--decorate“: %s"
+#: builtin/fast-export.c:985
+msgid "select handling of tags that tag filtered objects"
+msgstr "Как да се обработват етикетите на филтрираните обекти"
 
-#: builtin/log.c:137
-msgid "suppress diff output"
-msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ñ\80азликиÑ\82е"
+#: builtin/fast-export.c:988
+msgid "Dump marks to this file"
+msgstr "Ð\97апазване Ð½Ð° Ð¼Ð°Ñ\80кеÑ\80иÑ\82е Ð² Ñ\82ози Ð¤Ð\90Ð\99Ð\9b"
 
-#: builtin/log.c:138
-msgid "show source"
-msgstr "извеждане Ð½Ð° Ð¸Ð·Ñ\85одниÑ\8f ÐºÐ¾Ð´"
+#: builtin/fast-export.c:990
+msgid "Import marks from this file"
+msgstr "Ð\92наÑ\81Ñ\8fне Ð½Ð° Ð¼Ð°Ñ\80кеÑ\80иÑ\82е Ð¾Ñ\82 Ñ\82ози Ð¤Ð\90Ð\99Ð\9b"
 
-#: builtin/log.c:139
-msgid "Use mail map file"
-msgstr ""
-"Използване на файл за съответствията на имената и адресите на е-поща („."
-"mailmap“)"
+#: builtin/fast-export.c:992
+msgid "Fake a tagger when tags lack one"
+msgstr "Да се използва изкуствено име на човек при липса на задаващ етикета"
 
-#: builtin/log.c:140
-msgid "decorate options"
-msgstr "наÑ\81Ñ\82Ñ\80ойки Ð½Ð° Ñ\84оÑ\80маÌ\80Ñ\82а Ð½Ð° Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ð°Ñ\82а Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f"
+#: builtin/fast-export.c:994
+msgid "Output full tree for each commit"
+msgstr "Ð\98звеждане Ð½Ð° Ñ\86Ñ\8fлоÑ\82о Ð´Ñ\8aÑ\80во Ð·Ð° Ð²Ñ\81Ñ\8fко Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/log.c:143
-msgid "Process line range n,m in file, counting from 1"
-msgstr ""
-"Обработване само на редовете във файла в интервала от n до m включително. "
-"Броенето започва от 1"
+#: builtin/fast-export.c:996
+msgid "Use the done feature to terminate the stream"
+msgstr "Използване на маркер за завършване на потока"
 
-#: builtin/log.c:239
-#, c-format
-msgid "Final output: %d %s\n"
-msgstr "Резултат: %d %s\n"
+#: builtin/fast-export.c:997
+msgid "Skip output of blob data"
+msgstr "Без извеждане на съдържанието на обектите BLOB"
 
-#: builtin/log.c:471
-#, c-format
-msgid "git show %s: bad file"
-msgstr "git show %s: повреден файл"
+#: builtin/fast-export.c:998
+msgid "refspec"
+msgstr "УКАЗАТЕЛ_НА_ВЕРСИЯ"
 
-#: builtin/log.c:485 builtin/log.c:578
-#, c-format
-msgid "Could not read object %s"
-msgstr "Обектът не може да бъде прочетен: %s"
+#: builtin/fast-export.c:999
+msgid "Apply refspec to exported refs"
+msgstr "Прилагане на УКАЗАТЕЛя_НА_ВЕРСИЯ към изнесените указатели"
 
-#: builtin/log.c:602
-#, c-format
-msgid "Unknown type: %d"
-msgstr "Неизвестен вид: %d"
+#: builtin/fast-export.c:1000
+msgid "anonymize output"
+msgstr "анонимизиране на извежданата информация"
 
-#: builtin/log.c:722
-msgid "format.headers without value"
-msgstr "не е зададена стойност на „format.headers“"
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr "git fetch [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
 
-#: builtin/log.c:812
-msgid "name of output directory is too long"
-msgstr "прекалено дълго име на директорията за изходната информация"
+#: builtin/fetch.c:22
+msgid "git fetch [<options>] <group>"
+msgstr "git fetch [ОПЦИЯ…] ГРУПА"
 
-#: builtin/log.c:827
-#, c-format
-msgid "Cannot open patch file %s"
-msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
+#: builtin/fetch.c:23
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)…]"
 
-#: builtin/log.c:841
-msgid "Need exactly one range."
-msgstr "Трябва да зададете точно един диапазон."
+#: builtin/fetch.c:24
+msgid "git fetch --all [<options>]"
+msgstr "git fetch --all [ОПЦИЯ…]"
 
-#: builtin/log.c:851
-msgid "Not a range."
-msgstr "Ð\9dе Ðµ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½."
+#: builtin/fetch.c:95 builtin/pull.c:175
+msgid "fetch from all remotes"
+msgstr "доÑ\81Ñ\82авÑ\8fне Ð¾Ñ\82 Ð²Ñ\81иÑ\87ки Ð¾Ñ\82далеÑ\87ени Ñ\85Ñ\80анилиÑ\89а"
 
-#: builtin/log.c:957
-msgid "Cover letter needs email format"
-msgstr "Ð\9fÑ\80идÑ\80Ñ\83жаваÑ\89оÑ\82о Ð¿Ð¸Ñ\81мо Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ðµ Ñ\84оÑ\80маÑ\82иÑ\80ано ÐºÐ°Ñ\82о Ðµ-пиÑ\81мо"
+#: builtin/fetch.c:97 builtin/pull.c:178
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr "добавÑ\8fне ÐºÑ\8aм â\80\9e.git/FETCH_HEADâ\80\9c Ð²Ð¼ÐµÑ\81Ñ\82о Ð·Ð°Ð¼Ñ\8fна"
 
-# FIXME bad wording insanely
-#: builtin/log.c:1036
-#, c-format
-msgid "insane in-reply-to: %s"
-msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
+#: builtin/fetch.c:99 builtin/pull.c:181
+msgid "path to upload pack on remote end"
+msgstr "отдалечен път, където да се качи пакетът"
 
-#: builtin/log.c:1064
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
-msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
+#: builtin/fetch.c:100 builtin/pull.c:183
+msgid "force overwrite of local branch"
+msgstr "принудително презаписване на локалния клон"
 
-#: builtin/log.c:1109
-msgid "Two output directories?"
-msgstr "Ð\9cожеÑ\82е Ð´Ð° Ñ\83кажеÑ\82е Ð¼Ð°ÐºÑ\81имÑ\83м ÐµÐ´Ð½Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð·Ð° Ð¸Ð·Ñ\85од."
+#: builtin/fetch.c:102
+msgid "fetch from multiple remotes"
+msgstr "доÑ\81Ñ\82авÑ\8fне Ð¾Ñ\82 Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82во Ð¾Ñ\82далеÑ\87ени Ñ\85Ñ\80анилиÑ\89а"
 
-#: builtin/log.c:1216 builtin/log.c:1857 builtin/log.c:1859 builtin/log.c:1871
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Непознато подаване „%s“"
+#: builtin/fetch.c:104 builtin/pull.c:185
+msgid "fetch all tags and associated objects"
+msgstr "доставяне на всички етикети и принадлежащи обекти"
 
-#: builtin/log.c:1226 builtin/notes.c:253 builtin/notes.c:304
-#: builtin/notes.c:306 builtin/notes.c:369 builtin/notes.c:424
-#: builtin/notes.c:510 builtin/notes.c:515 builtin/notes.c:593
-#: builtin/notes.c:656 builtin/notes.c:881 builtin/tag.c:455
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
-msgstr "Не може да се открие към какво сочи „%s“."
+#: builtin/fetch.c:106
+msgid "do not fetch all tags (--no-tags)"
+msgstr "без доставянето на всички етикети „--no-tags“"
 
-#: builtin/log.c:1231
-msgid "Could not find exact merge base."
-msgstr "ТоÑ\87наÑ\82а Ð±Ð°Ð·Ð° Ð·Ð° Ñ\81ливане Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82кÑ\80ие."
+#: builtin/fetch.c:108
+msgid "number of submodules fetched in parallel"
+msgstr "бÑ\80ой Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли Ð´Ð¾Ñ\81Ñ\82авени Ð¿Ð°Ñ\80алелно"
 
-#: builtin/log.c:1235
-msgid ""
-"Failed to get upstream, if you want to record base commit automatically,\n"
-"please use git branch --set-upstream-to to track a remote branch.\n"
-"Or you could specify base commit by --base=<base-commit-id> manually."
-msgstr ""
-"Следеният клон не може да бъде установен. Ако искате ръчно да го\n"
-"зададете, използвайте „git branch --set-upstream-to“.\n"
-"Можете ръчно да зададете базово подаване чрез „--base=<base-commit-id>“."
+#: builtin/fetch.c:110 builtin/pull.c:188
+msgid "prune remote-tracking branches no longer on remote"
+msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони"
 
-#: builtin/log.c:1255
-msgid "Failed to find exact merge base"
-msgstr "ТоÑ\87наÑ\82а Ð±Ð°Ð·Ð° Ð¿Ñ\80и Ñ\81ливане Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82а"
+#: builtin/fetch.c:111 builtin/pull.c:191
+msgid "on-demand"
+msgstr "Ð\9fРÐ\98 Ð\9dУÐ\96Ð\94Ð\90"
 
-#: builtin/log.c:1266
-msgid "base commit should be the ancestor of revision list"
-msgstr "базовото подаване трябва да е предшественикът на списъка с версиите"
+#: builtin/fetch.c:112 builtin/pull.c:192
+msgid "control recursive fetching of submodules"
+msgstr "управление на рекурсивното доставяне на подмодулите"
 
-#: builtin/log.c:1270
-msgid "base commit shouldn't be in revision list"
-msgstr "базовоÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ð² Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð²ÐµÑ\80Ñ\81ииÑ\82е"
+#: builtin/fetch.c:116 builtin/pull.c:200
+msgid "keep downloaded pack"
+msgstr "запазване Ð½Ð° Ð¸Ð·Ñ\82еглениÑ\82е Ð¿Ð°ÐºÐµÑ\82и Ñ\81 Ð¾Ð±ÐµÐºÑ\82и"
 
-#: builtin/log.c:1319
-msgid "cannot get patch id"
-msgstr "иденÑ\82иÑ\84икаÑ\82оÑ\80Ñ\8aÑ\82 Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾Ð»Ñ\83Ñ\87ен"
+#: builtin/fetch.c:118
+msgid "allow updating of HEAD ref"
+msgstr "позволÑ\8fване Ð½Ð° Ð¾Ð±Ð½Ð¾Ð²Ñ\8fванеÑ\82о Ð½Ð° Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c"
 
-#: builtin/log.c:1377
-msgid "use [PATCH n/m] even with a single patch"
-msgstr "номеÑ\80аÑ\86иÑ\8f â\80\9e[PATCH n/m]â\80\9c Ð´Ð¾Ñ\80и Ð¸ Ð¿Ñ\80и ÐµÐ´Ð¸Ð½Ñ\81Ñ\82вена ÐºÑ\80Ñ\8aпка"
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
+msgid "deepen history of shallow clone"
+msgstr "задÑ\8aлбоÑ\87аване Ð½Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ð¿Ð»Ð¸Ñ\82ко Ñ\85Ñ\80анилиÑ\89е"
 
-#: builtin/log.c:1380
-msgid "use [PATCH] even with multiple patches"
-msgstr "номеÑ\80аÑ\86иÑ\8f â\80\9e[PATCH]â\80\9c Ð´Ð¾Ñ\80и Ð¸ Ð¿Ñ\80и Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82во ÐºÑ\80Ñ\8aпки"
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "задÑ\8aлбоÑ\87аване Ð½Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ð¿Ð»Ð¸Ñ\82ко Ñ\85Ñ\80анилиÑ\89е Ð´Ð¾ Ð¾Ð¿Ñ\80еделено Ð²Ñ\80еме"
 
-#: builtin/log.c:1384
-msgid "print patches to standard out"
-msgstr "извеждане Ð½Ð° ÐºÑ\80Ñ\8aпкиÑ\82е Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð¸Ð·Ñ\85од"
+#: builtin/fetch.c:129 builtin/pull.c:206
+msgid "convert to a complete repository"
+msgstr "пÑ\80евÑ\80Ñ\8aÑ\89ане Ð² Ð¿Ñ\8aлно Ñ\85Ñ\80анилиÑ\89е"
 
-#: builtin/log.c:1386
-msgid "generate a cover letter"
-msgstr "създаване на придружаващо писмо"
+#: builtin/fetch.c:131 builtin/log.c:1440
+msgid "dir"
+msgstr "директория"
 
-#: builtin/log.c:1388
-msgid "use simple number sequence for output file names"
-msgstr "пÑ\80оÑ\81Ñ\82а Ñ\87иÑ\81лова Ð¿Ð¾Ñ\81ледоваÑ\82елноÑ\81Ñ\82 Ð·Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° Ñ\84айловеÑ\82е-кÑ\80Ñ\8aпки"
+#: builtin/fetch.c:132
+msgid "prepend this to submodule path output"
+msgstr "добавÑ\8fне Ð½Ð° Ñ\82ова Ð¿Ñ\80ед Ð¿Ñ\8aÑ\82Ñ\8f Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла"
 
-#: builtin/log.c:1389
-msgid "sfx"
-msgstr "ЗНАЦИ"
+#: builtin/fetch.c:135
+msgid "default mode for recursion"
+msgstr "стандартен режим на рекурсия"
 
-#: builtin/log.c:1390
-msgid "use <sfx> instead of '.patch'"
-msgstr "използване Ð½Ð° Ñ\82ези Ð\97Ð\9dÐ\90ЦÐ\98 Ð·Ð° Ñ\81Ñ\83Ñ\84икÑ\81 Ð²Ð¼ÐµÑ\81Ñ\82о â\80\9e.patch“"
+#: builtin/fetch.c:137 builtin/pull.c:209
+msgid "accept refs that update .git/shallow"
+msgstr "пÑ\80иемане Ð½Ð° Ñ\83казаÑ\82ели, ÐºÐ¾Ð¸Ñ\82о Ð¾Ð±Ð½Ð¾Ð²Ñ\8fваÑ\82 â\80\9e.git/shallow“"
 
-#: builtin/log.c:1392
-msgid "start numbering patches at <n> instead of 1"
-msgstr "номеÑ\80иÑ\80анеÑ\82о Ð½Ð° ÐºÑ\80Ñ\8aпкиÑ\82е Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87ва Ð¾Ñ\82 Ñ\82ози Ð\91РÐ\9eÐ\99, Ð° Ð½Ðµ Ñ\81 1"
+#: builtin/fetch.c:138 builtin/pull.c:211
+msgid "refmap"
+msgstr "Ð\9aÐ\90РТÐ\90_С_УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9bÐ\98"
 
-#: builtin/log.c:1394
-msgid "mark the series as Nth re-roll"
-msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
+#: builtin/fetch.c:139 builtin/pull.c:212
+msgid "specify fetch refmap"
+msgstr "указване на КАРТАта_С_УКАЗАТЕЛИ за доставяне"
 
-#: builtin/log.c:1396
-msgid "Use [<prefix>] instead of [PATCH]"
-msgstr "Ð\98зползване Ð½Ð° Ñ\82ози â\80\9e\9fРÐ\95ФÐ\98Ð\9aС]â\80\9c Ð²Ð¼ÐµÑ\81Ñ\82о â\80\9e[PATCH]â\80\9c"
+#: builtin/fetch.c:395
+msgid "Couldn't find remote ref HEAD"
+msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eHEADâ\80\9c Ð² Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82кÑ\80иÑ\82"
 
-#: builtin/log.c:1399
-msgid "store resulting files in <dir>"
-msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
+#: builtin/fetch.c:513
+#, c-format
+msgid "configuration fetch.output contains invalid value %s"
+msgstr "настройката „fetch.output“ е с неправилна стойност „%s“"
 
-#: builtin/log.c:1402
-msgid "don't strip/add [PATCH]"
-msgstr "без добавяне/махане на префикса „[PATCH]“"
+#: builtin/fetch.c:606
+#, c-format
+msgid "object %s not found"
+msgstr "обектът „%s“ липсва"
 
-#: builtin/log.c:1405
-msgid "don't output binary diffs"
-msgstr "без извеждане на разлики между двоични файлове"
+#: builtin/fetch.c:610
+msgid "[up to date]"
+msgstr "[актуализиран]"
 
-#: builtin/log.c:1407
-msgid "output all-zero hash in From header"
-msgstr "в заглавната част „From:“ (от) хешът да е само от нули"
+#: builtin/fetch.c:623 builtin/fetch.c:703
+msgid "[rejected]"
+msgstr "[отхвърлен]"
 
-#: builtin/log.c:1409
-msgid "don't include a patch matching a commit upstream"
-msgstr "да Ð½Ðµ Ñ\81е Ð²ÐºÐ»Ñ\8eÑ\87ваÑ\82 ÐºÑ\80Ñ\8aпки, ÐºÐ¾Ð¸Ñ\82о Ð¿Ñ\80иÑ\81Ñ\8aÑ\81Ñ\82ваÑ\82 Ð² Ñ\81ледениÑ\8f ÐºÐ»Ð¾Ð½"
+#: builtin/fetch.c:624
+msgid "can't fetch in current branch"
+msgstr "в Ñ\82екÑ\83Ñ\89иÑ\8f ÐºÐ»Ð¾Ð½ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´Ð¾Ñ\81Ñ\82авÑ\8f"
 
-#: builtin/log.c:1411
-msgid "show patch format instead of default (patch + stat)"
-msgstr ""
-"извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
+#: builtin/fetch.c:633
+msgid "[tag update]"
+msgstr "[обновяване на етикетите]"
 
-#: builtin/log.c:1413
-msgid "Messaging"
-msgstr "Опции при изпращане"
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
+msgid "unable to update local ref"
+msgstr "локален указател не може да бъде обновен"
 
-#: builtin/log.c:1414
-msgid "header"
-msgstr "ЗАГЛАВНА_ЧАСТ"
+#: builtin/fetch.c:653
+msgid "[new tag]"
+msgstr "[нов етикет]"
 
-#: builtin/log.c:1415
-msgid "add email header"
-msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
+#: builtin/fetch.c:656
+msgid "[new branch]"
+msgstr "[нов клон]"
 
-#: builtin/log.c:1416 builtin/log.c:1418
-msgid "email"
-msgstr "Е-ПОЩА"
+#: builtin/fetch.c:659
+msgid "[new ref]"
+msgstr "[нов указател]"
 
-#: builtin/log.c:1416
-msgid "add To: header"
-msgstr "добавÑ\8fне Ð½Ð° Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð° Ñ\87аÑ\81Ñ\82 â\80\9eTo:â\80\9c (до)"
+#: builtin/fetch.c:698
+msgid "forced update"
+msgstr "пÑ\80инÑ\83диÑ\82елно Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване"
 
-#: builtin/log.c:1418
-msgid "add Cc: header"
-msgstr "добавяне на заглавна част „Cc:“ (и до)"
+#: builtin/fetch.c:703
+msgid "non-fast-forward"
+msgstr "същинско сливане"
 
-#: builtin/log.c:1420
-msgid "ident"
-msgstr "ИДЕНТИЧНОСТ"
+#: builtin/fetch.c:748
+#, c-format
+msgid "%s did not send all necessary objects\n"
+msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
 
-#: builtin/log.c:1421
-msgid "set From address to <ident> (or committer ident if absent)"
+#: builtin/fetch.c:768
+#, c-format
+msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
-"задаване Ð½Ð° Ð°Ð´Ñ\80еÑ\81а Ð² Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ\82а Ñ\87аÑ\81Ñ\82 â\80\9eFromâ\80\9c (оÑ\82) Ð´Ð° Ðµ Ñ\82ази Ð\98Ð\94Ð\95Ð\9dТÐ\98ЧÐ\9dÐ\9eСТ. Ð\90ко "
-"не Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð° Ñ\82акава, Ñ\81е Ð²Ð·Ð¸Ð¼Ð° Ð°Ð´Ñ\80еÑ\81а Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ñ\89иÑ\8f"
+"оÑ\82Ñ\85вÑ\8aÑ\80лÑ\8fне Ð½Ð° Ð²Ñ\8aÑ\80Ñ\85а â\80\9e%sâ\80\9c, Ð·Ð°Ñ\89оÑ\82о Ð¿Ð»Ð¸Ñ\82киÑ\82е Ñ\85Ñ\80анилиÑ\89а Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 "
+"обновÑ\8fвани"
 
-#: builtin/log.c:1423
-msgid "message-id"
-msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
+#: builtin/fetch.c:855 builtin/fetch.c:951
+#, c-format
+msgid "From %.*s\n"
+msgstr "От %.*s\n"
 
-#: builtin/log.c:1424
-msgid "make first mail a reply to <message-id>"
+#: builtin/fetch.c:866
+#, c-format
+msgid ""
+"some local refs could not be updated; try running\n"
+" 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
-"първото съобщение да е в отговор на е-писмото с този "
-"ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
+"някои локални указатели не могат да бъдат обновени.  Изпълнете командата\n"
+"„git remote prune %s“, за да премахнете остарелите клони, които\n"
+"предизвикват конфликта"
 
-#: builtin/log.c:1425 builtin/log.c:1428
-msgid "boundary"
-msgstr "граница"
+#: builtin/fetch.c:921
+#, c-format
+msgid "   (%s will become dangling)"
+msgstr "   (обектът „%s“ ще се окаже извън клон)"
 
-#: builtin/log.c:1426
-msgid "attach the patch"
-msgstr "прикрепяне на кръпката"
+#: builtin/fetch.c:922
+#, c-format
+msgid "   (%s has become dangling)"
+msgstr "   (обектът „%s“ вече е извън клон)"
 
-#: builtin/log.c:1429
-msgid "inline the patch"
-msgstr "включване на кръпката в текста на писмата"
+#: builtin/fetch.c:954
+msgid "[deleted]"
+msgstr "[изтрит]"
 
-#: builtin/log.c:1433
-msgid "enable message threading, styles: shallow, deep"
-msgstr ""
-"използване на нишки за съобщенията. СТИЛът е „shallow“ (плитък) или "
-"„deep“ (дълбок)"
+#: builtin/fetch.c:955 builtin/remote.c:1022
+msgid "(none)"
+msgstr "(нищо)"
 
-#: builtin/log.c:1435
-msgid "signature"
-msgstr "подпис"
+#: builtin/fetch.c:978
+#, c-format
+msgid "Refusing to fetch into current branch %s of non-bare repository"
+msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо"
 
-#: builtin/log.c:1436
-msgid "add a signature"
-msgstr "добавяне на поле за подпис"
+#: builtin/fetch.c:997
+#, c-format
+msgid "Option \"%s\" value \"%s\" is not valid for %s"
+msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
 
-#: builtin/log.c:1437
-msgid "base-commit"
-msgstr "БАЗОВО_ПОДАВАНЕ"
+#: builtin/fetch.c:1000
+#, c-format
+msgid "Option \"%s\" is ignored for %s\n"
+msgstr "Опцията „%s“ се прескача при „%s“\n"
 
-#: builtin/log.c:1438
-msgid "add prerequisite tree info to the patch series"
-msgstr "добавяне на необходимото БАЗово дърво към серията кръпки"
+#: builtin/fetch.c:1076
+#, c-format
+msgid "Don't know how to fetch from %s"
+msgstr "Не се поддържа доставяне от „%s“"
 
-#: builtin/log.c:1440
-msgid "add a signature from a file"
-msgstr "добавяне на подпис от файл"
+#: builtin/fetch.c:1236
+#, c-format
+msgid "Fetching %s\n"
+msgstr "Доставяне на „%s“\n"
 
-#: builtin/log.c:1441
-msgid "don't print the patch filenames"
-msgstr "без извеждане на имената на кръпките"
+#: builtin/fetch.c:1238 builtin/remote.c:96
+#, c-format
+msgid "Could not fetch %s"
+msgstr "„%s“ не може да се достави"
 
-#: builtin/log.c:1531
-msgid "-n and -k are mutually exclusive."
-msgstr "опциите „-n“ и „-k“ са несъвместими."
+#: builtin/fetch.c:1256
+msgid ""
+"No remote repository specified.  Please, specify either a URL or a\n"
+"remote name from which new revisions should be fetched."
+msgstr ""
+"Не сте указали отдалечено хранилище.  Задайте или адрес, или име\n"
+"на отдалечено хранилище, откъдето да се доставят новите версии."
 
-#: builtin/log.c:1533
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "опÑ\86ииÑ\82е â\80\9e--subject-prefixâ\80\9c Ð¸ â\80\9e-kâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими."
+#: builtin/fetch.c:1279
+msgid "You need to specify a tag name."
+msgstr "ТÑ\80Ñ\8fбва Ð´Ð° Ñ\83кажеÑ\82е Ð¸Ð¼Ðµ Ð½Ð° ÐµÑ\82икеÑ\82."
 
-#: builtin/log.c:1541
-msgid "--name-only does not make sense"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--name-onlyâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð³ÐµÐ½ÐµÑ\80иÑ\80анеÑ\82о Ð½Ð° ÐºÑ\80Ñ\8aпки"
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "Ð\9eÑ\82Ñ\80иÑ\86аÑ\82елна Ð´Ñ\8aлбоÑ\87ина ÐºÐ°Ñ\82о Ð°Ñ\80гÑ\83менÑ\82 Ð½Ð° â\80\9e--deepenâ\80\9c Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа"
 
-#: builtin/log.c:1543
-msgid "--name-status does not make sense"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--name-statusâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð³ÐµÐ½ÐµÑ\80иÑ\80анеÑ\82о Ð½Ð° ÐºÑ\80Ñ\8aпки"
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--deepenâ\80\9c Ð¸ â\80\9e--depthâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими ÐµÐ´Ð½Ð° Ñ\81 Ð´Ñ\80Ñ\83га"
 
-#: builtin/log.c:1545
-msgid "--check does not make sense"
-msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
+#: builtin/fetch.c:1328
+msgid "--depth and --unshallow cannot be used together"
+msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
 
-#: builtin/log.c:1573
-msgid "standard output, or directory, which one?"
-msgstr ""
-"изходът може да или стандартният, или да е в директория, но не и двете."
+#: builtin/fetch.c:1330
+msgid "--unshallow on a complete repository does not make sense"
+msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
 
-#: builtin/log.c:1575
-#, c-format
-msgid "Could not create directory '%s'"
-msgstr "Директорията „%s“ не може да бъде създадена"
+#: builtin/fetch.c:1352
+msgid "fetch --all does not take a repository argument"
+msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
 
-#: builtin/log.c:1672
-#, c-format
-msgid "unable to read signature file '%s'"
-msgstr "файлът „%s“ с подпис не може да бъде прочетен"
+#: builtin/fetch.c:1354
+msgid "fetch --all does not make sense with refspecs"
+msgstr ""
+"към „git fetch --all“ не можете да добавите аргумент — указател на версия"
 
-#: builtin/log.c:1743
-msgid "Failed to create output files"
-msgstr "Изходните файлове не могат да бъдат създадени"
+#: builtin/fetch.c:1365
+#, c-format
+msgid "No such remote or remote group: %s"
+msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
 
-#: builtin/log.c:1792
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
+#: builtin/fetch.c:1373
+msgid "Fetching a group and specifying refspecs does not make sense"
+msgstr "Указването на група и указването на версия са несъвместими"
 
-#: builtin/log.c:1846
-#, c-format
+#: builtin/fmt-merge-msg.c:14
 msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr ""
-"Следеният отдалечен клон не бе открит, затова изрично задайте "
-"ОТДАЛЕЧЕН_КЛОН.\n"
+"git fmt-merge-msg [-m СЪОБЩЕНИЕ] [--log[=БРОЙ] | --no-log] [--file ФАЙЛ]"
 
-#: builtin/ls-files.c:378
-msgid "git ls-files [<options>] [<file>...]"
-msgstr "git ls-files [ОПЦИЯ…] [ФАЙЛ…]"
+#: builtin/fmt-merge-msg.c:663
+msgid "populate log with at most <n> entries from shortlog"
+msgstr ""
+"вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения "
+"журнал"
 
-#: builtin/ls-files.c:427
-msgid "identify the file status with tags"
-msgstr "извеждане на състоянието на файловете с еднобуквени флагове"
+#: builtin/fmt-merge-msg.c:666
+msgid "alias for --log (deprecated)"
+msgstr "синоним на „--log“ (остаряло)"
 
-#: builtin/ls-files.c:429
-msgid "use lowercase letters for 'assume unchanged' files"
-msgstr "малки Ð±Ñ\83кви Ð·Ð° Ñ\84айловеÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ñ\81е Ñ\81Ñ\87еÑ\82аÑ\82 Ð·Ð° Ð½ÐµÐ¿Ñ\80оменени"
+#: builtin/fmt-merge-msg.c:669
+msgid "text"
+msgstr "ТÐ\95Ð\9aСТ"
 
-#: builtin/ls-files.c:431
-msgid "show cached files in the output (default)"
-msgstr "извеждане Ð½Ð° ÐºÐµÑ\88иÑ\80аниÑ\82е Ñ\84айлове (Ñ\81Ñ\82андаÑ\80Ñ\82но)"
+#: builtin/fmt-merge-msg.c:670
+msgid "use <text> as start of message"
+msgstr "за Ð½Ð°Ñ\87ало Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð° Ð¢Ð\95Ð\9aСТ"
 
-#: builtin/ls-files.c:433
-msgid "show deleted files in the output"
-msgstr "извеждане на изтритите файлове"
+#: builtin/fmt-merge-msg.c:671
+msgid "file to read from"
+msgstr "файл, от който да се чете"
 
-#: builtin/ls-files.c:435
-msgid "show modified files in the output"
-msgstr "извеждане на променените файлове"
+#: builtin/for-each-ref.c:9
+msgid "git for-each-ref [<options>] [<pattern>]"
+msgstr "git for-each-ref [ОПЦИЯ…] [ШАБЛОН]"
 
-#: builtin/ls-files.c:437
-msgid "show other files in the output"
-msgstr "извеждане на другите файлове"
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points ОБЕКТ]"
 
-#: builtin/ls-files.c:439
-msgid "show ignored files in the output"
-msgstr "извеждане на игнорираните файлове"
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref[(--merged | --no-merged) [ПОДАВАНЕ]]"
 
-#: builtin/ls-files.c:442
-msgid "show staged contents' object name in the output"
-msgstr "извеждане на името на обекта за съдържанието на индекса"
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr "git for-each-ref [--contains [ПОДАВАНЕ]] [--no-contains [ПОДАВАНЕ]]"
 
-#: builtin/ls-files.c:444
-msgid "show files on the filesystem that need to be removed"
-msgstr "извеждане на файловете, които трябва да бъдат изтрити"
+#: builtin/for-each-ref.c:27
+msgid "quote placeholders suitably for shells"
+msgstr "цитиране подходящо за командни интерпретатори на обвивката"
 
-#: builtin/ls-files.c:446
-msgid "show 'other' directories' names only"
-msgstr "извеждане само на името на другите (неследените) директории"
+#: builtin/for-each-ref.c:29
+msgid "quote placeholders suitably for perl"
+msgstr "цитиране подходящо за perl"
 
-#: builtin/ls-files.c:448
-msgid "show line endings of files"
-msgstr "извеждане на знаците за край на ред във файловете"
+#: builtin/for-each-ref.c:31
+msgid "quote placeholders suitably for python"
+msgstr "цитиране подходящо за python"
 
-#: builtin/ls-files.c:450
-msgid "don't show empty directories"
-msgstr "без извеждане на празните директории"
+#: builtin/for-each-ref.c:33
+msgid "quote placeholders suitably for Tcl"
+msgstr "цитиране подходящо за tcl"
 
-#: builtin/ls-files.c:453
-msgid "show unmerged files in the output"
-msgstr "извеждане на неслетите файлове"
+#: builtin/for-each-ref.c:36
+msgid "show only <n> matched refs"
+msgstr "извеждане само на този БРОЙ напаснати указатели"
 
-# FIXME not clear about what this option does
-#: builtin/ls-files.c:455
-msgid "show resolve-undo information"
-msgstr "извеждане на информацията за отмяна на разрешените подавания"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "извеждане само на указателите, сочещи към ОБЕКТА"
 
-#: builtin/ls-files.c:457
-msgid "skip files matching pattern"
-msgstr "пÑ\80еÑ\81каÑ\87ане Ð½Ð° Ñ\84айловеÑ\82е Ð½Ð°Ð¿Ð°Ñ\81ваÑ\89и Ð¨Ð\90Ð\91Ð\9bÐ\9eÐ\9dа"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\81леÑ\82иÑ\82е Ñ\83казаÑ\82ели"
 
-#: builtin/ls-files.c:460
-msgid "exclude patterns are read from <file>"
-msgstr "шаблоните за игнориране да се прочетат от този ФАЙЛ"
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "извеждане само на неслетите указатели"
 
-#: builtin/ls-files.c:463
-msgid "read additional per-directory exclude patterns in <file>"
-msgstr ""
-"изчитане на допълнителните шаблони за игнориране по директория от този ФАЙЛ"
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "извеждане само на указателите, които съдържат това ПОДАВАНЕ"
 
-#: builtin/ls-files.c:465
-msgid "add the standard git exclusions"
-msgstr "добавÑ\8fне Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ð¾Ñ\82 Git Ñ\84айлове"
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\83казаÑ\82елиÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ñ\82ова Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
-#: builtin/ls-files.c:468
-msgid "make the output relative to the project top directory"
-msgstr "пÑ\8aÑ\82иÑ\89аÑ\82а Ð´Ð° Ñ\81а Ð¾Ñ\82ноÑ\81иÑ\82елни Ñ\81пÑ\80Ñ\8fмо Ð¾Ñ\81новнаÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð½Ð° Ð¿Ñ\80оекÑ\82а"
+#: builtin/fsck.c:554
+msgid "Checking object directories"
+msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80ииÑ\82е Ñ\81 Ð¾Ð±ÐµÐºÑ\82и"
 
-#: builtin/ls-files.c:471
-msgid "if any <file> is not in the index, treat this as an error"
-msgstr "грешка, ако някой от тези ФАЙЛове не е в индекса"
+#: builtin/fsck.c:646
+msgid "git fsck [<options>] [<object>...]"
+msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
 
-#: builtin/ls-files.c:472
-msgid "tree-ish"
-msgstr "УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9b\9aЪÐ\9c\94ЪРÐ\92Ð\9e"
+#: builtin/fsck.c:652
+msgid "show unreachable objects"
+msgstr "показване Ð½Ð° Ð½ÐµÐ´Ð¾Ñ\81Ñ\82ижимиÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
 
-#: builtin/ls-files.c:473
-msgid "pretend that paths removed since <tree-ish> are still present"
-msgstr ""
-"считане, че пътищата изтрити след УКАЗАТЕЛя_КЪМ_ДЪРВО все още съществуват"
+#: builtin/fsck.c:653
+msgid "show dangling objects"
+msgstr "показване на обектите извън клоните"
 
-#: builtin/ls-files.c:475
-msgid "show debugging data"
-msgstr "извеждане Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8fÑ\82а Ð·Ð° Ð¸Ð·Ñ\87иÑ\81Ñ\82ване Ð½Ð° Ð³Ñ\80еÑ\88ки"
+#: builtin/fsck.c:654
+msgid "report tags"
+msgstr "показване Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е"
 
-#: builtin/ls-remote.c:7
-msgid ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"                     [-q | --quiet] [--exit-code] [--get-url]\n"
-"                     [--symref] [<repository> [<refs>...]]"
-msgstr ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=КОМАНДА]\n"
-"                     [-q | --quiet] [--exit-code] [--get-url]\n"
-"                     [--symref] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
+#: builtin/fsck.c:655
+msgid "report root nodes"
+msgstr "показване на кореновите възли"
 
-#: builtin/ls-remote.c:50
-msgid "do not print remote URL"
-msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð°Ð´Ñ\80еÑ\81иÑ\82е Ð½Ð° Ð¾Ñ\82далеÑ\87ениÑ\82е Ñ\85Ñ\80анилиÑ\89а"
+#: builtin/fsck.c:656
+msgid "make index objects head nodes"
+msgstr "задаване Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а Ð´Ð° Ñ\81а ÐºÐ¾Ñ\80енови"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
-msgid "exec"
-msgstr "КОМАНДА"
+# FIXME bad message
+#: builtin/fsck.c:657
+msgid "make reflogs head nodes (default)"
+msgstr "проследяване на указателите от журнала като глави (стандартно)"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
-msgid "path of git-upload-pack on the remote host"
-msgstr "пÑ\8aÑ\82 ÐºÑ\8aм ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-upload-packâ\80\9c Ð½Ð° Ð¾Ñ\82далеÑ\87енаÑ\82а Ð¼Ð°Ñ\88ина"
+#: builtin/fsck.c:658
+msgid "also consider packs and alternate objects"
+msgstr "допÑ\8aлниÑ\82елно Ð´Ð° Ñ\81е Ð¿Ñ\80овеÑ\80Ñ\8fваÑ\82 Ð¿Ð°ÐºÐµÑ\82иÑ\82е Ð¸ Ð°Ð»Ñ\82еÑ\80наÑ\82ивниÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
 
-#: builtin/ls-remote.c:56
-msgid "limit to tags"
-msgstr "само етикетите"
+#: builtin/fsck.c:659
+msgid "check only connectivity"
+msgstr "проверка само на връзката"
 
-#: builtin/ls-remote.c:57
-msgid "limit to heads"
-msgstr "само върховете"
+#: builtin/fsck.c:660
+msgid "enable more strict checking"
+msgstr "по-строги проверки"
 
-#: builtin/ls-remote.c:58
-msgid "do not show peeled tags"
-msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð¿Ñ\80оÑ\81ледениÑ\82е ÐµÑ\82икеÑ\82и"
+#: builtin/fsck.c:662
+msgid "write dangling objects in .git/lost-found"
+msgstr "запазване Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ð¸Ð·Ð²Ñ\8aн ÐºÐ»Ð¾Ð½Ð¸Ñ\82е Ð² Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e.git/lost-foundâ\80\9c"
 
-#: builtin/ls-remote.c:60
-msgid "take url.<base>.insteadOf into account"
-msgstr "взимане Ð¿Ñ\80едвид Ð½Ð° â\80\9eurl.Ð\91Ð\90Ð\97Ð\90.insteadOfâ\80\9c"
+#: builtin/fsck.c:663 builtin/prune.c:107
+msgid "show progress"
+msgstr "показване Ð½Ð° Ð½Ð°Ð¿Ñ\80едÑ\8aка"
 
-#: builtin/ls-remote.c:62
-msgid "exit with exit code 2 if no matching refs are found"
-msgstr "изÑ\85од Ñ\81 ÐºÐ¾Ð´ 2, Ð°ÐºÐ¾ Ð½Ðµ Ñ\81е Ð¾Ñ\82кÑ\80иÑ\8fÑ\82 Ñ\81Ñ\8aвпадаÑ\89и Ñ\83казаÑ\82ели"
+#: builtin/fsck.c:664
+msgid "show verbose names for reachable objects"
+msgstr "показване Ð½Ð° Ð¿Ð¾Ð´Ñ\80обни Ð¸Ð¼ÐµÐ½Ð° Ð½Ð° Ð´Ð¾Ñ\81Ñ\82ижимиÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
 
-#: builtin/ls-remote.c:64
-msgid "show underlying ref in addition to the object pointed by it"
-msgstr "извеждане Ð½Ð° Ñ\83казаÑ\82елÑ\8f Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ð¾Ð±ÐµÐºÑ\82а Ñ\81оÑ\87ен Ð¾Ñ\82 Ð½ÐµÐ³Ð¾"
+#: builtin/fsck.c:725
+msgid "Checking objects"
+msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
 
-#: builtin/ls-tree.c:28
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr "git ls-tree [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
+#: builtin/gc.c:25
+msgid "git gc [<options>]"
+msgstr "git gc [ОПЦИЯ…]"
 
-#: builtin/ls-tree.c:128
-msgid "only show trees"
-msgstr "извеждане само на дървета"
+#: builtin/gc.c:78
+#, c-format
+msgid "Failed to fstat %s: %s"
+msgstr "Неуспешно изпълнение на „fstat“ върху „%s“: %s"
 
-#: builtin/ls-tree.c:130
-msgid "recurse into subtrees"
-msgstr "рекурсивно обхождане поддърветата"
+#: builtin/gc.c:310
+#, c-format
+msgid "Can't stat %s"
+msgstr "Неуспешно изпълнение на „stat“ върху „%s“"
 
-#: builtin/ls-tree.c:132
-msgid "show trees when recursing"
-msgstr "извеждане на дърветата при рекурсивното обхождане"
+#: builtin/gc.c:319
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"При последното изпълнение на „git gc“ бе докладвана грешка.  Коригирайте "
+"причината за\n"
+"нея и изтрийте „%s“.\n"
+"Автоматичното изчистване на боклука няма да работи, преди да изтриете "
+"файла.\n"
+"\n"
+"%s"
 
-#: builtin/ls-tree.c:135
-msgid "terminate entries with NUL byte"
-msgstr "разделяне на обектите с нулевия знак „NUL“"
+#: builtin/gc.c:358
+msgid "prune unreferenced objects"
+msgstr "окастряне на обектите, към които нищо не сочи"
 
-#: builtin/ls-tree.c:136
-msgid "include object size"
-msgstr "извеждане на размера на обекта"
+#: builtin/gc.c:360
+msgid "be more thorough (increased runtime)"
+msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
-msgid "list only filenames"
-msgstr "извеждане Ñ\81амо Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° Ñ\84айловеÑ\82е"
+#: builtin/gc.c:361
+msgid "enable auto-gc mode"
+msgstr "вклÑ\8eÑ\87ване Ð½Ð° Ð°Ð²Ñ\82омаÑ\82иÑ\87ноÑ\82о Ñ\81Ñ\8aбиÑ\80ане Ð½Ð° Ð±Ð¾ÐºÐ»Ñ\83ка (auto-gc)"
 
-#: builtin/ls-tree.c:143
-msgid "use full path names"
-msgstr "използване на пълните имена на пътищата"
+#: builtin/gc.c:362
+msgid "force running gc even if there may be another gc running"
+msgstr ""
+"изрично стартиране на събирането на боклука, дори и ако вече работи друго "
+"събиране"
 
-#: builtin/ls-tree.c:145
-msgid "list entire tree; not just current directory (implies --full-name)"
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "Неразпозната стойност на „gc.logexpiry“: %s"
+
+#: builtin/gc.c:407
+#, c-format
+msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
-"извеждане Ð½Ð° Ñ\86Ñ\8fлоÑ\82о Ð´Ñ\8aÑ\80во, Ð½Ðµ Ñ\81амо Ð½Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f (вклÑ\8eÑ\87ва Ð¾Ð¿Ñ\86иÑ\8fÑ\82а "
-"„--full-name“)"
+"Ð\90вÑ\82омаÑ\82иÑ\87но Ð¿Ð°ÐºÐµÑ\82иÑ\80ане Ð½Ð° Ð·Ð°Ð´ÐµÐ½ Ñ\84он Ð½Ð° Ñ\85Ñ\80анилиÑ\89еÑ\82о Ð·Ð° Ð¿Ð¾-добÑ\80а "
+"производителност.\n"
 
-#: builtin/merge.c:45
-msgid "git merge [<options>] [<commit>...]"
-msgstr "git merge [ОПЦИЯ…] [ПОДАВАНЕ…]"
+#: builtin/gc.c:409
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n"
 
-#: builtin/merge.c:46
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [ОПЦИЯ…] СЪОБЩЕНИЕ HEAD ПОДАВАНЕ"
+#: builtin/gc.c:410
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr ""
+"Погледнете ръководството за повече информация как да изпълните „git help "
+"gc“.\n"
 
-#: builtin/merge.c:47
-msgid "git merge --abort"
-msgstr "git merge --abort"
+#: builtin/gc.c:431
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+msgstr ""
+"събирането на боклука вече е стартирано на машината „%s“ с идентификатор на\n"
+"процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
+"опцията „--force“)"
 
-# FIXME -m rather than just m
-#: builtin/merge.c:101
-msgid "switch `m' requires a value"
-msgstr "опцията „-m“ изисква стойност"
+#: builtin/gc.c:475
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
+msgstr ""
+"Има прекалено много недостижими, непакетирани обекти.\n"
+"Използвайте „git prune“, за да ги окастрите."
+
+#: builtin/grep.c:25
+msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr "git grep [ОПЦИЯ…] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
 
-#: builtin/merge.c:138
+#: builtin/grep.c:232
 #, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr "Няма такава стратегия за сливане: „%s“.\n"
+msgid "grep: failed to create thread: %s"
+msgstr "grep: неуспешно създаване на нишка: %s"
 
-#: builtin/merge.c:139
+#: builtin/grep.c:290
 #, c-format
-msgid "Available strategies are:"
-msgstr "Ð\9dалиÑ\87ниÑ\82е Ñ\81Ñ\82Ñ\80аÑ\82егии Ñ\81а:"
+msgid "invalid number of threads specified (%d) for %s"
+msgstr "зададен Ðµ Ð½ÐµÐ¿Ñ\80авилен Ð±Ñ\80ой Ð½Ð¸Ñ\88ки (%d) Ð·Ð° %s"
 
-#: builtin/merge.c:144
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
-msgid "Available custom strategies are:"
-msgstr "Ð\94опÑ\8aлниÑ\82елниÑ\82е Ñ\81Ñ\82Ñ\80аÑ\82егии Ñ\81а:"
+msgid "unable to read tree (%s)"
+msgstr "дÑ\8aÑ\80воÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ено (%s)"
 
-#: builtin/merge.c:194 builtin/pull.c:126
-msgid "do not show a diffstat at the end of the merge"
-msgstr "без извеждане на статистиката след завършване на сливане"
+#: builtin/grep.c:829
+#, c-format
+msgid "unable to grep from object of type %s"
+msgstr "не може да се изпълни „grep“ от обект от вида %s"
 
-#: builtin/merge.c:197 builtin/pull.c:129
-msgid "show a diffstat at the end of the merge"
-msgstr "извеждане на статистиката след завършване на сливане"
+#: builtin/grep.c:893
+#, c-format
+msgid "switch `%c' expects a numerical value"
+msgstr "опцията „%c“ очаква число за аргумент"
 
-#: builtin/merge.c:198 builtin/pull.c:132
-msgid "(synonym to --stat)"
-msgstr "(синоним на „--stat“)"
+#: builtin/grep.c:980
+msgid "search in index instead of in the work tree"
+msgstr "търсене в индекса, а не в работното дърво"
 
-#: builtin/merge.c:200 builtin/pull.c:135
-msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr ""
-"добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
-"за подаване"
+#: builtin/grep.c:982
+msgid "find in contents not managed by git"
+msgstr "търсене и във файловете, които не са под управлението на git"
 
-#: builtin/merge.c:203 builtin/pull.c:138
-msgid "create a single commit instead of doing a merge"
-msgstr "Ñ\81Ñ\8aздаване Ð½Ð° ÐµÐ´Ð½Ð¾ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð²Ð¼ÐµÑ\81Ñ\82о Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ване Ð½Ð° Ñ\81ливане"
+#: builtin/grep.c:984
+msgid "search in both tracked and untracked files"
+msgstr "Ñ\82Ñ\8aÑ\80Ñ\81ене Ð¸ Ð² Ñ\81ледениÑ\82е, Ð¸ Ð² Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове"
 
-#: builtin/merge.c:205 builtin/pull.c:141
-msgid "perform a commit if the merge succeeds (default)"
-msgstr "извÑ\8aÑ\80Ñ\88ване Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð¿Ñ\80и Ñ\83Ñ\81пеÑ\88но Ñ\81ливане (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð´ÐµÐ¹Ñ\81Ñ\82вие)"
+#: builtin/grep.c:986
+msgid "ignore files specified via '.gitignore'"
+msgstr "игноÑ\80иÑ\80ане Ð½Ð° Ñ\84айловеÑ\82е Ñ\83казани Ð² â\80\9e.gitignoreâ\80\9c"
 
-#: builtin/merge.c:207 builtin/pull.c:144
-msgid "edit message before committing"
-msgstr "Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¿Ñ\80еди Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "Ñ\80екÑ\83Ñ\80Ñ\81ивно Ñ\82Ñ\8aÑ\80Ñ\81ене Ð²Ñ\8aв Ð²Ñ\81иÑ\87ки Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли"
 
-#: builtin/merge.c:208
-msgid "allow fast-forward (default)"
-msgstr "позволÑ\8fване Ð½Ð° Ñ\82Ñ\80ивиално Ñ\81ливане (Ñ\81Ñ\82андаÑ\80Ñ\82но Ð´ÐµÐ¹Ñ\81Ñ\82вие)"
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "Ð\9eСÐ\9dÐ\9eÐ\92Ð\9dÐ\9e Ð\98Ð\9cÐ\95"
 
-#: builtin/merge.c:210 builtin/pull.c:150
-msgid "abort if fast-forward is not possible"
-msgstr "пÑ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване, Ð°ÐºÐ¾ Ñ\81ливанеÑ\82о Ð½Ðµ Ðµ Ñ\82Ñ\80ивиално"
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "добавÑ\8fне Ð½Ð° Ð\9eСÐ\9dÐ\9eÐ\92Ð\9dÐ\9eÑ\82о Ð\98Ð\9cÐ\95 Ð½Ð° Ð¿Ñ\80оекÑ\82а ÐºÑ\8aм Ð¸Ð·Ñ\85ода"
 
-#: builtin/merge.c:214
-msgid "Verify that the named commit has a valid GPG signature"
-msgstr "Ð\9fÑ\80овеÑ\80ка, Ñ\87е Ð¸Ð¼ÐµÐ½Ñ\83ваноÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ðµ Ñ\81 Ð¿Ñ\80авилен Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 Ð½Ð° GPG"
+#: builtin/grep.c:994
+msgid "show non-matching lines"
+msgstr "извеждане Ð½Ð° Ñ\80едовеÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81Ñ\8aвпадаÑ\82"
 
-#: builtin/merge.c:215 builtin/notes.c:771 builtin/pull.c:157
-#: builtin/revert.c:89
-msgid "strategy"
-msgstr "СТРАТЕГИЯ"
+#: builtin/grep.c:996
+msgid "case insensitive matching"
+msgstr "без значение на регистъра на буквите (главни/малки)"
 
-#: builtin/merge.c:216 builtin/pull.c:158
-msgid "merge strategy to use"
-msgstr "СТРÐ\90ТÐ\95Ð\93Ð\98Я Ð·Ð° Ñ\81ливане, ÐºÐ¾Ñ\8fÑ\82о Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð°"
+#: builtin/grep.c:998
+msgid "match patterns only at word boundaries"
+msgstr "напаÑ\81ване Ð½Ð° Ñ\88аблониÑ\82е Ñ\81амо Ð¿Ð¾ Ð³Ñ\80аниÑ\86иÑ\82е Ð½Ð° Ð´Ñ\83миÑ\82е"
 
-#: builtin/merge.c:217 builtin/pull.c:161
-msgid "option=value"
-msgstr "Ð\9eÐ\9fЦÐ\98Я=СТÐ\9eÐ\99Ð\9dÐ\9eСТ"
+#: builtin/grep.c:1000
+msgid "process binary files as text"
+msgstr "обÑ\80абоÑ\82ване Ð½Ð° Ð´Ð²Ð¾Ð¸Ñ\87ниÑ\82е Ñ\84айлове ÐºÐ°Ñ\82о Ñ\82екÑ\81Ñ\82ови"
 
-#: builtin/merge.c:218 builtin/pull.c:162
-msgid "option for selected merge strategy"
-msgstr "Ð\9eÐ\9fЦÐ\98Я Ð·Ð° Ð¸Ð·Ð±Ñ\80анаÑ\82а Ñ\81Ñ\82Ñ\80аÑ\82егиÑ\8f Ð·Ð° Ñ\81ливане"
+#: builtin/grep.c:1002
+msgid "don't match patterns in binary files"
+msgstr "пÑ\80еÑ\81каÑ\87ане Ð½Ð° Ð´Ð²Ð¾Ð¸Ñ\87ниÑ\82е Ñ\84айлове"
 
-#: builtin/merge.c:220
-msgid "merge commit message (for a non-fast-forward merge)"
-msgstr "СЪОБЩЕНИЕ при подаването със сливане (при нетривиални сливания)"
+#: builtin/grep.c:1005
+msgid "process binary files with textconv filters"
+msgstr ""
+"обработване на двоичните файлове чрез филтри за преобразуване към текст"
 
-#: builtin/merge.c:224
-msgid "abort the current in-progress merge"
-msgstr "пÑ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\82екÑ\83Ñ\89оÑ\82о Ñ\81ливане"
+#: builtin/grep.c:1007
+msgid "descend at most <depth> levels"
+msgstr "навлизане Ð¼Ð°ÐºÑ\81имално Ð½Ð° Ñ\82ази Ð\94ЪÐ\9bÐ\91Ð\9eЧÐ\98Ð\9dÐ\90 Ð² Ð´Ñ\8aÑ\80воÑ\82о"
 
-#: builtin/merge.c:226 builtin/pull.c:169
-msgid "allow merging unrelated histories"
-msgstr "позволяване на сливане на независими истории"
+#: builtin/grep.c:1011
+msgid "use extended POSIX regular expressions"
+msgstr "разширени регулярни изрази по POSIX"
 
-#: builtin/merge.c:254
-msgid "could not run stash."
-msgstr "не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88и Ñ\81каÑ\82аване"
+#: builtin/grep.c:1014
+msgid "use basic POSIX regular expressions (default)"
+msgstr "оÑ\81новни Ñ\80егÑ\83лÑ\8fÑ\80ни Ð¸Ð·Ñ\80ази Ð¿Ð¾ POSIX (Ñ\81Ñ\82андаÑ\80Ñ\82но)"
 
-#: builtin/merge.c:259
-msgid "stash failed"
-msgstr "неуспешно скатаване"
+#: builtin/grep.c:1017
+msgid "interpret patterns as fixed strings"
+msgstr "шаблоните са дословни низове"
 
-#: builtin/merge.c:264
-#, c-format
-msgid "not a valid object: %s"
-msgstr "неправилен обект: „%s“"
+#: builtin/grep.c:1020
+msgid "use Perl-compatible regular expressions"
+msgstr "регулярни изрази на Perl"
 
-#: builtin/merge.c:283 builtin/merge.c:300
-msgid "read-tree failed"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80оÑ\87иÑ\82ане Ð½Ð° Ð¾Ð±ÐµÐºÑ\82-дÑ\8aÑ\80во"
+#: builtin/grep.c:1023
+msgid "show line numbers"
+msgstr "извеждане Ð½Ð° Ð½Ð¾Ð¼ÐµÑ\80аÑ\82а Ð½Ð° Ñ\80едовеÑ\82е"
 
-#: builtin/merge.c:330
-msgid " (nothing to squash)"
-msgstr " (няма какво да се смачка)"
+#: builtin/grep.c:1024
+msgid "don't show filenames"
+msgstr "без извеждане на имената на файловете"
 
-#: builtin/merge.c:343
-#, c-format
-msgid "Squash commit -- not updating HEAD\n"
-msgstr "Подаване със смачкване — указателят „HEAD“ няма да бъде обновен\n"
+#: builtin/grep.c:1025
+msgid "show filenames"
+msgstr "извеждане на имената на файловете"
 
-#: builtin/merge.c:347 builtin/merge.c:767 builtin/merge.c:987
-#: builtin/merge.c:1000
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "„%s“ не може да бъде записан"
+#: builtin/grep.c:1027
+msgid "show filenames relative to top directory"
+msgstr ""
+"извеждане на относителните имена на файловете спрямо основната директория на "
+"хранилището"
 
-#: builtin/merge.c:375
-msgid "Writing SQUASH_MSG"
-msgstr "Ð\97апиÑ\81ване Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð·Ð° Ñ\81маÑ\87кване SQUASH_MSG"
+#: builtin/grep.c:1029
+msgid "show only filenames instead of matching lines"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° Ñ\84айловеÑ\82е Ð±ÐµÐ· Ð½Ð°Ð¿Ð°Ñ\81ваÑ\89иÑ\82е Ñ\80едове"
 
-#: builtin/merge.c:377
-msgid "Finishing SQUASH_MSG"
-msgstr "Завършване на съобщението за смачкване SQUASH_MSG"
+#: builtin/grep.c:1031
+msgid "synonym for --files-with-matches"
+msgstr "синоним на „--files-with-matches“"
 
-#: builtin/merge.c:400
-#, c-format
-msgid "No merge message -- not updating HEAD\n"
+#: builtin/grep.c:1034
+msgid "show only the names of files without match"
 msgstr ""
-"Липсва съобщение при подаване — указателят „HEAD“ няма да бъде обновен\n"
-
-#: builtin/merge.c:451
-#, c-format
-msgid "'%s' does not point to a commit"
-msgstr "„%s“ не сочи към подаване"
-
-#: builtin/merge.c:541
-#, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“"
+"извеждане само на имената на файловете, които не съдържат ред, напасващ на "
+"шаблона"
 
-#: builtin/merge.c:660
-msgid "Not handling anything other than two heads merge."
-msgstr "Ð\9fоддÑ\8aÑ\80жа Ñ\81е Ñ\81амо Ñ\81ливане Ð½Ð° Ñ\82оÑ\87но Ð´Ð²Ðµ Ð¸Ñ\81Ñ\82оÑ\80ии."
+#: builtin/grep.c:1036
+msgid "print NUL after filenames"
+msgstr "извеждане Ð½Ð° Ð½Ñ\83левиÑ\8f Ð·Ð½Ð°Ðº â\80\9eNULâ\80\9c Ñ\81лед Ð²Ñ\81Ñ\8fко Ð¸Ð¼Ðµ Ð½Ð° Ñ\84айл"
 
-#: builtin/merge.c:674
-#, c-format
-msgid "Unknown option for merge-recursive: -X%s"
-msgstr "Непозната опция за рекурсивното сливане „merge-recursive“: „-X%s“"
+#: builtin/grep.c:1038
+msgid "show the number of matches instead of matching lines"
+msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
 
-#: builtin/merge.c:687
-#, c-format
-msgid "unable to write %s"
-msgstr "„%s“ не може да бъде записан"
+#: builtin/grep.c:1039
+msgid "highlight matches"
+msgstr "оцветяване на напасванията"
 
-#: builtin/merge.c:776
-#, c-format
-msgid "Could not read from '%s'"
-msgstr "От „%s“ не може да се чете"
+#: builtin/grep.c:1041
+msgid "print empty line between matches from different files"
+msgstr "извеждане на празен ред между напасванията от различни файлове"
 
-#: builtin/merge.c:785
-#, c-format
-msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+#: builtin/grep.c:1043
+msgid "show filename only once above matches from same file"
 msgstr ""
-"Сливането няма да бъде подадено. За завършването му и подаването му "
-"използвайте командата „git commit“.\n"
+"извеждане на името на файла само веднъж за всички напасвания от този файл"
 
-#: builtin/merge.c:791
-#, c-format
-msgid ""
-"Please enter a commit message to explain why this merge is necessary,\n"
-"especially if it merges an updated upstream into a topic branch.\n"
-"\n"
-"Lines starting with '%c' will be ignored, and an empty message aborts\n"
-"the commit.\n"
-msgstr ""
-"В съобщението при подаване добавете информация за причината за\n"
-"сливането, особено ако сливате обновен отдалечен клон в тематичен клон.\n"
-"\n"
-"Редовете, които започват с „%c“ ще бъдат пропуснати, а празно съобщение\n"
-"преустановява подаването.\n"
+#: builtin/grep.c:1046
+msgid "show <n> context lines before and after matches"
+msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
 
-#: builtin/merge.c:815
-msgid "Empty commit message."
-msgstr "Ð\9fÑ\80азно Ñ\81Ñ\8aобÑ\89ение Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ."
+#: builtin/grep.c:1049
+msgid "show <n> context lines before matches"
+msgstr "извеждане Ð½Ð° Ñ\82акÑ\8aв Ð\91РÐ\9eÐ\99 Ñ\80едове Ð¿Ñ\80еди Ð½Ð°Ð¿Ð°Ñ\81ваниÑ\8fÑ\82а"
 
-# FIXME - WTF is wonderful.
-#: builtin/merge.c:835
-#, c-format
-msgid "Wonderful.\n"
-msgstr "Първият етап на тривиалното сливане завърши.\n"
+#: builtin/grep.c:1051
+msgid "show <n> context lines after matches"
+msgstr "извеждане на такъв БРОЙ редове след напасванията"
 
-#: builtin/merge.c:890
-#, c-format
-msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
-msgstr "Неуспешно сливане — коригирайте конфликтите и подайте резултата.\n"
+#: builtin/grep.c:1053
+msgid "use <n> worker threads"
+msgstr "използване на такъв БРОЙ работещи нишки"
 
-#: builtin/merge.c:906
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "„%s“ не е подаване"
+#: builtin/grep.c:1054
+msgid "shortcut for -C NUM"
+msgstr "синоним на „-C БРОЙ“"
 
-#: builtin/merge.c:947
-msgid "No current branch."
-msgstr "Ð\9dÑ\8fма Ñ\82екÑ\83Ñ\89 ÐºÐ»Ð¾Ð½."
+#: builtin/grep.c:1057
+msgid "show a line with the function name before matches"
+msgstr "извеждане Ð½Ð° Ñ\80ед Ñ\81 Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ñ\84Ñ\83нкÑ\86иÑ\8fÑ\82а, Ð² ÐºÐ¾Ñ\8fÑ\82о Ðµ Ð½Ð°Ð¿Ð°Ñ\81наÑ\82 Ñ\88аблона"
 
-#: builtin/merge.c:949
-msgid "No remote for the current branch."
-msgstr "ТекÑ\83Ñ\89иÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ Ð½Ðµ Ñ\81леди Ð½Ð¸ÐºÐ¾Ð¹."
+#: builtin/grep.c:1059
+msgid "show the surrounding function"
+msgstr "извеждане Ð½Ð° Ð¾Ð±Ñ\85ваÑ\89аÑ\89аÑ\82а Ñ\84Ñ\83нкÑ\86иÑ\8f"
 
-#: builtin/merge.c:951
-msgid "No default upstream defined for the current branch."
-msgstr "ТекÑ\83Ñ\89иÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ Ð½Ðµ Ñ\81леди Ð½Ð¸ÐºÐ¾Ð¹ ÐºÐ»Ð¾Ð½."
+#: builtin/grep.c:1062
+msgid "read patterns from file"
+msgstr "изÑ\87иÑ\82ане Ð½Ð° Ñ\88аблониÑ\82е Ð¾Ñ\82 Ð¤Ð\90Ð\99Ð\9b"
 
-#: builtin/merge.c:956
-#, c-format
-msgid "No remote-tracking branch for %s from %s"
-msgstr "Никой клон не следи клона „%s“ от хранилището „%s“"
+#: builtin/grep.c:1064
+msgid "match <pattern>"
+msgstr "напасване на ШАБЛОН"
 
-#: builtin/merge.c:1091
-#, c-format
-msgid "could not close '%s'"
-msgstr "„%s“ не може да се затвори"
+#: builtin/grep.c:1066
+msgid "combine patterns specified with -e"
+msgstr "комбиниране на шаблоните указани с опцията „-e“"
 
-#: builtin/merge.c:1219
-msgid "There is no merge to abort (MERGE_HEAD missing)."
+#: builtin/grep.c:1078
+msgid "indicate hit with exit status without output"
 msgstr ""
-"Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80еÑ\83Ñ\81Ñ\82ановиÑ\82е Ñ\81ливане, Ð·Ð°Ñ\89оÑ\82о Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ð½Ðµ Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ñ\82акова "
-"(липсва указател „MERGE_HEAD“)."
+"без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð¸Ð·Ñ\85од.  Ð\98зÑ\85одниÑ\8fÑ\82 ÐºÐ¾Ð´ Ñ\83казва Ð½Ð°Ð»Ð¸Ñ\87иеÑ\82о Ð½а "
+"напасване"
 
-#: builtin/merge.c:1235
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
+#: builtin/grep.c:1080
+msgid "show only matches from files that match all patterns"
 msgstr ""
-"Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
-"Подайте промените си, преди да започнете ново сливане."
+"извеждане на редове само от файловете, които напасват на всички шаблони"
 
-#: builtin/merge.c:1242
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
-"съществува). Подайте промените си, преди да започнете ново сливане."
+#: builtin/grep.c:1082
+msgid "show parse tree for grep expression"
+msgstr "извеждане на дървото за анализ на регулярния израз"
 
-#: builtin/merge.c:1245
-msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
-msgstr ""
-"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
-"съществува)."
+#: builtin/grep.c:1086
+msgid "pager"
+msgstr "програма за преглед по страници"
 
-#: builtin/merge.c:1254
-msgid "You cannot combine --squash with --no-ff."
-msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e--squashâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 â\80\9e--no-ffâ\80\9c."
+#: builtin/grep.c:1086
+msgid "show matching files in the pager"
+msgstr "извеждане Ð½Ð° Ñ\81Ñ\8aвпадаÑ\89иÑ\82е Ñ\84айлове Ð² Ð¿Ñ\80огÑ\80ама Ð·Ð° Ð¿Ñ\80еглед Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и"
 
-#: builtin/merge.c:1262
-msgid "No commit specified and merge.defaultToUpstream not set."
+#: builtin/grep.c:1089
+msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
-"Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена."
+"позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
+"опция)"
 
-#: builtin/merge.c:1279
-msgid "Squash commit into empty head not supported yet"
-msgstr "Ð\9fодаване Ñ\81Ñ\8aÑ\81 Ñ\81маÑ\87кване Ð²Ñ\8aв Ð²Ñ\80Ñ\8aÑ\85 Ð±ÐµÐ· Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f Ð²Ñ\81е Ð¾Ñ\89е Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа"
+#: builtin/grep.c:1153
+msgid "no pattern given."
+msgstr "липÑ\81ва Ñ\88аблон."
 
-#: builtin/merge.c:1281
-msgid "Non-fast-forward commit does not make sense into an empty head"
-msgstr ""
-"Понеже върхът е без история, всички сливания са тривиални, не може да се "
-"извърши нетривиално сливане изисквано от опцията „--no-ff“"
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr "опциите „--cached“ и „--untracked“ са несъвместими с версии."
 
-#: builtin/merge.c:1286
+#: builtin/grep.c:1195
 #, c-format
-msgid "%s - not something we can merge"
-msgstr "„%s“ — не е нещо, което може да се слее"
-
-#: builtin/merge.c:1288
-msgid "Can merge only exactly one commit into empty head"
-msgstr "Можете да слеете точно едно подаване във връх без история"
+msgid "unable to resolve revision: %s"
+msgstr "версията „%s“ не може бъде открита"
 
-#: builtin/merge.c:1344
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-"Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
+msgid "invalid number of threads specified (%d)"
+msgstr "зададен е неправилен брой нишки: %d"
 
-#: builtin/merge.c:1347
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
+#: builtin/grep.c:1251
+msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
-"Ð\9fодаванеÑ\82о â\80\9e%sâ\80\9c Ðµ Ñ\81 Ð½ÐµÐ¿Ñ\80авилен Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 Ð¾Ñ\82 GPG, ÐºÐ¾Ð¹Ñ\82о Ñ\82вÑ\8aÑ\80ди, Ñ\87е Ðµ Ð½Ð° â\80\9e%sâ\80\9c."
+"опÑ\86иÑ\8fÑ\82а â\80\9e--open-files-in-pagerâ\80\9c Ðµ Ñ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81амо Ñ\81 Ñ\82Ñ\8aÑ\80Ñ\81ене Ð² Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во"
 
-#: builtin/merge.c:1350
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr "Подаването „%s“ е без подпис от GPG."
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "опцията е несъвместима с „--recurse-submodules“."
 
-#: builtin/merge.c:1353
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
+#: builtin/grep.c:1280
+msgid "--cached or --untracked cannot be used with --no-index."
+msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
 
-#: builtin/merge.c:1415
-msgid "refusing to merge unrelated histories"
-msgstr "независими истории не може да се слеят"
+#: builtin/grep.c:1286
+msgid "--[no-]exclude-standard cannot be used for tracked contents."
+msgstr ""
+"опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
+"файлове."
 
-#: builtin/merge.c:1439
-#, c-format
-msgid "Updating %s..%s\n"
-msgstr "Обновяване „%s..%s“\n"
+#: builtin/grep.c:1294
+msgid "both --cached and trees are given."
+msgstr "опцията „--cached“ е несъвместима със задаване на дърво."
 
-#: builtin/merge.c:1476
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
-msgstr "Проба с най-тривиалното сливане в рамките на индекса…\n"
+#: builtin/hash-object.c:81
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
+"[--] <file>..."
+msgstr ""
+"git hash-object [-t ВИД] [-w] [--path=ФАЙЛ | --no-filters] [--stdin] [--] "
+"ФАЙЛ…"
 
-# FIXME WTF message
-#: builtin/merge.c:1483
-#, c-format
-msgid "Nope.\n"
-msgstr "Неуспешно сливане.\n"
+#: builtin/hash-object.c:82
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object --stdin-paths"
 
-#: builtin/merge.c:1515
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-"Не може да се извърши тривиално сливане, преустановяване на действието."
+#: builtin/hash-object.c:94
+msgid "type"
+msgstr "ВИД"
 
-#: builtin/merge.c:1538 builtin/merge.c:1617
-#, c-format
-msgid "Rewinding the tree to pristine...\n"
-msgstr "Привеждане на дървото към първоначалното…\n"
+#: builtin/hash-object.c:94
+msgid "object type"
+msgstr "ВИД на обекта"
 
-#: builtin/merge.c:1542
-#, c-format
-msgid "Trying merge strategy %s...\n"
-msgstr "Пробване със стратегията за сливане „%s“…\n"
+#: builtin/hash-object.c:95
+msgid "write the object into the object database"
+msgstr "записване на обекта в базата от данни за обектите"
 
-#: builtin/merge.c:1608
-#, c-format
-msgid "No merge strategy handled the merge.\n"
-msgstr "Никоя стратегия за сливане не може да извърши сливането.\n"
+#: builtin/hash-object.c:97
+msgid "read the object from stdin"
+msgstr "изчитане на обекта от стандартния вход"
 
-#: builtin/merge.c:1610
-#, c-format
-msgid "Merge with strategy %s failed.\n"
-msgstr "Неуспешно сливане със стратегия „%s“.\n"
+#: builtin/hash-object.c:99
+msgid "store file as is without filters"
+msgstr "запазване на файла както е — без филтри"
 
-#: builtin/merge.c:1619
-#, c-format
-msgid "Using the %s to prepare resolving by hand.\n"
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
-"Ползва се стратегията „%s“, която ще подготви дървото за коригиране на "
-"ръка.\n"
+"създаване и хеширане на произволни данни за повредени обекти за трасиране на "
+"Git"
 
-#: builtin/merge.c:1631
-#, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr ""
-"Автоматичното сливане завърши успешно. Самото подаване не е извършено, "
-"защото бе зададена опцията „--no-commit“.\n"
+#: builtin/hash-object.c:101
+msgid "process file as it were from this path"
+msgstr "обработване на ФАЙЛа все едно е с този път"
 
-#: builtin/merge-base.c:29
-msgid "git merge-base [-a | --all] <commit> <commit>..."
-msgstr "git merge-base [-a | --all] ПОДАВАНЕ ПОДАВАНЕ…"
+#: builtin/help.c:42
+msgid "print all available commands"
+msgstr "показване на всички налични команди"
 
-#: builtin/merge-base.c:30
-msgid "git merge-base [-a | --all] --octopus <commit>..."
-msgstr "git merge-base [-a | --all] --octopus ПОДАВАНЕ…"
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "без пътеводетели"
 
-#: builtin/merge-base.c:31
-msgid "git merge-base --independent <commit>..."
-msgstr "git merge-base --independent ПОДАВАНЕ…"
+#: builtin/help.c:44
+msgid "print list of useful guides"
+msgstr "показване на списък с пътеводители"
 
-#: builtin/merge-base.c:32
-msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr "git merge-base --is-ancestor ПОДАВАНЕ_1 ПОДАВАНЕ_2"
+#: builtin/help.c:45
+msgid "show man page"
+msgstr "показване на страница от ръководството"
 
-#: builtin/merge-base.c:33
-msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr "git merge-base --fork-point УКАЗАТЕЛ [ПОДАВАНЕ]"
+#: builtin/help.c:46
+msgid "show manual in web browser"
+msgstr "показване на страница от ръководството в уеб браузър"
 
-#: builtin/merge-base.c:214
-msgid "output all common ancestors"
-msgstr "извеждане Ð½Ð° Ð²Ñ\81иÑ\87ки Ð¾Ð±Ñ\89и Ð¿Ñ\80едÑ\88еÑ\81Ñ\82вениÑ\86и"
+#: builtin/help.c:48
+msgid "show info page"
+msgstr "показване Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86ионна Ñ\81Ñ\82Ñ\80аниÑ\86а"
 
-#: builtin/merge-base.c:216
-msgid "find ancestors for a single n-way merge"
-msgstr ""
-"откриване на предшествениците за еднократно сливане на множество истории"
+#: builtin/help.c:54
+msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
+msgstr "git help [--all] [--guides] [--man | --web | --info] [КОМАНДА]"
 
-#: builtin/merge-base.c:218
-msgid "list revs not reachable from others"
-msgstr "извеждане на недостижимите от другите указатели"
+#: builtin/help.c:66
+#, c-format
+msgid "unrecognized help format '%s'"
+msgstr "непознат формат на помощта „%s“"
 
-#: builtin/merge-base.c:220
-msgid "is the first one ancestor of the other?"
-msgstr "Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95_1 Ð¿Ñ\80едÑ\88еÑ\81Ñ\82веник Ð»Ð¸ Ðµ Ð½Ð° Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95_2?"
+#: builtin/help.c:93
+msgid "Failed to start emacsclient."
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80ане Ð½Ð° â\80\9eemacsclientâ\80\9c."
 
-#: builtin/merge-base.c:222
-msgid "find where <commit> forked from reflog of <ref>"
-msgstr "оÑ\82кÑ\80иване ÐºÑ\8aде Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95Ñ\82о Ñ\81е Ðµ Ð¾Ñ\82клонило Ð¾Ñ\82 Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ð£Ð\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9bÑ\8f"
+#: builtin/help.c:106
+msgid "Failed to parse emacsclient version."
+msgstr "Ð\92еÑ\80Ñ\81иÑ\8fÑ\82а Ð½Ð° â\80\9eemacsclientâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80а."
 
-#: builtin/merge-file.c:8
+#: builtin/help.c:114
+#, c-format
+msgid "emacsclient version '%d' too old (< 22)."
+msgstr "Прекалено стара версия на „emacsclient“ — %d (< 22)."
+
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
+#, c-format
+msgid "failed to exec '%s'"
+msgstr "неуспешно изпълнение на „%s“"
+
+#: builtin/help.c:207
+#, c-format
 msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
-"git merge-file [ОПЦИЯ…] [-L ИМЕ_1 [-L ОРИГИНАЛ [-L ИМЕ_2]]] ФАЙЛ_1 ОРИГ_ФАЙЛ "
-"ФАЙЛ_2"
+"„%s“: път към неподдържана програма за преглед на\n"
+" ръководството.  Вместо нея пробвайте „man.<tool>.cmd“."
 
-#: builtin/merge-file.c:33
-msgid "send results to standard output"
-msgstr "извеждане на резултатите на стандартния изход"
+#: builtin/help.c:219
+#, c-format
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
+msgstr ""
+"„%s“: команда за поддържана програма за преглед на\n"
+" ръководството.  Вместо нея пробвайте „man.<tool>.path“."
 
-#: builtin/merge-file.c:34
-msgid "use a diff3 based merge"
-msgstr "сливане на базата на „diff3“"
+#: builtin/help.c:336
+#, c-format
+msgid "'%s': unknown man viewer."
+msgstr "„%s“: непозната програма за преглед на ръководството."
 
-#: builtin/merge-file.c:35
-msgid "for conflicts, use our version"
-msgstr "пÑ\80и ÐºÐ¾Ð½Ñ\84ликÑ\82и Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð° Ð»Ð¾ÐºÐ°Ð»Ð½Ð°Ñ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f"
+#: builtin/help.c:353
+msgid "no man viewer handled the request"
+msgstr "никоÑ\8f Ð¿Ñ\80огÑ\80ама Ð·Ð° Ð¿Ñ\80еглед Ð½Ð° Ñ\80Ñ\8aководÑ\81Ñ\82во Ð½Ðµ Ñ\83Ñ\81пÑ\8f Ð´Ð° Ð¾Ð±Ñ\80абоÑ\82и Ð·Ð°Ñ\8fвкаÑ\82а"
 
-#: builtin/merge-file.c:37
-msgid "for conflicts, use their version"
-msgstr "при конфликти да се ползва чуждата версия"
+#: builtin/help.c:361
+msgid "no info viewer handled the request"
+msgstr ""
+"никоя програма за преглед на информационните страници не успя да обработи "
+"заявката"
 
-#: builtin/merge-file.c:39
-msgid "for conflicts, use a union version"
-msgstr "пÑ\80и ÐºÐ¾Ð½Ñ\84ликÑ\82и Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð° Ð¾Ð±ÐµÐ´Ð¸Ð½ÐµÐ½Ð° Ð²ÐµÑ\80Ñ\81иÑ\8f"
+#: builtin/help.c:403
+msgid "Defining attributes per path"
+msgstr "Указване Ð½Ð° Ð°Ñ\82Ñ\80ибÑ\83Ñ\82и ÐºÑ\8aм Ð¿Ñ\8aÑ\82"
 
-#: builtin/merge-file.c:42
-msgid "for conflicts, use this marker size"
-msgstr "пÑ\80и ÐºÐ¾Ð½Ñ\84ликÑ\82и Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð° Ð¼Ð°Ñ\80кеÑ\80 Ñ\81 Ñ\82акÑ\8aв Ð\91РÐ\9eÐ\99 Ð·Ð½Ð°Ñ\86и"
+#: builtin/help.c:404
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "Ð\95жедневиеÑ\82о Ð² Git Ð² Ñ\80амкиÑ\82е Ð½Ð° 20-ина ÐºÐ¾Ð¼Ð°Ð½Ð´и"
 
-#: builtin/merge-file.c:43
-msgid "do not warn about conflicts"
-msgstr "без Ð¿Ñ\80едÑ\83пÑ\80еждениÑ\8f Ð¿Ñ\80и ÐºÐ¾Ð½Ñ\84ликÑ\82и"
+#: builtin/help.c:405
+msgid "A Git glossary"
+msgstr "РеÑ\87ник Ñ\81 Ñ\82еÑ\80миниÑ\82е Ð½Ð° Git"
 
-#: builtin/merge-file.c:45
-msgid "set labels for file1/orig-file/file2"
-msgstr "задаване Ð½Ð° ÐµÑ\82икеÑ\82и Ð·Ð° Ð¤Ð\90Ð\99Ð\9b_1/Ð\9eРÐ\98Ð\93Ð\98Ð\9dÐ\90Ð\9b/ФÐ\90Ð\99Ð\9b_2"
+#: builtin/help.c:406
+msgid "Specifies intentionally untracked files to ignore"
+msgstr "Указване Ð½Ð° Ð½ÐµÑ\81ледени Ñ\84айлове, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ð±Ñ\8aдаÑ\82 Ð½Ð°Ñ\80оÑ\87но Ð¿Ñ\80енебÑ\80егвани"
 
-#: builtin/mktree.c:65
-msgid "git mktree [-z] [--missing] [--batch]"
-msgstr "git mktree [-z] [--missing] [--batch]"
+#: builtin/help.c:407
+msgid "Defining submodule properties"
+msgstr "Дефиниране на свойствата на подмодулите"
 
-#: builtin/mktree.c:152
-msgid "input is NUL terminated"
-msgstr "вÑ\85одниÑ\82е Ð·Ð°Ð¿Ð¸Ñ\81и Ñ\81а Ñ\80азделени Ñ\81 Ð½Ñ\83левиÑ\8f Ð·Ð½Ð°Ðº â\80\9eNULâ\80\9c"
+#: builtin/help.c:408
+msgid "Specifying revisions and ranges for Git"
+msgstr "Указване Ð½Ð° Ð²ÐµÑ\80Ñ\81ии Ð¸ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¸ Ð² Git"
 
-#: builtin/mktree.c:153 builtin/write-tree.c:24
-msgid "allow missing objects"
-msgstr "разрешаване на липсващи обекти"
+#: builtin/help.c:409
+msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
+msgstr "Въвеждащ урок за Git (версии поне 1.5.1)"
 
-#: builtin/mktree.c:154
-msgid "allow creation of more than one tree"
-msgstr "разрешаване на създаването на повече от едно дърво"
+#: builtin/help.c:410
+msgid "An overview of recommended workflows with Git"
+msgstr "Общ преглед на препоръчваните начини за работа с Git"
 
-#: builtin/mv.c:15
-msgid "git mv [<options>] <source>... <destination>"
-msgstr "git mv [ОПЦИЯ…] ОБЕКТ… ЦЕЛ"
+#: builtin/help.c:422
+msgid "The common Git guides are:\n"
+msgstr "Популярните пътеводители в Git са:\n"
 
-#: builtin/mv.c:70
+#: builtin/help.c:440
 #, c-format
-msgid "Directory %s is in index and no submodule?"
-msgstr "Директорията „%s“ е в индекса, но не е подмодул"
-
-#: builtin/mv.c:72 builtin/rm.c:317
-msgid "Please stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"За да продължите, или вкарайте промените по файла „.gitmodules“ в индекса,\n"
-"или ги скатайте"
+msgid "`git %s' is aliased to `%s'"
+msgstr "„git %s“ е синоним на „%s“"
 
-#: builtin/mv.c:90
+#: builtin/help.c:462 builtin/help.c:479
 #, c-format
-msgid "%.*s is in index"
-msgstr "„%.*s“ вече е в индекса"
+msgid "usage: %s%s"
+msgstr "употреба: %s%s"
 
-#: builtin/mv.c:112
-msgid "force move/rename even if target exists"
-msgstr "принудително преместване/преименуване дори целта да съществува"
+#: builtin/index-pack.c:154
+#, c-format
+msgid "unable to open %s"
+msgstr "обектът „%s“ не може да бъде отворен"
 
-#: builtin/mv.c:113
-msgid "skip move/rename errors"
-msgstr "прескачане на грешките при преместване/преименуване"
+#: builtin/index-pack.c:204
+#, c-format
+msgid "object type mismatch at %s"
+msgstr "неправилен вид на обекта „%s“"
 
-#: builtin/mv.c:152
+#: builtin/index-pack.c:224
 #, c-format
-msgid "destination '%s' is not a directory"
-msgstr "целта „%s“ съществува и не е директория"
+msgid "did not receive expected object %s"
+msgstr "очакваният обект „%s“ не бе получен"
 
-#: builtin/mv.c:163
+#: builtin/index-pack.c:227
 #, c-format
-msgid "Checking rename of '%s' to '%s'\n"
-msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð¿Ñ\80еименÑ\83ванеÑ\82о Ð½Ð° Ð¾Ð±ÐµÐºÑ\82 Ð¾Ñ\82 â\80\9e%sâ\80\9c Ð½Ð° â\80\9e%sâ\80\9c\n"
+msgid "object %s: expected type %s, found %s"
+msgstr "непÑ\80авилен Ð²Ð¸Ð´ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82а â\80\9e%sâ\80\9c: Ð¾Ñ\87акваÑ\88е Ñ\81е â\80\9e%sâ\80\9c, Ð° Ð±Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87ен â\80\9e%sâ\80\9c"
 
-#: builtin/mv.c:167
-msgid "bad source"
-msgstr "неправилен обект"
+#: builtin/index-pack.c:269
+#, c-format
+msgid "cannot fill %d byte"
+msgid_plural "cannot fill %d bytes"
+msgstr[0] "не може да се запълни %d байт"
+msgstr[1] "не може да се запълнят %d байта"
 
-#: builtin/mv.c:170
-msgid "can not move directory into itself"
-msgstr "диÑ\80екÑ\82оÑ\80иÑ\8f Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80емеÑ\81Ñ\82и Ð² Ñ\81ебе Ñ\81и"
+#: builtin/index-pack.c:279
+msgid "early EOF"
+msgstr "неоÑ\87акван ÐºÑ\80ай Ð½Ð° Ñ\84айл"
 
-#: builtin/mv.c:173
-msgid "cannot move directory over file"
-msgstr "диÑ\80екÑ\82оÑ\80иÑ\8f Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80емеÑ\81Ñ\82и Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ñ\84айл"
+#: builtin/index-pack.c:280
+msgid "read error on input"
+msgstr "гÑ\80еÑ\88ка Ð¿Ñ\80и Ñ\87еÑ\82ене Ð½Ð° Ð²Ñ\85одниÑ\82е Ð´Ð°Ð½Ð½Ð¸"
 
-#: builtin/mv.c:182
-msgid "source directory is empty"
-msgstr "пÑ\8aÑ\80вонаÑ\87алнаÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ðµ Ð¿Ñ\80азна"
+#: builtin/index-pack.c:292
+msgid "used more bytes than were available"
+msgstr "използвани Ñ\81а Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ñ\82 Ð½Ð°Ð»Ð¸Ñ\87ниÑ\82е Ð±Ð°Ð¹Ñ\82ове"
 
-#: builtin/mv.c:207
-msgid "not under version control"
-msgstr "не Ðµ Ð¿Ð¾Ð´ ÐºÐ¾Ð½Ñ\82Ñ\80ола Ð½Ð° Git"
+#: builtin/index-pack.c:299
+msgid "pack too large for current definition of off_t"
+msgstr "пакеÑ\82ниÑ\8fÑ\82 Ñ\84айл Ðµ Ð¿Ñ\80екалено Ð³Ð¾Ð»Ñ\8fм Ð·Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð½Ð° Ñ\82ипа â\80\9eoff_tâ\80\9c"
 
-#: builtin/mv.c:210
-msgid "destination exists"
-msgstr "целта съществува"
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "пакетният файл надвишава максималния възможен размер"
 
-#: builtin/mv.c:218
+#: builtin/index-pack.c:317
 #, c-format
-msgid "overwriting '%s'"
-msgstr "презаписване на „%s“"
-
-#: builtin/mv.c:221
-msgid "Cannot overwrite"
-msgstr "Презаписването е невъзможно"
+msgid "unable to create '%s'"
+msgstr "пакетният файл „%s“ не може да бъде създаден"
 
-#: builtin/mv.c:224
-msgid "multiple sources for the same target"
-msgstr "множество източници за една цел"
+#: builtin/index-pack.c:323
+#, c-format
+msgid "cannot open packfile '%s'"
+msgstr "пакетният файл „%s“ не може да бъде отворен"
 
-#: builtin/mv.c:226
-msgid "destination directory does not exist"
-msgstr "целевата директория не съществува"
+#: builtin/index-pack.c:337
+msgid "pack signature mismatch"
+msgstr "несъответствие в подписа към пакетния файл"
 
-#: builtin/mv.c:233
+#: builtin/index-pack.c:339
 #, c-format
-msgid "%s, source=%s, destination=%s"
-msgstr "%s, обект: „%s“, цел: „%s“"
+msgid "pack version %<PRIu32> unsupported"
+msgstr "не се поддържа пакетиране вeрсия „%<PRIu32>“"
 
-#: builtin/mv.c:254
+#: builtin/index-pack.c:357
 #, c-format
-msgid "Renaming %s to %s\n"
-msgstr "Ð\9fÑ\80еименÑ\83ване Ð½Ð° â\80\9e%sâ\80\9c Ð½Ð° â\80\9e%sâ\80\9c\n"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "повÑ\80еден Ð¾Ð±ÐµÐºÑ\82 Ð² Ð¿Ð°ÐºÐµÑ\82ниÑ\8f Ñ\84айл Ð¿Ñ\80и Ð¾Ñ\82меÑ\81Ñ\82ване %<PRIuMAX>: %s"
 
-#: builtin/mv.c:260 builtin/remote.c:714 builtin/repack.c:365
+#: builtin/index-pack.c:479
 #, c-format
-msgid "renaming '%s' failed"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80еименÑ\83ване Ð½Ð° â\80\9e%sâ\80\9c"
+msgid "inflate returned %d"
+msgstr "декомпÑ\80еÑ\81иÑ\80анеÑ\82о Ñ\81 â\80\9einflateâ\80\9c Ð²Ñ\8aÑ\80на %d"
 
-#: builtin/name-rev.c:258
-msgid "git name-rev [<options>] <commit>..."
-msgstr "git name-rev [ОПЦИЯ…] ПОДАВАНЕ…"
+#: builtin/index-pack.c:528
+msgid "offset value overflow for delta base object"
+msgstr "стойността на отместването за обекта-разлика води до препълване"
 
-#: builtin/name-rev.c:259
-msgid "git name-rev [<options>] --all"
-msgstr "git name-rev [ОПЦИЯ…] --all"
+#: builtin/index-pack.c:536
+msgid "delta base offset is out of bound"
+msgstr "стойността на отместването за обекта-разлика е извън диапазона"
 
-#: builtin/name-rev.c:260
-msgid "git name-rev [<options>] --stdin"
-msgstr "git name-rev [ОПЦИЯ…] --stdin"
+#: builtin/index-pack.c:544
+#, c-format
+msgid "unknown object type %d"
+msgstr "непознат вид обект %d"
 
-# FIXME sha
-#: builtin/name-rev.c:312
-msgid "print only names (no SHA-1)"
-msgstr "извеждане само на имената (без сумите по SHA1)"
+#: builtin/index-pack.c:575
+msgid "cannot pread pack file"
+msgstr "пакетният файл не може да бъде прочетен"
 
-#: builtin/name-rev.c:313
-msgid "only use tags to name the commits"
-msgstr "използване само на етикетите за именуване на подаванията"
+#: builtin/index-pack.c:577
+#, c-format
+msgid "premature end of pack file, %<PRIuMAX> byte missing"
+msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
+msgstr[0] "неочакван край на файл, липсва %<PRIuMAX> байт"
+msgstr[1] "неочакван край на файл, липсват %<PRIuMAX> байта"
 
-#: builtin/name-rev.c:315
-msgid "only use refs matching <pattern>"
-msgstr "използване само на указателите напасващи на ШАБЛОНа"
+#: builtin/index-pack.c:603
+msgid "serious inflate inconsistency"
+msgstr "сериозна грешка при декомпресиране с „inflate“"
 
-#: builtin/name-rev.c:317
-msgid "list all commits reachable from all refs"
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
+#, c-format
+msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
-"извеждане на всички подавания, които могат да бъдат достигнати от всички "
-"указатели"
+"СЪВПАДЕНИЕ НА СТОЙНОСТИТЕ ЗА СУМИТЕ ЗА SHA1: „%s“ НА ДВА РАЗЛИЧНИ ОБЕКТА!"
 
-#: builtin/name-rev.c:318
-msgid "read from stdin"
-msgstr "четене от стандартния вход"
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
+#, c-format
+msgid "unable to read %s"
+msgstr "обектът „%s“ не може да бъде прочетен"
 
-#: builtin/name-rev.c:319
-msgid "allow to print `undefined` names (default)"
-msgstr "да се извеждат и недефинираните имена (стандартна стойност на опцията)"
+#: builtin/index-pack.c:814
+#, c-format
+msgid "cannot read existing object info %s"
+msgstr "съществуващият обект в „%s“ не може да бъде прочетен"
 
-#: builtin/name-rev.c:325
-msgid "dereference tags in the input (internal use)"
-msgstr "извеждане на идентификаторите на обекти-етикети (за вътрешни нужди)"
+#: builtin/index-pack.c:822
+#, c-format
+msgid "cannot read existing object %s"
+msgstr "съществуващият обект „%s“ не може да бъде прочетен"
 
-#: builtin/notes.c:25
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
-msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] [list [ОБЕКТ]]"
+#: builtin/index-pack.c:836
+#, c-format
+msgid "invalid blob object %s"
+msgstr "неправилен обект BLOB „%s“"
 
-#: builtin/notes.c:26
-msgid ""
-"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
-"| (-c | -C) <object>] [<object>]"
-msgstr ""
-"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] add [-f] [--allow-empty] [-m СЪОБЩЕНИЕ "
-"| -F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]"
+# FIXME perhaps invalid object
+#: builtin/index-pack.c:850
+#, c-format
+msgid "invalid %s"
+msgstr "неправилен обект „%s“"
 
-#: builtin/notes.c:27
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
-msgstr ""
-"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] copy [-f] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
+#: builtin/index-pack.c:853
+msgid "Error in object"
+msgstr "Грешка в обекта"
 
-#: builtin/notes.c:28
-msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
-msgstr ""
-"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] append [--allow-empty] [-m СЪОБЩЕНИЕ | "
-"-F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]"
+#: builtin/index-pack.c:855
+#, c-format
+msgid "Not all child objects of %s are reachable"
+msgstr "Някои обекти, наследници на „%s“, не могат да бъдат достигнати"
 
-#: builtin/notes.c:29
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
-msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] edit [--allow-empty] [ОБЕКТ]"
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
+msgid "failed to apply delta"
+msgstr "разликата не може да бъде приложена"
 
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] show [<object>]"
-msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] show [ОБЕКТ]"
+#: builtin/index-pack.c:1128
+msgid "Receiving objects"
+msgstr "Получаване на обекти"
 
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
-msgstr ""
-"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] merge [-v | -q] [-s СТРАТЕГИЯ] "
-"УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
+#: builtin/index-pack.c:1128
+msgid "Indexing objects"
+msgstr "Индексиране на обекти"
 
-#: builtin/notes.c:32
-msgid "git notes merge --commit [-v | -q]"
-msgstr "git notes merge --commit [-v | -q]"
+#: builtin/index-pack.c:1160
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr "пакетният файл е повреден (нееднакви суми по SHA1)"
 
-#: builtin/notes.c:33
-msgid "git notes merge --abort [-v | -q]"
-msgstr "git notes merge --abort [-v | -q]"
+#: builtin/index-pack.c:1165
+msgid "cannot fstat packfile"
+msgstr "не може да се получи информация за пакетния файл с „fstat“"
 
-#: builtin/notes.c:34
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
-msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] remove [ОБЕКТ…]"
+#: builtin/index-pack.c:1168
+msgid "pack has junk at the end"
+msgstr "в края на пакетния файл има повредени данни"
 
-#: builtin/notes.c:35
-msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
-msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] prune [-n | -v]"
+#: builtin/index-pack.c:1179
+msgid "confusion beyond insanity in parse_pack_objects()"
+msgstr ""
+"фатална грешка във функцията „parse_pack_objects“.  Това е грешка в Git, "
+"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
+"kernel.org“."
 
-#: builtin/notes.c:36
-msgid "git notes [--ref <notes-ref>] get-ref"
-msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] get-ref"
+#: builtin/index-pack.c:1202
+msgid "Resolving deltas"
+msgstr "Откриване на съответните разлики"
 
-#: builtin/notes.c:41
-msgid "git notes [list [<object>]]"
-msgstr "git notes [list [ОБЕКТ]]"
+#: builtin/index-pack.c:1213
+#, c-format
+msgid "unable to create thread: %s"
+msgstr "не може да се създаде нишка: %s"
 
-#: builtin/notes.c:46
-msgid "git notes add [<options>] [<object>]"
-msgstr "git notes add [ОПЦИЯ…] [ОБЕКТ]"
+#: builtin/index-pack.c:1255
+msgid "confusion beyond insanity"
+msgstr ""
+"фатална грешка във функцията „conclude_pack“.  Това е грешка в Git, "
+"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
+"kernel.org“."
 
-#: builtin/notes.c:51
-msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr "git notes copy [ОПЦИЯ…] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
+#: builtin/index-pack.c:1261
+#, c-format
+msgid "completed with %d local object"
+msgid_plural "completed with %d local objects"
+msgstr[0] "действието завърши с %d локален обект"
+msgstr[1] "действието завърши с %d локални обекта"
 
-#: builtin/notes.c:52
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr "git notes copy --stdin [ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ]…"
+#: builtin/index-pack.c:1273
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr ""
+"Неочаквана последваща сума за грешки за „%s“ (причината може да е грешка в "
+"диска)"
 
-#: builtin/notes.c:57
-msgid "git notes append [<options>] [<object>]"
-msgstr "git notes append [ОПЦИЯ…] [ОБЕКТ]"
+#: builtin/index-pack.c:1277
+#, c-format
+msgid "pack has %d unresolved delta"
+msgid_plural "pack has %d unresolved deltas"
+msgstr[0] "в пакета има %d ненапасваща разлика"
+msgstr[1] "в пакета има %d ненапасващи разлики"
 
-#: builtin/notes.c:62
-msgid "git notes edit [<object>]"
-msgstr "git notes edit [ОБЕКТ]"
+#: builtin/index-pack.c:1301
+#, c-format
+msgid "unable to deflate appended object (%d)"
+msgstr "добавеният обект не може да се компресира с „deflate“: %d"
 
-#: builtin/notes.c:67
-msgid "git notes show [<object>]"
-msgstr "git notes show [ОБЕКТ]"
+#: builtin/index-pack.c:1377
+#, c-format
+msgid "local object %s is corrupt"
+msgstr "локалният обект „%s“ е повреден"
 
-#: builtin/notes.c:72
-msgid "git notes merge [<options>] <notes-ref>"
-msgstr "git notes merge [ОПЦИЯ…] УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
+#: builtin/index-pack.c:1403
+msgid "error while closing pack file"
+msgstr "грешка при затварянето на пакетния файл"
 
-#: builtin/notes.c:73
-msgid "git notes merge --commit [<options>]"
-msgstr "git notes merge --commit [ОПЦИЯ…]"
+#: builtin/index-pack.c:1415
+#, c-format
+msgid "cannot write keep file '%s'"
+msgstr ""
+"грешка при записването на файла „%s“, осигуряващ запазване на директория"
 
-#: builtin/notes.c:74
-msgid "git notes merge --abort [<options>]"
-msgstr "git notes merge --abort [ОПЦИЯ…]"
+#: builtin/index-pack.c:1423
+#, c-format
+msgid "cannot close written keep file '%s'"
+msgstr ""
+"грешка при затварянето на записания файл „%s“, осигуряващ запазване на "
+"директория"
 
-#: builtin/notes.c:79
-msgid "git notes remove [<object>]"
-msgstr "git notes remove [ОБЕКТ]"
+#: builtin/index-pack.c:1433
+msgid "cannot store pack file"
+msgstr "пакетният файл не може да бъде запазен"
 
-#: builtin/notes.c:84
-msgid "git notes prune [<options>]"
-msgstr "git notes prune [ОПЦИЯ…]"
+#: builtin/index-pack.c:1441
+msgid "cannot store index file"
+msgstr "файлът за индекса не може да бъде съхранен"
 
-#: builtin/notes.c:89
-msgid "git notes get-ref"
-msgstr "git notes get-ref"
+#: builtin/index-pack.c:1479
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "зададена е неправилна версия пакетиране: „pack.indexversion=%<PRIu32>“"
 
-#: builtin/notes.c:147
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
-msgid "unable to start 'show' for object '%s'"
-msgstr "дейÑ\81Ñ\82виеÑ\82о â\80\9eshowâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ñ\8aлни Ð·Ð° Ð¾Ð±ÐµÐºÑ\82 â\80\9e%sâ\80\9c"
+msgid "no threads support, ignoring %s"
+msgstr "липÑ\81ва Ð¿Ð¾Ð´Ð´Ñ\80Ñ\8aжка Ð·Ð° Ð½Ð¸Ñ\88ки.  â\80\9e%sâ\80\9c Ñ\89е Ñ\81е Ð¿Ñ\80енебÑ\80егне"
 
-#: builtin/notes.c:151
-msgid "could not read 'show' output"
-msgstr "изведената информация от действието „show“ не може да се прочете"
+#: builtin/index-pack.c:1547
+#, c-format
+msgid "Cannot open existing pack file '%s'"
+msgstr "Съществуващият пакетен файл „%s“ не може да бъде отворен"
 
-#: builtin/notes.c:159
+#: builtin/index-pack.c:1549
 #, c-format
-msgid "failed to finish 'show' for object '%s'"
-msgstr "дейÑ\81Ñ\82виеÑ\82о â\80\9eshowâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð·Ð°Ð²Ñ\8aÑ\80Ñ\88и Ð·Ð° Ð¾Ð±ÐµÐºÑ\82 â\80\9e%sâ\80\9c"
+msgid "Cannot open existing pack idx file for '%s'"
+msgstr "СÑ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89иÑ\8fÑ\82 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð·Ð° Ð¿Ð°ÐºÐµÑ\82ниÑ\8f Ñ\84айл â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82воÑ\80ен"
 
-#: builtin/notes.c:174 builtin/tag.c:248
+#: builtin/index-pack.c:1596
 #, c-format
-msgid "could not create file '%s'"
-msgstr "файлът „%s“ не може да бъде създаден"
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] "%d обект не е разлика"
+msgstr[1] "%d обекта не са разлика"
 
-#: builtin/notes.c:193
-msgid "Please supply the note contents using either -m or -F option"
-msgstr "Задайте съдържанието на бележката с някоя от опциите „-m“ или „-F“"
+#: builtin/index-pack.c:1603
+#, c-format
+msgid "chain length = %d: %lu object"
+msgid_plural "chain length = %d: %lu objects"
+msgstr[0] "дължината на веригата е %d: %lu обект"
+msgstr[1] "дължината на веригата е %d: %lu обекта"
 
-#: builtin/notes.c:202
-msgid "unable to write note object"
-msgstr "обектът-бележка не може да бъде записан"
+#: builtin/index-pack.c:1616
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
 
-#: builtin/notes.c:204
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Съдържанието на бележката е във файла „%s“"
+msgid "bad %s"
+msgstr "неправилна стойност „%s“"
+
+#: builtin/index-pack.c:1737
+msgid "--fix-thin cannot be used without --stdin"
+msgstr "опцията „--fix-thin“ изисква „--stdin“"
+
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "„--stdin“ изисква хранилище на git"
+
+#: builtin/index-pack.c:1747
+msgid "--verify with no packfile name given"
+msgstr "опцията „--verify“ изисква име на пакетен файл"
 
-#: builtin/notes.c:232 builtin/tag.c:439
+#: builtin/init-db.c:54
 #, c-format
-msgid "cannot read '%s'"
-msgstr "файлът „%s“ не може да бъде прочетен"
+msgid "cannot stat '%s'"
+msgstr "не може да се получи информация чрез „stat“ за директорията „%s“"
 
-#: builtin/notes.c:234 builtin/tag.c:442
+#: builtin/init-db.c:60
 #, c-format
-msgid "could not open or read '%s'"
-msgstr "файлът „%s“ не може да бъде отворен или прочетен"
+msgid "cannot stat template '%s'"
+msgstr "не може да се получи информация чрез „stat“ за шаблона „%s“"
 
-#: builtin/notes.c:256
+#: builtin/init-db.c:65
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Ð\9eбекÑ\82Ñ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен."
+msgid "cannot opendir '%s'"
+msgstr "диÑ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ñ\82воÑ\80ена"
 
-#: builtin/notes.c:260
+#: builtin/init-db.c:76
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr ""
-"Съдържанието на бележка не може да се вземе от обект, който не е BLOB: „%s“."
+msgid "cannot readlink '%s'"
+msgstr "връзката „%s“ не може да бъде прочетена"
 
-#: builtin/notes.c:362 builtin/notes.c:417 builtin/notes.c:493
-#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649
-#: builtin/notes.c:946
-msgid "too many parameters"
-msgstr "прекалено много параметри"
+#: builtin/init-db.c:78
+#, c-format
+msgid "cannot symlink '%s' '%s'"
+msgstr "не може да се създаде символна връзка „%s“ в „%s“"
 
-#: builtin/notes.c:375 builtin/notes.c:662
+#: builtin/init-db.c:84
 #, c-format
-msgid "No note found for object %s."
-msgstr "Няма бележки за обекта „%s“."
+msgid "cannot copy '%s' to '%s'"
+msgstr "„%s“ не може да се копира в „%s“"
 
-#: builtin/notes.c:396 builtin/notes.c:559
-msgid "note contents as a string"
-msgstr "низ, който е съдържанието на бележката"
+#: builtin/init-db.c:88
+#, c-format
+msgid "ignoring template %s"
+msgstr "игнориране на шаблона „%s“"
 
-#: builtin/notes.c:399 builtin/notes.c:562
-msgid "note contents in a file"
-msgstr "ФАЙЛ със съдържанието на бележката"
+#: builtin/init-db.c:119
+#, c-format
+msgid "templates not found %s"
+msgstr "директорията с шаблоните не е открита: „%s“"
 
-#: builtin/notes.c:402 builtin/notes.c:565
-msgid "reuse and edit specified note object"
-msgstr "преизползване и редактиране на указания ОБЕКТ-бележка"
+#: builtin/init-db.c:134
+#, c-format
+msgid "not copying templates from '%s': %s"
+msgstr "шаблоните няма да бъдат копирани от „%s“: „%s“"
 
-#: builtin/notes.c:405 builtin/notes.c:568
-msgid "reuse specified note object"
-msgstr "преизползване на указания ОБЕКТ-бележка"
+#: builtin/init-db.c:327
+#, c-format
+msgid "unable to handle file type %d"
+msgstr "файлове от вид %d не се поддържат"
 
-#: builtin/notes.c:408 builtin/notes.c:571
-msgid "allow storing empty note"
-msgstr "приемане и на празни бележки"
+#: builtin/init-db.c:330
+#, c-format
+msgid "unable to move %s to %s"
+msgstr "„%s“ не може да се премести в „%s“"
 
-#: builtin/notes.c:409 builtin/notes.c:480
-msgid "replace existing notes"
-msgstr "замяна на съществуващите бележки"
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "Директорията „%s“ вече съществува"
 
-#: builtin/notes.c:434
+#: builtin/init-db.c:403
 #, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
+msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr ""
-"Не може да се добави бележка, защото такава вече съществува за обекта „%s“. "
-"Използвайте опцията „-f“, за да презапишете съществуващи бележки."
+"Инициализиране наново на съществуващо, споделено хранилище на Git в „%s%s“\n"
 
-#: builtin/notes.c:449 builtin/notes.c:528
+#: builtin/init-db.c:404
 #, c-format
-msgid "Overwriting existing notes for object %s\n"
-msgstr "Ð\9fÑ\80езапиÑ\81ване Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89иÑ\82е Ð±ÐµÐ»ÐµÐ¶ÐºÐ¸ Ð·Ð° Ð¾Ð±ÐµÐºÑ\82а â\80\9e%s“\n"
+msgid "Reinitialized existing Git repository in %s%s\n"
+msgstr "Ð\98ниÑ\86иализиÑ\80ане Ð½Ð°Ð½Ð¾Ð²Ð¾ Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89о Ñ\85Ñ\80анилиÑ\89е Ð½Ð° Git Ð² â\80\9e%s%s“\n"
 
-#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:886
+#: builtin/init-db.c:408
 #, c-format
-msgid "Removing note for object %s\n"
-msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° Ð±ÐµÐ»ÐµÐ¶ÐºÐ°Ñ\82а Ð·Ð° Ð¾Ð±ÐµÐºÑ\82а â\80\9e%s“\n"
+msgid "Initialized empty shared Git repository in %s%s\n"
+msgstr "Ð\98ниÑ\86иализиÑ\80ане Ð½Ð° Ð¿Ñ\80азно, Ñ\81поделено Ñ\85Ñ\80анилиÑ\89е Ð½Ð° Git Ð² â\80\9e%s%s“\n"
 
-#: builtin/notes.c:481
-msgid "read objects from stdin"
-msgstr "изчитане на обектите от стандартния вход"
+#: builtin/init-db.c:409
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
+msgstr "Инициализиране на празно хранилище на Git в „%s%s“\n"
 
-# FIXME imporve message
-#: builtin/notes.c:483
-msgid "load rewriting config for <command> (implies --stdin)"
+#: builtin/init-db.c:457
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [<directory>]"
 msgstr ""
-"зареждане на настройките за КОМАНДАта, която презаписва подавания (включва "
-"опцията „--stdin“)"
+"git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШАБЛОНИ] [--"
+"shared[=ПРАВА]] [ДИРЕКТОРИЯ]"
 
-#: builtin/notes.c:501
-msgid "too few parameters"
-msgstr "пÑ\80екалено Ð¼Ð°Ð»ÐºÐ¾ Ð¿Ð°Ñ\80амеÑ\82Ñ\80и"
+#: builtin/init-db.c:480
+msgid "permissions"
+msgstr "пÑ\80ава"
 
-#: builtin/notes.c:522
-#, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
+#: builtin/init-db.c:481
+msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
-"Не може да се копира бележка, защото такава вече съществува за обекта „%s“. "
-"Ð\98зползвайÑ\82е Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-fâ\80\9c, Ð·Ð° Ð´Ð° Ð¿Ñ\80езапиÑ\88еÑ\82е Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89и Ð±ÐµÐ»ÐµÐ¶ÐºÐ¸."
+"указване, че хранилището на Git ще бъде споделено от повече от един "
+"поÑ\82Ñ\80ебиÑ\82ел"
 
-#: builtin/notes.c:534
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr ""
-"Не може да се копира бележка, която не съществува — няма бележки за обекта-"
-"източник „%s“."
+msgid "cannot mkdir %s"
+msgstr "директорията „%s“ не може да бъде създадена"
+
+#: builtin/init-db.c:524
+#, c-format
+msgid "cannot chdir to %s"
+msgstr "не може да се влезе в директорията „%s“"
 
-#: builtin/notes.c:586
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
-"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
-"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
 msgstr ""
-"Задаването на опциите „-m“/„-F“/„-c“/„-C“ с командата „edit“ вече е "
-"остаряло.\n"
-"Вместо това ги използвайте с подкомандата „add“: „git notes add -f -m/-F/-c/-"
-"C“.\n"
-
-#: builtin/notes.c:768
-msgid "General options"
-msgstr "Общи опции"
+"%s (или --work-tree=ДИРЕКТОРИЯ) изисква указването на %s (или --git-"
+"dir=ДИРЕКТОРИЯ)"
 
-#: builtin/notes.c:770
-msgid "Merge options"
-msgstr "Опции при сливане"
+#: builtin/init-db.c:573
+#, c-format
+msgid "Cannot access work tree '%s'"
+msgstr "Работното дърво в „%s“ е недостъпно"
 
-#: builtin/notes.c:772
+#: builtin/interpret-trailers.c:15
 msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<token>[(=|:)<value>])...] [<file>...]"
 msgstr ""
-"коригиране на конфликтите при сливане на бележките чрез тази СТРАТЕГИЯ — "
-"„manual“ (ръчно), „ours“ (вашата версия), „theirs“ (чуждата версия), "
-"„union“ (обединяване), „cat_sort_uniq“ (обединяване, подреждане, уникални "
-"резултати)"
-
-#: builtin/notes.c:774
-msgid "Committing unmerged notes"
-msgstr "Подаване на неслети бележки"
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"ЛЕКСЕМА[(=|:)СТОЙНОСТ])…] [ФАЙЛ…]"
 
-#: builtin/notes.c:776
-msgid "finalize notes merge by committing unmerged notes"
-msgstr "завÑ\8aÑ\80Ñ\88ване Ð½Ð° Ñ\81ливанеÑ\82о Ñ\87Ñ\80ез Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ð° Ð½ÐµÑ\81леÑ\82и Ð±ÐµÐ»ÐµÐ¶ÐºÐ¸"
+#: builtin/interpret-trailers.c:26
+msgid "edit files in place"
+msgstr "диÑ\80екÑ\82но Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\84айловеÑ\82е"
 
-#: builtin/notes.c:778
-msgid "Aborting notes merge resolution"
-msgstr "Ð\9fÑ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване Ð½Ð° ÐºÐ¾Ñ\80екÑ\86иÑ\8fÑ\82а Ð¿Ñ\80и Ñ\81ливанеÑ\82о Ð½Ð° Ð±ÐµÐ»ÐµÐ¶Ðºи"
+#: builtin/interpret-trailers.c:27
+msgid "trim empty trailers"
+msgstr "изÑ\87иÑ\81Ñ\82ване Ð½Ð° Ð¿Ñ\80азниÑ\82е ÐµÐ¿Ð¸Ð»Ð¾Ð·и"
 
-#: builtin/notes.c:780
-msgid "abort notes merge"
-msgstr "пÑ\80еÑ\83Ñ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\81ливанеÑ\82о Ð½Ð° Ð±ÐµÐ»ÐµÐ¶ÐºÐ¸"
+#: builtin/interpret-trailers.c:28
+msgid "trailer"
+msgstr "епилог"
 
-#: builtin/notes.c:857
-#, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "В момента се извършва сливане на бележките в „%s“ при „%s“"
+#: builtin/interpret-trailers.c:29
+msgid "trailer(s) to add"
+msgstr "епилог(зи) за добавяне"
 
-#: builtin/notes.c:884
-#, c-format
-msgid "Object %s has no note\n"
-msgstr "Няма бележки за обекта „%s“\n"
+#: builtin/interpret-trailers.c:42
+msgid "no input file given for in-place editing"
+msgstr "не е зададен входен файл за редактиране на място"
 
-#: builtin/notes.c:896
-msgid "attempt to remove non-existent note is not an error"
-msgstr "опитът за изтриването на несъществуваща бележка не се счита за грешка"
+#: builtin/log.c:44
+msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
+msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]"
 
-#: builtin/notes.c:899
-msgid "read object names from the standard input"
-msgstr "изчитане на имената на обектите от стандартния вход"
+#: builtin/log.c:45
+msgid "git show [<options>] <object>..."
+msgstr "git show [ОПЦИЯ…] ОБЕКТ…"
 
-#: builtin/notes.c:980
-msgid "notes-ref"
-msgstr "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
+#: builtin/log.c:89
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "неправилна опция „--decorate“: %s"
 
-#: builtin/notes.c:981
-msgid "use notes from <notes-ref>"
-msgstr "да Ñ\81е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ð±ÐµÐ»ÐµÐ¶ÐºÐ°Ñ\82а Ñ\81оÑ\87ена Ð¾Ñ\82 Ñ\82ози Ð£Ð\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9b\97Ð\90\91Ð\95Ð\9bÐ\95Ð\96Ð\9aÐ\90"
+#: builtin/log.c:144
+msgid "suppress diff output"
+msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ñ\80азликиÑ\82е"
 
-#: builtin/notes.c:1016 builtin/remote.c:1628
-#, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Непозната подкоманда: %s"
+#: builtin/log.c:145
+msgid "show source"
+msgstr "извеждане на изходния код"
 
-#: builtin/pack-objects.c:28
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
+#: builtin/log.c:146
+msgid "Use mail map file"
 msgstr ""
-"git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_УКАЗАТЕЛИ | < СПИСЪК_С_ОБЕКТИ]"
+"Използване на файл за съответствията на имената и адресите на е-поща („."
+"mailmap“)"
 
-# FIXME [options] vs [options...]
-#: builtin/pack-objects.c:29
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+#: builtin/log.c:147
+msgid "decorate options"
+msgstr "настройки на форма̀та на извежданата информация"
+
+#: builtin/log.c:150
+msgid "Process line range n,m in file, counting from 1"
 msgstr ""
-"git pack-objects [ОПЦИЯ…] ПРЕФИКС_НА_ИМЕТО [< СПИСЪК_С_УКАЗАТЕЛИ | < "
-"СÐ\9fÐ\98СЪÐ\9a_С_Ð\9eÐ\91Ð\95Ð\9aТÐ\98]"
+"Обработване само на редовете във файла в диапазона от n до m включително.  "
+"Ð\91Ñ\80оенеÑ\82о Ð·Ð°Ð¿Ð¾Ñ\87ва Ð¾Ñ\82 1"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/log.c:246
 #, c-format
-msgid "deflate error (%d)"
-msgstr "гÑ\80еÑ\88ка Ð¿Ñ\80и Ð´ÐµÐºÐ¾Ð¼Ð¿Ñ\80еÑ\81иÑ\80ане Ñ\81 â\80\9edeflateâ\80\9c (%d)"
+msgid "Final output: %d %s\n"
+msgstr "РезÑ\83лÑ\82аÑ\82: %d %s\n"
 
-#: builtin/pack-objects.c:763
-msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
-msgstr ""
-"изключване на записването на битовата маска, пакетите са разделени поради "
-"стойността на „pack.packSizeLimit“"
+#: builtin/log.c:493
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: повреден файл"
 
-#: builtin/pack-objects.c:776
-msgid "Writing objects"
-msgstr "Записване на обектите"
+#: builtin/log.c:507 builtin/log.c:601
+#, c-format
+msgid "Could not read object %s"
+msgstr "Обектът не може да бъде прочетен: %s"
 
-#: builtin/pack-objects.c:1017
-msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr ""
-"изключване на записването на битовата маска, защото някои обекти няма да се "
-"пакетират"
+#: builtin/log.c:625
+#, c-format
+msgid "Unknown type: %d"
+msgstr "Неизвестен вид: %d"
 
-#: builtin/pack-objects.c:2177
-msgid "Compressing objects"
-msgstr "Ð\9aомпÑ\80еÑ\81иÑ\80ане Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
+#: builtin/log.c:746
+msgid "format.headers without value"
+msgstr "не Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð° Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð½Ð° â\80\9eformat.headersâ\80\9c"
 
-#: builtin/pack-objects.c:2563
-#, c-format
-msgid "unsupported index version %s"
-msgstr "неподдържана версия на индекса „%s“"
+#: builtin/log.c:846
+msgid "name of output directory is too long"
+msgstr "прекалено дълго име на директорията за изходната информация"
 
-#: builtin/pack-objects.c:2567
+#: builtin/log.c:861
 #, c-format
-msgid "bad index version '%s'"
-msgstr "неправилна версия на индекса „%s“"
-
-#: builtin/pack-objects.c:2597
-msgid "do not show progress meter"
-msgstr "без извеждане на напредъка"
+msgid "Cannot open patch file %s"
+msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
 
-#: builtin/pack-objects.c:2599
-msgid "show progress meter"
-msgstr "извеждане Ð½Ð° Ð½Ð°Ð¿Ñ\80едÑ\8aка"
+#: builtin/log.c:875
+msgid "Need exactly one range."
+msgstr "ТÑ\80Ñ\8fбва Ð´Ð° Ð·Ð°Ð´Ð°Ð´ÐµÑ\82е Ñ\82оÑ\87но ÐµÐ´Ð¸Ð½ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½."
 
-#: builtin/pack-objects.c:2601
-msgid "show progress meter during object writing phase"
-msgstr "извеждане Ð½Ð° Ð½Ð°Ð¿Ñ\80едÑ\8aка Ð²Ñ\8aв Ñ\84азаÑ\82а Ð½Ð° Ð·Ð°Ð¿Ð°Ð·Ð²Ð°Ð½Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
+#: builtin/log.c:885
+msgid "Not a range."
+msgstr "Ð\9dе Ðµ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½."
 
-#: builtin/pack-objects.c:2604
-msgid "similar to --all-progress when progress meter is shown"
-msgstr ""
-"същото действие като опцията „--all-progress“ при извеждането на напредъка"
+#: builtin/log.c:991
+msgid "Cover letter needs email format"
+msgstr "Придружаващото писмо трябва да е форматирано като е-писмо"
 
-#: builtin/pack-objects.c:2605
-msgid "version[,offset]"
-msgstr "ВЕРСИЯ[,ОТМЕСТВАНЕ]"
+#: builtin/log.c:1071
+#, c-format
+msgid "insane in-reply-to: %s"
+msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
 
-#: builtin/pack-objects.c:2606
-msgid "write the pack index file in the specified idx format version"
-msgstr ""
-"запазване на индекса на пакетните файлове във форма̀та с указаната версия"
+#: builtin/log.c:1098
+msgid "git format-patch [<options>] [<since> | <revision-range>]"
+msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
 
-#: builtin/pack-objects.c:2609
-msgid "maximum size of each output pack file"
-msgstr "макÑ\81имален Ñ\80азмеÑ\80 Ð½Ð° Ð²Ñ\81еки Ð¿Ð°ÐºÐµÑ\82ен Ñ\84айл"
+#: builtin/log.c:1148
+msgid "Two output directories?"
+msgstr "Ð\9cожеÑ\82е Ð´Ð° Ñ\83кажеÑ\82е Ð¼Ð°ÐºÑ\81имÑ\83м ÐµÐ´Ð½Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð·Ð° Ð¸Ð·Ñ\85од."
 
-#: builtin/pack-objects.c:2611
-msgid "ignore borrowed objects from alternate object store"
-msgstr "игнориране на обектите заети от други хранилища на обекти"
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Непознато подаване „%s“"
 
-#: builtin/pack-objects.c:2613
-msgid "ignore packed objects"
-msgstr "игнориране на пакетираните обекти"
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr "Не може да се открие към какво сочи „%s“."
 
-#: builtin/pack-objects.c:2615
-msgid "limit pack window by objects"
-msgstr "огÑ\80аниÑ\87аване Ð½Ð° Ð¿Ñ\80озоÑ\80еÑ\86а Ð·Ð° Ð¿Ð°ÐºÐµÑ\82иÑ\80ане Ð¿Ð¾ Ð±Ñ\80ой Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/log.c:1270
+msgid "Could not find exact merge base."
+msgstr "ТоÑ\87наÑ\82а Ð±Ð°Ð·Ð° Ð·Ð° Ñ\81ливане Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82кÑ\80ие."
 
-#: builtin/pack-objects.c:2617
-msgid "limit pack window by memory in addition to object limit"
+#: builtin/log.c:1274
+msgid ""
+"Failed to get upstream, if you want to record base commit automatically,\n"
+"please use git branch --set-upstream-to to track a remote branch.\n"
+"Or you could specify base commit by --base=<base-commit-id> manually."
 msgstr ""
-"ограничаване на прозореца за пакетиране и по памет освен по брой обекти"
+"Следеният клон не може да бъде установен.  Ако искате ръчно да го\n"
+"зададете, използвайте „git branch --set-upstream-to“.\n"
+"Можете ръчно да зададете базово подаване чрез „--base=<base-commit-id>“."
 
-#: builtin/pack-objects.c:2619
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr ""
-"максимална дължина на веригата от разлики, която е позволена в пакетния файл"
+#: builtin/log.c:1294
+msgid "Failed to find exact merge base"
+msgstr "Точната база при сливане не може да бъде открита"
 
-#: builtin/pack-objects.c:2621
-msgid "reuse existing deltas"
-msgstr "пÑ\80еизползване Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89иÑ\82е Ñ\80азлики"
+#: builtin/log.c:1305
+msgid "base commit should be the ancestor of revision list"
+msgstr "базовоÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ðµ Ð¿Ñ\80едÑ\88еÑ\81Ñ\82веникÑ\8aÑ\82 Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð²ÐµÑ\80Ñ\81ииÑ\82е"
 
-#: builtin/pack-objects.c:2623
-msgid "reuse existing objects"
-msgstr "пÑ\80еизползване Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89иÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/log.c:1309
+msgid "base commit shouldn't be in revision list"
+msgstr "базовоÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ðµ Ð² Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð²ÐµÑ\80Ñ\81ииÑ\82е"
 
-#: builtin/pack-objects.c:2625
-msgid "use OFS_DELTA objects"
-msgstr "използване Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и â\80\9eOFS_DELTAâ\80\9c"
+#: builtin/log.c:1358
+msgid "cannot get patch id"
+msgstr "иденÑ\82иÑ\84икаÑ\82оÑ\80Ñ\8aÑ\82 Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾Ð»Ñ\83Ñ\87ен"
 
-#: builtin/pack-objects.c:2627
-msgid "use threads when searching for best delta matches"
-msgstr ""
-"стартиране на нишки за претърсване на най-добрите съвпадения на разликите"
+#: builtin/log.c:1415
+msgid "use [PATCH n/m] even with a single patch"
+msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
 
-#: builtin/pack-objects.c:2629
-msgid "do not create an empty pack output"
-msgstr "без Ñ\81Ñ\8aздаване Ð½Ð° Ð¿Ñ\80азен Ð¿Ð°ÐºÐµÑ\82ен Ñ\84айл"
+#: builtin/log.c:1418
+msgid "use [PATCH] even with multiple patches"
+msgstr "номеÑ\80аÑ\86иÑ\8f â\80\9e[PATCH]â\80\9c Ð´Ð¾Ñ\80и Ð¸ Ð¿Ñ\80и Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82во ÐºÑ\80Ñ\8aпки"
 
-#: builtin/pack-objects.c:2631
-msgid "read revision arguments from standard input"
-msgstr "изчитане на версиите от стандартния вход"
+#: builtin/log.c:1422
+msgid "print patches to standard out"
+msgstr "извеждане на кръпките на стандартния изход"
 
-#: builtin/pack-objects.c:2633
-msgid "limit the objects to those that are not yet packed"
-msgstr "ограничаване до все още непакетираните обекти"
+#: builtin/log.c:1424
+msgid "generate a cover letter"
+msgstr "създаване на придружаващо писмо"
 
-#: builtin/pack-objects.c:2636
-msgid "include objects reachable from any reference"
-msgstr ""
-"включване на всички обекти, които могат да се достигнат от произволен "
-"указател"
+#: builtin/log.c:1426
+msgid "use simple number sequence for output file names"
+msgstr "проста числова последователност за имената на файловете-кръпки"
 
-#: builtin/pack-objects.c:2639
-msgid "include objects referred by reflog entries"
-msgstr "вклÑ\8eÑ\87ване Ð¸ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ñ\81оÑ\87ени Ð¾Ñ\82 Ð·Ð°Ð¿Ð¸Ñ\81иÑ\82е Ð² Ð¶Ñ\83Ñ\80нала Ð½Ð° Ñ\83казаÑ\82елиÑ\82е"
+#: builtin/log.c:1427
+msgid "sfx"
+msgstr "Ð\97Ð\9dÐ\90ЦÐ\98"
 
-#: builtin/pack-objects.c:2642
-msgid "include objects referred to by the index"
-msgstr "вклÑ\8eÑ\87ване Ð¸ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ñ\81оÑ\87ени Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: builtin/log.c:1428
+msgid "use <sfx> instead of '.patch'"
+msgstr "използване Ð½Ð° Ñ\82ези Ð\97Ð\9dÐ\90ЦÐ\98 Ð·Ð° Ñ\81Ñ\83Ñ\84икÑ\81 Ð²Ð¼ÐµÑ\81Ñ\82о â\80\9e.patchâ\80\9c"
 
-#: builtin/pack-objects.c:2645
-msgid "output pack to stdout"
-msgstr "извеждане Ð½Ð° Ð¿Ð°ÐºÐµÑ\82а Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð¸Ð·Ñ\85од"
+#: builtin/log.c:1430
+msgid "start numbering patches at <n> instead of 1"
+msgstr "номеÑ\80иÑ\80анеÑ\82о Ð½Ð° ÐºÑ\80Ñ\8aпкиÑ\82е Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87ва Ð¾Ñ\82 Ñ\82ози Ð\91РÐ\9eÐ\99, Ð° Ð½Ðµ Ñ\81 1"
 
-#: builtin/pack-objects.c:2647
-msgid "include tag objects that refer to objects to be packed"
-msgstr ""
-"включване и на обектите-етикети, които сочат към обектите, които ще бъдат "
-"пакетирани"
+#: builtin/log.c:1432
+msgid "mark the series as Nth re-roll"
+msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
 
-#: builtin/pack-objects.c:2649
-msgid "keep unreachable objects"
-msgstr "запазване Ð½Ð° Ð½ÐµÐ´Ð¾Ñ\81Ñ\82ижимиÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Ð\98зползване Ð½Ð° â\80\9e[RFC PATCH]â\80\9c Ð²Ð¼ÐµÑ\81Ñ\82о â\80\9e[PATCH]â\80\9c"
 
-#: builtin/pack-objects.c:2650 parse-options.h:142
-msgid "time"
-msgstr "Ð\92РÐ\95Ð\9cÐ\95"
+#: builtin/log.c:1437
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr "Ð\98зползване Ð½Ð° Ñ\82ози â\80\9e\9fРÐ\95ФÐ\98Ð\9aС]â\80\9c Ð²Ð¼ÐµÑ\81Ñ\82о â\80\9e[PATCH]â\80\9c"
 
-#: builtin/pack-objects.c:2651
-msgid "unpack unreachable objects newer than <time>"
-msgstr "разпакетиране на недостижимите обекти, които са по-нови от това ВРЕМЕ"
+#: builtin/log.c:1440
+msgid "store resulting files in <dir>"
+msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
 
-#: builtin/pack-objects.c:2654
-msgid "create thin packs"
-msgstr "създаване на съкратени пакети"
+#: builtin/log.c:1443
+msgid "don't strip/add [PATCH]"
+msgstr "без добавяне/махане на префикса „[PATCH]“"
 
-#: builtin/pack-objects.c:2656
-msgid "create packs suitable for shallow fetches"
-msgstr "пакеÑ\82иÑ\80ане Ð¿Ð¾Ð´Ñ\85одÑ\8fÑ\89о Ð·Ð° Ð¿Ð»Ð¸Ñ\82ко Ð´Ð¾Ñ\81Ñ\82авÑ\8fне"
+#: builtin/log.c:1446
+msgid "don't output binary diffs"
+msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ñ\80азлики Ð¼ÐµÐ¶Ð´Ñ\83 Ð´Ð²Ð¾Ð¸Ñ\87ни Ñ\84айлове"
 
-#: builtin/pack-objects.c:2658
-msgid "ignore packs that have companion .keep file"
-msgstr "игноÑ\80иÑ\80ане Ð½Ð° Ð¿Ð°ÐºÐµÑ\82иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81а Ð¿Ñ\80идÑ\80Ñ\83жени Ð¾Ñ\82 Ñ\84айл â\80\9e.keepâ\80\9c"
+#: builtin/log.c:1448
+msgid "output all-zero hash in From header"
+msgstr "в Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ\82а Ñ\87аÑ\81Ñ\82 â\80\9eFrom:â\80\9c (оÑ\82) Ñ\85еÑ\88Ñ\8aÑ\82 Ð´Ð° Ðµ Ñ\81амо Ð¾Ñ\82 Ð½Ñ\83ли"
 
-#: builtin/pack-objects.c:2660
-msgid "pack compression level"
-msgstr "ниво Ð½Ð° ÐºÐ¾Ð¼Ð¿Ñ\80еÑ\81иÑ\80ане Ð¿Ñ\80и Ð¿Ð°ÐºÐµÑ\82иÑ\80ане"
+#: builtin/log.c:1450
+msgid "don't include a patch matching a commit upstream"
+msgstr "да Ð½Ðµ Ñ\81е Ð²ÐºÐ»Ñ\8eÑ\87ваÑ\82 ÐºÑ\80Ñ\8aпки, ÐºÐ¾Ð¸Ñ\82о Ð¿Ñ\80иÑ\81Ñ\8aÑ\81Ñ\82ваÑ\82 Ð² Ñ\81ледениÑ\8f ÐºÐ»Ð¾Ð½"
 
-#: builtin/pack-objects.c:2662
-msgid "do not hide commits by grafts"
+#: builtin/log.c:1452
+msgid "show patch format instead of default (patch + stat)"
 msgstr ""
-"извеждане на всички родители — дори и тези, които нормално са скрити при "
-"присажданията"
+"извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
 
-#: builtin/pack-objects.c:2664
-msgid "use a bitmap index if available to speed up counting objects"
-msgstr ""
-"използване на съществуващи индекси на база битови маски за ускоряване на "
-"преброяването на обектите"
+#: builtin/log.c:1454
+msgid "Messaging"
+msgstr "Опции при изпращане"
 
-#: builtin/pack-objects.c:2666
-msgid "write a bitmap index together with the pack index"
-msgstr ""
-"запазване и на индекс на база побитова маска, заедно с индекса за пакета"
+#: builtin/log.c:1455
+msgid "header"
+msgstr "ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/pack-objects.c:2757
-msgid "Counting objects"
-msgstr "Ð\9fÑ\80ебÑ\80оÑ\8fване Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
+#: builtin/log.c:1456
+msgid "add email header"
+msgstr "добавÑ\8fне Ð½Ð° Ñ\82ази Ð\97Ð\90Ð\93Ð\9bÐ\90Ð\92Ð\9dÐ\90_ЧÐ\90СТ"
 
-#: builtin/pack-refs.c:6
-msgid "git pack-refs [<options>]"
-msgstr "git pack-refs [ОПЦИЯ…]"
+#: builtin/log.c:1457 builtin/log.c:1459
+msgid "email"
+msgstr "Е-ПОЩА"
 
-#: builtin/pack-refs.c:14
-msgid "pack everything"
-msgstr "пакеÑ\82иÑ\80ане Ð½Ð° Ð²Ñ\81иÑ\87ко"
+#: builtin/log.c:1457
+msgid "add To: header"
+msgstr "добавÑ\8fне Ð½Ð° Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð° Ñ\87аÑ\81Ñ\82 â\80\9eTo:â\80\9c (до)"
 
-#: builtin/pack-refs.c:15
-msgid "prune loose refs (default)"
-msgstr "окаÑ\81Ñ\82Ñ\80Ñ\8fне Ð½Ð° Ð½ÐµÐ´Ð¾Ñ\81Ñ\82ижимиÑ\82е Ñ\83казаÑ\82ели (Ñ\81Ñ\82андаÑ\80Ñ\82но)"
+#: builtin/log.c:1459
+msgid "add Cc: header"
+msgstr "добавÑ\8fне Ð½Ð° Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð° Ñ\87аÑ\81Ñ\82 â\80\9eCc:â\80\9c (и Ð´о)"
 
-#: builtin/prune-packed.c:7
-msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
-msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
+#: builtin/log.c:1461
+msgid "ident"
+msgstr "ИДЕНТИЧНОСТ"
 
-#: builtin/prune-packed.c:40
-msgid "Removing duplicate objects"
-msgstr "Изтриване на повтарящите се обекти"
+#: builtin/log.c:1462
+msgid "set From address to <ident> (or committer ident if absent)"
+msgstr ""
+"задаване на адреса в заглавната част „From“ (от) да е тази ИДЕНТИЧНОСТ.  Ако "
+"не е зададена такава, се взима адреса на подаващия"
 
-#: builtin/prune.c:11
-msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
-msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
+#: builtin/log.c:1464
+msgid "message-id"
+msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/prune.c:105 builtin/worktree.c:125
-msgid "do not remove, show only"
-msgstr "само извеждане без действително окастряне"
+#: builtin/log.c:1465
+msgid "make first mail a reply to <message-id>"
+msgstr ""
+"първото съобщение да е в отговор на е-писмото с този "
+"ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/prune.c:106 builtin/worktree.c:126
-msgid "report pruned objects"
-msgstr "инÑ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ð¾ÐºÐ°Ñ\81Ñ\82Ñ\80ениÑ\82е Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/log.c:1466 builtin/log.c:1469
+msgid "boundary"
+msgstr "гÑ\80аниÑ\86а"
 
-#: builtin/prune.c:109 builtin/worktree.c:128
-msgid "expire objects older than <time>"
-msgstr "окаÑ\81Ñ\82Ñ\80Ñ\8fне Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е Ð¿Ð¾-Ñ\81Ñ\82аÑ\80и Ð¾Ñ\82 Ñ\82ова Ð\92РÐ\95Ð\9cÐ\95"
+#: builtin/log.c:1467
+msgid "attach the patch"
+msgstr "пÑ\80икÑ\80епÑ\8fне Ð½Ð° ÐºÑ\80Ñ\8aпкаÑ\82а"
 
-#: builtin/prune.c:123
-msgid "cannot prune in a precious-objects repo"
-msgstr "хранилище с важни обекти не може да се окастря"
+#: builtin/log.c:1470
+msgid "inline the patch"
+msgstr "включване на кръпката в текста на писмата"
 
-#: builtin/pull.c:72
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
+#: builtin/log.c:1474
+msgid "enable message threading, styles: shallow, deep"
+msgstr ""
+"използване на нишки за съобщенията.  СТИЛът е „shallow“ (плитък) или "
+"„deep“ (дълбок)"
 
-#: builtin/pull.c:120
-msgid "Options related to merging"
-msgstr "Ð\9eпÑ\86ии Ð¿Ñ\80и Ñ\81ливане"
+#: builtin/log.c:1476
+msgid "signature"
+msgstr "подпиÑ\81"
 
-#: builtin/pull.c:123
-msgid "incorporate changes by rebasing rather than merging"
-msgstr "внаÑ\81Ñ\8fне Ð½Ð° Ð¿Ñ\80омениÑ\82е Ñ\87Ñ\80ез Ð¿Ñ\80ебазиÑ\80ане, Ð° Ð½Ðµ Ñ\87Ñ\80ез Ñ\81ливане"
+#: builtin/log.c:1477
+msgid "add a signature"
+msgstr "добавÑ\8fне Ð½Ð° Ð¿Ð¾Ð»Ðµ Ð·Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81"
 
-#: builtin/pull.c:147 builtin/revert.c:105
-msgid "allow fast-forward"
-msgstr "позволÑ\8fване Ð½Ð° Ñ\82Ñ\80ивиални Ñ\81ливаниÑ\8f"
+#: builtin/log.c:1478
+msgid "base-commit"
+msgstr "Ð\91Ð\90Ð\97Ð\9eÐ\92Ð\9e\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
-#: builtin/pull.c:153
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "Ð\9fÑ\80овеÑ\80ка, Ñ\87е Ñ\83казаноÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ðµ Ñ\81 Ð¿Ñ\80авилен Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 Ð½Ð° GPG"
+#: builtin/log.c:1479
+msgid "add prerequisite tree info to the patch series"
+msgstr "добавÑ\8fне Ð½Ð° Ð½ÐµÐ¾Ð±Ñ\85одимоÑ\82о Ð\91Ð\90Ð\97ово Ð´Ñ\8aÑ\80во ÐºÑ\8aм Ñ\81еÑ\80иÑ\8fÑ\82а ÐºÑ\80Ñ\8aпки"
 
-#: builtin/pull.c:156
-msgid "automatically stash/stash pop before and after rebase"
-msgstr "авÑ\82омаÑ\82иÑ\87но Ñ\81каÑ\82аване/пÑ\80илагане Ð½Ð° Ñ\81каÑ\82аноÑ\82о Ð¿Ñ\80еди Ð¸ Ñ\81лед Ð¿Ñ\80ебазиÑ\80ане"
+#: builtin/log.c:1481
+msgid "add a signature from a file"
+msgstr "добавÑ\8fне Ð½Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 Ð¾Ñ\82 Ñ\84айл"
 
-#: builtin/pull.c:172
-msgid "Options related to fetching"
-msgstr "Ð\9eпÑ\86ии Ð¿Ñ\80и Ð´Ð¾Ñ\81Ñ\82авÑ\8fне"
+#: builtin/log.c:1482
+msgid "don't print the patch filenames"
+msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° ÐºÑ\80Ñ\8aпкиÑ\82е"
 
-#: builtin/pull.c:194
-msgid "number of submodules pulled in parallel"
-msgstr "бÑ\80ой Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли Ð¸Ð·Ð´Ñ\8aÑ\80пани Ð¿Ð°Ñ\80алелно"
+#: builtin/log.c:1572
+msgid "-n and -k are mutually exclusive."
+msgstr "опÑ\86ииÑ\82е â\80\9e-nâ\80\9c Ð¸ â\80\9e-kâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими."
 
-#: builtin/pull.c:283
-#, c-format
-msgid "Invalid value for pull.ff: %s"
-msgstr "Неправилна стойност за „pull.ff“: „%s“"
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "опциите „--subject-prefix“/„-rfc“ и „-k“ са несъвместими."
 
-#: builtin/pull.c:379
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-"Не можете да издърпвате при това пребазиране, защото има промени, които не "
-"са в индекса"
+#: builtin/log.c:1582
+msgid "--name-only does not make sense"
+msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
 
-#: builtin/pull.c:385
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Ð\9eÑ\81вен Ñ\82ова Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а Ð¸Ð¼Ð° Ð½ÐµÐ¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸ Ð¿Ñ\80омени."
+#: builtin/log.c:1584
+msgid "--name-status does not make sense"
+msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--name-statusâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ð³ÐµÐ½ÐµÑ\80иÑ\80анеÑ\82о Ð½Ð° ÐºÑ\80Ñ\8aпки"
 
-#: builtin/pull.c:387
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"Не можете да издърпвате при това пребазиране, защото в индекса има "
-"неподадени промени."
+#: builtin/log.c:1586
+msgid "--check does not make sense"
+msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
 
-#: builtin/pull.c:463
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
+#: builtin/log.c:1616
+msgid "standard output, or directory, which one?"
 msgstr ""
-"Между указателите, които току що доставихте, няма подходящ кандидат, върху "
-"който да пребазирате."
+"изходът може да или стандартният, или да е в директория, но не и двете."
 
-#: builtin/pull.c:465
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
-msgstr ""
-"Между указателите, които току що доставихте, няма подходящ кандидат, който "
-"да слеете."
+#: builtin/log.c:1618
+#, c-format
+msgid "Could not create directory '%s'"
+msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: builtin/pull.c:466
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-"Най вероятно сте подали шаблон за указатели, който не е напаснал с нищо в "
-"отдалеченото хранилище."
+#: builtin/log.c:1712
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "файлът „%s“ с подпис не може да бъде прочетен"
 
-#: builtin/pull.c:469
+#: builtin/log.c:1784
+msgid "Failed to create output files"
+msgstr "Изходните файлове не могат да бъдат създадени"
+
+#: builtin/log.c:1833
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
+
+#: builtin/log.c:1887
 #, c-format
 msgid ""
-"You asked to pull from the remote '%s', but did not specify\n"
-"a branch. Because this is not the default configured remote\n"
-"for your current branch, you must specify a branch on the command line."
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr ""
-"Заявихте издърпване от отдалеченото хранилище „%s“, но не указахте клон.\n"
-"Понеже това не е хранилището по подразбиране на текущия клон, трябва\n"
-"да укажете отдалечения клон на командния ред."
+"Следеният отдалечен клон не бе открит, затова изрично задайте "
+"ОТДАЛЕЧЕН_КЛОН.\n"
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
-msgid "You are not currently on a branch."
-msgstr "Извън всички клони."
+#: builtin/ls-files.c:468
+msgid "git ls-files [<options>] [<file>...]"
+msgstr "git ls-files [ОПЦИЯ…] [ФАЙЛ…]"
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
-msgid "Please specify which branch you want to rebase against."
-msgstr "УкажеÑ\82е Ð²Ñ\8aÑ\80Ñ\85Ñ\83 ÐºÐ¾Ð¹ ÐºÐ»Ð¾Ð½ Ð¸Ñ\81каÑ\82е Ð´Ð° Ð¿Ñ\80ебазиÑ\80аÑ\82е."
+#: builtin/ls-files.c:517
+msgid "identify the file status with tags"
+msgstr "извеждане Ð½Ð° Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о Ð½Ð° Ñ\84айловеÑ\82е Ñ\81 ÐµÐ´Ð½Ð¾Ð±Ñ\83квени Ñ\84лагове"
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
-msgid "Please specify which branch you want to merge with."
-msgstr "УкажеÑ\82е ÐºÐ¾Ð¹ ÐºÐ»Ð¾Ð½ Ð¸Ñ\81каÑ\82е Ð´Ð° Ñ\81лееÑ\82е."
+#: builtin/ls-files.c:519
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr "малки Ð±Ñ\83кви Ð·Ð° Ñ\84айловеÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð´Ð° Ñ\81е Ñ\81Ñ\87еÑ\82аÑ\82 Ð·Ð° Ð½ÐµÐ¿Ñ\80оменени"
 
-#: builtin/pull.c:479 builtin/pull.c:494
-msgid "See git-pull(1) for details."
-msgstr "Ð\97а Ð¿Ð¾Ð²ÐµÑ\87е Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð¿Ð¾Ð³Ð»ÐµÐ´Ð½ÐµÑ\82е Ñ\80Ñ\8aководÑ\81Ñ\82воÑ\82о â\80\9egit-pull(1)â\80\9c"
+#: builtin/ls-files.c:521
+msgid "show cached files in the output (default)"
+msgstr "извеждане Ð½Ð° ÐºÐµÑ\88иÑ\80аниÑ\82е Ñ\84айлове (Ñ\81Ñ\82андаÑ\80Ñ\82но)"
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
-#: git-parse-remote.sh:64
-msgid "<remote>"
-msgstr "ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ"
+#: builtin/ls-files.c:523
+msgid "show deleted files in the output"
+msgstr "извеждане на изтритите файлове"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501
-#: git-parse-remote.sh:65
-msgid "<branch>"
-msgstr "КЛОН"
+#: builtin/ls-files.c:525
+msgid "show modified files in the output"
+msgstr "извеждане на променените файлове"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
-msgid "There is no tracking information for the current branch."
-msgstr "ТекÑ\83Ñ\89иÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ Ð½Ðµ Ñ\81леди Ð½Ð¸ÐºÐ¾Ð¹."
+#: builtin/ls-files.c:527
+msgid "show other files in the output"
+msgstr "извеждане Ð½Ð° Ð´Ñ\80Ñ\83гиÑ\82е Ñ\84айлове"
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
-msgstr ""
-"Ако искате да зададете информация за следен клон, можете да направите това с "
-"командата:"
+#: builtin/ls-files.c:529
+msgid "show ignored files in the output"
+msgstr "извеждане на игнорираните файлове"
 
-#: builtin/pull.c:503
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-"За сливане е указан отдалеченият указател „%s“,\n"
-"но такъв не е доставен."
+#: builtin/ls-files.c:532
+msgid "show staged contents' object name in the output"
+msgstr "извеждане на името на обекта за съдържанието на индекса"
 
-#: builtin/pull.c:864
-msgid "--[no-]autostash option is only valid with --rebase."
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--[no-]autostashâ\80\9c Ð¸Ð·Ð¸Ñ\81ква â\80\9e--rebaseâ\80\9c"
+#: builtin/ls-files.c:534
+msgid "show files on the filesystem that need to be removed"
+msgstr "извеждане Ð½Ð° Ñ\84айловеÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ð±Ñ\8aдаÑ\82 Ð¸Ð·Ñ\82Ñ\80иÑ\82и"
 
-#: builtin/pull.c:872
-msgid "Updating an unborn branch with changes added to the index."
-msgstr "Ð\9eбновÑ\8fване Ð½Ð° Ð²Ñ\81е Ð¾Ñ\89е Ð½ÐµÑ\81Ñ\8aздаден ÐºÐ»Ð¾Ð½ Ñ\81 Ð¿Ñ\80омениÑ\82е Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: builtin/ls-files.c:536
+msgid "show 'other' directories' names only"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ð´Ñ\80Ñ\83гиÑ\82е (неÑ\81ледениÑ\82е) Ð´Ð¸Ñ\80екÑ\82оÑ\80ии"
 
-#: builtin/pull.c:900
-#, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
-msgstr ""
-"доставянето обнови върха на текущия клон. Работното\n"
-"ви копие бе тривиално слято от подаване „%s“."
+#: builtin/ls-files.c:538
+msgid "show line endings of files"
+msgstr "извеждане на знаците за край на ред във файловете"
 
-#: builtin/pull.c:905
-#, c-format
-msgid ""
-"Cannot fast-forward your working tree.\n"
-"After making sure that you saved anything precious from\n"
-"$ git diff %s\n"
-"output, run\n"
-"$ git reset --hard\n"
-"to recover."
+#: builtin/ls-files.c:540
+msgid "don't show empty directories"
+msgstr "без извеждане на празните директории"
+
+#: builtin/ls-files.c:543
+msgid "show unmerged files in the output"
+msgstr "извеждане на неслетите файлове"
+
+#: builtin/ls-files.c:545
+msgid "show resolve-undo information"
+msgstr "извеждане на информацията за отмяна на разрешените подавания"
+
+#: builtin/ls-files.c:547
+msgid "skip files matching pattern"
+msgstr "прескачане на файловете напасващи ШАБЛОНа"
+
+#: builtin/ls-files.c:550
+msgid "exclude patterns are read from <file>"
+msgstr "шаблоните за игнориране да се прочетат от този ФАЙЛ"
+
+#: builtin/ls-files.c:553
+msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
-"Работното ви копие не може да бъде тривиално слято.\n"
-"След като запазите всичко необходимо посочено от командата:\n"
-"  $ git diff %s\n"
-"изпълнете:\n"
-"  $ git reset --hard\n"
-"за връщане към нормално състояние."
+"изчитане на допълнителните шаблони за игнориране по директория от този ФАЙЛ"
 
-#: builtin/pull.c:920
-msgid "Cannot merge multiple branches into empty head."
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81ливаÑ\82е Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82во ÐºÐ»Ð¾Ð½Ð¸ Ð² Ð¿Ñ\80азен Ð²Ñ\8aÑ\80Ñ\85ов Ñ\83казаÑ\82ел."
+#: builtin/ls-files.c:555
+msgid "add the standard git exclusions"
+msgstr "добавÑ\8fне Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82но Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аниÑ\82е Ð¾Ñ\82 Git Ñ\84айлове"
 
-#: builtin/pull.c:924
-msgid "Cannot rebase onto multiple branches."
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80ебазиÑ\80аÑ\82е Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ñ\82 ÐµÐ´Ð¸Ð½ ÐºÐ»Ð¾Ð½."
+#: builtin/ls-files.c:558
+msgid "make the output relative to the project top directory"
+msgstr "пÑ\8aÑ\82иÑ\89аÑ\82а Ð´Ð° Ñ\81а Ð¾Ñ\82ноÑ\81иÑ\82елни Ñ\81пÑ\80Ñ\8fмо Ð¾Ñ\81новнаÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð½Ð° Ð¿Ñ\80оекÑ\82а"
 
-#: builtin/push.c:16
-msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
+msgstr "рекурсивно обхождане подмодулите"
 
-#: builtin/push.c:89
-msgid "tag shorthand without <tag>"
-msgstr "съкращение за етикет без ЕТИКЕТ"
+#: builtin/ls-files.c:563
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr "грешка, ако някой от тези ФАЙЛове не е в индекса"
 
-#: builtin/push.c:99
-msgid "--delete only accepts plain target ref names"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--deleteâ\80\9c Ð¿Ñ\80иема Ð·Ð° Ñ\86ел Ñ\81амо Ð¿Ñ\80оÑ\81Ñ\82и Ð¸Ð¼ÐµÐ½Ð° Ð½Ð° Ñ\83казаÑ\82ели"
+#: builtin/ls-files.c:564
+msgid "tree-ish"
+msgstr "УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9b\9aЪÐ\9c\94ЪРÐ\92Ð\9e"
 
-#: builtin/push.c:143
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
+#: builtin/ls-files.c:565
+msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
-"\n"
-"За да включите тази опция за постоянно, погледнете документацията за "
-"настройката „push.default“ в „git help config“."
+"считане, че пътищата изтрити след УКАЗАТЕЛя_КЪМ_ДЪРВО все още съществуват"
 
-#: builtin/push.c:146
-#, c-format
+#: builtin/ls-files.c:567
+msgid "show debugging data"
+msgstr "извеждане на информацията за изчистване на грешки"
+
+#: builtin/ls-remote.c:7
 msgid ""
-"The upstream branch of your current branch does not match\n"
-"the name of your current branch.  To push to the upstream branch\n"
-"on the remote, use\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"To push to the branch of the same name on the remote, use\n"
-"\n"
-"    git push %s %s\n"
-"%s"
+"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
+"                     [-q | --quiet] [--exit-code] [--get-url]\n"
+"                     [--symref] [<repository> [<refs>...]]"
 msgstr ""
-"Името на текущия клон се различава от името на клона, който той следи.\n"
-"За да изтласкате към следения клон използвайте командата:\n"
-"\n"
-"    git push %s HEAD:%s\n"
+"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=КОМАНДА]\n"
+"                     [-q | --quiet] [--exit-code] [--get-url]\n"
+"                     [--symref] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
+
+#: builtin/ls-remote.c:52
+msgid "do not print remote URL"
+msgstr "без извеждане на адресите на отдалечените хранилища"
+
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
+msgid "exec"
+msgstr "КОМАНДА"
+
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
+msgid "path of git-upload-pack on the remote host"
+msgstr "път към командата „git-upload-pack“ на отдалечената машина"
+
+#: builtin/ls-remote.c:58
+msgid "limit to tags"
+msgstr "само етикетите"
+
+#: builtin/ls-remote.c:59
+msgid "limit to heads"
+msgstr "само върховете"
+
+#: builtin/ls-remote.c:60
+msgid "do not show peeled tags"
+msgstr "без извеждане на проследените етикети"
+
+#: builtin/ls-remote.c:62
+msgid "take url.<base>.insteadOf into account"
+msgstr "взимане предвид на „url.БАЗА.insteadOf“"
+
+#: builtin/ls-remote.c:64
+msgid "exit with exit code 2 if no matching refs are found"
+msgstr "изход с код 2, ако не се открият съвпадащи указатели"
+
+#: builtin/ls-remote.c:66
+msgid "show underlying ref in addition to the object pointed by it"
+msgstr "извеждане на указателя заедно с обекта сочен от него"
+
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git ls-tree [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
+
+#: builtin/ls-tree.c:126
+msgid "only show trees"
+msgstr "извеждане само на дървета"
+
+#: builtin/ls-tree.c:128
+msgid "recurse into subtrees"
+msgstr "рекурсивно обхождане поддърветата"
+
+#: builtin/ls-tree.c:130
+msgid "show trees when recursing"
+msgstr "извеждане на дърветата при рекурсивното обхождане"
+
+#: builtin/ls-tree.c:133
+msgid "terminate entries with NUL byte"
+msgstr "разделяне на обектите с нулевия знак „NUL“"
+
+#: builtin/ls-tree.c:134
+msgid "include object size"
+msgstr "извеждане на размера на обекта"
+
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
+msgid "list only filenames"
+msgstr "извеждане само имената на файловете"
+
+#: builtin/ls-tree.c:141
+msgid "use full path names"
+msgstr "използване на пълните имена на пътищата"
+
+#: builtin/ls-tree.c:143
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr ""
+"извеждане на цялото дърво, не само на текущата директория (включва опцията "
+"„--full-name“)"
+
+#: builtin/merge.c:46
+msgid "git merge [<options>] [<commit>...]"
+msgstr "git merge [ОПЦИЯ…] [ПОДАВАНЕ…]"
+
+#: builtin/merge.c:47
+msgid "git merge --abort"
+msgstr "git merge --abort"
+
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
+msgid "switch `m' requires a value"
+msgstr "опцията „-m“ изисква стойност"
+
+#: builtin/merge.c:140
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
+msgstr "Няма такава стратегия за сливане: „%s“.\n"
+
+#: builtin/merge.c:141
+#, c-format
+msgid "Available strategies are:"
+msgstr "Наличните стратегии са:"
+
+#: builtin/merge.c:146
+#, c-format
+msgid "Available custom strategies are:"
+msgstr "Допълнителните стратегии са:"
+
+#: builtin/merge.c:196 builtin/pull.c:127
+msgid "do not show a diffstat at the end of the merge"
+msgstr "без извеждане на статистиката след завършване на сливане"
+
+#: builtin/merge.c:199 builtin/pull.c:130
+msgid "show a diffstat at the end of the merge"
+msgstr "извеждане на статистиката след завършване на сливане"
+
+#: builtin/merge.c:200 builtin/pull.c:133
+msgid "(synonym to --stat)"
+msgstr "(синоним на „--stat“)"
+
+#: builtin/merge.c:202 builtin/pull.c:136
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr ""
+"добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
+"за подаване"
+
+#: builtin/merge.c:205 builtin/pull.c:139
+msgid "create a single commit instead of doing a merge"
+msgstr "създаване на едно подаване вместо извършване на сливане"
+
+#: builtin/merge.c:207 builtin/pull.c:142
+msgid "perform a commit if the merge succeeds (default)"
+msgstr "извършване на подаване при успешно сливане (стандартно действие)"
+
+#: builtin/merge.c:209 builtin/pull.c:145
+msgid "edit message before committing"
+msgstr "редактиране на съобщението преди подаване"
+
+#: builtin/merge.c:210
+msgid "allow fast-forward (default)"
+msgstr "позволяване на превъртане (стандартно действие)"
+
+#: builtin/merge.c:212 builtin/pull.c:151
+msgid "abort if fast-forward is not possible"
+msgstr "преустановяване, ако превъртането е невъзможно"
+
+#: builtin/merge.c:216 builtin/pull.c:154
+msgid "verify that the named commit has a valid GPG signature"
+msgstr "Проверка, че указаното подаване е с правилен подпис на GPG"
+
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
+msgid "strategy"
+msgstr "СТРАТЕГИЯ"
+
+#: builtin/merge.c:218 builtin/pull.c:159
+msgid "merge strategy to use"
+msgstr "СТРАТЕГИЯ за сливане, която да се ползва"
+
+#: builtin/merge.c:219 builtin/pull.c:162
+msgid "option=value"
+msgstr "ОПЦИЯ=СТОЙНОСТ"
+
+#: builtin/merge.c:220 builtin/pull.c:163
+msgid "option for selected merge strategy"
+msgstr "ОПЦИЯ за избраната стратегия за сливане"
+
+#: builtin/merge.c:222
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr "СЪОБЩЕНИЕ при подаването със сливане (при същински сливания)"
+
+#: builtin/merge.c:226
+msgid "abort the current in-progress merge"
+msgstr "преустановяване на текущото сливане"
+
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "продължаване на текущото сливане"
+
+#: builtin/merge.c:230 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "позволяване на сливане на независими истории"
+
+#: builtin/merge.c:258
+msgid "could not run stash."
+msgstr "не може да се извърши скатаване"
+
+#: builtin/merge.c:263
+msgid "stash failed"
+msgstr "неуспешно скатаване"
+
+#: builtin/merge.c:268
+#, c-format
+msgid "not a valid object: %s"
+msgstr "неправилен обект: „%s“"
+
+#: builtin/merge.c:287 builtin/merge.c:304
+msgid "read-tree failed"
+msgstr "неуспешно прочитане на обект-дърво"
+
+#: builtin/merge.c:334
+msgid " (nothing to squash)"
+msgstr " (няма какво да се смачка)"
+
+#: builtin/merge.c:345
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
+msgstr "Подаване със смачкване — указателят „HEAD“ няма да бъде обновен\n"
+
+#: builtin/merge.c:395
+#, c-format
+msgid "No merge message -- not updating HEAD\n"
+msgstr ""
+"Липсва съобщение при подаване — указателят „HEAD“ няма да бъде обновен\n"
+
+#: builtin/merge.c:446
+#, c-format
+msgid "'%s' does not point to a commit"
+msgstr "„%s“ не сочи към подаване"
+
+#: builtin/merge.c:536
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
+msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“"
+
+#: builtin/merge.c:656
+msgid "Not handling anything other than two heads merge."
+msgstr "Поддържа се само сливане на точно две истории."
+
+#: builtin/merge.c:670
+#, c-format
+msgid "Unknown option for merge-recursive: -X%s"
+msgstr "Непозната опция за рекурсивното сливане „merge-recursive“: „-X%s“"
+
+#: builtin/merge.c:685
+#, c-format
+msgid "unable to write %s"
+msgstr "„%s“ не може да бъде записан"
+
+#: builtin/merge.c:737
+#, c-format
+msgid "Could not read from '%s'"
+msgstr "От „%s“ не може да се чете"
+
+#: builtin/merge.c:746
+#, c-format
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+msgstr ""
+"Сливането няма да бъде подадено.  За завършването му и подаването му "
+"използвайте командата „git commit“.\n"
+
+#: builtin/merge.c:752
+#, c-format
+msgid ""
+"Please enter a commit message to explain why this merge is necessary,\n"
+"especially if it merges an updated upstream into a topic branch.\n"
 "\n"
-"За да изтласкате към отдалечения клон с име като локалния, използвайте "
-"командата:\n"
+"Lines starting with '%c' will be ignored, and an empty message aborts\n"
+"the commit.\n"
+msgstr ""
+"В съобщението при подаване добавете информация за причината за\n"
+"сливането, особено ако сливате обновен отдалечен клон в тематичен клон.\n"
 "\n"
-"    git push %s %s\n"
-"%s"
+"Редовете, които започват с „%c“ ще бъдат пропуснати, а празно съобщение\n"
+"преустановява подаването.\n"
+
+#: builtin/merge.c:776
+msgid "Empty commit message."
+msgstr "Празно съобщение при подаване."
+
+#: builtin/merge.c:796
+#, c-format
+msgid "Wonderful.\n"
+msgstr "Първият етап на сливането завърши.\n"
+
+#: builtin/merge.c:851
+#, c-format
+msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
+msgstr ""
+"Неуспешно автоматично сливане — коригирайте конфликтите и подайте "
+"резултата.\n"
+
+#: builtin/merge.c:890
+msgid "No current branch."
+msgstr "Няма текущ клон."
+
+#: builtin/merge.c:892
+msgid "No remote for the current branch."
+msgstr "Текущият клон не следи никой."
+
+#: builtin/merge.c:894
+msgid "No default upstream defined for the current branch."
+msgstr "Текущият клон не следи никой клон."
+
+#: builtin/merge.c:899
+#, c-format
+msgid "No remote-tracking branch for %s from %s"
+msgstr "Никой клон не следи клона „%s“ от хранилището „%s“"
+
+#: builtin/merge.c:946
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Неправилна стойност „%s“ в средата „%s“"
+
+#: builtin/merge.c:1020
+#, c-format
+msgid "could not close '%s'"
+msgstr "„%s“ не може да се затвори"
+
+#: builtin/merge.c:1047
+#, c-format
+msgid "not something we can merge in %s: %s"
+msgstr "не може да се слее в „%s“: %s"
+
+#: builtin/merge.c:1081
+msgid "not something we can merge"
+msgstr "не може да се слее"
+
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "опцията „--abort“ не приема аргументи"
+
+#: builtin/merge.c:1150
+msgid "There is no merge to abort (MERGE_HEAD missing)."
+msgstr ""
+"Не може да преустановите сливане, защото в момента не се извършва такова "
+"(липсва указател „MERGE_HEAD“)."
+
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "опцията „--continue“ не приема аргументи"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "В момента не се извършва сливане (липсва указател „MERGE_HEAD“)."
+
+#: builtin/merge.c:1182
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you merge."
+msgstr ""
+"Не сте завършили сливане.  (Указателят „MERGE_HEAD“ съществува).\n"
+"Подайте промените си, преди да започнете ново сливане."
+
+#: builtin/merge.c:1189
+msgid ""
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you merge."
+msgstr ""
+"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
+"съществува).  Подайте промените си, преди да започнете ново сливане."
+
+#: builtin/merge.c:1192
+msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
+msgstr ""
+"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
+"съществува)."
+
+#: builtin/merge.c:1201
+msgid "You cannot combine --squash with --no-ff."
+msgstr "Опцията „--squash“ е несъвместима с „--no-ff“."
+
+#: builtin/merge.c:1209
+msgid "No commit specified and merge.defaultToUpstream not set."
+msgstr ""
+"Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена."
+
+#: builtin/merge.c:1226
+msgid "Squash commit into empty head not supported yet"
+msgstr "Подаване със смачкване във връх без история все още не се поддържа"
+
+#: builtin/merge.c:1228
+msgid "Non-fast-forward commit does not make sense into an empty head"
+msgstr ""
+"Понеже върхът е без история, всички сливания са превъртания, не може да се "
+"извърши същинско сливане изисквано от опцията „--no-ff“"
+
+#: builtin/merge.c:1233
+#, c-format
+msgid "%s - not something we can merge"
+msgstr "„%s“ — не е нещо, което може да се слее"
+
+#: builtin/merge.c:1235
+msgid "Can merge only exactly one commit into empty head"
+msgstr "Можете да слеете точно едно подаване във връх без история"
+
+#: builtin/merge.c:1269
+#, c-format
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+msgstr ""
+"Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
+
+#: builtin/merge.c:1272
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgstr ""
+"Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
+
+#: builtin/merge.c:1275
+#, c-format
+msgid "Commit %s does not have a GPG signature."
+msgstr "Подаването „%s“ е без подпис от GPG."
+
+#: builtin/merge.c:1278
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
+msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
+
+#: builtin/merge.c:1340
+msgid "refusing to merge unrelated histories"
+msgstr "независими истории не може да се слеят"
+
+#: builtin/merge.c:1349
+msgid "Already up-to-date."
+msgstr "Вече е обновено."
+
+#: builtin/merge.c:1359
+#, c-format
+msgid "Updating %s..%s\n"
+msgstr "Обновяване „%s..%s“\n"
+
+#: builtin/merge.c:1400
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
+msgstr "Проба със сливане в рамките на индекса…\n"
+
+#: builtin/merge.c:1407
+#, c-format
+msgid "Nope.\n"
+msgstr "Неуспешно сливане.\n"
+
+#: builtin/merge.c:1432
+msgid "Already up-to-date. Yeeah!"
+msgstr "Вече е обновено!"
+
+#: builtin/merge.c:1438
+msgid "Not possible to fast-forward, aborting."
+msgstr "Не може да се извърши превъртане, преустановяване на действието."
+
+#: builtin/merge.c:1461 builtin/merge.c:1540
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
+msgstr "Привеждане на дървото към първоначалното…\n"
+
+#: builtin/merge.c:1465
+#, c-format
+msgid "Trying merge strategy %s...\n"
+msgstr "Пробване със стратегията за сливане „%s“…\n"
+
+#: builtin/merge.c:1531
+#, c-format
+msgid "No merge strategy handled the merge.\n"
+msgstr "Никоя стратегия за сливане не може да извърши сливането.\n"
+
+#: builtin/merge.c:1533
+#, c-format
+msgid "Merge with strategy %s failed.\n"
+msgstr "Неуспешно сливане със стратегия „%s“.\n"
+
+#: builtin/merge.c:1542
+#, c-format
+msgid "Using the %s to prepare resolving by hand.\n"
+msgstr ""
+"Ползва се стратегията „%s“, която ще подготви дървото за коригиране на "
+"ръка.\n"
+
+#: builtin/merge.c:1554
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
+msgstr ""
+"Автоматичното сливане завърши успешно.  Самото подаване не е извършено, "
+"защото бе зададена опцията „--no-commit“.\n"
+
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a | --all] <commit> <commit>..."
+msgstr "git merge-base [-a | --all] ПОДАВАНЕ ПОДАВАНЕ…"
+
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a | --all] --octopus <commit>..."
+msgstr "git merge-base [-a | --all] --octopus ПОДАВАНЕ…"
+
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
+msgstr "git merge-base --independent ПОДАВАНЕ…"
+
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr "git merge-base --is-ancestor ПОДАВАНЕ_1 ПОДАВАНЕ_2"
+
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
+msgstr "git merge-base --fork-point УКАЗАТЕЛ [ПОДАВАНЕ]"
+
+#: builtin/merge-base.c:217
+msgid "output all common ancestors"
+msgstr "извеждане на всички общи предшественици"
+
+#: builtin/merge-base.c:219
+msgid "find ancestors for a single n-way merge"
+msgstr ""
+"откриване на предшествениците за еднократно сливане на множество истории"
+
+#: builtin/merge-base.c:221
+msgid "list revs not reachable from others"
+msgstr "извеждане на недостижимите от другите указатели"
+
+#: builtin/merge-base.c:223
+msgid "is the first one ancestor of the other?"
+msgstr "ПОДАВАНЕ_1 предшественик ли е на ПОДАВАНЕ_2?"
+
+#: builtin/merge-base.c:225
+msgid "find where <commit> forked from reflog of <ref>"
+msgstr "откриване къде ПОДАВАНЕто се е отклонило от историята на УКАЗАТЕЛя"
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
+"<orig-file> <file2>"
+msgstr ""
+"git merge-file [ОПЦИЯ…] [-L ИМЕ_1 [-L ОРИГИНАЛ [-L ИМЕ_2]]] ФАЙЛ_1 ОРИГ_ФАЙЛ "
+"ФАЙЛ_2"
+
+#: builtin/merge-file.c:32
+msgid "send results to standard output"
+msgstr "извеждане на резултатите на стандартния изход"
+
+#: builtin/merge-file.c:33
+msgid "use a diff3 based merge"
+msgstr "сливане на базата на „diff3“"
+
+#: builtin/merge-file.c:34
+msgid "for conflicts, use our version"
+msgstr "при конфликти да се ползва локалната версия"
+
+#: builtin/merge-file.c:36
+msgid "for conflicts, use their version"
+msgstr "при конфликти да се ползва чуждата версия"
+
+#: builtin/merge-file.c:38
+msgid "for conflicts, use a union version"
+msgstr "при конфликти да се ползва обединена версия"
+
+#: builtin/merge-file.c:41
+msgid "for conflicts, use this marker size"
+msgstr "при конфликти да се ползва маркер с такъв БРОЙ знаци"
+
+#: builtin/merge-file.c:42
+msgid "do not warn about conflicts"
+msgstr "без предупреждения при конфликти"
+
+#: builtin/merge-file.c:44
+msgid "set labels for file1/orig-file/file2"
+msgstr "задаване на етикети за ФАЙЛ_1/ОРИГИНАЛ/ФАЙЛ_2"
+
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "непозната опция: „%s“"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "неуспешен анализ на обекта „%s“"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "не се поддържа повече от %d база.  „%s“ се прескача."
+msgstr[1] "не се поддържат повече от %d бази.  „%s“ се прескача."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "поддържа се само сливане на точно две истории."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "указателят „%s“ не може да бъде изтрит"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Сливане на „%s“ с „%s“\n"
+
+#: builtin/mktree.c:65
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr "git mktree [-z] [--missing] [--batch]"
+
+#: builtin/mktree.c:152
+msgid "input is NUL terminated"
+msgstr "входните записи са разделени с нулевия знак „NUL“"
+
+#: builtin/mktree.c:153 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr "разрешаване на липсващи обекти"
+
+#: builtin/mktree.c:154
+msgid "allow creation of more than one tree"
+msgstr "разрешаване на създаването на повече от едно дърво"
+
+#: builtin/mv.c:16
+msgid "git mv [<options>] <source>... <destination>"
+msgstr "git mv [ОПЦИЯ…] ОБЕКТ… ЦЕЛ"
+
+#: builtin/mv.c:82
+#, c-format
+msgid "Directory %s is in index and no submodule?"
+msgstr "Директорията „%s“ е в индекса, но не е подмодул"
+
+#: builtin/mv.c:84 builtin/rm.c:290
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"За да продължите, или вкарайте промените по файла „.gitmodules“ в индекса,\n"
+"или ги скатайте"
+
+#: builtin/mv.c:102
+#, c-format
+msgid "%.*s is in index"
+msgstr "„%.*s“ вече е в индекса"
+
+#: builtin/mv.c:124
+msgid "force move/rename even if target exists"
+msgstr "принудително преместване/преименуване дори целта да съществува"
+
+#: builtin/mv.c:125
+msgid "skip move/rename errors"
+msgstr "прескачане на грешките при преместване/преименуване"
+
+#: builtin/mv.c:167
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr "целта „%s“ съществува и не е директория"
+
+#: builtin/mv.c:178
+#, c-format
+msgid "Checking rename of '%s' to '%s'\n"
+msgstr "Проверка на преименуването на обект от „%s“ на „%s“\n"
+
+#: builtin/mv.c:182
+msgid "bad source"
+msgstr "неправилен обект"
+
+#: builtin/mv.c:185
+msgid "can not move directory into itself"
+msgstr "директория не може да се премести в себе си"
+
+#: builtin/mv.c:188
+msgid "cannot move directory over file"
+msgstr "директория не може да се премести върху файл"
+
+#: builtin/mv.c:197
+msgid "source directory is empty"
+msgstr "първоначалната директория е празна"
+
+#: builtin/mv.c:222
+msgid "not under version control"
+msgstr "не е под контрола на Git"
+
+#: builtin/mv.c:225
+msgid "destination exists"
+msgstr "целта съществува"
+
+#: builtin/mv.c:233
+#, c-format
+msgid "overwriting '%s'"
+msgstr "презаписване на „%s“"
+
+#: builtin/mv.c:236
+msgid "Cannot overwrite"
+msgstr "Презаписването е невъзможно"
+
+#: builtin/mv.c:239
+msgid "multiple sources for the same target"
+msgstr "множество източници за една цел"
+
+#: builtin/mv.c:241
+msgid "destination directory does not exist"
+msgstr "целевата директория не съществува"
+
+#: builtin/mv.c:248
+#, c-format
+msgid "%s, source=%s, destination=%s"
+msgstr "%s, обект: „%s“, цел: „%s“"
+
+#: builtin/mv.c:269
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Преименуване на „%s“ на „%s“\n"
+
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
+#, c-format
+msgid "renaming '%s' failed"
+msgstr "неуспешно преименуване на „%s“"
+
+#: builtin/name-rev.c:289
+msgid "git name-rev [<options>] <commit>..."
+msgstr "git name-rev [ОПЦИЯ…] ПОДАВАНЕ…"
+
+#: builtin/name-rev.c:290
+msgid "git name-rev [<options>] --all"
+msgstr "git name-rev [ОПЦИЯ…] --all"
+
+#: builtin/name-rev.c:291
+msgid "git name-rev [<options>] --stdin"
+msgstr "git name-rev [ОПЦИЯ…] --stdin"
+
+#: builtin/name-rev.c:346
+msgid "print only names (no SHA-1)"
+msgstr "извеждане само на имената (без сумите по SHA1)"
+
+#: builtin/name-rev.c:347
+msgid "only use tags to name the commits"
+msgstr "използване само на етикетите за именуване на подаванията"
+
+#: builtin/name-rev.c:349
+msgid "only use refs matching <pattern>"
+msgstr "използване само на указателите напасващи на ШАБЛОНа"
+
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "игнориране на указателите напасващи на ШАБЛОНа"
+
+#: builtin/name-rev.c:353
+msgid "list all commits reachable from all refs"
+msgstr ""
+"извеждане на всички подавания, които могат да бъдат достигнати от всички "
+"указатели"
+
+#: builtin/name-rev.c:354
+msgid "read from stdin"
+msgstr "четене от стандартния вход"
+
+#: builtin/name-rev.c:355
+msgid "allow to print `undefined` names (default)"
+msgstr "да се извеждат и недефинираните имена (стандартна стойност на опцията)"
+
+#: builtin/name-rev.c:361
+msgid "dereference tags in the input (internal use)"
+msgstr "извеждане на идентификаторите на обекти-етикети (за вътрешни нужди)"
+
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes-ref>] [list [<object>]]"
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] [list [ОБЕКТ]]"
+
+#: builtin/notes.c:26
+msgid ""
+"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
+"| (-c | -C) <object>] [<object>]"
+msgstr ""
+"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] add [-f] [--allow-empty] [-m СЪОБЩЕНИЕ "
+"| -F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]"
+
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
+msgstr ""
+"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] copy [-f] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
+
+#: builtin/notes.c:28
+msgid ""
+"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
+"(-c | -C) <object>] [<object>]"
+msgstr ""
+"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] append [--allow-empty] [-m СЪОБЩЕНИЕ | "
+"-F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]"
+
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] edit [--allow-empty] [ОБЕКТ]"
+
+#: builtin/notes.c:30
+msgid "git notes [--ref <notes-ref>] show [<object>]"
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] show [ОБЕКТ]"
+
+#: builtin/notes.c:31
+msgid ""
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+msgstr ""
+"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] merge [-v | -q] [-s СТРАТЕГИЯ] "
+"УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
+
+#: builtin/notes.c:32
+msgid "git notes merge --commit [-v | -q]"
+msgstr "git notes merge --commit [-v | -q]"
+
+#: builtin/notes.c:33
+msgid "git notes merge --abort [-v | -q]"
+msgstr "git notes merge --abort [-v | -q]"
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes-ref>] remove [<object>...]"
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] remove [ОБЕКТ…]"
+
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] prune [-n | -v]"
+
+#: builtin/notes.c:36
+msgid "git notes [--ref <notes-ref>] get-ref"
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] get-ref"
+
+#: builtin/notes.c:41
+msgid "git notes [list [<object>]]"
+msgstr "git notes [list [ОБЕКТ]]"
+
+#: builtin/notes.c:46
+msgid "git notes add [<options>] [<object>]"
+msgstr "git notes add [ОПЦИЯ…] [ОБЕКТ]"
+
+#: builtin/notes.c:51
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr "git notes copy [ОПЦИЯ…] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
+
+#: builtin/notes.c:52
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr "git notes copy --stdin [ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ…]"
+
+#: builtin/notes.c:57
+msgid "git notes append [<options>] [<object>]"
+msgstr "git notes append [ОПЦИЯ…] [ОБЕКТ]"
+
+#: builtin/notes.c:62
+msgid "git notes edit [<object>]"
+msgstr "git notes edit [ОБЕКТ]"
+
+#: builtin/notes.c:67
+msgid "git notes show [<object>]"
+msgstr "git notes show [ОБЕКТ]"
+
+#: builtin/notes.c:72
+msgid "git notes merge [<options>] <notes-ref>"
+msgstr "git notes merge [ОПЦИЯ…] УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
+
+#: builtin/notes.c:73
+msgid "git notes merge --commit [<options>]"
+msgstr "git notes merge --commit [ОПЦИЯ…]"
+
+#: builtin/notes.c:74
+msgid "git notes merge --abort [<options>]"
+msgstr "git notes merge --abort [ОПЦИЯ…]"
+
+#: builtin/notes.c:79
+msgid "git notes remove [<object>]"
+msgstr "git notes remove [ОБЕКТ]"
+
+#: builtin/notes.c:84
+msgid "git notes prune [<options>]"
+msgstr "git notes prune [ОПЦИЯ…]"
+
+#: builtin/notes.c:89
+msgid "git notes get-ref"
+msgstr "git notes get-ref"
+
+#: builtin/notes.c:94
+msgid "Write/edit the notes for the following object:"
+msgstr "Записване/редактиране на бележките за следния обект:"
+
+#: builtin/notes.c:147
+#, c-format
+msgid "unable to start 'show' for object '%s'"
+msgstr "действието „show“ не може да се изпълни за обект „%s“"
+
+#: builtin/notes.c:151
+msgid "could not read 'show' output"
+msgstr "изведената информация от действието „show“ не може да се прочете"
+
+#: builtin/notes.c:159
+#, c-format
+msgid "failed to finish 'show' for object '%s'"
+msgstr "действието „show“ не може да се завърши за обект „%s“"
+
+#: builtin/notes.c:194
+msgid "please supply the note contents using either -m or -F option"
+msgstr "задайте съдържанието на бележката с някоя от опциите „-m“ или „-F“"
+
+#: builtin/notes.c:203
+msgid "unable to write note object"
+msgstr "обектът-бележка не може да бъде записан"
+
+#: builtin/notes.c:205
+#, c-format
+msgid "the note contents have been left in %s"
+msgstr "съдържанието на бележката е във файла „%s“"
+
+#: builtin/notes.c:233 builtin/tag.c:516
+#, c-format
+msgid "cannot read '%s'"
+msgstr "файлът „%s“ не може да бъде прочетен"
+
+#: builtin/notes.c:235 builtin/tag.c:519
+#, c-format
+msgid "could not open or read '%s'"
+msgstr "файлът „%s“ не може да бъде отворен или прочетен"
+
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "не може да се открие към какво сочи „%s“."
+
+#: builtin/notes.c:257
+#, c-format
+msgid "failed to read object '%s'."
+msgstr "обектът „%s“ не може да бъде прочетен."
+
+#: builtin/notes.c:261
+#, c-format
+msgid "cannot read note data from non-blob object '%s'."
+msgstr ""
+"съдържанието на бележка не може да се вземе от обект, който не е BLOB: „%s“."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "входен ред с неправилен формат: „%s“."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "бележката не може да се копира от „%s“ към „%s“"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr ""
+"няма да се извърши „%s“ върху бележките в „%s“, защото са извън „refs/"
+"notes/“."
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
+msgid "too many parameters"
+msgstr "прекалено много параметри"
+
+#: builtin/notes.c:378 builtin/notes.c:664
+#, c-format
+msgid "no note found for object %s."
+msgstr "няма бележки за обекта „%s“."
+
+#: builtin/notes.c:399 builtin/notes.c:562
+msgid "note contents as a string"
+msgstr "низ, който е съдържанието на бележката"
+
+#: builtin/notes.c:402 builtin/notes.c:565
+msgid "note contents in a file"
+msgstr "ФАЙЛ със съдържанието на бележката"
+
+#: builtin/notes.c:405 builtin/notes.c:568
+msgid "reuse and edit specified note object"
+msgstr "преизползване и редактиране на указания ОБЕКТ-бележка"
+
+#: builtin/notes.c:408 builtin/notes.c:571
+msgid "reuse specified note object"
+msgstr "преизползване на указания ОБЕКТ-бележка"
+
+#: builtin/notes.c:411 builtin/notes.c:574
+msgid "allow storing empty note"
+msgstr "приемане и на празни бележки"
+
+#: builtin/notes.c:412 builtin/notes.c:483
+msgid "replace existing notes"
+msgstr "замяна на съществуващите бележки"
+
+#: builtin/notes.c:437
+#, c-format
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+"Не може да се добави бележка, защото такава вече съществува за обекта „%s“.  "
+"Използвайте опцията „-f“, за да презапишете съществуващи бележки."
+
+#: builtin/notes.c:452 builtin/notes.c:531
+#, c-format
+msgid "Overwriting existing notes for object %s\n"
+msgstr "Презаписване на съществуващите бележки за обекта „%s“\n"
+
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
+#, c-format
+msgid "Removing note for object %s\n"
+msgstr "Изтриване на бележката за обекта „%s“\n"
+
+#: builtin/notes.c:484
+msgid "read objects from stdin"
+msgstr "изчитане на обектите от стандартния вход"
+
+#: builtin/notes.c:486
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr ""
+"зареждане на настройките за КОМАНДАта, която презаписва подавания (включва "
+"опцията „--stdin“)"
+
+#: builtin/notes.c:504
+msgid "too few parameters"
+msgstr "прекалено малко параметри"
+
+#: builtin/notes.c:525
+#, c-format
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+"Не може да се копира бележка, защото такава вече съществува за обекта „%s“.  "
+"Използвайте опцията „-f“, за да презапишете съществуващи бележки."
+
+#: builtin/notes.c:537
+#, c-format
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "няма бележки за обекта-източник „%s“.  Не може да се копира."
+
+#: builtin/notes.c:589
+#, c-format
+msgid ""
+"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
+"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
+msgstr ""
+"Задаването на опциите „-m“/„-F“/„-c“/„-C“ с командата „edit“ вече е "
+"остаряло.\n"
+"Вместо това ги използвайте с подкомандата „add“: „git notes add -f -m/-F/-c/-"
+"C“.\n"
+
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "указателят „NOTES_MERGE_PARTIAL“ не може да бъде изтрит"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "указателят „NOTES_MERGE_REF“ не може да бъде изтрит"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "работната директория на „git notes merge“ не може да бъде изтрита"
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "указателят „NOTES_MERGE_PARTIAL“ не може да бъде прочетен"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "подаването от „NOTES_MERGE_PARTIAL“ не може да се открие."
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "подаването от „NOTES_MERGE_PARTIAL“ не може да се анализира."
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "не може да се открие към какво сочи „NOTES_MERGE_REF“"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "неуспешно сливане на бележките"
+
+#: builtin/notes.c:754
+#, c-format
+msgid "unknown notes merge strategy %s"
+msgstr "непозната стратегия за сливане на бележки „%s“"
+
+#: builtin/notes.c:770
+msgid "General options"
+msgstr "Общи опции"
+
+#: builtin/notes.c:772
+msgid "Merge options"
+msgstr "Опции при сливане"
+
+#: builtin/notes.c:774
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr ""
+"коригиране на конфликтите при сливане на бележките чрез тази СТРАТЕГИЯ — "
+"„manual“ (ръчно), „ours“ (вашата версия), „theirs“ (чуждата версия), "
+"„union“ (обединяване), „cat_sort_uniq“ (обединяване, подреждане, уникални "
+"резултати)"
+
+#: builtin/notes.c:776
+msgid "Committing unmerged notes"
+msgstr "Подаване на неслети бележки"
+
+#: builtin/notes.c:778
+msgid "finalize notes merge by committing unmerged notes"
+msgstr "завършване на сливането чрез подаване на неслети бележки"
+
+#: builtin/notes.c:780
+msgid "Aborting notes merge resolution"
+msgstr "Преустановяване на корекцията при сливането на бележки"
+
+#: builtin/notes.c:782
+msgid "abort notes merge"
+msgstr "преустановяване на сливането на бележки"
+
+#: builtin/notes.c:793
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "опциите „--commit“, „--abort“ и „-s“/„--strategy“ са несъвместими"
+
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
+msgstr "трябва да укажете указател към бележка за сливане."
+
+#: builtin/notes.c:822
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "неизвестна стратегия към опцията „-s“/„--strategy“: „%s“"
+
+#: builtin/notes.c:859
+#, c-format
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "в момента се извършва сливане на бележките в „%s“ при „%s“"
+
+#: builtin/notes.c:862
+#, c-format
+msgid "failed to store link to current notes ref (%s)"
+msgstr "не може да се запази връзка към указателя на текущата бележка („%s“)."
+
+#: builtin/notes.c:864
+#, c-format
+msgid ""
+"Automatic notes merge failed. Fix conflicts in %s and commit the result with "
+"'git notes merge --commit', or abort the merge with 'git notes merge --"
+"abort'.\n"
+msgstr ""
+"Неуспешно сливане на бележките.  Разрешете конфликтите в „%s“ и подайте "
+"резултата с „git notes merge --commit“ или преустановете сливането с "
+"командата „git notes merge --abort“.\n"
+
+#: builtin/notes.c:886
+#, c-format
+msgid "Object %s has no note\n"
+msgstr "Няма бележки за обекта „%s“\n"
+
+#: builtin/notes.c:898
+msgid "attempt to remove non-existent note is not an error"
+msgstr "опитът за изтриването на несъществуваща бележка не се счита за грешка"
+
+#: builtin/notes.c:901
+msgid "read object names from the standard input"
+msgstr "изчитане на имената на обектите от стандартния вход"
+
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "само извеждане без действително окастряне"
+
+#: builtin/notes.c:940
+msgid "report pruned notes"
+msgstr "докладване на окастрените обекти"
+
+#: builtin/notes.c:982
+msgid "notes-ref"
+msgstr "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
+
+#: builtin/notes.c:983
+msgid "use notes from <notes-ref>"
+msgstr "да се използва бележката сочена от този УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
+
+#: builtin/notes.c:1018
+#, c-format
+msgid "unknown subcommand: %s"
+msgstr "непозната подкоманда: %s"
+
+#: builtin/pack-objects.c:29
+msgid ""
+"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_УКАЗАТЕЛИ | < СПИСЪК_С_ОБЕКТИ]"
+
+#: builtin/pack-objects.c:30
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects [ОПЦИЯ…] ПРЕФИКС_НА_ИМЕТО [< СПИСЪК_С_УКАЗАТЕЛИ | < "
+"СПИСЪК_С_ОБЕКТИ]"
+
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
+#, c-format
+msgid "deflate error (%d)"
+msgstr "грешка при декомпресиране с „deflate“ (%d)"
+
+#: builtin/pack-objects.c:770
+msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
+msgstr ""
+"изключване на записването на битовата маска, пакетите са разделени поради "
+"стойността на „pack.packSizeLimit“"
+
+#: builtin/pack-objects.c:783
+msgid "Writing objects"
+msgstr "Записване на обектите"
+
+#: builtin/pack-objects.c:1063
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr ""
+"изключване на записването на битовата маска, защото някои обекти няма да се "
+"пакетират"
+
+#: builtin/pack-objects.c:2426
+msgid "Compressing objects"
+msgstr "Компресиране на обектите"
+
+#: builtin/pack-objects.c:2829
+#, c-format
+msgid "unsupported index version %s"
+msgstr "неподдържана версия на индекса „%s“"
+
+#: builtin/pack-objects.c:2833
+#, c-format
+msgid "bad index version '%s'"
+msgstr "неправилна версия на индекса „%s“"
+
+#: builtin/pack-objects.c:2863
+msgid "do not show progress meter"
+msgstr "без извеждане на напредъка"
+
+#: builtin/pack-objects.c:2865
+msgid "show progress meter"
+msgstr "извеждане на напредъка"
+
+#: builtin/pack-objects.c:2867
+msgid "show progress meter during object writing phase"
+msgstr "извеждане на напредъка във фазата на запазване на обектите"
+
+#: builtin/pack-objects.c:2870
+msgid "similar to --all-progress when progress meter is shown"
+msgstr ""
+"същото действие като опцията „--all-progress“ при извеждането на напредъка"
+
+#: builtin/pack-objects.c:2871
+msgid "version[,offset]"
+msgstr "ВЕРСИЯ[,ОТМЕСТВАНЕ]"
+
+#: builtin/pack-objects.c:2872
+msgid "write the pack index file in the specified idx format version"
+msgstr ""
+"запазване на индекса на пакетните файлове във форма̀та с указаната версия"
+
+#: builtin/pack-objects.c:2875
+msgid "maximum size of each output pack file"
+msgstr "максимален размер на всеки пакетен файл"
+
+#: builtin/pack-objects.c:2877
+msgid "ignore borrowed objects from alternate object store"
+msgstr "игнориране на обектите заети от други хранилища на обекти"
+
+#: builtin/pack-objects.c:2879
+msgid "ignore packed objects"
+msgstr "игнориране на пакетираните обекти"
+
+#: builtin/pack-objects.c:2881
+msgid "limit pack window by objects"
+msgstr "ограничаване на прозореца за пакетиране по брой обекти"
+
+#: builtin/pack-objects.c:2883
+msgid "limit pack window by memory in addition to object limit"
+msgstr ""
+"ограничаване на прозореца за пакетиране и по памет освен по брой обекти"
+
+#: builtin/pack-objects.c:2885
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr ""
+"максимална дължина на веригата от разлики, която е позволена в пакетния файл"
+
+#: builtin/pack-objects.c:2887
+msgid "reuse existing deltas"
+msgstr "преизползване на съществуващите разлики"
+
+#: builtin/pack-objects.c:2889
+msgid "reuse existing objects"
+msgstr "преизползване на съществуващите обекти"
+
+#: builtin/pack-objects.c:2891
+msgid "use OFS_DELTA objects"
+msgstr "използване на обекти „OFS_DELTA“"
+
+#: builtin/pack-objects.c:2893
+msgid "use threads when searching for best delta matches"
+msgstr ""
+"стартиране на нишки за претърсване на най-добрите съвпадения на разликите"
+
+#: builtin/pack-objects.c:2895
+msgid "do not create an empty pack output"
+msgstr "без създаване на празен пакетен файл"
+
+#: builtin/pack-objects.c:2897
+msgid "read revision arguments from standard input"
+msgstr "изчитане на версиите от стандартния вход"
+
+#: builtin/pack-objects.c:2899
+msgid "limit the objects to those that are not yet packed"
+msgstr "ограничаване до все още непакетираните обекти"
+
+#: builtin/pack-objects.c:2902
+msgid "include objects reachable from any reference"
+msgstr ""
+"включване на всички обекти, които могат да се достигнат от произволен "
+"указател"
+
+#: builtin/pack-objects.c:2905
+msgid "include objects referred by reflog entries"
+msgstr "включване и на обектите сочени от записите в журнала на указателите"
+
+#: builtin/pack-objects.c:2908
+msgid "include objects referred to by the index"
+msgstr "включване и на обектите сочени от индекса"
+
+#: builtin/pack-objects.c:2911
+msgid "output pack to stdout"
+msgstr "извеждане на пакета на стандартния изход"
+
+#: builtin/pack-objects.c:2913
+msgid "include tag objects that refer to objects to be packed"
+msgstr ""
+"включване и на обектите-етикети, които сочат към обектите, които ще бъдат "
+"пакетирани"
+
+#: builtin/pack-objects.c:2915
+msgid "keep unreachable objects"
+msgstr "запазване на недостижимите обекти"
+
+#: builtin/pack-objects.c:2917
+msgid "pack loose unreachable objects"
+msgstr "пакетиране и на недостижимите обекти"
+
+#: builtin/pack-objects.c:2919
+msgid "unpack unreachable objects newer than <time>"
+msgstr "разпакетиране на недостижимите обекти, които са по-нови от това ВРЕМЕ"
+
+#: builtin/pack-objects.c:2922
+msgid "create thin packs"
+msgstr "създаване на съкратени пакети"
+
+#: builtin/pack-objects.c:2924
+msgid "create packs suitable for shallow fetches"
+msgstr "пакетиране подходящо за плитко доставяне"
+
+#: builtin/pack-objects.c:2926
+msgid "ignore packs that have companion .keep file"
+msgstr "игнориране на пакетите, които са придружени от файл „.keep“"
+
+#: builtin/pack-objects.c:2928
+msgid "pack compression level"
+msgstr "ниво на компресиране при пакетиране"
+
+#: builtin/pack-objects.c:2930
+msgid "do not hide commits by grafts"
+msgstr ""
+"извеждане на всички родители — дори и тези, които нормално са скрити при "
+"присажданията"
+
+#: builtin/pack-objects.c:2932
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+"използване на съществуващи индекси на база битови маски за ускоряване на "
+"преброяването на обектите"
+
+#: builtin/pack-objects.c:2934
+msgid "write a bitmap index together with the pack index"
+msgstr ""
+"запазване и на индекс на база побитова маска, заедно с индекса за пакета"
+
+#: builtin/pack-objects.c:3061
+msgid "Counting objects"
+msgstr "Преброяване на обектите"
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [<options>]"
+msgstr "git pack-refs [ОПЦИЯ…]"
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr "пакетиране на всичко"
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr "окастряне на недостижимите указатели (стандартно)"
+
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
+msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
+
+#: builtin/prune-packed.c:40
+msgid "Removing duplicate objects"
+msgstr "Изтриване на повтарящите се обекти"
+
+#: builtin/prune.c:11
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
+
+#: builtin/prune.c:106
+msgid "report pruned objects"
+msgstr "информация за окастрените обекти"
+
+#: builtin/prune.c:109
+msgid "expire objects older than <time>"
+msgstr "окастряне на обектите по-стари от това ВРЕМЕ"
+
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "хранилище с важни обекти не може да се окастря"
+
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Неправилна стойност за „%s“: „%s“"
+
+#: builtin/pull.c:73
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
+
+#: builtin/pull.c:121
+msgid "Options related to merging"
+msgstr "Опции при сливане"
+
+#: builtin/pull.c:124
+msgid "incorporate changes by rebasing rather than merging"
+msgstr "внасяне на промените чрез пребазиране, а не чрез сливане"
+
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
+msgid "allow fast-forward"
+msgstr "позволяване на превъртания"
+
+#: builtin/pull.c:157
+msgid "automatically stash/stash pop before and after rebase"
+msgstr "автоматично скатаване/прилагане на скатаното преди и след пребазиране"
+
+#: builtin/pull.c:173
+msgid "Options related to fetching"
+msgstr "Опции при доставяне"
+
+#: builtin/pull.c:195
+msgid "number of submodules pulled in parallel"
+msgstr "брой подмодули издърпани паралелно"
+
+#: builtin/pull.c:284
+#, c-format
+msgid "Invalid value for pull.ff: %s"
+msgstr "Неправилна стойност за „pull.ff“: „%s“"
+
+#: builtin/pull.c:397
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr ""
+"Между указателите, които току що доставихте, няма подходящ кандидат, върху "
+"който да пребазирате."
+
+#: builtin/pull.c:399
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
+msgstr ""
+"Между указателите, които току що доставихте, няма подходящ кандидат, който "
+"да слеете."
+
+#: builtin/pull.c:400
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+msgstr ""
+"Най вероятно сте подали шаблон за указатели, който не е напаснал с нищо в "
+"отдалеченото хранилище."
+
+#: builtin/pull.c:403
+#, c-format
+msgid ""
+"You asked to pull from the remote '%s', but did not specify\n"
+"a branch. Because this is not the default configured remote\n"
+"for your current branch, you must specify a branch on the command line."
+msgstr ""
+"Заявихте издърпване от отдалеченото хранилище „%s“, но не указахте клон.\n"
+"Понеже това не е хранилището по подразбиране на текущия клон, трябва\n"
+"да укажете отдалечения клон на командния ред."
+
+#: builtin/pull.c:408 git-parse-remote.sh:73
+msgid "You are not currently on a branch."
+msgstr "Извън всички клони."
+
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
+msgid "Please specify which branch you want to rebase against."
+msgstr "Укажете върху кой клон искате да пребазирате."
+
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
+msgid "Please specify which branch you want to merge with."
+msgstr "Укажете кой клон искате да слеете."
+
+#: builtin/pull.c:413 builtin/pull.c:428
+msgid "See git-pull(1) for details."
+msgstr "За повече информация погледнете ръководството „git-pull(1)“"
+
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
+#: git-parse-remote.sh:64
+msgid "<remote>"
+msgstr "ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ"
+
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "КЛОН"
+
+#: builtin/pull.c:423 git-parse-remote.sh:75
+msgid "There is no tracking information for the current branch."
+msgstr "Текущият клон не следи никой."
+
+#: builtin/pull.c:432 git-parse-remote.sh:95
+msgid ""
+"If you wish to set tracking information for this branch you can do so with:"
+msgstr ""
+"Ако искате да зададете информация за следен клон, можете да направите това с "
+"командата:"
+
+#: builtin/pull.c:437
+#, c-format
+msgid ""
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
+msgstr ""
+"За сливане е указан отдалеченият указател „%s“,\n"
+"но такъв не е доставен."
+
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "без „--verify-signatures“ при пребазиране"
+
+#: builtin/pull.c:801
+msgid "--[no-]autostash option is only valid with --rebase."
+msgstr "опцията „--[no-]autostash“ изисква „--rebase“"
+
+#: builtin/pull.c:809
+msgid "Updating an unborn branch with changes added to the index."
+msgstr "Обновяване на все още несъздаден клон с промените от индекса"
+
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "издърпване с пребазиране"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "трябва да подадете или скатаете промените."
+
+#: builtin/pull.c:838
+#, c-format
+msgid ""
+"fetch updated the current branch head.\n"
+"fast-forwarding your working tree from\n"
+"commit %s."
+msgstr ""
+"доставянето обнови върха на текущия клон.  Работното\n"
+"ви копие бе превъртяно от подаване „%s“."
+
+#: builtin/pull.c:843
+#, c-format
+msgid ""
+"Cannot fast-forward your working tree.\n"
+"After making sure that you saved anything precious from\n"
+"$ git diff %s\n"
+"output, run\n"
+"$ git reset --hard\n"
+"to recover."
+msgstr ""
+"Работното ви копие не може да бъде превъртяно.\n"
+"След като запазите всичко необходимо посочено от командата:\n"
+"  $ git diff %s\n"
+"изпълнете:\n"
+"  $ git reset --hard\n"
+"за връщане към нормално състояние."
+
+#: builtin/pull.c:858
+msgid "Cannot merge multiple branches into empty head."
+msgstr "Не може да сливате множество клони в празен върхов указател."
+
+#: builtin/pull.c:862
+msgid "Cannot rebase onto multiple branches."
+msgstr "Не може да пребазирате върху повече от един клон."
+
+#: builtin/push.c:16
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
+
+#: builtin/push.c:89
+msgid "tag shorthand without <tag>"
+msgstr "съкращение за етикет без ЕТИКЕТ"
+
+#: builtin/push.c:99
+msgid "--delete only accepts plain target ref names"
+msgstr "опцията „--delete“ приема за цел само прости имена на указатели"
+
+#: builtin/push.c:143
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
+msgstr ""
+"\n"
+"За да включите тази опция за постоянно, погледнете документацията за "
+"настройката „push.default“ в „git help config“."
+
+#: builtin/push.c:146
+#, c-format
+msgid ""
+"The upstream branch of your current branch does not match\n"
+"the name of your current branch.  To push to the upstream branch\n"
+"on the remote, use\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"To push to the branch of the same name on the remote, use\n"
+"\n"
+"    git push %s %s\n"
+"%s"
+msgstr ""
+"Името на текущия клон се различава от името на клона, който той следи.\n"
+"За да изтласкате към следения клон използвайте командата:\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"За да изтласкате към отдалечения клон с име като локалния, използвайте "
+"командата:\n"
+"\n"
+"    git push %s %s\n"
+"%s"
+
+#: builtin/push.c:161
+#, c-format
+msgid ""
+"You are not currently on a branch.\n"
+"To push the history leading to the current (detached HEAD)\n"
+"state now, use\n"
+"\n"
+"    git push %s HEAD:<name-of-remote-branch>\n"
+msgstr ""
+"В момента не сте на никой клон.  За да изтласкате историята до състоянието,\n"
+"сочено в момента от указателя „HEAD“, използвайте командата:\n"
+"\n"
+"    git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
+
+#: builtin/push.c:175
+#, c-format
+msgid ""
+"The current branch %s has no upstream branch.\n"
+"To push the current branch and set the remote as upstream, use\n"
+"\n"
+"    git push --set-upstream %s %s\n"
+msgstr ""
+"Не е зададен отдалечен клон, който текущият клон „%s“ да следи.\n"
+"За да изтласкате локалния клон към отдалечен и същевременно да зададете\n"
+"втория като този, който първият следи, използвайте командата:\n"
+"\n"
+"    git push --set-upstream %s %s\n"
+
+#: builtin/push.c:183
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgstr ""
+"Текущият клон „%s“ следи няколко отдалечени клона, не можете просто да "
+"изтласкате."
+
+#: builtin/push.c:186
+#, c-format
+msgid ""
+"You are pushing to remote '%s', which is not the upstream of\n"
+"your current branch '%s', without telling me what to push\n"
+"to update which remote branch."
+msgstr ""
+"Изтласквате към отдалечения клон „%s“, който не е следен от текущия клон "
+"„%s“.\n"
+"Трябва да укажете коя версия да се изтласка, за обновяване на отдалечения "
+"клон."
+
+#: builtin/push.c:245
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+msgstr ""
+"Не сте указали версия за подаване, а настройката „push.default“ е "
+"„nothing“ (нищо без изрично указана версия да не се изтласква)"
+
+#: builtin/push.c:252
+msgid ""
+"Updates were rejected because the tip of your current branch is behind\n"
+"its remote counterpart. Integrate the remote changes (e.g.\n"
+"'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"Обновяването е отхвърлено, защото върхът на текущия ви клон е преди върха "
+"на\n"
+"отдалечения клон. Внесете отдалечените промени (напр. с командата „git "
+"pull…“),\n"
+"преди отново да изтласкате промените.  За повече информация вижте раздела\n"
+"„Note about fast-forwards“ в страницата от ръководството „git push --help“."
+
+#: builtin/push.c:258
+msgid ""
+"Updates were rejected because a pushed branch tip is behind its remote\n"
+"counterpart. Check out this branch and integrate the remote changes\n"
+"(e.g. 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"Обновяването е отхвърлено, защото върхът на изтласквания клон е преди върха\n"
+"на отдалечения клон.  Проверете клона и внесете отдалечените промени (напр.\n"
+"с командата „git pull…“), преди отново да изтласкате промените.  За повече\n"
+"информация погледнете раздела „Note about fast-forwards“ в страницата от\n"
+"ръководството „git push --help“."
+
+#: builtin/push.c:264
+msgid ""
+"Updates were rejected because the remote contains work that you do\n"
+"not have locally. This is usually caused by another repository pushing\n"
+"to the same ref. You may want to first integrate the remote changes\n"
+"(e.g., 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"Обновяването е отхвърлено, защото хранилището, към което изтласквате, "
+"съдържа\n"
+"промени, които липсват в локалното хранилище.  Най-честата причина за това "
+"е,\n"
+"че някой друг е изтласквал към същия клон.  Първо внесете отдалечените "
+"промени\n"
+"(напр. с командата „git pull…“), преди отново да изтласкате промените.\n"
+"За повече информация погледнете раздела „Note about fast-forwards“ в "
+"страницата\n"
+"от ръководството „git push --help“."
+
+#: builtin/push.c:271
+msgid "Updates were rejected because the tag already exists in the remote."
+msgstr ""
+"Изтласкването е отхвърлено, защото в отдалеченото хранилище съществува "
+"етикет,\n"
+"който ще припокриете с етикет от вашето хранилище."
+
+#: builtin/push.c:274
+msgid ""
+"You cannot update a remote ref that points at a non-commit object,\n"
+"or update a remote ref to make it point at a non-commit object,\n"
+"without using the '--force' option.\n"
+msgstr ""
+"Без да укажете опцията „--force“, не може да обновите отдалечен\n"
+"указател, който вече сочи към обект, който не е подаване, както и тепърва\n"
+"да го промените да сочи към подобен обект.\n"
+
+#: builtin/push.c:334
+#, c-format
+msgid "Pushing to %s\n"
+msgstr "Изтласкване към „%s“\n"
+
+#: builtin/push.c:338
+#, c-format
+msgid "failed to push some refs to '%s'"
+msgstr "част от указателите не бяха изтласкани към „%s“"
+
+#: builtin/push.c:369
+#, c-format
+msgid "bad repository '%s'"
+msgstr "неправилно указано хранилище „%s“"
+
+#: builtin/push.c:370
+msgid ""
+"No configured push destination.\n"
+"Either specify the URL from the command-line or configure a remote "
+"repository using\n"
+"\n"
+"    git remote add <name> <url>\n"
+"\n"
+"and then push using the remote name\n"
+"\n"
+"    git push <name>\n"
+msgstr ""
+"Не е указано хранилище, към което да се изтласква.\n"
+"Или укажете адреса на командния ред, или настройте отдалечено хранилище с "
+"командата:\n"
+"\n"
+"    git remote add ИМЕ АДРЕС\n"
+"\n"
+"и след това изтласкайте, като укажете името на отдалеченото хранилище:\n"
+"\n"
+"    git push ИМЕ\n"
+
+#: builtin/push.c:388
+msgid "--all and --tags are incompatible"
+msgstr "опциите „--all“ и „--tags“ са несъвместими"
+
+#: builtin/push.c:389
+msgid "--all can't be combined with refspecs"
+msgstr "опцията „--all“ е несъвместима с указването на версия"
+
+#: builtin/push.c:394
+msgid "--mirror and --tags are incompatible"
+msgstr "опциите „--mirror“ и „--tags“ са несъвместими"
+
+#: builtin/push.c:395
+msgid "--mirror can't be combined with refspecs"
+msgstr "опцията „--mirror“ е несъвместима с указването на версия"
+
+#: builtin/push.c:400
+msgid "--all and --mirror are incompatible"
+msgstr "опциите „--all“ и „--mirror“ са несъвместими"
+
+#: builtin/push.c:518
+msgid "repository"
+msgstr "хранилище"
+
+#: builtin/push.c:519 builtin/send-pack.c:162
+msgid "push all refs"
+msgstr "изтласкване на всички указатели"
+
+#: builtin/push.c:520 builtin/send-pack.c:164
+msgid "mirror all refs"
+msgstr "огледално копие на всички указатели"
+
+#: builtin/push.c:522
+msgid "delete refs"
+msgstr "изтриване на указателите"
+
+#: builtin/push.c:523
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr "изтласкване на етикетите (несъвместимо с опциите „--all“ и „--mirror“)"
+
+#: builtin/push.c:526 builtin/send-pack.c:165
+msgid "force updates"
+msgstr "принудително обновяване"
+
+#: builtin/push.c:528 builtin/send-pack.c:179
+msgid "refname>:<expect"
+msgstr "УКАЗАТЕЛ>:<ОЧАКВАНА_СТОЙНОСТ"
+
+#: builtin/push.c:529 builtin/send-pack.c:180
+msgid "require old value of ref to be at this value"
+msgstr "УКАЗАТЕЛят трябва първоначално да е с тази ОЧАКВАНА_СТОЙНОСТ"
+
+#: builtin/push.c:532
+msgid "control recursive pushing of submodules"
+msgstr "управление на рекурсивното изтласкване на подмодулите"
+
+#: builtin/push.c:534 builtin/send-pack.c:173
+msgid "use thin pack"
+msgstr "използване на съкратени пакети"
+
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
+msgid "receive pack program"
+msgstr "програма за получаването на пакети"
+
+#: builtin/push.c:537
+msgid "set upstream for git pull/status"
+msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
+
+#: builtin/push.c:540
+msgid "prune locally removed refs"
+msgstr "окастряне на указателите, които са премахнати от локалното хранилище"
+
+#: builtin/push.c:542
+msgid "bypass pre-push hook"
+msgstr "без изпълнение на куката преди изтласкване (pre-push)"
+
+#: builtin/push.c:543
+msgid "push missing but relevant tags"
+msgstr ""
+"изтласкване на липсващите в отдалеченото хранилище, но свързани с текущото "
+"изтласкване, етикети"
+
+#: builtin/push.c:546 builtin/send-pack.c:167
+msgid "GPG sign the push"
+msgstr "подписване на изтласкването с GPG"
+
+#: builtin/push.c:548 builtin/send-pack.c:174
+msgid "request atomic transaction on remote side"
+msgstr "изискване на атомарни операции от отсрещната страна"
+
+#: builtin/push.c:549 builtin/send-pack.c:170
+msgid "server-specific"
+msgstr "специфични за сървъра"
+
+#: builtin/push.c:549 builtin/send-pack.c:171
+msgid "option to transmit"
+msgstr "опция за пренос"
+
+#: builtin/push.c:563
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr ""
+"опцията „--delete“ е несъвместима с опциите  „--all“, „--mirror“ и „--tags“"
+
+#: builtin/push.c:565
+msgid "--delete doesn't make sense without any refs"
+msgstr "опцията „--delete“ изисква поне един указател на версия"
+
+#: builtin/push.c:584
+msgid "push options must not have new line characters"
+msgstr "опциите за изтласкване не трябва да съдържат знак за нов ред"
+
+#: builtin/read-tree.c:40
+msgid ""
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr ""
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=ПРЕФИКС) "
+"[-u [--exclude-per-directory=ФАЙЛ_С_ИЗКЛЮЧЕНИЯ] | -i]] [--no-sparse-"
+"checkout] [--index-output=ФАЙЛ] (--empty | УКАЗАТЕЛ_КЪМ_ДЪРВО_1 "
+"[УКАЗАТЕЛ_КЪМ_ДЪРВО_2 [УКАЗАТЕЛ_КЪМ_ДЪРВО_3]])"
+
+#: builtin/read-tree.c:130
+msgid "write resulting index to <file>"
+msgstr "запазване на индекса в този ФАЙЛ"
+
+#: builtin/read-tree.c:133
+msgid "only empty the index"
+msgstr "само зануляване на индекса"
+
+#: builtin/read-tree.c:135
+msgid "Merging"
+msgstr "Сливане"
+
+#: builtin/read-tree.c:137
+msgid "perform a merge in addition to a read"
+msgstr "да се извърши и сливане след освен изчитането"
+
+#: builtin/read-tree.c:139
+msgid "3-way merge if no file level merging required"
+msgstr "тройно сливане, ако не се налага пофайлово сливане"
+
+#: builtin/read-tree.c:141
+msgid "3-way merge in presence of adds and removes"
+msgstr "тройно сливане при добавяне на добавяне и изтриване на файлове"
+
+#: builtin/read-tree.c:143
+msgid "same as -m, but discard unmerged entries"
+msgstr "същото като опцията „-m“, но неслетите обекти се пренебрегват"
+
+#: builtin/read-tree.c:144
+msgid "<subdirectory>/"
+msgstr "ПОДДИРЕКТОРИЯ/"
+
+#: builtin/read-tree.c:145
+msgid "read the tree into the index under <subdirectory>/"
+msgstr "изчитане на дървото към индекса като да е в тази ПОДДИРЕКТОРИЯ/"
+
+#: builtin/read-tree.c:148
+msgid "update working tree with merge result"
+msgstr "обновяване на работното дърво с резултата от сливането"
+
+#: builtin/read-tree.c:150
+msgid "gitignore"
+msgstr "ФАЙЛ_С_ИЗКЛЮЧЕНИЯ"
+
+#: builtin/read-tree.c:151
+msgid "allow explicitly ignored files to be overwritten"
+msgstr "позволяване на презаписването на изрично пренебрегваните файлове"
+
+#: builtin/read-tree.c:154
+msgid "don't check the working tree after merging"
+msgstr "без проверка на работното дърво след сливането"
+
+#: builtin/read-tree.c:155
+msgid "don't update the index or the work tree"
+msgstr "без обновяване и на индекса, и на работното дърво"
+
+#: builtin/read-tree.c:157
+msgid "skip applying sparse checkout filter"
+msgstr "без прилагане на филтъра за частично изтегляне"
+
+#: builtin/read-tree.c:159
+msgid "debug unpack-trees"
+msgstr "изчистване на грешки в командата „unpack-trees“"
+
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase--helper [ОПЦИЯ…]"
+
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "продължаване на пребазирането"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "преустановяване на пребазирането"
+
+#: builtin/receive-pack.c:27
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack ДИРЕКТОРИЯ_НА_GIT"
+
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Стандартно не може да обновите текущия клон в хранилище, което не е голо,\n"
+"защото това ще доведе до несъответствия на индекса и работното дърво с\n"
+"това, което сте изтласкали и за да приведете дървото към „HEAD“ ще трябва\n"
+"да изпълните:\n"
+"\n"
+"    git reset --hard\n"
+"\n"
+"\n"
+"За да позволите подобно изтласкване, в отдалеченото хранилище следва да\n"
+"зададете настройката „receive.denyCurrentBranch“ да е „ignore“\n"
+"(пренебрегване) или  „warn“ (само предупреждение).  Не се препоръчва да\n"
+"правите това, освен ако по друг начин не синхронизирате работното дърво с\n"
+"това, което изтласквате.\n"
+"\n"
+"За да заглушите това съобщение, като запазите стандартното поведение,\n"
+"задайте настройката „receive.denyCurrentBranch“ да е „refuse“ (отказ)."
+
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Стандартно не може да изтриете текущия клон, защото следващото клониране\n"
+"на текущото хранилище ще е без никакви файлове, а това е объркващо.\n"
+"\n"
+"За да може да изтривате текущия клон, в отдалеченото хранилище следва да\n"
+"зададете настройката „receive.denyDeleteCurrent“ да е „ignore“\n"
+"(пренебрегване) или  „warn“ (само предупреждение).\n"
+"\n"
+"За да заглушите това съобщение, задайте настройката\n"
+"„receive.denyDeleteCurrent“ да е „refuse“ (отказ)."
+
+#: builtin/receive-pack.c:1888
+msgid "quiet"
+msgstr "без извеждане на информация"
+
+#: builtin/receive-pack.c:1902
+msgid "You must specify a directory."
+msgstr "Трябва да укажете директория."
+
+#: builtin/reflog.c:423
+#, c-format
+msgid "'%s' for '%s' is not a valid timestamp"
+msgstr "„%s“ не е правилна стойност за време за „%s“"
+
+#: builtin/reflog.c:540 builtin/reflog.c:545
+#, c-format
+msgid "'%s' is not a valid timestamp"
+msgstr "„%s“ не е правилна стойност за време"
+
+#: builtin/remote.c:12
+msgid "git remote [-v | --verbose]"
+msgstr "git remote [-v | --verbose]"
+
+#: builtin/remote.c:13
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+"git remote add [-t КЛОН] [-m ОСНОВЕН_КЛОН] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] ИМЕ АДРЕС"
+
+#: builtin/remote.c:14 builtin/remote.c:34
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename СТАРО_ИМЕ НОВО_ИМЕ"
+
+#: builtin/remote.c:15 builtin/remote.c:39
+msgid "git remote remove <name>"
+msgstr "git remote remove ИМЕ"
+
+#: builtin/remote.c:16 builtin/remote.c:44
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr "git remote set-head ИМЕ (-a | --auto | -d | --delete | КЛОН)"
+
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] ИМЕ"
+
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] ИМЕ"
+
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(ГРУПА | "
+"ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ)…]"
+
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] ИМЕ КЛОН…"
+
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] ИМЕ"
+
+#: builtin/remote.c:22 builtin/remote.c:75
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr "git remote set-url [--push] ИМЕ НОВ_АДРЕС [СТАР_АДРЕС]"
+
+#: builtin/remote.c:23 builtin/remote.c:76
+msgid "git remote set-url --add <name> <newurl>"
+msgstr "git remote set-url --add ИМЕ НОВ_АДРЕС"
+
+#: builtin/remote.c:24 builtin/remote.c:77
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete ИМЕ АДРЕС"
+
+#: builtin/remote.c:29
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [ОПЦИЯ…] ИМЕ АДРЕС"
+
+#: builtin/remote.c:49
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches ИМЕ КЛОН…"
+
+#: builtin/remote.c:50
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add ИМЕ КЛОН…"
+
+#: builtin/remote.c:55
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [ОПЦИЯ…] ИМЕ"
+
+#: builtin/remote.c:60
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [ОПЦИЯ…] ИМЕ"
+
+#: builtin/remote.c:65
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [ОПЦИЯ…] [ГРУПА | ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ…]"
+
+#: builtin/remote.c:94
+#, c-format
+msgid "Updating %s"
+msgstr "Обновяване на „%s“"
+
+#: builtin/remote.c:126
+msgid ""
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
+msgstr ""
+"Използването само на „--mirror“ е опасно.  Вместо това\n"
+"ползвайте „--mirror=fetch“ или „--mirror=push“"
+
+#: builtin/remote.c:143
+#, c-format
+msgid "unknown mirror argument: %s"
+msgstr "неправилна стойност за „--mirror“: %s"
+
+#: builtin/remote.c:159
+msgid "fetch the remote branches"
+msgstr "отдалечените клони не могат да бъдат доставени"
+
+#: builtin/remote.c:161
+msgid "import all tags and associated objects when fetching"
+msgstr "внасяне на всички етикети и принадлежащите им обекти при доставяне"
+
+#: builtin/remote.c:164
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "може и да не се доставят никакви етикети (чрез опцията „--no-tags“)"
+
+#: builtin/remote.c:166
+msgid "branch(es) to track"
+msgstr "клон/и за следене"
+
+#: builtin/remote.c:167
+msgid "master branch"
+msgstr "основен клон"
+
+#: builtin/remote.c:168
+msgid "push|fetch"
+msgstr "издърпване|доставяне"
+
+#: builtin/remote.c:169
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr ""
+"настройване на отдалечено хранилище, от което да се издърпва или доставя"
+
+#: builtin/remote.c:181
+msgid "specifying a master branch makes no sense with --mirror"
+msgstr ""
+"няма смисъл да се указва основен клон при използване на опцията „--mirror“"
+
+#: builtin/remote.c:183
+msgid "specifying branches to track makes sense only with fetch mirrors"
+msgstr ""
+"указването на следени клони е смислено само за отдалечени хранилища, от "
+"които се доставя"
+
+#: builtin/remote.c:190 builtin/remote.c:629
+#, c-format
+msgid "remote %s already exists."
+msgstr "вече съществува отдалечено хранилище с име „%s“."
+
+#: builtin/remote.c:194 builtin/remote.c:633
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr "„%s“ е неправилно име за отдалечено хранилище"
+
+#: builtin/remote.c:234
+#, c-format
+msgid "Could not setup master '%s'"
+msgstr "Основният клон „%s“ не може да бъде настроен"
+
+#: builtin/remote.c:336
+#, c-format
+msgid "Could not get fetch map for refspec %s"
+msgstr "Обектите за доставяне за указателя „%s“ не могат да бъдат получени"
+
+#: builtin/remote.c:437 builtin/remote.c:445
+msgid "(matching)"
+msgstr "(съвпадащи)"
+
+#: builtin/remote.c:449
+msgid "(delete)"
+msgstr "(за изтриване)"
+
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
+#, c-format
+msgid "No such remote: %s"
+msgstr "Такова отдалечено хранилище няма: %s"
+
+#: builtin/remote.c:639
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
+msgstr "Разделът „%s“ в настройките не може да бъде преименуван на „%s“"
+
+#: builtin/remote.c:659
+#, c-format
+msgid ""
+"Not updating non-default fetch refspec\n"
+"\t%s\n"
+"\tPlease update the configuration manually if necessary."
+msgstr ""
+"Нестандартните указатели за доставяне няма да бъдат обновени\n"
+"    %s\n"
+"  Променете настройките ръчно, ако е необходимо."
+
+#: builtin/remote.c:695
+#, c-format
+msgid "deleting '%s' failed"
+msgstr "неуспешно изтриване на „%s“"
+
+#: builtin/remote.c:729
+#, c-format
+msgid "creating '%s' failed"
+msgstr "неуспешно създаване на „%s“"
+
+#: builtin/remote.c:794
+msgid ""
+"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
+"to delete it, use:"
+msgid_plural ""
+"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
+"to delete them, use:"
+msgstr[0] ""
+"Бележка: Клон извън йерархията „refs/remotes/“ не бе изтрит.\n"
+"Изтрийте го чрез командата:"
+msgstr[1] ""
+"Бележка: Няколко клона извън йерархията „refs/remotes/“ не бяха изтрити.\n"
+"Изтрийте ги чрез командата:"
+
+#: builtin/remote.c:808
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "Разделът „%s“ в настройките не може да бъде изтрит"
+
+#: builtin/remote.c:909
+#, c-format
+msgid " new (next fetch will store in remotes/%s)"
+msgstr " нов (следващото доставяне ще го разположи в „remotes/%s“)"
+
+#: builtin/remote.c:912
+msgid " tracked"
+msgstr " следен"
+
+#: builtin/remote.c:914
+msgid " stale (use 'git remote prune' to remove)"
+msgstr " стар (изтрийте чрез „git remote prune“)"
+
+#: builtin/remote.c:916
+msgid " ???"
+msgstr " неясно състояние"
+
+# CHECK
+#: builtin/remote.c:957
+#, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+msgstr ""
+"неправилен клон за сливане „%s“.  Невъзможно е да пребазирате върху повече "
+"от 1 клон"
+
+#: builtin/remote.c:965
+#, c-format
+msgid "rebases interactively onto remote %s"
+msgstr "интерактивно пребазиране върху отдалечения клон „%s“"
+
+#: builtin/remote.c:966
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "пребазиране върху отдалечения клон „%s“"
+
+#: builtin/remote.c:969
+#, c-format
+msgid " merges with remote %s"
+msgstr " сливане с отдалечения клон „%s“"
+
+#: builtin/remote.c:972
+#, c-format
+msgid "merges with remote %s"
+msgstr "сливане с отдалечения клон „%s“"
+
+#: builtin/remote.c:975
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    и с отдалечения клон „%s“\n"
+
+#: builtin/remote.c:1018
+msgid "create"
+msgstr "създаден"
+
+#: builtin/remote.c:1021
+msgid "delete"
+msgstr "изтрит"
+
+#: builtin/remote.c:1025
+msgid "up to date"
+msgstr "актуален"
+
+#: builtin/remote.c:1028
+msgid "fast-forwardable"
+msgstr "може да се превърти"
+
+#: builtin/remote.c:1031
+msgid "local out of date"
+msgstr "локалният е изостанал"
+
+#: builtin/remote.c:1038
+#, c-format
+msgid "    %-*s forces to %-*s (%s)"
+msgstr "    %-*s принудително изтласква към %-*s (%s)"
+
+#: builtin/remote.c:1041
+#, c-format
+msgid "    %-*s pushes to %-*s (%s)"
+msgstr "    %-*s изтласква към %-*s (%s)"
+
+#: builtin/remote.c:1045
+#, c-format
+msgid "    %-*s forces to %s"
+msgstr "    %-*s принудително изтласква към %s"
 
-#: builtin/push.c:161
+#: builtin/remote.c:1048
 #, c-format
-msgid ""
-"You are not currently on a branch.\n"
-"To push the history leading to the current (detached HEAD)\n"
-"state now, use\n"
-"\n"
-"    git push %s HEAD:<name-of-remote-branch>\n"
-msgstr ""
-"В момента не сте на никой клон. За да изтласкате историята до състоянието,\n"
-"сочено в момента от указателя „HEAD“, използвайте командата:\n"
-"\n"
-"    git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
+msgid "    %-*s pushes to %s"
+msgstr "    %-*s изтласква към %s"
 
-#: builtin/push.c:175
+#: builtin/remote.c:1116
+msgid "do not query remotes"
+msgstr "без заявки към отдалечените хранилища"
+
+#: builtin/remote.c:1143
 #, c-format
-msgid ""
-"The current branch %s has no upstream branch.\n"
-"To push the current branch and set the remote as upstream, use\n"
-"\n"
-"    git push --set-upstream %s %s\n"
-msgstr ""
-"Не е зададен отдалечен клон, който текущият клон „%s“ да следи.\n"
-"За да изтласкате локалния клон към отдалечен и същевременно да зададете\n"
-"втория като този, който първият следи, използвайте командата:\n"
-"\n"
-"    git push --set-upstream %s %s\n"
+msgid "* remote %s"
+msgstr "● отдалечено хранилище „%s“"
 
-#: builtin/push.c:183
+#: builtin/remote.c:1144
 #, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr ""
-"Текущият клон „%s“ следи няколко отдалечени клона, не можете просто да "
-"изтласкате."
+msgid "  Fetch URL: %s"
+msgstr "  Адрес за доставяне: %s"
 
-#: builtin/push.c:186
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
+msgid "(no URL)"
+msgstr "(без адрес)"
+
+#. TRANSLATORS: the colon ':' should align with
+#. the one in "  Fetch URL: %s" translation
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
-msgid ""
-"You are pushing to remote '%s', which is not the upstream of\n"
-"your current branch '%s', without telling me what to push\n"
-"to update which remote branch."
-msgstr ""
-"Изтласквате към отдалечения клон „%s“, който не е следен от текущия клон "
-"„%s“.\n"
-"Трябва да укажете коя версия да се изтласка, за обновяване на отдалечения "
-"клон."
+msgid "  Push  URL: %s"
+msgstr "  Адрес за изтласкване: %s"
 
-#: builtin/push.c:242
-msgid ""
-"You didn't specify any refspecs to push, and push.default is \"nothing\"."
-msgstr ""
-"Не сте указали версия за подаване, а настройката „push.default“ е "
-"„nothing“ (нищо без изрично указана версия да не се изтласква)"
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
+#, c-format
+msgid "  HEAD branch: %s"
+msgstr "  клон сочен от HEAD: %s"
 
-#: builtin/push.c:249
-msgid ""
-"Updates were rejected because the tip of your current branch is behind\n"
-"its remote counterpart. Integrate the remote changes (e.g.\n"
-"'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-"Обновяването е отхвърлено, защото върхът на текущия ви клон е преди върха "
-"на\n"
-"отдалечения клон. Внесете отдалечените промени (напр. с командата „git "
-"pull…“),\n"
-"преди отново да изтласкате промените. За повече информация вижте раздела\n"
-"„Note about fast-forwards“ в страницата от ръководството „git push --help“."
+#: builtin/remote.c:1160
+msgid "(not queried)"
+msgstr "(без проверка)"
 
-#: builtin/push.c:255
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. Check out this branch and integrate the remote changes\n"
-"(e.g. 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
-msgstr ""
-"Обновяването е отхвърлено, защото върхът на изтласквания клон е преди върха\n"
-"на отдалечения клон. Проверете клона и внесете отдалечените промени (напр.\n"
-"с командата „git pull…“), преди отново да изтласкате промените. За повече\n"
-"информация погледнете раздела „Note about fast-forwards“ в страницата от\n"
-"ръководството „git push --help“."
+#: builtin/remote.c:1162
+msgid "(unknown)"
+msgstr "(непознат)"
 
-#: builtin/push.c:261
+#: builtin/remote.c:1166
+#, c-format
 msgid ""
-"Updates were rejected because the remote contains work that you do\n"
-"not have locally. This is usually caused by another repository pushing\n"
-"to the same ref. You may want to first integrate the remote changes\n"
-"(e.g., 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
+"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
-"Обновяването е отхвърлено, защото хранилището, към което изтласквате, "
-"съдържа\n"
-"промени, които липсват в локалното хранилище. Най-честата причина за това "
-"е,\n"
-"че някой друг е изтласквал към същия клон. Първо внесете отдалечените "
-"промени\n"
-"(напр. с командата „git pull…“), преди отново да изтласкате промените.\n"
-"За повече информация погледнете раздела „Note about fast-forwards“ в "
-"страницата\n"
-"от ръководството „git push --help“."
+"  клонът сочен от HEAD (клонът указан във файла HEAD от отдалеченото "
+"хранилище\n"
+"  не е еднозначен и е някой от следните):\n"
 
-#: builtin/push.c:268
-msgid "Updates were rejected because the tag already exists in the remote."
-msgstr ""
-"Изтласкването е отхвърлено, защото в отдалеченото хранилище съществува "
-"етикет,\n"
-"който ще припокриете с етикет от вашето хранилище."
+#: builtin/remote.c:1178
+#, c-format
+msgid "  Remote branch:%s"
+msgid_plural "  Remote branches:%s"
+msgstr[0] "  Отдалечен клон:%s"
+msgstr[1] "  Отдалечени клони:%s"
 
-#: builtin/push.c:271
-msgid ""
-"You cannot update a remote ref that points at a non-commit object,\n"
-"or update a remote ref to make it point at a non-commit object,\n"
-"without using the '--force' option.\n"
+#: builtin/remote.c:1181 builtin/remote.c:1207
+msgid " (status not queried)"
+msgstr " (състоянието не бе проверено)"
+
+#: builtin/remote.c:1190
+msgid "  Local branch configured for 'git pull':"
+msgid_plural "  Local branches configured for 'git pull':"
+msgstr[0] "  Локален клон настроен за издърпване чрез „git pull“:"
+msgstr[1] "  Локални клони настроени за издърпване чрез „git pull“:"
+
+#: builtin/remote.c:1198
+msgid "  Local refs will be mirrored by 'git push'"
+msgstr "  Локалните указатели ще бъдат пренесени чрез „ push“"
+
+#: builtin/remote.c:1204
+#, c-format
+msgid "  Local ref configured for 'git push'%s:"
+msgid_plural "  Local refs configured for 'git push'%s:"
+msgstr[0] "  Локалният указател, настроен за „git push“%s:"
+msgstr[1] "  Локалните указатели, настроени за „git push“%s:"
+
+#: builtin/remote.c:1225
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "задаване на refs/remotes/ИМЕ/HEAD според отдалеченото хранилище"
+
+#: builtin/remote.c:1227
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
+
+#: builtin/remote.c:1242
+msgid "Cannot determine remote HEAD"
+msgstr "Не може да се установи отдалеченият връх"
+
+#: builtin/remote.c:1244
+msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
-"Без да укажете опцията „--force“, не може да обновите отдалечен\n"
-"указател, който вече сочи към обект, който не е подаване, както и тепърва\n"
-"да го промените да сочи към подобен обект.\n"
+"Множество клони с върхове.  Изберете изрично някой от тях чрез командата:"
 
-#: builtin/push.c:331
+#: builtin/remote.c:1254
 #, c-format
-msgid "Pushing to %s\n"
-msgstr "Изтласкване към „%s“\n"
+msgid "Could not delete %s"
+msgstr "„%s“ не може да бъде изтрит"
 
-#: builtin/push.c:335
+#: builtin/remote.c:1262
 #, c-format
-msgid "failed to push some refs to '%s'"
-msgstr "част от указателите не бяха изтласкани към „%s“"
+msgid "Not a valid ref: %s"
+msgstr "Неправилен указател: %s"
 
-#: builtin/push.c:365
+#: builtin/remote.c:1264
 #, c-format
-msgid "bad repository '%s'"
-msgstr "неправилно указано хранилище „%s“"
+msgid "Could not setup %s"
+msgstr "„%s“ не може да се настрои"
+
+#: builtin/remote.c:1282
+#, c-format
+msgid " %s will become dangling!"
+msgstr "„%s“ ще се превърне в обект извън клоните!"
+
+#: builtin/remote.c:1283
+#, c-format
+msgid " %s has become dangling!"
+msgstr "„%s“ се превърна в обект извън клоните!"
+
+#: builtin/remote.c:1293
+#, c-format
+msgid "Pruning %s"
+msgstr "Окастряне на „%s“"
+
+#: builtin/remote.c:1294
+#, c-format
+msgid "URL: %s"
+msgstr "адрес: %s"
+
+#: builtin/remote.c:1310
+#, c-format
+msgid " * [would prune] %s"
+msgstr " ● [ще бъде окастрено] %s"
+
+#: builtin/remote.c:1313
+#, c-format
+msgid " * [pruned] %s"
+msgstr " ● [окастрено] %s"
+
+#: builtin/remote.c:1358
+msgid "prune remotes after fetching"
+msgstr "окастряне на огледалата на отдалечените хранилища след доставяне"
+
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
+#, c-format
+msgid "No such remote '%s'"
+msgstr "Няма отдалечено хранилище на име „%s“"
+
+#: builtin/remote.c:1437
+msgid "add branch"
+msgstr "добавяне на клон"
+
+#: builtin/remote.c:1444
+msgid "no remote specified"
+msgstr "не е указано отдалечено хранилище"
+
+#: builtin/remote.c:1461
+msgid "query push URLs rather than fetch URLs"
+msgstr "запитване към адресите за изтласкване, а не за доставяне"
+
+#: builtin/remote.c:1463
+msgid "return all URLs"
+msgstr "извеждане на всички адреси"
+
+#: builtin/remote.c:1491
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "не е зададен адрес за отдалеченото хранилище „%s“"
+
+#: builtin/remote.c:1517
+msgid "manipulate push URLs"
+msgstr "промяна на адресите за изтласкване"
+
+#: builtin/remote.c:1519
+msgid "add URL"
+msgstr "добавяне на адреси"
+
+#: builtin/remote.c:1521
+msgid "delete URLs"
+msgstr "изтриване на адреси"
+
+#: builtin/remote.c:1528
+msgid "--add --delete doesn't make sense"
+msgstr "опциите „--add“ и „--delete“ са несъвместими"
+
+#: builtin/remote.c:1569
+#, c-format
+msgid "Invalid old URL pattern: %s"
+msgstr "Неправилен (стар) формат за адрес: %s"
+
+#: builtin/remote.c:1577
+#, c-format
+msgid "No such URL found: %s"
+msgstr "Такъв адрес не е открит: %s"
 
-#: builtin/push.c:366
+#: builtin/remote.c:1579
+msgid "Will not delete all non-push URLs"
+msgstr "Никой от адресите, които не са за изтласкване, няма да се изтрие"
+
+#: builtin/remote.c:1593
+msgid "be verbose; must be placed before a subcommand"
+msgstr "повече подробности.  Поставя се пред подкоманда"
+
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Непозната подкоманда: %s"
+
+#: builtin/repack.c:17
+msgid "git repack [<options>]"
+msgstr "git repack [ОПЦИЯ…]"
+
+#: builtin/repack.c:22
 msgid ""
-"No configured push destination.\n"
-"Either specify the URL from the command-line or configure a remote "
-"repository using\n"
-"\n"
-"    git remote add <name> <url>\n"
-"\n"
-"and then push using the remote name\n"
-"\n"
-"    git push <name>\n"
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"Постепенното препакетиране е несъвместимо с индекси на база битови маски. \n"
+"Ползвайте опцията --no-write-bitmap-index или изключете настройката\n"
+"„pack.writebitmaps“."
+
+#: builtin/repack.c:166
+msgid "pack everything in a single pack"
+msgstr "пакетиране на всичко в пакет"
+
+#: builtin/repack.c:168
+msgid "same as -a, and turn unreachable objects loose"
+msgstr ""
+"същото като опцията „-a“.  Допълнително — недостижимите обекти да станат "
+"непакетирани"
+
+#: builtin/repack.c:171
+msgid "remove redundant packs, and run git-prune-packed"
 msgstr ""
-"Не е указано хранилище, към което да се изтласква.\n"
-"Или укажете адреса на командния ред, или настройте отдалечено хранилище с "
-"командата:\n"
-"\n"
-"    git remote add ИМЕ АДРЕС\n"
-"\n"
-"и след това изтласкайте, като укажете името на отдалеченото хранилище:\n"
-"\n"
-"    git push ИМЕ\n"
+"премахване на ненужните пакетирани файлове и изпълнение на командата „git-"
+"prune-packed“"
 
-#: builtin/push.c:381
-msgid "--all and --tags are incompatible"
-msgstr "опÑ\86ииÑ\82е â\80\9e--allâ\80\9c Ð¸ â\80\9e--tagsâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
+#: builtin/repack.c:173
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr "подаване Ð½Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--no-reuse-deltaâ\80\9c Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-pack-objectsâ\80\9c"
 
-#: builtin/push.c:382
-msgid "--all can't be combined with refspecs"
-msgstr "опцията „--all“ е несъвместима с указването на версия"
+#: builtin/repack.c:175
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr ""
+"подаване на опцията „--no-reuse-object“ на командата „git-pack-objects“"
 
-#: builtin/push.c:387
-msgid "--mirror and --tags are incompatible"
-msgstr "опÑ\86ииÑ\82е â\80\9e--mirrorâ\80\9c Ð¸ â\80\9e--tagsâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
+#: builtin/repack.c:177
+msgid "do not run git-update-server-info"
+msgstr "без Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-update-server-infoâ\80\9c"
 
-#: builtin/push.c:388
-msgid "--mirror can't be combined with refspecs"
-msgstr "опÑ\86иÑ\8fÑ\82а â\80\9e--mirrorâ\80\9c Ðµ Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82има Ñ\81 Ñ\83казванеÑ\82о Ð½Ð° Ð²ÐµÑ\80Ñ\81иÑ\8f"
+#: builtin/repack.c:180
+msgid "pass --local to git-pack-objects"
+msgstr "подаване Ð½Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--localâ\80\9c Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-pack-objectsâ\80\9c"
 
-#: builtin/push.c:393
-msgid "--all and --mirror are incompatible"
-msgstr "опциите „--all“ и „--mirror“ са несъвместими"
+#: builtin/repack.c:182
+msgid "write bitmap index"
+msgstr "създаване и записване на индекси на база битови маски"
 
-#: builtin/push.c:505
-msgid "repository"
-msgstr "хранилище"
+#: builtin/repack.c:183
+msgid "approxidate"
+msgstr "евристична дата"
 
-#: builtin/push.c:506 builtin/send-pack.c:161
-msgid "push all refs"
-msgstr "изтласкване на всички указатели"
+#: builtin/repack.c:184
+msgid "with -A, do not loosen objects older than this"
+msgstr ""
+"при комбинирането с опцията „-A“ — без разпакетиране на обектите по стари от "
+"това"
 
-#: builtin/push.c:507 builtin/send-pack.c:163
-msgid "mirror all refs"
-msgstr "огледално копие на всички указатели"
+#: builtin/repack.c:186
+msgid "with -a, repack unreachable objects"
+msgstr "с „-a“ — препакетиране на недостижимите обекти"
 
-#: builtin/push.c:509
-msgid "delete refs"
-msgstr "изтриване на указателите"
+#: builtin/repack.c:188
+msgid "size of the window used for delta compression"
+msgstr "размер на прозореца за делта компресията"
 
-#: builtin/push.c:510
-msgid "push tags (can't be used with --all or --mirror)"
-msgstr "изÑ\82лаÑ\81кване Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е (неÑ\81Ñ\8aвмеÑ\81Ñ\82имо Ñ\81 Ð¾Ð¿Ñ\86ииÑ\82е â\80\9e--allâ\80\9c Ð¸ â\80\9e--mirrorâ\80\9c)"
+#: builtin/repack.c:189 builtin/repack.c:193
+msgid "bytes"
+msgstr "байÑ\82ове"
 
-#: builtin/push.c:513 builtin/send-pack.c:164
-msgid "force updates"
-msgstr "принудително обновяване"
+#: builtin/repack.c:190
+msgid "same as the above, but limit memory size instead of entries count"
+msgstr ""
+"същото като горната опция, но ограничението да е по размер на паметта, а не "
+"по броя на обектите"
 
-# FIXME double check this
-#: builtin/push.c:515 builtin/send-pack.c:175
-msgid "refname>:<expect"
-msgstr "УКАЗАТЕЛ>:<ОЧАКВАНА_СТОЙНОСТ"
+#: builtin/repack.c:192
+msgid "limits the maximum delta depth"
+msgstr "ограничаване на максималната дълбочина на делтата"
 
-#: builtin/push.c:516 builtin/send-pack.c:176
-msgid "require old value of ref to be at this value"
-msgstr "УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9bÑ\8fÑ\82 Ñ\82Ñ\80Ñ\8fбва Ð¿Ñ\8aÑ\80вонаÑ\87ално Ð´Ð° Ðµ Ñ\81 Ñ\82ази Ð\9eЧÐ\90Ð\9aÐ\92Ð\90Ð\9dÐ\90_СТÐ\9eÐ\99Ð\9dÐ\9eСТ"
+#: builtin/repack.c:194
+msgid "maximum size of each packfile"
+msgstr "макÑ\81имален Ñ\80азмеÑ\80 Ð½Ð° Ð²Ñ\81еки Ð¿Ð°ÐºÐµÑ\82"
 
-#: builtin/push.c:519
-msgid "control recursive pushing of submodules"
-msgstr "управление на рекурсивното изтласкване на подмодулите"
+#: builtin/repack.c:196
+msgid "repack objects in packs marked with .keep"
+msgstr "препакетиране на обектите в пакети белязани с „.keep“"
 
-#: builtin/push.c:521 builtin/send-pack.c:169
-msgid "use thin pack"
-msgstr "използване Ð½Ð° Ñ\81Ñ\8aкÑ\80аÑ\82ени Ð¿Ð°ÐºÐµÑ\82и"
+#: builtin/repack.c:206
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "пакеÑ\82иÑ\82е Ð² Ñ\85Ñ\80анилиÑ\89е Ñ\81 Ð²Ð°Ð¶Ð½Ð¸ Ð¾Ð±ÐµÐºÑ\82и Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ñ\82Ñ\80иÑ\8fÑ\82"
 
-#: builtin/push.c:522 builtin/push.c:523 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
-msgid "receive pack program"
-msgstr "програма за получаването на пакети"
+#: builtin/repack.c:210
+msgid "--keep-unreachable and -A are incompatible"
+msgstr "Опциите „--keep-unreachable“ и „-A“ са несъвместими"
 
-#: builtin/push.c:524
-msgid "set upstream for git pull/status"
-msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
+#: builtin/repack.c:400 builtin/worktree.c:115
+#, c-format
+msgid "failed to remove '%s'"
+msgstr "директорията „%s“ не може да бъде изтрита"
 
-#: builtin/push.c:527
-msgid "prune locally removed refs"
-msgstr "окастряне на указателите, които са премахнати от локалното хранилище"
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
+msgstr "git replace [-f] ОБЕКТ ЗАМЯНА"
 
-#: builtin/push.c:529
-msgid "bypass pre-push hook"
-msgstr "без изпълнение на куката преди изтласкване (pre-push)"
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit ОБЕКТ"
 
-#: builtin/push.c:530
-msgid "push missing but relevant tags"
-msgstr ""
-"изтласкване на липсващите в отдалеченото хранилище, но свързани с текущото "
-"изтласкване, етикети"
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft ПОДАВАНЕ [РОДИТЕЛ…]"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
-msgid "GPG sign the push"
-msgstr "подписване на изтласкването с GPG"
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
+msgstr "git replace -d ОБЕКТ…"
 
-#: builtin/push.c:535 builtin/send-pack.c:170
-msgid "request atomic transaction on remote side"
-msgstr "изискване на атомарни операции от отсрещната страна"
+#: builtin/replace.c:23
+msgid "git replace [--format=<format>] [-l [<pattern>]]"
+msgstr "git replace [--format=ФОРМАТ] [-l [ШАБЛОН]]"
 
-#: builtin/push.c:549
-msgid "--delete is incompatible with --all, --mirror and --tags"
-msgstr ""
-"опцията „--delete“ е несъвместима с опциите  „--all“, „--mirror“ и „--tags“"
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "Неправилно име на обект: „%s“"
 
-#: builtin/push.c:551
-msgid "--delete doesn't make sense without any refs"
-msgstr "опцията „--delete“ изисква поне един указател на версия"
+#: builtin/replace.c:360
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "етикетът при сливане в подаването „%s“ e неправилен"
+
+#: builtin/replace.c:362
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "етикетът при сливане в подаването „%s“ e неправилен"
 
-#: builtin/read-tree.c:37
+#: builtin/replace.c:373
+#, c-format
 msgid ""
-"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
-"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
-"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
 msgstr ""
-"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=ПРЕФИКС) "
-"[-u [--exclude-per-directory=ФАЙЛ_С_ИЗКЛЮЧЕНИЯ] | -i]] [--no-sparse-"
-"checkout] [--index-output=ФАЙЛ] (--empty | УКАЗАТЕЛ_КЪМ_ДЪРВО_1 "
-"[УКАЗАТЕЛ_КЪМ_ДЪРВО_2 [УКАЗАТЕЛ_КЪМ_ДЪРВО_3]])"
+"Първоначалното подаване „%s“ съдържа етикета при сливане „%s“, който е "
+"изхвърлен, затова използвайте опцията „--edit“, а не „--graft“."
 
-#: builtin/read-tree.c:110
-msgid "write resulting index to <file>"
-msgstr "запазване на индекса в този ФАЙЛ"
+#: builtin/replace.c:406
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "Първоначалното подаване „%s“ е с подпис на GPG."
 
-#: builtin/read-tree.c:113
-msgid "only empty the index"
-msgstr "само зануляване на индекса"
+#: builtin/replace.c:407
+msgid "the signature will be removed in the replacement commit!"
+msgstr "Подписът ще бъде премахнат в заменящото подаване!"
 
-#: builtin/read-tree.c:115
-msgid "Merging"
-msgstr "Сливане"
+#: builtin/replace.c:413
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "заменящото подаване за „%s“ не може да бъде записано"
 
-#: builtin/read-tree.c:117
-msgid "perform a merge in addition to a read"
-msgstr "да Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88и Ð¸ Ñ\81ливане Ñ\81лед Ð¾Ñ\81вен Ð¸Ð·Ñ\87иÑ\82анеÑ\82о"
+#: builtin/replace.c:437
+msgid "list replace refs"
+msgstr "извеждане Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ñ\83казаÑ\82елиÑ\82е Ð·Ð° Ð·Ð°Ð¼Ñ\8fна"
 
-#: builtin/read-tree.c:119
-msgid "3-way merge if no file level merging required"
-msgstr "тройно сливане, ако не се налага пофайлово сливане"
+#: builtin/replace.c:438
+msgid "delete replace refs"
+msgstr "изтриване на указателите за замяна"
 
-#: builtin/read-tree.c:121
-msgid "3-way merge in presence of adds and removes"
-msgstr "Ñ\82Ñ\80ойно Ñ\81ливане Ð¿Ñ\80и Ð´Ð¾Ð±Ð°Ð²Ñ\8fне Ð½Ð° Ð´Ð¾Ð±Ð°Ð²Ñ\8fне Ð¸ Ð¸Ð·Ñ\82Ñ\80иване Ð½Ð° Ñ\84айлове"
+#: builtin/replace.c:439
+msgid "edit existing object"
+msgstr "Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89 Ð¾Ð±ÐµÐºÑ\82"
 
-#: builtin/read-tree.c:123
-msgid "same as -m, but discard unmerged entries"
-msgstr "същото като опцията „-m“, но неслетите обекти се пренебрегват"
+#: builtin/replace.c:440
+msgid "change a commit's parents"
+msgstr "смяна на родителите на подаване"
 
-#: builtin/read-tree.c:124
-msgid "<subdirectory>/"
-msgstr "Ð\9fÐ\9eÐ\94Ð\94Ð\98РÐ\95Ð\9aТÐ\9eРÐ\98Я/"
+#: builtin/replace.c:441
+msgid "replace the ref if it exists"
+msgstr "замÑ\8fна Ð½Ð° Ñ\83казаÑ\82елÑ\8f, Ð°ÐºÐ¾ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва"
 
-#: builtin/read-tree.c:125
-msgid "read the tree into the index under <subdirectory>/"
-msgstr "изÑ\87иÑ\82ане Ð½Ð° Ð´Ñ\8aÑ\80воÑ\82о ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а ÐºÐ°Ñ\82о Ð´Ð° Ðµ Ð² Ñ\82ази Ð\9fÐ\9eÐ\94Ð\94Ð\98РÐ\95Ð\9aТÐ\9eРÐ\98Я/"
+#: builtin/replace.c:442
+msgid "do not pretty-print contents for --edit"
+msgstr "без Ñ\84оÑ\80маÑ\82иÑ\80ано Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о â\80\94 Ð·Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--editâ\80\9c"
 
-#: builtin/read-tree.c:128
-msgid "update working tree with merge result"
-msgstr "обновÑ\8fване Ð½Ð° Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во Ñ\81 Ñ\80езÑ\83лÑ\82аÑ\82а Ð¾Ñ\82 Ñ\81ливанеÑ\82о"
+#: builtin/replace.c:443
+msgid "use this format"
+msgstr "използване Ð½Ð° Ñ\82ози Ð¤Ð\9eРÐ\9cÐ\90Т"
 
-#: builtin/read-tree.c:130
-msgid "gitignore"
-msgstr "ФАЙЛ_С_ИЗКЛЮЧЕНИЯ"
+#: builtin/rerere.c:12
+msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+msgstr "git rerere [clear | forget ПЪТ… | status | remaining | diff | gc]"
 
-#: builtin/read-tree.c:131
-msgid "allow explicitly ignored files to be overwritten"
-msgstr "позволяване на презаписването на изрично пренебрегваните файлове"
+#: builtin/rerere.c:58
+msgid "register clean resolutions in index"
+msgstr "регистриране на чисти корекции на конфликти в индекса"
 
-#: builtin/read-tree.c:134
-msgid "don't check the working tree after merging"
-msgstr "без проверка на работното дърво след сливането"
+#: builtin/reset.c:26
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [ПОДАВАНЕ]"
 
-#: builtin/read-tree.c:135
-msgid "don't update the index or the work tree"
-msgstr "без обновяване и на индекса, и на работното дърво"
+#: builtin/reset.c:27
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] УКАЗАТЕЛ_КЪМ_ДЪРВО [--] ПЪТИЩА…"
 
-#: builtin/read-tree.c:137
-msgid "skip applying sparse checkout filter"
-msgstr "без прилагане на филтъра за частично изтегляне"
+#: builtin/reset.c:28
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr "git reset --patch [УКАЗАТЕЛ_КЪМ_ДЪРВО] [--] [ПЪТИЩА…]"
 
-#: builtin/read-tree.c:139
-msgid "debug unpack-trees"
-msgstr "изчистване на грешки в командата „unpack-trees“"
+#: builtin/reset.c:34
+msgid "mixed"
+msgstr "смесено (mixed)"
 
-#: builtin/receive-pack.c:25
-msgid "git receive-pack <git-dir>"
-msgstr "git receive-pack ДИРЕКТОРИЯ_НА_GIT"
+#: builtin/reset.c:34
+msgid "soft"
+msgstr "меко (soft)"
 
-#: builtin/receive-pack.c:1719
-msgid "quiet"
-msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f"
+#: builtin/reset.c:34
+msgid "hard"
+msgstr "пÑ\8aлно (hard)"
 
-#: builtin/receive-pack.c:1733
-msgid "You must specify a directory."
-msgstr "Трябва да укажете директория."
+#: builtin/reset.c:34
+msgid "merge"
+msgstr "слято (merge)"
 
-#: builtin/reflog.c:423
+#: builtin/reset.c:34
+msgid "keep"
+msgstr "запазващо (keep)"
+
+#: builtin/reset.c:74
+msgid "You do not have a valid HEAD."
+msgstr "Указателят „HEAD“ е повреден."
+
+#: builtin/reset.c:76
+msgid "Failed to find tree of HEAD."
+msgstr "Дървото, сочено от указателя „HEAD“, не може да бъде открито."
+
+#: builtin/reset.c:82
+#, c-format
+msgid "Failed to find tree of %s."
+msgstr "Дървото, сочено от „%s“, не може да бъде открито."
+
+#: builtin/reset.c:100
 #, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr "„%s“ не е правилна стойност за време за „%s“"
+msgid "HEAD is now at %s"
+msgstr "Указателят „HEAD“ сочи към „%s“"
 
-#: builtin/reflog.c:540 builtin/reflog.c:545
+#: builtin/reset.c:183
 #, c-format
-msgid "'%s' is not a valid timestamp"
-msgstr "„%s“ не е правилна стойност за време"
+msgid "Cannot do a %s reset in the middle of a merge."
+msgstr "Не може да се извърши %s зануляване по време на сливане."
 
-#: builtin/remote.c:12
-msgid "git remote [-v | --verbose]"
-msgstr "git remote [-v | --verbose]"
+#: builtin/reset.c:276
+msgid "be quiet, only report errors"
+msgstr "по-малко подробности, да се извеждат само грешките"
 
-#: builtin/remote.c:13
-msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
-msgstr ""
-"git remote add [-t КЛОН] [-m ОСНОВЕН_КЛОН] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] ИМЕ АДРЕС"
+#: builtin/reset.c:278
+msgid "reset HEAD and index"
+msgstr "индекса и указателя „HEAD“, без работното дърво"
 
-#: builtin/remote.c:14 builtin/remote.c:34
-msgid "git remote rename <old> <new>"
-msgstr "git remote rename СТАРО_ИМЕ НОВО_ИМЕ"
+#: builtin/reset.c:279
+msgid "reset only HEAD"
+msgstr "само указателя „HEAD“, без индекса и работното дърво"
 
-#: builtin/remote.c:15 builtin/remote.c:39
-msgid "git remote remove <name>"
-msgstr "git remote remove ИМЕ"
+#: builtin/reset.c:281 builtin/reset.c:283
+msgid "reset HEAD, index and working tree"
+msgstr "указателя „HEAD“, индекса и работното дърво"
 
-#: builtin/remote.c:16 builtin/remote.c:44
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr "git remote set-head ИМЕ (-a | --auto | -d | --delete | КЛОН)"
+#: builtin/reset.c:285
+msgid "reset HEAD but keep local changes"
+msgstr "зануляване на указателя „HEAD“, но запазване на локалните промени"
 
-#: builtin/remote.c:17
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr "git remote [-v | --verbose] show [-n] ИМЕ"
+#: builtin/reset.c:288
+msgid "record only the fact that removed paths will be added later"
+msgstr ""
+"отбелязване само на факта, че изтритите пътища ще бъдат добавени по-късно"
 
-#: builtin/remote.c:18
-msgid "git remote prune [-n | --dry-run] <name>"
-msgstr "git remote prune [-n | --dry-run] ИМЕ"
+#: builtin/reset.c:305
+#, c-format
+msgid "Failed to resolve '%s' as a valid revision."
+msgstr "Стойността „%s“ не е разпозната като съществуваща версия."
 
-#: builtin/remote.c:19
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+#: builtin/reset.c:313
+#, c-format
+msgid "Failed to resolve '%s' as a valid tree."
+msgstr "„%s“ не е разпознат като дърво."
+
+#: builtin/reset.c:322
+msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr ""
-"git remote [-v | --verbose] update [-p | --prune] [(ГРУПА | "
-"ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ)…]"
+"опцията „--patch“ е несъвместима с всяка от опциите „--hard/--mixed/--soft“"
 
-#: builtin/remote.c:20
-msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr "git remote set-branches [--add] ИМЕ КЛОН…"
+#: builtin/reset.c:331
+msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+msgstr ""
+"опцията „--mixed“ не бива да се използва заедно с пътища.  Вместо това "
+"изпълнете „git reset -- ПЪТ…“."
 
-#: builtin/remote.c:21 builtin/remote.c:70
-msgid "git remote get-url [--push] [--all] <name>"
-msgstr "git remote get-url [--push] [--all] ИМЕ"
+#: builtin/reset.c:333
+#, c-format
+msgid "Cannot do %s reset with paths."
+msgstr "Не може да извършите %s зануляване, когато сте задали ПЪТ."
 
-#: builtin/remote.c:22 builtin/remote.c:75
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr "git remote set-url [--push] ИМЕ НОВ_АДРЕС [СТАР_АДРЕС]"
+#: builtin/reset.c:343
+#, c-format
+msgid "%s reset is not allowed in a bare repository"
+msgstr "В голо хранилище не може да извършите %s зануляване"
 
-#: builtin/remote.c:23 builtin/remote.c:76
-msgid "git remote set-url --add <name> <newurl>"
-msgstr "git remote set-url --add ИМЕ НОВ_АДРЕС"
+#: builtin/reset.c:347
+msgid "-N can only be used with --mixed"
+msgstr "Опцията „-N“ е съвместима само с „--mixed“"
 
-#: builtin/remote.c:24 builtin/remote.c:77
-msgid "git remote set-url --delete <name> <url>"
-msgstr "git remote set-url --delete ИМЕ АДРЕС"
+#: builtin/reset.c:364
+msgid "Unstaged changes after reset:"
+msgstr "Промени извън индекса след зануляването:"
 
-#: builtin/remote.c:29
-msgid "git remote add [<options>] <name> <url>"
-msgstr "git remote add [ОПЦИЯ…] ИМЕ АДРЕС"
+#: builtin/reset.c:370
+#, c-format
+msgid "Could not reset index file to revision '%s'."
+msgstr "Индексът не може да бъде занулен към версия „%s“."
 
-#: builtin/remote.c:49
-msgid "git remote set-branches <name> <branch>..."
-msgstr "git remote set-branches ИМЕ КЛОН…"
+#: builtin/reset.c:374
+msgid "Could not write new index file."
+msgstr "Новият индекс не може да бъде записан."
 
-#: builtin/remote.c:50
-msgid "git remote set-branches --add <name> <branch>..."
-msgstr "git remote set-branches --add ИМЕ КЛОН…"
+#: builtin/rev-list.c:354
+msgid "rev-list does not support display of notes"
+msgstr "командата „rev-list“ не поддържа извеждането на бележки"
 
-#: builtin/remote.c:55
-msgid "git remote show [<options>] <name>"
-msgstr "git remote show [ОПЦИЯ…] ИМЕ"
+#: builtin/rev-parse.c:393
+msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+msgstr "git rev-parse --parseopt [ОПЦИЯ…] -- [АРГУМЕНТ…]"
 
-#: builtin/remote.c:60
-msgid "git remote prune [<options>] <name>"
-msgstr "git remote prune [ОПЦИЯ…] ИМЕ"
+#: builtin/rev-parse.c:398
+msgid "keep the `--` passed as an arg"
+msgstr "зададеният низ „--“ да се тълкува като аргумент"
 
-#: builtin/remote.c:65
-msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr "git remote update [ОПЦИЯ…] [ГРУПА | ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ]…"
+#: builtin/rev-parse.c:400
+msgid "stop parsing after the first non-option argument"
+msgstr "спиране на анализа след първия аргумент, който не е опция"
 
-#: builtin/remote.c:94
-#, c-format
-msgid "Updating %s"
-msgstr "Обновяване на „%s“"
+#: builtin/rev-parse.c:403
+msgid "output in stuck long form"
+msgstr "изход в дългия формат"
 
-# FIXME tabulator
-#: builtin/remote.c:126
+#: builtin/rev-parse.c:534
 msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
+"git rev-parse --parseopt [<options>] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [<options>] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
 msgstr ""
-"Използването само на „--mirror“ е опасно. Вместо това\n"
-"ползвайте „--mirror=fetch“ или „--mirror=push“"
+"git rev-parse --parseopt [ОПЦИЯ…] -- [АРГУМЕНТ…]\n"
+"   или: git rev-parse --sq-quote [АРГУМЕНТ…]\n"
+"   или: git rev-parse [ОПЦИЯ…] [АРГУМЕНТ…]\n"
+"\n"
+"За повече информация за първия вариант изпълнете „git rev-parse --parseopt -"
+"h“"
 
-#: builtin/remote.c:143
-#, c-format
-msgid "unknown mirror argument: %s"
-msgstr "неправилна стойност за „--mirror“: %s"
+#: builtin/revert.c:22
+msgid "git revert [<options>] <commit-ish>..."
+msgstr "git revert [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
-#: builtin/remote.c:159
-msgid "fetch the remote branches"
-msgstr "отдалечените клони не могат да бъдат доставени"
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr "git revert ПОДКОМАНДА"
 
-#: builtin/remote.c:161
-msgid "import all tags and associated objects when fetching"
-msgstr "внасяне на всички етикети и принадлежащите им обекти при доставяне"
+#: builtin/revert.c:28
+msgid "git cherry-pick [<options>] <commit-ish>..."
+msgstr "git cherry-pick [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
-#: builtin/remote.c:164
-msgid "or do not fetch any tag at all (--no-tags)"
-msgstr "може и да не се доставят никакви етикети (чрез опцията „--no-tags“)"
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr "git cherry-pick ПОДКОМАНДА"
 
-#: builtin/remote.c:166
-msgid "branch(es) to track"
-msgstr "клон/и за следене"
+#: builtin/revert.c:89
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr "%s: опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/remote.c:167
-msgid "master branch"
-msgstr "оÑ\81новен ÐºÐ»Ð¾Ð½"
+#: builtin/revert.c:98
+msgid "end revert or cherry-pick sequence"
+msgstr "завÑ\8aÑ\80Ñ\88ване Ð½Ð° Ð¿Ð¾Ñ\80едиÑ\86а Ð¾Ñ\82 Ð¾Ñ\82биÑ\80аниÑ\8f Ð¸Ð»Ð¸ Ð¾Ñ\82мени Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
 
-#: builtin/remote.c:168
-msgid "push|fetch"
-msgstr "издÑ\8aÑ\80пване|доÑ\81Ñ\82авÑ\8fне"
+#: builtin/revert.c:99
+msgid "resume revert or cherry-pick sequence"
+msgstr "пÑ\80одÑ\8aлжаване Ð½Ð° Ð¿Ð¾Ñ\80едиÑ\86а Ð¾Ñ\82 Ð¾Ñ\82биÑ\80аниÑ\8f Ð¸Ð»Ð¸ Ð¾Ñ\82мени Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
 
-#: builtin/remote.c:169
-msgid "set up remote as a mirror to push to or fetch from"
-msgstr ""
-"настройване на отдалечено хранилище, от което да се издърпва или доставя"
+#: builtin/revert.c:100
+msgid "cancel revert or cherry-pick sequence"
+msgstr "отмяна на поредица от отбирания или отмени на подавания"
 
-#: builtin/remote.c:181
-msgid "specifying a master branch makes no sense with --mirror"
-msgstr ""
-"няма смисъл да се указва основен клон при използване на опцията „--mirror“"
+#: builtin/revert.c:101
+msgid "don't automatically commit"
+msgstr "без автоматично подаване"
 
-#: builtin/remote.c:183
-msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr ""
-"указването на следени клони е смислено само за отдалечени хранилища, от "
-"които се доставя"
+#: builtin/revert.c:102
+msgid "edit the commit message"
+msgstr "редактиране на съобщението при подаване"
 
-#: builtin/remote.c:190 builtin/remote.c:633
-#, c-format
-msgid "remote %s already exists."
-msgstr "вече съществува отдалечено хранилище с име „%s“."
+#: builtin/revert.c:105
+msgid "parent-number"
+msgstr "номер на родителя"
 
-#: builtin/remote.c:194 builtin/remote.c:637
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr "„%s“ е неправилно име за отдалечено хранилище"
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "избор на основния родител"
 
-#: builtin/remote.c:234
-#, c-format
-msgid "Could not setup master '%s'"
-msgstr "Основният клон „%s“ не може да бъде настроен"
+#: builtin/revert.c:108
+msgid "merge strategy"
+msgstr "стратегия на сливане"
 
-#: builtin/remote.c:336
-#, c-format
-msgid "Could not get fetch map for refspec %s"
-msgstr "Обектите за доставяне за указателя „%s“ не могат да бъдат получени"
+#: builtin/revert.c:109
+msgid "option"
+msgstr "опция"
 
-#: builtin/remote.c:437 builtin/remote.c:445
-msgid "(matching)"
-msgstr "(съвпадащи)"
+#: builtin/revert.c:110
+msgid "option for merge strategy"
+msgstr "опция за стратегията на сливане"
 
-#: builtin/remote.c:449
-msgid "(delete)"
-msgstr "(за изтриване)"
+#: builtin/revert.c:119
+msgid "append commit name"
+msgstr "добавяне на името на подаването"
 
-#: builtin/remote.c:626 builtin/remote.c:761 builtin/remote.c:858
-#, c-format
-msgid "No such remote: %s"
-msgstr "Такова отдалечено хранилище няма: %s"
+#: builtin/revert.c:121
+msgid "preserve initially empty commits"
+msgstr "запазване на първоначално празните подавания"
+
+#: builtin/revert.c:122
+msgid "allow commits with empty messages"
+msgstr "позволяване на празни съобщения при подаване"
 
-#: builtin/remote.c:643
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
-msgstr "Разделът „%s“ в настройките не може да бъде преименуван на „%s“"
+#: builtin/revert.c:123
+msgid "keep redundant, empty commits"
+msgstr "запазване на излишните, празни подавания"
 
-# FIXME tabulator
-#: builtin/remote.c:663
-#, c-format
-msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
-msgstr ""
-"Нестандартните указатели за доставяне няма да бъдат обновени\n"
-"    %s\n"
-"  Променете настройките ръчно, ако е необходимо."
+#: builtin/revert.c:211
+msgid "revert failed"
+msgstr "неуспешна отмяна"
 
-#: builtin/remote.c:699
-#, c-format
-msgid "deleting '%s' failed"
-msgstr "неуспешно изтриване на „%s“"
+#: builtin/revert.c:224
+msgid "cherry-pick failed"
+msgstr "неуспешно отбиране"
 
-#: builtin/remote.c:733
-#, c-format
-msgid "creating '%s' failed"
-msgstr "неуспешно създаване на „%s“"
+#: builtin/rm.c:17
+msgid "git rm [<options>] [--] <file>..."
+msgstr "git rm [ОПЦИЯ…] [--] ФАЙЛ…"
 
-#: builtin/remote.c:796
+#: builtin/rm.c:205
 msgid ""
-"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
-"to delete it, use:"
+"the following file has staged content different from both the\n"
+"file and the HEAD:"
 msgid_plural ""
-"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
-"to delete them, use:"
+"the following files have staged content different from both the\n"
+"file and the HEAD:"
 msgstr[0] ""
-"Бележка: Клон извън йерархията „refs/remotes/“ не бе изтрит.\n"
-"Изтрийте го чрез командата:"
+"следният файл е със съдържание в индекса различно от текущото му съдържание "
+"и\n"
+"различно от съответстващото на HEAD:"
 msgstr[1] ""
-"Бележка: Няколко клона извън йерархията „refs/remotes/“ не бяха изтрити.\n"
-"Изтрийте ги чрез командата:"
+"следните файлове са със съдържание в индекса различно от текущото им "
+"съдържание и\n"
+"различно от съответстващото на HEAD:"
 
-#: builtin/remote.c:810
-#, c-format
-msgid "Could not remove config section '%s'"
-msgstr "Разделът „%s“ в настройките не може да бъде изтрит"
+#: builtin/rm.c:210
+msgid ""
+"\n"
+"(use -f to force removal)"
+msgstr ""
+"\n"
+"(за принудително изтриване използвайте опцията „-f“)"
 
-#: builtin/remote.c:911
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
-msgstr " нов (следващото доставяне ще го разположи в „remotes/%s“)"
+#: builtin/rm.c:214
+msgid "the following file has changes staged in the index:"
+msgid_plural "the following files have changes staged in the index:"
+msgstr[0] "следният файл е с променено съдържание в индекса:"
+msgstr[1] "следните файлове са с променено съдържание в индекса:"
 
-#: builtin/remote.c:914
-msgid " tracked"
-msgstr " следен"
+#: builtin/rm.c:218 builtin/rm.c:227
+msgid ""
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
+msgstr ""
+"\n"
+"(за запазване на файла използвайте опцията „--cached“, а за принудително\n"
+"изтриване — „-f“)"
 
-#: builtin/remote.c:916
-msgid " stale (use 'git remote prune' to remove)"
-msgstr " стар (изтрийте чрез „git remote prune“)"
+#: builtin/rm.c:224
+msgid "the following file has local modifications:"
+msgid_plural "the following files have local modifications:"
+msgstr[0] "следният файл е с променено съдържание"
+msgstr[1] "следните файлове са с променено съдържание"
 
-# FIXME
-#: builtin/remote.c:918
-msgid " ???"
-msgstr " неясно състояние"
+#: builtin/rm.c:242
+msgid "do not list removed files"
+msgstr "да не се извеждат изтритите файлове"
 
-# CHECK
-#: builtin/remote.c:959
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+#: builtin/rm.c:243
+msgid "only remove from the index"
+msgstr "изтриване само от индекса"
+
+#: builtin/rm.c:244
+msgid "override the up-to-date check"
+msgstr "въпреки проверката за актуалността на съдържанието"
+
+#: builtin/rm.c:245
+msgid "allow recursive removal"
+msgstr "рекурсивно изтриване"
+
+#: builtin/rm.c:247
+msgid "exit with a zero status even if nothing matched"
 msgstr ""
-"непÑ\80авилен ÐºÐ»Ð¾Ð½ Ð·Ð° Ñ\81ливане â\80\9e%sâ\80\9c. Ð\9dевÑ\8aзможно Ðµ Ð´Ð° Ð¿Ñ\80ебазиÑ\80аÑ\82е Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ñ\82 "
-"1 клон"
+"изÑ\85одниÑ\8fÑ\82 ÐºÐ¾Ð´ Ð´Ð° Ðµ 0, Ð´Ð¾Ñ\80и Ð°ÐºÐ¾ Ð½Ð¸ÐºÐ¾Ð¹ Ñ\84айл Ð½e e Ð½Ð°Ð¿Ð°Ñ\81нал Ñ\81 Ñ\88аблона Ð·Ð° "
+"изтриване"
 
-#: builtin/remote.c:967
+#: builtin/rm.c:308
 #, c-format
-msgid "rebases interactively onto remote %s"
-msgstr "инÑ\82еÑ\80акÑ\82ивно Ð¿Ñ\80ебазиÑ\80ане Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ð¾Ñ\82далеÑ\87ениÑ\8f ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c"
+msgid "not removing '%s' recursively without -r"
+msgstr "без Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½ÐµÑ\82о Ð½Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-râ\80\9c â\80\9e%sâ\80\9c Ð½Ñ\8fма Ð´Ð° Ñ\81е Ð¸Ð·Ñ\82Ñ\80ие Ñ\80екÑ\83Ñ\80Ñ\81ивно"
 
-#: builtin/remote.c:971
+#: builtin/rm.c:347
 #, c-format
-msgid " merges with remote %s"
-msgstr " сливане с отдалечения клон „%s“"
-
-#: builtin/remote.c:972
-msgid "    and with remote"
-msgstr "    и с отдалечения клон"
+msgid "git rm: unable to remove %s"
+msgstr "git rm: „%s“ не може да се изтрие"
 
-#: builtin/remote.c:974
+#: builtin/rm.c:370
 #, c-format
-msgid "merges with remote %s"
-msgstr "сливане с отдалечения клон „%s“"
+msgid "could not remove '%s'"
+msgstr "„%s“ не може да бъде изтрит"
 
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   и с отдалечения клон"
+#: builtin/send-pack.c:18
+msgid ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
+"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> "
+"[<ref>...]\n"
+"  --all and explicit <ref> specification are mutually exclusive."
+msgstr ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-"
+"pack=ПАКЕТ] [--verbose] [--thin] [--atomic] [ХОСТ:]ДИРЕКТОРИЯ [УКАЗАТЕЛ…]\n"
+"  опцията „--all“ и изричното посочване на УКАЗАТЕЛ са взаимно несъвместими."
 
-#: builtin/remote.c:1021
-msgid "create"
-msgstr "създаден"
+#: builtin/send-pack.c:161
+msgid "remote name"
+msgstr "име на отдалечено хранилище"
 
-#: builtin/remote.c:1024
-msgid "delete"
-msgstr "изтрит"
+#: builtin/send-pack.c:175
+msgid "use stateless RPC protocol"
+msgstr "използване на протокол без запазване на състоянието за RPC"
 
-#: builtin/remote.c:1028
-msgid "up to date"
-msgstr "актуален"
+#: builtin/send-pack.c:176
+msgid "read refs from stdin"
+msgstr "четене на указателите от стандартния вход"
 
-#: builtin/remote.c:1031
-msgid "fast-forwardable"
-msgstr "може Ð´Ð° Ñ\81е Ñ\81лее Ñ\82Ñ\80ивиално"
+#: builtin/send-pack.c:177
+msgid "print status from remote helper"
+msgstr "извеждане Ð½Ð° Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о Ð¾Ñ\82 Ð¾Ñ\82далеÑ\87енаÑ\82а Ð¿Ð¾Ð¼Ð¾Ñ\89на Ñ\84Ñ\83нкÑ\86иÑ\8f"
 
-#: builtin/remote.c:1034
-msgid "local out of date"
-msgstr "локалният е изостанал"
+#: builtin/shortlog.c:13
+msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+msgstr "git shortlog [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] [ПЪТ…]]"
 
-#: builtin/remote.c:1041
-#, c-format
-msgid "    %-*s forces to %-*s (%s)"
-msgstr "    %-*s принудително изтласква към %-*s (%s)"
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr "Групиране по подаващ, а не по автор"
 
-#: builtin/remote.c:1044
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
-msgstr "    %-*s изтласква към %-*s (%s)"
+#: builtin/shortlog.c:250
+msgid "sort output according to the number of commits per author"
+msgstr "подредба на подаванията по броя подавания от автор"
 
-#: builtin/remote.c:1048
-#, c-format
-msgid "    %-*s forces to %s"
-msgstr "    %-*s принудително изтласква към %s"
+#: builtin/shortlog.c:252
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr "Без описания на подаванията — да се показва само броя подавания"
 
-#: builtin/remote.c:1051
-#, c-format
-msgid "    %-*s pushes to %s"
-msgstr "    %-*s изтласква към %s"
+#: builtin/shortlog.c:254
+msgid "Show the email address of each author"
+msgstr "Извеждане на адреса на е-поща за всеки автор"
 
-#: builtin/remote.c:1119
-msgid "do not query remotes"
-msgstr "без Ð·Ð°Ñ\8fвки ÐºÑ\8aм Ð¾Ñ\82далеÑ\87ениÑ\82е Ñ\85Ñ\80анилиÑ\89а"
+#: builtin/shortlog.c:255
+msgid "w[,i1[,i2]]"
+msgstr "ШÐ\98РÐ\9eЧÐ\98Ð\9dÐ\90[,Ð\9eТСТЪÐ\9f_1[,Ð\9eТСТЪÐ\9f_2]]"
 
-#: builtin/remote.c:1146
-#, c-format
-msgid "* remote %s"
-msgstr "● отдалечено хранилище „%s“"
+#: builtin/shortlog.c:256
+msgid "Linewrap output"
+msgstr ""
+"Пренасяне на редовете до тази обща ШИРОЧИНА (76), с ОТСТЪП_1 (6) за първия "
+"ред и ОТСТЪП_2 (9) за останалите"
 
-#: builtin/remote.c:1147
-#, c-format
-msgid "  Fetch URL: %s"
-msgstr "  Адрес за доставяне: %s"
+#: builtin/show-branch.c:10
+msgid ""
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
+msgstr ""
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"    [--current] [--color[=КОГА] | --no-color] [--sparse]\n"
+"    [--more=БРОЙ | --list | --independent | --merge-base]\n"
+"    [--no-name | --sha1-name] [--topics] [(РЕВИЗИЯ | УКАЗАТЕЛ)…]"
 
-#: builtin/remote.c:1148 builtin/remote.c:1301
-msgid "(no URL)"
-msgstr "(без адрес)"
+#: builtin/show-branch.c:14
+msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr "git show-branch (-g | --reflog)[=БРОЙ[,БАЗА]] [--list] [УКАЗАТЕЛ]"
 
-# FIXME spaces betwen Push and URL
-#. TRANSLATORS: the colon ':' should align with
-#. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1159 builtin/remote.c:1161
+#: builtin/show-branch.c:374
 #, c-format
-msgid "  Push  URL: %s"
-msgstr "  Адрес за изтласкване: %s"
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "„%s“ се прескача — не може да се обработят повече от %d указател"
+msgstr[1] "„%s“ се прескача — не може да се обработят повече от %d указатели"
 
-#: builtin/remote.c:1163 builtin/remote.c:1165 builtin/remote.c:1167
+#: builtin/show-branch.c:536
 #, c-format
-msgid "  HEAD branch: %s"
-msgstr "  клон сочен от HEAD: %s"
+msgid "no matching refs with %s"
+msgstr "никой указател не съвпада с „%s“"
 
-#: builtin/remote.c:1169
-#, c-format
-msgid ""
-"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
-msgstr ""
-"  клонът сочен от HEAD (клонът указан във файла HEAD от отдалеченото "
-"хранилище е\n"
-"  нееднозначен и е някой от следните):\n"
+#: builtin/show-branch.c:632
+msgid "show remote-tracking and local branches"
+msgstr "извеждане на следящите и локалните клони"
 
-#: builtin/remote.c:1181
-#, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] "  Отдалечен клон:%s"
-msgstr[1] "  Отдалечени клони:%s"
+#: builtin/show-branch.c:634
+msgid "show remote-tracking branches"
+msgstr "извеждане на следящите клони"
 
-#: builtin/remote.c:1184 builtin/remote.c:1211
-msgid " (status not queried)"
-msgstr " (състоянието не бе проверено)"
+#: builtin/show-branch.c:636
+msgid "color '*!+-' corresponding to the branch"
+msgstr "оцветяване на „*!+-“ според клоните"
 
-#: builtin/remote.c:1193
-msgid "  Local branch configured for 'git pull':"
-msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] "  Локален клон настроен за издърпване чрез „git pull“:"
-msgstr[1] "  Локални клони настроени за издърпване чрез „git pull“:"
+#: builtin/show-branch.c:638
+msgid "show <n> more commits after the common ancestor"
+msgstr "извеждане на такъв БРОЙ подавания от общия предшественик"
 
-#: builtin/remote.c:1201
-msgid "  Local refs will be mirrored by 'git push'"
-msgstr "  Локалните указатели ще бъдат пренесени чрез „ push“"
+#: builtin/show-branch.c:640
+msgid "synonym to more=-1"
+msgstr "синоним на „more=-1“"
 
-#: builtin/remote.c:1208
-#, c-format
-msgid "  Local ref configured for 'git push'%s:"
-msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] "  Локалният указател, настроен за „git push“%s:"
-msgstr[1] "  Локалните указатели, настроени за „git push“%s:"
+#: builtin/show-branch.c:641
+msgid "suppress naming strings"
+msgstr "без низове за имената на клоните"
+
+#: builtin/show-branch.c:643
+msgid "include the current branch"
+msgstr "включване и на текущия клон"
+
+#: builtin/show-branch.c:645
+msgid "name commits with their object names"
+msgstr "именуване на подаванията с имената им на обекти"
+
+#: builtin/show-branch.c:647
+msgid "show possible merge bases"
+msgstr "извеждане на възможните бази за сливания"
+
+#: builtin/show-branch.c:649
+msgid "show refs unreachable from any other ref"
+msgstr "извеждане на недостижимите указатели"
+
+#: builtin/show-branch.c:651
+msgid "show commits in topological order"
+msgstr "извеждане на подаванията в топологическа подредба"
 
-#: builtin/remote.c:1229
-msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr "задаване Ð½Ð° refs/remotes/Ð\98Ð\9cÐ\95/HEAD Ñ\81поÑ\80ед Ð¾Ñ\82далеÑ\87еноÑ\82о Ñ\85Ñ\80анилиÑ\89е"
+#: builtin/show-branch.c:654
+msgid "show only commits not on the first branch"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8fÑ\82а, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81а Ð¾Ñ\82 Ð¿Ñ\8aÑ\80виÑ\8f ÐºÐ»Ð¾Ð½"
 
-#: builtin/remote.c:1231
-msgid "delete refs/remotes/<name>/HEAD"
-msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
+#: builtin/show-branch.c:656
+msgid "show merges reachable from only one tip"
+msgstr "извеждане на сливанията, които могат да се достигнат само от един връх"
 
-#: builtin/remote.c:1246
-msgid "Cannot determine remote HEAD"
-msgstr "Не може да се установи отдалеченият връх"
+#: builtin/show-branch.c:658
+msgid "topologically sort, maintaining date order where possible"
+msgstr ""
+"топологическа подредба, при запазване на подредбата по дата, доколкото е\n"
+"възможно"
 
-#: builtin/remote.c:1248
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
+#: builtin/show-branch.c:661
+msgid "<n>[,<base>]"
+msgstr "БРОЙ[,БАЗА]"
+
+#: builtin/show-branch.c:662
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr "показване на най-много БРОЙ журнални записа с начало съответната БАЗА"
+
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
 msgstr ""
-"Множество клони с върхове. Изберете изрично някой от тях чрез командата:"
+"опцията „--reflog“ е несъвместима с опциите  „--all“, „--remotes“, „--"
+"independent“ и „--merge-base“"
 
-#: builtin/remote.c:1258
-#, c-format
-msgid "Could not delete %s"
-msgstr "„%s“ не може да бъде изтрит"
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "не е зададен клон, а указателят „HEAD“ е неправилен"
 
-#: builtin/remote.c:1266
-#, c-format
-msgid "Not a valid ref: %s"
-msgstr "Неправилен указател: %s"
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "опцията „--track“ изисква точно едно име на клон"
 
-#: builtin/remote.c:1268
+#: builtin/show-branch.c:726
 #, c-format
-msgid "Could not setup %s"
-msgstr "„%s“ не може да се настрои"
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "само %d запис може да бъде показан наведнъж."
+msgstr[1] "само %d записа може да бъде показани наведнъж."
 
-#: builtin/remote.c:1286
+#: builtin/show-branch.c:730
 #, c-format
-msgid " %s will become dangling!"
-msgstr "„%s“ ще се превърне в обект извън клоните!"
+msgid "no such ref %s"
+msgstr "такъв указател няма: %s"
 
-#: builtin/remote.c:1287
+#: builtin/show-branch.c:814
 #, c-format
-msgid " %s has become dangling!"
-msgstr "„%s“ се превърна в обект извън клоните!"
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "не може да се обработи повече от %d указател."
+msgstr[1] "не може да се обработят повече от %d указатели."
 
-#: builtin/remote.c:1297
+#: builtin/show-branch.c:818
 #, c-format
-msgid "Pruning %s"
-msgstr "Окастряне на „%s“"
+msgid "'%s' is not a valid ref."
+msgstr "„%s“ е неправилен указател."
 
-#: builtin/remote.c:1298
+#: builtin/show-branch.c:821
 #, c-format
-msgid "URL: %s"
-msgstr "адÑ\80еÑ\81: %s"
+msgid "cannot find commit %s (%s)"
+msgstr "подаванеÑ\82о â\80\9e%sâ\80\9c (%s) Ð»Ð¸Ð¿Ñ\81ва"
 
-#: builtin/remote.c:1314
-#, c-format
-msgid " * [would prune] %s"
-msgstr " ● [ще бъде окастрено] %s"
+#: builtin/show-ref.c:10
+msgid ""
+"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
+msgstr ""
+"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
+"hash[=ЧИСЛО]] [--abbrev[=ЧИСЛО]] [--tags] [--heads] [--] [ШАБЛОН…]"
 
-#: builtin/remote.c:1317
-#, c-format
-msgid " * [pruned] %s"
-msgstr " ● [окастрено] %s"
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=ШАБЛОН]"
 
-#: builtin/remote.c:1362
-msgid "prune remotes after fetching"
-msgstr "окаÑ\81Ñ\82Ñ\80Ñ\8fне Ð½Ð° Ð¾Ð³Ð»ÐµÐ´Ð°Ð»Ð°Ñ\82а Ð½Ð° Ð¾Ñ\82далеÑ\87ениÑ\82е Ñ\85Ñ\80анилиÑ\89а Ñ\81лед Ð´Ð¾Ñ\81Ñ\82авÑ\8fне"
+#: builtin/show-ref.c:159
+msgid "only show tags (can be combined with heads)"
+msgstr "извеждане Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е (може Ð´Ð° Ñ\81е ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ\80а Ñ\81 Ð²Ñ\8aÑ\80Ñ\85овеÑ\82е)"
 
-#: builtin/remote.c:1425 builtin/remote.c:1479 builtin/remote.c:1547
-#, c-format
-msgid "No such remote '%s'"
-msgstr "Няма отдалечено хранилище на име „%s“"
+#: builtin/show-ref.c:160
+msgid "only show heads (can be combined with tags)"
+msgstr "извеждане на върховете (може да се комбинира с етикетите)"
 
-#: builtin/remote.c:1441
-msgid "add branch"
-msgstr "добавяне на клон"
+#: builtin/show-ref.c:161
+msgid "stricter reference checking, requires exact ref path"
+msgstr "строга проверка на указателите, изисква се указател с пълен път"
 
-#: builtin/remote.c:1448
-msgid "no remote specified"
-msgstr "не Ðµ Ñ\83казано Ð¾Ñ\82далеÑ\87ено Ñ\85Ñ\80анилиÑ\89е"
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
+msgid "show the HEAD reference, even if it would be filtered out"
+msgstr "задÑ\8aлжиÑ\82елно Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð¸ Ð½Ð° Ñ\83казаÑ\82елÑ\8f HEAD"
 
-#: builtin/remote.c:1465
-msgid "query push URLs rather than fetch URLs"
-msgstr "запиÑ\82ване ÐºÑ\8aм Ð°Ð´Ñ\80еÑ\81иÑ\82е Ð·Ð° Ð¸Ð·Ñ\82лаÑ\81кване, Ð° Ð½Ðµ Ð·Ð° Ð´Ð¾Ñ\81Ñ\82авÑ\8fне"
+#: builtin/show-ref.c:168
+msgid "dereference tags into object IDs"
+msgstr "да Ñ\81е Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ñ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80иÑ\82е Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е-еÑ\82икеÑ\82и"
 
-#: builtin/remote.c:1467
-msgid "return all URLs"
-msgstr "извеждане на всички адреси"
+#: builtin/show-ref.c:170
+msgid "only show SHA1 hash using <n> digits"
+msgstr "извеждане само на този БРОЙ цифри от всяка сума по SHA1"
 
-#: builtin/remote.c:1495
-#, c-format
-msgid "no URLs configured for remote '%s'"
-msgstr "не е зададен адрес за отдалеченото хранилище „%s“"
+#: builtin/show-ref.c:174
+msgid "do not print results to stdout (useful with --verify)"
+msgstr ""
+"без извеждане на резултатите на стандартния вход (полезно с опцията „--"
+"verify“)"
 
-#: builtin/remote.c:1521
-msgid "manipulate push URLs"
-msgstr "промяна на адресите за изтласкване"
+#: builtin/show-ref.c:176
+msgid "show refs from stdin that aren't in local repository"
+msgstr ""
+"извеждане на указателите приети от стандартния вход, които липсват в "
+"локалното хранилище"
 
-#: builtin/remote.c:1523
-msgid "add URL"
-msgstr "добавяне на адреси"
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
 
-#: builtin/remote.c:1525
-msgid "delete URLs"
-msgstr "изтриване на адреси"
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
 
-# FIXME message - incompatible
-#: builtin/remote.c:1532
-msgid "--add --delete doesn't make sense"
-msgstr "опциите „--add“ и „--delete“ са несъвместими"
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "пропускане на всички редове, които започват с „#“"
 
-#: builtin/remote.c:1573
-#, c-format
-msgid "Invalid old URL pattern: %s"
-msgstr "Неправилен (стар) формат за адрес: %s"
+#: builtin/stripspace.c:38
+msgid "prepend comment character and space to each line"
+msgstr "добавяне на „# “ в началото на всеки ред"
 
-#: builtin/remote.c:1581
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
-msgid "No such URL found: %s"
-msgstr "Такъв адрес не е открит: %s"
+msgid "No such ref: %s"
+msgstr "Такъв указател няма: %s"
 
-# FIXME CHECK MEANING
-#: builtin/remote.c:1583
-msgid "Will not delete all non-push URLs"
-msgstr "Ð\9dикой Ð¾Ñ\82 Ð°Ð´Ñ\80еÑ\81иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81а Ð·Ð° Ð¸Ð·Ñ\82лаÑ\81кване, Ð½Ñ\8fма Ð´Ð° Ñ\81е Ð¸Ð·Ñ\82Ñ\80ие"
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "Ð\9eÑ\87аква Ñ\81е Ð¿Ñ\8aлно Ð¸Ð¼Ðµ Ð½Ð° Ñ\83казаÑ\82ел, Ð° Ð½Ðµ â\80\9e%sâ\80\9c"
 
-#: builtin/remote.c:1597
-msgid "be verbose; must be placed before a subcommand"
-msgstr "повече подробности. Поставя се пред подкоманда"
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "не може да се махне компонент от адреса „%s“"
 
-#: builtin/repack.c:17
-msgid "git repack [<options>]"
-msgstr "git repack [ОПЦИЯ…]"
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
+msgid "alternative anchor for relative paths"
+msgstr "директория за определянето на относителните пътища"
 
-#: builtin/repack.c:159
-msgid "pack everything in a single pack"
-msgstr "пакетиране на всичко в пакет"
+#: builtin/submodule--helper.c:310
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=ПЪТ] [ПЪТ…]"
 
-#: builtin/repack.c:161
-msgid "same as -a, and turn unreachable objects loose"
-msgstr ""
-"същото като опцията „-a“. Допълнително — недостижимите обекти да станат "
-"непакетирани"
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
+#, c-format
+msgid "No url found for submodule path '%s' in .gitmodules"
+msgstr "Във файла „.gitmodules“ не е открит адрес за пътя към подмодул „%s“"
 
-#: builtin/repack.c:164
-msgid "remove redundant packs, and run git-prune-packed"
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
 msgstr ""
-"пÑ\80емаÑ\85ване Ð½Ð° Ð½ÐµÐ½Ñ\83жниÑ\82е Ð¿Ð°ÐºÐµÑ\82иÑ\80ани Ñ\84айлове Ð¸ Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit-"
-"prune-packed“"
+"наÑ\81Ñ\82Ñ\80ойкаÑ\82а â\80\9e%sâ\80\9c Ð»Ð¸Ð¿Ñ\81ва.  Ð\9fÑ\80иема Ñ\81е, Ñ\87е Ñ\82ова Ñ\85Ñ\80анилиÑ\89е Ðµ Ð¿Ñ\80авилниÑ\8fÑ\82 Ð¸Ð·Ñ\82оÑ\87ник "
+"за себе си."
 
-#: builtin/repack.c:166
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr "подаване на опцията „--no-reuse-delta“ на командата „git-pack-objects“"
+#: builtin/submodule--helper.c:406
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr "Неуспешно регистриране на адрес за пътя към подмодул „%s“"
 
-#: builtin/repack.c:168
-msgid "pass --no-reuse-object to git-pack-objects"
-msgstr ""
-"подаване на опцията „--no-reuse-object“ на командата „git-pack-objects“"
+#: builtin/submodule--helper.c:410
+#, c-format
+msgid "Submodule '%s' (%s) registered for path '%s'\n"
+msgstr "Регистриран е подмодул „%s“ (%s) за пътя към подмодул „%s“\n"
 
-#: builtin/repack.c:170
-msgid "do not run git-update-server-info"
-msgstr "без изпълнение на командата „git-update-server-info“"
+#: builtin/submodule--helper.c:420
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: препоръчва се режим на обновяване за подмодула „%s“\n"
 
-#: builtin/repack.c:173
-msgid "pass --local to git-pack-objects"
-msgstr "подаване на опцията „--local“ на командата „git-pack-objects“"
+#: builtin/submodule--helper.c:427
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr ""
+"Неуспешно регистриране на режима на обновяване за пътя към подмодул „%s“"
 
-#: builtin/repack.c:175
-msgid "write bitmap index"
-msgstr "създаване и записване на индекси на база битови маски"
+#: builtin/submodule--helper.c:443
+msgid "Suppress output for initializing a submodule"
+msgstr "Без извеждане на информация при инициализирането на подмодул"
 
-#: builtin/repack.c:176
-msgid "approxidate"
-msgstr "евристична дата"
+#: builtin/submodule--helper.c:448
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper name [ПЪТ]"
 
-#: builtin/repack.c:177
-msgid "with -A, do not loosen objects older than this"
-msgstr ""
-"при комбинирането с опцията „-A“ — без разпакетиране на обектите по стари от "
-"това"
+#: builtin/submodule--helper.c:476
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name ПЪТ"
 
-#: builtin/repack.c:179
-msgid "size of the window used for delta compression"
-msgstr "размер на прозореца за делта компресията"
+#: builtin/submodule--helper.c:482
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "Във файла „.gitmodules“ липсва информация за пътя „%s“"
 
-#: builtin/repack.c:180 builtin/repack.c:184
-msgid "bytes"
-msgstr "байтове"
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "към подмодула „%s“ не може да се добави алтернативен източник: %s"
 
-#: builtin/repack.c:181
-msgid "same as the above, but limit memory size instead of entries count"
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
 msgstr ""
-"същото като горната опция, но ограничението да е по размер на паметта, а не "
-"по броя на обектите"
-
-#: builtin/repack.c:183
-msgid "limits the maximum delta depth"
-msgstr "ограничаване на максималната дълбочина на делтата"
-
-#: builtin/repack.c:185
-msgid "maximum size of each packfile"
-msgstr "максимален размер на всеки пакет"
+"Непозната стойност „%s“ за настройката „submodule.alternateErrorStrategy“"
 
-#: builtin/repack.c:187
-msgid "repack objects in packs marked with .keep"
-msgstr "препакетиране на обектите в пакети белязани с „.keep“"
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Непозната стойност „%s“ за настройката „submodule.alternateLocation“"
 
-#: builtin/repack.c:197
-msgid "cannot delete packs in a precious-objects repo"
-msgstr "пакеÑ\82иÑ\82е Ð² Ñ\85Ñ\80анилиÑ\89е Ñ\81 Ð²Ð°Ð¶Ð½Ð¸ Ð¾Ð±ÐµÐºÑ\82и Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ñ\82Ñ\80иÑ\8fÑ\82"
+#: builtin/submodule--helper.c:633
+msgid "where the new submodule will be cloned to"
+msgstr "кÑ\8aде Ð´Ð° Ñ\81е ÐºÐ»Ð¾Ð½Ð¸Ñ\80а Ð½Ð¾Ð²Ð¸Ñ\8fÑ\82 Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л"
 
-#: builtin/repack.c:381
-#, c-format
-msgid "removing '%s' failed"
-msgstr "неуспешно изтриване на „%s“"
+#: builtin/submodule--helper.c:636
+msgid "name of the new submodule"
+msgstr "име на новия подмодул"
 
-#: builtin/replace.c:19
-msgid "git replace [-f] <object> <replacement>"
-msgstr "git replace [-f] ОБЕКТ ЗАМЯНА"
+#: builtin/submodule--helper.c:639
+msgid "url where to clone the submodule from"
+msgstr "адрес, от който да се клонира новият подмодул"
 
-#: builtin/replace.c:20
-msgid "git replace [-f] --edit <object>"
-msgstr "git replace [-f] --edit ОБЕКТ"
+#: builtin/submodule--helper.c:645
+msgid "depth for shallow clones"
+msgstr "дълбочина на плитките хранилища"
 
-#: builtin/replace.c:21
-msgid "git replace [-f] --graft <commit> [<parent>...]"
-msgstr "git replace [-f] --graft ПОДАВАНЕ [РОДИТЕЛ…]"
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "извеждане на напредъка на клонирането"
 
-#: builtin/replace.c:22
-msgid "git replace -d <object>..."
-msgstr "git replace -d ОБЕКТ…"
+#: builtin/submodule--helper.c:653
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
+msgstr ""
+"git submodule--helper clone [--prefix=ПЪТ] [--quiet] [--reference ХРАНИЛИЩЕ] "
+"[--name ИМЕ] [--depth ДЪЛБОЧИНА] --url АДРЕС --path ПЪТ…"
 
-#: builtin/replace.c:23
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr "git replace [--format=ФОРМАТ] [-l [ШАБЛОН]]"
+#: builtin/submodule--helper.c:684
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "Неуспешно клониране на адреса „%s“ в пътя „%s“ като подмодул"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/submodule--helper.c:699
 #, c-format
-msgid "Not a valid object name: '%s'"
-msgstr "Ð\9dепÑ\80авилно Ð¸Ð¼Ðµ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82: â\80\9e%sâ\80\9c"
+msgid "could not get submodule directory for '%s'"
+msgstr "диÑ\80екÑ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾Ð»Ñ\83Ñ\87ена"
 
-#: builtin/replace.c:355
+#: builtin/submodule--helper.c:764
 #, c-format
-msgid "bad mergetag in commit '%s'"
-msgstr "еÑ\82икеÑ\82Ñ\8aÑ\82 Ð¿Ñ\80и Ñ\81ливане Ð² Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о â\80\9e%sâ\80\9c e Ð½ÐµÐ¿Ñ\80авилен"
+msgid "Submodule path '%s' not initialized"
+msgstr "Ð\9fÑ\8aÑ\82Ñ\8fÑ\82 Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ð¸Ð½Ð¸Ñ\86иализиÑ\80ан"
 
-#: builtin/replace.c:357
-#, c-format
-msgid "malformed mergetag in commit '%s'"
-msgstr "етикетът при сливане в подаването „%s“ e неправилен"
+#: builtin/submodule--helper.c:768
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Вероятно искахте да използвате „update --init“?"
 
-#: builtin/replace.c:368
+#: builtin/submodule--helper.c:793
 #, c-format
-msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
-msgstr ""
-"Първоначалното подаване „%s“ съдържа етикета при сливане „%s“, който е "
-"изхвърлен, затова използвайте опцията „--edit“, а не „--graft“."
+msgid "Skipping unmerged submodule %s"
+msgstr "Прескачане на неслетия подмодул „%s“"
 
-#: builtin/replace.c:401
+#: builtin/submodule--helper.c:814
 #, c-format
-msgid "the original commit '%s' has a gpg signature."
-msgstr "Ð\9fÑ\8aÑ\80вонаÑ\87алноÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ â\80\9e%sâ\80\9c Ðµ Ñ\81 Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 Ð½Ð° GPG."
+msgid "Skipping submodule '%s'"
+msgstr "Ð\9fÑ\80еÑ\81каÑ\87ане Ð½Ð° Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ла â\80\9e%sâ\80\9c"
 
-#: builtin/replace.c:402
-msgid "the signature will be removed in the replacement commit!"
-msgstr "Подписът ще бъде премахнат в заменящото подаване!"
+#: builtin/submodule--helper.c:942
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr "Неуспешен опит за клониране на „%s“.  Насрочен е втори опит"
 
-#: builtin/replace.c:408
+#: builtin/submodule--helper.c:953
 #, c-format
-msgid "could not write replacement commit for: '%s'"
-msgstr "заменящото подаване за „%s“ не може да бъде записано"
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr ""
+"Втори неуспешен опит за клониране на „%s“.  Действието се преустановява"
 
-#: builtin/replace.c:432
-msgid "list replace refs"
-msgstr "извеждане Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ñ\83казаÑ\82елиÑ\82е Ð·Ð° Ð·Ð°Ð¼Ñ\8fна"
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
+msgid "path into the working tree"
+msgstr "пÑ\8aÑ\82 ÐºÑ\8aм Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во"
 
-#: builtin/replace.c:433
-msgid "delete replace refs"
-msgstr "изÑ\82Ñ\80иване Ð½Ð° Ñ\83казаÑ\82елиÑ\82е Ð·Ð° Ð·Ð°Ð¼Ñ\8fна"
+#: builtin/submodule--helper.c:977
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr "пÑ\8aÑ\82 ÐºÑ\8aм Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во, Ð¿Ñ\80ез Ð³Ñ\80аниÑ\86иÑ\82е Ð½Ð° Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ\82е Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли"
 
-#: builtin/replace.c:434
-msgid "edit existing object"
-msgstr "редактиране на съществуващ обект"
+#: builtin/submodule--helper.c:981
+msgid "rebase, merge, checkout or none"
+msgstr ""
+"„rebase“ (пребазиране), „merge“ (сливане), „checkout“ (изтегляне) или "
+"„none“ (нищо да не се прави)"
 
-#: builtin/replace.c:435
-msgid "change a commit's parents"
-msgstr "смяна на родителите на подаване"
+#: builtin/submodule--helper.c:985
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr "Плитко клониране, ограничено до указания брой версии"
 
-#: builtin/replace.c:436
-msgid "replace the ref if it exists"
-msgstr "замÑ\8fна Ð½Ð° Ñ\83казаÑ\82елÑ\8f, Ð°ÐºÐ¾ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва"
+#: builtin/submodule--helper.c:988
+msgid "parallel jobs"
+msgstr "бÑ\80ой Ð¿Ð°Ñ\80алелни Ð¿Ñ\80оÑ\86еÑ\81и"
 
-#: builtin/replace.c:437
-msgid "do not pretty-print contents for --edit"
-msgstr "без Ñ\84оÑ\80маÑ\82иÑ\80ано Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о â\80\94 Ð·Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--editâ\80\9c"
+#: builtin/submodule--helper.c:990
+msgid "whether the initial clone should follow the shallow recommendation"
+msgstr "дали Ð¿Ñ\8aÑ\80вонаÑ\87алноÑ\82о ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане Ð´Ð° Ðµ Ð¿Ð»Ð¸Ñ\82ко, ÐºÐ°ÐºÑ\82о Ñ\81е Ð¿Ñ\80епоÑ\80Ñ\8aÑ\87ва"
 
-#: builtin/replace.c:438
-msgid "use this format"
-msgstr "използване Ð½Ð° Ñ\82ози Ð¤Ð\9eРÐ\9cÐ\90Т"
+#: builtin/submodule--helper.c:991
+msgid "don't print cloning progress"
+msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð½Ð°Ð¿Ñ\80едÑ\8aка Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\80анеÑ\82о"
 
-#: builtin/rerere.c:12
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
-msgstr "git rerere [clear | forget ПЪТ… | status | remaining | diff | gc]"
+#: builtin/submodule--helper.c:998
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=ПЪТ] [ПЪТ…]"
 
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
-msgstr "регистриране на чисти корекции на конфликти в индекса"
+#: builtin/submodule--helper.c:1008
+msgid "bad value for update parameter"
+msgstr "неправилен параметър към опцията „--update“"
 
-#: builtin/reset.c:26
+#: builtin/submodule--helper.c:1079
+#, c-format
 msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+"Submodule (%s) branch configured to inherit branch from superproject, but "
+"the superproject is not on any branch"
 msgstr ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [ПОДАВАНЕ]"
-
-#: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] УКАЗАТЕЛ_КЪМ_ДЪРВО [--] ПЪТИЩА…"
-
-#: builtin/reset.c:28
-msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
-msgstr "git reset --patch [УКАЗАТЕЛ_КЪМ_ДЪРВО] [--] [ПЪТИЩА…]"
-
-#: builtin/reset.c:34
-msgid "mixed"
-msgstr "смесено (mixed)"
-
-#: builtin/reset.c:34
-msgid "soft"
-msgstr "меко (soft)"
-
-#: builtin/reset.c:34
-msgid "hard"
-msgstr "пълно (hard)"
-
-#: builtin/reset.c:34
-msgid "merge"
-msgstr "слято (merge)"
+"Клонът на подмодула „%s“ е настроен да наследява клона от обхващащия проект, "
+"но той не е на никой клон"
 
-#: builtin/reset.c:34
-msgid "keep"
-msgstr "запазващо (keep)"
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "рекурсивно обхождане подмодулите"
 
-#: builtin/reset.c:74
-msgid "You do not have a valid HEAD."
-msgstr "Указателят „HEAD“ е повреден."
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper name embed-git-dir [ПЪТ…]"
 
-#: builtin/reset.c:76
-msgid "Failed to find tree of HEAD."
-msgstr "Дървото, сочено от указателя „HEAD“, не може да бъде открито."
+#: builtin/submodule--helper.c:1226
+msgid "submodule--helper subcommand must be called with a subcommand"
+msgstr "„submodule--helper“ трябва да се стартира с подкоманда"
 
-#: builtin/reset.c:82
+#: builtin/submodule--helper.c:1233
 #, c-format
-msgid "Failed to find tree of %s."
-msgstr "Дървото, сочено от „%s“, не може да бъде открито."
+msgid "%s doesn't support --super-prefix"
+msgstr "„%s“ не поддържа опцията „--super-prefix“"
 
-#: builtin/reset.c:100
+#: builtin/submodule--helper.c:1239
 #, c-format
-msgid "HEAD is now at %s"
-msgstr "Указателят „HEAD“ сочи към „%s“"
+msgid "'%s' is not a valid submodule--helper subcommand"
+msgstr "„%s“ не е подкоманда на „submodule--helper“"
 
-#: builtin/reset.c:183
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
-msgstr "Не може да се извърши %s зануляване по време на сливане."
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [<options>] <name> [<ref>]"
+msgstr "git symbolic-ref [ОПЦИЯ…] ИМЕ [УКАЗАТЕЛ]"
 
-#: builtin/reset.c:276
-msgid "be quiet, only report errors"
-msgstr "по-малко подробности, да се извеждат само грешките"
+#: builtin/symbolic-ref.c:8
+msgid "git symbolic-ref -d [-q] <name>"
+msgstr "git symbolic-ref -d [-q] ИМЕ"
 
-#: builtin/reset.c:278
-msgid "reset HEAD and index"
-msgstr "индекÑ\81а Ð¸ Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c, Ð±ÐµÐ· Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во"
+#: builtin/symbolic-ref.c:40
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð³Ñ\80еÑ\88ка Ð·Ð° Ð½ÐµÑ\81вÑ\8aÑ\80зани (неÑ\81имволни) Ñ\83казаÑ\82ели"
 
-#: builtin/reset.c:279
-msgid "reset only HEAD"
-msgstr "само указателя „HEAD“, без индекса и работното дърво"
+#: builtin/symbolic-ref.c:41
+msgid "delete symbolic ref"
+msgstr "изтриване на символен указател"
 
-# FIXME vs man page
-#: builtin/reset.c:281 builtin/reset.c:283
-msgid "reset HEAD, index and working tree"
-msgstr "указателя „HEAD“, индекса и работното дърво"
+#: builtin/symbolic-ref.c:42
+msgid "shorten ref output"
+msgstr "кратка информация за указателя"
 
-# FIXME vs man page
-#: builtin/reset.c:285
-msgid "reset HEAD but keep local changes"
-msgstr "зануляване на указателя „HEAD“, но запазване на локалните промени"
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason"
+msgstr "причина"
 
-#: builtin/reset.c:288
-msgid "record only the fact that removed paths will be added later"
-msgstr ""
-"отбелязване само на факта, че изтритите пътища ще бъдат добавени по-късно"
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason of the update"
+msgstr "причина за обновяването"
 
-#: builtin/reset.c:305
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
-msgstr "Стойността „%s“ не е разпозната като съществуваща версия."
+#: builtin/tag.c:23
+msgid ""
+"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
+"[<head>]"
+msgstr ""
+"git tag [-a | -s | -u ИДЕНТИФИКАТОР_НА_КЛЮЧ] [-f] [-m СЪОБЩЕНИЕ | -F ФАЙЛ] "
+"ЕТИКЕТ [ВРЪХ]"
 
-#: builtin/reset.c:313
-#, c-format
-msgid "Failed to resolve '%s' as a valid tree."
-msgstr "„%s“ не е разпознат като дърво."
+#: builtin/tag.c:24
+msgid "git tag -d <tagname>..."
+msgstr "git tag -d ЕТИКЕТ…"
 
-#: builtin/reset.c:322
-msgid "--patch is incompatible with --{hard,mixed,soft}"
+#: builtin/tag.c:25
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"опцията „--patch“ е несъвместима с всяка от опциите „--hard/--mixed/--soft“"
+"git tag -l [-n[БРОЙ]] [--contains ПОДАВАНЕ] [--points-at ОБЕКТ]\n"
+"           [--format=ФОРМАТ] [--[no-]merged [ПОДАВАНЕ]] [ШАБЛОН…]"
 
-#: builtin/reset.c:331
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
-"опцията „--mixed“ не бива да се използва заедно с пътища. Вместо това "
-"изпълнете „git reset -- ПЪТ…“."
+#: builtin/tag.c:27
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=ФОРМАТ] ЕТИКЕТ…"
 
-#: builtin/reset.c:333
+#: builtin/tag.c:83
 #, c-format
-msgid "Cannot do %s reset with paths."
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88иÑ\82е %s Ð·Ð°Ð½Ñ\83лÑ\8fване, ÐºÐ¾Ð³Ð°Ñ\82о Ñ\81Ñ\82е Ð·Ð°Ð´Ð°Ð»Ð¸ Ð\9fЪТ."
+msgid "tag '%s' not found."
+msgstr "еÑ\82икеÑ\82Ñ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ðµ Ð¾Ñ\82кÑ\80иÑ\82."
 
-#: builtin/reset.c:343
+#: builtin/tag.c:99
 #, c-format
-msgid "%s reset is not allowed in a bare repository"
-msgstr "В голо хранилище не може да извършите %s зануляване"
-
-#: builtin/reset.c:347
-msgid "-N can only be used with --mixed"
-msgstr "Опцията „-N“ е съвместима само с „--mixed“"
-
-#: builtin/reset.c:364
-msgid "Unstaged changes after reset:"
-msgstr "Промени извън индекса след зануляването:"
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr "Изтрит е етикетът „%s“ (бе „%s“)\n"
 
-#: builtin/reset.c:370
+#: builtin/tag.c:128
 #, c-format
-msgid "Could not reset index file to revision '%s'."
-msgstr "Индексът не може да бъде занулен към версия „%s“."
-
-#: builtin/reset.c:374
-msgid "Could not write new index file."
-msgstr "Новият индекс не може да бъде записан."
-
-#: builtin/rev-list.c:350
-msgid "rev-list does not support display of notes"
-msgstr "командата „rev-list“ не поддържа извеждането на бележки"
-
-#: builtin/rev-parse.c:358
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr "git rev-parse --parseopt [ОПЦИЯ…] -- [АРГУМЕНТ…]"
-
-#: builtin/rev-parse.c:363
-msgid "keep the `--` passed as an arg"
-msgstr "зададеният низ „--“ да се тълкува като аргумент"
-
-#: builtin/rev-parse.c:365
-msgid "stop parsing after the first non-option argument"
-msgstr "спиране на анализа след първия аргумент, който не е опция"
-
-#: builtin/rev-parse.c:368
-msgid "output in stuck long form"
-msgstr "изход в дългия формат"
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
+msgstr ""
+"\n"
+"Въведете съобщение за етикета.\n"
+"  %s\n"
+"Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
 
-#: builtin/rev-parse.c:499
+#: builtin/tag.c:132
+#, c-format
 msgid ""
-"git rev-parse --parseopt [<options>] -- [<args>...]\n"
-"   or: git rev-parse --sq-quote [<arg>...]\n"
-"   or: git rev-parse [<options>] [<arg>...]\n"
 "\n"
-"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be kept; you may remove them yourself if you "
+"want to.\n"
 msgstr ""
-"git rev-parse --parseopt [ОПЦИЯ…] -- [АРГУМЕНТ…]\n"
-"   или: git rev-parse --sq-quote [АРГУМЕНТ…]\n"
-"   или: git rev-parse [ОПЦИЯ…] [АРГУМЕНТ…]\n"
 "\n"
-"За повече информация за първия вариант изпълнете „git rev-parse --parseopt -"
-"h“"
+"Въведете съобщение за етикет.\n"
+"  %s\n"
+"Редовете, които започват с „%c“, също ще бъдат включени — може да ги "
+"изтриете вие.\n"
 
-#: builtin/revert.c:22
-msgid "git revert [<options>] <commit-ish>..."
-msgstr "git revert [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
+#: builtin/tag.c:210
+msgid "unable to sign the tag"
+msgstr "етикетът не може да бъде подписан"
 
-#: builtin/revert.c:23
-msgid "git revert <subcommand>"
-msgstr "git revert ПОДКОМАНДА"
+#: builtin/tag.c:212
+msgid "unable to write tag file"
+msgstr "файлът за етикета не може да бъде запазен"
 
-#: builtin/revert.c:28
-msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr "git cherry-pick [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
+#: builtin/tag.c:236
+msgid "bad object type."
+msgstr "неправилен вид обект."
 
-#: builtin/revert.c:29
-msgid "git cherry-pick <subcommand>"
-msgstr "git cherry-pick ПОДКОМАНДА"
+#: builtin/tag.c:282
+msgid "no tag message?"
+msgstr "липсва съобщение за етикета"
 
-#: builtin/revert.c:71
+#: builtin/tag.c:289
 #, c-format
-msgid "%s: %s cannot be used with %s"
-msgstr "%s: опцията „%s“ е несъвместима с „%s“"
+msgid "The tag message has been left in %s\n"
+msgstr "Съобщението за етикета е запазено във файла „%s“\n"
 
-#: builtin/revert.c:80
-msgid "end revert or cherry-pick sequence"
-msgstr "завÑ\8aÑ\80Ñ\88ване Ð½Ð° Ð¿Ð¾Ñ\80едиÑ\86а Ð¾Ñ\82 Ð¾Ñ\82биÑ\80аниÑ\8f Ð¸Ð»Ð¸ Ð¾Ñ\82мени Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
+#: builtin/tag.c:397
+msgid "list tag names"
+msgstr "извеждане Ð½Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е"
 
-#: builtin/revert.c:81
-msgid "resume revert or cherry-pick sequence"
-msgstr "пÑ\80одÑ\8aлжаване Ð½Ð° Ð¿Ð¾Ñ\80едиÑ\86а Ð¾Ñ\82 Ð¾Ñ\82биÑ\80аниÑ\8f Ð¸Ð»Ð¸ Ð¾Ñ\82мени Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
+#: builtin/tag.c:399
+msgid "print <n> lines of each tag message"
+msgstr "извеждане Ð½Ð° Ñ\82ози Ð\91РÐ\9eÐ\99 Ñ\80едове Ð¾Ñ\82 Ð²Ñ\81Ñ\8fко Ñ\81Ñ\8aобÑ\89ение Ð·Ð° ÐµÑ\82икеÑ\82"
 
-#: builtin/revert.c:82
-msgid "cancel revert or cherry-pick sequence"
-msgstr "оÑ\82мÑ\8fна Ð½Ð° Ð¿Ð¾Ñ\80едиÑ\86а Ð¾Ñ\82 Ð¾Ñ\82биÑ\80аниÑ\8f Ð¸Ð»Ð¸ Ð¾Ñ\82мени Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
+#: builtin/tag.c:401
+msgid "delete tags"
+msgstr "изÑ\82Ñ\80иване Ð½Ð° ÐµÑ\82икеÑ\82и"
 
-#: builtin/revert.c:83
-msgid "don't automatically commit"
-msgstr "без Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: builtin/tag.c:402
+msgid "verify tags"
+msgstr "пÑ\80овеÑ\80ка Ð½Ð° ÐµÑ\82икеÑ\82и"
 
-#: builtin/revert.c:84
-msgid "edit the commit message"
-msgstr "редактиране на съобщението при подаване"
+#: builtin/tag.c:404
+msgid "Tag creation options"
+msgstr "Опции при създаването на етикети"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "номеÑ\80 Ð½Ð° Ñ\80одиÑ\82елÑ\8f"
+#: builtin/tag.c:406
+msgid "annotated tag, needs a message"
+msgstr "аноÑ\82иÑ\80анеÑ\82о Ð½Ð° ÐµÑ\82икеÑ\82и Ð¸Ð·Ð¸Ñ\81ква Ñ\81Ñ\8aобÑ\89ение"
 
-#: builtin/revert.c:89
-msgid "merge strategy"
-msgstr "стратегия на сливане"
+#: builtin/tag.c:408
+msgid "tag message"
+msgstr "СЪОБЩЕНИЕ за етикет"
 
-#: builtin/revert.c:90
-msgid "option"
-msgstr "опÑ\86иÑ\8f"
+#: builtin/tag.c:410
+msgid "annotated and GPG-signed tag"
+msgstr "аноÑ\82иÑ\80ан ÐµÑ\82икеÑ\82 Ñ\81 Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 Ð¿Ð¾ GPG"
 
-#: builtin/revert.c:91
-msgid "option for merge strategy"
-msgstr "опÑ\86иÑ\8f Ð·Ð° Ñ\81Ñ\82Ñ\80аÑ\82егиÑ\8fÑ\82а Ð½Ð° Ñ\81ливане"
+#: builtin/tag.c:414
+msgid "use another key to sign the tag"
+msgstr "използване Ð½Ð° Ð´Ñ\80Ñ\83г ÐºÐ»Ñ\8eÑ\87 Ð·Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81ванеÑ\82о Ð½Ð° ÐµÑ\82икеÑ\82"
 
-#: builtin/revert.c:104
-msgid "append commit name"
-msgstr "добавÑ\8fне Ð½Ð° Ð¸Ð¼ÐµÑ\82о Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
+#: builtin/tag.c:415
+msgid "replace the tag if exists"
+msgstr "замÑ\8fна Ð½Ð° ÐµÑ\82икеÑ\82а, Ð°ÐºÐ¾ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва"
 
-#: builtin/revert.c:106
-msgid "preserve initially empty commits"
-msgstr "запазване на първоначално празните подавания"
+#: builtin/tag.c:416 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr "създаване на журнал на указателите"
 
-#: builtin/revert.c:107
-msgid "allow commits with empty messages"
-msgstr "позволÑ\8fване Ð½Ð° Ð¿Ñ\80азни Ñ\81Ñ\8aобÑ\89ениÑ\8f Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+#: builtin/tag.c:418
+msgid "Tag listing options"
+msgstr "Ð\9eпÑ\86ии Ð·Ð° Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½ÐµÑ\82о Ð½Ð° ÐµÑ\82икеÑ\82и"
 
-#: builtin/revert.c:108
-msgid "keep redundant, empty commits"
-msgstr "запазване Ð½Ð° Ð¸Ð·Ð»Ð¸Ñ\88ниÑ\82е, Ð¿Ñ\80азни Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f"
+#: builtin/tag.c:419
+msgid "show tag list in columns"
+msgstr "извеждане Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е Ð¿Ð¾ ÐºÐ¾Ð»Ð¾Ð½Ð¸"
 
-#: builtin/revert.c:112
-msgid "program error"
-msgstr "гÑ\80еÑ\88ка Ð² Ð¿Ñ\80огÑ\80амаÑ\82а"
+#: builtin/tag.c:420 builtin/tag.c:422
+msgid "print only tags that contain the commit"
+msgstr "извеждане Ñ\81амо Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
 
-#: builtin/revert.c:197
-msgid "revert failed"
-msgstr "неÑ\83Ñ\81пеÑ\88на Ð¾Ñ\82мÑ\8fна"
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "извеждане Ñ\81амо Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
 
-#: builtin/revert.c:212
-msgid "cherry-pick failed"
-msgstr "неÑ\83Ñ\81пеÑ\88но Ð¾Ñ\82биÑ\80ане"
+#: builtin/tag.c:424
+msgid "print only tags that are merged"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\81леÑ\82иÑ\82е ÐµÑ\82икеÑ\82и"
 
-#: builtin/rm.c:17
-msgid "git rm [<options>] [--] <file>..."
-msgstr "git rm [ОПЦИЯ…] [--] ФАЙЛ…"
+#: builtin/tag.c:425
+msgid "print only tags that are not merged"
+msgstr "извеждане само на неслетите етикети"
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"следният подмодул или някой от неговите подмодули използват директория на "
-"име\n"
-"„.git“:"
-msgstr[1] ""
-"следните подмодули или някои от техните подмодули използват директория на "
-"име\n"
-"„.git“:"
+#: builtin/tag.c:430
+msgid "print only tags of the object"
+msgstr "извеждане само на етикетите на ОБЕКТА"
 
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(ако искате да ги изтриете заедно с цялата им история, използвайте „rm -rf“)"
+#: builtin/tag.c:469
+msgid "--column and -n are incompatible"
+msgstr "Опциите „--column“ и „-n“ са несъвместими"
 
-#: builtin/rm.c:230
-msgid ""
-"the following file has staged content different from both the\n"
-"file and the HEAD:"
-msgid_plural ""
-"the following files have staged content different from both the\n"
-"file and the HEAD:"
-msgstr[0] ""
-"следният файл е със съдържание в индекса различно от текущото му съдържание "
-"и\n"
-"различно от съответстващото на HEAD:"
-msgstr[1] ""
-"следните файлове са със съдържание в индекса различно от текущото им "
-"съдържание и\n"
-"различно от съответстващото на HEAD:"
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "Опцията „-n“ изисква режим на списък."
 
-#: builtin/rm.c:235
-msgid ""
-"\n"
-"(use -f to force removal)"
-msgstr ""
-"\n"
-"(за принудително изтриване използвайте опцията „-f“)"
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "Опцията „-contains“ изисква режим на списък."
 
-#: builtin/rm.c:239
-msgid "the following file has changes staged in the index:"
-msgid_plural "the following files have changes staged in the index:"
-msgstr[0] "следният файл е с променено съдържание в индекса:"
-msgstr[1] "следните файлове са с променено съдържание в индекса:"
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "Опцията „-contains“ изисква  режим на списък."
 
-#: builtin/rm.c:243 builtin/rm.c:254
-msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
-msgstr ""
-"\n"
-"(за запазване на файла използвайте опцията „--cached“, а за принудително\n"
-"изтриване — „-f“)"
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "Опцията „-points-at“ изисква режим на списък."
 
-#: builtin/rm.c:251
-msgid "the following file has local modifications:"
-msgid_plural "the following files have local modifications:"
-msgstr[0] "следният файл е с променено съдържание"
-msgstr[1] "следните файлове са с променено съдържание"
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr "Опциите „--merged“ и „--no-merged“ изискват режим на списък."
 
-#: builtin/rm.c:269
-msgid "do not list removed files"
-msgstr "да Ð½Ðµ Ñ\81е Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ñ\82 Ð¸Ð·Ñ\82Ñ\80иÑ\82иÑ\82е Ñ\84айлове"
+#: builtin/tag.c:510
+msgid "only one -F or -m option is allowed."
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e-Fâ\80\9c Ð¸ â\80\9e-mâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими."
 
-#: builtin/rm.c:270
-msgid "only remove from the index"
-msgstr "изÑ\82Ñ\80иване Ñ\81амо Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: builtin/tag.c:529
+msgid "too many params"
+msgstr "Ð\9fÑ\80екалено Ð¼Ð½Ð¾Ð³Ð¾ Ð°Ñ\80гÑ\83менÑ\82и"
 
-#: builtin/rm.c:271
-msgid "override the up-to-date check"
-msgstr "въпреки проверката за актуалността на съдържанието"
+#: builtin/tag.c:535
+#, c-format
+msgid "'%s' is not a valid tag name."
+msgstr "„%s“ е неправилно име за етикет."
 
-#: builtin/rm.c:272
-msgid "allow recursive removal"
-msgstr "рекурсивно изтриване"
+#: builtin/tag.c:540
+#, c-format
+msgid "tag '%s' already exists"
+msgstr "етикетът „%s“ вече съществува"
 
-#: builtin/rm.c:274
-msgid "exit with a zero status even if nothing matched"
-msgstr ""
-"изходният код да е 0, дори ако никой файл нe e напаснал с шаблона за "
-"изтриване"
+#: builtin/tag.c:570
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
+msgstr "Обновен етикет „%s“ (бе „%s“)\n"
+
+#: builtin/unpack-objects.c:493
+msgid "Unpacking objects"
+msgstr "Разпакетиране на обектите"
 
-#: builtin/rm.c:335
+#: builtin/update-index.c:79
 #, c-format
-msgid "not removing '%s' recursively without -r"
-msgstr "без Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½ÐµÑ\82о Ð½Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-râ\80\9c â\80\9e%sâ\80\9c Ð½Ñ\8fма Ð´Ð° Ñ\81е Ð¸Ð·Ñ\82Ñ\80ие Ñ\80екÑ\83Ñ\80Ñ\81ивно"
+msgid "failed to create directory %s"
+msgstr "диÑ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздадена"
 
-#: builtin/rm.c:374
+#: builtin/update-index.c:85
 #, c-format
-msgid "git rm: unable to remove %s"
-msgstr "git rm: „%s“ не може да се изтрие"
+msgid "failed to stat %s"
+msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
-#: builtin/send-pack.c:18
-msgid ""
-"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
-"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> "
-"[<ref>...]\n"
-"  --all and explicit <ref> specification are mutually exclusive."
-msgstr ""
-"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-"
-"pack=ПАКЕТ] [--verbose] [--thin] [--atomic] [ХОСТ:]ДИРЕКТОРИЯ [УКАЗАТЕЛ…]\n"
-"  опцията „--all“ и изричното посочване на УКАЗАТЕЛ са взаимно несъвместими."
+#: builtin/update-index.c:95
+#, c-format
+msgid "failed to create file %s"
+msgstr "файлът „%s“ не може да бъде създаден"
 
-#: builtin/send-pack.c:160
-msgid "remote name"
-msgstr "име на отдалечено хранилище"
+#: builtin/update-index.c:103
+#, c-format
+msgid "failed to delete file %s"
+msgstr "файлът „%s“ не може да бъде изтрит"
 
-#: builtin/send-pack.c:171
-msgid "use stateless RPC protocol"
-msgstr "използване на протокол без запазване на състоянието за RPC"
+#: builtin/update-index.c:110 builtin/update-index.c:216
+#, c-format
+msgid "failed to delete directory %s"
+msgstr "директорията „%s“ не може да бъде изтрита"
 
-#: builtin/send-pack.c:172
-msgid "read refs from stdin"
-msgstr "четене на указателите от стандартния вход"
+#: builtin/update-index.c:135
+#, c-format
+msgid "Testing mtime in '%s' "
+msgstr "Проверка на времето на промяна (mtime) на файла „%s“"
 
-#: builtin/send-pack.c:173
-msgid "print status from remote helper"
-msgstr "извеждане на състоянието от отдалечената помощна функция"
+#: builtin/update-index.c:149
+msgid "directory stat info does not change after adding a new file"
+msgstr ""
+"информацията получена чрез „stat“ за директорията не се променя след "
+"добавянето на нов файл"
 
-#: builtin/shortlog.c:13
-msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
-msgstr "git shortlog [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] [ПЪТ…]]"
+#: builtin/update-index.c:162
+msgid "directory stat info does not change after adding a new directory"
+msgstr ""
+"информацията получена чрез „stat“ за директорията не се променя след "
+"добавянето на нова директория"
 
-#: builtin/shortlog.c:242
-msgid "sort output according to the number of commits per author"
-msgstr "подредба на подаванията по броя подавания от автор"
+#: builtin/update-index.c:175
+msgid "directory stat info changes after updating a file"
+msgstr ""
+"информацията получена чрез „stat“ за директорията се променя след "
+"обновяването на нов файл"
 
-#: builtin/shortlog.c:244
-msgid "Suppress commit descriptions, only provides commit count"
-msgstr "Без описания на подаванията — да се показва само броя подавания"
+#: builtin/update-index.c:186
+msgid "directory stat info changes after adding a file inside subdirectory"
+msgstr ""
+"информацията получена чрез „stat“ за директорията се променя след добавянето "
+"на файл в поддиректория"
 
-#: builtin/shortlog.c:246
-msgid "Show the email address of each author"
-msgstr "Извеждане на адреса на е-поща за всеки автор"
+#: builtin/update-index.c:197
+msgid "directory stat info does not change after deleting a file"
+msgstr ""
+"информацията получена чрез „stat“ за директорията не се променя след "
+"изтриването на файл"
 
-# FIXME why is this so short
-#: builtin/shortlog.c:247
-msgid "w[,i1[,i2]]"
-msgstr "ШИРОЧИНА[,ОТСТЪП_1[,ОТСТЪП_2]]"
+#: builtin/update-index.c:210
+msgid "directory stat info does not change after deleting a directory"
+msgstr ""
+"информацията получена чрез „stat“ за директорията не се променя след "
+"изтриването на директория"
+
+#: builtin/update-index.c:217
+msgid " OK"
+msgstr " Добре"
+
+#: builtin/update-index.c:568
+msgid "git update-index [<options>] [--] [<file>...]"
+msgstr "git update-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
 
-#: builtin/shortlog.c:248
-msgid "Linewrap output"
+#: builtin/update-index.c:923
+msgid "continue refresh even when index needs update"
 msgstr ""
-"Пренасяне на редовете до тази обща ШИРОЧИНА (76), с ОТСТЪП_1 (6) за първия "
-"ред и ОТСТЪП_2 (9) за останалите"
+"продължаване с обновяването, дори когато индексът трябва да бъде обновен"
 
-#: builtin/show-branch.c:10
-msgid ""
-"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
-"\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
-"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
-"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
-msgstr ""
-"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
-"    [--current] [--color[=КОГА] | --no-color] [--sparse]\n"
-"    [--more=БРОЙ | --list | --independent | --merge-base]\n"
-"    [--no-name | --sha1-name] [--topics] [(РЕВИЗИЯ | УКАЗАТЕЛ)…]"
+#: builtin/update-index.c:926
+msgid "refresh: ignore submodules"
+msgstr "подмодулите да се игнорират при обновяването"
 
-#: builtin/show-branch.c:14
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr "git show-branch (-g | --reflog)[=БРОЙ[,БАЗА]] [--list] [УКАЗАТЕЛ]"
+#: builtin/update-index.c:929
+msgid "do not ignore new files"
+msgstr "новите файлове да не се игнорират"
 
-#: builtin/show-branch.c:640
-msgid "show remote-tracking and local branches"
-msgstr "извеждане на следящите и локалните клони"
+#: builtin/update-index.c:931
+msgid "let files replace directories and vice-versa"
+msgstr "файлове да могат да заменят директории и обратно"
 
-#: builtin/show-branch.c:642
-msgid "show remote-tracking branches"
-msgstr "извеждане Ð½Ð° Ñ\81ледÑ\8fÑ\89иÑ\82е ÐºÐ»Ð¾Ð½Ð¸"
+#: builtin/update-index.c:933
+msgid "notice files missing from worktree"
+msgstr "пÑ\80едÑ\83пÑ\80еждаване Ð¿Ñ\80и Ð»Ð¸Ð¿Ñ\81ваÑ\89и Ð² Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во Ñ\84айлове"
 
-#: builtin/show-branch.c:644
-msgid "color '*!+-' corresponding to the branch"
-msgstr "оцветяване на „*!+-“ според клоните"
+#: builtin/update-index.c:935
+msgid "refresh even if index contains unmerged entries"
+msgstr "обновяване дори и индексът да съдържа неслети обекти"
 
-#: builtin/show-branch.c:646
-msgid "show <n> more commits after the common ancestor"
-msgstr "извеждане Ð½Ð° Ñ\82акÑ\8aв Ð\91РÐ\9eÐ\99 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8f Ð¾Ñ\82 Ð¾Ð±Ñ\89иÑ\8f Ð¿Ñ\80едÑ\88еÑ\81Ñ\82веник"
+#: builtin/update-index.c:938
+msgid "refresh stat information"
+msgstr "обновÑ\8fване Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8fÑ\82а Ð¾Ñ\82 Ñ\84Ñ\83нкÑ\86иÑ\8fÑ\82а â\80\9estatâ\80\9c"
 
-#: builtin/show-branch.c:648
-msgid "synonym to more=-1"
-msgstr "синоним на „more=-1“"
+#: builtin/update-index.c:942
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr ""
+"като опцията „--refresh“, но да се проверят и обектите, които са били приети "
+"за непроменени"
 
-#: builtin/show-branch.c:649
-msgid "suppress naming strings"
-msgstr "без Ð½Ð¸Ð·Ð¾Ð²Ðµ Ð·Ð° Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е"
+#: builtin/update-index.c:946
+msgid "<mode>,<object>,<path>"
+msgstr "РÐ\95Ð\96Ð\98Ð\9c\9eÐ\91Ð\95Ð\9aТ,Ð\9fЪТ"
 
-#: builtin/show-branch.c:651
-msgid "include the current branch"
-msgstr "вклÑ\8eÑ\87ване Ð¸ Ð½Ð° Ñ\82екÑ\83Ñ\89иÑ\8f ÐºÐ»Ð¾Ð½"
+#: builtin/update-index.c:947
+msgid "add the specified entry to the index"
+msgstr "добавÑ\8fне Ð½Ð° Ð¸Ð·Ð±Ñ\80оениÑ\82е Ð¾Ð±ÐµÐºÑ\82и ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: builtin/show-branch.c:653
-msgid "name commits with their object names"
-msgstr "именÑ\83ване Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8fÑ\82а Ñ\81 Ð¸Ð¼ÐµÐ½Ð°Ñ\82а Ð¸Ð¼ Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и"
+#: builtin/update-index.c:956
+msgid "mark files as \"not changing\""
+msgstr "задаване Ð½Ð° Ñ\84лаг, Ñ\87е Ñ\84айлÑ\8aÑ\82 Ð½Ðµ Ñ\81е Ð¿Ñ\80оменÑ\8f"
 
-#: builtin/show-branch.c:655
-msgid "show possible merge bases"
-msgstr "извеждане на възможните бази за сливания"
+#: builtin/update-index.c:959
+msgid "clear assumed-unchanged bit"
+msgstr "изчистване на флага, че файлът не се променя"
 
-#: builtin/show-branch.c:657
-msgid "show refs unreachable from any other ref"
-msgstr "извеждане Ð½Ð° Ð½ÐµÐ´Ð¾Ñ\81Ñ\82ижимиÑ\82е Ñ\83казаÑ\82ели"
+#: builtin/update-index.c:962
+msgid "mark files as \"index-only\""
+msgstr "задаване Ð½Ð° Ñ\84лаг, Ñ\87е Ñ\84айловеÑ\82е Ñ\81а Ñ\81амо Ð·Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: builtin/show-branch.c:659
-msgid "show commits in topological order"
-msgstr "извеждане на подаванията в топологическа подредба"
+#: builtin/update-index.c:965
+msgid "clear skip-worktree bit"
+msgstr "изчистване на флага,  че файловете са само за индекса"
 
-#: builtin/show-branch.c:662
-msgid "show only commits not on the first branch"
-msgstr "извеждане Ñ\81амо Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8fÑ\82а, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81а Ð¾Ñ\82 Ð¿Ñ\8aÑ\80виÑ\8f ÐºÐ»Ð¾Ð½"
+#: builtin/update-index.c:968
+msgid "add to index only; do not add content to object database"
+msgstr "добавÑ\8fне Ñ\81амо ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а Ð±ÐµÐ· Ð´Ð¾Ð±Ð°Ð²Ñ\8fне ÐºÑ\8aм Ð±Ð°Ð·Ð°Ñ\82а Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸ Ð·Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
 
-#: builtin/show-branch.c:664
-msgid "show merges reachable from only one tip"
-msgstr "извеждане на сливанията, които могат да се достигнат само от един връх"
+#: builtin/update-index.c:970
+msgid "remove named paths even if present in worktree"
+msgstr "изтриване на указаните пътища, дори и да съществуват в работното дърво"
 
-#: builtin/show-branch.c:666
-msgid "topologically sort, maintaining date order where possible"
+#: builtin/update-index.c:972
+msgid "with --stdin: input lines are terminated by null bytes"
 msgstr ""
-"топологическа подредба, при запазване на подредбата по дата, доколкото е\n"
-"вÑ\8aзможно"
+"при комбиниране с опцията „--stdin“ — входните редове са разделени с нулевия "
+"байÑ\82"
 
-#: builtin/show-branch.c:669
-msgid "<n>[,<base>]"
-msgstr "Ð\91РÐ\9eÐ\99[,Ð\91Ð\90Ð\97Ð\90]"
+#: builtin/update-index.c:974
+msgid "read list of paths to be updated from standard input"
+msgstr "изÑ\87иÑ\82ане Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð¿Ñ\8aÑ\82иÑ\89а Ð·Ð° Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од"
 
-#: builtin/show-branch.c:670
-msgid "show <n> most recent ref-log entries starting at base"
-msgstr "показване Ð½Ð° Ð½Ð°Ð¹-много Ð\91РÐ\9eÐ\99 Ð¶Ñ\83Ñ\80нални Ð·Ð°Ð¿Ð¸Ñ\81а Ñ\81 Ð½Ð°Ñ\87ало Ñ\81Ñ\8aоÑ\82веÑ\82наÑ\82а Ð\91Ð\90Ð\97Ð\90"
+#: builtin/update-index.c:978
+msgid "add entries from standard input to the index"
+msgstr "добавÑ\8fне Ð½Ð° ÐµÐ»ÐµÐ¼ÐµÐ½Ñ\82иÑ\82е Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-# FIXME * -> ...
-#: builtin/show-ref.c:10
-msgid ""
-"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
+#: builtin/update-index.c:982
+msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
-"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
-"hash[=ЧИСЛО]] [--abbrev[=ЧИСЛО]] [--tags] [--heads] [--] [ШАБЛОН…]"
+"възстановяване на състоянието преди сливане или нужда от обновяване за "
+"изброените пътища"
 
-#: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>]"
-msgstr "git show-ref --exclude-existing[=ШАБЛОН]"
+#: builtin/update-index.c:986
+msgid "only update entries that differ from HEAD"
+msgstr "добавяне само на съдържанието, което се различава от това в „HEAD“"
 
-#: builtin/show-ref.c:165
-msgid "only show tags (can be combined with heads)"
-msgstr "извеждане Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е (може Ð´Ð° Ñ\81е ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ\80а Ñ\81 Ð²Ñ\8aÑ\80Ñ\85овеÑ\82е)"
+#: builtin/update-index.c:990
+msgid "ignore files missing from worktree"
+msgstr "игноÑ\80иÑ\80ане Ð½Ð° Ñ\84айловеÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ð»Ð¸Ð¿Ñ\81ваÑ\82 Ð² Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во"
 
-#: builtin/show-ref.c:166
-msgid "only show heads (can be combined with tags)"
-msgstr "извеждане Ð½Ð° Ð²Ñ\8aÑ\80Ñ\85овеÑ\82е (може Ð´Ð° Ñ\81е ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ\80а Ñ\81 ÐµÑ\82икеÑ\82иÑ\82е)"
+#: builtin/update-index.c:993
+msgid "report actions to standard output"
+msgstr "извеждане Ð½Ð° Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8fÑ\82а Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð¸Ð·Ñ\85од"
 
-#: builtin/show-ref.c:167
-msgid "stricter reference checking, requires exact ref path"
-msgstr "строга проверка на указателите, изисква се указател с пълен път"
+#: builtin/update-index.c:995
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr ""
+"забравяне на записаната информация за неразрешени конфликти — за командите "
+"от потребителско ниво"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
-msgid "show the HEAD reference, even if it would be filtered out"
-msgstr "задÑ\8aлжиÑ\82елно Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð¸ Ð½Ð° Ñ\83казаÑ\82елÑ\8f HEAD"
+#: builtin/update-index.c:999
+msgid "write index in this format"
+msgstr "запиÑ\81ване Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а Ð² Ñ\82ози Ñ\84оÑ\80маÑ\82"
 
-#: builtin/show-ref.c:174
-msgid "dereference tags into object IDs"
-msgstr "да Ñ\81е Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ñ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80иÑ\82е Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е-еÑ\82икеÑ\82и"
+#: builtin/update-index.c:1001
+msgid "enable or disable split index"
+msgstr "вклÑ\8eÑ\87ване Ð¸Ð»Ð¸ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ване Ð½Ð° Ñ\80азделÑ\8fнеÑ\82о Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: builtin/show-ref.c:176
-msgid "only show SHA1 hash using <n> digits"
-msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\82ози Ð\91РÐ\9eÐ\99 Ñ\86иÑ\84Ñ\80и Ð¾Ñ\82 Ð²Ñ\81Ñ\8fка Ñ\81Ñ\83ма Ð¿Ð¾ SHA1"
+#: builtin/update-index.c:1003
+msgid "enable/disable untracked cache"
+msgstr "вклÑ\8eÑ\87ване/изклÑ\8eÑ\87ване Ð½Ð° ÐºÐµÑ\88а Ð·Ð° Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове"
 
-#: builtin/show-ref.c:180
-msgid "do not print results to stdout (useful with --verify)"
+#: builtin/update-index.c:1005
+msgid "test if the filesystem supports untracked cache"
+msgstr "проверка дали файловата система поддържа кеш за неследени файлове"
+
+#: builtin/update-index.c:1007
+msgid "enable untracked cache without testing the filesystem"
 msgstr ""
-"без извеждане на резултатите на стандартния вход (полезно с опцията „--"
-"verify“)"
+"включване на кеша за неследените файлове без проверка на файловата система"
 
-#: builtin/show-ref.c:182
-msgid "show refs from stdin that aren't in local repository"
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
 msgstr ""
-"извеждане Ð½Ð° Ñ\83казаÑ\82елиÑ\82е Ð¿Ñ\80иеÑ\82и Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од, ÐºÐ¾Ð¸Ñ\82о Ð»Ð¸Ð¿Ñ\81ваÑ\82 Ð² "
-"локалноÑ\82о Ñ\85Ñ\80анилиÑ\89е"
+"Ð\9dаÑ\81Ñ\82Ñ\80ойкаÑ\82а â\80\9ecore.splitIndexâ\80\9c Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð° Ð½Ð° â\80\9efalseâ\80\9c (лÑ\8aжа).  Ð¡Ð¼ÐµÐ½ÐµÑ\82е Ñ\8f Ð¸Ð»Ð¸ Ñ\8f "
+"изÑ\82Ñ\80ийÑ\82е, Ð·Ð° Ð´Ð° Ð²ÐºÐ»Ñ\8eÑ\87иÑ\82е Ñ\80азделÑ\8fнеÑ\82о Ð½Ð° Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: builtin/stripspace.c:17
-msgid "git stripspace [-s | --strip-comments]"
-msgstr "git stripspace [-s | --strip-comments]"
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"Настройката „core.splitIndex“ е зададена на „true“ (истина).  Сменете я или "
+"я изтрийте, за да изключите разделянето на индекса."
 
-#: builtin/stripspace.c:18
-msgid "git stripspace [-c | --comment-lines]"
-msgstr "git stripspace [-c | --comment-lines]"
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"Настройката „core.untrackedCache“ е зададена на „true“ (истина).  Сменете я "
+"или я изтрийте, за да изключите кеша за неследените файлове"
 
-#: builtin/stripspace.c:35
-msgid "skip and remove all lines starting with comment character"
-msgstr "пÑ\80опÑ\83Ñ\81кане Ð½Ð° Ð²Ñ\81иÑ\87ки Ñ\80едове, ÐºÐ¾Ð¸Ñ\82о Ð·Ð°Ð¿Ð¾Ñ\87ваÑ\82 Ñ\81 â\80\9e\80\9c"
+#: builtin/update-index.c:1131
+msgid "Untracked cache disabled"
+msgstr "Ð\9aеÑ\88Ñ\8aÑ\82 Ð·Ð° Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове Ðµ Ð¸Ð·ÐºÐ»Ñ\8eÑ\87ен"
 
-#: builtin/stripspace.c:38
-msgid "prepend comment character and space to each line"
-msgstr "добавяне на „# “ в началото на всеки ред"
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"Настройката „core.untrackedCache“ е зададена на „false“ (лъжа).  Сменете я "
+"или я изтрийте, за да включите кеша за неследените файлове"
 
-#: builtin/submodule--helper.c:24
+#: builtin/update-index.c:1143
 #, c-format
-msgid "No such ref: %s"
-msgstr "ТакÑ\8aв Ñ\83казаÑ\82ел Ð½Ñ\8fма: %s"
+msgid "Untracked cache enabled for '%s'"
+msgstr "Ð\9aеÑ\88Ñ\8aÑ\82 Ð·Ð° Ð½ÐµÑ\81ледениÑ\82е Ñ\84айлове Ðµ Ð²ÐºÐ»Ñ\8eÑ\87ен Ð·Ð° â\80\9e%sâ\80\9c"
 
-#: builtin/submodule--helper.c:31
-#, c-format
-msgid "Expecting a full ref name, got %s"
-msgstr "Очаква се пълно име на указател, а не „%s“"
+#: builtin/update-ref.c:9
+msgid "git update-ref [<options>] -d <refname> [<old-val>]"
+msgstr "git update-ref [ОПЦИЯ…] -d ИМЕ_НА_УКАЗАТЕЛ [СТАРА_СТОЙНОСТ]"
 
-#: builtin/submodule--helper.c:71
-#, c-format
-msgid "cannot strip one component off url '%s'"
-msgstr "не може да се махне компонент от адреса „%s“"
+#: builtin/update-ref.c:10
+msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+msgstr "git update-ref [ОПЦИЯ…] ИМЕ_НА_УКАЗАТЕЛ НОВА_СТОЙНОСТ [СТАРА_СТОЙНОСТ]"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:405
-#: builtin/submodule--helper.c:486
-msgid "alternative anchor for relative paths"
-msgstr "директория за определянето на относителните пътища"
+#: builtin/update-ref.c:11
+msgid "git update-ref [<options>] --stdin [-z]"
+msgstr "git update-ref [ОПЦИЯ…] --stdin [-z]"
 
-#: builtin/submodule--helper.c:283
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
-msgstr "git submodule--helper list [--prefix=ПЪТ] [ПЪТ…]"
+#: builtin/update-ref.c:363
+msgid "delete the reference"
+msgstr "изтриване на указателя"
 
-#: builtin/submodule--helper.c:326 builtin/submodule--helper.c:340
-#, c-format
-msgid "No url found for submodule path '%s' in .gitmodules"
-msgstr "Във файла „.gitmodules“ не е открит адрес за пътя към подмодул „%s“"
+#: builtin/update-ref.c:365
+msgid "update <refname> not the one it points to"
+msgstr "обновяване на ИМЕто_НА_УКАЗАТЕЛя, а не това, към което сочи"
 
-#: builtin/submodule--helper.c:366
-#, c-format
-msgid "Failed to register url for submodule path '%s'"
-msgstr "Неуспешно регистриране на адрес за пътя към подмодул „%s“"
+#: builtin/update-ref.c:366
+msgid "stdin has NUL-terminated arguments"
+msgstr ""
+"някои от елементите подадени на стандартния вход завършват с нулевия знак "
+"„NUL“"
 
-#: builtin/submodule--helper.c:370
-#, c-format
-msgid "Submodule '%s' (%s) registered for path '%s'\n"
-msgstr "Регистриран е подмодул „%s“ (%s) за пътя към подмодул „%s“\n"
+#: builtin/update-ref.c:367
+msgid "read updates from stdin"
+msgstr "изчитане на указателите от стандартния вход"
 
-#: builtin/submodule--helper.c:380
-#, c-format
-msgid "warning: command update mode suggested for submodule '%s'\n"
-msgstr "ПРЕДУПРЕЖДЕНИЕ: препоръчва се режим на обновяване за подмодула „%s“\n"
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr "git update-server-info [--force]"
 
-#: builtin/submodule--helper.c:387
-#, c-format
-msgid "Failed to register update mode for submodule path '%s'"
-msgstr ""
-"Неуспешно регистриране на режима на обновяване за пътя към подмодул „%s“"
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr "обновяване на информационните файлове от нулата"
 
-#: builtin/submodule--helper.c:406
-msgid "Suppress output for initializing a submodule"
-msgstr "Без извеждане на информация при инициализирането на подмодул"
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v | --verbose] <commit>..."
+msgstr "git verify-tag [-v | --verbose] ПОДАВАНЕ…"
+
+#: builtin/verify-commit.c:72
+msgid "print commit contents"
+msgstr "извеждане на съдържанието на подаването"
+
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
+msgid "print raw gpg status output"
+msgstr "извеждане на необработения изход от състоянието на „gpg“"
+
+#: builtin/verify-pack.c:54
+msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] ПАКЕТ…"
+
+#: builtin/verify-pack.c:64
+msgid "verbose"
+msgstr "извеждане на подробна информация"
 
-#: builtin/submodule--helper.c:411
-msgid "git submodule--helper init [<path>]"
-msgstr "git submodule--helper name [ПЪТ]"
+#: builtin/verify-pack.c:66
+msgid "show statistics only"
+msgstr "извеждане само на статистиката"
 
-#: builtin/submodule--helper.c:432
-msgid "git submodule--helper name <path>"
-msgstr "git submodule--helper name ПЪТ"
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=ФОРМАТ] ЕТИКЕТ…"
 
-#: builtin/submodule--helper.c:438
-#, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
-msgstr "Във файла „.gitmodules“ липсва информация за пътя „%s“"
+#: builtin/verify-tag.c:36
+msgid "print tag contents"
+msgstr "извеждане на съдържанието на ЕТИКЕТи"
 
-#: builtin/submodule--helper.c:489
-msgid "where the new submodule will be cloned to"
-msgstr "къде да се клонира новият подмодул"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [ОПЦИЯ…] ПЪТ [КЛОН]"
 
-#: builtin/submodule--helper.c:492
-msgid "name of the new submodule"
-msgstr "име на новия подмодул"
+#: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [ОПЦИЯ…]"
 
-#: builtin/submodule--helper.c:495
-msgid "url where to clone the submodule from"
-msgstr "адрес, от който да се клонира новият подмодул"
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [ОПЦИЯ…] [ПЪТ]"
 
-#: builtin/submodule--helper.c:501
-msgid "depth for shallow clones"
-msgstr "дълбочина на плитките хранилища"
+#: builtin/worktree.c:18
+msgid "git worktree prune [<options>]"
+msgstr "git worktree prune [ОПЦИЯ…]"
 
-#: builtin/submodule--helper.c:507
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
-msgstr ""
-"git submodule--helper clone [--prefix=ПЪТ] [--quiet] [--reference ХРАНИЛИЩЕ] "
-"[--name ИМЕ] [--depth ДЪЛБОЧИНА] --url АДРЕС --path ПЪТ…"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock [ПЪТ]"
 
-#: builtin/submodule--helper.c:532 builtin/submodule--helper.c:538
+#: builtin/worktree.c:43
 #, c-format
-msgid "could not create directory '%s'"
-msgstr "Ð\94иÑ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздадена"
+msgid "Removing worktrees/%s: not a valid directory"
+msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° â\80\9eworktrees/%sâ\80\9c: Ð½Ðµ Ðµ Ð¿Ñ\80авилна Ð¿Ð¾Ð´Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f"
 
-#: builtin/submodule--helper.c:534
+#: builtin/worktree.c:49
 #, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но ÐºÐ»Ð¾Ð½Ð¸Ñ\80ане Ð½Ð° Ð°Ð´Ñ\80еÑ\81а â\80\9e%sâ\80\9c Ð² Ð¿Ñ\8aÑ\82Ñ\8f â\80\9e%sâ\80\9c ÐºÐ°Ñ\82о Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л"
+msgid "Removing worktrees/%s: gitdir file does not exist"
+msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° â\80\9eworktrees/%sâ\80\9c: Ñ\84айлÑ\8aÑ\82 â\80\9egitdirâ\80\9c Ð½Ðµ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва"
 
-#: builtin/submodule--helper.c:550
+#: builtin/worktree.c:54
 #, c-format
-msgid "cannot open file '%s'"
-msgstr "файлът „%s“ не може да бъде отворен"
+msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
+msgstr ""
+"Изтриване на „worktrees/%s“: файлът „gitdir“ (%s) не може да бъде прочетен"
 
-#: builtin/submodule--helper.c:555
+#: builtin/worktree.c:65
 #, c-format
-msgid "could not close file %s"
-msgstr "файлът „%s“ не може да се затвори"
+msgid "Removing worktrees/%s: invalid gitdir file"
+msgstr "Изтриване на „worktrees/%s“: неправилен файл „gitdir“"
 
-#: builtin/submodule--helper.c:562
+#: builtin/worktree.c:81
 #, c-format
-msgid "could not get submodule directory for '%s'"
-msgstr "директорията на подмодула „%s“ не може да бъде получена"
+msgid "Removing worktrees/%s: gitdir file points to non-existent location"
+msgstr ""
+"Изтриване на „worktrees/%s“: файлът „gitdir“ сочи несъществуващо "
+"местоположение"
 
-#: builtin/submodule--helper.c:609
-#, c-format
-msgid "Submodule path '%s' not initialized"
-msgstr "Пътят на подмодула „%s“ не е инициализиран"
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "докладване на окастрените работни дървета"
 
-#: builtin/submodule--helper.c:613
-msgid "Maybe you want to use 'update --init'?"
-msgstr "Ð\92еÑ\80оÑ\8fÑ\82но Ð¸Ñ\81каÑ\85Ñ\82е Ð´Ð° Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82е â\80\9eupdate --initâ\80\9c?"
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "обÑ\8fвÑ\8fване Ð½Ð° Ñ\80абоÑ\82ниÑ\82е ÐºÐ¾Ð¿Ð¸Ñ\8f Ð¿Ð¾-Ñ\81Ñ\82аÑ\80и Ð¾Ñ\82 Ñ\82ова Ð\92РÐ\95Ð\9cÐ\95 Ð·Ð° Ð¾Ñ\81Ñ\82аÑ\80ели"
 
-#: builtin/submodule--helper.c:639
+#: builtin/worktree.c:204
 #, c-format
-msgid "Skipping unmerged submodule %s"
-msgstr "Прескачане на неслетия подмодул „%s“"
+msgid "'%s' already exists"
+msgstr "„%s“ вече съществува"
 
-#: builtin/submodule--helper.c:660
+#: builtin/worktree.c:235
 #, c-format
-msgid "Skipping submodule '%s'"
-msgstr "Прескачане на подмодула „%s“"
-
-#: builtin/submodule--helper.c:768
-msgid "path into the working tree"
-msgstr "път към работното дърво"
+msgid "could not create directory of '%s'"
+msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/submodule--helper.c:771
-msgid "path into the working tree, across nested submodule boundaries"
-msgstr "път към работното дърво, през границите на вложените подмодули"
+#: builtin/worktree.c:274
+#, c-format
+msgid "Preparing %s (identifier %s)"
+msgstr "Подготвяне на %s (идентификатор %s)"
 
-#: builtin/submodule--helper.c:775
-msgid "rebase, merge, checkout or none"
-msgstr ""
-"„rebase“ (пребазиране), „merge“ (сливане), „checkout“ (изтегляне) или "
-"„none“ (нищо да не се прави)"
+#: builtin/worktree.c:328
+msgid "checkout <branch> even if already checked out in other worktree"
+msgstr "Изтегляне КЛОНа, дори и да е изтеглен в друго работно дърво"
 
-#: builtin/submodule--helper.c:779
-msgid "Create a shallow clone truncated to the specified number of revisions"
-msgstr "Плитко клониране, ограничено до указания брой версии"
+#: builtin/worktree.c:330
+msgid "create a new branch"
+msgstr "създаване на нов клон"
 
-#: builtin/submodule--helper.c:782
-msgid "parallel jobs"
-msgstr "брой паралелни процеси"
+#: builtin/worktree.c:332
+msgid "create or reset a branch"
+msgstr "създаване или зануляване на клони"
 
-#: builtin/submodule--helper.c:783
-msgid "don't print cloning progress"
-msgstr "без Ð¸Ð·Ð²ÐµÐ¶Ð´Ð°Ð½Ðµ Ð½Ð° Ð½Ð°Ð¿Ñ\80едÑ\8aка Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\80анеÑ\82о"
+#: builtin/worktree.c:334
+msgid "populate the new working tree"
+msgstr "подгоÑ\82вÑ\8fне Ð½Ð° Ð½Ð¾Ð²Ð¾Ñ\82о Ñ\80абоÑ\82но Ð´Ñ\8aÑ\80во"
 
-#: builtin/submodule--helper.c:788
-msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
-msgstr "git submodule--helper update_clone [--prefix=ПЪТ] [ПЪТ…]"
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr "новото работно дърво да остане заключено"
 
-#: builtin/submodule--helper.c:798
-msgid "bad value for update parameter"
-msgstr "непÑ\80авилен Ð¿Ð°Ñ\80амеÑ\82Ñ\8aÑ\80 ÐºÑ\8aм Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--updateâ\80\9c"
+#: builtin/worktree.c:343
+msgid "-b, -B, and --detach are mutually exclusive"
+msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e-bâ\80\9c, â\80\9e-Bâ\80\9c Ð¸ â\80\9e--detachâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими ÐµÐ´Ð½Ð° Ñ\81 Ð´Ñ\80Ñ\83га"
 
-#: builtin/submodule--helper.c:855
-msgid "submodule--helper subcommand must be called with a subcommand"
-msgstr "„submodule--helper“ трябва да се стартира с подкоманда"
+#: builtin/worktree.c:478
+msgid "reason for locking"
+msgstr "причина за заключване"
 
-#: builtin/submodule--helper.c:862
+#: builtin/worktree.c:490 builtin/worktree.c:523
 #, c-format
-msgid "'%s' is not a valid submodule--helper subcommand"
-msgstr "„%s“ не е подкоманда на „submodule--helper“"
-
-#: builtin/symbolic-ref.c:7
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
-msgstr "git symbolic-ref [ОПЦИЯ…] ИМЕ [УКАЗАТЕЛ]"
+msgid "'%s' is not a working tree"
+msgstr "„%s“ не е работно дърво"
 
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref -d [-q] <name>"
-msgstr "git symbolic-ref -d [-q] ИМЕ"
+#: builtin/worktree.c:492 builtin/worktree.c:525
+msgid "The main working tree cannot be locked or unlocked"
+msgstr "Основното дърво не може да се отключи или заключи"
 
-#: builtin/symbolic-ref.c:40
-msgid "suppress error message for non-symbolic (detached) refs"
-msgstr "без извеждане на грешка за несвързани (несимволни) указатели"
+#: builtin/worktree.c:497
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr "„%s“ вече е заключено, защото „%s“"
 
-#: builtin/symbolic-ref.c:41
-msgid "delete symbolic ref"
-msgstr "изтриване на символен указател"
+#: builtin/worktree.c:499
+#, c-format
+msgid "'%s' is already locked"
+msgstr "„%s“ вече е заключено"
 
-#: builtin/symbolic-ref.c:42
-msgid "shorten ref output"
-msgstr "кратка информация за указателя"
+#: builtin/worktree.c:527
+#, c-format
+msgid "'%s' is not locked"
+msgstr "„%s“ не е заключено"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason"
-msgstr "причина"
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=ПРЕФИКС/]"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason of the update"
-msgstr "пÑ\80иÑ\87ина Ð·Ð° Ð¾Ð±Ð½Ð¾Ð²Ñ\8fванеÑ\82о"
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr "Ð\9fРÐ\95ФÐ\98Ð\9aС/"
 
-#: builtin/tag.c:23
-msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
-"[<head>]"
-msgstr ""
-"git tag [-a | -s | -u ИДЕНТИФИКАТОР_НА_КЛЮЧ] [-f] [-m СЪОБЩЕНИЕ | -F ФАЙЛ] "
-"ЕТИКЕТ [ВРЪХ]"
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr "запис на обект-дърво за поддиректорията започваща с тази ПРЕФИКС"
 
-#: builtin/tag.c:24
-msgid "git tag -d <tagname>..."
-msgstr "git tag -d ЕТИКЕТ…"
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr "само за изчистване на грешки"
 
-# FIXME tabulator
-#: builtin/tag.c:25
-msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
-msgstr ""
-"git tag -l [-nБРОЙ] [--contains ПОДАВАНЕ] [--points-at ОБЕКТ]\n"
-"           [--format=ФОРМАТ] [--[no-]merged [ПОДАВАНЕ]] [ШАБЛОН…]"
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-repack [ОПЦИЯ…] ДИРЕКТОРИЯ"
 
-#: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v ЕТИКЕТ…"
+#: upload-pack.c:1040
+msgid "quit after a single request/response exchange"
+msgstr "изход след първоначалната размяна на заявка и отговор"
 
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "името на етикета е твърде дълго: „%.*s“…"
+#: upload-pack.c:1042
+msgid "exit immediately after initial ref advertisement"
+msgstr "изход след първоначалната обява на указатели"
 
-#: builtin/tag.c:86
-#, c-format
-msgid "tag '%s' not found."
-msgstr "етикетът „%s“ не е открит."
+#: upload-pack.c:1044
+msgid "do not try <directory>/.git/ if <directory> is no Git directory"
+msgstr ""
+"да не се търси „ДИРЕКТОРИЯ/.git/“, ако ДИРЕКТОРИЯта не е под контрола на Git"
 
-#: builtin/tag.c:101
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
-msgstr "Изтрит е етикетът „%s“ (бе „%s“)\n"
+#: upload-pack.c:1046
+msgid "interrupt transfer after <n> seconds of inactivity"
+msgstr "трансферът да се преустанови след този БРОЙ секунди"
 
-#: builtin/tag.c:117
+#: credential-cache--daemon.c:223
 #, c-format
 msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
 "\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
+"\tchmod 0700 %s"
 msgstr ""
+"Правата за достъп до директорията за програмните гнезда са прекалено "
+"свободни —\n"
+"другите потребители могат да получат достъп до кешираните ви пароли.  За да\n"
+"коригирате това, изпълнете:\n"
 "\n"
-"Въведете съобщение за етикета.\n"
-"  %s\n"
-"Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
+"    chmod 0700 %s"
 
-#: builtin/tag.c:121
-#, c-format
+#: credential-cache--daemon.c:271
+msgid "print debugging messages to stderr"
+msgstr "извеждане на съобщенията за трасиране на стандартната грешка"
+
+#: git.c:14
 msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be kept; you may remove them yourself if you "
-"want to.\n"
+"'git help -a' and 'git help -g' list available subcommands and some\n"
+"concept guides. See 'git help <command>' or 'git help <concept>'\n"
+"to read about a specific subcommand or concept."
 msgstr ""
+"„git help -a“ извежда наличните подкоманди, а „git help -g“ извежда "
+"наличните\n"
+"ръководства.  За помощ за специфична КОМАНДА ползвайте „git help КОМАНДА“, а "
+"за\n"
+"някое определено ПОНЯТИЕ използвайте „git help ПОНЯТИЕ“.\n"
 "\n"
-"Въведете съобщение за етикет.\n"
-"  %s\n"
-"Редовете, които започват с „%c“, също ще бъдат включени — може да ги "
-"изтриете вие.\n"
-
-#: builtin/tag.c:199
-msgid "unable to sign the tag"
-msgstr "етикетът не може да бъде подписан"
-
-#: builtin/tag.c:201
-msgid "unable to write tag file"
-msgstr "файлът за етикета не може да бъде запазен"
-
-#: builtin/tag.c:226
-msgid "bad object type."
-msgstr "неправилен вид обект."
-
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "заглавната част на етикета е прекалено дълга."
-
-# FIXME - why the ? - either we need to specify or not or it is good to specify
-#: builtin/tag.c:275
-msgid "no tag message?"
-msgstr "липсва съобщение за етикета"
+"Български превод на книгата „Pro Git“ от Чакън и Страуб:\n"
+"http://i-can.eu/progit2-bg/progit.html"
 
-#: builtin/tag.c:281
+#: http.c:336
 #, c-format
-msgid "The tag message has been left in %s\n"
-msgstr "Съобщението за етикета е запазено във файла „%s“\n"
-
-#: builtin/tag.c:339
-msgid "list tag names"
-msgstr "извеждане на имената на етикетите"
-
-#: builtin/tag.c:341
-msgid "print <n> lines of each tag message"
-msgstr "извеждане на този БРОЙ редове от всяко съобщение за етикет"
-
-#: builtin/tag.c:343
-msgid "delete tags"
-msgstr "изтриване на етикети"
-
-#: builtin/tag.c:344
-msgid "verify tags"
-msgstr "проверка на етикети"
-
-#: builtin/tag.c:346
-msgid "Tag creation options"
-msgstr "Опции при създаването на етикети"
-
-#: builtin/tag.c:348
-msgid "annotated tag, needs a message"
-msgstr "анотирането на етикети изисква съобщение"
-
-#: builtin/tag.c:350
-msgid "tag message"
-msgstr "СЪОБЩЕНИЕ за етикет"
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr ""
+"отрицателна стойност за „http.postbuffer“. Ще се ползва стандартната: %d"
 
-#: builtin/tag.c:352
-msgid "annotated and GPG-signed tag"
-msgstr "аноÑ\82иÑ\80ан ÐµÑ\82икеÑ\82 Ñ\81 Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81 Ð¿Ð¾ GPG"
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "УпÑ\80авлениеÑ\82о Ð½Ð° Ð´ÐµÐ»ÐµÐ³Ð¸Ñ\80анеÑ\82о Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð¾Ñ\82 cURL < 7.22.0"
 
-#: builtin/tag.c:356
-msgid "use another key to sign the tag"
-msgstr "използване Ð½Ð° Ð´Ñ\80Ñ\83г ÐºÐ»Ñ\8eÑ\87 Ð·Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81ванеÑ\82о Ð½Ð° ÐµÑ\82икеÑ\82"
+#: http.c:366
+msgid "Public key pinning not supported with cURL < 7.44.0"
+msgstr "Ð\97адаванеÑ\82о Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оÑ\8fнен Ð¿Ñ\83блиÑ\87ен ÐºÐ»Ñ\8eÑ\87 Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð¾Ñ\82 cURL < 7.44.0"
 
-#: builtin/tag.c:357
-msgid "replace the tag if exists"
-msgstr "замяна на етикета, ако съществува"
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"базовият адрес не може да се обнови след пренасочване:\n"
+"    ● заявен адрес: %s\n"
+"    ● пренасочване: %s"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
-msgid "create a reflog"
-msgstr "създаване на журнал на указателите"
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "пренасочване към „%s“"
 
-#: builtin/tag.c:360
-msgid "Tag listing options"
-msgstr "Опции за извеждането на етикети"
+#: common-cmds.h:9
+msgid "start a working area (see also: git help tutorial)"
+msgstr "създаване на работно дърво (погледнете: „git help tutorial“)"
 
-#: builtin/tag.c:361
-msgid "show tag list in columns"
-msgstr "извеждане на списъка на етикетите по колони"
+#: common-cmds.h:10
+msgid "work on the current change (see also: git help everyday)"
+msgstr "работа по текущата промяна (погледнете: „git help everyday“)"
 
-#: builtin/tag.c:362 builtin/tag.c:363
-msgid "print only tags that contain the commit"
-msgstr "извеждане Ñ\81амо Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ\82о"
+#: common-cmds.h:11
+msgid "examine the history and state (see also: git help revisions)"
+msgstr "пÑ\80еглед Ð½Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð¸ Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о (погледнеÑ\82е: â\80\9egit help revisionsâ\80\9c)"
 
-#: builtin/tag.c:364
-msgid "print only tags that are merged"
-msgstr "извеждане само на слетите етикети"
+#: common-cmds.h:12
+msgid "grow, mark and tweak your common history"
+msgstr "увеличаване, отбелязване и промяна на общата история"
 
-#: builtin/tag.c:365
-msgid "print only tags that are not merged"
-msgstr "извеждане само на неслетите етикети"
+#: common-cmds.h:13
+msgid "collaborate (see also: git help workflows)"
+msgstr "съвместна работа (погледнете: „git help workflows“)"
 
-#: builtin/tag.c:370
-msgid "print only tags of the object"
-msgstr "извеждане Ñ\81амо Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е Ð½Ð° Ð\9eÐ\91Ð\95Ð\9aТÐ\90"
+#: common-cmds.h:17
+msgid "Add file contents to the index"
+msgstr "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° Ñ\84айла ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: builtin/tag.c:399
-msgid "--column and -n are incompatible"
-msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--columnâ\80\9c Ð¸ â\80\9e-nâ\80\9c Ñ\81а Ð½ÐµÑ\81Ñ\8aвмеÑ\81Ñ\82ими"
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
+msgstr "Ð\94воиÑ\87но Ñ\82Ñ\8aÑ\80Ñ\81ене Ð½Ð° Ð¿Ñ\80омÑ\8fнаÑ\82а, ÐºÐ¾Ñ\8fÑ\82о Ðµ Ð¿Ñ\80иÑ\87инила Ð³Ñ\80еÑ\88ка"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e-nâ\80\9c Ð¸Ð·Ð¸Ñ\81ква Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-lâ\80\9c."
+#: common-cmds.h:19
+msgid "List, create, or delete branches"
+msgstr "Ð\98звеждане, Ñ\81Ñ\8aздаване, Ð¸Ð·Ñ\82Ñ\80иване Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "Опцията „-contains“ изисква опцията „-l“."
+#: common-cmds.h:20
+msgid "Switch branches or restore working tree files"
+msgstr ""
+"Преминаване към друг клон или възстановяване на файловете в работното дърво"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "Ð\9eпÑ\86иÑ\8fÑ\82а â\80\9e-points-atâ\80\9c Ð¸Ð·Ð¸Ñ\81ква Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-lâ\80\9c."
+#: common-cmds.h:21
+msgid "Clone a repository into a new directory"
+msgstr "Ð\9aлониÑ\80ане Ð½Ð° Ñ\85Ñ\80анилиÑ\89е Ð² Ð½Ð¾Ð²Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f"
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "Ð\9eпÑ\86ииÑ\82е â\80\9e--mergedâ\80\9c Ð¸ â\80\9e--no-mergedâ\80\9c Ð¸Ð·Ð¸Ñ\81кваÑ\82 Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-lâ\80\9c."
+#: common-cmds.h:22
+msgid "Record changes to the repository"
+msgstr "Ð\9fодаване Ð½Ð° Ð¿Ñ\80омени Ð² Ñ\85Ñ\80анилиÑ\89еÑ\82о"
 
-# FIXME message pattern
-#: builtin/tag.c:433
-msgid "only one -F or -m option is allowed."
-msgstr "Опциите „-F“ и „-m“ са несъвместими."
+#: common-cmds.h:23
+msgid "Show changes between commits, commit and working tree, etc"
+msgstr "Извеждане на разликите между подаванията, версиите, работното дърво"
 
-#: builtin/tag.c:452
-msgid "too many params"
-msgstr "Ð\9fÑ\80екалено Ð¼Ð½Ð¾Ð³Ð¾ Ð°Ñ\80гÑ\83менÑ\82и"
+#: common-cmds.h:24
+msgid "Download objects and refs from another repository"
+msgstr "Ð\98зÑ\82еглÑ\8fне Ð½Ð° Ð¾Ð±ÐµÐºÑ\82и Ð¸ Ñ\83казаÑ\82ели Ð¾Ñ\82 Ð´Ñ\80Ñ\83го Ñ\85Ñ\80анилиÑ\89е"
 
-#: builtin/tag.c:458
-#, c-format
-msgid "'%s' is not a valid tag name."
-msgstr "„%s“ е неправилно име за етикет."
+#: common-cmds.h:25
+msgid "Print lines matching a pattern"
+msgstr "Извеждане на редовете напасващи на шаблон"
 
-#: builtin/tag.c:463
-#, c-format
-msgid "tag '%s' already exists"
-msgstr "етикетът „%s“ вече съществува"
+#: common-cmds.h:26
+msgid "Create an empty Git repository or reinitialize an existing one"
+msgstr "Създаване на празно хранилище на Git или зануляване на съществуващо"
 
-#: builtin/tag.c:491
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
-msgstr "Обновен етикет „%s“ (бе „%s“)\n"
+#: common-cmds.h:27
+msgid "Show commit logs"
+msgstr "Извеждане на журнала с подаванията"
 
-#: builtin/unpack-objects.c:490
-msgid "Unpacking objects"
-msgstr "РазпакеÑ\82иÑ\80ане Ð½Ð° Ð¾Ð±ÐµÐºÑ\82иÑ\82е"
+#: common-cmds.h:28
+msgid "Join two or more development histories together"
+msgstr "Сливане Ð½Ð° Ð´Ð²Ðµ Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ\87е Ð¿Ð¾Ñ\80едиÑ\86и/иÑ\81Ñ\82оÑ\80ии Ð¾Ñ\82 Ð¿Ñ\80омени"
 
-#: builtin/update-index.c:79
-#, c-format
-msgid "failed to create directory %s"
-msgstr "директорията „%s“ не може да бъде създадена"
+#: common-cmds.h:29
+msgid "Move or rename a file, a directory, or a symlink"
+msgstr "Преместване или преименуване на файл, директория или символна връзка"
 
-#: builtin/update-index.c:85
-#, c-format
-msgid "failed to stat %s"
-msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
+#: common-cmds.h:30
+msgid "Fetch from and integrate with another repository or a local branch"
+msgstr "Доставяне и внасяне на промените от друго хранилище или клон"
 
-#: builtin/update-index.c:95
-#, c-format
-msgid "failed to create file %s"
-msgstr "файлът „%s“ не може да бъде създаден"
+#: common-cmds.h:31
+msgid "Update remote refs along with associated objects"
+msgstr "Обновяване на отдалечените указатели и свързаните с тях обекти"
 
-#: builtin/update-index.c:103
-#, c-format
-msgid "failed to delete file %s"
-msgstr "файлът „%s“ не може да бъде изтрит"
+#: common-cmds.h:32
+msgid "Reapply commits on top of another base tip"
+msgstr "Прилагане на подаванията върху друг връх"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
-#, c-format
-msgid "failed to delete directory %s"
-msgstr "директорията „%s“ не може да бъде изтрита"
+#: common-cmds.h:33
+msgid "Reset current HEAD to the specified state"
+msgstr "Привеждане на указателя „HEAD“ към зададеното състояние"
 
-#: builtin/update-index.c:133
-#, c-format
-msgid "Testing mtime in '%s' "
-msgstr "Проверка на времето на промяна (mtime) на файла „%s“"
+#: common-cmds.h:34
+msgid "Remove files from the working tree and from the index"
+msgstr "Изтриване на файлове от работното дърво и индекса"
 
-#: builtin/update-index.c:145
-msgid "directory stat info does not change after adding a new file"
-msgstr ""
-"информацията получена чрез „stat“ за директорията не се променя след "
-"добавянето на нов файл"
+#: common-cmds.h:35
+msgid "Show various types of objects"
+msgstr "Извеждане на различните видове обекти в Git"
 
-#: builtin/update-index.c:158
-msgid "directory stat info does not change after adding a new directory"
-msgstr ""
-"информацията получена чрез „stat“ за директорията не се променя след "
-"добавянето на нова директория"
+#: common-cmds.h:36
+msgid "Show the working tree status"
+msgstr "Извеждане на състоянието на работното дърво"
 
-#: builtin/update-index.c:171
-msgid "directory stat info changes after updating a file"
-msgstr ""
-"информацията получена чрез „stat“ за директорията се променя след "
-"обновяването на нов файл"
+#: common-cmds.h:37
+msgid "Create, list, delete or verify a tag object signed with GPG"
+msgstr "Извеждане, създаване, изтриване, проверка на етикети подписани с GPG"
 
-#: builtin/update-index.c:182
-msgid "directory stat info changes after adding a file inside subdirectory"
-msgstr ""
-"информацията получена чрез „stat“ за директорията се променя след добавянето "
-"на файл в поддиректория"
+#: parse-options.h:145
+msgid "expiry-date"
+msgstr "период на валидност/запазване"
 
-#: builtin/update-index.c:193
-msgid "directory stat info does not change after deleting a file"
-msgstr ""
-"информацията получена чрез „stat“ за директорията не се променя след "
-"изтриването на файл"
+#: parse-options.h:160
+msgid "no-op (backward compatibility)"
+msgstr "нулева операция (за съвместимост с предишни версии)"
 
-#: builtin/update-index.c:206
-msgid "directory stat info does not change after deleting a directory"
-msgstr ""
-"информацията получена чрез „stat“ за директорията не се променя след "
-"изтриването на директория"
+#: parse-options.h:238
+msgid "be more verbose"
+msgstr "повече подробности"
 
-#: builtin/update-index.c:213
-msgid " OK"
-msgstr " Добре"
+#: parse-options.h:240
+msgid "be more quiet"
+msgstr "по-малко подробности"
 
-#: builtin/update-index.c:575
-msgid "git update-index [<options>] [--] [<file>...]"
-msgstr "git update-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
+#: parse-options.h:246
+msgid "use <n> digits to display SHA-1s"
+msgstr "да се показват такъв БРОЙ цифри от сумите по SHA1"
 
-#: builtin/update-index.c:930
-msgid "continue refresh even when index needs update"
+#: rerere.h:40
+msgid "update the index with reused conflict resolution if possible"
 msgstr ""
-"продължаване с обновяването, дори когато индексът трябва да бъде обновен"
-
-#: builtin/update-index.c:933
-msgid "refresh: ignore submodules"
-msgstr "подмодулите да се игнорират при обновяването"
+"при възможност преизползване на решението на конфликта за обновяване на "
+"индекса"
 
-#: builtin/update-index.c:936
-msgid "do not ignore new files"
-msgstr "новиÑ\82е Ñ\84айлове Ð´Ð° Ð½Ðµ Ñ\81е Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80аÑ\82"
+#: git-bisect.sh:54
+msgid "You need to start by \"git bisect start\""
+msgstr "Ð\97апоÑ\87неÑ\82е ÐºÐ°Ñ\82о Ð¸Ð·Ð¿Ñ\8aлниÑ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit bisect startâ\80\9c"
 
-#: builtin/update-index.c:938
-msgid "let files replace directories and vice-versa"
-msgstr "файлове да могат да заменят директории и обратно"
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:60
+msgid "Do you want me to do it for you [Y/n]? "
+msgstr "Да се извърши ли автоматично? „Y“ —  ДА, „n“ — не"
 
-#: builtin/update-index.c:940
-msgid "notice files missing from worktree"
-msgstr "предупреждаване при липсващи в работното дърво файлове"
+#: git-bisect.sh:121
+#, sh-format
+msgid "unrecognised option: '$arg'"
+msgstr "непозната опция „${arg}“"
 
-#: builtin/update-index.c:942
-msgid "refresh even if index contains unmerged entries"
-msgstr "обновяване дори и индексът да съдържа неслети обекти"
+#: git-bisect.sh:125
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
+msgstr "„$arg“ не изглежда като указател към версия"
 
-#: builtin/update-index.c:945
-msgid "refresh stat information"
-msgstr "обновÑ\8fване Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8fÑ\82а Ð¾Ñ\82 Ñ\84Ñ\83нкÑ\86иÑ\8fÑ\82а â\80\9estatâ\80\9c"
+#: git-bisect.sh:154
+msgid "Bad HEAD - I need a HEAD"
+msgstr "ТекÑ\83Ñ\89иÑ\8fÑ\82 Ñ\83казаÑ\82ел â\80\9eHEADâ\80\9c Ðµ Ð½ÐµÐ¿Ñ\80авилен."
 
-#: builtin/update-index.c:949
-msgid "like --refresh, but ignore assume-unchanged setting"
+#: git-bisect.sh:167
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr ""
-"каÑ\82о Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--refreshâ\80\9c, Ð½Ð¾ Ð´Ð° Ñ\81е Ð¿Ñ\80овеÑ\80Ñ\8fÑ\82 Ð¸ Ð¾Ð±ÐµÐºÑ\82иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81а Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80иеÑ\82и "
-"за непроменени"
+"Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80еминаване ÐºÑ\8aм â\80\9e${start_head}â\80\9c.  Ð\98зпÑ\8aлнеÑ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit bisect "
+"reset СЪЩЕСТВУВАЩ_КЛОН“."
 
-#: builtin/update-index.c:953
-msgid "<mode>,<object>,<path>"
-msgstr "РЕЖИМ,ОБЕКТ,ПЪТ"
+#: git-bisect.sh:177
+msgid "won't bisect on cg-seek'ed tree"
+msgstr ""
+"не може да се търси двоично, когато е изпълнена командата „cg-seek“ от "
+"„cogito“"
 
-#: builtin/update-index.c:954
-msgid "add the specified entry to the index"
-msgstr "добавÑ\8fне Ð½Ð° Ð¸Ð·Ð±Ñ\80оениÑ\82е Ð¾Ð±ÐµÐºÑ\82и ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: git-bisect.sh:181
+msgid "Bad HEAD - strange symbolic ref"
+msgstr "Ð\9dепÑ\80авилен Ñ\83казаÑ\82ел â\80\9eHEADâ\80\9c"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: git-bisect.sh:233
+#, sh-format
+msgid "Bad bisect_write argument: $state"
+msgstr "Неправилен аргумент на функцията „bisect_write“: „${state}“"
 
-#: builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "изрично задаване на стойността на флага дали файлът е изпълним"
+#: git-bisect.sh:262
+#, sh-format
+msgid "Bad rev input: $arg"
+msgstr "Неправилна версия: „${arg}“"
 
-#: builtin/update-index.c:963
-msgid "mark files as \"not changing\""
-msgstr "задаване на флаг, че файлът не се променя"
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Неправилна версия: „$bisected_head“"
 
-#: builtin/update-index.c:966
-msgid "clear assumed-unchanged bit"
-msgstr "изчистване на флага, че файлът не се променя"
+#: git-bisect.sh:290
+#, sh-format
+msgid "Bad rev input: $rev"
+msgstr "Неправилна версия: „${rev}“"
 
-#: builtin/update-index.c:969
-msgid "mark files as \"index-only\""
-msgstr "задаване на флаг, че файловете са само за индекса"
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
+msgstr "Командата „git bisect ${TERM_BAD}“ приема само един аргумент."
 
-#: builtin/update-index.c:972
-msgid "clear skip-worktree bit"
-msgstr "изчистване на флага,  че файловете са само за индекса"
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgstr "ПРЕДУПРЕЖДЕНИЕ: двоично търсене само по ${TERM_BAD} подаване."
 
-#: builtin/update-index.c:975
-msgid "add to index only; do not add content to object database"
-msgstr "добавяне само към индекса без добавяне към базата от данни за обектите"
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:328
+msgid "Are you sure [Y/n]? "
+msgstr "Да се продължи ли? „Y“ —  ДА, „n“ — не"
 
-#: builtin/update-index.c:977
-msgid "remove named paths even if present in worktree"
-msgstr "изтриване на указаните пътища, дори и да съществуват в работното дърво"
+#: git-bisect.sh:340
+#, sh-format
+msgid ""
+"You need to give me at least one $bad_syn and one $good_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+msgstr ""
+"Трябва да зададете поне една ${bad_syn} и една ${good_syn} версия.  (Това "
+"може да се\n"
+"направи съответно и чрез командите „git bisect ${bad_syn}“ и „git bisect "
+"${good_syn}“.)"
 
-#: builtin/update-index.c:979
-msgid "with --stdin: input lines are terminated by null bytes"
+#: git-bisect.sh:343
+#, sh-format
+msgid ""
+"You need to start by \"git bisect start\".\n"
+"You then need to give me at least one $good_syn and one $bad_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
 msgstr ""
-"при комбиниране с опцията „--stdin“ — входните редове са разделени с нулевия "
-"байт"
+"Трябва да започнете двоичното търсене чрез командата „git bisect start“.\n"
+"трябва да зададете поне една добра и една лоша версия.  (Това може да се\n"
+"направи съответно и чрез командите „git bisect ${bad_syn}“ и „git bisect "
+"${good_syn}“.)"
 
-#: builtin/update-index.c:981
-msgid "read list of paths to be updated from standard input"
-msgstr "изÑ\87иÑ\82ане Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81 Ð¿Ñ\8aÑ\82иÑ\89а Ð·Ð° Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð²Ñ\85од"
+#: git-bisect.sh:414 git-bisect.sh:546
+msgid "We are not bisecting."
+msgstr "Ð\92 Ð¼Ð¾Ð¼ÐµÐ½Ñ\82а Ð½Ðµ Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ð´Ð²Ð¾Ð¸Ñ\87но Ñ\82Ñ\8aÑ\80Ñ\81ене."
 
-#: builtin/update-index.c:985
-msgid "add entries from standard input to the index"
-msgstr "добавяне на елементите от стандартния вход към индекса"
+#: git-bisect.sh:421
+#, sh-format
+msgid "'$invalid' is not a valid commit"
+msgstr "„${invalid}“ е неправилно подаване"
 
-#: builtin/update-index.c:989
-msgid "repopulate stages #2 and #3 for the listed paths"
+#: git-bisect.sh:430
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
 msgstr ""
-"възстановяване на състоянието преди сливане или нужда от обновяване за "
-"изброените пътища"
-
-#: builtin/update-index.c:993
-msgid "only update entries that differ from HEAD"
-msgstr "добавяне само на съдържанието, което се различава от това в „HEAD“"
-
-#: builtin/update-index.c:997
-msgid "ignore files missing from worktree"
-msgstr "игнориране на файловете, които липсват в работното дърво"
+"Първоначално указаният клон „${branch}“ в указателя „HEAD“ не може да бъде\n"
+"изтеглен.  Пробвайте да изпълните командата „git bisect reset ПОДАВАНЕ“."
 
-#: builtin/update-index.c:1000
-msgid "report actions to standard output"
-msgstr "извеждане Ð½Ð° Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8fÑ\82а Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82ниÑ\8f Ð¸Ð·Ñ\85од"
+#: git-bisect.sh:458
+msgid "No logfile given"
+msgstr "Ð\9dе Ðµ Ð·Ð°Ð´Ð°Ð´ÐµÐ½ Ð¶Ñ\83Ñ\80нален Ñ\84айл"
 
-#: builtin/update-index.c:1002
-msgid "(for porcelains) forget saved unresolved conflicts"
+#: git-bisect.sh:459
+#, sh-format
+msgid "cannot read $file for replaying"
 msgstr ""
-"забÑ\80авÑ\8fне Ð½Ð° Ð·Ð°Ð¿Ð¸Ñ\81анаÑ\82а Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ð½ÐµÑ\80азÑ\80еÑ\88ени ÐºÐ¾Ð½Ñ\84ликÑ\82и â\80\94 Ð·Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸Ñ\82е "
-"оÑ\82 Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81ко Ð½Ð¸во"
+"Ð\96Ñ\83Ñ\80налниÑ\8fÑ\82 Ñ\84айл â\80\9e${file}â\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен, Ð·Ð° Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ñ\8aлнÑ\8fÑ\82 "
+"командиÑ\82е Ð¾Ñ\82 Ð½ÐµÐ³Ð¾ Ð½Ð°Ð½Ð¾во"
 
-#: builtin/update-index.c:1006
-msgid "write index in this format"
-msgstr "записване на индекса в този формат"
+#: git-bisect.sh:480
+msgid "?? what are you talking about?"
+msgstr ""
+"Непозната команда.  Възможните варианти са: „start“, „good“, „bad“, „skip“"
 
-#: builtin/update-index.c:1008
-msgid "enable or disable split index"
-msgstr "включване или изключване на разделянето на индекса"
+#: git-bisect.sh:492
+#, sh-format
+msgid "running $command"
+msgstr "изпълнение на командата „${command}“"
 
-#: builtin/update-index.c:1010
-msgid "enable/disable untracked cache"
-msgstr "включване/изключване на кеша за неследените файлове"
+#: git-bisect.sh:499
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
+msgstr ""
+"неуспешно двоично търсене:\n"
+"изходният код от командата „${command}“ е ${res} — това е извън интервала "
+"[0, 128)"
 
-#: builtin/update-index.c:1012
-msgid "test if the filesystem supports untracked cache"
-msgstr "пÑ\80овеÑ\80ка Ð´Ð°Ð»Ð¸ Ñ\84айловаÑ\82а Ñ\81иÑ\81Ñ\82ема Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа ÐºÐµÑ\88 Ð·Ð° Ð½ÐµÑ\81ледени Ñ\84айлове"
+#: git-bisect.sh:525
+msgid "bisect run cannot continue any more"
+msgstr "двоиÑ\87ноÑ\82о Ñ\82Ñ\8aÑ\80Ñ\81ене Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80одÑ\8aлжи"
 
-#: builtin/update-index.c:1014
-msgid "enable untracked cache without testing the filesystem"
+#: git-bisect.sh:531
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
 msgstr ""
-"включване на кеша за неследените файлове без проверка на файловата система"
+"неуспешно двоично търсене:\n"
+"функцията „bisect_state ${state}“ завърши с код за грешка ${res}"
 
-#: builtin/update-index.c:1134
-msgid "Untracked cache disabled"
-msgstr "Кешът за неследените файлове е изключен"
+#: git-bisect.sh:538
+msgid "bisect run success"
+msgstr "успешно двоично търсене"
 
-#: builtin/update-index.c:1146
-#, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr "Кешът за неследените файлове е изключен за „%s“"
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "използвайте две различни управляващи думи"
 
-#: builtin/update-ref.c:9
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr "git update-ref [ОПЦИЯ…] -d ИМЕ_НА_УКАЗАТЕЛ [СТАРА_СТОЙНОСТ]"
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "„${term}“ не е правилна управляваща дума"
 
-# FIXME spaces - not needed in original
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
-msgstr "git update-ref [ОПЦИЯ…] ИМЕ_НА_УКАЗАТЕЛ НОВА_СТОЙНОСТ [СТАРА_СТОЙНОСТ]"
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr ""
+"„${term}“ е вградена команда и не може да се използва като управляваща дума"
 
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>] --stdin [-z]"
-msgstr "git update-ref [ОПЦИЯ…] --stdin [-z]"
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "не може да смените значението на управляващата дума „${term}“"
 
-#: builtin/update-ref.c:363
-msgid "delete the reference"
-msgstr "изтриване на указателя"
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgstr ""
+"Неправилна команда: в момента се изпълнява двоично търсене по ${TERM_BAD}/"
+"${TERM_GOOD}."
 
-#: builtin/update-ref.c:365
-msgid "update <refname> not the one it points to"
-msgstr "обновÑ\8fване Ð½Ð° Ð\98Ð\9cÐ\95Ñ\82о_Ð\9dÐ\90_УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9bÑ\8f, Ð° Ð½Ðµ Ñ\82ова, ÐºÑ\8aм ÐºÐ¾ÐµÑ\82о Ñ\81оÑ\87и"
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "не Ñ\81а Ñ\83казани Ñ\83пÑ\80авлÑ\8fваÑ\89и Ð´Ñ\83ми"
 
-#: builtin/update-ref.c:366
-msgid "stdin has NUL-terminated arguments"
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
 msgstr ""
-"някои от елементите подадени на стандартния вход завършват с нулевия знак "
-"„NUL“"
+"на „git bisect terms“ е подаден неправилен аргумент „${arg}“\n"
+"Поддържат се опциите „--term-good|--term-old“ и „--term-bad|--term-new“."
 
-#: builtin/update-ref.c:367
-msgid "read updates from stdin"
-msgstr "изчитане на указателите от стандартния вход"
+#: git-merge-octopus.sh:46
+msgid ""
+"Error: Your local changes to the following files would be overwritten by "
+"merge"
+msgstr "Грешка: Сливането ще презапише локалните промени на тези файлове:"
 
-#: builtin/update-server-info.c:6
-msgid "git update-server-info [--force]"
-msgstr "git update-server-info [--force]"
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
+msgstr "Автоматичното сливане не сработи."
 
-#: builtin/update-server-info.c:14
-msgid "update the info files from scratch"
-msgstr "обновÑ\8fване Ð½Ð° Ð¸Ð½Ñ\84оÑ\80маÑ\86ионниÑ\82е Ñ\84айлове Ð¾Ñ\82 Ð½Ñ\83лаÑ\82а"
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
+msgstr "Ð\9dе Ñ\82Ñ\80Ñ\8fбва Ð´Ð° Ñ\81е Ð¿Ñ\80ави Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82вено Ñ\81ливане."
 
-#: builtin/verify-commit.c:17
-msgid "git verify-commit [-v | --verbose] <commit>..."
-msgstr "git verify-tag [-v | --verbose] ПОДАВАНЕ…"
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "Не може да се открие общо подаване с „$pretty_name“"
 
-#: builtin/verify-commit.c:72
-msgid "print commit contents"
-msgstr "извеждане на съдържанието на подаването"
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Вече е обновено до „$pretty_name“"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
-msgid "print raw gpg status output"
-msgstr "извеждане на необработения изход от състоянието на „gpg“"
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "Превъртане до „$pretty_name“"
 
-#: builtin/verify-pack.c:54
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
-msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] ПАКЕТ…"
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr "Опит за просто сливане с „$pretty_name“"
 
-#: builtin/verify-pack.c:64
-msgid "verbose"
-msgstr "извеждане Ð½Ð° Ð¿Ð¾Ð´Ñ\80обна Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f"
+#: git-merge-octopus.sh:102
+msgid "Simple merge did not work, trying automatic merge."
+msgstr "Ð\9fÑ\80оÑ\81Ñ\82оÑ\82о Ñ\81ливане Ð½Ðµ Ñ\81Ñ\80абоÑ\82и, Ð¿Ñ\80обва Ñ\81е Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ñ\81ливане."
 
-#: builtin/verify-pack.c:66
-msgid "show statistics only"
-msgstr "извеждане само на статистиката"
+#: git-rebase.sh:58
+msgid ""
+"When you have resolved this problem, run \"git rebase --continue\".\n"
+"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
+"To check out the original branch and stop rebasing, run \"git rebase --abort"
+"\"."
+msgstr ""
+"След коригирането на този проблем изпълнете „git rebase --continue“.\n"
+"Ако предпочитате да прескочите тази кръпка, изпълнете „git rebase --skip“.\n"
+"За да откажете пребазирането и да се върнете към първоначалното състояние,\n"
+"изпълнете „git rebase --abort“."
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] ЕТИКЕТ…"
+#: git-rebase.sh:158 git-rebase.sh:397
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr "Връщането към „${head_name}“ е невъзможно"
 
-#: builtin/verify-tag.c:34
-msgid "print tag contents"
-msgstr "извеждане на съдържанието на ЕТИКЕТи"
+#: git-rebase.sh:172
+#, sh-format
+msgid "Cannot store $stash_sha1"
+msgstr "„${stash_sha1}“ не може да бъде запазен"
 
-#: builtin/worktree.c:15
-msgid "git worktree add [<options>] <path> [<branch>]"
-msgstr "git worktree add [ОПЦИЯ…] ПЪТ [КЛОН]"
+#: git-rebase.sh:212
+msgid "The pre-rebase hook refused to rebase."
+msgstr "Куката за изпълнение преди пребазиране отхвърли пребазирането."
 
-#: builtin/worktree.c:16
-msgid "git worktree prune [<options>]"
-msgstr "git worktree prune [ОПЦИЯ…]"
+#: git-rebase.sh:217
+msgid "It looks like git-am is in progress. Cannot rebase."
+msgstr ""
+"Изглежда, че сега се прилагат кръпки чрез командата „git-am“.  Не може да "
+"пребазирате в момента."
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
-msgstr "git worktree list [ОПЦИЯ…]"
+#: git-rebase.sh:358
+msgid "No rebase in progress?"
+msgstr "Изглежда в момента не тече пребазиране"
 
-#: builtin/worktree.c:40
-#, c-format
-msgid "Removing worktrees/%s: not a valid directory"
-msgstr "Изтриване на „worktrees/%s“: не е правилна поддиректория"
+#: git-rebase.sh:369
+msgid "The --edit-todo action can only be used during interactive rebase."
+msgstr ""
+"Опцията „--edit-todo“ е достъпна само по време на интерактивно пребазиране."
 
-#: builtin/worktree.c:46
-#, c-format
-msgid "Removing worktrees/%s: gitdir file does not exist"
-msgstr "Изтриване на „worktrees/%s“: файлът „gitdir“ не съществува"
+#: git-rebase.sh:376
+msgid "Cannot read HEAD"
+msgstr "Указателят „HEAD“ не може да бъде прочетен"
 
-#: builtin/worktree.c:51
-#, c-format
-msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
+#: git-rebase.sh:379
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
+msgstr ""
+"Трябва да редактирате всички конфликти при сливането.  След това\n"
+"отбележете коригирането им чрез командата „git add“"
+
+#: git-rebase.sh:419
+#, sh-format
+msgid ""
+"It seems that there is already a $state_dir_base directory, and\n"
+"I wonder if you are in the middle of another rebase.  If that is the\n"
+"case, please try\n"
+"\t$cmd_live_rebase\n"
+"If that is not the case, please\n"
+"\t$cmd_clear_stale_rebase\n"
+"and run me again.  I am stopping in case you still have something\n"
+"valuable there."
 msgstr ""
-"Изтриване на „worktrees/%s“: файлът „gitdir“ (%s) не може да бъде прочетен"
+"Вече съществува директория „${state_dir_base}“.  Възможно ли е да сте\n"
+"в процес на друго пребазиране? Ако това е така, изпълнете:\n"
+"    ${cmd_live_rebase}\n"
+"Ако не сте в процес на друго пребазиране, изпълнете:\n"
+"    ${cmd_clear_stale_rebase}\n"
+"и отново започнете пребазирането.  Текущото пребазиране се преустановява, "
+"за\n"
+"да не загубите случайно промени."
 
-#: builtin/worktree.c:62
-#, c-format
-msgid "Removing worktrees/%s: invalid gitdir file"
-msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° â\80\9eworktrees/%sâ\80\9c: Ð½ÐµÐ¿Ñ\80авилен Ñ\84айл â\80\9egitdir“"
+#: git-rebase.sh:470
+#, sh-format
+msgid "invalid upstream $upstream_name"
+msgstr "непÑ\80авилна Ð¾Ñ\81нова Ð·Ð° Ñ\81Ñ\80авнение â\80\9e${upstream_name}“"
 
-#: builtin/worktree.c:78
-#, c-format
-msgid "Removing worktrees/%s: gitdir file points to non-existent location"
+#: git-rebase.sh:494
+#, sh-format
+msgid "$onto_name: there are more than one merge bases"
 msgstr ""
-"Изтриване на „worktrees/%s“: файлът „gitdir“ сочи несъществуващо "
-"меÑ\81Ñ\82оположение"
+"указателят „${onto_name}“ може да сочи към повече от една основа за "
+"пÑ\80ебазиÑ\80анеÑ\82о"
 
-#: builtin/worktree.c:113
-#, c-format
-msgid "failed to remove '%s'"
-msgstr "директорията „%s“ не може да бъде изтрита"
+#: git-rebase.sh:497 git-rebase.sh:501
+#, sh-format
+msgid "$onto_name: there is no merge base"
+msgstr "указателят „${onto_name}“ не сочи към никаква основа за пребазирането"
 
-#: builtin/worktree.c:202
-#, c-format
-msgid "'%s' already exists"
-msgstr "„%s“ вече съществува"
+#: git-rebase.sh:506
+#, sh-format
+msgid "Does not point to a valid commit: $onto_name"
+msgstr "Указателят „${onto_name}“ не сочи към подаване"
 
-#: builtin/worktree.c:234
-#, c-format
-msgid "could not create directory of '%s'"
-msgstr "диÑ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздадена"
+#: git-rebase.sh:529
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
+msgstr "ФÐ\90ТÐ\90Ð\9bÐ\9dÐ\90 Ð\93РÐ\95ШÐ\9aÐ\90: Ð½Ðµ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва ÐºÐ»Ð¾Ð½ â\80\9e${branch_name}â\80\9c"
 
-#: builtin/worktree.c:270
-#, c-format
-msgid "Preparing %s (identifier %s)"
-msgstr "Подготвяне на %s (идентификатор %s)"
+#: git-rebase.sh:562
+msgid "Cannot autostash"
+msgstr "Не може да се скатае автоматично"
 
-#: builtin/worktree.c:322
-msgid "checkout <branch> even if already checked out in other worktree"
-msgstr "Изтегляне КЛОНа, дори и да е изтеглен в друго работно дърво"
+#: git-rebase.sh:567
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
+msgstr "Автоматично скатано: „${stash_abbrev}“"
 
-#: builtin/worktree.c:324
-msgid "create a new branch"
-msgstr "създаване на нов клон"
+#: git-rebase.sh:571
+msgid "Please commit or stash them."
+msgstr "Промените трябва или да се подадат, или да се скатаят."
 
-#: builtin/worktree.c:326
-msgid "create or reset a branch"
-msgstr "създаване или зануляване на клони"
+#: git-rebase.sh:591
+#, sh-format
+msgid "Current branch $branch_name is up to date."
+msgstr "Текущият клон „${branch_name}“ е напълно актуален."
 
-#: builtin/worktree.c:327
-msgid "detach HEAD at named commit"
-msgstr "отделяне на указателя „HEAD“ към указаното подаване"
+#: git-rebase.sh:595
+#, sh-format
+msgid "Current branch $branch_name is up to date, rebase forced."
+msgstr ""
+"Текущият клон „${branch_name}“ е напълно актуален.  Пребазирането е "
+"принудително."
 
-#: builtin/worktree.c:328
-msgid "populate the new working tree"
-msgstr "подготвяне на новото работно дърво"
+#: git-rebase.sh:606
+#, sh-format
+msgid "Changes from $mb to $onto:"
+msgstr "Промените от „${mb}“ към „${onto}“:"
 
-#: builtin/worktree.c:336
-msgid "-b, -B, and --detach are mutually exclusive"
-msgstr "Опциите „-b“, „-B“ и „--detach“ са несъвместими една с друга"
+#: git-rebase.sh:615
+msgid "First, rewinding head to replay your work on top of it..."
+msgstr ""
+"Първо, указателят „HEAD“ започва да сочи към базата, върху която пребазирате…"
 
-#: builtin/write-tree.c:13
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr "git write-tree [--missing-ok] [--prefix=ПРЕФИКС/]"
+#: git-rebase.sh:625
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
+msgstr "Превъртане на „${branch_name}“ върху „${onto_name}“."
 
-#: builtin/write-tree.c:26
-msgid "<prefix>/"
-msgstr "Ð\9fРÐ\95ФÐ\98Ð\9aС/"
+#: git-stash.sh:53
+msgid "git stash clear with parameters is unimplemented"
+msgstr "Ð\9aомандаÑ\82а â\80\9egit stash clearâ\80\9c Ð½Ðµ Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð°Ñ\80гÑ\83менÑ\82и"
 
-#: builtin/write-tree.c:27
-msgid "write tree object for a subdirectory <prefix>"
-msgstr "запиÑ\81 Ð½Ð° Ð¾Ð±ÐµÐºÑ\82-дÑ\8aÑ\80во Ð·Ð° Ð¿Ð¾Ð´Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8fÑ\82а Ð·Ð°Ð¿Ð¾Ñ\87ваÑ\89а Ñ\81 Ñ\82ази Ð\9fРÐ\95ФÐ\98Ð\9aС"
+#: git-stash.sh:94
+msgid "You do not have the initial commit yet"
+msgstr "Ð\92Ñ\81е Ð¾Ñ\89е Ð»Ð¸Ð¿Ñ\81ва Ð¿Ñ\8aÑ\80вонаÑ\87ално Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
 
-#: builtin/write-tree.c:30
-msgid "only useful for debugging"
-msgstr "само за изчистване на грешки"
+#: git-stash.sh:109
+msgid "Cannot save the current index state"
+msgstr "Състоянието на текущия индекс не може да бъде запазено"
 
-#: credential-cache--daemon.c:271
-msgid "print debugging messages to stderr"
-msgstr "извеждане Ð½Ð° Ñ\81Ñ\8aобÑ\89ениÑ\8fÑ\82а Ð·Ð° Ñ\82Ñ\80аÑ\81иÑ\80ане Ð½Ð° Ñ\81Ñ\82андаÑ\80Ñ\82наÑ\82а Ð³Ñ\80еÑ\88ка"
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "Ð\9dеÑ\81ледениÑ\82е Ñ\84айлове Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ñ\81е Ð·Ð°Ð¿Ð°Ð·Ñ\8fÑ\82"
 
-#: git.c:14
-msgid ""
-"'git help -a' and 'git help -g' list available subcommands and some\n"
-"concept guides. See 'git help <command>' or 'git help <concept>'\n"
-"to read about a specific subcommand or concept."
-msgstr ""
-"„git help -a“ извежда наличните подкоманди, а „git help -g“ извежда "
-"наличните\n"
-"ръководства. За помощ за специфична КОМАНДА ползвайте „git help КОМАНДА“, а "
-"за\n"
-"някое определено ПОНЯТИЕ използвайте „git help ПОНЯТИЕ“."
+#: git-stash.sh:144 git-stash.sh:157
+msgid "Cannot save the current worktree state"
+msgstr "Състоянието на работното дърво не може да бъде запазено"
 
-#: http.c:322
-msgid "Public key pinning not supported with cURL < 7.44.0"
-msgstr "Ð\97адаванеÑ\82о Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82оÑ\8fнен Ð¿Ñ\83блиÑ\87ен ÐºÐ»Ñ\8eÑ\87 Ð½Ðµ Ñ\81е Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð¾Ñ\82 cURL < 7.44.0"
+#: git-stash.sh:161
+msgid "No changes selected"
+msgstr "Ð\9dе Ñ\81а Ð¸Ð·Ð±Ñ\80ани Ð½Ð¸ÐºÐ°ÐºÐ²Ð¸ Ð¿Ñ\80омени"
 
-#: common-cmds.h:9
-msgid "start a working area (see also: git help tutorial)"
-msgstr "създаване на работно дърво (погледнете: „git help tutorial“)"
+#: git-stash.sh:164
+msgid "Cannot remove temporary index (can't happen)"
+msgstr "Временният индекс не може да бъде изтрит"
 
-#: common-cmds.h:10
-msgid "work on the current change (see also: git help everyday)"
-msgstr "работа по текущата промяна (погледнете: „git help everyday“)"
+#: git-stash.sh:177
+msgid "Cannot record working tree state"
+msgstr "Състоянието на работното дърво не може да бъде запазено"
 
-#: common-cmds.h:11
-msgid "examine the history and state (see also: git help revisions)"
-msgstr "преглед на историята и състоянието (погледнете: „git help revisions“)"
+#: git-stash.sh:209
+#, sh-format
+msgid "Cannot update $ref_stash with $w_commit"
+msgstr ""
+"Указателят „${ref_stash}“ не може да бъде обновен да сочи към „${w_commit}“"
 
-#: common-cmds.h:12
-msgid "grow, mark and tweak your common history"
-msgstr "увеличаване, отбелязване и промяна на общата история"
+#. TRANSLATORS: $option is an invalid option, like
+#. `--blah-blah'. The 7 spaces at the beginning of the
+#. second line correspond to "error: ". So you should line
+#. up the second line with however many characters the
+#. translation of "error: " takes in your language. E.g. in
+#. English this is:
+#.
+#. $ git stash save --blah-blah 2>&1 | head -n 2
+#. error: unknown option for 'stash save': --blah-blah
+#. To provide a message, use git stash save -- '--blah-blah'
+#: git-stash.sh:265
+#, sh-format
+msgid ""
+"error: unknown option for 'stash save': $option\n"
+"       To provide a message, use git stash save -- '$option'"
+msgstr ""
+"грешка: командата „git stash save“ не поддържа опция „${option}“\n"
+"        За да зададете съобщение, изпълнете „git stash save -- '${option}'“"
 
-#: common-cmds.h:13
-msgid "collaborate (see also: git help workflows)"
-msgstr "съвместна работа (погледнете: „git help workflows“)"
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "Опцията „--patch“ е несъвместима с „--include-untracked“ и „--all“"
 
-#: common-cmds.h:17
-msgid "Add file contents to the index"
-msgstr "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° Ñ\84айла ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: git-stash.sh:286
+msgid "No local changes to save"
+msgstr "Ð\9dÑ\8fма Ð½Ð¸ÐºÐ°ÐºÐ²Ð¸ Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸ Ð¿Ñ\80омени Ð·Ð° Ñ\81каÑ\82аване"
 
-#: common-cmds.h:18
-msgid "Use binary search to find the commit that introduced a bug"
-msgstr "Ð\94воиÑ\87но Ñ\82Ñ\8aÑ\80Ñ\81ене Ð½Ð° Ð¿Ñ\80омÑ\8fнаÑ\82а, ÐºÐ¾Ñ\8fÑ\82о Ðµ Ð¿Ñ\80иÑ\87инила Ð³Ñ\80еÑ\88ка"
+#: git-stash.sh:291
+msgid "Cannot initialize stash"
+msgstr "СкаÑ\82аванеÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80а"
 
-# FIXME - should be similar to tag
-#: common-cmds.h:19
-msgid "List, create, or delete branches"
-msgstr "Извеждане, създаване, изтриване на клони"
+#: git-stash.sh:295
+msgid "Cannot save the current status"
+msgstr "Текущото състояние не може да бъде запазено"
 
-#: common-cmds.h:20
-msgid "Switch branches or restore working tree files"
+#: git-stash.sh:296
+#, sh-format
+msgid "Saved working directory and index state $stash_msg"
 msgstr ""
-"Ð\9fÑ\80еминаване ÐºÑ\8aм Ð´Ñ\80Ñ\83г ÐºÐ»Ð¾Ð½ Ð¸Ð»Ð¸ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\84айловеÑ\82е Ð² Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во"
+"СÑ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о Ð½Ð° Ñ\80абоÑ\82наÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð¸ Ð¸Ð½Ð´ÐµÐºÑ\81а Ñ\81а Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð¸: â\80\9e$stash_msgâ\80\9c"
 
-#: common-cmds.h:21
-msgid "Clone a repository into a new directory"
-msgstr "Клониране на хранилище в нова директория"
-
-#: common-cmds.h:22
-msgid "Record changes to the repository"
-msgstr "Подаване на промени в хранилището"
-
-#: common-cmds.h:23
-msgid "Show changes between commits, commit and working tree, etc"
-msgstr "Извеждане на разликите между подаванията, версиите, работното дърво"
-
-#: common-cmds.h:24
-msgid "Download objects and refs from another repository"
-msgstr "Изтегляне на обекти и указатели от друго хранилище"
+#: git-stash.sh:323
+msgid "Cannot remove worktree changes"
+msgstr "Промените в работното дърво не могат да бъдат занулени"
 
-#: common-cmds.h:25
-msgid "Print lines matching a pattern"
-msgstr "Извеждане на редовете напасващи на шаблон"
+#: git-stash.sh:471
+#, sh-format
+msgid "unknown option: $opt"
+msgstr "непозната опция: ${opt}"
 
-#: common-cmds.h:26
-msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr "СÑ\8aздаване Ð½Ð° Ð¿Ñ\80азно Ñ\85Ñ\80анилиÑ\89е Ð½Ð° Git Ð¸Ð»Ð¸ Ð·Ð°Ð½Ñ\83лÑ\8fване Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89о"
+#: git-stash.sh:484
+msgid "No stash found."
+msgstr "Ð\9dе Ðµ Ð¾Ñ\82кÑ\80иÑ\82о Ð½Ð¸Ñ\89о Ñ\81каÑ\82ано."
 
-#: common-cmds.h:27
-msgid "Show commit logs"
-msgstr "Извеждане на журнала с подаванията"
+#: git-stash.sh:491
+#, sh-format
+msgid "Too many revisions specified: $REV"
+msgstr "Указани са прекалено много версии: „${REV}“"
 
-#: common-cmds.h:28
-msgid "Join two or more development histories together"
-msgstr "Сливане на две или повече поредици/истории от промени"
+#: git-stash.sh:506
+#, sh-format
+msgid "$reference is not a valid reference"
+msgstr "Указателят „${reference}“ е грешен"
 
-#: common-cmds.h:29
-msgid "Move or rename a file, a directory, or a symlink"
-msgstr "Преместване или преименуване на файл, директория или символна връзка"
+#: git-stash.sh:534
+#, sh-format
+msgid "'$args' is not a stash-like commit"
+msgstr "„${args}“ не е подаване, приличащо на нещо скатано"
 
-#: common-cmds.h:30
-msgid "Fetch from and integrate with another repository or a local branch"
-msgstr "Доставяне и внасяне на промените от друго хранилище или клон"
+#: git-stash.sh:545
+#, sh-format
+msgid "'$args' is not a stash reference"
+msgstr "„${args}“ не е указател към нещо скатано"
 
-#: common-cmds.h:31
-msgid "Update remote refs along with associated objects"
-msgstr "Ð\9eбновÑ\8fване Ð½Ð° Ð¾Ñ\82далеÑ\87ениÑ\82е Ñ\83казаÑ\82ели Ð¸ Ñ\81вÑ\8aÑ\80заниÑ\82е Ñ\81 Ñ\82Ñ\8fÑ\85 Ð¾Ð±ÐµÐºÑ\82и"
+#: git-stash.sh:553
+msgid "unable to refresh index"
+msgstr "индекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¾Ð±Ð½Ð¾Ð²ÐµÐ½"
 
-#: common-cmds.h:32
-msgid "Reapply commits on top of another base tip"
-msgstr "Прилагане на подаванията върху друг връх"
+#: git-stash.sh:557
+msgid "Cannot apply a stash in the middle of a merge"
+msgstr "По време на сливане не може да приложите нещо скатано"
 
-#: common-cmds.h:33
-msgid "Reset current HEAD to the specified state"
-msgstr "Привеждане на указателя „HEAD“ към зададеното състояние"
+#: git-stash.sh:565
+msgid "Conflicts in index. Try without --index."
+msgstr ""
+"В индекса има конфликти.  Пробвайте да изпълните командата без опцията „--"
+"index“."
 
-#: common-cmds.h:34
-msgid "Remove files from the working tree and from the index"
-msgstr "Ð\98зÑ\82Ñ\80иване Ð½Ð° Ñ\84айлове Ð¾Ñ\82 Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во Ð¸ Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: git-stash.sh:567
+msgid "Could not save index tree"
+msgstr "Ð\94Ñ\8aÑ\80воÑ\82о Ñ\81оÑ\87ено Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð¾"
 
-#: common-cmds.h:35
-msgid "Show various types of objects"
-msgstr "Ð\98звеждане Ð½Ð° Ñ\80азлиÑ\87ниÑ\82е Ð²Ð¸Ð´Ð¾Ð²Ðµ Ð¾Ð±ÐµÐºÑ\82и Ð² Git"
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "Ð\9dеÑ\81ледени Ñ\84айлове Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ñ\81е Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fÑ\82 Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: common-cmds.h:36
-msgid "Show the working tree status"
-msgstr "Ð\98звеждане Ð½Ð° Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о Ð½Ð° Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во"
+#: git-stash.sh:601
+msgid "Cannot unstage modified files"
+msgstr "Ð\9fÑ\80оменениÑ\82е Ñ\84айлове Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 Ð¸Ð·Ð²Ð°Ð´ÐµÐ½Ð¸ Ð¾Ñ\82 Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-# FIXME - should be similar to branch
-#: common-cmds.h:37
-msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr "Извеждане, създаване, изтриване, проверка на етикети подписани с GPG"
+#: git-stash.sh:616
+msgid "Index was not unstashed."
+msgstr "Индексът не е скатан."
 
-#: parse-options.h:145
-msgid "expiry-date"
-msgstr "пеÑ\80иод Ð½Ð° Ð²Ð°Ð»Ð¸Ð´Ð½Ð¾Ñ\81Ñ\82/запазване"
+#: git-stash.sh:630
+msgid "The stash is kept in case you need it again."
+msgstr "СкаÑ\82аноÑ\82о Ðµ Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð¾ Ð² Ñ\81лÑ\83Ñ\87ай, Ñ\87е Ð²Ð¸ Ð¿Ð¾Ñ\82Ñ\80Ñ\8fбва Ð¾Ñ\82ново"
 
-#: parse-options.h:160
-msgid "no-op (backward compatibility)"
-msgstr "нулева операция (за съвместимост с предишни версии)"
+#: git-stash.sh:639
+#, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr "Изтрито е скатаното „${REV}“ ($s)"
 
-#: parse-options.h:237
-msgid "be more verbose"
-msgstr "повече подробности"
+#: git-stash.sh:640
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
+msgstr "Скатаното „${REV}“ не може да бъде изтрито"
 
-#: parse-options.h:239
-msgid "be more quiet"
-msgstr "по-малко Ð¿Ð¾Ð´Ñ\80обноÑ\81Ñ\82и"
+#: git-stash.sh:648
+msgid "No branch name specified"
+msgstr "Ð\9dе Ðµ Ñ\83казано Ð¸Ð¼Ðµ Ð½Ð° ÐºÐ»Ð¾Ð½"
 
-# FIXME SHA-1 -> SHA1
-#: parse-options.h:245
-msgid "use <n> digits to display SHA-1s"
-msgstr "да се показват такъв БРОЙ цифри от сумите по SHA1"
+#: git-stash.sh:727
+msgid "(To restore them type \"git stash apply\")"
+msgstr "(За да ги възстановите, изпълнете командата „git stash apply“)"
 
-#: rerere.h:40
-msgid "update the index with reused conflict resolution if possible"
+#: git-submodule.sh:181
+msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
-"пÑ\80и Ð²Ñ\8aзможноÑ\81Ñ\82 Ð¿Ñ\80еизползване Ð½Ð° Ñ\80еÑ\88ениеÑ\82о Ð½Ð° ÐºÐ¾Ð½Ñ\84ликÑ\82а Ð·Ð° Ð¾Ð±Ð½Ð¾Ð²Ñ\8fване Ð½Ð° "
-"индекÑ\81а"
+"Ð\9eÑ\82ноÑ\81иÑ\82елен Ð¿Ñ\8aÑ\82 Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ð¾Ð»Ð·Ð²Ð° Ñ\81амо Ð¾Ñ\82 Ð¾Ñ\81новнаÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð½Ð° Ñ\80абоÑ\82ноÑ\82о "
+"дÑ\8aÑ\80во"
 
-#: git-bisect.sh:55
-msgid "You need to start by \"git bisect start\""
-msgstr "Започнете като изпълните командата „git bisect start“"
+#: git-submodule.sh:191
+#, sh-format
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+msgstr ""
+"адрес на хранилище: „${repo}“ трябва или да е абсолютен, или да започва с "
+"„./“ или „../“"
 
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-bisect.sh:61
-msgid "Do you want me to do it for you [Y/n]? "
-msgstr "Да се извърши ли автоматично? „Y“ —  ДА, „n“ — не"
+#: git-submodule.sh:210
+#, sh-format
+msgid "'$sm_path' already exists in the index"
+msgstr "„${sm_path}“ вече съществува в индекса"
 
-#: git-bisect.sh:122
+#: git-submodule.sh:213
 #, sh-format
-msgid "unrecognised option: '$arg'"
-msgstr "непозната опция „${arg}“"
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "„${sm_path}“ вече съществува в индекса и не е подмодул"
 
-#: git-bisect.sh:126
+#: git-submodule.sh:218
 #, sh-format
-msgid "'$arg' does not appear to be a valid revision"
-msgstr "„$arg“ не изглежда като указател към версия"
+msgid ""
+"The following path is ignored by one of your .gitignore files:\n"
+"$sm_path\n"
+"Use -f if you really want to add it."
+msgstr ""
+"Следният път се игнорира поради някой от файловете „.gitignore“:\n"
+"${sm_path}\n"
+"Използвайте опцията „-f“, ако за да го добавите наистина."
 
-# FIXME - I ??? the message does not convey what is actually wrong - that the "HEAD" points to sth that is unparsable
-#: git-bisect.sh:155
-msgid "Bad HEAD - I need a HEAD"
-msgstr "ТекÑ\83Ñ\89иÑ\8fÑ\82 Ñ\83казаÑ\82ел â\80\9eHEADâ\80\9c Ðµ Ð½ÐµÐ¿Ñ\80авилен."
+#: git-submodule.sh:236
+#, sh-format
+msgid "Adding existing repo at '$sm_path' to the index"
+msgstr "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ваÑ\89оÑ\82о Ñ\85Ñ\80анилиÑ\89е Ð² â\80\9e${sm_path}â\80\9c ÐºÑ\8aм Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: git-bisect.sh:168
+#: git-submodule.sh:238
 #, sh-format
-msgid ""
-"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+msgid "'$sm_path' already exists and is not a valid git repo"
+msgstr "„${sm_path}“ съществува, а не е хранилище на Git"
+
+#: git-submodule.sh:246
+#, sh-format
+msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
-"Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¿Ñ\80еминаване ÐºÑ\8aм â\80\9e${start_head}â\80\9c. Ð\98зпÑ\8aлнеÑ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit bisect "
-"reset СЪЩЕСТВУВАЩ_КЛОН“."
+"Ð\9eÑ\82кÑ\80иÑ\82а Ðµ Ð»Ð¾ÐºÐ°Ð»Ð½Ð° Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f Ð½Ð° Git â\80\94 â\80\9e${sm_name}â\80\9c, ÐºÐ¾Ñ\8fÑ\82о Ñ\81оÑ\87и ÐºÑ\8aм "
+"отдалечените хранилища:"
 
-#: git-bisect.sh:178
-msgid "won't bisect on cg-seek'ed tree"
+#: git-submodule.sh:248
+#, sh-format
+msgid ""
+"If you want to reuse this local git directory instead of cloning again from\n"
+"  $realrepo\n"
+"use the '--force' option. If the local git directory is not the correct "
+"repo\n"
+"or you are unsure what this means choose another name with the '--name' "
+"option."
 msgstr ""
-"не може да се търси двоично, когато е изпълнена командата „cg-seek“ от "
-"„cogito“"
+"Ако искате да преизползвате тази директория на git, вместо да клонирате "
+"отново\n"
+"    $realrepo\n"
+"използвайте опцията „--force“.  Ако локалната директория на git не е за\n"
+"правилното хранилище или ако не знаете какво означава това, използвайте\n"
+"друго име като аргумент към опцията „--name“."
 
-#: git-bisect.sh:182
-msgid "Bad HEAD - strange symbolic ref"
-msgstr "Неправилен указател „HEAD“"
+#: git-submodule.sh:254
+#, sh-format
+msgid "Reactivating local git directory for submodule '$sm_name'."
+msgstr "Активиране на локалното хранилище за подмодула „${sm_name}“ наново."
 
-#: git-bisect.sh:234
+#: git-submodule.sh:266
 #, sh-format
-msgid "Bad bisect_write argument: $state"
-msgstr "Ð\9dепÑ\80авилен Ð°Ñ\80гÑ\83менÑ\82 Ð½Ð° Ñ\84Ñ\83нкÑ\86иÑ\8fÑ\82а â\80\9ebisect_writeâ\80\9c: â\80\9e${state}â\80\9c"
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "Ð\9fодмодÑ\83лÑ\8aÑ\82 â\80\9e${sm_path}â\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82еглен"
 
-#: git-bisect.sh:263
+#: git-submodule.sh:271
 #, sh-format
-msgid "Bad rev input: $arg"
-msgstr "Неправилна версия: „${arg}“"
+msgid "Failed to add submodule '$sm_path'"
+msgstr "Неуспешно добавяне на подмодула „${sm_path}“"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Функцията „bisect_state“ изисква поне един аргумент."
+#: git-submodule.sh:280
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr "Неуспешно регистриране на подмодула „${sm_path}“"
 
-#: git-bisect.sh:290
+#: git-submodule.sh:341
 #, sh-format
-msgid "Bad rev input: $rev"
-msgstr "Ð\9dепÑ\80авилна Ð²ÐµÑ\80Ñ\81иÑ\8f: â\80\9e${rev}“"
+msgid "Entering '$displaypath'"
+msgstr "Ð\92лизане Ð² â\80\9e${displaypath}“"
 
-#: git-bisect.sh:299
+#: git-submodule.sh:361
 #, sh-format
-msgid "'git bisect $TERM_BAD' can take only one argument."
-msgstr "Командата „git bisect ${TERM_BAD}“ приема само един аргумент."
+msgid "Stopping at '$displaypath'; script returned non-zero status."
+msgstr ""
+"Спиране при „${displaypath}“ — изходният код от скрипта бе различен от 0."
 
-#: git-bisect.sh:322
+#: git-submodule.sh:432
 #, sh-format
-msgid "Warning: bisecting only with a $TERM_BAD commit."
-msgstr "ПРЕДУПРЕЖДЕНИЕ: двоично търсене само по ${TERM_BAD} подаване."
+msgid "pathspec and --all are incompatible"
+msgstr "указването на път е несъвместимо с опцията „--all“"
 
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-bisect.sh:328
-msgid "Are you sure [Y/n]? "
-msgstr "Да се продължи ли? „Y“ —  ДА, „n“ — не"
+#: git-submodule.sh:437
+#, sh-format
+msgid "Use '--all' if you really want to deinitialize all submodules"
+msgstr "Използвайте „--all“, за да премахнете всички подмодули"
 
-#: git-bisect.sh:340
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
-"You need to give me at least one $bad_syn and one $good_syn revision.\n"
-"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+"Submodule work tree '$displaypath' contains a .git directory\n"
+"(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
-"Трябва да зададете поне една ${bad_syn} и една ${good_syn} версия. (Това "
-"може да се\n"
-"направи съответно и чрез командите „git bisect ${bad_syn}“ и „git bisect "
-"${good_syn}“.)"
+"Работното дърво на подмодул „${displaypath}“ съдържа директория „.git“.\n"
+"(ако искате да ги изтриете заедно с цялата им история, използвайте „rm -rf“)"
 
-#: git-bisect.sh:343
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
-"You need to start by \"git bisect start\".\n"
-"You then need to give me at least one $good_syn and one $bad_syn revision.\n"
-"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
 msgstr ""
-"Трябва да започнете двоичното търсене чрез командата „git bisect start“.\n"
-"трябва да зададете поне една добра и една лоша версия. (Това може да се\n"
-"направи съответно и чрез командите „git bisect ${bad_syn}“ и „git bisect "
-"${good_syn}“.)"
+"Работното дърво на подмодул „${displaypath}“ съдържа локални промени.  "
+"Можете да го отхвърлите с опцията „-f“"
 
-#: git-bisect.sh:414 git-bisect.sh:546
-msgid "We are not bisecting."
-msgstr "В момента не се извършва двоично търсене."
+#: git-submodule.sh:468
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "Директорията „${displaypath}“ е изчистена"
 
-#: git-bisect.sh:421
+#: git-submodule.sh:469
 #, sh-format
-msgid "'$invalid' is not a valid commit"
-msgstr "„${invalid}“ е неправилно подаване"
+msgid "Could not remove submodule work tree '$displaypath'"
+msgstr ""
+"Директорията към работното дърво на подмодула „${displaypath}“ не може да "
+"бъде изтрита"
 
-#: git-bisect.sh:430
+#: git-submodule.sh:472
+#, sh-format
+msgid "Could not create empty submodule directory '$displaypath'"
+msgstr ""
+"Празната директория за подмодула „${displaypath}“ не може да бъде създадена"
+
+#: git-submodule.sh:481
+#, sh-format
+msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+msgstr ""
+"Премахната е регистрацията на подмодул „${name}“, сочещ към адрес „${url}“, "
+"за пътя „${displaypath}“"
+
+#: git-submodule.sh:637
+#, sh-format
+msgid "Unable to find current revision in submodule path '$displaypath'"
+msgstr "Текущата версия за подмодула в „${displaypath}“ липсва"
+
+#: git-submodule.sh:647
+#, sh-format
+msgid "Unable to fetch in submodule path '$sm_path'"
+msgstr "Неуспешно доставяне в пътя към подмодул „${sm_path}“"
+
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
-"Could not check out original HEAD '$branch'.\n"
-"Try 'git bisect reset <commit>'."
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
 msgstr ""
-"Ð\9fÑ\8aÑ\80вонаÑ\87ално Ñ\83казаниÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ â\80\9e${branch}â\80\9c Ð² Ñ\83казаÑ\82елÑ\8f â\80\9eHEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде\n"
-"изÑ\82еглен. Ð\9fÑ\80обвайÑ\82е Ð´Ð° Ð¸Ð·Ð¿Ñ\8aлниÑ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit bisect reset Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95â\80\9c."
+"ТекÑ\83Ñ\89аÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f â\80\9e${remote_name}/${branch}â\80\9c Ð² Ð¿Ñ\8aÑ\82Ñ\8f ÐºÑ\8aм Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л â\80\9e${sm_path}â\80\9c "
+"липÑ\81ва"
 
-#: git-bisect.sh:458
-msgid "No logfile given"
-msgstr "Не е зададен журнален файл"
+#: git-submodule.sh:670
+#, sh-format
+msgid "Unable to fetch in submodule path '$displaypath'"
+msgstr "Неуспешно доставяне в пътя към подмодул „${displaypath}“"
 
-#: git-bisect.sh:459
+#: git-submodule.sh:676
 #, sh-format
-msgid "cannot read $file for replaying"
+msgid ""
+"Fetched in submodule path '$displaypath', but it did not contain $sha1. "
+"Direct fetching of that commit failed."
 msgstr ""
-"Ð\96Ñ\83Ñ\80налниÑ\8fÑ\82 Ñ\84айл â\80\9e${file}â\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80оÑ\87еÑ\82ен, Ð·Ð° Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ñ\8aлнÑ\8fÑ\82 "
-"командите от него наново"
+"Ð\9fодмодÑ\83лÑ\8aÑ\82 Ð² Ð¿Ñ\8aÑ\82Ñ\8f â\80\9e$displaypathâ\80\9c Ðµ Ð´Ð¾Ñ\81Ñ\82авен, Ð½Ð¾ Ð½Ðµ Ñ\81Ñ\8aдÑ\8aÑ\80жа Ð¾Ð±ÐµÐºÑ\82а Ñ\81Ñ\8aÑ\81 Ñ\81Ñ\83ма\n"
+"„$sha1“.  Директното доставяне на това подаване е неуспешно."
 
-# FIXME WTF
-#: git-bisect.sh:480
-msgid "?? what are you talking about?"
+#: git-submodule.sh:683
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
-"Непозната команда. Възможните варианти са: „start“, „good“, „bad“, „skip“"
+"Неуспешно изтегляне на версия „${sha1}“ в пътя към подмодул „${displaypath}“'"
 
-#: git-bisect.sh:492
+#: git-submodule.sh:684
 #, sh-format
-msgid "running $command"
-msgstr "изпÑ\8aлнение Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9e${command}“"
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Ð\9fÑ\8aÑ\82 ÐºÑ\8aм Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л â\80\9e${displaypath}â\80\9c: Ð¸Ð·Ñ\82еглена Ðµ Ð²ÐµÑ\80Ñ\81иÑ\8f â\80\9e${sha1}“"
 
-#: git-bisect.sh:499
+#: git-submodule.sh:688
 #, sh-format
-msgid ""
-"bisect run failed:\n"
-"exit code $res from '$command' is < 0 or >= 128"
+msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
-"неуспешно двоично търсене:\n"
-"изходният код от командата „${command}“ е ${res} — това е извън интервала "
-"[0, 128)"
+"Неуспешно пребазиране на версия „${sha1}“ в пътя към подмодул "
+"„${displaypath}“"
 
-#: git-bisect.sh:525
-msgid "bisect run cannot continue any more"
-msgstr "двоичното търсене не може да продължи"
+#: git-submodule.sh:689
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "Път към подмодул „${displaypath}“: пребазиране върху версия „${sha1}“"
 
-#: git-bisect.sh:531
+#: git-submodule.sh:694
 #, sh-format
-msgid ""
-"bisect run failed:\n"
-"'bisect_state $state' exited with error code $res"
+msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
-"неуспешно двоично търсене:\n"
-"функцията „bisect_state ${state}“ завърши с код за грешка ${res}"
+"Неуспешно сливане на версия „${sha1}“ в пътя към подмодул „${displaypath}“"
 
-#: git-bisect.sh:538
-msgid "bisect run success"
-msgstr "успешно двоично търсене"
+#: git-submodule.sh:695
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgstr "Път към подмодул „${displaypath}“: сливане с версия „${sha1}“"
 
-#: git-bisect.sh:565
-msgid "please use two different terms"
-msgstr "използвайте две различни управляващи думи"
+#: git-submodule.sh:700
+#, sh-format
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
+msgstr ""
+"Неуспешно изпълнение на командата „${command} ${sha1}“ в пътя към подмодул "
+"„${displaypath}“"
+
+#: git-submodule.sh:701
+#, sh-format
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Път към подмодул „${displaypath}“: „${command} ${sha1}“"
+
+#: git-submodule.sh:732
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
+msgstr ""
+"Неуспешна обработка на поддиректориите в пътя към подмодул „${displaypath}“"
+
+#: git-submodule.sh:840
+msgid "The --cached option cannot be used with the --files option"
+msgstr "Опциите „--cached“ и „--files“ са несъвместими"
+
+#: git-submodule.sh:892
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "неочакван режим „${mod_dst}“"
 
-#: git-bisect.sh:575
+#: git-submodule.sh:912
 #, sh-format
-msgid "'$term' is not a valid term"
-msgstr "„${term}“ не е правилна управляваща дума"
+msgid "  Warn: $display_name doesn't contain commit $sha1_src"
+msgstr ""
+"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_src}“"
 
-#: git-bisect.sh:578
+#: git-submodule.sh:915
 #, sh-format
-msgid "can't use the builtin command '$term' as a term"
+msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr ""
-"„${term}“ е вградена команда и не може да се използва като управляваща дума"
+"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_dst}“"
 
-#: git-bisect.sh:587 git-bisect.sh:593
+#: git-submodule.sh:918
 #, sh-format
-msgid "can't change the meaning of term '$term'"
-msgstr "не може да смените значението на управляващата дума „${term}“"
+msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
+msgstr ""
+"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа никое от подаванията "
+"„${sha1_src}“ и „${sha1_dst}“"
 
-#: git-bisect.sh:606
+#: git-submodule.sh:1064
 #, sh-format
-msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
-"Неправилна команда: в момента се изпълнява двоично търсене по ${TERM_BAD}/"
-"${TERM_GOOD}."
+"Неуспешна обработка на поддиректориите в пътя към подмодул „${sm_path}“"
 
-#: git-bisect.sh:636
-msgid "no terms defined"
-msgstr "не са указани управляващи думи"
+#: git-submodule.sh:1136
+#, sh-format
+msgid "Synchronizing submodule url for '$displaypath'"
+msgstr "Синхронизиране на адреса за пътя към подмодул „${displaypath}“"
 
-#: git-bisect.sh:653
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "За повече информация погледнете ръководството на „git-${cmd}(1)“"
+
+#: git-rebase--interactive.sh:140
 #, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "Пребазиране ($new_count/$total)"
+
+#: git-rebase--interactive.sh:156
 msgid ""
-"invalid argument $arg for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+"\n"
+"Commands:\n"
+" p, pick = use commit\n"
+" r, reword = use commit, but edit the commit message\n"
+" e, edit = use commit, but stop for amending\n"
+" s, squash = use commit, but meld into previous commit\n"
+" f, fixup = like \"squash\", but discard this commit's log message\n"
+" x, exec = run command (the rest of the line) using shell\n"
+" d, drop = remove commit\n"
+"\n"
+"These lines can be re-ordered; they are executed from top to bottom.\n"
 msgstr ""
-"на „git bisect terms“ е подаден неправилен аргумент „${arg}“\n"
-"Поддържат се опциите „--term-good|--term-old“ и „--term-bad|--term-new“."
+"\n"
+"Команди:\n"
+" p, pick — прилагане на подаването\n"
+" r, reword — прилагане на подаването, но смяна на съобщението му\n"
+" e, edit — прилагане на подаването и спиране при него за още промени\n"
+" s, squash — сливане на подаването към предходното му\n"
+" f, fixup —  сливане на подаването към предходното му, без смяна на "
+"съобщението\n"
+" x, exec — изпълнение на команда към обвивката: останалата част на реда\n"
+" d, drop — прескачане на подаването\n"
+"\n"
+"Може да променяте последователността на редовете — те се изпълняват\n"
+"последователно отгоре-надолу.\n"
 
-#: git-rebase.sh:57
+#: git-rebase--interactive.sh:171
 msgid ""
-"When you have resolved this problem, run \"git rebase --continue\".\n"
-"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
-"To check out the original branch and stop rebasing, run \"git rebase --abort"
-"\"."
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
 msgstr ""
-"След коригирането на този проблем изпълнете „git rebase --continue“.\n"
-"Ако предпочитате да прескочите тази кръпка, изпълнете „git rebase --skip“.\n"
-"За да откажете пребазирането и да се върнете към първоначалното състояние,\n"
-"изпълнете „git rebase --abort“."
+"\n"
+"Не изтривайте редове.  Подаванията могат да се прескачат с командата "
+"„drop“.\n"
 
-#: git-rebase.sh:168
-msgid "Applied autostash."
-msgstr "Автоматично скатаното е приложено."
+#: git-rebase--interactive.sh:175
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"Ако изтриете ред, съответстващото му подаване ще бъде ИЗТРИТО.\n"
 
-#: git-rebase.sh:171
+#: git-rebase--interactive.sh:211
 #, sh-format
-msgid "Cannot store $stash_sha1"
-msgstr "„${stash_sha1}“ не може да бъде запазен"
-
-#: git-rebase.sh:172
 msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+"You can amend the commit now, with\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Once you are satisfied with your changes, run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
-"Прилагането на автоматично скатаното доведе до конфликти. Промените ви са\n"
-"надеждно скатани. Можете да пробвате да ги приложите чрез „git stash pop“\n"
-"или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
+"Може да промените подаването с командата:\n"
+"\n"
+"    git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"След като привършите, продължете с командата:\n"
+"\n"
+"    git rebase --continue"
 
-#: git-rebase.sh:211
-msgid "The pre-rebase hook refused to rebase."
-msgstr "Куката за изпълнение преди пребазиране отхвърли пребазирането."
+#: git-rebase--interactive.sh:236
+#, sh-format
+msgid "$sha1: not a commit that can be picked"
+msgstr "$sha1: това не е подаване, което може да бъде отбрано"
 
-#: git-rebase.sh:216
-msgid "It looks like git-am is in progress. Cannot rebase."
+#: git-rebase--interactive.sh:275
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "Неправилно име на подаване: „$sha1“"
+
+#: git-rebase--interactive.sh:317
+msgid "Cannot write current commit's replacement sha1"
 msgstr ""
-"Изглежда, че сега се прилагат кръпки чрез командата „git-am“. Не може да "
-"пребазирате в момента."
+"Заместващата сума по SHA1 за текущото подаване не може да бъде запазена"
 
-#: git-rebase.sh:357
-msgid "No rebase in progress?"
-msgstr "Изглежда в момента не тече пребазиране"
+#: git-rebase--interactive.sh:369
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "Превъртане до „$sha1“"
 
-#: git-rebase.sh:368
-msgid "The --edit-todo action can only be used during interactive rebase."
-msgstr ""
-"Опцията „--edit-todo“ е достъпна само по време на интерактивно пребазиране."
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
+msgstr "Не може да се превърти до „$sha1“"
 
-#: git-rebase.sh:375
-msgid "Cannot read HEAD"
-msgstr "Указателят „HEAD“ не може да бъде прочетен"
+#: git-rebase--interactive.sh:380
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
+msgstr "Указателят „HEAD“ не може да се насочи към „$first_parent“"
 
-#: git-rebase.sh:378
-msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
-msgstr ""
-"Трябва да редактирате всички конфликти при сливането. След това\n"
-"отбележете коригирането им чрез командата „git add“"
+#: git-rebase--interactive.sh:385
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "Подаването не може да се смачка: „$sha1“"
 
-#: git-rebase.sh:396
+#: git-rebase--interactive.sh:399
 #, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Ð\92Ñ\80Ñ\8aÑ\89анеÑ\82о ÐºÑ\8aм â\80\9e${head_name}â\80\9c Ðµ Ð½ÐµÐ²Ñ\8aзможно"
+msgid "Error redoing merge $sha1"
+msgstr "Ð\93Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ð¾Ð²Ñ\82аÑ\80Ñ\8fнеÑ\82о Ð½Ð° Ñ\81ливанеÑ\82о Ð½Ð° â\80\9e$sha1â\80\9c"
 
-#: git-rebase.sh:415
+#: git-rebase--interactive.sh:407
 #, sh-format
-msgid ""
-"It seems that there is already a $state_dir_base directory, and\n"
-"I wonder if you are in the middle of another rebase.  If that is the\n"
-"case, please try\n"
-"\t$cmd_live_rebase\n"
-"If that is not the case, please\n"
-"\t$cmd_clear_stale_rebase\n"
-"and run me again.  I am stopping in case you still have something\n"
-"valuable there."
-msgstr ""
-"Вече съществува директория „${state_dir_base}“. Възможно ли е да сте\n"
-"в процес на друго пребазиране? Ако това е така, изпълнете:\n"
-"    ${cmd_live_rebase}\n"
-"Ако не сте в процес на друго пребазиране, изпълнете:\n"
-"    ${cmd_clear_stale_rebase}\n"
-"и отново започнете пребазирането. Текущото пребазиране се преустановява, за\n"
-"да не загубите случайно промени."
+msgid "Could not pick $sha1"
+msgstr "„$sha1“ не може да се отбере."
 
-#: git-rebase.sh:466
+#: git-rebase--interactive.sh:416
 #, sh-format
-msgid "invalid upstream $upstream_name"
-msgstr "непÑ\80авилна Ð¾Ñ\81нова Ð·Ð° Ñ\81Ñ\80авнение â\80\9e${upstream_name}â\80\9c"
+msgid "This is the commit message #${n}:"
+msgstr "Това Ðµ Ñ\81Ñ\8aобÑ\89ение Ð¿Ñ\80и Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ â\84\96${n}:"
 
-#: git-rebase.sh:490
+#: git-rebase--interactive.sh:421
 #, sh-format
-msgid "$onto_name: there are more than one merge bases"
-msgstr ""
-"указателят „${onto_name}“ може да сочи към повече от една основа за "
-"пребазирането"
+msgid "The commit message #${n} will be skipped:"
+msgstr "Съобщение при подаване №${n} ще бъде прескочено."
 
-#: git-rebase.sh:493 git-rebase.sh:497
+#: git-rebase--interactive.sh:432
 #, sh-format
-msgid "$onto_name: there is no merge base"
-msgstr "указателят „${onto_name}“ не сочи към никаква основа за пребазирането"
+msgid "This is a combination of $count commit."
+msgid_plural "This is a combination of $count commits."
+msgstr[0] "Това е обединение от $count подаване."
+msgstr[1] "Това е обединение от $count подавания."
 
-#: git-rebase.sh:502
+#: git-rebase--interactive.sh:441
 #, sh-format
-msgid "Does not point to a valid commit: $onto_name"
-msgstr "Указателят „${onto_name}“ не сочи към подаване"
+msgid "Cannot write $fixup_msg"
+msgstr "Новото съобщение при подаване „$fixup_msg“ не може да бъде запазено"
+
+#: git-rebase--interactive.sh:444
+msgid "This is a combination of 2 commits."
+msgstr "Това е обединение от 2 подавания"
 
-#: git-rebase.sh:525
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
-msgid "fatal: no such branch: $branch_name"
-msgstr "ФÐ\90ТÐ\90Ð\9bÐ\9dÐ\90 Ð\93РÐ\95ШÐ\9aÐ\90: Ð½Ðµ Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва ÐºÐ»Ð¾Ð½ â\80\9e${branch_name}â\80\9c"
+msgid "Could not apply $sha1... $rest"
+msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ð¾Ð´Ð°Ð´Ðµ $sha1â\80¦ $rest"
 
-#: git-rebase.sh:558
-msgid "Cannot autostash"
-msgstr "Не може да се скатае автоматично"
+#: git-rebase--interactive.sh:559
+#, sh-format
+msgid ""
+"Could not amend commit after successfully picking $sha1... $rest\n"
+"This is most likely due to an empty commit message, or the pre-commit hook\n"
+"failed. If the pre-commit hook failed, you may need to resolve the issue "
+"before\n"
+"you are able to reword the commit."
+msgstr ""
+"Подаването не може за де промени след успешното отбиране на „$sha1…“ $rest.\n"
+"Най-вероятните причини са празно съобщение при подаване или неуспешно "
+"изпълнение\n"
+"на куката преди подаване.  Ако имате проблем с куката, ще трябва да го "
+"коригирате,\n"
+"преди да можете да промените подаването."
+
+#: git-rebase--interactive.sh:574
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "Спиране при „$sha1_abbrev…“ $rest"
 
-#: git-rebase.sh:563
+#: git-rebase--interactive.sh:589
 #, sh-format
-msgid "Created autostash: $stash_abbrev"
-msgstr "Ð\90вÑ\82омаÑ\82иÑ\87но Ñ\81каÑ\82ано: â\80\9e${stash_abbrev}“"
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "Ð\91ез Ð¿Ñ\80едиÑ\88но Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð¿Ñ\8aлни â\80\9e$squash_style“"
 
-#: git-rebase.sh:567
-msgid "Please commit or stash them."
-msgstr "Промените трябва или да се подадат, или да се скатаят."
+#: git-rebase--interactive.sh:631
+#, sh-format
+msgid "Executing: $rest"
+msgstr "В момента се изпълнява: $rest"
 
-#: git-rebase.sh:587
+#: git-rebase--interactive.sh:639
 #, sh-format
-msgid "Current branch $branch_name is up to date."
-msgstr "ТекÑ\83Ñ\89иÑ\8fÑ\82 ÐºÐ»Ð¾Ð½ â\80\9e${branch_name}â\80\9c Ðµ Ð½Ð°Ð¿Ñ\8aлно Ð°ÐºÑ\82Ñ\83ален."
+msgid "Execution failed: $rest"
+msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ð¿Ñ\8aлнение: $rest"
 
-#: git-rebase.sh:591
+#: git-rebase--interactive.sh:641
+msgid "and made changes to the index and/or the working tree"
+msgstr "и промени индекса и/или работното дърво"
+
+#: git-rebase--interactive.sh:643
+msgid ""
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
+msgstr ""
+"Може да коригирате проблема, след което изпълнете:\n"
+"\n"
+"    git rebase --continue"
+
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:656
 #, sh-format
-msgid "Current branch $branch_name is up to date, rebase forced."
+msgid ""
+"Execution succeeded: $rest\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
-"Текущият клон „${branch_name}“ е напълно актуален. Пребазирането е "
-"принудително."
+"Успешно изпълнение: $rest\n"
+"Остават още промени в индекса или работното дърво.\n"
+"Трябва да ги подадете или скатаете и след това изпълнете:\n"
+"\n"
+"    git rebase --continue"
 
-#: git-rebase.sh:602
+#: git-rebase--interactive.sh:667
 #, sh-format
-msgid "Changes from $mb to $onto:"
-msgstr "Ð\9fÑ\80омениÑ\82е Ð¾Ñ\82 â\80\9e${mb}â\80\9c ÐºÑ\8aм â\80\9e${onto}â\80\9c:"
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Ð\9dепознаÑ\82а ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°: $command $sha1 $rest"
 
-#: git-rebase.sh:611
-msgid "First, rewinding head to replay your work on top of it..."
+#: git-rebase--interactive.sh:668
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "Коригирайте това чрез „git rebase --edit-todo“."
+
+#: git-rebase--interactive.sh:703
+#, sh-format
+msgid "Successfully rebased and updated $head_name."
+msgstr "Успешно пребазиране и обновяване на „$head_name“."
+
+#: git-rebase--interactive.sh:750
+msgid "Could not skip unnecessary pick commands"
+msgstr "Излишните команди да отбиране не могат да бъдат прескочени"
+
+#: git-rebase--interactive.sh:908
+#, sh-format
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
 msgstr ""
-"Първо, указателят „HEAD“ започва да сочи към базата, върху която пребазирате…"
+"Предупреждение: сумата по SHA1, указана към командата на реда:\n"
+" - $line\n"
+" липсва или не е представлява подаване"
 
-#: git-rebase.sh:621
+#: git-rebase--interactive.sh:941
 #, sh-format
-msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr "Тривиално сливане на „${branch_name}“ върху „${onto_name}“."
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
+msgstr ""
+"Предупреждение: непозната команда на ред:\n"
+" - $line"
 
-#: git-stash.sh:51
-msgid "git stash clear with parameters is unimplemented"
-msgstr "Командата „git stash clear“ не поддържа аргументи"
+#: git-rebase--interactive.sh:980
+msgid "could not detach HEAD"
+msgstr "указателят „HEAD“ не може да се отдели"
 
-#: git-stash.sh:74
-msgid "You do not have the initial commit yet"
-msgstr "Все още липсва първоначално подаване"
+#: git-rebase--interactive.sh:1018
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
+msgstr ""
+"Предупреждение: някои подавания може да са пропуснати.\n"
+"\n"
+"Пропуснати подавания (новите са най-отгоре):"
 
-#: git-stash.sh:89
-msgid "Cannot save the current index state"
-msgstr "Състоянието на текущия индекс не може да бъде запазено"
+#: git-rebase--interactive.sh:1026
+msgid ""
+"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
+"\n"
+"Use 'git config rebase.missingCommitsCheck' to change the level of "
+"warnings.\n"
+"The possible behaviours are: ignore, warn, error."
+msgstr ""
+"За да не получавате това съобщение, изрично ползвайте командата „drop“.\n"
+"\n"
+"Настройката „rebase.missingCommitsCheck“ управлява нивото на предупреждение\n"
+"Възможните стойности са „ignore“ (пренебрегване), „warn“ (само "
+"предупреждение)\n"
+"или „error“ (считане за грешка)."
 
-#: git-stash.sh:124 git-stash.sh:137
-msgid "Cannot save the current worktree state"
-msgstr "Състоянието на работното дърво не може да бъде запазено"
+#: git-rebase--interactive.sh:1037
+#, sh-format
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
+msgstr ""
+"Непозната стойност „$check_level“ за настройката „rebase."
+"missingCommitsCheck“.\n"
+"Настройката се прескача."
 
-#: git-stash.sh:141
-msgid "No changes selected"
-msgstr "Не са избрани никакви промени"
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Можете да промените това с командите „git rebase --edit-todo“ и „git rebase "
+"--continue“ след това."
 
-#: git-stash.sh:144
-msgid "Cannot remove temporary index (can't happen)"
-msgstr "Временният индекс не може да бъде изтрит"
+#: git-rebase--interactive.sh:1055
+msgid "Or you can abort the rebase with 'git rebase --abort'."
+msgstr ""
+"Може и да преустановите пребазирането с командата „git rebase --abort“."
 
-#: git-stash.sh:157
-msgid "Cannot record working tree state"
-msgstr "СÑ\8aÑ\81Ñ\82оÑ\8fниеÑ\82о Ð½Ð° Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð¾"
+#: git-rebase--interactive.sh:1083
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "УказаÑ\82елÑ\8fÑ\82 â\80\9eCHERRY_PICK_HEADâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82"
 
-#: git-stash.sh:189
+#: git-rebase--interactive.sh:1088
 #, sh-format
-msgid "Cannot update $ref_stash with $w_commit"
+msgid ""
+"You have staged changes in your working tree.\n"
+"If these changes are meant to be\n"
+"squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
-"Указателят „${ref_stash}“ не може да бъде обновен да сочи към „${w_commit}“"
+"В индекса има промени.  Ако искате да ги прибавите към\n"
+"предишното подаване, изпълнете:\n"
+"\n"
+"    git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Ако искате да създадете ново подаване, изпълнете:\n"
+"\n"
+"    git commit $gpg_sign_opt_quoted\n"
+"\n"
+"И в двата случая след като привършите, продължете с командата:\n"
+"\n"
+"    git rebase --continue\n"
 
-#. TRANSLATORS: $option is an invalid option, like
-#. `--blah-blah'. The 7 spaces at the beginning of the
-#. second line correspond to "error: ". So you should line
-#. up the second line with however many characters the
-#. translation of "error: " takes in your language. E.g. in
-#. English this is:
-#.
-#. $ git stash save --blah-blah 2>&1 | head -n 2
-#. error: unknown option for 'stash save': --blah-blah
-#. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:239
-#, sh-format
+#: git-rebase--interactive.sh:1105
+msgid "Error trying to find the author identity to amend commit"
+msgstr "Не може да бъде открит автор за поправянето на подаването"
+
+#: git-rebase--interactive.sh:1110
 msgid ""
-"error: unknown option for 'stash save': $option\n"
-"       To provide a message, use git stash save -- '$option'"
+"You have uncommitted changes in your working tree. Please commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
-"гÑ\80еÑ\88ка: ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9egit stash saveâ\80\9c Ð½Ðµ Ð¿Ð¾Ð´Ð´Ñ\8aÑ\80жа Ð¾Ð¿Ñ\86иÑ\8f â\80\9e${option}â\80\9c\n"
-"        За да зададете съобщение, изпълнете „git stash save -- '${option}'“"
+"Ð\92 Ñ\80абоÑ\82ноÑ\82о Ð´Ñ\8aÑ\80во Ð¸Ð¼Ð° Ð½ÐµÐ¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸ Ð¿Ñ\80омени.  Ð\9fÑ\8aÑ\80во Ð³Ð¸ Ð¿Ð¾Ð´Ð°Ð¹Ñ\82е, Ð° Ñ\81лед Ñ\82ова\n"
+"отново изпълнете „git rebase --continue“."
 
-#: git-stash.sh:260
-msgid "No local changes to save"
-msgstr "Ð\9dÑ\8fма Ð½Ð¸ÐºÐ°ÐºÐ²Ð¸ Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸ Ð¿Ñ\80омени Ð·Ð° Ñ\81каÑ\82аване"
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
+msgid "Could not commit staged changes."
+msgstr "Ð\9fÑ\80омениÑ\82е Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а Ð½Ðµ Ð¼Ð¾Ð³Ð°Ñ\82 Ð´Ð° Ð±Ñ\8aдаÑ\82 Ð¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸."
 
-#: git-stash.sh:264
-msgid "Cannot initialize stash"
-msgstr "Скатаването не може да стартира"
+#: git-rebase--interactive.sh:1147
+msgid ""
+"\n"
+"You are editing the todo file of an ongoing interactive rebase.\n"
+"To continue rebase after editing, run:\n"
+"    git rebase --continue\n"
+"\n"
+msgstr ""
+"\n"
+"В момента редактирате командния файл на текущото интерактивно пребазиране.\n"
+"За да продължите пребазирането след това, изпълнете:\n"
+"    git rebase --continue\n"
+"\n"
 
-#: git-stash.sh:268
-msgid "Cannot save the current status"
-msgstr "ТекÑ\83Ñ\89оÑ\82о Ñ\81Ñ\8aÑ\81Ñ\82оÑ\8fние Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð¿Ð°Ð·ÐµÐ½Ð¾"
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
+msgid "Could not execute editor"
+msgstr "ТекÑ\81Ñ\82овиÑ\8fÑ\82 Ñ\80едакÑ\82оÑ\80 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\82аÑ\80Ñ\82иÑ\80ан"
 
-#: git-stash.sh:286
-msgid "Cannot remove worktree changes"
-msgstr "Промените в работното дърво не могат да бъдат занулени"
+#: git-rebase--interactive.sh:1168
+#, sh-format
+msgid "Could not checkout $switch_to"
+msgstr "„$switch_to“ не може да се изтегли"
 
-#: git-stash.sh:405
+#: git-rebase--interactive.sh:1173
+msgid "No HEAD?"
+msgstr "Липсва указател „HEAD“"
+
+#: git-rebase--interactive.sh:1174
 #, sh-format
-msgid "unknown option: $opt"
-msgstr "непознаÑ\82а Ð¾Ð¿Ñ\86иÑ\8f: ${opt}"
+msgid "Could not create temporary $state_dir"
+msgstr "Ð\92Ñ\80еменнаÑ\82а Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\8f â\80\9e$state_dirâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ñ\81Ñ\8aздадена"
 
-#: git-stash.sh:415
-msgid "No stash found."
-msgstr "Не е открито нищо скатано."
+#: git-rebase--interactive.sh:1176
+msgid "Could not mark as interactive"
+msgstr "Пребазирането не е интерактивно"
+
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
+msgid "Could not init rewritten commits"
+msgstr "Списъкът с презаписаните подавания не може да бъде създаден"
 
-#: git-stash.sh:422
+#: git-rebase--interactive.sh:1291
 #, sh-format
-msgid "Too many revisions specified: $REV"
-msgstr "Указани са прекалено много версии: „${REV}“"
+msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
+msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
+msgstr[0] ""
+"Пребазиране на $shortrevisions върху $shortonto ($todocount команда)"
+msgstr[1] ""
+"Пребазиране на $shortrevisions върху $shortonto ($todocount команди)"
+
+#: git-rebase--interactive.sh:1296
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
+msgstr ""
+"\n"
+"Ако изтриете всичко, пребазирането ще бъде преустановено.\n"
+"\n"
 
-#: git-stash.sh:428
-#, sh-format
-msgid "$reference is not a valid reference"
-msgstr "Указателят „${reference}“ е грешен"
+#: git-rebase--interactive.sh:1303
+msgid "Note that empty commits are commented out"
+msgstr "Празните подавания са коментирани"
 
-#: git-stash.sh:456
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, sh-format
-msgid "'$args' is not a stash-like commit"
-msgstr "„${args}“ не е подаване, приличащо на нещо скатано"
+msgid "usage: $dashless $USAGE"
+msgstr "Употреба: $dashless $USAGE"
 
-#: git-stash.sh:467
+#: git-sh-setup.sh:190
 #, sh-format
-msgid "'$args' is not a stash reference"
-msgstr "„${args}“ не е указател към нещо скатано"
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr ""
+"Не може да се премине към „$cdup“ — основната директория на работното дърво."
 
-#: git-stash.sh:475
-msgid "unable to refresh index"
-msgstr "индексът не може да бъде обновен"
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
+#, sh-format
+msgid "fatal: $program_name cannot be used without a working tree."
+msgstr ""
+"ФАТАЛНА ГРЕШКА: „$program_name“ не може да се ползва без работно дърво."
 
-#: git-stash.sh:479
-msgid "Cannot apply a stash in the middle of a merge"
-msgstr "Ð\9fо Ð²Ñ\80еме Ð½Ð° Ñ\81ливане Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80иложиÑ\82е Ð½ÐµÑ\89о Ñ\81каÑ\82ано"
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
+msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80ебазиÑ\80аÑ\82е, Ð·Ð°Ñ\89оÑ\82о Ð¸Ð¼Ð° Ð¿Ñ\80омени, ÐºÐ¾Ð¸Ñ\82о Ð½Ðµ Ñ\81а Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а."
 
-#: git-stash.sh:487
-msgid "Conflicts in index. Try without --index."
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
-"В индекса има конфликти. Пробвайте да изпълните командата без опцията „--"
-"index“."
+"Не може да презапишете клоните, защото има промени, които не са в индекса."
 
-#: git-stash.sh:489
-msgid "Could not save index tree"
-msgstr "Дървото сочено от индекса не може да бъде запазено"
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr ""
+"Не можете да издърпвате при това пребазиране, защото има промени, които не "
+"са в индекса."
 
-#: git-stash.sh:523
-msgid "Cannot unstage modified files"
-msgstr "Променените файлове не могат да бъдат извадени от индекса"
+#: git-sh-setup.sh:229
+#, sh-format
+msgid "Cannot $action: You have unstaged changes."
+msgstr ""
+"Не можете да изпълните „$action“, защото има промени, които не са в индекса."
 
-#: git-stash.sh:538
-msgid "Index was not unstashed."
-msgstr "Ð\98ндекÑ\81Ñ\8aÑ\82 Ð½Ðµ Ðµ Ñ\81каÑ\82ан."
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
+msgstr "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80ебазиÑ\80аÑ\82е, Ð·Ð°Ñ\89оÑ\82о Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а Ð¸Ð¼Ð° Ð½ÐµÐ¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸ Ð¿Ñ\80омени."
 
-#: git-stash.sh:561
-#, sh-format
-msgid "Dropped ${REV} ($s)"
-msgstr "Изтрито е скатаното „${REV}“ ($s)"
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"Не можете да издърпвате при това пребазиране, защото в индекса има "
+"неподадени промени."
 
-#: git-stash.sh:562
+#: git-sh-setup.sh:248
 #, sh-format
-msgid "${REV}: Could not drop stash entry"
-msgstr "Скатаното „${REV}“ не може да бъде изтрито"
+msgid "Cannot $action: Your index contains uncommitted changes."
+msgstr ""
+"Не можете да изпълните „$action“, защото в индекса има неподадени промени."
 
-#: git-stash.sh:570
-msgid "No branch name specified"
-msgstr "Ð\9dе Ðµ Ñ\83казано Ð¸Ð¼Ðµ Ð½Ð° ÐºÐ»Ð¾Ð½"
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Ð\9eÑ\81вен Ñ\82ова Ð² Ð¸Ð½Ð´ÐµÐºÑ\81а Ð¸Ð¼Ð° Ð½ÐµÐ¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸ Ð¿Ñ\80омени."
 
-#: git-stash.sh:642
-msgid "(To restore them type \"git stash apply\")"
-msgstr "(За да ги възстановите, изпълнете командата „git stash apply“)"
+#: git-sh-setup.sh:372
+msgid "You need to run this command from the toplevel of the working tree."
+msgstr ""
+"Тази команда трябва да се изпълни от основната директория на работното дърво"
+
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
+msgstr "Абсолютният път на работното дърво не може да се определи"
+
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%14s %14s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "в индекса"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "извън индекса"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "двоично"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "нищо"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "няма промени"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "%d файл добавен\n"
+msgstr[1] "%d файла добавени\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "%d файл обновен\n"
+msgstr[1] "%d файла обновени\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "%d файл с отменени промени\n"
+msgstr[1] "%d файла с отменени промени\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "%d файл засегнат\n"
+msgstr[1] "%d файла засегнати\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "Обновяване"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "Отмяна"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "БЕЛЕЖКА: „%s“ вече не се следи.\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "Добавяне на неследени"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "Няма неследени файлове.\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"Ако кръпката може да се приложи чисто, редактираното парче ще бъде "
+"незабавно\n"
+"добавено към индекса"
 
-#: git-submodule.sh:219
-msgid "Relative path can only be used from the toplevel of the working tree"
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
 msgstr ""
-"Относителен път може да се ползва само от основната директория на работното "
-"дърво"
+"Ако кръпката може да се приложи чисто, редактираното парче ще бъде "
+"незабавно\n"
+"скътано"
 
-# FIXME - what is this regex?
-#: git-submodule.sh:229
-#, sh-format
-msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
 msgstr ""
-"адрес на хранилище: „${repo}“ трябва или да е абсолютен, или да започва с "
-"„./“ или „../“"
+"Ако кръпката може да се приложи чисто, редактираното парче ще бъде "
+"незабавно\n"
+"извадено от индекса."
 
-#: git-submodule.sh:246
-#, sh-format
-msgid "'$sm_path' already exists in the index"
-msgstr "„${sm_path}“ вече съществува в индекса"
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"Ако кръпката може да се приложи чисто, редактираното парче ще бъде "
+"незабавно\n"
+"набелязано за прилагане."
 
-#: git-submodule.sh:250
-#, sh-format
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
 msgid ""
-"The following path is ignored by one of your .gitignore files:\n"
-"$sm_path\n"
-"Use -f if you really want to add it."
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
 msgstr ""
-"СледниÑ\8fÑ\82 Ð¿Ñ\8aÑ\82 Ñ\81е Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80а Ð¿Ð¾Ñ\80ади Ð½Ñ\8fкой Ð¾Ñ\82 Ñ\84айловеÑ\82е â\80\9e.gitignoreâ\80\9c:\n"
-"${sm_path}\n"
-"Ð\98зползвайÑ\82е Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e-fâ\80\9c, Ð°ÐºÐ¾ Ð·Ð° Ð´Ð° Ð³Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82е Ð½Ð°Ð¸Ñ\81Ñ\82ина."
+"Ð\90ко ÐºÑ\80Ñ\8aпкаÑ\82а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80иложи Ñ\87иÑ\81Ñ\82о, Ñ\80едакÑ\82иÑ\80аноÑ\82о Ð¿Ð°Ñ\80Ñ\87е Ñ\89е Ð±Ñ\8aде "
+"незабавно\n"
+"набелÑ\8fзано Ð·Ð° Ð·Ð°Ð½Ñ\83лÑ\8fване."
 
-#: git-submodule.sh:268
-#, sh-format
-msgid "Adding existing repo at '$sm_path' to the index"
-msgstr "Добавяне на съществуващото хранилище в „${sm_path}“ към индекса"
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr "файлът за редактиране на парчето код не може да бъде отворен: „%s“"
 
-#: git-submodule.sh:270
-#, sh-format
-msgid "'$sm_path' already exists and is not a valid git repo"
-msgstr "„${sm_path}“ съществува, а не е хранилище на Git"
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr "Ръчно редактиране на парчета код — отдолу има подсказка.\n"
 
-#: git-submodule.sh:278
-#, sh-format
-msgid "A git directory for '$sm_name' is found locally with remote(s):"
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"———\n"
+"За да пропуснете редовете започващи с „%s“ — заменете знака със „ “ (стават "
+"контекст)\n"
+"За да пропуснете редовете започващи с „%s“ — изтрийте ги.\n"
+"Редовете, които започват с „%s“ ще бъдат пропуснати.\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
 msgstr ""
-"Открита е локална директория на Git — „${sm_name}“, която сочи към "
-"отдалечените хранилища:"
+"Ако е невъзможно чисто прилагане на кода, ще може пак да редактирате.  Ако\n"
+"изтриете всички редове от парчето код, то ще бъде оставено непроменено, а\n"
+"редактирането — отказано.\n"
 
-#: git-submodule.sh:280
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
 msgstr ""
-"Ако искате да преизползвате тази локална директория на Git вместо да отново "
-"да клонирате:"
+"файлът за редактиране на парчето код не може да бъде отворен за четене: „%s“"
 
-#: git-submodule.sh:282
-#, sh-format
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
 msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
 msgstr ""
-"използвайте опцията „--force“. Ако локалната директория не сочи към "
-"правилното отдалечено хранилище"
+"Редактираното парче не може да се приложи. Да се продължи ли с "
+"редактирането? (текущите редакции ще се отменят при отказ!): „y“ (да)/ "
+"„n“ (не)? "
 
-#: git-submodule.sh:283
-#, sh-format
+#: git-add--interactive.perl:1187
 msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y — добавяне на парчето в индекса\n"
+"n — без добавяне на парчето в индекса\n"
+"q — изход, без добавяне на това и всички оставащи парчета от файла\n"
+"a — добавяне на това и всички следващи парчета от файла в индекса\n"
+"d — без добавяне на това и всички следващи парчета от файла в индекса"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y — скатаване на парчето\n"
+"n — без скатаване на парчето\n"
+"q — изход, без скатаване на това и всички оставащи парчета\n"
+"a — скатаване на това и всички следващи парчета от файла\n"
+"d — без скатаване на това и всички следващи парчета от файла"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y — изваждане на парчето от индекса\n"
+"n — без изваждане на парчето от индекса\n"
+"q — изход, без изваждане на това и всички оставащи парчета от индекса\n"
+"a — изваждане на това и всички следващи парчета от файла от индекса\n"
+"d — без изваждане на това и всички следващи парчета от файла от индекса"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y — прилагане на парчето към индекса\n"
+"n — без прилагане на парчето към индекса\n"
+"q — изход, без прилагане на това и всички оставащи парчета към индекса\n"
+"a — прилагане на това и всички следващи парчета от файла към индекса\n"
+"d — без прилагане на това и всички следващи парчета от файла към индекса"
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y — премахване на парчето от работното дърво\n"
+"n — без премахване на парчето от работното дърво\n"
+"q — изход, без премахване на това и всички оставащи парчета от работното "
+"дърво\n"
+"a — премахване на това и всички следващи парчета от файла от работното "
+"дърво\n"
+"d — без премахване на това и всички следващи парчета от файла от работното "
+"дърво"
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y — премахване на парчето от индекса и работното дърво\n"
+"n — без премахване на парчето от индекса и работното дърво\n"
+"q — изход, без премахване на това и всички оставащи парчета от индекса и "
+"работното дърво\n"
+"a — премахване на това и всички следващи парчета от файла от индекса и "
+"работното дърво\n"
+"d — без премахване на това и всички следващи парчета от файла от индекса и "
+"работното дърво"
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y — прилагане на парчето от индекса и работното дърво\n"
+"n — без прилагане на парчето от индекса и работното дърво\n"
+"q — изход, без прилагане на това и всички оставащи парчета от индекса и "
+"работното дърво\n"
+"a — прилагане на това и всички следващи парчета от файла от индекса и "
+"работното дърво\n"
+"d — без прилагане на това и всички следващи парчета от файла от индекса и "
+"работното дърво"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g — избор към кое парче да се премине\n"
+"/ — търсене на парче, напасващо към даден регулярен израз\n"
+"j — без решение за парчето, към следващото парче без решение\n"
+"J — без решение за парчето, към следващото парче\n"
+"k — без решение за парчето, към предишното парче без решение\n"
+"K — без решение за парчето, към предишното парче\n"
+"s — разделяне на текущото парче на по-малки\n"
+"e — ръчно редактиране на текущото парче\n"
+"? — извеждане не помощта\n"
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "Избраните парчета не могат да се добавят в индекса!\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "Да се приложат ли към работното дърво? "
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "Нищо не е приложено.\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "пренебрегване на неслятото: „%s“\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "Само двоични файлове са променени.\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "Няма промени.\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "Обновяване на кръпка"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Добавяне на промяната на правата за достъп [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Добавяне на изтриването [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Добавяне на това парче [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Скатаване на промяната на правата за достъп [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Скатаване на изтриването [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Скатаване на това парче [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Изваждане на промяната на правата за достъп [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Изваждане на изтриването [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Изваждане на това парче [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Прилагане на промяната на правата за достъп към индекса [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "Прилагане на изтриването към индекса [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "Прилагане на това парче към индекса [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Премахване на промяната в правата за достъп от работното дърво [y,n,q,a,d,/"
+"%s,?]? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Премахване на изтриването от работното дърво [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Премахване на парчето от работното дърво [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Премахване на промяната в правата за достъп от индекса и работното дърво [y,"
+"n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Премахване на изтриването от индекса и работното дърво [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Премахване на парчето от индекса и работното дърво [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Прилагане на промяната в правата за достъп от индекса и работното дърво [y,n,"
+"q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Прилагане на изтриването от индекса и работното дърво [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Прилагане на парчето от индекса и работното дърво [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "към кое парче да се придвижи (за повече варианти натиснете „enter“)? "
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "към кое парче да се придвижи? "
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "Неправилен номер: „%s“\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "Има само %d парче.\n"
+msgstr[1] "Има само %d парчета.\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "да се търси с регулярен израз? "
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "Сгрешен регулярен израз „%s“: %s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "Никое парче не напасва на регулярния израз\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "Няма друго парче преди това\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "Няма друго парче след това\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "Разделяне на %d парче.\n"
+msgstr[1] "Разделяне на %d парчета.\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "Преглед на разликата"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        — извеждане на пътищата с промените\n"
+"update        — добавяне на състоянието на работното дърво към промените в\n"
+"                индекса\n"
+"revert        — отмяна на промените в индекса към състоянието сочено от "
+"„HEAD“\n"
+"patch         — избиране на парчета код и обновяване поединично\n"
+"diff          — извеждане на разликата между състоянието на соченото от "
+"„HEAD“\n"
+"                и индекса\n"
+"add untracked — добавяне на неследените файлове към промените в индекса\n"
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "„--“ липсва"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "неизвестна стратегия за прилагане на кръпка: „%s“"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "указан е неправилен аргумент „%s“, а се очаква „--“."
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr ""
+"разликата между местния часови пояс и GMT съдържа дробна част от минута\n"
+"\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "разликата между местния часовия пояс и GMT е 24 часа или повече\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
 msgstr ""
-"или не сте сигурни какво означава всичко това, просто задайте друго име като "
-"аргумент на опцията „--name“."
+"текстовият редактор приключи работата с грешка, всичко се преустановява"
 
-# FIXME активиране - какво всъщност става
-#: git-submodule.sh:285
-#, sh-format
-msgid "Reactivating local git directory for submodule '$sm_name'."
-msgstr "Активиране на локалното хранилище за подмодула „${sm_name}“ наново."
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr "„%s“ съдържа временна версия на подготвяното е-писмо.\n"
 
-#: git-submodule.sh:297
-#, sh-format
-msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Подмодулът „${sm_path}“ не може да бъде изтеглен"
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "„%s.final“ съдържа подготвеното е-писмо.\n"
 
-#: git-submodule.sh:302
-#, sh-format
-msgid "Failed to add submodule '$sm_path'"
-msgstr "Неуспешно добавяне на подмодула „${sm_path}“"
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "опцията „--dump-aliases“ е несъвместима с другите опции\n"
 
-#: git-submodule.sh:311
-#, sh-format
-msgid "Failed to register submodule '$sm_path'"
-msgstr "Неуспешно регистриране на подмодула „${sm_path}“"
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "Командата „git format-patch“ не може да се изпълни извън хранилище\n"
 
-#: git-submodule.sh:355
-#, sh-format
-msgid "Entering '$displaypath'"
-msgstr "Ð\92лизане Ð² â\80\9e${displaypath}â\80\9c"
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "Ð\9dепознаÑ\82о Ð¿Ð¾Ð»Ðµ Ð·Ð° Ð¾Ð¿Ñ\86иÑ\8fÑ\82а â\80\9e--suppress-ccâ\80\9c: â\80\9e%sâ\80\9c\n"
 
-#: git-submodule.sh:375
-#, sh-format
-msgid "Stopping at '$displaypath'; script returned non-zero status."
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "Непозната стойност за „--confirm“: %s\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
 msgstr ""
-"Спиране при „${displaypath}“ — изходният код от скрипта бе различен от 0."
+"ПРЕДУПРЕЖДЕНИЕ: синоними за sendmail съдържащи кавички („\"“) не се "
+"поддържат: %s\n"
 
-#: git-submodule.sh:448
-#, sh-format
-msgid "pathspec and --all are incompatible"
-msgstr "указването на път е несъвместимо с опцията „--all“"
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: „:include:“ не се поддържа: %s\n"
 
-#: git-submodule.sh:453
-#, sh-format
-msgid "Use '--all' if you really want to deinitialize all submodules"
-msgstr "Използвайте „--all“, за да премахнете всички подмодули"
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: пренасочвания „/file“ или „|pipe“ не се поддържат: %s\n"
 
-#: git-submodule.sh:470
-#, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: редът за „sendmail“ не е разпознат: %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
 msgstr ""
-"Пътят към подмодул „${displaypath}“ в работното дърво съдържа директория „."
-"git“"
+"Файлът „%s“ съществува, но името може да означава и диапазон от подавания,\n"
+"за който да се създадат кръпки.  Може изрично да укажете значението като:\n"
+"\n"
+"    ● укажете „./%s“ за файл;\n"
+"    ● използвате опцията „--format-patch“ за диапазон.\n"
 
-#: git-submodule.sh:471
-#, sh-format
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "Директорията „%s“ не може да се отвори: %s"
+
+#: git-send-email.perl:634
+#, perl-format
 msgid ""
-"(use 'rm -rf' if you really want to remove it including all of its history)"
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
 msgstr ""
-"(използвайте командата „rm -rf“, за да го изтриете заедно с цялата му "
-"иÑ\81Ñ\82оÑ\80иÑ\8f)"
+"ФАТАЛНА ГРЕШКА: %s: %s\n"
+"Ð\9fРÐ\95Ð\94УÐ\9fРÐ\95Ð\96Ð\94Ð\95Ð\9dÐ\98Ð\95: Ð½Ðµ Ñ\81а Ð¿Ñ\80аÑ\82ени Ð½Ð¸ÐºÐ°ÐºÐ²Ð¸ ÐºÑ\80Ñ\8aпки\n"
 
-#: git-submodule.sh:477
-#, sh-format
+#: git-send-email.perl:645
 msgid ""
-"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
-"discard them"
+"\n"
+"No patch files specified!\n"
+"\n"
 msgstr ""
-"Пътят към подмодул „${displaypath}“ в работното дърво съдържа локални "
-"промени. Можете да ги пренебрегнете и отмените с опцията „-f“"
+"\n"
+"Не са указани кръпки!\n"
+"\n"
 
-#: git-submodule.sh:480
-#, sh-format
-msgid "Cleared directory '$displaypath'"
-msgstr "Ð\94иÑ\80екÑ\82оÑ\80иÑ\8fÑ\82а â\80\9e${displaypath}â\80\9c Ðµ Ð¸Ð·Ñ\87иÑ\81Ñ\82ена"
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "Ð\92 â\80\9e%sâ\80\9c Ð»Ð¸Ð¿Ñ\81ва Ñ\82ема"
 
-#: git-submodule.sh:481
-#, sh-format
-msgid "Could not remove submodule work tree '$displaypath'"
-msgstr ""
-"Директорията към работното дърво на подмодула „${displaypath}“ не може да "
-"бъде изтрита"
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "„%s“ не може да се отвори за запис: %s"
 
-#: git-submodule.sh:484
-#, sh-format
-msgid "Could not create empty submodule directory '$displaypath'"
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
 msgstr ""
-"Празната директория за подмодула „${displaypath}“ не може да бъде създадена"
+"Редовете започващи с „GIT:“ ще бъдат прескачани.\n"
+"Добре е да включите статистика на разликите или някаква таблица на "
+"съдържанието\n"
+"на подготвяната кръпка.\n"
+"\n"
+"Изтрийте всичко, ако не искате да изпратите обобщаващо писмо.\n"
 
-#: git-submodule.sh:493
-#, sh-format
-msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
-msgstr ""
-"Премахната е регистрацията на подмодул „${name}“, сочещ към адрес „${url}“, "
-"за пътя „${displaypath}“"
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "„%s.final“ не може да се отвори: %s"
 
-#: git-submodule.sh:635
-#, sh-format
-msgid "Unable to find current revision in submodule path '$displaypath'"
-msgstr "Текущата версия за подмодула в „${displaypath}“ липсва"
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "„%s“ не може да се отвори: %s"
 
-#: git-submodule.sh:644
-#, sh-format
-msgid "Unable to fetch in submodule path '$sm_path'"
-msgstr "Неуспешно доставяне в пътя към подмодул „${sm_path}“"
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr ""
+"Полетата „To“/„Cc“/„Bcc“ все още не се интерпретират. Те бяха прескочени\n"
 
-#: git-submodule.sh:667
-#, sh-format
-msgid "Unable to fetch in submodule path '$displaypath'"
-msgstr "Неуспешно доставяне в пътя към подмодул „${displaypath}“"
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "Обобщаващото писмо е празно и се прескача\n"
 
-#: git-submodule.sh:680
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "Сигурни ли сте, че искате да ползвате „%s“ [y/N]? "
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
 msgstr ""
-"Неуспешно изтегляне на версия „${sha1}“ в пътя към подмодул „${displaypath}“'"
+"Следните файлове са 8 битови, но не са с обявена заглавна част „Content-"
+"Transfer-Encoding“.\n"
 
-#: git-submodule.sh:681
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Път към подмодул „${displaypath}“: изтеглена е версия „${sha1}“"
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "Кое 8 битово кодиране се ползва [стандартно: UTF-8]? "
 
-#: git-submodule.sh:685
-#, sh-format
-msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
 msgstr ""
-"Неуспешно пребазиране на версия „${sha1}“ в пътя към подмодул "
-"„${displaypath}“"
+"Нищо няма да се прати, защото кръпката\n"
+"    %s\n"
+"все още е с шаблонното заглавие „*** SUBJECT HERE ***“.  Ползвайте опцията\n"
+"„--force“, ако сте сигурни, че точно това искате да изпратите.\n"
 
-#: git-submodule.sh:686
-#, sh-format
-msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr "Път към подмодул „${displaypath}“: пребазиране върху версия „${sha1}“"
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "На кой да се пратят е-писмата (незадължително поле)"
 
-#: git-submodule.sh:691
-#, sh-format
-msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "ФАТАЛНА ГРЕШКА: „%s“ е синоним на себе си\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
 msgstr ""
-"Неуспешно сливане на версия „${sha1}“ в пътя към подмодул „${displaypath}“"
+"Идентификатор на съобщение „Message-ID“, което да се използва за обявяването "
+"на отговор „In-Reply-To“ (незадължително поле)"
 
-#: git-submodule.sh:692
-#, sh-format
-msgid "Submodule path '$displaypath': merged in '$sha1'"
-msgstr "Ð\9fÑ\8aÑ\82 ÐºÑ\8aм Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л â\80\9e${displaypath}â\80\9c: Ñ\81ливане Ñ\81 Ð²ÐµÑ\80Ñ\81иÑ\8f â\80\9e${sha1}â\80\9c"
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "Ð\93РÐ\95ШÐ\9aÐ\90: Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð²Ð»ÐµÑ\87е Ð°Ð´Ñ\80еÑ\81 Ð¾Ñ\82 â\80\9e%sâ\80\9c\n"
 
-#: git-submodule.sh:697
-#, sh-format
-msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
 msgstr ""
-"Ð\9dеÑ\83Ñ\81пеÑ\88но Ð¸Ð·Ð¿Ñ\8aлнение Ð½Ð° ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\82а â\80\9e${command} ${sha1}â\80\9c Ð² Ð¿Ñ\8aÑ\82Ñ\8f ÐºÑ\8aм Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л "
-"„${displaypath}“"
+"Ð\9aакво Ð´Ð° Ñ\81е Ð½Ð°Ð¿Ñ\80ави Ñ\81 Ñ\82ози Ð°Ð´Ñ\80еÑ\81? â\80\9e\80\9c (Ñ\81пиÑ\80ане), â\80\9e\80\9c (изÑ\82Ñ\80иване), "
+"„e“ (редактиране): "
 
-#: git-submodule.sh:698
-#, sh-format
-msgid "Submodule path '$displaypath': '$command $sha1'"
-msgstr "Път към подмодул „${displaypath}“: „${command} ${sha1}“"
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "Пътят към сертификат „%s“ не съществува."
 
-#: git-submodule.sh:729
-#, sh-format
-msgid "Failed to recurse into submodule path '$displaypath'"
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
 msgstr ""
-"Неуспешна обработка на поддиректориите в пътя към подмодул „${displaypath}“"
+"    Към списъка с получателите („Cc“) са добавени и другите\n"
+"    адреси на е-поща, които са упоменати в съобщението за\n"
+"    подаване на кръпката.  Стандартно командата „send-email“\n"
+"    пита за това преди изпращане.  Можете да премените това\n"
+"    поведение чрез настройката „sendemail.confirm“.\n"
+"\n"
+"    Командата „git send-email --help“ предоставя още\n"
+"    информация.  За да запазите текущото поведение и да не\n"
+"    получавате повече това съобщение, изпълнете:\n"
+"    „git config --global sendemail.confirm auto“.\n"
+"\n"
 
-#: git-submodule.sh:837
-msgid "The --cached option cannot be used with the --files option"
-msgstr "Опциите „--cached“ и „--files“ са несъвместими"
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr ""
+"Изпращане на е-писмото? „y“ (да), „n“ (не), „q“ (изход), „a“ (всичко): "
 
-#: git-submodule.sh:889
-#, sh-format
-msgid "unexpected mode $mod_dst"
-msgstr "неочакван режим „${mod_dst}“"
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "Изискване на отговор към това е-писмо"
 
-#: git-submodule.sh:909
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_src"
-msgstr ""
-"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_src}“"
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "Сървърът за SMTP не е настроен правилно."
 
-#: git-submodule.sh:912
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
-msgstr ""
-"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_dst}“"
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "Сървърът не поддържа „STARTTLS“! %s"
 
-#: git-submodule.sh:915
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
 msgstr ""
-"  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа никое от подаванията "
-"„${sha1_src}“ и „${sha1_dst}“"
+"Подсистемата за SMTP не може да се инициализира. Проверете настройките и "
+"използвайте опцията: „--smtp-debug“."
 
-#: git-submodule.sh:940
-msgid "blob"
-msgstr "обект BLOB"
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "„%s“ не може да бъде изпратен\n"
 
-#: git-submodule.sh:1059
-#, sh-format
-msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr ""
-"Неуспешна обработка на поддиректориите в пътя към подмодул „${sm_path}“"
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "Проба за изпращане на „%s“\n"
 
-#: git-submodule.sh:1123
-#, sh-format
-msgid "Synchronizing submodule url for '$displaypath'"
-msgstr "СинÑ\85Ñ\80онизиÑ\80ане Ð½Ð° Ð°Ð´Ñ\80еÑ\81а Ð·Ð° Ð¿Ñ\8aÑ\82Ñ\8f ÐºÑ\8aм Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л â\80\9e${displaypath}â\80\9c"
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "Ð\98зпÑ\80аÑ\89ане Ð½Ð° â\80\9e%sâ\80\9c\n"
 
-#: git-parse-remote.sh:89
-#, sh-format
-msgid "See git-${cmd}(1) for details."
-msgstr "За повече информация погледнете ръководството на „git-${cmd}(1)“"
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "Успех при пробата. От журнала:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "Успех. От журнала:\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "Резултат: "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "Резултат: успех\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "файлът „%s“ не може да бъде отворен"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) Добавяне на „як: %s“ от ред „%s“\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) Добавяне на „до: %s“ от ред „%s“\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(не-mbox) Добавяне на „як: %s“ от ред „%s“\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(тяло) Добавяне на „як: %s“ от ред „%s“\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) Не може да бъде се изпълни „%s“"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) Добавяне на „%s: %s“ от: „%s“\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) програмният канал не може да се затвори за изпълнението на „%s“"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "съобщението не може да се изпрати чрез 7 битови знаци"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "неправилно кодиране за пренос"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "„%s“ не може да се отвори: %s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "„%s“: кръпката съдържа ред с над 988 знака"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "„%s“ се пропуска, защото е с разширение за архивен файл: „%s“.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "Наистина ли искате да изпратите „%s“? [y|N]: "
index 30e00e2b5886a34edc33fb528195241290c44cf5..40c51596f5ac6e55e43693cf0b4f28204e9082de 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -1,22 +1,56 @@
 # Catalan translations for Git.
 # Copyright (C) 2014 Alex Henrie <alexhenrie24@gmail.com>
 # This file is distributed under the same license as the Git package.
-# Alex Henrie <alexhenrie24@gmail.com>, 2014.
+# Alex Henrie <alexhenrie24@gmail.com>, 2014-2016.
+# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2016-2017
 #
+# Terminologia i criteris utilitzats 
+#
+#   Anglès           |  Català
+#   -----------------+---------------------------------
+#   ahead            |  davant per
+#   amend            |  esmenar
+#   broken           |  malmès
+#   delta            |  diferència
+#   dry              |  simulació
+#   deprecated       |  en desús
+#   hunk             |  tros
+#   not supported    |  no està admès
+#   repository       |  dipòsit
+#   skip             |  ometre
+#   token            |  testimoni
+#
+# Alguns termes que són comandes específiques del git i d'àmbit molt tècnic
+# hem decidit no traduir-los per facilitar-ne la compressió a l'usuari i perquè
+# no tenen una transcendència al gran públic. Es tracta de casos similars
+# a «ping» en l'àmbit de xarxes.
+#
+# Termes que mantenim en anglès:
+#
+#
+#   Anglès           |  Català
+#   -----------------+---------------------------------
+#   blame            |  «blame»
+#   HEAD             |  HEAD (f, la branca)
+#   cherry pick      |  «cherry pick»
+#   rebase           |  «rebase»
+#   stage            |  «stage»
+#   squash           |  «squash»
+#   unstage          |  «unstage»
 msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-08-28 10:32-0600\n"
-"Last-Translator: Alex Henrie <alexhenrie24@gmail.com>\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
+"PO-Revision-Date: 2017-05-07 19:55+0100\n"
+"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
 "Language-Team: Catalan\n"
 "Language: ca\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.8.8\n"
+"X-Generator: Poedit 1.8.9\n"
 
 #: advice.c:55
 #, c-format
@@ -25,7 +59,7 @@ msgstr "pista: %.*s\n"
 
 #: advice.c:83
 msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr "Recollir cireres no és possible perquè teniu fitxers no fusionats."
+msgstr "Fer «cherry pick» no és possible perquè teniu fitxers no fusionats."
 
 #: advice.c:85
 msgid "Committing is not possible because you have unmerged files."
@@ -37,7 +71,7 @@ msgstr "Fusionar no és possible perquè teniu fitxers no fusionats."
 
 #: advice.c:89
 msgid "Pulling is not possible because you have unmerged files."
-msgstr "Baixar no es possible perquè teniu fitxers no fusionats."
+msgstr "Baixar no és possible perquè teniu fitxers no fusionats."
 
 #: advice.c:91
 msgid "Reverting is not possible because you have unmerged files."
@@ -46,7 +80,7 @@ msgstr "Revertir no és possible perquè teniu fitxers no fusionats."
 #: advice.c:93
 #, c-format
 msgid "It is not possible to %s because you have unmerged files."
-msgstr "No es possible %s perquè teniu fitxers no fusionats."
+msgstr "No és possible %s perquè teniu fitxers no fusionats."
 
 #: advice.c:101
 msgid ""
@@ -61,7 +95,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "S'està sortint a causa d'un conflicte no resolt."
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "No heu conclòs la vostra fusió (MERGE_HEAD existeix)."
 
@@ -91,7 +125,7 @@ msgstr ""
 "Avís: s'està agafant '%s'.\n"
 "\n"
 "Esteu en un estat de 'HEAD separat'. Podeu mirar al voltant, fer canvis\n"
-"experimentals i cometre-los i podeu descartar qualsevulla comissió que feu\n"
+"experimentals i cometre-los i podeu descartar qualsevol comissió que feu\n"
 "en aquest estat sense impactar cap branca realitzant un altre agafament.\n"
 "\n"
 "Si voleu crear una branca nova per a conservar les comissions que creeu,\n"
@@ -100,3957 +134,5034 @@ msgstr ""
 "\n"
 "  git checkout -b <nom-de-branca-nova>\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<opcions>] <arbre> [<camí>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "opció d'espai en blanc '%s' no reconeguda"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "opció d'ignora l'espai en blanc '%s' no reconeguda"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <dipòsit> [--exec <ordre>] [<opcions>] <arbre> "
-"[<camí>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject i --3way no es poden usar junts."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <dipòsit> [--exec <ordre>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached i --3way no es poden usar junts."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "L'especificació de camí '%s' no ha coincidit amb cap fitxer"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way fora d'un dipòsit"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "format"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index fora d'un dipòsit"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "format d'arxiu"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached fora d'un dipòsit"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "prefix"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "No es pot preparar l'expressió regular de marca de temps %s"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "anteposa el prefix a cada nom de camí en l'arxiu"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec ha retornat %d per l'entrada: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "fitxer"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "no s'ha pogut trobar el nom de fitxer en el pedaç a la línia %d"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "escriu l'arxiu a aquest fitxer"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply: git-diff dolent - /dev/null esperat, %s rebut en la línia %d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "llegeix .gitattributes en el directori de treball"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply: git-diff dolent - nom de fitxer nou inconsistent en la línia %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "informa de fitxers arxivats en stderr"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: git-diff dolent - nom de fitxer antic inconsistent en la línia %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "només emmagatzema"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: git-diff dolent - /dev/null esperat en la línia %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "comprimeix més ràpidament"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recompte: línia inesperada: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "comprimeix millor"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "fragment de pedaç sense capçalera a la línia %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "allista els formats d'arxiu admesos"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
+"%d component de nom de camí inicial (línia %d)"
+msgstr[1] ""
+"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
+"%d components de nom de camí inicial (línia %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "dipòsit"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr ""
+"a la capçalera de git diff li manca informació de nom de fitxer (línia %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "recupera l'arxiu del dipòsit remot <dipòsit>"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "el fitxer nou depèn dels continguts antics"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "ordre"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "el fitxer suprimit encara té continguts"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "camí a l'ordre git-upload-archive remota"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "pedaç malmès a la línia %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Opció inesperada --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "el fitxer nou %s depèn dels continguts antics"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "L'opció --exec només es pot usar junt amb --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "el fitxer suprimit %s encara té continguts"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Opció inesperada --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** advertència: el fitxer %s queda buit però no se suprimeix"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Format d'arxiu desconegut '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "pedaç binari malmès a la línia %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Paràmetre no admet per al format '%s': -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "pedaç binari no reconegut a la línia %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Els patrons negatius s'ignoren en els atributs de git\n"
-"Useu '\\!' per exclamació capdavantera literal."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "pedaç amb només escombraries a la línia %d"
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "No s'ha pogut obrir el fitxer '%s'"
+msgid "unable to read symlink %s"
+msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Comentari amb cometes dolentes en el fitxer '%s': %s"
+msgid "unable to open or read %s"
+msgstr "no s'ha pogut obrir o llegir %s"
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "No podem bisecar més!\n"
+msgid "invalid start of line: '%c'"
+msgstr "inici de línia no vàlid: '%c'"
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "No és un nom de comissió vàlid %s"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "El tros #%d ha tingut èxit a %d (desplaçament d'%d línia)."
+msgstr[1] "El tros #%d ha tingut èxit a %d (desplaçament de %d línies)."
 
-#: bisect.c:732
+#: apply.c:3053
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"La base de fusió %s és dolenta.\n"
-"Això vol dir que el defecte s'ha arreglat entre %s i [%s].\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "El context s'ha reduït a (%ld/%ld) per a aplicar el fragment a %d"
 
-#: bisect.c:737
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"La base de fusió %s és nova.\n"
-"La propietat s'ha canviat entre %s i [%s].\n"
+"tot cercant:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-"La base de fusió %s és %s.\n"
-"Això vol dir que la primera comissió '%s' és entre %s i [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "manquen les dades de pedaç binari de '%s'"
 
-#: bisect.c:750
+#: apply.c:3089
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr "no es pot aplicar al revés un pedaç binari sense el tros revés a '%s'"
+
+#: apply.c:3135
+#, c-format
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"Unes %s revisions no són els avantpassats de la revisió %s.\n"
-"git bisect no pot funcionar correctament en aquest cas.\n"
-"Potser heu confós les revisions %s i %s?\n"
+"no es pot aplicar un pedaç binari a '%s' sense la línia d'índex completa"
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"s'ha de saltar la base de fusió entre %s i [%s].\n"
-"Llavors, no podem estar segurs que la primera comissió %s sigui entre %s i "
-"%s.\n"
-"Continuem de totes maneres."
+"el pedaç s'aplica a '%s' (%s), el qual no coincideix amb els continguts "
+"actuals."
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "Bisecant: s'ha de provar una base de fusió\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "el pedaç s'aplica a un '%s' buit però no és buit"
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
-msgstr "es necessita una revisió %s"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "no es pot llegir la postimatge %s necessària per a '%s'"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
-msgstr "no s'ha pogut crear el fitxer '%s'"
+msgid "binary patch does not apply to '%s'"
+msgstr "el pedaç binari no s'aplica a '%s'"
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
-msgstr "no s'ha pogut llegir el fitxer '%s'"
-
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "la lectura de les referències de bisecció ha fallat"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"el pedaç binari a '%s' crea un resultat incorrecte (esperant %s, %s rebut)"
 
-#: bisect.c:967
+#: apply.c:3211
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s era ambdós %s i %s\n"
+msgid "patch failed: %s:%ld"
+msgstr "el pedaç ha fallat: %s:%ld"
 
-#: bisect.c:975
+#: apply.c:3333
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"No s'ha trobat cap comissió provable.\n"
-"Potser heu començat amb paràmetres de camí dolents?\n"
+msgid "cannot checkout %s"
+msgstr "no es pot agafar %s"
 
-#: bisect.c:994
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(aproximadament %d pas)"
-msgstr[1] "(aproximadament %d passos)"
+msgid "failed to read %s"
+msgstr "s'ha produït un error en llegir %s"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3389
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "Bisecant: manca %d revisió a provar després d'aquesta %s\n"
-msgstr[1] "Bisecant: manquen %d revisions a provar després d'aquesta %s\n"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "s'està llegint de '%s' més enllà d'un enllaç simbòlic"
 
-#: branch.c:53
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"Després de corregir la causa de l'error, podeu\n"
-"intentar corregir la informació de seguiment remot\n"
-"invocant \"git branch --set-upstream-to=%s%s%s\"."
+msgid "path %s has been renamed/deleted"
+msgstr "el camí %s s'ha canviat de nom / s'ha suprimit"
 
-#: branch.c:67
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "No s'està establint la branca %s com a la seva pròpia font."
+msgid "%s: does not exist in index"
+msgstr "%s: no existeix en l'índex"
 
-#: branch.c:93
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr ""
-"La branca %s està configurada per a seguir la branca remota %s de %s per "
-"rebasar."
-
-#: branch.c:94
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "La branca %s està configurada per a seguir la branca remota %s de %s."
+msgid "%s: does not match index"
+msgstr "%s: no coincideix amb l'índex"
 
-#: branch.c:98
-#, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
-"La branca %s està configurada per a seguir la branca local %s per rebasar."
+"al dipòsit li manca el blob necessari per a retrocedir a una fusió de 3 vies."
 
-#: branch.c:99
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "La branca %s està configurada per a seguir la branca local %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "S'està retrocedint a una fusió de 3 vies...\n"
 
-#: branch.c:104
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
-"La branca %s està configurada per a seguir la referència remota %s per "
-"rebasar."
+msgid "cannot read the current contents of '%s'"
+msgstr "no es poden llegir els continguts actuals de '%s'"
 
-#: branch.c:105
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "La branca %s està configurada per a seguir la referència remota %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "S'ha produït un error en retrocedir a una fusió de 3 vies...\n"
 
-#: branch.c:109
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"La branca %s està configurada per a seguir la referència local %s per "
-"rebasar."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "S'ha aplicat el pedaç a '%s' amb conflictes.\n"
 
-#: branch.c:110
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "La branca %s està configurada per a seguir la referència local %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "S'ha aplicat el pedaç a '%s' netament.\n"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "No es pot escriure la configuració de la branca font"
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "el pedaç d'eliminació deixa els continguts dels fitxers"
 
-#: branch.c:156
+#: apply.c:3697
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "No seguint: informació ambigua per a la referència %s"
+msgid "%s: wrong type"
+msgstr "%s: tipus erroni"
 
-#: branch.c:185
+#: apply.c:3699
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' no és un nom de branca vàlid."
+msgid "%s has type %o, expected %o"
+msgstr "%s és del tipus %o, s'esperava %o"
 
-#: branch.c:190
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Una branca amb nom '%s' ja existeix."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "No es pot actualitzar la branca actual a la força."
+msgid "invalid path '%s'"
+msgstr "camí no vàlid: %s"
 
-#: branch.c:218
+#: apply.c:3908
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"No es pot configurar la informació de seguiment; el punt inicial '%s' no és "
-"una branca."
+msgid "%s: already exists in index"
+msgstr "%s: ja existeix en l'índex"
 
-#: branch.c:220
+#: apply.c:3911
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "la branca font demanada '%s' no existeix"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Si teniu pensat basar el vostre treball en una branca\n"
-"font que ja existeix al remot, pot ser que necessiteu\n"
-"executar \"git fetch\" per a obtenir-la.\n"
-"\n"
-"Si teniu pensat pujar una branca local nova que seguirà\n"
-"la seva contrapart remota, pot ser que vulgueu usar\n"
-"\"git push -u\" per a establir la configuració font\n"
-"mentre pugeu."
+msgid "%s: already exists in working directory"
+msgstr "%s: ja existeix en el directori de treball"
 
-#: branch.c:266
+#: apply.c:3931
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "No és un nom d'objecte vàlid: '%s'."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o)"
 
-#: branch.c:286
+#: apply.c:3936
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Nom d'objecte ambigu: '%s'."
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o) de %s"
 
-#: branch.c:291
+#: apply.c:3956
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "No és un punt de ramificació vàlid: '%s'."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "el fitxer afectat '%s' és més enllà d'un enllaç simbòlic"
 
-#: branch.c:345
+#: apply.c:3960
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' ja s'ha agafat a '%s'"
+msgid "%s: patch does not apply"
+msgstr "%s: el pedaç no s'aplica"
 
-#: branch.c:364
+#: apply.c:3975
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "La HEAD de l'arbre de treball %s no està actualitzat"
+msgid "Checking patch %s..."
+msgstr "S'està comprovant el pedaç %s..."
 
-#: bundle.c:34
+#: apply.c:4066
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' no sembla un fitxer de farcell v2"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "falta la informació sha1 o és inútil per al submòdul %s"
 
-#: bundle.c:61
+#: apply.c:4073
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "capçalera no reconeguda: %s%s (%d)"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "canvi de mode per a %s, el qual no està en el HEAD actual"
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4076
 #, c-format
-msgid "could not open '%s'"
-msgstr "no s'ha pogut obrir '%s'"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "falta informació sha1 o és inútil (%s)."
 
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Al dipòsit li manquen aquestes comissions prerequisits:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "la configuració del passeig per revisions ha fallat"
-
-#: bundle.c:185
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "El farcell conté aquesta referència:"
-msgstr[1] "El farcell conté aquestes %d referències:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "El farcell registra una història completa."
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry ha fallat per al camí '%s'"
 
-#: bundle.c:194
+#: apply.c:4085
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "El farcell requereix aquesta referència:"
-msgstr[1] "El farcell requereix aquestes %d referències:"
-
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "No s'ha pogut executar el pack-objects"
+msgid "could not add %s to temporary index"
+msgstr "no s'ha pogut afegir %s a l'índex temporal"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "El pack-objects s'ha mort"
+#: apply.c:4095
+#, c-format
+msgid "could not write temporary index to %s"
+msgstr "no s'ha pogut escriure l'índex temporal a %s"
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "El rev-list s'ha mort"
+#: apply.c:4233
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "no s'ha pogut eliminar %s de l'índex"
 
-#: bundle.c:353
+#: apply.c:4268
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "les opcions de la llista de revisions exclouen la referència '%s'"
+msgid "corrupt patch for submodule %s"
+msgstr "pedaç malmès per al submòdul %s"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4274
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "paràmetre no reconegut: %s"
+msgid "unable to stat newly created file '%s'"
+msgstr "no s'ha pogut fer stat al fitxer novament creat '%s'"
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "S'està refusant crear un farcell buit."
+#: apply.c:4282
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+"no s'ha pogut crear un magatzem de recolzament per al fitxer novament creat "
+"%s"
 
-#: bundle.c:463
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "cannot create '%s'"
-msgstr "no es pot crear '%s'"
+msgid "unable to add cache entry for %s"
+msgstr "no s'ha pogut afegir una entrada de cau per a %s"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "L'index-pack s'ha mort"
+#: apply.c:4329
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "no s'ha pogut escriure a '%s'"
 
-#: color.c:290
+#: apply.c:4333
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "valor de color no vàlid: %.*s"
+msgid "closing file '%s'"
+msgstr "s'està tancant el fitxer '%s'"
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4403
 #, c-format
-msgid "could not parse %s"
-msgstr "no s'ha pogut analitzar %s"
+msgid "unable to write file '%s' mode %o"
+msgstr "no s'ha pogut escriure el fitxer '%s' mode %o"
 
-#: commit.c:42
+#: apply.c:4501
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s no és una comissió!"
+msgid "Applied patch %s cleanly."
+msgstr "El pedaç %s s'ha aplicat netament."
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "memòria esgotada"
+#: apply.c:4509
+msgid "internal error"
+msgstr "error intern"
 
-#: config.c:516
+#: apply.c:4512
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "línia de configuració dolenta %d en el blob %s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "S'està aplicant el pedaç %%s amb %d rebuig..."
+msgstr[1] "S'està aplicant el pedaç %%s amb %d rebutjos..."
 
-#: config.c:520
+#: apply.c:4523
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "línia de configuració dolenta %d en el fitxer %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "s'està truncant el nom del fitxer .rej a %.*s.rej"
 
-#: config.c:524
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "línia de configuració dolenta %d en l'entrada estàndard"
+msgid "cannot open %s"
+msgstr "no es pot obrir %s"
 
-#: config.c:528
+#: apply.c:4545
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "línia de configuració dolenta %d en el blob de submòdul %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "El tros #%d s'ha aplicat netament."
 
-#: config.c:532
+#: apply.c:4549
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "línia de configuració dolenta %d en la línia d'ordres %s"
+msgid "Rejected hunk #%d."
+msgstr "S'ha rebutjat el tros #%d."
 
-#: config.c:536
+#: apply.c:4659
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "línia de configuració dolenta %d en %s"
+msgid "Skipped patch '%s'."
+msgstr "S'ha omès el pedaç '%s'."
 
-#: config.c:655
-msgid "out of range"
-msgstr "fora de rang"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "entrada no reconeguda"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "unitat no vàlida"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "no es pot llegir el fitxer d'índex"
 
-#: config.c:661
+#: apply.c:4823
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s': %s"
+msgid "can't open patch '%s': %s"
+msgstr "no es pot obrir el pedaç '%s': %s"
 
-#: config.c:666
+#: apply.c:4850
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s' en el blob %s: %s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "s'ha omès %d error d'espai en blanc"
+msgstr[1] "s'han omès %d errors d'espai en blanc"
 
-#: config.c:669
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s' en el fitxer %s: %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d línia afegeix errors d'espai en blanc."
+msgstr[1] "%d línies afegeixen errors d'espai en blanc."
 
-#: config.c:672
+#: apply.c:4864
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-"valor de configuració numèric dolent '%s' per '%s' en l'entrada estàndard: %s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] ""
+"S'ha aplicat %d línia després d'arreglar els errors d'espai en blanc."
+msgstr[1] ""
+"S'han aplicat %d línies després d'arreglar els errors d'espai en blanc."
 
-#: config.c:675
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-"valor de configuració numèric dolent '%s' per '%s' en el blob de submòdul "
-"%s: %s"
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "No s'ha pogut escriure un fitxer d'índex nou"
+
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "camí"
 
-#: config.c:678
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-"valor de configuració numèric dolent '%s' per '%s' en la línia d'ordres %s: "
-"%s"
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "no apliquis els canvis que coincideixin amb el camí donat"
 
-#: config.c:681
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr "valor de configuració numèric dolent '%s' per '%s' en %s: %s"
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "aplica els canvis que coincideixin amb el camí donat"
 
-#: config.c:768
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "s'ha fallat en expandir el directori d'usuari en '%s'"
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
+msgstr "número"
 
-#: config.c:849 config.c:860
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr "nivell de compressió de zlib dolent %d"
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr ""
+"elimina <nombre> barres obliqües inicials dels camins de diferència "
+"tradicionals"
 
-#: config.c:978
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "mode de creació d'objecte no vàlid: %s"
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "ignora afegiments fets pel pedaç"
 
-#: config.c:1312
-msgid "unable to parse command-line config"
-msgstr "no s'ha pogut analitzar la configuració de la línia d'ordres"
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr ""
+"en lloc d'aplicar el pedaç, emet les estadístiques de diferència de l'entrada"
 
-#: config.c:1362
-msgid "unknown error occurred while reading the configuration files"
-msgstr "un error desconegut ha ocorregut en llegir els fitxers de configuració"
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "mostra el nombre de línies afegides i suprimides en notació decimal"
 
-#: config.c:1716
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "no s'ha pogut analitzar '%s' de la configuració de la línia d'ordres"
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "en lloc d'aplicar el pedaç, emet un resum de l'entrada"
 
-#: config.c:1718
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "variable de configuració dolenta '%s' en el fitxer '%s' a la línia %d"
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "en lloc d'aplicar el pedaç, veges si el pedaç és aplicable"
 
-#: config.c:1777
-#, c-format
-msgid "%s has multiple values"
-msgstr "%s té múltiples valors"
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr "assegura que el pedaç sigui aplicable a l'índex actual"
 
-#: config.c:2311
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "no s'ha pogut establir '%s' a '%s'"
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "aplica un pedaç sense tocar l'arbre de treball"
 
-#: config.c:2313
-#, c-format
-msgid "could not unset '%s'"
-msgstr "no s'ha pogut desestablir '%s'"
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr "accepta un pedaç que toqui fora de l'àrea de treball"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "S'està comprovant la connectivitat"
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "aplica el pedaç també (useu amb --stat/--summary/--check)"
 
-#: connected.c:74
-msgid "Could not run 'git rev-list'"
-msgstr "No s'ha pogut executar 'git rev-list'"
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "intenta una fusió de tres vies si el pedaç no s'aplica"
 
-#: connected.c:94
-msgid "failed write to rev-list"
-msgstr "escriptura fallada a rev-list"
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
+msgstr "construeix un índex temporal basat en la informació d'índex incrustada"
 
-#: connected.c:101
-msgid "failed to close rev-list's stdin"
-msgstr "s'ha fallat en tancar l'stdin del rev-list"
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
+msgstr "els camins se separen amb el caràcter NUL"
 
-#: date.c:97
-msgid "in the future"
-msgstr "en el futur"
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr "assegura't que almenys <n> línies de context coincideixin"
 
-#: date.c:103
-#, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "fa %lu segon"
-msgstr[1] "fa %lu segons"
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
+msgstr "acció"
 
-#: date.c:110
-#, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "fa %lu minut"
-msgstr[1] "fa %lu minuts"
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr ""
+"detecta les línies noves o modificades que tinguin errors d'espai en blanc"
 
-#: date.c:117
-#, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "fa %lu hora"
-msgstr[1] "fa %lu hores"
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignora els canvis d'espai en blanc en cercar context"
 
-#: date.c:124
-#, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "fa %lu dia"
-msgstr[1] "fa %lu dies"
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "aplica el pedaç al revés"
 
-#: date.c:130
-#, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "fa %lu setmana"
-msgstr[1] "fa %lu setmanes"
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "no esperis almenys una línia de context"
 
-#: date.c:137
-#, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "fa %lu mes"
-msgstr[1] "fa %lu mesos"
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "deixa els trossos rebutjats en fitxers *.rej corresponents"
 
-#: date.c:148
-#, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu any"
-msgstr[1] "%lu anys"
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "permet trossos encavalcants"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:151
-#, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "fa %s i %lu mes"
-msgstr[1] "fa %s i %lu mesos"
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "sigues detallat"
 
-#: date.c:156 date.c:161
-#, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "fa %lu any"
-msgstr[1] "fa %lu anys"
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "tolera una línia nova incorrectament detectada al final del fitxer"
 
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "s'ha fallat en llegir el fitxer d'ordres '%s'"
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "no confiïs en els recomptes de línia en les capçaleres dels trossos"
 
-#: diffcore-rename.c:540
-msgid "Performing inexact rename detection"
-msgstr "S'està realitzant una detecció inexacta de canvis de nom"
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr "arrel"
 
-#: diff.c:116
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  S'ha fallat en analitzar el percentatge limitant de dirstat '%s'\n"
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "anteposa <arrel> a tots els noms de fitxer"
 
-#: diff.c:121
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Paràmetre de dirstat desconegut '%s'\n"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<opcions>] <arbre> [<camí>...]"
 
-#: diff.c:225
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-"Valor desconegut de la variable de configuració de 'diff.submodule': '%s'"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: diff.c:277
-#, c-format
+#: archive.c:14
 msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
-"S'han trobat errors en la variable de configuració 'diff.dirstat':\n"
-"%s"
-
-#: diff.c:3017
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr "El diff external s'ha mort, s'està aturant a %s"
+"git archive --remote <dipòsit> [--exec <ordre>] [<opcions>] <arbre> "
+"[<camí>...]"
 
-#: diff.c:3415
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow requereix exactament una especificació de camí"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <dipòsit> [--exec <ordre>] --list"
 
-#: diff.c:3578
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"S'ha fallat en analitzar el paràmetre d'opció de --dirstat/-X:\n"
-"%s"
+msgid "pathspec '%s' did not match any files"
+msgstr "l'especificació de camí '%s' no ha coincidit amb cap fitxer"
 
-#: diff.c:3592
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "S'ha fallat en analitzar el paràmetre d'opció de --submodule: %s"
+#: archive.c:417
+msgid "fmt"
+msgstr "format"
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "s'ha fallat en obtenir el nombre i la informació del nucli"
+#: archive.c:417
+msgid "archive format"
+msgstr "format d'arxiu"
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr ""
-"La memòria cau no seguida està inhabilitada en aquest sistema o ubicació."
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "prefix"
 
-#: gpg-interface.c:178
-msgid "gpg failed to sign the data"
-msgstr "gpg ha fallat en signar les dades"
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "anteposa el prefix a cada nom de camí en l'arxiu"
 
-#: gpg-interface.c:208
-msgid "could not create temporary file"
-msgstr "no s'ha pogut crear el fitxer temporal"
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "fitxer"
 
-#: gpg-interface.c:210
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "s'ha fallat en escriure la signatura separada a '%s'"
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "escriu l'arxiu a aquest fitxer"
 
-#: grep.c:1792
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s': no s'ha pogut llegir %s"
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr "llegeix .gitattributes en el directori de treball"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
-#, c-format
-msgid "failed to stat '%s'"
-msgstr "s'ha fallat en fer stat a '%s'"
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "informa de fitxers arxivats en stderr"
 
-#: grep.c:1820
-#, c-format
-msgid "'%s': short read"
-msgstr "'%s': lectura curta"
+#: archive.c:425
+msgid "store only"
+msgstr "només emmagatzema"
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "ordres de git disponibles en '%s'"
+#: archive.c:426
+msgid "compress faster"
+msgstr "comprimeix més ràpidament"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "ordres de git disponibles d'altres llocs en el vostre $PATH"
+#: archive.c:434
+msgid "compress better"
+msgstr "comprimeix millor"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Aquestes són ordres del Git comunament usades en diverses situacions:"
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "llista els formats d'arxiu admesos"
 
-#: help.c:309
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-"'%s' sembla una ordre de git, però no hem pogut\n"
-"executar-la. Pot ser que git-%s estigui estropejat?"
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "dipòsit"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Ai. El vostre sistema no informa de cap ordre de Git."
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "recupera l'arxiu del dipòsit remot <dipòsit>"
 
-#: help.c:388
-#, c-format
-msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
-msgstr ""
-"ADVERTÈNCIA: Heu invocat una ordre de Git amb nom '%s', la qual no "
-"existeix.\n"
-"S'està continuant sota l'assumpció que volíeu dir '%s'"
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "ordre"
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "en %0.1f segons automàticament..."
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "camí a l'ordre git-upload-archive remota"
 
-#: help.c:400
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: '%s' no és una ordre de git. Vegeu 'git --help'."
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "Opció inesperada --remote"
 
-#: help.c:404 help.c:470
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"Volíeu dir això?"
-msgstr[1] ""
-"\n"
-"Volíeu dir un d'aquests?"
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "L'opció --exec només es pot usar junt amb --remote"
+
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "Opció inesperada --output"
 
-#: help.c:466
+#: archive.c:475
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+msgid "Unknown archive format '%s'"
+msgstr "Format d'arxiu desconegut '%s'"
 
-#: lockfile.c:152
+#: archive.c:482
 #, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Paràmetre no admès per al format '%s': -%d"
+
+#: attr.c:212
+#, , c-format
+msgid "%.*s is not a valid attribute name"
+msgstr "%.*s no és un nom d'atribut vàlid"
+
+#: attr.c:408
 msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
 msgstr ""
-"No s'ha pogut crear '%s.lock': %s.\n"
-"\n"
-"Sembla que un altre procés de git s'està executant en aquest\n"
-"dipòsit, per exemple, un editor obert per 'git commit'. Si us\n"
-"plau, assegureu-vos que tots els processos s'hagin terminat i\n"
-"llavors trobeu de nou. Si encara falla, potser que un procés de\n"
-"git ha tingut una pana:\n"
-"elimineu el fitxer manualment per a continuar."
+"Els patrons negatius s'ignoren en els atributs de git\n"
+"Useu '\\!' per exclamació capdavantera literal."
 
-#: lockfile.c:160
+#: bisect.c:444
 #, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "No es pot crear '%s.lock': %s"
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "s'ha fallat en llegir la memòria cau"
-
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "no s'ha pogut escriure un fitxer d'índex nou"
+msgid "Could not open file '%s'"
+msgstr "No s'ha pogut obrir el fitxer '%s'"
 
-#: merge-recursive.c:209
-msgid "(bad commit)\n"
-msgstr "(comissió dolenta)\n"
+#: bisect.c:449
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Comentari amb cometes errònies en el fitxer '%s': %s"
 
-#: merge-recursive.c:231
+#: bisect.c:657
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "addinfo_cache ha fallat per al camí '%s'"
+msgid "We cannot bisect more!\n"
+msgstr "No podem bisecar més!\n"
 
-#: merge-recursive.c:301
-msgid "error building trees"
-msgstr "error en construir arbres"
+#: bisect.c:710
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "No és un nom de comissió vàlid %s"
 
-#: merge-recursive.c:720
+#: bisect.c:734
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "s'ha fallat en crear el camí '%s' %s"
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"La base de fusió %s és errònia.\n"
+"Això vol dir que el defecte s'ha arreglat entre %s i [%s].\n"
 
-#: merge-recursive.c:731
+#: bisect.c:739
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "S'està eliminant %s per a fer espai per al subdirectori\n"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"La base de fusió %s és nova.\n"
+"La propietat s'ha canviat entre %s i [%s].\n"
 
-#: merge-recursive.c:745 merge-recursive.c:764
-msgid ": perhaps a D/F conflict?"
-msgstr ": potser un conflicte D/F?"
+#: bisect.c:744
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"La base de fusió %s és %s.\n"
+"Això vol dir que la primera comissió '%s' és entre %s i [%s].\n"
 
-#: merge-recursive.c:754
+#: bisect.c:752
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "s'està refusant perdre el fitxer no seguit a '%s'"
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Algunes revisions %s no són els avantpassats de la revisió %s.\n"
+"git bisect no pot funcionar correctament en aquest cas.\n"
+"Potser heu confós les revisions %s i %s?\n"
 
-#: merge-recursive.c:796
+#: bisect.c:765
 #, c-format
-msgid "cannot read object %s '%s'"
-msgstr "no es pot llegir l'objecte %s '%s'"
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"s'ha d'ometre la base de fusió entre %s i [%s].\n"
+"Llavors, no podem estar segurs de que la primera comissió %s sigui entre %s "
+"i %s.\n"
+"Continuem de totes maneres."
 
-#: merge-recursive.c:798
+#: bisect.c:800
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "blob esperat per a %s '%s'"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bisecant: s'ha de provar una base de fusió\n"
 
-#: merge-recursive.c:822
+#: bisect.c:851
 #, c-format
-msgid "failed to open '%s': %s"
-msgstr "s'ha fallat en obrir '%s': %s"
+msgid "a %s revision is needed"
+msgstr "es necessita una revisió %s"
 
-#: merge-recursive.c:833
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
 #, c-format
-msgid "failed to symlink '%s': %s"
-msgstr "s'ha fallat en fer l'enllaç simbòlic '%s': %s"
+msgid "could not create file '%s'"
+msgstr "no s'ha pogut crear el fitxer '%s'"
 
-#: merge-recursive.c:838
+#: bisect.c:919
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "no se sap què fer amb %06o %s '%s'"
+msgid "could not read file '%s'"
+msgstr "no s'ha pogut llegir el fitxer '%s'"
 
-#: merge-recursive.c:978
-msgid "Failed to execute internal merge"
-msgstr "S'ha fallat en executar la fusió interna"
+#: bisect.c:949
+msgid "reading bisect refs failed"
+msgstr "la lectura de les referències de bisecció ha fallat"
 
-#: merge-recursive.c:982
+#: bisect.c:969
 #, c-format
-msgid "Unable to add %s to database"
-msgstr "no s'ha pogut afegir %s a la base de dades"
+msgid "%s was both %s and %s\n"
+msgstr "%s era ambdós %s i %s\n"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: bisect.c:977
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 msgstr ""
-"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
-"s'ha deixat en l'arbre."
+"No s'ha trobat cap comissió comprovable.\n"
+"Potser heu començat amb paràmetres de camí dolents?\n"
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: bisect.c:996
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
-"s'ha deixat en l'arbre a %s."
-
-#: merge-recursive.c:1143
-msgid "rename"
-msgstr "canvia de nom"
-
-#: merge-recursive.c:1143
-msgid "renamed"
-msgstr "canviat de nom"
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(aproximadament %d pas)"
+msgstr[1] "(aproximadament %d passos)"
 
-#: merge-recursive.c:1200
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s és un directori en %s; s'està afegint com a %s en lloc d'això"
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Bisecant: manca %d revisió a provar després d'aquesta %s\n"
+msgstr[1] "Bisecant: manquen %d revisions a provar després d'aquesta %s\n"
 
-#: merge-recursive.c:1225
+#: branch.c:53
 #, c-format
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
 msgstr ""
-"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom \"%s\"->\"%s\" en la "
-"branca \"%s\" canvi de nom \"%s\"->\"%s\" en \"%s\"%s"
+"\n"
+"Després de corregir la causa de l'error, podeu\n"
+"intentar corregir la informació de seguiment remot\n"
+"invocant \"git branch --set-upstream-to=%s%s%s\"."
 
-#: merge-recursive.c:1230
-msgid " (left unresolved)"
-msgstr " (deixat sense resolució)"
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "No s'està establint la branca %s com a la seva pròpia font."
 
-#: merge-recursive.c:1292
+#: branch.c:93
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
-"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom %s->%s en %s. Canvi de "
-"nom %s->%s en %s"
+"La branca %s està configurada per a seguir la branca remota %s de %s per "
+"rebasar."
 
-#: merge-recursive.c:1325
+#: branch.c:94
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "S'està canviant el nom de %s a %s i %s a %s en lloc d'això"
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "La branca %s està configurada per a seguir la branca remota %s de %s."
 
-#: merge-recursive.c:1531
+#: branch.c:98
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
-"CONFLICTE (canvi de nom/afegiment): Canvi de nom %s->%s en %s. %s afegit en "
-"%s"
+"La branca %s està configurada per a seguir la branca local %s per rebasar."
 
-#: merge-recursive.c:1546
+#: branch.c:99
 #, c-format
-msgid "Adding merged %s"
-msgstr "S'està afegint %s fusionat"
+msgid "Branch %s set up to track local branch %s."
+msgstr "La branca %s està configurada per a seguir la branca local %s."
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: branch.c:104
 #, c-format
-msgid "Adding as %s instead"
-msgstr "S'està afegint com a %s en lloc d'això"
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr ""
+"La branca %s està configurada per a seguir la referència remota %s per "
+"rebasar."
 
-#: merge-recursive.c:1610
+#: branch.c:105
 #, c-format
-msgid "cannot read object %s"
-msgstr "no es pot llegir l'objecte %s"
+msgid "Branch %s set up to track remote ref %s."
+msgstr "La branca %s està configurada per a seguir la referència remota %s."
 
-#: merge-recursive.c:1613
+#: branch.c:109
 #, c-format
-msgid "object %s is not a blob"
-msgstr "L'objecte %s no és un blob"
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"La branca %s està configurada per a seguir la referència local %s per "
+"rebasar."
 
-#: merge-recursive.c:1666
-msgid "modify"
-msgstr "modifica"
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "La branca %s està configurada per a seguir la referència local %s."
 
-#: merge-recursive.c:1666
-msgid "modified"
-msgstr "modificat"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "No es pot escriure la configuració de la branca font"
 
-#: merge-recursive.c:1676
-msgid "content"
-msgstr "contingut"
-
-#: merge-recursive.c:1683
-msgid "add/add"
-msgstr "afegiment/afegiment"
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "No seguint: informació ambigua per a la referència %s"
 
-#: merge-recursive.c:1718
+#: branch.c:185
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "S'ha saltat %s (el fusionat és igual a l'existent)"
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' no és un nom de branca vàlid."
 
-#: merge-recursive.c:1732
+#: branch.c:190
 #, c-format
-msgid "Auto-merging %s"
-msgstr "S'està autofusionant %s"
+msgid "A branch named '%s' already exists."
+msgstr "Una branca amb nom '%s' ja existeix."
 
-#: merge-recursive.c:1736 git-submodule.sh:919
-msgid "submodule"
-msgstr "submòdul"
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "No es pot actualitzar la branca actual a la força."
 
-#: merge-recursive.c:1737
+#: branch.c:218
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "CONFLICTE (%s): Conflicte de fusió en %s"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"No es pot configurar la informació de seguiment; el punt inicial '%s' no és "
+"una branca."
 
-#: merge-recursive.c:1831
+#: branch.c:220
 #, c-format
-msgid "Removing %s"
-msgstr "S'està eliminant %s"
-
-#: merge-recursive.c:1857
-msgid "file/directory"
-msgstr "fitxer/directori"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "la branca font demanada '%s' no existeix"
 
-#: merge-recursive.c:1863
-msgid "directory/file"
-msgstr "directori/fitxer"
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Si teniu pensat basar el vostre treball en una branca\n"
+"font que ja existeix al remot, pot ser que necessiteu\n"
+"executar \"git fetch\" per a obtenir-la.\n"
+"\n"
+"Si teniu pensat pujar una branca local nova que seguirà\n"
+"la seva contrapart remota, pot ser que vulgueu usar\n"
+"\"git push -u\" per a establir la configuració font\n"
+"mentre pugeu."
 
-#: merge-recursive.c:1868
+#: branch.c:265
 #, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-"CONFLICTE (%s): Hi ha un directori amb nom %s en %s. S'està afegint %s com a "
-"%s"
+msgid "Not a valid object name: '%s'."
+msgstr "No és un nom d'objecte vàlid: '%s'."
 
-#: merge-recursive.c:1877
+#: branch.c:285
 #, c-format
-msgid "Adding %s"
-msgstr "S'està afegint %s"
+msgid "Ambiguous object name: '%s'."
+msgstr "Nom d'objecte ambigu: '%s'."
 
-#: merge-recursive.c:1914
-msgid "Already up-to-date!"
-msgstr "Ja està al dia!"
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "No és un punt de ramificació vàlid: '%s'."
 
-#: merge-recursive.c:1923
+#: branch.c:344
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "la fusió dels arbres %s i %s ha fallat"
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' ja s'ha agafat a '%s'"
 
-#: merge-recursive.c:2006
-msgid "Merging:"
-msgstr "Fusionant:"
+#: branch.c:364
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "La HEAD de l'arbre de treball %s no està actualitzat"
 
-#: merge-recursive.c:2019
+#: bundle.c:34
 #, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "s'ha trobat %u avantpassat:"
-msgstr[1] "s'han trobat %u avantpassats:"
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' no sembla un fitxer de farcell v2"
 
-#: merge-recursive.c:2058
-msgid "merge returned no commit"
-msgstr "la fusió no ha retornat cap comissió"
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "capçalera no reconeguda: %s%s (%d)"
 
-#: merge-recursive.c:2121
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "No s'ha pogut analitzar l'objecte '%s'"
+msgid "could not open '%s'"
+msgstr "no s'ha pogut obrir '%s'"
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
-msgid "Unable to write index."
-msgstr "No s'ha pogut escriure l'índex."
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Al dipòsit li manquen aquestes comissions prerequisits:"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "No es pot cometre un arbre de notes no inicialitzat / no referenciat"
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "la configuració del passeig per revisions ha fallat"
 
-#: notes-utils.c:100
+#: bundle.c:185
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Valor de notes.rewriteMode dolent: '%s'"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "El farcell conté aquesta referència:"
+msgstr[1] "El farcell conté aquestes %d referències:"
 
-#: notes-utils.c:110
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "S'està refusant reescriure les notes en %s (fora de refs/notes/)"
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "El farcell registra una història completa."
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: bundle.c:194
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Valor dolent de %s: '%s'"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "El farcell requereix aquesta referència:"
+msgstr[1] "El farcell requereix aquestes %d referències:"
 
-#: object.c:242
-#, c-format
-msgid "unable to parse object: %s"
-msgstr "no s'ha pogut analitzar l'objecte: %s"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "No s'ha pogut executar el pack-objects"
 
-#: parse-options.c:572
-msgid "..."
-msgstr "..."
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "El pack-objects s'ha mort"
 
-#: parse-options.c:590
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "El rev-list s'ha mort"
+
+#: bundle.c:353
 #, c-format
-msgid "usage: %s"
-msgstr "ús: %s"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "les opcions de la llista de revisions exclouen la referència '%s'"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
 #, c-format
-msgid "   or: %s"
-msgstr " o: %s"
+msgid "unrecognized argument: %s"
+msgstr "paràmetre no reconegut: %s"
 
-#: parse-options.c:597
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "S'està refusant crear un farcell buit."
+
+#: bundle.c:463
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "cannot create '%s'"
+msgstr "no es pot crear '%s'"
 
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-NUM"
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "L'index-pack s'ha mort"
 
-#: parse-options-cb.c:108
+#: color.c:300
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "nom de camp mal format '%s'"
+msgid "invalid color value: %.*s"
+msgstr "valor de color no vàlid: %.*s"
 
-#: path.c:798
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "No s'ha pogut fer %s escrivible pel grup"
+msgid "could not parse %s"
+msgstr "no s'ha pogut analitzar %s"
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-"els ajusts d'especificació de camí 'glob' i 'noglob' globals són "
-"incompatibles"
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s no és una comissió!"
 
-#: pathspec.c:143
+#: commit.c:1511
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
 msgstr ""
-"l'ajust d'especificació de camí 'literal' global és incompatible amb tots "
-"els altres ajusts d'especificació de camí globals"
+"Advertència: el missatge de comissió no és compatible amb UTF-8.\n"
+"Potser voleu esmenar-lo després de corregir el missatge, o establir\n"
+"la variable de configuració i18n.commitencoding a la codificació que\n"
+"usi el vostre projecte.\n"
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "paràmetre no vàlid per a la màgia d'especificació de camí 'prefix'"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "memòria esgotada"
 
-#: pathspec.c:183
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "Màgia d'especificació de camí no vàlida '%.*s' en '%s'"
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr ""
 
-#: pathspec.c:187
+#: config.c:711
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "')' mancant al final de la màgia d'especificació de camí en '%s'"
+msgid "bad config line %d in blob %s"
+msgstr "línia de configuració %d errònia en el blob %s"
 
-#: pathspec.c:205
+#: config.c:715
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Màgia d'especificació de camí no implementada '%c' en '%s'"
+msgid "bad config line %d in file %s"
+msgstr "línia de configuració %d errònia en el fitxer %s"
 
-#: pathspec.c:230
+#: config.c:719
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: 'literal' i 'glob' són incompatibles"
+msgid "bad config line %d in standard input"
+msgstr "línia de configuració %d errònia en l'entrada estàndard"
 
-#: pathspec.c:241
+#: config.c:723
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: '%s' és fora del dipòsit"
+msgid "bad config line %d in submodule-blob %s"
+msgstr "línia de configuració %d errònia en el blob de submòdul %s"
 
-#: pathspec.c:291
+#: config.c:727
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "L'especificació '%s' és en el submòdul '%.*s'"
+msgid "bad config line %d in command line %s"
+msgstr "línia de configuració %d errònia en la línia d'ordres %s"
 
-#: pathspec.c:353
+#: config.c:731
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-"%s: aquesta ordre no és compatible amb la màgia d'especificació de camí: %s"
+msgid "bad config line %d in %s"
+msgstr "línia de configuració %d errònia en %s"
 
-#: pathspec.c:433
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "l'especificació de camí '%s' és més enllà d'un enllaç simbòlic"
+#: config.c:859
+msgid "out of range"
+msgstr "fora de rang"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-"No hi ha res a excloure per patrons :(exclusió).\n"
-"Potser heu oblidat afegir o ':/' o '.' ?"
+#: config.c:859
+msgid "invalid unit"
+msgstr "unitat no vàlida"
 
-#: pretty.c:973
-msgid "unable to parse --pretty format"
-msgstr "no s'ha pogut analitzar el format --pretty"
+#: config.c:865
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valor de configuració numèric erroni '%s' per '%s': %s"
 
-#: progress.c:235
-msgid "done"
-msgstr "fet"
+#: config.c:870
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "valor de configuració numèric erroni '%s' per '%s' en el blob %s: %s"
 
-#: read-cache.c:1281
+#: config.c:873
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"index.version establert, però el valor no és vàlid.\n"
-"S'està usant la versió %i"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "valor de configuració numèric '%s' erroni per '%s' en el fitxer %s: %s"
 
-#: read-cache.c:1291
+#: config.c:876
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr ""
-"GIT_INDEX_VERSION establert, però el valor no és vàlid.\n"
-"S'està usant la versió %i"
+"valor de configuració numèric '%s' erroni per '%s' en l'entrada estàndard: %s"
 
-#: refs.c:551 builtin/merge.c:840
+#: config.c:879
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "No s'ha pogut obrir '%s' per a escriptura"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr ""
+"valor de configuració numèric '%s' erroni' per '%s' en el blob de submòdul "
+"%s: %s"
 
-#: refs/files-backend.c:2534
+#: config.c:882
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "no s'ha pogut suprimir la referència %s: %s"
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr ""
+"valor de configuració numèric '%s' erroni per '%s' en la línia d'ordres %s: "
+"%s"
 
-#: refs/files-backend.c:2537
+#: config.c:885
 #, c-format
-msgid "could not delete references: %s"
-msgstr "no s'ha pogut suprimir les referències: %s"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "valor de configuració numèric dolent '%s' per '%s' en %s: %s"
 
-#: refs/files-backend.c:2546
+#: config.c:980
 #, c-format
-msgid "could not remove reference %s"
-msgstr "no s'ha pogut eliminar la referència %s"
+msgid "failed to expand user dir in: '%s'"
+msgstr "s'ha produït un error en expandir el directori d'usuari en: '%s'"
 
-#: ref-filter.c:55
+#: config.c:1075 config.c:1086
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "format esperat: %%(color:<color>)"
+msgid "bad zlib compression level %d"
+msgstr "nivell de compressió de zlib dolent %d"
 
-#: ref-filter.c:57
+#: config.c:1203
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "color no reconegut: %%(color:%s)"
+msgid "invalid mode for object creation: %s"
+msgstr "mode de creació d'objecte no vàlid: %s"
 
-#: ref-filter.c:71
+#: config.c:1359
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "format no reconegut: %%(%s)"
+msgid "bad pack compression level %d"
+msgstr "nivell de compressió de paquet %d Erroni"
 
-#: ref-filter.c:77
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) no accepta paràmetres"
+#: config.c:1557
+msgid "unable to parse command-line config"
+msgstr "no s'ha pogut analitzar la configuració de la línia d'ordres"
 
-#: ref-filter.c:84
+#: config.c:1611
+msgid "unknown error occurred while reading the configuration files"
+msgstr "un error desconegut ha ocorregut en llegir els fitxers de configuració"
+
+#: config.c:1970
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) no accepta paràmetres"
+msgid "Invalid %s: '%s'"
+msgstr "%s no vàlid: %s"
 
-#: ref-filter.c:101
+#: config.c:1991
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "valor positiu esperat contents:lines=%s"
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr ""
 
-#: ref-filter.c:103
+#: config.c:2017
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "paràmetre %%(contents) no reconegut: %s"
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
+msgstr ""
 
-#: ref-filter.c:113
+#: config.c:2028
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "paràmetre %%(objectname) no reconegut: %s"
+msgid "unable to parse '%s' from command-line config"
+msgstr "no s'ha pogut analitzar '%s' de la configuració de la línia d'ordres"
 
-#: ref-filter.c:135
+#: config.c:2030
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "format esperat: %%(align:<amplada>,<posició>)"
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "variable de configuració '%s' errònia en el fitxer '%s' a la línia %d"
 
-#: ref-filter.c:147
+#: config.c:2089
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "posició no reconeguda:%s"
+msgid "%s has multiple values"
+msgstr "%s té múltiples valors"
 
-#: ref-filter.c:151
+#: config.c:2423 config.c:2648
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "amplada no reconeguda:%s"
+msgid "fstat on %s failed"
+msgstr "ha fallat fstat a %s"
 
-#: ref-filter.c:157
+#: config.c:2541
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "paràmetre %%(align) no reconegut: %s"
+msgid "could not set '%s' to '%s'"
+msgstr "no s'ha pogut establir '%s' a '%s'"
 
-#: ref-filter.c:161
+#: config.c:2543 builtin/remote.c:774
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "amplada positiva esperada amb l'àtom %%(align)"
+msgid "could not unset '%s'"
+msgstr "no s'ha pogut desestablir '%s'"
+
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "El costat remot ha penjat en el moment de contacte inicial"
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"No s'ha pogut llegir del dipòsit remot.\n"
+"\n"
+"Si us plau, assegureu-vos que tingueu els permisos\n"
+"d'accés correctes i que el dipòsit existeixi."
+
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "S'està comprovant la connectivitat"
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "No s'ha pogut executar 'git rev-list'"
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "escriptura fallada al rev-list"
+
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "s'ha produït un error en tancar l'stdin del rev-list"
 
-#: ref-filter.c:244
+#: convert.c:201
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "nom d'objecte mal format: %.*s"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"LF reemplaçarà CRLF en %s.\n"
+"El fitxer tindrà els seus terminadors de línia originals en el vostre "
+"directori de treball."
 
-#: ref-filter.c:270
+#: convert.c:205
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "nom de camp desconegut: %.*s"
+msgid "CRLF would be replaced by LF in %s."
+msgstr "LF reemplaçaria CRLF en %s."
 
-#: ref-filter.c:372
+#: convert.c:211
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"CRLF reemplaçarà LF en %s.\n"
+"El fitxer tindrà els seus terminadors de línia originals en el vostre "
+"directori de treball."
 
-#: ref-filter.c:424
+#: convert.c:215
 #, c-format
-msgid "malformed format string %s"
-msgstr "cadena de format mal format %s"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "CRLF reemplaçaria LF en %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= requereix un paràmetre enter positiu"
+#: date.c:97
+msgid "in the future"
+msgstr "en el futur"
 
-#: ref-filter.c:883
+#: date.c:103
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "la referència '%s' no té %ld components per a :strip"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "fa %lu segon"
+msgstr[1] "fa %lu segons"
 
-#: ref-filter.c:1046
+#: date.c:110
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "format de %.*s desconegut %s"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "fa %lu minut"
+msgstr[1] "fa %lu minuts"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: date.c:117
 #, c-format
-msgid "missing object %s for %s"
-msgstr "manca l'objecte %s per a %s"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "fa %lu hora"
+msgstr[1] "fa %lu hores"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: date.c:124
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "parse_object_buffer ha fallat en %s per a %s"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "fa %lu dia"
+msgstr[1] "fa %lu dies"
 
-#: ref-filter.c:1311
+#: date.c:130
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "objecte mal format a '%s'"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "fa %lu setmana"
+msgstr[1] "fa %lu setmanes"
 
-#: ref-filter.c:1373
+#: date.c:137
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "s'està ignorant la referència amb nom trencat %s"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "fa %lu mes"
+msgstr[1] "fa %lu mesos"
 
-#: ref-filter.c:1378
+#: date.c:148
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "s'està ignorant la referència trencada %s"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu any"
+msgstr[1] "%lu anys"
 
-#: ref-filter.c:1651
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "format: manca l'àtom %%(end)"
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "fa %s i %lu mes"
+msgstr[1] "fa %s i %lu mesos"
 
-#: ref-filter.c:1705
+#: date.c:156 date.c:161
 #, c-format
-msgid "malformed object name %s"
-msgstr "nom d'objecte %s mal format"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "fa %lu any"
+msgstr[1] "fa %lu anys"
 
-#: remote.c:746
+#: diffcore-order.c:24
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "No es pot obtenir ambdós %s i %s a %s"
+msgid "failed to read orderfile '%s'"
+msgstr "s'ha produït un error en llegir el fitxer d'ordres '%s'"
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "S'està realitzant una detecció inexacta de canvis de nom"
 
-#: remote.c:750
+#: diff.c:62
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s generalment segueix %s, no %s"
+msgid "option '%s' requires a value"
+msgstr "l'opció '%s' requereix un valor"
 
-#: remote.c:754
+#: diff.c:124
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s segueix ambdós %s i %s"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr ""
+"  S'ha produït un error en analitzar el percentatge limitant de dirstat "
+"'%s'\n"
 
-#: remote.c:762
-msgid "Internal error"
-msgstr "Error intern"
+#: diff.c:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Paràmetre de dirstat desconegut '%s'\n"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD no assenyala cap branca"
+#: diff.c:281
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr ""
+"Valor desconegut de la variable de configuració de 'diff.submodule': '%s'"
 
-#: remote.c:1686
+#: diff.c:344
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "no hi ha tal branca: '%s'"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"S'han trobat errors en la variable de configuració 'diff.dirstat':\n"
+"%s"
 
-#: remote.c:1689
+#: diff.c:3102
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "cap font configurada per a la branca '%s'"
+msgid "external diff died, stopping at %s"
+msgstr "el diff external s'ha mort, s'està aturant a %s"
+
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check i -s són mutualment exclusius"
 
-#: remote.c:1695
+#: diff.c:3518
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow requereix exactament una especificació de camí"
+
+#: diff.c:3681
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "La branca font '%s' no s'emmagatzema com a branca amb seguiment remot"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"S'ha produït un error en analitzar el paràmetre d'opció de --dirstat/-X:\n"
+"%s"
 
-#: remote.c:1710
+#: diff.c:3695
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr ""
-"el destí de pujada '%s' en el remot '%s' no té cap branca seguidora local"
+"S'ha produït un error en analitzar el paràmetre d'opció de --submodule: '%s'"
 
-#: remote.c:1725
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "s'ha omès la detecció de canvi de nom a causa de massa fitxers."
+
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
+msgstr ""
+"només s'han trobat còpies des de camins modificats a causa de massa fitxers."
+
+#: diff.c:4725
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "la branca '%s' no té cap remot al qual pujar"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"potser voleu establir la vostra variable %s a almenys %d i tornar a intentar "
+"l'ordre."
+
+#: dir.c:1899
+msgid "failed to get kernel name and information"
+msgstr "s'ha produït un error en obtenir el nombre i la informació del nucli"
+
+#: dir.c:2018
+msgid "Untracked cache is disabled on this system or location."
+msgstr ""
+"La memòria cau no seguida està inhabilitada en aquest sistema o ubicació."
 
-#: remote.c:1736
+#: dir.c:2776 dir.c:2781
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "les especificacions de referència de '%s' no inclouen '%s'"
+msgid "could not create directories for %s"
+msgstr "no s'ha pogut crear directoris per %s"
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "push no té destí (push.default és 'nothing')"
+#: dir.c:2806
+#, c-format
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "no s'ha pogut migrar el directori de '%s' a '%s'"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "no es pot resoldre una pujada 'simple' a un sol destí"
+#: entry.c:280
+#, c-format
+msgid "could not stat file '%s'"
+msgstr "no s'ha pogut fer «stat» sobre el fitxer '%s'"
+
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: llista superficial esperada"
 
-#: remote.c:2073
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ACK/NAK esperat, EOF rebut"
+
+#: fetch-pack.c:280 builtin/archive.c:63
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "La vostra branca està basada en '%s', però la font no hi és.\n"
+msgid "remote error: %s"
+msgstr "error remot: %s"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (useu \"git branch --unset-upstream\" per a arreglar)\n"
+#: fetch-pack.c:281
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK esperat, '%s' rebut"
 
-#: remote.c:2080
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc requereix multi_ack_detailed"
+
+#: fetch-pack.c:419
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "La vostra branca està al dia amb '%s'.\n"
+msgid "invalid shallow line: %s"
+msgstr "línia de shallow no vàlida: %s"
 
-#: remote.c:2084
+#: fetch-pack.c:425
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "La vostra branca està davant de '%s' per %d comissió.\n"
-msgstr[1] "La vostra branca està davant de '%s' per %d comissions.\n"
+msgid "invalid unshallow line: %s"
+msgstr "línia d'unshallow no vàlida: %s"
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (useu \"git push\" per a publicar les vostres comissions locals)\n"
+#: fetch-pack.c:427
+#, c-format
+msgid "object not found: %s"
+msgstr "objecte no trobat: %s"
 
-#: remote.c:2093
+#: fetch-pack.c:430
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-"La vostra branca està darrere de '%s' per %d comissió, i pot avançar-se "
-"ràpidament.\n"
-msgstr[1] ""
-"La vostra branca està darrere de '%s' per %d comissions, i pot avançar-se "
-"ràpidament.\n"
+msgid "error in object: %s"
+msgstr "error en objecte: %s"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr " (useu \"git pull\" per a actualitzar la vostra branca local)\n"
+#: fetch-pack.c:432
+#, c-format
+msgid "no shallow found: %s"
+msgstr "no s'ha trobat cap shallow: %s"
 
-#: remote.c:2104
+#: fetch-pack.c:435
 #, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"La vostra branca i '%s' s'han divergit,\n"
-"i tenen %d i %d comissió distinta cada una, respectivament.\n"
-msgstr[1] ""
-"La vostra branca i '%s' s'han divergit,\n"
-"i tenen %d i %d comissions distintes cada una, respectivament.\n"
+msgid "expected shallow/unshallow, got %s"
+msgstr "s'esperava shallow/unshallow, s'ha rebut %s"
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (useu \"git pull\" per a fusionar la branca remota a la vostra)\n"
+#: fetch-pack.c:474
+#, c-format
+msgid "got %s %d %s"
+msgstr "%s %d %s rebut"
 
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "la vostra branca actual sembla trencada"
+#: fetch-pack.c:488
+#, c-format
+msgid "invalid commit %s"
+msgstr "comissió no vàlida %s"
+
+#: fetch-pack.c:521
+msgid "giving up"
+msgstr "s'està rendint"
+
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
+msgstr "fet"
 
-#: revision.c:2135
+#: fetch-pack.c:543
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "la vostra branca actual '%s' encara no té cap comissió"
+msgid "got %s (%d) %s"
+msgstr "s'ha rebut %s (%d) %s"
 
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent és incompatible amb --bisect"
+#: fetch-pack.c:589
+#, c-format
+msgid "Marking %s as complete"
+msgstr "S'està marcant %s com a complet"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "s'ha fallat en obrir /dev/null"
+#: fetch-pack.c:737
+#, c-format
+msgid "already have %s (%s)"
+msgstr "ja es té %s (%s)"
+
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: no s'ha pogut bifurcar del demultiplexor de banda lateral"
 
-#: run-command.c:94
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
+msgstr "error de protocol: capçalera de paquet errònia"
+
+#: fetch-pack.c:839
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) ha fallat"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: no es pot bifurcar de %s"
 
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "s'ha fallat en signar el certificat de pujada"
+#: fetch-pack.c:855
+#, c-format
+msgid "%s failed"
+msgstr "%s ha fallat"
 
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "el destí receptor no admet pujar --signed"
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
+msgstr "error en demultiplexor de banda lateral"
 
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"no s'està enviant una certificació de pujada perquè el destí receptor no "
-"admet pujar --signed"
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
+msgstr "El servidor no permet clients superficials"
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "el destí receptor no admet pujar --atomic"
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
+msgstr "El servidor accepta multi_ack_detailed"
 
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "el destí receptor no admet opcions de pujada"
+#: fetch-pack.c:891
+msgid "Server supports no-done"
+msgstr "El servidor accepta no-done"
 
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"després de resoldre els conflictes, marqueu els camins\n"
-"corregits amb 'git add <camins>' o 'git rm <camins>'"
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
+msgstr "El servidor accepta multi_ack"
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"després de resoldre els conflictes, marqueu els camins\n"
-"corregits amb 'git add <camins>' o 'git rm <camins>'\n"
-"i cometeu el resultat amb 'git commit'"
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
+msgstr "El servidor accepta side-band-64k"
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
-#, c-format
-msgid "Could not write to %s"
-msgstr "No s'ha pogut escriure a %s"
+#: fetch-pack.c:905
+msgid "Server supports side-band"
+msgstr "El servidor accepta banda lateral"
+
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "El servidor accepta allow-tip-sha1-in-want"
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "El servidor accepta allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
+msgstr "El servidor accepta ofs-delta"
+
+#: fetch-pack.c:930
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Ha hagut un error en finalitzar %s."
+msgid "Server version is %.*s"
+msgstr "La versió del servidor és %.*s"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Els vostres canvis locals se sobreescriurien pel recull de cireres."
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
+msgstr "El servidor no admet --shallow-since"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Els vostres canvis locals se sobreescriurien per la reversió."
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
+msgstr "El servidor no admet --shallow-exclude"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Cometeu els vostres canvis o emmagatzemeu-los per a procedir."
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
+msgstr "El servidor no admet --deepen"
 
-#: sequencer.c:228
-#, c-format
-msgid "%s: fast-forward"
-msgstr "%s: avanç ràpid"
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr "cap comissió en comú"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: No s'ha pogut escriure un fitxer d'índex nou"
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: l'obtenció ha fallat."
 
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "No s'ha pogut resoldre la comissió HEAD\n"
+#: fetch-pack.c:1127
+msgid "no matching remote head"
+msgstr "no hi ha cap HEAD remot coincident"
 
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "No s'ha pogut actualitzar l'arbre cau\n"
+#: fetch-pack.c:1149
+#,  c-format
+msgid "no such remote ref %s"
+msgstr "no existeix la referència remota %s"
 
-#: sequencer.c:393
+#: fetch-pack.c:1152
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "No s'ha pogut analitzar la comissió %s\n"
+msgid "Server does not allow request for unadvertised object %s"
+msgstr "El servidor no permet sol·licitar objectes no anunciats %s"
 
-#: sequencer.c:398
-#, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "No s'ha pogut analitzar la comissió mare %s\n"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg ha fallat en signar les dades"
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "El vostre fitxer d'índex està sense fusionar."
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "no s'ha pogut crear el fitxer temporal"
 
-#: sequencer.c:482
+#: gpg-interface.c:217
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "La comissió %s és una fusió però no s'ha donat cap opció -m."
+msgid "failed writing detached signature to '%s'"
+msgstr "s'ha produït un error en escriure la signatura separada a '%s'"
 
-#: sequencer.c:490
+#: graph.c:96
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "La comissió %s no té mare %d"
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "ignora el color invàlid '%.*s' en log.graphColors"
 
-#: sequencer.c:494
+#: grep.c:1796
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr ""
-"S'ha especificat la línia principal però la comissió %s no és una fusió."
+msgid "'%s': unable to read %s"
+msgstr "'%s': no s'ha pogut llegir %s"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: no es pot analitzar la comissió mare %s"
+msgid "failed to stat '%s'"
+msgstr "s'ha produït un error en fer stat a '%s'"
 
-#: sequencer.c:511
+#: grep.c:1824
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "No es pot obtenir el missatge de comissió de %s"
+msgid "'%s': short read"
+msgstr "'%s': lectura curta"
 
-#: sequencer.c:597
+#: help.c:218
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "no s'ha pogut revertir %s...%s"
+msgid "available git commands in '%s'"
+msgstr "ordres de git disponibles en '%s'"
+
+#: help.c:225
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "ordres de git disponibles d'altres llocs en el vostre $PATH"
+
+#: help.c:256
+msgid "These are common Git commands used in various situations:"
+msgstr ""
+"Aquestes són ordres del Git habitualment usades en diverses situacions:"
 
-#: sequencer.c:598
+#: help.c:321
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "no s'ha pogut aplicar %s...%s"
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr ""
+"'%s' sembla una ordre de git, però no hem pogut\n"
+"executar-la. Pot ser que git-%s estigui malmès?"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "conjunt de comissions buit passat"
+#: help.c:376
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Ai. El vostre sistema no informa de cap ordre de Git."
 
-#: sequencer.c:641
+#: help.c:398
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: s'ha fallat en llegir l'índex"
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr ""
+"ADVERTÈNCIA: Heu invocat una ordre de Git amb nom '%s', la qual no "
+"existeix.\n"
+"S'està continuant sota l'assumpció que volíeu dir '%s'"
 
-#: sequencer.c:645
+#: help.c:403
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: s'ha fallat en actualitzar l'índex"
+msgid "in %0.1f seconds automatically..."
+msgstr "en %0.1f segons automàticament..."
+
+#: help.c:410
+#, c-format
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s' no és una ordre de git. Vegeu 'git --help'."
 
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "No es pot revertir durant una altra reversió."
+#: help.c:414 help.c:480
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Volíeu dir això?"
+msgstr[1] ""
+"\n"
+"Volíeu dir un d'aquests?"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "No es pot revertir durant un recull de cireres."
+#: help.c:476
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "No es pot recollir cireres durant una reversió."
+#: ident.c:343
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"*** Si us plau, digueu-me qui sou.\n"
+"\n"
+"Executeu\n"
+"\n"
+"  git config --global user.email \"usuari@domini.com\"\n"
+"  git config --global user.name \"El vostre nom\"\n"
+"\n"
+"per a establir la identitat predeterminada del vostre compte.\n"
+"Ometeu --global per a establir la identitat només en aquest dipòsit.\n"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "No es pot recollir cireres durant altre recull de cireres."
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "no s'ha proporcionat cap adreça electrònica i la detecció automàtica està inhabilitada"
 
-#: sequencer.c:732
+#: ident.c:372
 #, c-format
-msgid "Could not parse line %d."
-msgstr "No s'ha pogut analitzar la línia %d."
+msgid "unable to auto-detect email address (got '%s')"
+msgstr "no s'ha pogut detectar automàticament una adreça de correu vàlida ('%s' rebut)"
 
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "No s'ha analitzat cap comissió."
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "no s'ha proporcionat cap nom i la detecció automàtica està inhabilitada"
 
-#: sequencer.c:749
+#: ident.c:388
 #, c-format
-msgid "Could not open %s"
-msgstr "No s'ha pogut obrir %s"
+msgid "unable to auto-detect name (got '%s')"
+msgstr "no s'ha pogut detectar automàticament el nom ('%s' rebut)"
 
-#: sequencer.c:753
+#: ident.c:396
 #, c-format
-msgid "Could not read %s."
-msgstr "No s'ha pogut llegir %s."
+msgid "empty ident name (for <%s>) not allowed"
+msgstr ""
 
-#: sequencer.c:760
+#: ident.c:402
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Full d'instruccions inusable: %s"
+msgid "name consists only of disallowed characters: %s"
+msgstr ""
 
-#: sequencer.c:790
+#: ident.c:417 builtin/commit.c:611
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Clau no vàlida: %s"
+msgid "invalid date format: %s"
+msgstr "format de data no vàlid: %s"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#: lockfile.c:152
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Valor no vàlid per a %s: %s"
+msgid ""
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
+msgstr ""
+"No s'ha pogut crear '%s.lock': %s.\n"
+"\n"
+"Sembla que un altre procés de git s'està executant en aquest\n"
+"dipòsit, per exemple, un editor obert per 'git commit'. Si us\n"
+"plau, assegureu-vos que tots els processos s'hagin terminat i\n"
+"llavors proveu de nou. Si encara falla, pot ser que un procés de\n"
+"git ha tingut una pana:\n"
+"elimineu el fitxer manualment per a continuar."
 
-#: sequencer.c:803
+#: lockfile.c:160
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Full d'opcions mal format: %s"
+msgid "Unable to create '%s.lock': %s"
+msgstr "No s'ha pogut crear '%s.lock': %s"
 
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "un recull de cireres o una reversió ja està en curs"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "s'ha produït un error en llegir la memòria cau"
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "intenteu \"git cherry-pick (--continue | --quit | --abort)\""
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
+msgid "unable to write new index file"
+msgstr "no s'ha pogut escriure un fitxer d'índex nou"
 
-#: sequencer.c:827
-#, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "No s'ha pogut crear el directori de seqüenciador %s"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(comissió errònia)\n"
 
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "ni hi ha cap recull de cireres ni cap reversió en curs"
+#: merge-recursive.c:231 merge-recursive.c:239
+#, c-format
+msgid "addinfo_cache failed for path '%s'"
+msgstr "addinfo_cache ha fallat per al camí '%s'"
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "no es pot resoldre HEAD"
+#: merge-recursive.c:303
+msgid "error building trees"
+msgstr "error en construir arbres"
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "no es pot avortar des d'una branca que encara ha de nàixer"
+#: merge-recursive.c:727
+#, c-format
+msgid "failed to create path '%s'%s"
+msgstr "s'ha produït un error en crear el camí '%s'%s"
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
+#: merge-recursive.c:738
 #, c-format
-msgid "cannot open %s"
-msgstr "no es pot obrir %s"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "S'està eliminant %s per a fer espai per al subdirectori\n"
+
+#: merge-recursive.c:752 merge-recursive.c:771
+msgid ": perhaps a D/F conflict?"
+msgstr ": potser un conflicte D/F?"
 
-#: sequencer.c:888
+#: merge-recursive.c:761
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "no es pot llegir %s: %s"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "s'està refusant perdre el fitxer no seguit a '%s'"
 
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "final de fitxer inesperat"
+#: merge-recursive.c:803 builtin/cat-file.c:34
+#, c-format
+msgid "cannot read object %s '%s'"
+msgstr "no es pot llegir l'objecte %s '%s'"
 
-#: sequencer.c:895
+#: merge-recursive.c:805
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "el fitxer HEAD emmagatzemat abans del recull de cireres '%s' és malmès"
+msgid "blob expected for %s '%s'"
+msgstr "blob esperat per a %s '%s'"
 
-#: sequencer.c:921
+#: merge-recursive.c:829
 #, c-format
-msgid "Could not format %s."
-msgstr "No s'ha pogut formatar %s."
+msgid "failed to open '%s': %s"
+msgstr "s'ha produït un error en obrir '%s': %s"
 
-#: sequencer.c:1066
+#: merge-recursive.c:840
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: no es pot recollir com a cirera un %s"
+msgid "failed to symlink '%s': %s"
+msgstr "s'ha produït un error en fer l'enllaç simbòlic '%s': %s"
 
-#: sequencer.c:1069
+#: merge-recursive.c:845
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: revisió dolenta"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "no se sap què fer amb %06o %s '%s'"
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "No es pot revertir com a comissió inicial"
+#: merge-recursive.c:985
+msgid "Failed to execute internal merge"
+msgstr "S'ha produït un error en executar la fusió interna"
 
-#: setup.c:160
+#: merge-recursive.c:989
 #, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s: no hi ha tal camí en l'arbre de treball.\n"
-"Useu 'git <ordre> -- <camí>...' per a especificar camins que no existeixin "
-"localment."
+msgid "Unable to add %s to database"
+msgstr "No s'ha pogut afegir %s a la base de dades"
 
-#: setup.c:173
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
-"paràmetre ambigu '%s': revisió no coneguda o camí no en l'arbre de treball.\n"
-"Useu '--' per a separar els camins de les revisions, com això:\n"
-"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre."
 
-#: setup.c:223
+#: merge-recursive.c:1097
 #, c-format
 msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
 msgstr ""
-"paràmetre ambigu '%s': ambdós una revisió i un nom de fitxer\n"
-"Useu '--' per a separar els camins de les revisions, com això:\n"
-"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s a %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre."
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
+#: merge-recursive.c:1104
 #, c-format
-msgid "failed to read %s"
-msgstr "s'ha fallat en llegir %s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre a %s."
 
-#: setup.c:468
+#: merge-recursive.c:1109
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "S'esperava una versió de dipòsit de git <= %d, s'ha trobat %d"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
+msgstr ""
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s a %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre a %s."
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "s'han trobat extensions de dipòsit desconegudes:"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "canvi de nom"
 
-#: setup.c:762
-#, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "No un dipòsit de git (ni cap dels directoris pares): %s"
-
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "No es pot tornar al directori de treball actual"
-
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "No s'ha pogut llegir el directori de treball actual"
-
-#: setup.c:920
-#, c-format
-msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-"No un dipòsit de git (ni cap pare fins el punt de muntatge %s)\n"
-"S'atura a la frontera de sistema de fitxers (GIT_DISCOVERY_ACROSS_FILESYSTEM "
-"no està establert)."
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "canviat de nom"
 
-#: setup.c:927
+#: merge-recursive.c:1200
 #, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "No es pot canviar a '%s/..'"
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s és un directori en %s; s'està afegint com a %s en lloc d'això"
 
-#: setup.c:989
+#: merge-recursive.c:1225
 #, c-format
 msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
-"Problema amb el valor de mode de fitxer core.sharedRepository (0%.3o).\n"
-"El propietari dels fitxers sempre ha de tenir permissions de lectura i "
-"escriptura."
+"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom \"%s\"->\"%s\" en la "
+"branca \"%s\" canvi de nom \"%s\"->\"%s\" en \"%s\"%s"
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "desplaçament abans de la fi del fitxer de paquet (.idx trencat?)"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (deixat sense resolució)"
 
-#: sha1_file.c:2434
+#: merge-recursive.c:1292
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
-"desplaçament abans d'inici d'índex de paquet per a %s (índex corromput?)"
+"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom %s->%s en %s. Canvi de "
+"nom %s->%s en %s"
 
-#: sha1_file.c:2438
+#: merge-recursive.c:1325
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-"desplaçament més enllà de la fi d'índex de paquet per a %s (índex truncat?)"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "S'està canviant el nom de %s a %s i %s a %s en lloc d'això"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+#: merge-recursive.c:1528
+#, c-format
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
-"Git normalment mai crea una referència que acabi amb 40 caràcters\n"
-"hexadecimals perquè s'ignorarà quan només especifiqueu 40 caràcters\n"
-"hexadecimals. Aquestes referències es poden crear per error. Per\n"
-"exemple,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"on \"$br\" és d'alguna manera buit i una referència de 40 caràcters\n"
-"hexadecimals. Si us plau, examineu aquestes referències i potser\n"
-"suprimiu-les. Desactiveu aquest missatge executant\n"
-"\"git config advice.objectNameWarning false\""
+"CONFLICTE (canvi de nom/afegiment): Canvi de nom %s->%s en %s. %s afegit en "
+"%s"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"No es pot canviar un .gitmodules no fusionat, primer resoldreu els "
-"conflictes de fusió"
+#: merge-recursive.c:1543
+#, c-format
+msgid "Adding merged %s"
+msgstr "S'està afegint %s fusionat"
 
-#: submodule.c:68 submodule.c:102
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "No s'ha pogut trobar la secció en .gitmodules on path=%s"
+msgid "Adding as %s instead"
+msgstr "S'està afegint com a %s en lloc d'això"
 
-#: submodule.c:76
+#: merge-recursive.c:1607
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "No s'ha pogut actualitzar l'entrada de .gitmodules %s"
+msgid "cannot read object %s"
+msgstr "no es pot llegir l'objecte %s"
 
-#: submodule.c:109
+#: merge-recursive.c:1610
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "No s'ha pogut eliminar l'entrada de .gitmodules per a %s"
+msgid "object %s is not a blob"
+msgstr "l'objecte %s no és un blob"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "L'allistament del .gitmodules actualitzat ha fallat"
+#: merge-recursive.c:1679
+msgid "modify"
+msgstr "modificació"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "no es permeten els valors negatius a submodule.fetchJobs"
+#: merge-recursive.c:1679
+msgid "modified"
+msgstr "modificat"
 
-#: submodule-config.c:358
-#, c-format
-msgid "invalid value for %s"
-msgstr "valor no vàlid per a %s"
+#: merge-recursive.c:1689
+msgid "content"
+msgstr "contingut"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "l'execució de l'ordre de remolc '%s' ha fallat"
+#: merge-recursive.c:1696
+msgid "add/add"
+msgstr "afegiment/afegiment"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: merge-recursive.c:1732
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "valor desconegut '%s' per a la clau '%s'"
+msgid "Skipped %s (merged same as existing)"
+msgstr "S'ha omès %s (el fusionat és igual a l'existent)"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: merge-recursive.c:1746
 #, c-format
-msgid "more than one %s"
-msgstr "més d'un %s"
+msgid "Auto-merging %s"
+msgstr "S'està autofusionant %s"
+
+#: merge-recursive.c:1750 git-submodule.sh:944
+msgid "submodule"
+msgstr "submòdul"
 
-#: trailer.c:582
+#: merge-recursive.c:1751
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "fitxa de remolc buida en el remolc '%.*s'"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "CONFLICTE (%s): Conflicte de fusió en %s"
 
-#: trailer.c:702
+#: merge-recursive.c:1845
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "no s'ha pogut llegir el fitxer d'entrada '%s'"
+msgid "Removing %s"
+msgstr "S'està eliminant %s"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "No s'ha pogut llegir des d'stdin"
+#: merge-recursive.c:1871
+msgid "file/directory"
+msgstr "fitxer/directori"
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "no s'ha pogut fer stat a %s"
+#: merge-recursive.c:1877
+msgid "directory/file"
+msgstr "directori/fitxer"
 
-#: trailer.c:859
+#: merge-recursive.c:1883
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "el fitxer %s no és un fitxer regular"
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr ""
+"CONFLICTE (%s): Hi ha un directori amb nom %s en %s. S'està afegint %s com a "
+"%s"
 
-#: trailer.c:861
+#: merge-recursive.c:1892
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "el fitxer %s no és gravable per l'usuari"
+msgid "Adding %s"
+msgstr "S'està afegint %s"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "no s'ha pogut obrir el fitxer temporal"
+#: merge-recursive.c:1929
+msgid "Already up-to-date!"
+msgstr "Ja està al dia!"
 
-#: trailer.c:912
+#: merge-recursive.c:1938
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "no s'ha pogut canviar el nom del fitxer temporal a %s"
+msgid "merging of trees %s and %s failed"
+msgstr "la fusió dels arbres %s i %s ha fallat"
 
-#: transport.c:62
+#: merge-recursive.c:2021
+msgid "Merging:"
+msgstr "Fusionant:"
+
+#: merge-recursive.c:2034
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Canviaria la font de '%s' a '%s' de '%s'\n"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "s'ha trobat %u avantpassat en comú:"
+msgstr[1] "s'han trobat %u avantpassats en comú:"
 
-#: transport.c:151
+#: merge-recursive.c:2073
+msgid "merge returned no commit"
+msgstr "la fusió no ha retornat cap comissió"
+
+#: merge-recursive.c:2136
 #, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport: opció de profunditat no vàlida '%s'"
+msgid "Could not parse object '%s'"
+msgstr "No s'ha pogut analitzar l'objecte '%s'"
+
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
+msgid "Unable to write index."
+msgstr "No s'ha pogut escriure l'índex."
 
-#: transport.c:771
+#: notes-merge.c:273
 #, c-format
 msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
 msgstr ""
-"Els camins de submòdul següents contenen canvis que no\n"
-"es poden trobar en cap remot:\n"
+"No heu acabat la vostra fusió de notes prèvia (%s existeix).\n"
+"Si us plau, useu 'git notes merge --commit' o 'git notes merge --abort' per "
+"a cometre/avortar la fusió prèvia abans de començar una fusió de notes nova."
 
-#: transport.c:775
+#: notes-merge.c:280
 #, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-"\n"
-"Si us plau, intenteu\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"o canviar de directori al camí i useu\n"
-"\n"
-"\tgit push\n"
-"\n"
-"per a pujar-los a un remot.\n"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "No heu conclòs la vostra fusió de notes (%s existeix)."
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "S'està avortant."
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "No es pot cometre un arbre de notes no inicialitzat / no referenciat"
 
-#: transport-helper.c:1041
+#: notes-utils.c:100
 #, c-format
-msgid "Could not read ref %s"
-msgstr "No s'ha pogut llegir la referència %s"
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Valor de notes.rewriteMode erroni: '%s'"
 
-#: unpack-trees.c:64
+#: notes-utils.c:110
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"agafar:\n"
-"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
-"canviar de branca."
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "S'està refusant reescriure les notes en %s (fora de refs/notes/)"
 
-#: unpack-trees.c:66
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"agafar:\n"
-"%%s"
+msgid "Bad %s value: '%s'"
+msgstr "Valor erroni de %s: '%s'"
 
-#: unpack-trees.c:69
+#: object.c:240
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"fusionar:\n"
-"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
-"fusionar."
+msgid "unable to parse object: %s"
+msgstr "no s'ha pogut analitzar l'objecte: %s"
 
-#: unpack-trees.c:71
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per "
-"fusionar:\n"
-"%%s"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: unpack-trees.c:74
+#: parse-options.c:590
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
-"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de %s."
+msgid "usage: %s"
+msgstr "ús: %s"
 
-#: unpack-trees.c:76
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
-"%%s"
+msgid "   or: %s"
+msgstr " o: %s"
 
-#: unpack-trees.c:81
+#: parse-options.c:597
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"Actualitzar els directoris següents perdria fitxers no seguits en el:\n"
-"%s"
+msgid "    %s"
+msgstr "    %s"
+
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
 
-#: unpack-trees.c:85
+#: parse-options-cb.c:108
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"agafar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
+msgid "malformed object name '%s'"
+msgstr "nom d'objecte mal format '%s'"
 
-#: unpack-trees.c:87
+#: path.c:810
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"agafar:\n"
-"%%s"
+msgid "Could not make %s writable by group"
+msgstr "No s'ha pogut fer %s escrivible pel grup"
 
-#: unpack-trees.c:90
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
+msgstr "El caràcter d'escapament '\\' no està permès com a últim caràcter en un valor d'un atribut"
+
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
+msgstr "només es permet una especificació 'attr:'."
+
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "una especificació d'atribut no pot estar buida"
+
+#: pathspec.c:189
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
+msgid "invalid attribute name %s"
+msgstr "nom d'atribut no vàlid %s"
+
+#: pathspec.c:254
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"fusionar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
+"els ajusts d'especificació de camí 'glob' i 'noglob' globals són "
+"incompatibles"
 
-#: unpack-trees.c:92
-#, c-format
+#: pathspec.c:261
 msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
-"fusionar:\n"
-"%%s"
+"l'ajust d'especificació de camí 'literal' global és incompatible amb tots "
+"els altres ajusts d'especificació de camí globals"
 
-#: unpack-trees.c:95
+#: pathspec.c:301
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "paràmetre no vàlid per a la màgia d'especificació de camí 'prefix'"
+
+#: pathspec.c:322
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de %s."
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "Màgia d'especificació de camí no vàlida '%.*s' en '%s'"
 
-#: unpack-trees.c:97
+#: pathspec.c:327
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
-"%%s"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "')' mancant al final de la màgia d'especificació de camí en '%s'"
 
-#: unpack-trees.c:102
+#: pathspec.c:365
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"agafar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Màgia d'especificació de camí no implementada '%c' en '%s'"
 
-#: unpack-trees.c:104
+#: pathspec.c:421 pathspec.c:443
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"agafar:\n"
-"%%s"
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "L'especificació '%s' és en el submòdul '%.*s'"
 
-#: unpack-trees.c:107
+#: pathspec.c:483
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"fusionar:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal' i 'glob' són incompatibles"
 
-#: unpack-trees.c:109
+#: pathspec.c:496
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"fusionar:\n"
-"%%s"
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s' és fora del dipòsit"
 
-#: unpack-trees.c:112
+#: pathspec.c:584
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"%s:\n"
-"%%sSi us plau, moveu-los o elimineu-los abans de %s."
+msgid "'%s' (mnemonic: '%c')"
+msgstr "'%s' (mnemònic: '%c')"
 
-#: unpack-trees.c:114
+#: pathspec.c:594
 #, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr ""
+"%s: aquesta ordre no està admesa amb la màgia d'especificació de camí: %s"
+
+#: pathspec.c:644
 msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
-"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
-"%s:\n"
-"%%s"
+"es faran no vàlides les cadenes buides com especificacions de camí en "
+"versions futures. Si us plau, useu . en lloc d'això si volíeu coincidir amb "
+"tots els camins"
 
-#: unpack-trees.c:121
+#: pathspec.c:668
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "L'entrada '%s' encavalca amb '%s'.  No es pot vincular."
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "l'especificació de camí '%s' és més enllà d'un enllaç simbòlic"
 
-#: unpack-trees.c:124
-#, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"No es pot actualitzar l'agafament parcial: les entrades següents no estan al "
-"dia:\n"
-"%s"
+#: pretty.c:982
+msgid "unable to parse --pretty format"
+msgstr "no s'ha pogut analitzar el format --pretty"
 
-#: unpack-trees.c:126
+#: read-cache.c:1442
 #, c-format
 msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"Els fitxers següents en l'arbre de treball se sobreescriurien per "
-"actualitzar l'agafament parcial:\n"
-"%s"
+"index.version està establerta, però el valor no és vàlid.\n"
+"S'està usant la versió %i"
 
-#: unpack-trees.c:128
+#: read-cache.c:1452
 #, c-format
 msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"Els fitxers següents en l'arbre de treball s'eliminarien per actualitzar "
-"l'agafament parcial:\n"
-"%s"
+"GIT_INDEX_VERSION està establerta, però el valor no és vàlid.\n"
+"S'està usant la versió %i"
 
-#: unpack-trees.c:205
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
 #, c-format
-msgid "Aborting\n"
-msgstr "S'està avortant\n"
+msgid "could not stat '%s'"
+msgstr "no s'ha pogut fer stat a '%s'"
 
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "S'està agafant fitxers"
+#: read-cache.c:2388
+#, c-format
+msgid "unable to open git dir: %s"
+msgstr "no s'ha pogut obrir el directori git: %s"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "l'esquema d'URL no és vàlid o li manca el sufix '://'"
+#: read-cache.c:2400
+#, c-format
+msgid "unable to unlink: %s"
+msgstr "no s'ha pogut desenllaçar: %s"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: refs.c:620 builtin/merge.c:844
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "seqüència d'escapament %XX no vàlida"
+msgid "Could not open '%s' for writing"
+msgstr "No s'ha pogut obrir '%s' per a escriptura"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "manca la màquina i l'esquema no és 'file:'"
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
+msgstr ""
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "un URL 'file:' no pot tenir número de port"
+#: refs/files-backend.c:1631
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "no s'ha pogut suprimir la referència %s: %s"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "hi ha caràcters no vàlids en el nom de màquina"
+#: refs/files-backend.c:1634
+#, c-format
+msgid "could not delete references: %s"
+msgstr "no s'ha pogut suprimir les referències: %s"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "número de port no vàlid"
+#: refs/files-backend.c:1643
+#, c-format
+msgid "could not remove reference %s"
+msgstr "no s'ha pogut eliminar la referència %s"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "segment de camí '..' no vàlid"
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "no hi és"
 
-#: worktree.c:282
+#: ref-filter.c:36
 #, c-format
-msgid "failed to read '%s'"
-msgstr "s'ha fallat en llegir '%s'"
+msgid "ahead %d"
+msgstr "davant per %d"
 
-#: wrapper.c:222 wrapper.c:392
+#: ref-filter.c:37
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "no s'ha pogut obrir '%s' per a lectura i escriptura"
+msgid "behind %d"
+msgstr "darrere per %d"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: ref-filter.c:38
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "no s'ha pogut obrir '%s' per a escriptura"
+msgid "ahead %d, behind %d"
+msgstr "davant per %d, darrere per %d"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: ref-filter.c:104
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "no s'ha pogut obrir '%s' per a lectura"
+msgid "expected format: %%(color:<color>)"
+msgstr "format esperat: %%(color:<color>)"
 
-#: wrapper.c:605 wrapper.c:626
+#: ref-filter.c:106
 #, c-format
-msgid "unable to access '%s'"
-msgstr "no s'ha pogut accedir a '%s'"
+msgid "unrecognized color: %%(color:%s)"
+msgstr "color no reconegut: %%(color:%s)"
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "no s'ha pogut obtenir el directori de treball actual"
+#: ref-filter.c:120
+#, e, c-format
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "valor enter esperat pel nom de referència:lstrip=%s"
 
-#: wrapper.c:658
+#: ref-filter.c:124
 #, c-format
-msgid "could not write to %s"
-msgstr "no s'ha pogut escriure a %s"
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "valor enter esperat pel nom de referència:rstrip=%s"
 
-#: wrapper.c:660
+#: ref-filter.c:126
 #, c-format
-msgid "could not close %s"
-msgstr "no s'ha pogut tancar %s"
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "paràmetre %%(%s) desconegut: %s"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Camins sense fusionar:"
+#: ref-filter.c:166
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) no accepta paràmetres"
 
-#: wt-status.c:177 wt-status.c:204
+#: ref-filter.c:173
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (useu \"git reset %s <fitxer>...\" per a desallistar)"
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) no accepta paràmetres"
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (useu \"git rm --cached <fitxer>...\" per a desallistar)"
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) no accepta paràmetres"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (useu \"git add <fitxer>...\" per a senyalar resolució)"
+#: ref-filter.c:199
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "valor positiu esperat conté:lines=%s"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (useu \"git add/rm <fitxer>...\" segons sigui apropiat per a senyalar "
-"resolució)"
+#: ref-filter.c:201
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "paràmetre %%(contents) no reconegut: %s"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (useu \"git rm <fitxer>...\" per a senyalar resolució)"
+#: ref-filter.c:214
+#, fuzzy, c-format
+msgid "positive value expected objectname:short=%s"
+msgstr "valor positiu esperat conté:lines=%s"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "Canvis a cometre:"
+#: ref-filter.c:218
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "paràmetre %%(objectname) no reconegut: %s"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Canvis no allistats per a cometre:"
+#: ref-filter.c:245
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "format esperat: %%(align:<amplada>,<posició>)"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (useu \"git add <fitxer>...\" per a actualitzar què es cometrà)"
-
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (useu \"git add/rm <fitxer>...\" per a actualitzar què es cometrà)"
-
-#: wt-status.c:223
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
-msgstr ""
-"  (useu \"git checkout -- <fitxer>...\" per a descartar els canvis en el "
-"directori de treball)"
-
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-"  (cometeu o descarteu el contingut modificat o no seguit en els submòduls)"
-
-#: wt-status.c:237
+#: ref-filter.c:257
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (useu \"git %s <fitxer>...\" per a incloure-ho en què es cometrà)"
+msgid "unrecognized position:%s"
+msgstr "posició no reconeguda:%s"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "suprimit per ambdós:"
+#: ref-filter.c:261
+#, c-format
+msgid "unrecognized width:%s"
+msgstr "amplada no reconeguda:%s"
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "afegit per nosaltres:"
+#: ref-filter.c:267
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "paràmetre %%(align) no reconegut: %s"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "suprimit per ells:"
+#: ref-filter.c:271
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "amplada positiva esperada amb l'àtom %%(align)"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "afegit per ells:"
+#: ref-filter.c:286
+#, c-format
+msgid "unrecognized %%(if) argument: %s"
+msgstr "paràmetre %%(if) no reconegut: %s"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "suprimit per nosaltres:"
+#: ref-filter.c:371
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "nom de camp mal format: %.*s"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "afegit per ambdós:"
+#: ref-filter.c:397
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "nom de camp desconegut: %.*s"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "modificat per ambdós:"
+#: ref-filter.c:501
+#, fuzzy, c-format
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "fitxer nou:"
+#: ref-filter.c:561
+#, fuzzy, c-format
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "copiat:"
+#: ref-filter.c:563
+#, fuzzy, c-format
+msgid "format: %%(then) atom used more than once"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "suprimit:"
+#: ref-filter.c:565
+#, fuzzy, c-format
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "format: manca l'àtom %%(end)"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "modificat:"
+#: ref-filter.c:591
+#, fuzzy, c-format
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "canviat de nom:"
+#: ref-filter.c:593
+#, fuzzy, c-format
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "canviat de tipus:"
+#: ref-filter.c:595
+#, fuzzy, c-format
+msgid "format: %%(else) atom used more than once"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "desconegut:"
+#: ref-filter.c:608
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "format: s'ha usat l'àtom %%(end) sense l'àtom corresponent"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "sense fusionar:"
+#: ref-filter.c:663
+#, c-format
+msgid "malformed format string %s"
+msgstr "cadena de format mal format %s"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "comissions noves, "
+#: ref-filter.c:1247
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(cap branca, s'està rebasant %s)"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "contingut modificat, "
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(cap branca, bisecció començada en %s)"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "contingut no seguit, "
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
+#, c-format
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD separat a %s)"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Submòduls canviats però no actualitzats:"
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD separat de %s)"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Canvis de submòdul a cometre:"
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(cap branca)"
 
-#: wt-status.c:839
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr ""
-"No toqueu la línia de sobre.\n"
-"Tot el que hi ha a sota s'eliminarà."
+#: ref-filter.c:1420 ref-filter.c:1451
+#, c-format
+msgid "missing object %s for %s"
+msgstr "manca l'objecte %s per a %s"
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Teniu camins sense fusionar."
+#: ref-filter.c:1423 ref-filter.c:1454
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer ha fallat en %s per a %s"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (arregleu els conflictes i executeu \"git commit\")"
+#: ref-filter.c:1692
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "objecte mal format a '%s'"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (useu \"git merge --abort\" per a avortar la fusió)"
+#: ref-filter.c:1759
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "s'està ignorant la referència amb nom malmès %s"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Tots els conflictes estan arreglats però encara esteu fusionant."
+#: ref-filter.c:1764
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "s'està ignorant la referència trencada %s"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (useu \"git commit\" per a concloure la fusió)"
+#: ref-filter.c:2028
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: manca l'àtom %%(end)"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Esteu enmig d'una sessió am."
+#: ref-filter.c:2109
+#, c-format
+msgid "malformed object name %s"
+msgstr "nom d'objecte %s mal format"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "El pedaç actual està buit."
+#: remote.c:754
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "No es poden obtenir ambdós %s i %s a %s"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
+#: remote.c:758
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s generalment segueix %s, no %s"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (useu \"git am --skip\" per a ometre aquest pedaç)"
+#: remote.c:762
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s segueix ambdós %s i %s"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (useu \"git am --abort\" per a restaurar la branca original)"
+#: remote.c:770
+msgid "Internal error"
+msgstr "Error intern"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "No s'ha fet cap ordre."
+#: remote.c:1685 remote.c:1787
+msgid "HEAD does not point to a branch"
+msgstr "HEAD no assenyala cap branca"
 
-#: wt-status.c:1112
+#: remote.c:1694
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Última ordre feta (%d ordre feta):"
-msgstr[1] "Últimes ordres fetes (%d ordres fetes):"
+msgid "no such branch: '%s'"
+msgstr "no hi ha tal branca: '%s'"
 
-#: wt-status.c:1123
+#: remote.c:1697
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (vegeu més en el fitxer %s)"
-
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "No manca cap ordre."
+msgid "no upstream configured for branch '%s'"
+msgstr "cap font configurada per a la branca '%s'"
 
-#: wt-status.c:1131
+#: remote.c:1703
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Ordre següent a fer (manca %d ordre):"
-msgstr[1] "Ordres següents a fer (manquen %d ordres):"
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "la branca font '%s' no s'emmagatzema com a branca amb seguiment remot"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (useu \"git rebase --edit-todo\" per a veure i editar)"
+#: remote.c:1718
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr ""
+"el destí de pujada '%s' en el remot '%s' no té cap branca seguidora local"
 
-#: wt-status.c:1152
+#: remote.c:1730
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Actualment esteu rebasant la branca '%s' en '%s'."
+msgid "branch '%s' has no remote for pushing"
+msgstr "la branca '%s' no té cap remot al qual pujar"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Actualment esteu rebasant."
+#: remote.c:1741
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "les especificacions de referència de '%s' no inclouen '%s'"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-"  (arregleu els conflictes i després executeu \"git rebase --continue\")"
+#: remote.c:1754
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "push no té destí (push.default és 'nothing')"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (useu \"git rebase --skip\" per a saltar aquest pedaç)"
+#: remote.c:1776
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "no es pot resoldre una pujada 'simple' a un sol destí"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (useu \"git rebase --abort\" per a agafar la branca original)"
+#: remote.c:2081
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "La vostra branca està basada en '%s', però la font no hi és.\n"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (tots els conflictes arreglats: executeu \"git rebase --continue\")"
+#: remote.c:2085
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (useu \"git branch --unset-upstream\" per a arreglar)\n"
 
-#: wt-status.c:1185
+#: remote.c:2088
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Actualment esteu dividint una comissió mentre rebaseu la branca '%s' en '%s'."
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "La vostra branca està al dia amb '%s'.\n"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Actualment esteu dividint una comissió durant un rebasament."
+#: remote.c:2092
+#, c-format
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "La vostra branca està davant de '%s' per %d comissió.\n"
+msgstr[1] "La vostra branca està davant de '%s' per %d comissions.\n"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
-"rebase --continue\")"
+#: remote.c:2098
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (useu \"git push\" per a publicar les vostres comissions locals)\n"
 
-#: wt-status.c:1197
+#: remote.c:2101
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Actualment esteu editant una comissió mentre rebaseu la branca '%s' en '%s'."
-
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Actualment esteu editant una comissió durant un rebasament."
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"La vostra branca està darrere de '%s' per %d comissió, i pot avançar-se "
+"ràpidament.\n"
+msgstr[1] ""
+"La vostra branca està darrere de '%s' per %d comissions, i pot avançar-se "
+"ràpidament.\n"
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (useu \"git commit --amend\" per a esmenar la comissió actual)"
+#: remote.c:2109
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr " (useu \"git pull\" per a actualitzar la vostra branca local)\n"
 
-#: wt-status.c:1207
+#: remote.c:2112
+#, c-format
 msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"La vostra branca i '%s' s'han divergit,\n"
+"i tenen %d i %d comissió distinta cada una, respectivament.\n"
+msgstr[1] ""
+"La vostra branca i '%s' s'han divergit,\n"
+"i tenen %d i %d comissions distintes cada una, respectivament.\n"
+
+#: remote.c:2122
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr "  (useu \"git pull\" per a fusionar la branca remota a la vostra)\n"
+
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "la vostra branca actual sembla malmesa"
+
+#: revision.c:2161
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "la vostra branca actual '%s' encara no té cap comissió"
+
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent és incompatible amb --bisect"
+
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "s'ha produït un error en obrir /dev/null"
+
+#: run-command.c:127
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) ha fallat"
+
+#: send-pack.c:150
+#, c-format
+msgid "unable to parse remote unpack status: %s"
+msgstr "no s'ha pogut analitzar l'estat del desempaquetament remot: %s"
+
+#: send-pack.c:152
+#, c-format
+msgid "remote unpack failed: %s"
+msgstr "s'ha produït un error en el desempaquetament remot: %s"
+
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
+msgstr "s'ha produït un error en signar el certificat de pujada"
+
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
+msgstr "el destí receptor no admet pujar --signed"
+
+#: send-pack.c:430
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"  (useu \"git rebase --continue\" una vegada que esteu satisfet amb els "
-"vostres canvis)"
+"no s'està enviant una certificació de pujada perquè el destí receptor no "
+"admet pujar --signed"
+
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
+msgstr "el destí receptor no admet pujar --atomic"
+
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
+msgstr "el destí receptor no admet opcions de pujada"
+
+#: sequencer.c:215
+msgid "revert"
+msgstr "revertir"
+
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "cherry-pick"
+
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
+
+#: sequencer.c:221
+#, c-format
+msgid "Unknown action: %d"
+msgstr "Acció desconeguda: %d"
+
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"després de resoldre els conflictes, marqueu els camins\n"
+"corregits amb 'git add <camins>' o 'git rm <camins>'"
+
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"després de resoldre els conflictes, marqueu els camins\n"
+"corregits amb 'git add <camins>' o 'git rm <camins>'\n"
+"i cometeu el resultat amb 'git commit'"
+
+#: sequencer.c:294 sequencer.c:1682
+#, c-format
+msgid "could not lock '%s'"
+msgstr "no s'ha pogut bloquejar '%s'"
+
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
+#, c-format
+msgid "could not write to '%s'"
+msgstr "no s'ha pogut escriure a '%s'"
+
+#: sequencer.c:301
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "no s'ha pogut escriure el terminador de línia a '%s'"
+
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "s'ha produït un error en finalitzar '%s'."
+
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
+#, c-format
+msgid "could not read '%s'"
+msgstr "no s'ha pogut llegir '%s'"
+
+#: sequencer.c:355
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "els vostres canvis locals se sobreescriurien per %s."
+
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "cometeu els vostres canvis o emmagatzemeu-los per a procedir."
+
+#: sequencer.c:388
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: avanç ràpid"
+
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: No s'ha pogut escriure un fitxer d'índex nou"
+
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "no s'ha pogut resoldre la comissió HEAD\n"
+
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "no s'ha pogut actualitzar l'arbre cau\n"
+
+#: sequencer.c:592
+#, c-format
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
+msgstr ""
+"teniu canvis «staged» en el vostre arbre de treball\n"
+"Si aquests canvis estan pensats per fer «squash» a la comissió prèvia, "
+"executeu:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"Si són per a formar una comissió nova, executeu:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"En ambdós casos, quan hàgiu terminat, continueu amb:\n"
+"\n"
+"  git rebase --continue\n"
+
+#: sequencer.c:694
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "no s'ha pogut analitzar la comissió %s\n"
+
+#: sequencer.c:699
+#, c-format
+msgid "could not parse parent commit %s\n"
+msgstr "no s'ha pogut analitzar la comissió pare %s\n"
+
+#: sequencer.c:821
+#, c-format
+msgid ""
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
+msgstr ""
+"Primera línia del missatge de «squash» no esperada:\n"
+"\n"
+"\t%.*s"
+
+#: sequencer.c:827
+#, c-format
+msgid ""
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
+msgstr ""
+"Primera línia del missatge de «squash» no vàlida:\n"
+"\n"
+"\t%.*s"
+
+#: sequencer.c:833 sequencer.c:858
+#, c-format
+msgid "This is a combination of %d commits."
+msgstr "Això és una combinació de %d comissions."
+
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "cal un HEAD per reparar-ho"
+
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "no s'ha pogut llegir HEAD"
+
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
+msgstr "no s'ha pogut llegir el missatge de comissió de HEAD"
+
+#: sequencer.c:852
+#, c-format
+msgid "cannot write '%s'"
+msgstr "no es pot escriure '%s'"
+
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "Aquest és el 1r missatge de comissió:"
+
+#: sequencer.c:869
+#, c-format
+msgid "could not read commit message of %s"
+msgstr "no s'ha pogut llegir el missatge de comissió: %s"
+
+#: sequencer.c:876
+#, c-format
+msgid "This is the commit message #%d:"
+msgstr "Aquest és el missatge de comissió #%d:"
+
+#: sequencer.c:881
+#, c-format
+msgid "The commit message #%d will be skipped:"
+msgstr "El missatge de comissió núm. #%d s'ometrà:"
+
+#: sequencer.c:886
+#, c-format
+msgid "unknown command: %d"
+msgstr "ordre desconeguda: %d"
+
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "el vostre fitxer d'índex està sense fusionar."
+
+#: sequencer.c:970
+#, c-format
+msgid "commit %s is a merge but no -m option was given."
+msgstr "la comissió %s és una fusió però no s'ha donat cap opció -m."
+
+#: sequencer.c:978
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "la comissió %s no té pare %d"
+
+#: sequencer.c:982
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
+msgstr ""
+"s'ha especificat la línia principal però la comissió %s no és una fusió."
+
+#: sequencer.c:988
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "no es pot obtenir el missatge de comissió de %s"
+
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: no es pot analitzar la comissió pare %s"
+
+#: sequencer.c:1071 sequencer.c:1827
+#, c-format
+msgid "could not rename '%s' to '%s'"
+msgstr "no s'ha pogut canviar el nom '%s' a '%s'"
+
+#: sequencer.c:1122
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "no s'ha pogut revertir %s... %s"
+
+#: sequencer.c:1123
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "no s'ha pogut aplicar %s... %s"
+
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "conjunt de comissions buit passat"
+
+#: sequencer.c:1175
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: s'ha produït un error en llegir l'índex"
+
+#: sequencer.c:1182
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: s'ha produït un error en actualitzar l'índex"
+
+#: sequencer.c:1303
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "línia no vàlida %d: %.*s"
+
+#: sequencer.c:1311
+#, c-format
+msgid "cannot '%s' without a previous commit"
+msgstr "No es pot '%s' sense una comissió prèvia"
+
+#: sequencer.c:1344
+#, c-format
+msgid "could not read '%s'."
+msgstr "no s'ha pogut llegir '%s'."
+
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "si us plau, corregiu-ho això usant 'git rebase --edit-todo'."
+
+#: sequencer.c:1358
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "full d'instruccions inusable: '%s'"
+
+#: sequencer.c:1363
+msgid "no commits parsed."
+msgstr "no s'ha analitzat cap comissió."
+
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
+msgstr "no es pot fer «cherry pick» durant una reversió."
+
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
+msgstr "no es pot revertir durant un «cherry pick»."
+
+#: sequencer.c:1439
+#, c-format
+msgid "invalid key: %s"
+msgstr "clau no vàlida: %s"
+
+#: sequencer.c:1442
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "valor no vàlid per a %s: %s"
+
+#: sequencer.c:1499
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "full d'opcions mal format: '%s'"
+
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
+msgstr "un «cherry pick» o una reversió ja està en curs"
+
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "intenteu \"git cherry-pick (--continue | --quit | --abort)\""
+
+#: sequencer.c:1541
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "no s'ha pogut crear el directori de seqüenciador '%s'"
+
+#: sequencer.c:1555
+msgid "could not lock HEAD"
+msgstr "no s'ha pogut bloquejar HEAD"
+
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
+msgstr "ni hi ha cap «cherry pick» ni cap reversió en curs"
+
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
+msgstr "no es pot resoldre HEAD"
+
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
+msgstr "no es pot avortar des d'una branca que encara ha de nàixer"
+
+#: sequencer.c:1635 builtin/grep.c:910
+#, c-format
+msgid "cannot open '%s'"
+msgstr "no es pot obrir '%s'"
+
+#: sequencer.c:1637
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "no es pot llegir '%s': %s"
+
+#: sequencer.c:1638
+msgid "unexpected end of file"
+msgstr "final de fitxer inesperat"
+
+#: sequencer.c:1644
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "el fitxer HEAD emmagatzemat abans de fer «cherry pick» '%s' és malmès"
+
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr "Sembla que heu mogut HEAD sense rebobinar, comproveu-ho HEAD"
+
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
+msgstr "No es pot llegir HEAD"
+
+#: sequencer.c:1832 builtin/difftool.c:616
+#, c-format
+msgid "could not copy '%s' to '%s'"
+msgstr "no s'ha pogut copiar '%s' a '%s'"
+
+#: sequencer.c:1848
+msgid "could not read index"
+msgstr "no s'ha pogut llegir l'índex"
+
+#: sequencer.c:1853
+#, c-format
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"ha fallat: %s\n"
+"%sPodeu solucionar el problema, i llavors executar\n"
+"\n"
+" git rebase --continue\n"
+"\n"
+
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "i ha fet canvis a l'índex i/o l'arbre de treball\n"
+
+#: sequencer.c:1865
+#, c-format
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"L'execució ha tingut èxit: %s\n"
+"però ha deixat canvis a l'índex i/o l'arbre de treball\n"
+"Cometeu o emmagatzemeu els vostres canvis, i llavors executeu\n"
+"\n"
+" git rebase --continue\n"
+
+#: sequencer.c:1920 git-rebase.sh:169
+#, c-format
+msgid "Applied autostash."
+msgstr "S'ha aplicat el magatzem automàtic."
+
+#: sequencer.c:1932
+#, c-format
+msgid "cannot store %s"
+msgstr "no es pot emmagatzemar %s"
+
+#: sequencer.c:1934 git-rebase.sh:173
+#, c-format
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"L'aplicació del magatzem automàtic ha resultat en conflictes.\n"
+"Els vostres canvis estan segurs en el magatzem.\n"
+"Podeu executar \"git stash pop\" o \"git stash drop\" en qualsevol moment.\n"
+
+#: sequencer.c:2016
+#, c-format
+msgid "Stopped at %s...  %.*s\n"
+msgstr "Aturat a %s...  %.*s\n"
+
+#: sequencer.c:2058
+#, c-format
+msgid "unknown command %d"
+msgstr "ordre %d desconeguda"
+
+#: sequencer.c:2088
+msgid "could not read orig-head"
+msgstr "No s'ha pogut llegir orig-head"
+
+#: sequencer.c:2092
+msgid "could not read 'onto'"
+msgstr "no s'ha pogut llegir 'onto'"
+
+#: sequencer.c:2099
+#, c-format
+msgid "could not update %s"
+msgstr "no s'ha pogut analitzar %s"
+
+#: sequencer.c:2106
+#, c-format
+msgid "could not update HEAD to %s"
+msgstr "no s'ha pogut actualitzar HEAD a %s"
+
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
+msgstr "No es pot rebasar: Teniu canvis «unstaged»."
+
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "No s'ha pogut eliminar CHERRY_PICK_HEAD"
+
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
+msgstr "no es pot esmenar una comissió no existent"
+
+#: sequencer.c:2206
+#, c-format
+msgid "invalid file: '%s'"
+msgstr "fitxer no vàlid: '%s'"
+
+#: sequencer.c:2208
+#, c-format
+msgid "invalid contents: '%s'"
+msgstr "contingut no vàlid: '%s'"
+
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
+msgstr ""
+"\n"
+"Teniu canvis no comesos en el vostre arbre de treball. Si us plau,\n"
+"primer cometeu-los i després executeu 'git rebase --continue' de nou."
+
+#: sequencer.c:2221
+msgid "could not commit staged changes."
+msgstr "No s'ha pogut cometre els canvis «staged»."
+
+#: sequencer.c:2301
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: no es pot fer «cherry pick» a %s"
+
+#: sequencer.c:2305
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: revisió dolenta"
+
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
+msgstr "no es pot revertir com a comissió inicial"
+
+#: setup.c:165
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s: no hi ha tal camí en l'arbre de treball.\n"
+"Useu 'git <ordre> -- <camí>...' per a especificar camins que no existeixin "
+"localment."
+
+#: setup.c:178
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"paràmetre ambigu '%s': revisió no coneguda o camí no en l'arbre de treball.\n"
+"Useu '--' per a separar els camins de les revisions, com això:\n"
+"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
+
+#: setup.c:228
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"paràmetre ambigu '%s': ambdós una revisió i un nom de fitxer\n"
+"Useu '--' per a separar els camins de les revisions, com això:\n"
+"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
+
+#: setup.c:475
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "S'esperava una versió de dipòsit de git <= %d, s'ha trobat %d"
+
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "s'han trobat extensions de dipòsit desconegudes:"
+
+#: setup.c:776
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "No és un dipòsit de git (ni cap dels directoris pares): %s"
+
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "No es pot tornar al directori de treball actual"
+
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "No s'ha pogut llegir el directori de treball actual"
+
+#: setup.c:1022 setup.c:1028
+#, c-format
+msgid "Cannot change to '%s'"
+msgstr "No es pot canviar a '%s'"
+
+#: setup.c:1041
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"No un dipòsit de git (ni cap pare fins al punt de muntatge %s)\n"
+"S'atura a la frontera de sistema de fitxers (GIT_DISCOVERY_ACROSS_FILESYSTEM "
+"no està establert)."
+
+#: setup.c:1106
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Hi ha un problema amb el valor de mode de fitxer core.sharedRepository "
+"(0%.3o).\n"
+"El propietari dels fitxers sempre ha de tenir permisos de lectura i "
+"escriptura."
+
+#: sha1_file.c:559
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "el camí '%s' no existeix"
+
+#: sha1_file.c:585
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"Encara no se suporta el dipòsit de referència '%s' com a agafament enllaçat."
+
+#: sha1_file.c:591
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "el dipòsit de referència '%s' no és un dipòsit local."
+
+#: sha1_file.c:597
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "el dipòsit de referència '%s' és superficial"
+
+#: sha1_file.c:605
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "el dipòsit de referència '%s' és empeltat"
+
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "desplaçament abans de la fi del fitxer de paquet (.idx trencat?)"
+
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr ""
+"desplaçament abans d'inici d'índex de paquet per a %s (índex corromput?)"
+
+#: sha1_file.c:2725
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr ""
+"desplaçament més enllà de la fi d'índex de paquet per a %s (índex truncat?)"
+
+#: sha1_name.c:409
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "l'SHA1 %s curt és ambigu"
+
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "Els candidats són:"
+
+#: sha1_name.c:580
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"Git normalment mai crea una referència que acabi amb 40 caràcters\n"
+"hexadecimals perquè s'ignorarà quan només especifiqueu 40 caràcters\n"
+"hexadecimals. Aquestes referències es poden crear per error. Per\n"
+"exemple,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"on \"$br\" és d'alguna manera buida i una referència de 40 caràcters\n"
+"hexadecimals. Si us plau, examineu aquestes referències i potser\n"
+"suprimiu-les. Desactiveu aquest missatge executant\n"
+"\"git config advice.objectNameWarning false\""
+
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"No es pot canviar un .gitmodules no fusionat, primer resoleu els conflictes "
+"de fusió"
+
+#: submodule.c:71 submodule.c:105
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "No s'ha pogut trobar la secció en .gitmodules on path=%s"
+
+#: submodule.c:79
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "No s'ha pogut actualitzar l'entrada de .gitmodules %s"
+
+#: submodule.c:112
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "No s'ha pogut eliminar l'entrada de .gitmodules per a %s"
+
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "l'allistament del .gitmodules actualitzat ha fallat"
+
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "no es permeten els valors negatius a submodule.fetchJobs"
+
+#: submodule.c:1194
+#, c-format
+msgid "'%s' not recognized as a git repository"
+msgstr "'%s' no reconegut com un dipòsit git"
+
+#: submodule.c:1332
+#, c-format
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "no s'ha pogut iniciar 'git status' al submòdul '%s'"
+
+#: submodule.c:1345
+#, c-format
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "no s'ha pogut executar 'git status' al submòdul '%s'"
+
+#: submodule.c:1421
+#, c-format
+msgid "submodule '%s' has dirty index"
+msgstr "el submòdul '%s' té l'índex brut"
+
+#: submodule.c:1678
+#, c-format
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr ""
+"no està admès relocate_gitdir per al submòdul '%s' amb més d'un arbre de "
+"treball"
+
+#: submodule.c:1690 submodule.c:1746
+#, c-format
+msgid "could not lookup name for submodule '%s'"
+msgstr "no s'ha trobat el nom pel submòdul '%s'"
+
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "no s'ha pogut crear el directori '%s'"
+
+#: submodule.c:1697
+#, c-format
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
+msgstr ""
+"S'està migrant el directori de '%s%s' des de\n"
+"'%s' a\n"
+"'%s'\n"
+
+#: submodule.c:1781
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "s'ha produït un error en cercar recursivament al camí de submòdul '%s'"
+
+#: submodule.c:1825
+msgid "could not start ls-files in .."
+msgstr "no s'ha pogut iniciar ls-files a .."
+
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "ERRADA: la cadena del camí retornada no coincideix amb cwd?"
+
+#: submodule.c:1864
+#, c-format
+msgid "ls-tree returned unexpected return code %d"
+msgstr "ls-tree ha retornat un codi de retorn %d no esperat"
+
+#: submodule-config.c:380
+#, c-format
+msgid "invalid value for %s"
+msgstr "valor no vàlid per a %s"
+
+#: trailer.c:240
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "l'execució de l'ordre de remolc '%s' ha fallat"
+
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "valor desconegut '%s' per a la clau '%s'"
+
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "més d'un %s"
+
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "testimoni de remolc buit en el remolc '%.*s'"
 
-#: wt-status.c:1217
+#: trailer.c:722
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Actualment esteu recollint com a cirera la comissió %s."
+msgid "could not read input file '%s'"
+msgstr "no s'ha pogut llegir el fitxer d'entrada '%s'"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (arregleu els conflictes i executeu \"git cherry-pick --continue\")"
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "no s'ha pogut llegir des d'stdin"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+#: trailer.c:949 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "no s'ha pogut fer stat a %s"
+
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "el fitxer %s no és un fitxer regular"
+
+#: trailer.c:953
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "el fitxer %s no és gravable per l'usuari"
+
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "no s'ha pogut obrir el fitxer temporal"
+
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "no s'ha pogut canviar el nom del fitxer temporal a %s"
+
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Canviaria la font de '%s' a '%s' de '%s'\n"
+
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: opció de profunditat no vàlida '%s'"
+
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
 msgstr ""
-"  (tots els conflictes arreglats: executeu \"git cherry-pick --continue\")"
+"Els camins de submòdul següents contenen canvis que no\n"
+"es poden trobar en cap remot:\n"
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+#: transport.c:893
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
 msgstr ""
-"  (useu \"git cherry-pick --abort\" per a cancel·lar l'operació de recull de "
-"cireres)"
+"\n"
+"Si us plau, intenteu\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"o canviar de directori al camí i useu\n"
+"\n"
+"\tgit push\n"
+"\n"
+"per a pujar-los a un remot.\n"
+
+#: transport.c:901
+msgid "Aborting."
+msgstr "S'està avortant."
 
-#: wt-status.c:1236
+#: transport-helper.c:1080
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Actualment esteu revertint la comissió %s."
+msgid "Could not read ref %s"
+msgstr "No s'ha pogut llegir la referència %s"
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "objecte d'arbre massa curt"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "mode mal format en entrada d'arbre"
+
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "nom de fitxer buit en una entrada d'arbre"
+
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "fitxer d'arbre massa curt"
+
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
-"  (tots els conflictes estan arreglats: executeu \"git revert --continue\")"
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"agafar:\n"
+"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
+"canviar de branca."
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+#: unpack-trees.c:106
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
 msgstr ""
-"  (useu \"git revert --abort\" per a cancel·lar l'operació de reversió)"
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"agafar:\n"
+"%%s"
 
-#: wt-status.c:1257
+#: unpack-trees.c:109
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Actualment esteu bisecant, heu començat des de la branca '%s'."
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"fusionar:\n"
+"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de "
+"fusionar."
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Actualment esteu bisecant."
+#: unpack-trees.c:111
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"fusionar:\n"
+"%%s"
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (useu \"git bisect reset\" per a tornar a la branca original)"
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
+"%%sSi us plau, cometeu els vostres canvis o emmagatzemeu-los abans de %s."
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "En la branca "
+#: unpack-trees.c:116
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
+"%%s"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "rebasament interactiu en progrés; sobre "
+#: unpack-trees.c:121
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
+msgstr ""
+"En actualitzar els directoris següents perdria fitxers no seguits en el:\n"
+"%s"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "rebasament en progrés; sobre "
+#: unpack-trees.c:125
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"agafar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD separat a "
+#: unpack-trees.c:127
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"agafar:\n"
+"%%s"
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD separat de "
+#: unpack-trees.c:130
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"fusionar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Actualment no s'és en cap branca."
+#: unpack-trees.c:132
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per "
+"fusionar:\n"
+"%%s"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Comissió inicial"
+#: unpack-trees.c:135
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de %s."
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Fitxers no seguits"
+#: unpack-trees.c:137
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball s'eliminarien per %s:\n"
+"%%s"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Fitxers ignorats"
+#: unpack-trees.c:142
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"agafar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de canviar de branca."
 
-#: wt-status.c:1520
+#: unpack-trees.c:144
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
 msgstr ""
-"S'ha trigat %.2f segons a enumerar fitxers no seguits.\n"
-"'status -uno' pot accelerar-ho, però heu d'anar amb compte de no\n"
-"oblidar-vos d'afegir fitxers nous per vós mateix (vegeu\n"
-"'git help status')."
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"agafar:\n"
+"%%s"
 
-#: wt-status.c:1526
+#: unpack-trees.c:147
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Els fitxers no seguits no estan llistats%s"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"fusionar:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de fusionar."
 
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (useu l'opció -u per a mostrar els fitxers no seguits)"
+#: unpack-trees.c:149
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"fusionar:\n"
+"%%s"
 
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Sense canvis"
+#: unpack-trees.c:152
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"%s:\n"
+"%%sSi us plau, moveu-los o elimineu-los abans de %s."
 
-#: wt-status.c:1539
+#: unpack-trees.c:154
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"no hi ha canvis afegits a cometre (useu \"git add\" o \"git commit -a\")\n"
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"%s:\n"
+"%%s"
 
-#: wt-status.c:1542
+#: unpack-trees.c:161
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "no hi ha canvis afegits a cometre\n"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "L'entrada '%s' encavalca amb '%s'.  No es pot vincular."
 
-#: wt-status.c:1545
+#: unpack-trees.c:164
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
 msgstr ""
-"no hi ha res afegit a cometre però fitxers no seguits estan presents (useu "
-"\"git add\" per a seguir-los)\n"
-
-#: wt-status.c:1548
-#, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "no hi ha res afegit a cometre però fitxers no seguits estan presents\n"
+"No es pot actualitzar l'agafament parcial: les entrades següents no estan al "
+"dia:\n"
+"%s"
 
-#: wt-status.c:1551
+#: unpack-trees.c:166
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
-"no hi ha res a cometre (creeu/copieu fitxers i useu \"git add\" per a seguir-"
-"los)\n"
+"Els fitxers següents en l'arbre de treball se sobreescriurien per "
+"actualitzar l'agafament parcial:\n"
+"%s"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:168
 #, c-format
-msgid "nothing to commit\n"
-msgstr "no hi ha res a cometre\n"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Els fitxers següents en l'arbre de treball s'eliminarien per actualitzar "
+"l'agafament parcial:\n"
+"%s"
 
-#: wt-status.c:1557
+#: unpack-trees.c:170
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"Cannot update submodule:\n"
+"%s"
 msgstr ""
-"no hi ha res a cometre (useu -u per a mostrar els fitxers no seguits)\n"
+"No es pot actualitzar el submòdul:\n"
+"%s"
 
-#: wt-status.c:1561
+#: unpack-trees.c:247
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "no hi ha res a cometre, l'arbre de treball està net\n"
+msgid "Aborting\n"
+msgstr "S'està avortant\n"
 
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Comissió inicial en "
+#: unpack-trees.c:272
+#, c-format
+msgid "submodule update strategy not supported for submodule '%s'"
+msgstr "el submòdul'%s' té una estratègia d'actualització no admesa"
 
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (sense branca)"
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "S'estan agafant fitxers"
 
-#: wt-status.c:1701
-msgid "gone"
-msgstr "no hi és"
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "l'esquema d'URL no és vàlid o li manca el sufix '://'"
 
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "darrere "
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "seqüència d'escapament %XX no vàlida"
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "davant per "
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "manca la màquina i l'esquema no és 'file:'"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "s'ha fallat en desenllaçar '%s'"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "un URL 'file:' no pot tenir número de port"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<opcions>] [--] <especificació-de-camí>..."
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "hi ha caràcters no vàlids en el nom de màquina"
 
-#: builtin/add.c:65
-#, c-format
-msgid "unexpected diff status %c"
-msgstr "estat de diff inesperat %c"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "número de port no vàlid"
 
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "s'ha fallat en actualitzar els fitxers"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "segment de camí '..' no vàlid"
 
-#: builtin/add.c:81
+#: worktree.c:285
 #, c-format
-msgid "remove '%s'\n"
-msgstr "elimina '%s'\n"
+msgid "failed to read '%s'"
+msgstr "s'ha produït un error en llegir '%s'"
 
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Canvis no allistats després d'actualitzar l'índex:"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "no s'ha pogut obrir '%s' per a lectura i escriptura"
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "No s'ha pogut llegir l'índex"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "no s'ha pogut obrir '%s' per a escriptura"
 
-#: builtin/add.c:207
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "No s'ha pogut obrir '%s' per a escriptura."
+msgid "could not open '%s' for reading"
+msgstr "no s'ha pogut obrir '%s' per a lectura"
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "No s'ha pogut escriure el pedaç"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
+msgstr "no s'ha pogut accedir a '%s'"
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "l'edició del pedaç ha fallat"
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "no s'ha pogut obtenir el directori de treball actual"
 
-#: builtin/add.c:217
+#: wrapper.c:634
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "No s'ha pogut fer stat a '%s'"
-
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "El pedaç és buit. S'ha avortat."
+msgid "could not write to %s"
+msgstr "no s'ha pogut escriure a %s"
 
-#: builtin/add.c:224
+#: wrapper.c:636
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "No s'ha pogut aplicar '%s'"
+msgid "could not close %s"
+msgstr "no s'ha pogut tancar %s"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-"Els camins següents s'ignoren per un dels vostres fitxers .gitignore:\n"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Camins sense fusionar:"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "marxa en sec"
+#: wt-status.c:178 wt-status.c:205
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (useu \"git reset %s <fitxer>...\" per a fer «unstage»)"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "sigues detallat"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (useu \"git rm --cached <fitxer>...\" per a fer «unstage»)"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "recull interactiu"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (useu \"git add <fitxer>...\" per a senyalar resolució)"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "selecciona els trossos interactivament"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (useu \"git add/rm <fitxer>...\" segons sigui apropiat per a senyalar "
+"resolució)"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "edita la diferència actual i aplica-la"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (useu \"git rm <fitxer>...\" per a senyalar resolució)"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "permet afegir fitxers que d'altra manera s'ignoren"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "Canvis a cometre:"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "actualitza els fitxers seguits"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "Canvis no «stage» per a cometre:"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "registra només el fet que el camí s'afegirà més tard"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (useu \"git add <fitxer>...\" per a actualitzar què es cometrà)"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr "afegeix els canvis de tots els fitxers seguits i no seguits"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (useu \"git add/rm <fitxer>...\" per a actualitzar què es cometrà)"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
-"ignora els camins eliminats en l'arbre de treball (el mateix que --no-all)"
-
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "no afegeixis, només actualitza l'índex"
-
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "només omet els fitxers que no es poden afegir a causa d'errors"
+"  (useu \"git checkout -- <fitxer>...\" per a descartar els canvis en el "
+"directori de treball)"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
-"comproveu si els fitxers - fins i tot els absents - s'ignoren en marxa en sec"
-
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
-
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "passa per alt el bit executable dels fitxers llistats"
-
-#: builtin/add.c:292
-#, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Useu -f si realment els voleu afegir.\n"
-
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "l'afegiment de fitxers ha fallat"
-
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A i -u són mutualment incompatibles"
-
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "L'opció --ignore-missing només es pot usar junt amb --dry-run"
-
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "el paràmetre --chmod '%s' ha de ser o -x o +x"
-
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "No s'ha especificat res, no s'ha afegit res.\n"
-
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Potser volíeu dir 'git add .'?\n"
-
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "fitxer d'índex malmès"
-
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "no s'ha pogut escriure un fitxer d'índex nou"
-
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "no s'ha pogut llegir '%s'"
-
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "no s'ha pogut analitzar l'script d'autor"
+"  (cometeu o descarteu el contingut modificat o no seguit en els submòduls)"
 
-#: builtin/am.c:503
+#: wt-status.c:238
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "s'ha suprimit '%s' pel ganxo applypatch-msg"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (useu \"git %s <fitxer>...\" per a incloure-ho en el què es cometrà)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Línia d'entrada mal formada: '%s'."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "suprimit per ambdós:"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "S'ha fallat en copiar les notes de '%s' a '%s'"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "afegit per nosaltres:"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "fseek ha fallat"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "suprimit per ells:"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "no s'ha pogut analitzar el pedaç '%s'"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "afegit per ells:"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "només una sèrie de pedaços StGIT es pot aplicar a la vegada"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "suprimit per nosaltres:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "marca de temps no vàlida"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "afegit per ambdós:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "línia Date no vàlida"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "modificat per ambdós:"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "desplaçament de zona de temps no vàlid"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "fitxer nou:"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "La detecció de format de pedaç ha fallat."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "copiat:"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "s'ha fallat en crear el directori '%s'"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "suprimit:"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "S'ha fallat en dividir els pedaços."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "modificat:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "no s'ha pogut escriure el fitxer d'índex"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "canviat de nom:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Quan hàgiu resolt aquest problema, executeu \"%s --continue\"."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "canviat de tipus:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-"Si preferiu saltar aquest pedaç, executeu \"%s --skip\" en lloc d'això."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "desconegut:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-"Per a restaurar la branca original i deixar d'apedaçar, executeu \"%s --abort"
-"\"."
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "sense fusionar:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "El pedaç és buit. S'ha dividit malament?"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "comissions noves, "
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "línia d'identitat no vàlida: %s"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "contingut modificat, "
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "no s'ha pogut analitzar la comissió %s"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "contingut no seguit, "
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"Al dipòsit li manquen els blobs necessaris per a retrocedir a una fusió de 3 "
-"vies."
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "Submòduls canviats però no actualitzats:"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr "S'està usant la informació d'índex per a reconstruir un arbre base..."
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "Canvis de submòdul a cometre:"
 
-#: builtin/am.c:1623
+#: wt-status.c:914
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
-"Heu editat el vostre pedaç a mà?\n"
-"No s'aplica als blobs recordats en el seu índex."
+"No toqueu la línia a dalt.\n"
+"Tot el que hi ha a sota s'eliminarà."
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "S'està retrocedint a apedaçar la base i fusionar de 3 vies..."
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "Teniu camins sense fusionar."
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "S'ha fallat en fusionar els canvis."
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (arregleu els conflictes i executeu \"git commit\")"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree ha fallat en escriure un arbre"
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (useu \"git merge --abort\" per a avortar la fusió)"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "s'està aplicant a una història buida"
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "Tots els conflictes estan arreglats però encara esteu fusionant."
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "s'ha fallat en escriure l'objecte de comissió"
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (useu \"git commit\" per a concloure la fusió)"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "no es pot reprendre: %s no existeix."
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "Esteu enmig d'una sessió am."
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"no es pot ser interactiu sense que stdin sigui connectat a un terminal."
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "El pedaç actual està buit."
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "El cos de la comissió és:"
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-"Voleu aplicar-lo? [y]es/[n]o/[e]dita/[v]isualitza el pedaç/[a]ccepta'ls "
-"tots: "
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (useu \"git am --skip\" per a ometre aquest pedaç)"
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Índex brut: no es pot aplicar pedaços (bruts: %s)"
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (useu \"git am --abort\" per a restaurar la branca original)"
 
-#: builtin/am.c:1853 builtin/am.c:1925
-#, c-format
-msgid "Applying: %.*s"
-msgstr "S'està aplicant: %.*s"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "Manca git-rebase-todo."
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Sense canvis -- El pedaç ja s'ha aplicat."
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "No s'ha fet cap ordre."
 
-#: builtin/am.c:1877
+#: wt-status.c:1194
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "El pedaç ha fallat a %s %.*s"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Última ordre feta (%d ordre feta):"
+msgstr[1] "Últimes ordres fetes (%d ordres fetes):"
 
-#: builtin/am.c:1883
+#: wt-status.c:1205
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "La còpia del pedaç que ha fallat es troba en: %s"
-
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Cap canvi - heu oblidat d'usar 'git add'?\n"
-"Si no hi ha res a allistar, probablement alguna altra cosa\n"
-"ja ha introduït els mateixos canvis; potser voleu ometre aquest pedaç."
+msgid "  (see more in file %s)"
+msgstr "  (vegeu més en el fitxer %s)"
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr ""
-"Encara teniu camins sense fusionar en el vostre índex.\n"
-"Heu oblidat d'usar 'git add'?"
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "No manca cap ordre."
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1213
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "No s'ha pogut analitzar l'objecte '%s'."
-
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "s'ha fallat en netejar l'índex"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Ordre següent a fer (manca %d ordre):"
+msgstr[1] "Ordres següents a fer (manquen %d ordres):"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-"Sembla que heu mogut HEAD després de l'última fallada de 'am'.\n"
-"No rebobinant a ORIG_HEAD"
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (useu \"git rebase --edit-todo\" per a veure i editar)"
 
-#: builtin/am.c:2192
+#: wt-status.c:1234
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Valor no vàlid per a --patch-format: %s"
-
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<opcions>] [(<bústia>|<directori-de-correu>)...]"
-
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<opcions>] (--continue | --skip | --abort)"
-
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "executa interactivament"
-
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "opció històrica -- no-op"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Actualment esteu rebasant la branca '%s' en '%s'."
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "permet retrocedir a una fusió de 3 vies si és necessari"
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "Actualment esteu rebasant."
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "calla"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr ""
+"  (arregleu els conflictes i després executeu \"git rebase --continue\")"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "afegeix una línia Signed-off-by al missatge de comissió"
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (useu \"git rebase --skip\" per a ometre aquest pedaç)"
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "recodifica en utf8 (per defecte)"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (useu \"git rebase --abort\" per a agafar la branca original)"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "passa la bandera -k al git-mailinfo"
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (tots els conflictes estan arreglats: executeu \"git rebase --continue\")"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "passa la bandera -b al git-mailinfo"
+#: wt-status.c:1267
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Actualment esteu dividint una comissió mentre rebaseu la branca '%s' en '%s'."
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "passa la bandera -m al git-mailinfo"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Actualment esteu dividint una comissió durant un rebasament."
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "passa la bandera --keep-cr al git-mailsplit pel format mbox"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
+"rebase --continue\")"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
-"no passis la bandera --keep-cr al git-mailsplit independent de am.keepcr"
+"Actualment esteu editant una comissió mentre es fa «rebase» de la branca "
+"'%s' en '%s'."
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "despulla tot abans d'una línia de tissores"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr "Actualment esteu editant una comissió durant un «rebase»."
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "acció"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (useu \"git commit --amend\" per a esmenar la comissió actual)"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "passa-ho a través del git-apply"
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (useu \"git rebase --continue\" una vegada que estigueu satisfet amb els "
+"vostres canvis)"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "arrel"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Actualment esteu fent «cherry pick» a la comissió %s."
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "camí"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (tots els conflictes estan arreglats: executeu \"git cherry-pick --continue"
+"\")"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "número"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (useu \"git cherry-pick --abort\" per a cancel·lar l'operació de «cherry "
+"pick»)"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "format"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Actualment esteu revertint la comissió %s."
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "el format en el qual estan els pedaços"
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
-"passa per alt el missatge d'error quan s'ocorre una fallada en apedaçar"
+"  (tots els conflictes estan arreglats: executeu \"git revert --continue\")"
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "segueix aplicant pedaços després de resoldre un conflicte"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr ""
+"  (useu \"git revert --abort\" per a cancel·lar l'operació de reversió)"
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "sinònims de --continue"
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Actualment esteu bisecant, heu començat des de la branca '%s'."
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "salta el pedaç actual"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "Actualment esteu bisecant."
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "restaura la branca original i avorta l'operació d'apedaçament."
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (useu \"git bisect reset\" per a tornar a la branca original)"
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "menteix sobre la data del comitent"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "En la branca "
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "usa el marc de temps actual per la data d'autor"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "«rebase» interactiu en progrés; sobre "
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "ID de clau"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "«rebase» en progrés; sobre "
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "signa les comissions amb GPG"
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "HEAD separat a "
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(ús intern per al git-rebase)"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "HEAD separat de "
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
-msgstr ""
-"Fa molt que l'opció -b/--binary no ha fet res, i\n"
-"s'eliminarà. Si us plau, no l'useu més."
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "Actualment no s'és en cap branca."
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "s'ha fallat en llegir l'índex"
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "Comissió inicial"
 
-#: builtin/am.c:2348
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-"un directori de rebasament anterior %s encara existeix però s'ha donat una "
-"bústia."
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "Fitxers no seguits"
+
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "Fitxers ignorats"
 
-#: builtin/am.c:2372
+#: wt-status.c:1599
 #, c-format
 msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
 msgstr ""
-"Directori %s extraviat trobat.\n"
-"Useu \"git am --abort\" per a eliminar-lo."
+"Ha trigat %.2f segons enumerar els fitxers no seguits.\n"
+"'status -uno' pot accelerar-ho, però heu d'anar amb compte de no\n"
+"oblidar-vos d'afegir fitxers nous vosaltres mateixos (vegeu\n"
+"'git help status')."
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Operació de resolució no en curs; no reprenem."
+#: wt-status.c:1605
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Els fitxers no seguits no estan llistats%s"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<opcions>] [<pedaç>...]"
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr " (useu l'opció -u per a mostrar els fitxers no seguits)"
 
-#: builtin/apply.c:153
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "opció d'espai en blanc '%s' no reconeguda"
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "Sense canvis"
 
-#: builtin/apply.c:169
+#: wt-status.c:1618
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "opció d'ignoral d'espai en blanc '%s' no reconeguda"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"no hi ha canvis afegits a cometre (useu \"git add\" o \"git commit -a\")\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1621
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "No es pot preparar l'expressió regular de marca de temps %s"
+msgid "no changes added to commit\n"
+msgstr "no hi ha canvis afegits a cometre\n"
 
-#: builtin/apply.c:863
+#: wt-status.c:1624
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec ha retornat %d per l'entrada: %s"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"no hi ha res afegit a cometre però existeixen fitxers no seguits (useu \"git "
+"add\" per a seguir-los)\n"
 
-#: builtin/apply.c:947
+#: wt-status.c:1627
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "no s'ha pogut trobar el nom de fitxer en el pedaç a la línia %d"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "no hi ha res afegit a cometre però existeixen fitxer no seguits\n"
 
-#: builtin/apply.c:984
+#: wt-status.c:1630
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
-"git apply: git-diff dolent - /dev/null esperat, %s rebut en la línia %d"
+"no hi ha res a cometre (creeu/copieu fitxers i useu \"git add\" per a seguir-"
+"los)\n"
 
-#: builtin/apply.c:989
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-"git apply: git-diff dolent - nom de fitxer nou inconsistent en la línia %d"
+msgid "nothing to commit\n"
+msgstr "no hi ha res a cometre\n"
 
-#: builtin/apply.c:990
+#: wt-status.c:1636
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
-"git apply: git-diff dolent - nom de fitxer antic inconsistent en la línia %d"
+"no hi ha res a cometre (useu -u per a mostrar els fitxers no seguits)\n"
 
-#: builtin/apply.c:995
+#: wt-status.c:1640
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: git-diff dolent - /dev/null esperat en la línia %d"
+msgid "nothing to commit, working tree clean\n"
+msgstr "no hi ha res a cometre, l'arbre de treball està net\n"
 
-#: builtin/apply.c:1489
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recompte: línia inesperada: %.*s"
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "Comissió inicial en "
+
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD (sense branca)"
+
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "darrere "
+
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "davant per "
 
-#: builtin/apply.c:1550
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragment de pedaç sense capçalera a la línia %d: %.*s"
+msgid "cannot %s: You have unstaged changes."
+msgstr "no es pot %s: Teniu canvis «unstaged»."
 
-#: builtin/apply.c:1567
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
+msgstr "addicionalment, el vostre índex conté canvis sense cometre."
+
+#: wt-status.c:2288
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
-"%d component de nom de camí inicial (línia %d)"
-msgstr[1] ""
-"a la capçalera de git diff li manca informació de nom de fitxer en eliminar "
-"%d components de nom de camí inicial (línia %d)"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "no es pot %s: El vostre índex conté canvis sense cometre."
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "el fitxer nou depèn dels continguts antics"
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "s'ha produït un error en desenllaçar '%s'"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "el fitxer suprimit encara té continguts"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<opcions>] [--] <especificació-de-camí>..."
 
-#: builtin/apply.c:1774
+#: builtin/add.c:80
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "el pedaç és malmès a la línia %d"
+msgid "unexpected diff status %c"
+msgstr "estat de diff inesperat %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "s'ha produït un error en actualitzar els fitxers"
 
-#: builtin/apply.c:1810
+#: builtin/add.c:95
 #, c-format
-msgid "new file %s depends on old contents"
-msgstr "el fitxer nou %s depèn dels continguts antics"
+msgid "remove '%s'\n"
+msgstr "elimina '%s'\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Canvis «unstaged» després d'actualitzar l'índex:"
+
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "No s'ha pogut llegir l'índex"
 
-#: builtin/apply.c:1812
+#: builtin/add.c:220
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "el fitxer suprimit %s encara té continguts"
+msgid "Could not open '%s' for writing."
+msgstr "No s'ha pogut obrir '%s' per a escriptura."
+
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "No s'ha pogut escriure el pedaç"
 
-#: builtin/apply.c:1815
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "l'edició del pedaç ha fallat"
+
+#: builtin/add.c:230
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** advertència: el fitxer %s queda buit però no se suprimeix"
+msgid "Could not stat '%s'"
+msgstr "No s'ha pogut fer stat a '%s'"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "El pedaç és buit. S'ha avortat."
 
-#: builtin/apply.c:1962
+#: builtin/add.c:237
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "pedaç binari malmès a la línia %d: %.*s"
+msgid "Could not apply '%s'"
+msgstr "No s'ha pogut aplicar '%s'"
+
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr ""
+"Els camins següents s'ignoren per un dels vostres fitxers .gitignore:\n"
+
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "marxa en sec"
+
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "recull interactiu"
+
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "selecciona els trossos interactivament"
+
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "edita la diferència actual i aplica-la"
+
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "permet afegir fitxers que d'altra manera s'ignoren"
+
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "actualitza els fitxers seguits"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "registra només el fet de que el camí s'afegirà més tard"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "afegeix els canvis de tots els fitxers seguits i no seguits"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr ""
+"ignora els camins eliminats en l'arbre de treball (el mateix que --no-all)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "no afegeixis, només actualitza l'índex"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "només omet els fitxers que no es poden afegir a causa d'errors"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+"comproveu si els fitxers - fins i tot els absents - s'ignoren en marxa en sec"
 
-#: builtin/apply.c:1999
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "passa per alt el bit executable dels fitxers llistats"
+
+#: builtin/add.c:305
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "pedaç binari no reconegut a la línia %d"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Useu -f si realment els voleu afegir.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "l'afegiment de fitxers ha fallat"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A i -u són mútuament incompatibles"
+
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "L'opció --ignore-missing només es pot usar junt amb --dry-run"
 
-#: builtin/apply.c:2154
+#: builtin/add.c:359
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "pedaç amb només escombraries a la línia %d"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "el paràmetre --chmod '%s' ha de ser o -x o +x"
 
-#: builtin/apply.c:2244
+#: builtin/add.c:374
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
+msgid "Nothing specified, nothing added.\n"
+msgstr "No s'ha especificat res, no s'ha afegit res.\n"
 
-#: builtin/apply.c:2248
+#: builtin/add.c:375
 #, c-format
-msgid "unable to open or read %s"
-msgstr "no s'ha pogut obrir o llegir %s"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Potser volíeu dir 'git add .'?\n"
 
-#: builtin/apply.c:2901
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "inici de línia no vàlid: '%c'"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "fitxer d'índex malmès"
 
-#: builtin/apply.c:3020
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "El tros #%d ha tingut èxit a %d (desplaçament %d línia)."
-msgstr[1] "El tros #%d ha tingut èxit a %d (desplaçament %d línies)."
+#: builtin/am.c:412
+msgid "could not parse author script"
+msgstr "no s'ha pogut analitzar l'script d'autor"
 
-#: builtin/apply.c:3032
+#: builtin/am.c:489
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "El context s'ha reduït a (%ld/%ld) per a aplicar el fragment a %d"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "s'ha suprimit '%s' pel ganxo applypatch-msg"
 
-#: builtin/apply.c:3038
+#: builtin/am.c:530
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"tot cercant:\n"
-"%.*s"
+msgid "Malformed input line: '%s'."
+msgstr "Línia d'entrada mal formada: '%s'."
 
-#: builtin/apply.c:3060
+#: builtin/am.c:567
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "manquen les dades de pedaç binari de '%s'"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "S'ha produït un error en copiar les notes de '%s' a '%s'"
 
-#: builtin/apply.c:3163
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "el pedaç binari no s'aplica a '%s'"
+#: builtin/am.c:593
+msgid "fseek failed"
+msgstr "fseek ha fallat"
 
-#: builtin/apply.c:3169
+#: builtin/am.c:777
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"el pedaç binari a '%s' crea un resultat incorrecte (esperant %s, %s rebut)"
+msgid "could not parse patch '%s'"
+msgstr "no s'ha pogut analitzar el pedaç '%s'"
 
-#: builtin/apply.c:3190
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "el pedaç ha fallat: %s:%ld"
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Només una sèrie de pedaços StGIT es pot aplicar a la vegada"
 
-#: builtin/apply.c:3314
-#, c-format
-msgid "cannot checkout %s"
-msgstr "no es pot agafar %s"
+#: builtin/am.c:889
+msgid "invalid timestamp"
+msgstr "marca de temps no vàlida"
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "s'està llegint de '%s' més enllà d'un enllaç simbòlic"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
+msgstr "línia Date no vàlida"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "el camí %s s'ha canviat de nom / s'ha suprimit"
+#: builtin/am.c:897
+msgid "invalid timezone offset"
+msgstr "desplaçament de zona de temps no vàlid"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: no existeix en l'índex"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
+msgstr "La detecció de format de pedaç ha fallat."
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
+#: builtin/am.c:991 builtin/clone.c:397
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "failed to create directory '%s'"
+msgstr "s'ha produït un error en crear el directori '%s'"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
-#, c-format
-msgid "%s: does not match index"
-msgstr "%s: no coincideix amb l'índex"
+#: builtin/am.c:995
+msgid "Failed to split patches."
+msgstr "S'ha produït un error en dividir els pedaços."
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "el pedaç d'eliminació deixa els continguts dels fitxers"
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "no s'ha pogut escriure el fitxer d'índex"
 
-#: builtin/apply.c:3669
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: tipus erroni"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Quan hàgiu resolt aquest problema, executeu \"%s --continue\"."
 
-#: builtin/apply.c:3671
+#: builtin/am.c:1179
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s és del tipus %o, s'esperava %o"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr ""
+"Si preferiu ometre aquest pedaç, executeu \"%s --skip\" en lloc d'això."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: builtin/am.c:1180
 #, c-format
-msgid "invalid path '%s'"
-msgstr "camí no vàlid: %s"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"Per a restaurar la branca original i deixar d'apedaçar, executeu \"%s --abort"
+"\"."
 
-#: builtin/apply.c:3879
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s: ja existeix en l'índex"
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
+msgstr "El pedaç és buit. S'ha dividit malament?"
 
-#: builtin/apply.c:3882
+#: builtin/am.c:1386 builtin/log.c:1557
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: ja existeix en el directori de treball"
+msgid "invalid ident line: %s"
+msgstr "línia d'identitat no vàlida: %s"
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1413
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o)"
+msgid "unable to parse commit %s"
+msgstr "no s'ha pogut analitzar la comissió %s"
 
-#: builtin/apply.c:3907
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "el mode nou (%o) de %s no coincideix amb el mode antic (%o) de %s"
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"Al dipòsit li manquen els blobs necessaris per a retrocedir a una fusió de 3 "
+"vies."
 
-#: builtin/apply.c:3927
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "el fitxer afectat '%s' és més enllà d'un enllaç simbòlic"
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
+msgstr "S'està usant la informació d'índex per a reconstruir un arbre base..."
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: el pedaç no s'aplica"
+#: builtin/am.c:1627
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Heu editat el vostre pedaç a mà?\n"
+"No s'aplica als blobs recordats en el seu índex."
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "S'està comprovant el pedaç %s..."
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "S'està retrocedint a apedaçar la base i una fusió de 3 vies..."
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "make_cache_entry ha fallat per al camí '%s'"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
+msgstr "S'ha produït un error en fusionar els canvis."
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "no s'ha pogut eliminar %s de l'índex"
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree ha fallat en escriure un arbre"
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "pedaç malmès per al submòdul %s"
+#: builtin/am.c:1689
+msgid "applying to an empty history"
+msgstr "s'està aplicant a una història buida"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "no s'ha pogut fer stat al fitxer novament creat '%s'"
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "s'ha produït un error en escriure l'objecte de comissió"
 
-#: builtin/apply.c:4224
+#: builtin/am.c:1735 builtin/am.c:1739
 #, c-format
-msgid "unable to create backing store for newly created file %s"
+msgid "cannot resume: %s does not exist."
+msgstr "no es pot reprendre: %s no existeix."
+
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
-"no s'ha pogut crear un magatzem de recolzament per al fitxer novament creat "
-"%s"
+"no es pot ser interactiu sense que stdin estigui connectada a un terminal."
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "no s'ha pogut afegir una entrada de cau per a %s"
+#: builtin/am.c:1760
+msgid "Commit Body is:"
+msgstr "El cos de la comissió és:"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "s'està tancant el fitxer '%s'"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr ""
+"Voleu aplicar-lo? [y]es/[n]o/[e]dita/[v]isualitza el pedaç/[a]ccepta'ls "
+"tots: "
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1820
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "no s'ha pogut escriure el fitxer '%s' mode %o"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Índex brut: no es poden aplicar pedaços (bruts: %s)"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1860 builtin/am.c:1932
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "El pedaç %s s'ha aplicat netament."
+msgid "Applying: %.*s"
+msgstr "S'està aplicant: %.*s"
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "error intern"
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
+msgstr "Sense canvis -- El pedaç ja s'ha aplicat."
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1884
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "S'està aplicant el pedaç %%s amb %d rebuig..."
-msgstr[1] "S'està aplicant el pedaç %%s amb %d rebuitjos..."
+msgid "Patch failed at %s %.*s"
+msgstr "El pedaç ha fallat a %s %.*s"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1890
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "s'està truncant el nom del fitxer .rej a %.*s.rej"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "La còpia del pedaç que ha fallat es troba en: %s"
 
-#: builtin/apply.c:4432
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "no es pot obrir %s: %s"
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Cap canvi - heu oblidat d'usar 'git add'?\n"
+"Si no hi ha res per fer «stage», probablement alguna altra cosa ja ha\n"
+"introduït els mateixos canvis; potser voleu ometre aquest pedaç."
 
-#: builtin/apply.c:4445
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "El tros #%d s'ha aplicat netament."
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Encara teniu camins sense fusionar en el vostre índex.\n"
+"Heu oblidat d'usar 'git add'?"
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "S'ha rebutjat el tros #%d."
+msgid "Could not parse object '%s'."
+msgstr "No s'ha pogut analitzar l'objecte '%s'."
 
-#: builtin/apply.c:4537
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr "S'ha saltat el pedaç '%s'."
+#: builtin/am.c:2102
+msgid "failed to clean index"
+msgstr "s'ha produït un error en netejar l'índex"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "entrada no reconeguda"
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Sembla que heu mogut HEAD després de l'última fallada de 'am'.\n"
+"No s'està rebobinant a ORIG_HEAD"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "no es pot llegir el fitxer d'índex"
+#: builtin/am.c:2199
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Valor no vàlid per a --patch-format: %s"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way fora d'un dipòsit"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<opcions>] [(<bústia> | <directori-de-correu>)...]"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index fora d'un dipòsit"
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<opcions>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached fora d'un dipòsit"
+#: builtin/am.c:2239
+msgid "run interactively"
+msgstr "executa interactivament"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "no es pot obrir el pedaç '%s'"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
+msgstr "opció històrica -- no-op"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "s'ha omès %d error d'espai en blanc"
-msgstr[1] "s'han omès %d errors d'espai en blanc"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
+msgstr "permet retrocedir a una fusió de 3 vies si és necessari"
+
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "silenciós"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d línia afegeix errors d'espai en blanc."
-msgstr[1] "%d línies afegeixen errors d'espai en blanc."
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
+msgstr "afegeix una línia Signed-off-by al missatge de comissió"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "no apliquis els canvis que coincideixin amb el camí donat"
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
+msgstr "recodifica en utf8 (per defecte)"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "aplica els canvis que coincideixin amb el camí donat"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
+msgstr "passa la bandera -k al git-mailinfo"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-"elimina <nombre> barres obliqües inicials dels camins de diferència "
-"tradicionals"
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
+msgstr "passa la bandera -b al git-mailinfo"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "ignora afegiments fets pel pedaç"
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
+msgstr "passa la bandera -m al git-mailinfo"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "passa la bandera --keep-cr al git-mailsplit per al format mbox"
+
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
-"en lloc d'aplicar el pedaç, emet les estadístiques de diferència de l'entrada"
+"no passis la bandera --keep-cr al git-mailsplit independent de am.keepcr"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "mostra el nombre de línies afegides i suprimides en notació decimal"
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
+msgstr "elimina tot abans d'una línia de tisores"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "en lloc d'aplicar el pedaç, emet un resum de l'entrada"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
+msgstr "passa-ho a través del git-apply"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "en lloc d'aplicar el pedaç, veges si el pedaç és aplicable"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "assegura que el pedaç sigui aplicable a l'índex actual"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "format"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "aplica un pedaç sense tocar l'arbre de treball"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
+msgstr "el format en el qual estan els pedaços"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "accepta un pedaç que toqui fora de l'àrea de treball"
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
+msgstr ""
+"passa per alt el missatge d'error quan s'ocorre una fallada en apedaçar"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "aplica el pedaç també (useu amb --stat/--summary/--check)"
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
+msgstr "segueix aplicant pedaços després de resoldre un conflicte"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "intenta una fusió de tres vies si el pedaç no s'aplica"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
+msgstr "sinònims de --continue"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr "construeix un índex temporal basat en la informació d'índex incrustada"
+#: builtin/am.c:2303
+msgid "skip the current patch"
+msgstr "omet el pedaç actual"
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "els camins se separen amb el caràcter NUL"
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
+msgstr "restaura la branca original i avorta l'operació d'apedaçament."
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "assegura't que almenys <n> línies de context coincideixin"
+#: builtin/am.c:2310
+msgid "lie about committer date"
+msgstr "menteix sobre la data del comitent"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-"detecta les línies noves o modificades que tinguin errors d'espai en blanc"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
+msgstr "usa el marc de temps actual per la data d'autor"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignora els canvis d'espai en blanc en cercar context"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "ID de clau"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "aplica el pedaç al revés"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
+msgstr "signa les comissions amb GPG"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "no esperis almenys una línia de context"
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
+msgstr "(ús intern per al git-rebase)"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "deixa els trossos rebutjats en fitxers *.reg coresspondents"
+#: builtin/am.c:2333
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"Fa molt que l'opció -b/--binary no ha fet res, i\n"
+"s'eliminarà. Si us plau, no l'useu més."
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "permet trossos encavalcants"
+#: builtin/am.c:2340
+msgid "failed to read the index"
+msgstr "S'ha produït un error en llegir l'índex"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "tolera una línia nova incorrectament detectada al final del fitxer"
+#: builtin/am.c:2355
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr ""
+"un directori de rebasament anterior %s encara existeix però s'ha donat una "
+"bústia."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "no confiïs en els recomptes de línia en les capçaleres dels trossos"
+#: builtin/am.c:2379
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"S'ha trobat un directori %s extraviat.\n"
+"Useu \"git am --abort\" per a eliminar-lo."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "anteposa <arrel> a tots els noms de fitxer"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Una operació de resolució no està en curs; no reprenem."
+
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<opcions>] [<pedaç>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4074,18 +5185,13 @@ msgstr "git archive: ACK/NAK esperat, EOF rebut"
 msgid "git archive: NACK %s"
 msgstr "git archive: %s NACK"
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "error remot: %s"
-
 #: builtin/archive.c:64
 msgid "git archive: protocol error"
 msgstr "git archive: error de protocol"
 
 #: builtin/archive.c:68
 msgid "git archive: expected a flush"
-msgstr "git archive: rentada esperada"
+msgstr "git archive: s'esperava una neteja"
 
 #: builtin/bisect--helper.c:7
 msgid "git bisect--helper --next-all [--no-checkout]"
@@ -4107,122 +5213,169 @@ msgstr "git blame [<opcions>] [<opcions-de-revisió>] [<revisió>] [--] fitxer"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "es documenten les <opcions-de-revisió> en git-rev-list(1)"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1777
 msgid "Blaming lines"
-msgstr "S'estan culpant les línies"
+msgstr "S'està fent un «blame»"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2573
 msgid "Show blame entries as we find them, incrementally"
-msgstr "Mostra les entrades de culpa mentre les trobem, incrementalment"
+msgstr "Mostra les entrades «blame» mentre les trobem, incrementalment"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2574
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Mostra un SHA-1 en blanc per les comissions de frontera (Per defecte: "
 "desactivat)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2575
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "No tractis les comissions d'arrel com a límits (Per defecte: desactivat)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2576
 msgid "Show work cost statistics"
 msgstr "Mostra les estadístiques de preu de treball"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2577
 msgid "Force progress reporting"
 msgstr "Força l'informe de progrés"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2578
 msgid "Show output score for blame entries"
-msgstr "Mostra la puntuació de sortida de les entrades de culpa"
+msgstr "Mostra la puntuació de sortida de les entrades «blame»"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2579
 msgid "Show original filename (Default: auto)"
 msgstr "Mostra el nom de fitxer original (Per defecte: automàtic)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2580
 msgid "Show original linenumber (Default: off)"
 msgstr "Mostra el número de línia original (Per defecte: desactivat)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2581
 msgid "Show in a format designed for machine consumption"
 msgstr "Presenta en un format dissenyat per consumpció per màquina"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2582
 msgid "Show porcelain format with per-line commit information"
 msgstr "Mostra el format de porcellana amb informació de comissió per línia"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2583
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Usa el mateix mode de sortida que git-annotate (Per defecte: desactivat)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2584
 msgid "Show raw timestamp (Default: off)"
 msgstr "Mostra la marca de temps crua (Per defecte: desactivat)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2585
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Mostra l'SHA1 de comissió llarg (Per defecte: desactivat)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2586
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Omet el nom d'autor i la marca de temps (Per defecte: desactivat)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2587
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Mostra l'adreça de correu electrònic de l'autor en lloc del nom (Per "
 "defecte: desactivat)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2588
 msgid "Ignore whitespace differences"
 msgstr "Ignora les diferències d'espai en blanc"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "Usa un heurístic experimental per a millorar les diferències"
+
+#: builtin/blame.c:2597
 msgid "Spend extra cycles to find better match"
 msgstr "Gasta cicles extres per a trobar una coincidència millor"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2598
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Usa les revisions de <fitxer> en lloc d'invocar git-rev-list"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2599
 msgid "Use <file>'s contents as the final image"
 msgstr "Usa els continguts de <fitxer> com a la imatge final"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2600 builtin/blame.c:2601
 msgid "score"
 msgstr "puntuació"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2600
 msgid "Find line copies within and across files"
 msgstr "Troba còpies de línia dins i a través dels fitxers"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2601
 msgid "Find line movements within and across files"
 msgstr "Troba moviments de línia dins i a través dels fitxers"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "Process only line range n,m, counting from 1"
 msgstr "Processa només el rang de línies n,m, comptant des d'1"
 
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"no es pot usar --progress amb els formats --incremental o de porcellana"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2697
 msgid "4 years, 11 months ago"
 msgstr "fa 4 anys i 11 mesos"
 
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents i --reverse no funcionen bé juntes."
+
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr "no es pot usar --contents amb el nom d'objecte de la comissió final"
+
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse i --first-parent-together requereixen una última comissió "
+"especificada"
+
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse --first-parent junts requereixen un rang de la cadena de mares "
+"primeres"
+
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
+msgstr "no hi ha tal camí %s en %s"
+
+#: builtin/blame.c:2851
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "no es pot llegir el blob %s per al camí %s"
+
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "el fitxer %s té només %lu línia"
+msgstr[1] "el fitxer %s té només %lu línies"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<opcions>] [-r | -a] [--merged | --no-merged]"
@@ -4243,7 +5396,11 @@ msgstr "git branch [<opcions>] (-m | -M) [<branca-antiga>] <branca-nova>"
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<opcions>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:143
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [<opcions>] [-r | -a] [--format]"
+
+#: builtin/branch.c:144
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -4253,7 +5410,7 @@ msgstr ""
 "         fusionat a '%s', però encara no\n"
 "         s'ha fusionat a HEAD."
 
-#: builtin/branch.c:147
+#: builtin/branch.c:148
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -4263,12 +5420,12 @@ msgstr ""
 "         s'ha fusionat a '%s', encara que està\n"
 "         fusionada a HEAD."
 
-#: builtin/branch.c:161
+#: builtin/branch.c:162
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "No s'ha pogut trobar l'objecte de comissió de '%s'"
 
-#: builtin/branch.c:165
+#: builtin/branch.c:166
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -4277,165 +5434,93 @@ msgstr ""
 "La branca '%s' no està totalment fusionada.\n"
 "Si esteu segur que la voleu suprimir, executeu 'git branch -D %s'."
 
-#: builtin/branch.c:178
+#: builtin/branch.c:179
 msgid "Update of config-file failed"
 msgstr "L'actualització del fitxer de configuració ha fallat"
 
-#: builtin/branch.c:206
+#: builtin/branch.c:210
 msgid "cannot use -a with -d"
 msgstr "no es pot usar -a amb -d"
 
-#: builtin/branch.c:212
+#: builtin/branch.c:216
 msgid "Couldn't look up commit object for HEAD"
 msgstr "No s'ha pogut trobar l'objecte de comissió de HEAD"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "No es pot suprimir la branca '%s' agafada a '%s'"
 
-#: builtin/branch.c:241
+#: builtin/branch.c:245
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "no s'ha trobat la branca amb seguiment remot '%s'."
 
-#: builtin/branch.c:242
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "no s'ha trobat la branca '%s'."
 
-#: builtin/branch.c:257
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Error en suprimir la branca amb seguiment remot '%s'"
 
-#: builtin/branch.c:258
+#: builtin/branch.c:262
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Error en suprimir la branca '%s'"
 
-#: builtin/branch.c:265
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "S'ha suprimit la branca amb seguiment remot %s (era %s).\n"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:270
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "S'ha suprimit la branca %s (era %s).\n"
 
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: no hi és]"
-
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
-
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: darrere per %d]"
-
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
-msgstr "[darrere de %d]"
-
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: davant per %d]"
-
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
-msgstr "[davant de %d]"
-
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: davant per %d, darrere per %d]"
-
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[davant %d, darrere %d]"
-
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
-msgstr " **** referència no vàlida ****"
-
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(cap branca, s'està rebasant %s)"
-
-#: builtin/branch.c:378
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(cap branca, bisecció començada en %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD separat a %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD separat de %s)"
-
-#: builtin/branch.c:393
-msgid "(no branch)"
-msgstr "(cap branca)"
-
-#: builtin/branch.c:544
+#: builtin/branch.c:441
 #, c-format
 msgid "Branch %s is being rebased at %s"
-msgstr "La branca %s s'està rebasant a %s"
+msgstr "S'està fent «rebase» en la branca %s a %s"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:445
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "La branca %s s'està bisecant a %s"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:460
 msgid "cannot rename the current branch while not on any."
 msgstr "no es pot canviar el nom de la branca actual mentre no s'és a cap."
 
-#: builtin/branch.c:573
+#: builtin/branch.c:470
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nom de branca no vàlid: '%s'"
 
-#: builtin/branch.c:590
+#: builtin/branch.c:487
 msgid "Branch rename failed"
 msgstr "El canvi de nom de branca ha fallat"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:490
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
-msgstr "S'ha canviat el nom de la branca malanomenada '%s'"
+msgstr "S'ha canviat el nom de la branca mal anomenada '%s'"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:493
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "S'ha canviat el nom de la branca a %s, però HEAD no està actualitzat!"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:502
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "La branca està canviada de nom, però l'actualització del fitxer de "
 "configuració ha fallat"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:518
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4444,210 +5529,227 @@ msgid ""
 msgstr ""
 "Si us plau, editeu la descripció de la branca\n"
 "  %s\n"
-"Es despullaran les línies que comencin amb '%c'.\n"
+"S'eliminaran les línies que comencin amb '%c'.\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:551
 msgid "Generic options"
 msgstr "Opcions genèriques"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:553
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "mostra el hash i l'assumpte, doneu dues vegades per la branca font"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:554
 msgid "suppress informational messages"
 msgstr "omet els missatges informatius"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:555
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "configura el mode de seguiment (vegeu git-pull(1))"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:557
 msgid "change upstream info"
 msgstr "canvia la informació de font"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "upstream"
 msgstr "font"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "change the upstream info"
 msgstr "canvia la informació de font"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "Desestableix la informació de font"
+
+#: builtin/branch.c:561
 msgid "use colored output"
 msgstr "usa sortida colorada"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:562
 msgid "act on remote-tracking branches"
 msgstr "actua en branques amb seguiment remot"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:564 builtin/branch.c:566
 msgid "print only branches that contain the commit"
 msgstr "imprimeix només les branques que continguin la comissió"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "imprimeix només les branques que no continguin la comissió"
+
+#: builtin/branch.c:570
 msgid "Specific git-branch actions:"
 msgstr "Accions de git-branch específiques:"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:571
 msgid "list both remote-tracking and local branches"
 msgstr "llista les branques amb seguiment remot i les locals"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:573
 msgid "delete fully merged branch"
 msgstr "suprimeix la branca si està completament fusionada"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:574
 msgid "delete branch (even if not merged)"
 msgstr "suprimeix la branca (encara que no estigui fusionada)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:575
 msgid "move/rename a branch and its reflog"
 msgstr "mou/canvia de nom una branca i el seu registre de referència"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:576
 msgid "move/rename a branch, even if target exists"
 msgstr "mou/canvia de nom una branca, encara que el destí existeixi"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:577
 msgid "list branch names"
 msgstr "llista els noms de branca"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:578
 msgid "create the branch's reflog"
 msgstr "crea el registre de referència de la branca"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:580
 msgid "edit the description for the branch"
 msgstr "edita la descripció de la branca"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:581
 msgid "force creation, move/rename, deletion"
 msgstr "força creació, moviment/canvi de nom, supressió"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:582
 msgid "print only branches that are merged"
 msgstr "imprimeix només les branques que s'han fusionat"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:583
 msgid "print only branches that are not merged"
 msgstr "imprimeix només les branques que no s'han fusionat"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:584
 msgid "list branches in columns"
 msgstr "llista les branques en columnes"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
 msgid "key"
 msgstr "clau"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
 msgid "field name to sort on"
 msgstr "nom del camp en el qual ordenar"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
 msgid "object"
 msgstr "objecte"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:589
 msgid "print only branches of the object"
 msgstr "imprimeix només les branques de l'objecte"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "l'ordenació i el filtratge distingeixen entre majúscules i minúscules"
+
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "format a usar en la sortida"
+
+#: builtin/branch.c:611
 msgid "Failed to resolve HEAD as a valid ref."
-msgstr "S'ha fallat en resoldre HEAD com a referència vàlida."
+msgstr "S'ha produït un error en resoldre HEAD com a referència vàlida."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:615 builtin/clone.c:724
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD no trobat sota refs/heads!"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:638
 msgid "--column and --verbose are incompatible"
 msgstr "--column i --verbose són incompatibles"
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:649 builtin/branch.c:701
 msgid "branch name required"
 msgstr "cal el nom de branca"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:677
 msgid "Cannot give description to detached HEAD"
 msgstr "No es pot donar descripció a un HEAD separat"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:682
 msgid "cannot edit description of more than one branch"
 msgstr "no es pot editar la descripció de més d'una branca"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:689
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Encara no hi ha cap comissió en la branca '%s'."
 
-#: builtin/branch.c:773
+#: builtin/branch.c:692
 #, c-format
 msgid "No branch named '%s'."
 msgstr "No hi ha branca amb nom '%s'."
 
-#: builtin/branch.c:788
+#: builtin/branch.c:707
 msgid "too many branches for a rename operation"
 msgstr "hi ha massa branques per a una operació de canvi de nom"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:712
 msgid "too many branches to set new upstream"
 msgstr "hi ha massa branques per a establir una nova font"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:716
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 "no s'ha pogut establir la font de HEAD com a %s quan no assenyala cap branca."
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
 msgid "no such branch '%s'"
 msgstr "no hi ha tal branca '%s'"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:723
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la branca '%s' no existeix"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:735
 msgid "too many branches to unset upstream"
 msgstr "hi ha massa branques per a desestablir la font"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:739
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "no s'ha pogut desestablir la font de HEAD perquè no assenyala cap branca."
 
-#: builtin/branch.c:826
+#: builtin/branch.c:745
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "La branca '%s' no té informació de font"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:759
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "no té sentit crear 'HEAD' manualment"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:765
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "les opcions -a i -r a 'git branch' no tenen sentit amb un nom de branca"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:768
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
 "track or --set-upstream-to\n"
 msgstr ""
-"La bandera --set-upstream està desaprovada i s'eliminarà. Considereu usar --"
+"La bandera --set-upstream està en desús i s'eliminarà. Considereu usar --"
 "track o --set-upstream-to\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:785
 #, c-format
 msgid ""
 "\n"
@@ -4658,78 +5760,95 @@ msgstr ""
 "Si volíeu fer '%s' seguir '%s', feu això:\n"
 "\n"
 
-#: builtin/bundle.c:51
+#: builtin/bundle.c:45
 #, c-format
 msgid "%s is okay\n"
 msgstr "%s està bé\n"
 
-#: builtin/bundle.c:64
+#: builtin/bundle.c:58
 msgid "Need a repository to create a bundle."
 msgstr "Cal un dipòsit per a fer un farcell."
 
-#: builtin/bundle.c:68
+#: builtin/bundle.c:62
 msgid "Need a repository to unbundle."
 msgstr "Cal un dipòsit per a desfer un farcell."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<tipus>|--textconv) <objecte>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <tipus> | --textconv | --filters [--path=<camí>]) <objecte>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<tipus> pot ser un de: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "mostra el tipus de l'objecte"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "mostra la mida de l'objecte"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "surt amb zero quan no hi ha error"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "imprimeix bellament el contingut de l'objecte"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "en els objectes de blob, executa textconv en el contingut de l'objecte"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr ""
+"en els objectes de blob, executa els filtres en el contingut de l'objecte"
+
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "blob"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "usa un camí específic per a --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "permet que -s i -t funcionin amb objectes trencats/malmesos"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "posa la sortida de --batch en memòria intermèdia"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "mostra la informació i contingut dels objectes rebuts de l'entrada estàndard"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "mostra informació sobre els objectes rebuts de l'entrada estàndard"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "segueix els enllaços simbòlics en l'arbre (s'usa amb --batch o --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "mostra tots els objectes amb --batch o --batch-check"
 
@@ -4749,7 +5868,7 @@ msgstr "informa de tots els atributs establerts en el fitxer"
 msgid "use .gitattributes only from the index"
 msgstr "usa .gitattributes només des de l'índex"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "llegeix els noms de fitxer d'stdin"
 
@@ -4757,9 +5876,9 @@ msgstr "llegeix els noms de fitxer d'stdin"
 msgid "terminate input and output records by a NUL character"
 msgstr "acaba els registres d'entrada i de sortida amb un caràcter NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
 msgid "suppress progress reporting"
-msgstr "omet el reportatge de progrés"
+msgstr "omet els informes de progrés"
 
 #: builtin/check-ignore.c:26
 msgid "show non-matching input paths"
@@ -4816,7 +5935,7 @@ msgstr "git checkout-index [<opcions>] [--] [<fitxer>...]"
 
 #: builtin/checkout-index.c:144
 msgid "stage should be between 1 and 3 or all"
-msgstr "l'etapa ha de ser entre 1 i 3 o all"
+msgstr "«stage» ha de ser entre 1 i 3 o all"
 
 #: builtin/checkout-index.c:160
 msgid "check out all files in the index"
@@ -4828,7 +5947,8 @@ msgstr "força la sobreescriptura de fitxers existents"
 
 #: builtin/checkout-index.c:163
 msgid "no warning for existing files and files not in index"
-msgstr "cap advertència per a fitxers existents i fitxers no en l'índex"
+msgstr ""
+"cap advertència per a fitxers existents i fitxers que no siguin a l'índex"
 
 #: builtin/checkout-index.c:165
 msgid "don't checkout new files"
@@ -4847,9 +5967,9 @@ msgid "write the content to temporary files"
 msgstr "escriu el contingut a fitxers temporals"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
 msgid "string"
 msgstr "cadena"
 
@@ -4859,116 +5979,116 @@ msgstr "en crear fitxers, anteposa <cadena>"
 
 #: builtin/checkout-index.c:177
 msgid "copy out the files from named stage"
-msgstr "copia els fitxers des de l'etapa anomenada"
+msgstr "copia els fitxers des de «stage» amb nom"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:27
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [<opcions>] <branca>"
 
-#: builtin/checkout.c:26
+#: builtin/checkout.c:28
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<opcions>] [<branca>] -- <fitxer>..."
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/checkout.c:153 builtin/checkout.c:186
 #, c-format
 msgid "path '%s' does not have our version"
-msgstr "el camí '%s' no té la versió nostra"
+msgstr "el camí '%s' no té la nostra versió"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:155 builtin/checkout.c:188
 #, c-format
 msgid "path '%s' does not have their version"
-msgstr "el camí '%s' no té la versió seva"
+msgstr "el camí '%s' no té la seva versió"
 
-#: builtin/checkout.c:152
+#: builtin/checkout.c:171
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "el camí '%s' no té totes les versions necessàries"
 
-#: builtin/checkout.c:196
+#: builtin/checkout.c:215
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "el camí '%s' no té les versions necessàries"
 
-#: builtin/checkout.c:213
+#: builtin/checkout.c:232
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "camí '%s': no es pot fusionar"
 
-#: builtin/checkout.c:230
+#: builtin/checkout.c:249
 #, c-format
 msgid "Unable to add merge result for '%s'"
-msgstr "no s'ha pogut afegir el resultat de fusió per a '%s'"
+msgstr "No s'ha pogut afegir el resultat de fusió per a '%s'"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' no es pot usar amb actualització de camins"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:281 builtin/checkout.c:284
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' no es pot usar amb %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:287
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
-"No es pot actualitzar els camins i canviar a la branca '%s' a la vegada."
+"No es poden actualitzar els camins i canviar a la branca '%s' a la vegada."
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "el camí '%s' està sense fusionar"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:513
 msgid "you need to resolve your current index first"
 msgstr "heu de primer resoldre el vostre índex actual"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:644
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "No es pot fer reflog per a '%s': %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:685
 msgid "HEAD is now at"
 msgstr "HEAD ara és a"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:689 builtin/clone.c:678
 msgid "unable to update HEAD"
 msgstr "no s'ha pogut actualitzar HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:693
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Restableix la branca '%s'\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:696
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Ja en '%s'\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:700
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
-msgstr "S'ha agafat i restablert la branca '%s'\n"
+msgstr "S'ha canviat i restablert a la branca '%s'\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:702 builtin/checkout.c:1090
 #, c-format
 msgid "Switched to a new branch '%s'\n"
-msgstr "S'ha agafat la branca nova '%s'\n"
+msgstr "S'ha canviat a la branca nova '%s'\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:704
 #, c-format
 msgid "Switched to branch '%s'\n"
-msgstr "S'ha agafat la branca '%s'\n"
+msgstr "S'ha canviat a la branca '%s'\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:755
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... i %d més.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4991,7 +6111,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:780
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -5018,150 +6138,150 @@ msgstr[1] ""
 " git branch <nom-de-branca-nova> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:816
 msgid "internal error in revision walk"
 msgstr "error intern en el passeig per revisions"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:820
 msgid "Previous HEAD position was"
 msgstr "La posició de HEAD anterior era"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:847 builtin/checkout.c:1085
 msgid "You are on a branch yet to be born"
-msgstr "Sou en una branca que encara ha de nàixer"
+msgstr "Sou en una branca que encara ha de néixer"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:991
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "s'esperava només una referència, s'han donat %d."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1031 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referència no vàlida: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1060
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la referència no és un arbre: %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1099
 msgid "paths cannot be used with switching branches"
 msgstr "els camins no es poden usar amb canvi de branca"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' no es pot usar amb canvi de branca"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' no es pot usar amb '%s'"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1126
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "No es pot canviar la branca a la no comissió '%s'"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
 msgid "branch"
 msgstr "branca"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1160
 msgid "create and checkout a new branch"
 msgstr "crea i agafa una branca nova"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1162
 msgid "create/reset and checkout a branch"
 msgstr "crea/restableix i agafa una branca"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1163
 msgid "create reflog for new branch"
 msgstr "crea un registre de referència per a la branca nova"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1164 builtin/worktree.c:333
 msgid "detach HEAD at named commit"
 msgstr "separa HEAD a la comissió anomenada"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1165
 msgid "set upstream info for new branch"
 msgstr "estableix la informació de font de la branca nova"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new-branch"
 msgstr "branca-nova"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new unparented branch"
 msgstr "branca òrfena nova"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1168
 msgid "checkout our version for unmerged files"
 msgstr "agafa la versió nostra dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1170
 msgid "checkout their version for unmerged files"
 msgstr "agafa la versió seva dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1172
 msgid "force checkout (throw away local modifications)"
-msgstr "agafa a la força (descarta qualsevulla modificació local)"
+msgstr "agafa a la força (descarta qualsevol modificació local)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1173
 msgid "perform a 3-way merge with the new branch"
 msgstr "realitza una fusió de 3 vies amb la branca nova"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1174 builtin/merge.c:234
 msgid "update ignored files (default)"
 msgstr "actualitza els fitxers ignorats (per defecte)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
 msgid "style"
 msgstr "estil"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1176
 msgid "conflict style (merge or diff3)"
 msgstr "estil de conflicte (fusió o diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1179
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "no limitis les especificacions de camí només a entrades disperses"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1181
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "dubta 'git checkout <cap-branca-així>'"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1183
 msgid "do not check if another worktree is holding the given ref"
 msgstr "no comprovis si altre arbre de treball té la referència donada"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
 msgid "force progress reporting"
 msgstr "força l'informe de progrés"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1224
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B i --orphan són mutualment exclusius"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1241
 msgid "--track needs a branch name"
 msgstr "--track necessita un nom de branca"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1246
 msgid "Missing branch name; try -b"
 msgstr "Manca el nom de branca; proveu -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1282
 msgid "invalid path specification"
 msgstr "especificació de camí no vàlida"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1289
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5170,12 +6290,12 @@ msgstr ""
 "No es poden actualitzar els camins i canviar a la branca '%s' a la vegada.\n"
 "Volíeu agafar '%s', la qual no es pot resoldre com a comissió?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1294
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach no accepta un paràmetre de camí '%s'"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1298
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5202,31 +6322,33 @@ msgstr "Eliminaria %s\n"
 #: builtin/clean.c:31
 #, c-format
 msgid "Skipping repository %s\n"
-msgstr "S'està saltant el dipòsit %s\n"
+msgstr "S'està ometent el dipòsit %s\n"
 
 #: builtin/clean.c:32
 #, c-format
 msgid "Would skip repository %s\n"
-msgstr "Saltaria el dipòsit %s\n"
+msgstr "Ometria el dipòsit %s\n"
 
 #: builtin/clean.c:33
 #, c-format
 msgid "failed to remove %s"
-msgstr "s'ha fallat en eliminar %s"
+msgstr "s'ha produït un error en eliminar %s"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
-"Ajuda d'avís:\n"
+"Ajuda:\n"
 "1          - selecciona un ítem numerat\n"
 "foo        - selecciona un ítem basat en un prefix únic\n"
-"           - (buit) no seleccionis res"
+"           - (buit) no seleccionis res\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:301 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5235,47 +6357,49 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
-"Ajuda d'avís:\n"
+"Ajuda:\n"
 "1          - selecciona un sol ítem\n"
 "3-5        - selecciona un rang d'ítems\n"
 "2-3,6-9    - selecciona múltiples rangs\n"
 "foo        - selecciona un ítem basat en un prefix únic\n"
 "-...       - desselecciona els ítems seleccionats\n"
 "*          - tria tots els ítems\n"
-"           - (buit) finalitza la selecció"
+"           - (buit) finalitza la selecció\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "Perdó (%s)?"
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "Perdó (%s)?\n"
 
-#: builtin/clean.c:653
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Introduïu els patrons a ignorar>> "
 
-#: builtin/clean.c:690
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
-msgstr "ADVERTÈNCIA: No es pot trobar ítems que coincideixin amb: %s"
+msgstr "ADVERTÈNCIA: No es poden trobar ítems que coincideixin amb: %s"
 
-#: builtin/clean.c:711
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Selecciona els ítems a suprimir"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/clean.c:758
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Voleu eliminar %s [y/N]? "
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Adéu."
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "Adéu.\n"
 
-#: builtin/clean.c:785
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -5293,246 +6417,253 @@ msgstr ""
 "help                - aquesta pantalla\n"
 "?                   - ajuda de selecció de l'avís"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:818 git-add--interactive.perl:1736
 msgid "*** Commands ***"
 msgstr "*** Ordres ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:819 git-add--interactive.perl:1733
 msgid "What now"
 msgstr "I ara què"
 
-#: builtin/clean.c:821
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Eliminaria l'ítem següent:"
 msgstr[1] "Eliminaria els ítems següents:"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "No hi ha més fitxers a netejar; s'està sortint."
 
-#: builtin/clean.c:869
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "no imprimeixis els noms dels fitxers eliminats"
 
-#: builtin/clean.c:871
+#: builtin/clean.c:877
 msgid "force"
 msgstr "força"
 
-#: builtin/clean.c:872
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "neteja interactiva"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "elimina directoris sencers"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "patró"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "afegiu <patró> per a ignorar les regles"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "elimina els fitxers ignorats, també"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "elimina només els fitxers ignorats"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x i -X no es poden usar junts"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:907
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
-"clean.requireForce està establerta a veritat i ni -i, -n ni -f s'ha donat; "
-"refusant netejar"
+"clean.requireForce està establerta a veritat i ni -i, -n ni -f s'han "
+"indicat; refusant netejar"
 
-#: builtin/clean.c:904
+#: builtin/clean.c:910
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
-"clean.requireForce és per defecte veritat i ni -i, -n ni -f s'ha donat; "
+"clean.requireForce és per defecte veritat i ni -i, -n ni -f s'han indicat; "
 "refusant netejar"
 
 #: builtin/clone.c:37
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<opcions>] [--] <dipòsit> [<directori>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:80
 msgid "don't create a checkout"
 msgstr "no facis cap agafament"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "crea un dipòsit nu"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:85
 msgid "create a mirror repository (implies bare)"
-msgstr "crea un dipòsit reflectit (implica bare)"
+msgstr "crea un dipòsit mirall (implica bare)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:87
 msgid "to clone from a local repository"
 msgstr "per a clonar des d'un dipòsit local"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:89
 msgid "don't use local hardlinks, always copy"
 msgstr "no usis enllaços durs locals, sempre copia"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:91
 msgid "setup as shared repository"
 msgstr "configura com a dipòsit compartit"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "especificació de camí"
+
+#: builtin/clone.c:93 builtin/clone.c:97
 msgid "initialize submodules in the clone"
 msgstr "inicialitza els submòduls en el clon"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:100
 msgid "number of submodules cloned in parallel"
 msgstr "nombre de submòduls clonats en paral·lel"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:101 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "directori-de-plantilla"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:102 builtin/init-db.c:476
 msgid "directory from which templates will be used"
-msgstr "directori del qual les plantilles s'usaran"
+msgstr "directori des del qual s'usaran les plantilles"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
 msgid "reference repository"
 msgstr "dipòsit de referència"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:108
 msgid "use --reference only while cloning"
 msgstr "usa --reference només en clonar"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
 msgid "name"
 msgstr "nom"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:110
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "usa <nom> en lloc de 'origin' per a seguir la font"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:112
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "agafa <branca> en lloc del HEAD del remot"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:114
 msgid "path to git-upload-pack on the remote"
 msgstr "camí a git-upload-pack en el remot"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "profunditat"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:116
 msgid "create a shallow clone of that depth"
 msgstr "crea un clon superficial de tal profunditat"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "hora"
+
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr "crea un clon superficial des d'una hora específica"
+
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "revisió"
+
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr "aprofundeix la història d'un clon superficial, excloent una revisió"
+
+#: builtin/clone.c:122
 msgid "clone only one branch, HEAD or --branch"
 msgstr "clona només una branca, HEAD o --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:124
 msgid "any cloned submodules will be shallow"
 msgstr "qualsevol submòdul clonat serà superficial"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:125 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "directori de git"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:126 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "separa el directori de git de l'arbre de treball"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:127
 msgid "key=value"
 msgstr "clau=valor"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:128
 msgid "set config inside the new repository"
 msgstr "estableix la configuració dins del dipòsit nou"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
-msgid "use IPv4 addresses only"
-msgstr "usa només les adreces IPv4"
-
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
-msgid "use IPv6 addresses only"
-msgstr "usa només les adreces IPv6"
-
-#: builtin/clone.c:241
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-"No s'ha pogut endevinar cap nom de directori.\n"
-"Si us plau, especifiqueu un directori en la línia d'ordres"
-
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"Encara no se suporta el dipòsit de referència '%s' com a agafament enllaçat."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "el dipòsit de referència '%s' no és un dipòsit local."
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
+msgid "use IPv4 addresses only"
+msgstr "usa només adreces IPv4"
 
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "el dipòsit de referència '%s' és superficial"
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
+msgid "use IPv6 addresses only"
+msgstr "usa només adreces IPv6"
+
+#: builtin/clone.c:268
+msgid ""
+"No directory name could be guessed.\n"
+"Please specify a directory on the command line"
+msgstr ""
+"No s'ha pogut endevinar cap nom de directori.\n"
+"Si us plau, especifiqueu un directori en la línia d'ordres"
 
-#: builtin/clone.c:317
+#: builtin/clone.c:321
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "el dipòsit de referència '%s' és empeltat"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: No s'ha pogut afegir un alternatiu per a '%s': %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:393
 #, c-format
 msgid "failed to open '%s'"
-msgstr "s'ha fallat en obrir '%s'"
+msgstr "s'ha produït un error en obrir '%s'"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:401
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existeix i no és directori"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:415
 #, c-format
 msgid "failed to stat %s\n"
-msgstr "s'ha fallat en fer stat a '%s'\n"
+msgstr "s'ha produït un error en fer stat a '%s'\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:437
 #, c-format
 msgid "failed to create link '%s'"
-msgstr "s'ha fallat en crear l'enllaç '%s'"
+msgstr "s'ha produït un error en crear l'enllaç '%s'"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:441
 #, c-format
 msgid "failed to copy file to '%s'"
-msgstr "s'ha fallat en copiar el fitxer a '%s'"
+msgstr "s'ha produït un error en copiar el fitxer a '%s'"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:466
 #, c-format
 msgid "done.\n"
 msgstr "fet.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:478
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5543,123 +6674,141 @@ msgstr ""
 "'git status' i tornar a intentar l'agafament amb\n"
 "'git checkout -f HEAD'\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:555
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "No s'ha pogut trobar la branca remota %s per a clonar."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:650
 msgid "remote did not send all necessary objects"
 msgstr "el remot no ha enviat tots els objectes necessaris"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:666
 #, c-format
 msgid "unable to update %s"
 msgstr "no s'ha pogut actualitzar %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:715
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "el HEAD remot es refereix a una referència que no existeix; no s'ha pogut "
 "agafar.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:746
 msgid "unable to checkout working tree"
 msgstr "no s'ha pogut agafar l'arbre de treball"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:786
 msgid "unable to write parameters to config file"
 msgstr "no s'ha pogut escriure els paràmetres al fitxer de configuració"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:849
 msgid "cannot repack to clean up"
 msgstr "no es pot reempaquetar per a netejar"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:851
 msgid "cannot unlink temporary alternates file"
 msgstr "no es pot desenllaçar el fitxer d'alternatives temporal"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
 msgid "Too many arguments."
 msgstr "Hi ha massa paràmetres."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:888
 msgid "You must specify a repository to clone."
 msgstr "Heu d'especificar un dipòsit per a clonar."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:901
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "les opcions --bare i --origin %s són incompatibles."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:904
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare i --separate-git-dir són incompatibles."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:917
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "el dipòsit '%s' no existeix"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profunditat %s no és nombre positiu"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:933
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "el camí destí '%s' ja existeix i no és un directori buit."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:943
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "l'arbre de treball '%s' ja existeix."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
 #, c-format
 msgid "could not create leading directories of '%s'"
-msgstr "no s'ha pogut crear els directoris inicials de '%s'"
+msgstr "no s'han pogut crear els directoris inicials de '%s'"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:961
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "no s'ha pogut crear el directori d'arbre de treball '%s'"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:973
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "S'està clonant al dipòsit nu '%s'...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:975
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "S'està clonant a '%s'...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"clone --recursive no és compatible amb ambdós --reference i --reference-if-"
+"able"
+
+#: builtin/clone.c:1055
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth s'ignora en els clons locals; useu file:// en lloc d'això."
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-since s'ignora en els clons locals; useu file:// en lloc d'això."
+
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude s'ignora en els clons locals; useu file:// en lloc d'això."
+
+#: builtin/clone.c:1062
 msgid "source repository is shallow, ignoring --local"
 msgstr "el dipòsit font és superficial, s'està ignorant --local"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1067
 msgid "--local is ignored"
 msgstr "--local s'ignora"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1071
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "No se sap com clonar %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1126 builtin/clone.c:1134
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "La branca remota %s no es troba en la font %s"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1137
 msgid "You appear to have cloned an empty repository."
 msgstr "Sembla que heu clonat un dipòsit buit."
 
@@ -5774,8 +6923,8 @@ msgid ""
 "    git commit --allow-empty\n"
 "\n"
 msgstr ""
-"El recull de cireres previ ja està buit, possiblement a causa de resolució "
-"de conflicte.\n"
+"El «cherry pick» previ ja està buit, possiblement a causa de resolució de "
+"conflicte.\n"
 "Si el voleu cometre de totes maneres, useu:\n"
 "\n"
 "    git commit --allow-empty\n"
@@ -5798,69 +6947,64 @@ msgstr ""
 "\n"
 "    git reset\n"
 "\n"
-"Llavors \"git cherry-pick --continue\" reprendrà recollint\n"
-"com a cireres les comissions restants.\n"
+"Llavors \"git cherry-pick --continue\" reprendrà\n"
+"com a «cherry pick» les comissions restants.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
-msgstr "s'ha fallat en desempaquetar l'objecte d'arbre HEAD"
+msgstr "s'ha produït un error en desempaquetar l'objecte d'arbre HEAD"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "no s'ha pogut crear un índex temporal"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "l'afegiment interactiu ha fallat"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "no s'ha pogut actualitzar l'índex temporal"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
-msgstr "S'ha fallat en actualitzar l'arbre principal de memòria cau"
+msgstr "S'ha produït un error en actualitzar l'arbre principal de memòria cau"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "no s'ha pogut escriure el fitxer new_index"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "no es pot fer una comissió parcial durant una fusió."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
-msgstr "no es pot fer una comissió parcial durant un recull de cireres."
+msgstr "no es pot fer una comissió parcial durant un «cherry pick»."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "no es pot llegir l'índex"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "no s'ha pogut escriure un fitxer d'índex temporal"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "a la comissió '%s' li manca la capçalera d'autor"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "la comissió '%s' té una línia d'autor mal formada"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "paràmetre --author mal format"
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
-msgstr "format de data no vàlid: %s"
-
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5868,38 +7012,38 @@ msgstr ""
 "no es pot seleccionar un caràcter de comentari que\n"
 "no sigui usat en el missatge de comissió actual"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "no s'ha pogut trobar la comissió %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:294
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(s'està llegint el missatge de registre des de l'entrada estàndard)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "no s'ha pogut llegir el registre des de l'entrada estàndard"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "no s'ha pogut llegir el fitxer de registre '%s'"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "no s'ha pogut llegir SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "no s'ha pogut llegir MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "no s'ha pogut escriure la plantilla de comissió"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5914,7 +7058,7 @@ msgstr ""
 "\t%s\n"
 "i intenteu-ho de nou.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5924,12 +7068,12 @@ msgid ""
 "and try again.\n"
 msgstr ""
 "\n"
-"Sembla que podeu estar cometent un recull de cireres.\n"
+"Sembla que podeu estar cometent un «cherry pick».\n"
 "Si això no és correcte, si us plau, elimineu el fitxer\n"
 "\t%s\n"
 "i intenteu-ho de nou.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5939,7 +7083,7 @@ msgstr ""
 "S'ignoraran les línies començant amb '%c', i un missatge de\n"
 "comissió buit avorta la comissió.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5947,153 +7091,153 @@ msgid ""
 "An empty message aborts the commit.\n"
 msgstr ""
 "Si us plau, introduïu el missatge de comissió dels vostres canvis.\n"
-"Es retindran les línies començants amb '%c'; podeu eliminar-les per vós\n"
-"mateix si voleu. Un missatge buit avorta la comissió.\n"
+"Es retindran les línies començants amb '%c'; podeu eliminar-les vosaltres\n"
+"mateixos si voleu. Un missatge buit avorta la comissió.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:    %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sData:      %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sComitent: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "No es pot llegir l'índex"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Error en construir arbres"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
-msgstr "Si us plau, proveïu el missatge per usar o l'opció -m o l'opció -F.\n"
+msgstr "Si us plau, proveïu el missatge usant l'opció -m o l'opció -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' no és 'Nom <adreça-de-correu-electrònic>' i no coincideix amb\n"
 "cap autor existent"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fitxers no seguits no vàlid '%s'"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long i -z són incompatibles"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Usar ambdós --reset-author i --author no té sentit"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "No teniu res a esmenar."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Esteu enmig d'una fusió -- no es pot esmenar."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr "Esteu enmig d'un recull de cireres -- no es pot esmenar."
+msgstr "Esteu enmig d'un «cherry pick» -- no es pot esmenar."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Les opcions --squash i --fixup no es poden usar juntes"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Només un de -c/-C/-F/--fixup es pot usar."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "L'opció -m no es pot combinar amb -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author només es pot usar amb -C, -c o --amend."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "Només un de --include/--only/--all/--interactive/--patch es pot usar."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "--include/--only no té sentit sense camí."
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "Intel·ligent... s'està esmenant l'últim amb índex brut."
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
-"S'han especificat camins explícits sense -i o -o; s'està presumint camins --"
-"only..."
+"S'han especificat camins explícits sense -i o -o; s'està presumint --only "
+"camins..."
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:551
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de neteja no vàlid %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "-a no té sentit amb camins."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "mostra l'estat concisament"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "mostra la informació de branca"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "versió"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
 msgid "machine-readable output"
 msgstr "sortida llegible per màquina"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "mostra l'estat en format llarg (per defecte)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "acaba les entrades amb NUL"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
 msgid "mode"
 msgstr "mode"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "mostra els fitxers no seguits, modes opcionals: all, normal, no. (Per "
 "defecte: all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "mostra els fitxers ignorats"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "quan"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6101,202 +7245,202 @@ msgstr ""
 "ignora els canvis als submòduls, opcional quan: all, dirty, untracked. (Per "
 "defecte: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "mostra els fitxers no seguits en columnes"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "no s'ha pogut trobar la comissió novament creada"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr "no s'ha pogut analitzar la comissió novament creada"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "HEAD separat"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr " (comissió d'arrel)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "omet el resum després d'una comissió reeixida"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "mostra la diferència en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "Opcions de missatge de comissió"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:409
 msgid "read message from file"
 msgstr "llegiu el missatge des d'un fitxer"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "autor"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "autor corregit de la comissió"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:357
 msgid "date"
 msgstr "data"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "data corregida de la comissió"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
 msgid "message"
 msgstr "missatge"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "missatge de comissió"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
 msgid "commit"
 msgstr "comissió"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "reusa i edita el missatge de la comissió especificada"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "reusa el missatge de la comissió especificada"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
-"usa el missatge formatat d'aixafada automàtica per a arreglar la comissió "
+"usa el missatge formatat de «squash» automàtic per a corregir la comissió "
 "especificada"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
-"usa el missatge formatat d'aixafada automàtica per a aixafar la comissió "
+"usa el missatge formatat de «squash» automàtic per a «squash» a la comissió "
 "especificada"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "l'autor de la comissió ja sóc jo (s'usa amb -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
 msgid "add Signed-off-by:"
 msgstr "afegeix Signed-off-by:"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "usa el fitxer de plantilla especificat"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "força l'edició de la comissió"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "per defecte"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:412
 msgid "how to strip spaces and #comments from message"
-msgstr "com despullar els espais i #comentaris del missatge"
+msgstr "com suprimir els espais i #comentaris del missatge"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "inclou l'estat en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
 msgid "GPG sign commit"
 msgstr "signa la comissió amb GPG"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "Opcions dels continguts de les comissions"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "comet tots els fitxers canviats"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "afegeix els fitxers especificats a l'índex per a cometre"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "afegeix els fitxers interactivament"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "afegeix els canvis interactivament"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "comet només els fitxers especificats"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "evita els ganxos de precomissió i missatge de comissió"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "mostra què es cometria"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "esmena la comissió anterior"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
-msgstr "evita el ganxo de postreescriure"
+msgstr "evita el ganxo de post escriptura"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "està bé registrar un canvi buit"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "està bé registrar un canvi amb missatge buit"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "no s'ha pogut analitzar la comissió HEAD"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fitxer MERGE_HEAD malmès (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "no s'ha pogut llegir MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "no s'ha pogut llegir el missatge de comissió: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "S'està avortant la comissió; no heu editat el missatge.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "S'està avortant la comissió a causa d'un missatge de comissió buit.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6311,142 +7455,142 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<opcions>]"
 
-#: builtin/config.c:55
+#: builtin/config.c:56
 msgid "Config file location"
 msgstr "Ubicació del fitxer de configuració"
 
-#: builtin/config.c:56
+#: builtin/config.c:57
 msgid "use global config file"
 msgstr "usa el fitxer de configuració global"
 
-#: builtin/config.c:57
+#: builtin/config.c:58
 msgid "use system config file"
 msgstr "usa el fitxer de configuració del sistema"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "use repository config file"
 msgstr "usa el fitxer de configuració del dipòsit"
 
-#: builtin/config.c:59
+#: builtin/config.c:60
 msgid "use given config file"
 msgstr "usa el fitxer de configuració donat"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "blob-id"
 msgstr "ID de blob"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "read config from given blob object"
 msgstr "llegeix la configuració de l'objecte de blob donat"
 
-#: builtin/config.c:61
+#: builtin/config.c:62
 msgid "Action"
 msgstr "Acció"
 
-#: builtin/config.c:62
+#: builtin/config.c:63
 msgid "get value: name [value-regex]"
 msgstr "obtén valor: nom [regex-de-valors]"
 
-#: builtin/config.c:63
+#: builtin/config.c:64
 msgid "get all values: key [value-regex]"
 msgstr "obtén tots els valors: clau [regex-de-valors]"
 
-#: builtin/config.c:64
+#: builtin/config.c:65
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "obtén valors de regexp: regex-de-noms [regex-de-valors]"
 
-#: builtin/config.c:65
+#: builtin/config.c:66
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "obtén el valor específic per a l'URL: secció[.variable] URL"
 
-#: builtin/config.c:66
+#: builtin/config.c:67
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 "reemplaça totes les variables que coincideixen: nom valor [regex_de_valors]"
 
-#: builtin/config.c:67
+#: builtin/config.c:68
 msgid "add a new variable: name value"
 msgstr "afegeix una variable nova: nom valor"
 
-#: builtin/config.c:68
+#: builtin/config.c:69
 msgid "remove a variable: name [value-regex]"
 msgstr "elimina una variable: nom [regex-de-valors]"
 
-#: builtin/config.c:69
+#: builtin/config.c:70
 msgid "remove all matches: name [value-regex]"
 msgstr "elimina totes les coincidències: nom [regex-de-valors]"
 
-#: builtin/config.c:70
+#: builtin/config.c:71
 msgid "rename section: old-name new-name"
 msgstr "canvia el nom de secció: nom-antic nom-nou"
 
-#: builtin/config.c:71
+#: builtin/config.c:72
 msgid "remove a section: name"
 msgstr "elimina una secció: nom"
 
-#: builtin/config.c:72
+#: builtin/config.c:73
 msgid "list all"
 msgstr "llista tots"
 
-#: builtin/config.c:73
+#: builtin/config.c:74
 msgid "open an editor"
 msgstr "obre un editor"
 
-#: builtin/config.c:74
+#: builtin/config.c:75
 msgid "find the color configured: slot [default]"
 msgstr "troba el color configurat: ranura [per defecte]"
 
-#: builtin/config.c:75
+#: builtin/config.c:76
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "troba l'ajust de color: ranura [stdout-és-tty]"
 
-#: builtin/config.c:76
+#: builtin/config.c:77
 msgid "Type"
 msgstr "Tipus"
 
-#: builtin/config.c:77
+#: builtin/config.c:78
 msgid "value is \"true\" or \"false\""
 msgstr "el valor és \"true\" o \"false\""
 
-#: builtin/config.c:78
+#: builtin/config.c:79
 msgid "value is decimal number"
 msgstr "el valor és un nombre decimal"
 
-#: builtin/config.c:79
+#: builtin/config.c:80
 msgid "value is --bool or --int"
 msgstr "el valor és --bool o --int"
 
-#: builtin/config.c:80
+#: builtin/config.c:81
 msgid "value is a path (file or directory name)"
 msgstr "el valor és un camí (nom de fitxer o directori)"
 
-#: builtin/config.c:81
+#: builtin/config.c:82
 msgid "Other"
 msgstr "Altre"
 
-#: builtin/config.c:82
+#: builtin/config.c:83
 msgid "terminate values with NUL byte"
 msgstr "acaba els valors amb un octet NUL"
 
-#: builtin/config.c:83
+#: builtin/config.c:84
 msgid "show variable names only"
 msgstr "mostra només els noms de variable"
 
-#: builtin/config.c:84
+#: builtin/config.c:85
 msgid "respect include directives on lookup"
 msgstr "respecta les directives d'inclusió en cercar"
 
-#: builtin/config.c:85
+#: builtin/config.c:86
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
-"mostra l'origen de la configuració (fitxer, entrada estàndar, blob, línia "
+"mostra l'origen de la configuració (fitxer, entrada estàndard, blob, línia "
 "d'ordres)"
 
-#: builtin/config.c:327
+#: builtin/config.c:328
 msgid "unable to parse default color value"
 msgstr "no s'ha pogut analitzar el valor de color per defecte"
 
-#: builtin/config.c:471
+#: builtin/config.c:472
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -6461,68 +7605,89 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:613
+#: builtin/config.c:615
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "no es pot crear el fitxer de configuració '%s'"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:627
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"no es pot sobreescriure múltiples valors amb un sol valor\n"
+"       Useu una expressió regular, --add o --replace-all per a canviar %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "imprimeix les mides en un format llegible pels humans"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [<options>] [<commit-ish>...]"
-msgstr "git describe [opcions] [<comissió>...]"
+msgstr "git describe [<opcions>] [<comissió>...]"
 
-#: builtin/describe.c:18
+#: builtin/describe.c:19
 msgid "git describe [<options>] --dirty"
 msgstr "git describe [<opcions>] --dirty"
 
-#: builtin/describe.c:217
+#: builtin/describe.c:53
+msgid "head"
+msgstr "davant per"
+
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "lleuger"
+
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "anotat"
+
+#: builtin/describe.c:250
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "l'etiqueta anotada %s no és disponible"
 
-#: builtin/describe.c:221
+#: builtin/describe.c:254
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "l'etiqueta anotada %s no té nom incrustat"
 
-#: builtin/describe.c:223
+#: builtin/describe.c:256
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "l'etiqueta '%s' realment és '%s' aquí"
 
-#: builtin/describe.c:250 builtin/log.c:480
+#: builtin/describe.c:283 builtin/log.c:487
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s no és un nom d'objecte vàlid"
 
-#: builtin/describe.c:253
+#: builtin/describe.c:286
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s no és un objecte de '%s' vàlid"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:303
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "cap etiqueta coincideix exactament amb '%s'"
 
-#: builtin/describe.c:272
+#: builtin/describe.c:305
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "s'està cercant per a descriure %s\n"
 
-#: builtin/describe.c:319
+#: builtin/describe.c:352
 #, c-format
 msgid "finished search at %s\n"
 msgstr "s'ha finalitzat la cerca a %s\n"
 
-#: builtin/describe.c:346
+#: builtin/describe.c:379
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -6531,7 +7696,7 @@ msgstr ""
 "Cap etiqueta anotada pot descriure '%s'.\n"
 "No obstant, hi havia etiquetes no anotades: proveu --tags."
 
-#: builtin/describe.c:350
+#: builtin/describe.c:383
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -6540,12 +7705,12 @@ msgstr ""
 "Cap etiqueta pot descriure '%s'.\n"
 "Proveu --always, o creeu algunes etiquetes."
 
-#: builtin/describe.c:371
+#: builtin/describe.c:413
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu comissions travessades\n"
 
-#: builtin/describe.c:374
+#: builtin/describe.c:416
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -6554,95 +7719,206 @@ msgstr ""
 "s'han trobat més de %i etiquetes: s'han llistat les %i més recents\n"
 "s'ha renunciat la cerca a %s\n"
 
-#: builtin/describe.c:396
+#: builtin/describe.c:438
 msgid "find the tag that comes after the commit"
 msgstr "troba l'etiqueta que vingui després de la comissió"
 
-#: builtin/describe.c:397
+#: builtin/describe.c:439
 msgid "debug search strategy on stderr"
 msgstr "estratègia de cerca de depuració en stderr"
 
-#: builtin/describe.c:398
+#: builtin/describe.c:440
 msgid "use any ref"
-msgstr "usa qualsevulla referència"
+msgstr "usa qualsevol referència"
 
-#: builtin/describe.c:399
+#: builtin/describe.c:441
 msgid "use any tag, even unannotated"
-msgstr "usa qualsevulla etiqueta, fins i tot aquelles sense anotar"
+msgstr "usa qualsevol etiqueta, fins i tot aquelles sense anotar"
 
-#: builtin/describe.c:400
+#: builtin/describe.c:442
 msgid "always use long format"
 msgstr "sempre usa el format llarg"
 
-#: builtin/describe.c:401
+#: builtin/describe.c:443
 msgid "only follow first parent"
 msgstr "només segueix la primera mare"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:446
 msgid "only output exact matches"
 msgstr "emet només coincidències exactes"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:448
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "considera les <n> etiquetes més recents (per defecte: 10)"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:450
 msgid "only consider tags matching <pattern>"
 msgstr "només considera les etiquetes que coincideixen amb <patró>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "no consideris les etiquetes que no coincideixen amb <patró>"
+
+#: builtin/describe.c:454 builtin/name-rev.c:357
 msgid "show abbreviated commit object as fallback"
-msgstr "mostra l'objecte de comissió abreviat com a retrocediment"
+msgstr "mostra l'objecte de comissió abreviat com a sistema alternatiu"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:455 builtin/describe.c:458
 msgid "mark"
 msgstr "marca"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:456
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "annexa <marca> en l'arbre de treball brut (per defecte: \"-dirty\")"
 
-#: builtin/describe.c:430
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr "annexa <marca> en l'arbre de treball brut (per defecte: \"-broken\")"
+
+#: builtin/describe.c:477
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long és incompatible amb --abbrev=0"
 
-#: builtin/describe.c:456
+#: builtin/describe.c:506
 msgid "No names found, cannot describe anything."
 msgstr "No s'ha trobat cap nom, no es pot descriure res."
 
-#: builtin/describe.c:476
+#: builtin/describe.c:549
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty és incompatible amb les comissions"
 
-#: builtin/diff.c:86
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "--broken és incompatible amb les comissions"
+
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': no és ni fitxer regular ni enllaç simbòlic"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "opció no vàlida: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "No és un dipòsit de git"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "s'ha donat un objecte no vàlid '%s'."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "s'ha donat més de dos blobs: '%s"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "s'ha donat l'objecte no gestionat '%s'."
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr "git difftool [<opcions>] [<commit> [<commit>]] [--] [<camí>...]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "ha fallat: %d"
+
+#: builtin/difftool.c:283
+#, c-format
+msgid "could not read symlink %s"
+msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
+
+#: builtin/difftool.c:285
+#, c-format
+msgid "could not read symlink file %s"
+msgstr "no s'ha pogut llegir el fitxer d'enllaç simbòlic %s"
+
+#: builtin/difftool.c:293
+#, c-format
+msgid "could not read object %s for symlink %s"
+msgstr "No es pot llegir l'objecte %s per l'enllaç simbòlic %s"
+
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "s'han modificat ambdós fitxers: '%s' i '%s'."
+
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "s'ha deixat un fitxer de l'arbre de treball."
+
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "existeix un fitxer temporal a %s'."
+
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "podeu netejar o recuperar-los."
+
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "utilitza `diff.guitool` en comptes de `diff.tool`"
+
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "fes un diff de tot el directori"
+
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "no preguntis abans d'executar l'eina diff"
+
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "utilitza enllaços simbòlics en mode dir-diff"
+
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "<tool>"
+
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "utilitza l'eina de diff especificada"
+
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr ""
+"imprimeix una llista de totes les eines diff que es podeu usar amb `--tool`"
+
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr ""
+
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "<command>"
+
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "especifiqueu una ordre personalitzada per veure diffs"
+
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "no s'ha proporcionat <tool> per --tool=<tool>"
+
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "no s'ha proporcionat <cmd> per --extcmd=<cmd>"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [opcions-de-llista-de-revisions]"
@@ -6681,7 +7957,7 @@ msgstr "Usa la característica done per a acabar el corrent"
 
 #: builtin/fast-export.c:997
 msgid "Skip output of blob data"
-msgstr "Salta l'emissió de dades de blob"
+msgstr "Omet l'emissió de dades de blob"
 
 #: builtin/fast-export.c:998
 msgid "refspec"
@@ -6711,162 +7987,166 @@ msgstr "git fetch --multiple [<opcions>] [(<dipòsit> | <grup>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<opcions>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "obtén de tots els remots"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "annexa a .git/FETCH_HEAD en lloc de sobreescriure"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "camí al qual pujar el paquet al costat remot"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "força la sobreescriptura de la branca local"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "obtén de múltiples remots"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "obtén totes les etiquetes i tots els objectes associats"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "no obtinguis les etiquetes (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "nombre de submòduls obtinguts en paral·lel"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "poda les branques amb seguiment remot que ja no estiguin en el remot"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "sota demanda"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "controla l'obtenció recursiva de submòduls"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "retén el paquet baixat"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "permet l'actualització de la referència HEAD"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "aprofundeix la història d'un clon superficial"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "aprofundeix la història d'un clon superficial basat en temps"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "converteix en un dipòsit complet"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1440
 msgid "dir"
 msgstr "directori"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "anteposa això a la sortida de camí del submòdul"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "mode de recursivitat per defecte"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "accepta les referències que actualitzin .git/shallow"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "mapa de referències"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "mostra el mapa de referències d'obtenció"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "No s'ha pogut trobar la referència HEAD remota"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:513
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "la configuració fetch.output conté un valor no vàlid %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:606
 #, c-format
 msgid "object %s not found"
 msgstr "objecte %s no trobat"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:610
 msgid "[up to date]"
 msgstr "[al dia]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:623 builtin/fetch.c:703
 msgid "[rejected]"
 msgstr "[rebutjat]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:624
 msgid "can't fetch in current branch"
 msgstr "no es pot obtenir en la branca actual"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:633
 msgid "[tag update]"
 msgstr "[actualització d'etiqueta]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
 msgid "unable to update local ref"
 msgstr "no s'ha pogut actualitzar la referència local"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:653
 msgid "[new tag]"
 msgstr "[etiqueta nova]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:656
 msgid "[new branch]"
 msgstr "[branca nova]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:659
 msgid "[new ref]"
 msgstr "[referència nova]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:698
 msgid "forced update"
 msgstr "actualització forçada"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:703
 msgid "non-fast-forward"
 msgstr "sense avanç ràpid"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:748
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s no ha enviat tots els objectes necessaris\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:768
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "rebutja %s perquè no es permet que les arrels superficials s'actualitzin"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
 msgid "From %.*s\n"
 msgstr "De %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6874,90 +8154,98 @@ msgid ""
 msgstr ""
 "algunes referències locals no s'han pogut actualitzar;\n"
 " intenteu executar 'git remote prune %s' per a eliminar\n"
-" qualsevulla branca antiga o conflictiva"
+" qualsevol branca antiga o conflictiva"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:921
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s es tornarà penjant)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s s'ha tornat penjant)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:954
 msgid "[deleted]"
 msgstr "[suprimit]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:955 builtin/remote.c:1022
 msgid "(none)"
 msgstr "(cap)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:978
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "S'està refusant obtenir en la branca actual %s d'un dipòsit no nu"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:997
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "L'opció \"%s\" amb valor \"%s\" no és vàlida per a %s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1000
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "S'ignora l'opció \"%s\" per a %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1076
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "No se sap com obtenir de %s"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1236
 #, c-format
 msgid "Fetching %s\n"
 msgstr "S'està obtenint %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "No s'ha pogut obtenir %s"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1256
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr ""
-"Cap dipòsit remot especificat. Si us plau, especifiqueu un URL o\n"
+"Cap dipòsit remot especificat. Si us plau, especifiqueu un URL o\n"
 "un nom remot del qual es deuen obtenir les revisions noves."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1279
 msgid "You need to specify a tag name."
 msgstr "Necessiteu especificar un nom d'etiqueta."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "No s'admet una profunditat negativa en --deepen"
+
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen i --depth són mutualment exclusius"
+
+#: builtin/fetch.c:1328
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth i --unshallow no es poden usar junts"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1330
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow en un dipòsit complet no té sentit"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1352
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all no accepta un paràmetre de dipòsit"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1354
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all no té sentit amb especificacions de referència"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1365
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "No hi ha tal remot ni tal grup remot: %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1373
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Obtenir un grup i especificar referències no té sentit"
 
@@ -6967,23 +8255,23 @@ msgid ""
 msgstr ""
 "git fmt-merge-msg [-m <missatge>] [--log[=<n>] | --no-log] [--file <fitxer>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "emplena el registre amb <n> entrades del registre curt com a màxim"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
-msgstr "àlies per --log (desaprovat)"
+msgstr "àlies per --log (en desús)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "text"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "usa <text> com a inici de missatge"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "fitxer del qual llegir"
 
@@ -6996,17 +8284,17 @@ msgid "git for-each-ref [--points-at <object>]"
 msgstr "git for-each-ref [--points-at <objecte>]"
 
 #: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<objecte>]]"
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<comissió>]]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<objecte>]]"
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr "git for-each-ref [--contains  [<comissió>]] [--no-contains [<comissió>]]"
 
 #: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
 msgstr ""
-"posa els marcadors de posició entre cometes de forma adequada per a "
+"posa els marcadors de posició de forma adequada per a "
 "intèrprets d'ordres"
 
 #: builtin/for-each-ref.c:29
@@ -7025,10 +8313,6 @@ msgstr "posa els marcadors de posició entre cometes adequades per al Tcl"
 msgid "show only <n> matched refs"
 msgstr "mostra només <n> referències coincidents"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "format a usar en la sortida"
-
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
 msgstr "imprimeix només les referències que assenyalin l'objecte donat"
@@ -7045,63 +8329,67 @@ msgstr "imprimeix només les referències que no s'han fusionat"
 msgid "print only refs which contain the commit"
 msgstr "imprimeix només les referències que continguin la comissió"
 
-#: builtin/fsck.c:519
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "imprimeix només les referències que no continguin la comissió"
+
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "S'estan comprovant els directoris d'objecte"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<opcions>] [<objecte>...]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "mostra els objectes inabastables"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "mostra els objectes penjants"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "informa de les etiquetes"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "informa dels nodes d'arrel"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "fes els objectes d'índex nodes de cap"
 
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "fes que els registres de referències siguin nodes de cap (per defecte)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "també considera els paquets i els objectes alternatius"
 
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "comprova només la connectivitat"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "habilita la comprovació més estricta"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr "escriu objectes penjants a .git/lost-found"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "mostra el progrés"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "mostra els noms detallats dels objectes abastables"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "S'estan comprovant els objectes"
 
@@ -7109,17 +8397,17 @@ msgstr "S'estan comprovant els objectes"
 msgid "git gc [<options>]"
 msgstr "git gc [<opcions>]"
 
-#: builtin/gc.c:72
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr "%s no vàlid: %s"
+#: builtin/gc.c:78
+#, c-format
+msgid "Failed to fstat %s: %s"
+msgstr "S'ha produït un error en fer fstat %s: %s"
 
-#: builtin/gc.c:139
+#: builtin/gc.c:310
 #, c-format
-msgid "insanely long object directory %.*s"
-msgstr "directori d'objectes increïblement llarg %.*s"
+msgid "Can't stat %s"
+msgstr "No es pot fer stat en %s"
 
-#: builtin/gc.c:290
+#: builtin/gc.c:319
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7128,295 +8416,316 @@ msgid ""
 "\n"
 "%s"
 msgstr ""
-"L'última execució de gc ha informat d'ho següent. Si us plau, corregiu\n"
+"L'última execució de gc ha informat el següent. Si us plau, corregiu\n"
 "la causa primordial i elimineu %s.\n"
 "No es realitzarà la neteja automàtica fins que s'elimini el fitxer.\n"
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:358
 msgid "prune unreferenced objects"
 msgstr "poda objectes sense referència"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:360
 msgid "be more thorough (increased runtime)"
 msgstr "sigues més exhaustiu (el temps d'execució augmenta)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:361
 msgid "enable auto-gc mode"
 msgstr "habilita el mode de recollida d'escombraries automàtica"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:362
 msgid "force running gc even if there may be another gc running"
 msgstr "força l'execució de gc encara que hi pugui haver un altre gc executant"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "No s'ha pogut analitzar el valor gc.logexpiry %s"
+
+#: builtin/gc.c:407
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "S'està empaquetant el dipòsit automàticament en el fons per rendiment "
 "òptim.\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:409
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "S'està empaquetant automàticament el dipòsit per rendiment òptim.\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:410
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Vegeu \"git help gc\" per neteja manual.\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:431
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 "gc ja s'està executant en la màquina '%s' pid %<PRIuMAX> (useu --force si no)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:475
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Hi ha massa objectes solts inabastables; executeu 'git prune' per a eliminar-"
 "los."
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<opcions>] [-e] <patró> [<revisió>...] [[--] <camí>...]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
-msgstr "grep: s'ha fallat en crear fil: %s"
+msgstr "grep: s'ha produït un error en crear fil: %s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "s'ha especificat un nombre de fils no vàlid (%d) per a %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "no s'ha pogut llegir l'arbre (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:829
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "no es pot fer grep des d'un objecte de tipus %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:893
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "l'opció `%c' espera un valor numèric"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "no es pot obrir '%s'"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:980
 msgid "search in index instead of in the work tree"
 msgstr "cerca en l'índex en lloc de l'arbre de treball"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:982
 msgid "find in contents not managed by git"
 msgstr "cerca en continguts no gestionats per git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:984
 msgid "search in both tracked and untracked files"
 msgstr "cerca tant en fitxers seguits com en no seguits"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:986
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignora els fitxers especificats mitjançant '.gitignore'"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "cerca recursivament a cada submòdul"
+
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "nom base"
+
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "anteposa això a la sortida del nom base del projecte pare"
+
+#: builtin/grep.c:994
 msgid "show non-matching lines"
 msgstr "mostra les línies no coincidents"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:996
 msgid "case insensitive matching"
 msgstr "coincidència insensible a majúscula i minúscula"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:998
 msgid "match patterns only at word boundaries"
 msgstr "coincideix amb els patrons només als límits de paraula"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:1000
 msgid "process binary files as text"
 msgstr "processa els fitxers binaris com a text"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:1002
 msgid "don't match patterns in binary files"
 msgstr "no coincideixis amb els patrons en els fitxers binaris"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:1005
 msgid "process binary files with textconv filters"
 msgstr "processa els fitxers binaris amb filtres de textconv"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1007
 msgid "descend at most <depth> levels"
 msgstr "descendeix com a màxim <profunditat> nivells"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1011
 msgid "use extended POSIX regular expressions"
 msgstr "usa les expressions regulars POSIX esteses"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1014
 msgid "use basic POSIX regular expressions (default)"
 msgstr "usa les expressions regulars POSIX bàsiques (per defecte)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1017
 msgid "interpret patterns as fixed strings"
 msgstr "interpreta els patrons com a cadenes fixes"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1020
 msgid "use Perl-compatible regular expressions"
 msgstr "usa les expressions regulars compatibles amb Perl"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1023
 msgid "show line numbers"
 msgstr "mostra els números de línia"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1024
 msgid "don't show filenames"
 msgstr "no mostris els noms de fitxer"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1025
 msgid "show filenames"
 msgstr "mostra els noms de fitxer"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1027
 msgid "show filenames relative to top directory"
 msgstr "mostra els noms de fitxer relatius al directori superior"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1029
 msgid "show only filenames instead of matching lines"
 msgstr "mostra només els noms de fitxer en lloc de les línies coincidents"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1031
 msgid "synonym for --files-with-matches"
 msgstr "sinònim de --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1034
 msgid "show only the names of files without match"
 msgstr "mostra només els noms dels fitxers sense coincidència"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1036
 msgid "print NUL after filenames"
 msgstr "imprimeix NUL després dels noms de fitxer"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1038
 msgid "show the number of matches instead of matching lines"
 msgstr "mostra el nombre de coincidències en lloc de les línies coincidents"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1039
 msgid "highlight matches"
 msgstr "ressalta les coincidències"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1041
 msgid "print empty line between matches from different files"
 msgstr "imprimeix una línia buida entre coincidències de fitxers distints"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1043
 msgid "show filename only once above matches from same file"
 msgstr ""
 "mostra el nom de fitxer només una vegada a dalt de les coincidències del "
 "mateix fitxer"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1046
 msgid "show <n> context lines before and after matches"
 msgstr "mostra <n> línies de context abans i després d'una coincidència"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1049
 msgid "show <n> context lines before matches"
 msgstr "mostra <n> línies de context abans d'una coincidència"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1051
 msgid "show <n> context lines after matches"
 msgstr "mostra <n> línies de context després d'una coincidència"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1053
 msgid "use <n> worker threads"
-msgstr "usa <n> fils obrers"
+msgstr "usa <n> fils de treball"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1054
 msgid "shortcut for -C NUM"
 msgstr "drecera per -C NUM"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1057
 msgid "show a line with the function name before matches"
 msgstr "mostra una línia amb el nom de funció abans de les coincidències"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1059
 msgid "show the surrounding function"
 msgstr "mostra la funció circumdant"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1062
 msgid "read patterns from file"
 msgstr "llegeix els patrons des d'un fitxer"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1064
 msgid "match <pattern>"
 msgstr "coincideix amb <patró>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1066
 msgid "combine patterns specified with -e"
 msgstr "combina els patrons especificats amb -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1078
 msgid "indicate hit with exit status without output"
 msgstr "indica coincidència amb estat de sortida sense sortida textual"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1080
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "mostra només les coincidències dels fitxers que coincideixin amb tots els "
 "patrons"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1082
 msgid "show parse tree for grep expression"
 msgstr "mostra l'arbre d'anàlisis de l'expressió de grep"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "pager"
 msgstr "paginador"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "show matching files in the pager"
 msgstr "mostra els fitxers coincidents en el paginador"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1089
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permet la invocació de grep(1) (ignorat per aquesta compilació)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1153
 msgid "no pattern given."
 msgstr "cap patró donat."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr "--no-index o --untracked no es pot usar amb revisions"
+
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
+msgstr "no s'ha pogut resoldre la revisió: %s"
+
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "s'ha especificat un nombre de fils no vàlid (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1251
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager només funciona en l'arbre de treball"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "opció no admesa amb --recurse-submodules."
+
+#: builtin/grep.c:1280
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached o --untracked no es pot usar amb --no-index."
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr "--no-index o --untracked no es pot usar amb revisions."
-
-#: builtin/grep.c:909
+#: builtin/grep.c:1286
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard no es pot usar per als continguts seguits."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1294
 msgid "both --cached and trees are given."
 msgstr "s'han donat ambdós --caches i arbres."
 
@@ -7432,85 +8741,89 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "tipus"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "tipus d'objecte"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "escriu l'objecte a la base de dades d'objectes"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "llegeix l'objecte des d'stdin"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "emmagatzema el fitxer tal com és sense filtres"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
-"només suma qualsevulla brossa aleatòria per a crear objectes malmesos per a "
+"només suma qualsevol brossa aleatòria per a crear objectes malmesos per a "
 "depurar al Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "processa el fitxer com si fos d'aquest camí"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "imprimeix totes les ordres disponibles"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "exclou guies"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "imprimeix la llista de guies útils"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "mostra la pàgina de manual"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "mostra la pàgina de manual en el navegador web"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "mostra la pàgina d'informació"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<ordre>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "format d'ajuda no reconegut '%s'"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
-msgstr "S'ha fallat en iniciar emacsclient."
+msgstr "S'ha produït un error'ha produït un error en iniciar emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
-msgstr "S'ha fallat en analitzar la versió d'emacsclient."
+msgstr "S'ha produït un error en analitzar la versió d'emacsclient."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "la versió d'emacsclient '%d' és massa vella (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
-msgstr "s'ha fallat en executar '%s'"
+msgstr "s'ha produït un error en executar '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7519,7 +8832,7 @@ msgstr ""
 "'%s': camí a un visualitzador de manuals no compatible.\n"
 "Si us plau, considereu usar 'man.<eina>.cmd' en lloc d'això."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7528,155 +8841,160 @@ msgstr ""
 "'%s': ordre per a un visualitzador de manuals compatible.\n"
 "Si us plau, considereu usar 'man.<eina>.path' en lloc d'això."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': visualitzador de manuals desconegut."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "cap visualitzador de manuals ha gestionat la sol·licitud"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "cap visualitzador d'informació ha gestionat la sol·licitud"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "La definició d'atributs per camí"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Git quotidià amb més o menys 20 ordres"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Un glossari de Git"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Especifica els fitxers intencionalment no seguits a ignorar"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "La definició de les propietats de submòduls"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "L'especificació de revisions i rangs per al Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
-msgstr "Una introducció tutorial al Git (per a la versió 1.5.1 o més nou)"
+msgstr "Una introducció tutorial al Git (per a la versió 1.5.1 o més nova)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Una visió de conjunt de fluxos de treball recomanats amb Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Les guies de Git comunes són:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "ús: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s' és un àlies de `%s'"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "ús: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "no s'ha pogut obrir %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "hi ha una discordança de tipus d'objecte a %s"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "no s'ha rebut l'objecte esperat %s"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "objecte %s: tipus %s esperat, %s trobat"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "no es pot omplir %d octet"
 msgstr[1] "no es pot omplir %d octets"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "EOF prematur"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "error de lectura d'entrada"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "s'han usat més octets que hi havia disponibles"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "paquet massa gran per a la definició actual d'off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "el paquet supera la mida màxima permesa"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
-msgstr "no es pot crear '%s'"
+msgstr "no s'ha pogut crear '%s'"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:323
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "no es pot obrir el fitxer de paquet '%s'"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:337
 msgid "pack signature mismatch"
 msgstr "hi ha una discordança de signatura de paquet"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:339
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "la versió de paquet %<PRIu32> no és compatible"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:357
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "el paquet té un objecte dolent a la posició %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:479
 #, c-format
 msgid "inflate returned %d"
 msgstr "la inflació ha retornat %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:528
 msgid "offset value overflow for delta base object"
-msgstr "desbordament de valor de desplaçament per a l'objecte base de delta"
+msgstr ""
+"desbordament de valor de desplaçament per a l'objecte base de diferències"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:536
 msgid "delta base offset is out of bound"
-msgstr "el desplaçament de base de delta està fora de límits"
+msgstr "el desplaçament de base de diferències està fora de límits"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:544
 #, c-format
 msgid "unknown object type %d"
 msgstr "tipus d'objecte desconegut %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:575
 msgid "cannot pread pack file"
 msgstr "no es pot fer pread en el fitxer de paquet"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:577
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
@@ -7684,272 +9002,281 @@ msgstr[0] "el final del fitxer de paquet és prematur, manca %<PRIuMAX> octet"
 msgstr[1] ""
 "el final del fitxer de paquet és prematur, manquen %<PRIuMAX> octets"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:603
 msgid "serious inflate inconsistency"
 msgstr "hi ha una inconsistència seriosa d'inflació"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "S'HA TROBAT UNA COL·LISIÓ SHA1 AMB %s !"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
 msgid "unable to read %s"
 msgstr "no s'ha pogut llegir %s"
 
 #: builtin/index-pack.c:814
 #, c-format
+msgid "cannot read existing object info %s"
+msgstr "no es pot llegir la informació de objecte existent %s"
+
+#: builtin/index-pack.c:822
+#, c-format
 msgid "cannot read existing object %s"
 msgstr "no es pot llegir l'objecte existent %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:836
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objecte de blob no vàlid %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:850
 #, c-format
 msgid "invalid %s"
 msgstr "%s no vàlid"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:853
 msgid "Error in object"
 msgstr "Error en objecte"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:855
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "No tots els objectes fills de %s són abastables"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
 msgid "failed to apply delta"
-msgstr "s'ha fallat en aplicar la delta"
+msgstr "s'ha produït un error en aplicar la diferència"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Receiving objects"
 msgstr "S'estan rebent objectes"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Indexing objects"
 msgstr "S'estan indexant objectes"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1160
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "el paquet és malmès (discordança SHA1)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1165
 msgid "cannot fstat packfile"
 msgstr "no es pot fer fstat en el fitxer de paquet"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1168
 msgid "pack has junk at the end"
 msgstr "el paquet té brossa al seu final"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1179
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "confusió més enllà de la bogeria en parse_pack_objects()"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1202
 msgid "Resolving deltas"
-msgstr "S'estan resolent les deltes"
+msgstr "S'estan resolent les diferències"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1213
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "no s'ha pogut crear fil: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1255
 msgid "confusion beyond insanity"
 msgstr "confusió més enllà de la bogeria"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1261
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "s'ha completat amb %d objecte local"
 msgstr[1] "s'ha completat amb %d objectes locals"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1273
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Suma de verificació final no esperada per a %s (corrupció de disc?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1277
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
-msgstr[0] "El paquet té %d delta no resolta"
-msgstr[1] "El paquet té %d deltes no resoltes"
+msgstr[0] "El paquet té %d diferència no resolta"
+msgstr[1] "El paquet té %d diferències no resoltes"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1301
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "no s'ha pogut desinflar l'objecte annexat (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1377
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "l'objecte local %s és malmès"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1403
 msgid "error while closing pack file"
 msgstr "error en tancar el fitxer de paquet"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1415
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "no es pot escriure el fitxer a retenir '%s'"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1423
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "no es pot tancar el fitxer escrit a retenir '%s'"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1433
 msgid "cannot store pack file"
 msgstr "no es pot emmagatzemar el fitxer de paquet"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "no es pot emmagatzemar el fitxer d'índex"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1479
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "pack.indexversion=%<PRIu32> dolent"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "no hi ha suport de fils, s'està ignorant %s"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1547
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "No es pot obrir el fitxer de paquet existent '%s'"
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1549
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "No es pot obrir el fitxer d'índex de paquets existent de '%s'"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1596
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
-msgstr[0] "sense delta: %d objecte"
-msgstr[1] "sense delta: %d objectes"
+msgstr[0] "sense diferències: %d objecte"
+msgstr[1] "sense diferències: %d objectes"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1603
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "longitud de cadena = %d: %lu objecte"
 msgstr[1] "longitud de cadena = %d: %lu objectes"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1616
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "el nom del fitxer de paquet '%s' no acaba amb '.pack'"
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
 msgid "bad %s"
 msgstr "%s dolent"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1737
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin no es pot usar sense --stdin"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "--stdin requereix d'un dipòsit git"
+
+#: builtin/index-pack.c:1747
 msgid "--verify with no packfile name given"
 msgstr "s'ha donat --verify sense nom de fitxer de paquet"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "no es pot fer stat en '%s'"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "no es pot fer stat en la plantilla '%s'"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "no es pot fer opendir en el directori '%s'"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "no es pot fer readlink en '%s'"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "no es pot fer symlink en '%s' '%s'"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "no es pot copiar '%s' a '%s'"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "s'està ignorant la plantilla %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "no s'han trobat les plantilles %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "no s'està copiant plantilles de '%s': %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s ja existeix"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "no s'ha pogut gestionar el tipus de fitxer %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "no s'ha pogut moure %s a %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s ja existeix"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "S'ha reinicialitzat el dipòsit compartit existent del Git en %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "S'ha reinicialitzat el dipòsit existent del Git en %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "S'ha inicialitzat un dipòsit compartit buit del Git en %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "S'ha inicialitzat un dipòsit buit del Git en %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7957,25 +9284,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<directori-de-plantilla>] [--"
 "shared[=<permisos>]] [<directori>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "permisos"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "especifica que el dipòsit de git es compartirà entre diversos usuaris"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "no es pot mkdir %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "no es pot canviar de directori a %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7984,7 +9311,7 @@ msgstr ""
 "no es permet %s (o --work-tree=<directori>) sense especificar %s (o --git-"
 "dir=<directori>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "No es pot accedir a l'arbre de treball '%s'"
@@ -7995,7 +9322,7 @@ msgid ""
 "<token>[(=|:)<value>])...] [<file>...]"
 msgstr ""
 "git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<fitxa>[(=|:)<valor>])...] [<fitxer>...]"
+"<testimoni>[(=|:)<valor>])...] [<fitxer>...]"
 
 #: builtin/interpret-trailers.c:26
 msgid "edit files in place"
@@ -8025,322 +9352,324 @@ msgstr "git log [<opcions>] [<rang-de-revisions>] [[--] <camí>...]"
 msgid "git show [<options>] <object>..."
 msgstr "git show [<opcions>] <objecte>..."
 
-#: builtin/log.c:84
+#: builtin/log.c:89
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "opció --decorate no vàlida: %s"
 
-#: builtin/log.c:139
+#: builtin/log.c:144
 msgid "suppress diff output"
 msgstr "omet la sortida de diferències"
 
-#: builtin/log.c:140
+#: builtin/log.c:145
 msgid "show source"
 msgstr "mostra la font"
 
-#: builtin/log.c:141
+#: builtin/log.c:146
 msgid "Use mail map file"
 msgstr "Usa el fitxer de mapa de correu"
 
-#: builtin/log.c:142
+#: builtin/log.c:147
 msgid "decorate options"
 msgstr "opcions de decoració"
 
-#: builtin/log.c:145
+#: builtin/log.c:150
 msgid "Process line range n,m in file, counting from 1"
 msgstr "Processa el rang de línies n,m en el fitxer, comptant des d'1"
 
-#: builtin/log.c:241
+#: builtin/log.c:246
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Sortida final: %d %s\n"
 
-#: builtin/log.c:486
+#: builtin/log.c:493
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: fitxer dolent"
 
-#: builtin/log.c:500 builtin/log.c:594
+#: builtin/log.c:507 builtin/log.c:601
 #, c-format
 msgid "Could not read object %s"
 msgstr "No es pot llegir l'objecte %s"
 
-#: builtin/log.c:618
+#: builtin/log.c:625
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Tipus desconegut: %d"
 
-#: builtin/log.c:739
+#: builtin/log.c:746
 msgid "format.headers without value"
 msgstr "format.headers sense valor"
 
-#: builtin/log.c:839
+#: builtin/log.c:846
 msgid "name of output directory is too long"
 msgstr "el nom del directori de sortida és massa llarg"
 
-#: builtin/log.c:854
+#: builtin/log.c:861
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "No es pot obrir el fitxer de pedaç %s"
 
-#: builtin/log.c:868
+#: builtin/log.c:875
 msgid "Need exactly one range."
 msgstr "Cal exactament un rang."
 
-#: builtin/log.c:878
+#: builtin/log.c:885
 msgid "Not a range."
 msgstr "No és un rang."
 
-#: builtin/log.c:984
+#: builtin/log.c:991
 msgid "Cover letter needs email format"
 msgstr "La carta de presentació necessita el format de correu electrònic"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1071
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to boig: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1098
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<opcions>] [<des-de> | <rang-de-revisions>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1148
 msgid "Two output directories?"
 msgstr "Hi ha dos directoris de sortida?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Comissió desconeguda %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
-msgstr "S'ha fallat en resoldre '%s' com a referència vàlida."
+msgstr "S'ha produït un error en resoldre '%s' com a referència vàlida."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1270
 msgid "Could not find exact merge base."
 msgstr "No s'ha pogut trobar la base exacta de fusió."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1274
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
 "Or you could specify base commit by --base=<base-commit-id> manually."
 msgstr ""
-"S'ha fallat en obtenir la font. Si voleu registrar la comissió base\n"
+"S'ha produït un error en obtenir la font. Si voleu registrar la comissió "
+"base\n"
 "automàticament, si us plau, useu git branch --set-upstream-to per a\n"
 "seguir una branca remot. O podeu especificar la comissió base manualment\n"
 "amb --base=<id-de-comissió-base>."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1294
 msgid "Failed to find exact merge base"
-msgstr "S'ha fallat en trobar la base exacta de fusió."
+msgstr "S'ha produït un error en trobar la base exacta de fusió."
 
-#: builtin/log.c:1294
+#: builtin/log.c:1305
 msgid "base commit should be the ancestor of revision list"
 msgstr "la comissió base ha de ser l'avantpassat de la llista de revisions"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1309
 msgid "base commit shouldn't be in revision list"
 msgstr "la comissió base no ha de ser en la llista de revisions"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1358
 msgid "cannot get patch id"
 msgstr "no es pot obtenir l'id del pedaç"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1415
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "usa [PATCH n/m] fins i tot amb un sol pedaç"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1418
 msgid "use [PATCH] even with multiple patches"
 msgstr "usa [PATCH] fins i tot amb múltiples pedaços"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1422
 msgid "print patches to standard out"
 msgstr "imprimeix els pedaços a la sortida estàndard"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1424
 msgid "generate a cover letter"
 msgstr "genera una carta de presentació"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1426
 msgid "use simple number sequence for output file names"
 msgstr "usa una seqüència de números per als noms dels fitxers de sortida"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1427
 msgid "sfx"
 msgstr "sufix"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1428
 msgid "use <sfx> instead of '.patch'"
 msgstr "usa <sufix> en lloc de '.patch'"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1430
 msgid "start numbering patches at <n> instead of 1"
 msgstr "comença numerant els pedaços a <n> en lloc d'1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1432
 msgid "mark the series as Nth re-roll"
 msgstr "marca la sèrie com a l'enèsima llançada"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Usa [RFC PATCH] en lloc de [PATCH]"
+
+#: builtin/log.c:1437
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Usa [<prefix>] en lloc de [PATCH]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1440
 msgid "store resulting files in <dir>"
 msgstr "emmagatzema els fitxers resultants a <directori>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1443
 msgid "don't strip/add [PATCH]"
 msgstr "no despullis/afegeixis [PATCH]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1446
 msgid "don't output binary diffs"
 msgstr "no emetis diferències binàries"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1448
 msgid "output all-zero hash in From header"
 msgstr "emet un hash de tots zeros en la capçalera From"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1450
 msgid "don't include a patch matching a commit upstream"
 msgstr "no incloguis pedaços que coincideixin amb comissions a la font"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1452
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "mostra el format de pedaç en lloc del per defecte (pedaç + estadístiques)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1454
 msgid "Messaging"
 msgstr "Missatgeria"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1455
 msgid "header"
 msgstr "capçalera"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1456
 msgid "add email header"
 msgstr "afegeix una capçalera de correu electrònic"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1457 builtin/log.c:1459
 msgid "email"
 msgstr "correu electrònic"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1457
 msgid "add To: header"
 msgstr "afegeix la capçalera To:"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1459
 msgid "add Cc: header"
 msgstr "afegeix la capçalera Cc:"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1461
 msgid "ident"
 msgstr "identitat"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1462
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "estableix l'adreça From a <identitat> (o la identitat del comitent si manca)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1464
 msgid "message-id"
 msgstr "ID de missatge"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1465
 msgid "make first mail a reply to <message-id>"
 msgstr "fes que el primer missatge sigui una resposta a <ID de missatge>"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1466 builtin/log.c:1469
 msgid "boundary"
 msgstr "límit"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1467
 msgid "attach the patch"
 msgstr "ajunta el pedaç"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1470
 msgid "inline the patch"
 msgstr "posa el pedaç en el cos"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1474
 msgid "enable message threading, styles: shallow, deep"
 msgstr "habilita l'enfilada de missatges, estils: shallow, deep"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1476
 msgid "signature"
 msgstr "signatura"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1477
 msgid "add a signature"
 msgstr "afegeix una signatura"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1478
 msgid "base-commit"
 msgstr "comissió base"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1479
 msgid "add prerequisite tree info to the patch series"
 msgstr "afegeix la informació d'arbre prerequerida a la sèrie de pedaços"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1481
 msgid "add a signature from a file"
 msgstr "afegeix una signatura des d'un fitxer"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1482
 msgid "don't print the patch filenames"
 msgstr "no imprimeixis els noms de fitxer del pedaç"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1572
 msgid "-n and -k are mutually exclusive."
 msgstr "-n i -k són mutualment exclusius."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix i -k són mutualment exclusius."
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc i -k són mutualment exclusius."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1582
 msgid "--name-only does not make sense"
 msgstr "--name-only no té sentit"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1584
 msgid "--name-status does not make sense"
 msgstr "--name-status no té sentit"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1586
 msgid "--check does not make sense"
 msgstr "--check no té sentit"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1616
 msgid "standard output, or directory, which one?"
 msgstr "sortida estàndard o directori, quin dels dos?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1618
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "No s'ha pogut crear el directori '%s'"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1712
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "no s'ha pogut llegir el fitxer de signatura '%s'"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1784
 msgid "Failed to create output files"
-msgstr "S'ha fallat en crear els fitxers de sortida"
+msgstr "S'ha produït un error en crear els fitxers de sortida"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1833
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<font> [<cap> [<límit>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1887
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8348,101 +9677,105 @@ msgstr ""
 "No s'ha pogut trobar una branca remota seguida. Si us plau, especifiqueu "
 "<font> manualment.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:468
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<opcions>] [<fitxer>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:517
 msgid "identify the file status with tags"
 msgstr "identifica l'estat de fitxer amb etiquetes"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:519
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "usa lletres minúscules per als fitxers 'assume unchanged'"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:521
 msgid "show cached files in the output (default)"
 msgstr ""
 "mostra en la sortida els fitxers desats en la memòria cau (per defecte)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:523
 msgid "show deleted files in the output"
 msgstr "mostra en la sortida els fitxers suprimits"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:525
 msgid "show modified files in the output"
 msgstr "mostra en la sortida els fitxers modificats"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:527
 msgid "show other files in the output"
 msgstr "mostra en la sortida els altres fitxers"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:529
 msgid "show ignored files in the output"
 msgstr "mostra en la sortida els fitxers ignorats"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:532
 msgid "show staged contents' object name in the output"
-msgstr "mostra en la sortida el nom d'objecte dels continguts allistats"
+msgstr "mostra en la sortida el nom d'objecte dels continguts «stage»"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:534
 msgid "show files on the filesystem that need to be removed"
 msgstr "mostra els fitxers en el sistema de fitxers que s'han d'eliminar"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:536
 msgid "show 'other' directories' names only"
 msgstr "mostra només els noms dels directoris 'other'"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:538
 msgid "show line endings of files"
-msgstr "mostra els terminis de línia dels fitxers"
+msgstr "mostra els terminadors de línia dels fitxers"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:540
 msgid "don't show empty directories"
 msgstr "no mostris els directoris buits"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:543
 msgid "show unmerged files in the output"
 msgstr "mostra en la sortida els fitxers sense fusionar"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:545
 msgid "show resolve-undo information"
 msgstr "mostra la informació de resolució de desfet"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:547
 msgid "skip files matching pattern"
-msgstr "salta els fitxers coincidents amb el patró"
+msgstr "omet els fitxers coincidents amb el patró"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:550
 msgid "exclude patterns are read from <file>"
 msgstr "els patrons d'exclusió es llegeixen de <fitxer>"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:553
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "llegeix els patrons addicionals d'exclusió per directori en <fitxer>"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:555
 msgid "add the standard git exclusions"
 msgstr "afegeix les exclusions estàndards de git"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:558
 msgid "make the output relative to the project top directory"
 msgstr "fes que la sortida sigui relativa al directori superior del projecte"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
+msgstr "inclou recursivament als submòduls"
+
+#: builtin/ls-files.c:563
 msgid "if any <file> is not in the index, treat this as an error"
-msgstr "si qualsevol <fitxer> no és en l'índex, tracta això com a error"
+msgstr "si qualsevol <fitxer> no és en l'índex, tracta-ho com a error"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:564
 msgid "tree-ish"
 msgstr "arbre"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:565
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "pretén que els camins eliminats després de <arbre> encara siguin presents"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:567
 msgid "show debugging data"
 msgstr "mostra les dades de depuració"
 
@@ -8457,39 +9790,39 @@ msgstr ""
 "                     [--exit-code] [--get-url] [--symref]\n"
 "                     [<dipòsit> [<referències>...]]"
 
-#: builtin/ls-remote.c:50
+#: builtin/ls-remote.c:52
 msgid "do not print remote URL"
 msgstr "no imprimeixis l'URL remot"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
 msgid "exec"
 msgstr "executable"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
 msgid "path of git-upload-pack on the remote host"
 msgstr "camí a git-upload-pack en la màquina remota"
 
-#: builtin/ls-remote.c:56
+#: builtin/ls-remote.c:58
 msgid "limit to tags"
 msgstr "limita a etiquetes"
 
-#: builtin/ls-remote.c:57
+#: builtin/ls-remote.c:59
 msgid "limit to heads"
 msgstr "limita a caps"
 
-#: builtin/ls-remote.c:58
+#: builtin/ls-remote.c:60
 msgid "do not show peeled tags"
 msgstr "no mostris les etiquetes pelades"
 
-#: builtin/ls-remote.c:60
+#: builtin/ls-remote.c:62
 msgid "take url.<base>.insteadOf into account"
 msgstr "tingues en compte url.<base>.insteadOf"
 
-#: builtin/ls-remote.c:62
+#: builtin/ls-remote.c:64
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr "surt amb codi de sortida 2 si no es troba cap referència coincident"
 
-#: builtin/ls-remote.c:64
+#: builtin/ls-remote.c:66
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "mostra la referència subjacent a més de l'objecte que senyali"
 
@@ -8497,35 +9830,35 @@ msgstr "mostra la referència subjacent a més de l'objecte que senyali"
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<opcions>] <arbre> [<camí>...]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "mostra només els arbres"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
-msgstr "recursa als subarbres"
+msgstr "inclou recursivament als subarbres"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "mostra els arbres en recursar"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "acaba les entrades amb un octet NUL"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "mida de l'objecte d'inclusió"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "llista només els noms de fitxer"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "usa els noms de camí complets"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "llista l'arbre sencer; no només el directori actual (implica --full-name)"
@@ -8535,170 +9868,174 @@ msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<opcions>] [<comissió>...]"
 
 #: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<opcions>] <missatge> HEAD <comissió>"
-
-#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
 msgid "switch `m' requires a value"
 msgstr "l'opció `m' requereix un valor"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "No s'ha pogut trobar l'estratègia de fusió '%s'.\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:141
 #, c-format
 msgid "Available strategies are:"
 msgstr "Les estratègies disponibles són:"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Les estratègies personalitzades disponibles són:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:196 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "no mostris les estadístiques de diferència al final de la fusió"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "mostra les estadístiques de diferència al final de la fusió"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:200 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(sinònim de --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:202 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "afegeix (com a màxim <n>) entrades del registre curt al missatge de comissió "
 "de fusió"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:205 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "crea una única comissió en lloc de fusionar"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:207 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "realitza una comissió si la fusió té èxit (per defecte)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:209 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "edita el missatge abans de cometre"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:210
 msgid "allow fast-forward (default)"
 msgstr "permet l'avanç ràpid (per defecte)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:212 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "avorta si l'avanç ràpid no és possible"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:216 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "verifica que la comissió anomenada tingui una signatura GPG vàlida"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
 msgid "strategy"
 msgstr "estratègia"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:218 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "estratègia de fusió a usar"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:219 builtin/pull.c:162
 msgid "option=value"
 msgstr "opció=valor"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:220 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "opció per a l'estratègia de fusió seleccionada"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "missatge de comissió de fusió (per a una fusió no d'avanç ràpid)"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:226
 msgid "abort the current in-progress merge"
 msgstr "avorta la fusió en curs actual"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "continua la fusió en curs actual"
+
+#: builtin/merge.c:230 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "permet fusionar històries no relacionades"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:258
 msgid "could not run stash."
 msgstr "no s'ha pogut executar stash."
 
-#: builtin/merge.c:260
+#: builtin/merge.c:263
 msgid "stash failed"
 msgstr "l'emmagatzemament ha fallat"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:268
 #, c-format
 msgid "not a valid object: %s"
 msgstr "no és un objecte vàlid: %s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:287 builtin/merge.c:304
 msgid "read-tree failed"
 msgstr "read-tree ha fallat"
 
-#: builtin/merge.c:331
+#: builtin/merge.c:334
 msgid " (nothing to squash)"
-msgstr " (res a aixafar)"
+msgstr " (res a fer «squash»)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:345
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
-msgstr "Comissió d'aixafada -- no s'està actualitzant HEAD\n"
+msgstr "Comissió «squash» -- no s'està actualitzant HEAD\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:395
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Cap missatge de fusió -- no s'està actualitzant HEAD\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' no assenyala una comissió"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:536
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Cadena branch.%s.mergeoptions dolenta: %s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "No s'està gestionant res a part de la fusió de dos caps."
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Opció desconeguda de merge-recursive: -X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "no s'ha pogut escriure %s"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "No s'ha pogut llegir de '%s'"
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "No s'està cometent la fusió; useu 'git commit' per a completar la fusió.\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8714,68 +10051,75 @@ msgstr ""
 "S'ignoraran les línies que comencin amb '%c', i un missatge buit\n"
 "avorta la comissió.\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "El missatge de comissió és buit."
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Meravellós.\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "La fusió automàtica ha fallat; arregleu els conflictes i després cometeu el "
 "resultat.\n"
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "'%s' no és una comissió"
-
-#: builtin/merge.c:904
+#: builtin/merge.c:890
 msgid "No current branch."
 msgstr "No hi ha cap branca actual."
 
-#: builtin/merge.c:906
+#: builtin/merge.c:892
 msgid "No remote for the current branch."
 msgstr "No hi ha cap remot per a la branca actual."
 
-#: builtin/merge.c:908
+#: builtin/merge.c:894
 msgid "No default upstream defined for the current branch."
 msgstr "No hi ha cap font per defecte definida per a la branca actual."
 
-#: builtin/merge.c:913
+#: builtin/merge.c:899
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "No hi ha cap branca amb seguiment remot per a %s de %s"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:946
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Valor dolent '%s' en l'entorn '%s'"
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1020
 #, c-format
 msgid "could not close '%s'"
 msgstr "no s'ha pogut tancar '%s'"
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1047
 #, c-format
 msgid "not something we can merge in %s: %s"
-msgstr "no és cosa que puguem fusionar en %s: %s"
+msgstr "no és quelcom que puguem fusionar en %s: %s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1081
 msgid "not something we can merge"
-msgstr "no és cosa que puguem fusionar"
+msgstr "no és quelcom que puguem fusionar"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "--abort no accepta paràmetres"
+
+#: builtin/merge.c:1150
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "No hi ha fusió a avortar (manca MERGE_HEAD)."
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "--continue no accepta paràmetres"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "No hi ha fusió en progrés (manca MERGE_HEAD)."
+
+#: builtin/merge.c:1182
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8783,123 +10127,122 @@ msgstr ""
 "No heu conclòs la vostra fusió (MERGE_HEAD existeix).\n"
 "Si us plau, cometeu els vostres canvis abans de fusionar."
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1189
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr ""
-"No heu conclòs el vostre recull de cireres (CHERRY_PICK_HEAD existeix).\n"
+"No heu conclòs el vostre «cherry pick» (CHERRY_PICK_HEAD existeix).\n"
 "Si us plau, cometeu els vostres canvis abans de fusionar."
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1192
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
-msgstr ""
-"No heu conclòs el vostre recull de cireres (CHERRY_PICK_HEAD existeix)."
+msgstr "No heu conclòs el vostre «cherry pick» (CHERRY_PICK_HEAD existeix)."
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1201
 msgid "You cannot combine --squash with --no-ff."
 msgstr "No podeu combinar --squash amb --no-ff."
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1209
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "No hi ha una comissió especificada i merge.defaultToUpstream no està "
 "establert."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1226
 msgid "Squash commit into empty head not supported yet"
-msgstr "Aixafar una comissió a un cap buit encara no es permet"
+msgstr "Una comissió «squash» a un HEAD buit encara no es permet"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1228
 msgid "Non-fast-forward commit does not make sense into an empty head"
-msgstr "Una comissió no d'avanç ràpid no té sentit a un cap buit"
+msgstr "Una comissió no d'avanç ràpid no té sentit a un HEAD buit"
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1233
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - no és una cosa que puguem fusionar"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1235
 msgid "Can merge only exactly one commit into empty head"
-msgstr "Es pot fusionar no més d'exactament una comissió a un cap buit"
+msgstr "Es pot fusionar només una comissió a un HEAD buit"
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "La comissió %s té una signatura GPG no fiable, suposadament de %s."
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "La comissió %s té una signatura GPG dolenta suposadament de %s."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "La comissió %s no té signatura GPG."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1278
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "La comissió %s té una signatura GPG bona de %s\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1340
 msgid "refusing to merge unrelated histories"
 msgstr "s'està refusant fusionar històries no relacionades"
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1349
 msgid "Already up-to-date."
 msgstr "Ja està al dia."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1359
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "S'estan actualitzant %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1400
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "S'està intentant una fusió molt trivial en l'índex...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1407
 #, c-format
 msgid "Nope.\n"
 msgstr "No.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1432
 msgid "Already up-to-date. Yeeah!"
 msgstr "Ja està al dia. Estupend!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1438
 msgid "Not possible to fast-forward, aborting."
 msgstr "No és possible avançar ràpidament, s'està avortant."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1461 builtin/merge.c:1540
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "S'està rebobinant l'arbre a la pristina...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1465
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "S'està intentant l'estratègia de fusió %s...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1531
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Cap estratègia de fusió ha gestionat la fusió.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1533
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "L'estratègia de fusió %s ha fallat.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1542
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "S'està usant el %s per a preparar la resolució a mà.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1554
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8926,23 +10269,23 @@ msgstr "git merge-base --is-ancestor <comissió> <comissió>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <referència> [<comissió>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "emet tots els avantpassats comuns"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "troba els avantpassats per a una sola fusió d'n vies"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "llista les revisions no abastables d'altres"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "és la primera un avantpassat de l'altre?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr ""
 "troba on <comissió> s'ha bifurcat del registre de referències de <referència>"
@@ -8955,38 +10298,69 @@ msgstr ""
 "git merge-file [<opcions>] [-L <nom1> [-L <original> [-L <nom2>]]] <fitxer1> "
 "<fitxer-original> <fitxer2>"
 
-#: builtin/merge-file.c:33
+#: builtin/merge-file.c:32
 msgid "send results to standard output"
 msgstr "envia els resultats a la sortida estàndard"
 
-#: builtin/merge-file.c:34
+#: builtin/merge-file.c:33
 msgid "use a diff3 based merge"
 msgstr "usa una fusió basada en diff3"
 
-#: builtin/merge-file.c:35
+#: builtin/merge-file.c:34
 msgid "for conflicts, use our version"
-msgstr "en conflictes, usa la versió nostra"
+msgstr "en conflictes, usa la nostra versió"
 
-#: builtin/merge-file.c:37
+#: builtin/merge-file.c:36
 msgid "for conflicts, use their version"
-msgstr "en conflictes, usa la versió seva"
+msgstr "en conflictes, usa la seva versió"
 
-#: builtin/merge-file.c:39
+#: builtin/merge-file.c:38
 msgid "for conflicts, use a union version"
 msgstr "en conflictes, usa una versió d'unió"
 
-#: builtin/merge-file.c:42
+#: builtin/merge-file.c:41
 msgid "for conflicts, use this marker size"
 msgstr "en conflictes, usa aquesta mida de marcador"
 
-#: builtin/merge-file.c:43
+#: builtin/merge-file.c:42
 msgid "do not warn about conflicts"
 msgstr "no avisis de conflictes"
 
-#: builtin/merge-file.c:45
+#: builtin/merge-file.c:44
 msgid "set labels for file1/orig-file/file2"
 msgstr "estableix les etiquetes per a fitxer1/fitxer-original/fitxer2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "opció desconeguda %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "no s'ha pogut analitzar l'objecte '%s'"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "no es pot gestionar més d'%d base. S'està ignorant %s."
+msgstr[1] "no es poden gestionar més de %d bases. S'està ignorant %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "no s'està gestionant res a part de la fusió de dos caps."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "no s'ha pogut resoldre la referència '%s'"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "S'està fusionant %s amb %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -9003,137 +10377,141 @@ msgstr "permet els objectes absents"
 msgid "allow creation of more than one tree"
 msgstr "permet la creació de més d'un arbre"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<opcions>] <font>... <destí>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "El directori %s és en l'índex i no hi ha cap submòdul?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
-"Si us plau, allisteu els vostres canvis a .gitmodules o emmagatzemeu-los per "
-"a procedir"
+"Si us plau, «stage» els vostres canvis a .gitmodules o feu «stage» dels "
+"mateixos per a procedir"
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s és en l'índex"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "força el moviment / canvi de nom encara que el destí existeixi"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "omet els errors de moviment / canvi de nom"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "el destí '%s' no és un directori"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "S'està comprovant el canvi de nom de '%s' a '%s'\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "font dolenta"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "no es pot moure un directori a dins d'ell mateix"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "no es pot moure un directori sobre un fitxer"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "el directori font està buit"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "no està sota control de versions"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "el destí existeix"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "s'està sobreescrivint '%s'"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "No es pot sobreescriure"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "múltiples fonts per al mateix destí"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "el directori destí no existeix"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, origen=%s, destí=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "S'està canviant el nom de %s a %s\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "el canvi del nom de '%s' ha fallat"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:289
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<opcions>] <comissió>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:290
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<opcions>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:291
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<opcions>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:346
 msgid "print only names (no SHA-1)"
 msgstr "imprimeix només els noms (sense SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:347
 msgid "only use tags to name the commits"
 msgstr "només usa les etiquetes per a anomenar les comissions"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:349
 msgid "only use refs matching <pattern>"
 msgstr "només usa les referències que coincideixin amb <patró>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "ignora les referències que coincideixin amb <patró>"
+
+#: builtin/name-rev.c:353
 msgid "list all commits reachable from all refs"
 msgstr "llista totes les comissions abastables de totes les referències"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:354
 msgid "read from stdin"
 msgstr "llegeix d'stdin"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:355
 msgid "allow to print `undefined` names (default)"
 msgstr "permet imprimir els noms `undefined` (per defecte)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:361
 msgid "dereference tags in the input (internal use)"
 msgstr "dereferencia les etiquetes en l'entrada (ús intern)"
 
@@ -9208,7 +10586,7 @@ msgstr "git notes add [<opcions>] [<objecte>]"
 
 #: builtin/notes.c:51
 msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr "git notes copy [<options>] <d'objecte> <a-objecte>"
+msgstr "git notes copy [<opcions>] <d'objecte> <a-objecte>"
 
 #: builtin/notes.c:52
 msgid "git notes copy --stdin [<from-object> <to-object>]..."
@@ -9252,7 +10630,7 @@ msgstr "git notes get-ref"
 
 #: builtin/notes.c:94
 msgid "Write/edit the notes for the following object:"
-msgstr "Escriviu/editeu les notes de l'objecte següent:"
+msgstr "Escriviu/editeu les notes per l'objecte següent:"
 
 #: builtin/notes.c:147
 #, c-format
@@ -9266,12 +10644,12 @@ msgstr "no s'ha pogut llegir la sortida de 'show'"
 #: builtin/notes.c:159
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
-msgstr "s'ha fallat en finalitzar 'show' per a l'objecte '%s'"
+msgstr "S'ha produït un error en finalitzar 'show' per a l'objecte '%s'"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
+msgid "please supply the note contents using either -m or -F option"
 msgstr ""
-"Si us plau, proveïu els continguts de la nota fent servir l'opció -m o "
+"si us plau, proveïu els continguts de la nota fent servir l'opció -m o "
 "l'opció -F"
 
 #: builtin/notes.c:203
@@ -9280,133 +10658,190 @@ msgstr "no s'ha pogut escriure l'objecte de nota"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Els continguts de la nota s'han deixat en %s"
+msgid "the note contents have been left in %s"
+msgstr "s'han deixat els continguts de la nota en %s"
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
 msgid "cannot read '%s'"
 msgstr "no es pot llegir '%s'"
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "no s'ha pogut obrir o llegir '%s'"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "s'ha produït un error en resoldre '%s' com a referència vàlida."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "S'ha fallat en llegir l'objecte '%s'."
+msgid "failed to read object '%s'."
+msgstr "s'ha produït un error en llegir l'objecte '%s'."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "No es pot llegir les dades de node de l'objecte no de blob '%s'."
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "no es pot llegir les dades de node de l'objecte no de blob '%s'."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "línia d'entrada mal formada: '%s'."
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "s'ha produït un error en copiar les notes de '%s' a '%s'"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "s'està refusant %s les notes en %s (fora de refs/notes/)"
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
 msgid "too many parameters"
 msgstr "massa paràmetres"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid "No note found for object %s."
-msgstr "No s'ha trobat cap nota per a l'objecte %s."
+msgid "no note found for object %s."
+msgstr "no s'ha trobat cap nota per a l'objecte %s."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "anota els continguts com a cadena"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "anota els continguts en un fitxer"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "reusa i edita l'objecte de nota especificat"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "reusa l'objecte de nota especificat"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "permet l'emmagatzematge d'una nota buida"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "reemplaça les notes existents"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
-"No es pot afegir les notes. S'han trobat notes existents de l'objecte %s. "
+"No es poden afegir les notes. S'han trobat notes existents de l'objecte %s. "
 "Useu '-f' per a sobreescriure les notes existents."
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "S'estan sobreescrivint les notes existents de l'objecte %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "S'està eliminant la nota de l'objecte %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "llegeix els objectes des d'stdin"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "carrega la configuració de reescriptura per a <ordre> (implica --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "hi ha massa pocs paràmetres"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
-"No es pot copiar les notes. S'han trobat notes existents de l'objecte %s. "
+"No es poden copiar les notes. S'han trobat notes existents de l'objecte %s. "
 "Useu '-f' per a sobreescriure les notes existents."
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Manquen notes a l'objecte font %s. No es pot copiar."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "manquen notes a l'objecte font %s. No es pot copiar."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr ""
-"S'han desaprovat les opcions -m/-F/-c/-C en favor de la subordre 'edit'.\n"
+"Es desaconsellen les opcions -m/-F/-c/-C en favor de la subordre 'edit'.\n"
 "Si us plau, useu 'git notes add -f -m/-F/-c/-C' en lloc d'això.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "s'ha produït un error en suprimir la referència NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "s'ha produït un error en suprimir la referència NOTES_MERGE_REF"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr ""
+"s'ha produït un error en eliminar l'arbre de treball de 'git notes merge'"
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "s'ha produït un error en llegir la referència NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "no s'ha pogut trobar cap comissió de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "no s'ha pogut analitzar la comissió de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "s'ha produït un error en resoldre NOTES_MERGE_REF"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "s'ha produït un error en finalitzar la fusió de notes"
+
+#: builtin/notes.c:754
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "estratègia de fusió de notes desconeguda %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:770
 msgid "General options"
 msgstr "Opcions generals"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:772
 msgid "Merge options"
 msgstr "Opcions de fusió"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:774
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9414,47 +10849,48 @@ msgstr ""
 "resol els conflictes de nota usant l'estratègia donada (manual/ours/theirs/"
 "union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:776
 msgid "Committing unmerged notes"
 msgstr "S'estan cometent les notes sense fusionar"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:778
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "finalitza la fusió de notes cometent les notes sense fusionar"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:780
 msgid "Aborting notes merge resolution"
 msgstr "S'està avortant la resolució de fusió de notes"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:782
 msgid "abort notes merge"
 msgstr "avorta la fusió de notes"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:793
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "no es pot combinar --commit, --abort i -s/--strategy"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
-msgstr "Cal especificar una referència de notes a fusionar"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
+msgstr "cal especificar una referència de notes a fusionar"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:822
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "-s/--strategy desconeguda: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:859
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Una fusió de notes a %s ja està en curs a %s"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "una fusió de notes a %s ja està en curs a %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:862
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
+msgid "failed to store link to current notes ref (%s)"
 msgstr ""
-"S'ha fallat en emmagatzemar l'enllaç a la referència de notes actual (%s)"
+"s'ha produït un error en emmagatzemar l'enllaç a la referència de notes "
+"actual (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:864
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9465,48 +10901,48 @@ msgstr ""
 "cometeu el resultat amb 'git notes merge --commit', o avorteu la fusió amb "
 "'git notes merge --abort'.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:886
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "L'objecte %s no té cap nota\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:898
 msgid "attempt to remove non-existent note is not an error"
 msgstr "l'intent d'eliminar una nota no existent no és un error"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:901
 msgid "read object names from the standard input"
 msgstr "llegeix els noms d'objecte des de l'entrada estàndard"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "no eliminis, només mostra"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:940
 msgid "report pruned notes"
 msgstr "informa de notes podades"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:982
 msgid "notes-ref"
 msgstr "referència de notes"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:983
 msgid "use notes from <notes-ref>"
 msgstr "usa les notes de <referència-de-notes>"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1018
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Subordre desconeguda: %s"
+msgid "unknown subcommand: %s"
+msgstr "subordre desconeguda: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<opcions>...] [< <llista-de-referències> | < "
 "<llista-de-objectes>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
@@ -9518,186 +10954,183 @@ msgstr ""
 msgid "deflate error (%d)"
 msgstr "error de deflació (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:770
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "s'està inhabilitant l'escriptura de mapes de bits, es divideixen els paquets "
 "a causa de pack.packSizeLimit"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:783
 msgid "Writing objects"
 msgstr "S'estan escrivint els objectes"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1063
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "s'està inhabilitant l'escriptura de mapes de bits, perquè alguns objectes no "
 "s'empaqueten"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2426
 msgid "Compressing objects"
 msgstr "S'estan comprimint objectes"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2829
 #, c-format
 msgid "unsupported index version %s"
 msgstr "versió d'índex no compatible %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2833
 #, c-format
 msgid "bad index version '%s'"
 msgstr "versió d'índex dolenta '%s'"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2863
 msgid "do not show progress meter"
 msgstr "no mostris l'indicador de progrés"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2865
 msgid "show progress meter"
 msgstr "mostra l'indicador de progrés"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2867
 msgid "show progress meter during object writing phase"
 msgstr "mostra l'indicador de progrés durant la fase d'escriptura d'objectes"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2870
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "similar a --all-progress quan l'indicador de progrés es mostra"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2871
 msgid "version[,offset]"
 msgstr "versió[,desplaçament]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2872
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "escriu el fitxer d'índex de paquet en la versió de format d'índex "
 "especificada"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2875
 msgid "maximum size of each output pack file"
 msgstr "mida màxima de cada fitxer de paquet de sortida"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2877
 msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 "ignora els objectes prestats d'un emmagatzemament d'objectes alternatiu"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2879
 msgid "ignore packed objects"
 msgstr "ignora els objectes empaquetats"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2881
 msgid "limit pack window by objects"
 msgstr "limita la finestra d'empaquetament per objectes"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2883
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "limita la finestra d'empaquetament per memòria a més del límit d'objectes"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2885
 msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr "longitud màxima de la cadena de deltes permesa en el paquet resultant"
+msgstr ""
+"longitud màxima de la cadena de diferències permesa en el paquet resultant"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2887
 msgid "reuse existing deltas"
-msgstr "reusa les deltes existents"
+msgstr "reusa les diferències existents"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2889
 msgid "reuse existing objects"
 msgstr "reusa els objectes existents"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2891
 msgid "use OFS_DELTA objects"
 msgstr "usa objectes OFS_DELTA"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2893
 msgid "use threads when searching for best delta matches"
-msgstr "usa fils en cercar les millores coincidències de delta"
+msgstr "usa fils en cercar les millores coincidències de diferències"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2895
 msgid "do not create an empty pack output"
 msgstr "no creïs una emissió de paquet buida"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2897
 msgid "read revision arguments from standard input"
 msgstr "llegeix els paràmetres de revisió des de l'entrada estàndard"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2899
 msgid "limit the objects to those that are not yet packed"
 msgstr "limita els objectes als quals encara no s'hagin empaquetat"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2902
 msgid "include objects reachable from any reference"
-msgstr "inclou els objectes abastables de qualsevulla referència"
+msgstr "inclou els objectes abastables de qualsevol referència"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2905
 msgid "include objects referred by reflog entries"
 msgstr ""
 "inclou els objectes als quals facin referència les entrades del registre de "
 "referències"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2908
 msgid "include objects referred to by the index"
 msgstr "inclou els objectes als quals faci referència l'índex"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2911
 msgid "output pack to stdout"
 msgstr "emet el paquet a stdout"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2913
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 "inclou els objectes d'etiqueta que facin referència als objectes a empaquetar"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2915
 msgid "keep unreachable objects"
 msgstr "retén els objectes inabastables"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2917
 msgid "pack loose unreachable objects"
 msgstr "empaqueta els objectes inabastables solts"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "hora"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2919
 msgid "unpack unreachable objects newer than <time>"
 msgstr "desempaqueta els objectes inabastables més nous que <hora>"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2922
 msgid "create thin packs"
 msgstr "crea paquets prims"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2924
 msgid "create packs suitable for shallow fetches"
 msgstr "crea paquets adequats per a les obtencions superficials"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2926
 msgid "ignore packs that have companion .keep file"
 msgstr "ignora els paquets que tinguin un fitxer .keep corresponent"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2928
 msgid "pack compression level"
 msgstr "nivell de compressió de paquet"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2930
 msgid "do not hide commits by grafts"
 msgstr "no amaguis les comissions per empelt"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2932
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "usa un índex de mapa de bits, si està disponible, per a accelerar el "
 "recompte d'objectes"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2934
 msgid "write a bitmap index together with the pack index"
 msgstr "escriu un índex de mapa de bits junt amb l'índex de paquet"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:3061
 msgid "Counting objects"
 msgstr "S'estan comptant els objectes"
 
@@ -9725,11 +11158,11 @@ msgstr "S'estan eliminant objectes duplicats"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <hora>] [--] [<cap>...]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "informa d'objectes podats"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
 msgstr "fes caducar els objectes més vells que <hora>"
 
@@ -9737,53 +11170,45 @@ msgstr "fes caducar els objectes més vells que <hora>"
 msgid "cannot prune in a precious-objects repo"
 msgstr "no es pot podar en un dipòsit d'objectes preciosos"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Valor no vàlid per a %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr "git pull [opcions] [<dipòsit> [<especificació-de-referència>...]]"
+msgstr "git pull [<opcions>] [<dipòsit> [<especificació-de-referència>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Opcions relacionades amb fusionar"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "incorpora els canvis per rebasar en lloc de fusionar"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
 msgid "allow fast-forward"
 msgstr "permet l'avanç ràpid"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
-msgstr "automàticament emmagatzema/desempila abans i després de rebasament"
+msgstr "automàticament emmagatzema/desempila abans i després de fer «rebase»"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Opcions relacionades amb obtenir"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "nombre de submòduls baixats en paral·lel"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Valor no vàlid per a pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "No es pot baixar amb rebasament: Teniu canvis no allistats."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Addicionalment, el vostre índex conté canvis sense cometre."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"No es pot baixar amb rebasament: El vostre índex conté canvis sense cometre."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9791,13 +11216,13 @@ msgstr ""
 "No hi ha cap candidat sobre el qual rebasar entre les referències que acabeu "
 "d'obtenir."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "No hi ha candidats per a fusionar entre les referències que acabeu d'obtenir."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9805,7 +11230,7 @@ msgstr ""
 "Generalment això vol dir que heu proveït una especificació de\n"
 "referència de comodí que no tenia cap coincidència en el costat remot."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9816,44 +11241,44 @@ msgstr ""
 "Perquè aquest no és el remot configurat per defecte per a la vostra\n"
 "branca actual, heu d'especificar una branca en la línia d'ordres."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Actualment no sou en cap branca."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
-msgstr "Si us plau, especifiqueu sobre què branca voleu rebasar."
+msgstr "Si us plau, especifiqueu sobre què branca voleu fer «rebase»."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Si us plau, especifiqueu amb què branca voleu fusionar."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Vegeu git-pull(1) per detalls."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<remot>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<branca>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "No hi ha cap informació de seguiment per a la branca actual."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
 "Si voleu establir informació de seguiment per a aquesta branca, podeu fer-ho "
 "amb:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9862,20 +11287,28 @@ msgstr ""
 "La vostra configuració especifica fusionar amb la referència '%s'\n"
 "del remot, però no s'ha obtingut tal referència."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
-msgstr "s'està ignorant --verify-signatures per a rebasar"
+msgstr "s'està ignorant --verify-signatures en fer «rebase»"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "l'opció --[no-]-autostash és vàlid només amb --rebase."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "S'està actualitzant una branca no nascuda amb canvis afegits a l'índex."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "baixar fent «rebase»"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "si us plau, cometeu-los o emmagatzemeu-los."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9886,7 +11319,7 @@ msgstr ""
 "s'està avançant ràpidament el vostre arbre de treball des de\n"
 "la comissió %s."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9897,20 +11330,20 @@ msgid ""
 "to recover."
 msgstr ""
 "No es pot avançar ràpidament el vostre arbre de treball.\n"
-"Després d'assegurar que hàgiu desat qualsevulla cosa preciosa de la sortida "
+"Després d'assegurar que hàgiu desat qualsevol cosa preciosa de la sortida "
 "de\n"
 "$ git diff %s\n"
 "executeu\n"
 "$ git reset --hard\n"
 "per a recuperar."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
-msgstr "No es pot fusionar múltiples branques a un cap buit."
+msgstr "No es poden fusionar múltiples branques a un HEAD buit."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
-msgstr "No es pot rebasar sobre múltiples branques."
+msgstr "No es pot fer «rebase» sobre múltiples branques."
 
 #: builtin/push.c:16
 msgid "git push [<options>] [<repository> [<refspec>...]]"
@@ -9930,7 +11363,7 @@ msgid ""
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 "\n"
-"Per a triar qualsevulla opció permanentment, vegeu push.default a 'git help "
+"Per a triar qualsevol opció permanentment, vegeu push.default a 'git help "
 "config'."
 
 #: builtin/push.c:146
@@ -10003,14 +11436,14 @@ msgstr ""
 "branca actual '%s', sense dir-me què pujar per a actualitzar\n"
 "quina branca remota."
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "No heu especificat cap especificació de referència a pujar, i push.default "
 "és \"nothing\"."
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -10022,7 +11455,7 @@ msgstr ""
 "els canvis remots (per exemple, 'git pull ...') abans de pujar de nou.\n"
 "Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -10035,7 +11468,7 @@ msgstr ""
 "abans de pujar de nou.\n"
 "Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -10044,18 +11477,18 @@ msgid ""
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 "S'han rebutjat les actualitzacions perquè el remot conté treball\n"
-"que no teniu localment. Això usualment és causat per un altre dipòsit\n"
+"que no teniu localment. Això acostumar a ser causat per un altre dipòsit\n"
 "que ha pujat a la mateixa referència. Pot ser que primer vulgueu\n"
 "integrar els canvis remots (per exemple, 'git pull ...') abans de\n"
 "pujar de nou.\n"
 "Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "S'han rebutjat les actualitzacions perquè l'etiqueta ja existeix en el remot."
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -10066,22 +11499,22 @@ msgstr ""
 "fer que assenyali un objecte no de comissió, sense usar l'opció\n"
 "'--force'.\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "S'està pujant a %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
-msgstr "s'ha fallat en pujar algunes referències a '%s'"
+msgstr "s'ha produït un error en pujar algunes referències a '%s'"
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "dipòsit dolent '%s'"
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -10103,116 +11536,116 @@ msgstr ""
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "--all i --tags són incompatibles"
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "--all no es pot combinar amb especificacions de referència"
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror i --tags són incompatibles"
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror no es pot combinar amb especificacions de referència"
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "--all i --mirror són incompatibles"
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "dipòsit"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:162
 msgid "push all refs"
 msgstr "puja totes les referències"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:164
 msgid "mirror all refs"
 msgstr "reflecteix totes les referències"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "suprimeix les referències"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "puja les etiquetes (no es pot usar amb --all o --mirror)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:165
 msgid "force updates"
 msgstr "força les actualitzacions"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:179
 msgid "refname>:<expect"
 msgstr "nom-de-referència>:<esperat"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:180
 msgid "require old value of ref to be at this value"
 msgstr "requereix que el valor antic de la referència sigui d'aquest valor"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "controla la pujada recursiva dels submòduls"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:173
 msgid "use thin pack"
 msgstr "usa el paquet prim"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
 msgid "receive pack program"
 msgstr "programa que rep els paquets"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "estableix la font per a git pull/status"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "poda les referències eliminades localment"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "evita el ganxo de prepujada"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "puja les etiquetes absents però rellevants"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:167
 msgid "GPG sign the push"
 msgstr "signa la pujada amb GPG"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:174
 msgid "request atomic transaction on remote side"
 msgstr "demana una transacció atòmica al costat remot"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:170
 msgid "server-specific"
 msgstr "específic al servidor"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:171
 msgid "option to transmit"
 msgstr "opció a transmetre"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete és incompatible amb --all, --mirror i --tags"
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete no té sentit sense referències"
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr "les opcions de pujada no han de tenir caràcters de línia nova"
 
-#: builtin/read-tree.c:37
+#: builtin/read-tree.c:40
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -10222,79 +11655,144 @@ msgstr ""
 "[-u [--exclude-per-directory=<ignoral-de-git>] | -i]] [--no-sparse-checkout] "
 "[--index-output=<fitxer>] (--empty | <arbre1> [<arbre2> [<arbre3>]])"
 
-#: builtin/read-tree.c:110
+#: builtin/read-tree.c:130
 msgid "write resulting index to <file>"
 msgstr "escriu l'índex resultant al <fitxer>"
 
-#: builtin/read-tree.c:113
+#: builtin/read-tree.c:133
 msgid "only empty the index"
 msgstr "només buida l'índex"
 
-#: builtin/read-tree.c:115
+#: builtin/read-tree.c:135
 msgid "Merging"
-msgstr "Fusión"
+msgstr "S'està fusionant"
 
-#: builtin/read-tree.c:117
+#: builtin/read-tree.c:137
 msgid "perform a merge in addition to a read"
 msgstr "realitza una fusió a més d'una lectura"
 
-#: builtin/read-tree.c:119
+#: builtin/read-tree.c:139
 msgid "3-way merge if no file level merging required"
 msgstr "fusió de 3 vies si no cal fusió a nivell de fitxers"
 
-#: builtin/read-tree.c:121
+#: builtin/read-tree.c:141
 msgid "3-way merge in presence of adds and removes"
 msgstr "fusió de 3 vies en presència d'afegiments i eliminacions"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:143
 msgid "same as -m, but discard unmerged entries"
 msgstr "el mateix que -m, però descarta les entrades no fusionades"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:144
 msgid "<subdirectory>/"
 msgstr "<subdirectori>/"
 
-#: builtin/read-tree.c:125
+#: builtin/read-tree.c:145
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "llegiu l'arbre a l'índex sota <subdirectori>/"
 
-#: builtin/read-tree.c:128
+#: builtin/read-tree.c:148
 msgid "update working tree with merge result"
 msgstr "actualitza l'arbre de treball amb el resultat de fusió"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:150
 msgid "gitignore"
-msgstr "ignoral de git"
+msgstr "gitignore"
 
-#: builtin/read-tree.c:131
+#: builtin/read-tree.c:151
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "permet que els fitxers explícitament ignorats se sobreescriguin"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:154
 msgid "don't check the working tree after merging"
 msgstr "no comprovis l'arbre de treball després de fusionar"
 
-#: builtin/read-tree.c:135
+#: builtin/read-tree.c:155
 msgid "don't update the index or the work tree"
 msgstr "no actualitzis l'índex ni l'arbre de treball"
 
-#: builtin/read-tree.c:137
+#: builtin/read-tree.c:157
 msgid "skip applying sparse checkout filter"
-msgstr "salta l'aplicació del filtre d'agafament parcial"
+msgstr "omet l'aplicació del filtre d'agafament parcial"
 
-#: builtin/read-tree.c:139
+#: builtin/read-tree.c:159
 msgid "debug unpack-trees"
 msgstr "depura unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase--helper [<opcions>]"
+
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "continua el «rebase»"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "avorta el «rebase»"
+
+#: builtin/receive-pack.c:27
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <git-dir>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Per defecte, es denega actualitzar la branca actual en un dipòsit no\n"
+"nu, perquè faria l'índex i l'arbre de treball inconsistents amb el\n"
+"que hàgiu pujat, i requeriria 'git reset --hard' per a fer que\n"
+"l'arbre de treball coincideixi amb HEAD.\n"
+"\n"
+"Podeu establir la variable de configuració\n"
+"'receive.denyCurrentBranch' a 'ignore' o 'warn' en el dipòsit remot\n"
+"per a permetre pujar a la seva branca actual; no obstant, no es\n"
+"recomana això a menys que hàgiu decidit actualitzar el seu arbre en\n"
+"alguna altra manera per a coincidir amb el que hàgiu pujat.\n"
+"\n"
+"Per a silenciar aquest missatge i encara retenir el comportament\n"
+"predeterminat, establiu la variable de configuració\n"
+"'receive.denyCurrentBranch' a 'refuse'."
+
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Per defecte, es denega suprimir la branca actual, perquè el\n"
+"'git clone' següent no resultarà en cap fitxer agafat, causant\n"
+"confusió.\n"
+"\n"
+"Podeu establir la variable de configuració\n"
+"'receive.denyDeleteCurrent' a 'warn' o 'ignore' en el dipòsit remot\n"
+"per a permetre suprimir la branca actual, amb un missatge\n"
+"d'advertència o sense.\n"
+"\n"
+"Per a silenciar aquest missatge, podeu establir-la a 'refuse'."
+
+#: builtin/receive-pack.c:1888
 msgid "quiet"
-msgstr "callat"
+msgstr "silenciós"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1902
 msgid "You must specify a directory."
 msgstr "Heu d'especificar un directori."
 
@@ -10400,7 +11898,7 @@ msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
 msgstr ""
-"--mirror és perillós i desaprovat; si us\n"
+"--mirror és perillós i està en desús; si us\n"
 "\t plau, useu --mirror=fetch o\n"
 "\t --mirror=push en lloc d'això"
 
@@ -10475,7 +11973,7 @@ msgstr "(coincident)"
 msgid "(delete)"
 msgstr "(suprimir)"
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
 #, c-format
 msgid "No such remote: %s"
 msgstr "No hi ha tal remot: %s"
@@ -10507,7 +12005,7 @@ msgstr "la supressió de '%s' ha fallat"
 msgid "creating '%s' failed"
 msgstr "la creació de '%s' ha fallat"
 
-#: builtin/remote.c:792
+#: builtin/remote.c:794
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -10522,384 +12020,395 @@ msgstr[1] ""
 "eliminat;\n"
 "per a suprimir-les, useu:"
 
-#: builtin/remote.c:806
+#: builtin/remote.c:808
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "No s'ha pogut eliminar la secció de configuració '%s'"
 
-#: builtin/remote.c:907
+#: builtin/remote.c:909
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nou (la pròxima obtenció emmagatzemarà a remotes/%s)"
 
-#: builtin/remote.c:910
+#: builtin/remote.c:912
 msgid " tracked"
 msgstr " seguit"
 
-#: builtin/remote.c:912
+#: builtin/remote.c:914
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " estancat (useu 'git remote prune' per a eliminar)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:916
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:955
+#: builtin/remote.c:957
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr "branch.%s.merge no vàlid; no es pot rebasar sobre > 1 branca"
+msgstr "branch.%s.merge no vàlid; no es pot fer «rebase» sobre > 1 branca"
 
-#: builtin/remote.c:963
+#: builtin/remote.c:965
 #, c-format
 msgid "rebases interactively onto remote %s"
-msgstr "es rebasa interactivament sobre el remot %s"
+msgstr "es fa «rebase» interactivament sobre el remot %s"
 
-#: builtin/remote.c:964
+#: builtin/remote.c:966
 #, c-format
 msgid "rebases onto remote %s"
-msgstr "es rebasa sobre el remot %s"
+msgstr "es fa «rebase» sobre el remot %s"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:969
 #, c-format
 msgid " merges with remote %s"
 msgstr "es fusiona amb el remot %s"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:972
 #, c-format
 msgid "merges with remote %s"
 msgstr "es fusiona amb el remot %s"
 
-#: builtin/remote.c:973
+#: builtin/remote.c:975
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s    i amb el remot %s\n"
 
-#: builtin/remote.c:1016
+#: builtin/remote.c:1018
 msgid "create"
 msgstr "crea"
 
-#: builtin/remote.c:1019
+#: builtin/remote.c:1021
 msgid "delete"
 msgstr "suprimeix"
 
-#: builtin/remote.c:1023
+#: builtin/remote.c:1025
 msgid "up to date"
 msgstr "al dia"
 
-#: builtin/remote.c:1026
+#: builtin/remote.c:1028
 msgid "fast-forwardable"
 msgstr "avanç ràpid possible"
 
-#: builtin/remote.c:1029
+#: builtin/remote.c:1031
 msgid "local out of date"
 msgstr "local no actualitzat"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1038
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s força a %-*s (%s)"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s puja a %-*s (%s)"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1045
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s força a %s"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s puja a %s"
 
-#: builtin/remote.c:1114
+#: builtin/remote.c:1116
 msgid "do not query remotes"
 msgstr "no consultis els remots"
 
-#: builtin/remote.c:1141
+#: builtin/remote.c:1143
 #, c-format
 msgid "* remote %s"
 msgstr "* remot %s"
 
-#: builtin/remote.c:1142
+#: builtin/remote.c:1144
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL d'obtenció: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
 msgid "(no URL)"
 msgstr "(sense URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL de pujada: %s"
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Branca de HEAD: %s"
 
-#: builtin/remote.c:1158
+#: builtin/remote.c:1160
 msgid "(not queried)"
 msgstr "(no consultat)"
 
-#: builtin/remote.c:1160
+#: builtin/remote.c:1162
 msgid "(unknown)"
 msgstr "(desconegut)"
 
-#: builtin/remote.c:1164
+#: builtin/remote.c:1166
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
 "  Branca de HEAD (el HEAD remot és ambigu, pot ser un dels següents):\n"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1178
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branca remota:%s"
 msgstr[1] "  Branques remotes:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1181 builtin/remote.c:1207
 msgid " (status not queried)"
 msgstr " (estat no consultat)"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1190
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Branca local configurada per a 'git pull':"
 msgstr[1] "  Branques locals configurades per a 'git pull':"
 
-#: builtin/remote.c:1196
+#: builtin/remote.c:1198
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  'git push' reflectirà les referències locals"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1204
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Referència local configurada per a 'git push'%s:"
 msgstr[1] "  Referències locals configurades per a 'git push'%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1225
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "estableix refs/remotes/<name>/HEAD segons el remot"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1227
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "suprimeix refs/remotes/<name>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1242
 msgid "Cannot determine remote HEAD"
 msgstr "No es pot determinar el HEAD remot"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1244
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Múltiples branques de HEAD remotes. Si us plau, trieu-ne una explícitament "
 "amb:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1254
 #, c-format
 msgid "Could not delete %s"
 msgstr "No s'ha pogut suprimir %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1262
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "No és una referència vàlida: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1264
 #, c-format
 msgid "Could not setup %s"
 msgstr "No s'ha pogut configurar %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1282
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s es tornarà penjant!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1283
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s s'ha tornat penjant!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1293
 #, c-format
 msgid "Pruning %s"
 msgstr "S'està podant %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1294
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1310
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [podaria] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1313
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [podat] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1358
 msgid "prune remotes after fetching"
 msgstr "poda els remots després d'obtenir-los"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
 #, c-format
 msgid "No such remote '%s'"
 msgstr "No hi ha tal remot '%s'"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1437
 msgid "add branch"
 msgstr "afegeix branca"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1444
 msgid "no remote specified"
 msgstr "cap remot especificat"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1461
 msgid "query push URLs rather than fetch URLs"
-msgstr "consulta els URL de pujada en lloc dels URL d'obteniment"
+msgstr "consulta els URL de pujada en lloc dels URL d'obtenció"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1463
 msgid "return all URLs"
 msgstr "retorna tots els URL"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1491
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "cap URL configurat per al remot '%s'"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1517
 msgid "manipulate push URLs"
 msgstr "manipula els URL de pujada"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1519
 msgid "add URL"
 msgstr "afegeix URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1521
 msgid "delete URLs"
 msgstr "suprimeix URLs"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1528
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete no té sentit"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1569
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Patró d'URL antic no vàlid: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1577
 #, c-format
 msgid "No such URL found: %s"
 msgstr "No s'ha trobat tal URL: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1579
 msgid "Will not delete all non-push URLs"
 msgstr "No se suprimiran tots els URL no de pujada"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1593
 msgid "be verbose; must be placed before a subcommand"
 msgstr "sigues detallat; s'ha de col·locar abans d'una subordre"
 
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Subordre desconeguda: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<opcions>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "empaqueta-ho tot en un únic paquet"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "el mateix que -a, i solta els objectes inabastables"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "elimina els paquets redundants, i executeu git-prune-packed"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passa --no-reuse-delta a git-pack-objects"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passa --no-reuse-object a git-pack-objects"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "no executis git-update-server-info"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "passa --local a git-pack-objects"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "escriu índex de mapa de bits"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "data aproximada"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr "amb -A, no soltis els objectes més vells que aquest"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "amb -a, reempaqueta els objectes inabastables"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
-msgstr "mida de la finestra que s'usa per a compressió de deltes"
+msgstr "mida de la finestra que s'usa per a compressió de diferències"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "octets"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "el mateix que l'anterior, però limita la mida de memòria en lloc del nombre "
 "d'entrades"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
-msgstr "limita la profunditat màxima de les deltes"
+msgstr "limita la profunditat màxima de les diferències"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "mida màxima de cada fitxer de paquet"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr "reempaqueta els objectes en paquets marcats amb .keep"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "no es pot suprimir paquets en un dipòsit d'objectes preciosos"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable i -A són incompatibles"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
-msgstr "s'ha fallat en eliminar '%s'"
+msgstr "s'ha produït un error en eliminar '%s'"
 
 #: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
@@ -10921,22 +12430,22 @@ msgstr "git replace -d <objecte>..."
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<format>] [-l [<patró>]]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
 #, c-format
 msgid "Not a valid object name: '%s'"
 msgstr "No és un nom d'objecte vàlid: '%s'"
 
-#: builtin/replace.c:355
+#: builtin/replace.c:360
 #, c-format
 msgid "bad mergetag in commit '%s'"
 msgstr "etiqueta de fusió dolenta en la comissió '%s'"
 
-#: builtin/replace.c:357
+#: builtin/replace.c:362
 #, c-format
 msgid "malformed mergetag in commit '%s'"
 msgstr "etiqueta de fusió mal formada en la comissió '%s'"
 
-#: builtin/replace.c:368
+#: builtin/replace.c:373
 #, c-format
 msgid ""
 "original commit '%s' contains mergetag '%s' that is discarded; use --edit "
@@ -10945,45 +12454,45 @@ msgstr ""
 "la comissió original '%s' conté l'etiqueta de fusió '%s' que es descarta; "
 "useu --edit en lloc de --graft"
 
-#: builtin/replace.c:401
+#: builtin/replace.c:406
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
 msgstr "la comissió original '%s' té una signatura gpg."
 
-#: builtin/replace.c:402
+#: builtin/replace.c:407
 msgid "the signature will be removed in the replacement commit!"
 msgstr "s'eliminarà la signatura en la comissió de reemplaçament!"
 
-#: builtin/replace.c:408
+#: builtin/replace.c:413
 #, c-format
 msgid "could not write replacement commit for: '%s'"
 msgstr "no s'ha pogut escriure la comissió de reemplaçament per a: '%s'"
 
-#: builtin/replace.c:432
+#: builtin/replace.c:437
 msgid "list replace refs"
 msgstr "llista les referències reemplaçades"
 
-#: builtin/replace.c:433
+#: builtin/replace.c:438
 msgid "delete replace refs"
 msgstr "suprimeix les referències reemplaçades"
 
-#: builtin/replace.c:434
+#: builtin/replace.c:439
 msgid "edit existing object"
 msgstr "edita un objecte existent"
 
-#: builtin/replace.c:435
+#: builtin/replace.c:440
 msgid "change a commit's parents"
 msgstr "canvia les mares d'una comissió"
 
-#: builtin/replace.c:436
+#: builtin/replace.c:441
 msgid "replace the ref if it exists"
 msgstr "reemplaça la referència si existeix"
 
-#: builtin/replace.c:437
+#: builtin/replace.c:442
 msgid "do not pretty-print contents for --edit"
 msgstr "no imprimeixis bellament els continguts per a --edit"
 
-#: builtin/replace.c:438
+#: builtin/replace.c:443
 msgid "use this format"
 msgstr "usa aquest format"
 
@@ -11002,8 +12511,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<comissió>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <arbre> [--] <camins>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<arbre>] [--] <camins>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11035,12 +12544,12 @@ msgstr "No teniu un HEAD vàlid."
 
 #: builtin/reset.c:76
 msgid "Failed to find tree of HEAD."
-msgstr "S'ha fallat en trobar l'arbre de HEAD."
+msgstr "S'ha produït un error en trobar l'arbre de HEAD."
 
 #: builtin/reset.c:82
 #, c-format
 msgid "Failed to find tree of %s."
-msgstr "S'ha fallat en trobar l'arbre de %s."
+msgstr "S'ha produït un error en cercar l'arbre de %s."
 
 #: builtin/reset.c:100
 #, c-format
@@ -11054,7 +12563,7 @@ msgstr "No es pot fer un restabliment de %s enmig d'una fusió."
 
 #: builtin/reset.c:276
 msgid "be quiet, only report errors"
-msgstr "calla, només informa d'errors"
+msgstr "sigues silenciós, només informa d'errors"
 
 #: builtin/reset.c:278
 msgid "reset HEAD and index"
@@ -11079,12 +12588,12 @@ msgstr "registra només el fet de que els camins eliminats s'afegiran després"
 #: builtin/reset.c:305
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
-msgstr "S'ha fallat en resoldre '%s' com a revisió vàlida."
+msgstr "S'ha produït un error en resoldre '%s' com a revisió vàlida."
 
 #: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
-msgstr "S'ha fallat en resoldre '%s' com a arbre vàlid."
+msgstr "S'ha produït un error en resoldre '%s' com a arbre vàlid."
 
 #: builtin/reset.c:322
 msgid "--patch is incompatible with --{hard,mixed,soft}"
@@ -11093,7 +12602,7 @@ msgstr "--patch és incompatible amb --{hard,mixed,soft}"
 #: builtin/reset.c:331
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
-"--mixed amb camins està desaprovat; useu 'git reset -- <camins>' en lloc "
+"--mixed amb camins està en desús; useu 'git reset -- <camins>' en lloc "
 "d'això."
 
 #: builtin/reset.c:333
@@ -11112,7 +12621,7 @@ msgstr "-N només es pot usar amb --mixed"
 
 #: builtin/reset.c:364
 msgid "Unstaged changes after reset:"
-msgstr "Canvis no allistats després de restabliment:"
+msgstr "Canvis «unstaged» després del restabliment:"
 
 #: builtin/reset.c:370
 #, c-format
@@ -11123,27 +12632,27 @@ msgstr "No s'ha pogut restablir el fitxer d'índex a la revisió '%s'."
 msgid "Could not write new index file."
 msgstr "No s'ha pogut escriure el fitxer d'índex nou."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "el rev-list no permet mostrar notes"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:393
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<opcions>] -- [<paràmetres>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:398
 msgid "keep the `--` passed as an arg"
 msgstr "retén el `--` passat com a paràmetre"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:400
 msgid "stop parsing after the first non-option argument"
 msgstr "deixa d'analitzar després del primer paràmetre no d'opció"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:403
 msgid "output in stuck long form"
 msgstr "emet en forma llarga enganxada"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:534
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11174,98 +12683,80 @@ msgstr "git cherry-pick [<opcions>] <comissió>..."
 msgid "git cherry-pick <subcommand>"
 msgstr "git cherry-pick <subordre>"
 
-#: builtin/revert.c:71
+#: builtin/revert.c:89
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s: %s no es pot usar amb %s"
 
-#: builtin/revert.c:80
+#: builtin/revert.c:98
 msgid "end revert or cherry-pick sequence"
-msgstr "acaba la seqüència de reversió o el recull de cireres"
+msgstr "acaba la seqüència de reversió o el «cherry pick»"
 
-#: builtin/revert.c:81
+#: builtin/revert.c:99
 msgid "resume revert or cherry-pick sequence"
-msgstr "reprèn la seqüència de reversió o el recull de cireres"
+msgstr "reprèn la seqüència de reversió o el «cherry pick»"
 
-#: builtin/revert.c:82
+#: builtin/revert.c:100
 msgid "cancel revert or cherry-pick sequence"
-msgstr "cancel·la la seqüència de reversió o el recull de cireres"
+msgstr "cancel·la la seqüència de reversió o el «cherry pick»"
 
-#: builtin/revert.c:83
+#: builtin/revert.c:101
 msgid "don't automatically commit"
 msgstr "no cometis automàticament"
 
-#: builtin/revert.c:84
+#: builtin/revert.c:102
 msgid "edit the commit message"
 msgstr "edita el missatge de comissió"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "número de mare"
+#: builtin/revert.c:105
+msgid "parent-number"
+msgstr "número del pare"
 
-#: builtin/revert.c:89
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "selecciona la línia principal del pare"
+
+#: builtin/revert.c:108
 msgid "merge strategy"
 msgstr "estratègia de fusió"
 
-#: builtin/revert.c:90
+#: builtin/revert.c:109
 msgid "option"
 msgstr "opció"
 
-#: builtin/revert.c:91
+#: builtin/revert.c:110
 msgid "option for merge strategy"
 msgstr "opció d'estratègia de fusió"
 
-#: builtin/revert.c:100
+#: builtin/revert.c:119
 msgid "append commit name"
 msgstr "nom de la comissió a annexar"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:121
 msgid "preserve initially empty commits"
 msgstr "preserva les comissions inicialment buides"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:122
 msgid "allow commits with empty messages"
 msgstr "permet les comissions amb missatges buits"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:123
 msgid "keep redundant, empty commits"
 msgstr "retén les comissions redundants i buides"
 
-#: builtin/revert.c:192
+#: builtin/revert.c:211
 msgid "revert failed"
 msgstr "la reversió ha fallat"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:224
 msgid "cherry-pick failed"
-msgstr "el recull de cireres ha fallat"
+msgstr "el «cherry pick» ha fallat"
 
 #: builtin/rm.c:17
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<opcions>] [--] <fitxer>..."
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"el submòdul següent (o un dels seus submòduls niats)\n"
-"usa un directori .git:"
-msgstr[1] ""
-"els submòduls següents (o un dels seus submòduls niats)\n"
-"usa un directori .git:"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(useu 'rm -rf' si realment voleu eliminar-lo, incloent tota la seva història)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11273,13 +12764,13 @@ msgid_plural ""
 "the following files have staged content different from both the\n"
 "file and the HEAD:"
 msgstr[0] ""
-"el fitxer següent té contingut allistat diferent d'ambdós el\n"
+"el fitxer següent té contingut «stage» diferent d'ambdós el\n"
 "fitxer i el HEAD:"
 msgstr[1] ""
-"els fitxers següents tenen contingut allistat diferent d'ambdós\n"
+"els fitxers següents tenen contingut «stage» diferent d'ambdós\n"
 "el fitxer i el HEAD:"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11287,13 +12778,13 @@ msgstr ""
 "\n"
 "(useu -f per a forçar l'eliminació)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
-msgstr[0] "el fitxer següent té canvis allistats en l'índex:"
-msgstr[1] "els fitxers següents tenen canvis allistats en l'índex:"
+msgstr[0] "el fitxer següent té canvis «staged» en l'índex:"
+msgstr[1] "els fitxers següents tenen canvis «staged» en l'índex:"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11301,42 +12792,47 @@ msgstr ""
 "\n"
 "(useu --cached per a retenir el fitxer, o -f per a forçar l'eliminació)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "el fitxer següent té modificacions locals:"
 msgstr[1] "els fitxers següents tenen modificacions locals:"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "no llistis els fitxers eliminats"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "només elimina de l'índex"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "passa per alt la comprovació d'actualitat"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "permet l'eliminació recursiva"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "surt amb estat zero encara que res hagi coincidit"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "no s'està eliminant '%s' recursivament sense -r"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm: no s'ha pogut eliminar %s"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "no s'ha pogut suprimir '%s'"
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11349,19 +12845,19 @@ msgstr ""
 "[<màquina>:]<directori> [<referència>...]\n"
 "  --all i especificació <referència> explícita són mutualment exclusius."
 
-#: builtin/send-pack.c:160
+#: builtin/send-pack.c:161
 msgid "remote name"
 msgstr "nom del remot"
 
-#: builtin/send-pack.c:171
+#: builtin/send-pack.c:175
 msgid "use stateless RPC protocol"
 msgstr "usa el protocol RPC sense estat"
 
-#: builtin/send-pack.c:172
+#: builtin/send-pack.c:176
 msgid "read refs from stdin"
 msgstr "llegeix les referències des d'stdin"
 
-#: builtin/send-pack.c:173
+#: builtin/send-pack.c:177
 msgid "print status from remote helper"
 msgstr "imprimeix l'estat des de l'ajudant remot"
 
@@ -11369,24 +12865,28 @@ msgstr "imprimeix l'estat des de l'ajudant remot"
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [<opcions>] [<rang-de-revisions>] [[--] [<camí>...]]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr ""
+
+#: builtin/shortlog.c:250
 msgid "sort output according to the number of commits per author"
 msgstr "ordena la sortida segons el nombre de comissions per autor"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:252
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr ""
 "Omet les descripcions de comissió, només proveeix el recompte de comissions"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:254
 msgid "Show the email address of each author"
 msgstr "Mostra l'adreça de correu electrònic de cada autor"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:255
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:256
 msgid "Linewrap output"
 msgstr "Ajusta les línies de la sortida"
 
@@ -11406,69 +12906,124 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<referència>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "s'està ignorant %s; no es pot gestionar més de %d referència"
+msgstr[1] "s'està ignorant %s; no es poden gestionar més de %d referències"
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr "no hi ha referències coincidents amb %s"
+
+#: builtin/show-branch.c:632
 msgid "show remote-tracking and local branches"
 msgstr "mostra les branques amb seguiment remot i les locals"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:634
 msgid "show remote-tracking branches"
 msgstr "mostra les branques amb seguiment remot"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:636
 msgid "color '*!+-' corresponding to the branch"
 msgstr "colora '*!+-' corresponent a la branca"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:638
 msgid "show <n> more commits after the common ancestor"
 msgstr "mostra <n> comissions després de l'avantpassat comú"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:640
 msgid "synonym to more=-1"
 msgstr "sinònim de more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:641
 msgid "suppress naming strings"
 msgstr "omet l'anomenament de cadenes"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:643
 msgid "include the current branch"
 msgstr "inclou la branca actual"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:645
 msgid "name commits with their object names"
 msgstr "anomena les comissions amb els seus noms d'objecte"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:647
 msgid "show possible merge bases"
 msgstr "mostra les bases de fusió possibles"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:649
 msgid "show refs unreachable from any other ref"
-msgstr "mostra les referències inabastables de qualsevulla altra referència"
+msgstr "mostra les referències inabastables de qualsevol altra referència"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:651
 msgid "show commits in topological order"
 msgstr "mostra les comissions en ordre topològic"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:654
 msgid "show only commits not on the first branch"
 msgstr "mostra només les comissions que no siguin en la primera branca"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:656
 msgid "show merges reachable from only one tip"
 msgstr "mostra les fusions abastables de només una punta"
 
-#: builtin/show-branch.c:666
-msgid "topologically sort, maintaining date order where possible"
-msgstr "ordena topològicament, mantenint l'ordre de dates on sigui possible"
+#: builtin/show-branch.c:658
+msgid "topologically sort, maintaining date order where possible"
+msgstr "ordena topològicament, mantenint l'ordre de dates on sigui possible"
+
+#: builtin/show-branch.c:661
+msgid "<n>[,<base>]"
+msgstr "<n>[,<base>]"
+
+#: builtin/show-branch.c:662
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr "mostra les <n> entrades més recents començant a la base"
+
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog és incompatible amb --all, --remotes, --independent o --merge-base"
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "no s'ha donat cap branca, i HEAD no és vàlid"
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "l'opció --reflog necessita un nom de branca"
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "es pot mostrar només %d entrada a la vegada."
+msgstr[1] "es poden mostrar només %d entrades a la vegada."
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr "no hi ha tal referència %s"
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "no es pot gestionar més d'%d revisió."
+msgstr[1] "no es poden gestionar més de %d revisions."
 
-#: builtin/show-branch.c:669
-msgid "<n>[,<base>]"
-msgstr "<n>[,<base>]"
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' no és una referència vàlida."
 
-#: builtin/show-branch.c:670
-msgid "show <n> most recent ref-log entries starting at base"
-msgstr "mostra les <n> entrades més recents començant a la base"
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "no es pot trobar la comissió %s (%s)"
 
 #: builtin/show-ref.c:10
 msgid ""
@@ -11482,37 +13037,37 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<patró>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "mostra només les etiquetes (es pot combinar amb heads)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "mostra només els caps (es pot combinar amb tags)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 "comprovació de referència més estricta, requereix el camí de referència "
 "exacte"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "mostra la referència HEAD, encara que es filtrés"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
-msgstr "dereferencia les etiquetes a IDs d'objecte"
+msgstr "desreferencia les etiquetes a IDs d'objecte"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "mostra el hash SHA1 usant només <n> xifres"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "no imprimeixis els resultats a stdout (útil amb --verify)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr "mostra les referències d'stdin que no siguin en el dipòsit local"
 
@@ -11527,18 +13082,18 @@ msgstr "git stripspace [-c | --comment-lines]"
 #: builtin/stripspace.c:35
 msgid "skip and remove all lines starting with comment character"
 msgstr ""
-"salta i elimina totes les línies començant amb el caràcter de comentari"
+"omet i elimina totes les línies que comencin amb el caràcter de comentari"
 
 #: builtin/stripspace.c:38
 msgid "prepend comment character and space to each line"
 msgstr "anteposa el caràcter de comentari i un espai a cada línia"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
 msgid "No such ref: %s"
 msgstr "No hi ha tal referència: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "S'espera un nom de referència ple, s'ha rebut %s"
@@ -11548,77 +13103,103 @@ msgstr "S'espera un nom de referència ple, s'ha rebut %s"
 msgid "cannot strip one component off url '%s'"
 msgstr "no es pot despullar un component de l'url '%s'"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
 msgid "alternative anchor for relative paths"
 msgstr "àncora alternativa per als camins relatius"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:310
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<camí>] [<camí>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "No s'ha trobat cap url per al camí de submòdul '%s' a .gitmodules"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr ""
+
+#: builtin/submodule--helper.c:406
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
-msgstr "S'ha fallat en registrar l'url per al camí de submòdul '%s'"
+msgstr "S'ha produït un error en registrar l'url per al camí de submòdul '%s'"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:410
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "S'ha registrat el submòdul '%s' (%s) per al camí '%s'\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:420
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr ""
 "advertència: se suggereix el mode d'actualització per ordre per al submòdul "
 "'%s'\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:427
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr ""
-"S'ha fallat en registrar el mode d'actualització per al camí de submòdul '%s'"
+"S'ha produït un error en registrar el mode d'actualització per al camí de "
+"submòdul '%s'"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:443
 msgid "Suppress output for initializing a submodule"
 msgstr "Omet la sortida d'inicialitzar un submòdul"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:448
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<camí>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:476
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <camí>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:482
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "No s'ha trobat cap mapatge de submòdul a .gitmodules per al camí '%s'"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "el submòdul '%s' no pot afegir un alternatiu: %s"
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "No es reconeix el valor '%s' per a submodule.alternateErrorStrategy"
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "No es reconeix el valor '%s' per a submodule.alternateLocation"
+
+#: builtin/submodule--helper.c:633
 msgid "where the new submodule will be cloned to"
 msgstr "a on es clonarà el submòdul nou"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:636
 msgid "name of the new submodule"
 msgstr "nom del submòdul nou"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:639
 msgid "url where to clone the submodule from"
 msgstr "url del qual clonar el submòdul"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:645
 msgid "depth for shallow clones"
 msgstr "profunditat dels clons superficials"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "força el progrés del clonatge"
+
+#: builtin/submodule--helper.c:653
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11626,97 +13207,82 @@ msgstr ""
 "git submodule--helper clone [--prefix=<camí>] [--quiet] [--reference "
 "<dipòsit>] [--name <nom>] [--depth <profunditat>] --url <url> --path <camí>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "no s'ha pogut crear el directori '%s'"
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:684
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "el clonatge de '%s' al camí de submòdul '%s' ha fallat"
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "no es pot obrir el fitxer '%s'"
-
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
-msgstr "no s'ha pogut tancar el fitxer %s"
-
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:699
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "no s'ha pogut obtenir el directori de submòdul per a '%s'"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:764
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "El camí de submòdul '%s' no està inicialitzat"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:768
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Potser voleu usar 'update --init'?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping unmerged submodule %s"
-msgstr "S'està saltant el submòdul no fusionat %s"
+msgstr "S'està ometent el submòdul no fusionat %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:814
 #, c-format
 msgid "Skipping submodule '%s'"
-msgstr "S'està saltant el submòdul '%s'"
+msgstr "S'està ometent el submòdul '%s'"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:942
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
-msgstr "S'ha fallat en clonar '%s'. S'ha programat un reintent"
+msgstr "S'ha produït un error en clonar '%s'. S'ha programat un reintent"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:953
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
-msgstr "S'ha fallat una segona vegada en clonar '%s', s'està avortant"
+msgstr "S'ha produït un error per segon cop en clonar '%s', s'està avortant"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
 msgid "path into the working tree"
 msgstr "camí a l'arbre de treball"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:977
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "camí a l'arbre de treball, a través de fronteres de submòduls niats"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:981
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout o none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:985
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "Crea un clon superficial truncat al nombre de revisions especificat"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:988
 msgid "parallel jobs"
 msgstr "tasques paral·leles"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:990
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "si el clonatge inicial ha de seguir la recomanació de superficialitat"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:991
 msgid "don't print cloning progress"
 msgstr "no imprimeixis el progrés del clonatge"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:998
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<camí>] [<camí>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:1008
 msgid "bad value for update parameter"
 msgstr "valor dolent per al paràmetre update"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1079
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11725,11 +13291,24 @@ msgstr ""
 "La branca de submòdul (%s) està configurada per a heretar la branca del "
 "superprojecte, però el superprojecte no és en cap branca"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "inclou recursivament als submòduls"
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir  [<camí>]"
+
+#: builtin/submodule--helper.c:1226
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "s'ha d'executar la subordre submodule--helper amb una subordre"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s no admet --super-prefix"
+
+#: builtin/submodule--helper.c:1239
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' no és una subordre vàlida de submodule--helper"
@@ -11775,8 +13354,10 @@ msgid "git tag -d <tagname>..."
 msgstr "git tag -d <nom-d'etiqueta>..."
 
 #: builtin/tag.c:25
+#, fuzzy
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
 "git tag -l [-n[<nombre>]] [--contains <comissió>]\n"
@@ -11784,25 +13365,20 @@ msgstr ""
 "\t\t[--[no-]merged [<comissió>]] [<patró>...]"
 
 #: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <nom-d'etiqueta>..."
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<format>] <nom-d'etiqueta>..."
 
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "nom d'etiqueta massa llarg: %.*s..."
-
-#: builtin/tag.c:86
+#: builtin/tag.c:83
 #, c-format
 msgid "tag '%s' not found."
 msgstr "no s'ha trobat l'etiqueta '%s'."
 
-#: builtin/tag.c:101
+#: builtin/tag.c:99
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "S'ha suprimit l'etiqueta '%s' (era %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:128
 #, c-format
 msgid ""
 "\n"
@@ -11815,7 +13391,7 @@ msgstr ""
 "  %s\n"
 "Les línies que comencin amb '%c' s'ignoraran.\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:132
 #, c-format
 msgid ""
 "\n"
@@ -11830,341 +13406,377 @@ msgstr ""
 "Les línies que comencin amb '%c' es retindran; podeu eliminar-les per vós "
 "mateix si voleu.\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:210
 msgid "unable to sign the tag"
 msgstr "no s'ha pogut signar l'etiqueta"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:212
 msgid "unable to write tag file"
 msgstr "no s'ha pogut escriure el fitxer d'etiqueta"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:236
 msgid "bad object type."
 msgstr "el tipus d'objecte és dolent."
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "la capçalera d'etiqueta és massa gran."
-
-#: builtin/tag.c:275
+#: builtin/tag.c:282
 msgid "no tag message?"
 msgstr "no hi ha cap missatge d'etiqueta?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:289
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "S'ha deixat el missatge de l'etiqueta en %s\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:397
 msgid "list tag names"
 msgstr "llista els noms d'etiqueta"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:399
 msgid "print <n> lines of each tag message"
 msgstr "imprimeix <n> línies de cada missatge d'etiqueta"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:401
 msgid "delete tags"
 msgstr "suprimeix les etiquetes"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:402
 msgid "verify tags"
 msgstr "verifica les etiquetes"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:404
 msgid "Tag creation options"
 msgstr "Opcions de creació d'etiquetes"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:406
 msgid "annotated tag, needs a message"
 msgstr "etiqueta anotada, necessita un missatge"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:408
 msgid "tag message"
 msgstr "missatge d'etiqueta"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:410
 msgid "annotated and GPG-signed tag"
 msgstr "etiqueta anotada i signada per GPG"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:414
 msgid "use another key to sign the tag"
 msgstr "usa una altra clau per a signar l'etiqueta"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:415
 msgid "replace the tag if exists"
 msgstr "reemplaça l'etiqueta si existeix"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:416 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "crea un registre de referències"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:418
 msgid "Tag listing options"
 msgstr "Opcions de llistat d'etiquetes"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:419
 msgid "show tag list in columns"
 msgstr "mostra la llista d'etiquetes en columnes"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:420 builtin/tag.c:422
 msgid "print only tags that contain the commit"
 msgstr "imprimeix només les etiquetes que continguin la comissió"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "imprimeix només les etiquetes que no continguin la comissió"
+
+#: builtin/tag.c:424
 msgid "print only tags that are merged"
 msgstr "imprimeix només les etiquetes que s'han fusionat"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:425
 msgid "print only tags that are not merged"
 msgstr "imprimeix només les etiquetes que no s'han fusionat"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:430
 msgid "print only tags of the object"
 msgstr "imprimeix només les etiquetes de l'objecte"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:469
 msgid "--column and -n are incompatible"
 msgstr "--column i -n són incompatibles"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "es permet l'opció -n només amb -l."
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "es permet l'opció -n només amb mode llista"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "es permet l'opció --contains només amb -l."
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "es permet l'opció --contains només amb mode llista"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "es permet --points-at option només amb -l."
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "es permet l'opció --no-contains només amb mode llista"
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "es permeten les opcions --merged i --no-merged només amb -l"
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "es permet --points-at option només amb mode llista"
+
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr "es permeten les opcions --merged i --no-merged només amb mode llista"
 
-#: builtin/tag.c:433
+#: builtin/tag.c:510
 msgid "only one -F or -m option is allowed."
 msgstr "només es permet una opció -F o -m."
 
-#: builtin/tag.c:452
+#: builtin/tag.c:529
 msgid "too many params"
 msgstr "massa paràmetres"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:535
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' no és un nom d'etiqueta vàlid."
 
-#: builtin/tag.c:463
+#: builtin/tag.c:540
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'etiqueta '%s' ja existeix"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:570
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Etiqueta '%s' actualitzada (era %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "S'estan desempaquetant els objectes"
 
 #: builtin/update-index.c:79
 #, c-format
 msgid "failed to create directory %s"
-msgstr "s'ha fallat en crear el directori %s"
+msgstr "s'ha produït un error en crear el directori %s"
 
 #: builtin/update-index.c:85
 #, c-format
 msgid "failed to stat %s"
-msgstr "s'ha fallat en fer stat a %s"
+msgstr "s'ha produït un error en fer stat a %s"
 
 #: builtin/update-index.c:95
 #, c-format
 msgid "failed to create file %s"
-msgstr "s'ha fallat en crear el fitxer %s"
+msgstr "s'ha produït un error en crear el fitxer %s"
 
 #: builtin/update-index.c:103
 #, c-format
 msgid "failed to delete file %s"
-msgstr "s'ha fallat en suprimir el fitxer %s"
+msgstr "s'ha produït un error en suprimir el fitxer %s"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/update-index.c:110 builtin/update-index.c:216
 #, c-format
 msgid "failed to delete directory %s"
-msgstr "s'ha fallat en suprimir el directori %s"
+msgstr "s'ha produït un error en suprimir el directori %s"
 
-#: builtin/update-index.c:133
+#: builtin/update-index.c:135
 #, c-format
 msgid "Testing mtime in '%s' "
 msgstr "S'està provant mtime en '%s' "
 
-#: builtin/update-index.c:145
+#: builtin/update-index.c:149
 msgid "directory stat info does not change after adding a new file"
 msgstr ""
 "la informació d'stat de directori no canvia després d'afegir un fitxer nou"
 
-#: builtin/update-index.c:158
+#: builtin/update-index.c:162
 msgid "directory stat info does not change after adding a new directory"
 msgstr ""
 "la informació d'stat de directori no canvia després d'afegir un directori nou"
 
-#: builtin/update-index.c:171
+#: builtin/update-index.c:175
 msgid "directory stat info changes after updating a file"
 msgstr ""
 "la informació d'stat de directori canvia després d'actualitzar un fitxer"
 
-#: builtin/update-index.c:182
+#: builtin/update-index.c:186
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 "la informació d'stat de directori canvia després d'afegir un fitxer dins "
 "d'un subdirectori"
 
-#: builtin/update-index.c:193
+#: builtin/update-index.c:197
 msgid "directory stat info does not change after deleting a file"
 msgstr ""
 "la informació d'stat de directori no canvia després de suprimir un fitxer"
 
-#: builtin/update-index.c:206
+#: builtin/update-index.c:210
 msgid "directory stat info does not change after deleting a directory"
 msgstr ""
 "la informació d'stat de directori no canvia després de suprimir un directori"
 
-#: builtin/update-index.c:213
+#: builtin/update-index.c:217
 msgid " OK"
 msgstr " D'acord"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:568
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<opcions>] [--] [<fitxer>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:923
 msgid "continue refresh even when index needs update"
 msgstr ""
 "continua l'actualització encara que l'índex necessiti una actualització"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:926
 msgid "refresh: ignore submodules"
 msgstr "actualitza: ignora els submòduls"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:929
 msgid "do not ignore new files"
 msgstr "no ignoris els fitxers nous"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:931
 msgid "let files replace directories and vice-versa"
 msgstr "deixa que els fitxers reemplacin els directoris i viceversa"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:933
 msgid "notice files missing from worktree"
 msgstr "tingues en compte els fitxers absents de l'arbre de treball"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:935
 msgid "refresh even if index contains unmerged entries"
 msgstr "actualitza encara que l'índex contingui entrades no fusionades"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:938
 msgid "refresh stat information"
 msgstr "actualitza la informació d'estadístiques"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:942
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "com --refresh, però ignora l'ajust assume-unchanged"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:946
 msgid "<mode>,<object>,<path>"
 msgstr "<mode>,<objecte>,<camí>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:947
 msgid "add the specified entry to the index"
 msgstr "afegeix l'entrada especificada a l'índex"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:956
 msgid "mark files as \"not changing\""
 msgstr "marca els fitxers com a \"no canviant\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:959
 msgid "clear assumed-unchanged bit"
 msgstr "neteja el bit assumed-unchanged"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:962
 msgid "mark files as \"index-only\""
 msgstr "marca els fitxers com a \"només índex\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:965
 msgid "clear skip-worktree bit"
 msgstr "neteja el bit skip-worktree"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:968
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "només afegeix a l'índex; no afegeixis el contingut a la base de dades "
 "d'objectes"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:970
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "elimina els camins anomenats encara que estiguin presents en l'arbre de "
 "treball"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:972
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "amb --stdin: les línies d'entrada acaben amb octets nuls"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:974
 msgid "read list of paths to be updated from standard input"
 msgstr "llegeix la llista de camins a actualitzar des de l'entrada estàndard"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:978
 msgid "add entries from standard input to the index"
 msgstr "afegeix les entrades de l'entrada estàndard a l'índex"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:982
 msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr "reemplena les etapes #2 i #3 per als camins llistats"
+msgstr "reemplena les «stage» #2 i #3 per als camins llistats"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:986
 msgid "only update entries that differ from HEAD"
 msgstr "només actualitza les entrades que difereixin de HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:990
 msgid "ignore files missing from worktree"
 msgstr "ignora els fitxers absents de l'arbre de treball"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:993
 msgid "report actions to standard output"
 msgstr "informa de les accions en la sortida estàndard"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:995
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(per a porcellanes) oblida't dels conflictes no resolts ni desats"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:999
 msgid "write index in this format"
 msgstr "escriu l'índex en aquest format"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:1001
 msgid "enable or disable split index"
 msgstr "habilita o inhabilita l'índex dividit"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:1003
 msgid "enable/disable untracked cache"
 msgstr "habilita/inhabilita la memòria cau no seguida"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1005
 msgid "test if the filesystem supports untracked cache"
 msgstr "prova si el sistema de fitxers admet la memòria cau no seguida"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1007
 msgid "enable untracked cache without testing the filesystem"
 msgstr "habilita la memòria cau no seguida sense provar el sistema de fitxers"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+"core.splitIndex està establert a fals; elimineu-lo o canviar-lo, si "
+"realment voleu habilitar l'index dividit"
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"core.splitIndex està establert a cert; elimineu-lo o canvieu-lo, si "
+"realment voleu inhabilitar l'index dividit"
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you e want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache està establert a cert; elimineu-lo o canvieu-lo, si "
+"realment voleu inhabilitar el cau no seguit"
+
+#: builtin/update-index.c:1131
 msgid "Untracked cache disabled"
 msgstr "La memòria cau no seguida està inhabilitada"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache està establert a fals; elimineu-lo o canviar-lo, si "
+"realment voleu habilitar el cau no seguit"
+
+#: builtin/update-index.c:1143
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "La memòria cau no seguida està habilitada per a '%s'"
@@ -12214,7 +13826,7 @@ msgstr "git verify-commit [-v | --verbose] <comissió>..."
 msgid "print commit contents"
 msgstr "imprimeix els continguts de la comissió"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "imprimeix la sortida crua de l'estat gpg"
 
@@ -12230,11 +13842,11 @@ msgstr "detallat"
 msgid "show statistics only"
 msgstr "mostra només estadístiques"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <etiqueta>..."
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<format>] <etiqueta>..."
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "imprimeix els continguts de l'etiqueta"
 
@@ -12258,92 +13870,104 @@ msgstr "git worktree prune [<opcions>]"
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock <camí>"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:43
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Eliminació de worktrees/%s: no és un directori vàlid"
 
-#: builtin/worktree.c:48
+#: builtin/worktree.c:49
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Eliminació de worktrees/%s: el fitxer gitdir no existeix"
 
-#: builtin/worktree.c:53
+#: builtin/worktree.c:54
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Eliminació de worktrees/%s: no s'ha pogut llegir el fitxer gitdir (%s)"
 
-#: builtin/worktree.c:64
+#: builtin/worktree.c:65
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Eliminació de worktrees/%s: fitxer gitdir no vàlid"
 
-#: builtin/worktree.c:80
+#: builtin/worktree.c:81
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 "Eliminació de worktrees/%s: el fitxer gitdir es refereix a una ubicació no "
 "existent"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "informa dels arbres de treball podats"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "fes caducar els arbres de treball més vells que <hora>"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' ja existeix"
 
-#: builtin/worktree.c:236
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "no s'ha pogut crear directori de '%s'"
 
-#: builtin/worktree.c:272
+#: builtin/worktree.c:274
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "S'està preparant %s (identificador %s)"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:328
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "agafa <branca> encara que sigui agafada en altre arbre de treball"
 
-#: builtin/worktree.c:325
+#: builtin/worktree.c:330
 msgid "create a new branch"
 msgstr "crea una branca nova"
 
-#: builtin/worktree.c:327
+#: builtin/worktree.c:332
 msgid "create or reset a branch"
 msgstr "crea o restableix una branca"
 
-#: builtin/worktree.c:329
+#: builtin/worktree.c:334
 msgid "populate the new working tree"
 msgstr "emplena l'arbre de treball nou"
 
-#: builtin/worktree.c:337
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr "mantén l'arbre de treball nou bloquejat"
+
+#: builtin/worktree.c:343
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B i --detach són mutualment exclusius"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:478
 msgid "reason for locking"
 msgstr "raó per bloquejar"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:490 builtin/worktree.c:523
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "'%s' no és un arbre de treball"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:492 builtin/worktree.c:525
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "No es pot bloquejar ni desbloquejar l'arbre de treball principal"
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:497
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "'%s' ja està bloquejat, raó: '%s'"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:499
 #, c-format
 msgid "'%s' is already locked"
 msgstr "'%s' ja està bloquejat"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:527
 #, c-format
 msgid "'%s' is not locked"
 msgstr "'%s' no està bloquejat"
@@ -12364,27 +13988,41 @@ msgstr "escriu l'objecte d'arbre per a un subdirectori <prefix>"
 msgid "only useful for debugging"
 msgstr "només útil per a la depuració"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<opcions>] <directori>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1040
 msgid "quit after a single request/response exchange"
 msgstr "surt després d'un sol intercanvi de sol·licitud/resposta"
 
-#: upload-pack.c:839
+#: upload-pack.c:1042
 msgid "exit immediately after initial ref advertisement"
-msgstr "surt immediatament després deanunci inicial de referència"
+msgstr "surt immediatament després de l'anunci inicial de referència"
 
-#: upload-pack.c:841
+#: upload-pack.c:1044
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr ""
 "no intentis <directori>/.git/ si <directori> no és cap directori del Git"
 
-#: upload-pack.c:843
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "interromp la transferència després de <n> segons d'inactivitat"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"Els permisos en el vostre directori de sòcol són massa liberals;\n"
+"pot ser que altres usuaris poden llegir les vostres credencials.\n"
+"Considereu executar:\n"
+"\n"
+"\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "imprimeix els missatges de depuració a stderr"
@@ -12397,13 +14035,37 @@ msgid ""
 msgstr ""
 "'git help -a' i 'git help -g' llisten subordres disponibles i\n"
 "algunes guies de concepte. Vegeu 'git help <ordre>' o\n"
-"'git help <concepte>' per a llegir sobre una subordre o concepte\n"
-"específic."
+"'git help <concepte>' per a llegir sobre una subordre o concepte específic."
+
+#: http.c:336
+#, c-format
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr ""
+
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "No s'admet el control de delegació amb el cURL < 7.22.0"
 
-#: http.c:323
+#: http.c:366
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "No s'admet l'enganx de clau pública amb cURL < 7.44.0"
 
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"no s'ha pogut actualitzar l'URL base des de la redirecció:\n"
+"  petició: %s\n"
+"   redirecció: %s"
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "s'està redirigint a %s"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "començar una àrea de treball (vegeu també: git help tutorial)"
@@ -12479,7 +14141,7 @@ msgstr "Mou o canvia de nom a un fitxer, directori o enllaç simbòlic"
 
 #: common-cmds.h:30
 msgid "Fetch from and integrate with another repository or a local branch"
-msgstr "Obtén de i integra amb un altre dipòsit o una branca local"
+msgstr "Obtén i integra amb un altre dipòsit o una branca local"
 
 #: common-cmds.h:31
 msgid "Update remote refs along with associated objects"
@@ -12519,15 +14181,15 @@ msgstr "data-de-caducitat"
 msgid "no-op (backward compatibility)"
 msgstr "operació nul·la (per a compatibilitat amb versions anteriors)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "sigues més detallat"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "sigues més callat"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "usa <n> xifres per presentar els SHA-1"
 
@@ -12545,7 +14207,7 @@ msgstr "Cal començar per \"git bisect start\""
 #. at this point.
 #: git-bisect.sh:60
 msgid "Do you want me to do it for you [Y/n]? "
-msgstr "Voleu que ho faci per vós [Y/n]? "
+msgstr "Voleu que ho faci per vostè [Y/n]? "
 
 #: git-bisect.sh:121
 #, sh-format
@@ -12585,17 +14247,17 @@ msgstr "Paràmetre bisect_write dolent: $state"
 #: git-bisect.sh:262
 #, sh-format
 msgid "Bad rev input: $arg"
-msgstr "Introducció de revisió dolenta: $arg"
+msgstr "Introducció de revisió errònia: $arg"
 
 #: git-bisect.sh:281
 #, sh-format
 msgid "Bad rev input: $bisected_head"
-msgstr "Entrada de revisió dolenta: $bisected_head"
+msgstr "Entrada de revisió errònia: $bisected_head"
 
 #: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
-msgstr "Introducció de revisió dolenta: $rev"
+msgstr "Introducció de revisió errònia: $rev"
 
 #: git-bisect.sh:299
 #, sh-format
@@ -12690,7 +14352,7 @@ msgid ""
 "'bisect_state $state' exited with error code $res"
 msgstr ""
 "el pas de bisecció ha fallat:\n"
-"'bisect_state $state' ha surt amb el codi d'error $res"
+"'bisect_state $state' ha sortit amb el codi d'error $res"
 
 #: git-bisect.sh:538
 msgid "bisect run success"
@@ -12747,7 +14409,7 @@ msgid "Automated merge did not work."
 msgstr "La fusió automàtica no ha funcionat."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "No s'ha de fer un pop."
 
 #: git-merge-octopus.sh:73
@@ -12775,7 +14437,7 @@ msgid "Simple merge did not work, trying automatic merge."
 msgstr ""
 "La fusió simple no ha funcionat, s'està intentant una fusió automàtica."
 
-#: git-rebase.sh:56
+#: git-rebase.sh:58
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12783,57 +14445,42 @@ msgid ""
 "\"."
 msgstr ""
 "Quan hàgiu resolt aquest problema, executeu \"git rebase --continue\".\n"
-"Si preferiu saltar aquest pedaç, executeu \"git rebase --skip\" en lloc "
+"Si preferiu ometre aquest pedaç, executeu \"git rebase --skip\" en lloc "
 "d'això.\n"
-"Per a agafar la branca original i deixar de rebasar, executeu \"git rebase --"
-"abort\"."
+"Per a agafar la branca original i deixar de fer «rebase», executeu \"git "
+"rebase --abort\"."
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:158 git-rebase.sh:397
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "No s'ha pogut tornar a $head_name"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "S'ha aplicat el magatzem automàtic."
-
-#: git-rebase.sh:170
+#: git-rebase.sh:172
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "No es pot emmagatzemar $stash_sha1"
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"L'aplicació del magatzem automàtic ha resultat en conflictes.\n"
-"Els vostres canvis estan segurs en el magatzem.\n"
-"Podeu executar \"git stash pop\" o \"git stash drop\" en qualsevol moment.\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:212
 msgid "The pre-rebase hook refused to rebase."
-msgstr "El ganxo de prerebasament ha refusat rebasar."
+msgstr "El ganxo pre-«rebase» ha refusat a fer «rebase»."
 
-#: git-rebase.sh:215
+#: git-rebase.sh:217
 msgid "It looks like git-am is in progress. Cannot rebase."
-msgstr "Sembla que git-am està en curs. No es pot rebasar."
+msgstr "Sembla que git-am està en curs. No es pot fer «rebase»."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:358
 msgid "No rebase in progress?"
 msgstr "No hi ha rebasament en curs?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:369
 msgid "The --edit-todo action can only be used during interactive rebase."
-msgstr ""
-"L'acció --edit-todo només es pot usar durant un rebasament interactiva."
+msgstr "L'acció --edit-todo només es pot usar durant un «rebase» interactiu."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:376
 msgid "Cannot read HEAD"
 msgstr "No es pot llegir HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:379
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -12841,7 +14488,7 @@ msgstr ""
 "Heu d'editar tots els conflictes de fusió i després\n"
 "marcar-los com a resolts fent servir git add"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:419
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12862,99 +14509,103 @@ msgstr ""
 "i executeu-me de nou. M'aturo per si encara hi teniu alguna cosa\n"
 "de valor."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:470
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "font no vàlida $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:494
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: ja hi ha més d'una base de fusió"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:497 git-rebase.sh:501
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: no hi ha cap base de fusió"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:506
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "No assenyala una comissió vàlida: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:529
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: no hi ha tal branca: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:562
 msgid "Cannot autostash"
 msgstr "No es pot emmagatzemar automàticament"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:567
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "S'ha creat un magatzem automàtic: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:571
 msgid "Please commit or stash them."
 msgstr "Si us plau, cometeu-los o emmagatzemeu-los."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:591
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branca actual $branch_name està al dia."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:595
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
-msgstr "La branca actual $branch_name està al dia; rebasament forçada."
+msgstr "La branca actual $branch_name està al dia; «rebase» forçat."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:606
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Canvis de $mb a $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:615
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Primer, s'està rebobinant el cap per a reproduir el vostre treball al "
 "damunt..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:625
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "S'ha avançat $branch_name ràpidament a $onto_name."
 
-#: git-stash.sh:50
+#: git-stash.sh:53
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash clear amb paràmetres no està implementat"
 
-#: git-stash.sh:73
+#: git-stash.sh:94
 msgid "You do not have the initial commit yet"
 msgstr "Encara no teniu la comissió inicial"
 
-#: git-stash.sh:88
+#: git-stash.sh:109
 msgid "Cannot save the current index state"
 msgstr "No es pot desar l'estat d'índex actual"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "No es pot desar els fitxers no seguits"
+
+#: git-stash.sh:144 git-stash.sh:157
 msgid "Cannot save the current worktree state"
 msgstr "No es pot desar l'estat d'arbre de treball actual"
 
-#: git-stash.sh:140
+#: git-stash.sh:161
 msgid "No changes selected"
 msgstr "No hi ha canvis seleccionats"
 
-#: git-stash.sh:143
+#: git-stash.sh:164
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "No es pot eliminar l'índex temporal (això no pot passar)"
 
-#: git-stash.sh:156
+#: git-stash.sh:177
 msgid "Cannot record working tree state"
 msgstr "No es pot registrar l'estat de l'arbre de treball"
 
-#: git-stash.sh:188
+#: git-stash.sh:209
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "No es pot actualitzar $ref_stash amb $w_commit"
@@ -12969,7 +14620,7 @@ msgstr "No es pot actualitzar $ref_stash amb $w_commit"
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
+#: git-stash.sh:265
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -12978,109 +14629,117 @@ msgstr ""
 "error: opció desconeguda de 'stash save': $option\n"
 "       Per a proveir un missatge, useu git stash save -- '$option'"
 
-#: git-stash.sh:259
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "No es poden usar --patch i --include-untracked o --all a la vegada."
+
+#: git-stash.sh:286
 msgid "No local changes to save"
 msgstr "No hi ha canvis locals a desar"
 
-#: git-stash.sh:263
+#: git-stash.sh:291
 msgid "Cannot initialize stash"
 msgstr "No es pot inicialitzar el magatzem"
 
-#: git-stash.sh:267
+#: git-stash.sh:295
 msgid "Cannot save the current status"
 msgstr "No es pot desar l'estat actual"
 
-#: git-stash.sh:268
+#: git-stash.sh:296
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
-msgstr "S'han desat el directori de treball i l'estat d'ìndex $stash_msg"
+msgstr "S'han desat el directori de treball i l'estat d'índex $stash_msg"
 
-#: git-stash.sh:285
+#: git-stash.sh:323
 msgid "Cannot remove worktree changes"
-msgstr "No es pot eliminar els canvis de l'arbre de treball"
+msgstr "No es poden eliminar els canvis de l'arbre de treball"
 
-#: git-stash.sh:404
+#: git-stash.sh:471
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "opció desconeguda: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:484
 msgid "No stash found."
 msgstr "No s'ha trobat cap magatzem."
 
-#: git-stash.sh:421
+#: git-stash.sh:491
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "S'han especificat massa revisions: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:506
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference no és una referència vàlida"
 
-#: git-stash.sh:455
+#: git-stash.sh:534
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' no és una comissió de tipus magatzem"
 
-#: git-stash.sh:466
+#: git-stash.sh:545
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' no és una referència de magatzem"
 
-#: git-stash.sh:474
+#: git-stash.sh:553
 msgid "unable to refresh index"
 msgstr "no s'ha pogut actualitzar l'índex"
 
-#: git-stash.sh:478
+#: git-stash.sh:557
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "No es pot aplicar un magatzem enmig d'una fusió"
 
-#: git-stash.sh:486
+#: git-stash.sh:565
 msgid "Conflicts in index. Try without --index."
 msgstr "Hi ha conflictes en l'índex. Proveu-ho sense --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:567
 msgid "Could not save index tree"
 msgstr "No s'ha pogut desar l'arbre d'índex"
 
-#: git-stash.sh:522
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "No s'ha pogut restaurar els fitxers no seguits des d'emmagatzematge"
+
+#: git-stash.sh:601
 msgid "Cannot unstage modified files"
-msgstr "No es pot desallistar fitxers modificats"
+msgstr "No es pot fer «unstage» dels fitxers modificats"
 
-#: git-stash.sh:537
+#: git-stash.sh:616
 msgid "Index was not unstashed."
 msgstr "L'índex no estava sense emmagatzemar."
 
-#: git-stash.sh:551
+#: git-stash.sh:630
 msgid "The stash is kept in case you need it again."
 msgstr "Es conserva el magatzem en cas de que el necessiteu altra vegada."
 
-#: git-stash.sh:560
+#: git-stash.sh:639
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} ($s) descartada"
 
-#: git-stash.sh:561
+#: git-stash.sh:640
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: No s'ha pogut descartar l'entrada de magatzem"
 
-#: git-stash.sh:569
+#: git-stash.sh:648
 msgid "No branch name specified"
 msgstr "Cap nom de branca especificat"
 
-#: git-stash.sh:641
+#: git-stash.sh:727
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Per restaurar-les teclegeu \"git stash apply\")"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "El camí relatiu només es pot usar des del nivell superior de l'arbre de "
 "treball"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL de dipòsit: '$repo' ha de ser absolut o començar amb ./|../"
@@ -13090,7 +14749,12 @@ msgstr "URL de dipòsit: '$repo' ha de ser absolut o començar amb ./|../"
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ja existeix en l'índex"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "'$sm_path' ja existeix en l'índex i no és submòdul"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -13101,23 +14765,23 @@ msgstr ""
 "$sm_path\n"
 "Useu -f si realment voleu afegir-lo."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "S'està afegint el dipòsit existent a '$sm_path' a l'índex"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' ja existeix i no és un dipòsit de git vàlid"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Es troba un directori de git per a '$sm_name' localment amb els remots:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -13134,49 +14798,49 @@ msgstr ""
 "o no esteu segur de què vol dir això, trieu un altre nom amb l'opció '--"
 "name'."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 "S'està reactivant el directori de git local per al submòdul '$sm_name'."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
-msgstr "no s'ha pogut agafar el submòdul '$sm_path'"
+msgstr "No s'ha pogut agafar el submòdul '$sm_path'"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
-msgstr "S'ha fallat en afegir el submòdul '$sm_path'"
+msgstr "S'ha produït un error en afegir el submòdul '$sm_path'"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
-msgstr "S'ha fallat en registrar el submòdul '$sm_path'"
+msgstr "S'ha produït un error en registrar el submòdul '$sm_path'"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:341
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "S'està entrant '$displaypath'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:361
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr ""
 "S'està aturant a '$displaypath'; l'script ha retornat un estat no zero."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:432
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "--pathspec i --all són incompatibles"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:437
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "Useu '--all' si realment voleu desinicialitzar tots els submòduls"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
@@ -13185,7 +14849,7 @@ msgstr ""
 "L'arbre de treball de submòdul '$displaypath' conté un directori .git\n"
 "(useu 'rm -rf' si realment voleu eliminar-lo, incloent tota la seva història)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13194,38 +14858,38 @@ msgstr ""
 "L'arbre de treball de submòdul '$displaypath' conté modificacions locals; "
 "useu '-f' per a descartar-les"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:468
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "S'ha netejat el directori '$displaypath'"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:469
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "No s'ha pogut eliminar l'arbre de treball de submòdul '$displaypath'"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:472
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "No s'ha pogut crear el directori de submòdul buit '$displaypath'"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:481
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Submòdul '$name' ($url) no registrat per al camí '$displaypath'"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "No s'ha pogut trobar la revisió actual en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:647
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "No s'ha pogut obtenir en el camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13234,101 +14898,101 @@ msgstr ""
 "No s'ha pogut trobar la revisió actual de ${remote_name}/${branch} en el "
 "camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:670
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "No s'ha pogut obtenir en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:676
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
 "Direct fetching of that commit failed."
 msgstr ""
 "S'ha obtingut en el camí de submòdul '$displaypath', però no contenia $sha1. "
-"L'obteniment directe d'aquella comissió ha fallat."
+"L'obtenció directa d'aquella comissió ha fallat."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:683
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "No s'ha pogut agafar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:684
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha agafat '$sha1'"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:688
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
-msgstr "no s'ha pogut rebasar '$sha1' en el camí de submòdul '$displaypath'"
+msgstr ""
+"No s'ha pogut fer «rebase» '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:689
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr "Camí de submòdul '$displaypath': s'ha rebasat en '$sha1'"
+msgstr "Camí de submòdul '$displaypath': s'ha fet «rebase» en '$sha1'"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:694
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "No s'ha pogut fusionar '$sha1' en el camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:695
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha fusionat en '$sha1'"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:700
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "L'execució de '$command $sha1' ha fallat en el camí de submòdul "
 "'$displaypath'"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:701
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Camí de submòdul '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:732
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
-msgstr "S'ha fallat en recursar al camí de submòdul '$displaypath'"
+msgstr ""
+"S'ha produït un error en recorre recursivament dins del camí de submòdul "
+"'$displaypath'"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 msgid "The --cached option cannot be used with the --files option"
 msgstr "L'opció --cached no es pot usar amb l'opció --files"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:892
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode inesperat $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Avís: $display_name no conté la comissió $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:915
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Avís: $display_name no conté la comissió $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:918
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Avís: $display_name no conté les comissions $sha1_src i $sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1064
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr "S'ha fallat en recursar al camí de submòdul '$sm_path'"
+msgstr ""
+"S'ha produït un error en cercar recursivament al camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1136
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "S'està sincronitzant l'url de submòdul per a '$displaypath'"
@@ -13338,12 +15002,12 @@ msgstr "S'està sincronitzant l'url de submòdul per a '$displaypath'"
 msgid "See git-${cmd}(1) for details."
 msgstr "Vegeu git-${cmd}(1) per detalls."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
-msgstr "S'està rebasant ($new_count/$total)"
+msgstr "S'està fent «rebase» ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13361,7 +15025,7 @@ msgstr ""
 "Ordres:\n"
 " p, pick = usa la comissió\n"
 " r, reword = usa la comissió, però edita el missatge de comissió\n"
-" e, edit = usa la commissió, però atura't per a esmenar\n"
+" e, edit = usa la comissió, però atura't per a esmenar\n"
 " s, squash = usa la comissió, però fusiona'l a la comissió prèvia\n"
 " f, fixup = com \"squash\", però descarta el missatge de registre d'aquesta "
 "comissió\n"
@@ -13371,7 +15035,7 @@ msgstr ""
 "\n"
 "Es pot canviar l'ordre d'aquestes línies; s'executen de dalt a baix.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13380,7 +15044,7 @@ msgstr ""
 "No elimineu cap línia. Useu 'drop' explícitament per a eliminar una "
 "comissió.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
@@ -13388,7 +15052,7 @@ msgstr ""
 "\n"
 "Si elimineu una línia aquí, ES PERDRÀ AQUELLA COMISSIÓ.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13407,87 +15071,83 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
-msgstr "$sha1: no és una comissió que es pugi escollir"
+msgstr "$sha1: no és una comissió que es pugui escollir"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Nom de comissió no vàlid: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "No es pot escriure el sha1 reemplaçant de la comissió actual"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Avanç ràpid a $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "No es pot avançar ràpidament a $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "No es pot moure HEAD a $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
-msgstr "S'està refusant aixafar una fusió: $sha1"
+msgstr "S'està refusant fer «squash» a una fusió: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Error en refer la fusió $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "No s'ha pogut escollir $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Aquest és el missatge de comissió núm. ${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
-msgstr "El missatge de comissió núm. ${n} se saltarà:"
+msgstr "El missatge de comissió núm. ${n} s'ometrà:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Això és una combinació de $count comissió."
 msgstr[1] "Això és una combinació de $count comissions."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "No es pot escriure $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "Això és una combinació de 2 comissions."
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
-msgstr "Aquest és el 1er missatge de comissió:"
-
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "No s'ha pogut aplicar $sha1... $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13499,35 +15159,35 @@ msgstr ""
 "No s'ha pogut esmenar la comissió després d'escollir amb èxit $sha1... "
 "$rest\n"
 "Això és probablement a causa d'un missatge de comissió buit, o el ganxo de\n"
-"precomissió ha fallat. Si el ganxo de precomissió ha fallat, potser que\n"
+"precomissió ha fallat. Si el ganxo de precomissió ha fallat, pot ser que\n"
 "necessiteu resoldre el problema abans que pugueu canviar el missatge de\n"
 "comissió."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "S'ha aturat a $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "No es pot '$squash_style' sense una comissió prèvia"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "S'està executant: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "L'execució ha fallat: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "i ha fet canvis a l'índex o l'arbre de treball"
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13538,7 +15198,7 @@ msgstr ""
 "\tgit rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13553,25 +15213,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Ordre desconeguda: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Si us plau, arregleu això usant 'git rebase --edit-todo'."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "S'ha rebasat i actualitzat $head_name amb èxit."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
-msgstr "No s'ha pogut saltar ordres innecessaris d'elecció"
+msgstr "No s'ha pogut ometre ordres innecessaris d'elecció"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13580,7 +15240,7 @@ msgstr ""
 "Advertència: manca el SHA-1 o no és una comissió en la línia següent:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13589,11 +15249,11 @@ msgstr ""
 "Advertència: no es reconeix l'ordre en la línia següent:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "no s'ha pogut separar HEAD"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13602,7 +15262,7 @@ msgstr ""
 "accidentalment.\n"
 "Les comissions descartades (més nova a més vella):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13617,7 +15277,7 @@ msgstr ""
 "d'advertències.\n"
 "Els comportaments possibles són: ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
@@ -13626,19 +15286,23 @@ msgstr ""
 "No s'ha reconegut l'ajust $check_level per a l'opció rebase."
 "missingCommitsCheck. S'està ignorant."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Podeu arreglar això amb 'git rebase --edit-todo'."
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Podeu arreglar això amb 'git rebase --edit-todo' i després 'git rebase --"
+"continue'."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "O podeu avortar el rebasament amb 'git rebase --abort'."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1083
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "No s'ha pogut eliminar CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1088
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13651,12 +15315,12 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
-"Teniu canvis emmagatzemats en el vostre arbre de treball.\n"
-"Si aquests canvis són per a aixafar-se\n"
+"Teniu canvis «stage» en el vostre arbre de treball.\n"
+"Si aquests canvis són per fer «squash»\n"
 "a la comissió prèvia, executeu:\n"
 "\n"
 "  git commit --amend $gpg_sign_opt_quoted\n"
@@ -13665,29 +15329,29 @@ msgstr ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"En ambdós cassos, quan hàgiu terminat, continueu amb:\n"
+"En ambdós casos, quan hàgiu terminat, continueu amb:\n"
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1105
 msgid "Error trying to find the author identity to amend commit"
 msgstr ""
-"Ha hagut un error en intentar trobar la identitat d'autor per a esmenar la "
-"comissió"
+"Hi ha hagut un error en intentar trobar la identitat d'autor per a esmenar "
+"la comissió"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1110
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
 msgstr ""
-"Teniu canvis no comessos en el vostre arbre de treball. Si us plau,\n"
+"Teniu canvis no comesos en el vostre arbre de treball. Si us plau,\n"
 "primer cometeu-los i després executeu 'git rebase --continue' de nou."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
 msgid "Could not commit staged changes."
-msgstr "No s'ha pogut cometre els canvis emmagatzemats."
+msgstr "No s'ha pogut cometre els canvis «staged»."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1147
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13696,50 +15360,45 @@ msgid ""
 "\n"
 msgstr ""
 "\n"
-"Esteu editant el fitxer de cosses a fer d'un rebasament interactiu en "
-"marxa.\n"
+"Esteu editant el fitxer de coses a fer d'un rebasament interactiu en marxa.\n"
 "Per a continuar el rebasament després d'editar, executeu:\n"
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
 msgid "Could not execute editor"
 msgstr "No s'ha pogut executar l'editor"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Heu de primer establir la vostra informació de cometent"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1168
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "No s'ha pogut agafar $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1173
 msgid "No HEAD?"
 msgstr "No hi ha cap HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1174
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "No s'ha pogut crear el $state_dir temporal"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1176
 msgid "Could not mark as interactive"
 msgstr "No s'ha pogut marcar com a interactiu"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
 msgid "Could not init rewritten commits"
 msgstr "No s'ha pogut iniciar les comissions reescrites"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1291
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Rebasa $shortrevisions sobre $shortonto ($todocount ordre)"
 msgstr[1] "Rebasa $shortrevisions sobre $shortonto ($todocount ordres)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1296
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
@@ -13749,7 +15408,7 @@ msgstr ""
 "No obstant, si elimineu tot, s'avortarà el rebasament.\n"
 "\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1303
 msgid "Note that empty commits are commented out"
 msgstr "Nota que les comissions buides estan comentades"
 
@@ -13772,31 +15431,968 @@ msgstr "fatal: no es pot usar $program_name sense un arbre de treball."
 
 #: git-sh-setup.sh:220
 msgid "Cannot rebase: You have unstaged changes."
-msgstr "No es pot rebasar: Teniu canvis no allistats."
+msgstr "No es pot rebasar: Teniu canvis «unstaged»."
 
 #: git-sh-setup.sh:223
 msgid "Cannot rewrite branches: You have unstaged changes."
-msgstr "No es pot reescriure branques: Teniu canvis no allistats."
+msgstr "No es pot reescriure branques: Teniu canvis «unstaged»."
+
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "No es pot baixar fent «rebase»: Teniu canvis «unstaged»."
 
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
-msgstr "No es pot $action: Teniu canvis no allistats."
+msgstr "No es pot $action: Teniu canvis «unstaged»."
 
 #: git-sh-setup.sh:242
 msgid "Cannot rebase: Your index contains uncommitted changes."
-msgstr "No es pot rebasar: El vostre índex conté canvis sense cometre."
+msgstr "No es pot fer «rebase»: El vostre índex conté canvis sense cometre."
+
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"No es pot baixar fent «rebase»: El vostre índex conté canvis sense cometre."
 
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr "No es pot $action: El vostre índex conté canvis sense cometre."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Addicionalment, el vostre índex conté canvis sense cometre."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr ""
-"Heu d'executar aquesta ordre des del nivell superior de l'arbre de treball"
+"Heu d'executar aquesta ordre des del nivell superior de l'arbre de treball."
 
 #: git-sh-setup.sh:377
 msgid "Unable to determine absolute path of git directory"
 msgstr "No s'ha pogut determinar el camí absolut del directori de git"
+
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr ""
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "staged"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "unstaged"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "binari"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "res"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "sense canvis"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "afegit %d camí\n"
+msgstr[1] "afegits %d camins\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "actualitzat %d camí\n"
+msgstr[1] "actualitzats %d camins\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "revertit %d camí\n"
+msgstr[1] "revertits %d camins\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "modificat %d camí\n"
+msgstr[1] "modificat %d camins\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "Actualitza"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "Reverteix"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "nota: %s està ara sense seguiment.\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "Afegeix sense seguiment"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "Sense fitxers no seguits.\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"Si el pedaç s'aplica correctament, el tros editat es marcarà immediatament\n"
+"per «staging»."
+
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr ""
+"Si el pedaç s'aplica correctament, el tros editat es marcarà immediatament\n"
+"per «stashing»."
+
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr ""
+"Si el pedaç s'aplica correctament, el tros editat es marcarà immediatament\n"
+"per «unstaging»."
+
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"Si el pedaç s'aplica correctament, el tros editat es marcarà immediatament\n"
+"per aplicar-se."
+
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr ""
+"Si el pedaç s'aplica correctament, el tros editat es marcarà immediatament\n"
+"per descartar-se."
+
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr "s'ha produït un error en escriure al fitxer d'edició del tros: %s"
+
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr ""
+"Mode d'edició de trossos manual - vegeu més avall per una guia ràpida.\n"
+
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"Per suprimir '%s' línies, feu-les línies ' ' (context).\n"
+"Per suprimir '%s' línies, suprimiu-les.\n"
+"Les línies que comencin per %s seran suprimides.\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"Si no s'aplica correctament, tindreu una oportunitat per editar-lo\n"
+"de nou. Si totes les línies del tros se suprimeixen, llavors l'edició "
+"s'avorta\n"
+"i el tros es deixa sense cap canvi.\n"
+
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr "s'ha produït un error en llegir al fitxer d'edició del tros: %s"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr ""
+"El tros editat no s'ha aplica. Editeu-lo de nou (si responeu \"no\" es "
+"descartarà) [y/n]? "
+
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - fes «stage» d'aquest tros\n"
+"n - no facis «stage» d'aquest tros\n"
+"q - surt; no facis «stage» d'aquest tros o de cap altre restant\n"
+"a - fes «stage» d'aquest tros i tota la resta de trossos del fitxer\n"
+"d - no facis «stage» d'aquest tros o de cap altre restant del fitxer"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - fes «stash» d'aquest tros\n"
+"n - no facis «stash» d'aquest tros\n"
+"q - surt; no facis «stash» d'aquest tros o de cap altre restant\n"
+"a - fes «stash» d'aquest tros i tota la resta de trossos del fitxer\n"
+"d - no facis «stash» d'aquest tros o de cap altre restant del fitxer"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - fes «unstage» d'aquest tros\n"
+"n - no facis «unstage» d'aquest tros\n"
+"q - surt; no facis «unstage» d'aquest tros o de cap altre restant\n"
+"a - fes «unstage» d'aquest tros i tota la resta de trossos del fitxer\n"
+"d - no facis «unstage» d'aquest tros o de cap altre restant del fitxer"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "Els trossos seleccionats no apliquen a l'índex\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "Voleu aplicar-los igualment a l'arbre de treball"
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "No s'ha aplicat res.\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "s'està ignorant %s no fusionat\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "Només s'han canviat els fitxers binaris.\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "Sense canvis.\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "Actualització del pedaç"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Canvia el mode de «stage» [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Suprimeix «stage» [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Fer un «stage» d'aquest tros [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Canvia el mode de «stash» [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Suprimeix «stage» [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Fer un «stash» d'aquest tros [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Canvia el mode de «unstage» [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Suprimeix «Unstage» [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Fer un «unstage» d'aquest tros [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "Aplica el canvi de mode a l'índex [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "Aplica l'esborrat a l'índex [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "Aplica aquest tros a l'índex [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Descarta el canvi de mode des de l'arbre de treball [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Descarta l'esborrat des de l'arbre de treball [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Descarta aquest tros des de l'arbre de treball  [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Descarta el canvi de mode des de l'índex i l'arbre de treball [y,n,q,a,d,/"
+"%s,?]? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Descarta la supressió des de l'índex i l'arbre de treball [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Descarta aquest tros des de l'índex i l'arbre de treball [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Aplica el canvi de mode a l'índex i l'arbre de treball [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Aplica la supressió a l'índex i l'arbre de treball [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Aplica aquest tros a l'índex i l'arbre de treball [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "vés a quin tros (<ret> per veure'n més)? "
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "vés a quin tros? "
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "Número no vàlid: '%s'\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "Només %d tros disponible.\n"
+msgstr[1] "Només %d trossos disponibles.\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "Cerca per expressió regular? "
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "Expressió regular de cerca mal formada %s: %s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "No hi ha trossos que coincideixin amb el patró donat\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "Sense tros previ\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "No hi ha tros següent\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "Divideix en %d tros.\n"
+msgstr[1] "Divideix en %d trossos.\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "Reviseu les diferències"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "manca --"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "desconegut --patch mode: %s"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "argument %s no vàlid, s'esperava --"
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr "la zona local difereix de GMT per un interval que no és de minuts\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "el desplaçament de la zona local és més gran o igual a 24 hores\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "l'editor no ha sortit correctament, avortant-ho tot"
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr ""
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr ""
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-aliases és incompatible amb altres opcions\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "No es pot executar git format-patch des de fora del dipòsit\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "Camp --suppress-cc desconegut: '%s'\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "--confirm setting desconegut: '%s'\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr "avís: el sobrenom de sendmail amb cometes no està suportat: %s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "avís: `:include:` no està suportat: %s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr "avís: les redireccions `/file` or `|pipe no són admeses: %s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "avís: no es pot reconèixer la línia sendmail: %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "S'ha produït un error a l'obrir el directori %s: %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"greu: %s: %s\n"
+"avís: no s'han enviat pedaços\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"No s'han especificat fitxers de pedaç\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "Sense assumpte a: %s"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "S'ha produït un error en obrir per escriptura %s: %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "S'ha produït un error en obrir %s.final: %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "S'ha produït un error en obrir %s: %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr "Els camps A/Cc/Bcc no s'interpreten encara, s'ignoraran\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "El correu electrònic de resum està buit, s'omet\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "Esteu segur que voleu usar <%s> [y/N]? "
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr ""
+
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "Quina codificació de 8 bits hauria de declarar [UTF-8]? "
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr ""
+"A qui s'haurien d'enviar els correus electrònics (si s'han d'enviar a algú)?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr ""
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr ""
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "error: no s'ha pogut extreure una adreça vàlida de: %s\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr "Què fer amb aquesta adreça? ([q]surt|[d]escarta|[e]dita): "
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "el camí CA \"%s\" no existeix"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "Voleu enviar aquest correu electrònic? ([y]sí|[n]o|[q]surt|[a]tot): "
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "Requereix contestació a l'enviar correu"
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "El servidor SMTP requerit no està correctament definit."
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "El servidor no admet STARTTLS! %s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr ""
+"No s'ha pogut inicialitzar SMTP correctament. Comproveu-ho la configuració i "
+"useu --smtp-debug."
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "S'ha produït un error en enviar %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "Simulació d'enviament %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "Enviat %s\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "Simulació de correcte. El registre diu:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "Correcte. El registre diu: \n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "Resultat: "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "Resultat: correcte\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "no es pot obrir el fitxer %s"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) S'està afegint cc: %s des de la línia '%s'\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) S'està afegint a: %s des de la línia '%s'\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) S'està afegint cc: %s des de la línia '%s'\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(cos) S'està afegint cc: %s des de la línia '%s'\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) no s'ha pogut executar '%s'"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) S'està afegint %s: %s des de: '%s'\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) s'ha produït un error en tancar el conducte '%s'"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "no es pot enviar el missatge en 7 bits"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "codificació de transferència invàlida"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "no s'ha pogut obrir %s: %s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s: el pedaç conté una línia més gran de 998 caràcters"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "S'està ometent %s amb el sufix de còpia de seguretat '%s'.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "Esteu segur que voleu enviar %s? [y|N]: "
+
+#, fuzzy
+#~ msgid "object of unknown type"
+#~ msgstr "tipus d'objecte"
+
+#, fuzzy
+#~ msgid "commit object"
+#~ msgstr "Error en objecte"
+
+#, fuzzy
+#~ msgid "tree object"
+#~ msgstr "objecte"
+
+#, fuzzy
+#~ msgid "blob object"
+#~ msgstr "objecte"
+
+#, fuzzy
+#~ msgid "other tag object"
+#~ msgstr "objecte d'arbre massa curt"
+
+#~ msgid ""
+#~ "There is nothing to exclude from by :(exclude) patterns.\n"
+#~ "Perhaps you forgot to add either ':/' or '.' ?"
+#~ msgstr ""
+#~ "No hi ha res a excloure per patrons :(exclusió).\n"
+#~ "Potser heu oblidat afegir o ':/' o '.' ?"
+
+#~ msgid "unrecognized format: %%(%s)"
+#~ msgstr "format no reconegut: %%(%s)"
+
+#~ msgid ":strip= requires a positive integer argument"
+#~ msgstr ":strip= requereix un paràmetre enter positiu"
+
+#~ msgid "ref '%s' does not have %ld components to :strip"
+#~ msgstr "la referència '%s' no té %ld components per a :strip"
+
+#~ msgid "unknown %.*s format %s"
+#~ msgstr "format de %.*s desconegut %s"
+
+#~ msgid "[%s: gone]"
+#~ msgstr "[%s: no hi és]"
+
+#~ msgid "[%s]"
+#~ msgstr "[%s]"
+
+#~ msgid "[%s: behind %d]"
+#~ msgstr "[%s: darrere per %d]"
+
+#~ msgid "[%s: ahead %d]"
+#~ msgstr "[%s: davant per %d]"
+
+#~ msgid "[%s: ahead %d, behind %d]"
+#~ msgstr "[%s: davant per %d, darrere per %d]"
+
+#~ msgid " **** invalid ref ****"
+#~ msgstr " **** referència no vàlida ****"
+
+#~ msgid "insanely long object directory %.*s"
+#~ msgstr "directori d'objectes increïblement llarg %.*s"
+
+#~ msgid "git merge [<options>] <msg> HEAD <commit>"
+#~ msgstr "git merge [<opcions>] <missatge> HEAD <comissió>"
+
+#~ msgid "'%s' is not a commit"
+#~ msgstr "'%s' no és una comissió"
+
+#~ msgid "cannot open file '%s'"
+#~ msgstr "no es pot obrir el fitxer '%s'"
+
+#~ msgid "could not close file %s"
+#~ msgstr "no s'ha pogut tancar el fitxer %s"
+
+#~ msgid "tag name too long: %.*s..."
+#~ msgstr "nom d'etiqueta massa llarg: %.*s..."
+
+#~ msgid "tag header too big."
+#~ msgstr "la capçalera d'etiqueta és massa gran."
+
+#~ msgid ""
+#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "marked for discarding"
+#~ msgstr ""
+#~ "Si el pedaç s'aplica correctament, el tros editat es marcarà "
+#~ "immediatament\n"
+#~ "per descartar-se."
+
+#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
+#~ msgstr ""
+#~ "Usa un heurístic experimental basat en línies en blanc per a millorar les "
+#~ "diferències"
+
+#~ msgid "Clever... amending the last one with dirty index."
+#~ msgstr "Intel·ligent... s'està esmenant l'últim amb índex brut."
+
+#~ msgid ""
+#~ "the following submodule (or one of its nested submodules)\n"
+#~ "uses a .git directory:"
+#~ msgid_plural ""
+#~ "the following submodules (or one of their nested submodules)\n"
+#~ "use a .git directory:"
+#~ msgstr[0] ""
+#~ "el submòdul següent (o un dels seus submòduls niats)\n"
+#~ "usa un directori .git:"
+#~ msgstr[1] ""
+#~ "els submòduls següents (o un dels seus submòduls niats)\n"
+#~ "usa un directori .git:"
+
+#~ msgid ""
+#~ "\n"
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "\n"
+#~ "(useu 'rm -rf' si realment voleu eliminar-lo, incloent tota la seva "
+#~ "història)"
index 0755cdf6cd214dfc0bb235c04a50a1387acc339d..42c4508ed6f57873dcbbb9af134ed2db61e3edaa 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2015-01-21 15:01+0800\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
+"PO-Revision-Date: 2016-11-28 18:10+0100\n"
 "Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n"
 "Language-Team: German <>\n"
 "Language: de\n"
@@ -24,23 +24,29 @@ msgstr "Hinweis: %.*s\n"
 
 #: advice.c:83
 msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr "Cherry-Picken ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Cherry-Picken ist nicht möglich, weil Sie nicht zusammengeführte Dateien "
+"haben."
 
 #: advice.c:85
 msgid "Committing is not possible because you have unmerged files."
-msgstr "Committen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Committen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:87
 msgid "Merging is not possible because you have unmerged files."
-msgstr "Mergen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Mergen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:89
 msgid "Pulling is not possible because you have unmerged files."
-msgstr "Pullen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Pullen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:91
 msgid "Reverting is not possible because you have unmerged files."
-msgstr "Reverten ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr ""
+"Reverten ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:93
 #, c-format
@@ -60,7 +66,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "Beende wegen unaufgelöstem Konflikt."
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)."
 
@@ -96,643 +102,1391 @@ msgstr ""
 "weiteren Checkout durchführen.\n"
 "\n"
 "Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits\n"
-"zu behalten, können Sie das (jetzt oder später) durch einen weiteren Checkout\n"
+"zu behalten, können Sie das (jetzt oder später) durch einen weiteren "
+"Checkout\n"
 "mit der Option -b tun. Beispiel:\n"
 "\n"
 "  git checkout -b <neuer-Branchname>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<Optionen>] <Commit-Referenz> [<Pfad>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "nicht erkannte Whitespace-Option: '%s'"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <Repository> [--exec <Programm>] [<Optionen>] <Commit-"
-"Referenz> [<Pfad>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject und --3way können nicht gemeinsam verwendet werden."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached und --3way können nicht gemeinsam verwendet werden."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr ""
+"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:429
-msgid "fmt"
-msgstr "Format"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr ""
+"Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:429
-msgid "archive format"
-msgstr "Archivformat"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr ""
+"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "Präfix"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "Datei"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "das Archiv in diese Datei schreiben"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile "
+"%d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr ".gitattributes aus dem Arbeitsverzeichnis lesen"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "archivierte Dateien in der Standard-Fehlerausgabe ausgeben"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "nur speichern"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "schneller komprimieren"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: unerwartete Zeile: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "besser komprimieren"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "unterstützte Archivformate auflisten"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
+"%d vorangestellter Teil des Pfades entfernt wird (Zeile %d)"
+msgstr[1] ""
+"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
+"%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "Repository"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr ""
+"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen (Zeile "
+"%d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "Archiv vom Remote-Repository <Repository> abrufen"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "neue Datei hängt von alten Inhalten ab"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "Programm"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "entfernte Datei hat noch Inhalte"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "fehlerhafter Patch bei Zeile %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Unerwartete Option --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "neue Datei %s hängt von alten Inhalten ab"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden."
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "entfernte Datei %s hat noch Inhalte"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Unerwartete Option --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Unbekanntes Archivformat '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Argument für Format '%s' nicht unterstützt: -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "nicht erkannter Binär-Patch bei Zeile %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Verneinende Muster werden in Git-Attributen ignoriert.\n"
-"Benutzen Sie '\\!' für führende Ausrufezeichen."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "Konnte Datei '%s' nicht öffnen"
+msgid "unable to read symlink %s"
+msgstr "konnte symbolische Verknüpfung %s nicht lesen"
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Ungültiger Inhalt bzgl. Anführungsstriche in Datei '%s': %s"
+msgid "unable to open or read %s"
+msgstr "konnte %s nicht öffnen oder lesen"
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "Keine binäre Suche mehr möglich!\n"
+msgid "invalid start of line: '%c'"
+msgstr "Ungültiger Zeilenanfang: '%c'"
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "%s ist kein gültiger Commit-Name"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeile versetzt)"
+msgstr[1] ""
+"Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)"
 
-#: bisect.c:732
+#: apply.c:3053
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"Die Merge-Basis %s ist fehlerhaft.\n"
-"Das bedeutet, der Fehler wurde zwischen %s und [%s] behoben.\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden"
 
-#: bisect.c:737
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"Die Merge-Basis %s ist neu.\n"
-"Das bedeutet, die Eigenschaft hat sich zwischen %s und [%s] geändert.\n"
+"bei der Suche nach:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "keine Daten in Binär-Patch für '%s'"
+
+#: apply.c:3089
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"Die Merge-Basis %s ist %s.\n"
-"Das bedeutet, der erste '%s' Commit befindet sich zwischen %s und [%s]\n"
+"kann binären Patch nicht in umgekehrter Reihenfolge anwenden ohne einen\n"
+"umgekehrten Patch-Block auf '%s'"
 
-#: bisect.c:750
+#: apply.c:3135
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"Manche %s Commits sind keine Vorgänger des %s Commits.\n"
-"git bisect kann in diesem Fall nicht richtig arbeiten.\n"
-"Vielleicht verwechselten Sie %s und %s Commits?\n"
+"kann binären Patch auf '%s' nicht ohne eine vollständige Index-Zeile anwenden"
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"Die Merge-Basis zwischen %s und [%s] muss ausgelassen werden.\n"
-"Es kann daher nicht sichergestellt werden, dass sich der\n"
-"erste %s Commit zwischen %s und %s befindet.\n"
-"Es wird dennoch fortgesetzt."
+"der Patch wird angewendet auf '%s' (%s), was nicht den aktuellen Inhalten\n"
+"entspricht"
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "binäre Suche: eine Merge-Basis muss geprüft werden\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "der Patch wird auf ein leeres '%s' angewendet, was aber nicht leer ist"
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
-msgstr "ein %s Commit wird benötigt"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "das erforderliche Postimage %s für '%s' kann nicht gelesen werden"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
-msgstr "konnte Datei '%s' nicht erstellen"
+msgid "binary patch does not apply to '%s'"
+msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
-msgstr "Konnte Datei '%s' nicht lesen"
-
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "Lesen von Referenzen für binäre Suche fehlgeschlagen"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)"
 
-#: bisect.c:967
+#: apply.c:3211
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s war sowohl %s als auch %s\n"
+msgid "patch failed: %s:%ld"
+msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
 
-#: bisect.c:975
+#: apply.c:3333
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"Kein testbarer Commit gefunden.\n"
-"Vielleicht starteten Sie mit falschen Pfad-Parametern?\n"
+msgid "cannot checkout %s"
+msgstr "kann %s nicht auschecken"
 
-#: bisect.c:994
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(ungefähr %d Schritt)"
-msgstr[1] "(ungefähr %d Schritte)"
+msgid "failed to read %s"
+msgstr "Fehler beim Lesen von %s"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3389
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "binäre Suche: danach noch %d Commit zum Testen übrig %s\n"
-msgstr[1] "binäre Suche: danach noch %d Commits zum Testen übrig %s\n"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "'%s' ist hinter einer symbolischen Verknüpfung"
 
-#: branch.c:53
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"Nachdem Sie die Fehlerursache behoben haben, können Sie\n"
-"die Tracking-Informationen mit\n"
-"\"git branch --set-upstream-to=%s%s%s\"\n"
-"erneut setzen."
+msgid "path %s has been renamed/deleted"
+msgstr "Pfad %s wurde umbenannt/gelöscht"
 
-#: branch.c:67
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
+msgid "%s: does not exist in index"
+msgstr "%s ist nicht im Index"
 
-#: branch.c:93
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgid "%s: does not match index"
+msgstr "%s entspricht nicht der Version im Index"
+
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
-"Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s durch Rebase."
+"Dem Repository fehlt der notwendige Blob, um auf einen 3-Wege-Merge\n"
+"zurückzufallen."
 
-#: branch.c:94
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "Falle zurück auf 3-Wege-Merge ...\n"
 
-#: branch.c:98
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s durch Rebase."
+msgid "cannot read the current contents of '%s'"
+msgstr "kann aktuelle Inhalte von '%s' nicht lesen"
 
-#: branch.c:99
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Fehler beim Zurückfallen auf 3-Wege-Merge...\n"
 
-#: branch.c:104
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s durch Rebase."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Patch auf '%s' mit Konflikten angewendet.\n"
 
-#: branch.c:105
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Patch auf '%s' sauber angewendet.\n"
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"Branch %s konfiguriert zum Folgen von lokaler Referenz %s durch Rebase."
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "Lösch-Patch hinterlässt Dateiinhalte"
 
-#: branch.c:110
+#: apply.c:3697
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Konnte Konfiguration zu Upstream-Branch nicht schreiben."
+msgid "%s: wrong type"
+msgstr "%s: falscher Typ"
 
-#: branch.c:156
+#: apply.c:3699
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr ""
-"Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
-"mehrdeutig."
+msgid "%s has type %o, expected %o"
+msgstr "%s ist vom Typ %o, erwartete %o"
 
-#: branch.c:185
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' ist kein gültiger Branchname."
+msgid "invalid path '%s'"
+msgstr "Ungültiger Pfad '%s'"
 
-#: branch.c:190
+#: apply.c:3908
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Branch '%s' existiert bereits."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
+msgid "%s: already exists in index"
+msgstr "%s ist bereits bereitgestellt"
 
-#: branch.c:218
+#: apply.c:3911
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein "
-"Branch."
+msgid "%s: already exists in working directory"
+msgstr "%s existiert bereits im Arbeitsverzeichnis"
 
-#: branch.c:220
+#: apply.c:3931
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "der angeforderte Upstream-Branch '%s' existiert nicht"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Falls Sie vorhaben, Ihre Arbeit auf einem bereits existierenden\n"
-"Upstream-Branch aufzubauen, sollten Sie \"git fetch\"\n"
-"ausführen, um diesen abzurufen.\n"
-"\n"
-"Falls Sie vorhaben, einen neuen lokalen Branch zu versenden\n"
-"der seinem externen Gegenstück folgen soll, können Sie\n"
-"\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n"
-"zu konfigurieren."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)"
 
-#: branch.c:266
+#: apply.c:3936
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Ungültiger Objekt-Name: '%s'"
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s"
 
-#: branch.c:286
+#: apply.c:3956
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "mehrdeutiger Objekt-Name: '%s'"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung"
 
-#: branch.c:291
+#: apply.c:3960
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ungültiger Branchpunkt: '%s'"
+msgid "%s: patch does not apply"
+msgstr "%s: Patch konnte nicht angewendet werden"
 
-#: branch.c:345
+#: apply.c:3975
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' ist bereits in '%s' ausgecheckt"
+msgid "Checking patch %s..."
+msgstr "Prüfe Patch %s ..."
 
-#: branch.c:364
+#: apply.c:4066
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "HEAD des Arbeitsverzeichnisses %s ist nicht aktualisiert."
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "SHA-1 Information fehlt oder ist unbrauchbar für Submodul %s"
 
-#: bundle.c:34
+#: apply.c:4073
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "Modusänderung für %s, was sich nicht im aktuellen HEAD befindet"
 
-#: bundle.c:61
+#: apply.c:4076
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "SHA-1 Information fehlt oder ist unbrauchbar (%s)."
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "could not open '%s'"
-msgstr "Konnte '%s' nicht öffnen"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
 
-#: bundle.c:185
+#: apply.c:4085
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Das Paket enthält diese Referenz:"
-msgstr[1] "Das Paket enthält diese %d Referenzen:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Das Paket speichert eine komplette Historie."
+msgid "could not add %s to temporary index"
+msgstr "konnte %s nicht zum temporären Index hinzufügen"
 
-#: bundle.c:194
+#: apply.c:4095
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Das Paket benötigt diese Referenz:"
-msgstr[1] "Das Paket benötigt diese %d Referenzen:"
+msgid "could not write temporary index to %s"
+msgstr "konnte temporären Index nicht nach %s schreiben"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Konnte Paketobjekte nicht erstellen"
-
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "Erstellung der Paketobjekte abgebrochen"
-
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "\"rev-list\" abgebrochen"
+#: apply.c:4233
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "konnte %s nicht aus dem Index entfernen"
 
-#: bundle.c:353
+#: apply.c:4268
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
+msgid "corrupt patch for submodule %s"
+msgstr "fehlerhafter Patch für Submodul %s"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4274
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "nicht erkanntes Argument: %s"
+msgid "unable to stat newly created file '%s'"
+msgstr "konnte neu erstellte Datei '%s' nicht lesen"
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Erstellung eines leeren Pakets zurückgewiesen."
+#: apply.c:4282
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen"
 
-#: bundle.c:463
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "cannot create '%s'"
-msgstr "kann '%s' nicht erstellen"
+msgid "unable to add cache entry for %s"
+msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "Erstellung der Paketindexdatei abgebrochen"
+#: apply.c:4329
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "Fehler beim Schreiben nach '%s'"
 
-#: color.c:290
+#: apply.c:4333
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "Ungültiger Farbwert: %.*s"
+msgid "closing file '%s'"
+msgstr "schließe Datei '%s'"
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4403
 #, c-format
-msgid "could not parse %s"
-msgstr "konnte %s nicht parsen"
+msgid "unable to write file '%s' mode %o"
+msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
 
-#: commit.c:42
+#: apply.c:4501
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s ist kein Commit!"
+msgid "Applied patch %s cleanly."
+msgstr "Patch %s sauber angewendet"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "Speicher verbraucht"
+#: apply.c:4509
+msgid "internal error"
+msgstr "interner Fehler"
 
-#: config.c:516
+#: apply.c:4512
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "Ungültige Konfigurationszeile %d in Blob %s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..."
+msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..."
 
-#: config.c:520
+#: apply.c:4523
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "Ungültige Konfigurationszeile %d in Datei %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
 
-#: config.c:524
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe"
+msgid "cannot open %s"
+msgstr "kann '%s' nicht öffnen"
 
-#: config.c:528
+#: apply.c:4545
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Patch-Bereich #%d sauber angewendet."
 
-#: config.c:532
+#: apply.c:4549
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s"
+msgid "Rejected hunk #%d."
+msgstr "Patch-Block #%d zurückgewiesen."
 
-#: config.c:536
+#: apply.c:4659
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "Ungültige Konfigurationszeile %d in %s"
-
-#: config.c:655
-msgid "out of range"
-msgstr "Außerhalb des Bereichs"
+msgid "Skipped patch '%s'."
+msgstr "Patch '%s' ausgelassen."
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "Ungültige Einheit"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "nicht erkannte Eingabe"
 
-#: config.c:661
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "Konnte Index-Datei nicht lesen"
 
-#: config.c:666
+#: apply.c:4823
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Blob %s: %s"
+msgid "can't open patch '%s': %s"
+msgstr "kann Patch '%s' nicht öffnen: %s"
 
-#: config.c:669
+#: apply.c:4850
+#, c-format
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "unterdrückte %d Whitespace-Fehler"
+msgstr[1] "unterdrückte %d Whitespace-Fehler"
+
+#: apply.c:4856 apply.c:4871
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d Zeile fügt Whitespace-Fehler hinzu."
+msgstr[1] "%d Zeilen fügen Whitespace-Fehler hinzu."
+
+#: apply.c:4864
+#, c-format
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d Zeile nach Behebung von Whitespace-Fehlern angewendet."
+msgstr[1] "%d Zeilen nach Behebung von Whitespace-Fehlern angewendet."
+
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "Konnte neue Index-Datei nicht schreiben."
+
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "Pfad"
+
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "keine Änderungen im angegebenen Pfad anwenden"
+
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "Änderungen nur im angegebenen Pfad anwenden"
+
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
+msgstr "Anzahl"
+
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr ""
+"<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden "
+"entfernen"
+
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "hinzugefügte Zeilen des Patches ignorieren"
+
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr ""
+"anstatt der Anwendung des Patches, den \"diffstat\" für die Eingabe "
+"ausgegeben"
+
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
+msgstr ""
+"die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation anzeigen"
+
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr ""
+"anstatt der Anwendung des Patches, eine Zusammenfassung für die Eingabe "
+"ausgeben"
+
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr ""
+"anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann"
+
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr ""
+"sicherstellen, dass der Patch mit dem aktuellen Index angewendet werden kann"
+
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
+
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr ""
+"Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt"
+
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)"
+
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "versuche 3-Wege-Merge, wenn der Patch nicht angewendet werden konnte"
+
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+"einen temporären Index, basierend auf den integrierten Index-Informationen, "
+"erstellen"
+
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
+msgstr "Pfade sind getrennt durch NUL Zeichen"
+
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr ""
+"sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
+
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
+msgstr "Aktion"
+
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln"
+
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
+msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren"
+
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "den Patch in umgekehrter Reihenfolge anwenden"
+
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "keinen Kontext erwarten"
+
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr ""
+"zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen"
+
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "sich überlappende Patch-Blöcke erlauben"
+
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "erweiterte Ausgaben"
+
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren"
+
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen"
+
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr "Wurzelverzeichnis"
+
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "<Wurzelverzeichnis> vor alle Dateinamen stellen"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<Optionen>] <Commit-Referenz> [<Pfad>...]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <Repository> [--exec <Programm>] [<Optionen>] <Commit-"
+"Referenz> [<Pfad>...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
+
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
+
+#: archive.c:417
+msgid "fmt"
+msgstr "Format"
+
+#: archive.c:417
+msgid "archive format"
+msgstr "Archivformat"
+
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "Präfix"
+
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
+
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "Datei"
+
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "das Archiv in diese Datei schreiben"
+
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr ".gitattributes aus dem Arbeitsverzeichnis lesen"
+
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "archivierte Dateien in der Standard-Fehlerausgabe ausgeben"
+
+#: archive.c:425
+msgid "store only"
+msgstr "nur speichern"
+
+#: archive.c:426
+msgid "compress faster"
+msgstr "schneller komprimieren"
+
+#: archive.c:434
+msgid "compress better"
+msgstr "besser komprimieren"
+
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "unterstützte Archivformate auflisten"
+
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "Repository"
+
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "Archiv vom Remote-Repository <Repository> abrufen"
+
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "Programm"
+
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
+
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "Unerwartete Option --remote"
+
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden."
+
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "Unerwartete Option --output"
+
+#: archive.c:475
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Unbekanntes Archivformat '%s'"
+
+#: archive.c:482
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argument für Format '%s' nicht unterstützt: -%d"
+
+#: attr.c:212
+#, c-format
+msgid "%.*s is not a valid attribute name"
+msgstr "%.*s ist kein gültiger Attributname"
+
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Verneinende Muster werden in Git-Attributen ignoriert.\n"
+"Benutzen Sie '\\!' für führende Ausrufezeichen."
+
+#: bisect.c:444
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Konnte Datei '%s' nicht öffnen"
+
+#: bisect.c:449
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Ungültiger Inhalt bzgl. Anführungsstriche in Datei '%s': %s"
+
+#: bisect.c:657
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Keine binäre Suche mehr möglich!\n"
+
+#: bisect.c:710
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "%s ist kein gültiger Commit-Name"
+
+#: bisect.c:734
+#, c-format
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"Die Merge-Basis %s ist fehlerhaft.\n"
+"Das bedeutet, der Fehler wurde zwischen %s und [%s] behoben.\n"
+
+#: bisect.c:739
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"Die Merge-Basis %s ist neu.\n"
+"Das bedeutet, die Eigenschaft hat sich zwischen %s und [%s] geändert.\n"
+
+#: bisect.c:744
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"Die Merge-Basis %s ist %s.\n"
+"Das bedeutet, der erste '%s' Commit befindet sich zwischen %s und [%s].\n"
+
+#: bisect.c:752
+#, c-format
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Manche %s Commits sind keine Vorgänger des %s Commits.\n"
+"git bisect kann in diesem Fall nicht richtig arbeiten.\n"
+"Vielleicht verwechselten Sie %s und %s Commits?\n"
+
+#: bisect.c:765
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"Die Merge-Basis zwischen %s und [%s] muss ausgelassen werden.\n"
+"Es kann daher nicht sichergestellt werden, dass sich der\n"
+"erste %s Commit zwischen %s und %s befindet.\n"
+"Es wird dennoch fortgesetzt."
+
+#: bisect.c:800
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "binäre Suche: eine Merge-Basis muss geprüft werden\n"
+
+#: bisect.c:851
+#, c-format
+msgid "a %s revision is needed"
+msgstr "ein %s Commit wird benötigt"
+
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
+#, c-format
+msgid "could not create file '%s'"
+msgstr "konnte Datei '%s' nicht erstellen"
+
+#: bisect.c:919
+#, c-format
+msgid "could not read file '%s'"
+msgstr "Konnte Datei '%s' nicht lesen"
+
+#: bisect.c:949
+msgid "reading bisect refs failed"
+msgstr "Lesen von Referenzen für binäre Suche fehlgeschlagen"
+
+#: bisect.c:969
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s war sowohl %s als auch %s\n"
+
+#: bisect.c:977
+#, c-format
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"Kein testbarer Commit gefunden.\n"
+"Vielleicht starteten Sie mit falschen Pfad-Parametern?\n"
+
+#: bisect.c:996
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(ungefähr %d Schritt)"
+msgstr[1] "(ungefähr %d Schritte)"
+
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "binäre Suche: danach noch %d Commit zum Testen übrig %s\n"
+msgstr[1] "binäre Suche: danach noch %d Commits zum Testen übrig %s\n"
+
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"Nachdem Sie die Fehlerursache behoben haben, können Sie\n"
+"die Tracking-Informationen mit\n"
+"\"git branch --set-upstream-to=%s%s%s\"\n"
+"erneut setzen."
+
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
+
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s durch Rebase."
+
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s."
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s durch Rebase."
+
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
+
+#: branch.c:104
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s durch Rebase."
+
+#: branch.c:105
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
+
+#: branch.c:109
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"Branch %s konfiguriert zum Folgen von lokaler Referenz %s durch Rebase."
+
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Konnte Konfiguration zu Upstream-Branch nicht schreiben."
+
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr ""
+"Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
+"mehrdeutig."
+
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' ist kein gültiger Branchname."
+
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "Branch '%s' existiert bereits."
+
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
+
+#: branch.c:218
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein "
+"Branch."
+
+#: branch.c:220
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "der angeforderte Upstream-Branch '%s' existiert nicht"
+
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Falls Sie vorhaben, Ihre Arbeit auf einem bereits existierenden\n"
+"Upstream-Branch aufzubauen, sollten Sie \"git fetch\"\n"
+"ausführen, um diesen abzurufen.\n"
+"\n"
+"Falls Sie vorhaben, einen neuen lokalen Branch zu versenden\n"
+"der seinem externen Gegenstück folgen soll, können Sie\n"
+"\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n"
+"zu konfigurieren."
+
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "Ungültiger Objekt-Name: '%s'"
+
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "mehrdeutiger Objekt-Name: '%s'"
+
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "Ungültiger Branchpunkt: '%s'"
+
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' ist bereits in '%s' ausgecheckt"
+
+#: branch.c:364
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD des Arbeitsverzeichnisses %s ist nicht aktualisiert."
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
+
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
+#, c-format
+msgid "could not open '%s'"
+msgstr "Konnte '%s' nicht öffnen"
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
+
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
+
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "Das Paket enthält diese Referenz:"
+msgstr[1] "Das Paket enthält diese %d Referenzen:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Das Paket speichert eine komplette Historie."
+
+#: bundle.c:194
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "Das Paket benötigt diese Referenz:"
+msgstr[1] "Das Paket benötigt diese %d Referenzen:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Konnte Paketobjekte nicht erstellen"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "Erstellung der Paketobjekte abgebrochen"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "\"rev-list\" abgebrochen"
+
+#: bundle.c:353
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
+
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "nicht erkanntes Argument: %s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Erstellung eines leeren Pakets zurückgewiesen."
+
+#: bundle.c:463
+#, c-format
+msgid "cannot create '%s'"
+msgstr "kann '%s' nicht erstellen"
+
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "Erstellung der Paketindexdatei abgebrochen"
+
+#: color.c:300
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "Ungültiger Farbwert: %.*s"
+
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
+#, c-format
+msgid "could not parse %s"
+msgstr "konnte %s nicht parsen"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s ist kein Commit!"
+
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"Warnung: Die Commit-Beschreibung ist nicht UTF-8 konform.\n"
+"Sie können das Nachbessern, nachdem Sie die Beschreibung korrigiert haben,\n"
+"oder Sie setzen die Konfigurationsvariable i18n.commitencoding auf das "
+"Encoding,\n"
+"welches von ihrem Projekt verwendet wird.\n"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "Speicher verbraucht"
+
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr ""
+"Bedingungen für das Einbinden von Konfigurationen aus relativen Pfaden "
+"müssen\n"
+"aus Dateien kommen."
+
+#: config.c:711
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "Ungültige Konfigurationszeile %d in Blob %s"
+
+#: config.c:715
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "Ungültige Konfigurationszeile %d in Datei %s"
+
+#: config.c:719
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe"
+
+#: config.c:723
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s"
+
+#: config.c:727
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s"
+
+#: config.c:731
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "Ungültige Konfigurationszeile %d in %s"
+
+#: config.c:859
+msgid "out of range"
+msgstr "Außerhalb des Bereichs"
+
+#: config.c:859
+msgid "invalid unit"
+msgstr "Ungültige Einheit"
+
+#: config.c:865
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s"
+
+#: config.c:870
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Blob %s: %s"
+
+#: config.c:873
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Datei %s: %s"
+msgstr ""
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Datei %s: %s"
 
-#: config.c:672
+#: config.c:876
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Standard-Eingabe: %s"
+msgstr ""
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Standard-Eingabe: "
+"%s"
 
-#: config.c:675
+#: config.c:879
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Submodul-Blob %s: %s"
+msgstr ""
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Submodul-Blob %s: "
+"%s"
 
-#: config.c:678
+#: config.c:882
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Befehlszeile %s: %s"
+msgstr ""
+"Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Befehlszeile %s: "
+"%s"
 
-#: config.c:681
+#: config.c:885
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s: %s"
 
-#: config.c:768
+#: config.c:980
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'"
 
-#: config.c:849 config.c:860
+#: config.c:1075 config.c:1086
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "ungültiger zlib Komprimierungsgrad %d"
 
-#: config.c:978
+#: config.c:1203
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "Ungültiger Modus für Objekterstellung: %s"
 
-#: config.c:1312
+#: config.c:1359
+#, c-format
+msgid "bad pack compression level %d"
+msgstr "ungültiger Komprimierungsgrad (%d) für Paketierung"
+
+#: config.c:1557
 msgid "unable to parse command-line config"
 msgstr ""
 "Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen."
 
-#: config.c:1362
+#: config.c:1611
 msgid "unknown error occurred while reading the configuration files"
 msgstr ""
 "Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf."
 
-#: config.c:1716
+#: config.c:1970
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "Ungültiger %s: '%s'"
+
+#: config.c:1991
+#, c-format
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr ""
+"Unbekannter Wert '%s' in core.untrackedCache; benutze Standardwert 'keep'"
+
+#: config.c:2017
+#, c-format
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
+msgstr ""
+"Der Wert '%d' von splitIndex.maxPercentChange sollte zwischen 0 und 100 "
+"liegen."
+
+#: config.c:2028
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr ""
 "Konnte Wert '%s' aus der über die Befehlszeile angegebenen Konfiguration\n"
 "nicht parsen."
 
-#: config.c:1718
+#: config.c:2030
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "ungültige Konfigurationsvariable '%s' in Datei '%s' bei Zeile %d"
 
-#: config.c:1777
+#: config.c:2089
 #, c-format
 msgid "%s has multiple values"
 msgstr "%s hat mehrere Werte"
 
-#: config.c:2311
+#: config.c:2423 config.c:2648
+#, c-format
+msgid "fstat on %s failed"
+msgstr "fstat auf %s fehlgeschlagen"
+
+#: config.c:2541
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "Konnte '%s' nicht zu '%s' setzen."
 
-#: config.c:2313
+#: config.c:2543 builtin/remote.c:774
 #, c-format
 msgid "could not unset '%s'"
 msgstr "Konnte '%s' nicht aufheben."
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Die Gegenseite hat sich nach dem erstmaligen Kontakt aufgehangen."
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"Konnte nicht vom Remote-Repository lesen.\n"
+"\n"
+"Bitte stellen Sie sicher, dass die korrekten Zugriffsberechtigungen "
+"bestehen\n"
+"und das Repository existiert."
+
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Prüfe Konnektivität"
 
-#: connected.c:74
+#: connected.c:75
 msgid "Could not run 'git rev-list'"
 msgstr "Konnte 'git rev-list' nicht ausführen"
 
-#: connected.c:94
+#: connected.c:95
 msgid "failed write to rev-list"
 msgstr "Fehler beim Schreiben nach rev-list"
 
-#: connected.c:101
+#: connected.c:102
 msgid "failed to close rev-list's stdin"
 msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe"
 
+#: convert.c:201
+#, c-format
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"CRLF wird in %s durch LF ersetzt.\n"
+"Die Datei wird ihre ursprünglichen Zeilenenden im Arbeitsverzeichnis "
+"behalten."
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF würde in %s durch LF ersetzt werden."
+
+#: convert.c:211
+#, c-format
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"LF wird in %s durch CRLF ersetzt.\n"
+"Die Datei wird ihre ursprünglichen Zeilenenden im Arbeitsverzeichnis "
+"behalten."
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF würde in %s durch CRLF ersetzt werden."
+
 #: date.c:97
 msgid "in the future"
 msgstr "in der Zukunft"
@@ -806,27 +1560,32 @@ msgstr[1] "vor %lu Jahren"
 msgid "failed to read orderfile '%s'"
 msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
 
-#: diffcore-rename.c:540
+#: diffcore-rename.c:536
 msgid "Performing inexact rename detection"
 msgstr "Führe Erkennung für ungenaue Umbenennung aus"
 
-#: diff.c:116
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "Option '%s' erfordert einen Wert."
+
+#: diff.c:124
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n"
 
-#: diff.c:121
+#: diff.c:129
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
 
-#: diff.c:225
+#: diff.c:281
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
 
-#: diff.c:277
+#: diff.c:344
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -835,16 +1594,21 @@ msgstr ""
 "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
 "%s"
 
-#: diff.c:3017
+#: diff.c:3102
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
 
-#: diff.c:3415
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr ""
+"--name-only, --name-status, --check und -s schließen sich gegenseitig aus"
+
+#: diff.c:3518
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow erfordert genau eine Pfadspezifikation"
 
-#: diff.c:3578
+#: diff.c:3681
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -853,63 +1617,283 @@ msgstr ""
 "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
 "%s"
 
-#: diff.c:3592
+#: diff.c:3695
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
 
-#: dir.c:1823
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
+msgstr ""
+"Ungenaue Erkennung für Umbenennungen wurde aufgrund zu vieler Dateien\n"
+"übersprungen."
+
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
+msgstr "nur Kopien von geänderten Pfaden, aufgrund zu vieler Dateien, gefunden"
+
+#: diff.c:4725
+#, c-format
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"Sie könnten die Variable %s auf mindestens %d setzen und den Befehl\n"
+"erneut versuchen."
+
+#: dir.c:1899
 msgid "failed to get kernel name and information"
 msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
 
-#: dir.c:1942
+#: dir.c:2018
 msgid "Untracked cache is disabled on this system or location."
 msgstr ""
 "Cache für unversionierte Dateien ist auf diesem System oder\n"
 "für dieses Verzeichnis deaktiviert."
 
-#: gpg-interface.c:178
+#: dir.c:2776 dir.c:2781
+#, c-format
+msgid "could not create directories for %s"
+msgstr "Konnte Verzeichnisse für '%s' nicht erstellen."
+
+#: dir.c:2806
+#, c-format
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "Konnte Git-Verzeichnis nicht von '%s' nach '%s' migrieren."
+
+#: entry.c:280
+#, c-format
+msgid "could not stat file '%s'"
+msgstr "konnte Datei '%s' nicht lesen"
+
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: erwartete shallow-Liste"
+
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ACK/NAK erwartet, EOF bekommen"
+
+#: fetch-pack.c:280 builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "Fehler am anderen Ende: %s"
+
+#: fetch-pack.c:281
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK erwartet, '%s' bekommen"
+
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc benötigt multi_ack_detailed"
+
+#: fetch-pack.c:419
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "Ungültige shallow-Zeile: %s"
+
+#: fetch-pack.c:425
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "Ungültige unshallow-Zeile: %s"
+
+#: fetch-pack.c:427
+#, c-format
+msgid "object not found: %s"
+msgstr "Objekt nicht gefunden: %s"
+
+#: fetch-pack.c:430
+#, c-format
+msgid "error in object: %s"
+msgstr "Fehler in Objekt: %s"
+
+#: fetch-pack.c:432
+#, c-format
+msgid "no shallow found: %s"
+msgstr "Kein shallow-Objekt gefunden: %s"
+
+#: fetch-pack.c:435
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "shallow/unshallow erwartet, %s bekommen"
+
+#: fetch-pack.c:474
+#, c-format
+msgid "got %s %d %s"
+msgstr "%s %d %s bekommen"
+
+#: fetch-pack.c:488
+#, c-format
+msgid "invalid commit %s"
+msgstr "Ungültiger Commit %s"
+
+#: fetch-pack.c:521
+msgid "giving up"
+msgstr "Gebe auf"
+
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
+msgstr "Fertig"
+
+#: fetch-pack.c:543
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "%s (%d) %s bekommen"
+
+#: fetch-pack.c:589
+#, c-format
+msgid "Marking %s as complete"
+msgstr "Markiere %s als vollständig"
+
+#: fetch-pack.c:737
+#, c-format
+msgid "already have %s (%s)"
+msgstr "habe %s (%s) bereits"
+
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: Fehler beim Starten des sideband demultiplexer"
+
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
+msgstr "Protokollfehler: ungültiger Pack-Header"
+
+#: fetch-pack.c:839
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: konnte %s nicht starten"
+
+#: fetch-pack.c:855
+#, c-format
+msgid "%s failed"
+msgstr "%s fehlgeschlagen"
+
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
+msgstr "Fehler in sideband demultiplexer"
+
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
+msgstr "Server unterstützt keine shallow-Clients"
+
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
+msgstr "Server unterstützt multi_ack_detailed"
+
+#: fetch-pack.c:891
+msgid "Server supports no-done"
+msgstr "Server unterstützt no-done"
+
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
+msgstr "Server unterstützt multi_ack"
+
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
+msgstr "Server unterstützt side-band-64k"
+
+#: fetch-pack.c:905
+msgid "Server supports side-band"
+msgstr "Server unterstützt side-band"
+
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Server unterstützt allow-tip-sha1-in-want"
+
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Server unterstützt allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
+msgstr "Server unterstützt ofs-delta"
+
+#: fetch-pack.c:930
+#, c-format
+msgid "Server version is %.*s"
+msgstr "Server-Version ist %.*s"
+
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
+msgstr "Server unterstützt kein --shallow-since"
+
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
+msgstr "Server unterstützt kein --shallow-exclude"
+
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
+msgstr "Server unterstützt kein --deepen"
+
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr "keine gemeinsamen Commits"
+
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: Abholen fehlgeschlagen."
+
+#: fetch-pack.c:1127
+msgid "no matching remote head"
+msgstr "kein übereinstimmender Remote-Branch"
+
+#: fetch-pack.c:1149
+#, c-format
+msgid "no such remote ref %s"
+msgstr "keine solche Remote-Referenz %s"
+
+#: fetch-pack.c:1152
+#, c-format
+msgid "Server does not allow request for unadvertised object %s"
+msgstr "Der Server lehnt Anfrage nach nicht angebotenem Objekt %s ab."
+
+#: gpg-interface.c:185
 msgid "gpg failed to sign the data"
 msgstr "gpg beim Signieren der Daten fehlgeschlagen"
 
-#: gpg-interface.c:208
+#: gpg-interface.c:215
 msgid "could not create temporary file"
 msgstr "konnte temporäre Datei nicht erstellen"
 
-#: gpg-interface.c:210
+#: gpg-interface.c:217
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "Fehler beim Schreiben der losgelösten Signatur nach '%s'"
 
-#: grep.c:1792
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "Ignoriere ungültige Farbe '%.*s' in log.graphColors"
+
+#: grep.c:1796
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': konnte %s nicht lesen"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "Konnte '%s' nicht lesen"
 
-#: grep.c:1820
+#: grep.c:1824
 #, c-format
 msgid "'%s': short read"
 msgstr "'%s': read() zu kurz"
 
-#: help.c:205
+#: help.c:218
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "Vorhandene Git-Befehle in '%s'"
 
-#: help.c:212
+#: help.c:225
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "Vorhandene Git-Befehle anderswo in Ihrem $PATH"
 
-#: help.c:244
+#: help.c:256
 msgid "These are common Git commands used in various situations:"
 msgstr "Allgemeine Git-Befehle, verwendet in verschiedenen Situationen:"
 
-#: help.c:309
+#: help.c:321
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -918,11 +1902,11 @@ msgstr ""
 "'%s' scheint ein git-Befehl zu sein, konnte aber\n"
 "nicht ausgeführt werden. Vielleicht ist git-%s fehlerhaft?"
 
-#: help.c:366
+#: help.c:376
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Uh oh. Keine Git-Befehle auf Ihrem System vorhanden."
 
-#: help.c:388
+#: help.c:398
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -931,17 +1915,17 @@ msgstr ""
 "Warnung: Sie haben den nicht existierenden Git-Befehl '%s' ausgeführt.\n"
 "Setze fort unter der Annahme, dass Sie '%s' gemeint haben."
 
-#: help.c:393
+#: help.c:403
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "Automatische Ausführung in %0.1f Sekunden ..."
 
-#: help.c:400
+#: help.c:410
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: '%s' ist kein Git-Befehl. Siehe 'git --help'."
 
-#: help.c:404 help.c:470
+#: help.c:414 help.c:480
 msgid ""
 "\n"
 "Did you mean this?"
@@ -955,10 +1939,69 @@ msgstr[1] ""
 "\n"
 "Haben Sie eines von diesen gemeint?"
 
-#: help.c:466
+#: help.c:476
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
+
+#: ident.c:343
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"*** Bitte geben Sie an, wer Sie sind.\n"
+"\n"
+"Führen Sie\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"aus, um das als Ihre standardmäßige Identität zu setzen.\n"
+"Lassen Sie die Option \"--global\" weg, um die Identität nur\n"
+"für dieses Repository zu setzen.\n"
+
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "keine E-Mail angegeben und automatische Erkennung ist deaktiviert"
+
+#: ident.c:372
+#, c-format
+msgid "unable to auto-detect email address (got '%s')"
+msgstr "Konnte die E-Mail-Adresse nicht automatisch erkennen ('%s' erhalten)"
+
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "kein Name angegeben und automatische Erkennung ist deaktiviert"
+
+#: ident.c:388
+#, c-format
+msgid "unable to auto-detect name (got '%s')"
+msgstr "konnte Namen nicht automatisch erkennen ('%s' erhalten)"
+
+#: ident.c:396
+#, c-format
+msgid "empty ident name (for <%s>) not allowed"
+msgstr "Leerer Name in Identifikation (für <%s>) nicht erlaubt."
+
+#: ident.c:402
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+msgid "name consists only of disallowed characters: %s"
+msgstr "Name besteht nur aus nicht erlaubten Zeichen: %s"
+
+#: ident.c:417 builtin/commit.c:611
+#, c-format
+msgid "invalid date format: %s"
+msgstr "Ungültiges Datumsformat: %s"
 
 #: lockfile.c:152
 #, c-format
@@ -989,8 +2032,8 @@ msgstr "Konnte '%s.lock' nicht erstellen: %s"
 msgid "failed to read the cache"
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
 msgid "unable to write new index file"
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
@@ -998,69 +2041,69 @@ msgstr "Konnte neue Index-Datei nicht schreiben."
 msgid "(bad commit)\n"
 msgstr "(ungültiger Commit)\n"
 
-#: merge-recursive.c:231
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen"
 
-#: merge-recursive.c:301
+#: merge-recursive.c:303
 msgid "error building trees"
 msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
 
-#: merge-recursive.c:720
+#: merge-recursive.c:727
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "Fehler beim Erstellen des Pfades '%s'%s"
 
-#: merge-recursive.c:731
+#: merge-recursive.c:738
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Entferne %s, um Platz für Unterverzeichnis zu schaffen\n"
 
-#: merge-recursive.c:745 merge-recursive.c:764
+#: merge-recursive.c:752 merge-recursive.c:771
 msgid ": perhaps a D/F conflict?"
 msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
 
-#: merge-recursive.c:754
+#: merge-recursive.c:761
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "verweigere, da unversionierte Dateien in '%s' verloren gehen würden"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kann Objekt %s '%s' nicht lesen"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:805
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "Blob erwartet für %s '%s'"
 
-#: merge-recursive.c:822
+#: merge-recursive.c:829
 #, c-format
 msgid "failed to open '%s': %s"
 msgstr "Fehler beim Öffnen von '%s': %s"
 
-#: merge-recursive.c:833
+#: merge-recursive.c:840
 #, c-format
 msgid "failed to symlink '%s': %s"
 msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s': %s"
 
-#: merge-recursive.c:838
+#: merge-recursive.c:845
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "weiß nicht was mit %06o %s '%s' zu machen ist"
 
-#: merge-recursive.c:978
+#: merge-recursive.c:985
 msgid "Failed to execute internal merge"
 msgstr "Fehler bei Ausführung des internen Merges"
 
-#: merge-recursive.c:982
+#: merge-recursive.c:989
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Konnte %s nicht zur Datenbank hinzufügen"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1069,7 +2112,16 @@ msgstr ""
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich gelassen."
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: merge-recursive.c:1097
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
+msgstr ""
+"KONFLIKT (%s/löschen): %s gelöscht in %s und %s nach %s in %s. Stand %s von "
+"%s wurde im Arbeitsbereich gelassen."
+
+#: merge-recursive.c:1104
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1078,6 +2130,15 @@ msgstr ""
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich bei %s gelassen."
 
+#: merge-recursive.c:1109
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
+msgstr ""
+"KONFLIKT (%s/löschen): %s gelöscht in %s und %s nach %s in %s. Stand %s von "
+"%s wurde im Arbeitsbereich bei %s gelassen."
+
 #: merge-recursive.c:1143
 msgid "rename"
 msgstr "umbenennen"
@@ -1116,126 +2177,146 @@ msgstr ""
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Benenne stattdessen %s nach %s und %s nach %s um"
 
-#: merge-recursive.c:1531
+#: merge-recursive.c:1528
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "KONFLIKT (umbenennen/hinzufügen): Benenne um %s->%s in %s. %s hinzugefügt in "
 "%s"
 
-#: merge-recursive.c:1546
+#: merge-recursive.c:1543
 #, c-format
 msgid "Adding merged %s"
 msgstr "Füge zusammengeführte Datei %s hinzu"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Füge stattdessen als %s hinzu"
 
-#: merge-recursive.c:1610
+#: merge-recursive.c:1607
 #, c-format
 msgid "cannot read object %s"
 msgstr "kann Objekt %s nicht lesen"
 
-#: merge-recursive.c:1613
+#: merge-recursive.c:1610
 #, c-format
 msgid "object %s is not a blob"
 msgstr "Objekt %s ist kein Blob"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modify"
 msgstr "ändern"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modified"
 msgstr "geändert"
 
-#: merge-recursive.c:1676
+#: merge-recursive.c:1689
 msgid "content"
 msgstr "Inhalt"
 
-#: merge-recursive.c:1683
+#: merge-recursive.c:1696
 msgid "add/add"
 msgstr "hinzufügen/hinzufügen"
 
-#: merge-recursive.c:1718
+#: merge-recursive.c:1732
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: merge-recursive.c:1732
+#: merge-recursive.c:1746
 #, c-format
 msgid "Auto-merging %s"
 msgstr "automatischer Merge von %s"
 
-#: merge-recursive.c:1736 git-submodule.sh:919
+#: merge-recursive.c:1750 git-submodule.sh:944
 msgid "submodule"
 msgstr "Submodul"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1751
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
 
-#: merge-recursive.c:1831
+#: merge-recursive.c:1845
 #, c-format
 msgid "Removing %s"
 msgstr "Entferne %s"
 
-#: merge-recursive.c:1857
+#: merge-recursive.c:1871
 msgid "file/directory"
 msgstr "Datei/Verzeichnis"
 
-#: merge-recursive.c:1863
+#: merge-recursive.c:1877
 msgid "directory/file"
 msgstr "Verzeichnis/Datei"
 
-#: merge-recursive.c:1868
+#: merge-recursive.c:1883
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "KONFLIKT (%s): Es existiert bereits ein Verzeichnis %s in %s. Füge %s als %s "
 "hinzu."
 
-#: merge-recursive.c:1877
+#: merge-recursive.c:1892
 #, c-format
 msgid "Adding %s"
 msgstr "Füge %s hinzu"
 
-#: merge-recursive.c:1914
+#: merge-recursive.c:1929
 msgid "Already up-to-date!"
 msgstr "Bereits aktuell!"
 
-#: merge-recursive.c:1923
+#: merge-recursive.c:1938
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
 
-#: merge-recursive.c:2006
+#: merge-recursive.c:2021
 msgid "Merging:"
 msgstr "Merge:"
 
-#: merge-recursive.c:2019
+#: merge-recursive.c:2034
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "%u gemeinsamen Vorgänger-Commit gefunden"
 msgstr[1] "%u gemeinsame Vorgänger-Commits gefunden"
 
-#: merge-recursive.c:2058
+#: merge-recursive.c:2073
 msgid "merge returned no commit"
 msgstr "Merge hat keinen Commit zurückgegeben"
 
-#: merge-recursive.c:2121
+#: merge-recursive.c:2136
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
 msgid "Unable to write index."
 msgstr "Konnte Index nicht schreiben."
 
+#: notes-merge.c:273
+#, c-format
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
+msgstr ""
+"Sie haben Ihren vorherigen Merge von Notizen nicht abgeschlossen (%s "
+"existiert).\n"
+"Bitte benutzen Sie 'git notes merge --commit' oder 'git notes merge --"
+"abort', um\n"
+"den vorherigen Merge zu committen bzw. abzubrechen, bevor Sie einen neuen "
+"Merge\n"
+"von Notizen beginnen."
+
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Sie haben Ihren Merge von Notizen nicht abgeschlossen (%s existiert)."
+
 #: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
@@ -1259,7 +2340,7 @@ msgstr ""
 msgid "Bad %s value: '%s'"
 msgstr "Ungültiger %s Wert: '%s'"
 
-#: object.c:242
+#: object.c:240
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "Konnte Objekt '%s' nicht parsen."
@@ -1294,18 +2375,35 @@ msgstr "-NUM"
 msgid "malformed object name '%s'"
 msgstr "fehlerhafter Objekt-Name '%s'"
 
-#: path.c:798
+#: path.c:810
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Konnte Gruppenschreibrecht für %s nicht setzen."
 
-#: pathspec.c:133
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
+msgstr "Escape-Zeichen '\\' als letztes Zeichen in Attributwert nicht erlaubt"
+
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
+msgstr "Es ist nur eine Angabe von 'attr:' erlaubt."
+
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "Angabe von 'attr:' darf nicht leer sein"
+
+#: pathspec.c:189
+#, c-format
+msgid "invalid attribute name %s"
+msgstr "Ungültiger Attributname %s"
+
+#: pathspec.c:254
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
 "Globale Einstellungen zur Pfadspezifikation 'glob' und 'noglob' sind "
 "inkompatibel."
 
-#: pathspec.c:143
+#: pathspec.c:261
 msgid ""
 "global 'literal' pathspec setting is incompatible with all other global "
 "pathspec settings"
@@ -1313,2804 +2411,2823 @@ msgstr ""
 "Globale Einstellung zur Pfadspezifikation 'literal' ist inkompatibel\n"
 "mit allen anderen Optionen."
 
-#: pathspec.c:177
+#: pathspec.c:301
 msgid "invalid parameter for pathspec magic 'prefix'"
 msgstr "ungültiger Parameter für Pfadspezifikationsangabe 'prefix'"
 
-#: pathspec.c:183
+#: pathspec.c:322
 #, c-format
 msgid "Invalid pathspec magic '%.*s' in '%s'"
 msgstr "ungültige Pfadspezifikationsangabe '%.*s' in '%s'"
 
-#: pathspec.c:187
+#: pathspec.c:327
 #, c-format
 msgid "Missing ')' at the end of pathspec magic in '%s'"
 msgstr "Fehlendes ')' am Ende der Pfadspezifikationsangabe in '%s'"
 
-#: pathspec.c:205
+#: pathspec.c:365
 #, c-format
 msgid "Unimplemented pathspec magic '%c' in '%s'"
 msgstr "nicht unterstützte Pfadspezifikationsangabe '%c' in '%s'"
 
-#: pathspec.c:230
+#: pathspec.c:421 pathspec.c:443
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'"
+
+#: pathspec.c:483
 #, c-format
 msgid "%s: 'literal' and 'glob' are incompatible"
 msgstr "%s: 'literal' und 'glob' sind inkompatibel"
 
-#: pathspec.c:241
+#: pathspec.c:496
 #, c-format
 msgid "%s: '%s' is outside repository"
 msgstr "%s: '%s' liegt außerhalb des Repositories"
 
-#: pathspec.c:291
+#: pathspec.c:584
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'"
+msgid "'%s' (mnemonic: '%c')"
+msgstr "'%s' (Kürzel: '%c')"
 
-#: pathspec.c:353
+#: pathspec.c:594
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
 "%s: Pfadspezifikationsangabe wird von diesem Befehl nicht unterstützt: %s"
 
-#: pathspec.c:433
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"Leere Strings als Pfadspezifikationen werden in kommenden Releases "
+"ungültig.\n"
+"Bitte benutzen Sie stattdessen . wenn Sie alle Pfade meinen."
+
+#: pathspec.c:668
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "Pfadspezifikation '%s' ist hinter einer symbolischen Verknüpfung"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
-"Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
-
-#: pretty.c:973
+#: pretty.c:982
 msgid "unable to parse --pretty format"
 msgstr "Konnte --pretty Format nicht parsen."
 
-#: progress.c:235
-msgid "done"
-msgstr "Fertig"
-
-#: read-cache.c:1281
+#: read-cache.c:1442
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
 "Using version %i"
 msgstr ""
-"index.version gesetzt, aber Wert ungültig.\n"
-"Verwende Version %i"
-
-#: read-cache.c:1291
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
-"Verwende Version %i"
-
-#: refs.c:551 builtin/merge.c:840
-#, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
-
-#: refs/files-backend.c:2534
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr "Konnte Referenz %s nicht entfernen: %s"
-
-#: refs/files-backend.c:2537
-#, c-format
-msgid "could not delete references: %s"
-msgstr "Konnte Referenzen nicht entfernen: %s"
-
-#: refs/files-backend.c:2546
-#, c-format
-msgid "could not remove reference %s"
-msgstr "Konnte Referenz %s nicht löschen"
-
-#: ref-filter.c:55
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "Erwartetes Format: %%(color:<Farbe>)"
-
-#: ref-filter.c:57
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "nicht erkannte Farbe: %%(color:%s)"
-
-#: ref-filter.c:71
-#, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "nicht erkanntes Format: %%(%s)"
-
-#: ref-filter.c:77
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) akzeptiert keine Argumente"
-
-#: ref-filter.c:84
-#, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) akzeptiert keine Argumente"
-
-#: ref-filter.c:101
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "Positiver Wert erwartet contents:lines=%s"
-
-#: ref-filter.c:103
-#, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "nicht erkanntes %%(contents) Argument: %s"
-
-#: ref-filter.c:113
-#, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "nicht erkanntes %%(objectname) Argument: %s"
-
-#: ref-filter.c:135
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "Erwartetes Format: %%(align:<Breite>,<Position>)"
-
-#: ref-filter.c:147
-#, c-format
-msgid "unrecognized position:%s"
-msgstr "nicht erkannte Position:%s"
-
-#: ref-filter.c:151
-#, c-format
-msgid "unrecognized width:%s"
-msgstr "nicht erkannte Breite:%s"
-
-#: ref-filter.c:157
-#, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "nicht erkanntes %%(align) Argument: %s"
-
-#: ref-filter.c:161
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "Positive Breitenangabe für %%(align) erwartet"
-
-#: ref-filter.c:244
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr "Fehlerhafter Feldname: %.*s"
-
-#: ref-filter.c:270
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr "Unbekannter Feldname: %.*s"
-
-#: ref-filter.c:372
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "Format: %%(end) Atom ohne zugehöriges Atom verwendet"
-
-#: ref-filter.c:424
-#, c-format
-msgid "malformed format string %s"
-msgstr "Fehlerhafter Formatierungsstring %s"
-
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= erfordert eine positive Ganzzahl als Argument"
-
-#: ref-filter.c:883
-#, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "Referenz '%s' hat keine %ld Komponenten für :strip"
-
-#: ref-filter.c:1046
-#, c-format
-msgid "unknown %.*s format %s"
-msgstr "Unbekanntes %.*s Format %s"
-
-#: ref-filter.c:1066 ref-filter.c:1097
-#, c-format
-msgid "missing object %s for %s"
-msgstr "Objekt %s fehlt für %s"
-
-#: ref-filter.c:1069 ref-filter.c:1100
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "parse_object_buffer bei %s für %s fehlgeschlagen"
-
-#: ref-filter.c:1311
-#, c-format
-msgid "malformed object at '%s'"
-msgstr "fehlerhaftes Objekt bei '%s'"
-
-#: ref-filter.c:1373
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "Ignoriere Referenz mit fehlerhaftem Namen %s"
-
-#: ref-filter.c:1378
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr "Ignoriere fehlerhafte Referenz %s"
-
-#: ref-filter.c:1651
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr "Format: %%(end) Atom fehlt"
-
-#: ref-filter.c:1705
-#, c-format
-msgid "malformed object name %s"
-msgstr "Missgebildeter Objektname %s"
-
-#: remote.c:746
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "Kann 'fetch' nicht für sowohl %s als auch %s nach %s ausführen."
-
-#: remote.c:750
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s folgt üblicherweise %s, nicht %s"
-
-#: remote.c:754
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s folgt sowohl %s als auch %s"
-
-#: remote.c:762
-msgid "Internal error"
-msgstr "Interner Fehler"
-
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD zeigt auf keinen Branch"
-
-#: remote.c:1686
-#, c-format
-msgid "no such branch: '%s'"
-msgstr "Kein solcher Branch: '%s'"
-
-#: remote.c:1689
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
-
-#: remote.c:1695
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "Upstream-Branch '%s' nicht als Remote-Tracking-Branch gespeichert"
-
-#: remote.c:1710
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-"Ziel für \"push\" '%s' auf Remote-Repository '%s' hat keinen lokal gefolgten "
-"Branch"
-
-#: remote.c:1725
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
-
-#: remote.c:1736
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "Push-Refspecs für '%s' beinhalten nicht '%s'"
-
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "kein Ziel für \"push\" (push.default ist 'nothing')"
-
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "kann einzelnes Ziel für \"push\" im Modus 'simple' nicht auflösen"
-
-#: remote.c:2073
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-"Ihr Branch basiert auf '%s', aber der Upstream-Branch wurde entfernt.\n"
-
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
-
-#: remote.c:2080
-#, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Ihr Branch ist auf dem selben Stand wie '%s'.\n"
-
-#: remote.c:2084
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Ihr Branch ist vor '%s' um %d Commit.\n"
-msgstr[1] "Ihr Branch ist vor '%s' um %d Commits.\n"
-
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n"
-
-#: remote.c:2093
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-"Ihr Branch ist zu '%s' um %d Commit hinterher, und kann vorgespult werden.\n"
-msgstr[1] ""
-"Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n"
-
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-"  (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n"
+"index.version gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
 
-#: remote.c:2104
+#: read-cache.c:1452
 #, c-format
 msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"Ihr Branch und '%s' sind divergiert,\n"
-"und haben jeweils %d und %d unterschiedliche Commits.\n"
-msgstr[1] ""
-"Ihr Branch und '%s' sind divergiert,\n"
-"und haben jeweils %d und %d unterschiedliche Commits.\n"
-
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
-"zusammenzuführen)\n"
-
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
+"GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
 
-#: revision.c:2135
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
+msgid "could not stat '%s'"
+msgstr "Konnte '%s' nicht lesen."
 
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "Die Optionen --first-parent und --bisect sind inkompatibel."
+#: read-cache.c:2388
+#, c-format
+msgid "unable to open git dir: %s"
+msgstr "konnte Git-Verzeichnis nicht öffnen: %s"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "Öffnen von /dev/null fehlgeschlagen"
+#: read-cache.c:2400
+#, c-format
+msgid "unable to unlink: %s"
+msgstr "Konnte '%s' nicht entfernen."
 
-#: run-command.c:94
+#: refs.c:620 builtin/merge.c:844
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) fehlgeschlagen"
+msgid "Could not open '%s' for writing"
+msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "Fehler beim Signieren des \"push\"-Zertifikates"
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
+msgstr "Aktualisierungen von Referenzen ist innerhalb der Quarantäne-Umgebung verboten."
 
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr ""
-"die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")"
+#: refs/files-backend.c:1631
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "Konnte Referenz %s nicht entfernen: %s"
 
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n"
-"Versand (\"--signed push\") unterstützt"
+#: refs/files-backend.c:1634
+#, c-format
+msgid "could not delete references: %s"
+msgstr "Konnte Referenzen nicht entfernen: %s"
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")"
+#: refs/files-backend.c:1643
+#, c-format
+msgid "could not remove reference %s"
+msgstr "Konnte Referenz %s nicht löschen"
 
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "die Gegenseite unterstützt keine Push-Optionen"
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "entfernt"
 
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
-"mit 'git add <Pfade>' oder 'git rm <Pfade>'"
+#: ref-filter.c:36
+#, c-format
+msgid "ahead %d"
+msgstr "%d voraus"
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
-"mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
-"'git commit' ein"
+#: ref-filter.c:37
+#, c-format
+msgid "behind %d"
+msgstr "%d hinterher"
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: ref-filter.c:38
 #, c-format
-msgid "Could not write to %s"
-msgstr "Konnte nicht nach %s schreiben"
+msgid "ahead %d, behind %d"
+msgstr "%d voraus, %d hinterher"
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: ref-filter.c:104
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Fehler beim Einpacken von %s."
+msgid "expected format: %%(color:<color>)"
+msgstr "Erwartetes Format: %%(color:<Farbe>)"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr ""
-"Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden."
+#: ref-filter.c:106
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "nicht erkannte Farbe: %%(color:%s)"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Ihre lokalen Änderungen würden durch den Revert überschrieben werden."
+#: ref-filter.c:120
+#, c-format
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "Positiver Wert erwartet refname:lstrip=%s"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr ""
-"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren."
+#: ref-filter.c:124
+#, c-format
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "Positiver Wert erwartet refname:rstrip=%s"
 
-#: sequencer.c:228
+#: ref-filter.c:126
 #, c-format
-msgid "%s: fast-forward"
-msgstr "%s: Vorspulen"
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "nicht erkanntes %%(%s) Argument: %s"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
+#: ref-filter.c:166
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Konnte neue Index-Datei nicht schreiben"
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) akzeptiert keine Argumente"
 
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "Konnte Commit von HEAD nicht auflösen\n"
+#: ref-filter.c:173
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) akzeptiert keine Argumente"
 
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) akzeptiert keine Argumente"
 
-#: sequencer.c:393
+#: ref-filter.c:199
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Konnte Commit %s nicht parsen\n"
+msgid "positive value expected contents:lines=%s"
+msgstr "Positiver Wert erwartet contents:lines=%s"
 
-#: sequencer.c:398
+#: ref-filter.c:201
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Konnte Eltern-Commit %s nicht parsen\n"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "nicht erkanntes %%(contents) Argument: %s"
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "Ihre Index-Datei ist nicht zusammengeführt."
+#: ref-filter.c:214
+#, c-format
+msgid "positive value expected objectname:short=%s"
+msgstr "Positiver Wert erwartet objectname:short=%s"
 
-#: sequencer.c:482
+#: ref-filter.c:218
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Commit %s ist ein Merge, aber die Option -m wurde nicht angegeben."
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "nicht erkanntes %%(objectname) Argument: %s"
 
-#: sequencer.c:490
+#: ref-filter.c:245
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Commit %s hat keinen Elternteil %d"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "Erwartetes Format: %%(align:<Breite>,<Position>)"
 
-#: sequencer.c:494
+#: ref-filter.c:257
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
+msgid "unrecognized position:%s"
+msgstr "nicht erkannte Position:%s"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: ref-filter.c:261
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: kann Eltern-Commit %s nicht parsen"
+msgid "unrecognized width:%s"
+msgstr "nicht erkannte Breite:%s"
 
-#: sequencer.c:511
+#: ref-filter.c:267
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Kann keine Commit-Beschreibung für %s bekommen"
+msgid "unrecognized %%(align) argument: %s"
+msgstr "nicht erkanntes %%(align) Argument: %s"
 
-#: sequencer.c:597
+#: ref-filter.c:271
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen"
+msgid "positive width expected with the %%(align) atom"
+msgstr "Positive Breitenangabe für %%(align) erwartet"
 
-#: sequencer.c:598
+#: ref-filter.c:286
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "Konnte %s... (%s) nicht anwenden"
+msgid "unrecognized %%(if) argument: %s"
+msgstr "nicht erkanntes %%(if) Argument: %s"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "leere Menge von Commits übergeben"
+#: ref-filter.c:371
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "Fehlerhafter Feldname: %.*s"
 
-#: sequencer.c:641
+#: ref-filter.c:397
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: Fehler beim Lesen des Index"
+msgid "unknown field name: %.*s"
+msgstr "Unbekannter Feldname: %.*s"
 
-#: sequencer.c:645
+#: ref-filter.c:501
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: Fehler beim Aktualisieren des Index"
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "format: %%(if) Atom ohne ein %%(then) Atom verwendet"
 
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "Kann Revert nicht während eines anderen Reverts ausführen."
+#: ref-filter.c:561
+#, c-format
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "format: %%(then) Atom ohne ein %%(if) Atom verwendet"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "Kann Revert nicht während eines Cherry-Picks ausführen."
+#: ref-filter.c:563
+#, c-format
+msgid "format: %%(then) atom used more than once"
+msgstr "format: %%(then) Atom mehr als einmal verwendet"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen."
+#: ref-filter.c:565
+#, c-format
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "format: %%(then) Atom nach %%(else) verwendet"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "Kann Cherry-Pick nicht während eines anderen Cherry-Picks ausführen."
+#: ref-filter.c:591
+#, c-format
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "format: %%(else) Atom ohne ein %%(if) Atom verwendet"
 
-#: sequencer.c:732
+#: ref-filter.c:593
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Konnte Zeile %d nicht parsen."
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "Format: %%(else) Atom ohne ein %%(then) Atom verwendet"
 
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "Keine Commits geparst."
+#: ref-filter.c:595
+#, c-format
+msgid "format: %%(else) atom used more than once"
+msgstr "Format: %%(end) Atom mehr als einmal verwendet"
 
-#: sequencer.c:749
+#: ref-filter.c:608
 #, c-format
-msgid "Could not open %s"
-msgstr "Konnte %s nicht öffnen"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "Format: %%(end) Atom ohne zugehöriges Atom verwendet"
 
-#: sequencer.c:753
+#: ref-filter.c:663
 #, c-format
-msgid "Could not read %s."
-msgstr "Konnte %s nicht lesen."
+msgid "malformed format string %s"
+msgstr "Fehlerhafter Formatierungsstring %s"
 
-#: sequencer.c:760
+#: ref-filter.c:1247
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Unbenutzbares Instruktionsblatt: %s"
+msgid "(no branch, rebasing %s)"
+msgstr "(kein Branch, Rebase von Branch %s im Gange)"
 
-#: sequencer.c:790
+#: ref-filter.c:1250
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Ungültiger Schlüssel: %s"
+msgid "(no branch, bisect started on %s)"
+msgstr "(kein Branch, binäre Suche begonnen bei %s)"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Ungültiger Wert für %s: %s"
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD losgelöst bei %s)"
 
-#: sequencer.c:803
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Fehlerhaftes Optionsblatt: %s"
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD losgelöst von %s)"
 
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(kein Branch)"
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
+#: ref-filter.c:1420 ref-filter.c:1451
+#, c-format
+msgid "missing object %s for %s"
+msgstr "Objekt %s fehlt für %s"
 
-#: sequencer.c:827
+#: ref-filter.c:1423 ref-filter.c:1454
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen"
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer bei %s für %s fehlgeschlagen"
 
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
+#: ref-filter.c:1692
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "fehlerhaftes Objekt bei '%s'"
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "kann HEAD nicht auflösen"
+#: ref-filter.c:1759
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "Ignoriere Referenz mit fehlerhaftem Namen %s"
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
+#: ref-filter.c:1764
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "Ignoriere fehlerhafte Referenz %s"
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
+#: ref-filter.c:2028
 #, c-format
-msgid "cannot open %s"
-msgstr "kann '%s' nicht öffnen"
+msgid "format: %%(end) atom missing"
+msgstr "Format: %%(end) Atom fehlt"
 
-#: sequencer.c:888
+#: ref-filter.c:2109
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "Kann %s nicht lesen: %s"
+msgid "malformed object name %s"
+msgstr "Missgebildeter Objektname %s"
 
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "Unerwartetes Dateiende"
+#: remote.c:754
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Kann 'fetch' nicht für sowohl %s als auch %s nach %s ausführen."
 
-#: sequencer.c:895
+#: remote.c:758
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
+msgid "%s usually tracks %s, not %s"
+msgstr "%s folgt üblicherweise %s, nicht %s"
 
-#: sequencer.c:921
+#: remote.c:762
 #, c-format
-msgid "Could not format %s."
-msgstr "Konnte %s nicht formatieren."
+msgid "%s tracks both %s and %s"
+msgstr "%s folgt sowohl %s als auch %s"
+
+#: remote.c:770
+msgid "Internal error"
+msgstr "Interner Fehler"
 
-#: sequencer.c:1066
+#: remote.c:1685 remote.c:1787
+msgid "HEAD does not point to a branch"
+msgstr "HEAD zeigt auf keinen Branch"
+
+#: remote.c:1694
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
+msgid "no such branch: '%s'"
+msgstr "Kein solcher Branch: '%s'"
 
-#: sequencer.c:1069
+#: remote.c:1697
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: ungültiger Commit"
+msgid "no upstream configured for branch '%s'"
+msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
+#: remote.c:1703
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "Upstream-Branch '%s' nicht als Remote-Tracking-Branch gespeichert"
 
-#: setup.c:160
+#: remote.c:1718
 #, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
-"%s: kein solcher Pfad im Arbeitsverzeichnis.\n"
-"Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n"
-"nicht existieren."
+"Ziel für \"push\" '%s' auf Remote-Repository '%s' hat keinen lokal gefolgten "
+"Branch"
 
-#: setup.c:173
+#: remote.c:1730
 #, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"mehrdeutiges Argument '%s': unbekannter Commit oder Pfad existiert nicht\n"
-"im Arbeitsverzeichnis\n"
-"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
-"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
+msgid "branch '%s' has no remote for pushing"
+msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
+
+#: remote.c:1741
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "Push-Refspecs für '%s' beinhalten nicht '%s'"
+
+#: remote.c:1754
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "kein Ziel für \"push\" (push.default ist 'nothing')"
+
+#: remote.c:1776
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "kann einzelnes Ziel für \"push\" im Modus 'simple' nicht auflösen"
 
-#: setup.c:223
+#: remote.c:2081
 #, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
-"mehrdeutiges Argument '%s': sowohl Commit als auch Dateiname\n"
-"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
-"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
+"Ihr Branch basiert auf '%s', aber der Upstream-Branch wurde entfernt.\n"
+
+#: remote.c:2085
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
+#: remote.c:2088
 #, c-format
-msgid "failed to read %s"
-msgstr "Fehler beim Lesen von %s"
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Ihr Branch ist auf dem selben Stand wie '%s'.\n"
 
-#: setup.c:468
+#: remote.c:2092
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden"
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Ihr Branch ist %2$d Commit vor '%1$s'.\n"
+msgstr[1] "Ihr Branch ist %2$d Commits vor '%1$s'.\n"
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "Unbekannte Repository-Erweiterungen gefunden:"
+#: remote.c:2098
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n"
 
-#: setup.c:762
+#: remote.c:2101
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "Kein Git-Repository (oder irgendein Elternverzeichnis): %s"
-
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln"
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"Ihr Branch ist %2$d Commit hinter '%1$s', und kann vorgespult werden.\n"
+msgstr[1] ""
+"Ihr Branch ist %2$d Commits hinter '%1$s', und kann vorgespult werden.\n"
 
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen."
+#: remote.c:2109
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr ""
+"  (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n"
 
-#: setup.c:920
+#: remote.c:2112
 #, c-format
 msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"Ihr Branch und '%s' sind divergiert,\n"
+"und haben jeweils %d und %d unterschiedliche Commits.\n"
+msgstr[1] ""
+"Ihr Branch und '%s' sind divergiert,\n"
+"und haben jeweils %d und %d unterschiedliche Commits.\n"
+
+#: remote.c:2122
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
-"Kein Git-Repository (oder irgendein Elternverzeichnis bis zum Einhängepunkt %s)\n"
-"Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)."
+"  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
+"zusammenzuführen)\n"
 
-#: setup.c:927
-#, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "Kann nicht in Verzeichnis '%s/..' wechseln"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
 
-#: setup.c:989
+#: revision.c:2161
 #, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-"Problem mit Wert für Dateimodus (0%.3o) von core.sharedRepository.\n"
-"Der Besitzer der Dateien muss immer Lese- und Schreibrechte haben."
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "Die Optionen --first-parent und --bisect sind inkompatibel."
+
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "Öffnen von /dev/null fehlgeschlagen"
 
-#: sha1_file.c:2434
+#: run-command.c:127
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "Offset vor Beginn des Pack-Index für %s (beschädigter Index?)"
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) fehlgeschlagen"
 
-#: sha1_file.c:2438
+#: send-pack.c:150
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "Offset hinter Ende des Pack-Index für %s (abgeschnittener Index?)"
+msgid "unable to parse remote unpack status: %s"
+msgstr "Konnte Status des Entpackens der Gegenseite nicht parsen: %s"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+#: send-pack.c:152
+#, c-format
+msgid "remote unpack failed: %s"
+msgstr "Entpacken auf der Gegenseite fehlgeschlagen: %s"
+
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
+msgstr "Fehler beim Signieren des \"push\"-Zertifikates"
+
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
 msgstr ""
-"Git erzeugt normalerweise keine Referenzen die mit\n"
-"40 Hex-Zeichen enden, da diese ignoriert werden wenn\n"
-"Sie diese angeben. Diese Referenzen könnten aus Versehen\n"
-"erzeugt worden sein. Zum Beispiel,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"wobei \"$br\" leer ist und eine 40-Hex-Referenz erzeugt\n"
-"wurde. Bitte prüfen Sie diese Referenzen und löschen\n"
-"Sie sie gegebenenfalls. Unterdrücken Sie diese Meldung\n"
-"indem Sie \"git config advice.objectNameWarning false\"\n"
-"ausführen."
+"die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+#: send-pack.c:430
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"Kann nicht zusammengeführte .gitmodules-Datei nicht ändern, lösen\n"
-"Sie zuerst die Konflikte auf"
+"kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n"
+"Versand (\"--signed push\") unterstützt"
 
-#: submodule.c:68 submodule.c:102
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden"
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
+msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")"
 
-#: submodule.c:76
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
+msgstr "die Gegenseite unterstützt keine Push-Optionen"
 
-#: submodule.c:109
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
+#: sequencer.c:215
+msgid "revert"
+msgstr "Revert"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "Cherry-Pick"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "Negative Werte für submodule.fetchJobs nicht erlaubt"
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "interaktives Rebase"
 
-#: submodule-config.c:358
+#: sequencer.c:221
 #, c-format
-msgid "invalid value for %s"
-msgstr "Ungültiger Wert für %s"
+msgid "Unknown action: %d"
+msgstr "Unbekannte Aktion: %d"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "Ausführen des Anhang-Befehls '%s' fehlgeschlagen"
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
+"mit 'git add <Pfade>' oder 'git rm <Pfade>'"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "unbekannter Wert '%s' für Schlüssel %s"
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
+"mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
+"'git commit' ein"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: sequencer.c:294 sequencer.c:1682
 #, c-format
-msgid "more than one %s"
-msgstr "mehr als ein %s"
+msgid "could not lock '%s'"
+msgstr "Konnte '%s' nicht sperren"
 
-#: trailer.c:582
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "leerer Anhang-Token in Anhang '%.*s'"
+msgid "could not write to '%s'"
+msgstr "Konnte nicht nach '%s' schreiben."
 
-#: trailer.c:702
+#: sequencer.c:301
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "Konnte Eingabe-Datei '%s' nicht lesen"
+msgid "could not write eol to '%s'"
+msgstr "Konnte EOL nicht nach '%s' schreiben."
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "konnte nicht von der Standard-Eingabe lesen"
-
-#: trailer.c:857 builtin/am.c:42
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
 #, c-format
-msgid "could not stat %s"
-msgstr "Konnte '%s' nicht lesen"
+msgid "failed to finalize '%s'."
+msgstr "Fehler beim Fertigstellen von '%s'."
 
-#: trailer.c:859
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "Datei '%s' ist keine reguläre Datei"
+msgid "could not read '%s'"
+msgstr "Konnte '%s' nicht lesen"
 
-#: trailer.c:861
+#: sequencer.c:355
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "Datei %s ist vom Benutzer nicht beschreibbar."
+msgid "your local changes would be overwritten by %s."
+msgstr "Ihre lokalen Änderungen würden durch den %s überschrieben werden."
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "konnte temporäre Datei '%s' nicht öffnen"
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr ""
+"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren."
 
-#: trailer.c:912
+#: sequencer.c:388
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "konnte temporäre Datei nicht zu %s umbenennen"
+msgid "%s: fast-forward"
+msgstr "%s: Vorspulen"
 
-#: transport.c:62
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Würde Upstream-Branch von '%s' zu '%s' von '%s' setzen\n"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Konnte neue Index-Datei nicht schreiben"
 
-#: transport.c:151
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport: ungültige --depth Option '%s'"
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "Konnte HEAD-Commit nicht auflösen\n"
 
-#: transport.c:771
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-"Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n"
-"Remote-Repository gefunden wurden:\n"
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
 
-#: transport.c:775
+#: sequencer.c:592
 #, c-format
 msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
 "\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"  git commit --amend %s\n"
 "\n"
-"or cd to the path and use\n"
+"If they are meant to go into a new commit, run:\n"
 "\n"
-"\tgit push\n"
+"  git commit %s\n"
 "\n"
-"to push them to a remote.\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
+"  git rebase --continue\n"
 msgstr ""
+"Es befinden sich zum Commit vorgemerkte Änderungen in Ihrem "
+"Arbeitsverzeichnis.\n"
+"Wenn diese Änderungen in den vorherigen Commit aufgenommen werden sollen,\n"
+"führen Sie aus:\n"
 "\n"
-"Bitte versuchen Sie\n"
+"  git commit --amend %s\n"
 "\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"Wenn daraus ein neuer Commit erzeugt werden soll, führen Sie aus:\n"
 "\n"
-"oder wechseln Sie in das Verzeichnis und benutzen Sie\n"
+"  git commit %s\n"
 "\n"
-"\tgit push\n"
+"Im Anschluss führen Sie zum Fortfahren aus:\n"
 "\n"
-"zum Versenden zu einem Remote-Repository.\n"
+"  git rebase --continue\n"
+
+#: sequencer.c:694
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "Konnte Commit %s nicht parsen\n"
+
+#: sequencer.c:699
+#, c-format
+msgid "could not parse parent commit %s\n"
+msgstr "Konnte Eltern-Commit %s nicht parsen\n"
+
+#: sequencer.c:821
+#, c-format
+msgid ""
+"unexpected 1st line of squash message:\n"
 "\n"
+"\t%.*s"
+msgstr ""
+"unerwartete erste Zeile der Squash-Beschreibung:\n"
+"\n"
+"\t%.*s"
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "Abbruch."
+#: sequencer.c:827
+#, c-format
+msgid ""
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
+msgstr ""
+"ungültige erste Zeile der Squash-Beschreibung:\n"
+"\n"
+"\t%.*s"
+
+#: sequencer.c:833 sequencer.c:858
+#, c-format
+msgid "This is a combination of %d commits."
+msgstr "Das ist eine Kombination aus %d Commits."
+
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "benötige HEAD für fixup"
+
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "Konnte HEAD nicht lesen"
+
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
+msgstr "Konnte Commit-Beschreibung von HEAD nicht lesen"
+
+#: sequencer.c:852
+#, c-format
+msgid "cannot write '%s'"
+msgstr "kann '%s' nicht schreiben"
+
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "Das ist die erste Commit-Beschreibung:"
 
-#: transport-helper.c:1041
+#: sequencer.c:869
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Konnte Referenz %s nicht lesen."
+msgid "could not read commit message of %s"
+msgstr "Konnte Commit-Beschreibung von %s nicht lesen."
 
-#: unpack-trees.c:64
+#: sequencer.c:876
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
-"überschrieben werden:\n"
-"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches\n"
-"wechseln."
+msgid "This is the commit message #%d:"
+msgstr "Das ist Commit-Beschreibung #%d:"
 
-#: unpack-trees.c:66
+#: sequencer.c:881
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
-"überschrieben werden:\n"
-"%%s"
+msgid "The commit message #%d will be skipped:"
+msgstr "Die Commit-Beschreibung #%d wird ausgelassen:"
 
-#: unpack-trees.c:69
+#: sequencer.c:886
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
-"überschrieben werden:\n"
-"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor sie mergen."
+msgid "unknown command: %d"
+msgstr "Unbekannter Befehl: %d"
 
-#: unpack-trees.c:71
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "Ihre Index-Datei ist nicht zusammengeführt."
+
+#: sequencer.c:970
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
-"überschrieben werden:\n"
-"%%s"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "Commit %s ist ein Merge, aber die Option -m wurde nicht angegeben."
 
-#: unpack-trees.c:74
+#: sequencer.c:978
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden durch %s\n"
-"überschrieben werden:\n"
-"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie %s ausführen."
+msgid "commit %s does not have parent %d"
+msgstr "Commit %s hat keinen Eltern-Commit %d"
 
-#: unpack-trees.c:76
+#: sequencer.c:982
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Ihre lokalen Änderungen würden durch %s überschrieben werden.\n"
-"%%s"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
 
-#: unpack-trees.c:81
+#: sequencer.c:988
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"Durch die Aktualisierung der folgenden Verzeichnisse würden unversionierte\n"
-"Dateien in diesen Verzeichnissen verloren gehen:\n"
-"%s"
+msgid "cannot get commit message for %s"
+msgstr "Kann keine Commit-Beschreibung für %s bekommen."
 
-#: unpack-trees.c:85
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Checkout entfernt werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: kann Eltern-Commit %s nicht parsen"
 
-#: unpack-trees.c:87
+#: sequencer.c:1071 sequencer.c:1827
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Checkout entfernt werden:\n"
-"%%s"
+msgid "could not rename '%s' to '%s'"
+msgstr "Konnte '%s' nicht zu '%s' umbenennen."
 
-#: unpack-trees.c:90
+#: sequencer.c:1122
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Merge entfernt werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor sie mergen."
+msgid "could not revert %s... %s"
+msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen"
 
-#: unpack-trees.c:92
+#: sequencer.c:1123
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Merge entfernt werden:\n"
-"%%s"
+msgid "could not apply %s... %s"
+msgstr "Konnte %s... (%s) nicht anwenden"
+
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "leere Menge von Commits übergeben"
 
-#: unpack-trees.c:95
+#: sequencer.c:1175
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den %s entfernt werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
+msgid "git %s: failed to read the index"
+msgstr "git %s: Fehler beim Lesen des Index"
 
-#: unpack-trees.c:97
+#: sequencer.c:1182
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den %s entfernt werden:\n"
-"%%s"
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: Fehler beim Aktualisieren des Index"
 
-#: unpack-trees.c:102
+#: sequencer.c:1303
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Checkout überschrieben werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
+msgid "invalid line %d: %.*s"
+msgstr "Ungültige Zeile %d: %.*s"
 
-#: unpack-trees.c:104
+#: sequencer.c:1311
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Checkout überschrieben werden:\n"
-"%%s"
+msgid "cannot '%s' without a previous commit"
+msgstr "Kann '%s' nicht ohne vorherigen Commit ausführen"
 
-#: unpack-trees.c:107
+#: sequencer.c:1344
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
+msgid "could not read '%s'."
+msgstr "Konnte '%s' nicht lesen."
+
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Merge überschrieben werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor Sie mergen."
+"Bitte beheben Sie dieses, indem Sie 'git rebase --edit-todo' ausführen."
 
-#: unpack-trees.c:109
+#: sequencer.c:1358
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den Merge überschrieben werden:\n"
-"%%s"
+msgid "unusable instruction sheet: '%s'"
+msgstr "Unbenutzbares Instruktionsblatt: '%s'"
 
-#: unpack-trees.c:112
+#: sequencer.c:1363
+msgid "no commits parsed."
+msgstr "Keine Commits geparst."
+
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
+msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen."
+
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
+msgstr "Kann Revert nicht während eines Cherry-Picks ausführen."
+
+#: sequencer.c:1439
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
-"den %s überschrieben werden:\n"
-"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
+msgid "invalid key: %s"
+msgstr "Ungültiger Schlüssel: %s"
 
-#: unpack-trees.c:114
+#: sequencer.c:1442
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"%s überschrieben werden:\n"
-"%%s"
+msgid "invalid value for %s: %s"
+msgstr "Ungültiger Wert für %s: %s"
 
-#: unpack-trees.c:121
+#: sequencer.c:1499
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "Eintrag '%s' überschneidet sich mit '%s'. Kann nicht verbinden."
+msgid "malformed options sheet: '%s'"
+msgstr "Fehlerhaftes Optionsblatt: '%s'"
+
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
+msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
+
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: unpack-trees.c:124
+#: sequencer.c:1541
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"Kann partiellen Checkout nicht aktualisieren: die folgenden Einträge sind "
-"nicht\n"
-"aktuell:\n"
-"%s"
+msgid "could not create sequencer directory '%s'"
+msgstr "Konnte \"sequencer\"-Verzeichnis '%s' nicht erstellen."
+
+#: sequencer.c:1555
+msgid "could not lock HEAD"
+msgstr "Konnte HEAD nicht sperren"
+
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
+msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
+
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
+msgstr "kann HEAD nicht auflösen"
 
-#: unpack-trees.c:126
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
+msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
+
+#: sequencer.c:1635 builtin/grep.c:910
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Die folgenden Dateien im Arbeitsbereich würden durch die Aktualisierung\n"
-"des partiellen Checkouts überschrieben werden:\n"
-"%s"
+msgid "cannot open '%s'"
+msgstr "kann '%s' nicht öffnen"
 
-#: unpack-trees.c:128
+#: sequencer.c:1637
 #, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Die folgenden Dateien im Arbeitsbereich würden durch die Aktualisierung\n"
-"des partiellen Checkouts entfernt werden:\n"
-"%s"
+msgid "cannot read '%s': %s"
+msgstr "Kann '%s' nicht lesen: %s"
+
+#: sequencer.c:1638
+msgid "unexpected end of file"
+msgstr "Unerwartetes Dateiende"
 
-#: unpack-trees.c:205
+#: sequencer.c:1644
 #, c-format
-msgid "Aborting\n"
-msgstr "Abbruch\n"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
 
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Checke Dateien aus"
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr ""
+"Sie scheinen HEAD verschoben zu haben. Keine Zurücksetzung, prüfen Sie HEAD."
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt"
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
+msgstr "Kann HEAD nicht lesen"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:1832 builtin/difftool.c:616
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "ungültige Escape-Sequenz %XX"
-
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "fehlender Host und Schema ist nicht 'file:'"
+msgid "could not copy '%s' to '%s'"
+msgstr "Konnte '%s' nicht nach '%s' kopieren."
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "eine 'file:' URL darf keine Portnummer enthalten"
+#: sequencer.c:1848
+msgid "could not read index"
+msgstr "Konnte den Index nicht lesen."
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "Hostname enthält ungültige Zeichen"
+#: sequencer.c:1853
+#, c-format
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"Ausführung fehlgeschlagen: %s\n"
+"%sSie können das Problem beheben, und dann\n"
+"\n"
+"\tgit rebase --continue\n"
+"\n"
+"ausführen.\n"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "ungültige Portnummer"
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "Der Index und/oder das Arbeitsverzeichnis wurde geändert.\n"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "ungültiges '..' Pfadsegment"
+#: sequencer.c:1865
+#, c-format
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"Ausführung erfolgreich: %s\n"
+"Aber Änderungen in Index oder Arbeitsverzeichnis verblieben.\n"
+"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\".\n"
+"Führen Sie dann aus:\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#: worktree.c:282
+#: sequencer.c:1920 git-rebase.sh:169
 #, c-format
-msgid "failed to read '%s'"
-msgstr "Fehler beim Lesen von '%s'"
+msgid "Applied autostash."
+msgstr "Automatischen Stash angewendet."
 
-#: wrapper.c:222 wrapper.c:392
+#: sequencer.c:1932
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
+msgid "cannot store %s"
+msgstr "kann %s nicht speichern"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: sequencer.c:1934 git-rebase.sh:173
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"Anwendung des automatischen Stash resultierte in Konflikten.\n"
+"Ihre Änderungen sind im Stash sicher.\n"
+"Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: sequencer.c:2016
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "Konnte '%s' nicht zum Lesen öffnen."
+msgid "Stopped at %s...  %.*s\n"
+msgstr "Angehalten bei %s... %.*s\n"
 
-#: wrapper.c:605 wrapper.c:626
+#: sequencer.c:2058
 #, c-format
-msgid "unable to access '%s'"
-msgstr "konnte nicht auf '%s' zugreifen"
+msgid "unknown command %d"
+msgstr "Unbekannter Befehl %d"
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
+#: sequencer.c:2088
+msgid "could not read orig-head"
+msgstr "Konnte orig-head nicht lesen."
 
-#: wrapper.c:658
-#, c-format
-msgid "could not write to %s"
-msgstr "Konnte nicht nach '%s' schreiben."
+#: sequencer.c:2092
+msgid "could not read 'onto'"
+msgstr "Konnte 'onto' nicht lesen."
 
-#: wrapper.c:660
+#: sequencer.c:2099
 #, c-format
-msgid "could not close %s"
-msgstr "Konnte '%s' nicht schließen."
-
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Nicht zusammengeführte Pfade:"
+msgid "could not update %s"
+msgstr "Konnte %s nicht aktualisieren."
 
-#: wt-status.c:177 wt-status.c:204
+#: sequencer.c:2106
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr ""
-"  (benutzen Sie \"git reset %s <Datei>...\" zum Entfernen aus der Staging-"
-"Area)"
+msgid "could not update HEAD to %s"
+msgstr "Konnte HEAD nicht auf %s aktualisieren."
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
 msgstr ""
-"  (benutzen Sie \"git rm --cached <Datei>...\" zum Entfernen aus der Staging-"
-"Area)"
+"Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit\n"
+"vorgemerkt sind."
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "Konnte CHERRY_PICK_HEAD nicht löschen."
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung entsprechend zu "
-"markieren)"
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
+msgstr "Kann nicht existierenden Commit nicht nachbessern."
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
+#: sequencer.c:2206
+#, c-format
+msgid "invalid file: '%s'"
+msgstr "Ungültige Datei: '%s'"
+
+#: sequencer.c:2208
+#, c-format
+msgid "invalid contents: '%s'"
+msgstr "Ungültige Inhalte: '%s'"
+
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
+"\n"
+"Sie haben nicht committete Änderungen in Ihrem Arbeitsverzeichnis. Bitte\n"
+"committen Sie diese zuerst und führen Sie dann 'git rebase --continue'\n"
+"erneut aus."
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "zum Commit vorgemerkte Änderungen:"
+#: sequencer.c:2221
+msgid "could not commit staged changes."
+msgstr "Konnte Änderungen aus der Staging-Area nicht committen."
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:"
+#: sequencer.c:2301
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-"  (benutzen Sie \"git add <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
+#: sequencer.c:2305
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: ungültiger Commit"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
+msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
 
-#: wt-status.c:223
+#: setup.c:165
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 msgstr ""
-"  (benutzen Sie \"git checkout -- <Datei>...\", um die Änderungen im "
-"Arbeitsverzeichnis zu verwerfen)"
+"%s: kein solcher Pfad im Arbeitsverzeichnis.\n"
+"Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n"
+"nicht existieren."
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: setup.c:178
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"  (committen oder verwerfen Sie den unversionierten oder geänderten Inhalt "
-"in den Submodulen)"
+"mehrdeutiges Argument '%s': unbekannter Commit oder Pfad existiert nicht\n"
+"im Arbeitsverzeichnis\n"
+"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
+"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
 
-#: wt-status.c:237
+#: setup.c:228
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"  (benutzen Sie \"git %s <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
-
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "beide gelöscht:"
-
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "von uns hinzugefügt:"
+"mehrdeutiges Argument '%s': sowohl Commit als auch Dateiname\n"
+"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
+"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "von denen gelöscht:"
+#: setup.c:475
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "von denen hinzugefügt:"
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "Unbekannte Repository-Erweiterungen gefunden:"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "von uns gelöscht:"
+#: setup.c:776
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Kein Git-Repository (oder irgendein Elternverzeichnis): %s"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "von beiden hinzugefügt:"
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "von beiden geändert:"
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen."
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "neue Datei:"
+#: setup.c:1022 setup.c:1028
+#, c-format
+msgid "Cannot change to '%s'"
+msgstr "Kann nicht nach '%s' wechseln."
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "kopiert:"
+#: setup.c:1041
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Kein Git-Repository (oder irgendein Elternverzeichnis bis zum Einhängepunkt "
+"%s)\n"
+"Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)."
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "gelöscht:"
+#: setup.c:1106
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Problem mit Wert für Dateimodus (0%.3o) von core.sharedRepository.\n"
+"Der Besitzer der Dateien muss immer Lese- und Schreibrechte haben."
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "geändert:"
+#: sha1_file.c:559
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "Pfad '%s' existiert nicht"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "umbenannt:"
+#: sha1_file.c:585
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"Referenziertes Repository '%s' wird noch nicht als verknüpftes\n"
+"Arbeitsverzeichnis unterstützt."
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "Typänderung:"
+#: sha1_file.c:591
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "unbekannt:"
+#: sha1_file.c:597
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr ""
+"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "nicht gemerged:"
+#: sha1_file.c:605
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr ""
+"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
+"eingehängt."
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "neue Commits, "
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "geänderter Inhalt, "
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "Offset vor Beginn des Pack-Index für %s (beschädigter Index?)"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "unversionierter Inhalt, "
+#: sha1_file.c:2725
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "Offset hinter Ende des Pack-Index für %s (abgeschnittener Index?)"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Submodule geändert, aber nicht aktualisiert:"
+#: sha1_name.c:409
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "Kurzer SHA-1 %s ist mehrdeutig."
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Änderungen in Submodul zum Committen:"
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "Die Kandidaten sind:"
 
-#: wt-status.c:839
+#: sha1_name.c:580
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
 msgstr ""
-"Ändern Sie nicht die obige Zeile.\n"
-"Alles unterhalb von ihr wird entfernt."
-
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Sie haben nicht zusammengeführte Pfade."
-
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
-
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)"
-
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
-
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
+"Git erzeugt normalerweise keine Referenzen die mit\n"
+"40 Hex-Zeichen enden, da diese ignoriert werden wenn\n"
+"Sie diese angeben. Diese Referenzen könnten aus Versehen\n"
+"erzeugt worden sein. Zum Beispiel,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"wobei \"$br\" leer ist und eine 40-Hex-Referenz erzeugt\n"
+"wurde. Bitte prüfen Sie diese Referenzen und löschen\n"
+"Sie sie gegebenenfalls. Unterdrücken Sie diese Meldung\n"
+"indem Sie \"git config advice.objectNameWarning false\"\n"
+"ausführen."
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Eine \"am\"-Sitzung ist im Gange."
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"Kann nicht zusammengeführte .gitmodules-Datei nicht ändern, lösen\n"
+"Sie zuerst die Konflikte auf"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "Der aktuelle Patch ist leer."
+#: submodule.c:71 submodule.c:105
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
+#: submodule.c:79
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
+#: submodule.c:112
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
-"wiederherzustellen)"
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "Keine Befehle ausgeführt."
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "Negative Werte für submodule.fetchJobs nicht erlaubt"
 
-#: wt-status.c:1112
+#: submodule.c:1194
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Zuletzt ausgeführter Befehl (%d Befehl ausgeführt):"
-msgstr[1] "Zuletzt ausgeführte Befehle (%d Befehle ausgeführt):"
+msgid "'%s' not recognized as a git repository"
+msgstr "'%s' nicht als Git-Repository erkannt"
 
-#: wt-status.c:1123
+#: submodule.c:1332
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (mehr Informationen in Datei %s)"
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "Konnte 'git status' in Submodul '%s' nicht starten."
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "Keine Befehle verbleibend."
+#: submodule.c:1345
+#, c-format
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "Konnte 'git status' in Submodul '%s' nicht ausführen."
 
-#: wt-status.c:1131
+#: submodule.c:1421
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Nächster auszuführender Befehl (%d Befehle verbleibend):"
-msgstr[1] "Nächste auszuführende Befehle (%d Befehle verbleibend):"
+msgid "submodule '%s' has dirty index"
+msgstr "Submodul '%s' hat einen geänderten Index."
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)"
+#: submodule.c:1678
+#, c-format
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr ""
+"relocate_gitdir für Submodul '%s' mit mehr als einem Arbeitsverzeichnis\n"
+"wird nicht unterstützt"
 
-#: wt-status.c:1152
+#: submodule.c:1690 submodule.c:1746
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
+msgid "could not lookup name for submodule '%s'"
+msgstr "konnte Name für Submodul '%s' nicht nachschlagen"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Sie sind gerade beim Rebase."
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
+#: submodule.c:1697
+#, c-format
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
 msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
-"aus)"
+"Migriere Git-Verzeichnis von '%s%s' von\n"
+"'%s' nach\n"
+"'%s'\n"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
+#: submodule.c:1781
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "Fehler bei Rekursion in Submodul-Pfad '%s'"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-"  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
-"auszuchecken)"
+#: submodule.c:1825
+msgid "could not start ls-files in .."
+msgstr "Konnte 'ls-files' nicht in .. starten"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "FEHLER: zurückgegebene Zeichenkette für Pfad entspricht nicht cwd?"
 
-#: wt-status.c:1185
+#: submodule.c:1864
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
-"'%s' im Gange ist."
+msgid "ls-tree returned unexpected return code %d"
+msgstr "ls-tree mit unerwartetem Rückgabewert %d beendet"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
+#: submodule-config.c:380
+#, c-format
+msgid "invalid value for %s"
+msgstr "Ungültiger Wert für %s"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-"  (Sobald Ihr Arbeitsverzeichnis unverändert ist, führen Sie \"git rebase --"
-"continue\" aus)"
+#: trailer.c:240
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "Ausführen des Anhang-Befehls '%s' fehlgeschlagen"
 
-#: wt-status.c:1197
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf "
-"'%s'."
+msgid "unknown value '%s' for key '%s'"
+msgstr "unbekannter Wert '%s' für Schlüssel %s"
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Sie editieren gerade einen Commit während eines Rebase."
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "mehr als ein %s"
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-"  (benutzen Sie \"git commit --amend\", um den aktuellen Commit "
-"nachzubessern)"
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "leerer Anhang-Token in Anhang '%.*s'"
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-"  (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
-"abgeschlossen sind)"
+#: trailer.c:722
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "Konnte Eingabe-Datei '%s' nicht lesen"
+
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "konnte nicht von der Standard-Eingabe lesen"
 
-#: wt-status.c:1217
+#: trailer.c:949 builtin/am.c:44
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
+msgid "could not stat %s"
+msgstr "Konnte '%s' nicht lesen"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
-"\" aus)"
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "Datei '%s' ist keine reguläre Datei"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
+#: trailer.c:953
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "Datei %s ist vom Benutzer nicht beschreibbar."
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-"  (benutzen Sie \"git cherry-pick --abort\", um die Cherry-Pick-Operation "
-"abzubrechen)"
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "konnte temporäre Datei '%s' nicht öffnen"
 
-#: wt-status.c:1236
+#: trailer.c:1001
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Sie sind gerade an einem Revert von Commit '%s'."
+msgid "could not rename temporary file to %s"
+msgstr "konnte temporäre Datei nicht zu %s umbenennen"
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
-"aus)"
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Würde Upstream-Branch von '%s' zu '%s' von '%s' setzen\n"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: ungültige --depth Option '%s'"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
 msgstr ""
-"  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
+"Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n"
+"Remote-Repository gefunden wurden:\n"
 
-#: wt-status.c:1257
+#: transport.c:893
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'."
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Bitte versuchen Sie\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"oder wechseln Sie in das Verzeichnis und benutzen Sie\n"
+"\n"
+"\tgit push\n"
+"\n"
+"zum Versenden zu einem Remote-Repository.\n"
+"\n"
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Sie sind gerade bei einer binären Suche."
+#: transport.c:901
+msgid "Aborting."
+msgstr "Abbruch."
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr ""
-"  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
-"zurückzukehren)"
+#: transport-helper.c:1080
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Konnte Referenz %s nicht lesen."
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "Auf Branch "
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "zu kurzes Tree-Objekt"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "interaktives Rebase im Gange; auf "
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "fehlerhafter Modus in Tree-Eintrag"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "Rebase im Gange; auf "
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "leerer Dateiname in Tree-Eintrag"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD losgelöst bei "
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "zu kurze Tree-Datei"
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD losgelöst von "
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
+"überschrieben werden:\n"
+"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches\n"
+"wechseln."
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Im Moment auf keinem Branch."
+#: unpack-trees.c:106
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
+"überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Initialer Commit"
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"überschrieben werden:\n"
+"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor sie mergen."
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Unversionierte Dateien"
+#: unpack-trees.c:111
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Ignorierte Dateien"
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"Ihre lokalen Änderungen in den folgenden Dateien würden durch %s\n"
+"überschrieben werden:\n"
+"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie %s ausführen."
 
-#: wt-status.c:1520
+#: unpack-trees.c:116
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"Es dauerte %.2f Sekunden die unversionierten Dateien zu bestimmen.\n"
-"'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
-"neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
+"Ihre lokalen Änderungen würden durch %s überschrieben werden.\n"
+"%%s"
 
-#: wt-status.c:1526
+#: unpack-trees.c:121
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Unversionierte Dateien nicht aufgelistet%s"
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Keine Änderungen"
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
+msgstr ""
+"Durch die Aktualisierung der folgenden Verzeichnisse würden unversionierte\n"
+"Dateien in diesen Verzeichnissen verloren gehen:\n"
+"%s"
 
-#: wt-status.c:1539
+#: unpack-trees.c:125
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
-"keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
-"\"git commit -a\")\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Checkout entfernt werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
 
-#: wt-status.c:1542
+#: unpack-trees.c:127
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "keine Änderungen zum Commit vorgemerkt\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"Checkout entfernt werden:\n"
+"%%s"
 
-#: wt-status.c:1545
+#: unpack-trees.c:130
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
 msgstr ""
-"nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien (benutzen "
-"Sie \"git add\" zum Versionieren)\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge entfernt werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor sie mergen."
 
-#: wt-status.c:1548
+#: unpack-trees.c:132
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"Merge entfernt werden:\n"
+"%%s"
 
-#: wt-status.c:1551
+#: unpack-trees.c:135
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
 msgstr ""
-"nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git "
-"add\" zum Versionieren)\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s entfernt werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:137
 #, c-format
-msgid "nothing to commit\n"
-msgstr "nichts zu committen\n"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s entfernt werden:\n"
+"%%s"
 
-#: wt-status.c:1557
+#: unpack-trees.c:142
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
-"nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien "
-"anzuzeigen)\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Checkout überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
 
-#: wt-status.c:1561
+#: unpack-trees.c:144
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
-
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Initialer Commit auf "
-
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (kein Branch)"
-
-#: wt-status.c:1701
-msgid "gone"
-msgstr "entfernt"
-
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "hinterher "
-
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "voraus "
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"Checkout überschrieben werden:\n"
+"%%s"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: unpack-trees.c:147
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "Konnte '%s' nicht entfernen."
-
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..."
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor Sie mergen."
 
-#: builtin/add.c:65
+#: unpack-trees.c:149
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "unerwarteter Differenz-Status %c"
-
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "Aktualisierung der Dateien fehlgeschlagen"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge überschrieben werden:\n"
+"%%s"
 
-#: builtin/add.c:81
+#: unpack-trees.c:152
 #, c-format
-msgid "remove '%s'\n"
-msgstr "lösche '%s'\n"
-
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
 msgstr ""
-"Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Konnte den Index nicht lesen"
+#: unpack-trees.c:154
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"%s überschrieben werden:\n"
+"%%s"
 
-#: builtin/add.c:207
+#: unpack-trees.c:161
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Eintrag '%s' überschneidet sich mit '%s'. Kann nicht verbinden."
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "Konnte Patch nicht schreiben"
+#: unpack-trees.c:164
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"Kann partiellen Checkout nicht aktualisieren: die folgenden Einträge sind "
+"nicht\n"
+"aktuell:\n"
+"%s"
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "Bearbeitung des Patches fehlgeschlagen"
+#: unpack-trees.c:166
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Die folgenden Dateien im Arbeitsverzeichnis würden durch die Aktualisierung\n"
+"über einen partiellen Checkout überschrieben werden:\n"
+"%s"
 
-#: builtin/add.c:217
+#: unpack-trees.c:168
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Konnte Verzeichnis '%s' nicht lesen"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Die folgenden Dateien im Arbeitsverzeichnis würden durch die Aktualisierung\n"
+"über einen partiellen Checkout entfernt werden:\n"
+"%s"
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "Leerer Patch. Abgebrochen."
+#: unpack-trees.c:170
+#, c-format
+msgid ""
+"Cannot update submodule:\n"
+"%s"
+msgstr ""
+"Kann Submodul nicht aktualisieren:\n"
+"%s"
 
-#: builtin/add.c:224
+#: unpack-trees.c:247
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Konnte '%s' nicht anwenden."
+msgid "Aborting\n"
+msgstr "Abbruch\n"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
+#: unpack-trees.c:272
+#, c-format
+msgid "submodule update strategy not supported for submodule '%s'"
 msgstr ""
-"Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
-"ignoriert:\n"
+"Strategie zur Aktualisierung von Submodulen für Submodul '%s' nicht "
+"unterstützt."
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "Probelauf"
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "Checke Dateien aus"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "erweiterte Ausgaben"
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "interaktives Auswählen"
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "ungültige Escape-Sequenz %XX"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "Blöcke interaktiv auswählen"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "fehlender Host und Schema ist nicht 'file:'"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "aktuelle Unterschiede editieren und anwenden"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "eine 'file:' URL darf keine Portnummer enthalten"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "Hostname enthält ungültige Zeichen"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "versionierte Dateien aktualisieren"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "ungültige Portnummer"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "nur speichern, dass der Pfad später hinzugefügt werden soll"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "ungültiges '..' Pfadsegment"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr ""
-"Änderungen von allen versionierten und unversionierten Dateien hinzufügen"
+#: worktree.c:285
+#, c-format
+msgid "failed to read '%s'"
+msgstr "Fehler beim Lesen von '%s'"
+
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
+
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "gelöschte Pfade im Arbeitsverzeichnis ignorieren (genau wie --no-all)"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "Konnte '%s' nicht zum Lesen öffnen."
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "nichts hinzufügen, nur den Index aktualisieren"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
+msgstr "konnte nicht auf '%s' zugreifen"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-"Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden "
-"konnten"
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden"
+#: wrapper.c:634
+#, c-format
+msgid "could not write to %s"
+msgstr "Konnte nicht nach '%s' schreiben."
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: wrapper.c:636
+#, c-format
+msgid "could not close %s"
+msgstr "Konnte '%s' nicht schließen."
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Nicht zusammengeführte Pfade:"
 
-#: builtin/add.c:292
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr ""
+"  (benutzen Sie \"git reset %s <Datei>...\" zum Entfernen aus der Staging-"
+"Area)"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "Hinzufügen von Dateien fehlgeschlagen"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr ""
+"  (benutzen Sie \"git rm --cached <Datei>...\" zum Entfernen aus der Staging-"
+"Area)"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr ""
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
-"Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung entsprechend zu "
+"markieren)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr ""
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "zum Commit vorgemerkte Änderungen:"
 
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Meinten Sie vielleicht 'git add .'?\n"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "Index-Datei beschädigt"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr ""
+"  (benutzen Sie \"git add <Datei>...\", um die Änderungen zum Commit "
+"vorzumerken)"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "Konnte neue Index-Datei nicht schreiben."
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr ""
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Änderungen zum Commit "
+"vorzumerken)"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "Konnte '%s' nicht lesen"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (benutzen Sie \"git checkout -- <Datei>...\", um die Änderungen im "
+"Arbeitsverzeichnis zu verwerfen)"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "konnte Autor-Skript nicht parsen"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (committen oder verwerfen Sie den unversionierten oder geänderten Inhalt "
+"in den Submodulen)"
 
-#: builtin/am.c:503
+#: wt-status.c:238
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' wurde durch den applypatch-msg Hook entfernt"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr ""
+"  (benutzen Sie \"git %s <Datei>...\", um die Änderungen zum Commit "
+"vorzumerken)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Fehlerhafte Eingabezeile: '%s'."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "beide gelöscht:"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "von uns hinzugefügt:"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "\"fseek\" fehlgeschlagen"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "von denen gelöscht:"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "konnte Patch '%s' nicht parsen"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "von denen hinzugefügt:"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "von uns gelöscht:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "ungültiger Zeitstempel"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "von beiden hinzugefügt:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "Ungültige \"Date\"-Zeile"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "von beiden geändert:"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "Ungültiger Offset in der Zeitzone"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "neue Datei:"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Patch-Formaterkennung fehlgeschlagen."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "kopiert:"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "gelöscht:"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Fehler beim Aufteilen der Patches."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "geändert:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "Konnte Index-Datei nicht schreiben."
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "umbenannt:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr ""
-"Wenn Sie das Problem aufgelöst haben, führen Sie \"%s --continue\" aus."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "Typänderung:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-"Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --skip"
-"\" aus."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "unbekannt:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-"Um den ursprünglichen Branch wiederherzustellen und die Anwendung der "
-"Patches abzubrechen, führen Sie \"%s --abort\" aus."
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "nicht gemerged:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Patch ist leer. War dessen Aufteilung falsch?"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "neue Commits, "
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "Ungültige Identifikationszeile: %s"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "geänderter Inhalt, "
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "Konnte Commit '%s' nicht parsen."
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "unversionierter Inhalt, "
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge "
-"zurückzufallen."
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "Submodule geändert, aber nicht aktualisiert:"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-"Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis "
-"nachzustellen ..."
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "Änderungen in Submodul zum Committen:"
 
-#: builtin/am.c:1623
+#: wt-status.c:914
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
-"Haben Sie den Patch per Hand editiert?\n"
-"Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden."
+"Ändern Sie nicht die obige Zeile.\n"
+"Alles unterhalb von ihr wird entfernt."
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Falle zurück zum Patchen der Basis und zum 3-Wege-Merge ..."
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "Sie haben nicht zusammengeführte Pfade."
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "Merge der Änderungen fehlgeschlagen."
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "auf leere Historie anwenden"
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "Fehler beim Schreiben des Commit-Objektes."
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "Kann nicht fortsetzen: %s existiert nicht"
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "Eine \"am\"-Sitzung ist im Gange."
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "Der aktuelle Patch ist leer."
+
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr ""
-"Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
-"Terminal verbunden ist."
+"  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "Commit-Beschreibung ist:"
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr ""
+"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
+"wiederherzustellen)"
+
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "git-rebase-todo fehlt."
+
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "Keine Befehle ausgeführt."
 
-#: builtin/am.c:1816
+#: wt-status.c:1194
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Zuletzt ausgeführter Befehl (%d Befehl ausgeführt):"
+msgstr[1] "Zuletzt ausgeführte Befehle (%d Befehle ausgeführt):"
 
-#: builtin/am.c:1853 builtin/am.c:1925
+#: wt-status.c:1205
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Wende an: %.*s"
+msgid "  (see more in file %s)"
+msgstr "  (mehr Informationen in Datei %s)"
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Keine Änderungen -- Patches bereits angewendet."
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "Keine Befehle verbleibend."
 
-#: builtin/am.c:1877
+#: wt-status.c:1213
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Nächster auszuführender Befehl (%d Befehle verbleibend):"
+msgstr[1] "Nächste auszuführende Befehle (%d Befehle verbleibend):"
+
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)"
 
-#: builtin/am.c:1883
+#: wt-status.c:1234
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "Die Kopie des fehlgeschlagenen Patches befindet sich in: %s"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
 
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Keine Änderungen - haben Sie vergessen 'git add' zu benutzen?\n"
-"Wenn keine Änderungen mehr zum Commit vorzumerken sind, könnten\n"
-"diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n"
-"auslassen."
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "Sie sind gerade beim Rebase."
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
-"Sie haben immer noch nicht zusammengeführte Pfade im Index.\n"
-"Haben Sie vergessen 'git add' zu benutzen?"
-
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr "Konnte Objekt '%s' nicht parsen."
+"  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
+"aus)"
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "Fehler beim Bereinigen des Index"
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
-"Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
-"Keine Zurücksetzung zu ORIG_HEAD."
+"  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
+"auszuchecken)"
 
-#: builtin/am.c:2192
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
+
+#: wt-status.c:1267
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Ungültiger Wert für --patch-format: %s"
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
+"'%s' im Gange ist."
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<Optionen>] [(<mbox>|<E-Mail-Verzeichnis>)...]"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<Optionen>] (--continue | --skip | --abort)"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Sobald Ihr Arbeitsverzeichnis unverändert ist, führen Sie \"git rebase --"
+"continue\" aus)"
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "interaktiv ausführen"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf "
+"'%s'."
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "historische Option -- kein Effekt"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr "Sie editieren gerade einen Commit während eines Rebase."
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr ""
+"  (benutzen Sie \"git commit --amend\", um den aktuellen Commit "
+"nachzubessern)"
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "weniger Ausgaben"
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
+"abgeschlossen sind)"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "der Commit-Beschreibung eine Signed-off-by Zeile hinzufügen"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "nach UTF-8 umkodieren (Standard)"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr ""
+"  (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
+"\" aus)"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "-k an git-mailinfo übergeben"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "-b an git-mailinfo übergeben"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (benutzen Sie \"git cherry-pick --abort\", um die Cherry-Pick-Operation "
+"abzubrechen)"
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "-m an git-mailinfo übergeben"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Sie sind gerade an einem Revert von Commit '%s'."
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "--keep-cr an git-mailsplit für mbox-Format übergeben"
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr ""
+"  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
+"aus)"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "kein --keep-cr an git-mailsplit übergeben, unabhängig von am.keepcr"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "alles vor einer Scheren-Zeile entfernen"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr ""
+"  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "Aktion"
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'."
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "an git-apply übergeben"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "Sie sind gerade bei einer binären Suche."
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "Wurzelverzeichnis"
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr ""
+"  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
+"zurückzukehren)"
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "Pfad"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "Auf Branch "
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "Anzahl"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "interaktives Rebase im Gange; auf "
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "Anzahl"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "Rebase im Gange; auf "
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "Format"
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "HEAD losgelöst bei "
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "Patch-Format"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "HEAD losgelöst von "
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben"
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "Im Moment auf keinem Branch."
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen"
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "Initialer Commit"
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "Synonyme für --continue"
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "Unversionierte Dateien"
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "den aktuellen Patch auslassen"
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "Ignorierte Dateien"
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
+#: wt-status.c:1599
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
 msgstr ""
-"ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
-
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "Autor-Datum als Commit-Datum verwenden"
-
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
+"Es dauerte %.2f Sekunden die unversionierten Dateien zu bestimmen.\n"
+"'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
+"neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "GPG-Schlüsselkennung"
+#: wt-status.c:1605
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Unversionierte Dateien nicht aufgelistet%s"
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "Commits mit GPG signieren"
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(intern für git-rebase verwendet)"
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "Keine Änderungen"
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+#: wt-status.c:1618
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
-"Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
-"entfernt. Bitte verwenden Sie diese nicht mehr."
-
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "Fehler beim Lesen des Index"
+"keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
+"\"git commit -a\")\n"
 
-#: builtin/am.c:2348
+#: wt-status.c:1621
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben."
+msgid "no changes added to commit\n"
+msgstr "keine Änderungen zum Commit vorgemerkt\n"
 
-#: builtin/am.c:2372
+#: wt-status.c:1624
 #, c-format
 msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
-"Stray %s Verzeichnis gefunden.\n"
-"Benutzen Sie \"git am --abort\", um es zu entfernen."
-
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
-
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<Optionen>] [<Patch>...]"
+"nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
+"(benutzen Sie \"git add\" zum Versionieren)\n"
 
-#: builtin/apply.c:153
+#: wt-status.c:1627
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "nicht erkannte Whitespace-Option: '%s'"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
 
-#: builtin/apply.c:169
+#: wt-status.c:1630
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen\n"
+"Sie \"git add\" zum Versionieren)\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
+msgid "nothing to commit\n"
+msgstr "nichts zu committen\n"
 
-#: builtin/apply.c:863
+#: wt-status.c:1636
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien "
+"anzuzeigen)\n"
 
-#: builtin/apply.c:947
+#: wt-status.c:1640
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
+msgid "nothing to commit, working tree clean\n"
+msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: builtin/apply.c:984
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-"git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile "
-"%d"
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "Initialer Commit auf "
+
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD (kein Branch)"
+
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "hinterher "
 
-#: builtin/apply.c:989
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "voraus "
+
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgid "cannot %s: You have unstaged changes."
 msgstr ""
-"git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d"
+"%s nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
+
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
+msgstr "Zusätzlich enthält die Staging-Area nicht committete Änderungen."
 
-#: builtin/apply.c:990
+#: wt-status.c:2288
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgid "cannot %s: Your index contains uncommitted changes."
 msgstr ""
-"git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d"
+"%s nicht möglich: Die Staging-Area enthält nicht committete Änderungen."
 
-#: builtin/apply.c:995
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d"
+msgid "failed to unlink '%s'"
+msgstr "Konnte '%s' nicht entfernen."
 
-#: builtin/apply.c:1489
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: unerwartete Zeile: %.*s"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..."
 
-#: builtin/apply.c:1550
+#: builtin/add.c:80
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s"
+msgid "unexpected diff status %c"
+msgstr "unerwarteter Differenz-Status %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "Aktualisierung der Dateien fehlgeschlagen"
 
-#: builtin/apply.c:1567
+#: builtin/add.c:95
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
-"%d vorangestellter Teil des Pfades entfernt wird (Zeile %d)"
-msgstr[1] ""
-"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
-"%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)"
+msgid "remove '%s'\n"
+msgstr "lösche '%s'\n"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "neue Datei hängt von alten Inhalten ab"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr ""
+"Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "entfernte Datei hat noch Inhalte"
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "Konnte den Index nicht lesen"
 
-#: builtin/apply.c:1774
+#: builtin/add.c:220
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "fehlerhafter Patch bei Zeile %d"
+msgid "Could not open '%s' for writing."
+msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "neue Datei %s hängt von alten Inhalten ab"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Konnte Patch nicht schreiben"
 
-#: builtin/apply.c:1812
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "entfernte Datei %s hat noch Inhalte"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "Bearbeitung des Patches fehlgeschlagen"
 
-#: builtin/apply.c:1815
+#: builtin/add.c:230
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
+msgid "Could not stat '%s'"
+msgstr "Konnte Verzeichnis '%s' nicht lesen"
 
-#: builtin/apply.c:1962
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Leerer Patch. Abgebrochen."
 
-#: builtin/apply.c:1999
+#: builtin/add.c:237
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "nicht erkannter Binär-Patch bei Zeile %d"
+msgid "Could not apply '%s'"
+msgstr "Konnte '%s' nicht anwenden."
 
-#: builtin/apply.c:2154
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr ""
+"Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
+"ignoriert:\n"
 
-#: builtin/apply.c:2244
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "konnte symbolische Verknüpfung %s nicht lesen"
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "Probelauf"
 
-#: builtin/apply.c:2248
-#, c-format
-msgid "unable to open or read %s"
-msgstr "konnte %s nicht öffnen oder lesen"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "interaktives Auswählen"
 
-#: builtin/apply.c:2901
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "Ungültiger Zeilenanfang: '%c'"
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "Blöcke interaktiv auswählen"
 
-#: builtin/apply.c:3020
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeile versetzt)"
-msgstr[1] ""
-"Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "aktuelle Unterschiede editieren und anwenden"
 
-#: builtin/apply.c:3032
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben"
 
-#: builtin/apply.c:3038
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "versionierte Dateien aktualisieren"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "nur speichern, dass der Pfad später hinzugefügt werden soll"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
 msgstr ""
-"bei der Suche nach:\n"
-"%.*s"
+"Änderungen von allen versionierten und unversionierten Dateien hinzufügen"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "gelöschte Pfade im Arbeitsverzeichnis ignorieren (genau wie --no-all)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "nichts hinzufügen, nur den Index aktualisieren"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr ""
+"Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden "
+"konnten"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden"
 
-#: builtin/apply.c:3060
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben"
+
+#: builtin/add.c:305
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "keine Daten in Binär-Patch für '%s'"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "Hinzufügen von Dateien fehlgeschlagen"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
 
-#: builtin/apply.c:3163
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr ""
+"Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
+
+#: builtin/add.c:359
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
 
-#: builtin/apply.c:3169
+#: builtin/add.c:374
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
-#: builtin/apply.c:3190
+#: builtin/add.c:375
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Meinten Sie vielleicht 'git add .'?\n"
+
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "Index-Datei beschädigt"
 
-#: builtin/apply.c:3314
+#: builtin/am.c:412
+msgid "could not parse author script"
+msgstr "konnte Autor-Skript nicht parsen"
+
+#: builtin/am.c:489
 #, c-format
-msgid "cannot checkout %s"
-msgstr "kann %s nicht auschecken"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' wurde durch den applypatch-msg Hook entfernt"
 
-#: builtin/apply.c:3370
+#: builtin/am.c:530
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "'%s' ist hinter einer symbolischen Verknüpfung"
+msgid "Malformed input line: '%s'."
+msgstr "Fehlerhafte Eingabezeile: '%s'."
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
+#: builtin/am.c:567
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "Pfad %s wurde umbenannt/gelöscht"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
+
+#: builtin/am.c:593
+msgid "fseek failed"
+msgstr "\"fseek\" fehlgeschlagen"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
+#: builtin/am.c:777
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s ist nicht im Index"
+msgid "could not parse patch '%s'"
+msgstr "konnte Patch '%s' nicht parsen"
+
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
+
+#: builtin/am.c:889
+msgid "invalid timestamp"
+msgstr "ungültiger Zeitstempel"
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
+msgstr "Ungültige \"Date\"-Zeile"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
-#, c-format
-msgid "%s: does not match index"
-msgstr "%s entspricht nicht der Version im Index"
+#: builtin/am.c:897
+msgid "invalid timezone offset"
+msgstr "Ungültiger Offset in der Zeitzone"
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "Lösch-Patch hinterlässt Dateiinhalte"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
+msgstr "Patch-Formaterkennung fehlgeschlagen."
 
-#: builtin/apply.c:3669
+#: builtin/am.c:991 builtin/clone.c:397
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: falscher Typ"
+msgid "failed to create directory '%s'"
+msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
 
-#: builtin/apply.c:3671
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s ist vom Typ %o, erwartete %o"
+#: builtin/am.c:995
+msgid "Failed to split patches."
+msgstr "Fehler beim Aufteilen der Patches."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
-#, c-format
-msgid "invalid path '%s'"
-msgstr "Ungültiger Pfad '%s'"
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "Konnte Index-Datei nicht schreiben."
 
-#: builtin/apply.c:3879
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s ist bereits bereitgestellt"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr ""
+"Wenn Sie das Problem aufgelöst haben, führen Sie \"%s --continue\" aus."
 
-#: builtin/apply.c:3882
+#: builtin/am.c:1179
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s existiert bereits im Arbeitsverzeichnis"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr ""
+"Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --skip"
+"\" aus."
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1180
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"Um den ursprünglichen Branch wiederherzustellen und die Anwendung der "
+"Patches abzubrechen, führen Sie \"%s --abort\" aus."
 
-#: builtin/apply.c:3907
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s"
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Patch ist leer. War dessen Aufteilung falsch?"
 
-#: builtin/apply.c:3927
+#: builtin/am.c:1386 builtin/log.c:1557
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung"
+msgid "invalid ident line: %s"
+msgstr "Ungültige Identifikationszeile: %s"
 
-#: builtin/apply.c:3931
+#: builtin/am.c:1413
 #, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: Patch konnte nicht angewendet werden"
+msgid "unable to parse commit %s"
+msgstr "Konnte Commit '%s' nicht parsen."
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "Prüfe Patch %s ..."
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge "
+"zurückzufallen."
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
+msgstr ""
+"Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis "
+"nachzustellen ..."
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "konnte %s nicht aus dem Index entfernen"
+#: builtin/am.c:1627
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Haben Sie den Patch per Hand editiert?\n"
+"Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden."
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "fehlerhafter Patch für Submodul %s"
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Falle zurück zum Patchen der Basis und zum 3-Wege-Merge ..."
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "konnte neu erstellte Datei '%s' nicht lesen"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
+msgstr "Merge der Änderungen fehlgeschlagen."
 
-#: builtin/apply.c:4224
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen"
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
+#: builtin/am.c:1689
+msgid "applying to an empty history"
+msgstr "auf leere Historie anwenden"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "schließe Datei '%s'"
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "Fehler beim Schreiben des Commit-Objektes."
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1735 builtin/am.c:1739
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
+msgid "cannot resume: %s does not exist."
+msgstr "Kann nicht fortsetzen: %s existiert nicht"
 
-#: builtin/apply.c:4403
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Patch %s sauber angewendet"
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
+"Terminal verbunden ist."
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "interner Fehler"
+#: builtin/am.c:1760
+msgid "Commit Body is:"
+msgstr "Commit-Beschreibung ist:"
 
-#: builtin/apply.c:4414
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..."
-msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..."
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1820
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)"
 
-#: builtin/apply.c:4432
+#: builtin/am.c:1860 builtin/am.c:1932
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "Kann %s nicht öffnen: %s"
+msgid "Applying: %.*s"
+msgstr "Wende an: %.*s"
 
-#: builtin/apply.c:4445
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Patch-Bereich #%d sauber angewendet."
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
+msgstr "Keine Änderungen -- Patches bereits angewendet."
 
-#: builtin/apply.c:4448
+#: builtin/am.c:1884
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Patch-Block #%d zurückgewiesen."
+msgid "Patch failed at %s %.*s"
+msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s"
 
-#: builtin/apply.c:4537
+#: builtin/am.c:1890
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "Patch '%s' ausgelassen."
-
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "nicht erkannte Eingabe"
-
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "Konnte Index-Datei nicht lesen"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "Die Kopie des fehlgeschlagenen Patches befindet sich in: %s"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
 msgstr ""
-"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
+"Keine Änderungen - haben Sie vergessen 'git add' zu benutzen?\n"
+"Wenn keine Änderungen mehr zum Commit vorzumerken sind, könnten\n"
+"diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n"
+"auslassen."
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
 msgstr ""
-"Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
+"Sie haben immer noch nicht zusammengeführte Pfade im Index.\n"
+"Haben Sie vergessen 'git add' zu benutzen?"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
+msgstr "Konnte Objekt '%s' nicht parsen."
+
+#: builtin/am.c:2102
+msgid "failed to clean index"
+msgstr "Fehler beim Bereinigen des Index"
+
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
 msgstr ""
-"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
+"Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
+"Keine Zurücksetzung zu ORIG_HEAD."
 
-#: builtin/apply.c:4745
+#: builtin/am.c:2199
 #, c-format
-msgid "can't open patch '%s'"
-msgstr "kann Patch '%s' nicht öffnen"
+msgid "Invalid value for --patch-format: %s"
+msgstr "Ungültiger Wert für --patch-format: %s"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "unterdrückte %d Whitespace-Fehler"
-msgstr[1] "unterdrückte %d Whitespace-Fehler"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<Optionen>] [(<mbox> | <E-Mail-Verzeichnis>)...]"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d Zeile fügt Whitespace-Fehler hinzu."
-msgstr[1] "%d Zeilen fügen Whitespace-Fehler hinzu."
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<Optionen>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "keine Änderungen im angegebenen Pfad anwenden"
+#: builtin/am.c:2239
+msgid "run interactively"
+msgstr "interaktiv ausführen"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "Änderungen nur im angegebenen Pfad anwenden"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
+msgstr "historische Option -- kein Effekt"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-"<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden "
-"entfernen"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
+msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "hinzugefügte Zeilen des Patches ignorieren"
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "weniger Ausgaben"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-"anstatt der Anwendung des Patches, den \"diffstat\" für die Eingabe "
-"ausgegeben"
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
+msgstr "der Commit-Beschreibung eine Signed-off-by Zeile hinzufügen"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-"die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation anzeigen"
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
+msgstr "nach UTF-8 umkodieren (Standard)"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-"anstatt der Anwendung des Patches, eine Zusammenfassung für die Eingabe "
-"ausgeben"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
+msgstr "-k an git-mailinfo übergeben"
+
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
+msgstr "-b an git-mailinfo übergeben"
+
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
+msgstr "-m an git-mailinfo übergeben"
+
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "--keep-cr an git-mailsplit für mbox-Format übergeben"
+
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr "kein --keep-cr an git-mailsplit übergeben, unabhängig von am.keepcr"
+
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
+msgstr "alles vor einer Scheren-Zeile entfernen"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-"anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
+msgstr "an git-apply übergeben"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-"sicherstellen, dass der Patch mit dem aktuellen Index angewendet werden kann"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "Anzahl"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "Format"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-"Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
+msgstr "Patch-Format"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)"
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
+msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "versuche 3-Wege-Merge, wenn der Patch nicht angewendet werden konnte"
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
+msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-"einen temporären Index, basierend auf den integrierten Index-Informationen, "
-"erstellen"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
+msgstr "Synonyme für --continue"
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "Pfade sind getrennt durch NUL Zeichen"
+#: builtin/am.c:2303
+msgid "skip the current patch"
+msgstr "den aktuellen Patch auslassen"
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
 msgstr ""
-"sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
+"ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln"
+#: builtin/am.c:2310
+msgid "lie about committer date"
+msgstr "Autor-Datum als Commit-Datum verwenden"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
+msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "den Patch in umgekehrter Reihenfolge anwenden"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "GPG-Schlüsselkennung"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "keinen Kontext erwarten"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
+msgstr "Commits mit GPG signieren"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
+msgstr "(intern für git-rebase verwendet)"
+
+#: builtin/am.c:2333
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
 msgstr ""
-"zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen"
+"Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
+"entfernt. Bitte verwenden Sie diese nicht mehr."
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "sich überlappende Patch-Blöcke erlauben"
+#: builtin/am.c:2340
+msgid "failed to read the index"
+msgstr "Fehler beim Lesen des Index"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren"
+#: builtin/am.c:2355
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen"
+#: builtin/am.c:2379
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Stray %s Verzeichnis gefunden.\n"
+"Benutzen Sie \"git am --abort\", um es zu entfernen."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "<Wurzelverzeichnis> vor alle Dateinamen stellen"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
+
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<Optionen>] [<Patch>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4134,11 +5251,6 @@ msgstr "git archive: habe ACK/NAK erwartet, aber EOF bekommen"
 msgid "git archive: NACK %s"
 msgstr "git archive: NACK %s"
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "Fehler am anderen Ende: %s"
-
 #: builtin/archive.c:64
 msgid "git archive: protocol error"
 msgstr "git archive: Protokollfehler"
@@ -4167,119 +5279,171 @@ msgstr "git blame [<Optionen>] [<rev-opts>] [<Commit>] [--] <Datei>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-opts> sind dokumentiert in git-rev-list(1)"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1777
 msgid "Blaming lines"
 msgstr "Verarbeite Zeilen"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2573
 msgid "Show blame entries as we find them, incrementally"
 msgstr "\"blame\"-Einträge schrittweise anzeigen, während wir sie generieren"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2574
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "leere SHA-1 für Grenz-Commits anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2575
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Ursprungs-Commit nicht als Grenzen behandeln (Standard: aus)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2576
 msgid "Show work cost statistics"
 msgstr "Statistiken zum Arbeitsaufwand anzeigen"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2577
 msgid "Force progress reporting"
 msgstr "Fortschrittsanzeige erzwingen"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2578
 msgid "Show output score for blame entries"
 msgstr "Ausgabebewertung für \"blame\"-Einträge anzeigen"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2579
 msgid "Show original filename (Default: auto)"
 msgstr "ursprünglichen Dateinamen anzeigen (Standard: auto)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2580
 msgid "Show original linenumber (Default: off)"
 msgstr "ursprüngliche Zeilennummer anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2581
 msgid "Show in a format designed for machine consumption"
 msgstr "Anzeige in einem Format für maschinelle Auswertung"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2582
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2583
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Den gleichen Ausgabemodus benutzen wie \"git-annotate\" (Standard: aus)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2584
 msgid "Show raw timestamp (Default: off)"
 msgstr "Unbearbeiteten Zeitstempel anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2585
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Langen Commit-SHA1 anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2586
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Den Namen des Autors und den Zeitstempel unterdrücken (Standard: aus)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2587
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Anstatt des Namens die E-Mail-Adresse des Autors anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2588
 msgid "Ignore whitespace differences"
 msgstr "Unterschiede im Whitespace ignorieren"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr ""
+"eine experimentelle Heuristik zur Verbesserung der Darstellung\n"
+"von Unterschieden verwenden"
+
+#: builtin/blame.c:2597
 msgid "Spend extra cycles to find better match"
 msgstr "Länger arbeiten, um bessere Übereinstimmungen zu finden"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2598
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Commits von <Datei> benutzen, anstatt \"git-rev-list\" aufzurufen"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2599
 msgid "Use <file>'s contents as the final image"
 msgstr "Inhalte der <Datei>en als endgültiges Abbild benutzen"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2600 builtin/blame.c:2601
 msgid "score"
 msgstr "Bewertung"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2600
 msgid "Find line copies within and across files"
 msgstr "kopierte Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2601
 msgid "Find line movements within and across files"
 msgstr "verschobene Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "Process only line range n,m, counting from 1"
 msgstr "nur Zeilen im Bereich n,m verarbeiten, gezählt von 1"
 
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"--progress kann nicht mit --incremental oder Formaten für Fremdprogramme\n"
+"verwendet werden"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2697
 msgid "4 years, 11 months ago"
 msgstr "vor 4 Jahren, und 11 Monaten"
 
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents und --reverse funktionieren gemeinsam nicht."
+
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr ""
+"kann --contents nicht mit endgültigem Namen des Commit-Objektes benutzen"
+
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse und --first-parent zusammen erfordern die Angabe eines "
+"endgültigen\n"
+"Commits"
+
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse und --first-parent zusammen erfordern einen Bereich entlang der\n"
+"\"first-parent\"-Kette"
+
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
+msgstr "Pfad %s nicht in %s"
+
+#: builtin/blame.c:2851
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "kann Blob %s für Pfad '%s' nicht lesen"
+
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "Datei %s hat nur %lu Zeile"
+msgstr[1] "Datei %s hat nur %lu Zeilen"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<Optionen>] [-r | -a] [--merged | --no-merged]"
@@ -4300,7 +5464,11 @@ msgstr "git branch [<Optionen>] (-m | -M) [<alter-Branch>] <neuer-Branch>"
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<Optionen>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:143
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [<Optionen>] [-r | -a] [--format]"
+
+#: builtin/branch.c:144
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -4309,7 +5477,7 @@ msgstr ""
 "entferne Branch '%s', der zusammengeführt wurde mit\n"
 "         '%s', aber noch nicht mit HEAD zusammengeführt wurde."
 
-#: builtin/branch.c:147
+#: builtin/branch.c:148
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -4318,12 +5486,12 @@ msgstr ""
 "entferne Branch '%s' nicht, der noch nicht zusammengeführt wurde mit\n"
 "         '%s', obwohl er mit HEAD zusammengeführt wurde."
 
-#: builtin/branch.c:161
+#: builtin/branch.c:162
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Konnte Commit-Objekt für '%s' nicht nachschlagen."
 
-#: builtin/branch.c:165
+#: builtin/branch.c:166
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -4333,166 +5501,94 @@ msgstr ""
 "Wenn Sie sicher sind diesen Branch zu entfernen, führen Sie 'git branch -D "
 "%s' aus."
 
-#: builtin/branch.c:178
+#: builtin/branch.c:179
 msgid "Update of config-file failed"
 msgstr "Aktualisierung der Konfigurationsdatei fehlgeschlagen."
 
-#: builtin/branch.c:206
+#: builtin/branch.c:210
 msgid "cannot use -a with -d"
 msgstr "kann -a nicht mit -d benutzen"
 
-#: builtin/branch.c:212
+#: builtin/branch.c:216
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Konnte Commit-Objekt für HEAD nicht nachschlagen."
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Kann Branch '%s' nicht entfernen, ausgecheckt in '%s'."
 
-#: builtin/branch.c:241
+#: builtin/branch.c:245
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "Remote-Tracking-Branch '%s' nicht gefunden"
 
-#: builtin/branch.c:242
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "Branch '%s' nicht gefunden."
 
-#: builtin/branch.c:257
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Fehler beim Entfernen des Remote-Tracking-Branches '%s'"
 
-#: builtin/branch.c:258
+#: builtin/branch.c:262
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Fehler beim Entfernen des Branches '%s'"
 
-#: builtin/branch.c:265
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Remote-Tracking-Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:270
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: entfernt]"
-
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
-
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: %d hinterher]"
-
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
-msgstr "[%d hinterher]"
-
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: %d voraus]"
-
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
-msgstr "[%d voraus]"
-
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: %d voraus, %d hinterher]"
-
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[%d voraus, %d hinterher]"
-
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
-msgstr " **** ungültige Referenz ****"
-
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(kein Branch, Rebase von Branch %s im Gange)"
-
-#: builtin/branch.c:378
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(kein Branch, binäre Suche begonnen bei %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD losgelöst bei %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD losgelöst von %s)"
-
-#: builtin/branch.c:393
-msgid "(no branch)"
-msgstr "(kein Branch)"
-
-#: builtin/branch.c:544
+#: builtin/branch.c:441
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Branch %s wird auf %s umgesetzt"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:445
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Binäre Suche von Branch %s zu %s im Gange"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:460
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "Kann aktuellen Branch nicht umbenennen, solange Sie sich auf keinem befinden."
 
-#: builtin/branch.c:573
+#: builtin/branch.c:470
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Ungültiger Branchname: '%s'"
 
-#: builtin/branch.c:590
+#: builtin/branch.c:487
 msgid "Branch rename failed"
 msgstr "Umbenennung des Branches fehlgeschlagen"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:490
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "falsch benannten Branch '%s' umbenannt"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:493
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Branch umbenannt zu %s, aber HEAD ist nicht aktualisiert!"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:502
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "Branch ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist "
 "fehlgeschlagen."
 
-#: builtin/branch.c:620
+#: builtin/branch.c:518
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4503,160 +5599,177 @@ msgstr ""
 "  %s\n"
 "Zeilen, die mit '%c' beginnen, werden entfernt.\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:551
 msgid "Generic options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:553
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "Hash und Betreff anzeigen; -vv: zusätzlich Upstream-Branch"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:554
 msgid "suppress informational messages"
 msgstr "Informationsmeldungen unterdrücken"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:555
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "den Übernahmemodus einstellen (siehe git-pull(1))"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:557
 msgid "change upstream info"
 msgstr "Informationen zum Upstream-Branch ändern"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "upstream"
 msgstr "Upstream"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "change the upstream info"
 msgstr "Informationen zum Upstream-Branch ändern"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "Informationen zum Upstream-Branch entfernen"
+
+#: builtin/branch.c:561
 msgid "use colored output"
 msgstr "farbige Ausgaben verwenden"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:562
 msgid "act on remote-tracking branches"
 msgstr "auf Remote-Tracking-Branches wirken"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:564 builtin/branch.c:566
 msgid "print only branches that contain the commit"
-msgstr "nur Branches ausgeben, welche diesen Commit beinhalten"
+msgstr "nur Branches ausgeben, die diesen Commit enthalten"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "nur Branches ausgeben, die diesen Commit nicht enthalten"
+
+#: builtin/branch.c:570
 msgid "Specific git-branch actions:"
 msgstr "spezifische Aktionen für \"git-branch\":"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:571
 msgid "list both remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches auflisten"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:573
 msgid "delete fully merged branch"
 msgstr "vollständig zusammengeführten Branch entfernen"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:574
 msgid "delete branch (even if not merged)"
 msgstr "Branch löschen (auch wenn nicht zusammengeführt)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:575
 msgid "move/rename a branch and its reflog"
 msgstr "einen Branch und dessen Reflog verschieben/umbenennen"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:576
 msgid "move/rename a branch, even if target exists"
 msgstr ""
 "einen Branch verschieben/umbenennen, auch wenn das Ziel bereits existiert"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:577
 msgid "list branch names"
 msgstr "Branchnamen auflisten"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:578
 msgid "create the branch's reflog"
 msgstr "das Reflog des Branches erzeugen"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:580
 msgid "edit the description for the branch"
 msgstr "die Beschreibung für den Branch bearbeiten"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:581
 msgid "force creation, move/rename, deletion"
 msgstr "Erstellung, Verschiebung/Umbenennung oder Löschung erzwingen"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:582
 msgid "print only branches that are merged"
 msgstr "nur zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:583
 msgid "print only branches that are not merged"
 msgstr "nur nicht zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:584
 msgid "list branches in columns"
 msgstr "Branches in Spalten auflisten"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
 msgid "key"
 msgstr "Schüssel"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
 msgid "field name to sort on"
 msgstr "sortiere nach diesem Feld"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
 msgid "object"
 msgstr "Objekt"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:589
 msgid "print only branches of the object"
 msgstr "nur Branches von diesem Objekt ausgeben"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "Sortierung und Filterung sind unabhängig von Groß- und Kleinschreibung"
+
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "für die Ausgabe zu verwendendes Format"
+
+#: builtin/branch.c:611
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Konnte HEAD nicht als gültige Referenz auflösen."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:615 builtin/clone.c:724
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD wurde nicht unter \"refs/heads\" gefunden!"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:638
 msgid "--column and --verbose are incompatible"
 msgstr "Die Optionen --column und --verbose sind inkompatibel."
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:649 builtin/branch.c:701
 msgid "branch name required"
 msgstr "Branchname erforderlich"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:677
 msgid "Cannot give description to detached HEAD"
 msgstr "zu losgelöstem HEAD kann keine Beschreibung hinterlegt werden"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:682
 msgid "cannot edit description of more than one branch"
 msgstr "Beschreibung von mehr als einem Branch kann nicht bearbeitet werden"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:689
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Noch kein Commit in Branch '%s'."
 
-#: builtin/branch.c:773
+#: builtin/branch.c:692
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Branch '%s' nicht vorhanden."
 
-#: builtin/branch.c:788
+#: builtin/branch.c:707
 msgid "too many branches for a rename operation"
 msgstr "zu viele Branches für eine Umbenennen-Operation angegeben"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:712
 msgid "too many branches to set new upstream"
 msgstr "zu viele Branches angegeben, um Upstream-Branch zu setzen"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:716
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -4664,43 +5777,43 @@ msgstr ""
 "Konnte keinen neuen Upstream-Branch von HEAD zu %s setzen, da dieser auf\n"
 "keinen Branch zeigt."
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
 msgid "no such branch '%s'"
 msgstr "Kein solcher Branch '%s'"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:723
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Branch '%s' existiert nicht"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:735
 msgid "too many branches to unset upstream"
 msgstr ""
 "zu viele Branches angegeben, um Konfiguration zu Upstream-Branch zu entfernen"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:739
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "Konnte Konfiguration zu Upstream-Branch von HEAD nicht entfernen, da dieser\n"
 "auf keinen Branch zeigt."
 
-#: builtin/branch.c:826
+#: builtin/branch.c:745
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:759
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "'HEAD' darf nicht manuell erstellt werden"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:765
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "Die Optionen -a und -r bei 'git branch' können nicht gemeimsam mit einem "
 "Branchnamen verwendet werden."
 
-#: builtin/branch.c:849
+#: builtin/branch.c:768
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4709,7 +5822,7 @@ msgstr ""
 "Die --set-upstream Option ist veraltet und wird entfernt. Benutzen Sie --"
 "track oder --set-upstream-to\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:785
 #, c-format
 msgid ""
 "\n"
@@ -4720,81 +5833,97 @@ msgstr ""
 "Wenn Sie wollten, dass '%s' den Branch '%s' als Upstream-Branch hat, führen "
 "Sie aus:\n"
 
-#: builtin/bundle.c:51
+#: builtin/bundle.c:45
 #, c-format
 msgid "%s is okay\n"
 msgstr "%s ist in Ordnung\n"
 
-#: builtin/bundle.c:64
+#: builtin/bundle.c:58
 msgid "Need a repository to create a bundle."
 msgstr "Um ein Paket zu erstellen wird ein Repository benötigt."
 
-#: builtin/bundle.c:68
+#: builtin/bundle.c:62
 msgid "Need a repository to unbundle."
 msgstr "Zum Entpacken wird ein Repository benötigt."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<Art>|--textconv) <Objekt>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <Art> | --textconv | --filters) [--path=<Pfad>] <Objekt>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<Art> kann sein: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "Objektart anzeigen"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "Objektgröße anzeigen"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "mit Rückgabewert 0 beenden, wenn kein Fehler aufgetreten ist"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "ansprechende Anzeige des Objektinhaltes"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "eine Textkonvertierung auf den Inhalt von Blob-Objekten ausführen"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "für Blob-Objekte, Filter auf Objekt-Inhalte ausführen"
+
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "Blob"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "einen bestimmten Pfad für --textconv/--filters verwenden"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "-s und -t mit beschädigten Objekten erlauben"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "Ausgabe von --batch puffern"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "Anzeige von Informationen und Inhalt von Objekten, gelesen von der Standard-"
 "Eingabe"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr ""
 "Anzeige von Informationen über Objekte, gelesen von der Standard-Eingabe"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "symbolischen Verknüpfungen innerhalb des Repositories folgen (verwendet mit "
 "--batch oder --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "alle Objekte mit --batch oder --batch-check anzeigen"
 
@@ -4814,7 +5943,7 @@ msgstr "alle Attribute einer Datei ausgeben"
 msgid "use .gitattributes only from the index"
 msgstr "nur .gitattributes vom Index verwenden"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "Dateinamen von der Standard-Eingabe lesen"
 
@@ -4822,7 +5951,7 @@ msgstr "Dateinamen von der Standard-Eingabe lesen"
 msgid "terminate input and output records by a NUL character"
 msgstr "Einträge von Ein- und Ausgabe mit NUL-Zeichen abschließen"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
 msgid "suppress progress reporting"
 msgstr "Fortschrittsanzeige unterdrücken"
 
@@ -4915,9 +6044,9 @@ msgid "write the content to temporary files"
 msgstr "den Inhalt in temporäre Dateien schreiben"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
 msgid "string"
 msgstr "Zeichenkette"
 
@@ -4930,114 +6059,114 @@ msgstr ""
 msgid "copy out the files from named stage"
 msgstr "Dateien von dem benannten Stand kopieren"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:27
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [<Optionen>] <Branch>"
 
-#: builtin/checkout.c:26
+#: builtin/checkout.c:28
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<Optionen>] [<Branch>] -- <Datei>..."
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/checkout.c:153 builtin/checkout.c:186
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "Pfad '%s' hat nicht unsere Version."
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:155 builtin/checkout.c:188
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "Pfad '%s' hat nicht deren Version."
 
-#: builtin/checkout.c:152
+#: builtin/checkout.c:171
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "Pfad '%s' hat nicht alle notwendigen Versionen."
 
-#: builtin/checkout.c:196
+#: builtin/checkout.c:215
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "Pfad '%s' hat nicht die notwendigen Versionen."
 
-#: builtin/checkout.c:213
+#: builtin/checkout.c:232
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "Pfad '%s': kann nicht zusammenführen"
 
-#: builtin/checkout.c:230
+#: builtin/checkout.c:249
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Konnte Merge-Ergebnis von '%s' nicht hinzufügen."
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' kann nicht mit der Aktualisierung von Pfaden verwendet werden"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:281 builtin/checkout.c:284
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:287
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Kann nicht gleichzeitig Pfade aktualisieren und zu Branch '%s' wechseln"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:513
 msgid "you need to resolve your current index first"
 msgstr "Sie müssen zuerst die Konflikte in Ihrem aktuellen Index auflösen."
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:644
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Kann \"reflog\" für '%s' nicht durchführen: %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:685
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:689 builtin/clone.c:678
 msgid "unable to update HEAD"
 msgstr "Konnte HEAD nicht aktualisieren."
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:693
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:696
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:700
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Zu umgesetztem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:702 builtin/checkout.c:1090
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Zu neuem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:704
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Zu Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:755
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -5060,7 +6189,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:780
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -5087,152 +6216,152 @@ msgstr[1] ""
 " git branch <neuer-Branchname> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:816
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:820
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:847 builtin/checkout.c:1085
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch geboren wird"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:991
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1031 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1060
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1099
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1126
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
 msgid "branch"
 msgstr "Branch"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1160
 msgid "create and checkout a new branch"
 msgstr "einen neuen Branch erzeugen und auschecken"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1162
 msgid "create/reset and checkout a branch"
 msgstr "einen Branch erstellen/umsetzen und auschecken"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1163
 msgid "create reflog for new branch"
 msgstr "das Reflog für den neuen Branch erzeugen"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1164 builtin/worktree.c:333
 msgid "detach HEAD at named commit"
 msgstr "HEAD bei benanntem Commit loslösen"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1165
 msgid "set upstream info for new branch"
 msgstr "Informationen zum Upstream-Branch für den neuen Branch setzen"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1168
 msgid "checkout our version for unmerged files"
 msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1170
 msgid "checkout their version for unmerged files"
 msgstr "ihre Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1172
 msgid "force checkout (throw away local modifications)"
 msgstr "Auschecken erzwingen (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1173
 msgid "perform a 3-way merge with the new branch"
 msgstr "einen 3-Wege-Merge mit dem neuen Branch ausführen"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1174 builtin/merge.c:234
 msgid "update ignored files (default)"
 msgstr "ignorierte Dateien aktualisieren (Standard)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1176
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1179
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "keine Einschränkung bei Pfadspezifikationen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1181
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "second guess 'git checkout <no-such-branch>'"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1183
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "Prüfung, ob die Referenz bereits in einem anderen Arbeitsverzeichnis "
 "ausgecheckt wurde, deaktivieren"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
 msgid "force progress reporting"
 msgstr "Fortschrittsanzeige erzwingen"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1224
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus."
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1241
 msgid "--track needs a branch name"
 msgstr "Bei der Option --track muss ein Branchname angegeben werden."
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1246
 msgid "Missing branch name; try -b"
 msgstr "Vermisse Branchnamen; versuchen Sie -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1282
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1289
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5242,12 +6371,12 @@ msgstr ""
 "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst "
 "werden kann?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1294
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach nimmt kein Pfad-Argument '%s'"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1298
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5286,19 +6415,21 @@ msgstr "Würde Repository %s überspringen\n"
 msgid "failed to remove %s"
 msgstr "Fehler beim Löschen von %s"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
 "Eingabehilfe:\n"
 "1          - nummeriertes Element auswählen\n"
 "foo        - Element anhand eines eindeutigen Präfix auswählen\n"
-"           - (leer) nichts auswählen"
+"           - (leer) nichts auswählen\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:301 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5307,7 +6438,7 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
 "Eingabehilfe:\n"
 "1          - einzelnes Element auswählen\n"
@@ -5316,38 +6447,40 @@ msgstr ""
 "foo        - Element anhand eines eindeutigen Präfix auswählen\n"
 "-...       - angegebenes Element abwählen\n"
 "*          - alle Elemente auswählen\n"
-"           - (leer) Auswahl beenden"
+"           - (leer) Auswahl beenden\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "Wie bitte (%s)?"
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "Wie bitte (%s)?\n"
 
-#: builtin/clean.c:653
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ignorier-Muster eingeben>> "
 
-#: builtin/clean.c:690
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "WARNUNG: Kann keine Einträge finden die Muster entsprechen: %s"
 
-#: builtin/clean.c:711
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Wählen Sie Einträge zum Löschen"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/clean.c:758
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "'%s' löschen [y/N]? "
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Tschüss."
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "Tschüss.\n"
 
-#: builtin/clean.c:785
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -5365,62 +6498,63 @@ msgstr ""
 "help                - diese Meldung anzeigen\n"
 "?                   - Hilfe zur Auswahl mittels Eingabe anzeigen"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:818 git-add--interactive.perl:1736
 msgid "*** Commands ***"
 msgstr "*** Befehle ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:819 git-add--interactive.perl:1733
 msgid "What now"
 msgstr "Was nun"
 
-#: builtin/clean.c:821
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Würde das folgende Element entfernen:"
 msgstr[1] "Würde die folgenden Elemente entfernen:"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Keine Dateien mehr zum Löschen, beende."
 
-#: builtin/clean.c:869
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "keine Namen von gelöschten Dateien ausgeben"
 
-#: builtin/clean.c:871
+#: builtin/clean.c:877
 msgid "force"
 msgstr "Aktion erzwingen"
 
-#: builtin/clean.c:872
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "interaktives Clean"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "ganze Verzeichnisse löschen"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "Muster"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "<Muster> zu den Regeln für ignorierte Pfade hinzufügen"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "auch ignorierte Dateien löschen"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "nur ignorierte Dateien löschen"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
 
-#: builtin/clean.c:901
+#: builtin/clean.c:907
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -5428,7 +6562,7 @@ msgstr ""
 "clean.requireForce auf \"true\" gesetzt und weder -i, -n noch -f gegeben; "
 "\"clean\" verweigert"
 
-#: builtin/clean.c:904
+#: builtin/clean.c:910
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -5440,113 +6574,140 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<Optionen>] [--] <Repository> [<Verzeichnis>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:80
 msgid "don't create a checkout"
 msgstr "kein Auschecken"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "ein Bare-Repository erstellen"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:85
 msgid "create a mirror repository (implies bare)"
 msgstr "ein Spiegelarchiv erstellen (impliziert --bare)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:87
 msgid "to clone from a local repository"
 msgstr "von einem lokalen Repository klonen"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:89
 msgid "don't use local hardlinks, always copy"
 msgstr "lokal keine harten Verweise verwenden, immer Kopien"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:91
 msgid "setup as shared repository"
 msgstr "als verteiltes Repository einrichten"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "Pfadspezifikation"
+
+#: builtin/clone.c:93 builtin/clone.c:97
 msgid "initialize submodules in the clone"
 msgstr "Submodule im Klon initialisieren"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:100
 msgid "number of submodules cloned in parallel"
 msgstr "Anzahl der parallel zu klonenden Submodule"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:101 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "Vorlagenverzeichnis"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:102 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
 msgid "reference repository"
 msgstr "Repository referenzieren"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:108
 msgid "use --reference only while cloning"
 msgstr "--reference nur während des Klonens benutzen"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
 msgid "name"
 msgstr "Name"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:110
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "<Name> statt 'origin' für Upstream-Repository verwenden"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:112
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "<Branch> auschecken, anstatt HEAD des Remote-Repositories"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:114
 msgid "path to git-upload-pack on the remote"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "Tiefe"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:116
 msgid "create a shallow clone of that depth"
 msgstr ""
 "einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe erstellen"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "Zeit"
+
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr ""
+"einen Klon mit unvollständiger Historie (shallow) seit einer bestimmten "
+"Zeit\n"
+"erstellen"
+
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "Commit"
+
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr ""
+"die Historie eines Klons mit unvollständiger Historie (shallow) mittels\n"
+"Ausschluss eines Commits vertiefen"
+
+#: builtin/clone.c:122
 msgid "clone only one branch, HEAD or --branch"
 msgstr "nur einen Branch klonen, HEAD oder --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:124
 msgid "any cloned submodules will be shallow"
 msgstr "jedes geklonte Submodul mit unvollständiger Historie (shallow)"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:125 builtin/init-db.c:484
 msgid "gitdir"
 msgstr ".git-Verzeichnis"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:126 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "Git-Verzeichnis vom Arbeitsverzeichnis separieren"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:127
 msgid "key=value"
 msgstr "Schlüssel=Wert"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:128
 msgid "set config inside the new repository"
 msgstr "Konfiguration innerhalb des neuen Repositories setzen"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
 msgid "use IPv4 addresses only"
 msgstr "nur IPv4-Adressen benutzen"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
 msgid "use IPv6 addresses only"
 msgstr "nur IPv6-Adressen benutzen"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:268
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5554,62 +6715,42 @@ msgstr ""
 "Konnte keinen Verzeichnisnamen erraten.\n"
 "Bitte geben Sie ein Verzeichnis auf der Befehlszeile an."
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"Referenziertes Repository '%s' wird noch nicht als verknüpftes\n"
-"Arbeitsverzeichnis unterstützt."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
-
-#: builtin/clone.c:317
+#: builtin/clone.c:321
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
-"eingehängt."
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: Konnte Alternative für '%s' nicht hinzufügen: %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:393
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:401
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existiert und ist kein Verzeichnis"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:415
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "Konnte %s nicht lesen\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:437
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "Konnte Verweis '%s' nicht erstellen"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:441
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "Konnte Datei nicht nach '%s' kopieren"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:466
 #, c-format
 msgid "done.\n"
 msgstr "Fertig.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:478
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5619,127 +6760,147 @@ msgstr ""
 "Sie können mit 'git status' prüfen, was ausgecheckt worden ist\n"
 "und das Auschecken mit 'git checkout -f HEAD' erneut versuchen.\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:555
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Konnte zu klonenden Remote-Branch %s nicht finden."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:650
 msgid "remote did not send all necessary objects"
 msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet."
 
-#: builtin/clone.c:649
+#: builtin/clone.c:666
 #, c-format
 msgid "unable to update %s"
 msgstr "kann %s nicht aktualisieren"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:715
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "Externer HEAD bezieht sich auf eine nicht existierende Referenz und kann "
 "nicht ausgecheckt werden.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:746
 msgid "unable to checkout working tree"
 msgstr "Arbeitsverzeichnis konnte nicht ausgecheckt werden"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:786
 msgid "unable to write parameters to config file"
 msgstr "konnte Parameter nicht in Konfigurationsdatei schreiben"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:849
 msgid "cannot repack to clean up"
 msgstr "Kann \"repack\" zum Aufräumen nicht aufrufen"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:851
 msgid "cannot unlink temporary alternates file"
 msgstr "Kann temporäre \"alternates\"-Datei nicht entfernen"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:888
 msgid "You must specify a repository to clone."
 msgstr "Sie müssen ein Repository zum Klonen angeben."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:901
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "Die Optionen --bare und --origin %s sind inkompatibel."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:904
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:917
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "Repository '%s' existiert nicht."
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "Tiefe %s ist keine positive Zahl"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:933
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "Zielpfad '%s' existiert bereits und ist kein leeres Verzeichnis."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:943
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "Arbeitsverzeichnis '%s' existiert bereits."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: builtin/clone.c:938
+#: builtin/clone.c:961
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:973
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klone in Bare-Repository '%s' ...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:975
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klone nach '%s' ...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"'clone --recursive' ist nicht kompatibel mit --reference und --reference-if-"
+"able"
+
+#: builtin/clone.c:1055
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "Die Option --depth wird in lokalen Klonen ignoriert; benutzen Sie "
 "stattdessen file://"
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-since wird in lokalen Klonen ignoriert; benutzen Sie stattdessen "
+"file://"
+
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude wird in lokalen Klonen ignoriert; benutzen Sie stattdessen "
+"file://"
+
+#: builtin/clone.c:1062
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 "Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --"
 "local"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1067
 msgid "--local is ignored"
 msgstr "--local wird ignoriert"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1071
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Weiß nicht wie %s zu klonen ist."
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1126 builtin/clone.c:1134
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1137
 msgid "You appear to have cloned an empty repository."
 msgstr "Sie scheinen ein leeres Repository geklont zu haben."
 
@@ -5882,67 +7043,62 @@ msgstr ""
 "Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n"
 "Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD."
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "Konnte temporären Index nicht erstellen."
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "interaktives Hinzufügen fehlgeschlagen"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "Konnte temporären Index nicht aktualisieren."
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Konnte Haupt-Cache-Verzeichnis nicht aktualisieren"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "Konnte new_index Datei nicht schreiben"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "Kann keinen Teil-Commit durchführen, während ein Merge im Gange ist."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 "Kann keinen Teil-Commit durchführen, während \"cherry-pick\" im Gange ist."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "Konnte temporäre Index-Datei nicht schreiben."
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "Commit '%s' fehlt Autor-Kopfbereich"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "Commit '%s' hat fehlerhafte Autor-Zeile"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "Fehlerhafter --author Parameter"
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
-msgstr "Ungültiges Datumsformat: %s"
-
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5950,38 +7106,38 @@ msgstr ""
 "Konnte kein Kommentar-Zeichen auswählen, das nicht in\n"
 "der aktuellen Commit-Beschreibung verwendet wird."
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "Konnte Commit %s nicht nachschlagen"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:294
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(lese Log-Nachricht von Standard-Eingabe)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "Konnte Log nicht von Standard-Eingabe lesen."
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "Konnte Log-Datei '%s' nicht lesen"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "Konnte SQUASH_MSG nicht lesen"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "Konnte MERGE_MSG nicht lesen"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "Konnte Commit-Vorlage nicht schreiben"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5996,7 +7152,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -6011,7 +7167,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -6021,7 +7177,7 @@ msgstr ""
 "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -6034,157 +7190,157 @@ msgstr ""
 "entfernen.\n"
 "Eine leere Beschreibung bricht den Commit ab.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:           %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDatum:            %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sCommit-Ersteller: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 "Bitte liefern Sie eine Beschreibung entweder mit der Option -m oder -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' ist nicht im Format 'Name <E-Mail>' und stimmt mit keinem "
 "vorhandenen Autor überein"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ungültiger Modus '%s' für unversionierte Dateien"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "Die Optionen --long und -z sind inkompatibel."
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 "Die Optionen --reset-author und --author können nicht gemeinsam verwendet "
 "werden."
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Sie haben nichts für \"--amend\"."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Ein Merge ist im Gange -- kann \"--amend\" nicht ausführen."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "\"cherry-pick\" ist im Gange -- kann \"--amend\" nicht ausführen."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 "Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden."
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Es kann nur eine Option von -c/-C/-F/--fixup verwendet werden."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Die Option -m kann nicht mit -c/-C/-F/--fixup kombiniert werden."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 "Die Option --reset--author kann nur mit -C, -c oder --amend verwendet werden."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Es kann nur eine Option von --include/--only/--all/--interactive/--patch "
 "verwendet werden."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr ""
 "Die Optionen --include und --only können nur mit der Angabe von Pfaden "
 "verwendet werden."
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "Klug ... den letzten Commit mit einem geänderten Index nachbessern."
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Explizite Pfade ohne -i oder -o angegeben; nehme --only an"
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:551
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Ungültiger \"cleanup\" Modus %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "Die Option -a kann nicht mit der Angabe von Pfaden verwendet werden."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "Status im Kurzformat anzeigen"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "Branchinformationen anzeigen"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "Version"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "Status im Langformat anzeigen (Standard)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "Einträge mit NUL-Zeichen abschließen"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
 msgid "mode"
 msgstr "Modus"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "unversionierte Dateien anzeigen, optionale Modi: all, normal, no. (Standard: "
 "all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "ignorierte Dateien anzeigen"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "wann"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6192,203 +7348,203 @@ msgstr ""
 "Änderungen in Submodulen ignorieren, optional wenn: all, dirty, untracked. "
 "(Standard: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "unversionierte Dateien in Spalten auflisten"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "Konnte neu erstellten Commit nicht nachschlagen."
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr "Konnte neulich erstellten Commit nicht analysieren."
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "losgelöster HEAD"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr " (Basis-Commit)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "Zusammenfassung nach erfolgreichem Commit unterdrücken"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "Unterschiede in Commit-Beschreibungsvorlage anzeigen"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "Optionen für Commit-Beschreibung"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:409
 msgid "read message from file"
 msgstr "Beschreibung von Datei lesen"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "Autor"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "Autor eines Commits überschreiben"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:357
 msgid "date"
 msgstr "Datum"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "Datum eines Commits überschreiben"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
 msgid "message"
 msgstr "Beschreibung"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "Commit-Beschreibung"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
 msgid "commit"
 msgstr "Commit"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden und editieren"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung zum Nachbessern des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung beim \"squash\" des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "Sie als Autor des Commits setzen (verwendet mit -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
 msgid "add Signed-off-by:"
 msgstr "'Signed-off-by:'-Zeile hinzufügen"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "angegebene Vorlagendatei verwenden"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "Bearbeitung des Commits erzwingen"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "Standard"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:412
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "Status in die Commit-Beschreibungsvorlage einfügen"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
 msgid "GPG sign commit"
 msgstr "Commit mit GPG signieren"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "Optionen für Commit-Inhalt"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "alle geänderten Dateien committen"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "die angegebenen Dateien zusätzlich zum Commit vormerken"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "interaktives Hinzufügen von Dateien"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "interaktives Hinzufügen von Änderungen"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "nur die angegebenen Dateien committen"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "Hooks pre-commit und commit-msg umgehen"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "anzeigen, was committet werden würde"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "vorherigen Commit ändern"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
 msgstr "\"post-rewrite hook\" umgehen"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "Aufzeichnung einer leeren Änderung erlauben"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "Aufzeichnung einer Änderung mit einer leeren Beschreibung erlauben"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "Konnte Commit von HEAD nicht analysieren."
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Beschädigte MERGE_HEAD-Datei (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "Konnte MERGE_MODE nicht lesen"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Commit abgebrochen; Sie haben die Beschreibung nicht editiert.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6403,141 +7559,141 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<Optionen>]"
 
-#: builtin/config.c:55
+#: builtin/config.c:56
 msgid "Config file location"
 msgstr "Ort der Konfigurationsdatei"
 
-#: builtin/config.c:56
+#: builtin/config.c:57
 msgid "use global config file"
 msgstr "globale Konfigurationsdatei verwenden"
 
-#: builtin/config.c:57
+#: builtin/config.c:58
 msgid "use system config file"
 msgstr "systemweite Konfigurationsdatei verwenden"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "use repository config file"
 msgstr "Konfigurationsdatei des Repositories verwenden"
 
-#: builtin/config.c:59
+#: builtin/config.c:60
 msgid "use given config file"
 msgstr "die angegebene Konfigurationsdatei verwenden"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "blob-id"
 msgstr "Blob-Id"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "read config from given blob object"
 msgstr "Konfiguration von angegebenem Blob-Objekt lesen"
 
-#: builtin/config.c:61
+#: builtin/config.c:62
 msgid "Action"
 msgstr "Aktion"
 
-#: builtin/config.c:62
+#: builtin/config.c:63
 msgid "get value: name [value-regex]"
 msgstr "Wert zurückgeben: Name [Wert-regex]"
 
-#: builtin/config.c:63
+#: builtin/config.c:64
 msgid "get all values: key [value-regex]"
 msgstr "alle Werte zurückgeben: Schlüssel [Wert-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:65
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "Werte für den regulären Ausdruck zurückgeben: Name-regex [Wert-regex]"
 
-#: builtin/config.c:65
+#: builtin/config.c:66
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "Wert spezifisch für eine URL zurückgeben: section[.var] URL"
 
-#: builtin/config.c:66
+#: builtin/config.c:67
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "alle passenden Variablen ersetzen: Name Wert [Wert-regex] "
 
-#: builtin/config.c:67
+#: builtin/config.c:68
 msgid "add a new variable: name value"
 msgstr "neue Variable hinzufügen: Name Wert"
 
-#: builtin/config.c:68
+#: builtin/config.c:69
 msgid "remove a variable: name [value-regex]"
 msgstr "eine Variable entfernen: Name [Wert-regex]"
 
-#: builtin/config.c:69
+#: builtin/config.c:70
 msgid "remove all matches: name [value-regex]"
 msgstr "alle Übereinstimmungen entfernen: Name [Wert-regex]"
 
-#: builtin/config.c:70
+#: builtin/config.c:71
 msgid "rename section: old-name new-name"
 msgstr "eine Sektion umbenennen: alter-Name neuer-Name"
 
-#: builtin/config.c:71
+#: builtin/config.c:72
 msgid "remove a section: name"
 msgstr "eine Sektion entfernen: Name"
 
-#: builtin/config.c:72
+#: builtin/config.c:73
 msgid "list all"
 msgstr "alles auflisten"
 
-#: builtin/config.c:73
+#: builtin/config.c:74
 msgid "open an editor"
 msgstr "einen Editor öffnen"
 
-#: builtin/config.c:74
+#: builtin/config.c:75
 msgid "find the color configured: slot [default]"
 msgstr "die konfigurierte Farbe finden: Slot [Standard]"
 
-#: builtin/config.c:75
+#: builtin/config.c:76
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "die Farbeinstellung finden: Slot [Standard-Ausgabe-ist-Terminal]"
 
-#: builtin/config.c:76
+#: builtin/config.c:77
 msgid "Type"
 msgstr "Typ"
 
-#: builtin/config.c:77
+#: builtin/config.c:78
 msgid "value is \"true\" or \"false\""
 msgstr "Wert ist \"true\" oder \"false\""
 
-#: builtin/config.c:78
+#: builtin/config.c:79
 msgid "value is decimal number"
 msgstr "Wert ist eine Dezimalzahl"
 
-#: builtin/config.c:79
+#: builtin/config.c:80
 msgid "value is --bool or --int"
 msgstr "Wert ist --bool oder --int"
 
-#: builtin/config.c:80
+#: builtin/config.c:81
 msgid "value is a path (file or directory name)"
 msgstr "Wert ist ein Pfad (Datei oder Verzeichnisname)"
 
-#: builtin/config.c:81
+#: builtin/config.c:82
 msgid "Other"
 msgstr "Sonstiges"
 
-#: builtin/config.c:82
+#: builtin/config.c:83
 msgid "terminate values with NUL byte"
 msgstr "schließt Werte mit NUL-Byte ab"
 
-#: builtin/config.c:83
+#: builtin/config.c:84
 msgid "show variable names only"
 msgstr "nur Variablennamen anzeigen"
 
-#: builtin/config.c:84
+#: builtin/config.c:85
 msgid "respect include directives on lookup"
 msgstr "beachtet \"include\"-Direktiven beim Nachschlagen"
 
-#: builtin/config.c:85
+#: builtin/config.c:86
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
 "Ursprung der Konfiguration anzeigen (Datei, Standard-Eingabe, Blob, "
 "Befehlszeile)"
 
-#: builtin/config.c:327
+#: builtin/config.c:328
 msgid "unable to parse default color value"
 msgstr "konnte Standard-Farbwert nicht parsen"
 
-#: builtin/config.c:471
+#: builtin/config.c:472
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -6552,68 +7708,90 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:613
+#: builtin/config.c:615
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "Konnte Konfigurationsdatei '%s' nicht erstellen."
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:627
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"kann nicht mehrere Werte mit einem einzigen Wert überschreiben\n"
+"       Benutzen Sie einen regulären Ausdruck, --add oder --replace, um %s\n"
+"       zu ändern."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "gibt Größenangaben in menschenlesbaren Format aus"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [<options>] [<commit-ish>...]"
 msgstr "git describe [<Optionen>] [<Commit-Angabe>...]"
 
-#: builtin/describe.c:18
+#: builtin/describe.c:19
 msgid "git describe [<options>] --dirty"
 msgstr "git describe [<Optionen>] --dirty"
 
-#: builtin/describe.c:217
+#: builtin/describe.c:53
+msgid "head"
+msgstr "Branch"
+
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "nicht-annotiert"
+
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "annotiert"
+
+#: builtin/describe.c:250
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "annotiertes Tag %s ist nicht verfügbar"
 
-#: builtin/describe.c:221
+#: builtin/describe.c:254
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "annotiertes Tag %s hat keinen eingebetteten Namen"
 
-#: builtin/describe.c:223
+#: builtin/describe.c:256
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "Tag '%s' ist eigentlich '%s' hier"
 
-#: builtin/describe.c:250 builtin/log.c:480
+#: builtin/describe.c:283 builtin/log.c:487
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s ist kein gültiger Objekt-Name"
 
-#: builtin/describe.c:253
+#: builtin/describe.c:286
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s ist kein gültiges '%s' Objekt"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:303
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "kein Tag entspricht exakt '%s'"
 
-#: builtin/describe.c:272
+#: builtin/describe.c:305
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "suche zur Beschreibung von %s\n"
 
-#: builtin/describe.c:319
+#: builtin/describe.c:352
 #, c-format
 msgid "finished search at %s\n"
 msgstr "beendete Suche bei %s\n"
 
-#: builtin/describe.c:346
+#: builtin/describe.c:379
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -6622,7 +7800,7 @@ msgstr ""
 "Keine annotierten Tags können '%s' beschreiben.\n"
 "Jedoch gab es nicht-annotierte Tags: versuchen Sie --tags."
 
-#: builtin/describe.c:350
+#: builtin/describe.c:383
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -6631,111 +7809,229 @@ msgstr ""
 "Keine Tags können '%s' beschreiben.\n"
 "Versuchen Sie --always oder erstellen Sie einige Tags."
 
-#: builtin/describe.c:371
+#: builtin/describe.c:413
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu Commits durchlaufen\n"
 
-#: builtin/describe.c:374
+#: builtin/describe.c:416
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
 "gave up search at %s\n"
 msgstr ""
-"mehr als %i Tags gefunden; Führe die ersten %i auf\n"
+"mehr als %i Tags gefunden; führe die ersten %i auf\n"
 "Suche bei %s aufgegeben\n"
 
-#: builtin/describe.c:396
+#: builtin/describe.c:438
 msgid "find the tag that comes after the commit"
 msgstr "das Tag finden, das nach dem Commit kommt"
 
-#: builtin/describe.c:397
+#: builtin/describe.c:439
 msgid "debug search strategy on stderr"
 msgstr "die Suchstrategie in der Standard-Fehlerausgabe protokollieren"
 
-#: builtin/describe.c:398
+#: builtin/describe.c:440
 msgid "use any ref"
 msgstr "alle Referenzen verwenden"
 
-#: builtin/describe.c:399
+#: builtin/describe.c:441
 msgid "use any tag, even unannotated"
 msgstr "jedes Tag verwenden, auch nicht-annotierte"
 
-#: builtin/describe.c:400
+#: builtin/describe.c:442
 msgid "always use long format"
 msgstr "immer langes Format verwenden"
 
-#: builtin/describe.c:401
+#: builtin/describe.c:443
 msgid "only follow first parent"
 msgstr "nur erstem Elternteil folgen"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:446
 msgid "only output exact matches"
 msgstr "nur exakte Übereinstimmungen ausgeben"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:448
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "die jüngsten <n> Tags betrachten (Standard: 10)"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:450
 msgid "only consider tags matching <pattern>"
 msgstr "nur Tags, die <Muster> entsprechen, betrachten"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "keine Tags betrachten, die <Muster> entsprechen"
+
+#: builtin/describe.c:454 builtin/name-rev.c:357
 msgid "show abbreviated commit object as fallback"
 msgstr "gekürztes Commit-Objekt anzeigen, wenn sonst nichts zutrifft"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:455 builtin/describe.c:458
 msgid "mark"
 msgstr "Kennzeichen"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:456
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
-"<Kennzeichen> bei geändertem Arbeitsverzeichnis hinzufügen (Standard: \"-"
-"dirty\")"
+"<Kennzeichen> bei geändertem Arbeitsverzeichnis anhängen (Standard: \"-dirty"
+"\")"
+
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr ""
+"<Kennzeichen> bei defektem Arbeitsverzeichnis anhängen (Standard: \"-broken"
+"\")"
 
-#: builtin/describe.c:430
+#: builtin/describe.c:477
 msgid "--long is incompatible with --abbrev=0"
 msgstr "Die Optionen --long und --abbrev=0 sind inkompatibel."
 
-#: builtin/describe.c:456
+#: builtin/describe.c:506
 msgid "No names found, cannot describe anything."
 msgstr "Keine Namen gefunden, kann nichts beschreiben."
 
-#: builtin/describe.c:476
+#: builtin/describe.c:549
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "Die Option --dirty kann nicht mit Commits verwendet werden."
 
-#: builtin/diff.c:86
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "Die Option --broken kann nicht mit Commits verwendet werden."
+
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': keine reguläre Datei oder symbolische Verknüpfung"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "Ungültige Option: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Kein Git-Repository"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "Objekt '%s' ist ungültig."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "Mehr als zwei Blobs angegeben: '%s'"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "unbehandeltes Objekt '%s' angegeben"
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr "git difftool [<Optionen>] [<Commit> [<Commit>]] [--] [<Pfad>...]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "fehlgeschlagen: %d"
+
+#: builtin/difftool.c:283
+#, c-format
+msgid "could not read symlink %s"
+msgstr "konnte symbolische Verknüpfung %s nicht lesen"
+
+#: builtin/difftool.c:285
+#, c-format
+msgid "could not read symlink file %s"
+msgstr "Konnte Datei von symbolischer Verknüpfung '%s' nicht lesen."
+
+#: builtin/difftool.c:293
+#, c-format
+msgid "could not read object %s for symlink %s"
+msgstr "Konnte Objekt '%s' für symbolische Verknüpfung '%s' nicht lesen."
+
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"Kombinierte Diff-Formate('-c' und '--cc') werden im Verzeichnis-\n"
+"Diff-Modus('-d' und '--dir-diff') nicht unterstützt."
+
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "beide Dateien geändert: '%s' und '%s'."
+
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "Datei im Arbeitsverzeichnis belassen."
+
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "Es existieren temporäre Dateien in '%s'."
+
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "Sie könnten diese aufräumen oder wiederherstellen."
+
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "`diff.guitool` anstatt `diff.tool` benutzen"
+
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "Diff über ganzes Verzeichnis ausführen"
+
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "keine Eingabeaufforderung vor Ausführung eines Diff-Tools"
+
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "symbolische Verknüpfungen im dir-diff Modus verwenden"
+
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "<Tool>"
+
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "das angegebene Diff-Tool benutzen"
+
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr ""
+"eine Liste mit Diff-Tools darstellen, die mit `--tool` benutzt werden können"
+
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr ""
+"'git-difftool' beenden, wenn das aufgerufene Diff-Tool mit einem "
+"Rückkehrwert\n"
+"verschieden 0 ausgeführt wurde"
+
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "<Programm>"
+
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "eigenen Befehl zur Anzeige von Unterschieden angeben"
+
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "kein <Tool> für --tool=<Tool> angegeben"
+
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "kein <Programm> für --extcmd=<Programm> angegeben"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-opts]"
@@ -6804,166 +8100,173 @@ msgstr "git fetch --multiple [<Optionen>] [(<Repository> | <Gruppe>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<Optionen>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "fordert von allen Remote-Repositories an"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "an .git/FETCH_HEAD anhängen, anstatt zu überschreiben"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "Pfad des Programms zum Hochladen von Paketen auf der Gegenseite"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "das Überschreiben von lokalen Branches erzwingen"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "von mehreren Remote-Repositories anfordern"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "alle Tags und verbundene Objekte anfordern"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "nicht alle Tags anfordern (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "Anzahl der parallel anzufordernden Submodule"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "Remote-Tracking-Branches entfernen, die sich nicht mehr im Remote-Repository "
 "befinden"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "bei-Bedarf"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "rekursive Anforderungen von Submodulen kontrollieren"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "heruntergeladenes Paket behalten"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "Aktualisierung der \"HEAD\"-Referenz erlauben"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr ""
 "die Historie eines Klons mit unvollständiger Historie (shallow) vertiefen"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr ""
+"die Historie eines Klons mit unvollständiger Historie (shallow) auf "
+"Zeitbasis\n"
+"vertiefen"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "zu einem vollständigen Repository konvertieren"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1440
 msgid "dir"
 msgstr "Verzeichnis"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "dies an die Ausgabe der Submodul-Pfade voranstellen"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "Standard-Modus für Rekursion"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "Referenzen, die .git/shallow aktualisieren, akzeptieren"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "Refmap"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "Refmap für 'fetch' angeben"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "Konnte Remote-Referenz von HEAD nicht finden."
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:513
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "Konfiguration fetch.output enthält ungültigen Wert %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:606
 #, c-format
 msgid "object %s not found"
 msgstr "Objekt %s nicht gefunden"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:610
 msgid "[up to date]"
 msgstr "[aktuell]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:623 builtin/fetch.c:703
 msgid "[rejected]"
 msgstr "[zurückgewiesen]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:624
 msgid "can't fetch in current branch"
 msgstr "kann \"fetch\" im aktuellen Branch nicht ausführen"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:633
 msgid "[tag update]"
 msgstr "[Tag Aktualisierung]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
 msgid "unable to update local ref"
 msgstr "kann lokale Referenz nicht aktualisieren"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:653
 msgid "[new tag]"
 msgstr "[neues Tag]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:656
 msgid "[new branch]"
 msgstr "[neuer Branch]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:659
 msgid "[new ref]"
 msgstr "[neue Referenz]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:698
 msgid "forced update"
 msgstr "Aktualisierung erzwungen"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:703
 msgid "non-fast-forward"
 msgstr "kein Vorspulen"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:748
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:768
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositoriesmit "
 "unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
 msgid "From %.*s\n"
 msgstr "Von %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6972,57 +8275,57 @@ msgstr ""
 "Einige lokale Referenzen konnten nicht aktualisiert werden; versuchen Sie\n"
 "'git remote prune %s', um jeden älteren, widersprüchlichen Branch zu löschen."
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:921
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s wird unreferenziert)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s wurde unreferenziert)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:954
 msgid "[deleted]"
 msgstr "[gelöscht]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:955 builtin/remote.c:1022
 msgid "(none)"
 msgstr "(nichts)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:978
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 "Der \"fetch\" in den aktuellen Branch %s von einem nicht-Bare-Repository "
 "wurde verweigert."
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:997
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Option \"%s\" Wert \"%s\" ist nicht gültig für %s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1000
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Option \"%s\" wird ignoriert für %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1076
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Weiß nicht wie von %s angefordert wird."
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1236
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Fordere an von %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Konnte nicht von %s anfordern"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1256
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -7031,35 +8334,43 @@ msgstr ""
 "oder den Namen des Remote-Repositories an, von welchem neue\n"
 "Commits angefordert werden sollen."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1279
 msgid "You need to specify a tag name."
 msgstr "Sie müssen den Namen des Tags angeben."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "Negative Tiefe wird von --deepen nicht unterstützt."
+
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen und --depth schließen sich gegenseitig aus"
+
+#: builtin/fetch.c:1328
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden."
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1330
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 "Die Option --unshallow kann nicht in einem Repository mit unvollständiger "
 "Historie verwendet werden."
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1352
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all akzeptiert kein Repository als Argument"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1354
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kann nicht mit Refspecs verwendet werden."
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1365
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1373
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 "Das Abholen einer Gruppe von Remote-Repositories kann nicht mit der Angabe\n"
@@ -7072,23 +8383,23 @@ msgstr ""
 "git fmt-merge-msg [-m <Beschreibung>] [--log[=<n>] | --no-log] [--file "
 "<Datei>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "Historie mit höchstens <n> Einträgen von \"shortlog\" hinzufügen"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "Alias für --log (veraltet)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "Text"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "<Text> als Beschreibungsanfang verwenden"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "Datei zum Einlesen"
 
@@ -7101,12 +8412,12 @@ msgid "git for-each-ref [--points-at <object>]"
 msgstr "git for-each-ref [--points-at <Objekt>]"
 
 #: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<Objekt>]]"
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<Commit>]]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<Objekt>]]"
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr "git for-each-ref [--contains [<Objekt>]] [--no-contains [<Commit>]]"
 
 #: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
@@ -7128,10 +8439,6 @@ msgstr "Platzhalter als Tcl-String formatieren"
 msgid "show only <n> matched refs"
 msgstr "nur <n> passende Referenzen anzeigen"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "für die Ausgabe zu verwendendes Format"
-
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
 msgstr "nur auf dieses Objekt zeigende Referenzen ausgeben"
@@ -7148,63 +8455,67 @@ msgstr "nur nicht zusammengeführte Referenzen ausgeben"
 msgid "print only refs which contain the commit"
 msgstr "nur Referenzen ausgeben, die diesen Commit enthalten"
 
-#: builtin/fsck.c:519
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "nur Referenzen ausgeben, die diesen Commit nicht enthalten"
+
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "Prüfe Objekt-Verzeichnisse"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<Optionen>] [<Objekt>...]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "unerreichbare Objekte anzeigen"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "unreferenzierte Objekte anzeigen"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "Tags melden"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "Hauptwurzeln melden"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "Index-Objekte in Erreichbarkeitsprüfung einbeziehen"
 
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "Reflogs in Erreichbarkeitsprüfung einbeziehen (Standard)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "ebenso Pakete und alternative Objekte betrachten"
 
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "nur Konnektivität prüfen"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "genauere Prüfung aktivieren"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr "unreferenzierte Objekte nach .git/lost-found schreiben"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "ausführliche Namen für erreichbare Objekte anzeigen"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "Prüfe Objekte"
 
@@ -7212,17 +8523,17 @@ msgstr "Prüfe Objekte"
 msgid "git gc [<options>]"
 msgstr "git gc [<Optionen>]"
 
-#: builtin/gc.c:72
+#: builtin/gc.c:78
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "Ungültiger %s: '%s'"
+msgid "Failed to fstat %s: %s"
+msgstr "Konnte '%s' nicht lesen: %s"
 
-#: builtin/gc.c:139
+#: builtin/gc.c:310
 #, c-format
-msgid "insanely long object directory %.*s"
-msgstr "zu langes Objekt-Verzeichnis %.*s"
+msgid "Can't stat %s"
+msgstr "Kann '%s' nicht lesen."
 
-#: builtin/gc.c:290
+#: builtin/gc.c:319
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7238,44 +8549,49 @@ msgstr ""
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:358
 msgid "prune unreferenced objects"
 msgstr "unreferenzierte Objekte entfernen"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:360
 msgid "be more thorough (increased runtime)"
 msgstr "mehr Gründlichkeit (erhöht Laufzeit)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:361
 msgid "enable auto-gc mode"
 msgstr "\"auto-gc\" Modus aktivieren"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:362
 msgid "force running gc even if there may be another gc running"
 msgstr ""
-"Ausführung von \"git gc\" erwzingen, selbst wenn ein anderes\n"
+"Ausführung von \"git gc\" erzwingen, selbst wenn ein anderes\n"
 "\"git gc\" bereits ausgeführt wird"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "Fehler beim Parsen des Wertes '%s' von gc.logexpiry"
+
+#: builtin/gc.c:407
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Die Datenbank des Repositories wird für eine optimale Performance im\n"
 "Hintergrund komprimiert.\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:409
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr ""
 "Die Datenbank des Projektarchivs wird für eine optimale Performance "
 "komprimiert.\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:410
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Siehe \"git help gc\" für manuelles Aufräumen.\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:431
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -7283,257 +8599,271 @@ msgstr ""
 "\"git gc\" wird bereits auf Maschine '%s' pid %<PRIuMAX> ausgeführt\n"
 "(benutzen Sie --force falls nicht)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:475
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Es gibt zu viele unerreichbare lose Objekte; führen Sie 'git prune' aus, um "
 "diese zu löschen."
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<Optionen>] [-e] <Muster> [<Commit>...] [[--] <Pfad>...]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: Fehler beim Erzeugen eines Thread: %s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "ungültige Anzahl von Threads (%d) für %s angegeben"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:829
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:893
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "Schalter '%c' erwartet einen numerischen Wert"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "kann '%s' nicht öffnen"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:980
 msgid "search in index instead of in the work tree"
 msgstr "im Index anstatt im Arbeitsverzeichnis suchen"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:982
 msgid "find in contents not managed by git"
 msgstr "auch in Inhalten finden, die nicht von Git verwaltet werden"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:984
 msgid "search in both tracked and untracked files"
 msgstr "in versionierten und unversionierten Dateien suchen"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:986
 msgid "ignore files specified via '.gitignore'"
 msgstr "Dateien, die über '.gitignore' angegeben sind, ignorieren"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "rekursive Suche in jedem Submodul"
+
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "Basisname"
+
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "Basisname des Elternprojektes an Ausgaben voranstellen"
+
+#: builtin/grep.c:994
 msgid "show non-matching lines"
 msgstr "Zeilen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:996
 msgid "case insensitive matching"
 msgstr "Übereinstimmungen unabhängig von Groß- und Kleinschreibung finden"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:998
 msgid "match patterns only at word boundaries"
 msgstr "nur ganze Wörter suchen"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:1000
 msgid "process binary files as text"
 msgstr "binäre Dateien als Text verarbeiten"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:1002
 msgid "don't match patterns in binary files"
 msgstr "keine Muster in Binärdateien finden"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:1005
 msgid "process binary files with textconv filters"
 msgstr "binäre Dateien mit \"textconv\"-Filtern verarbeiten"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1007
 msgid "descend at most <depth> levels"
 msgstr "höchstens <Tiefe> Ebenen durchlaufen"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1011
 msgid "use extended POSIX regular expressions"
 msgstr "erweiterte reguläre Ausdrücke aus POSIX verwenden"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1014
 msgid "use basic POSIX regular expressions (default)"
 msgstr "grundlegende reguläre Ausdrücke aus POSIX verwenden (Standard)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1017
 msgid "interpret patterns as fixed strings"
 msgstr "Muster als feste Zeichenketten interpretieren"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1020
 msgid "use Perl-compatible regular expressions"
 msgstr "Perl-kompatible reguläre Ausdrücke verwenden"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1023
 msgid "show line numbers"
 msgstr "Zeilennummern anzeigen"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1024
 msgid "don't show filenames"
 msgstr "keine Dateinamen anzeigen"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1025
 msgid "show filenames"
 msgstr "Dateinamen anzeigen"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1027
 msgid "show filenames relative to top directory"
 msgstr "Dateinamen relativ zum Projektverzeichnis anzeigen"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1029
 msgid "show only filenames instead of matching lines"
 msgstr "nur Dateinamen anzeigen anstatt übereinstimmende Zeilen"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1031
 msgid "synonym for --files-with-matches"
 msgstr "Synonym für --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1034
 msgid "show only the names of files without match"
 msgstr "nur die Dateinamen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1036
 msgid "print NUL after filenames"
 msgstr "NUL-Zeichen nach Dateinamen ausgeben"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1038
 msgid "show the number of matches instead of matching lines"
 msgstr "anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen anzeigen"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1039
 msgid "highlight matches"
 msgstr "Übereinstimmungen hervorheben"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1041
 msgid "print empty line between matches from different files"
 msgstr ""
 "eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien ausgeben"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1043
 msgid "show filename only once above matches from same file"
 msgstr ""
 "den Dateinamen nur einmal oberhalb der Übereinstimmungen aus dieser Datei "
 "anzeigen"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1046
 msgid "show <n> context lines before and after matches"
 msgstr "<n> Zeilen vor und nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1049
 msgid "show <n> context lines before matches"
 msgstr "<n> Zeilen vor den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1051
 msgid "show <n> context lines after matches"
 msgstr "<n> Zeilen nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1053
 msgid "use <n> worker threads"
 msgstr "<n> Threads benutzen"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1054
 msgid "shortcut for -C NUM"
 msgstr "Kurzform für -C NUM"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1057
 msgid "show a line with the function name before matches"
 msgstr "eine Zeile mit dem Funktionsnamen vor Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1059
 msgid "show the surrounding function"
 msgstr "die umgebende Funktion anzeigen"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1062
 msgid "read patterns from file"
 msgstr "Muster von einer Datei lesen"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1064
 msgid "match <pattern>"
 msgstr "<Muster> finden"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1066
 msgid "combine patterns specified with -e"
 msgstr "Muster kombinieren, die mit -e angegeben wurden"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1078
 msgid "indicate hit with exit status without output"
 msgstr "Übereinstimmungen nur durch Beendigungsstatus anzeigen"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1080
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "nur Übereinstimmungen von Dateien anzeigen, die allen Mustern entsprechen"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1082
 msgid "show parse tree for grep expression"
 msgstr "geparstes Verzeichnis für \"grep\"-Ausdruck anzeigen"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "pager"
 msgstr "Anzeigeprogramm"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "show matching files in the pager"
 msgstr "Dateien mit Übereinstimmungen im Anzeigeprogramm anzeigen"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1089
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "den Aufruf von grep(1) erlauben (von dieser Programmversion ignoriert)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1153
 msgid "no pattern given."
 msgstr "keine Muster angegeben"
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr "--no-index oder --untracked können nicht mit Commits verwendet werden"
+
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
+msgstr "Konnte Commit nicht auflösen: %s"
+
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "ungültige Anzahl von Threads angegeben (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1251
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 "Die Option --open-files-in-pager kann nur innerhalb des "
 "Arbeitsverzeichnisses verwendet werden."
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "Option wird mit --recurse-submodules nicht unterstützt."
+
+#: builtin/grep.c:1280
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 "Die Optionen --cached und --untracked können nicht mit --no-index verwendet "
 "werden."
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr ""
-"Die Optionen --no-index und --untracked können nicht mit Commits verwendet "
-"werden."
-
-#: builtin/grep.c:909
+#: builtin/grep.c:1286
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "Die Option --[no-]exclude-standard kann nicht mit versionierten Inhalten "
 "verwendet werden."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1294
 msgid "both --cached and trees are given."
 msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden."
 
@@ -7549,85 +8879,89 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "Art"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "Art des Objektes"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "das Objekt in die Objektdatenbank schreiben"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "das Objekt von der Standard-Eingabe lesen"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "Datei wie sie ist speichern, ohne Filter"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 "Hash über zufällige Daten, zur Erzeugung von beschädigten Objekten zur\n"
 "Fehlersuche in Git, erzeugen"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "Datei verarbeiten, als ob sie von diesem Pfad wäre"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "alle vorhandenen Befehle anzeigen"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "Anleitungen ausschließen"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "Liste von allgemein verwendeten Anleitungen anzeigen"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "Handbuch anzeigen"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "Handbuch in einem Webbrowser anzeigen"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "Info-Seite anzeigen"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<Befehl>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "nicht erkanntes Hilfeformat: %s"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "Konnte emacsclient nicht starten."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "Konnte Version des emacsclient nicht parsen."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "Version des emacsclient '%d' ist zu alt (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "Fehler beim Ausführen von '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7636,7 +8970,7 @@ msgstr ""
 "'%s': Pfad für nicht unterstützten Handbuchbetrachter.\n"
 "Sie könnten stattdessen 'man.<Werkzeug>.cmd' benutzen."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7645,428 +8979,441 @@ msgstr ""
 "'%s': Programm für unterstützten Handbuchbetrachter.\n"
 "Sie könnten stattdessen 'man.<Werkzeug>.path' benutzen."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': unbekannter Handbuch-Betrachter."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "kein Handbuch-Betrachter konnte mit dieser Anfrage umgehen"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "kein Informations-Betrachter konnte mit dieser Anfrage umgehen"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Definition von Attributen pro Pfad"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Tägliche Benutzung von Git mit ungefähr 20 Befehlen"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Ein Git-Glossar"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Spezifikation von bewusst ignorierten, unversionierten Dateien"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Definition von Submodul-Eigenschaften"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Spezifikation von Commits und Bereichen für Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Eine einführende Anleitung zu Git (für Version 1.5.1 oder neuer)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Eine Übersicht über empfohlene Arbeitsabläufe mit Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Die allgemein verwendeten Git-Anleitungen sind:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "Verwendung: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "für `git %s' wurde der Alias `%s' angelegt"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "Verwendung: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "kann %s nicht öffnen"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "Objekt-Typen passen bei %s nicht zusammen"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "konnte erwartetes Objekt %s nicht empfangen"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "Objekt %s: erwarteter Typ %s, %s gefunden"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "kann %d Byte nicht lesen"
 msgstr[1] "kann %d Bytes nicht lesen"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "zu frühes Dateiende"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "Fehler beim Lesen der Eingabe"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "verwendete mehr Bytes als verfügbar waren"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "Paket ist zu groß für die aktuelle Definition von off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "Paket überschreitet die maximal erlaubte Größe"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "konnte '%s' nicht erstellen"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:323
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "Kann Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:337
 msgid "pack signature mismatch"
 msgstr "Paketsignatur stimmt nicht überein"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:339
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "Paketversion %<PRIu32> nicht unterstützt"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:357
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "Paket hat ein ungültiges Objekt bei Versatz %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:479
 #, c-format
 msgid "inflate returned %d"
 msgstr "Dekomprimierung gab %d zurück"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:528
 msgid "offset value overflow for delta base object"
 msgstr "Wert für Versatz bei Differenzobjekt übergelaufen"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:536
 msgid "delta base offset is out of bound"
 msgstr ""
 "Wert für Versatz bei Differenzobjekt liegt außerhalb des gültigen Bereichs"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:544
 #, c-format
 msgid "unknown object type %d"
 msgstr "Unbekannter Objekt-Typ %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:575
 msgid "cannot pread pack file"
 msgstr "Kann Paketdatei %s nicht lesen"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:577
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Byte"
 msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Bytes"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:603
 msgid "serious inflate inconsistency"
 msgstr "ernsthafte Inkonsistenz nach Dekomprimierung"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
 msgid "unable to read %s"
 msgstr "kann %s nicht lesen"
 
 #: builtin/index-pack.c:814
 #, c-format
+msgid "cannot read existing object info %s"
+msgstr "Kann existierende Informationen zu Objekt %s nicht lesen."
+
+#: builtin/index-pack.c:822
+#, c-format
 msgid "cannot read existing object %s"
 msgstr "Kann existierendes Objekt %s nicht lesen."
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:836
 #, c-format
 msgid "invalid blob object %s"
 msgstr "ungültiges Blob-Objekt %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:850
 #, c-format
 msgid "invalid %s"
 msgstr "Ungültiger Objekt-Typ %s"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:853
 msgid "Error in object"
 msgstr "Fehler in Objekt"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:855
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Nicht alle Kind-Objekte von %s sind erreichbar"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
 msgid "failed to apply delta"
 msgstr "Konnte Dateiunterschied nicht anwenden"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Receiving objects"
 msgstr "Empfange Objekte"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Indexing objects"
 msgstr "Indiziere Objekte"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1160
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "Paket ist beschädigt (SHA1 unterschiedlich)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1165
 msgid "cannot fstat packfile"
 msgstr "kann Paketdatei nicht lesen"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1168
 msgid "pack has junk at the end"
 msgstr "Paketende enthält nicht verwendbaren Inhalt"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1179
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "Fehler beim Ausführen von \"parse_pack_objects()\""
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1202
 msgid "Resolving deltas"
 msgstr "Löse Unterschiede auf"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1213
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kann Thread nicht erzeugen: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1255
 msgid "confusion beyond insanity"
 msgstr "Fehler beim Auflösen der Unterschiede"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1261
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "abgeschlossen mit %d lokalem Objekt"
 msgstr[1] "abgeschlossen mit %d lokalen Objekten"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1273
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Unerwartete Prüfsumme für %s (Festplattenfehler?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1277
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "Paket hat %d unaufgelöste Unterschied"
 msgstr[1] "Paket hat %d unaufgelöste Unterschiede"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1301
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "Konnte angehängtes Objekt (%d) nicht komprimieren"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1377
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "lokales Objekt %s ist beschädigt"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1403
 msgid "error while closing pack file"
 msgstr "Fehler beim Schließen der Paketdatei"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1415
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "Kann Paketbeschreibungsdatei '%s' nicht schreiben"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1423
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "Kann eben erstellte Paketbeschreibungsdatei '%s' nicht schließen"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1433
 msgid "cannot store pack file"
 msgstr "Kann Paketdatei nicht speichern"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "Kann Indexdatei nicht speichern"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1479
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "keine Unterstützung von Threads, '%s' wird ignoriert"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1547
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kann existierende Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1549
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Kann existierende Indexdatei für Paket '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1596
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "kein Unterschied: %d Objekt"
 msgstr[1] "kein Unterschied: %d Objekte"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1603
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "Länge der Objekt-Liste = %d: %lu Objekt"
 msgstr[1] "Länge der Objekt-Liste = %d: %lu Objekte"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1616
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'"
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
 msgid "bad %s"
 msgstr "%s ist ungültig"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1737
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden."
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "--stdin erfordert ein Git-Repository"
+
+#: builtin/index-pack.c:1747
 msgid "--verify with no packfile name given"
 msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben."
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "Kann '%s' nicht lesen"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "kann Vorlage '%s' nicht lesen"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "kann Verzeichnis '%s' nicht öffnen"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "kann Verweis '%s' nicht lesen"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "kann symbolische Verknüpfung '%s' auf '%s' nicht erstellen"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "kann '%s' nicht nach '%s' kopieren"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "ignoriere Vorlage %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "keine Vorlagen in '%s' gefunden"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "kopiere keine Vorlagen von '%s': %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s existiert bereits"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "kann nicht mit Dateityp %d umgehen"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "Konnte %s nicht nach %s verschieben"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s existiert bereits"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Bestehendes verteiltes Git-Repository in %s%s neuinitialisiert\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Bestehendes Git-Repository in %s%s neuinitialisiert\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Leeres verteiltes Git-Repository in %s%s initialisiert\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Leeres Git-Repository in %s%s initialisiert\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -8074,25 +9421,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--"
 "shared[=<Berechtigungen>]] [<Verzeichnis>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "Berechtigungen"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "angeben, dass das Git-Repository mit mehreren Benutzern geteilt wird"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kann Verzeichnis %s nicht erstellen"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kann nicht in Verzeichnis %s wechseln"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -8101,7 +9448,7 @@ msgstr ""
 "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s "
 "(oder --git-dir=<Verzeichnis>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen."
@@ -8142,107 +9489,104 @@ msgstr "git log [<Optionen>] [<Commitbereich>] [[--] <Pfad>...]"
 msgid "git show [<options>] <object>..."
 msgstr "git show [<Optionen>] <Objekt>..."
 
-#: builtin/log.c:84
+#: builtin/log.c:89
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "Ungültige Option für --decorate: %s"
 
-#: builtin/log.c:139
+#: builtin/log.c:144
 msgid "suppress diff output"
 msgstr "Ausgabe der Unterschiede unterdrücken"
 
-#: builtin/log.c:140
+#: builtin/log.c:145
 msgid "show source"
 msgstr "Quelle anzeigen"
 
-#: builtin/log.c:141
+#: builtin/log.c:146
 msgid "Use mail map file"
 msgstr "\"mailmap\"-Datei verwenden"
 
-#: builtin/log.c:142
+#: builtin/log.c:147
 msgid "decorate options"
 msgstr "decorate-Optionen"
 
-#: builtin/log.c:145
+#: builtin/log.c:150
 msgid "Process line range n,m in file, counting from 1"
 msgstr "Verarbeitet nur Zeilen im Bereich n,m in der Datei, gezählt von 1"
 
-#: builtin/log.c:241
+#: builtin/log.c:246
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "letzte Ausgabe: %d %s\n"
 
-#: builtin/log.c:486
+#: builtin/log.c:493
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: ungültige Datei"
 
-#: builtin/log.c:500 builtin/log.c:594
+#: builtin/log.c:507 builtin/log.c:601
 #, c-format
 msgid "Could not read object %s"
 msgstr "Kann Objekt %s nicht lesen."
 
-#: builtin/log.c:618
+#: builtin/log.c:625
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Unbekannter Typ: %d"
 
-#: builtin/log.c:739
+#: builtin/log.c:746
 msgid "format.headers without value"
 msgstr "format.headers ohne Wert"
 
-#: builtin/log.c:839
+#: builtin/log.c:846
 msgid "name of output directory is too long"
 msgstr "Name des Ausgabeverzeichnisses ist zu lang."
 
-#: builtin/log.c:854
+#: builtin/log.c:861
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Kann Patch-Datei %s nicht öffnen"
 
-#: builtin/log.c:868
+#: builtin/log.c:875
 msgid "Need exactly one range."
 msgstr "Brauche genau einen Commit-Bereich."
 
-#: builtin/log.c:878
+#: builtin/log.c:885
 msgid "Not a range."
 msgstr "Kein Commit-Bereich."
 
-#: builtin/log.c:984
+#: builtin/log.c:991
 msgid "Cover letter needs email format"
 msgstr "Anschreiben benötigt E-Mail-Format"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1071
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ungültiges in-reply-to: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1098
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<Optionen>] [<seit> | <Commitbereich>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1148
 msgid "Two output directories?"
 msgstr "Zwei Ausgabeverzeichnisse?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Unbekannter Commit %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1270
 msgid "Could not find exact merge base."
 msgstr "Konnte keine exakte Merge-Basis finden."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1274
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8253,212 +9597,216 @@ msgstr ""
 "'git branch --set-upstream-to', um einem Remote-Branch zu folgen.\n"
 "Oder geben Sie den Basis-Commit mit '--base=<Basis-Commit-Id>' manuell an."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1294
 msgid "Failed to find exact merge base"
 msgstr "Fehler beim Finden einer exakten Merge-Basis."
 
-#: builtin/log.c:1294
+#: builtin/log.c:1305
 msgid "base commit should be the ancestor of revision list"
 msgstr "Basis-Commit sollte der Vorgänger der Revisionsliste sein."
 
-#: builtin/log.c:1298
+#: builtin/log.c:1309
 msgid "base commit shouldn't be in revision list"
 msgstr "Basis-Commit sollte nicht in der Revisionsliste enthalten sein."
 
-#: builtin/log.c:1347
+#: builtin/log.c:1358
 msgid "cannot get patch id"
 msgstr "kann Patch-Id nicht lesen"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1415
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "[PATCH n/m] auch mit einzelnem Patch verwenden"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1418
 msgid "use [PATCH] even with multiple patches"
 msgstr "[PATCH] auch mit mehreren Patches verwenden"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1422
 msgid "print patches to standard out"
 msgstr "Ausgabe der Patches in Standard-Ausgabe"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1424
 msgid "generate a cover letter"
 msgstr "ein Deckblatt erzeugen"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1426
 msgid "use simple number sequence for output file names"
 msgstr "einfache Nummernfolge für die Namen der Ausgabedateien verwenden"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1427
 msgid "sfx"
 msgstr "Dateiendung"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1428
 msgid "use <sfx> instead of '.patch'"
 msgstr "<Dateiendung> anstatt '.patch' verwenden"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1430
 msgid "start numbering patches at <n> instead of 1"
 msgstr "die Nummerierung der Patches bei <n> anstatt bei 1 beginnen"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1432
 msgid "mark the series as Nth re-roll"
 msgstr "die Serie als n-te Fassung kennzeichnen"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "[RFC PATCH] anstatt [PATCH] verwenden"
+
+#: builtin/log.c:1437
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "[<Präfix>] anstatt [PATCH] verwenden"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1440
 msgid "store resulting files in <dir>"
 msgstr "erzeugte Dateien in <Verzeichnis> speichern"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1443
 msgid "don't strip/add [PATCH]"
 msgstr "[PATCH] nicht entfernen/hinzufügen"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1446
 msgid "don't output binary diffs"
 msgstr "keine binären Unterschiede ausgeben"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1448
 msgid "output all-zero hash in From header"
 msgstr "Hash mit Nullen in \"From\"-Header ausgeben"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1450
 msgid "don't include a patch matching a commit upstream"
 msgstr ""
 "keine Patches einschließen, die einem Commit im Upstream-Branch entsprechen"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1452
 msgid "show patch format instead of default (patch + stat)"
 msgstr "Patchformat anstatt des Standards anzeigen (Patch + Zusammenfassung)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1454
 msgid "Messaging"
 msgstr "E-Mail-Einstellungen"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1455
 msgid "header"
 msgstr "Header"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1456
 msgid "add email header"
 msgstr "E-Mail-Header hinzufügen"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1457 builtin/log.c:1459
 msgid "email"
 msgstr "E-Mail"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1457
 msgid "add To: header"
 msgstr "\"To:\"-Header hinzufügen"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1459
 msgid "add Cc: header"
 msgstr "\"Cc:\"-Header hinzufügen"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1461
 msgid "ident"
 msgstr "Ident"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1462
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "\"From\"-Adresse auf <Ident> setzen (oder Ident des Commit-Erstellers, wenn "
 "fehlend)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1464
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1465
 msgid "make first mail a reply to <message-id>"
 msgstr "aus erster E-Mail eine Antwort zu <message-id> machen"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1466 builtin/log.c:1469
 msgid "boundary"
 msgstr "Grenze"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1467
 msgid "attach the patch"
 msgstr "den Patch anhängen"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1470
 msgid "inline the patch"
 msgstr "den Patch direkt in die Nachricht einfügen"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1474
 msgid "enable message threading, styles: shallow, deep"
 msgstr "Nachrichtenverkettung aktivieren, Stile: shallow, deep"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1476
 msgid "signature"
 msgstr "Signatur"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1477
 msgid "add a signature"
 msgstr "eine Signatur hinzufügen"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1478
 msgid "base-commit"
 msgstr "Basis-Commit"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1479
 msgid "add prerequisite tree info to the patch series"
 msgstr "erforderliche Revisions-Informationen der Patch-Serie hinzufügen"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1481
 msgid "add a signature from a file"
 msgstr "eine Signatur aus einer Datei hinzufügen"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1482
 msgid "don't print the patch filenames"
 msgstr "keine Dateinamen der Patches anzeigen"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1572
 msgid "-n and -k are mutually exclusive."
 msgstr "Die Optionen -n und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "Die Optionen --subject-prefix und -k schließen sich gegenseitig aus."
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1582
 msgid "--name-only does not make sense"
 msgstr "Die Option --name-only kann nicht verwendet werden."
 
-#: builtin/log.c:1570
+#: builtin/log.c:1584
 msgid "--name-status does not make sense"
 msgstr "Die Option --name-status kann nicht verwendet werden."
 
-#: builtin/log.c:1572
+#: builtin/log.c:1586
 msgid "--check does not make sense"
 msgstr "Die Option --check kann nicht verwendet werden."
 
-#: builtin/log.c:1602
+#: builtin/log.c:1616
 msgid "standard output, or directory, which one?"
 msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1618
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/log.c:1698
+#: builtin/log.c:1712
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "Konnte Signatur-Datei '%s' nicht lesen"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1784
 msgid "Failed to create output files"
 msgstr "Fehler beim Erstellen der Ausgabedateien."
 
-#: builtin/log.c:1818
+#: builtin/log.c:1833
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1887
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8466,104 +9814,108 @@ msgstr ""
 "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> "
 "manuell an.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:468
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<Optionen>] [<Datei>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:517
 msgid "identify the file status with tags"
 msgstr "den Dateistatus mit Tags anzeigen"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:519
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung verwenden"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:521
 msgid "show cached files in the output (default)"
 msgstr "zwischengespeicherte Dateien in der Ausgabe anzeigen (Standard)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:523
 msgid "show deleted files in the output"
 msgstr "entfernte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:525
 msgid "show modified files in the output"
 msgstr "geänderte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:527
 msgid "show other files in the output"
 msgstr "sonstige Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:529
 msgid "show ignored files in the output"
 msgstr "ignorierte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:532
 msgid "show staged contents' object name in the output"
 msgstr ""
 "Objektnamen von Inhalten, die zum Commit vorgemerkt sind, in der Ausgabe "
 "anzeigen"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:534
 msgid "show files on the filesystem that need to be removed"
 msgstr "Dateien im Dateisystem, die gelöscht werden müssen, anzeigen"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:536
 msgid "show 'other' directories' names only"
 msgstr "nur Namen von 'sonstigen' Verzeichnissen anzeigen"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:538
 msgid "show line endings of files"
 msgstr "Zeilenenden von Dateien anzeigen"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:540
 msgid "don't show empty directories"
 msgstr "keine leeren Verzeichnisse anzeigen"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:543
 msgid "show unmerged files in the output"
 msgstr "nicht zusammengeführte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:545
 msgid "show resolve-undo information"
 msgstr "'resolve-undo' Informationen anzeigen"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:547
 msgid "skip files matching pattern"
 msgstr "Dateien auslassen, die einem Muster entsprechen"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:550
 msgid "exclude patterns are read from <file>"
 msgstr "Muster, gelesen von <Datei>, ausschließen"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:553
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei> auslesen"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:555
 msgid "add the standard git exclusions"
 msgstr "die standardmäßigen Git-Ausschlüsse hinzufügen"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:558
 msgid "make the output relative to the project top directory"
 msgstr "Ausgabe relativ zum Projektverzeichnis"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
+msgstr "Rekursion in Submodulen durchführen"
+
+#: builtin/ls-files.c:563
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "als Fehler behandeln, wenn sich eine <Datei> nicht im Index befindet"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:564
 msgid "tree-ish"
 msgstr "Commit-Referenz"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:565
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "vorgeben, dass Pfade, die seit <Commit-Referenz> gelöscht wurden, immer noch "
 "vorhanden sind"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:567
 msgid "show debugging data"
 msgstr "Ausgaben zur Fehlersuche anzeigen"
 
@@ -8577,41 +9929,41 @@ msgstr ""
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<Repository> [<Referenzen>...]]"
 
-#: builtin/ls-remote.c:50
+#: builtin/ls-remote.c:52
 msgid "do not print remote URL"
 msgstr "URL des Remote-Repositories nicht ausgeben"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
 msgid "exec"
 msgstr "Programm"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
 msgid "path of git-upload-pack on the remote host"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/ls-remote.c:56
+#: builtin/ls-remote.c:58
 msgid "limit to tags"
 msgstr "auf Tags einschränken"
 
-#: builtin/ls-remote.c:57
+#: builtin/ls-remote.c:59
 msgid "limit to heads"
 msgstr "auf Branches einschränken"
 
-#: builtin/ls-remote.c:58
+#: builtin/ls-remote.c:60
 msgid "do not show peeled tags"
 msgstr "keine Tags anzeigen, die andere Tags enthalten"
 
-#: builtin/ls-remote.c:60
+#: builtin/ls-remote.c:62
 msgid "take url.<base>.insteadOf into account"
 msgstr "url.<Basis>.insteadOf berücksichtigen"
 
-#: builtin/ls-remote.c:62
+#: builtin/ls-remote.c:64
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr ""
 "mit Rückkehrwert 2 beenden, wenn keine übereinstimmenden Referenzen\n"
 "gefunden wurden"
 
-#: builtin/ls-remote.c:64
+#: builtin/ls-remote.c:66
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "zusätzlich die auf durch dieses Objekt verwiesene Referenzen anzeigen"
 
@@ -8619,35 +9971,35 @@ msgstr "zusätzlich die auf durch dieses Objekt verwiesene Referenzen anzeigen"
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<Optionen>] <Commit-Referenz> [<Pfad>...]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "nur Verzeichnisse anzeigen"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
 msgstr "Rekursion in Unterverzeichnissen durchführen"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "Verzeichnisse bei Rekursion anzeigen"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "Einträge mit NUL-Byte abschließen"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "Objektgröße einschließen"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "nur Dateinamen auflisten"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "vollständige Pfadnamen verwenden"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "das gesamte Verzeichnis auflisten; nicht nur das aktuelle Verzeichnis "
@@ -8658,172 +10010,176 @@ msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<Optionen>] [<Commit>...]"
 
 #: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<Optionen>] <Beschreibung> HEAD <Commit>"
-
-#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
 msgid "switch `m' requires a value"
 msgstr "Schalter 'm' erfordert einen Wert."
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Konnte Merge-Strategie '%s' nicht finden.\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:141
 #, c-format
 msgid "Available strategies are:"
 msgstr "Verfügbare Strategien sind:"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Verfügbare benutzerdefinierte Strategien sind:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:196 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "keine Zusammenfassung der Unterschiede am Schluss des Merges anzeigen"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "eine Zusammenfassung der Unterschiede am Schluss des Merges anzeigen"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:200 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(Synonym für --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:202 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "(höchstens <n>) Einträge von \"shortlog\" zur Beschreibung des Merge-Commits "
 "hinzufügen"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:205 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "einen einzelnen Commit anstatt eines Merges erzeugen"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:207 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "einen Commit durchführen, wenn der Merge erfolgreich war (Standard)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:209 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "Bearbeitung der Beschreibung vor dem Commit"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:210
 msgid "allow fast-forward (default)"
 msgstr "Vorspulen erlauben (Standard)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:212 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "abbrechen, wenn kein Vorspulen möglich ist"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:216 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "den genannten Commit auf eine gültige GPG-Signatur überprüfen"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
 msgid "strategy"
 msgstr "Strategie"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:218 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "zu verwendende Merge-Strategie"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:219 builtin/pull.c:162
 msgid "option=value"
 msgstr "Option=Wert"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:220 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "Option für ausgewählte Merge-Strategie"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 "Commit-Beschreibung zusammenführen (für einen Merge, der kein Vorspulen war)"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:226
 msgid "abort the current in-progress merge"
 msgstr "den sich im Gange befindlichen Merge abbrechen"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "den sich im Gange befindlichen Merge fortsetzen"
+
+#: builtin/merge.c:230 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "erlaube das Zusammenführen von nicht zusammenhängenden Historien"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:258
 msgid "could not run stash."
 msgstr "Konnte \"stash\" nicht ausführen."
 
-#: builtin/merge.c:260
+#: builtin/merge.c:263
 msgid "stash failed"
 msgstr "\"stash\" fehlgeschlagen"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:268
 #, c-format
 msgid "not a valid object: %s"
 msgstr "kein gültiges Objekt: %s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:287 builtin/merge.c:304
 msgid "read-tree failed"
 msgstr "read-tree fehlgeschlagen"
 
-#: builtin/merge.c:331
+#: builtin/merge.c:334
 msgid " (nothing to squash)"
 msgstr " (nichts zu quetschen)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:345
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Quetsche Commit -- HEAD wird nicht aktualisiert\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:395
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Keine Merge-Commit-Beschreibung -- HEAD wird nicht aktualisiert\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' zeigt auf keinen Commit"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:536
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Ungültiger branch.%s.mergeoptions String: %s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "Es wird nur der Merge von zwei Branches behandelt."
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Unbekannte Option für merge-recursive: -X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "konnte %s nicht schreiben"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "konnte nicht von '%s' lesen"
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Merge wurde nicht committet; benutzen Sie 'git commit', um den Merge "
 "abzuschließen.\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8839,69 +10195,76 @@ msgstr ""
 "Zeilen beginnend mit '%c' werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "Leere Commit-Beschreibung"
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Wunderbar.\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Automatischer Merge fehlgeschlagen; beheben Sie die Konflikte und committen "
 "Sie dann das Ergebnis.\n"
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "'%s' ist kein Commit"
-
-#: builtin/merge.c:904
+#: builtin/merge.c:890
 msgid "No current branch."
 msgstr "Sie befinden sich auf keinem Branch."
 
-#: builtin/merge.c:906
+#: builtin/merge.c:892
 msgid "No remote for the current branch."
 msgstr "Kein Remote-Repository für den aktuellen Branch."
 
-#: builtin/merge.c:908
+#: builtin/merge.c:894
 msgid "No default upstream defined for the current branch."
 msgstr ""
 "Es ist kein Standard-Upstream-Branch für den aktuellen Branch definiert."
 
-#: builtin/merge.c:913
+#: builtin/merge.c:899
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Kein Remote-Tracking-Branch für %s von %s"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:946
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Fehlerhafter Wert '%s' in Umgebungsvariable '%s'"
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1020
 #, c-format
 msgid "could not close '%s'"
 msgstr "Konnte '%s' nicht schließen"
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1047
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "nichts was wir in %s zusammenführen können: %s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1081
 msgid "not something we can merge"
 msgstr "nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "--abort akzeptiert keine Argumente"
+
+#: builtin/merge.c:1150
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keinen Merge zum Abbrechen (MERGE_HEAD fehlt)"
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "--continue erwartet keine Argumente"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "Es ist keine Merge im Gange (MERGE_HEAD fehlt)."
+
+#: builtin/merge.c:1182
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8909,7 +10272,7 @@ msgstr ""
 "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n"
 "Bitte committen Sie Ihre Änderungen, bevor Sie den Merge ausführen."
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1189
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8917,117 +10280,117 @@ msgstr ""
 "Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n"
 "Bitte committen Sie Ihre Änderungen, bevor Sie den Merge ausführen."
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1192
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 "Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert)."
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1201
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Sie können --squash nicht mit --no-ff kombinieren."
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1209
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1226
 msgid "Squash commit into empty head not supported yet"
 msgstr ""
 "Bin auf einem Commit, der noch geboren wird; kann \"squash\" nicht ausführen."
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1228
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Nicht vorzuspulender Commit kann nicht in einem leeren Branch verwendet "
 "werden."
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1233
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1235
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Kann nur exakt einen Commit in einem leeren Branch zusammenführen."
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Commit %s hat eine nicht vertrauenswürdige GPG-Signatur, angeblich von %s."
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Commit %s hat eine ungültige GPG-Signatur, angeblich von %s."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1278
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Commit %s hat eine gültige GPG-Signatur von %s\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1340
 msgid "refusing to merge unrelated histories"
 msgstr "Verweigere den Merge von nicht zusammenhängenden Historien."
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1349
 msgid "Already up-to-date."
 msgstr "Bereits aktuell."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1359
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1400
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge ...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1407
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1432
 msgid "Already up-to-date. Yeeah!"
 msgstr "Bereits aktuell."
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1438
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1461 builtin/merge.c:1540
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung ...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1465
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Merge-Strategie %s ...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1531
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1533
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1542
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Benutzen Sie \"%s\", um die Auflösung per Hand vorzubereiten.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1554
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -9053,23 +10416,23 @@ msgstr "git merge-base --is-ancestor <Commit> <Commit>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <Referenz> [<Commit>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "Ausgabe aller gemeinsamen Vorgänger-Commits"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "Vorgänger-Commits für einen einzelnen n-Wege-Merge finden"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "Commits auflisten, die nicht durch Andere erreichbar sind"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "ist der Erste ein Vorgänger-Commit von dem Anderen?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "<Commit> finden, von wo Reflog von <Referenz> abgespalten wurde"
 
@@ -9081,38 +10444,69 @@ msgstr ""
 "git merge-file [<Optionen>] [-L <Name1> [-L <orig> [-L <Name2>]]] <Datei1> "
 "<orig-Datei> <Datei2>"
 
-#: builtin/merge-file.c:33
+#: builtin/merge-file.c:32
 msgid "send results to standard output"
 msgstr "Ergebnisse zur Standard-Ausgabe senden"
 
-#: builtin/merge-file.c:34
+#: builtin/merge-file.c:33
 msgid "use a diff3 based merge"
 msgstr "einen diff3 basierten Merge verwenden"
 
-#: builtin/merge-file.c:35
+#: builtin/merge-file.c:34
 msgid "for conflicts, use our version"
 msgstr "bei Konflikten unsere Variante verwenden"
 
-#: builtin/merge-file.c:37
+#: builtin/merge-file.c:36
 msgid "for conflicts, use their version"
 msgstr "bei Konflikten ihre Variante verwenden"
 
-#: builtin/merge-file.c:39
+#: builtin/merge-file.c:38
 msgid "for conflicts, use a union version"
 msgstr "bei Konflikten eine gemeinsame Variante verwenden"
 
-#: builtin/merge-file.c:42
+#: builtin/merge-file.c:41
 msgid "for conflicts, use this marker size"
 msgstr "bei Konflikten diese Kennzeichnungslänge verwenden"
 
-#: builtin/merge-file.c:43
+#: builtin/merge-file.c:42
 msgid "do not warn about conflicts"
 msgstr "keine Warnung bei Konflikten"
 
-#: builtin/merge-file.c:45
+#: builtin/merge-file.c:44
 msgid "set labels for file1/orig-file/file2"
 msgstr "Beschriftung für Datei1/orig-Datei/Datei2 setzen"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "unbekannte Option: %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "Konnte Objekt '%s' nicht parsen."
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "kann nicht mit mehr als %d Merge-Basis umgehen. Ignoriere %s."
+msgstr[1] "kann nicht mit mehr als %d Merge-Basen umgehen. Ignoriere %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "Es wird nur der Merge von zwei Branches behandelt."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "Konnte Referenz '%s' nicht auflösen"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Führe %s mit %s zusammen\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -9129,138 +10523,142 @@ msgstr "fehlende Objekte erlauben"
 msgid "allow creation of more than one tree"
 msgstr "die Erstellung von mehr als einem \"Tree\"-Objekt erlauben"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<Optionen>] <Quelle>... <Ziel>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "Verzeichnis %s ist zum Commit vorgemerkt und kein Submodul?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "Bitte merken Sie Ihre Änderungen in .gitmodules zum Commit vor oder "
 "benutzen\n"
 "Sie \"stash\", um fortzufahren."
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s ist zum Commit vorgemerkt"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "Verschieben/Umbenennen erzwingen, auch wenn das Ziel existiert"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "Fehler beim Verschieben oder Umbenennen überspringen"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "Ziel '%s' ist kein Verzeichnis"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Prüfe Umbenennung von '%s' nach '%s'\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "ungültige Quelle"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "kann Verzeichnis nicht in sich selbst verschieben"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "kann Verzeichnis nicht über Datei verschieben"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "Quellverzeichnis ist leer"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "nicht unter Versionskontrolle"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "Ziel existiert bereits"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "überschreibe '%s'"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "Kann nicht überschreiben"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "mehrere Quellen für das selbe Ziel"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "Zielverzeichnis existiert nicht"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, Quelle=%s, Ziel=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Benenne %s nach %s um\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "Umbenennung von '%s' fehlgeschlagen"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:289
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<Optionen>] <Commit>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:290
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<Optionen>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:291
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<Optionen>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:346
 msgid "print only names (no SHA-1)"
 msgstr "nur Namen anzeigen (keine SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:347
 msgid "only use tags to name the commits"
 msgstr "nur Tags verwenden, um die Commits zu benennen"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:349
 msgid "only use refs matching <pattern>"
 msgstr "nur Referenzen verwenden die <Muster> entsprechen"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "ignoriere Referenzen die <Muster> entsprechen"
+
+#: builtin/name-rev.c:353
 msgid "list all commits reachable from all refs"
 msgstr "alle Commits auflisten, die von allen Referenzen erreichbar sind"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:354
 msgid "read from stdin"
 msgstr "von der Standard-Eingabe lesen"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:355
 msgid "allow to print `undefined` names (default)"
 msgstr "Ausgabe von `undefinierten` Namen erlauben (Standard)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:361
 msgid "dereference tags in the input (internal use)"
 msgstr "Tags in der Eingabe dereferenzieren (interne Verwendung)"
 
@@ -9395,9 +10793,9 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "konnte 'show' für Objekt '%s' nicht abschließen"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
+msgid "please supply the note contents using either -m or -F option"
 msgstr ""
-"Bitte liefern Sie den Notiz-Inhalt unter Verwendung der Option -m oder -F."
+"Bitte liefern Sie die Notiz-Inhalte unter Verwendung der Option -m oder -F."
 
 #: builtin/notes.c:203
 msgid "unable to write note object"
@@ -9405,65 +10803,91 @@ msgstr "Konnte Notiz-Objekt nicht schreiben"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Die Notiz-Inhalte wurden in %s belassen"
+msgid "the note contents have been left in %s"
+msgstr "Die Notiz-Inhalte wurden in %s belassen."
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kann '%s' nicht lesen"
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "konnte '%s' nicht öffnen oder lesen"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
+msgid "failed to read object '%s'."
 msgstr "Fehler beim Lesen des Objektes '%s'."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
+msgid "cannot read note data from non-blob object '%s'."
 msgstr "Kann Notiz-Daten nicht von Nicht-Blob Objekt '%s' lesen."
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "Fehlerhafte Eingabezeile: '%s'."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr ""
+"Ausführung von %s auf Notizen in %s (außerhalb von refs/notes/) "
+"zurückgewiesen"
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
 msgid "too many parameters"
 msgstr "zu viele Parameter"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid "No note found for object %s."
+msgid "no note found for object %s."
 msgstr "Keine Notiz für Objekt %s gefunden."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "Notizinhalte als Zeichenkette"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "Notizinhalte in einer Datei"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "Wiederverwendung und Bearbeitung des angegebenen Notiz-Objektes"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "Wiederverwendung des angegebenen Notiz-Objektes"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "Speichern leerer Notiz erlauben"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "existierende Notizen ersetzen"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9472,31 +10896,31 @@ msgstr ""
 "Konnte Notizen nicht hinzufügen. Existierende Notizen für Objekt %s "
 "gefunden. Verwenden Sie '-f', um die existierenden Notizen zu überschreiben."
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Überschreibe existierende Notizen für Objekt %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Entferne Notiz für Objekt %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "Objekte von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "Konfiguration für <Befehl> zum Umschreiben von Commits laden (impliziert --"
 "stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "zu wenig Parameter"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9505,12 +10929,12 @@ msgstr ""
 "Kann Notizen nicht kopieren. Existierende Notizen für Objekt %s gefunden. "
 "Verwenden Sie '-f', um die existierenden Notizen zu überschreiben."
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
+msgid "missing notes on source object %s. Cannot copy."
 msgstr "Keine Notizen für Quell-Objekt %s. Kopie nicht möglich."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9519,20 +10943,52 @@ msgstr ""
 "Die Optionen -m/-F/-c/-C sind für den Unterbefehl 'edit' veraltet.\n"
 "Bitte benutzen Sie stattdessen 'git notes add -f -m/-F/-c/-C'.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "Fehler beim Löschen der Referenz NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "Fehler beim Löschen der Referenz NOTES_MERGE_REF"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "Fehler beim Löschen des Arbeitsverzeichnisses von 'git notes merge'."
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "Fehler beim Lesen der Referenz NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "Konnte Commit von NOTES_MERGE_PARTIAL nicht finden."
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "Konnte Commit von NOTES_MERGE_PARTIAL nicht parsen."
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "Fehler beim Auflösen von NOTES_MERGE_REF"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "Fehler beim Abschließen der Zusammenführung der Notizen."
+
+#: builtin/notes.c:754
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "unbekannte Merge-Strategie '%s' für Notizen"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:770
 msgid "General options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:772
 msgid "Merge options"
 msgstr "Merge-Optionen"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:774
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9540,48 +10996,49 @@ msgstr ""
 "löst Konflikte bei Notizen mit der angegebenen Strategie auf (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:776
 msgid "Committing unmerged notes"
 msgstr "nicht zusammengeführte Notizen eintragen"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:778
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 "Merge von Notizen abschließen, in dem nicht zusammengeführte Notizen "
 "committet werden"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:780
 msgid "Aborting notes merge resolution"
 msgstr "Konfliktauflösung beim Merge von Notizen abbrechen"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:782
 msgid "abort notes merge"
 msgstr "Merge von Notizen abbrechen"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:793
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "Kann --commit, --abort oder -s/--strategy nicht kombinieren."
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
 msgstr "Sie müssen eine Notiz-Referenz zum Mergen angeben."
 
-#: builtin/notes.c:821
+#: builtin/notes.c:822
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "Unbekannter Wert für -s/--strategy: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:859
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
+msgid "a notes merge into %s is already in-progress at %s"
 msgstr "Ein Merge von Notizen nach %s ist bereits im Gange bei %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:862
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
-msgstr "Fehler beim Speichern der Verknüpfung zur aktuellen Notes-Referenz (%s)"
+msgid "failed to store link to current notes ref (%s)"
+msgstr ""
+"Fehler beim Speichern der Verknüpfung zur aktuellen Notes-Referenz (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:864
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9589,51 +11046,52 @@ msgid ""
 "abort'.\n"
 msgstr ""
 "Automatisches Zusammenführen der Notizen fehlgeschlagen. Beheben Sie die\n"
-"Konflikte in %s und committen Sie das Ergebnis mit 'git notes merge --commit',\n"
+"Konflikte in %s und committen Sie das Ergebnis mit 'git notes merge --"
+"commit',\n"
 "oder brechen Sie den Merge mit 'git notes merge --abort' ab.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:886
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objekt %s hat keine Notiz\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:898
 msgid "attempt to remove non-existent note is not an error"
 msgstr "der Versuch, eine nicht existierende Notiz zu löschen, ist kein Fehler"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:901
 msgid "read object names from the standard input"
 msgstr "Objektnamen von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "nicht löschen, nur anzeigen"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:940
 msgid "report pruned notes"
 msgstr "gelöschte Notizen melden"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:982
 msgid "notes-ref"
 msgstr "Notiz-Referenz"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:983
 msgid "use notes from <notes-ref>"
 msgstr "Notizen von <Notiz-Referenz> verwenden"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1018
 #, c-format
-msgid "Unknown subcommand: %s"
+msgid "unknown subcommand: %s"
 msgstr "Unbekannter Unterbefehl: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<Optionen>...] [< <Referenzliste> | < "
 "<Objektliste>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
@@ -9645,187 +11103,183 @@ msgstr ""
 msgid "deflate error (%d)"
 msgstr "Fehler beim Komprimieren (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:770
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "Deaktiviere Schreiben der Bitmap, Pakete wurden durch pack.packSizeLimit\n"
 "aufgetrennt."
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:783
 msgid "Writing objects"
 msgstr "Schreibe Objekte"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1063
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "Deaktiviere Schreiben der Bitmap, da einige Objekte nicht in eine Pack-"
 "Datei\n"
 "geschrieben wurden."
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2426
 msgid "Compressing objects"
 msgstr "Komprimiere Objekte"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2829
 #, c-format
 msgid "unsupported index version %s"
 msgstr "Nicht unterstützte Index-Version %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2833
 #, c-format
 msgid "bad index version '%s'"
 msgstr "Ungültige Index-Version '%s'"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2863
 msgid "do not show progress meter"
 msgstr "keine Fortschrittsanzeige anzeigen"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2865
 msgid "show progress meter"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2867
 msgid "show progress meter during object writing phase"
 msgstr ""
 "Forschrittsanzeige während der Phase des Schreibens der Objekte anzeigen"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2870
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2871
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2872
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "die Index-Datei des Paketes in der angegebenen Indexformat-Version schreiben"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2875
 msgid "maximum size of each output pack file"
 msgstr "maximale Größe für jede ausgegebene Paketdatei"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2877
 msgid "ignore borrowed objects from alternate object store"
 msgstr "geliehene Objekte von alternativem Objektspeicher ignorieren"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2879
 msgid "ignore packed objects"
 msgstr "gepackte Objekte ignorieren"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2881
 msgid "limit pack window by objects"
 msgstr "Paketfenster durch Objekte begrenzen"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2883
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher begrenzen"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2885
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "maximale Länge der erlaubten Differenzverkettung im resultierenden Paket"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2887
 msgid "reuse existing deltas"
 msgstr "existierende Unterschiede wiederverwenden"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2889
 msgid "reuse existing objects"
 msgstr "existierende Objekte wiederverwenden"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2891
 msgid "use OFS_DELTA objects"
 msgstr "OFS_DELTA Objekte verwenden"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2893
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "Threads bei der Suche nach den besten Übereinstimmungen bei Unterschieden "
 "verwenden"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2895
 msgid "do not create an empty pack output"
 msgstr "keine leeren Pakete erzeugen"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2897
 msgid "read revision arguments from standard input"
 msgstr "Argumente bezüglich Commits von der Standard-Eingabe lesen"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2899
 msgid "limit the objects to those that are not yet packed"
 msgstr "die Objekte zu solchen, die noch nicht gepackt wurden, begrenzen"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2902
 msgid "include objects reachable from any reference"
 msgstr "Objekte einschließen, die von jeder Referenz erreichbar sind"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2905
 msgid "include objects referred by reflog entries"
 msgstr ""
 "Objekte einschließen, die von Einträgen des Reflogs referenziert werden"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2908
 msgid "include objects referred to by the index"
 msgstr "Objekte einschließen, die vom Index referenziert werden"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2911
 msgid "output pack to stdout"
 msgstr "Paket in die Standard-Ausgabe schreiben"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2913
 msgid "include tag objects that refer to objects to be packed"
 msgstr "Tag-Objekte einschließen, die auf gepackte Objekte referenzieren"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2915
 msgid "keep unreachable objects"
 msgstr "nicht erreichbare Objekte behalten"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2917
 msgid "pack loose unreachable objects"
 msgstr "nicht erreichbare lose Objekte packen"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "Zeit"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2919
 msgid "unpack unreachable objects newer than <time>"
 msgstr "nicht erreichbare Objekte entpacken, die neuer als <Zeit> sind"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2922
 msgid "create thin packs"
 msgstr "dünnere Pakete erzeugen"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2924
 msgid "create packs suitable for shallow fetches"
 msgstr ""
 "Pakete geeignet für Abholung mit unvollständiger Historie (shallow) erzeugen"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2926
 msgid "ignore packs that have companion .keep file"
 msgstr "Pakete ignorieren, die .keep Dateien haben"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2928
 msgid "pack compression level"
 msgstr "Komprimierungsgrad für Paketierung"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2930
 msgid "do not hide commits by grafts"
 msgstr "keine künstlichen Vorgänger-Commits (\"grafts\") verbergen"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2932
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung benutzen"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2934
 msgid "write a bitmap index together with the pack index"
 msgstr "Bitmap-Index zusammen mit Pack-Index schreiben"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:3061
 msgid "Counting objects"
 msgstr "Zähle Objekte"
 
@@ -9853,11 +11307,11 @@ msgstr "Lösche doppelte Objekte"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <Zeit>] [--] [<head>...]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "gelöschte Objekte melden"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
 msgstr "Objekte älter als <Zeit> verfallen lassen"
 
@@ -9865,56 +11319,45 @@ msgstr "Objekte älter als <Zeit> verfallen lassen"
 msgid "cannot prune in a precious-objects repo"
 msgstr "kann \"prune\" in precious-objects Repository nicht ausführen"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Ungültiger Wert für %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<Optionen>] [<Repository> [<Refspec>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Optionen bezogen auf Merge"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "Integration von Änderungen durch Rebase statt Merge"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
 msgid "allow fast-forward"
 msgstr "Vorspulen erlauben"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "automatischer Stash/Stash-Pop vor und nach eines Rebase"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Optionen bezogen auf Fetch"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "Anzahl der parallel mit 'pull' zu verarbeitenden Submodule"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Ungültiger Wert für pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die "
-"nicht zum Commit vorgemerkt sind."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Zusätzlich beinhaltet die Staging-Area nicht committete Änderungen."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Die Staging-Area beinhaltet "
-"nicht committete Änderungen."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9922,14 +11365,14 @@ msgstr ""
 "Es gibt keinen Kandidaten für Rebase innerhalb der Referenzen, die eben "
 "angefordert wurden."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "Es gibt keine Kandidaten für Merge innerhalb der Referenzen, die eben "
 "angefordert wurden."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9937,7 +11380,7 @@ msgstr ""
 "Im Allgemeinen bedeutet das, dass Sie einen Refspec mit Wildcards angegeben\n"
 "haben, der auf der Gegenseite mit keinen Referenzen übereinstimmt."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9949,39 +11392,39 @@ msgstr ""
 "Repository für den aktuellen Branch ist, müssen Sie einen Branch auf\n"
 "der Befehlszeile angeben."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Im Moment auf keinem Branch."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr ""
 "Bitte geben Sie den Branch an, gegen welchen Sie \"rebase\" ausführen "
 "möchten."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Bitte geben Sie den Branch an, welchen Sie zusammenführen möchten."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Siehe git-pull(1) für weitere Details."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<Remote-Repository>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<Branch>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "Es gibt keine Tracking-Informationen für den aktuellen Branch."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
@@ -9989,7 +11432,7 @@ msgstr ""
 "Sie\n"
 "dies tun mit:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9999,21 +11442,29 @@ msgstr ""
 "des Remote-Repositories durchzuführen, aber diese Referenz\n"
 "wurde nicht angefordert."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "Ignoriere --verify-signatures für Rebase"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash ist nur mit --rebase zulässig."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit "
 "vorgemerkt sind."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "Pull mit Rebase"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -10023,7 +11474,7 @@ msgstr ""
 "\"fetch\" aktualisierte die Spitze des aktuellen Branches.\n"
 "Spule Ihr Arbeitsverzeichnis von Commit %s vor."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -10040,11 +11491,11 @@ msgstr ""
 "$ git reset --hard\n"
 "zur Wiederherstellung aus."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Kann nicht mehrere Branches in einen leeren Branch zusammenführen."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Kann Rebase nicht auf mehrere Branches ausführen."
 
@@ -10141,14 +11592,14 @@ msgstr ""
 "Branches '%s' ist, ohne anzugeben, was versendet werden soll, um welchen\n"
 "Remote-Branch zu aktualisieren."
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Sie haben keine Refspec für \"push\" angegeben, und push.default ist "
 "\"nothing\"."
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -10162,7 +11613,7 @@ msgstr ""
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -10176,7 +11627,7 @@ msgstr ""
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -10195,13 +11646,13 @@ msgstr ""
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Aktualisierungen wurden zurückgewiesen, weil das Tag bereits\n"
 "im Remote-Repository existiert."
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -10211,22 +11662,22 @@ msgstr ""
 "das kein Commit ist, oder es auf ein solches Objekt zeigen lassen, ohne\n"
 "die Option '--force' zu verwenden.\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Versende nach %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "Fehler beim Versenden einiger Referenzen nach '%s'"
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "ungültiges Repository '%s'"
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -10248,116 +11699,116 @@ msgstr ""
 "\n"
 "    git push <Name>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "Die Optionen --all und --tags sind inkompatibel."
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "Die Optionen --mirror und --tags sind inkompatibel."
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "Die Optionen --all und --mirror sind inkompatibel."
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "Repository"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:162
 msgid "push all refs"
 msgstr "alle Referenzen versenden"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:164
 msgid "mirror all refs"
 msgstr "alle Referenzen spiegeln"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "Referenzen löschen"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "Tags versenden (kann nicht mit --all oder --mirror verwendet werden)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:165
 msgid "force updates"
 msgstr "Aktualisierung erzwingen"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:179
 msgid "refname>:<expect"
 msgstr "Referenzname>:<Erwartungswert"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:180
 msgid "require old value of ref to be at this value"
 msgstr "Referenz muss sich auf dem angegebenen Wert befinden"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "rekursiven \"push\" von Submodulen steuern"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:173
 msgid "use thin pack"
 msgstr "kleinere Pakete verwenden"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
 msgid "receive pack program"
 msgstr "'receive pack' Programm"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "Upstream für \"git pull/status\" setzen"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "lokal gelöschte Referenzen entfernen"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "\"pre-push hook\" umgehen"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "fehlende, aber relevante Tags versenden"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:167
 msgid "GPG sign the push"
 msgstr "signiert \"push\" mit GPG"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:174
 msgid "request atomic transaction on remote side"
 msgstr "Referenzen atomar versenden"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:170
 msgid "server-specific"
 msgstr "serverspezifisch"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:171
 msgid "option to transmit"
 msgstr "Option übertragen"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr "Push-Optionen dürfen keine Zeilenvorschubzeichen haben"
 
-#: builtin/read-tree.c:37
+#: builtin/read-tree.c:40
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -10368,79 +11819,144 @@ msgstr ""
 "index-output=<Datei>] (--empty | <Commit-Referenz1> [<Commit-Referenz2> "
 "[<Commit-Referenz3>]])"
 
-#: builtin/read-tree.c:110
+#: builtin/read-tree.c:130
 msgid "write resulting index to <file>"
 msgstr "resultierenden Index nach <Datei> schreiben"
 
-#: builtin/read-tree.c:113
+#: builtin/read-tree.c:133
 msgid "only empty the index"
 msgstr "nur den Index leeren"
 
-#: builtin/read-tree.c:115
+#: builtin/read-tree.c:135
 msgid "Merging"
 msgstr "Merge"
 
-#: builtin/read-tree.c:117
+#: builtin/read-tree.c:137
 msgid "perform a merge in addition to a read"
 msgstr "einen Merge, zusätzlich zum Lesen, ausführen"
 
-#: builtin/read-tree.c:119
+#: builtin/read-tree.c:139
 msgid "3-way merge if no file level merging required"
 msgstr "3-Wege-Merge, wenn kein Merge auf Dateiebene erforderlich ist"
 
-#: builtin/read-tree.c:121
+#: builtin/read-tree.c:141
 msgid "3-way merge in presence of adds and removes"
 msgstr "3-Wege-Merge bei Vorhandensein von hinzugefügten/entfernten Zeilen"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:143
 msgid "same as -m, but discard unmerged entries"
 msgstr "genau wie -m, aber nicht zusammengeführte Einträge verwerfen"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:144
 msgid "<subdirectory>/"
 msgstr "<Unterverzeichnis>/"
 
-#: builtin/read-tree.c:125
+#: builtin/read-tree.c:145
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "das Verzeichnis in den Index unter <Unterverzeichnis>/ lesen"
 
-#: builtin/read-tree.c:128
+#: builtin/read-tree.c:148
 msgid "update working tree with merge result"
 msgstr "Arbeitsverzeichnis mit dem Ergebnis des Merges aktualisieren"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:150
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:131
+#: builtin/read-tree.c:151
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "explizit ignorierte Dateien zu überschreiben erlauben"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:154
 msgid "don't check the working tree after merging"
 msgstr "das Arbeitsverzeichnis nach dem Merge nicht prüfen"
 
-#: builtin/read-tree.c:135
+#: builtin/read-tree.c:155
 msgid "don't update the index or the work tree"
 msgstr "weder den Index, noch das Arbeitsverzeichnis aktualisieren"
 
-#: builtin/read-tree.c:137
+#: builtin/read-tree.c:157
 msgid "skip applying sparse checkout filter"
 msgstr "Anwendung des Filters für partielles Auschecken überspringen"
 
-#: builtin/read-tree.c:139
+#: builtin/read-tree.c:159
 msgid "debug unpack-trees"
-msgstr "Entpacken der Bäume protokollieren"
+msgstr "unpack-trees protokollieren"
+
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase--helper [<Optionen>]"
 
-#: builtin/receive-pack.c:25
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "Rebase fortsetzen"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "Rebase abbrechen"
+
+#: builtin/receive-pack.c:27
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <Git-Verzeichnis>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Standardmäßig wird die Aktualisierung des aktuellen Branches in einem\n"
+"nicht-Bare-Repository zurückgewiesen, da dies den Index und das Arbeits-\n"
+"verzeichnis inkonsistent zu dem machen würde, was Sie gepushed haben, und\n"
+"'git reset --hard' erforderlich wäre, damit das Arbeitsverzeichnis HEAD\n"
+"entspricht.\n"
+"\n"
+"Sie könnten die Konfigurationsvariable 'receive.denyCurrentBranch' im\n"
+"Remote-Repository auf 'ignore' oder 'warn' setzen, um den Push in den\n"
+"aktuellen Branch zu erlauben; dies wird jedoch nicht empfohlen außer\n"
+"Sie stellen durch andere Wege die Aktualität des Arbeitsverzeichnisses\n"
+"gegenüber dem gepushten Stand sicher.\n"
+"\n"
+"Um diese Meldung zu unterdrücken und das Standardverhalten zu behalten,\n"
+"setzen Sie die Konfigurationsvariable 'receive.denyCurrentBranch' auf\n"
+"'refuse'."
+
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Standardmäßig wird das Löschen des aktuellen Branches zurückgewiesen,\n"
+"da beim nächsten 'git clone' keine Dateien ausgecheckt werden würden,\n"
+"was zu Verwunderung führt.\n"
+"\n"
+"Sie können die Konfigurationsvariable 'receive.denyDeleteCurrent' im\n"
+"Remote-Repository auf 'warn' oder 'ignore' setzen, um das Löschen des\n"
+"aktuellen Branch mit oder ohne Warnung zu erlauben.\n"
+"\n"
+"Um diese Meldung zu unterdrücken, setzen Sie die Variable auf 'refuse'."
+
+#: builtin/receive-pack.c:1888
 msgid "quiet"
 msgstr "weniger Ausgaben"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1902
 msgid "You must specify a directory."
 msgstr "Sie müssen ein Repository angeben."
 
@@ -10624,7 +12140,7 @@ msgstr "(übereinstimmend)"
 msgid "(delete)"
 msgstr "(lösche)"
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
 #, c-format
 msgid "No such remote: %s"
 msgstr "Kein solches Remote-Repository: %s"
@@ -10655,7 +12171,7 @@ msgstr "Konnte '%s' nicht löschen"
 msgid "creating '%s' failed"
 msgstr "Konnte '%s' nicht erstellen"
 
-#: builtin/remote.c:792
+#: builtin/remote.c:794
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -10671,137 +12187,137 @@ msgstr[1] ""
 "entfernt;\n"
 "um diese zu entfernen, benutzen Sie:"
 
-#: builtin/remote.c:806
+#: builtin/remote.c:808
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Konnte Sektion '%s' nicht aus Konfiguration entfernen"
 
-#: builtin/remote.c:907
+#: builtin/remote.c:909
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " neu (wird bei nächstem \"fetch\" in remotes/%s gespeichert)"
 
-#: builtin/remote.c:910
+#: builtin/remote.c:912
 msgid " tracked"
 msgstr " gefolgt"
 
-#: builtin/remote.c:912
+#: builtin/remote.c:914
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " veraltet (benutzen Sie 'git remote prune' zum Löschen)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:916
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:955
+#: builtin/remote.c:957
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "ungültiges branch.%s.merge; kann Rebase nicht auf > 1 Branch ausführen"
 
-#: builtin/remote.c:963
+#: builtin/remote.c:965
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "interaktiver Rebase auf Remote-Branch %s"
 
-#: builtin/remote.c:964
+#: builtin/remote.c:966
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "Rebase auf Remote-Branch %s"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:969
 #, c-format
 msgid " merges with remote %s"
 msgstr " führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:972
 #, c-format
 msgid "merges with remote %s"
 msgstr "führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:973
+#: builtin/remote.c:975
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s    und mit Remote-Branch %s\n"
 
-#: builtin/remote.c:1016
+#: builtin/remote.c:1018
 msgid "create"
 msgstr "erstellt"
 
-#: builtin/remote.c:1019
+#: builtin/remote.c:1021
 msgid "delete"
 msgstr "gelöscht"
 
-#: builtin/remote.c:1023
+#: builtin/remote.c:1025
 msgid "up to date"
 msgstr "aktuell"
 
-#: builtin/remote.c:1026
+#: builtin/remote.c:1028
 msgid "fast-forwardable"
 msgstr "vorspulbar"
 
-#: builtin/remote.c:1029
+#: builtin/remote.c:1031
 msgid "local out of date"
 msgstr "lokal nicht aktuell"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1038
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s erzwingt Versandt nach %-*s (%s)"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s versendet nach %-*s (%s)"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1045
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s erzwingt Versand nach %s"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s versendet nach %s"
 
-#: builtin/remote.c:1114
+#: builtin/remote.c:1116
 msgid "do not query remotes"
 msgstr "keine Abfrage von Remote-Repositories"
 
-#: builtin/remote.c:1141
+#: builtin/remote.c:1143
 #, c-format
 msgid "* remote %s"
 msgstr "* Remote-Repository %s"
 
-#: builtin/remote.c:1142
+#: builtin/remote.c:1144
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL zum Abholen: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
 msgid "(no URL)"
 msgstr "(keine URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL zum Versenden: %s"
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Hauptbranch: %s"
 
-#: builtin/remote.c:1158
+#: builtin/remote.c:1160
 msgid "(not queried)"
 msgstr "(nicht abgefragt)"
 
-#: builtin/remote.c:1160
+#: builtin/remote.c:1162
 msgid "(unknown)"
 msgstr "(unbekannt)"
 
-#: builtin/remote.c:1164
+#: builtin/remote.c:1166
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -10809,246 +12325,260 @@ msgstr ""
 "  Hauptbranch (externer HEAD ist mehrdeutig, könnte einer der folgenden "
 "sein):\n"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1178
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Remote-Branch:%s"
 msgstr[1] "  Remote-Branches:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1181 builtin/remote.c:1207
 msgid " (status not queried)"
 msgstr " (Zustand nicht abgefragt)"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1190
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Lokaler Branch konfiguriert für 'git pull':"
 msgstr[1] "  Lokale Branches konfiguriert für 'git pull':"
 
-#: builtin/remote.c:1196
+#: builtin/remote.c:1198
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokale Referenzen werden von 'git push' gespiegelt"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1204
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Lokale Referenz konfiguriert für 'git push'%s:"
 msgstr[1] "  Lokale Referenzen konfiguriert für 'git push'%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1225
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1227
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "entfernt refs/remotes/<Name>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1242
 msgid "Cannot determine remote HEAD"
 msgstr "Kann HEAD des Remote-Repositories nicht bestimmen"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1244
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Mehrere Hauptbranches im Remote-Repository. Bitte wählen Sie explizit einen "
 "aus mit:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1254
 #, c-format
 msgid "Could not delete %s"
 msgstr "Konnte %s nicht entfernen"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1262
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "keine gültige Referenz: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1264
 #, c-format
 msgid "Could not setup %s"
 msgstr "Konnte %s nicht einrichten"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1282
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s wird unreferenziert!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1283
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s wurde unreferenziert!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1293
 #, c-format
 msgid "Pruning %s"
 msgstr "entferne veraltete Branches von %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1294
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1310
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [würde veralteten Branch entfernen] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1313
 #, c-format
 msgid " * [pruned] %s"
 msgstr "* [veralteten Branch entfernt] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1358
 msgid "prune remotes after fetching"
 msgstr "entferne veraltete Branches im Remote-Repository nach \"fetch\""
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Kein solches Remote-Repository '%s'"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1437
 msgid "add branch"
 msgstr "Branch hinzufügen"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1444
 msgid "no remote specified"
 msgstr "kein Remote-Repository angegeben"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1461
 msgid "query push URLs rather than fetch URLs"
 msgstr "nur URLs für Push ausgeben"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1463
 msgid "return all URLs"
 msgstr "alle URLs ausgeben"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1491
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "Keine URLs für Remote-Repository '%s' konfiguriert."
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1517
 msgid "manipulate push URLs"
 msgstr "URLs für \"push\" manipulieren"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1519
 msgid "add URL"
 msgstr "URL hinzufügen"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1521
 msgid "delete URLs"
 msgstr "URLs löschen"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1528
 msgid "--add --delete doesn't make sense"
 msgstr ""
 "Die Optionen --add und --delete können nicht gemeinsam verwendet werden."
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1569
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "ungültiges altes URL Format: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1577
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Keine solche URL gefunden: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1579
 msgid "Will not delete all non-push URLs"
 msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1593
 msgid "be verbose; must be placed before a subcommand"
 msgstr "erweiterte Ausgaben; muss vor einem Unterbefehl angegeben werden"
 
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Unbekannter Unterbefehl: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<Optionen>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"Schrittweises Neupacken ist mit Bitmap-Indexen inkompatibel. Benutzen Sie\n"
+"--no-write-bitmap-index oder deaktivieren Sie die pack.writebitmaps\n"
+"Konfiguration."
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "alles in eine einzige Pack-Datei packen"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "redundante Pakete entfernen und \"git-prune-packed\" ausführen"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "--no-reuse-delta an git-pack-objects übergeben"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "--no-reuse-object an git-pack-objects übergeben"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "git-update-server-info nicht ausführen"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "--local an git-pack-objects übergeben"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "Bitmap-Index schreiben"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "Datumsangabe"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr "mit -A, keine Objekte älter als dieses Datum löschen"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "mit -a, nicht erreichbare Objekte neu packen"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
 msgstr "Größe des Fensters für die Delta-Kompression"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "Bytes"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "gleiches wie oben, aber die Speichergröße anstatt der\n"
 "Anzahl der Einträge limitieren"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
 msgstr "die maximale Delta-Tiefe limitieren"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "maximale Größe für jede Paketdatei"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr ""
 "Objekte umpacken, die sich in mit .keep markierten Pack-Dateien befinden"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "kann Pack-Dateien in precious-objects Repository nicht löschen"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable und -A sind inkompatibel"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "Fehler beim Löschen von '%s'"
@@ -11073,22 +12603,22 @@ msgstr "git replace -d <Objekt>..."
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<Format>] [-l [<Muster>]]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
 #, c-format
 msgid "Not a valid object name: '%s'"
 msgstr "Ungültiger Objekt-Name: '%s'"
 
-#: builtin/replace.c:355
+#: builtin/replace.c:360
 #, c-format
 msgid "bad mergetag in commit '%s'"
 msgstr "ungültiger Merge-Tag in Commit '%s'"
 
-#: builtin/replace.c:357
+#: builtin/replace.c:362
 #, c-format
 msgid "malformed mergetag in commit '%s'"
 msgstr "fehlerhafter Merge-Tag in Commit '%s'"
 
-#: builtin/replace.c:368
+#: builtin/replace.c:373
 #, c-format
 msgid ""
 "original commit '%s' contains mergetag '%s' that is discarded; use --edit "
@@ -11097,45 +12627,45 @@ msgstr ""
 "Der ursprüngliche Commit '%s' enthält Merge-Tag '%s', der verworfen\n"
 "wird; benutzen Sie --edit anstatt --graft"
 
-#: builtin/replace.c:401
+#: builtin/replace.c:406
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
 msgstr "Der ursprüngliche Commit '%s' hat eine GPG-Signatur."
 
-#: builtin/replace.c:402
+#: builtin/replace.c:407
 msgid "the signature will be removed in the replacement commit!"
 msgstr "Die Signatur wird in dem Ersetzungs-Commit entfernt!"
 
-#: builtin/replace.c:408
+#: builtin/replace.c:413
 #, c-format
 msgid "could not write replacement commit for: '%s'"
 msgstr "Konnte Ersetzungs-Commit für '%s' nicht schreiben"
 
-#: builtin/replace.c:432
+#: builtin/replace.c:437
 msgid "list replace refs"
 msgstr "ersetzende Referenzen auflisten"
 
-#: builtin/replace.c:433
+#: builtin/replace.c:438
 msgid "delete replace refs"
 msgstr "ersetzende Referenzen löschen"
 
-#: builtin/replace.c:434
+#: builtin/replace.c:439
 msgid "edit existing object"
 msgstr "existierendes Objekt bearbeiten"
 
-#: builtin/replace.c:435
+#: builtin/replace.c:440
 msgid "change a commit's parents"
 msgstr "Eltern-Commits eines Commits ändern"
 
-#: builtin/replace.c:436
+#: builtin/replace.c:441
 msgid "replace the ref if it exists"
 msgstr "die Referenz ersetzen, wenn sie existiert"
 
-#: builtin/replace.c:437
+#: builtin/replace.c:442
 msgid "do not pretty-print contents for --edit"
 msgstr "keine ansprechende Anzeige des Objektinhaltes für --edit"
 
-#: builtin/replace.c:438
+#: builtin/replace.c:443
 msgid "use this format"
 msgstr "das angegebene Format benutzen"
 
@@ -11154,8 +12684,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<Commit>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <Commit-Referenz> [--] <Pfade>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<Commit-Referenz>] [--] <Pfade>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11275,28 +12805,28 @@ msgstr "Konnte Index-Datei nicht zu Commit '%s' setzen."
 msgid "Could not write new index file."
 msgstr "Konnte neue Index-Datei nicht schreiben."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list unterstützt keine Anzeige von Notizen"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:393
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<Optionen>] -- [<Argumente>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:398
 msgid "keep the `--` passed as an arg"
 msgstr "`--` als Argument lassen"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:400
 msgid "stop parsing after the first non-option argument"
 msgstr "das Parsen nach dem ersten Argument, was keine Option ist, stoppen"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:403
 msgid "output in stuck long form"
 msgstr ""
 "Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:534
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11327,68 +12857,72 @@ msgstr "git cherry-pick [<Optionen>] <Commit-Angabe>..."
 msgid "git cherry-pick <subcommand>"
 msgstr "git cherry-pick <Unterbefehl>"
 
-#: builtin/revert.c:71
+#: builtin/revert.c:89
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s: %s kann nicht mit %s verwendet werden"
 
-#: builtin/revert.c:80
+#: builtin/revert.c:98
 msgid "end revert or cherry-pick sequence"
 msgstr "\"revert\" oder \"cherry-pick\" Ablauf beenden"
 
-#: builtin/revert.c:81
+#: builtin/revert.c:99
 msgid "resume revert or cherry-pick sequence"
 msgstr "\"revert\" oder \"cherry-pick\" Ablauf fortsetzen"
 
-#: builtin/revert.c:82
+#: builtin/revert.c:100
 msgid "cancel revert or cherry-pick sequence"
 msgstr "\"revert\" oder \"cherry-pick\" Ablauf abbrechen"
 
-#: builtin/revert.c:83
+#: builtin/revert.c:101
 msgid "don't automatically commit"
 msgstr "nicht automatisch committen"
 
-#: builtin/revert.c:84
+#: builtin/revert.c:102
 msgid "edit the commit message"
 msgstr "Commit-Beschreibung bearbeiten"
 
-#: builtin/revert.c:87
-msgid "parent number"
+#: builtin/revert.c:105
+msgid "parent-number"
 msgstr "Nummer des Elternteils"
 
-#: builtin/revert.c:89
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "Elternteil der Hauptlinie auswählen"
+
+#: builtin/revert.c:108
 msgid "merge strategy"
 msgstr "Merge-Strategie"
 
-#: builtin/revert.c:90
+#: builtin/revert.c:109
 msgid "option"
 msgstr "Option"
 
-#: builtin/revert.c:91
+#: builtin/revert.c:110
 msgid "option for merge strategy"
 msgstr "Option für Merge-Strategie"
 
-#: builtin/revert.c:100
+#: builtin/revert.c:119
 msgid "append commit name"
 msgstr "Commit-Namen anhängen"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:121
 msgid "preserve initially empty commits"
 msgstr "ursprüngliche, leere Commits erhalten"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:122
 msgid "allow commits with empty messages"
 msgstr "Commits mit leerer Beschreibung erlauben"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:123
 msgid "keep redundant, empty commits"
 msgstr "redundante, leere Commits behalten"
 
-#: builtin/revert.c:192
+#: builtin/revert.c:211
 msgid "revert failed"
 msgstr "\"revert\" fehlgeschlagen"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:224
 msgid "cherry-pick failed"
 msgstr "\"cherry-pick\" fehlgeschlagen"
 
@@ -11396,30 +12930,7 @@ msgstr "\"cherry-pick\" fehlgeschlagen"
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<Optionen>] [--] <Datei>..."
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"das folgende Submodul (oder ein geschachteltes Submodul hiervon)\n"
-"benutzt ein .git-Verzeichnis:"
-msgstr[1] ""
-"die folgenden Submodule (oder ein geschachteltes Submodul hiervon)\n"
-"benutzen ein .git-Verzeichnis:"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n"
-"seiner Historie löschen möchten)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11434,7 +12945,7 @@ msgstr[1] ""
 "unterschiedlich\n"
 "zu der Datei und HEAD:"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11442,13 +12953,13 @@ msgstr ""
 "\n"
 "(benutzen Sie -f, um die Löschung zu erzwingen)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
 msgstr[0] "die folgende Datei hat zum Commit vorgemerkte Änderungen:"
 msgstr[1] "die folgenden Dateien haben zum Commit vorgemerkte Änderungen:"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11457,42 +12968,47 @@ msgstr ""
 "(benutzen Sie --cached, um die Datei zu behalten, oder -f, um die Entfernung "
 "zu erzwingen)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "die folgende Datei hat lokale Änderungen:"
 msgstr[1] "die folgenden Dateien haben lokale Änderungen:"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "keine gelöschten Dateien auflisten"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "nur aus dem Index entfernen"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "die \"up-to-date\" Prüfung überschreiben"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "rekursive Entfernung erlauben"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "mit Rückgabewert 0 beenden, wenn keine Übereinstimmung gefunden wurde"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "'%s' wird nicht ohne -r rekursiv entfernt"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm: konnte %s nicht löschen"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "Konnte '%s' nicht löschen"
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11506,19 +13022,19 @@ msgstr ""
 "  --all und die explizite Angabe einer <Referenz> schließen sich gegenseitig "
 "aus."
 
-#: builtin/send-pack.c:160
+#: builtin/send-pack.c:161
 msgid "remote name"
 msgstr "Name des Remote-Repositories"
 
-#: builtin/send-pack.c:171
+#: builtin/send-pack.c:175
 msgid "use stateless RPC protocol"
 msgstr "zustandsloses RPC-Protokoll verwenden"
 
-#: builtin/send-pack.c:172
+#: builtin/send-pack.c:176
 msgid "read refs from stdin"
 msgstr "Referenzen von der Standard-Eingabe lesen"
 
-#: builtin/send-pack.c:173
+#: builtin/send-pack.c:177
 msgid "print status from remote helper"
 msgstr "Status des Remote-Helpers ausgeben"
 
@@ -11526,23 +13042,27 @@ msgstr "Status des Remote-Helpers ausgeben"
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [<Optionen>] [<Commitbereich>] [[--] [<Pfad>...]]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr "über Commit-Ersteller anstatt Autor gruppieren"
+
+#: builtin/shortlog.c:250
 msgid "sort output according to the number of commits per author"
 msgstr "die Ausgabe entsprechend der Anzahl von Commits pro Autor sortieren"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:252
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr "Commit-Beschreibungen unterdrücken, nur Anzahl der Commits liefern"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:254
 msgid "Show the email address of each author"
 msgstr "die E-Mail-Adresse von jedem Autor anzeigen"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:255
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:256
 msgid "Linewrap output"
 msgstr "Ausgabe mit Zeilenumbrüchen"
 
@@ -11562,71 +13082,127 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<Basis>]] [--list] [<Referenz>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "ignoriere %s; kann nicht mehr als %d Referenz behandeln"
+msgstr[1] "ignoriere %s; kann nicht mehr als %d Referenzen behandeln"
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr "keine übereinstimmenden Referenzen mit %s"
+
+#: builtin/show-branch.c:632
 msgid "show remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches anzeigen"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:634
 msgid "show remote-tracking branches"
 msgstr "Remote-Tracking-Branches anzeigen"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:636
 msgid "color '*!+-' corresponding to the branch"
 msgstr "'*!+-' entsprechend des Branches einfärben"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:638
 msgid "show <n> more commits after the common ancestor"
 msgstr "<n> weitere Commits nach dem gemeinsamen Vorgänger-Commit anzeigen"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:640
 msgid "synonym to more=-1"
 msgstr "Synonym für more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:641
 msgid "suppress naming strings"
 msgstr "Namen unterdrücken"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:643
 msgid "include the current branch"
 msgstr "den aktuellen Branch einbeziehen"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:645
 msgid "name commits with their object names"
 msgstr "Commits nach ihren Objektnamen benennen"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:647
 msgid "show possible merge bases"
 msgstr "mögliche Merge-Basen anzeigen"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:649
 msgid "show refs unreachable from any other ref"
 msgstr ""
 "Referenzen, die unerreichbar von allen anderen Referenzen sind, anzeigen"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:651
 msgid "show commits in topological order"
 msgstr "Commits in topologischer Ordnung anzeigen"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:654
 msgid "show only commits not on the first branch"
 msgstr "nur Commits anzeigen, die sich nicht im ersten Branch befinden"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:656
 msgid "show merges reachable from only one tip"
 msgstr "Merges anzeigen, die nur von einem Branch aus erreichbar sind"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:658
 msgid "topologically sort, maintaining date order where possible"
 msgstr "topologische Sortierung, Beibehaltung Datumsordnung wo möglich"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:661
 msgid "<n>[,<base>]"
 msgstr "<n>[,<Basis>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:662
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "die <n> jüngsten Einträge im Reflog, beginnend an der Basis, anzeigen"
 
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog ist inkompatibel mit --all, --remotes, --independent oder --merge-"
+"base"
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "keine Branches angegeben, und HEAD ist ungültig"
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "Die Option --reflog benötigt einen Branchnamen."
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "nur %d Eintrag kann zur selben Zeit angezeigt werden"
+msgstr[1] "nur %d Einträge können zur selben Zeit angezeigt werden"
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr "Referenz nicht gefunden: %s"
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "Kann nicht mehr als %d Commit behandeln."
+msgstr[1] "Kann nicht mehr als %d Commits behandeln."
+
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' ist keine gültige Referenz."
+
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "kann Commit %s (%s) nicht finden"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11639,37 +13215,37 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<Muster>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "nur Tags anzeigen (kann mit \"heads\" kombiniert werden)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "nur Branches anzeigen (kann mit \"tags\" kombiniert werden)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr "strengere Referenzprüfung, erfordert exakten Referenzpfad"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr ""
 "die HEAD-Referenz anzeigen, selbst wenn diese ausgefiltert werden würde"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
 msgstr "Tags in Objekt-Identifikationen dereferenzieren"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "nur SHA1 Hash mit <n> Ziffern anzeigen"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 "keine Ausgabe der Ergebnisse in die Standard-Ausgabe (nützlich mit --verify)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 "Referenzen von der Standard-Eingabe anzeigen, die sich nicht im lokalen "
@@ -11693,12 +13269,12 @@ msgstr ""
 msgid "prepend comment character and space to each line"
 msgstr "Kommentarzeichen mit Leerzeichen an jede Zeile voranstellen"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
 msgid "No such ref: %s"
 msgstr "Referenz nicht gefunden: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Vollständiger Referenzname erwartet, %s erhalten"
@@ -11708,77 +13284,105 @@ msgstr "Vollständiger Referenzname erwartet, %s erhalten"
 msgid "cannot strip one component off url '%s'"
 msgstr "Kann eine Komponente von URL '%s' nicht extrahieren"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
 msgid "alternative anchor for relative paths"
 msgstr "Alternativer Anker für relative Pfade"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:310
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<Pfad>] [<Pfad>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "Keine URL für Submodul-Pfad '%s' in .gitmodules gefunden"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr ""
+"Konnte Konfiguration '%s' nicht nachschlagen. Nehme an, dass dieses "
+"Repository\n"
+"sein eigenes verbindliches Upstream-Repository ist."
+
+#: builtin/submodule--helper.c:406
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr ""
 "Fehler beim Eintragen der URL für Submodul-Pfad '%s' in die Konfiguration."
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:410
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Submodul '%s' (%s) für Pfad '%s' in die Konfiguration eingetragen.\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:420
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "Warnung: 'update'-Modus für Submodul '%s' vorgeschlagen\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:427
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr ""
 "Fehler bei Änderung des Aktualisierungsmodus für Submodul-Pfad '%s' in der\n"
 "Konfiguration."
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:443
 msgid "Suppress output for initializing a submodule"
 msgstr "Ausgaben bei Initialisierung eines Submoduls unterdrücken"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:448
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<Pfad>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:476
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <Pfad>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:482
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "Keine Submodul-Zuordnung in .gitmodules für Pfad '%s' gefunden"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "Submodul '%s' kann Alternative nicht hinzufügen: %s"
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "Wert '%s' für submodule.alternateErrorStrategy wird nicht erkannt"
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Wert '%s' für submodule.alternateLocation wird nicht erkannt."
+
+#: builtin/submodule--helper.c:633
 msgid "where the new submodule will be cloned to"
 msgstr "Pfad für neues Submodul"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:636
 msgid "name of the new submodule"
 msgstr "Name des neuen Submoduls"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:639
 msgid "url where to clone the submodule from"
 msgstr "URL von der das Submodul geklont wird"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:645
 msgid "depth for shallow clones"
 msgstr "Tiefe des Klons mit unvollständiger Historie (shallow)"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "Fortschrittsanzeige beim Klonen erzwingen"
+
+#: builtin/submodule--helper.c:653
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11787,103 +13391,88 @@ msgstr ""
 "<Repository>] [--name <Name>] [--url <URL>] [--name <Name>] [--depth "
 "<Tiefe>] --url <URL> --path <Pfad>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "Konnte Verzeichnis '%s' nicht erstellen."
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:684
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "Klonen von '%s' in Submodul-Pfad '%s' fehlgeschlagen"
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "Kann Datei '%s' nicht öffnen"
-
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
-msgstr "Konnte Datei '%s' nicht schließen."
-
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:699
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "Konnte Submodul-Verzeichnis '%s' nicht finden."
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:764
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Submodul-Pfad '%s' nicht initialisiert"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:768
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Meinten Sie vielleicht 'update --init'?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Überspringe nicht zusammengeführtes Submodul %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:814
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Überspringe Submodul '%s'"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:942
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "Fehler beim Klonen von '%s'. Weiterer Versuch geplant"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:953
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "Zweiter Versuch '%s' zu klonen fehlgeschlagen, breche ab."
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
 msgid "path into the working tree"
 msgstr "Pfad zum Arbeitsverzeichnis"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:977
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr ""
 "Pfad zum Arbeitsverzeichnis, über verschachtelte Submodul-Grenzen hinweg"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:981
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout oder none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:985
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr ""
 "Erstellung eines Klons mit unvollständiger Historie (shallow), abgeschnitten "
 "bei\n"
 "der angegebenen Anzahl von Commits."
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:988
 msgid "parallel jobs"
 msgstr "Parallele Ausführungen"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:990
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr ""
 "ob das initiale Klonen den Empfehlungen für eine unvollständige\n"
 "Historie (shallow) folgen soll"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:991
 msgid "don't print cloning progress"
 msgstr "keine Fortschrittsanzeige beim Klonen"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:998
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<Pfad>] [<Pfad>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:1008
 msgid "bad value for update parameter"
 msgstr "Fehlerhafter Wert für --update Parameter"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1079
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11892,11 +13481,24 @@ msgstr ""
 "Branch von Submodul (%s) ist konfiguriert, den Branch des Hauptprojektes\n"
 "zu erben, aber das Hauptprojekt befindet sich auf keinem Branch."
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "Rekursion in Submodule durchführen"
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir [<Pfad>...]"
+
+#: builtin/submodule--helper.c:1226
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "submodule--helper muss mit einem Unterbefehl aufgerufen werden"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s unterstützt kein --super-prefix"
+
+#: builtin/submodule--helper.c:1239
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' ist kein gültiger Unterbefehl von submodule--helper"
@@ -11944,32 +13546,29 @@ msgstr "git tag -d <Tagname>..."
 
 #: builtin/tag.c:25
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-n[<Nummer>]] [--contains <Commit>] [--points-at <Objekt>]\n"
+"git tag -l [-n[<Nummer>]] [--contains <Commit>] [--no-contains <Commit>] [--"
+"points-at <Objekt>]\n"
 "\t\t[--format=<Muster>] [--[no-]merged [<Commit>]] [<Muster>...]"
 
 #: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <Tagname>..."
-
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "Tagname zu lang: %.*s..."
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<Format>] <Tagname>..."
 
-#: builtin/tag.c:86
+#: builtin/tag.c:83
 #, c-format
 msgid "tag '%s' not found."
 msgstr "Tag '%s' nicht gefunden."
 
-#: builtin/tag.c:101
+#: builtin/tag.c:99
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' gelöscht (war %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:128
 #, c-format
 msgid ""
 "\n"
@@ -11982,7 +13581,7 @@ msgstr ""
 "  %s\n"
 "ein. Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:132
 #, c-format
 msgid ""
 "\n"
@@ -11997,143 +13596,147 @@ msgstr ""
 "ein. Zeilen, die mit '%c' beginnen, werden behalten; Sie dürfen diese\n"
 "selbst entfernen wenn Sie möchten.\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:210
 msgid "unable to sign the tag"
 msgstr "konnte Tag nicht signieren"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:212
 msgid "unable to write tag file"
 msgstr "konnte Tag-Datei nicht schreiben"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:236
 msgid "bad object type."
 msgstr "ungültiger Objekt-Typ"
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "Tag-Kopf zu groß."
-
-#: builtin/tag.c:275
+#: builtin/tag.c:282
 msgid "no tag message?"
 msgstr "keine Tag-Beschreibung?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:289
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Die Tag-Beschreibung wurde gelassen in %s\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:397
 msgid "list tag names"
 msgstr "Tagnamen auflisten"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:399
 msgid "print <n> lines of each tag message"
 msgstr "<n> Zeilen jeder Tag-Beschreibung anzeigen"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:401
 msgid "delete tags"
 msgstr "Tags löschen"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:402
 msgid "verify tags"
 msgstr "Tags überprüfen"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:404
 msgid "Tag creation options"
 msgstr "Optionen für Erstellung von Tags"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:406
 msgid "annotated tag, needs a message"
 msgstr "annotiertes Tag, benötigt eine Beschreibung"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:408
 msgid "tag message"
 msgstr "Tag-Beschreibung"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:410
 msgid "annotated and GPG-signed tag"
 msgstr "annotiertes und GPG-signiertes Tag"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:414
 msgid "use another key to sign the tag"
 msgstr "einen anderen Schlüssel verwenden, um das Tag zu signieren"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:415
 msgid "replace the tag if exists"
 msgstr "das Tag ersetzen, wenn es existiert"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:416 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "Reflog erstellen"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:418
 msgid "Tag listing options"
 msgstr "Optionen für Auflistung der Tags"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:419
 msgid "show tag list in columns"
 msgstr "Liste der Tags in Spalten anzeigen"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:420 builtin/tag.c:422
 msgid "print only tags that contain the commit"
 msgstr "nur Tags ausgeben, die diesen Commit beinhalten"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "nur Tags ausgeben, die diesen Commit nicht enthalten"
+
+#: builtin/tag.c:424
 msgid "print only tags that are merged"
 msgstr "nur Tags ausgeben, die gemerged wurden"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:425
 msgid "print only tags that are not merged"
 msgstr "nur Tags ausgeben, die nicht gemerged wurden"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:430
 msgid "print only tags of the object"
 msgstr "nur Tags von dem Objekt ausgeben"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:469
 msgid "--column and -n are incompatible"
 msgstr "--column und -n sind inkompatibel"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "-n Option ist nur erlaubt mit -l."
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "Die Option -n ist nur im Listenmodus erlaubt."
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "--contains Option ist nur erlaubt mit -l."
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "Die Option --contains ist nur im Listenmodus erlaubt."
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "--points-at Option ist nur erlaubt mit -l."
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "Die Option --no-contains ist nur im Listenmodus erlaubt."
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "Die Optionen --merged und --no-merged sind nur mit -l erlaubt."
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "Die Option --points-at ist nur im Listenmodus erlaubt."
 
-#: builtin/tag.c:433
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr "Die Optionen --merged und --no-merged sind nur im Listenmodus erlaubt."
+
+#: builtin/tag.c:510
 msgid "only one -F or -m option is allowed."
 msgstr "nur eine -F oder -m Option ist erlaubt."
 
-#: builtin/tag.c:452
+#: builtin/tag.c:529
 msgid "too many params"
 msgstr "zu viele Parameter"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:535
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' ist kein gültiger Tagname."
 
-#: builtin/tag.c:463
+#: builtin/tag.c:540
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Tag '%s' existiert bereits"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:570
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Tag '%s' aktualisiert (war %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "Entpacke Objekte"
 
@@ -12157,188 +13760,221 @@ msgstr "Konnte Datei '%s' nicht erstellen"
 msgid "failed to delete file %s"
 msgstr "Konnte Datei '%s' nicht löschen"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/update-index.c:110 builtin/update-index.c:216
 #, c-format
 msgid "failed to delete directory %s"
 msgstr "Konnte Verzeichnis '%s' nicht löschen"
 
-#: builtin/update-index.c:133
+#: builtin/update-index.c:135
 #, c-format
 msgid "Testing mtime in '%s' "
 msgstr "Prüfe mtime in '%s' "
 
-#: builtin/update-index.c:145
+#: builtin/update-index.c:149
 msgid "directory stat info does not change after adding a new file"
 msgstr ""
 "Verzeichnisinformationen haben sich nach Hinzufügen einer neuen Datei nicht "
 "geändert"
 
-#: builtin/update-index.c:158
+#: builtin/update-index.c:162
 msgid "directory stat info does not change after adding a new directory"
 msgstr ""
 "Verzeichnisinformationen haben sich nach Hinzufügen eines neuen "
 "Verzeichnisses nicht geändert"
 
-#: builtin/update-index.c:171
+#: builtin/update-index.c:175
 msgid "directory stat info changes after updating a file"
 msgstr ""
 "Verzeichnisinformationen haben sich nach Aktualisierung einer Datei geändert"
 
-#: builtin/update-index.c:182
+#: builtin/update-index.c:186
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 "Verzeichnisinformationen haben sich nach Hinzufügen einer Datei in ein "
 "Unterverzeichnis geändert"
 
-#: builtin/update-index.c:193
+#: builtin/update-index.c:197
 msgid "directory stat info does not change after deleting a file"
 msgstr ""
 "Verzeichnisinformationen haben sich nach dem Löschen einer Datei nicht "
 "geändert"
 
-#: builtin/update-index.c:206
+#: builtin/update-index.c:210
 msgid "directory stat info does not change after deleting a directory"
 msgstr ""
 "Verzeichnisinformationen haben sich nach dem Löschen eines Verzeichnisses "
 "nicht geändert"
 
-#: builtin/update-index.c:213
+#: builtin/update-index.c:217
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:568
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<Optionen>] [--] [<Datei>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:923
 msgid "continue refresh even when index needs update"
 msgstr ""
 "Aktualisierung fortsetzen, auch wenn der Index aktualisiert werden muss"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:926
 msgid "refresh: ignore submodules"
 msgstr "Aktualisierung: ignoriert Submodule"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:929
 msgid "do not ignore new files"
 msgstr "keine neuen Dateien ignorieren"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:931
 msgid "let files replace directories and vice-versa"
 msgstr "Dateien Verzeichnisse ersetzen lassen, und umgedreht"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:933
 msgid "notice files missing from worktree"
 msgstr "fehlende Dateien im Arbeitsverzeichnis beachten"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:935
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 "aktualisieren, auch wenn der Index nicht zusammengeführte Einträge beinhaltet"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:938
 msgid "refresh stat information"
 msgstr "Dateiinformationen aktualisieren"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:942
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "wie --refresh, ignoriert aber \"assume-unchanged\" Einstellung"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:946
 msgid "<mode>,<object>,<path>"
 msgstr "<Modus>,<Objekt>,<Pfad>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:947
 msgid "add the specified entry to the index"
 msgstr "den angegebenen Eintrag zum Commit vormerken"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:956
 msgid "mark files as \"not changing\""
 msgstr "diese Datei immer als unverändert betrachten"
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:959
 msgid "clear assumed-unchanged bit"
 msgstr "\"assumed-unchanged\"-Bit löschen"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:962
 msgid "mark files as \"index-only\""
 msgstr "Dateien als \"index-only\" markieren"
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:965
 msgid "clear skip-worktree bit"
 msgstr "\"skip-worktree\"-Bit löschen"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:968
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "die Änderungen nur zum Commit vormerken; Inhalt wird nicht der Objekt-"
 "Datenbank hinzugefügt"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:970
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "benannte Pfade löschen, auch wenn sie sich im Arbeitsverzeichnis befinden"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:972
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "mit --stdin: eingegebene Zeilen sind durch NUL-Bytes abgeschlossen"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:974
 msgid "read list of paths to be updated from standard input"
 msgstr "Liste der zu aktualisierenden Pfade von der Standard-Eingabe lesen"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:978
 msgid "add entries from standard input to the index"
 msgstr "Einträge von der Standard-Eingabe zum Commit vormerken"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:982
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 "wiederholtes Einpflegen der Zustände #2 und #3 für die aufgelisteten Pfade"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:986
 msgid "only update entries that differ from HEAD"
 msgstr "nur Einträge aktualisieren, die unterschiedlich zu HEAD sind"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:990
 msgid "ignore files missing from worktree"
 msgstr "fehlende Dateien im Arbeitsverzeichnis ignorieren"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:993
 msgid "report actions to standard output"
 msgstr "die Aktionen in der Standard-Ausgabe ausgeben"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:995
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(für Fremdprogramme) keine gespeicherten, nicht aufgelöste Konflikte"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:999
 msgid "write index in this format"
 msgstr "Index-Datei in diesem Format schreiben"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:1001
 msgid "enable or disable split index"
 msgstr "Splitting des Index aktivieren oder deaktivieren"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:1003
 msgid "enable/disable untracked cache"
 msgstr "Cache für unversionierte Dateien aktivieren oder deaktivieren"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1005
 msgid "test if the filesystem supports untracked cache"
 msgstr ""
 "prüfen ob das Dateisystem einen Cache für unversionierte Dateien unterstützt"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1007
 msgid "enable untracked cache without testing the filesystem"
 msgstr ""
 "Cache für unversionierte Dateien ohne Prüfung des Dateisystems aktivieren"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+"core.splitIndex ist auf 'false' gesetzt. Entfernen oder ändern Sie dies,\n"
+"wenn sie wirklich das Splitting des Index aktivieren möchten."
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"core.splitIndex ist auf 'true' gesetzt. Entfernen oder ändern Sie dies,\n"
+"wenn Sie wirklich das Splitting des Index deaktivieren möchten."
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache ist auf 'true' gesetzt. Entfernen oder ändern Sie dies,\n"
+"wenn Sie wirklich den Cache für unversionierte Dateien deaktivieren möchten."
+
+#: builtin/update-index.c:1131
 msgid "Untracked cache disabled"
 msgstr "Cache für unversionierte Dateien deaktiviert"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache ist auf 'false' gesetzt. Entfernen oder ändern Sie "
+"dies,\n"
+"wenn sie wirklich den Cache für unversionierte Dateien aktivieren möchten."
+
+#: builtin/update-index.c:1143
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Cache für unversionierte Dateien für '%s' aktiviert"
@@ -12388,7 +14024,7 @@ msgstr "git verify-commit [-v | --verbose] <Commit>..."
 msgid "print commit contents"
 msgstr "Commit-Inhalte ausgeben"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "unbearbeitete Ausgabe des Status von gpg ausgeben"
 
@@ -12404,11 +14040,11 @@ msgstr "erweiterte Ausgaben"
 msgid "show statistics only"
 msgstr "nur Statistiken anzeigen"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <Tag>..."
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<Format>] <Tag>..."
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "Tag-Inhalte ausgeben"
 
@@ -12432,92 +14068,104 @@ msgstr "git worktree prune [<Optionen>]"
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock <Pfad>"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:43
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Lösche worktrees/%s: kein gültiges Verzeichnis"
 
-#: builtin/worktree.c:48
+#: builtin/worktree.c:49
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Lösche worktrees/%s: gitdir-Datei existiert nicht"
 
-#: builtin/worktree.c:53
+#: builtin/worktree.c:54
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Lösche worktrees/%s: konnte gitdir-Datei (%s) nicht lesen"
 
-#: builtin/worktree.c:64
+#: builtin/worktree.c:65
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Lösche worktrees/%s: ungültige gitdir-Datei"
 
-#: builtin/worktree.c:80
+#: builtin/worktree.c:81
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Lösche worktrees/%s: gitdir-Datei verweist auf nicht existierenden Ort"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "entfernte Arbeitsverzeichnisse ausgeben"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "Arbeitsverzeichnisse älter als <Zeit> verfallen lassen"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existiert bereits"
 
-#: builtin/worktree.c:236
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/worktree.c:272
+#: builtin/worktree.c:274
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Bereite %s vor (Identifikation %s)"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:328
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 "<Branch> auschecken, auch wenn dieser bereits in einem anderen "
 "Arbeitsverzeichnis ausgecheckt ist"
 
-#: builtin/worktree.c:325
+#: builtin/worktree.c:330
 msgid "create a new branch"
 msgstr "neuen Branch erstellen"
 
-#: builtin/worktree.c:327
+#: builtin/worktree.c:332
 msgid "create or reset a branch"
 msgstr "Branch erstellen oder umsetzen"
 
-#: builtin/worktree.c:329
+#: builtin/worktree.c:334
 msgid "populate the new working tree"
 msgstr "das neue Arbeitsverzeichnis auschecken"
 
-#: builtin/worktree.c:337
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr "das neue Arbeitsverzeichnis gesperrt lassen"
+
+#: builtin/worktree.c:343
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B und --detach schließen sich gegenseitig aus"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:478
 msgid "reason for locking"
 msgstr "Sperrgrund"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:490 builtin/worktree.c:523
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "'%s' ist kein Arbeitsverzeichnis"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:492 builtin/worktree.c:525
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "Das Hauptarbeitsverzeichnis kann nicht gesperrt oder entsperrt werden."
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:497
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "'%s' ist bereits gesperrt, Grund: %s"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:499
 #, c-format
 msgid "'%s' is already locked"
 msgstr "'%s' ist bereits gesperrt"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:527
 #, c-format
 msgid "'%s' is not locked"
 msgstr "'%s' ist nicht gesperrt"
@@ -12538,26 +14186,44 @@ msgstr "das \"Tree\"-Objekt für ein Unterverzeichnis <Präfix> schreiben"
 msgid "only useful for debugging"
 msgstr "nur nützlich für Fehlersuche"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<Optionen>] <Verzeichnis>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1040
 msgid "quit after a single request/response exchange"
 msgstr "nach einem einzigen Request/Response-Austausch beenden"
 
-#: upload-pack.c:839
+#: upload-pack.c:1042
 msgid "exit immediately after initial ref advertisement"
 msgstr "direkt nach der initialen Angabe der Commits beenden"
 
-#: upload-pack.c:841
+#: upload-pack.c:1044
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr "kein Versuch in <Verzeichnis>/.git/ wenn <Verzeichnis> kein Git-Verzeichnis ist"
+msgstr ""
+"kein Versuch in <Verzeichnis>/.git/ wenn <Verzeichnis> kein Git-Verzeichnis "
+"ist"
 
-#: upload-pack.c:843
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "Übertragung nach <n> Sekunden Inaktivität unterbrechen"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"Die Berechtigungen auf Ihr Socket-Verzeichnis sind zu schwach; andere\n"
+"Nutzer könnten Ihre zwischengespeicherten Anmeldeinformationen lesen.\n"
+"Ziehen Sie in Betracht\n"
+"\n"
+"\tchmod 0700 %s\n"
+"\n"
+"auszuführen."
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "Meldungen zur Fehlersuche in Standard-Fehlerausgabe ausgeben"
@@ -12573,12 +14239,37 @@ msgstr ""
 "oder 'git help <Konzept>', um mehr über einen spezifischen Befehl oder\n"
 "Konzept zu erfahren."
 
-#: http.c:323
+#: http.c:336
+#, c-format
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr "negativer Wert für http.postbuffer; benutze Standardwert %d"
+
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Kontrolle über Delegation wird mit cURL < 7.22.0 nicht unterstützt"
+
+#: http.c:366
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr ""
 "Das Anheften des öffentlichen Schlüssels wird mit cURL < 7.44.0\n"
 "nicht unterstützt."
 
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"Konnte Basis-URL nicht durch Umleitung aktualisieren:\n"
+"  gefragt nach: %s\n"
+"    umgeleitet: %s"
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "Leite nach %s um"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "Arbeitsverzeichnis anlegen (siehe auch: git help tutorial)"
@@ -12701,15 +14392,15 @@ msgstr "Verfallsdatum"
 msgid "no-op (backward compatibility)"
 msgstr "Kein Effekt (Rückwärtskompatibilität)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "erweiterte Ausgaben"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "weniger Ausgaben"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "benutze <n> Ziffern zur Anzeige von SHA-1s"
 
@@ -12927,7 +14618,8 @@ msgid ""
 "Error: Your local changes to the following files would be overwritten by "
 "merge"
 msgstr ""
-"Fehler Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"Fehler Ihre lokalen Änderungen in den folgenden Dateien würden durch den "
+"Merge\n"
 "überschrieben werden"
 
 #: git-merge-octopus.sh:61
@@ -12935,7 +14627,7 @@ msgid "Automated merge did not work."
 msgstr "Automatischer Merge hat nicht funktioniert."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "Sollte keinen Octopus-Merge ausführen."
 
 #: git-merge-octopus.sh:73
@@ -12962,7 +14654,7 @@ msgstr "Versuche einfachen Merge mit $pretty_name"
 msgid "Simple merge did not work, trying automatic merge."
 msgstr "Einfacher Merge hat nicht funktioniert, versuche automatischen Merge."
 
-#: git-rebase.sh:56
+#: git-rebase.sh:58
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12976,53 +14668,39 @@ msgstr ""
 "Um den ursprünglichen Branch wiederherzustellen und den Rebase abzubrechen,\n"
 "führen Sie \"git rebase --abort\" aus."
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:158 git-rebase.sh:397
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Konnte nicht zu $head_name zurückgehen"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "Automatischen Stash angewendet."
-
-#: git-rebase.sh:170
+#: git-rebase.sh:172
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Kann $stash_sha1 nicht speichern."
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"Anwendung des automatischen Stash resultierte in Konflikten.\n"
-"Ihre Änderungen sind im Stash sicher.\n"
-"Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:212
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen."
 
-#: git-rebase.sh:215
+#: git-rebase.sh:217
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "\"git-am\" scheint im Gange zu sein. Kann Rebase nicht durchführen."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:358
 msgid "No rebase in progress?"
 msgstr "Kein Rebase im Gange?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:369
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Die --edit-todo Aktion kann nur während eines interaktiven Rebase verwendet "
 "werden."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:376
 msgid "Cannot read HEAD"
 msgstr "Kann HEAD nicht lesen"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:379
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -13030,7 +14708,7 @@ msgstr ""
 "Sie müssen alle Merge-Konflikte editieren und diese dann\n"
 "mittels \"git add\" als aufgelöst markieren"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:419
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -13051,100 +14729,104 @@ msgstr ""
 "und führen Sie diesen Befehl nochmal aus. Es wird angehalten, falls noch\n"
 "etwas Schützenswertes vorhanden ist."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:470
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ungültiger Upstream-Branch $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:494
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: es gibt mehr als eine Merge-Basis"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:497 git-rebase.sh:501
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: es gibt keine Merge-Basis"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:506
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "$onto_name zeigt auf keinen gültigen Commit"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:529
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: Branch $branch_name nicht gefunden"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:562
 msgid "Cannot autostash"
 msgstr "Kann automatischen Stash nicht erzeugen."
 
-#: git-rebase.sh:562
+#: git-rebase.sh:567
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Automatischen Stash erzeugt: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:571
 msgid "Please commit or stash them."
 msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:591
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktueller Branch $branch_name ist auf dem neuesten Stand."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:595
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 "Aktueller Branch $branch_name ist auf dem neuesten Stand, Rebase erzwungen."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:606
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Änderungen von $mb zu $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:615
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Zunächst wird der Branch zurückgespult, um Ihre Änderungen\n"
 "darauf neu anzuwenden ..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:625
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name zu $onto_name vorgespult."
 
-#: git-stash.sh:50
+#: git-stash.sh:53
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash clear mit Parametern ist nicht implementiert"
 
-#: git-stash.sh:73
+#: git-stash.sh:94
 msgid "You do not have the initial commit yet"
 msgstr "Sie haben bisher noch keinen initialen Commit"
 
-#: git-stash.sh:88
+#: git-stash.sh:109
 msgid "Cannot save the current index state"
 msgstr "Kann den aktuellen Zustand des Index nicht speichern"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "Kann die unversionierten Dateien nicht speichern"
+
+#: git-stash.sh:144 git-stash.sh:157
 msgid "Cannot save the current worktree state"
 msgstr "Kann den aktuellen Zustand des Arbeitsverzeichnisses nicht speichern"
 
-#: git-stash.sh:140
+#: git-stash.sh:161
 msgid "No changes selected"
 msgstr "Keine Änderungen ausgewählt"
 
-#: git-stash.sh:143
+#: git-stash.sh:164
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Kann temporären Index nicht löschen (kann nicht passieren)"
 
-#: git-stash.sh:156
+#: git-stash.sh:177
 msgid "Cannot record working tree state"
 msgstr "Kann Zustand des Arbeitsverzeichnisses nicht aufzeichnen"
 
-#: git-stash.sh:188
+#: git-stash.sh:209
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Kann $ref_stash nicht mit $w_commit aktualisieren."
@@ -13159,7 +14841,7 @@ msgstr "Kann $ref_stash nicht mit $w_commit aktualisieren."
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
+#: git-stash.sh:265
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -13169,109 +14851,118 @@ msgstr ""
 "        Um eine Beschreibung anzugeben, benutzen Sie \"git stash save -- "
 "'$option'\""
 
-#: git-stash.sh:259
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr ""
+"Kann nicht gleichzeitig --patch und --include-untracked oder --all verwenden"
+
+#: git-stash.sh:286
 msgid "No local changes to save"
 msgstr "Keine lokalen Änderungen zum Speichern"
 
-#: git-stash.sh:263
+#: git-stash.sh:291
 msgid "Cannot initialize stash"
 msgstr "Kann \"stash\" nicht initialisieren"
 
-#: git-stash.sh:267
+#: git-stash.sh:295
 msgid "Cannot save the current status"
 msgstr "Kann den aktuellen Status nicht speichern"
 
-#: git-stash.sh:268
+#: git-stash.sh:296
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
 msgstr "Speicherte Arbeitsverzeichnis und Index-Status $stash_msg"
 
-#: git-stash.sh:285
+#: git-stash.sh:323
 msgid "Cannot remove worktree changes"
 msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen"
 
-#: git-stash.sh:404
+#: git-stash.sh:471
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "unbekannte Option: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:484
 msgid "No stash found."
 msgstr "Kein Stash-Eintrag gefunden."
 
-#: git-stash.sh:421
+#: git-stash.sh:491
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Zu viele Commits angegeben: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:506
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference ist keine gültige Referenz"
 
-#: git-stash.sh:455
+#: git-stash.sh:534
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' ist kein \"stash\"-artiger Commit"
 
-#: git-stash.sh:466
+#: git-stash.sh:545
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' ist keine \"stash\"-Referenz"
 
-#: git-stash.sh:474
+#: git-stash.sh:553
 msgid "unable to refresh index"
 msgstr "Konnte den Index nicht aktualisieren."
 
-#: git-stash.sh:478
+#: git-stash.sh:557
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Kann \"stash\" nicht anwenden, solang ein Merge im Gange ist"
 
-#: git-stash.sh:486
+#: git-stash.sh:565
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikte im Index. Versuchen Sie es ohne --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:567
 msgid "Could not save index tree"
 msgstr "Konnte Index-Verzeichnis nicht speichern"
 
-#: git-stash.sh:522
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "Konnte unversionierte Dateien vom Stash nicht wiederherstellen"
+
+#: git-stash.sh:601
 msgid "Cannot unstage modified files"
 msgstr "Kann geänderte Dateien nicht aus dem Index entfernen"
 
-#: git-stash.sh:537
+#: git-stash.sh:616
 msgid "Index was not unstashed."
 msgstr "Index wurde nicht aus dem Stash zurückgeladen."
 
-#: git-stash.sh:551
+#: git-stash.sh:630
 msgid "The stash is kept in case you need it again."
 msgstr "Der Stash wird behalten, im Falle Sie benötigen diesen nochmal."
 
-#: git-stash.sh:560
+#: git-stash.sh:639
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Gelöscht ${REV} ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:640
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
 
-#: git-stash.sh:569
+#: git-stash.sh:648
 msgid "No branch name specified"
 msgstr "Kein Branchname spezifiziert"
 
-#: git-stash.sh:641
+#: git-stash.sh:727
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Relative Pfade können nur von der obersten Ebene des Arbeitsverzeichnisses "
 "benutzt werden."
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen"
@@ -13281,7 +14972,12 @@ msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen"
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ist bereits zum Commit vorgemerkt"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "'$sm_path' ist bereits zum Commit vorgemerkt und ist kein Submodul"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -13292,24 +14988,24 @@ msgstr ""
 "$sm_path\n"
 "Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Füge existierendes Repository in '$sm_path' dem Index hinzu."
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' existiert bereits und ist kein gültiges Git-Repository"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Ein Git-Verzeichnis für '$sm_name' wurde lokal gefunden mit den Remote-"
 "Repositories:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -13319,65 +15015,69 @@ msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
-"Wenn Sie das lokale Git-Verzeichnis wiederverwenden wollen, anstatt erneut von\n"
+"Wenn Sie das lokale Git-Verzeichnis wiederverwenden wollen, anstatt erneut "
+"von\n"
 "  $realrepo\n"
-"zu klonen, benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis\n"
+"zu klonen, benutzen Sie die Option '--force'. Wenn das lokale Git-"
+"Verzeichnis\n"
 "nicht das korrekte Repository ist oder Sie unsicher sind, was das bedeutet,\n"
 "wählen Sie einen anderen Namen mit der Option '--name'."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kann Submodul '$sm_path' nicht auschecken"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration."
 
-#: git-submodule.sh:323
+#: git-submodule.sh:341
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "Betrete '$displaypath'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:361
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "Stoppe bei '$displaypath'; Skript gab nicht-Null Status zurück."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:432
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "Pfadspezifikationen und --all sind inkompatibel."
 
-#: git-submodule.sh:419
+#: git-submodule.sh:437
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr ""
 "Verwenden Sie '--all', wenn Sie wirklich alle Submodule deinitialisieren\n"
 "möchten."
 
-#: git-submodule.sh:439
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
-"Arbeitsverzeichnis von Submodul in '$displaypath' enthält ein .git-Verzeichnis\n"
-"(benutzen Sie 'rm -rf' wenn Sie dieses wirklich mitsamt seiner Historie löschen\n"
+"Arbeitsverzeichnis von Submodul in '$displaypath' enthält ein .git-"
+"Verzeichnis\n"
+"(benutzen Sie 'rm -rf' wenn Sie dieses wirklich mitsamt seiner Historie "
+"löschen\n"
 "möchten)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13386,41 +15086,41 @@ msgstr ""
 "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
 "verwenden Sie '-f', um diese zu verwerfen"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:468
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Verzeichnis '$displaypath' bereinigt."
 
-#: git-submodule.sh:451
+#: git-submodule.sh:469
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen."
 
-#: git-submodule.sh:454
+#: git-submodule.sh:472
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen."
 
-#: git-submodule.sh:463
+#: git-submodule.sh:481
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Submodul '$name' ($url) für Pfad '$displaypath' wurde aus der Konfiguration "
 "entfernt."
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Konnte aktuellen Commit in Submodul-Pfad '$displaypath' nicht finden."
 
-#: git-submodule.sh:622
+#: git-submodule.sh:647
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$sm_path' nicht ausführen"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13429,12 +15129,12 @@ msgstr ""
 "Konnte aktuellen Commit von ${remote_name}/${branch} in Submodul-Pfad\n"
 "'$sm_path' nicht finden."
 
-#: git-submodule.sh:645
+#: git-submodule.sh:670
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:676
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
@@ -13443,89 +15143,85 @@ msgstr ""
 "\"fetch\" in Submodul-Pfad '$displaypath' ausgeführt, aber $sha1 nicht\n"
 "enthalten. Direktes Anfordern dieses Commits ist fehlgeschlagen."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:683
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
 
-#: git-submodule.sh:659
+#: git-submodule.sh:684
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:688
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Rebase auf '$sha1' in Submodul-Pfad '$displaypath' nicht möglich"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:689
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:694
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:695
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:700
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "Ausführung von '$command $sha1' in Submodul-Pfad '$displaypath' "
 "fehlgeschlagen"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:701
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Submodul-Pfad '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:732
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 "Die Optionen --cached und --files können nicht gemeinsam verwendet werden."
 
-#: git-submodule.sh:867
+#: git-submodule.sh:892
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "unerwarteter Modus $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:915
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:918
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Warnung: $display_name beinhaltet nicht die Commits $sha1_src und $sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "Blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1064
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1136
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisiere Submodul-URL für '$displaypath'"
@@ -13535,12 +15231,12 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 msgid "See git-${cmd}(1) for details."
 msgstr "Siehe git-${cmd}(1) für weitere Details."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "Führe Rebase aus ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13567,7 +15263,7 @@ msgstr ""
 "Diese Zeilen können umsortiert werden; Sie werden von oben nach unten\n"
 "ausgeführt.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13576,13 +15272,15 @@ msgstr ""
 "Keine Zeile entfernen. Benutzen Sie 'drop', um explizit einen Commit zu\n"
 "entfernen.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr "\nWenn Sie hier eine Zeile entfernen, wird DIESER COMMIT VERLOREN GEHEN.\n"
+msgstr ""
+"\n"
+"Wenn Sie hier eine Zeile entfernen, wird DIESER COMMIT VERLOREN GEHEN.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13601,87 +15299,83 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: kein Commit der gepickt werden kann"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Ungültiger Commit-Name: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "Kann ersetzenden SHA-1 des aktuellen Commits nicht schreiben"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Spule vor zu $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "Kann nicht zu $sha1 vorspulen"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "Kann HEAD nicht auf $first_parent setzen"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "\"squash\" eines Merges ($sha1) zurückgewiesen."
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Fehler beim Wiederholen des Merges von $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "Konnte $sha1 nicht picken"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Das ist Commit-Beschreibung #${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "Commit-Beschreibung #${n} wird ausgelassen:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Das ist eine Kombination aus $count Commit."
 msgstr[1] "Das ist eine Kombination aus $count Commits."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "Kann $fixup_msg nicht schreiben"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "Das ist eine Kombination aus 2 Commits."
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
-msgstr "Das ist die erste Commit-Beschreibung:"
-
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "Konnte $sha1... ($rest) nicht anwenden"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13690,36 +15384,39 @@ msgid ""
 "before\n"
 "you are able to reword the commit."
 msgstr ""
-"Konnte Commit nicht nachbessern, nachdem dieser verwendet wurde: $sha1... $rest\n"
-"Das passierte sehr wahrscheinlich wegen einer leeren Commit-Beschreibung, oder\n"
+"Konnte Commit nicht nachbessern, nachdem dieser verwendet wurde: $sha1... "
+"$rest\n"
+"Das passierte sehr wahrscheinlich wegen einer leeren Commit-Beschreibung, "
+"oder\n"
 "weil der pre-commit Hook fehlschlug. Falls der pre-commit Hook fehlschlug,\n"
-"sollten Sie das Problem beheben, bevor Sie die Commit-Beschreibung ändern können."
+"sollten Sie das Problem beheben, bevor Sie die Commit-Beschreibung ändern "
+"können."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "Angehalten bei $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "Kann nicht '$squash_style' ohne vorherigen Commit"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "Führe aus: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "Ausführung fehlgeschlagen: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "Der Index und/oder das Arbeitsverzeichnis wurde geändert."
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13732,7 +15429,7 @@ msgstr ""
 "ausführen."
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13748,25 +15445,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Unbekannter Befehl: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Bitte beheben Sie das, indem Sie 'git rebase --edit-todo' ausführen."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "Erfolgreich Rebase ausgeführt und $head_name aktualisiert."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
 msgstr "Fehler beim Auslassen von nicht erforderlichen \"pick\"-Befehlen."
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13775,7 +15472,7 @@ msgstr ""
 "Warnung: Der SHA-1 in der folgenden Zeile fehlt oder ist kein Commit:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13784,11 +15481,11 @@ msgstr ""
 "Warnung: Das Kommando in der folgenden Zeile wurde nicht erkannt:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "Konnte HEAD nicht loslösen"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13796,7 +15493,7 @@ msgstr ""
 "Warnung: Einige Commits könnten aus Versehen entfernt worden sein.\n"
 "Entfernte Commits (neu zu alt):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13807,32 +15504,38 @@ msgstr ""
 "Um diese Meldung zu vermeiden, benutzen Sie \"drop\", um exlizit Commits zu\n"
 "entfernen.\n"
 "\n"
-"Benutzen Sie 'git config rebase.missingCommitsCheck', um die Stufe der Warnungen\n"
+"Benutzen Sie 'git config rebase.missingCommitsCheck', um die Stufe der "
+"Warnungen\n"
 "zu ändern.\n"
 "Die möglichen Verhaltensweisen sind: ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
 "Ignoring."
 msgstr ""
-"Nicht erkannte Einstellung $check_level für Option rebase.missingCommitsCheck.\n"
+"Nicht erkannte Einstellung $check_level für Option rebase."
+"missingCommitsCheck.\n"
 "Ignoriere."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Sie können das mit 'git rebase --edit-todo' beheben."
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Sie können das mit 'git rebase --edit-todo' beheben. Führen Sie danach\n"
+"'git rebase --continue' aus."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "Oder Sie können den Rebase mit 'git rebase --abort' abbrechen."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1083
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "Konnte CHERRY_PICK_HEAD nicht löschen"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1088
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13845,11 +15548,12 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
-"Es befinden sich zum Commit vorgemerkte Änderungen in Ihrem Arbeitsverzeichnis.\n"
+"Es befinden sich zum Commit vorgemerkte Änderungen in Ihrem "
+"Arbeitsverzeichnis.\n"
 "Wenn diese Änderungen in den vorherigen Commit aufgenommen werden sollen,\n"
 "führen Sie aus:\n"
 "\n"
@@ -13863,26 +15567,27 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1105
 msgid "Error trying to find the author identity to amend commit"
 msgstr ""
 "Fehler beim Versuch die Identität des Authors zum Verbessern des Commits zu\n"
 "finden"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1110
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
 msgstr ""
 "Sie haben nicht committete Änderungen in Ihrem Arbeitsverzeichnis. Bitte\n"
-"committen Sie diese zuerst und führen Sie dann 'git rebase --continue' erneut\n"
+"committen Sie diese zuerst und führen Sie dann 'git rebase --continue' "
+"erneut\n"
 "aus."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
 msgid "Could not commit staged changes."
 msgstr "Konnte Änderungen aus der Staging-Area nicht committen."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1147
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13896,51 +15601,50 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
 msgid "Could not execute editor"
 msgstr "Konnte Editor nicht ausführen."
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1168
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "Konnte $switch_to nicht auschecken."
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1173
 msgid "No HEAD?"
 msgstr "Kein HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1174
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "Konnte temporäres Verzeichnis $state_dir nicht erstellen."
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1176
 msgid "Could not mark as interactive"
 msgstr "Konnte nicht als interaktiven Rebase markieren."
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
 msgid "Could not init rewritten commits"
 msgstr "Konnte neu geschriebene Commits nicht initialisieren."
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1291
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Rebase von $shortrevisions auf $shortonto ($todocount Kommando)"
 msgstr[1] "Rebase von $shortrevisions auf $shortonto ($todocount Kommandos)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1296
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
 "\n"
-msgstr "\nWenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n\n"
+msgstr ""
+"\n"
+"Wenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n"
+"\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1303
 msgid "Note that empty commits are commented out"
 msgstr "Leere Commits sind auskommentiert."
 
@@ -13959,18 +15663,28 @@ msgstr ""
 #: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
 msgid "fatal: $program_name cannot be used without a working tree."
-msgstr "fatal: $program_name kann ohne ein Arbeitsverzeichnis nicht verwendet werden."
+msgstr ""
+"fatal: $program_name kann ohne ein Arbeitsverzeichnis nicht verwendet werden."
 
 #: git-sh-setup.sh:220
 msgid "Cannot rebase: You have unstaged changes."
-msgstr "Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
+msgstr ""
+"Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt "
+"sind."
 
 #: git-sh-setup.sh:223
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
-"Kann Branches nicht neu schreiben: Sie haben Änderungen, die nicht zum Commit\n"
+"Kann Branches nicht neu schreiben: Sie haben Änderungen, die nicht zum "
+"Commit\n"
 "vorgemerkt sind."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr ""
+"Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die "
+"nicht zum Commit vorgemerkt sind."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13980,7 +15694,15 @@ msgstr ""
 
 #: git-sh-setup.sh:242
 msgid "Cannot rebase: Your index contains uncommitted changes."
-msgstr "Rebase nicht möglich: Die Staging-Area beinhaltet nicht committete Änderungen."
+msgstr ""
+"Rebase nicht möglich: Die Staging-Area beinhaltet nicht committete "
+"Änderungen."
+
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"Kann \"pull\" mit \"rebase\" nicht ausführen: Die Staging-Area beinhaltet "
+"nicht committete Änderungen."
 
 #: git-sh-setup.sh:248
 #, sh-format
@@ -13989,11 +15711,1079 @@ msgstr ""
 "Kann $action nicht ausführen: Die Staging-Area beinhaltet nicht committete\n"
 "Änderungen."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Zusätzlich beinhaltet die Staging-Area nicht committete Änderungen."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
-msgstr "Sie müssen den Befehl von der obersten Ebene des Arbeitsverzeichnisses ausführen."
+msgstr ""
+"Sie müssen den Befehl von der obersten Ebene des Arbeitsverzeichnisses "
+"ausführen."
 
 #: git-sh-setup.sh:377
 msgid "Unable to determine absolute path of git directory"
 msgstr "Konnte absoluten Pfad des Git-Verzeichnisses nicht bestimmen."
 
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%28s %25s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "zur Staging-Area hinzugefügt"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "aus Staging-Area entfernt"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "Binär"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "Nichts"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "unverändert"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "%d Pfad hinzugefügt\n"
+msgstr[1] "%d Pfade hinzugefügt\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "%d Pfad aktualisiert\n"
+msgstr[1] "%d Pfade aktualisiert\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "%d Pfad wiederhergestellt\n"
+msgstr[1] "%d Pfade wiederhergestellt\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "%d Pfad angefasst\n"
+msgstr[1] "%d Pfade angefasst\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "Revert"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "Hinweis: %s ist nun unversioniert.\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "unversionierte Dateien hinzufügen"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "Keine unversionierten Dateien.\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
+"Block\n"
+"direkt als zum Hinzufügen zur Staging-Area markiert."
+
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr ""
+"Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
+"Block\n"
+"direkt als zum Hinzufügen zum Stash markiert."
+
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr ""
+"Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
+"Block\n"
+"direkt als zum Entfernen aus der Staging-Area markiert."
+
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
+"Block\n"
+"direkt als zum Anwenden markiert."
+
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr ""
+"Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
+"Block\n"
+"direkt als zum Verwerfen markiert."
+
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr ""
+"Fehler beim Öffnen von Editier-Datei eines Patch-Blocks zum Schreiben: %s"
+
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr ""
+"Manueller Editiermodus für Patch-Blöcke -- siehe nach unten für eine\n"
+"Kurzanleitung.\n"
+
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"Um '%s' Zeilen zu entfernen, machen Sie aus diesen ' ' Zeilen (Kontext).\n"
+"Um '%s' Zeilen zu entfernen, löschen Sie diese.\n"
+"Zeilen, die mit %s beginnen, werden entfernt.\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"Wenn das nicht sauber angewendet werden kann, haben Sie die Möglichkeit\n"
+"einer erneuten Bearbeitung. Wenn alle Zeilen des Patch-Blocks entfernt "
+"werden,\n"
+"wird die Bearbeitung abgebrochen und der Patch-Block bleibt unverändert.\n"
+
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr "Fehler beim Öffnen von Editier-Datei eines Patch-Blocks zum Lesen: %s"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr ""
+"Ihr bearbeiteter Patch-Block kann nicht angewendet werden.\n"
+"Erneut bearbeiten? (\"n\" verwirft Bearbeitung!) [y/n]?"
+
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - diesen Patch-Block zum Commit vormerken\n"
+"n - diesen Patch-Block nicht zum Commit vormerken\n"
+"q - Beenden; diesen oder alle verbleibenden Patch-Blöcke nicht zum Commit "
+"vormerken\n"
+"a - diesen und alle weiteren Patch-Blöcke dieser Datei zum Commit vormerken\n"
+"d - diesen oder alle weiteren Patch-Blöcke in dieser Datei nicht zum Commit "
+"vormerken"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - diesen Patch-Block stashen\n"
+"n - diesen Patch-Block nicht stashen\n"
+"q - Beenden; diesen oder alle verbleibenden Patch-Blöcke nicht stashen\n"
+"a - diesen und alle weiteren Patch-Blöcke dieser Datei stashen\n"
+"d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht stashen"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - diesen Patch-Block unstashen\n"
+"n - diesen Patch-Block nicht unstashen\n"
+"q - Beenden; diesen oder alle verbleibenden Patch-Blöcke nicht unstashen\n"
+"a - diesen und alle weiteren Patch-Blöcke dieser Datei unstashen\n"
+"d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht unstashen"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - diesen Patch-Block auf den Index anwenden\n"
+"n - diesen Patch-Block nicht auf den Index anwenden\n"
+"q - Beenden; diesen oder alle verbleibenden Patch-Blöcke nicht auf den Index "
+"anwenden\n"
+"a - diesen und alle weiteren Patch-Blöcke dieser Datei auf den Index "
+"anwenden\n"
+"d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht auf den Index "
+"anwenden"
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - diesen Patch-Block im Arbeitsverzeichnis verwerfen\n"
+"n - diesen Patch-Block im Arbeitsverzeichnis nicht verwerfen\n"
+"q - Beenden; diesen oder alle verbleibenden Patch-Blöcke nicht im "
+"Arbeitsverzeichnis verwerfen\n"
+"a - diesen und alle weiteren Patch-Blöcke dieser Datei im Arbeitsverzeichnis "
+"verwerfen\n"
+"d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht im "
+"Arbeitsverzeichnis verwerfen"
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - diesen Patch-Block im Index und Arbeitsverzeichnis verwerfen\n"
+"n - diesen Patch-Block nicht im Index und Arbeitsverzeichnis verwerfen\n"
+"q - Beenden; diesen oder alle verbleibenden Patch-Blöcke nicht im Index und "
+"Arbeitsverzeichnis verwerfen\n"
+"a - diesen und alle weiteren Patch-Blöcke in der Datei verwerfen\n"
+"d - diesen oder alle weiteren Patch-Blöcke in der Datei nicht verwerfen"
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - diesen Patch-Block im Index und auf Arbeitsverzeichnis anwenden\n"
+"n - diesen Patch-Block nicht im Index und auf Arbeitsverzeichnis anwenden\n"
+"q - Beenden; diesen oder alle verbleibenden Patch-Blöcke nicht anwenden\n"
+"a - diesen und alle weiteren Patch-Blöcke in der Datei anwenden\n"
+"d - diesen oder alle weiteren Patch-Blöcke in der Datei nicht anwenden"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g - Patch-Block zum Hinspringen auswählen\n"
+"/ - nach Patch-Block suchen der gegebenem regulärem Ausdruck entspricht\n"
+"j - diesen Patch-Block unbestimmt lassen, nächsten unbestimmten Patch-Block "
+"anzeigen\n"
+"J - diesen Patch-Block unbestimmt lassen, nächsten Patch-Block anzeigen\n"
+"k - diesen Patch-Block unbestimmt lassen, vorherigen unbestimmten Patch-"
+"Block anzeigen\n"
+"K - diesen Patch-Block unbestimmt lassen, vorherigen Patch-Block anzeigen\n"
+"s - aktuellen Patch-Block in kleinere Patch-Blöcke aufteilen\n"
+"e - aktuellen Patch-Block manuell editieren\n"
+"? - Hilfe anzeigen\n"
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr ""
+"Die ausgewählten Patch-Blöcke können nicht auf den Index angewendet werden!\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "Trotzdem auf Arbeitsverzeichnis anwenden? "
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "Nichts angewendet.\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "ignoriere nicht zusammengeführte Datei: %s\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "Nur Binärdateien geändert.\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "Keine Änderungen.\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "Patch Aktualisierung"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Modusänderung der Staging-Area hinzufügen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Löschung der Staging-Area hinzufügen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Diesen Patch-Block der Staging-Area hinzufügen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Modusänderung stashen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Löschung stashen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Diesen Patch-Block stashen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Modusänderung aus der Staging-Area entfernen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Löschung aus der Staging-Area entfernen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Diesen Patch-Block aus der Staging-Area entfernen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "Modusänderung auf Index anwenden [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "Löschung auf Index anwenden [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "Diesen Patch-Block auf Index anwenden [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Modusänderung im Arbeitsverzeichnis verwerfen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Löschung im Arbeitsverzeichnis verwerfen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "diesen Patch-Block im Arbeitsverzeichnis verwerfen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Modusänderung vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Löschung vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Diesen Patch-Block vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d,/"
+"%s,?]? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Modusänderung auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Löschung auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Diesen Patch-Block auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d,/"
+"%s,?]? "
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "zu welchem Patch-Block springen (<Enter> für mehr Informationen)? "
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "zu welchem Patch-Block springen? "
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "Ungültige Nummer: '%s'\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "Entschuldigung, nur %d Patch-Block verfügbar.\n"
+msgstr[1] "Entschuldigung, nur %d Patch-Blöcke verfügbar.\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "Suche nach regulärem Ausdruck? "
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "Fehlerhafter regulärer Ausdruck für Suche %s: %s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "Kein Patch-Block entspricht dem angegebenen Pattern\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "Kein vorheriger Patch-Block\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "Kein folgender Patch-Block\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "In %d Patch-Block aufgeteilt.\n"
+msgstr[1] "In %d Patch-Blöcke aufgeteilt.\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "Diff überprüfen"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        - Pfade mit Änderungen anzeigen\n"
+"update        - Zustand des Arbeitsverzeichnisses den zum Commit "
+"vorgemerkten Änderungen hinzufügen\n"
+"revert        - zum Commit vorgemerkte Änderungen auf HEAD Version "
+"zurücksetzen\n"
+"patch         - Patch-Blöcke auswählen und selektiv aktualisieren\n"
+"diff          - Unterschiede zwischen HEAD und Index anzeigen\n"
+"add untracked - Inhalte von unversionierten Dateien zum Commit vormerken\n"
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "-- fehlt"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "Unbekannter --patch Modus: %s"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "ungültiges Argument %s, erwarte --"
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr ""
+"lokale Zeitzone unterscheidet sich von GMT nicht um einen Minutenintervall\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "lokaler Zeit-Offset größer oder gleich 24 Stunden\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "Der Editor wurde unsauber beendet, breche alles ab."
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr ""
+"'%s' enthält eine Zwischenversion der E-Mail, die Sie gerade verfassen.\n"
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "'%s.final' enthält die verfasste E-Mail.\n"
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-aliases ist mit anderen Optionen inkompatibel\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr ""
+"Kann 'git format-patch' nicht außerhalb eines Repositories ausführen.\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "Unbekanntes --suppress-cc Feld: '%s'\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "Unbekannte --confirm Einstellung: '%s'\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr ""
+"Warnung: sendemail Alias mit Anführungsstrichen wird nicht unterstützt: %s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "Warnung: `:include:` wird nicht unterstützt: %s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr "Warnung: `/file` oder `|pipe` Umleitung wird nicht unterstützt: %s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "Warnung: sendmail Zeile wird nicht erkannt: %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+"Datei '%s' existiert, aber es könnte auch der Bereich von Commits sein,\n"
+"für den Patches erzeugt werden sollen. Bitte machen Sie dies eindeutig\n"
+"indem Sie ...\n"
+"\n"
+"    * \"./%s\" angeben, wenn Sie eine Datei meinen, oder\n"
+"    * die Option --format-patch angeben, wenn Sie einen Commit-Bereich "
+"meinen\n"
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "Fehler beim Öffnen von %s: %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"fatal: %s: %s\n"
+"Warnung: Es wurden keine Patches versendet.\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"keine Patch-Dateien angegeben!\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "Keine Betreffzeile in %s?"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "Fehler beim Öffnen von '%s' zum Schreiben: %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+"Zeilen, die mit \"GIT:\" beginnen, werden entfernt.\n"
+"Ziehen Sie in Betracht, einen allgemeinen \"diffstat\" oder ein\n"
+"Inhaltsverzeichnis, für den Patch den Sie schreiben, hinzuzufügen.\n"
+"\n"
+"Leeren Sie den Inhalt des Bodys, wenn Sie keine Zusammenfassung senden "
+"möchten.\n"
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "Fehler beim Öffnen von %s.final: %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "Fehler beim Öffnen von %s: %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr ""
+"To/Cc/Bcc Felder wurden noch nicht interpretiert, sie wurden ignoriert\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "E-Mail mit Zusammenfassung ist leer, wird ausgelassen\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "Sind Sie sich sicher, <%s> zu benutzen [y/N]? "
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr ""
+"Die folgenden Dateien sind 8-Bit, aber deklarieren kein\n"
+"Content-Transfer-Encoding.\n"
+
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "Welches 8-Bit-Encoding soll deklariert werden [UTF-8]? "
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+"Versand zurückgewiesen, weil der Patch\n"
+"\t%s\n"
+"die Betreffzeilenvorlage '*** SUBJECT HERE ***' enthält. Geben Sie --force "
+"an,\n"
+"wenn Sie den Patch wirklich versenden wollen.\n"
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "An wen sollen die E-Mails versendet werden (wenn überhaupt jemand)?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "fatal: Alias '%s' erweitert sich zu sich selbst\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr ""
+"Message-ID zur Verwendung als In-Reply-To für die erste E-Mail (wenn eine "
+"existiert)? "
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "Fehler: konnte keine gültige Adresse aus %s extrahieren\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr ""
+"Was soll mit dieser Adresse geschehen? (Beenden [q]|Löschen [d]|Bearbeiten "
+"[e]): "
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "CA Pfad \"%s\" existiert nicht"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+"    Die Cc-Liste oberhalb wurde um zusätzliche Adressen erweitert, die in "
+"der\n"
+"    Commit-Beschreibung des Patches gefunden wurden. Wenn dies passiert, "
+"werden\n"
+"    Sie von send-email zu einer Eingabe aufgefordert. Dieses Verhalten wird\n"
+"    durch die Konfigurationseinstellung sendemail.confirm gesteuert.\n"
+"\n"
+"    Für weitere Informationen, führen Sie 'git send-email --help' aus.\n"
+"    Um das aktuelle Verhalten beizubehalten, aber diese Meldung zu "
+"unterdrücken,\n"
+"    führen Sie 'git config --global sendemail.confirm auto' aus.\n"
+"\n"
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "Diese E-Mail versenden? (Ja [y]|Nein [n]|Beenden [q]|Alle [a]): "
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "Zum Versenden dieser E-Mail ist eine Antwort erforderlich."
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "Der erforderliche SMTP-Server ist nicht korrekt definiert."
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "Server unterstützt kein STARTTLS! %s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr ""
+"Konnte SMTP nicht korrekt initialisieren. Bitte prüfen Sie Ihre "
+"Konfiguration\n"
+"und benutzen Sie --smtp-debug."
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "Fehler beim Senden %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "Probeversand %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "%s gesendet\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "Probeversand OK. Log enthält:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "OK. Log enthält:\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "Ergebnis: "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "Ergebnis: OK\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "Kann Datei %s nicht öffnen"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) Füge cc: hinzu: %s von Zeile '%s'\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) Füge to: hinzu: %s von Zeile '%s'\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(non-mbox) Füge cc: hinzu: %s von Zeile '%s'\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(body) Füge cc: hinzu: %s von Zeile '%s'\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) Konnte '%s' nicht ausführen"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) Füge %s: %s hinzu von: '%s'\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) Fehler beim Schließen der Pipe nach '%s'"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "Kann Nachricht nicht als 7bit versenden."
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "Ungültiges Transfer-Encoding"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "konnte %s nicht öffnen: %s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s: Patch enthält eine Zeile, die länger als 998 Zeichen ist"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "Lasse %s mit Backup-Suffix '%s' aus.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "Wollen Sie %s wirklich versenden? [y|N]: "
+
+#~ msgid "tag: tagging "
+#~ msgstr "tag: tagge "
+
+#~ msgid "object of unknown type"
+#~ msgstr "Art des Objektes unbekannt"
+
+#~ msgid "commit object"
+#~ msgstr "Commit-Objekt"
+
+#~ msgid "tree object"
+#~ msgstr "Tree-Objekt"
+
+#~ msgid "blob object"
+#~ msgstr "Blob-Objekt"
+
+#~ msgid "other tag object"
+#~ msgstr "anderes Tag-Objekt"
+
+#, fuzzy
+#~ msgid "Submodule '%s' cannot checkout new HEAD"
+#~ msgstr "Submodul '%s' kann Alternative nicht hinzufügen: %s"
+
+#~ msgid "insanely long object directory %.*s"
+#~ msgstr "zu langes Objekt-Verzeichnis %.*s"
+
+#~ msgid "tag name too long: %.*s..."
+#~ msgstr "Tagname zu lang: %.*s..."
+
+#~ msgid "tag header too big."
+#~ msgstr "Tag-Kopf zu groß."
+
+#~ msgid ""
+#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "marked for discarding"
+#~ msgstr ""
+#~ "Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
+#~ "Block\n"
+#~ "direkt als zum Verwerfen markiert."
+
+#~ msgid ""
+#~ "There is nothing to exclude from by :(exclude) patterns.\n"
+#~ "Perhaps you forgot to add either ':/' or '.' ?"
+#~ msgstr ""
+#~ ":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
+#~ "Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
+
+#~ msgid "unrecognized format: %%(%s)"
+#~ msgstr "nicht erkanntes Format: %%(%s)"
+
+#~ msgid ":strip= requires a positive integer argument"
+#~ msgstr ":strip= erfordert eine positive Ganzzahl als Argument"
+
+#~ msgid "ref '%s' does not have %ld components to :strip"
+#~ msgstr "Referenz '%s' hat keine %ld Komponenten für :strip"
+
+#~ msgid "unknown %.*s format %s"
+#~ msgstr "Unbekanntes %.*s Format %s"
+
+#~ msgid "[%s: gone]"
+#~ msgstr "[%s: entfernt]"
+
+#~ msgid "[%s]"
+#~ msgstr "[%s]"
+
+#~ msgid "[%s: behind %d]"
+#~ msgstr "[%s: %d hinterher]"
+
+#~ msgid "[%s: ahead %d]"
+#~ msgstr "[%s: %d voraus]"
+
+#~ msgid "[%s: ahead %d, behind %d]"
+#~ msgstr "[%s: %d voraus, %d hinterher]"
+
+#~ msgid " **** invalid ref ****"
+#~ msgstr " **** ungültige Referenz ****"
+
+#~ msgid "git merge [<options>] <msg> HEAD <commit>"
+#~ msgstr "git merge [<Optionen>] <Beschreibung> HEAD <Commit>"
+
+#~ msgid "'%s' is not a commit"
+#~ msgstr "'%s' ist kein Commit"
+
+#~ msgid "cannot open file '%s'"
+#~ msgstr "Kann Datei '%s' nicht öffnen"
+
+#~ msgid "could not close file %s"
+#~ msgstr "Konnte Datei '%s' nicht schließen."
+
+#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
+#~ msgstr ""
+#~ "eine experimentelle, auf Leerzeilen basierende Heuristik zur "
+#~ "Verbesserung\n"
+#~ "der Darstellung von Unterschieden verwenden"
+
+#~ msgid "Clever... amending the last one with dirty index."
+#~ msgstr "Klug ... den letzten Commit mit einem geänderten Index nachbessern."
+
+#~ msgid ""
+#~ "the following submodule (or one of its nested submodules)\n"
+#~ "uses a .git directory:"
+#~ msgid_plural ""
+#~ "the following submodules (or one of their nested submodules)\n"
+#~ "use a .git directory:"
+#~ msgstr[0] ""
+#~ "das folgende Submodul (oder ein geschachteltes Submodul hiervon)\n"
+#~ "benutzt ein .git-Verzeichnis:"
+#~ msgstr[1] ""
+#~ "die folgenden Submodule (oder ein geschachteltes Submodul hiervon)\n"
+#~ "benutzen ein .git-Verzeichnis:"
+
+#~ msgid ""
+#~ "\n"
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "\n"
+#~ "(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n"
+#~ "seiner Historie löschen möchten)"
+
+#~ msgid "Could not write to %s"
+#~ msgstr "Konnte nicht nach %s schreiben"
+
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Fehler beim Einpacken von %s."
+
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr ""
+#~ "Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden."
+
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Kann Revert nicht während eines anderen Reverts ausführen."
+
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr ""
+#~ "Kann Cherry-Pick nicht während eines anderen Cherry-Picks ausführen."
+
+#~ msgid "Could not parse line %d."
+#~ msgstr "Konnte Zeile %d nicht parsen."
+
+#~ msgid "Could not open %s"
+#~ msgstr "Konnte %s nicht öffnen"
+
+#~ msgid "Could not read %s."
+#~ msgstr "Konnte %s nicht lesen."
+
+#~ msgid "Could not format %s."
+#~ msgstr "Konnte %s nicht formatieren."
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "cannot open %s: %s"
+#~ msgstr "Kann %s nicht öffnen: %s"
+
+#~ msgid "You need to set your committer info first"
+#~ msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
index aeb4155972c8e676f23ab4e32b67b7a531557dd8..0dd068de03326b3aa60e6e62f12b67b950a883de 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -73,8 +73,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-08-28 11:26+0200\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
+"PO-Revision-Date: 2017-05-05 12:02+0200\n"
 "Last-Translator: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language: fr\n"
@@ -125,7 +125,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "Abandon à cause de conflit non résolu."
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe)."
 
@@ -169,3980 +169,5067 @@ msgstr ""
 "  git checkout -b <nom-de-la-nouvelle-branche>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<options>] <arbre ou apparenté> [<chemin>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "option d'espace non reconnue '%s'"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "option d'ignorance d'espace non reconnue '%s'"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <dépôt> [--exec <commande>] [<options>] <arbre ou "
-"apparenté> [<chemin>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject et --3way ne peuvent pas être utilisés ensemble."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <dépôt> [--exec <commande>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached et --3way ne peuvent pas être utilisés ensemble."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "le chemin '%s' ne correspond à aucun fichier"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way hors d'un dépôt"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "fmt"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index hors d'un dépôt"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "format d'archive"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached hors d'un dépôt"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "préfixe"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Impossible de préparer la regexp d'horodatage %s"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "préfixer chaque chemin de fichier dans l'archive"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec a retourné %d pour l'entrée : %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "fichier"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "nom de fichier du patch introuvable à la ligne %d"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "écrire l'archive dans ce fichier"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply : mauvais format de git-diff - /dev/null attendu, %s trouvé à la "
+"ligne %d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "lire .gitattributes dans le répertoire de travail"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply : mauvais format de git-diff - nouveau nom de fichier inconsistant "
+"à la ligne %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "afficher les fichiers archivés sur stderr"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply : mauvais format de git-diff - ancien nom de fichier inconsistant "
+"à la ligne %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "stockage seulement"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr ""
+"git apply : mauvais format de git-diff - /dev/null attendu à la ligne %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "compression rapide"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recomptage : ligne inattendue : %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "compression efficace"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "fragment de patch sans en-tête à la ligne %d : %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "afficher les formats d'archive supportés"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"information de nom de fichier manquante dans l'en-tête de git diff lors de "
+"la suppression de %d composant de préfixe de chemin (ligne %d)"
+msgstr[1] ""
+"information de nom de fichier manquante dans l'en-tête de git diff lors de "
+"la suppression de %d composants de préfixe de chemin (ligne %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "dépôt"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr ""
+"information de nom de fichier manquante dans l'en-tête de git diff (ligne %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "récupérer l'archive depuis le dépôt distant <dépôt>"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "le nouveau fichier dépend de contenus anciens"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "commande"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "le fichier supprimé a encore du contenu"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "chemin vers la commande distante git-upload-archive"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "patch corrompu à la ligne %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Option --remote inattendue"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "le nouveau fichier %s dépend de contenus anciens"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "L'option --exec ne peut être utilisée qu'en complément de --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "le fichier supprimé %s a encore du contenu"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Option --output inattendue"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Format d'archive inconnu '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "patch binaire corrompu à la ligne %d : %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Argument non supporté pour le format '%s' : -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "patch binaire non reconnu à la ligne %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Les motifs de négation sont ignorés dans les attributs git\n"
-"Utilisez '\\!' pour un point d'exclamation littéral."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "patch totalement incompréhensible à la ligne %d"
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "impossible d'ouvrir le fichier '%s'"
+msgid "unable to read symlink %s"
+msgstr "lecture du lien symbolique %s impossible"
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Contenu mal cité dans le fichier '%s' : %s"
+msgid "unable to open or read %s"
+msgstr "ouverture ou lecture de %s impossible"
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "Impossible de pousser la bissection plus loin !\n"
+msgid "invalid start of line: '%c'"
+msgstr "début de ligne invalide : '%c'"
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "%s n'est pas un nom de commit valide"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "La section n°%d a réussi à la ligne %d (offset %d ligne)."
+msgstr[1] "La section n°%d a réussi à la ligne %d (offset %d lignes)."
 
-#: bisect.c:732
+#: apply.c:3053
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"La base de fusion %s est mauvaise.\n"
-"Cela signifie que le bogue été corrigé entre %s et [%s].\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Contexte réduit à (%ld/%ld) pour appliquer le fragment à la ligne %d"
 
-#: bisect.c:737
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"La base de fusion %s est nouvelle.\n"
-"La propriété a changé entre %s et [%s].\n"
+"pendant la recherche de :\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "données de patch binaire manquantes pour '%s'"
+
+#: apply.c:3089
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"La base de fusion %s est %s.\n"
-"Ceci signifie que le premier commit '%s' est entre %s et [%s].\n"
+"impossible d'appliquer l'inverse d'un patch binaire à '%s' sans la section "
+"inverse"
 
-#: bisect.c:750
+#: apply.c:3135
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"Certaines révision %s ne sont pas ancêtres de la révision %s.\n"
-"git bisect ne peut pas fonctionner correctement dans ce cas.\n"
-"Peut-être avez-vous inversé les révisions %s et %s ?\n"
+"impossible d'appliquer un patch binaire à '%s' sans la ligne complète d'index"
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"La base de fusion entre %s et [%s] doit être évitée.\n"
-"On ne peut donc pas être certain que le premier commit %s se trouve entre %s "
-"et %s.\n"
-"On continue tout de même."
+"le patch s'applique à '%s' (%s), ce qui ne correspond pas au contenu actuel."
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "Bissection : une base de fusion doit être testée\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "le patch s'applique à un '%s' vide mais ce n'est pas vide"
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
-msgstr "une révision %s est nécessaire"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "l'image postérieure nécessaire %s pour '%s' ne peut pas être lue"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
-msgstr "impossible de créer le fichier '%s'"
+msgid "binary patch does not apply to '%s'"
+msgstr "le patch binaire ne s'applique par correctement à '%s'"
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
-msgstr "impossible de lire le fichier '%s'"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"le patch binaire sur '%s' crée un résultat incorrect (%s attendu, mais %s "
+"trouvé)"
 
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "impossible de lire les références de bissection"
+#: apply.c:3211
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "le patch a échoué : %s:%ld"
 
-#: bisect.c:967
+#: apply.c:3333
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s était à la fois %s et %s\n"
+msgid "cannot checkout %s"
+msgstr "extraction de %s impossible"
 
-#: bisect.c:975
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"Aucun commit testable n'a été trouvé\n"
-"Peut-être avez-vous démarré avec un mauvais paramètre de chemin ?\n"
+msgid "failed to read %s"
+msgstr "échec de la lecture de %s"
 
-#: bisect.c:994
+#: apply.c:3389
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(à peu près %d étape)"
-msgstr[1] "(à peu près %d étapes)"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "lecture depuis '%s' au-delà d'un lien symbolique"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "Bissection : %d révision à tester après cette %s\n"
-msgstr[1] "Bissection : %d révisions à tester après cette %s\n"
+msgid "path %s has been renamed/deleted"
+msgstr "le chemin %s a été renommé/supprimé"
 
-#: branch.c:53
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"Après correction de la cause de l'erreur, vous pouvez essayer de corriger\n"
-"l'information de suivi distant en invoquant\n"
-"\"git branch --setup-upstream-to=%s%s%s\"."
+msgid "%s: does not exist in index"
+msgstr "%s : n'existe pas dans l'index"
 
-#: branch.c:67
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "La branche %s ne peut pas être sa propre branche amont."
+msgid "%s: does not match index"
+msgstr "%s : ne correspond pas à l'index"
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
-"La branche %s est paramétrée pour suivre la branche distante %s de %s en "
-"rebasant."
+"le dépôt n'a pas les blobs nécessaires pour un retour à une fusion à 3 "
+"points."
 
-#: branch.c:94
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr ""
-"La branche %s est paramétrée pour suivre la branche distante %s depuis %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "Retour à une fusion à 3 points…\n"
 
-#: branch.c:98
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr ""
-"La branche %s est paramétrée pour suivre la branche locale %s en rebasant."
+msgid "cannot read the current contents of '%s'"
+msgstr "impossible de lire le contenu actuel de '%s'"
 
-#: branch.c:99
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "La branche %s est paramétrée pour suivre la branche locale %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Echec du retour à une fusion à 3 points…\n"
 
-#: branch.c:104
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
-"La branche %s est paramétrée pour suivre la référence distante %s en "
-"rebasant."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Patch %s appliqué avec des conflits.\n"
 
-#: branch.c:105
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "La branche %s est paramétrée pour suivre la référence distante %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Patch %s appliqué proprement.\n"
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"La branche %s est paramétrée pour suivre la référence locale %s en rebasant."
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "le patch de suppression laisse un contenu dans le fichier"
 
-#: branch.c:110
+#: apply.c:3697
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "La branche %s est paramétrée pour suivre la référence locale %s."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Échec de l'écriture de la configuration de branche amont"
+msgid "%s: wrong type"
+msgstr "%s : type erroné"
 
-#: branch.c:156
+#: apply.c:3699
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Pas de suivi : information ambiguë pour la référence %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s est de type %o, mais %o attendu"
 
-#: branch.c:185
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' n'est pas un nom de branche valide."
+msgid "invalid path '%s'"
+msgstr "chemin invalide '%s'"
 
-#: branch.c:190
+#: apply.c:3908
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Une branche nommée '%s' existe déjà."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Impossible de forcer la mise à jour de la branche courante."
+msgid "%s: already exists in index"
+msgstr "%s : existe déjà dans l'index"
 
-#: branch.c:218
+#: apply.c:3911
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"Impossible de paramétrer le suivi de branche ; le point de départ '%s' n'est "
-"pas une branche."
+msgid "%s: already exists in working directory"
+msgstr "%s : existe déjà dans la copie de travail"
 
-#: branch.c:220
+#: apply.c:3931
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "la branche amont demandée '%s' n'existe pas"
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o)"
 
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
+#: apply.c:3936
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
-"\n"
-"Si vous comptez baser votre travail sur une branche\n"
-"amont qui existe déjà sur le serveur distant, vous pouvez\n"
-"lancer \"git fetch\" pour la récupérer.\n"
-"\n"
-"Si vous comptez pousser une nouvelle branche locale qui suivra\n"
-"sa jumelle distante, vous pouvez utiliser \"git push -u\"\n"
-"pour paramétrer le suivi distant en même temps que vous poussez."
+"le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o) de %s"
 
-#: branch.c:266
+#: apply.c:3956
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Nom d'objet invalide : '%s'."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "le fichier affecté '%s' est au-delà d'un lien symbolique"
 
-#: branch.c:286
+#: apply.c:3960
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Nom d'objet ambigu : '%s'."
+msgid "%s: patch does not apply"
+msgstr "%s : le patch ne s'applique pas"
 
-#: branch.c:291
+#: apply.c:3975
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Point d'embranchement invalide : '%s'."
+msgid "Checking patch %s..."
+msgstr "Vérification du patch %s..."
 
-#: branch.c:345
+#: apply.c:4066
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' est déjà extrait dans '%s'"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr ""
+"l'information sha1 est manquante ou inutilisable pour le sous-module %s"
 
-#: branch.c:364
+#: apply.c:4073
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "la HEAD de la copie de travail %s n'est pas mise à jour"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "le mode change pour %s, qui n'est pas dans la HEAD actuelle"
 
-#: bundle.c:34
+#: apply.c:4076
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' ne semble pas être un fichier bundle v2"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "l'information de sha1 est manquante ou inutilisable (%s)."
 
-#: bundle.c:61
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "en-tête non reconnu : %s%s (%d)"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "échec de make_cache_entry pour le chemin '%s'"
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4085
 #, c-format
-msgid "could not open '%s'"
-msgstr "impossible d'ouvrir '%s'"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Le dépôt ne dispose pas des commits prérequis suivants :"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "échec de la préparation du parcours des révisions"
+msgid "could not add %s to temporary index"
+msgstr "impossible d'ajouter %s à l'index temporaire"
 
-#: bundle.c:185
+#: apply.c:4095
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Le colis contient cette référence :"
-msgstr[1] "Le colis contient ces %d références :"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Le colis enregistre l'historique complet."
+msgid "could not write temporary index to %s"
+msgstr "impossible d'écrire l'index temporaire dans %s"
 
-#: bundle.c:194
+#: apply.c:4233
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Le colis exige cette référence :"
-msgstr[1] "Le colis exige ces %d références :"
-
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Impossible de créer des objets groupés"
-
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "les objets groupés ont disparu"
-
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list a disparu"
+msgid "unable to remove %s from index"
+msgstr "suppression de %s dans l'index impossible"
 
-#: bundle.c:353
+#: apply.c:4268
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "la référence '%s' est exclue par les options de rev-list"
+msgid "corrupt patch for submodule %s"
+msgstr "patch corrompu pour le sous-module %s"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4274
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "argument non reconnu : %s"
+msgid "unable to stat newly created file '%s'"
+msgstr "stat du fichier nouvellement créé '%s' impossible"
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Refus de créer un colis vide."
+#: apply.c:4282
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+"création du magasin de stockage pour le fichier nouvellement créé %s "
+"impossible"
 
-#: bundle.c:463
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "cannot create '%s'"
-msgstr "impossible de créer '%s'"
+msgid "unable to add cache entry for %s"
+msgstr "ajout de l'élément de cache %s impossible"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "l'index de groupe a disparu"
+#: apply.c:4329
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "échec de l'écriture dans '%s'"
 
-#: color.c:290
+#: apply.c:4333
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "Valeur invalide de couleur : %.*s"
+msgid "closing file '%s'"
+msgstr "fermeture du fichier '%s'"
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4403
 #, c-format
-msgid "could not parse %s"
-msgstr "impossible d'analyser %s"
+msgid "unable to write file '%s' mode %o"
+msgstr "écriture du fichier '%s' mode %o impossible"
 
-#: commit.c:42
+#: apply.c:4501
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s n'est pas un commit !"
+msgid "Applied patch %s cleanly."
+msgstr "Patch %s appliqué proprement."
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "plus de mémoire"
+#: apply.c:4509
+msgid "internal error"
+msgstr "erreur interne"
 
-#: config.c:516
+#: apply.c:4512
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "ligne %d de config incorrecte dans le blob %s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Application du patch %%s avec %d rejet..."
+msgstr[1] "Application du patch %%s avec %d rejets..."
 
-#: config.c:520
+#: apply.c:4523
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "ligne %d de config incorrecte dans le fichier %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "troncature du nom de fichier .rej en %.*s.rej"
 
-#: config.c:524
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "ligne %d de config incorrecte dans l'entrée standard"
+msgid "cannot open %s"
+msgstr "impossible d'ouvrir %s"
 
-#: config.c:528
+#: apply.c:4545
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "ligne %d de config incorrecte dans le blob de sous-module %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Section n°%d appliquée proprement."
 
-#: config.c:532
+#: apply.c:4549
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "ligne %d de config incorrecte dans la ligne de commande %s"
+msgid "Rejected hunk #%d."
+msgstr "Section n°%d rejetée."
 
-#: config.c:536
+#: apply.c:4659
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "ligne %d de config incorrecte dans %s"
-
-#: config.c:655
-msgid "out of range"
-msgstr "hors plage"
+msgid "Skipped patch '%s'."
+msgstr "Chemin '%s' non traité."
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "unité invalide"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "entrée non reconnue"
 
-#: config.c:661
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "valeur numérique de configuration invalide '%s' pour '%s' : %s"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "lecture du fichier d'index impossible"
 
-#: config.c:666
+#: apply.c:4823
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-"valeur numérique de configuration incorrecte '%s' pour '%s' dans le blob "
-"%s : %s"
+msgid "can't open patch '%s': %s"
+msgstr "ouverture impossible du patch '%s' :%s"
 
-#: config.c:669
+#: apply.c:4850
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-"valeur numérique de configuration incorrecte '%s' pour '%s' dans le fichier "
-"%s : %s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "%d erreur d'espace ignorée"
+msgstr[1] "%d erreurs d'espace ignorées"
 
-#: config.c:672
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-"valeur numérique de configuration incorrecte '%s' pour '%s' dans l'entrée "
-"standard : %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d ligne a ajouté des erreurs d'espace."
+msgstr[1] "%d lignes ont ajouté des erreurs d'espace."
 
-#: config.c:675
+#: apply.c:4864
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-"valeur numérique de configuration incorrecte '%s' pour '%s' dans le blob de "
-"sous-module %s : %s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d ligne ajoutée après correction des erreurs d'espace."
+msgstr[1] "%d lignes ajoutées après correction des erreurs d'espace."
 
-#: config.c:678
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-"valeur numérique de configuration incorrecte '%s' pour '%s' dans la ligne de "
-"commande %s : %s"
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "Impossible d'écrire le nouveau fichier d'index"
 
-#: config.c:681
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-"valeur numérique de configuration incorrecte '%s' pour '%s' dans %s : %s"
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "chemin"
 
-#: config.c:768
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "impossible d'étendre le répertoire utilisateur dans : '%s'"
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "ne pas appliquer les modifications qui correspondent au chemin donné"
 
-#: config.c:849 config.c:860
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr "niveau de compression zlib incorrect %d"
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "appliquer les modifications qui correspondent au chemin donné"
 
-#: config.c:978
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "mode invalide pour la création d'objet : %s"
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
+msgstr "num"
 
-#: config.c:1312
-msgid "unable to parse command-line config"
-msgstr "lecture de la configuration de ligne de commande impossible"
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "supprimer <num> barres obliques des chemins traditionnels de diff"
 
-#: config.c:1362
-msgid "unknown error occurred while reading the configuration files"
-msgstr "erreur inconnue pendant la lecture des fichiers de configuration"
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "ignorer les additions réalisées par le patch"
 
-#: config.c:1716
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-"impossible d'analyser '%s' depuis le configuration en ligne de commande"
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "au lieu d'appliquer le patch, afficher le diffstat de l'entrée"
 
-#: config.c:1718
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
-"variable de configuration '%s' incorrecte dans le fichier '%s' à la ligne %d"
-
-#: config.c:1777
-#, c-format
-msgid "%s has multiple values"
-msgstr "%s a des valeurs multiples"
+"afficher le nombre de lignes ajoutées et supprimées en notation décimale"
 
-#: config.c:2311
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "impossible de régler '%s' à '%s'"
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "au lieu d'appliquer le patch, afficher un résumer de l'entrée"
 
-#: config.c:2313
-#, c-format
-msgid "could not unset '%s'"
-msgstr "impossible de désinitialiser '%s'"
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "au lieu d'appliquer le patch, voir si le patch est applicable"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Vérification de la connectivité"
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr "s'assurer que le patch est applicable sur l'index actuel"
 
-#: connected.c:74
-msgid "Could not run 'git rev-list'"
-msgstr "Impossible de lancer 'git rev-list'"
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "appliquer les patch sans toucher à la copie de travail"
 
-#: connected.c:94
-msgid "failed write to rev-list"
-msgstr "impossible d'écrire dans la rev-list"
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr "accepter un patch qui touche hors de la copie de travail"
 
-#: connected.c:101
-msgid "failed to close rev-list's stdin"
-msgstr "impossible de fermer l'entrée standard du rev-list"
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "appliquer aussi le patch (à utiliser avec ---stat/--summary/--check)"
 
-#: date.c:97
-msgid "in the future"
-msgstr "dans le futur"
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "tenter une fusion à 3 points si le patch ne s'applique pas proprement"
 
-#: date.c:103
-#, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "il y a %lu seconde"
-msgstr[1] "il y a %lu secondes"
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+"construire un index temporaire fondé sur l'information de l'index embarqué"
 
-#: date.c:110
-#, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "il y a %lu minute"
-msgstr[1] "il y a %lu minutes"
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
+msgstr "les chemins sont séparés par un caractère NUL"
 
-#: date.c:117
-#, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "il y a %lu heure"
-msgstr[1] "il y a %lu heures"
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr "s'assurer d'au moins <n> lignes de correspondance de contexte"
 
-#: date.c:124
-#, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "il y a %lu jour"
-msgstr[1] "il y a %lu jours"
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
+msgstr "action"
 
-#: date.c:130
-#, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "il y a %lu semaine"
-msgstr[1] "il y a %lu semaines"
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr ""
+"détecter des lignes nouvelles ou modifiées qui contiennent des erreurs "
+"d'espace"
 
-#: date.c:137
-#, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "il y a %lu mois"
-msgstr[1] "il y a %lu mois"
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
 
-#: date.c:148
-#, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu an"
-msgstr[1] "%lu ans"
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "appliquer le patch en sens inverse"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:151
-#, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "il y a %s et %lu mois"
-msgstr[1] "il y a %s et %lu mois"
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "ne pas s'attendre à au moins une ligne de contexte"
 
-#: date.c:156 date.c:161
-#, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "il y a %lu an"
-msgstr[1] "il y a %lu ans"
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "laisser les sections rejetées dans les fichiers *.rej correspondants"
 
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "impossible de lire le fichier de commande '%s'"
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "accepter les recouvrements de sections"
 
-#: diffcore-rename.c:540
-msgid "Performing inexact rename detection"
-msgstr "Détection de renommage inexact en cours"
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "mode verbeux"
 
-#: diff.c:116
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
-"  Impossible d'analyser le pourcentage de modification de dirstat '%s'\n"
+"tolérer des erreurs de détection de retours chariot manquants en fin de "
+"fichier"
 
-#: diff.c:121
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Paramètre dirstat inconnu '%s'\n"
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "ne pas se fier au compte de lignes dans les en-têtes de section"
 
-#: diff.c:225
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-"Valeur inconnue pour la variable de configuration 'diff.submodule' : '%s'"
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr "racine"
 
-#: diff.c:277
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Erreurs dans la variable de configuration 'diff.dirstat' :\n"
-"%s"
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "préfixer tous les noms de fichier avec <root>"
 
-#: diff.c:3017
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr "l'application de diff externe a disparu, arrêt à %s"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<options>] <arbre ou apparenté> [<chemin>...]"
 
-#: diff.c:3415
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow a besoin d'une spécification de chemin unique"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: diff.c:3578
-#, c-format
+#: archive.c:14
 msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
-"Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
-"%s"
+"git archive --remote <dépôt> [--exec <commande>] [<options>] <arbre ou "
+"apparenté> [<chemin>...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <dépôt> [--exec <commande>] --list"
 
-#: diff.c:3592
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
+msgid "pathspec '%s' did not match any files"
+msgstr "le chemin '%s' ne correspond à aucun fichier"
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "echec de l'obtention d'information de kernel"
+#: archive.c:417
+msgid "fmt"
+msgstr "fmt"
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr "Le cache non suivi est désactivé sur ce système ou sur cet endroit."
+#: archive.c:417
+msgid "archive format"
+msgstr "format d'archive"
 
-#: gpg-interface.c:178
-msgid "gpg failed to sign the data"
-msgstr "gpg n'a pas pu signer les données"
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "préfixe"
 
-#: gpg-interface.c:208
-msgid "could not create temporary file"
-msgstr "impossible de créer un fichier temporaire"
-
-#: gpg-interface.c:210
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "impossible d'écrire la signature détachée dans '%s'"
-
-#: grep.c:1792
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s' : lecture de %s impossible"
-
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
-#, c-format
-msgid "failed to stat '%s'"
-msgstr "échec du stat de '%s'"
-
-#: grep.c:1820
-#, c-format
-msgid "'%s': short read"
-msgstr "'%s' : lecture tronquée"
-
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "commandes git disponibles dans '%s'"
-
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "préfixer chaque chemin de fichier dans l'archive"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Ci-dessous les commandes Git habituelles dans diverses situations :"
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "fichier"
 
-#: help.c:309
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-"'%s' semble être une commande git, mais elle n'a pas pu\n"
-"être exécutée. Peut-être git-%s est-elle cassée ?"
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "écrire l'archive dans ce fichier"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Ahem. Votre système n'indique aucune commande Git."
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr "lire .gitattributes dans le répertoire de travail"
 
-#: help.c:388
-#, c-format
-msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
-msgstr ""
-"ATTENTION : vous avez invoqué une commande Git nommée '%s' qui n'existe "
-"pas.\n"
-"Continuons en supposant que vous avez voulu dire '%s'"
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "afficher les fichiers archivés sur stderr"
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "dans %0.1f secondes automatiquement..."
+#: archive.c:425
+msgid "store only"
+msgstr "stockage seulement"
 
-#: help.c:400
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git : '%s' n'est pas une commande git. Voir 'git --help'."
+#: archive.c:426
+msgid "compress faster"
+msgstr "compression rapide"
 
-#: help.c:404 help.c:470
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"Vouliez-vous dire cela ?"
-msgstr[1] ""
-"\n"
-"Vouliez-vous dire un de ceux-là ?"
+#: archive.c:434
+msgid "compress better"
+msgstr "compression efficace"
 
-#: help.c:466
-#, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "afficher les formats d'archive supportés"
 
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-"Impossible de créer '%s.lock' : %s.\n"
-"\n"
-"Il semble qu'un autre processus git est déjà lancé dans ce dépôt,\n"
-"par exemple un éditeur ouvert par 'git commit'. Veuillez vous assurer\n"
-"que tous les processus sont terminés et réessayez. Si l'echec persiste,\n"
-"un processus git peut avoir planté :\n"
-"supprimez le fichier manuellement pour poursuivre."
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "dépôt"
 
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "Impossible de créer '%s.lock' : %s"
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "récupérer l'archive depuis le dépôt distant <dépôt>"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "impossible de lire le cache"
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "commande"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "impossible d'écrire le nouveau fichier d'index"
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "chemin vers la commande distante git-upload-archive"
 
-#: merge-recursive.c:209
-msgid "(bad commit)\n"
-msgstr "(mauvais commit)\n"
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "Option --remote inattendue"
 
-#: merge-recursive.c:231
-#, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "échec de addinfo_cache pour le chemin '%s'"
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "L'option --exec ne peut être utilisée qu'en complément de --remote"
 
-#: merge-recursive.c:301
-msgid "error building trees"
-msgstr "erreur de construction des arbres"
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "Option --output inattendue"
 
-#: merge-recursive.c:720
+#: archive.c:475
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "impossible de créer le chemin '%s' %s"
+msgid "Unknown archive format '%s'"
+msgstr "Format d'archive inconnu '%s'"
 
-#: merge-recursive.c:731
+#: archive.c:482
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "Suppression de %s pour faire de la place pour le sous-répertoire\n"
-
-#: merge-recursive.c:745 merge-recursive.c:764
-msgid ": perhaps a D/F conflict?"
-msgstr ": peut-être un conflit D/F ?"
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argument non supporté pour le format '%s' : -%d"
 
-#: merge-recursive.c:754
+#: attr.c:212
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "refus de perdre le fichier non suivi '%s'"
+msgid "%.*s is not a valid attribute name"
+msgstr "%.*s n'est pas un nom valide d'attribut"
 
-#: merge-recursive.c:796
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr "impossible de lire l'objet %s '%s'"
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Les motifs de négation sont ignorés dans les attributs git\n"
+"Utilisez '\\!' pour un point d'exclamation littéral."
 
-#: merge-recursive.c:798
+#: bisect.c:444
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "blob attendu pour %s '%s'"
+msgid "Could not open file '%s'"
+msgstr "impossible d'ouvrir le fichier '%s'"
 
-#: merge-recursive.c:822
+#: bisect.c:449
 #, c-format
-msgid "failed to open '%s': %s"
-msgstr "échec à l'ouverture de '%s' : %s"
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Contenu mal cité dans le fichier '%s' : %s"
 
-#: merge-recursive.c:833
+#: bisect.c:657
 #, c-format
-msgid "failed to symlink '%s': %s"
-msgstr "échec à la création du lien symbolique '%s' : %s"
+msgid "We cannot bisect more!\n"
+msgstr "Impossible de pousser la bissection plus loin !\n"
 
-#: merge-recursive.c:838
+#: bisect.c:710
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "ne sait pas traiter %06o %s '%s'"
-
-#: merge-recursive.c:978
-msgid "Failed to execute internal merge"
-msgstr "Échec à l'exécution de la fusion interne"
+msgid "Not a valid commit name %s"
+msgstr "%s n'est pas un nom de commit valide"
 
-#: merge-recursive.c:982
+#: bisect.c:734
 #, c-format
-msgid "Unable to add %s to database"
-msgstr "Impossible d'ajouter %s à la base de données"
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"La base de fusion %s est mauvaise.\n"
+"Cela signifie que le bogue été corrigé entre %s et [%s].\n"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: bisect.c:739
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
 msgstr ""
-"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
-"%s laissée dans l'arbre."
+"La base de fusion %s est nouvelle.\n"
+"La propriété a changé entre %s et [%s].\n"
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: bisect.c:744
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
 msgstr ""
-"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
-"%s laissée dans l'arbre dans le fichier %s."
-
-#: merge-recursive.c:1143
-msgid "rename"
-msgstr "renommage"
-
-#: merge-recursive.c:1143
-msgid "renamed"
-msgstr "renommé"
+"La base de fusion %s est %s.\n"
+"Ceci signifie que le premier commit '%s' est entre %s et [%s].\n"
 
-#: merge-recursive.c:1200
+#: bisect.c:752
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s est un répertoire dans %s ajouté plutôt comme %s"
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Certaines révision %s ne sont pas ancêtres de la révision %s.\n"
+"git bisect ne peut pas fonctionner correctement dans ce cas.\n"
+"Peut-être les révisions %s et %s ne sont-elles pas les bonnes ?\n"
 
-#: merge-recursive.c:1225
+#: bisect.c:765
 #, c-format
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
 msgstr ""
-"CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
-"\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
+"La base de fusion entre %s et [%s] doit être évitée.\n"
+"On ne peut donc pas être certain que le premier commit %s se trouve entre %s "
+"et %s.\n"
+"On continue tout de même."
 
-#: merge-recursive.c:1230
-msgid " (left unresolved)"
-msgstr " (laissé non résolu)"
+#: bisect.c:800
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bissection : une base de fusion doit être testée\n"
 
-#: merge-recursive.c:1292
+#: bisect.c:851
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-"CONFLIT (renommage/renommage) : renommage '%s'->'%s' dans %s. Renommage '%s'-"
-">'%s' dans %s"
+msgid "a %s revision is needed"
+msgstr "une révision %s est nécessaire"
 
-#: merge-recursive.c:1325
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Renommage de %s en %s et de %s en %s à la place"
+msgid "could not create file '%s'"
+msgstr "impossible de créer le fichier '%s'"
 
-#: merge-recursive.c:1531
+#: bisect.c:919
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr ""
-"CONFLIT (renommage/ajout) : Renommage de %s->%s dans %s. %s ajouté dans %s"
+msgid "could not read file '%s'"
+msgstr "impossible de lire le fichier '%s'"
+
+#: bisect.c:949
+msgid "reading bisect refs failed"
+msgstr "impossible de lire les références de bissection"
 
-#: merge-recursive.c:1546
+#: bisect.c:969
 #, c-format
-msgid "Adding merged %s"
-msgstr "Ajout de %s fusionné"
+msgid "%s was both %s and %s\n"
+msgstr "%s était à la fois %s et %s\n"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: bisect.c:977
 #, c-format
-msgid "Adding as %s instead"
-msgstr "Ajout plutôt comme %s"
-
-#: merge-recursive.c:1610
-#, c-format
-msgid "cannot read object %s"
-msgstr "impossible de lire l'objet %s"
-
-#: merge-recursive.c:1613
-#, c-format
-msgid "object %s is not a blob"
-msgstr "l'objet %s n'est pas un blob"
-
-#: merge-recursive.c:1666
-msgid "modify"
-msgstr "modification"
-
-#: merge-recursive.c:1666
-msgid "modified"
-msgstr "modifié"
-
-#: merge-recursive.c:1676
-msgid "content"
-msgstr "contenu"
-
-#: merge-recursive.c:1683
-msgid "add/add"
-msgstr "ajout/ajout"
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"Aucun commit testable n'a été trouvé\n"
+"Peut-être avez-vous démarré avec un mauvais paramètre de chemin ?\n"
 
-#: merge-recursive.c:1718
+#: bisect.c:996
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "%s sauté (fusion identique à l'existant)"
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(à peu près %d étape)"
+msgstr[1] "(à peu près %d étapes)"
 
-#: merge-recursive.c:1732
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
 #, c-format
-msgid "Auto-merging %s"
-msgstr "Fusion automatique de %s"
-
-#: merge-recursive.c:1736 git-submodule.sh:919
-msgid "submodule"
-msgstr "sous-module"
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Bissection : %d révision à tester après cette %s\n"
+msgstr[1] "Bissection : %d révisions à tester après cette %s\n"
 
-#: merge-recursive.c:1737
+#: branch.c:53
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"Après correction de la cause de l'erreur, vous pouvez essayer de corriger\n"
+"l'information de suivi distant en invoquant\n"
+"\"git branch --setup-upstream-to=%s%s%s\"."
 
-#: merge-recursive.c:1831
+#: branch.c:67
 #, c-format
-msgid "Removing %s"
-msgstr "Suppression de %s"
-
-#: merge-recursive.c:1857
-msgid "file/directory"
-msgstr "fichier/répertoire"
-
-#: merge-recursive.c:1863
-msgid "directory/file"
-msgstr "répertoire/fichier"
+msgid "Not setting branch %s as its own upstream."
+msgstr "La branche %s ne peut pas être sa propre branche amont."
 
-#: merge-recursive.c:1868
+#: branch.c:93
 #, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
-"CONFLIT (%s) : Il y a un répertoire nommé %s dans %s. Ajout de %s comme %s"
-
-#: merge-recursive.c:1877
-#, c-format
-msgid "Adding %s"
-msgstr "Ajout de %s"
-
-#: merge-recursive.c:1914
-msgid "Already up-to-date!"
-msgstr "Déjà à jour !"
+"La branche %s est paramétrée pour suivre la branche distante %s de %s en "
+"rebasant."
 
-#: merge-recursive.c:1923
+#: branch.c:94
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "échec de fusion des arbres %s et %s"
-
-#: merge-recursive.c:2006
-msgid "Merging:"
-msgstr "Fusion :"
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr ""
+"La branche %s est paramétrée pour suivre la branche distante %s depuis %s."
 
-#: merge-recursive.c:2019
+#: branch.c:98
 #, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "%u ancêtre commun trouvé :"
-msgstr[1] "%u ancêtres communs trouvés :"
-
-#: merge-recursive.c:2058
-msgid "merge returned no commit"
-msgstr "la fusion n'a pas retourné de commit"
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr ""
+"La branche %s est paramétrée pour suivre la branche locale %s en rebasant."
 
-#: merge-recursive.c:2121
+#: branch.c:99
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Impossible d'analyser l'objet '%s'"
-
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
-msgid "Unable to write index."
-msgstr "Impossible d'écrire l'index."
-
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "Impossible de valider un arbre de notes non initialisé/référencé"
+msgid "Branch %s set up to track local branch %s."
+msgstr "La branche %s est paramétrée pour suivre la branche locale %s."
 
-#: notes-utils.c:100
+#: branch.c:104
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Mauvaise valeur de notes.rewriteMode : '%s'"
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr ""
+"La branche %s est paramétrée pour suivre la référence distante %s en "
+"rebasant."
 
-#: notes-utils.c:110
+#: branch.c:105
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "Refus de réécrire des notes dans %s (hors de refs/notes/)"
+msgid "Branch %s set up to track remote ref %s."
+msgstr "La branche %s est paramétrée pour suivre la référence distante %s."
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: branch.c:109
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Mauvaise valeur de %s : '%s'"
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"La branche %s est paramétrée pour suivre la référence locale %s en rebasant."
 
-#: object.c:242
+#: branch.c:110
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "impossible d'analyser l'objet : %s"
+msgid "Branch %s set up to track local ref %s."
+msgstr "La branche %s est paramétrée pour suivre la référence locale %s."
 
-#: parse-options.c:572
-msgid "..."
-msgstr "..."
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Échec de l'écriture de la configuration de branche amont"
 
-#: parse-options.c:590
+#: branch.c:156
 #, c-format
-msgid "usage: %s"
-msgstr "usage : %s"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Pas de suivi : information ambiguë pour la référence %s"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: branch.c:185
 #, c-format
-msgid "   or: %s"
-msgstr "   ou : %s"
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' n'est pas un nom de branche valide."
 
-#: parse-options.c:597
+#: branch.c:190
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "A branch named '%s' already exists."
+msgstr "Une branche nommée '%s' existe déjà."
 
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-NUM"
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Impossible de forcer la mise à jour de la branche courante."
 
-#: parse-options-cb.c:108
+#: branch.c:218
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "nom d'objet malformé '%s'"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"Impossible de paramétrer le suivi de branche ; le point de départ '%s' n'est "
+"pas une branche."
 
-#: path.c:798
+#: branch.c:220
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "Impossible de rendre %s inscriptible pour le groupe"
-
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-"les réglages de spécificateurs de chemin généraux 'glob' et 'noglob' sont "
-"incompatibles"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "la branche amont demandée '%s' n'existe pas"
 
-#: pathspec.c:143
+#: branch.c:222
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
 msgstr ""
-"le réglage global de spécificateur de chemin 'literal' est incompatible avec "
-"tous les autres réglages globaux de spécificateur de chemin"
-
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "paramètre invalide pour le spécificateur magique de chemin 'prefix'"
+"\n"
+"Si vous comptez baser votre travail sur une branche\n"
+"amont qui existe déjà sur le serveur distant, vous pouvez\n"
+"lancer \"git fetch\" pour la récupérer.\n"
+"\n"
+"Si vous comptez pousser une nouvelle branche locale qui suivra\n"
+"sa jumelle distante, vous pouvez utiliser \"git push -u\"\n"
+"pour paramétrer le suivi distant en même temps que vous poussez."
 
-#: pathspec.c:183
+#: branch.c:265
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "La spécification magique de chemin '%.*s' est invalide dans '%s'"
+msgid "Not a valid object name: '%s'."
+msgstr "Nom d'objet invalide : '%s'."
 
-#: pathspec.c:187
+#: branch.c:285
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "')' manquante à la fin du spécificateur magique de chemin dans '%s'"
+msgid "Ambiguous object name: '%s'."
+msgstr "Nom d'objet ambigu : '%s'."
 
-#: pathspec.c:205
+#: branch.c:290
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Spécificateur magique '%c' non implémenté dans '%s'"
+msgid "Not a valid branch point: '%s'."
+msgstr "Point d'embranchement invalide : '%s'."
 
-#: pathspec.c:230
+#: branch.c:344
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s : 'literal' et 'glob' sont incompatibles"
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' est déjà extrait dans '%s'"
 
-#: pathspec.c:241
+#: branch.c:364
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s : '%s' est hors du dépôt"
+msgid "HEAD of working tree %s is not updated"
+msgstr "la HEAD de la copie de travail %s n'est pas mise à jour"
 
-#: pathspec.c:291
+#: bundle.c:34
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Le chemin '%s' est dans le sous-module '%.*s'"
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' ne semble pas être un fichier bundle v2"
 
-#: pathspec.c:353
+#: bundle.c:61
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-"%s : le spécificateur magique de chemin n'est pas supporté par cette "
-"commande : %s"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "en-tête non reconnu : %s%s (%d)"
 
-#: pathspec.c:433
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "le chemin '%s' est au-delà d'un lien symbolique"
-
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-"Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
-"Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
+msgid "could not open '%s'"
+msgstr "impossible d'ouvrir '%s'"
 
-#: pretty.c:973
-msgid "unable to parse --pretty format"
-msgstr "impossible d'analyser le format --pretty"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Le dépôt ne dispose pas des commits prérequis suivants :"
 
-#: progress.c:235
-msgid "done"
-msgstr "fait"
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "échec de la préparation du parcours des révisions"
 
-#: read-cache.c:1281
+#: bundle.c:185
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"version d'index renseignée, mais la valeur est invalide.\n"
-"Utilisation de la version %i"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "Le colis contient cette référence :"
+msgstr[1] "Le colis contient ces %d références :"
 
-#: read-cache.c:1291
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"GIT_INDEX_VERSION est renseigné, mais la valeur est invalide.\n"
-"Utilisation de la version %i"
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Le colis enregistre l'historique complet."
 
-#: refs.c:551 builtin/merge.c:840
+#: bundle.c:194
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Impossible d'ouvrir '%s' en écriture"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "Le colis exige cette référence :"
+msgstr[1] "Le colis exige ces %d références :"
 
-#: refs/files-backend.c:2534
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr "Impossible de supprimer la référence %s : %s"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Impossible de créer des objets groupés"
 
-#: refs/files-backend.c:2537
-#, c-format
-msgid "could not delete references: %s"
-msgstr "impossible de supprimer les références : %s"
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "les objets groupés ont disparu"
 
-#: refs/files-backend.c:2546
-#, c-format
-msgid "could not remove reference %s"
-msgstr "impossible de supprimer la référence %s"
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list a disparu"
 
-#: ref-filter.c:55
+#: bundle.c:353
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "format attendu : %%(color:<couleur>)"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "la référence '%s' est exclue par les options de rev-list"
 
-#: ref-filter.c:57
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "couleur non reconnue : %%(color:%s)"
+msgid "unrecognized argument: %s"
+msgstr "argument non reconnu : %s"
 
-#: ref-filter.c:71
-#, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "format non reconnu %%(%s)"
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Refus de créer un colis vide."
 
-#: ref-filter.c:77
+#: bundle.c:463
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) n'accepte pas d'argument"
+msgid "cannot create '%s'"
+msgstr "impossible de créer '%s'"
 
-#: ref-filter.c:84
-#, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) n'accepte pas d'argument"
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "l'index de groupe a disparu"
 
-#: ref-filter.c:101
+#: color.c:300
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "valeur positive attendue contents:lines=%s"
+msgid "invalid color value: %.*s"
+msgstr "Valeur invalide de couleur : %.*s"
 
-#: ref-filter.c:103
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "argument %%(contents) non reconnu : %s"
+msgid "could not parse %s"
+msgstr "impossible d'analyser %s"
 
-#: ref-filter.c:113
+#: commit.c:42
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "argument %%(objectname) non reconnu : %s"
+msgid "%s %s is not a commit!"
+msgstr "%s %s n'est pas un commit !"
 
-#: ref-filter.c:135
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "format attendu : %%(align:<largeur>,<position>)"
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"Avertissement : le message de validation ne se conforme pas à UTF-8.\n"
+"Vous souhaitez peut-être le modifier après correction du message ou régler "
+"la\n"
+"variable de configuration i18n.commitencoding à l'encodage utilisé par votre "
+"projet.\n"
 
-#: ref-filter.c:147
-#, c-format
-msgid "unrecognized position:%s"
-msgstr "position non reconnue : %s"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "plus de mémoire"
 
-#: ref-filter.c:151
-#, c-format
-msgid "unrecognized width:%s"
-msgstr "largeur non reconnue : %s"
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr ""
+"les conditions d'inclusion de configuration relative doivent venir de "
+"fichiers"
 
-#: ref-filter.c:157
+#: config.c:711
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "argument %%(align) non reconnu : %s"
+msgid "bad config line %d in blob %s"
+msgstr "ligne %d de config incorrecte dans le blob %s"
 
-#: ref-filter.c:161
+#: config.c:715
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "valeur positive attendue avec l'atome %%(align)"
+msgid "bad config line %d in file %s"
+msgstr "ligne %d de config incorrecte dans le fichier %s"
 
-#: ref-filter.c:244
+#: config.c:719
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "nom de champ malformé %.*s"
+msgid "bad config line %d in standard input"
+msgstr "ligne %d de config incorrecte dans l'entrée standard"
 
-#: ref-filter.c:270
+#: config.c:723
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "nom de champ inconnu : %.*s"
+msgid "bad config line %d in submodule-blob %s"
+msgstr "ligne %d de config incorrecte dans le blob de sous-module %s"
 
-#: ref-filter.c:372
+#: config.c:727
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "format : atome %%(end) utilisé sans atome correspondant"
+msgid "bad config line %d in command line %s"
+msgstr "ligne %d de config incorrecte dans la ligne de commande %s"
 
-#: ref-filter.c:424
+#: config.c:731
 #, c-format
-msgid "malformed format string %s"
-msgstr "Chaîne de formatage mal formée %s"
+msgid "bad config line %d in %s"
+msgstr "ligne %d de config incorrecte dans %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= requiert un argument entier positif"
+#: config.c:859
+msgid "out of range"
+msgstr "hors plage"
 
-#: ref-filter.c:883
-#, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "la réf '%s' n'a pas %ld composants à :strip"
+#: config.c:859
+msgid "invalid unit"
+msgstr "unité invalide"
 
-#: ref-filter.c:1046
+#: config.c:865
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "format de %.*s inconnu %s"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valeur numérique de configuration invalide '%s' pour '%s' : %s"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: config.c:870
 #, c-format
-msgid "missing object %s for %s"
-msgstr "objet manquant %s pour %s"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr ""
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans le blob "
+"%s : %s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: config.c:873
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "echec de parse_object_buffer sur %s pour %s"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr ""
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans le fichier "
+"%s : %s"
 
-#: ref-filter.c:1311
+#: config.c:876
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "objet malformé à '%s'"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr ""
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans l'entrée "
+"standard : %s"
 
-#: ref-filter.c:1373
+#: config.c:879
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "réf avec un nom cassé %s ignoré"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr ""
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans le blob de "
+"sous-module %s : %s"
 
-#: ref-filter.c:1378
+#: config.c:882
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "réf cassé %s ignoré"
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr ""
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans la ligne de "
+"commande %s : %s"
 
-#: ref-filter.c:1651
+#: config.c:885
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "format: atome %%(end) manquant"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr ""
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans %s : %s"
 
-#: ref-filter.c:1705
+#: config.c:980
 #, c-format
-msgid "malformed object name %s"
-msgstr "nom d'objet malformé %s"
+msgid "failed to expand user dir in: '%s'"
+msgstr "impossible d'étendre le répertoire utilisateur dans : '%s'"
 
-#: remote.c:746
+#: config.c:1075 config.c:1086
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "Impossible de récupérer à la fois %s et %s pour %s"
+msgid "bad zlib compression level %d"
+msgstr "niveau de compression zlib incorrect %d"
 
-#: remote.c:750
+#: config.c:1203
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s suit habituellement %s, pas %s"
+msgid "invalid mode for object creation: %s"
+msgstr "mode invalide pour la création d'objet : %s"
 
-#: remote.c:754
+#: config.c:1359
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s suit à la fois %s et %s"
+msgid "bad pack compression level %d"
+msgstr "niveau de compression du paquet %d"
 
-#: remote.c:762
-msgid "Internal error"
-msgstr "Erreur interne"
-
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD ne pointe pas sur une branche"
+#: config.c:1557
+msgid "unable to parse command-line config"
+msgstr "lecture de la configuration de ligne de commande impossible"
 
-#: remote.c:1686
-#, c-format
-msgid "no such branch: '%s'"
-msgstr "pas de branche '%s'"
+#: config.c:1611
+msgid "unknown error occurred while reading the configuration files"
+msgstr "erreur inconnue pendant la lecture des fichiers de configuration"
 
-#: remote.c:1689
+#: config.c:1970
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "aucune branche amont configurée pour la branche '%s'"
+msgid "Invalid %s: '%s'"
+msgstr "%s invalide : '%s'"
 
-#: remote.c:1695
+#: config.c:1991
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "la branche amont '%s' n'est pas stockée comme branche de suivi"
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr ""
+"valeur '%s' de core.untrackedCache inconnue ; utilisation de 'keep' par "
+"défaut"
 
-#: remote.c:1710
+#: config.c:2017
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
 msgstr ""
-"la destination de poussée '%s' sur le serveur distant '%s' n'a pas de "
-"branche locale de suivi"
+"la valeur '%d' de splitIndex.maxPercentChange devrait se situer entre 0 et "
+"100"
 
-#: remote.c:1725
+#: config.c:2028
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "la branche '%s' n'a aucune branche distante de poussée"
+msgid "unable to parse '%s' from command-line config"
+msgstr ""
+"impossible d'analyser '%s' depuis le configuration en ligne de commande"
 
-#: remote.c:1736
+#: config.c:2030
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "les références de spec pour '%s' n'incluent pas '%s'"
-
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "la poussée n'a pas de destination (push.default vaut 'nothing')"
-
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
+msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr ""
-"impossible de résoudre une poussée 'simple' pour une destination unique"
+"variable de configuration '%s' incorrecte dans le fichier '%s' à la ligne %d"
 
-#: remote.c:2073
+#: config.c:2089
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "Votre branche est basée sur '%s', mais la branche amont a disparu.\n"
+msgid "%s has multiple values"
+msgstr "%s a des valeurs multiples"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (utilisez \"git branch --unset-upstream\" pour corriger)\n"
+#: config.c:2423 config.c:2648
+#, c-format
+msgid "fstat on %s failed"
+msgstr "échec de fstat sur %s"
 
-#: remote.c:2080
+#: config.c:2541
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Votre branche est à jour avec '%s'.\n"
+msgid "could not set '%s' to '%s'"
+msgstr "impossible de régler '%s' à '%s'"
 
-#: remote.c:2084
+#: config.c:2543 builtin/remote.c:774
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Votre branche est en avance sur '%s' de %d commit.\n"
-msgstr[1] "Votre branche est en avance sur '%s' de %d commits.\n"
+msgid "could not unset '%s'"
+msgstr "impossible de désinitialiser '%s'"
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "L'hôte distant a fermé la connexion lors du contact initial"
 
-#: remote.c:2093
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-"Votre branche est en retard sur '%s' de %d commit, et peut être mise à jour "
-"en avance rapide.\n"
-msgstr[1] ""
-"Votre branche est en retard sur '%s' de %d commits, et peut être mise à jour "
-"en avance rapide.\n"
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"Impossible de lire le dépôt distant.\n"
+"\n"
+"Veuillez vérifier que vous avez les droits d'accès\n"
+"et que le dépôt existe."
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Vérification de la connectivité"
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Impossible de lancer 'git rev-list'"
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "impossible d'écrire dans la rev-list"
+
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "impossible de fermer l'entrée standard du rev-list"
 
-#: remote.c:2104
+#: convert.c:201
 #, c-format
 msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"Votre branche et '%s' ont divergé,\n"
-"et ont %d et %d commit différent chacune respectivement.\n"
-msgstr[1] ""
-"Votre branche et '%s' ont divergé,\n"
-"et ont %d et %d commits différents chacune respectivement.\n"
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"Les CRLF seront remplacés par des LF dans %s.\n"
+"Le fichier conservera ses fins de ligne d'origine dans votre copie de "
+"travail."
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "Les CRLF seraient remplacés par des LF dans %s."
+
+#: convert.c:211
+#, c-format
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"  (utilisez \"git pull\" pour fusionner la branche distante dans la vôtre)\n"
+"Les LF seront remplacés par des CRLF dans %s.\n"
+"Le fichier conservera ses fins de ligne d'origine dans votre copie de "
+"travail."
 
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "votre branche actuelle semble cassée"
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "Les LF seraient remplacés par des CRLF dans %s"
+
+#: date.c:97
+msgid "in the future"
+msgstr "dans le futur"
 
-#: revision.c:2135
+#: date.c:103
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "votre branche actuelle '%s' ne contient encore aucun commit"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "il y a %lu seconde"
+msgstr[1] "il y a %lu secondes"
 
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent est incompatible avec --bisect"
+#: date.c:110
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "il y a %lu minute"
+msgstr[1] "il y a %lu minutes"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "échec de l'ouverture de /dev/null"
+#: date.c:117
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "il y a %lu heure"
+msgstr[1] "il y a %lu heures"
 
-#: run-command.c:94
+#: date.c:124
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "échec de dup2(%d,%d)"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "il y a %lu jour"
+msgstr[1] "il y a %lu jours"
 
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "impossible de signer le certificat de poussée"
+#: date.c:130
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "il y a %lu semaine"
+msgstr[1] "il y a %lu semaines"
 
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "Le receveur ne gère pas les poussées avec --signed"
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "il y a %lu mois"
+msgstr[1] "il y a %lu mois"
 
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
+#: date.c:148
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu an"
+msgstr[1] "%lu ans"
+
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "il y a %s et %lu mois"
+msgstr[1] "il y a %s et %lu mois"
+
+#: date.c:156 date.c:161
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "il y a %lu an"
+msgstr[1] "il y a %lu ans"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "impossible de lire le fichier de commande '%s'"
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Détection de renommage inexact en cours"
+
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "le commutateur '%s' a besoin d'une valeur"
+
+#: diff.c:124
+#, c-format
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
-"pas d'envoi de certificat de poussée car le receveur ne gère pas les "
-"poussées avec --signed"
+"  Impossible d'analyser le pourcentage de modification de dirstat '%s'\n"
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "Le receveur ne gère pas les poussées avec --atomic"
+#: diff.c:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Paramètre dirstat inconnu '%s'\n"
 
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "Le receveur ne gère pas les options de poussées"
+#: diff.c:281
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr ""
+"Valeur inconnue pour la variable de configuration 'diff.submodule' : '%s'"
 
-#: sequencer.c:174
+#: diff.c:344
+#, c-format
 msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
 msgstr ""
-"après résolution des conflits, marquez les chemins corrigés\n"
-"avec 'git add <chemins>' ou 'git rm <chemins>'"
+"Erreurs dans la variable de configuration 'diff.dirstat' :\n"
+"%s"
+
+#: diff.c:3102
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "l'application de diff externe a disparu, arrêt à %s"
+
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check et -s sont mutuellement exclusifs"
+
+#: diff.c:3518
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow a besoin d'une spécification de chemin unique"
 
-#: sequencer.c:177
+#: diff.c:3681
+#, c-format
 msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
 msgstr ""
-"après résolution des conflits, marquez les chemins corrigés\n"
-"avec 'git add <chemins>' ou 'git rm <chemins>'\n"
-"puis validez le résultat avec 'git commit'"
+"Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
+"%s"
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: diff.c:3695
 #, c-format
-msgid "Could not write to %s"
-msgstr "Impossible d'écrire dans %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
+
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
+msgstr ""
+"détection de renommage inexact annulée à cause d'un trop grand nombre de "
+"fichiers."
+
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
+msgstr ""
+"recherche uniquement des copies par modification de chemin à cause d'un trop "
+"grand nombre de fichiers."
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: diff.c:4725
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Erreur lors de l'emballage de %s."
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"vous souhaitez peut-être régler la variable %s à au moins %d et réessayer le "
+"commande."
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Vos modifications locales seraient écrasées par cherry-pick."
+#: dir.c:1899
+msgid "failed to get kernel name and information"
+msgstr "echec de l'obtention d'information de kernel"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Vos modifications locales seraient écrasées par revert."
+#: dir.c:2018
+msgid "Untracked cache is disabled on this system or location."
+msgstr "Le cache non suivi est désactivé sur ce système ou sur cet endroit."
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Validez vos modifications ou les remiser pour continuer."
+#: dir.c:2776 dir.c:2781
+#, c-format
+msgid "could not create directories for %s"
+msgstr "impossible de créer les répertoires pour %s"
 
-#: sequencer.c:228
+#: dir.c:2806
 #, c-format
-msgid "%s: fast-forward"
-msgstr "%s : avance rapide"
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "impossible de migrer le répertoire git de '%s' vers '%s'"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
+#: entry.c:280
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Impossible d'écrire le nouveau fichier index"
+msgid "could not stat file '%s'"
+msgstr "impossible de stat le fichier '%s'"
 
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "Impossible de résoudre le commit HEAD\n"
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack : list courte attendue"
 
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "Impossible de mettre à jour l'arbre de cache\n"
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack : ACK/NACK attendu, EOF reçu"
 
-#: sequencer.c:393
+#: fetch-pack.c:280 builtin/archive.c:63
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Impossible d'analyser le commit %s\n"
+msgid "remote error: %s"
+msgstr "erreur distante : %s"
 
-#: sequencer.c:398
+#: fetch-pack.c:281
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Impossible d'analyser le commit parent %s\n"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack : ACK/NACK attendu, '%s' reçu"
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "Votre fichier d'index n'est pas fusionné."
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc nécessite multi_ack_detailed"
 
-#: sequencer.c:482
+#: fetch-pack.c:419
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Le commit %s est une fusion mais l'option -m n'a pas été spécifiée."
+msgid "invalid shallow line: %s"
+msgstr "ligne de superficiel invalide : %s"
 
-#: sequencer.c:490
+#: fetch-pack.c:425
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Le commit %s n'a pas le parent %d"
+msgid "invalid unshallow line: %s"
+msgstr "ligne de fin de superficiel invalide : %s"
 
-#: sequencer.c:494
+#: fetch-pack.c:427
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr ""
-"Une branche principale a été spécifiée mais le commit %s n'est pas une "
-"fusion."
+msgid "object not found: %s"
+msgstr "objet non trouvé : %s"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: fetch-pack.c:430
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s : impossible d'analyser le commit parent %s"
+msgid "error in object: %s"
+msgstr "Erreur dans l'objet : %s"
 
-#: sequencer.c:511
+#: fetch-pack.c:432
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Impossible d'obtenir un message de validation pour %s"
+msgid "no shallow found: %s"
+msgstr "Pas de superficiel trouvé : %s"
 
-#: sequencer.c:597
+#: fetch-pack.c:435
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "impossible d'annuler %s... %s"
+msgid "expected shallow/unshallow, got %s"
+msgstr "superficiel/non superficiel attendu, %s trouvé"
 
-#: sequencer.c:598
+#: fetch-pack.c:474
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "impossible d'appliquer %s... %s"
+msgid "got %s %d %s"
+msgstr "réponse %s %d %s"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "l'ensemble de commits spécifié est vide"
+#: fetch-pack.c:488
+#, c-format
+msgid "invalid commit %s"
+msgstr "commit invalide %s"
+
+#: fetch-pack.c:521
+msgid "giving up"
+msgstr "abandon"
 
-#: sequencer.c:641
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
+msgstr "fait"
+
+#: fetch-pack.c:543
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s : échec à la lecture de l'index"
+msgid "got %s (%d) %s"
+msgstr "%s trouvé (%d) %s"
 
-#: sequencer.c:645
+#: fetch-pack.c:589
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s : échec du rafraîchissement de l'index"
+msgid "Marking %s as complete"
+msgstr "Marquage de %s comme terminé"
 
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "Impossible d'annuler un commit pendant l'annulation d'un commit."
+#: fetch-pack.c:737
+#, c-format
+msgid "already have %s (%s)"
+msgstr "%s déjà possédé (%s)"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "Impossible d'annuler un commit pendant un picorage."
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack : impossible de dupliquer le démultiplexeur latéral"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "Impossible de picorer pendant l'annulation d'un commit."
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
+msgstr "erreur de protocole : mauvais entête de paquet"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "Impossible de picorer pendant un autre picorage."
+#: fetch-pack.c:839
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack : impossible de dupliquer %s"
 
-#: sequencer.c:732
+#: fetch-pack.c:855
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Impossible d'analyser la ligne %d."
+msgid "%s failed"
+msgstr "échec de %s"
 
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "Aucun commit analysé."
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
+msgstr "erreur dans le démultiplexer latéral"
 
-#: sequencer.c:749
-#, c-format
-msgid "Could not open %s"
-msgstr "Impossible d'ouvrir %s"
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
+msgstr "Le serveur ne supporte les clients superficiels"
 
-#: sequencer.c:753
-#, c-format
-msgid "Could not read %s."
-msgstr "Impossible de lire %s."
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
+msgstr "Le serveur supporte multi_ack_detailed"
 
-#: sequencer.c:760
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Feuille d'instruction inutilisable : %s"
+#: fetch-pack.c:891
+msgid "Server supports no-done"
+msgstr "Le serveur support no-done"
 
-#: sequencer.c:790
-#, c-format
-msgid "Invalid key: %s"
-msgstr "Clé invalide: %s"
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
+msgstr "Le serveur supporte multi_ack"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
-#, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Valeur invalide pour %s : %s"
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
+msgstr "Le serveur supporte side-band-64k"
 
-#: sequencer.c:803
-#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Feuille d'options malformée : %s"
+#: fetch-pack.c:905
+msgid "Server supports side-band"
+msgstr "Le serveru supporte side-band"
 
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "un picorage ou un retour est déjà en cours"
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Le serveur supporte allow-tip-sha1-in-want"
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\""
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Le serveur supporte allow-reachable-sha1-in-want"
 
-#: sequencer.c:827
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
+msgstr "Le serveur support ofs-delta"
+
+#: fetch-pack.c:930
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Impossible de créer le répertoire de séquenceur %s"
+msgid "Server version is %.*s"
+msgstr "La version du serveur est %.*s"
 
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "aucun picorage ou retour en cours"
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
+msgstr "Le receveur ne gère pas --shallow-since"
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "impossible de résoudre HEAD"
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
+msgstr "Le receveur ne gère pas --shallow-exclude"
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "impossible d'abandonner depuis une branche non encore créée"
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
+msgstr "Le receveur ne gère pas --deepen"
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
-#, c-format
-msgid "cannot open %s"
-msgstr "impossible d'ouvrir %s"
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr "pas de commit commun"
 
-#: sequencer.c:888
-#, c-format
-msgid "cannot read %s: %s"
-msgstr "impossible de lire %s : %s"
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack : échec de le récupération."
 
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "fin de fichier inattendue"
+#: fetch-pack.c:1127
+msgid "no matching remote head"
+msgstr "pas de HEAD distante correspondante"
 
-#: sequencer.c:895
+#: fetch-pack.c:1149
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu"
+msgid "no such remote ref %s"
+msgstr "référence distante inconnue %s"
 
-#: sequencer.c:921
+#: fetch-pack.c:1152
 #, c-format
-msgid "Could not format %s."
-msgstr "Impossible de formater %s."
+msgid "Server does not allow request for unadvertised object %s"
+msgstr "Le serveur n'autorise pas de requête pour l'objet %s non annoncé"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg n'a pas pu signer les données"
 
-#: sequencer.c:1066
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "impossible de créer un fichier temporaire"
+
+#: gpg-interface.c:217
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s : impossible de picorer un %s"
+msgid "failed writing detached signature to '%s'"
+msgstr "impossible d'écrire la signature détachée dans '%s'"
 
-#: sequencer.c:1069
+#: graph.c:96
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s : mauvaise révision"
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "couleur invalide '%.*s' ignorée dans log.graphColors"
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "Impossible d'annuler en tant que commit initial"
+#: grep.c:1796
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr "'%s' : lecture de %s impossible"
 
-#: setup.c:160
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s : ce chemin n'existe pas dans la copie de travail.\n"
-"Utilisez 'git <commande> -- <chemin>...' pour spécifier des chemins qui "
-"n'existent pas localement."
-
-#: setup.c:173
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"argument '%s' ambigu : révision inconnue ou chemin inexistant.\n"
-"Utilisez '--' pour séparer les chemins des révisions, comme ceci :\n"
-"'git <commande> [<révision>...] -- [<chemin>...]'"
-
-#: setup.c:223
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"argument '%s' ambigu : révision et chemin spécifiés.\n"
-"Utilisez '--' pour séparer les chemins des révisions, comme ceci :\n"
-"'git <commande> [<révision>...] -- [<chemin>...]'"
-
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
-#, c-format
-msgid "failed to read %s"
-msgstr "échec de la lecture de %s"
+msgid "failed to stat '%s'"
+msgstr "échec du stat de '%s'"
 
-#: setup.c:468
+#: grep.c:1824
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Version attendue du dépôt git <= %d, %d trouvée"
-
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "extensions de dépôt inconnues trouvées :"
+msgid "'%s': short read"
+msgstr "'%s' : lecture tronquée"
 
-#: setup.c:762
+#: help.c:218
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "Ni ceci ni aucun de ses répertoires parents n'est un dépôt git : %s"
+msgid "available git commands in '%s'"
+msgstr "commandes git disponibles dans '%s'"
 
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "Impossible de revenir au répertoire de travail courant"
+#: help.c:225
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
 
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "Impossible d'accéder au répertoire de travail courant"
+#: help.c:256
+msgid "These are common Git commands used in various situations:"
+msgstr "Ci-dessous les commandes Git habituelles dans diverses situations :"
 
-#: setup.c:920
+#: help.c:321
 #, c-format
 msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
-"Ni ceci ni aucun de ses répertoires parents (jusqu'au point de montage %s) "
-"n'est un dépôt git\n"
-"Arrêt à la limite du système de fichiers (GIT_DISCOVERY_ACROSS_FILESYSTEM "
-"n'est pas activé)."
+"'%s' semble être une commande git, mais elle n'a pas pu\n"
+"être exécutée. Peut-être git-%s est-elle cassée ?"
 
-#: setup.c:927
-#, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "Impossible de se déplacer vers le répertoire '%s/..'"
+#: help.c:376
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Ahem. Votre système n'indique aucune commande Git."
 
-#: setup.c:989
+#: help.c:398
 #, c-format
 msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
-"Problème avec la valeur de core.sharedRepository (0%.3o).\n"
-"Le propriétaire des fichiers doit toujours avoir les droits en lecture et "
-"écriture."
+"ATTENTION : vous avez invoqué une commande Git nommée '%s' qui n'existe "
+"pas.\n"
+"Continuons en supposant que vous avez voulu dire '%s'"
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "offset avant la fin du fichier paquet (.idx cassé ?)"
+#: help.c:403
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "dans %0.1f secondes automatiquement..."
 
-#: sha1_file.c:2434
+#: help.c:410
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "offset avant le début de l'index de paquet pour %s (index corrompu ?)"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git : '%s' n'est pas une commande git. Voir 'git --help'."
+
+#: help.c:414 help.c:480
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Vouliez-vous dire cela ?"
+msgstr[1] ""
+"\n"
+"Vouliez-vous dire un de ceux-là ?"
 
-#: sha1_file.c:2438
+#: help.c:476
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-"offset au delà de la fin de l'index de paquet pour %s (index tronqué ?)"
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: sha1_name.c:462
+#: ident.c:343
 msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
 "\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
 "\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
 msgstr ""
-"Git ne créé normalement jamais de référence qui se termine par 40 caractères "
-"hexa\n"
-"car elle serait ignorée si vous spécifiiez 40-hexa. Ces références\n"
-"peuvent être créées par erreur. Par exemple,\n"
 "\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
+"*** Veuillez me dire qui vous êtes.\n"
+"\n"
+"Lancez\n"
+"\n"
+"  git config --global user.email \"Vous@exemple.com\"\n"
+"  git config --global user.name \"Votre Nom\"\n"
+"\n"
+"pour régler l'identité par défaut de votre compte.\n"
+"Éliminez --global pour ne faire les réglages que dans ce dépôt.\n"
 "\n"
-"où \"$br\" est d'une manière ou d'une autre vide et une référence 40-hexa "
-"est créée.\n"
-"Veuillez examiner ces références et peut-être les supprimer. Désactivez ce "
-"message\n"
-"en lançant \"git config advice.objectNameWarning false\""
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"Modification impossible de .gitmodules non fusionné, résolvez les conflits "
-"d'abord"
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "aucun courriel fourni et l'auto-détection est désactivée"
 
-#: submodule.c:68 submodule.c:102
+#: ident.c:372
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Impossible de trouver une section où path=%s dans .gitmodules"
+msgid "unable to auto-detect email address (got '%s')"
+msgstr "impossible de détecter automatiquement l'adresse ('%s' trouvé)"
 
-#: submodule.c:76
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Impossible de mettre à jour l'élément %s de .gitmodules"
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "aucun nom fourni et l'auto-détection est désactivée"
 
-# ici %s est un chemin
-#: submodule.c:109
+#: ident.c:388
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Impossible de supprimer l'élément de .gitmodules pour %s"
+msgid "unable to auto-detect name (got '%s')"
+msgstr "impossible de détecter automatiquement le nom ('%s' trouvé)"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "échec de la mise en index du .gitmodules mis à jour"
+#: ident.c:396
+#, c-format
+msgid "empty ident name (for <%s>) not allowed"
+msgstr "nom d'identifiant vide (pour <%s>) non permis"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "les valeurs négatives ne sont pas permises pour submodule.fetchJobs"
+#: ident.c:402
+#, c-format
+msgid "name consists only of disallowed characters: %s"
+msgstr "le nom n'est constitué que de caractères interdits : %s"
 
-#: submodule-config.c:358
+#: ident.c:417 builtin/commit.c:611
 #, c-format
-msgid "invalid value for %s"
-msgstr "Valeur invalide pour %s"
+msgid "invalid date format: %s"
+msgstr "format de date invalide : %s"
 
-#: trailer.c:237
+#: lockfile.c:152
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "échec de la commande trailer '%s'"
+msgid ""
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
+msgstr ""
+"Impossible de créer '%s.lock' : %s.\n"
+"\n"
+"Il semble qu'un autre processus git est déjà lancé dans ce dépôt,\n"
+"par exemple un éditeur ouvert par 'git commit'. Veuillez vous assurer\n"
+"que tous les processus sont terminés et réessayez. Si l'echec persiste,\n"
+"un processus git peut avoir planté :\n"
+"supprimez le fichier manuellement pour poursuivre."
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: lockfile.c:160
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "valeur inconnue '%s' pour la clé '%s'"
+msgid "Unable to create '%s.lock': %s"
+msgstr "Impossible de créer '%s.lock' : %s"
+
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "impossible de lire le cache"
+
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
+msgid "unable to write new index file"
+msgstr "impossible d'écrire le nouveau fichier d'index"
+
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(mauvais commit)\n"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
-msgid "more than one %s"
-msgstr "plus d'un %s"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "échec de addinfo_cache pour le chemin '%s'"
+
+#: merge-recursive.c:303
+msgid "error building trees"
+msgstr "erreur de construction des arbres"
 
-#: trailer.c:582
+#: merge-recursive.c:727
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "symbole vide dans la ligne de fin '%.*s'"
+msgid "failed to create path '%s'%s"
+msgstr "impossible de créer le chemin '%s' %s"
 
-#: trailer.c:702
+#: merge-recursive.c:738
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "impossible de lire le fichier d'entrée '%s'"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Suppression de %s pour faire de la place pour le sous-répertoire\n"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "Impossible de lire depuis l'entrée standard"
+#: merge-recursive.c:752 merge-recursive.c:771
+msgid ": perhaps a D/F conflict?"
+msgstr ": peut-être un conflit D/F ?"
 
-#: trailer.c:857 builtin/am.c:42
+#: merge-recursive.c:761
 #, c-format
-msgid "could not stat %s"
-msgstr "stat impossible de %s"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "refus de perdre le fichier non suivi '%s'"
 
-#: trailer.c:859
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "%s n'est pas un fichier régulier"
+msgid "cannot read object %s '%s'"
+msgstr "impossible de lire l'objet %s '%s'"
 
-#: trailer.c:861
+#: merge-recursive.c:805
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "le fichier %s n'est pas inscriptible par l'utilisateur"
+msgid "blob expected for %s '%s'"
+msgstr "blob attendu pour %s '%s'"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "impossible de créer un fichier temporaire"
+#: merge-recursive.c:829
+#, c-format
+msgid "failed to open '%s': %s"
+msgstr "échec à l'ouverture de '%s' : %s"
 
-#: trailer.c:912
+#: merge-recursive.c:840
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "impossible de renommer un fichier temporaire en %s"
+msgid "failed to symlink '%s': %s"
+msgstr "échec à la création du lien symbolique '%s' : %s"
 
-#: transport.c:62
+#: merge-recursive.c:845
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Positionnerait la branche amont de '%s' sur '%s' de '%s'\n"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "ne sait pas traiter %06o %s '%s'"
 
-#: transport.c:151
+#: merge-recursive.c:985
+msgid "Failed to execute internal merge"
+msgstr "Échec à l'exécution de la fusion interne"
+
+#: merge-recursive.c:989
 #, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport : option de profondeur invalide '%s'"
+msgid "Unable to add %s to database"
+msgstr "Impossible d'ajouter %s à la base de données"
 
-#: transport.c:771
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
-"Les chemins suivant de sous-module contiennent des modifications\n"
-"qui ne peuvent être trouvées sur aucun distant :\n"
+"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
+"%s laissée dans l'arbre."
 
-#: transport.c:775
+#: merge-recursive.c:1097
 #, c-format
 msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
 msgstr ""
-"\n"
-"Veuillez essayer\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"ou bien changez de répertoire et utilisez\n"
-"\n"
-"\tgit push\n"
-"\n"
-"pour les pousser vers un serveur distant.\n"
-"\n"
-
-#: transport.c:783
-msgid "Aborting."
-msgstr "Abandon."
-
-#: transport-helper.c:1041
-#, c-format
-msgid "Could not read ref %s"
-msgstr "impossible de lire la réf %s"
+"CONFLIT (%s/suppression) : %s supprimé dans %s et %s à %s dans %s. Version "
+"%s de %s laissée dans l'arbre."
 
-#: unpack-trees.c:64
+#: merge-recursive.c:1104
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
 msgstr ""
-"Vos modifications locales aux fichiers suivants seraient écrasées par "
-"l'extraction :\n"
-"%%sVeuillez valider ou remiser vos modifications avant de basculer de "
-"branche."
+"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
+"%s laissée dans l'arbre dans le fichier %s."
 
-#: unpack-trees.c:66
+#: merge-recursive.c:1109
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
 msgstr ""
-"Vos modifications locales aux fichiers suivants seraient écrasées par "
-"l'extraction :\n"
-"%%s"
+"CONFLIT (%s/suppression) : %s supprimé dans %s et %s à %s dans %s. Version "
+"%s de %s laissée dans l'arbre dans le fichier %s."
 
-#: unpack-trees.c:69
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-"Vos modifications locales aux fichiers suivants seraient écrasées par la "
-"fusion :\n"
-"%%sVeuillez valider ou remiser vos modifications avant la fusion."
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "renommage"
 
-#: unpack-trees.c:71
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Vos modifications locales aux fichiers suivants seraient écrasées par la "
-"fusion :\n"
-"%%s"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "renommé"
 
-#: unpack-trees.c:74
+#: merge-recursive.c:1200
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"Vos modifications locales aux fichiers suivants seraient écrasées par %s :\n"
-"%%sVeuillez valider ou remiser vos modifications avant %s."
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s est un répertoire dans %s ajouté plutôt comme %s"
 
-#: unpack-trees.c:76
+#: merge-recursive.c:1225
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
-"Vos modifications locales aux fichiers suivants seraient écrasées par %s :\n"
-"%%s"
+"CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
+"\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
 
-#: unpack-trees.c:81
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (laissé non résolu)"
+
+#: merge-recursive.c:1292
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
-"La mise à jour des répertoires suivants effacerait les fichiers non suivis "
-"contenus :\n"
-"%s"
+"CONFLIT (renommage/renommage) : renommage '%s'->'%s' dans %s. Renommage '%s'-"
+">'%s' dans %s"
 
-#: unpack-trees.c:85
+#: merge-recursive.c:1325
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
-"l'extraction :\n"
-"%%sVeuillez renommer ou effacer ces fichiers avant de basculer de branche."
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "Renommage de %s en %s et de %s en %s à la place"
 
-#: unpack-trees.c:87
+#: merge-recursive.c:1528
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
-"Les fichiers suivants non suivis seraient effacés par l'extraction :\n"
-"%%s"
+"CONFLIT (renommage/ajout) : Renommage de %s->%s dans %s. %s ajouté dans %s"
 
-#: unpack-trees.c:90
+#: merge-recursive.c:1543
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
-"la fusion :\n"
-"%%sVeuillez renommer ou effacer ces fichiers avant la fusion."
+msgid "Adding merged %s"
+msgstr "Ajout de %s fusionné"
 
-#: unpack-trees.c:92
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Les fichiers suivants non suivis seraient effacés par la fusion :\n"
-"%%s"
+msgid "Adding as %s instead"
+msgstr "Ajout plutôt comme %s"
 
-#: unpack-trees.c:95
+#: merge-recursive.c:1607
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
-"%s :\n"
-"%%sVeuillez renommer ou effacer ces fichiers avant %s."
+msgid "cannot read object %s"
+msgstr "impossible de lire l'objet %s"
 
-#: unpack-trees.c:97
+#: merge-recursive.c:1610
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"Les fichiers suivants non suivis seraient effacés par %s :\n"
-"%%s"
+msgid "object %s is not a blob"
+msgstr "l'objet %s n'est pas un blob"
+
+#: merge-recursive.c:1679
+msgid "modify"
+msgstr "modification"
+
+#: merge-recursive.c:1679
+msgid "modified"
+msgstr "modifié"
+
+#: merge-recursive.c:1689
+msgid "content"
+msgstr "contenu"
+
+#: merge-recursive.c:1696
+msgid "add/add"
+msgstr "ajout/ajout"
 
-#: unpack-trees.c:102
+#: merge-recursive.c:1732
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Les fichiers suivants non suivis de la copie de travail seraient écrasés par "
-"l'extraction :\n"
-"%%sVeuillez renommer ou effacer ces fichiers avant de basculer de branche."
+msgid "Skipped %s (merged same as existing)"
+msgstr "%s sauté (fusion identique à l'existant)"
 
-#: unpack-trees.c:104
+#: merge-recursive.c:1746
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Les fichiers suivants non suivis seraient écrasés par l'extraction :\n"
-"%%s"
+msgid "Auto-merging %s"
+msgstr "Fusion automatique de %s"
+
+#: merge-recursive.c:1750 git-submodule.sh:944
+msgid "submodule"
+msgstr "sous-module"
 
-#: unpack-trees.c:107
+#: merge-recursive.c:1751
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
-"la fusion :\n"
-"%%sVeuillez renommer ou effacer ces fichiers avant la fusion."
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
 
-#: unpack-trees.c:109
+#: merge-recursive.c:1845
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Les fichiers suivants non suivis seraient écrasés par la fusion :\n"
-"%%s"
+msgid "Removing %s"
+msgstr "Suppression de %s"
+
+#: merge-recursive.c:1871
+msgid "file/directory"
+msgstr "fichier/répertoire"
+
+#: merge-recursive.c:1877
+msgid "directory/file"
+msgstr "répertoire/fichier"
 
-#: unpack-trees.c:112
+#: merge-recursive.c:1883
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
-"Les fichiers suivants non suivis de la copie de travail seraient écrasés par "
-"%s :\n"
-"%%sVeuillez renommer ou effacer ces fichiers avant %s."
+"CONFLIT (%s) : Il y a un répertoire nommé %s dans %s. Ajout de %s comme %s"
 
-#: unpack-trees.c:114
+#: merge-recursive.c:1892
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Les fichiers suivants non suivis seraient écrasés par %s :\n"
-"%%s"
+msgid "Adding %s"
+msgstr "Ajout de %s"
 
-#: unpack-trees.c:121
+#: merge-recursive.c:1929
+msgid "Already up-to-date!"
+msgstr "Déjà à jour !"
+
+#: merge-recursive.c:1938
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "L'entrée '%s' surcharge avec '%s'. Affectation impossible."
+msgid "merging of trees %s and %s failed"
+msgstr "échec de fusion des arbres %s et %s"
+
+#: merge-recursive.c:2021
+msgid "Merging:"
+msgstr "Fusion :"
 
-#: unpack-trees.c:124
+#: merge-recursive.c:2034
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"Mise à jour d'extraction creuse impossible : les entrées suivantes ne sont "
-"pas à jour :\n"
-"%s"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "%u ancêtre commun trouvé :"
+msgstr[1] "%u ancêtres communs trouvés :"
+
+#: merge-recursive.c:2073
+msgid "merge returned no commit"
+msgstr "la fusion n'a pas retourné de commit"
 
-#: unpack-trees.c:126
+#: merge-recursive.c:2136
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Les fichiers suivants de la copie de travail seraient écrasés par la mise à "
-"jour par extraction creuse :\n"
-"%s"
+msgid "Could not parse object '%s'"
+msgstr "Impossible d'analyser l'objet '%s'"
 
-#: unpack-trees.c:128
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
+msgid "Unable to write index."
+msgstr "Impossible d'écrire l'index."
+
+#: notes-merge.c:273
 #, c-format
 msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
 msgstr ""
-"Les fichiers suivants de la copie de travail seraient supprimés par la mise "
-"à jour par extraction creuse :\n"
-"%s"
+"Vous n'avez pas terminé votre précédente fusion de notes (%s existe).\n"
+"Veuillez utiliser 'git notes merge --commit' ou 'git notes merge --abort' "
+"pour valider/abandonner la fusion en cours avant d'en démarrer une nouvelle."
 
-#: unpack-trees.c:205
+#: notes-merge.c:280
 #, c-format
-msgid "Aborting\n"
-msgstr "Abandon\n"
-
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Extraction des fichiers"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Vous n'avez pas terminé votre fusion de notes (%s existe)."
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "nom de schéma d'URL invalide ou suffixe '://' manquant"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "Impossible de valider un arbre de notes non initialisé/référencé"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: notes-utils.c:100
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "séquence d'échappement %XX invalide"
-
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "hôte manquant et le schéma n'est pas 'file:'"
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Mauvaise valeur de notes.rewriteMode : '%s'"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "une URL 'file:' ne peut pas contenir de numéro de port"
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "Refus de réécrire des notes dans %s (hors de refs/notes/)"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "caractères invalides dans le nom d'hôte"
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
+#, c-format
+msgid "Bad %s value: '%s'"
+msgstr "Mauvaise valeur de %s : '%s'"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "numéro de port invalide"
+#: object.c:240
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "impossible d'analyser l'objet : %s"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "segment de chemin '..' invalide"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: worktree.c:282
+#: parse-options.c:590
 #, c-format
-msgid "failed to read '%s'"
-msgstr "échec de la lecture de '%s'"
+msgid "usage: %s"
+msgstr "usage : %s"
 
-#: wrapper.c:222 wrapper.c:392
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "impossible d'ouvrir '%s' en lecture/écriture"
+msgid "   or: %s"
+msgstr "   ou : %s"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: parse-options.c:597
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "impossible d'ouvrir '%s' en écriture"
+msgid "    %s"
+msgstr "    %s"
+
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: parse-options-cb.c:108
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "impossible d'ouvrir '%s' en lecture"
+msgid "malformed object name '%s'"
+msgstr "nom d'objet malformé '%s'"
 
-#: wrapper.c:605 wrapper.c:626
+#: path.c:810
 #, c-format
-msgid "unable to access '%s'"
-msgstr "impossible d'accéder à '%s'"
+msgid "Could not make %s writable by group"
+msgstr "Impossible de rendre %s inscriptible pour le groupe"
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "impossible d'accéder au répertoire de travail courant"
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
+msgstr ""
+"Le caractère d'échappement '\\\\' interdit comme dernier caractère dans une "
+"valeur d'attribut"
 
-#: wrapper.c:658
-#, c-format
-msgid "could not write to %s"
-msgstr "Impossible d'écrire dans %s"
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
+msgstr "Une seule spécification 'attr:' est autorisée."
+
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "un spécificateur d'attribut ne peut pas être vide"
 
-#: wrapper.c:660
+#: pathspec.c:189
 #, c-format
-msgid "could not close %s"
-msgstr "impossible de fermer %s"
+msgid "invalid attribute name %s"
+msgstr "nom d'attribut invalide %s"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Chemins non fusionnés :"
+#: pathspec.c:254
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr ""
+"les réglages de spécificateurs de chemin généraux 'glob' et 'noglob' sont "
+"incompatibles"
+
+#: pathspec.c:261
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+"le réglage global de spécificateur de chemin 'literal' est incompatible avec "
+"tous les autres réglages globaux de spécificateur de chemin"
+
+#: pathspec.c:301
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "paramètre invalide pour le spécificateur magique de chemin 'prefix'"
 
-#: wt-status.c:177 wt-status.c:204
+#: pathspec.c:322
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (utilisez \"git reset %s <fichier>...\" pour désindexer)"
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "La spécification magique de chemin '%.*s' est invalide dans '%s'"
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (utilisez \"git rm --cached <fichier>...\" pour désindexer)"
+#: pathspec.c:327
+#, c-format
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "')' manquante à la fin du spécificateur magique de chemin dans '%s'"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (utilisez \"git add <fichier>...\" pour marquer comme résolu)"
+#: pathspec.c:365
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Spécificateur magique '%c' non implémenté dans '%s'"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (utilisez \"git add/rm <fichier>...\" si nécessaire pour marquer comme "
-"résolu)"
+#: pathspec.c:421 pathspec.c:443
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Le chemin '%s' est dans le sous-module '%.*s'"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (utilisez \"git rm <fichier>...\" pour marquer comme résolu)"
+#: pathspec.c:483
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s : 'literal' et 'glob' sont incompatibles"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "Modifications qui seront validées :"
+#: pathspec.c:496
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s : '%s' est hors du dépôt"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Modifications qui ne seront pas validées :"
+#: pathspec.c:584
+#, c-format
+msgid "'%s' (mnemonic: '%c')"
+msgstr "'%s' (mnémonique : '%c')"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
+#: pathspec.c:594
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
-"  (utilisez \"git add <fichier>...\" pour mettre à jour ce qui sera validé)"
+"%s : le spécificateur magique de chemin n'est pas supporté par cette "
+"commande : %s"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
-"  (utilisez \"git add/rm <fichier>...\" pour mettre à jour ce qui sera "
-"validé)"
+"les chaines de caractères vides comme spécificateurs de chemin seront "
+"invalides dans les prochaines versions. Veuillez utiliser . à la place pour "
+"correspondre à tous le chemins"
 
-#: wt-status.c:223
+#: pathspec.c:668
+#, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "le chemin '%s' est au-delà d'un lien symbolique"
+
+#: pretty.c:982
+msgid "unable to parse --pretty format"
+msgstr "impossible d'analyser le format --pretty"
+
+#: read-cache.c:1442
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"  (utilisez \"git checkout -- <fichier>...\" pour annuler les modifications "
-"dans la copie de travail)"
+"version d'index renseignée, mais la valeur est invalide.\n"
+"Utilisation de la version %i"
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: read-cache.c:1452
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"  (valider ou annuler le contenu non suivi ou modifié dans les sous-modules)"
+"GIT_INDEX_VERSION est renseigné, mais la valeur est invalide.\n"
+"Utilisation de la version %i"
 
-#: wt-status.c:237
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-"  (utilisez \"git %s <fichier>...\" pour inclure dans ce qui sera validé)"
+msgid "could not stat '%s'"
+msgstr "stat impossible de '%s'"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "supprimé des deux côtés :"
+#: read-cache.c:2388
+#, c-format
+msgid "unable to open git dir: %s"
+msgstr "impossible d'ouvrir le répertoire git : %s"
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "ajouté par nous :"
+#: read-cache.c:2400
+#, c-format
+msgid "unable to unlink: %s"
+msgstr "échec lors de l'unlink : %s"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "supprimé par eux :"
+#: refs.c:620 builtin/merge.c:844
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "Impossible d'ouvrir '%s' en écriture"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "ajouté par eux :"
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
+msgstr "mises à jour des références interdites en environnement de quarantaine"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "supprimé par nous :"
+#: refs/files-backend.c:1631
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "Impossible de supprimer la référence %s : %s"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "ajouté de deux côtés :"
+#: refs/files-backend.c:1634
+#, c-format
+msgid "could not delete references: %s"
+msgstr "impossible de supprimer les références : %s"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "modifié des deux côtés :"
+#: refs/files-backend.c:1643
+#, c-format
+msgid "could not remove reference %s"
+msgstr "impossible de supprimer la référence %s"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "nouveau fichier :"
+# à priori on parle d'une branche ici
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "disparue"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "copié :"
+#: ref-filter.c:36
+#, c-format
+msgid "ahead %d"
+msgstr "en avance de %d"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "supprimé :"
+#: ref-filter.c:37
+#, c-format
+msgid "behind %d"
+msgstr "en retard de %d"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "modifié :"
+#: ref-filter.c:38
+#, c-format
+msgid "ahead %d, behind %d"
+msgstr "en avance de %d, en retard de %d"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "renommé :"
+#: ref-filter.c:104
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "format attendu : %%(color:<couleur>)"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "modif. type :"
+#: ref-filter.c:106
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "couleur non reconnue : %%(color:%s)"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "inconnu :"
+#: ref-filter.c:120
+#, c-format
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "Valeur entière attendue refname:lstrip=%s"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "non fusionné :"
+#: ref-filter.c:124
+#, c-format
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "Valeur entière attendue refname:rstrip=%s"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "nouveaux commits, "
+#: ref-filter.c:126
+#, c-format
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "argument %%(%s) non reconnu : %s"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "contenu modifié, "
+#: ref-filter.c:166
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) n'accepte pas d'argument"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "contenu non suivi, "
+#: ref-filter.c:173
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) n'accepte pas d'argument"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Sous-modules modifiés mais non mis à jour :"
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) n'accepte pas d'argument"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Changements du sous-module à valider :"
+#: ref-filter.c:199
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "valeur positive attendue contents:lines=%s"
 
-#: wt-status.c:839
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr ""
-"Ne touchez pas à la ligne ci-dessus\n"
-"Tout ce qui suit sera éliminé."
-
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Vous avez des chemins non fusionnés."
+#: ref-filter.c:201
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "argument %%(contents) non reconnu : %s"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (réglez les conflits puis lancez \"git commit\")"
+#: ref-filter.c:214
+#, c-format
+msgid "positive value expected objectname:short=%s"
+msgstr "valeur positive attendue objectname:short=%s"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (utilisez \"git merge --abort\" pour annuler la fusion)"
+#: ref-filter.c:218
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "argument %%(objectname) non reconnu : %s"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Tous les conflits sont réglés mais la fusion n'est pas terminée."
+#: ref-filter.c:245
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "format attendu : %%(align:<largeur>,<position>)"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (utilisez \"git commit\" pour terminer la fusion)"
+#: ref-filter.c:257
+#, c-format
+msgid "unrecognized position:%s"
+msgstr "position non reconnue : %s"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Vous êtes au milieu d'une session am."
+#: ref-filter.c:261
+#, c-format
+msgid "unrecognized width:%s"
+msgstr "largeur non reconnue : %s"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "Le patch actuel est vide."
+#: ref-filter.c:267
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "argument %%(align) non reconnu : %s"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git am --continue\")"
+#: ref-filter.c:271
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "valeur positive attendue avec l'atome %%(align)"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (utilisez \"git am --skip\" pour sauter ce patch)"
+#: ref-filter.c:286
+#, c-format
+msgid "unrecognized %%(if) argument: %s"
+msgstr "argument %%(if) non reconnu : %s"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
+#: ref-filter.c:371
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "nom de champ malformé %.*s"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "Aucune commande réalisée."
+#: ref-filter.c:397
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "nom de champ inconnu : %.*s"
 
-#: wt-status.c:1112
+#: ref-filter.c:501
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Dernière commande effectuée (%d commande effectuée) :"
-msgstr[1] "Dernières commandes effectuées (%d commandes effectuées) :"
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "format : atome %%(if) utilisé sans un atome %%(then)"
 
-#: wt-status.c:1123
+#: ref-filter.c:561
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (voir plus dans le fichier %s)"
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "format : atome %%(then) utilisé sans un atome %%(if)"
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "Aucune commande restante."
+#: ref-filter.c:563
+#, c-format
+msgid "format: %%(then) atom used more than once"
+msgstr "format : atome %%(then) utilisé plus d'une fois"
 
-#: wt-status.c:1131
+#: ref-filter.c:565
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Prochaine commande à effectuer (%d commande restante) :"
-msgstr[1] "Prochaines commandes à effectuer (%d commandes restantes) :"
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "format: atome %%(then) utilisé après %%(else)"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (utilisez \"git rebase --edit-todo\" pour voir et éditer)"
+#: ref-filter.c:591
+#, c-format
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "format : atome %%(else) utilisé sans un atome %%(if)"
 
-#: wt-status.c:1152
+#: ref-filter.c:593
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Vous êtes en train de rebaser la branche '%s' sur '%s'."
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "format : atome %%(else) utilisé sans un atome %%(then)"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Vous êtes en train de rebaser."
+#: ref-filter.c:595
+#, c-format
+msgid "format: %%(else) atom used more than once"
+msgstr "format : atome %%(else) utilisé plus d'une fois"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git rebase --continue\")"
+#: ref-filter.c:608
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "format : atome %%(end) utilisé sans atome correspondant"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (utilisez \"git rebase --skip\" pour sauter ce patch)"
+#: ref-filter.c:663
+#, c-format
+msgid "malformed format string %s"
+msgstr "Chaîne de formatage mal formée %s"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (utilisez \"git rebase --abort\" pour extraire la branche d'origine)"
+#: ref-filter.c:1247
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(aucune branche, rebasage de %s)"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (tous les conflits sont réglés : lancez \"git rebase --continue\")"
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(aucune branche, bisect a démarré sur %s)"
 
-#: wt-status.c:1185
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Vous êtes actuellement en train de fractionner un commit pendant un rebasage "
-"de la branche '%s' sur '%s'."
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD détachée sur %s)"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-"Vous êtes actuellement en train de fractionner un commit pendant un rebasage."
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD détachée depuis %s)"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-"  (Une fois la copie de travail nettoyée, lancez \"git rebase --continue\")"
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(aucune branche)"
 
-#: wt-status.c:1197
+#: ref-filter.c:1420 ref-filter.c:1451
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Vous êtes actuellement en train d'éditer un commit pendant un rebasage de la "
-"branche '%s' sur '%s'."
+msgid "missing object %s for %s"
+msgstr "objet manquant %s pour %s"
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr ""
-"Vous êtes actuellement en train d'éditer un commit pendant un rebasage."
+#: ref-filter.c:1423 ref-filter.c:1454
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "echec de parse_object_buffer sur %s pour %s"
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (utilisez \"git commit --amend\" pour corriger le commit actuel)"
+#: ref-filter.c:1692
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "objet malformé à '%s'"
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-"  (utilisez \"git rebase --continue\" quand vous êtes satisfait de vos "
-"modifications)"
+#: ref-filter.c:1759
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "réf avec un nom cassé %s ignoré"
 
-#: wt-status.c:1217
+#: ref-filter.c:1764
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Vous êtes actuellement en train de picorer le commit %s."
+msgid "ignoring broken ref %s"
+msgstr "réf cassé %s ignoré"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git cherry-pick --continue\")"
+#: ref-filter.c:2028
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: atome %%(end) manquant"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")"
+#: ref-filter.c:2109
+#, c-format
+msgid "malformed object name %s"
+msgstr "nom d'objet malformé %s"
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (utilisez \"git cherry-pick --abort\" pour annuler le picorage)"
+#: remote.c:754
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Impossible de récupérer à la fois %s et %s pour %s"
 
-#: wt-status.c:1236
+#: remote.c:758
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Vous êtes actuellement en train de rétablir le commit %s."
+msgid "%s usually tracks %s, not %s"
+msgstr "%s suit habituellement %s, pas %s"
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git revert --continue\")"
+#: remote.c:762
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s suit à la fois %s et %s"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (tous les conflits sont réglés : lancez \"git revert --continue\")"
+#: remote.c:770
+msgid "Internal error"
+msgstr "Erreur interne"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (utilisez \"git revert --abort\" pour annuler le rétablissement)"
+#: remote.c:1685 remote.c:1787
+msgid "HEAD does not point to a branch"
+msgstr "HEAD ne pointe pas sur une branche"
 
-#: wt-status.c:1257
+#: remote.c:1694
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Vous êtes en cours de bissection, depuis la branche '%s'."
-
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Vous êtes en cours de bissection."
-
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (utilisez \"git bisect reset\" pour revenir à la branche d'origine)"
+msgid "no such branch: '%s'"
+msgstr "pas de branche '%s'"
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "Sur la branche "
+#: remote.c:1697
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "aucune branche amont configurée pour la branche '%s'"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "rebasage interactif en cours ; sur "
+#: remote.c:1703
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "la branche amont '%s' n'est pas stockée comme branche de suivi"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "rebasage en cours ; sur "
+#: remote.c:1718
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr ""
+"la destination de poussée '%s' sur le serveur distant '%s' n'a pas de "
+"branche locale de suivi"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD détachée sur "
+#: remote.c:1730
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "la branche '%s' n'a aucune branche distante de poussée"
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD détachée depuis "
+#: remote.c:1741
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "les références de spec pour '%s' n'incluent pas '%s'"
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Actuellement sur aucun branche."
+#: remote.c:1754
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "la poussée n'a pas de destination (push.default vaut 'nothing')"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Validation initiale"
+#: remote.c:1776
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr ""
+"impossible de résoudre une poussée 'simple' pour une destination unique"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Fichiers non suivis"
+#: remote.c:2081
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "Votre branche est basée sur '%s', mais la branche amont a disparu.\n"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Fichiers ignorés"
+#: remote.c:2085
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (utilisez \"git branch --unset-upstream\" pour corriger)\n"
 
-#: wt-status.c:1520
+#: remote.c:2088
 #, c-format
-msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr ""
-"L'énumération des fichiers non suivis a duré %.2f secondes. 'status -uno'\n"
-"peut l'accélérer, mais vous devez alors faire attention à ne pas\n"
-"oublier d'ajouter les nouveaux fichiers par vous-même (voir 'git help "
-"status')."
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Votre branche est à jour avec '%s'.\n"
 
-#: wt-status.c:1526
+#: remote.c:2092
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Fichiers non suivis non affichés%s"
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Votre branche est en avance sur '%s' de %d commit.\n"
+msgstr[1] "Votre branche est en avance sur '%s' de %d commits.\n"
 
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (utilisez -u pour afficher les fichiers non suivis)"
+#: remote.c:2098
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
 
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Aucune modification"
+#: remote.c:2101
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"Votre branche est en retard sur '%s' de %d commit, et peut être mise à jour "
+"en avance rapide.\n"
+msgstr[1] ""
+"Votre branche est en retard sur '%s' de %d commits, et peut être mise à jour "
+"en avance rapide.\n"
+
+#: remote.c:2109
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
 
-#: wt-status.c:1539
+#: remote.c:2112
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"Votre branche et '%s' ont divergé,\n"
+"et ont %d et %d commit différent chacune respectivement.\n"
+msgstr[1] ""
+"Votre branche et '%s' ont divergé,\n"
+"et ont %d et %d commits différents chacune respectivement.\n"
+
+#: remote.c:2122
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
-"aucune modification n'a été ajoutée à la validation (utilisez \"git add\" ou "
-"\"git commit -a\")\n"
+"  (utilisez \"git pull\" pour fusionner la branche distante dans la vôtre)\n"
+
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "votre branche actuelle semble cassée"
 
-#: wt-status.c:1542
+#: revision.c:2161
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "aucune modification ajoutée à la validation\n"
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "votre branche actuelle '%s' ne contient encore aucun commit"
+
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent est incompatible avec --bisect"
+
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "échec de l'ouverture de /dev/null"
+
+#: run-command.c:127
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "échec de dup2(%d,%d)"
+
+#: send-pack.c:150
+#, c-format
+msgid "unable to parse remote unpack status: %s"
+msgstr "impossible d'analyser le status de dépaquetage remote : %s"
 
-#: wt-status.c:1545
+#: send-pack.c:152
 #, c-format
+msgid "remote unpack failed: %s"
+msgstr "le dépaquetage a échoué : %s"
+
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
+msgstr "impossible de signer le certificat de poussée"
+
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
+msgstr "Le receveur ne gère pas les poussées avec --signed"
+
+#: send-pack.c:430
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"aucune modification ajoutée à la validation mais des fichiers non suivis "
-"sont présents (utilisez \"git add\" pour les suivre)\n"
+"pas d'envoi de certificat de poussée car le receveur ne gère pas les "
+"poussées avec --signed"
+
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
+msgstr "Le receveur ne gère pas les poussées avec --atomic"
 
-#: wt-status.c:1548
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
+msgstr "Le receveur ne gère pas les options de poussées"
+
+#: sequencer.c:215
+msgid "revert"
+msgstr "revert"
+
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "cherry-pick"
+
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
+
+#: sequencer.c:221
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
+msgid "Unknown action: %d"
+msgstr "Action inconnue : %d"
+
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
-"aucune modification ajoutée à la validation mais des fichiers non suivis "
-"sont présents\n"
+"après résolution des conflits, marquez les chemins corrigés\n"
+"avec 'git add <chemins>' ou 'git rm <chemins>'"
 
-#: wt-status.c:1551
-#, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
 msgstr ""
-"rien à valider (créez/copiez des fichiers et utilisez \"git add\" pour les "
-"suivre)\n"
+"après résolution des conflits, marquez les chemins corrigés\n"
+"avec 'git add <chemins>' ou 'git rm <chemins>'\n"
+"puis validez le résultat avec 'git commit'"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: sequencer.c:294 sequencer.c:1682
 #, c-format
-msgid "nothing to commit\n"
-msgstr "rien à valider\n"
+msgid "could not lock '%s'"
+msgstr "impossible de verrouiller '%s'"
 
-#: wt-status.c:1557
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr "rien à valider (utilisez -u pour afficher les fichiers non suivis)\n"
+msgid "could not write to '%s'"
+msgstr "impossible d'écrire dans '%s'"
 
-#: wt-status.c:1561
+#: sequencer.c:301
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "rien à valider, la copie de travail est propre\n"
+msgid "could not write eol to '%s'"
+msgstr "impossible d'écrire la fin de ligne dans '%s'"
 
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Validation initiale sur "
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "échec lors de la finalisation de '%s'."
 
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (aucune branche)"
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
+#, c-format
+msgid "could not read '%s'"
+msgstr "impossible de lire '%s'"
 
-# à priori on parle d'une branche ici
-#: wt-status.c:1701
-msgid "gone"
-msgstr "disparue"
+#: sequencer.c:355
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "vos modifications locales seraient écrasées par %s."
 
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "derrière "
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "validez vos modifications ou les remiser pour continuer."
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "devant "
+#: sequencer.c:388
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s : avance rapide"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "échec lors de l'unlink de '%s'"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Impossible d'écrire le nouveau fichier index"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<options>] [--] <chemin>..."
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "impossible de résoudre le commit HEAD\n"
+
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "impossible de mettre à jour l'arbre de cache\n"
 
-#: builtin/add.c:65
+#: sequencer.c:592
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "status de diff inattendu %c"
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
+msgstr ""
+"Vous avez des modifications indexées dans votre copie de travail.\n"
+"Si elles devaient être ajoutées dans le commit précédent, lancez :\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"Si elles devaient aller dans un nouveau commit, lancez :\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"Dans les deux cas, une fois fini, continuez avec :\n"
+"\n"
+"  git rebase --continue\n"
 
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "échec de la mise à jour des fichiers"
+#: sequencer.c:694
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "impossible d'analyser le commit %s\n"
 
-#: builtin/add.c:81
+#: sequencer.c:699
 #, c-format
-msgid "remove '%s'\n"
-msgstr "suppression de '%s'\n"
+msgid "could not parse parent commit %s\n"
+msgstr "impossible d'analyser le commit parent %s\n"
 
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Modifications non indexées après rafraîchissement de l'index :"
+#: sequencer.c:821
+#, c-format
+msgid ""
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
+msgstr ""
+"première ligne de message de compression inattendue :\n"
+"\n"
+"\t%.*s"
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Impossible de lire l'index"
+#: sequencer.c:827
+#, c-format
+msgid ""
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
+msgstr ""
+"première ligne de message de compression invalide :\n"
+"\n"
+"\t%.*s"
 
-#: builtin/add.c:207
+#: sequencer.c:833 sequencer.c:858
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Impossible d'ouvrir '%s' en écriture."
+msgid "This is a combination of %d commits."
+msgstr "Ceci est la combinaison de %d commits."
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "Impossible d'écrire le patch"
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "une HEAD est nécessaire à la correction"
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "échec de l'édition du patch"
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "Impossible de lire HEAD"
+
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
+msgstr "impossible de lire le message de validation de HEAD"
 
-#: builtin/add.c:217
+#: sequencer.c:852
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Stat de '%s' impossible"
+msgid "cannot write '%s'"
+msgstr "impossible d'écrire '%s'"
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "Patch vide. Abandon."
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "Ceci est le premier message de validation :"
 
-#: builtin/add.c:224
+#: sequencer.c:869
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Impossible d'appliquer '%s'"
+msgid "could not read commit message of %s"
+msgstr "impossible de lire le message de validation de %s"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
+#: sequencer.c:876
+#, c-format
+msgid "This is the commit message #%d:"
+msgstr "Ceci est le message de validation numéro %d :"
+
+#: sequencer.c:881
+#, c-format
+msgid "The commit message #%d will be skipped:"
+msgstr "Le message de validation %d sera ignoré :"
+
+#: sequencer.c:886
+#, c-format
+msgid "unknown command: %d"
+msgstr "commande inconnue : %d"
+
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "votre fichier d'index n'est pas fusionné."
+
+#: sequencer.c:970
+#, c-format
+msgid "commit %s is a merge but no -m option was given."
+msgstr "le commit %s est une fusion mais l'option -m n'a pas été spécifiée."
+
+#: sequencer.c:978
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "le commit %s n'a pas de parent %d"
+
+#: sequencer.c:982
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
 msgstr ""
-"Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n"
+"une branche principale a été spécifiée mais le commit %s n'est pas une "
+"fusion."
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "simuler l'action"
+#: sequencer.c:988
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "impossible d'obtenir un message de validation pour %s"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "mode verbeux"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s : impossible d'analyser le commit parent %s"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "sélection interactive"
+#: sequencer.c:1071 sequencer.c:1827
+#, c-format
+msgid "could not rename '%s' to '%s'"
+msgstr "impossible de renommer '%s' en '%s'"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "sélection interactive des sections"
+#: sequencer.c:1122
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "impossible d'annuler %s... %s"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "édition du diff actuel et application"
+#: sequencer.c:1123
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "impossible d'appliquer %s... %s"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "permettre l'ajout de fichiers ignorés"
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "l'ensemble de commits spécifié est vide"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "mettre à jour les fichiers suivis"
+#: sequencer.c:1175
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s : échec à la lecture de l'index"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "enregistrer seulement le fait que le chemin sera ajouté plus tard"
+#: sequencer.c:1182
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s : échec du rafraîchissement de l'index"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr "ajouter les modifications de tous les fichiers suivis et non suivis"
+#: sequencer.c:1303
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "ligne %d invalide : %.*s"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-"ignorer les chemins effacés dans la copie de travail (identique à --no-all)"
+#: sequencer.c:1311
+#, c-format
+msgid "cannot '%s' without a previous commit"
+msgstr "'%s' impossible avec le commit précédent"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "ne pas ajouter, juste rafraîchir l'index"
+#: sequencer.c:1344
+#, c-format
+msgid "could not read '%s'."
+msgstr "impossible de lire '%s'."
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "veuillez corriger ceci en utilisant 'git rebase --edit-todo'."
+
+#: sequencer.c:1358
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "feuille d'instruction inutilisable : '%s'"
+
+#: sequencer.c:1363
+msgid "no commits parsed."
+msgstr "aucun commit analysé."
+
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
+msgstr "impossible de picorer pendant l'annulation d'un commit."
+
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
+msgstr "impossible d'annuler un commit pendant un picorage."
+
+#: sequencer.c:1439
+#, c-format
+msgid "invalid key: %s"
+msgstr "clé invalide : %s"
+
+#: sequencer.c:1442
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "valeur invalide pour %s : %s"
+
+#: sequencer.c:1499
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "feuille d'options malformée : %s"
+
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
+msgstr "un picorage ou un retour est déjà en cours"
+
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\""
+
+#: sequencer.c:1541
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "impossible de créer le répertoire de séquenceur '%s'"
+
+#: sequencer.c:1555
+msgid "could not lock HEAD"
+msgstr "impossible de verrouiller HEAD"
+
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
+msgstr "aucun picorage ou retour en cours"
+
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
+msgstr "impossible de résoudre HEAD"
+
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
+msgstr "impossible d'abandonner depuis une branche non encore créée"
+
+#: sequencer.c:1635 builtin/grep.c:910
+#, c-format
+msgid "cannot open '%s'"
+msgstr "impossible d'ouvrir '%s'"
+
+#: sequencer.c:1637
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "impossible de lire '%s' : %s"
+
+#: sequencer.c:1638
+msgid "unexpected end of file"
+msgstr "fin de fichier inattendue"
+
+#: sequencer.c:1644
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu"
+
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr ""
+"Vous semblez avoir déplacé la HEAD. Pas de rembobinage, vérifiez votre HEAD !"
+
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
+msgstr "impossible de lire HEAD"
+
+#: sequencer.c:1832 builtin/difftool.c:616
+#, c-format
+msgid "could not copy '%s' to '%s'"
+msgstr "impossible de copier '%s' vers '%s'"
+
+#: sequencer.c:1848
+msgid "could not read index"
+msgstr "impossible de lire l'index"
+
+#: sequencer.c:1853
+#, c-format
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"échec d'exécution : %s\n"
+"%sVous pouvez corriger le problème, puis lancer\n"
+"\n"
+"git rebase --continue\n"
+"\n"
+
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "et a mis à jour l'index ou l'arbre de travail\n"
+
+#: sequencer.c:1865
+#, c-format
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"L'exécution a réussi : %s\n"
+"mais a laissé des modifications dans l'index ou la copie de travail\n"
+"Validez ou remisez vos modification, puis lancez\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+
+#: sequencer.c:1920 git-rebase.sh:169
+#, c-format
+msgid "Applied autostash."
+msgstr "Autoremisage appliqué."
+
+#: sequencer.c:1932
+#, c-format
+msgid "cannot store %s"
+msgstr "impossible de stocker %s"
+
+#: sequencer.c:1934 git-rebase.sh:173
+#, c-format
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"L'application de l'autoremisage a provoqué des conflits\n"
+"Vos  modifications sont à l'abri dans la remise.\n"
+"Vous pouvez lancer \"git stash pop\" ou \"git stash drop\" à tout moment.\n"
+
+#: sequencer.c:2016
+#, c-format
+msgid "Stopped at %s...  %.*s\n"
+msgstr "arrêt à %s... %.*s\n"
+
+#: sequencer.c:2058
+#, c-format
+msgid "unknown command %d"
+msgstr "commande inconnue %d"
+
+#: sequencer.c:2088
+msgid "could not read orig-head"
+msgstr "impossible de lire orig-head"
+
+#: sequencer.c:2092
+msgid "could not read 'onto'"
+msgstr "impossible de lire 'onto'"
+
+#: sequencer.c:2099
+#, c-format
+msgid "could not update %s"
+msgstr "impossible de mettre à jour %s"
+
+#: sequencer.c:2106
+#, c-format
+msgid "could not update HEAD to %s"
+msgstr "impossible de mettre à jour HEAD sur %s"
+
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
+msgstr "impossible de rebaser : vous avez des modifications non indexées."
+
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "impossible de supprimer CHERRY_PICK_HEAD"
+
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
+msgstr "impossible de corriger un commit non-existant"
+
+#: sequencer.c:2206
+#, c-format
+msgid "invalid file: '%s'"
+msgstr "fichier invalide : '%s'"
+
+#: sequencer.c:2208
+#, c-format
+msgid "invalid contents: '%s'"
+msgstr "contenu invalide : '%s'"
+
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
+msgstr ""
+"\n"
+"Vous avez des modifications non validées dans votre copie de travail.\n"
+"Veuillez les valider d'abord, puis relancer 'git rebase --continue'."
+
+#: sequencer.c:2221
+msgid "could not commit staged changes."
+msgstr "impossible de valider les modifications indexées."
+
+#: sequencer.c:2301
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s : impossible de picorer un %s"
+
+#: sequencer.c:2305
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s : mauvaise révision"
+
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
+msgstr "impossible d'annuler en tant que commit initial"
+
+#: setup.c:165
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s : ce chemin n'existe pas dans la copie de travail.\n"
+"Utilisez 'git <commande> -- <chemin>...' pour spécifier des chemins qui "
+"n'existent pas localement."
+
+#: setup.c:178
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"argument '%s' ambigu : révision inconnue ou chemin inexistant.\n"
+"Utilisez '--' pour séparer les chemins des révisions, comme ceci :\n"
+"'git <commande> [<révision>...] -- [<chemin>...]'"
+
+#: setup.c:228
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"argument '%s' ambigu : révision et chemin spécifiés.\n"
+"Utilisez '--' pour séparer les chemins des révisions, comme ceci :\n"
+"'git <commande> [<révision>...] -- [<chemin>...]'"
+
+#: setup.c:475
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Version attendue du dépôt git <= %d, %d trouvée"
+
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "extensions de dépôt inconnues trouvées :"
+
+#: setup.c:776
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Ni ceci ni aucun de ses répertoires parents n'est un dépôt git : %s"
+
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "Impossible de revenir au répertoire de travail courant"
+
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "Impossible d'accéder au répertoire de travail courant"
+
+#: setup.c:1022 setup.c:1028
+#, c-format
+msgid "Cannot change to '%s'"
+msgstr "Impossible de modifié en '%s'"
+
+#: setup.c:1041
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Ni ceci ni aucun de ses répertoires parents (jusqu'au point de montage %s) "
+"n'est un dépôt git\n"
+"Arrêt à la limite du système de fichiers (GIT_DISCOVERY_ACROSS_FILESYSTEM "
+"n'est pas activé)."
+
+#: setup.c:1106
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Problème avec la valeur de core.sharedRepository (0%.3o).\n"
+"Le propriétaire des fichiers doit toujours avoir les droits en lecture et "
+"écriture."
+
+#: sha1_file.c:559
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "le chemin '%s' n'existe pas"
+
+#: sha1_file.c:585
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"extraire le dépôt de référence '%s' comme une extraction liée n'est pas "
+"encore supporté."
+
+#: sha1_file.c:591
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "le dépôt de référence '%s' n'est pas un dépôt local."
+
+#: sha1_file.c:597
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "le dépôt de référence '%s' est superficiel"
+
+#: sha1_file.c:605
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "le dépôt de référence '%s' est greffé"
+
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "offset avant la fin du fichier paquet (.idx cassé ?)"
+
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "offset avant le début de l'index de paquet pour %s (index corrompu ?)"
+
+#: sha1_file.c:2725
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr ""
+"offset au delà de la fin de l'index de paquet pour %s (index tronqué ?)"
+
+#: sha1_name.c:409
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "le SHA1 court %s est ambigu"
+
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "Les candidats sont :"
+
+#: sha1_name.c:580
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"Git ne créé normalement jamais de référence qui se termine par 40 caractères "
+"hexa\n"
+"car elle serait ignorée si vous spécifiiez 40-hexa. Ces références\n"
+"peuvent être créées par erreur. Par exemple,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"où \"$br\" est d'une manière ou d'une autre vide et une référence 40-hexa "
+"est créée.\n"
+"Veuillez examiner ces références et peut-être les supprimer. Désactivez ce "
+"message\n"
+"en lançant \"git config advice.objectNameWarning false\""
+
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"Modification impossible de .gitmodules non fusionné, résolvez les conflits "
+"d'abord"
+
+#: submodule.c:71 submodule.c:105
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Impossible de trouver une section où path=%s dans .gitmodules"
+
+#: submodule.c:79
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Impossible de mettre à jour l'élément %s de .gitmodules"
+
+# ici %s est un chemin
+#: submodule.c:112
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Impossible de supprimer l'élément de .gitmodules pour %s"
+
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "échec de la mise en index du .gitmodules mis à jour"
+
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "les valeurs négatives ne sont pas permises pour submodule.fetchJobs"
+
+#: submodule.c:1194
+#, c-format
+msgid "'%s' not recognized as a git repository"
+msgstr "'%s' n'est pas reconnu comme dépôt git"
+
+#: submodule.c:1332
+#, c-format
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "impossible de démarrer 'git status' dans le sous-module '%s'"
+
+#: submodule.c:1345
+#, c-format
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "impossible de lancer 'git status' dans le sous-module '%s'"
+
+#: submodule.c:1421
+#, c-format
+msgid "submodule '%s' has dirty index"
+msgstr "le sous-module '%s' a un index sale"
+
+#: submodule.c:1678
+#, c-format
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr ""
+"relocate_gitdir pour le sous-module '%s' avec plus d'un arbre de travail "
+"n'est pas supporté"
+
+#: submodule.c:1690 submodule.c:1746
+#, c-format
+msgid "could not lookup name for submodule '%s'"
+msgstr "impossible de trouve le nom pour le sous-module '%s'"
+
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "impossible de créer le répertoire '%s'"
+
+#: submodule.c:1697
+#, c-format
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
+msgstr ""
+"Migration du répertoire git de '%s%s' depuis\n"
+"'%s' sur\n"
+"'%s'\n"
+
+#: submodule.c:1781
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "récursion impossible dans le sous-module '%s'"
+
+#: submodule.c:1825
+msgid "could not start ls-files in .."
+msgstr "impossible de démarrer ls-files dans .."
+
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "BUG : le chemin renvoyé ne correspond pas à cwd ?"
+
+#: submodule.c:1864
+#, c-format
+msgid "ls-tree returned unexpected return code %d"
+msgstr "ls-tree a renvoyé un code de retour inattendu %d"
+
+#: submodule-config.c:380
+#, c-format
+msgid "invalid value for %s"
+msgstr "Valeur invalide pour %s"
+
+#: trailer.c:240
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "échec de la commande trailer '%s'"
+
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "valeur inconnue '%s' pour la clé '%s'"
+
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "plus d'un %s"
+
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "symbole vide dans la ligne de fin '%.*s'"
+
+#: trailer.c:722
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "impossible de lire le fichier d'entrée '%s'"
+
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "Impossible de lire depuis l'entrée standard"
+
+#: trailer.c:949 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "stat impossible de %s"
+
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "%s n'est pas un fichier régulier"
+
+#: trailer.c:953
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "le fichier %s n'est pas inscriptible par l'utilisateur"
+
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "impossible de créer un fichier temporaire"
+
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "impossible de renommer un fichier temporaire en %s"
+
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Positionnerait la branche amont de '%s' sur '%s' de '%s'\n"
+
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport : option de profondeur invalide '%s'"
+
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Les chemins suivant de sous-module contiennent des modifications\n"
+"qui ne peuvent être trouvées sur aucun distant :\n"
+
+#: transport.c:893
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Veuillez essayer\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"ou bien changez de répertoire et utilisez\n"
+"\n"
+"\tgit push\n"
+"\n"
+"pour les pousser vers un serveur distant.\n"
+"\n"
+
+#: transport.c:901
+msgid "Aborting."
+msgstr "Abandon."
+
+#: transport-helper.c:1080
+#, c-format
+msgid "Could not read ref %s"
+msgstr "impossible de lire la réf %s"
+
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "objet arbre trop court"
+
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "mode invalide dans l'entrée d'arbre"
+
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "nom de fichier vide dans une entrée de l'arbre"
+
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "fichier arbre trop court"
+
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr ""
+"Vos modifications locales aux fichiers suivants seraient écrasées par "
+"l'extraction :\n"
+"%%sVeuillez valider ou remiser vos modifications avant de basculer de "
+"branche."
+
+#: unpack-trees.c:106
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"Vos modifications locales aux fichiers suivants seraient écrasées par "
+"l'extraction :\n"
+"%%s"
+
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"Vos modifications locales aux fichiers suivants seraient écrasées par la "
+"fusion :\n"
+"%%sVeuillez valider ou remiser vos modifications avant la fusion."
+
+#: unpack-trees.c:111
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Vos modifications locales aux fichiers suivants seraient écrasées par la "
+"fusion :\n"
+"%%s"
+
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"Vos modifications locales aux fichiers suivants seraient écrasées par %s :\n"
+"%%sVeuillez valider ou remiser vos modifications avant %s."
+
+#: unpack-trees.c:116
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Vos modifications locales aux fichiers suivants seraient écrasées par %s :\n"
+"%%s"
+
+#: unpack-trees.c:121
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
+msgstr ""
+"La mise à jour des répertoires suivants effacerait les fichiers non suivis "
+"contenus :\n"
+"%s"
+
+#: unpack-trees.c:125
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
+"l'extraction :\n"
+"%%sVeuillez renommer ou effacer ces fichiers avant de basculer de branche."
+
+#: unpack-trees.c:127
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Les fichiers suivants non suivis seraient effacés par l'extraction :\n"
+"%%s"
+
+#: unpack-trees.c:130
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
+"la fusion :\n"
+"%%sVeuillez renommer ou effacer ces fichiers avant la fusion."
+
+#: unpack-trees.c:132
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Les fichiers suivants non suivis seraient effacés par la fusion :\n"
+"%%s"
+
+#: unpack-trees.c:135
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
+"%s :\n"
+"%%sVeuillez renommer ou effacer ces fichiers avant %s."
+
+#: unpack-trees.c:137
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"Les fichiers suivants non suivis seraient effacés par %s :\n"
+"%%s"
+
+#: unpack-trees.c:142
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Les fichiers suivants non suivis de la copie de travail seraient écrasés par "
+"l'extraction :\n"
+"%%sVeuillez renommer ou effacer ces fichiers avant de basculer de branche."
+
+#: unpack-trees.c:144
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Les fichiers suivants non suivis seraient écrasés par l'extraction :\n"
+"%%s"
+
+#: unpack-trees.c:147
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Les fichiers suivants non suivis de la copie de travail seraient effacés par "
+"la fusion :\n"
+"%%sVeuillez renommer ou effacer ces fichiers avant la fusion."
+
+#: unpack-trees.c:149
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Les fichiers suivants non suivis seraient écrasés par la fusion :\n"
+"%%s"
+
+#: unpack-trees.c:152
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Les fichiers suivants non suivis de la copie de travail seraient écrasés par "
+"%s :\n"
+"%%sVeuillez renommer ou effacer ces fichiers avant %s."
+
+#: unpack-trees.c:154
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Les fichiers suivants non suivis seraient écrasés par %s :\n"
+"%%s"
+
+#: unpack-trees.c:161
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "L'entrée '%s' surcharge avec '%s'. Affectation impossible."
+
+#: unpack-trees.c:164
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"Mise à jour d'extraction creuse impossible : les entrées suivantes ne sont "
+"pas à jour :\n"
+"%s"
+
+#: unpack-trees.c:166
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Les fichiers suivants de la copie de travail seraient écrasés par la mise à "
+"jour par l'extraction creuse :\n"
+"%s"
+
+#: unpack-trees.c:168
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Les fichiers suivants de la copie de travail seraient supprimés par la mise "
+"à jour par extraction creuse :\n"
+"%s"
+
+#: unpack-trees.c:170
+#, c-format
+msgid ""
+"Cannot update submodule:\n"
+"%s"
 msgstr ""
-"sauter seulement les fichiers qui ne peuvent pas être ajoutés du fait "
-"d'erreurs"
+"Mise à jour impossible pour le sous-module :\n"
+"%s"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "vérifier si des fichiers - même manquants - sont ignorés, à vide"
+#: unpack-trees.c:247
+#, c-format
+msgid "Aborting\n"
+msgstr "Abandon\n"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: unpack-trees.c:272
+#, c-format
+msgid "submodule update strategy not supported for submodule '%s'"
+msgstr ""
+"stratégie de mise à jour de sous-module non supportée pour le sous-module "
+"'%s'"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "outrepasser le bit exécutable pour les fichiers listés"
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "Extraction des fichiers"
+
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "nom de schéma d'URL invalide ou suffixe '://' manquant"
 
-#: builtin/add.c:292
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Utilisez -f si vous voulez réellement les ajouter.\n"
+msgid "invalid %XX escape sequence"
+msgstr "séquence d'échappement %XX invalide"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "échec de l'ajout de fichiers"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "hôte manquant et le schéma n'est pas 'file:'"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A et -u sont mutuellement incompatibles"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "une URL 'file:' ne peut pas contenir de numéro de port"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr ""
-"L'option --ignore-missing ne peut être utilisée qu'en complément de --dry-run"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "caractères invalides dans le nom d'hôte"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "Le paramètre '%s' de --chmod doit être soit -x soit +x"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "numéro de port invalide"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Rien de spécifié, rien n'a été ajouté.\n"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "segment de chemin '..' invalide"
 
-#: builtin/add.c:368
+#: worktree.c:285
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
-
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "fichier d'index corrompu"
+msgid "failed to read '%s'"
+msgstr "échec de la lecture de '%s'"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "Impossible d'écrire le nouveau fichier d'index"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "impossible d'ouvrir '%s' en lecture/écriture"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
 #, c-format
-msgid "could not read '%s'"
-msgstr "impossible de lire '%s'"
+msgid "could not open '%s' for writing"
+msgstr "impossible d'ouvrir '%s' en écriture"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "impossible d'analyser le script author"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "impossible d'ouvrir '%s' en lecture"
 
-#: builtin/am.c:503
+#: wrapper.c:581 wrapper.c:602
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' a été effacé par le crochet applypatch-msg"
+msgid "unable to access '%s'"
+msgstr "impossible d'accéder à '%s'"
+
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "impossible d'accéder au répertoire de travail courant"
 
-#: builtin/am.c:544 builtin/notes.c:301
+#: wrapper.c:634
 #, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Ligne en entrée malformée : '%s'."
+msgid "could not write to %s"
+msgstr "Impossible d'écrire dans %s"
 
-#: builtin/am.c:581 builtin/notes.c:316
+#: wrapper.c:636
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Impossible de copier les notes de '%s' vers '%s'"
+msgid "could not close %s"
+msgstr "impossible de fermer %s"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "échec de fseek"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Chemins non fusionnés :"
 
-#: builtin/am.c:787
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "could not parse patch '%s'"
-msgstr "impossible d'analyser le patch '%s'"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (utilisez \"git reset %s <fichier>...\" pour désindexer)"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Seulement une série de patchs StGIT peut être appliquée à la fois"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (utilisez \"git rm --cached <fichier>...\" pour désindexer)"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "horodatage invalide"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (utilisez \"git add <fichier>...\" pour marquer comme résolu)"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "ligne de Date invalide"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (utilisez \"git add/rm <fichier>...\" si nécessaire pour marquer comme "
+"résolu)"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "décalage horaire invalide"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (utilisez \"git rm <fichier>...\" pour marquer comme résolu)"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Échec de détection du format du patch."
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "Modifications qui seront validées :"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "échec de la création du répertoire '%s'"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "Modifications qui ne seront pas validées :"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Échec de découpage des patchs."
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr ""
+"  (utilisez \"git add <fichier>...\" pour mettre à jour ce qui sera validé)"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "impossible d'écrire le fichier d'index"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr ""
+"  (utilisez \"git add/rm <fichier>...\" pour mettre à jour ce qui sera "
+"validé)"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Quand vous avez résolu ce problème, lancez \"%s --continue\"."
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (utilisez \"git checkout -- <fichier>...\" pour annuler les modifications "
+"dans la copie de travail)"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "Si vous préférez plutôt sauter ce patch, lancez \"%s --skip\"."
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (valider ou annuler le contenu non suivi ou modifié dans les sous-modules)"
 
-#: builtin/am.c:1190
+#: wt-status.c:238
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
-"Pour restaurer la branche originale et arrêter de patcher, lancez \"%s --"
-"abort\"."
+"  (utilisez \"git %s <fichier>...\" pour inclure dans ce qui sera validé)"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Le patch est vide. Le découpage était-il bon ?"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "supprimé des deux côtés :"
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "ligne d'identification invalide : %s"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "ajouté par nous :"
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "impossible d'analyser le commit %s"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "supprimé par eux :"
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"Le dépôt n'a pas les blobs nécessaires pour un retour à une fusion à 3 "
-"points."
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "ajouté par eux :"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-"Utilisation de l'information de l'index pour reconstruire un arbre de base..."
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "supprimé par nous :"
 
-#: builtin/am.c:1623
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-"Avez-vous édité le patch à la main ?\n"
-"Il ne s'applique pas aux blobs enregistrés dans son index."
+#: wt-status.c:263
+msgid "both added:"
+msgstr "ajouté de deux côtés :"
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Retour à un patch de la base et fusion à 3 points..."
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "modifié des deux côtés :"
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "Échec d'intégration des modifications."
+#: wt-status.c:275
+msgid "new file:"
+msgstr "nouveau fichier :"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree a échoué à écrire un arbre"
+#: wt-status.c:277
+msgid "copied:"
+msgstr "copié :"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "application à un historique vide"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "supprimé :"
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "échec de l'écriture de l'objet commit"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "modifié :"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "impossible de continuer : %s n'existe pas."
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "renommé :"
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"impossible d'être interactif sans entrée standard connectée à un terminal."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "modif. type :"
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "Le corps de la validation est :"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "inconnu :"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Appliquer ? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all : "
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "non fusionné :"
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Index sale : impossible d'appliquer des patchs (sales : %s)"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "nouveaux commits, "
+
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "contenu modifié, "
+
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "contenu non suivi, "
+
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "Sous-modules modifiés mais non mis à jour :"
+
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "Changements du sous-module à valider :"
+
+#: wt-status.c:914
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"Ne touchez pas à la ligne ci-dessus\n"
+"Tout ce qui suit sera éliminé."
+
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "Vous avez des chemins non fusionnés."
+
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (réglez les conflits puis lancez \"git commit\")"
 
-#: builtin/am.c:1853 builtin/am.c:1925
-#, c-format
-msgid "Applying: %.*s"
-msgstr "Application de  %.*s"
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (utilisez \"git merge --abort\" pour annuler la fusion)"
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Pas de changement -- Patch déjà appliqué."
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "Tous les conflits sont réglés mais la fusion n'est pas terminée."
 
-#: builtin/am.c:1877
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "le patch a échoué à %s %.*s"
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (utilisez \"git commit\" pour terminer la fusion)"
 
-#: builtin/am.c:1883
-#, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "La copie du patch qui a échoué se trouve dans : %s"
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "Vous êtes au milieu d'une session am."
 
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Aucun changement - avez-vous oublié d'utiliser 'git add' ?\n"
-"S'il n'y a plus rien à indexer, il se peut qu'autre chose ait déjà\n"
-"introduit les mêmes changements ; vous pourriez avoir envie de sauter ce "
-"patch."
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "Le patch actuel est vide."
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr ""
-"Vous avez toujours des chemins non fusionnés dans votre index\n"
-"Auriez-vous oublié de faire 'git add' ?"
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git am --continue\")"
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr "Impossible d'analyser l'objet '%s'."
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (utilisez \"git am --skip\" pour sauter ce patch)"
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "échec du nettoyage de l'index"
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-"Vous semblez avoir déplacé la HEAD depuis le dernier échec de 'am'.\n"
-"Pas de retour à ORIG_HEAD"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "git-rebase-todo est manquant."
 
-#: builtin/am.c:2192
-#, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Valeur invalide pour --patch-format : %s"
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "Aucune commande réalisée."
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<options>] [(<mbox>|<Maildir>)...]"
+#: wt-status.c:1194
+#, c-format
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Dernière commande effectuée (%d commande effectuée) :"
+msgstr[1] "Dernières commandes effectuées (%d commandes effectuées) :"
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<options>] (--continue | --quit | --abort)"
+#: wt-status.c:1205
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (voir plus dans le fichier %s)"
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "exécution interactive"
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "Aucune commande restante."
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "option historique -- no-op"
+#: wt-status.c:1213
+#, c-format
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Prochaine commande à effectuer (%d commande restante) :"
+msgstr[1] "Prochaines commandes à effectuer (%d commandes restantes) :"
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "permettre de revenir à une fusion à 3 points si nécessaire"
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (utilisez \"git rebase --edit-todo\" pour voir et éditer)"
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "être silencieux"
+#: wt-status.c:1234
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Vous êtes en train de rebaser la branche '%s' sur '%s'."
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "ajouter une ligne Signed-off-by au message de validation"
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "Vous êtes en train de rebaser."
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "recoder en utf-8 (par défaut)"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git rebase --continue\")"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "passer l'option -k à git-mailinfo"
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (utilisez \"git rebase --skip\" pour sauter ce patch)"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "passer l'option -b à git-mailinfo"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (utilisez \"git rebase --abort\" pour extraire la branche d'origine)"
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "passer l'option -m à git-mailinfo"
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (tous les conflits sont réglés : lancez \"git rebase --continue\")"
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "passer l'option --keep-cr à git-mailsplit fpour le format mbox"
+#: wt-status.c:1267
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Vous êtes actuellement en train de fractionner un commit pendant un rebasage "
+"de la branche '%s' sur '%s'."
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
 msgstr ""
-"ne pas passer l'option --keep-cr à git-mailsplit indépendamment de am.keepcr"
+"Vous êtes actuellement en train de fractionner un commit pendant un rebasage."
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "retirer tout le contenu avant la ligne des ciseaux"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Une fois la copie de travail nettoyée, lancez \"git rebase --continue\")"
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "action"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Vous êtes actuellement en train d'éditer un commit pendant un rebasage de la "
+"branche '%s' sur '%s'."
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "le passer jusqu'à git-apply"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr ""
+"Vous êtes actuellement en train d'éditer un commit pendant un rebasage."
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "racine"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (utilisez \"git commit --amend\" pour corriger le commit actuel)"
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "chemin"
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (utilisez \"git rebase --continue\" quand vous avez effectué toutes vos "
+"modifications)"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Vous êtes actuellement en train de picorer le commit %s."
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "num"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "format"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "format de présentation des patchs"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (utilisez \"git cherry-pick --abort\" pour annuler le picorage)"
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "surcharger le message d'erreur lors d'un échec d'application de patch"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Vous êtes actuellement en train de rétablir le commit %s."
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "continuer à appliquer les patchs après résolution d'un conflit"
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git revert --continue\")"
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "synonymes de --continue"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (tous les conflits sont réglés : lancez \"git revert --continue\")"
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "sauter le patch courant"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (utilisez \"git revert --abort\" pour annuler le rétablissement)"
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr ""
-"restaurer la branche originale et abandonner les applications de patch."
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Vous êtes en cours de bissection, depuis la branche '%s'."
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "mentir sur la date de validation"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "Vous êtes en cours de bissection."
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "utiliser l'horodatage actuel pour la date d'auteur"
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (utilisez \"git bisect reset\" pour revenir à la branche d'origine)"
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "id-clé"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "Sur la branche "
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "signer les commits avec GPG"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "rebasage interactif en cours ; sur "
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(utilisation interne pour git-rebase)"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "rebasage en cours ; sur "
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
-msgstr ""
-"L'option -b/--binary ne fait plus rien depuis longtemps,\n"
-"et elle sera supprimée. Veuillez ne plus l'utiliser."
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "HEAD détachée sur "
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "échec à la lecture de l'index"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "HEAD détachée depuis "
 
-#: builtin/am.c:2348
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-"le répertoire précédent de rebasage %s existe toujours mais mbox donnée."
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "Actuellement sur aucun branche."
 
-#: builtin/am.c:2372
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-"Répertoire abandonné %s trouvé.\n"
-"Utilisez \"git am --abort\" pour le supprimer."
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "Validation initiale"
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr ""
-"Pas de résolution de l'opération en cours, nous ne sommes pas dans une "
-"reprise."
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "Fichiers non suivis"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<options>] [<patch>...]"
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "Fichiers ignorés"
 
-#: builtin/apply.c:153
+#: wt-status.c:1599
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "option d'espace non reconnue '%s'"
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+"L'énumération des fichiers non suivis a duré %.2f secondes. 'status -uno'\n"
+"peut l'accélérer, mais vous devez alors faire attention à ne pas\n"
+"oublier d'ajouter les nouveaux fichiers par vous-même (voir 'git help "
+"status')."
 
-#: builtin/apply.c:169
+#: wt-status.c:1605
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "option d'ignorance d'espace non reconnue '%s'"
+msgid "Untracked files not listed%s"
+msgstr "Fichiers non suivis non affichés%s"
 
-#: builtin/apply.c:854
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Impossible de préparer la regexp d'horodatage %s"
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr " (utilisez -u pour afficher les fichiers non suivis)"
 
-#: builtin/apply.c:863
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec a retourné %d pour l'entrée : %s"
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "Aucune modification"
 
-#: builtin/apply.c:947
+#: wt-status.c:1618
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "nom de fichier du patch introuvable à la ligne %d"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"aucune modification n'a été ajoutée à la validation (utilisez \"git add\" ou "
+"\"git commit -a\")\n"
 
-#: builtin/apply.c:984
+#: wt-status.c:1621
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-"git apply : mauvais format de git-diff - /dev/null attendu, %s trouvé à la "
-"ligne %d"
+msgid "no changes added to commit\n"
+msgstr "aucune modification ajoutée à la validation\n"
 
-#: builtin/apply.c:989
+#: wt-status.c:1624
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
-"git apply : mauvais format de git-diff - nouveau nom de fichier inconsistant "
-"à la ligne %d"
+"aucune modification ajoutée à la validation mais des fichiers non suivis "
+"sont présents (utilisez \"git add\" pour les suivre)\n"
 
-#: builtin/apply.c:990
+#: wt-status.c:1627
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgid "nothing added to commit but untracked files present\n"
 msgstr ""
-"git apply : mauvais format de git-diff - ancien nom de fichier inconsistant "
-"à la ligne %d"
+"aucune modification ajoutée à la validation mais des fichiers non suivis "
+"sont présents\n"
 
-#: builtin/apply.c:995
+#: wt-status.c:1630
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
-"git apply : mauvais format de git-diff - /dev/null attendu à la ligne %d"
+"rien à valider (créez/copiez des fichiers et utilisez \"git add\" pour les "
+"suivre)\n"
 
-#: builtin/apply.c:1489
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recomptage : ligne inattendue : %.*s"
+msgid "nothing to commit\n"
+msgstr "rien à valider\n"
 
-#: builtin/apply.c:1550
+#: wt-status.c:1636
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragment de patch sans en-tête à la ligne %d : %.*s"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "rien à valider (utilisez -u pour afficher les fichiers non suivis)\n"
 
-#: builtin/apply.c:1567
+#: wt-status.c:1640
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"information de nom de fichier manquante dans l'en-tête de git diff lors de "
-"la suppression de %d composant de préfixe de chemin (ligne %d)"
-msgstr[1] ""
-"information de nom de fichier manquante dans l'en-tête de git diff lors de "
-"la suppression de %d composants de préfixe de chemin (ligne %d)"
+msgid "nothing to commit, working tree clean\n"
+msgstr "rien à valider, la copie de travail est propre\n"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "le nouveau fichier dépend de contenus anciens"
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "Validation initiale sur "
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "le fichier supprimé a encore du contenu"
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD (aucune branche)"
 
-#: builtin/apply.c:1774
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "patch corrompu à la ligne %d"
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "derrière "
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "le nouveau fichier %s dépend de contenus anciens"
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "devant "
 
-#: builtin/apply.c:1812
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "le fichier supprimé %s a encore du contenu"
+msgid "cannot %s: You have unstaged changes."
+msgstr "Impossible de %s : vous avez des modifications non indexées."
 
-#: builtin/apply.c:1815
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
+msgstr "de plus, votre index contient des modifications non validées."
 
-#: builtin/apply.c:1962
+#: wt-status.c:2288
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "patch binaire corrompu à la ligne %d : %.*s"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "%s impossible : votre index contient des modifications non validées."
 
-#: builtin/apply.c:1999
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "patch binaire non reconnu à la ligne %d"
+msgid "failed to unlink '%s'"
+msgstr "échec lors de l'unlink de '%s'"
 
-#: builtin/apply.c:2154
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "patch totalement incompréhensible à la ligne %d"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<options>] [--] <chemin>..."
 
-#: builtin/apply.c:2244
+#: builtin/add.c:80
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "lecture du lien symbolique %s impossible"
+msgid "unexpected diff status %c"
+msgstr "status de diff inattendu %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "échec de la mise à jour des fichiers"
 
-#: builtin/apply.c:2248
+#: builtin/add.c:95
 #, c-format
-msgid "unable to open or read %s"
-msgstr "ouverture ou lecture de %s impossible"
+msgid "remove '%s'\n"
+msgstr "suppression de '%s'\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Modifications non indexées après rafraîchissement de l'index :"
+
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "Impossible de lire l'index"
 
-#: builtin/apply.c:2901
+#: builtin/add.c:220
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "début de ligne invalide : '%c'"
+msgid "Could not open '%s' for writing."
+msgstr "Impossible d'ouvrir '%s' en écriture."
 
-#: builtin/apply.c:3020
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Impossible d'écrire le patch"
+
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "échec de l'édition du patch"
+
+#: builtin/add.c:230
 #, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "La section n°%d a réussi à la ligne %d (offset %d ligne)."
-msgstr[1] "La section n°%d a réussi à la ligne %d (offset %d lignes)."
+msgid "Could not stat '%s'"
+msgstr "Stat de '%s' impossible"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Patch vide. Abandon."
 
-#: builtin/apply.c:3032
+#: builtin/add.c:237
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Contexte réduit à (%ld/%ld) pour appliquer le fragment à la ligne %d"
+msgid "Could not apply '%s'"
+msgstr "Impossible d'appliquer '%s'"
+
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr ""
+"Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n"
+
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "simuler l'action"
+
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "sélection interactive"
+
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "sélection interactive des sections"
+
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "édition du diff actuel et application"
+
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "permettre l'ajout de fichiers ignorés"
+
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "mettre à jour les fichiers suivis"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "enregistrer seulement le fait que le chemin sera ajouté plus tard"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "ajouter les modifications de tous les fichiers suivis et non suivis"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr ""
+"ignorer les chemins effacés dans la copie de travail (identique à --no-all)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "ne pas ajouter, juste rafraîchir l'index"
 
-#: builtin/apply.c:3038
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr ""
+"sauter seulement les fichiers qui ne peuvent pas être ajoutés du fait "
+"d'erreurs"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "vérifier si des fichiers - même manquants - sont ignorés, à vide"
+
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "outrepasser le bit exécutable pour les fichiers listés"
+
+#: builtin/add.c:305
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Utilisez -f si vous voulez réellement les ajouter.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "échec de l'ajout de fichiers"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A et -u sont mutuellement incompatibles"
+
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
-"pendant la recherche de :\n"
-"%.*s"
+"L'option --ignore-missing ne peut être utilisée qu'en complément de --dry-run"
 
-#: builtin/apply.c:3060
+#: builtin/add.c:359
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "données de patch binaire manquantes pour '%s'"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "Le paramètre '%s' de --chmod doit être soit -x soit +x"
 
-#: builtin/apply.c:3163
+#: builtin/add.c:374
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "le patch binaire ne s'applique par correctement à '%s'"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Rien de spécifié, rien n'a été ajouté.\n"
 
-#: builtin/apply.c:3169
+#: builtin/add.c:375
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"le patch binaire sur '%s' crée un résultat incorrect (%s attendu, mais %s "
-"trouvé)"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
+
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "fichier d'index corrompu"
+
+#: builtin/am.c:412
+msgid "could not parse author script"
+msgstr "impossible d'analyser le script author"
 
-#: builtin/apply.c:3190
+#: builtin/am.c:489
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "le patch a échoué : %s:%ld"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' a été effacé par le crochet applypatch-msg"
 
-#: builtin/apply.c:3314
+#: builtin/am.c:530
 #, c-format
-msgid "cannot checkout %s"
-msgstr "extraction de %s impossible"
+msgid "Malformed input line: '%s'."
+msgstr "Ligne en entrée malformée : '%s'."
+
+#: builtin/am.c:567
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Impossible de copier les notes de '%s' vers '%s'"
+
+#: builtin/am.c:593
+msgid "fseek failed"
+msgstr "échec de fseek"
 
-#: builtin/apply.c:3370
+#: builtin/am.c:777
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "lecture depuis '%s' au-delà d'un lien symbolique"
+msgid "could not parse patch '%s'"
+msgstr "impossible d'analyser le patch '%s'"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "le chemin %s a été renommé/supprimé"
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Seulement une série de patchs StGIT peut être appliquée à la fois"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "%s : n'existe pas dans l'index"
+#: builtin/am.c:889
+msgid "invalid timestamp"
+msgstr "horodatage invalide"
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
-#, c-format
-msgid "%s: %s"
-msgstr "%s : %s"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
+msgstr "ligne de Date invalide"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
-#, c-format
-msgid "%s: does not match index"
-msgstr "%s : ne correspond pas à l'index"
+#: builtin/am.c:897
+msgid "invalid timezone offset"
+msgstr "décalage horaire invalide"
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "le patch de suppression laisse un contenu dans le fichier"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
+msgstr "Échec de détection du format du patch."
 
-#: builtin/apply.c:3669
+#: builtin/am.c:991 builtin/clone.c:397
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s : type erroné"
+msgid "failed to create directory '%s'"
+msgstr "échec de la création du répertoire '%s'"
 
-#: builtin/apply.c:3671
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s est de type %o, mais %o attendu"
+#: builtin/am.c:995
+msgid "Failed to split patches."
+msgstr "Échec de découpage des patchs."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "impossible d'écrire le fichier d'index"
+
+#: builtin/am.c:1178
 #, c-format
-msgid "invalid path '%s'"
-msgstr "chemin invalide '%s'"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Quand vous avez résolu ce problème, lancez \"%s --continue\"."
 
-#: builtin/apply.c:3879
+#: builtin/am.c:1179
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s : existe déjà dans l'index"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Si vous préférez plutôt sauter ce patch, lancez \"%s --skip\"."
 
-#: builtin/apply.c:3882
+#: builtin/am.c:1180
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s : existe déjà dans la copie de travail"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"Pour restaurer la branche originale et arrêter de patcher, lancez \"%s --"
+"abort\"."
+
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Le patch est vide. Le découpage était-il bon ?"
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1386 builtin/log.c:1557
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o)"
+msgid "invalid ident line: %s"
+msgstr "ligne d'identification invalide : %s"
 
-#: builtin/apply.c:3907
+#: builtin/am.c:1413
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgid "unable to parse commit %s"
+msgstr "impossible d'analyser le commit %s"
+
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
-"le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o) de %s"
+"Le dépôt n'a pas les blobs nécessaires pour un retour à une fusion à 3 "
+"points."
 
-#: builtin/apply.c:3927
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "le fichier affecté '%s' est au-delà d'un lien symbolique"
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
+msgstr ""
+"Utilisation de l'information de l'index pour reconstruire un arbre de base..."
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s : le patch ne s'applique pas"
+#: builtin/am.c:1627
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Avez-vous édité le patch à la main ?\n"
+"Il ne s'applique pas aux blobs enregistrés dans son index."
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "Vérification du patch %s..."
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Retour à un patch de la base et fusion à 3 points..."
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "échec de make_cache_entry pour le chemin '%s'"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
+msgstr "Échec d'intégration des modifications."
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "suppression de %s dans l'index impossible"
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree a échoué à écrire un arbre"
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "patch corrompu pour le sous-module %s"
+#: builtin/am.c:1689
+msgid "applying to an empty history"
+msgstr "application à un historique vide"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "stat du fichier nouvellement créé '%s' impossible"
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "échec de l'écriture de l'objet commit"
 
-#: builtin/apply.c:4224
+#: builtin/am.c:1735 builtin/am.c:1739
 #, c-format
-msgid "unable to create backing store for newly created file %s"
+msgid "cannot resume: %s does not exist."
+msgstr "impossible de continuer : %s n'existe pas."
+
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
-"création du magasin de stockage pour le fichier nouvellement créé %s "
-"impossible"
+"impossible d'être interactif sans entrée standard connectée à un terminal."
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "ajout de l'élément de cache %s impossible"
+#: builtin/am.c:1760
+msgid "Commit Body is:"
+msgstr "Le corps de la validation est :"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "fermeture du fichier '%s'"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "Appliquer ? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all : "
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1820
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "écriture du fichier '%s' mode %o impossible"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Index sale : impossible d'appliquer des patchs (sales : %s)"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1860 builtin/am.c:1932
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Patch %s appliqué proprement."
+msgid "Applying: %.*s"
+msgstr "Application de  %.*s"
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "erreur interne"
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
+msgstr "Pas de changement -- Patch déjà appliqué."
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1884
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Application du patch %%s avec %d rejet..."
-msgstr[1] "Application du patch %%s avec %d rejets..."
+msgid "Patch failed at %s %.*s"
+msgstr "le patch a échoué à %s %.*s"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1890
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "troncature du nom de fichier .rej en %.*s.rej"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "La copie du patch qui a échoué se trouve dans : %s"
 
-#: builtin/apply.c:4432
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "impossible d'ouvrir %s : %s"
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Aucun changement - avez-vous oublié d'utiliser 'git add' ?\n"
+"S'il n'y a plus rien à indexer, il se peut qu'autre chose ait déjà\n"
+"introduit les mêmes changements ; vous pourriez avoir envie de sauter ce "
+"patch."
 
-#: builtin/apply.c:4445
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Section n°%d appliquée proprement."
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Vous avez toujours des chemins non fusionnés dans votre index\n"
+"Auriez-vous oublié de faire 'git add' ?"
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Section n°%d rejetée."
+msgid "Could not parse object '%s'."
+msgstr "Impossible d'analyser l'objet '%s'."
 
-#: builtin/apply.c:4537
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr "Chemin '%s' non traité."
+#: builtin/am.c:2102
+msgid "failed to clean index"
+msgstr "échec du nettoyage de l'index"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "entrée non reconnue"
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Vous semblez avoir déplacé la HEAD depuis le dernier échec de 'am'.\n"
+"Pas de retour à ORIG_HEAD"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "lecture du fichier d'index impossible"
+#: builtin/am.c:2199
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Valeur invalide pour --patch-format : %s"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way hors d'un dépôt"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<options>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index hors d'un dépôt"
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<options>] (--continue | --quit | --abort)"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached hors d'un dépôt"
+#: builtin/am.c:2239
+msgid "run interactively"
+msgstr "exécution interactive"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "ouverture impossible du patch '%s'"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
+msgstr "option historique -- no-op"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "%d erreur d'espace ignorée"
-msgstr[1] "%d erreurs d'espace ignorées"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
+msgstr "permettre de revenir à une fusion à 3 points si nécessaire"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d ligne a ajouté des erreurs d'espace."
-msgstr[1] "%d lignes ont ajouté des erreurs d'espace."
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "être silencieux"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "ne pas appliquer les modifications qui correspondent au chemin donné"
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
+msgstr "ajouter une ligne Signed-off-by au message de validation"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "appliquer les modifications qui correspondent au chemin donné"
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
+msgstr "recoder en utf-8 (par défaut)"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "supprimer <num> barres obliques des chemins traditionnels de diff"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
+msgstr "passer l'option -k à git-mailinfo"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "ignorer les additions réalisées par le patch"
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
+msgstr "passer l'option -b à git-mailinfo"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "au lieu d'appliquer le patch, afficher le diffstat de l'entrée"
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
+msgstr "passer l'option -m à git-mailinfo"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "passer l'option --keep-cr à git-mailsplit fpour le format mbox"
+
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
-"afficher le nombre de lignes ajoutées et supprimées en notation décimale"
+"ne pas passer l'option --keep-cr à git-mailsplit indépendamment de am.keepcr"
+
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
+msgstr "retirer tout le contenu avant la ligne des ciseaux"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "au lieu d'appliquer le patch, afficher un résumer de l'entrée"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
+msgstr "le passer jusqu'à git-apply"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "au lieu d'appliquer le patch, voir si le patch est applicable"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "s'assurer que le patch est applicable sur l'index actuel"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "format"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "appliquer les patch sans toucher à la copie de travail"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
+msgstr "format de présentation des patchs"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "accepter un patch qui touche hors de la copie de travail"
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
+msgstr "surcharger le message d'erreur lors d'un échec d'application de patch"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "appliquer aussi le patch (à utiliser avec ---stat/--summary/--check)"
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
+msgstr "continuer à appliquer les patchs après résolution d'un conflit"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "tenter une fusion à 3 points si le patch ne s'applique pas proprement"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
+msgstr "synonymes de --continue"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
+#: builtin/am.c:2303
+msgid "skip the current patch"
+msgstr "sauter le patch courant"
+
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
 msgstr ""
-"construire un index temporaire fondé sur l'information de l'index embarqué"
+"restaurer la branche originale et abandonner les applications de patch."
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "les chemins sont séparés par un caractère NUL"
+#: builtin/am.c:2310
+msgid "lie about committer date"
+msgstr "mentir sur la date de validation"
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "s'assurer d'au moins <n> lignes de correspondance de contexte"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
+msgstr "utiliser l'horodatage actuel pour la date d'auteur"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-"détecter des lignes nouvelles ou modifiées qui contiennent des erreurs "
-"d'espace"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "id-clé"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
+msgstr "signer les commits avec GPG"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "appliquer le patch en sens inverse"
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
+msgstr "(utilisation interne pour git-rebase)"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "ne pas s'attendre à au moins une ligne de contexte"
+#: builtin/am.c:2333
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"L'option -b/--binary ne fait plus rien depuis longtemps,\n"
+"et elle sera supprimée. Veuillez ne plus l'utiliser."
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "laisser les sections rejetées dans les fichiers *.rej correspondants"
+#: builtin/am.c:2340
+msgid "failed to read the index"
+msgstr "échec à la lecture de l'index"
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "accepter les recouvrements de sections"
+#: builtin/am.c:2355
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr ""
+"le répertoire précédent de rebasage %s existe toujours mais mbox donnée."
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
+#: builtin/am.c:2379
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
 msgstr ""
-"tolérer des erreurs de détection de retours chariot manquants en fin de "
-"fichier"
+"Répertoire abandonné %s trouvé.\n"
+"Utilisez \"git am --abort\" pour le supprimer."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "ne pas se fier au compte de lignes dans les en-têtes de section"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr ""
+"Pas de résolution de l'opération en cours, nous ne sommes pas dans une "
+"reprise."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "préfixer tous les noms de fichier avec <root>"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<options>] [<patch>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4166,11 +5253,6 @@ msgstr "git archive : ACK/NACK attendu, EOF reçu"
 msgid "git archive: NACK %s"
 msgstr "git archive : NACK %s"
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "erreur distante : %s"
-
 #: builtin/archive.c:64
 msgid "git archive: protocol error"
 msgstr "git archive : erreur de protocole"
@@ -4199,122 +5281,170 @@ msgstr "git blame [<options>] [<options-de-révision>] [<rev>] [--] <fichier>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<options-de-révision> sont documentés dans git-rev-list(1)"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1777
 msgid "Blaming lines"
 msgstr "Assignation de blâme au lignes"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2573
 msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 "Montrer les éléments de blâme au fur et à mesure de leur découverte, de "
 "manière incrémentale"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2574
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Montrer un SHA-1 blanc pour les commits de limite (Défaut : désactivé)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2575
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "Ne pas traiter les commits racine comme des limites (Défaut : désactivé)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2576
 msgid "Show work cost statistics"
 msgstr "Montrer les statistiques de coût d'activité"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2577
 msgid "Force progress reporting"
 msgstr "Forcer l'affichage de l'état d'avancement"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2578
 msgid "Show output score for blame entries"
 msgstr "Montrer le score de sortie pour les éléments de blâme"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2579
 msgid "Show original filename (Default: auto)"
 msgstr "Montrer les noms de fichier originaux (Défaut : auto)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2580
 msgid "Show original linenumber (Default: off)"
 msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2581
 msgid "Show in a format designed for machine consumption"
 msgstr "Afficher dans un format propice à la consommation par machine"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2582
 msgid "Show porcelain format with per-line commit information"
 msgstr "Afficher en format porcelaine avec l'information de commit par ligne"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2583
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Utiliser le même mode de sortie que git-annotate (Défaut : désactivé)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2584
 msgid "Show raw timestamp (Default: off)"
 msgstr "Afficher les horodatages bruts (Défaut : désactivé)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2585
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2586
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Supprimer le nom de l'auteur et l'horodatage (Défaut : désactivé)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2587
 msgid "Show author email instead of name (Default: off)"
 msgstr "Afficher l'e-mail de l'auteur au lieu du nom (Défaut : désactivé)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2588
 msgid "Ignore whitespace differences"
 msgstr "Ignorer les différences d'espace"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "Utiliser une heuristique expérimentale pour améliorer les diffs"
+
+#: builtin/blame.c:2597
 msgid "Spend extra cycles to find better match"
 msgstr ""
 "Dépenser des cycles supplémentaires pour trouver une meilleure correspondance"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2598
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 "Utiliser les révisions du fichier <fichier> au lieu d'appeler git-rev-list"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2599
 msgid "Use <file>'s contents as the final image"
 msgstr "Utiliser le contenu de <fichier> comme image finale"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2600 builtin/blame.c:2601
 msgid "score"
 msgstr "score"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2600
 msgid "Find line copies within and across files"
 msgstr "Trouver les copies de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2601
 msgid "Find line movements within and across files"
 msgstr "Trouver les mouvements de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
 "Traiter seulement l'intervalle de ligne n,m en commençant le compte à 1"
 
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"--progress ne peut pas être utilisé avec --incremental ou les formats "
+"porcelaine"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2697
 msgid "4 years, 11 months ago"
 msgstr "il y a 10 ans et 11 mois"
 
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents et --reverse ne font pas bon ménage."
+
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr "on ne peut pas utiliser --contents avec un nom d'objet commit final"
+
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse et --first-parent ensemble nécessitent la spécification d'un "
+"dernier commit"
+
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse --first-parent ensemble nécessitent une portée avec la chaîne de "
+"premier parent"
+
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
+msgstr "pas de chemin %s dans %s"
+
+#: builtin/blame.c:2851
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "impossible de lire le blob %s  pour le chemin %s"
+
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "le fichier %s n'a qu'%lu ligne"
+msgstr[1] "le fichier %s n'a que %lu lignes"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<options>] [-r | -a] [--merged | --no-merged]"
@@ -4336,7 +5466,11 @@ msgstr ""
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<options>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:143
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [<options>] [-r | -a] [--format]"
+
+#: builtin/branch.c:144
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -4345,7 +5479,7 @@ msgstr ""
 "suppression de la branche '%s' qui a été fusionnée dans\n"
 "         '%s', mais pas dans HEAD."
 
-#: builtin/branch.c:147
+#: builtin/branch.c:148
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -4354,180 +5488,107 @@ msgstr ""
 "branche '%s' non supprimée car elle n'a pas été fusionnée dans\n"
 "         '%s', même si elle est fusionnée dans HEAD."
 
-#: builtin/branch.c:161
+#: builtin/branch.c:162
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Impossible de rechercher l'objet commit pour '%s'"
 
-#: builtin/branch.c:165
+#: builtin/branch.c:166
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
 "If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
 "La branche '%s' n'est pas totalement fusionnée.\n"
-"Si vous êtes sur que vous voulez la supprimer, lancez 'git branch -D %s'."
+"Si vous souhaitez réellement la supprimer, lancez 'git branch -D %s'."
 
-#: builtin/branch.c:178
+#: builtin/branch.c:179
 msgid "Update of config-file failed"
 msgstr "Échec de la mise à jour du fichier de configuration"
 
-#: builtin/branch.c:206
+#: builtin/branch.c:210
 msgid "cannot use -a with -d"
 msgstr "impossible d'utiliser -a avec -d"
 
-#: builtin/branch.c:212
+#: builtin/branch.c:216
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Impossible de rechercher l'objet commit pour HEAD"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Impossible de supprimer la branche '%s' extraite dans '%s'"
 
-#: builtin/branch.c:241
+#: builtin/branch.c:245
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "branche de suivi '%s' non trouvée."
 
-#: builtin/branch.c:242
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "branche '%s' non trouvée."
 
-#: builtin/branch.c:257
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Erreur lors de la suppression de la branche de suivi '%s'"
 
-#: builtin/branch.c:258
+#: builtin/branch.c:262
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Erreur lors de la suppression de la branche '%s'"
 
-#: builtin/branch.c:265
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Branche de suivi %s supprimée (précédemment %s).\n"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:270
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Branche %s supprimée (précédemment %s).\n"
 
-# féminin pour une branche
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: disparue]"
-
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
-
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: en retard de %d]"
-
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
-msgstr "[en retard de %d]"
-
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s : en avance de %d]"
-
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
-msgstr "[en avance de %d]"
-
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s : en avance de %d, en retard de %d]"
-
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[en avance de %d, en retard de %d]"
-
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
-msgstr " **** référence invalide ****"
-
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(aucune branche, rebasage de %s)"
-
-#: builtin/branch.c:378
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(aucune branche, bisect a démarré sur %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD détachée sur %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD détachée depuis %s)"
-
-#: builtin/branch.c:393
-msgid "(no branch)"
-msgstr "(aucune branche)"
-
-#: builtin/branch.c:544
+#: builtin/branch.c:441
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "La branche %s est en cours de rebasage sur %s"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:445
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "La branche %s est en cours de bissection sur %s"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:460
 msgid "cannot rename the current branch while not on any."
 msgstr "impossible de renommer la branche actuelle, il n'y en a pas."
 
-#: builtin/branch.c:573
+#: builtin/branch.c:470
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nom de branche invalide : '%s'"
 
-#: builtin/branch.c:590
+#: builtin/branch.c:487
 msgid "Branch rename failed"
 msgstr "Échec de renommage de la branche"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:490
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Renommage d'un branche mal nommée '%s'"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:493
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "La branche a été renommée en %s, mais HEAD n'est pas mise à jour !"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:502
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "La branche est renommée, mais la mise à jour du fichier de configuration a "
 "échoué"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:518
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4538,159 +5599,176 @@ msgstr ""
 "  %s\n"
 "Les lignes commençant par '%c' seront ignorées.\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:551
 msgid "Generic options"
 msgstr "Options génériques"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:553
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "afficher le hachage et le sujet, doublé pour la branche amont"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:554
 msgid "suppress informational messages"
 msgstr "supprimer les messages d'information"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:555
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "régler le mode de suivi (voir git-pull(1))"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:557
 msgid "change upstream info"
 msgstr "modifier l'information amont"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "upstream"
 msgstr "amont"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "change the upstream info"
 msgstr "modifier l'information amont"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "Désactiver l'information amont"
+
+#: builtin/branch.c:561
 msgid "use colored output"
 msgstr "utiliser la coloration dans la sortie"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:562
 msgid "act on remote-tracking branches"
 msgstr "agir sur les branches de suivi distantes"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:564 builtin/branch.c:566
 msgid "print only branches that contain the commit"
 msgstr "afficher seulement les branches qui contiennent le commit"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "afficher seulement les branches qui ne contiennent pas le commit"
+
+#: builtin/branch.c:570
 msgid "Specific git-branch actions:"
 msgstr "Actions spécifiques à git-branch :"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:571
 msgid "list both remote-tracking and local branches"
 msgstr "afficher à la fois les branches de suivi et les branches locales"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:573
 msgid "delete fully merged branch"
 msgstr "supprimer une branche totalement fusionnée"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:574
 msgid "delete branch (even if not merged)"
 msgstr "supprimer une branche (même non fusionnée)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:575
 msgid "move/rename a branch and its reflog"
 msgstr "déplacer/renommer une branche et son reflog"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:576
 msgid "move/rename a branch, even if target exists"
 msgstr "déplacer/renommer une branche, même si la cible existe"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:577
 msgid "list branch names"
 msgstr "afficher les noms des branches"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:578
 msgid "create the branch's reflog"
 msgstr "créer le reflog de la branche"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:580
 msgid "edit the description for the branch"
 msgstr "éditer la description de la branche"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:581
 msgid "force creation, move/rename, deletion"
 msgstr "forcer la création, le déplacement/renommage, ou la suppression"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:582
 msgid "print only branches that are merged"
 msgstr "afficher seulement les branches qui sont fusionnées"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:583
 msgid "print only branches that are not merged"
 msgstr "afficher seulement les branches qui ne sont pas fusionnées"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:584
 msgid "list branches in columns"
 msgstr "afficher les branches en colonnes"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
 msgid "key"
 msgstr "clé"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
 msgid "field name to sort on"
 msgstr "nom du champ servant à trier"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
 msgid "object"
 msgstr "objet"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:589
 msgid "print only branches of the object"
 msgstr "afficher seulement les branches de l'objet"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "le tri et le filtrage sont non-sensibles à la casse"
+
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "format à utiliser pour la sortie"
+
+#: builtin/branch.c:611
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Échec de résolution de HEAD comme référence valide."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:615 builtin/clone.c:724
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD non trouvée sous refs/heads !"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:638
 msgid "--column and --verbose are incompatible"
 msgstr "--column et --verbose sont incompatibles"
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:649 builtin/branch.c:701
 msgid "branch name required"
 msgstr "le nom de branche est requis"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:677
 msgid "Cannot give description to detached HEAD"
 msgstr "Impossible de décrire une HEAD détachée"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:682
 msgid "cannot edit description of more than one branch"
 msgstr "impossible d'éditer la description de plus d'une branche"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:689
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Aucun commit sur la branche '%s'."
 
-#: builtin/branch.c:773
+#: builtin/branch.c:692
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Aucune branche nommée '%s'."
 
-#: builtin/branch.c:788
+#: builtin/branch.c:707
 msgid "too many branches for a rename operation"
 msgstr "trop de branches pour une opération de renommage"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:712
 msgid "too many branches to set new upstream"
 msgstr "trop de branches pour spécifier une branche amont"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:716
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -4698,41 +5776,41 @@ msgstr ""
 "impossible de spécifier une branche amont de HEAD par %s qui ne pointe sur "
 "aucune branche."
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
 msgid "no such branch '%s'"
 msgstr "pas de branche '%s'"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:723
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la branche '%s' n'existe pas"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:735
 msgid "too many branches to unset upstream"
 msgstr "trop de branches pour désactiver un amont"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:739
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "impossible de désactiver une branche amont de HEAD quand elle ne pointe sur "
 "aucune branche."
 
-#: builtin/branch.c:826
+#: builtin/branch.c:745
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "La branche '%s' n'a aucune information de branche amont"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:759
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "créer manuellement 'HEAD' n'a pas de sens"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:765
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "les options -a et -r de 'git branch' n'ont pas de sens avec un nom de branche"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:768
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4741,7 +5819,7 @@ msgstr ""
 "l'option --set-upstream est obsolète et va disparaître. Utilisez plutôt --"
 "track ou --set-upstream-to\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:785
 #, c-format
 msgid ""
 "\n"
@@ -4749,82 +5827,98 @@ msgid ""
 "\n"
 msgstr ""
 "\n"
-"Si vous vouliez que '%s' suive '%s', faîtes ceci :\n"
+"Si vous vouliez que '%s' suive '%s', faites ceci :\n"
 "\n"
 
-#: builtin/bundle.c:51
+#: builtin/bundle.c:45
 #, c-format
 msgid "%s is okay\n"
 msgstr "%s est correct\n"
 
-#: builtin/bundle.c:64
+#: builtin/bundle.c:58
 msgid "Need a repository to create a bundle."
 msgstr "La création d'un colis requiert un dépôt."
 
-#: builtin/bundle.c:68
+#: builtin/bundle.c:62
 msgid "Need a repository to unbundle."
 msgstr "Le dépaquetage d'un colis requiert un dépôt."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
 "git cat-file (-t [--allow-unknow-type] | -s [--allow-unknow-type] | -e | -p "
-"| <type> | --textconv) <objet>"
+"| <type> | --textconv | --filters) [--path=<chemin>] <objet>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<type> peut être : blob, tree, commit ou tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "afficher le type de l'objet"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "afficher la taille de l'objet"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "sortir avec un code d'erreur nul quand il n'y a aucune erreur"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "afficher avec mise en forme le contenu de l'objet"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "pour les objets blob, lancer textconv sur le contenu de l'objet"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "pour les objets blob, lancer les filtres sur le contenu de l'objet"
+
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "blob"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "utiliser un chemin spécifique pour --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "autoriser -s et -t à travailler sur des objets cassés/corrompus"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "bufferiser la sortie de --batch"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "afficher l'information et le contenu des objets passés en entrée standard"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "afficher l'information des objets passés en entrée standard"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "suivre les liens symbolique internes à la copie de travail (utilisé avec --"
 "batch ou --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "montrer tous les objets avec --batch ou --batch-check"
 
@@ -4844,7 +5938,7 @@ msgstr "afficher tous les attributs associés au fichier"
 msgid "use .gitattributes only from the index"
 msgstr "utiliser .gitattributes seulement depuis l'index"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "lire les noms de fichier depuis l'entrée standard"
 
@@ -4853,7 +5947,7 @@ msgid "terminate input and output records by a NUL character"
 msgstr ""
 "terminer les enregistrements en entrée et en sortie par un caractère NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
 msgid "suppress progress reporting"
 msgstr "supprimer l'état d'avancement"
 
@@ -4945,9 +6039,9 @@ msgid "write the content to temporary files"
 msgstr "écrire le contenu dans des fichiers temporaires"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
 msgid "string"
 msgstr "chaîne"
 
@@ -4959,115 +6053,115 @@ msgstr "lors de la création de fichiers, préfixer par <chaîne>"
 msgid "copy out the files from named stage"
 msgstr "copier les fichiers depuis l'index nommé"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:27
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [<options>] <branche>"
 
-#: builtin/checkout.c:26
+#: builtin/checkout.c:28
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<options>] [<branche>] -- <fichier>..."
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/checkout.c:153 builtin/checkout.c:186
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "le chemin '%s' n'a pas notre version"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:155 builtin/checkout.c:188
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "le chemin '%s' n'a pas leur version"
 
-#: builtin/checkout.c:152
+#: builtin/checkout.c:171
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "le chemin '%s' n'a aucune des versions nécessaires"
 
-#: builtin/checkout.c:196
+#: builtin/checkout.c:215
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "le chemin '%s' n'a pas les versions nécessaires"
 
-#: builtin/checkout.c:213
+#: builtin/checkout.c:232
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "chemin '%s' : impossible de fusionner"
 
-#: builtin/checkout.c:230
+#: builtin/checkout.c:249
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Impossible d'ajouter le résultat de fusion pour '%s'"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' ne peut pas être utilisé avec des mises à jour de chemins"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:281 builtin/checkout.c:284
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' ne peut pas être utilisé avec %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:287
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Impossible de mettre à jour les chemins et basculer sur la branche '%s' en "
 "même temps."
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "le chemin '%s' n'est pas fusionné"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:513
 msgid "you need to resolve your current index first"
 msgstr "vous devez d'abord résoudre votre index courant"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:644
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Impossible de faire un reflog pour '%s' : %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:685
 msgid "HEAD is now at"
 msgstr "HEAD est maintenant sur"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:689 builtin/clone.c:678
 msgid "unable to update HEAD"
 msgstr "impossible de mettre à jour HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:693
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:696
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Déjà sur '%s'\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:700
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Basculement et remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:702 builtin/checkout.c:1090
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Basculement sur la nouvelle branche '%s'\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:704
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Basculement sur la branche '%s'\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:755
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... et %d en plus.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -5090,7 +6184,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:780
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -5119,151 +6213,151 @@ msgstr[1] ""
 "git branch <nouvelle-branche> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:816
 msgid "internal error in revision walk"
 msgstr "erreur interne lors du parcours des révisions"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:820
 msgid "Previous HEAD position was"
 msgstr "La position précédente de HEAD était sur"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:847 builtin/checkout.c:1085
 msgid "You are on a branch yet to be born"
 msgstr "Vous êtes sur une branche qui doit encore naître"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:991
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "une seule référence attendue, %d fournies."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1031 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "référence invalide : %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1060
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la référence n'est pas un arbre : %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1099
 msgid "paths cannot be used with switching branches"
 msgstr "impossible d'utiliser des chemins avec un basculement de branches"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' ne peut pas être utilisé avec un basculement de branches"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' ne peut pas être utilisé avec '%s'"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1126
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Impossible de basculer de branche vers '%s' qui n'est pas un commit"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
 msgid "branch"
 msgstr "branche"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1160
 msgid "create and checkout a new branch"
 msgstr "créer et extraire une nouvelle branche"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1162
 msgid "create/reset and checkout a branch"
 msgstr "créer/réinitialiser et extraire une branche"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1163
 msgid "create reflog for new branch"
 msgstr "créer un reflog pour une nouvelle branche"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1164 builtin/worktree.c:333
 msgid "detach HEAD at named commit"
 msgstr "détacher la HEAD au commit nommé"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1165
 msgid "set upstream info for new branch"
 msgstr "paramétrer les coordonnées de branche amont pour une nouvelle branche"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new-branch"
 msgstr "nouvelle branche"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new unparented branch"
 msgstr "nouvelle branche sans parent"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1168
 msgid "checkout our version for unmerged files"
 msgstr "extraire notre version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1170
 msgid "checkout their version for unmerged files"
 msgstr "extraire leur version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1172
 msgid "force checkout (throw away local modifications)"
 msgstr "forcer l'extraction (laisser tomber les modifications locales)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1173
 msgid "perform a 3-way merge with the new branch"
 msgstr "effectuer une fusion à 3 points avec la nouvelle branche"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1174 builtin/merge.c:234
 msgid "update ignored files (default)"
 msgstr "mettre à jour les fichiers ignorés (par défaut)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
 msgid "style"
 msgstr "style"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1176
 msgid "conflict style (merge or diff3)"
 msgstr "style de conflit (merge (fusion) ou diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1179
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "ne pas limiter les spécificateurs de chemins aux seuls éléments creux"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1181
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "réessayer d'interpréter 'git checkout <branche-inexistante>'"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1183
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "ne pas vérifier si une autre copie de travail contient le référence fournie"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
 msgid "force progress reporting"
 msgstr "forcer l'affichage de l'état d'avancement"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1224
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B et --orphan sont mutuellement exclusifs"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1241
 msgid "--track needs a branch name"
 msgstr "--track requiert un nom de branche"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1246
 msgid "Missing branch name; try -b"
 msgstr "Nom de branche manquant ; essayez -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1282
 msgid "invalid path specification"
 msgstr "spécification de chemin invalide"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1289
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5273,12 +6367,12 @@ msgstr ""
 "en même temps.\n"
 "Souhaitiez-vous extraire '%s' qui ne peut être résolu comme commit ?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1294
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach n'accepte pas un argument de chemin '%s'"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1298
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5317,19 +6411,21 @@ msgstr "Ignorerait le dépôt %s\n"
 msgid "failed to remove %s"
 msgstr "échec de la suppression de %s"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
 "Aide en ligne :\n"
 "1           - sélectionner un élément numéroté\n"
 "foo         - sélectionner un élément par un préfixe unique\n"
-"            - (vide) ne rien sélectionner"
+"            - (vide) ne rien sélectionner\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:301 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5338,7 +6434,7 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
 "Aide en ligne :\n"
 "1          - sélectionner un seul élément\n"
@@ -5347,38 +6443,40 @@ msgstr ""
 "foo        - sélectionner un élément par un préfixe unique\n"
 "-...       - désélectionner les éléments spécifiés\n"
 "*          - choisir tous les éléments\n"
-"           - (vide) terminer la sélection"
+"           - (vide) terminer la sélection\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "Hein (%s) ?"
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "Hein (%s) ?\n"
 
-#: builtin/clean.c:653
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Entrez les motifs à ignorer>> "
 
-#: builtin/clean.c:690
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "ATTENTION : Impossible de trouver les éléments correspondant à : %s"
 
-#: builtin/clean.c:711
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Sélectionner les éléments à supprimer"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/clean.c:758
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Supprimer %s [y/N] ? "
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Au revoir."
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "Au revoir.\n"
 
-#: builtin/clean.c:785
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -5396,62 +6494,63 @@ msgstr ""
 "help                - cet écran\n"
 "?                   - aide pour la sélection en ligne"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:818 git-add--interactive.perl:1736
 msgid "*** Commands ***"
 msgstr "*** Commandes ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:819 git-add--interactive.perl:1733
 msgid "What now"
 msgstr "Et maintenant ?"
 
-#: builtin/clean.c:821
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Supprimerait l'élément suivant :"
 msgstr[1] "Supprimerait les éléments suivants :"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Plus de fichier à nettoyer, sortie."
 
-#: builtin/clean.c:869
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "ne pas afficher les noms des fichiers supprimés"
 
-#: builtin/clean.c:871
+#: builtin/clean.c:877
 msgid "force"
 msgstr "forcer"
 
-#: builtin/clean.c:872
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "nettoyage interactif"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "supprimer les répertoires entiers"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "motif"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "ajouter <motif> aux règles ignore"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "supprimer les fichiers ignorés, aussi"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "supprimer seulement les fichiers ignorés"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x et -X ne peuvent pas être utilisés ensemble"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:907
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -5459,7 +6558,7 @@ msgstr ""
 "clean.requireForce positionné à true et ni -i, -n ou -f fourni ; refus de "
 "nettoyer"
 
-#: builtin/clean.c:904
+#: builtin/clean.c:910
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -5471,112 +6570,135 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<options>] [--] <dépôt> [<répertoire>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:80
 msgid "don't create a checkout"
 msgstr "ne pas créer d'extraction"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "créer un dépôt nu"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:85
 msgid "create a mirror repository (implies bare)"
 msgstr "créer un dépôt miroir (implique dépôt nu)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:87
 msgid "to clone from a local repository"
 msgstr "pour cloner depuis un dépôt local"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:89
 msgid "don't use local hardlinks, always copy"
 msgstr "ne pas utiliser de liens durs locaux, toujours copier"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:91
 msgid "setup as shared repository"
 msgstr "régler comme dépôt partagé"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "spécificateur de chemin"
+
+#: builtin/clone.c:93 builtin/clone.c:97
 msgid "initialize submodules in the clone"
 msgstr "initialiser les sous-modules dans le clone"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:100
 msgid "number of submodules cloned in parallel"
 msgstr "nombre de sous-modules clonés en parallèle"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:101 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "répertoire-modèle"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:102 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "répertoire depuis lequel les modèles vont être utilisés"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
 msgid "reference repository"
 msgstr "dépôt de référence"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:108
 msgid "use --reference only while cloning"
 msgstr "utiliser seulement --reference pour cloner"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
 msgid "name"
 msgstr "nom"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:110
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "utiliser <nom> au lieu de 'origin' pour suivre la branche amont"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:112
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "extraire <branche> au lieu de la HEAD du répertoire distant"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:114
 msgid "path to git-upload-pack on the remote"
 msgstr "chemin vers git-upload-pack sur le serveur distant"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "profondeur"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:116
 msgid "create a shallow clone of that depth"
 msgstr "créer un clone superficiel de cette profondeur"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "heure"
+
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr "créer un clone superficiel depuis une date spécifique"
+
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "révision"
+
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr ""
+"approfondir l'historique d'un clone superficiel en excluant une révision"
+
+#: builtin/clone.c:122
 msgid "clone only one branch, HEAD or --branch"
 msgstr "cloner seulement une branche, HEAD ou --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:124
 msgid "any cloned submodules will be shallow"
 msgstr "tous les sous-modules clonés seront superficiels"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:125 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:126 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "séparer le répertoire git de la copie de travail"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:127
 msgid "key=value"
 msgstr "clé=valeur"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:128
 msgid "set config inside the new repository"
 msgstr "régler la configuration dans le nouveau dépôt"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
 msgid "use IPv4 addresses only"
 msgstr "n'utiliser que des adresses IPv4"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
 msgid "use IPv6 addresses only"
 msgstr "n'utiliser que des adresses IPv6"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:268
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5584,59 +6706,42 @@ msgstr ""
 "Aucun nom de répertoire n'a pu être deviné\n"
 "Veuillez spécifier un répertoire dans la ligne de commande"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"extraire le dépôt de référence '%s' comme une extraction liée n'est pas "
-"encore supporté."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "le dépôt de référence '%s' n'est pas un dépôt local."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "le dépôt de référence '%s' est superficiel"
-
-#: builtin/clone.c:317
+#: builtin/clone.c:321
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "le dépôt de référence '%s' est greffé"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info : impossible d'ajouter une alternative pour '%s' : %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:393
 #, c-format
 msgid "failed to open '%s'"
 msgstr "échec à l'ouverture de '%s'"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:401
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existe et n'est pas un répertoire"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:415
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "échec du stat de %s\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:437
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "échec de la création du lien '%s'"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:441
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "échec de la copie vers '%s'"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:466
 #, c-format
 msgid "done.\n"
 msgstr "fait.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:478
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5646,125 +6751,145 @@ msgstr ""
 "Vous pouvez inspecter ce qui a été extrait avec 'git status'\n"
 "et réessayer l'extraction avec 'git checkout -f HEAD'\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:555
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Impossible de trouver la branche distante '%s' à cloner."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:650
 msgid "remote did not send all necessary objects"
 msgstr "le serveur distant n'a pas envoyé tous les objets nécessaires"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:666
 #, c-format
 msgid "unable to update %s"
 msgstr "impossible de mettre à jour %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:715
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "la HEAD distante réfère à une référence non existante, impossible de "
 "l'extraire.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:746
 msgid "unable to checkout working tree"
 msgstr "impossible d'extraire la copie de travail"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:786
 msgid "unable to write parameters to config file"
 msgstr "impossible d'écrire les paramètres dans le fichier de configuration"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:849
 msgid "cannot repack to clean up"
 msgstr "impossible de remballer pour nettoyer"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:851
 msgid "cannot unlink temporary alternates file"
 msgstr "impossible de unlinker le fichier temporaire alternates"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
 msgid "Too many arguments."
 msgstr "Trop d'arguments."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:888
 msgid "You must specify a repository to clone."
 msgstr "Vous devez spécifier un dépôt à cloner."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:901
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "les options --bare et --origin %s sont incompatibles."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:904
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare et --separate-git-dir sont incompatibles."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:917
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "le dépôt '%s' n'existe pas"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profondeur %s n'est pas un entier positif"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:933
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr ""
 "le chemin de destination '%s' existe déjà et n'est pas un répertoire vide."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:943
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "la copie de travail '%s' existe déjà."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "impossible de créer les répertoires de premier niveau dans '%s'"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:961
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "impossible de créer le répertoire de la copie de travail '%s'"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:973
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Clonage dans le dépôt nu '%s'\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:975
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Clonage dans '%s'...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"clone --recursive n'est pas compatible avec à la fois --reference et --"
+"reference-if-able"
+
+#: builtin/clone.c:1055
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "--depth est ignoré dans les clones locaux : utilisez plutôt \"file://\"."
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-since est ignoré dans les clones locaux : utilisez plutôt \"file://"
+"\"."
+
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude est ignoré dans les clones locaux : utilisez plutôt "
+"\"file://\"."
+
+#: builtin/clone.c:1062
 msgid "source repository is shallow, ignoring --local"
 msgstr "le dépôt source est superficiel, option --local ignorée"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1067
 msgid "--local is ignored"
 msgstr "--local est ignoré"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1071
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Je ne sais pas cloner %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1126 builtin/clone.c:1134
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "La branche distante %s n'a pas été trouvée dans le dépôt amont %s"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1137
 msgid "You appear to have cloned an empty repository."
 msgstr "Vous semblez avoir cloné un dépôt vide."
 
@@ -5907,66 +7032,61 @@ msgstr ""
 "Puis \"git cherry-pick --continue\" continuera le picorage \n"
 "des commits restants.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "échec du dépaquetage de l'objet arbre HEAD"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "impossible de créer l'index temporaire"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "échec de l'ajout interactif"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "impossible de mettre à jour l'index temporaire"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Impossible de mettre à jour l'arbre de cache principal"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "impossible d'écrire le fichier new_index"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "impossible de faire une validation partielle pendant une fusion."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "impossible de faire une validation partielle pendant un picorage."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "impossible de lire l'index"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "impossible d'écrire le fichier d'index temporaire"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "entête d'auteur manquant dans le commit '%s'"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "le commit '%s' a une ligne d'auteur malformée"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "paramètre --author mal formé"
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
-msgstr "format de date invalide : %s"
-
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5974,38 +7094,38 @@ msgstr ""
 "impossible de sélectionner un caractère de commentaire\n"
 "qui n'est pas utilisé dans le message de validation actuel"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "impossible de rechercher le commit %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:294
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(lecture du message de journal depuis l'entrée standard)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "impossible de lire le journal depuis l'entrée standard"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "impossible de lire le fichier de journal '%s'"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "impossible de lire SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "impossible de lire MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "impossible d'écrire le modèle de commit"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -6020,7 +7140,7 @@ msgstr ""
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -6035,7 +7155,7 @@ msgstr ""
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -6045,7 +7165,7 @@ msgstr ""
 "commençant par '%c' seront ignorées, et un message vide abandonne la "
 "validation.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -6056,150 +7176,150 @@ msgstr ""
 "commençant par '%c' seront conservées ; vous pouvez les supprimer vous-même\n"
 "si vous le souhaitez. Un message vide abandonne la validation.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAuteur :     %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDate :       %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sValidateur : %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Impossible de lire l'index"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Erreur lors de la construction des arbres"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Veuillez fournir le message en utilisant l'option -m ou -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' n'est pas de la forme 'Nom <email>' ni ne correspond à aucun "
 "auteur existant"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fichier non suivi invalide '%s'"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long et -z sont incompatibles"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "L'utilisation simultanée de --reset-author et --author n'a pas de sens"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Il n'y a rien à corriger."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Vous êtes en pleine fusion -- impossible de corriger (amend)."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Vous êtes en plein picorage -- impossible de corriger (amend)."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Les options --squash et --fixup ne peuvent pas être utilisées ensemble"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Une seule option parmi -c/-C/-F/--fixup peut être utilisée."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "L'option -m ne peut pas être combinée avec -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author ne peut être utilisé qu'avec -C, -c ou --amend."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Une seule option parmi --include/--only/--all/--interactive/--patch peut "
 "être utilisée."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "Aucun chemin avec les options --include/--only n'a pas de sens."
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "Malin... correction du dernier avec un index sale."
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Chemins explicites spécifiés sans -i ni -o ; --only supposé..."
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:551
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de nettoyage invalide %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "Spécifier des chemins avec l'option -a n'a pas de sens."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "afficher le statut avec concision"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "afficher l'information de branche"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "version"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
 msgid "machine-readable output"
 msgstr "sortie pour traitement automatique"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "afficher le statut en format long (par défaut)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "terminer les éléments par NUL"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
 msgid "mode"
 msgstr "mode"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "afficher les fichiers non suivis, \"mode\" facultatif : all (tous), normal, "
 "no. (Défaut : all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "afficher les fichiers ignorés"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "quand"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6207,201 +7327,201 @@ msgstr ""
 "ignorer les modifications dans les sous-modules, \"quand\" facultatif : all "
 "(tous), dirty (sale), untracked (non suivi). (Défaut : all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "afficher les fichiers non suivis en colonnes"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "impossible de retrouver le commit nouvellement créé"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr "impossible d'analyser le commit nouvellement créé"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "HEAD détachée"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr " (commit racine)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "supprimer le résumé après une validation réussie"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "afficher les diff dans le modèle de message de validation"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "Options du message de validation"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:409
 msgid "read message from file"
 msgstr "lire le message depuis un fichier"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "auteur"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "remplacer l'auteur pour la validation"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:357
 msgid "date"
 msgstr "date"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "remplacer la date pour la validation"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
 msgid "message"
 msgstr "message"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "message de validation"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
 msgid "commit"
 msgstr "commit"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "réutiliser et éditer le message du commit spécifié"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "réutiliser le message du commit spécifié"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "utiliser un message au format autosquash pour corriger le commit spécifié"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "utiliser un message au format autosquash pour compresser le commit spécifié"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 "à présent je suis l'auteur de la validation (utilisé avec -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
 msgid "add Signed-off-by:"
 msgstr "ajouter une entrée Signed-off-by :"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "utiliser le fichier de modèle spécifié"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "forcer l'édition du commit"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "défaut"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:412
 msgid "how to strip spaces and #comments from message"
 msgstr "comment éliminer les espaces et les commentaires # du message"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "inclure le statut dans le modèle de message de validation"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
 msgid "GPG sign commit"
 msgstr "signer la validation avec GPG"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "Valider les options des contenus"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "valider tous les fichiers modifiés"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "ajouter les fichiers spécifiés à l'index pour la validation"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "ajouter des fichiers en mode interactif"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "ajouter les modifications en mode interactif"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "valider seulement les fichiers spécifiés"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "éviter d'utiliser les crochets pre-commit et commit-msg"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "afficher ce qui serait validé"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "corriger la validation précédente"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
 msgstr "éviter d'utiliser le crochet post-rewrite"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "accepter d'enregistrer une modification vide"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "accepter d'enregistrer une modification avec un message vide"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "impossible d'analyser le commit HEAD"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fichier MERGE_HEAD corrompu (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "impossible de lire MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "impossible de lire le message de validation : %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Abandon de la validation ; vous n'avez pas édité le message\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
-msgstr "Abandon de la validation du à un message de validation vide\n"
+msgstr "Abandon de la validation dû à un message de validation vide.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6415,142 +7535,142 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<options>]"
 
-#: builtin/config.c:55
+#: builtin/config.c:56
 msgid "Config file location"
 msgstr "Emplacement du fichier de configuration"
 
-#: builtin/config.c:56
+#: builtin/config.c:57
 msgid "use global config file"
 msgstr "utiliser les fichier de configuration global"
 
-#: builtin/config.c:57
+#: builtin/config.c:58
 msgid "use system config file"
 msgstr "utiliser le fichier de configuration du système"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "use repository config file"
 msgstr "utiliser le fichier de configuration du dépôt"
 
-#: builtin/config.c:59
+#: builtin/config.c:60
 msgid "use given config file"
 msgstr "utiliser le fichier de configuration spécifié"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "read config from given blob object"
 msgstr "lire la configuration depuis l'objet blob fourni"
 
-#: builtin/config.c:61
+#: builtin/config.c:62
 msgid "Action"
 msgstr "Action"
 
-#: builtin/config.c:62
+#: builtin/config.c:63
 msgid "get value: name [value-regex]"
 msgstr "obtenir la valeur : nom [regex-de-valeur]"
 
-#: builtin/config.c:63
+#: builtin/config.c:64
 msgid "get all values: key [value-regex]"
 msgstr "obtenir toutes les valeurs : clé [regex-de-valeur]"
 
-#: builtin/config.c:64
+#: builtin/config.c:65
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "obtenir les valeur pour la regexp : regex-de-nom [regex-de-valeur]"
 
-#: builtin/config.c:65
+#: builtin/config.c:66
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "obtenir la valeur spécifique pour l'URL : section[.var] URL"
 
-#: builtin/config.c:66
+#: builtin/config.c:67
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 "remplacer toutes les variables correspondant : nom valeur [regex-de-valeur]"
 
-#: builtin/config.c:67
+#: builtin/config.c:68
 msgid "add a new variable: name value"
 msgstr "ajouter une nouvelle variable : nom valeur"
 
-#: builtin/config.c:68
+#: builtin/config.c:69
 msgid "remove a variable: name [value-regex]"
 msgstr "supprimer une variable : nom [regex-de-valeur]"
 
-#: builtin/config.c:69
+#: builtin/config.c:70
 msgid "remove all matches: name [value-regex]"
 msgstr "supprimer toutes les correspondances nom [regex-de-valeur]"
 
-#: builtin/config.c:70
+#: builtin/config.c:71
 msgid "rename section: old-name new-name"
 msgstr "renommer une section : ancien-nom nouveau-nom"
 
-#: builtin/config.c:71
+#: builtin/config.c:72
 msgid "remove a section: name"
 msgstr "supprimer une section : nom"
 
-#: builtin/config.c:72
+#: builtin/config.c:73
 msgid "list all"
 msgstr "afficher tout"
 
-#: builtin/config.c:73
+#: builtin/config.c:74
 msgid "open an editor"
 msgstr "ouvrir un éditeur"
 
-#: builtin/config.c:74
+#: builtin/config.c:75
 msgid "find the color configured: slot [default]"
 msgstr "trouver la couleur configurée : slot [par défaut]"
 
-#: builtin/config.c:75
+#: builtin/config.c:76
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "trouver le réglage de la couleur : slot [stdout-est-tty]"
 
-#: builtin/config.c:76
+#: builtin/config.c:77
 msgid "Type"
 msgstr "Type"
 
-#: builtin/config.c:77
+#: builtin/config.c:78
 msgid "value is \"true\" or \"false\""
 msgstr "la valeur est \"true\" (vrai) ou \"false\" (faux)"
 
-#: builtin/config.c:78
+#: builtin/config.c:79
 msgid "value is decimal number"
 msgstr "la valeur est un nombre décimal"
 
-#: builtin/config.c:79
+#: builtin/config.c:80
 msgid "value is --bool or --int"
 msgstr "la valeur est --bool ou --int"
 
-#: builtin/config.c:80
+#: builtin/config.c:81
 msgid "value is a path (file or directory name)"
 msgstr "la valeur est un chemin (vers un fichier ou un répertoire)"
 
-#: builtin/config.c:81
+#: builtin/config.c:82
 msgid "Other"
 msgstr "Autre"
 
-#: builtin/config.c:82
+#: builtin/config.c:83
 msgid "terminate values with NUL byte"
 msgstr "terminer les valeurs avec un caractère NUL"
 
-#: builtin/config.c:83
+#: builtin/config.c:84
 msgid "show variable names only"
 msgstr "n'afficher que les noms de variable"
 
-#: builtin/config.c:84
+#: builtin/config.c:85
 msgid "respect include directives on lookup"
 msgstr "respecter les directives d'inclusion lors de la recherche"
 
-#: builtin/config.c:85
+#: builtin/config.c:86
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
 "afficher l'origine de la configuration (fichier, entrée standard, blob, "
 "ligne de commande)"
 
-#: builtin/config.c:327
+#: builtin/config.c:328
 msgid "unable to parse default color value"
 msgstr "impossible de lire la valeur de couleur par défaut"
 
-#: builtin/config.c:471
+#: builtin/config.c:472
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -6565,68 +7685,89 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:613
+#: builtin/config.c:615
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "création impossible du fichier de configuration '%s'"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:627
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"impossible de surcharger des valeurs multiples avec une seule valeur\n"
+"       Utilisez une regexp, --add ou --replace-all pour modifier %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "affiche les tailles dans un format humainement lisible"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [<options>] [<commit-ish>...]"
 msgstr "git describe [<options>] <commit ou apparenté>*"
 
-#: builtin/describe.c:18
+#: builtin/describe.c:19
 msgid "git describe [<options>] --dirty"
 msgstr "git describe [<options>] --dirty"
 
-#: builtin/describe.c:217
+#: builtin/describe.c:53
+msgid "head"
+msgstr "tête"
+
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "léger"
+
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "annoté"
+
+#: builtin/describe.c:250
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "l'étiquette annotée %s n'est pas disponible"
 
-#: builtin/describe.c:221
+#: builtin/describe.c:254
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "l'étiquette annotée %s n'a pas de nom embarqué"
 
-#: builtin/describe.c:223
+#: builtin/describe.c:256
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "l'étiquette '%s' est en fait '%s'"
 
-#: builtin/describe.c:250 builtin/log.c:480
+#: builtin/describe.c:283 builtin/log.c:487
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s n'est pas un nom d'objet valide"
 
-#: builtin/describe.c:253
+#: builtin/describe.c:286
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s n'est pas un objet '%s' valide"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:303
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "aucune étiquette ne correspond parfaitement à '%s'"
 
-#: builtin/describe.c:272
+#: builtin/describe.c:305
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "recherche de la description de %s\n"
 
-#: builtin/describe.c:319
+#: builtin/describe.c:352
 #, c-format
 msgid "finished search at %s\n"
 msgstr "recherche terminée à %s\n"
 
-#: builtin/describe.c:346
+#: builtin/describe.c:379
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -6635,7 +7776,7 @@ msgstr ""
 "Aucune étiquette annotée ne peut décrire '%s'.\n"
 "Cependant, il existe des étiquettes non-annotées : essayez avec --tags."
 
-#: builtin/describe.c:350
+#: builtin/describe.c:383
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -6644,12 +7785,12 @@ msgstr ""
 "Aucune étiquette ne peut décrire '%s'.\n"
 "Essayez --always, ou créez des étiquettes."
 
-#: builtin/describe.c:371
+#: builtin/describe.c:413
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu commits parcourus\n"
 
-#: builtin/describe.c:374
+#: builtin/describe.c:416
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -6659,96 +7800,211 @@ msgstr ""
 "affichées\n"
 "abandon de la recherche à %s\n"
 
-#: builtin/describe.c:396
+#: builtin/describe.c:438
 msgid "find the tag that comes after the commit"
 msgstr "rechercher l'étiquette qui suit le commit"
 
-#: builtin/describe.c:397
+#: builtin/describe.c:439
 msgid "debug search strategy on stderr"
 msgstr "déboguer la stratégie de recherche sur stderr"
 
-#: builtin/describe.c:398
+#: builtin/describe.c:440
 msgid "use any ref"
 msgstr "utiliser n'importe quelle référence"
 
-#: builtin/describe.c:399
+#: builtin/describe.c:441
 msgid "use any tag, even unannotated"
 msgstr "utiliser n'importe quelle étiquette, même non-annotée"
 
-#: builtin/describe.c:400
+#: builtin/describe.c:442
 msgid "always use long format"
 msgstr "toujours utiliser le format long"
 
-#: builtin/describe.c:401
+#: builtin/describe.c:443
 msgid "only follow first parent"
 msgstr "ne suivre que le premier parent"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:446
 msgid "only output exact matches"
 msgstr "n'afficher que les correspondances exactes"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:448
 msgid "consider <n> most recent tags (default: 10)"
 msgstr ""
 "considérer uniquement les <n> étiquettes le plus récentes (défaut : 10)"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:450
 msgid "only consider tags matching <pattern>"
 msgstr "ne considérer que les étiquettes correspondant à <motif>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "ne pas considérer les étiquettes correspondant à <motif>"
+
+#: builtin/describe.c:454 builtin/name-rev.c:357
 msgid "show abbreviated commit object as fallback"
 msgstr "afficher les objets commits abrégés en dernier recours"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:455 builtin/describe.c:458
 msgid "mark"
 msgstr "marque"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:456
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "ajouter <marque> si la copie de travail est sale (défaut : \"-dirty\")"
 
-#: builtin/describe.c:430
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr ""
+"ajouter <marque> si la copie de travail est cassée (défaut : \"-broken\")"
+
+#: builtin/describe.c:477
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long et --abbrev=0 sont incompatibles"
 
-#: builtin/describe.c:456
+#: builtin/describe.c:506
 msgid "No names found, cannot describe anything."
 msgstr "aucun nom trouvé, impossible de décrire quoi que ce soit."
 
-#: builtin/describe.c:476
+#: builtin/describe.c:549
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty est incompatible avec la spécification de commits ou assimilés"
 
-#: builtin/diff.c:86
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "--broken est incompatible avec les commits ou assimilés"
+
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s' : n'est pas un fichier régulier ni un lien symbolique"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "option invalide : %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Ce n'est pas un dépôt git !"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objet spécifié '%s' invalide."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "plus de deux blobs spécifiés : '%s'"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "objet non géré '%s' spécifié."
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr "git difftool [<options>] [<commit> [<commit>]] [--] [<chemin>...]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "échec : %d"
+
+#: builtin/difftool.c:283
+#, c-format
+msgid "could not read symlink %s"
+msgstr "lecture du lien symbolique %s impossible"
+
+#: builtin/difftool.c:285
+#, c-format
+msgid "could not read symlink file %s"
+msgstr "impossible de lire le fichier symlink %s"
+
+#: builtin/difftool.c:293
+#, c-format
+msgid "could not read object %s for symlink %s"
+msgstr "Impossible de lire l'objet %s pour le symlink %s"
+
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"les formats de diff combinés ('-c' et '--cc') ne sont pas supportés\n"
+"dans le mode de diff de répertoire ('-d' et '--dir-diff')."
+
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "les deux fichiers sont modifiés : '%s' et '%s'."
+
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "le fichier dans l'arbre de travail a été laissé."
+
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "des fichiers temporaires existent dans '%s'."
+
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "vous pourriez souhaiter les nettoyer ou les récupérer."
+
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "utiliser `diff.guitool` au lieu de `diff.tool`"
+
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "réalise un diff de répertoire complet"
+
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "ne pas confirmer avant de lancer l'outil de diff"
+
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "utiliser les liens symboliques en mode de diff de répertoire"
+
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "<outil>"
+
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "utiliser l'outil de diff spécifié"
+
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr "afficher une liste des outils de diff utilisables avec `--tool`"
+
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr ""
+"provoque la fin de 'git-difftool' si l'outil de diff invoqué renvoie un code "
+"non-nul"
+
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "<commande>"
+
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "spécifier une commande personnalisée pour visualiser les différences"
+
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "pas d'<outil> spécifié pour --tool=<outil>"
+
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "pas de <commande> spécifié pour --extcmd=<commande>"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [options-de-liste-de-révisions]"
@@ -6818,165 +8074,169 @@ msgstr "git fetch --multiple [<options>] [(<dépôt> | <groupe>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<options>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "récupérer depuis tous les dépôts distants"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "ajouter à .git/FETCH_HEAD au lieu de l'écraser"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "chemin vers lequel télécharger le paquet sur le poste distant"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "forcer l'écrasement de la branche locale"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "récupérer depuis plusieurs dépôts distants"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "récupérer toutes les étiquettes et leurs objets associés"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "ne pas récupérer toutes les étiquettes (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "nombre de sous-modules récupérés en parallèle"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "éliminer les branches de suivi distant si la branche n'existe plus dans le "
 "dépôt distant"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "à la demande"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "contrôler la récupération récursive dans les sous-modules"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "conserver le paquet téléchargé"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "permettre la mise à jour de la référence HEAD"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "approfondir l'historique d'un clone superficiel"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "approfondir l'historique d'un clone superficiel en fonction d'une date"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "convertir en un dépôt complet"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1440
 msgid "dir"
 msgstr "répertoire"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "préfixer ceci à la sortie du chemin du sous-module"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "mode par défaut pour la récursion"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "accepter les références qui mettent à jour .git/shallow"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "correspondance de référence"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "spécifier une correspondance de référence pour la récupération"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "impossible de trouver la référence HEAD distante"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:513
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr ""
 "le paramètre de configuration fetch.output contient une valeur invalide %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:606
 #, c-format
 msgid "object %s not found"
 msgstr "objet %s non trouvé"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:610
 msgid "[up to date]"
 msgstr "[à jour]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:623 builtin/fetch.c:703
 msgid "[rejected]"
 msgstr "[rejeté]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:624
 msgid "can't fetch in current branch"
 msgstr "impossible de récupérer dans la branche actuelle"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:633
 msgid "[tag update]"
 msgstr "[mise à jour de l'étiquette]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
 msgid "unable to update local ref"
 msgstr "impossible de mettre à jour la référence locale"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:653
 msgid "[new tag]"
 msgstr "[nouvelle étiquette]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:656
 msgid "[new branch]"
 msgstr "[nouvelle branche]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:659
 msgid "[new ref]"
 msgstr "[nouvelle référence]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:698
 msgid "forced update"
 msgstr "mise à jour forcée"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:703
 msgid "non-fast-forward"
 msgstr "pas en avance rapide"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:748
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s n'a pas envoyé tous les objets nécessaires\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:768
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "%s rejeté parce que les racines superficielles ne sont pas mises à jour"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
 msgid "From %.*s\n"
 msgstr "Depuis %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6985,55 +8245,55 @@ msgstr ""
 "des références locales n'ont pas pu être mises à jour ; essayez de lancer\n"
 " 'git remote prune %s' pour supprimer des branches anciennes en conflit"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:921
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s sera en suspens)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s est devenu en suspens)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:954
 msgid "[deleted]"
 msgstr "[supprimé]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:955 builtin/remote.c:1022
 msgid "(none)"
 msgstr "(aucun(e))"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:978
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Refus de récupérer dans la branche courant %s d'un dépôt non nu"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:997
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "La valeur \"%2$s\" de l'option \"%1$s\" est invalide pour %3$s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1000
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "L'option \"%s\" est ignorée pour %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1076
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Je ne sais pas récupérer depuis %s"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1236
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Récupération de %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Impossible de récupérer %s"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1256
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -7041,32 +8301,40 @@ msgstr ""
 "Aucun dépôt distant spécifié. Veuillez spécifier une URL ou un nom\n"
 "distant depuis lesquels les nouvelles révisions devraient être récupérées."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1279
 msgid "You need to specify a tag name."
 msgstr "Vous devez spécifier un nom d'étiquette."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "Une profondeur négative dans --deepen n'est pas supportée"
+
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen et --depth sont mutuellement exclusifs"
+
+#: builtin/fetch.c:1328
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth et --unshallow ne peuvent pas être utilisés ensemble"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1330
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow sur un dépôt complet n'a pas de sens"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1352
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all n'accepte pas d'argument de dépôt"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1354
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all n'a pas de sens avec des spécifications de référence"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1365
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "distant ou groupe distant inexistant : %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1373
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 "La récupération d'un groupe et les spécifications de référence n'ont pas de "
@@ -7078,23 +8346,23 @@ msgid ""
 msgstr ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <fichier>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "peupler le journal avec au plus <n> éléments depuis le journal court"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "alias pour --log (obsolète)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "texte"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "utiliser <texte> comme début de message"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "fichier d'où lire"
 
@@ -7107,12 +8375,12 @@ msgid "git for-each-ref [--points-at <object>]"
 msgstr "git for-each-ref [--point-at <objet>]"
 
 #: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<objet>]]"
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<commit>]]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<objet>]]"
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
 
 #: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
@@ -7134,10 +8402,6 @@ msgstr "échapper les champs réservés pour compatibilité avec Tcl"
 msgid "show only <n> matched refs"
 msgstr "n'afficher que <n> références correspondant"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "format à utiliser pour la sortie"
-
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
 msgstr "afficher seulement les références pointant sur l'objet"
@@ -7154,64 +8418,68 @@ msgstr "afficher seulement les références qui ne sont pas fusionnées"
 msgid "print only refs which contain the commit"
 msgstr "afficher seulement les références qui contiennent le commit"
 
-#: builtin/fsck.c:519
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "afficher seulement les références qui ne contiennent pas le commit"
+
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "Vérification des répertoires d'objet"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<options>] [<objet>...]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "afficher les objets inaccessibles"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "afficher les objets en suspens"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "afficher les étiquettes"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "signaler les nœuds racines"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "considérer les objets de l'index comme nœuds tête"
 
 # translated from man page
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "considérer les reflogs comme nœuds tête (par défaut)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "inspecter aussi les objets pack et alternatifs"
 
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "ne vérifier que la connectivité"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "activer une vérification plus strict"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr "écrire les objets en suspens dans .git/lost-found"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "afficher la progression"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "afficher les noms étendus pour les objets inaccessibles"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "Vérification des objets"
 
@@ -7219,17 +8487,17 @@ msgstr "Vérification des objets"
 msgid "git gc [<options>]"
 msgstr "git gc [<options>]"
 
-#: builtin/gc.c:72
+#: builtin/gc.c:78
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "%s invalide : '%s'"
+msgid "Failed to fstat %s: %s"
+msgstr "Échec du stat de %s : %s"
 
-#: builtin/gc.c:139
+#: builtin/gc.c:310
 #, c-format
-msgid "insanely long object directory %.*s"
-msgstr "objet répertoire démentiellement long %.*s"
+msgid "Can't stat %s"
+msgstr "impossible de faire un stat de %s"
 
-#: builtin/gc.c:290
+#: builtin/gc.c:319
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7245,42 +8513,47 @@ msgstr ""
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:358
 msgid "prune unreferenced objects"
 msgstr "éliminer les objets non référencés"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:360
 msgid "be more thorough (increased runtime)"
 msgstr "être plus consciencieux (durée de traitement allongée)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:361
 msgid "enable auto-gc mode"
 msgstr "activer le mode auto-gc"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:362
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "forcer le lancement du ramasse-miettes même si un autre ramasse-miettes "
 "tourne déjà"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "impossible de lire la valeur de gc.logexpiry %s"
+
+#: builtin/gc.c:407
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Compression automatique du dépôt en tâche de fond pour optimiser les "
 "performances.\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:409
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Compression du dépôt pour optimiser les performances.\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:410
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Voir \"git help gc\" pour toute information sur le nettoyage manuel.\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:431
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -7288,254 +8561,270 @@ msgstr ""
 "un ramasse-miettes est déjà en cours sur la machine '%s' pid %<PRIuMAX> "
 "(utilisez --force si ce n'est pas le cas)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:475
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Il y a trop d'objets seuls inaccessibles ; lancez 'git prune' pour les "
 "supprimer."
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<options>] [-e] <motif> [<révision>...] [[--] <chemin>...]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep : échec de création du fil: %s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "nombre de fils spécifié invalide (%d) pour %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "impossible de lire l'arbre (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:829
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "impossible de faire un grep sur un objet de type %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:893
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "l'option '%c' attend un valeur numérique"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "impossible d'ouvrir '%s'"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:980
 msgid "search in index instead of in the work tree"
 msgstr "rechercher dans l'index plutôt que dans la copie de travail"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:982
 msgid "find in contents not managed by git"
 msgstr "rechercher dans les contenus non gérés par git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:984
 msgid "search in both tracked and untracked files"
 msgstr "rechercher dans les fichiers suivis et non-suivis"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:986
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorer les fichiers spécifiés via '.gitignore'"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "rechercher récursivement dans chaque sous-module"
+
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "nom de base"
+
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "préfixer le nom de base du projet parent à la sortie"
+
+#: builtin/grep.c:994
 msgid "show non-matching lines"
 msgstr "afficher les lignes qui ne correspondent pas"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:996
 msgid "case insensitive matching"
 msgstr "correspondance insensible à la casse"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:998
 msgid "match patterns only at word boundaries"
 msgstr "rechercher les motifs aux séparateurs de mots"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:1000
 msgid "process binary files as text"
 msgstr "traiter les fichiers binaires comme texte"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:1002
 msgid "don't match patterns in binary files"
 msgstr "ne pas chercher les motifs dans les fichiers binaires"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:1005
 msgid "process binary files with textconv filters"
 msgstr "traiter les fichiers binaires avec les filtres textconv"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1007
 msgid "descend at most <depth> levels"
 msgstr "descendre au plus de <profondeur> dans l'arborescence"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1011
 msgid "use extended POSIX regular expressions"
 msgstr "utiliser des expressions régulières étendues POSIX"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1014
 msgid "use basic POSIX regular expressions (default)"
 msgstr "utiliser des expressions régulières basiques POSIX (par défaut)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1017
 msgid "interpret patterns as fixed strings"
 msgstr "interpréter les motifs comme de chaînes fixes"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1020
 msgid "use Perl-compatible regular expressions"
 msgstr "utiliser des expressions régulières compatibles avec Perl"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1023
 msgid "show line numbers"
 msgstr "afficher les numéros de ligne"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1024
 msgid "don't show filenames"
 msgstr "ne pas pas afficher les noms de fichier"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1025
 msgid "show filenames"
 msgstr "afficher les noms de fichier"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1027
 msgid "show filenames relative to top directory"
 msgstr "afficher les noms de fichiers relativement au répertoire de base"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1029
 msgid "show only filenames instead of matching lines"
 msgstr "n'afficher que les noms de fichiers au lieu des lignes correspondant"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1031
 msgid "synonym for --files-with-matches"
 msgstr "synonyme pour --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1034
 msgid "show only the names of files without match"
 msgstr "n'afficher que les noms des fichiers sans correspondance"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1036
 msgid "print NUL after filenames"
 msgstr "imprimer une caractère NUL après le noms de fichier"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1038
 msgid "show the number of matches instead of matching lines"
 msgstr "afficher le nombre de correspondances au lieu des lignes correspondant"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1039
 msgid "highlight matches"
 msgstr "mettre en évidence les correspondances"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1041
 msgid "print empty line between matches from different files"
 msgstr ""
 "imprimer une ligne vide entre les correspondances de fichiers différents"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1043
 msgid "show filename only once above matches from same file"
 msgstr ""
 "afficher le nom de fichier une fois au dessus des correspondances du même "
 "fichier"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1046
 msgid "show <n> context lines before and after matches"
 msgstr "afficher <n> lignes de contexte avant et après les correspondances"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1049
 msgid "show <n> context lines before matches"
 msgstr "afficher <n> lignes de contexte avant les correspondances"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1051
 msgid "show <n> context lines after matches"
 msgstr "afficher <n> lignes de contexte après les correspondances"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1053
 msgid "use <n> worker threads"
 msgstr "utiliser <n> fils de travail"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1054
 msgid "shortcut for -C NUM"
 msgstr "raccourci pour -C NUM"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1057
 msgid "show a line with the function name before matches"
 msgstr ""
 "afficher une ligne avec le nom de la fonction avant les correspondances"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1059
 msgid "show the surrounding function"
 msgstr "afficher la fonction contenante"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1062
 msgid "read patterns from file"
 msgstr "lire les motifs depuis fichier"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1064
 msgid "match <pattern>"
 msgstr "rechercher <motif>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1066
 msgid "combine patterns specified with -e"
 msgstr "combiner les motifs spécifiés par -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1078
 msgid "indicate hit with exit status without output"
 msgstr ""
 "indiquer des correspondances avec le code de sortie mais sans rien afficher"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1080
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "n'afficher que les correspondances de fichiers qui correspondent à tous les "
 "motifs"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1082
 msgid "show parse tree for grep expression"
 msgstr "afficher l'arbre d'analyse pour le motif grep"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "pager"
 msgstr "pagineur"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "show matching files in the pager"
 msgstr "afficher les fichiers correspondant dans le pagineur"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1089
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permettre l'appel de grep(1) (ignoré par ce build)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1153
 msgid "no pattern given."
 msgstr "aucun motif fourni."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr ""
+"--no-index ou --untracked ne peuvent pas être utilisés avec des révisions"
+
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
+msgstr "impossible de résoudre la révision : %s"
+
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "nombre de fils spécifié invalide (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1251
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager ne fonctionne que sur la copie de travail"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "option non supportée avec --recurse-submodules."
+
+#: builtin/grep.c:1280
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached ou --untracked ne peuvent pas être utilisés avec --no-index."
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr ""
-"--no-index ou --untracked ne peuvent pas être utilisés avec des révisions."
-
-#: builtin/grep.c:909
+#: builtin/grep.c:1286
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "--[no-]exclude-standard ne peut pas être utilisé avec du contenu suivi."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1294
 msgid "both --cached and trees are given."
 msgstr "--cached et des arbres sont fournis en même temps."
 
@@ -7551,85 +8840,89 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "type"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "type d'objet"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "écrire l'objet dans la base de donnée d'objets"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "lire l'objet depuis l'entrée standard"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "stocker le fichier tel quel sans filtrage"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 "juste hasher n'importe quel contenu pour créer des objets corrompus pour "
 "debugger Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "traiter le fichier comme s'il venait de ce chemin"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "afficher toutes les commandes disponibles"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "exclure les guides"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "afficher une liste de guides utiles"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "afficher la page de manuel"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "afficher le manuel dans un navigateur web"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "afficher la page info"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<commande>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "format d'aide non reconnu '%s'"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "échec de démarrage d'emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "échec d'analyse de la version d'emacsclient."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "la version d'emacsclient '%d' est trop ancienne (<22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "échec de l'exécution de '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7638,7 +8931,7 @@ msgstr ""
 "'%s' : chemin pour l'utilitaire de visualisation de manuel non supporté.\n"
 "Veuillez utiliser plutôt 'man.<outil>.cmd'."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7647,429 +8940,442 @@ msgstr ""
 "'%s' : chemin pour l'utilitaire de visualisation de manuel supporté.\n"
 "Veuillez utiliser plutôt 'man.<outil>.cmd'."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s' : visualiseur de manuel inconnu."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "aucun visualiseur de manuel n'a pris en charge la demande"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "aucun visualiseur de 'info' n'a pris en charge la demande"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Définition des attributs par chemin"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Git de tous les jours avec à peu près 20 commandes"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Un glossaire Git"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Spécifie les fichiers non-suivis à ignorer intentionnellement"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Définition des propriétés de sous-module"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Spécification des révisions et portées pour Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr ""
 "Une introduction pratique à Git (pour les versions 1.5.1 et supérieures)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Un aperçu des flux de travail recommandés avec Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Les guides Git populaires sont : \n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "usage : %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s\" est un alias de `%s'"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "usage : %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "impossible d'ouvrir %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "type d'objet non correspondant à %s"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "objet attendu non reçu %s"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "objet %s : type attendu %s, reçu %s"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "impossible de remplir %d octet"
 msgstr[1] "impossible de remplir %d octets"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "fin de fichier prématurée"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "erreur de lecture sur l'entrée"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "plus d'octets utilisés que disponibles"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "le paquet est trop grand pour la définition actuelle de off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "le paquet dépasse la taille maximale permise"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "impossible de créer '%s'"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:323
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "impossible d'ouvrir le fichier paquet '%s'"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:337
 msgid "pack signature mismatch"
 msgstr "la signature du paquet ne correspond pas"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:339
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "la version de paquet %<PRIu32> non supportée"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:357
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "le paquet a un mauvais objet à l'offset %<PRIuMAX> : %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:479
 #, c-format
 msgid "inflate returned %d"
 msgstr "la décompression (inflate) a retourné %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:528
 msgid "offset value overflow for delta base object"
 msgstr "dépassement de la valeur d'offset pour l'objet delta de base"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:536
 msgid "delta base offset is out of bound"
 msgstr "l'objet delta de base est hors limite"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:544
 #, c-format
 msgid "unknown object type %d"
 msgstr "type d'objet inconnu %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:575
 msgid "cannot pread pack file"
 msgstr "impossible de lire (pread) le fichier paquet"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:577
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "fin prématurée du fichier paquet, %<PRIuMAX> octet lu"
 msgstr[1] "fin prématurée du fichier paquet, %<PRIuMAX> octets lus"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:603
 msgid "serious inflate inconsistency"
 msgstr "grave incohérence dans la décompression (inflate)"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "COLLISION SHA1 TROUVÉE AVEC %s !"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
 msgid "unable to read %s"
 msgstr "impossible de lire %s"
 
 #: builtin/index-pack.c:814
 #, c-format
+msgid "cannot read existing object info %s"
+msgstr "impossible de lire l'information existante de l'objet %s"
+
+#: builtin/index-pack.c:822
+#, c-format
 msgid "cannot read existing object %s"
 msgstr "impossible de lire l'objet existant %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:836
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objet blob invalide %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:850
 #, c-format
 msgid "invalid %s"
 msgstr "%s invalide"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:853
 msgid "Error in object"
 msgstr "Erreur dans l'objet"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:855
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Tous les objets enfants de %s ne sont pas accessibles"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
 msgid "failed to apply delta"
 msgstr "échec d'application du delta"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Receiving objects"
 msgstr "Réception d'objets"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Indexing objects"
 msgstr "Indexation d'objets"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1160
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "le paquet est corrompu (SHA1 ne correspond pas)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1165
 msgid "cannot fstat packfile"
 msgstr "impossible d'obtenir le statut (fstat) du fichier paquet"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1168
 msgid "pack has junk at the end"
 msgstr "le paquet est invalide à la fin"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1179
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "confusion extrême dans parse_pack_objects()"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1202
 msgid "Resolving deltas"
 msgstr "Résolution des deltas"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1213
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "impossible de créer le fil : %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1255
 msgid "confusion beyond insanity"
 msgstr "confusion extrême"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1261
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "complété avec %d objet local"
 msgstr[1] "complété avec %d objets locaux"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1273
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr ""
 "Somme de contrôle de fin inattendue pour %s (corruption sur le disque ?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1277
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "le paquet a %d delta non résolu"
 msgstr[1] "le paquet a %d deltas non résolus"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1301
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "impossible de compresser l'objet ajouté (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1377
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "l'objet local %s est corrompu"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1403
 msgid "error while closing pack file"
 msgstr "erreur en fermeture du fichier paquet"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1415
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "impossible d'écrire le fichier \"keep\" '%s'"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1423
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "impossible de fermer le fichier \"keep\" '%s'"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1433
 msgid "cannot store pack file"
 msgstr "impossible de stocker le fichier paquet"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "impossible de stocker le fichier d'index"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1479
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "mauvais pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "pas de support des fils, ignore %s"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1547
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Impossible d'ouvrir le fichier paquet existant '%s'"
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1549
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Impossible d'ouvrir le fichier paquet d'index existant pour '%s'"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1596
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "pas un delta : %d objet"
 msgstr[1] "pas un delta : %d objets"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1603
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "longueur chaînée = %d : %lu objet"
 msgstr[1] "longueur chaînée = %d : %lu objets"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1616
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "le nom de fichier paquet '%s' ne se termine pas par '.pack'"
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
 msgid "bad %s"
 msgstr "mauvais %s"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1737
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin ne peut pas être utilisé sans --stdin"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "--stdin requiert un dépôt git"
+
+#: builtin/index-pack.c:1747
 msgid "--verify with no packfile name given"
 msgstr "--verify sans nom de fichier paquet donné"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "impossible de faire un stat de '%s'"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "impossible de faire un stat du modèle '%s'"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "impossible d'ouvrir (opendir) '%s'"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "impossible de readlink '%s'"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "impossible de créer un lien symbolique de '%s' '%s'"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "impossible de copier '%s' vers '%s'"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "modèle %s ignoré"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "modèles non trouvés %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "pas de copie des modèles depuis '%s' : %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s existe déjà"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "impossible de traiter le fichier de type %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "impossible de déplacer %s vers %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s existe déjà"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Dépôt Git existant partagé réinitialisé dans %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Dépôt Git existant réinitialisé dans %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Dépôt Git vide partagé initialisé dans %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Dépôt Git vide initialisé dans %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -8077,25 +9383,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>] [--"
 "shared[=<permissions>]] [<répertoire>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "permissions"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "spécifier que le dépôt git sera partagé entre plusieurs utilisateurs"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "impossible de créer le répertoire (mkdir) %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "impossible de se déplacer vers le répertoire (chdir) %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -8104,7 +9410,7 @@ msgstr ""
 "%s (ou --work-tree=<répertoire>) n'est pas autorisé sans spécifier %s (ou --"
 "git-dir=<répertoire>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Impossible d'accéder à l'arbre de travail '%s'"
@@ -8145,109 +9451,106 @@ msgstr "git log [<options>] [<plage de révisions>] [[--] <chemin>...]"
 msgid "git show [<options>] <object>..."
 msgstr "git show [<options>] <objet>..."
 
-#: builtin/log.c:84
+#: builtin/log.c:89
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "option --decorate invalide : %s"
 
-#: builtin/log.c:139
+#: builtin/log.c:144
 msgid "suppress diff output"
 msgstr "supprimer la sortie des différences"
 
-#: builtin/log.c:140
+#: builtin/log.c:145
 msgid "show source"
 msgstr "afficher la source"
 
-#: builtin/log.c:141
+#: builtin/log.c:146
 msgid "Use mail map file"
 msgstr "Utiliser le fichier de correspondance de mail"
 
-#: builtin/log.c:142
+#: builtin/log.c:147
 msgid "decorate options"
 msgstr "décorer les options"
 
-#: builtin/log.c:145
+#: builtin/log.c:150
 msgid "Process line range n,m in file, counting from 1"
 msgstr ""
 "Traiter seulement l'intervalle de lignes n,m du fichier en commençant le "
 "compte à 1"
 
-#: builtin/log.c:241
+#: builtin/log.c:246
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Sortie finale : %d %s\n"
 
-#: builtin/log.c:486
+#: builtin/log.c:493
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s : fichier incorrect"
 
-#: builtin/log.c:500 builtin/log.c:594
+#: builtin/log.c:507 builtin/log.c:601
 #, c-format
 msgid "Could not read object %s"
 msgstr "Impossible de lire l'objet %s"
 
-#: builtin/log.c:618
+#: builtin/log.c:625
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Type inconnu : %d"
 
-#: builtin/log.c:739
+#: builtin/log.c:746
 msgid "format.headers without value"
 msgstr "format.headers sans valeur"
 
-#: builtin/log.c:839
+#: builtin/log.c:846
 msgid "name of output directory is too long"
 msgstr "le nom du répertoire de sortie est trop long"
 
-#: builtin/log.c:854
+#: builtin/log.c:861
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Impossible d'ouvrir le fichier correctif %s"
 
-#: builtin/log.c:868
+#: builtin/log.c:875
 msgid "Need exactly one range."
 msgstr "Exactement une plage nécessaire."
 
-#: builtin/log.c:878
+#: builtin/log.c:885
 msgid "Not a range."
 msgstr "Ceci n'est pas une plage."
 
-#: builtin/log.c:984
+#: builtin/log.c:991
 msgid "Cover letter needs email format"
 msgstr "La lettre de motivation doit être au format e-mail"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1071
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to aberrant : %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1098
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<options>] [<depuis> | <plage de révisions>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1148
 msgid "Two output directories?"
 msgstr "Deux répertoires de sortie ?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Commit inconnu %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Impossible de résoudre '%s' comme une référence valide."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1270
 msgid "Could not find exact merge base."
 msgstr "Impossible de trouver la base de fusion exacte."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1274
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8260,212 +9563,216 @@ msgstr ""
 "ou vous pouvez spécifier le commit de base par --base=<id-du-commit-de-base> "
 "manuellement."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1294
 msgid "Failed to find exact merge base"
 msgstr "Impossible de trouver la base de fusion exacte"
 
-#: builtin/log.c:1294
+#: builtin/log.c:1305
 msgid "base commit should be the ancestor of revision list"
 msgstr "le commit de base devrait être l'ancêtre de la liste de révisions"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1309
 msgid "base commit shouldn't be in revision list"
 msgstr "le commit de base ne devrait pas faire partie de la liste de révisions"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1358
 msgid "cannot get patch id"
 msgstr "impossible d'obtenir l'id du patch"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1415
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "utiliser [PATCH n/m] même avec un patch unique"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1418
 msgid "use [PATCH] even with multiple patches"
 msgstr "utiliser [PATCH] même avec des patchs multiples"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1422
 msgid "print patches to standard out"
 msgstr "afficher les patchs sur la sortie standard"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1424
 msgid "generate a cover letter"
 msgstr "générer une lettre de motivation"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1426
 msgid "use simple number sequence for output file names"
 msgstr ""
 "utiliser une séquence simple de nombres pour les nom des fichiers de sortie"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1427
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1428
 msgid "use <sfx> instead of '.patch'"
 msgstr "utiliser <sfx> au lieu de '.patch'"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1430
 msgid "start numbering patches at <n> instead of 1"
 msgstr "démarrer la numérotation des patchs à <n> au lieu de 1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1432
 msgid "mark the series as Nth re-roll"
 msgstr "marquer la série comme une Nième réédition"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "utiliser [RFC PATCH] au lieu de [PATCH]"
+
+#: builtin/log.c:1437
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "utiliser [<préfixe>] au lieu de [PATCH]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1440
 msgid "store resulting files in <dir>"
 msgstr "stocker les fichiers résultats dans <répertoire>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1443
 msgid "don't strip/add [PATCH]"
 msgstr "ne pas retirer/ajouter [PATCH]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1446
 msgid "don't output binary diffs"
 msgstr "ne pas imprimer les diffs binaires"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1448
 msgid "output all-zero hash in From header"
 msgstr "écrire une empreinte à zéro dans l'entête From"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1450
 msgid "don't include a patch matching a commit upstream"
 msgstr "ne pas inclure un patch correspondant à un commit amont"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1452
 msgid "show patch format instead of default (patch + stat)"
 msgstr "afficher le format du patch au lieu du défaut (patch + stat)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1454
 msgid "Messaging"
 msgstr "Communication"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1455
 msgid "header"
 msgstr "en-tête"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1456
 msgid "add email header"
 msgstr "ajouter l'en-tête d'e-mail"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1457 builtin/log.c:1459
 msgid "email"
 msgstr "e-mail"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1457
 msgid "add To: header"
 msgstr "ajouter l'en-tête \"To:\""
 
-#: builtin/log.c:1445
+#: builtin/log.c:1459
 msgid "add Cc: header"
 msgstr "ajouter l'en-tête \"Cc:\""
 
-#: builtin/log.c:1447
+#: builtin/log.c:1461
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1462
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "renseigner l'adresse From à <ident> (ou à l'ident du validateur si absent)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1464
 msgid "message-id"
 msgstr "id-message"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1465
 msgid "make first mail a reply to <message-id>"
 msgstr "répondre dans le premier message à <id-message>"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1466 builtin/log.c:1469
 msgid "boundary"
 msgstr "limite"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1467
 msgid "attach the patch"
 msgstr "attacher le patch"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1470
 msgid "inline the patch"
 msgstr "patch à l'intérieur"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1474
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 "activer l'enfilage de message, styles : shallow (superficiel), deep (profond)"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1476
 msgid "signature"
 msgstr "signature"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1477
 msgid "add a signature"
 msgstr "ajouter une signature"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1478
 msgid "base-commit"
 msgstr "commit-de-base"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1479
 msgid "add prerequisite tree info to the patch series"
 msgstr "Ajouter un arbre prérequis à la série de patchs"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1481
 msgid "add a signature from a file"
 msgstr "ajouter une signature depuis un fichier"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1482
 msgid "don't print the patch filenames"
 msgstr "ne pas afficher les noms de fichiers des patchs"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1572
 msgid "-n and -k are mutually exclusive."
 msgstr "-n et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix et -k sont mutuellement exclusifs."
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1582
 msgid "--name-only does not make sense"
 msgstr "--name-only n'a pas de sens"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1584
 msgid "--name-status does not make sense"
 msgstr "--name-status n'a pas de sens"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1586
 msgid "--check does not make sense"
 msgstr "--check n'a pas de sens"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1616
 msgid "standard output, or directory, which one?"
 msgstr "sortie standard, ou répertoire, lequel ?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1618
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Impossible de créer le répertoire '%s'"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1712
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "lecture du fichier de signature '%s' impossible"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1784
 msgid "Failed to create output files"
 msgstr "Échec de création des fichiers en sortie"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1833
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<branche_amont> [<head> [<limite>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1887
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8473,102 +9780,106 @@ msgstr ""
 "Impossible de trouver une branche distante suivie, merci de spécifier "
 "<branche_amont> manuellement.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:468
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<options>] [<fichier>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:517
 msgid "identify the file status with tags"
 msgstr "identifier le statut de fichier avec les étiquettes"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:519
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "utiliser des minuscules pour les fichier 'assumés inchangés'"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:521
 msgid "show cached files in the output (default)"
 msgstr "afficher les fichiers mis en cache dans la sortie (défaut)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:523
 msgid "show deleted files in the output"
 msgstr "afficher les fichiers supprimés dans la sortie"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:525
 msgid "show modified files in the output"
 msgstr "afficher les fichiers modifiés dans la sortie"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:527
 msgid "show other files in the output"
 msgstr "afficher les autres fichiers dans la sortie"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:529
 msgid "show ignored files in the output"
 msgstr "afficher les fichiers ignorés dans la sortie"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:532
 msgid "show staged contents' object name in the output"
 msgstr "afficher les nom des objets indexés dans la sortie"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:534
 msgid "show files on the filesystem that need to be removed"
 msgstr ""
 "afficher les fichiers du système de fichiers qui ont besoin d'être supprimés"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:536
 msgid "show 'other' directories' names only"
 msgstr "afficher seulement les noms des répertoires 'other'"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:538
 msgid "show line endings of files"
 msgstr "afficher les fins de lignes des fichiers"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:540
 msgid "don't show empty directories"
 msgstr "ne pas afficher les répertoires vides"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:543
 msgid "show unmerged files in the output"
 msgstr "afficher les fichiers non fusionnés dans la sortie"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:545
 msgid "show resolve-undo information"
 msgstr "afficher l'information resolv-undo"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:547
 msgid "skip files matching pattern"
 msgstr "sauter les fichiers correspondant au motif"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:550
 msgid "exclude patterns are read from <file>"
 msgstr "les motifs d'exclusion sont lus depuis <fichier>"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:553
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "lire des motifs d'exclusion additionnels par répertoire dans <fichier>"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:555
 msgid "add the standard git exclusions"
 msgstr "ajouter les exclusions git standard"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:558
 msgid "make the output relative to the project top directory"
 msgstr "afficher en relatif par rapport au répertoire racine du projet"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
+msgstr "parcourir récursivement les sous-modules"
+
+#: builtin/ls-files.c:563
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "si un <fichier> n'est pas dans l'index, traiter cela comme une erreur"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:564
 msgid "tree-ish"
 msgstr "arbre ou apparenté"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:565
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "considérer que les chemins supprimés depuis <arbre ou apparenté> sont "
 "toujours présents"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:567
 msgid "show debugging data"
 msgstr "afficher les données de débogage"
 
@@ -8582,41 +9893,41 @@ msgstr ""
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<dépôt> [<références>...]]"
 
-#: builtin/ls-remote.c:50
+#: builtin/ls-remote.c:52
 msgid "do not print remote URL"
 msgstr "ne pas afficher les URL distantes"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
 msgid "exec"
 msgstr "exécutable"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
 msgid "path of git-upload-pack on the remote host"
 msgstr "chemin vers git-upload-pack sur le serveur distant"
 
-#: builtin/ls-remote.c:56
+#: builtin/ls-remote.c:58
 msgid "limit to tags"
 msgstr "limiter aux étiquettes"
 
-#: builtin/ls-remote.c:57
+#: builtin/ls-remote.c:59
 msgid "limit to heads"
 msgstr "limiter aux heads"
 
-#: builtin/ls-remote.c:58
+#: builtin/ls-remote.c:60
 msgid "do not show peeled tags"
 msgstr "ne pas afficher les étiquettes pelées"
 
-#: builtin/ls-remote.c:60
+#: builtin/ls-remote.c:62
 msgid "take url.<base>.insteadOf into account"
 msgstr "prendre en compte url.<base>.insteadOf"
 
-#: builtin/ls-remote.c:62
+#: builtin/ls-remote.c:64
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr ""
 "sortir avec un code d'erreur 2 si aucune correspondance de référence n'est "
 "trouvée"
 
-#: builtin/ls-remote.c:64
+#: builtin/ls-remote.c:66
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "afficher la réf sous-jacente en plus de l'objet pointé par elle"
 
@@ -8624,35 +9935,35 @@ msgstr "afficher la réf sous-jacente en plus de l'objet pointé par elle"
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<options>] <arbre ou apparenté> [<chemin>...]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "afficher seulement les arbres"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
 msgstr "parcourir les sous-arbres"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "afficher les arbres en les parcourant"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "terminer les éléments avec un octet NUL"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "inclure la taille d'objet"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "afficher seulement les noms de fichiers"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "utiliser les noms de chemins complets"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "afficher l'arbre entier ; pas seulement le répertoire courant (implique --"
@@ -8663,172 +9974,176 @@ msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<options>] [<commit>...]"
 
 #: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<options>] <message> HEAD <commit>"
-
-#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
 msgid "switch `m' requires a value"
 msgstr "le commutateur `m' a besoin d'une valeur"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Impossible de trouver la stratégie de fusion '%s'.\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:141
 #, c-format
 msgid "Available strategies are:"
 msgstr "Les stratégies disponibles sont :"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Les stratégies personnalisées sont :"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:196 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "ne pas afficher un diffstat à la fin de la fusion"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "afficher un diffstat à la fin de la fusion"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:200 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(synonyme de --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:202 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "ajouter (au plus <n>) éléments du journal court au message de validation de "
 "la fusion"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:205 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "créer une validation unique au lieu de faire une fusion"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:207 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "effectuer une validation si la fusion réussit (défaut)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:209 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "éditer le message avant la validation"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:210
 msgid "allow fast-forward (default)"
 msgstr "autoriser l'avance rapide (défaut)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:212 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "abandonner si l'avance rapide n'est pas possible"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:216 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "vérifier que le commit nommé a une signature GPG valide"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
 msgid "strategy"
 msgstr "stratégie"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:218 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "stratégie de fusion à utiliser"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:219 builtin/pull.c:162
 msgid "option=value"
 msgstr "option=valeur"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:220 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "option pour la stratégie de fusion sélectionnée"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 "message de validation de la fusion (pour une fusion sans avance rapide)"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:226
 msgid "abort the current in-progress merge"
 msgstr "abandonner la fusion en cours"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "continuer la fusion en cours"
+
+#: builtin/merge.c:230 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "permettre la fusion d'historiques sans rapport"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:258
 msgid "could not run stash."
 msgstr "impossible de lancer le remisage."
 
-#: builtin/merge.c:260
+#: builtin/merge.c:263
 msgid "stash failed"
 msgstr "échec du remisage"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:268
 #, c-format
 msgid "not a valid object: %s"
 msgstr "pas un objet valide : %s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:287 builtin/merge.c:304
 msgid "read-tree failed"
 msgstr "read-tree a échoué"
 
-#: builtin/merge.c:331
+#: builtin/merge.c:334
 msgid " (nothing to squash)"
 msgstr " (rien à compresser)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:345
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Validation compressée -- HEAD non mise à jour\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:395
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Pas de message de fusion -- pas de mise à jour de HEAD\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' ne pointe pas sur un commit"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:536
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Mauvaise chaîne branch.%s.mergeoptions : %s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "Impossible de gérer autre chose que la fusion de deux têtes."
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Options inconnue pour merge-recursive : -X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "impossible d'écrire %s"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Impossible de lire depuis '%s'"
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Pas de validation de la fusion ; utilisez 'git commit' pour terminer la "
 "fusion.\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8845,68 +10160,75 @@ msgstr ""
 "Les lignes commençant par '%c' seront ignorées, et un message vide\n"
 "abandonne la validation.\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "Message de validation vide."
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Merveilleux.\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "La fusion automatique a échoué ; réglez les conflits et validez le "
 "résultat.\n"
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "'%s' n'est pas une validation"
-
-#: builtin/merge.c:904
+#: builtin/merge.c:890
 msgid "No current branch."
 msgstr "Pas de branche courante."
 
-#: builtin/merge.c:906
+#: builtin/merge.c:892
 msgid "No remote for the current branch."
 msgstr "Pas de branche distante pour la branche courante."
 
-#: builtin/merge.c:908
+#: builtin/merge.c:894
 msgid "No default upstream defined for the current branch."
 msgstr "Pas de branche amont par défaut définie pour la branche courante."
 
-#: builtin/merge.c:913
+#: builtin/merge.c:899
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Pas de branche de suivi pour %s depuis %s"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:946
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Mauvaise valeur '%s' dans l'environnement '%s'"
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1020
 #, c-format
 msgid "could not close '%s'"
 msgstr "impossible de fermer '%s'"
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1047
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "pas possible de fusionner ceci dans %s : %s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1081
 msgid "not something we can merge"
 msgstr "pas possible de fusionner ceci"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "--abort n'accepte pas d'argument"
+
+#: builtin/merge.c:1150
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Il n'y a pas de fusion à abandonner (MERGE_HEAD manquant)."
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "--continue ne supporte aucun argument"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "Il n'y a pas de fusion en cours (MERGE_HEAD manquant)."
+
+#: builtin/merge.c:1182
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8914,7 +10236,7 @@ msgstr ""
 "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n"
 "Veuillez valider vos modifications avant de pouvoir fusionner."
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1189
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8922,114 +10244,114 @@ msgstr ""
 "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe).\n"
 "Veuillez valider vos modifications avant de pouvoir fusionner."
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1192
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe)."
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1201
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Vous ne pouvez pas combiner --squash avec --no-ff."
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1209
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "Pas de validation spécifiée et merge.defaultToUpstream n'est pas défini."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1226
 msgid "Squash commit into empty head not supported yet"
 msgstr "La validation compressée vers une tête vide n'est pas encore supportée"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1228
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Une validation sans avance rapide n'a pas de sens dans une tête vide"
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1233
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - pas possible de fusionner ceci"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1235
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 "Possible de fusionner exactement une seule validation dans une tête vide"
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "La validation %s a une signature GPG non fiable, prétendument par %s."
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "La validation %s a une mauvaise signature GPG prétendument par %s."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "La validation %s n'a pas de signature GPG."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1278
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "La validation %s a une signature GPG correcte par %s\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1340
 msgid "refusing to merge unrelated histories"
 msgstr "refus de fusionner des historiques sans relation"
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1349
 msgid "Already up-to-date."
 msgstr "Déjà à jour."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1359
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Mise à jour %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1400
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Essai de fusion vraiment triviale dans l'index...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1407
 #, c-format
 msgid "Nope.\n"
 msgstr "Non.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1432
 msgid "Already up-to-date. Yeeah!"
 msgstr "Déjà à jour. Ouais !"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1438
 msgid "Not possible to fast-forward, aborting."
 msgstr "Pas possible d'avancer rapidement, abandon."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1461 builtin/merge.c:1540
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Retour de l'arbre à l'original...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1465
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Essai de la stratégie de fusion %s...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1531
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Aucune stratégie de fusion n'a pris en charge la fusion.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1533
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "La fusion avec la stratégie %s a échoué.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1542
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Utilisation de %s pour préparer la résolution à la main.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1554
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -9055,23 +10377,23 @@ msgstr "git merge-base --is-ancestor <validation> <validation>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <référence> [<validation>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "afficher tous les ancêtres communs"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "trouver les ancêtres pour une fusion simple à n points"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "afficher les révisions inaccessibles depuis les autres"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "est le premier ancêtre de l'autre ?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "trouver où <validation> a divergé du reflog de <référence>"
 
@@ -9083,38 +10405,69 @@ msgstr ""
 "git merge-file [<options>] [-L <nom1> [-L <orig> [-L <nom2>]]] <fichier1> "
 "<fichier-orig> <fichier2>"
 
-#: builtin/merge-file.c:33
+#: builtin/merge-file.c:32
 msgid "send results to standard output"
 msgstr "envoyer les résultats sur la sortie standard"
 
-#: builtin/merge-file.c:34
+#: builtin/merge-file.c:33
 msgid "use a diff3 based merge"
 msgstr "utiliser une fusion basée sur diff3"
 
-#: builtin/merge-file.c:35
+#: builtin/merge-file.c:34
 msgid "for conflicts, use our version"
 msgstr "pour les conflits, utiliser notre version (our)"
 
-#: builtin/merge-file.c:37
+#: builtin/merge-file.c:36
 msgid "for conflicts, use their version"
 msgstr "pour les conflits, utiliser leur version (their)"
 
-#: builtin/merge-file.c:39
+#: builtin/merge-file.c:38
 msgid "for conflicts, use a union version"
 msgstr "pour les conflits, utiliser l'ensemble des versions"
 
-#: builtin/merge-file.c:42
+#: builtin/merge-file.c:41
 msgid "for conflicts, use this marker size"
 msgstr "pour les conflits, utiliser cette taille de marqueur"
 
-#: builtin/merge-file.c:43
+#: builtin/merge-file.c:42
 msgid "do not warn about conflicts"
 msgstr "ne pas avertir à propos des conflits"
 
-#: builtin/merge-file.c:45
+#: builtin/merge-file.c:44
 msgid "set labels for file1/orig-file/file2"
 msgstr "définir les labels pour fichier1/fichier-orig/fichier2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "option inconnue %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "Impossible d'analyser l'objet '%s'"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "impossible de gérer plus de %d base. %s ignoré."
+msgstr[1] "impossible de gérer plus de %d bases. %s ignoré."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "impossible de gérer autre chose que la fusion de deux têtes."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "impossible de résoudre la référence '%s'"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Fusion de %s avec %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -9131,138 +10484,142 @@ msgstr "autoriser les objets manquants"
 msgid "allow creation of more than one tree"
 msgstr "autoriser la création de plus d'un arbre"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<options>] <source>... <destination>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "Le répertoire %s est dans l'index et pourtant aucun sous-module ?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "Veuillez indexer vos modifications de .gitmodules ou les remiser pour "
 "continuer"
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s est dans l'index"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "forcer le déplacement/renommage même si la cible existe"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "sauter les erreurs de déplacement/renommage"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "la destination '%s' n'est pas un répertoire"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Vérification du renommage de '%s' en '%s'\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "mauvaise source"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "impossible de déplacer un répertoire dans lui-même"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "impossible de déplacer un répertoire sur un fichier"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "le répertoire source est vide"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "pas sous le contrôle de version"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "la destination existe"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "écrasement de '%s'"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "Impossible d'écraser"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "multiples sources pour la même destination"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "le répertoire de destination n'existe pas"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, source=%s, destination=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Renommage de %s en %s\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "le renommage de '%s' a échoué"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:289
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<options>] <validation>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:290
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<options>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:291
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<options>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:346
 msgid "print only names (no SHA-1)"
 msgstr "afficher seulement les noms (pas de SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:347
 msgid "only use tags to name the commits"
 msgstr "utiliser seulement les étiquettes pour nommer les validations"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:349
 msgid "only use refs matching <pattern>"
 msgstr "utiliser seulement les références correspondant à <motif>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "ignorer les références correspondant à <motif>"
+
+#: builtin/name-rev.c:353
 msgid "list all commits reachable from all refs"
 msgstr ""
 "afficher toutes les validations accessibles depuis toutes les références"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:354
 msgid "read from stdin"
 msgstr "lire depuis l'entrée standard"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:355
 msgid "allow to print `undefined` names (default)"
 msgstr "autoriser l'affichage des noms `non définis` (par défaut)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:361
 msgid "dereference tags in the input (internal use)"
 msgstr "déréférencer les étiquettes en entrée (usage interne)"
 
@@ -9397,8 +10754,8 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "impossible de finir 'show' pour l'objet '%s'"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
-msgstr "Veuillez fournir le contenu de la note en utilisant l'option -m ou -F"
+msgid "please supply the note contents using either -m or -F option"
+msgstr "veuillez fournir le contenu de la note en utilisant l'option -m ou -F"
 
 #: builtin/notes.c:203
 msgid "unable to write note object"
@@ -9406,65 +10763,89 @@ msgstr "impossible d'écrire l'objet note"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Le contenu de la note a été laissé dans %s"
+msgid "the note contents have been left in %s"
+msgstr "le contenu de la note a été laissé dans %s"
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
 msgid "cannot read '%s'"
 msgstr "impossible de lire '%s'"
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "impossible d'ouvrir ou lire '%s'"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "impossible de résoudre '%s' comme une référence valide."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Impossible de lire l'objet '%s'."
+msgid "failed to read object '%s'."
+msgstr "impossible de lire l'objet '%s'."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "Impossible de lire les informations de note d'un objet non-blob '%s'."
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "impossible de lire les informations de note d'un objet non-blob '%s'."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "ligne en entrée malformée : '%s'."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "impossible de copier les notes de '%s' vers '%s'"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "Refus de faire %s sur des notes dans %s (hors de refs/notes/)"
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
 msgid "too many parameters"
 msgstr "trop de paramètres"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid "No note found for object %s."
-msgstr "Pas de note trouvée pour l'objet %s."
+msgid "no note found for object %s."
+msgstr "pas de note trouvée pour l'objet %s."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "contenu de la note sous forme de chaîne"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "contenu de la note dans un fichier"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "réutiliser et éditer l'objet de note spécifié"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "réutiliser l'objet de note spécifié"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "permettre de stocker une note vide"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "remplacer les notes existantes"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9473,30 +10854,30 @@ msgstr ""
 "Impossible d'ajouter des notes. Des notes ont été trouvées pour l'objet %s. "
 "Utilisez '-f' pour écraser les notes existantes"
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Écrasement des notes existantes pour l'objet %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Suppression de la note pour l'objet %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "lire les objets depuis l'entrée standard"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "charger la configuration de réécriture pour <commande> (implique --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "pas assez de paramètres"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9505,12 +10886,12 @@ msgstr ""
 "Impossible de copier des notes. Des notes ont été trouvées pour l'objet %s. "
 "Utilisez '-f' pour écraser les notes existantes"
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Notes manquantes sur l'objet source %s. Impossible de copier."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "notes manquantes sur l'objet source %s. Impossible de copier."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9519,20 +10900,52 @@ msgstr ""
 "Les options -m/-F/-c/-C sont obsolètes pour la sous-commande 'edit'.\n"
 "Veuillez utiliser 'git notes add -f -m/-F/-c/-C' à la place.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "échec de la suppression de la référence NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "échec de la suppression de la référence NOTES_MERGE_REF"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "échec de la suppression de la copie de travail 'git notes merge'"
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "échec de la lecture de la référence NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "impossible de trouver le commit de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "impossible d'analyser le commit de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "échec de la résolution de NOTES_MERGE_REF"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "impossible de finaliser la fusion de notes"
+
+#: builtin/notes.c:754
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "stratégie de fusion de notes inconnue %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:770
 msgid "General options"
 msgstr "Options générales"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:772
 msgid "Merge options"
 msgstr "Options de fusion"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:774
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9540,47 +10953,47 @@ msgstr ""
 "résoudre les conflits de notes en utilisant la stratégie donnée (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:776
 msgid "Committing unmerged notes"
 msgstr "Validation des notes non fusionnées"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:778
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "finaliser la fusion de notes en validant les notes non fusionnées"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:780
 msgid "Aborting notes merge resolution"
 msgstr "Abandon de la résolution de fusion des notes"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:782
 msgid "abort notes merge"
 msgstr "abandonner la fusion de notes"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:793
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "--commit, --abort et -s/--strategy sont mutuellement incompatibles"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
-msgstr "Vous devez spécifier une référence de notes à fusionner"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
+msgstr "vous devez spécifier une référence de notes à fusionner"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:822
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "-s/--strategy inconnu : %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:859
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Une fusion de notes dans %s est déjà en cours avec %s"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "une fusion de notes dans %s est déjà en cours avec %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:862
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
+msgid "failed to store link to current notes ref (%s)"
 msgstr ""
-"Impossible de stocker le lien vers la référence actuelle aux notes (%s)"
+"impossible de stocker le lien vers la référence actuelle aux notes (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:864
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9591,49 +11004,49 @@ msgstr ""
 "valide le résultat avec 'git notes merges --commit', ou abandonnez la fusion "
 "avec 'git notes merge --abort'.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:886
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "L'objet %s n'a pas de note\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:898
 msgid "attempt to remove non-existent note is not an error"
 msgstr ""
 "la tentative de suppression d'une note non existante n'est pas une erreur"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:901
 msgid "read object names from the standard input"
 msgstr "lire les noms d'objet depuis l'entrée standard"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "ne pas supprimer, afficher seulement"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:940
 msgid "report pruned notes"
 msgstr "afficher les notes éliminées"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:982
 msgid "notes-ref"
 msgstr "références-notes"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:983
 msgid "use notes from <notes-ref>"
 msgstr "utiliser les notes depuis <références-notes>"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1018
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Sous-commande inconnue : %s"
+msgid "unknown subcommand: %s"
+msgstr "sous-commande inconnue : %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [options...] [< <liste-références> | < <liste-"
 "objets>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
@@ -9645,185 +11058,181 @@ msgstr ""
 msgid "deflate error (%d)"
 msgstr "erreur de compression (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:770
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "désactivation de l'écriture en bitmap, les fichiers paquets sont scindés à "
 "cause de pack.packSizeLimit"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:783
 msgid "Writing objects"
 msgstr "Écriture des objets"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1063
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "désactivation de l'écriture en bitmap car certains objets ne sont pas "
 "compressés"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2426
 msgid "Compressing objects"
 msgstr "Compression des objets"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2829
 #, c-format
 msgid "unsupported index version %s"
 msgstr "version d'index non supportée %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2833
 #, c-format
 msgid "bad index version '%s'"
 msgstr "mauvaise version d'index '%s'"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2863
 msgid "do not show progress meter"
 msgstr "ne pas afficher la barre de progression"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2865
 msgid "show progress meter"
 msgstr "afficher la barre de progression"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2867
 msgid "show progress meter during object writing phase"
 msgstr "afficher la barre de progression durant la phase d'écrite des objets"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2870
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "similaire à --all-progress quand la barre de progression est affichée"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2871
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2872
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "écrire le fichier d'index du paquet dans le format d'index de version "
 "spécifié"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2875
 msgid "maximum size of each output pack file"
 msgstr "taille maximum de chaque fichier paquet en sortie"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2877
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorer les objets empruntés à un autre magasin d'objets"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2879
 msgid "ignore packed objects"
 msgstr "ignorer les objets empaquetés"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2881
 msgid "limit pack window by objects"
 msgstr "limiter la fenêtre d'empaquetage par objets"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2883
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "limiter la fenêtre d'empaquetage par mémoire en plus de la limite d'objets"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2885
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "longueur maximum de la chaîne de delta autorisée dans le paquet résultant"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2887
 msgid "reuse existing deltas"
 msgstr "réutiliser les deltas existants"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2889
 msgid "reuse existing objects"
 msgstr "réutiliser les objets existants"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2891
 msgid "use OFS_DELTA objects"
 msgstr "utiliser les objets OFS_DELTA"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2893
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "utiliser des fils lors de la recherche pour une meilleurs correspondance des "
 "deltas"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2895
 msgid "do not create an empty pack output"
 msgstr "ne pas créer un paquet vide"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2897
 msgid "read revision arguments from standard input"
 msgstr "lire les paramètres de révision depuis l'entrée standard"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2899
 msgid "limit the objects to those that are not yet packed"
 msgstr "limiter les objets à ceux qui ne sont pas encore empaquetés"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2902
 msgid "include objects reachable from any reference"
 msgstr "inclure les objets accessibles depuis toute référence"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2905
 msgid "include objects referred by reflog entries"
 msgstr "inclure les objets référencés par les éléments de reflog"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2908
 msgid "include objects referred to by the index"
 msgstr "inclure les objets référencés par l'index"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2911
 msgid "output pack to stdout"
 msgstr "afficher l'empaquetage sur la sortie standard"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2913
 msgid "include tag objects that refer to objects to be packed"
 msgstr "inclure les objets d'étiquettes qui réfèrent à des objets à empaqueter"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2915
 msgid "keep unreachable objects"
 msgstr "garder les objets inaccessibles"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2917
 msgid "pack loose unreachable objects"
 msgstr "empaqueter les objets inaccessibles détachés"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "heure"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2919
 msgid "unpack unreachable objects newer than <time>"
 msgstr "dépaqueter les objets inaccessibles plus récents que <heure>"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2922
 msgid "create thin packs"
 msgstr "créer des paquets légers"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2924
 msgid "create packs suitable for shallow fetches"
 msgstr "créer des paquets permettant des récupérations superficielles"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2926
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorer les paquets qui ont un fichier .keep"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2928
 msgid "pack compression level"
 msgstr "niveau de compression du paquet"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2930
 msgid "do not hide commits by grafts"
 msgstr "ne pas cacher les validations par greffes"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2932
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "utiliser un index en bitmap si disponible pour accélerer le décompte des "
 "objets"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2934
 msgid "write a bitmap index together with the pack index"
 msgstr "écrire un index en bitmap associé à l'index de paquet"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:3061
 msgid "Counting objects"
 msgstr "Décompte des objets"
 
@@ -9851,11 +11260,11 @@ msgstr "Suppression des objets dupliqués"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <heure>] [--] [<head>...]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "afficher les objets éliminés"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
 msgstr "faire expirer les objets plus vieux que <heure>"
 
@@ -9863,55 +11272,45 @@ msgstr "faire expirer les objets plus vieux que <heure>"
 msgid "cannot prune in a precious-objects repo"
 msgstr "impossible de nettoyer dans un dépôt d'objets précieux"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Valeur invalide pour %s : %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<options>] [<dépôt> [<spécification-de-référence>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Options relatives à la fusion"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "incorporer les modifications en rebasant plutôt qu'en fusionnant"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
 msgid "allow fast-forward"
 msgstr "autoriser l'avance rapide"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "remiser avant et réappliquer après le rebasage automatiquement"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Options relatives au rapatriement"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "nombre de sous-modules tirés en parallèle"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Valeur invalide pour pull.ff : %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-"impossible de tirer avec rebasage. Vous avez des modifications non indexées."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "De plus, votre index contient des modifications non validées."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"impossible de tirer avec rebasage : votre index contient des modifications "
-"non validées."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9919,14 +11318,14 @@ msgstr ""
 "Il n'y a pas de candidate sur laquelle rebaser parmi les références que vous "
 "venez de récupérer."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "Il n'y a pas de candidate avec laquelle fusionner parmi les références que "
 "vous venez de récupérer."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9934,7 +11333,7 @@ msgstr ""
 "Généralement, cela signifie que vous avez indiqué un spécificateur\n"
 "de référence joker qui n'a pas eu de correspondance sur le serveur distant."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9946,44 +11345,44 @@ msgstr ""
 "configuration\n"
 "pour la branche actuelle, vous devez spécifier la branche avec la commande."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Vous n'êtes actuellement sur aucune branche."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Veuillez spécifier sur quelle branche vous souhaiter rebaser."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Veuillez spécifier une branche avec laquelle fusionner."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Référez-vous à git-pull(1) pour de plus amples détails."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<distant>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<branche>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "Pas d'information de suivi distant pour la branche actuelle."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
 "Si vous souhaitez indiquer l'information de suivi distant pour cette "
 "branche, vous pouvez le faire avec :"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9993,21 +11392,29 @@ msgstr ""
 "'%s'\n"
 "du serveur distant, mais cette référence n'a pas été récupérée."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "--verify-signatures est ignoré pour un rebasage"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "l'option --[no-]autostash n'est valide qu'avec --rebase."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "Mise à jour d'une branche non encore créée avec les changements ajoutés dans "
 "l'index."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "tirer avec un rebasage"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "veuillez les valider ou les remiser."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -10018,7 +11425,7 @@ msgstr ""
 "avance rapide de votre copie de travail\n"
 "depuis le commit %s."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -10029,18 +11436,17 @@ msgid ""
 "to recover."
 msgstr ""
 "Avance rapide de votre arbre de travail impossible.\n"
-"Après vous être assuré que toute modification précieuse a été sauvegardée "
-"avec\n"
+"Après avoir vérifié que toute modification précieuse a été sauvegardée avec\n"
 "$ git diff %s\n"
 "lancez\n"
 "$ git reset --hard\n"
 "pour régénérer."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Impossible de fusionner de multiples branches sur une tête vide."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Impossible de rebaser sur de multiples branches."
 
@@ -10136,14 +11542,14 @@ msgstr ""
 "pas une branche amont de votre branche courante '%s', sans me dire\n"
 "quoi pousser pour mettre à jour quelle branche amont."
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Vous n'avez pas spécifié de spécifications de référence à pousser, et push."
 "default est \"nothing\"."
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -10158,7 +11564,7 @@ msgstr ""
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -10173,7 +11579,7 @@ msgstr ""
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -10191,13 +11597,13 @@ msgstr ""
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Les mises à jour ont été rejetées car l'étiquette existe déjà dans la "
 "branche distante."
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -10209,22 +11615,22 @@ msgstr ""
 "pointer\n"
 "vers un objet qui n'est pas un commit, sans utiliser l'option '--force'.\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Poussée vers %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "impossible de pousser des références vers '%s'"
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "mauvais dépôt '%s'"
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -10246,119 +11652,119 @@ msgstr ""
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "--all et --tags sont incompatibles"
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "--all ne peut pas être combiné avec des spécifications de référence"
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror et --tags sont incompatibles"
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror ne peut pas être combiné avec des spécifications de référence"
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "--all et --mirror sont incompatibles"
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "dépôt"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:162
 msgid "push all refs"
 msgstr "pousser toutes les références"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:164
 msgid "mirror all refs"
 msgstr "refléter toutes les références"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "supprimer les références"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr ""
 "pousser les étiquettes (ne peut pas être utilisé avec --all ou --mirror)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:165
 msgid "force updates"
 msgstr "forcer les mises à jour"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:179
 msgid "refname>:<expect"
 msgstr "nom de référence>:<attendu"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:180
 msgid "require old value of ref to be at this value"
 msgstr "exiger que l'ancienne valeur de la référence soit à cette valeur"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "contrôler la poussée récursive des sous-modules"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:173
 msgid "use thin pack"
 msgstr "utiliser un empaquetage léger"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
 msgid "receive pack program"
 msgstr "recevoir le programme d'empaquetage"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "définir la branche amont pour git pull/status"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "éliminer les références locales supprimées"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "éviter d'utiliser le crochet pre-push"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "pousser les étiquettes manquantes mais pertinentes"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:167
 msgid "GPG sign the push"
 msgstr "signer la poussée avec GPG"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:174
 msgid "request atomic transaction on remote side"
 msgstr "demande une transaction atomique sur le serveur distant"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:170
 msgid "server-specific"
 msgstr "spécifique au serveur"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:171
 msgid "option to transmit"
 msgstr "option à transmettre"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete est incompatible avec --all, --mirror et --tags"
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete n'a pas de sens sans aucune référence"
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr ""
 "les options de poussée ne peuvent pas contenir de caractères de nouvelle "
 "ligne"
 
-#: builtin/read-tree.c:37
+#: builtin/read-tree.c:40
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -10369,79 +11775,141 @@ msgstr ""
 "sparse-checkout] [--index-output=<fichier>] (--empty | <arbre ou apparenté "
 "1> [<arbre ou apparenté 2> [<arbre ou apparenté 3>]])"
 
-#: builtin/read-tree.c:110
+#: builtin/read-tree.c:130
 msgid "write resulting index to <file>"
 msgstr "écrire l'index résultant dans <fichier>"
 
-#: builtin/read-tree.c:113
+#: builtin/read-tree.c:133
 msgid "only empty the index"
 msgstr "juste vider l'index"
 
-#: builtin/read-tree.c:115
+#: builtin/read-tree.c:135
 msgid "Merging"
 msgstr "Fusion"
 
-#: builtin/read-tree.c:117
+#: builtin/read-tree.c:137
 msgid "perform a merge in addition to a read"
 msgstr "effectuer une fusion en plus d'une lecture"
 
-#: builtin/read-tree.c:119
+#: builtin/read-tree.c:139
 msgid "3-way merge if no file level merging required"
 msgstr "fusion à 3 points si aucune fusion de niveau fichier n'est requise"
 
-#: builtin/read-tree.c:121
+#: builtin/read-tree.c:141
 msgid "3-way merge in presence of adds and removes"
 msgstr "fusion à 3 points en présence d'ajouts et suppressions"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:143
 msgid "same as -m, but discard unmerged entries"
 msgstr "comme -m, mais annule les éléments non fusionnés"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:144
 msgid "<subdirectory>/"
 msgstr "<sous-répertoire>/"
 
-#: builtin/read-tree.c:125
+#: builtin/read-tree.c:145
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "lire l'arbre dans l'index dans <sous-répertoire>/"
 
-#: builtin/read-tree.c:128
+#: builtin/read-tree.c:148
 msgid "update working tree with merge result"
 msgstr "mettre à jour la copie de travail avec le résultat de la fusion"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:150
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:131
+#: builtin/read-tree.c:151
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "autoriser explicitement les fichiers ignorés à être écrasés"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:154
 msgid "don't check the working tree after merging"
 msgstr "ne pas vérifier la copie de travail après la fusion"
 
-#: builtin/read-tree.c:135
+#: builtin/read-tree.c:155
 msgid "don't update the index or the work tree"
 msgstr "ne pas mettre à jour l'index ou la copie de travail"
 
-#: builtin/read-tree.c:137
+#: builtin/read-tree.c:157
 msgid "skip applying sparse checkout filter"
 msgstr "sauter l'application du filtre d'extraction creuse"
 
-#: builtin/read-tree.c:139
+#: builtin/read-tree.c:159
 msgid "debug unpack-trees"
 msgstr "déboguer unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase-helper [<options>]"
+
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "continuer le rebasage"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "abandonner le rebasage"
+
+#: builtin/receive-pack.c:27
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <répertoire-git>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Par défaut, mettre à jour la branche actuelle dans un dépôt non-nu\n"
+"est réfusé parce que cela rendrait l'index et la copie de travail\n"
+"inconsistants avec ce que vous avez poussé et nécessiterait\n"
+"'git reset --hard' pour réaligner la copie de travail avec HEAD.\n"
+"\n"
+"Vous pouvez régler « receive.denyCurrentBranch » à 'ignore' ou\n"
+"'warn' dans le dépôt distant pour permettre la poussée dans la\n"
+"branche actuelle ; cependant, ce n'est pas recommandé à moins que\n"
+"vous ayez déjà mis à jour sa copie de travail par une moyen détourné\n"
+"pour correspondre à ce que vous avez poussé.\n"
+"\n"
+"Pour éliminer ce message et conserver le comportement par défaut,\n"
+"réglez « receive.denyCurrentBranch » à 'refuse'."
+
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Par défaut, supprimer la branche actuelle est refusé parce que le\n"
+"prochain 'git clone' n'extraira aucun fichier et causer de la confusion.\n"
+"\n"
+"Vous pouvez régler « receive.denyDeleteCurrent » à 'warn' ou 'ignore'\n"
+"dans le dépôt distant pour permettre la suppression la branche actuelle\n"
+"avec ou sans message d'avertissement.\n"
+"\n"
+"Pour éliminer ce message, réglez-le à 'refuse'."
+
+#: builtin/receive-pack.c:1888
 msgid "quiet"
 msgstr "quiet"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1902
 msgid "You must specify a directory."
 msgstr "Vous devez spécifier un répertoire."
 
@@ -10626,7 +12094,7 @@ msgstr "(correspond)"
 msgid "(delete)"
 msgstr "(supprimer)"
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
 #, c-format
 msgid "No such remote: %s"
 msgstr "Distante inconnue : %s"
@@ -10657,7 +12125,7 @@ msgstr "échec de suppression de '%s'"
 msgid "creating '%s' failed"
 msgstr "échec de création de '%s'"
 
-#: builtin/remote.c:792
+#: builtin/remote.c:794
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -10672,137 +12140,137 @@ msgstr[1] ""
 "supprimées ;\n"
 "pour les supprimer, utilisez :"
 
-#: builtin/remote.c:806
+#: builtin/remote.c:808
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Impossible de supprimer la section de configuration '%s'"
 
-#: builtin/remote.c:907
+#: builtin/remote.c:909
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nouveau (le prochain rapatriement (fetch) stockera dans remotes/%s)"
 
-#: builtin/remote.c:910
+#: builtin/remote.c:912
 msgid " tracked"
 msgstr " suivi"
 
-#: builtin/remote.c:912
+#: builtin/remote.c:914
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " dépassé (utilisez 'git remote prune' pour supprimer)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:916
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:955
+#: builtin/remote.c:957
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "branch.%s.merge invalide ; ne peut pas rebaser sur plus d'une branche"
 
-#: builtin/remote.c:963
+#: builtin/remote.c:965
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "rebase de manière interactive sur la distante %s"
 
-#: builtin/remote.c:964
+#: builtin/remote.c:966
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "rebase sur la distante %s"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:969
 #, c-format
 msgid " merges with remote %s"
 msgstr " fusionne avec la distante %s"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:972
 #, c-format
 msgid "merges with remote %s"
 msgstr "fusionne avec la distante %s"
 
-#: builtin/remote.c:973
+#: builtin/remote.c:975
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s    et avec la distante %s\n"
 
-#: builtin/remote.c:1016
+#: builtin/remote.c:1018
 msgid "create"
 msgstr "créer"
 
-#: builtin/remote.c:1019
+#: builtin/remote.c:1021
 msgid "delete"
 msgstr "supprimer"
 
-#: builtin/remote.c:1023
+#: builtin/remote.c:1025
 msgid "up to date"
 msgstr "à jour"
 
-#: builtin/remote.c:1026
+#: builtin/remote.c:1028
 msgid "fast-forwardable"
 msgstr "peut être mis à jour en avance rapide"
 
-#: builtin/remote.c:1029
+#: builtin/remote.c:1031
 msgid "local out of date"
 msgstr "le local n'est pas à jour"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1038
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s force vers %-*s (%s)"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s pousse vers %-*s (%s)"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1045
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s force vers %s"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s pousse vers %s"
 
-#: builtin/remote.c:1114
+#: builtin/remote.c:1116
 msgid "do not query remotes"
 msgstr "ne pas interroger les distantes"
 
-#: builtin/remote.c:1141
+#: builtin/remote.c:1143
 #, c-format
 msgid "* remote %s"
 msgstr "* distante %s"
 
-#: builtin/remote.c:1142
+#: builtin/remote.c:1144
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL de rapatriement : %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
 msgid "(no URL)"
 msgstr "(pas d'URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL push : %s"
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Branche HEAD : %s"
 
-#: builtin/remote.c:1158
+#: builtin/remote.c:1160
 msgid "(not queried)"
 msgstr "(non demandé)"
 
-#: builtin/remote.c:1160
+#: builtin/remote.c:1162
 msgid "(unknown)"
 msgstr "(inconnu)"
 
-#: builtin/remote.c:1164
+#: builtin/remote.c:1166
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -10810,243 +12278,257 @@ msgstr ""
 "  Branche HEAD (la HEAD distante est ambiguë, peut être l'une des "
 "suivantes) :\n"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1178
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branche distante :%s"
 msgstr[1] "  Branches distantes :%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1181 builtin/remote.c:1207
 msgid " (status not queried)"
 msgstr " (statut non demandé)"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1190
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Branche locale configurée pour 'git pull' :"
 msgstr[1] "  Branches locales configurées pour 'git pull' :"
 
-#: builtin/remote.c:1196
+#: builtin/remote.c:1198
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Les références locales seront reflétées par 'git push'"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1204
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Référence locale configurée pour 'git push'%s :"
 msgstr[1] "  Références locales configurées pour 'git push'%s :"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1225
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "définir refs/remotes/<nom>/HEAD selon la distante"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1227
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "supprimer refs/remotes/<nom>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1242
 msgid "Cannot determine remote HEAD"
 msgstr "Impossible de déterminer la HEAD distante"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1244
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Il y a de multiples branches HEAD distantes. Veuillez en choisir une "
 "explicitement avec :"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1254
 #, c-format
 msgid "Could not delete %s"
 msgstr "Impossible de supprimer %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1262
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Référence non valide : %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1264
 #, c-format
 msgid "Could not setup %s"
 msgstr "Impossible de paramétrer %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1282
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s se retrouvera en suspens !"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1283
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s se retrouve en suspens !"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1293
 #, c-format
 msgid "Pruning %s"
 msgstr "Élimination de %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1294
 #, c-format
 msgid "URL: %s"
 msgstr "URL : %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1310
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [serait éliminé] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1313
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [éliminé] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1358
 msgid "prune remotes after fetching"
 msgstr "éliminer les distants après le rapatriement"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Pas de serveur remote '%s'"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1437
 msgid "add branch"
 msgstr "ajouter une branche"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1444
 msgid "no remote specified"
 msgstr "pas de serveur distant spécifié"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1461
 msgid "query push URLs rather than fetch URLs"
 msgstr "interroger les URLs de poussée plutôt que les URLs de récupération"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1463
 msgid "return all URLs"
 msgstr "retourner toutes les URLs"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1491
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "aucune URL configurée pour le dépôt distant '%s'"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1517
 msgid "manipulate push URLs"
 msgstr "manipuler les URLs push"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1519
 msgid "add URL"
 msgstr "ajouter une URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1521
 msgid "delete URLs"
 msgstr "supprimer des URLs"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1528
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete n'a aucun sens"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1569
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Motif d'URL ancien invalide : %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1577
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Pas d'URL trouvée : %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1579
 msgid "Will not delete all non-push URLs"
 msgstr "Pas de suppression de toutes les URLs non-push"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1593
 msgid "be verbose; must be placed before a subcommand"
 msgstr "être verbeux : doit être placé avant une sous-commande"
 
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Sous-commande inconnue : %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<options>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"Les repaquetages incrémentaux sont incompatibles avec les index bitmap. "
+"Utilisez\n"
+"--no-write-bitmap-index ou désactivez le paramètre pack.writebitmaps."
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "empaqueter tout dans un seul paquet"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "identique à -a et transformer les objets inaccessibles en suspens"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "supprimer les paquets redondants et lancer git-prune-packed"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passer --no-reuse-delta à git-pack-objects"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passer --no-reuse-object à git-pack-objects"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "ne pas lancer git update-server-info"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "passer --local à git-pack-objects"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "écrire un index en bitmap"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "date approximative"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr "avec -A, ne pas suspendre les objets plus vieux que celui-ci"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "avec -a, repaquétiser les objets inaccessibles"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
 msgstr "taille de la fenêtre utilisée pour la compression des deltas"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "octets"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "idem ci-dessus, mais limiter la taille mémoire au lieu du nombre d'éléments"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
 msgstr "limite la profondeur maximale des deltas"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "taille maximum de chaque fichier paquet"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr "réempaqueter les objets dans des paquets marqués avec .keep"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "impossible de supprimer les paquets dans un dépôt d'objets précieux"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable et -A sont incompatibles"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "échec de la suppression de '%s'"
@@ -11071,22 +12553,22 @@ msgstr "git replace -d <objet>..."
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<format>] [-l [<motif>]]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
 #, c-format
 msgid "Not a valid object name: '%s'"
 msgstr "Nom d'objet invalide : '%s'"
 
-#: builtin/replace.c:355
+#: builtin/replace.c:360
 #, c-format
 msgid "bad mergetag in commit '%s'"
 msgstr "mauvaise étiquette de fusion dans le commit '%s'"
 
-#: builtin/replace.c:357
+#: builtin/replace.c:362
 #, c-format
 msgid "malformed mergetag in commit '%s'"
 msgstr "étiquette de fusion malformée dans le commit '%s'"
 
-#: builtin/replace.c:368
+#: builtin/replace.c:373
 #, c-format
 msgid ""
 "original commit '%s' contains mergetag '%s' that is discarded; use --edit "
@@ -11095,45 +12577,45 @@ msgstr ""
 "le commit original '%s' contient l'étiquette de fusion '%s' qui a disparu ; "
 "utilisez --edit au lieu de --graft"
 
-#: builtin/replace.c:401
+#: builtin/replace.c:406
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
 msgstr "le commit original '%s' contient une signature GPG."
 
-#: builtin/replace.c:402
+#: builtin/replace.c:407
 msgid "the signature will be removed in the replacement commit!"
 msgstr "la signature sera éliminée dans la validation de remplacement !"
 
-#: builtin/replace.c:408
+#: builtin/replace.c:413
 #, c-format
 msgid "could not write replacement commit for: '%s'"
 msgstr "Impossible d'écrire le commit de remplacement pour '%s'"
 
-#: builtin/replace.c:432
+#: builtin/replace.c:437
 msgid "list replace refs"
 msgstr "afficher les références de remplacement"
 
-#: builtin/replace.c:433
+#: builtin/replace.c:438
 msgid "delete replace refs"
 msgstr "supprimer les références de remplacement"
 
-#: builtin/replace.c:434
+#: builtin/replace.c:439
 msgid "edit existing object"
 msgstr "éditer l'objet existant"
 
-#: builtin/replace.c:435
+#: builtin/replace.c:440
 msgid "change a commit's parents"
 msgstr "Modifier les parents d'un commit"
 
-#: builtin/replace.c:436
+#: builtin/replace.c:441
 msgid "replace the ref if it exists"
 msgstr "remplacer la référence si elle existe"
 
-#: builtin/replace.c:437
+#: builtin/replace.c:442
 msgid "do not pretty-print contents for --edit"
 msgstr "afficher sans mise en forme pour --edit"
 
-#: builtin/replace.c:438
+#: builtin/replace.c:443
 msgid "use this format"
 msgstr "utiliser ce format"
 
@@ -11153,8 +12635,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <arbre ou apparenté> [--] <chemins>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<arbre ou apparenté>] [--] <chemins>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11276,27 +12758,27 @@ msgstr "Impossible de réinitialiser le fichier d'index à la révision '%s'."
 msgid "Could not write new index file."
 msgstr "Impossible d'écrire le nouveau fichier d'index."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list ne supporte l'affichage des notes"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:393
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<options>] -- [<arguments>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:398
 msgid "keep the `--` passed as an arg"
 msgstr "garder le `--` passé en argument"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:400
 msgid "stop parsing after the first non-option argument"
 msgstr "arrêt de l'analyse après le premier argument qui n'est pas une option"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:403
 msgid "output in stuck long form"
 msgstr "sortie en forme longue fixée"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:534
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11327,68 +12809,72 @@ msgstr "git cherry-pick [<options>] <commit ou apparenté>..."
 msgid "git cherry-pick <subcommand>"
 msgstr "git cherry-pick <sous-commande>"
 
-#: builtin/revert.c:71
+#: builtin/revert.c:89
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s : %s ne peut pas être utilisé avec %s"
 
-#: builtin/revert.c:80
+#: builtin/revert.c:98
 msgid "end revert or cherry-pick sequence"
 msgstr "mettre fin au retour ou picorage"
 
-#: builtin/revert.c:81
+#: builtin/revert.c:99
 msgid "resume revert or cherry-pick sequence"
 msgstr "reprendre le retour ou picorage"
 
-#: builtin/revert.c:82
+#: builtin/revert.c:100
 msgid "cancel revert or cherry-pick sequence"
 msgstr "annuler le retour ou picorage"
 
-#: builtin/revert.c:83
+#: builtin/revert.c:101
 msgid "don't automatically commit"
 msgstr "ne pas valider automatiquement"
 
-#: builtin/revert.c:84
+#: builtin/revert.c:102
 msgid "edit the commit message"
 msgstr "éditer le message de validation"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "numéro de parent"
+#: builtin/revert.c:105
+msgid "parent-number"
+msgstr "numéro-de-parent"
 
-#: builtin/revert.c:89
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "sélectionner le parent principal"
+
+#: builtin/revert.c:108
 msgid "merge strategy"
 msgstr "stratégie de fusion"
 
-#: builtin/revert.c:90
+#: builtin/revert.c:109
 msgid "option"
 msgstr "option"
 
-#: builtin/revert.c:91
+#: builtin/revert.c:110
 msgid "option for merge strategy"
 msgstr "option pour la stratégie de fusion"
 
-#: builtin/revert.c:100
+#: builtin/revert.c:119
 msgid "append commit name"
 msgstr "ajouter le nom de validation"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:121
 msgid "preserve initially empty commits"
 msgstr "préserver les validations vides initialement"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:122
 msgid "allow commits with empty messages"
 msgstr "autoriser les validations avec des messages vides"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:123
 msgid "keep redundant, empty commits"
 msgstr "garder les validations redondantes, vides"
 
-#: builtin/revert.c:192
+#: builtin/revert.c:211
 msgid "revert failed"
 msgstr "revert a échoué"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:224
 msgid "cherry-pick failed"
 msgstr "le picorage a échoué"
 
@@ -11396,30 +12882,7 @@ msgstr "le picorage a échoué"
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<options>] [--] <fichier>..."
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"le sous-module suivant (ou un de ses sous-modules imbriqués)\n"
-"utilise un répertoire .git :"
-msgstr[1] ""
-"les sous-modules suivants (ou un de leurs sous-modules imbriqués)\n"
-"utilisent un répertoire .git :"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
-"historique)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11433,7 +12896,7 @@ msgstr[1] ""
 "les fichiers suivants ont du contenu indexé différent\n"
 "du fichier et de HEAD :"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11441,13 +12904,13 @@ msgstr ""
 "\n"
 "(utilisez -f pour forcer la suppression)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
 msgstr[0] "le fichier suivant a des changements indexés :"
 msgstr[1] "les fichiers suivants ont des changements indexés :"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11455,42 +12918,47 @@ msgstr ""
 "\n"
 "(utilisez --cached pour garder le fichier, ou -f pour forcer la suppression)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "le fichier suivant a des modifications locales :"
 msgstr[1] "les fichiers suivants ont des modifications locales :"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "ne pas afficher les fichiers supprimés"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "supprimer seulement de l'index"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "outrepasser la vérification des fichiers à jour"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "autoriser la suppression récursive"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "sortir avec un statut zéro même si rien ne correspondait"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "pas de suppression récursive de '%s' sans -r"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm : impossible de supprimer %s"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "impossible de supprimer '%s'"
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11504,19 +12972,19 @@ msgstr ""
 "  --all et la spécification explicite de <référence> sont mutuellement "
 "exclusifs."
 
-#: builtin/send-pack.c:160
+#: builtin/send-pack.c:161
 msgid "remote name"
 msgstr "nom distant"
 
-#: builtin/send-pack.c:171
+#: builtin/send-pack.c:175
 msgid "use stateless RPC protocol"
 msgstr "utiliser un protocole RPC sans état"
 
-#: builtin/send-pack.c:172
+#: builtin/send-pack.c:176
 msgid "read refs from stdin"
 msgstr "lire les références depuis l'entrée standard"
 
-#: builtin/send-pack.c:173
+#: builtin/send-pack.c:177
 msgid "print status from remote helper"
 msgstr "afficher les messages du greffon de protocole distant"
 
@@ -11524,25 +12992,29 @@ msgstr "afficher les messages du greffon de protocole distant"
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [<options>] [<intervalle-révisions>] [[--] [<chemin>...]]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr "Grouper par validateur plutôt que par auteur"
+
+#: builtin/shortlog.c:250
 msgid "sort output according to the number of commits per author"
 msgstr "trier la sortie sur le nombre de validations par auteur"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:252
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr ""
 "Supprimer les descriptions de validation, fournit seulement le nombre de "
 "validations"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:254
 msgid "Show the email address of each author"
 msgstr "Afficher l'adresse e-mail de chaque auteur"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:255
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:256
 msgid "Linewrap output"
 msgstr "Couper les lignes"
 
@@ -11562,72 +13034,128 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<référence>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "%s ignoré; impossible de gérer plus de %d référence"
+msgstr[1] "%s ignoré; impossible de gérer plus de %d références"
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr "aucune référence correspond à %s"
+
+#: builtin/show-branch.c:632
 msgid "show remote-tracking and local branches"
 msgstr "afficher les branches de suivi distantes et les branches locales"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:634
 msgid "show remote-tracking branches"
 msgstr "afficher les branches de suivi distantes"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:636
 msgid "color '*!+-' corresponding to the branch"
 msgstr "couleur '*!+-' correspondant à la branche"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:638
 msgid "show <n> more commits after the common ancestor"
 msgstr "afficher <n> validations de plus après l'ancêtre commun"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:640
 msgid "synonym to more=-1"
 msgstr "synonyme de more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:641
 msgid "suppress naming strings"
 msgstr "supprimer les chaînes de nommage"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:643
 msgid "include the current branch"
 msgstr "inclure la branche courante"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:645
 msgid "name commits with their object names"
 msgstr "nommer les validations avec leurs noms d'objet"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:647
 msgid "show possible merge bases"
 msgstr "afficher les bases possibles de fusion"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:649
 msgid "show refs unreachable from any other ref"
 msgstr "afficher les références inaccessibles depuis toute autre référence"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:651
 msgid "show commits in topological order"
 msgstr "afficher les validations dans l'ordre topologique"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:654
 msgid "show only commits not on the first branch"
 msgstr ""
 "afficher seulement les validations qui ne sont pas sur la première branche"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:656
 msgid "show merges reachable from only one tip"
 msgstr "afficher les fusions accessibles depuis une seule pointe"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:658
 msgid "topologically sort, maintaining date order where possible"
 msgstr "tri topologique, maintenant l'ordre par date si possible"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:661
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:662
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr ""
 "afficher les <n> plus récents éléments de ref-log en commençant à la base"
 
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog est incompatible avec --all, --remotes, --independant et --merge-"
+"base"
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "aucune branche spécifiée, et HEAD est invalide"
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "--reflog requiert un nom de branche"
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "%d entrée seulement ne peut être montrée en même temps."
+msgstr[1] "%d entrées seulement ne peuvent être montrée en même temps."
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr "référence inexistante %s"
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "impossible de gérer plus de %d révision."
+msgstr[1] "impossible de gérer plus de %d révisions."
+
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' n'est pas une référence valide."
+
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "impossible de trouver le commit %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11640,38 +13168,38 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<motif>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "afficher seulement les étiquettes (peut être combiné avec heads)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "afficher seulement les têtes (peut être combiné avec tags)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 "vérification de référence plus stricte, nécessite un chemin de référence "
 "exact"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "afficher la référence HEAD, même si elle serait filtrée"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
 msgstr "déréférencer les étiquettes en IDs d'objet"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "afficher seulement le hachage SHA1 en utilisant <n> chiffres"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 "ne pas afficher les résultats sur la sortie standard (pratique avec --verify)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 "afficher les références de l'entrée standard qui ne sont pas dans le dépôt "
@@ -11695,12 +13223,12 @@ msgstr ""
 msgid "prepend comment character and space to each line"
 msgstr "ajouter devant chaque ligne le caractère de commentaire et un espace"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
 msgid "No such ref: %s"
 msgstr "Référence inexistante : %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Nom de référence complet attendu, %s obtenu"
@@ -11710,80 +13238,108 @@ msgstr "Nom de référence complet attendu, %s obtenu"
 msgid "cannot strip one component off url '%s'"
 msgstr "impossible de supprimer un composant de l'URL '%s'"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
 msgid "alternative anchor for relative paths"
 msgstr "ancre alternative pour les chemins relatifs"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:310
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<chemin>] [<chemin>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "URL non trouvée pour le chemin de sous-module '%s' dans .gitmodules"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr ""
+"impossible de trouver la configuration '%s'. Ce dépôt est considéré comme "
+"son propre amont d'autorité."
+
+#: builtin/submodule--helper.c:406
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "Échec d'enregistrement de l'URL pour le chemin de sous-module '%s'"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:410
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Sous-module '%s' (%s) enregistré pour le chemin '%s'\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:420
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr ""
 "attention : nous vous suggérons de spécifier une commande de mode de mise à "
 "jour pour le sous-module '%s'\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:427
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr ""
 "Échec d'enregistrement du mode de mise à jour pour le chemin de sous-module "
 "'%s'"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:443
 msgid "Suppress output for initializing a submodule"
 msgstr "Supprimer la sortie lors de l'initialisation d'un sous-module"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:448
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<chemin>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:476
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper <nom> <chemin>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:482
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr ""
 "Pas de mise en correspondance du sous-module trouvé dans .gitmodules pour le "
 "chemin '%s'"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "le sous-module '%s' ne peut pas ajouter d'alternative : %s"
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr ""
+"La valeur '%s' pour submodule.alternateErrorStrategy n'est pas reconnue"
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "La valeur '%s' pour submodule.alternateLocation n'est pas reconnue"
+
+#: builtin/submodule--helper.c:633
 msgid "where the new submodule will be cloned to"
 msgstr "emplacement où le sous-module sera cloné"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:636
 msgid "name of the new submodule"
 msgstr "nom du nouveau sous-module"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:639
 msgid "url where to clone the submodule from"
 msgstr "URL depuis laquelle cloner le sous-module"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:645
 msgid "depth for shallow clones"
 msgstr "profondeur de l'historique des clones superficiels"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "forcer l'affichage de la progression du clonage"
+
+#: builtin/submodule--helper.c:653
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11791,98 +13347,83 @@ msgstr ""
 "git submodule--helper clone [--prefix=<chemin>] [--quiet] [--reference "
 "<dépôt>] [--name <nom>] [--depth <profondeur>]  --url <url> --path <chemin>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "impossible de créer le répertoire '%s'"
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:684
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "Le clonage de '%s' dans le chemin de sous-module '%s' a échoué"
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "impossible d'ouvrir le fichier '%s'"
-
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
-msgstr "impossible de fermer le fichier %s"
-
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:699
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "impossible de créer le répertoire de sous-module pour '%s'"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:764
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Le chemin de sous-module '%s' n'est pas initialisé"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:768
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Vous voudriez sûrement utiliser 'update --init' ?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Sous-module non fusionné %s non traité"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:814
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Sous-module '%s' non traité"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:942
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "Impossible de cloner '%s'. Réessai prévu"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:953
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "Impossible de cloner '%s' pour la seconde fois, abandon"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
 msgid "path into the working tree"
 msgstr "chemin dans la copie de travail"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:977
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr ""
 "chemin dans la copie de travail, traversant les frontières de sous-modules"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:981
 msgid "rebase, merge, checkout or none"
 msgstr "valeurs possibles : rebase, merge, checkout ou none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:985
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "Créer un clone superficiel tronqué au nombre de révisions spécifié"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:988
 msgid "parallel jobs"
 msgstr "jobs parallèles"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:990
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "spécifie si le clonage initial doit être aussi superficiel"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:991
 msgid "don't print cloning progress"
 msgstr "ne pas afficher la progression du clonage"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:998
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<chemin>] [<chemin>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:1008
 msgid "bad value for update parameter"
 msgstr "valeur invalide pour la mise à jour du paramètre"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1079
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11891,12 +13432,25 @@ msgstr ""
 "la branche du sous-module %s est configurée pour hériter de la branche du "
 "superprojet, mais le superprojet n'est sur aucune branche"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "parcourir récursivement les sous-modules"
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir [<chemin>...]"
+
+#: builtin/submodule--helper.c:1226
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr ""
 "la sous-commande submodule--helper doit être appelée avec une sous-commande"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s ne gère pas --super-prefix"
+
+#: builtin/submodule--helper.c:1239
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' n'est pas une sous-commande valide de submodule--helper"
@@ -11944,32 +13498,29 @@ msgstr "git tag -d <nométiquette>..."
 
 #: builtin/tag.c:25
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <objet>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <objet>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<motif>...]"
 
 #: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <nométiquette>..."
-
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "nom d'étiquette trop long : %.*s..."
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<format>] <nométiquette>..."
 
-#: builtin/tag.c:86
+#: builtin/tag.c:83
 #, c-format
 msgid "tag '%s' not found."
 msgstr "étiquette '%s' non trouvée."
 
-#: builtin/tag.c:101
+#: builtin/tag.c:99
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Étiquette '%s' supprimée (elle était sur %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:128
 #, c-format
 msgid ""
 "\n"
@@ -11982,7 +13533,7 @@ msgstr ""
 "  %s\n"
 "Les lignes commençant par '%c' seront ignorées.\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:132
 #, c-format
 msgid ""
 "\n"
@@ -11997,143 +13548,148 @@ msgstr ""
 "Les lignes commençant par '%c' seront gardées ; vous pouvez les retirer vous-"
 "même si vous le souhaitez.\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:210
 msgid "unable to sign the tag"
 msgstr "impossible de signer l'étiquette"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:212
 msgid "unable to write tag file"
 msgstr "impossible d'écrire le fichier d'étiquettes"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:236
 msgid "bad object type."
 msgstr "mauvais type d'objet."
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "en-tête d'étiquette trop gros."
-
-#: builtin/tag.c:275
+#: builtin/tag.c:282
 msgid "no tag message?"
 msgstr "pas de message pour l'étiquette ?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:289
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Le message pour l'étiquette a été laissé dans %s\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:397
 msgid "list tag names"
 msgstr "afficher les noms des étiquettes"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:399
 msgid "print <n> lines of each tag message"
 msgstr "affiche <n> lignes de chaque message d'étiquette"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:401
 msgid "delete tags"
 msgstr "supprimer des étiquettes"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:402
 msgid "verify tags"
 msgstr "vérifier des étiquettes"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:404
 msgid "Tag creation options"
 msgstr "Options de création de l'étiquette"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:406
 msgid "annotated tag, needs a message"
 msgstr "étiquette annotée, nécessite un message"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:408
 msgid "tag message"
 msgstr "message pour l'étiquette"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:410
 msgid "annotated and GPG-signed tag"
 msgstr "étiquette annotée et signée avec GPG"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:414
 msgid "use another key to sign the tag"
 msgstr "utiliser une autre clé pour signer l'étiquette"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:415
 msgid "replace the tag if exists"
 msgstr "remplacer l'étiquette si elle existe"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:416 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "créer un reflog"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:418
 msgid "Tag listing options"
 msgstr "Options d'affichage des étiquettes"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:419
 msgid "show tag list in columns"
 msgstr "afficher la liste des étiquettes sous forme de colonnes"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:420 builtin/tag.c:422
 msgid "print only tags that contain the commit"
 msgstr "afficher seulement les étiquettes qui contiennent la validation"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "afficher seulement les étiquettes qui ne contiennent pas la validation"
+
+#: builtin/tag.c:424
 msgid "print only tags that are merged"
 msgstr "afficher seulement les étiquettes qui sont fusionnées"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:425
 msgid "print only tags that are not merged"
 msgstr "afficher seulement les étiquettes qui ne sont pas fusionnées"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:430
 msgid "print only tags of the object"
 msgstr "afficher seulement les étiquettes de l'objet"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:469
 msgid "--column and -n are incompatible"
 msgstr "--column et -n sont incompatibles"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "l'option -n est autorisée seulement avec -l."
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "l'option -n est autorisée seulement en mode de liste"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "l'option --contains est autorisée seulement avec -l."
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "l'option --contains est autorisée seulement en mode de liste"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "l'option --points-at est autorisée seulement avec -l."
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "l'option --contains est autorisée seulement en mode liste"
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "les options --merged et --no-merged ne sont autorisées qu'avec -l"
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "l'option --points-at est autorisée seulement en mode liste"
+
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr ""
+"les options --merged et --no-merged ne sont autorisées qu'en mode liste"
 
-#: builtin/tag.c:433
+#: builtin/tag.c:510
 msgid "only one -F or -m option is allowed."
 msgstr "une seule option -F ou -m est autorisée."
 
-#: builtin/tag.c:452
+#: builtin/tag.c:529
 msgid "too many params"
 msgstr "trop de paramètres"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:535
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' n'est pas un nom d'étiquette valide."
 
-#: builtin/tag.c:463
+#: builtin/tag.c:540
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'étiquette '%s' existe déjà"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:570
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Étiquette '%s' mise à jour (elle était sur %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "Dépaquetage des objets"
 
@@ -12157,182 +13713,214 @@ msgstr "échec de la création du fichier %s"
 msgid "failed to delete file %s"
 msgstr "échec de la suppression du fichier %s"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/update-index.c:110 builtin/update-index.c:216
 #, c-format
 msgid "failed to delete directory %s"
 msgstr "échec de la suppression du répertoire %s"
 
-#: builtin/update-index.c:133
+#: builtin/update-index.c:135
 #, c-format
 msgid "Testing mtime in '%s' "
 msgstr "Test du mtime dans '%s' "
 
-#: builtin/update-index.c:145
+#: builtin/update-index.c:149
 msgid "directory stat info does not change after adding a new file"
 msgstr ""
 "l'information de stat du répertoire ne change pas après ajout d'un fichier"
 
-#: builtin/update-index.c:158
+#: builtin/update-index.c:162
 msgid "directory stat info does not change after adding a new directory"
 msgstr ""
 "l'information de stat du répertoire ne change pas après ajout d'un répertoire"
 
-#: builtin/update-index.c:171
+#: builtin/update-index.c:175
 msgid "directory stat info changes after updating a file"
 msgstr ""
 "l'information de stat du répertoire change après mise à jour d'un fichier"
 
-#: builtin/update-index.c:182
+#: builtin/update-index.c:186
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 "l'information de stat du répertoire change après l'ajout d'un fichier dans "
 "un sous-répertoire"
 
-#: builtin/update-index.c:193
+#: builtin/update-index.c:197
 msgid "directory stat info does not change after deleting a file"
 msgstr ""
 "l'information de stat du répertoire ne change pas après la suppression d'un "
 "fichier<"
 
-#: builtin/update-index.c:206
+#: builtin/update-index.c:210
 msgid "directory stat info does not change after deleting a directory"
 msgstr ""
 "l'information de stat du répertoire ne change pas après la suppression d'un "
 "répertoire"
 
-#: builtin/update-index.c:213
+#: builtin/update-index.c:217
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:568
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<options>] [--] [<fichier>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:923
 msgid "continue refresh even when index needs update"
 msgstr "continuer de rafraîchir même si l'index a besoin d'une mise à jour"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:926
 msgid "refresh: ignore submodules"
 msgstr "rafraîchir : ignorer les sous-modules"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:929
 msgid "do not ignore new files"
 msgstr "ne pas ignorer les nouveaux fichiers"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:931
 msgid "let files replace directories and vice-versa"
 msgstr "laisser les fichiers remplacer des répertoires et vice-versa"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:933
 msgid "notice files missing from worktree"
 msgstr "aviser des fichiers manquants dans la copie de travail"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:935
 msgid "refresh even if index contains unmerged entries"
 msgstr "rafraîchir même si l'index contient des éléments non fusionnés"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:938
 msgid "refresh stat information"
 msgstr "rafraîchir l'information de stat"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:942
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "comme --refresh, mais en ignorant l'option assume-unchanged"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:946
 msgid "<mode>,<object>,<path>"
 msgstr "<mode>, <objet>, <chemin>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:947
 msgid "add the specified entry to the index"
 msgstr "ajouter l'élément spécifié dans l'index"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:956
 msgid "mark files as \"not changing\""
 msgstr "marquer les fichiers comme \"non changeants\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:959
 msgid "clear assumed-unchanged bit"
 msgstr "mettre à zéro le bit supposé-non-modifié"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:962
 msgid "mark files as \"index-only\""
 msgstr "marquer les fichiers comme \"index seulement\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:965
 msgid "clear skip-worktree bit"
 msgstr "mettre à zéro le bit sauter-la-copie-de travail"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:968
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "ajouter seulement à l'index ; ne pas ajouter le contenu dans la base de "
 "données des objets"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:970
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "supprimer les chemins nommés même s'ils sont présents dans la copie de "
 "travail"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:972
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "avec --stdin : les lignes en entrée sont terminées par des octets nuls"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:974
 msgid "read list of paths to be updated from standard input"
 msgstr "lire la liste des chemins à mettre à jour depuis l'entrée standard"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:978
 msgid "add entries from standard input to the index"
 msgstr "ajouter les éléments depuis l'entrée standard à l'index"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:982
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "repeupler les étapes n°2 et n°3 pour les chemins listés"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:986
 msgid "only update entries that differ from HEAD"
 msgstr "mettre à jour seulement les éléments qui diffèrent de HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:990
 msgid "ignore files missing from worktree"
 msgstr "ignorer les fichiers manquants dans la copie de travail"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:993
 msgid "report actions to standard output"
 msgstr "afficher les actions sur la sortie standard"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:995
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(pour porcelaines) oublier les conflits sauvés et non résolus"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:999
 msgid "write index in this format"
 msgstr "écrire l'index dans ce format"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:1001
 msgid "enable or disable split index"
 msgstr "activer ou désactiver l'index divisé"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:1003
 msgid "enable/disable untracked cache"
 msgstr "activer ou désactiver le cache de non-suivis"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1005
 msgid "test if the filesystem supports untracked cache"
 msgstr "tester si le système de fichier supporte le cache de non-suivis"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1007
 msgid "enable untracked cache without testing the filesystem"
 msgstr "activer le cache de non-suivis sans tester le système de fichier"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+"core.splitIndex est réglé à false ; supprimez-le ou changez-le si vous "
+"souhaitez vraiment activer l'index coupé"
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"core.splitIndex est réglé à vrai ; supprimez-le ou changez-le si vous "
+"souhaitez vraiment désactiver l'index coupé"
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache est réglé à true ; supprimez-le ou changez-le si vous "
+"souhaitez vraiment désactiver le cache des fichiers non-suivis"
+
+#: builtin/update-index.c:1131
 msgid "Untracked cache disabled"
 msgstr "Le cache non suivi est désactivé"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache est réglé à false ; supprimez-le ou changez-le si vous "
+"souhaitez vraiment activer le cache des fichiers non-suivis"
+
+#: builtin/update-index.c:1143
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Le cache non suivi est activé pour '%s'"
@@ -12383,7 +13971,7 @@ msgstr "git verify-commit [-v | --verbose] <commit>..."
 msgid "print commit contents"
 msgstr "afficher le contenu du commit"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "afficher les messages bruts de gpg"
 
@@ -12399,11 +13987,11 @@ msgstr "verbeux"
 msgid "show statistics only"
 msgstr "afficher seulement les statistiques"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <étiquette>..."
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<format>] <étiquette>..."
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "afficher le contenu de l'étiquette"
 
@@ -12427,96 +14015,108 @@ msgstr "git worktree prune [<options>]"
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock <chemin>"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:43
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Suppression de worktrees/%s : répertoire invalide"
 
-#: builtin/worktree.c:48
+#: builtin/worktree.c:49
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Suppression de worktrees/%s : le fichier gitdir n'existe pas"
 
-#: builtin/worktree.c:53
+#: builtin/worktree.c:54
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr ""
 "Suppression de worktrees/%s : echec de la lecture du fichier gitdir (%s)"
 
-#: builtin/worktree.c:64
+#: builtin/worktree.c:65
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Suppression de worktrees/%s : fichier gitdir invalide"
 
-#: builtin/worktree.c:80
+#: builtin/worktree.c:81
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 "Suppression de worktrees/%s : le fichier gitdir point sur un endroit "
 "inexistant"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "afficher les arbres de travail éliminés"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "faire expirer les arbres de travail plus vieux que <temps>"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existe déjà"
 
-#: builtin/worktree.c:236
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "impossible de créer le répertoire de '%s'"
 
-#: builtin/worktree.c:272
+#: builtin/worktree.c:274
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Préparation de %s (identifiant %s)"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:328
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 "extraire la <branche> même si elle est déjà extraite dans une autre copie de "
 "travail"
 
-#: builtin/worktree.c:325
+#: builtin/worktree.c:330
 msgid "create a new branch"
 msgstr "créer une nouvelle branche"
 
-#: builtin/worktree.c:327
+#: builtin/worktree.c:332
 msgid "create or reset a branch"
 msgstr "créer ou réinitialiser une branche"
 
-#: builtin/worktree.c:329
+#: builtin/worktree.c:334
 msgid "populate the new working tree"
 msgstr "remplissage de la nouvelle copie de travail"
 
-#: builtin/worktree.c:337
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr "conserver le verrou sur le nouvel arbre de travail"
+
+#: builtin/worktree.c:343
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B et --detach sont mutuellement exclusifs"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:478
 msgid "reason for locking"
 msgstr "raison du vérouillage"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:490 builtin/worktree.c:523
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "'%s' n'est pas une copie de travail"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:492 builtin/worktree.c:525
 msgid "The main working tree cannot be locked or unlocked"
 msgstr ""
 "La copie de travail principale ne peut pas être vérouillée ou dévérouillée"
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:497
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "'%s' est déjà verrouillé, car '%s'"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:499
 #, c-format
 msgid "'%s' is already locked"
 msgstr "'%s' est déjà verrouillé"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:527
 #, c-format
 msgid "'%s' is not locked"
 msgstr "'%s' n'est pas verrouillé"
@@ -12537,28 +14137,41 @@ msgstr "écrire l'objet arbre pour un sous-répertoire <préfixe>"
 msgid "only useful for debugging"
 msgstr "seulement utile pour le débogage"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<options>] <répertoire>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1040
 msgid "quit after a single request/response exchange"
 msgstr "quitter après un unique échange requête/réponse"
 
-#: upload-pack.c:839
+#: upload-pack.c:1042
 msgid "exit immediately after initial ref advertisement"
 msgstr "Sortir immédiatement après l'annonce initiale des références"
 
-#: upload-pack.c:841
+#: upload-pack.c:1044
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr ""
 "nes pas essayer <répertoire>/.git/ si <répertoire> n'est pas un répertoire "
 "Git"
 
-#: upload-pack.c:843
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "interrompre le transfer après <n> secondes d'inactivité"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"Les permissions de votre répertoire de socket sont trop permissives ;\n"
+"les autres utilisateurs pourraient lire vos identifiants secrets. Lancez :\n"
+"\n"
+"    chmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "afficher les messages de debug sur stderr"
@@ -12573,10 +14186,35 @@ msgstr ""
 "quelques concepts. Voir 'git help <commande>' ou 'git help <concept>'\n"
 "pour en lire plus à propos d'une commande spécifique ou d'un concept."
 
-#: http.c:323
+#: http.c:336
+#, c-format
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr "valeur négative pour http.postbuffer ; utilisation de la valeur par défaut %d"
+
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "La délégation de commande n'est pas supporté avec cuRL < 7.22.0"
+
+#: http.c:366
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "L'épinglage de clé publique n'est pas supporté avec cuRL < 7.44.0"
 
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"impossible de mettre à jour la base de l'url depuis la redirection :\n"
+"      demandé : %s\n"
+"  redirection : %s"
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "redirection vers %s"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "démarrer une zone de travail (voir aussi : git help tutorial)"
@@ -12693,15 +14331,15 @@ msgstr "date-d'expiration"
 msgid "no-op (backward compatibility)"
 msgstr "sans action (rétrocompatibilité)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "être plus verbeux"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "être plus silencieux"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "utiliser <n> chiffres pour afficher les SHA-1s"
 
@@ -12786,7 +14424,7 @@ msgstr "Attention : bissection avec seulement une validation $TERM_BAD."
 #. at this point.
 #: git-bisect.sh:328
 msgid "Are you sure [Y/n]? "
-msgstr "Êtes-vous sûr [Y/n] ? "
+msgstr "Confirmez-vous [Y/n] ? "
 
 #: git-bisect.sh:340
 #, sh-format
@@ -12927,7 +14565,7 @@ msgid "Automated merge did not work."
 msgstr "La fusion automatique a échoué."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "L'Octopus ne devrait pas arriver."
 
 #: git-merge-octopus.sh:73
@@ -12954,7 +14592,7 @@ msgstr "Essai de fusion simple avec $pretty_name"
 msgid "Simple merge did not work, trying automatic merge."
 msgstr "La fusion simple a échoué, essai avec la fusion automatique."
 
-#: git-rebase.sh:56
+#: git-rebase.sh:58
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12966,53 +14604,39 @@ msgstr ""
 "Pour extraire la branche d'origine et stopper le rebasage, lancez \"git "
 "rebase --abort\"."
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:158 git-rebase.sh:397
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Impossible de revenir à $head_name"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "Autoremisage appliqué."
-
-#: git-rebase.sh:170
+#: git-rebase.sh:172
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Impossible de stocker $stash_sha1"
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"L'application de l'autoremisage a provoqué des conflits\n"
-"Vos  modifications sont à l'abri dans la remise.\n"
-"Vous pouvez lancer \"git stash pop\" ou \"git stash drop\" à tout moment.\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:212
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Le crochet pre-rebase a refusé de rebaser."
 
-#: git-rebase.sh:215
+#: git-rebase.sh:217
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Il semble que git-am soit en cours. Impossible de rebaser."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:358
 msgid "No rebase in progress?"
 msgstr "Pas de rebasage en cours ?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:369
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "L'action --edit-todo peut seulement être utilisée lors d'un rebasage "
 "interactif."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:376
 msgid "Cannot read HEAD"
 msgstr "Impossible de lire HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:379
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -13020,7 +14644,7 @@ msgstr ""
 "Vous devez éditer tous les conflits de fusion et\n"
 "les marquer comme résolus avec git add"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:419
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -13042,98 +14666,102 @@ msgstr ""
 "chose\n"
 "d'important ici."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:470
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "invalide $upstream_name en amont"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:494
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name : il y a plus d'une base de fusion"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:497 git-rebase.sh:501
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name : il n'y a pas de base de fusion"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:506
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Ne pointe pas sur une validation valide : $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:529
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal : pas de branche : $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:562
 msgid "Cannot autostash"
 msgstr "Autoremisage impossible"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:567
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Autoremisage créé : $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:571
 msgid "Please commit or stash them."
 msgstr "Veuillez les valider ou les remiser."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:591
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branche courante $branch_name est à jour."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:595
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "La branche courante $branch_name est à jour, rebasage forcé."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:606
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Changements de $mb sur $onto :"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:615
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Premièrement, rembobinons head pour rejouer votre travail par-dessus..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:625
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name mise à jour en avance rapide sur $onto_name."
 
-#: git-stash.sh:50
+#: git-stash.sh:53
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash clear avec des paramètres n'est pas implémenté"
 
-#: git-stash.sh:73
+#: git-stash.sh:94
 msgid "You do not have the initial commit yet"
 msgstr "Vous n'avez pas encore la validation initiale"
 
-#: git-stash.sh:88
+#: git-stash.sh:109
 msgid "Cannot save the current index state"
 msgstr "Impossible de sauver l'état courant de l'index"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "Impossible de sauver les fichiers non-suivis"
+
+#: git-stash.sh:144 git-stash.sh:157
 msgid "Cannot save the current worktree state"
 msgstr "Impossible de sauver l'état courant de la copie de travail"
 
-#: git-stash.sh:140
+#: git-stash.sh:161
 msgid "No changes selected"
 msgstr "Aucun changement sélectionné"
 
-#: git-stash.sh:143
+#: git-stash.sh:164
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Impossible de supprimer l'index temporaire (ne peut pas se produire)"
 
-#: git-stash.sh:156
+#: git-stash.sh:177
 msgid "Cannot record working tree state"
 msgstr "Impossible d'enregistrer l'état de la copie de travail"
 
-#: git-stash.sh:188
+#: git-stash.sh:209
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Impossible de mettre à jour $ref_stash avec $w_commit"
@@ -13148,7 +14776,7 @@ msgstr "Impossible de mettre à jour $ref_stash avec $w_commit"
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
+#: git-stash.sh:265
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -13157,109 +14785,118 @@ msgstr ""
 "erreur: option inconnue pour 'stash save': $option\n"
 "        Pour fournir un message, utilisez git stash save -- '$option'"
 
-#: git-stash.sh:259
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr ""
+"Impossible d'utiliser --patch et --include-untracked ou --all en même temps"
+
+#: git-stash.sh:286
 msgid "No local changes to save"
 msgstr "Pas de modifications locales à sauver"
 
-#: git-stash.sh:263
+#: git-stash.sh:291
 msgid "Cannot initialize stash"
 msgstr "Impossible d'initialiser le remisage"
 
-#: git-stash.sh:267
+#: git-stash.sh:295
 msgid "Cannot save the current status"
 msgstr "Impossible de sauver le statut courant"
 
-#: git-stash.sh:268
+#: git-stash.sh:296
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
 msgstr "Copie de travail et état de l'index sauvegardés dans $stash_msg"
 
-#: git-stash.sh:285
+#: git-stash.sh:323
 msgid "Cannot remove worktree changes"
 msgstr "Impossible de supprimer les changements de la copie de travail"
 
-#: git-stash.sh:404
+#: git-stash.sh:471
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "option inconnue : $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:484
 msgid "No stash found."
 msgstr "Pas de remisage trouvé."
 
-#: git-stash.sh:421
+#: git-stash.sh:491
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Trop de révisions spécifiées : $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:506
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference n'est pas une référence valide"
 
-#: git-stash.sh:455
+#: git-stash.sh:534
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' n'est pas une validation de type remisage"
 
-#: git-stash.sh:466
+#: git-stash.sh:545
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' n'est pas une référence de remisage"
 
-#: git-stash.sh:474
+#: git-stash.sh:553
 msgid "unable to refresh index"
 msgstr "impossible de rafraîchir l'index"
 
-#: git-stash.sh:478
+#: git-stash.sh:557
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Impossible d'appliquer un remisage en cours de fusion"
 
-#: git-stash.sh:486
+#: git-stash.sh:565
 msgid "Conflicts in index. Try without --index."
 msgstr "Conflits dans l'index. Essayez sans --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:567
 msgid "Could not save index tree"
 msgstr "Impossible de sauvegarder l'arbre d'index"
 
-#: git-stash.sh:522
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "Impossible de restaurer les fichiers non-suivis depuis le remisage"
+
+#: git-stash.sh:601
 msgid "Cannot unstage modified files"
 msgstr "Impossible de désindexer les fichiers modifiés"
 
-#: git-stash.sh:537
+#: git-stash.sh:616
 msgid "Index was not unstashed."
 msgstr "L'index n'a pas été sorti de remise."
 
-#: git-stash.sh:551
+#: git-stash.sh:630
 msgid "The stash is kept in case you need it again."
 msgstr "Le remisage est conservé au cas où vous en auriez encore besoin."
 
-#: git-stash.sh:560
+#: git-stash.sh:639
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} supprimé ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:640
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Impossible de supprimer l'élément de stash"
 
-#: git-stash.sh:569
+#: git-stash.sh:648
 msgid "No branch name specified"
 msgstr "Aucune branche spécifiée"
 
-#: git-stash.sh:641
+#: git-stash.sh:727
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Pour les restaurer tapez \"git stash apply\")"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Un chemin relatif ne peut être utilisé que depuis la racine de la copie de "
 "travail"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "L'URL de dépôt '$repo' doit être absolu ou commencer par ./|../"
@@ -13269,7 +14906,12 @@ msgstr "L'URL de dépôt '$repo' doit être absolu ou commencer par ./|../"
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' existe déjà dans l'index"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "'$sm_path' existe déjà dans l'index et n'est pas un sous-module"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -13280,24 +14922,24 @@ msgstr ""
 "$sm_path\n"
 "Utilisez -f si vous voulez vraiment l'ajouter."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Ajout du dépôt existant à '$sm_path' dans l'index"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' existe déjà et n'est pas un dépôt git valide"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Un répertoire git pour '$sm_name' est trouvé en local avec le(s) serveur(s) "
 "distant(s) :"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -13314,48 +14956,48 @@ msgstr ""
 "correct\n"
 "ou si ceci n'est pas clair, choisissez un autre nom avec l'option '--name'."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Réactivation du répertoire git local pour le sous-module '$sm_name'."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Impossible d'extraire le sous-module '$sm_path'"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Échec d'ajout du sous-module '$sm_path'"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Échec d'enregistrement du sous-module '$sm_path'"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:341
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "Entrée dans '$displaypath'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:361
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "Arrêt sur '$displaypath' ; le script a retourné un statut non nul."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:432
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "un spécificateur de chemin et --all sont incompatibles"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:437
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr ""
 "Utilisez '--all' si vous voulez vraiment réinitialiser tous les sous-modules"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
@@ -13366,7 +15008,7 @@ msgstr ""
 "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
 "historique)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13375,42 +15017,42 @@ msgstr ""
 "La copie de travail du sous-module '$displaypath' contient des modifications "
 "locales ; utilisez '-f' pour les annuler"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:468
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Répertoire '$displaypath' nettoyé"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:469
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Impossible de supprimer la copie de travail du sous-module '$displaypath'"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:472
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Impossible de créer le répertoire vide du sous-module '$displaypath'"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:481
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Le sous-module '$name' ($url) n'est pas enregistré pour le chemin "
 "'$displaypath'"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "Impossible de trouver la révision courante dans le chemin de sous-module "
 "'$displaypath'"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:647
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Impossible de rapatrier dans le chemin de sous-module '$sm_path'"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13419,12 +15061,12 @@ msgstr ""
 "Impossible de trouver la révision courante ${remote_name}/${branch} dans le "
 "chemin de sous-module '$sm_path'"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:670
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Impossible de rapatrier dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:676
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
@@ -13433,92 +15075,88 @@ msgstr ""
 "Chemin de sous-module '$displaypath' récupéré, mais il ne contenait pas "
 "$sha1. La récupération directe de ce commit a échoué."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:683
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Impossible d'extraire '$sha1' dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:684
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:688
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Impossible de rebaser '$sha1' dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:689
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:694
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Impossible de fusionner '$sha1' dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:695
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:700
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "L'exécution de '$command $sha1' a échoué dans le chemin de sous-module "
 "'$displaypath'"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:701
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Chemin de sous-module '$displaypath' : '$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:732
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 msgid "The --cached option cannot be used with the --files option"
 msgstr "L'option --cached ne peut pas être utilisée avec l'option --files"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:892
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode $mod_dst inattendu"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Attention : $display_name ne contient pas la validation $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:915
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Attention : $display_name ne contient pas la validation $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:918
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Attention : $display_name ne contient pas les validations $sha1_src et "
 "$sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1064
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Échec de parcours dans le chemin du sous-module '$sm_path'"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1136
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
@@ -13528,12 +15166,12 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 msgid "See git-${cmd}(1) for details."
 msgstr "Référez-vous à git-${cmd}(1) pour de plus amples détails."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "Rebasage ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13559,7 +15197,7 @@ msgstr ""
 "\n"
 "Vous pouvez réordonner ces lignes ; elles sont exécutées de haut en bas.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13568,7 +15206,7 @@ msgstr ""
 "Ne supprimez aucune ligne. Utilisez 'drop' explicitement pour supprimer un "
 "commit.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
@@ -13576,7 +15214,7 @@ msgstr ""
 "\n"
 "Si vous éliminez une ligne ici, LE COMMIT CORRESPONDANT SERA PERDU.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13595,87 +15233,83 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1 n'est pas un commit qui peut être picorer"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Nom de commit invalide : $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "Impossible de sauver le sha1 du remplaçant du commit en cours"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Avance rapide sur $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "Avance rapide impossible sur $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "Impossible de déplacer HEAD sur $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "Refus d'écraser un commit de fusion: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Erreur lors de la réapplication de la fusion $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "Impossible de picorer $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Ceci est le ${n}ième message de validation :"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "Le message de validation ${n} sera ignoré :"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Ceci est la combinaison de $count commit."
 msgstr[1] "Ceci est la combinaison de $count commits."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "Impossible d'écrire $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "Ceci est la combinaison de 2 commits."
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
-msgstr "Ceci est le premier message de validation :"
-
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "Impossible d'appliquer $sha1... $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13686,37 +15320,37 @@ msgid ""
 msgstr ""
 "Impossible de corriger le commit après avoir réussi à picorer $sha1... "
 "$rest\n"
-"C'est probablement du à un message de validation vide ou le crochet pre-"
+"C'est probablement dû à un message de validation vide ou le crochet pre-"
 "commit\n"
 "a échoué. Si le crochet pre-commit a échoué, vous devez peut-être résoudre "
 "le\n"
 "problème avant de pouvoir reformuler le message du commit."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "Arrêté à $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "'$squash_style' impossible avec le commit précédent"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "Exécution : $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "L'exécution a échoué : $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "et a mis à jour l'index ou la copie de travail"
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13727,7 +15361,7 @@ msgstr ""
 "git rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13742,25 +15376,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Commande inconnue : $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Veuillez corriger ceci en utilisant 'git rebase --edit-todo'."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "Rebasage et mise à jour de $head_name avec succès."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
 msgstr "Impossible d'éviter les commandes de picorage non nécessaires"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13769,7 +15403,7 @@ msgstr ""
 "Attention : le SHA-1 manque ou n'est pas un commit dans la ligne suivante :\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13778,11 +15412,11 @@ msgstr ""
 "Attention : la commande n'est pas reconnue dans le ligne suivante :\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "Impossible de détacher HEAD"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13790,7 +15424,7 @@ msgstr ""
 "Attention : certains commits ont pu être accidentellement supprimés.\n"
 "Commits supprimés (du plus jeune au plus vieux) :"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13805,7 +15439,7 @@ msgstr ""
 "d'avertissements.\n"
 "Les comportements disponibles sont : ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
@@ -13814,19 +15448,23 @@ msgstr ""
 "Paramètre non reconnu $check_level pour l'option rebase.missingCommitsCheck. "
 "Ignoré."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Vous pouvez corriger ceci avec 'git rebase --edit-todo'."
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Vous pouvez corriger ceci avec 'git rebase --edit-todo' puis lancez 'git "
+"rebase --continue'."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "Ou bien vous pouvez abandonner le rebasage avec 'git rebase --abort'."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1083
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "Impossible de supprimer CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1088
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13839,7 +15477,7 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
@@ -13857,12 +15495,12 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1105
 msgid "Error trying to find the author identity to amend commit"
 msgstr ""
 "Erreur lors de la recherche de l'identité de l'auteur pour corriger le commit"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1110
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
@@ -13870,11 +15508,11 @@ msgstr ""
 "Vous avez des modifications non validées dans votre copie de travail.\n"
 "Veuillez les valider d'abord, puis relancer 'git rebase --continue'."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
 msgid "Could not commit staged changes."
 msgstr "impossible de valider les modifications indexées."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1147
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13889,44 +15527,40 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
 msgid "Could not execute editor"
 msgstr "Impossible de lancer l'éditeur"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Vous devez d'abord définir vos informations de validateur"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1168
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "Impossible d'extraire $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1173
 msgid "No HEAD?"
 msgstr "Pas de HEAD ?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1174
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "Impossible de créer un répertoire temporaire $state_dir"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1176
 msgid "Could not mark as interactive"
 msgstr "Impossible de marquer comme interactif"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
 msgid "Could not init rewritten commits"
 msgstr "Impossible d'initialiser les commits réécrits"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1291
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Rebasage de $shortrevisions sur $shortonto ($todocount commande)"
 msgstr[1] "Rebasage de $shortrevisions sur $shortonto ($todocount commandes)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1296
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
@@ -13936,7 +15570,7 @@ msgstr ""
 "Cependant, si vous effacez tout, le rebasage sera annulé.\n"
 "\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1303
 msgid "Note that empty commits are commented out"
 msgstr "Veuillez noter que les commits vides sont en commentaire"
 
@@ -13967,6 +15601,11 @@ msgstr ""
 "Impossible de réécrire les branches : vous avez des modifications non "
 "indexées."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr ""
+"impossible de tirer avec rebasage. Vous avez des modifications non indexées."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13977,12 +15616,22 @@ msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr ""
 "Impossible de rebaser : votre index contient des modifications non validées."
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"impossible de tirer avec rebasage : votre index contient des modifications "
+"non validées."
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr ""
 "$action est impossible : votre index contient des modifications non validées."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "De plus, votre index contient des modifications non validées."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr ""
@@ -13992,6 +15641,1035 @@ msgstr ""
 msgid "Unable to determine absolute path of git directory"
 msgstr "Impossible de déterminer le chemin absolu du répertoire git"
 
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%12s %s12s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "indexé"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "non-indexé"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "binaire"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "rien"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "inchangé"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "%d chemin ajouté\n"
+msgstr[1] "%d chemins ajoutés\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "%d chemin mis à jour\n"
+msgstr[1] "%d chemins mis à jour\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "%d chemin inversé\n"
+msgstr[1] "%d chemins inversés\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "%d chemin touché\n"
+msgstr[1] "%d chemins touchés\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "Mise à jour"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "Inverser"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "note : %s n'est plus suivi à présent.\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "Ajouter un fichier non-suivi"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "Aucun Fichier non suivi.\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"Si le patch s'applique proprement, la section éditée sera\n"
+"immédiatement marquée comme indexée."
+
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr ""
+"Si le patch s'applique proprement, la section éditée sera\n"
+"immédiatement marquée comme remisée."
+
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr ""
+"Si le patch s'applique proprement, la section éditée sera\n"
+"immédiatement marquée comme desindexée."
+
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"Si le patch s'applique proprement, la section éditée sera\n"
+"immediatement marquée comme appliquée."
+
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr ""
+"Si le patch s'applique proprement, la section éditée sera\n"
+"immediatement marquée comme éliminée."
+
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr "impossible d'ouvrir le fichier d'édition de section en écriture : %s"
+
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr ""
+"Mode d'édition manuelle de section -- voir ci-dessous pour un guide rapide.\n"
+
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"Pour éliminer les lignes '%s', rendez-les ' ' (contexte).\n"
+"Pour éliminer les lignes '%s', effacez-les.\n"
+"Les lignes commençant par %s seront éliminées.\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"Si ça ne s'applique pas proprement, vous aurez la possibilité de\n"
+"l'éditer à nouveau. Si toutes les lignes de la section sont supprimées,\n"
+"alors l'édition sera abandonnée et la section conservée.\n"
+
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr "échec de l'ouverture du fichier d'édition de section en lecture : %s"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr ""
+"Votre section éditée ne s'applique pas. L'éditer à nouveau (\"no\" "
+"l'élimine !) [y|n] ? "
+
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - indexer cette section\n"
+"n - ne pas indexer cette section\n"
+"q - quitter ; ne pas indexer cette section ni les autres restantes\n"
+"a - indexer cette section et toutes les suivantes de ce fichier\n"
+"d - ne pas indexer cette section ni les suivantes de ce fichier"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - remiser cette section\n"
+"n - ne pas remiser cette section\n"
+"q - quitter ; ne pas remiser cette section ni les autres restantes\n"
+"a - remiser cette section et toutes les suivantes de ce fichier\n"
+"d - ne pas remiser cette section ni les suivantes de ce fichier"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - désindexer cette section\n"
+"n - ne pas désindexer cette section\n"
+"q - quitter ; ne pas désindexer cette section ni les autres restantes\n"
+"a - désindexer cette section et toutes les suivantes de ce fichier\n"
+"d - ne pas désindexer cette section ni les suivantes de ce fichier"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - appliquer cette section\n"
+"n - ne pas appliquer cette section\n"
+"q - quitter ; ne pas appliquer cette section ni les autres restantes\n"
+"a - appliquer cette section et toutes les suivantes de ce fichier\n"
+"d - ne pas appliquer cette section ni les suivantes de ce fichier"
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - supprimer cette section\n"
+"n - ne pas supprimer cette section\n"
+"q - quitter ; ne pas supprimer cette section ni les autres restantes\n"
+"a - supprimer cette section et toutes les suivantes de ce fichier\n"
+"d - ne pas supprimer cette section ni les suivantes de ce fichier"
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - éliminer cette section de l'index et de l'arbre de travail\n"
+"n - ne pas éliminer cette section\n"
+"q - quitter ; ne pas éliminer cette section ni les autres restantes\n"
+"a - éliminer cette section et toutes les suivantes de ce fichier\n"
+"d - ne pas éliminer cette section ni les suivantes de ce fichier"
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - appliquer cette section à l'index et à l'arbre de travail\n"
+"n - ne pas appliquer cette section\n"
+"q - quitter ; ne pas appliquer cette section ni les autres restantes\n"
+"a - appliquer cette section et toutes les suivantes de ce fichier\n"
+"d - ne pas appliquer cette section ni les suivantes de ce fichier"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g - selectionner une section et s'y rendre\n"
+"/ - rechercher une section correspondant à une regex donnée\n"
+"j - laisser cette section non décidée et aller à la suivante non-décidée\n"
+"J - laisser cette section non décidée et aller à la suivante\n"
+"k - laisser cette section non décidée et aller à la précédente non-décidée\n"
+"K - laisser cette section non décidée et aller à la précédente\n"
+"s - découper la section en sections plus petites\n"
+"e - éditer manuellement la section actuelle\n"
+"? - afficher l'aide\n"
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "Les sections sélectionnées ne s'applique pas à l'index !\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "Les appliquer quand même à l'arbre de travail ? "
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "Rien n'a été appliqué.\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "fichier non-fusionné ignoré : %s\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "Seuls des fichiers binaires ont changé.\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "Aucune modification.\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "Mise à jour par patch"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Indexer le changement de mode [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Indexer la suppression [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Indexer cette section [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Remiser le changement de mode [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Remiser la suppression [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Remiser cette section [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Désindexer le changement de mode [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Désindexer la suppression [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Désindexer cette section [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "Appliquer le changement de mode à l'index [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "Appliquer la suppression à l'index [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "Appliquer cette section à l'index [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Abandonner le changement de mode dans l'arbre [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Abandonner la suppression dans l'arbre [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Abandonner cette section dans l'arbre [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Abandonner le changement de mode dans l'index et l'arbre [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Abandonner la suppression de l'index et de l'arbre [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Supprimer la section dans l'index et l'arbre de travail [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Appliquer le changement de mode dans l'index et l'arbre de travail [y,n,q,a,"
+"d,/%s,?] ? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Appliquer la suppression dans l'index et l'arbre de travail [y,n,q,a,d,/"
+"%s,?] ? "
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Appliquer la section à l'index et l'arbre de travail [y,n,q,a,d,/%s,?] ? "
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "aller à quelle section (<ret> pour voir plus) ? "
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "aller à quelle section ? "
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "Nombre invalide : '%s'\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "Désolé, %d seule section disponible.\n"
+msgstr[1] "Désolé, Seulement %d sections disponibles.\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "rechercher la regex ? "
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "Regex de recherche malformée %s : %s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "Aucune section ne correspond au motif donné\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "Pas de section précédente\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "Pas de section suivante\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "Découpée en %d section.\n"
+msgstr[1] "Découpée en %d sections.\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "Réviser la différence"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        - montrer les chemins modifiés\n"
+"update        - ajouter l'état de l'arbre de travail aux modifications à "
+"indexer\n"
+"revert        - faire revenir les modifications à indexer à la version HEAD\n"
+"patch         - sélectionner les sections et mettre à jour sélectivement\n"
+"diff          - visualiser les diff entre HEAD et l'index\n"
+"add untracked - ajouter les fichiers non-suivis aux modifications à indexer\n"
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "-- manquant"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "mode de --patch inconnu : %s"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "argument invalide %s, -- attendu"
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr "la zone locale diffère du GMT par un interval supérieur à une minute\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "le décalage de temps local est plus grand ou égal à 24 heures\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "l'éditeur est sorti en erreur, abandon total"
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr ""
+"'%s' contient une version intermédiaire du courriel que vous composiez.\n"
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "'%s.final' contient le courriel composé.\n"
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-aliases est incompatible avec d'autres options\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "Lancement de git format-patch impossible à l'extérieur d'un dépôt\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "Champ de --suppress-cc inconnu : '%s'\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "Paramètre de --confirm inconnu : '%s'\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr ""
+"attention : les guillemets ne sont pas supportés dans alias sendmail : %s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "attention : `:include:` n'est pas supporté : %s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr ""
+"attention : les redirections `/file` ou `|pipe` ne sont pas supportées : %s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "attention : ligne sendmail non reconnue : %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+"Le fichier '%s' existe mais ce pourrait aussi être la plage de commmits\n"
+"pour lequel les patches sont à produire. Veuillez préciser...\n"
+"\n"
+"    * en indiquant \"./%s\" si vous désignez un fichier, ou\n"
+"    * en fournissant l'option --format-patch pour une plage.\n"
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "Échec à l'ouverture du répertoire %s : %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"fatal : %s : %s\n"
+"attention : aucun patch envoyé\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"Aucun fichier patch spécifié !\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "Ligne de sujet non trouvée dans %s ?"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "Impossible d'ouvrir %s en écriture : %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+"Les lignes commençant par \"GIT:\" seront supprimées.\n"
+"Envisagez d'inclure un diffstat global ou une table des matières\n"
+"pour le patch que vous êtes en train d'écrire.\n"
+"\n"
+"Effacez le corps si vous ne souhaitez pas envoyer un résumé.\n"
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "Échec à l'ouverture de %s.final : %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "Échec à l'ouverture de %s : %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr ""
+"Les champs To/CC/Bcc ne sont pas encore interprétés, ils ont été ignorés\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "Le courriel de résumé etant vide, il a été ignoré\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "Êtes-vous sur de vouloir utiliser <%s> [y/N] ? "
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr ""
+"Les fichiers suivants sont 8bit mais ne déclarent pas de champs Content-"
+"Transfer-Encoding.\n"
+
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "Quel encodage 8bit doit être déclaré [UTF8] ? "
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+"Envoi refusé parce que le patch\n"
+"\t%s\n"
+"a un sujet modèle '*** SUBJECT HERE ***'. Passez --force is vous souhaitez "
+"vraiment envoyer.\n"
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "À qui les courriels doivent-ils être envoyés (s'il y en a) ?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "fatal : l'alias '%s' se développe en lui-même\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr ""
+"Message-ID à utiliser comme In-Reply-to pour le premier courriel (s'il y en "
+"a) ? "
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "erreur : impossible d'extraire une adresse valide depuis : %s\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr "Que faire de cette adresse ? ([q]uitter|[d]élaisser|[e]diter): "
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "le chemin vers la CA \"%s\" n'existe pas"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+"   La liste CC ci-dessus a été étendue avec des adresses\n"
+"   supplémentaires trouvées dans le message de validation.\n"
+"   Par défaut dans ce cas, send-email demande confirmation avant envoi.\n"
+"   Ce comportement est géré par le paramètre de configuration\n"
+"   sendemail.confirm.\n"
+"\n"
+"   Pour tout information complémentaire, lancez 'git send-email --help'.\n"
+"   Pour conserver le comportement actuel, mais éliminer ce message,\n"
+"   lancez 'git config --global sendemail.confirm auto'.\n"
+"\n"
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "Envoyer ce courriel ? ([y]es|[n]o|[q]uit|[a]ll) : "
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "Une réponse est nécessaire"
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "Le serveur SMTP nécessaire n'est pas défini correctement."
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "Le serveur ne supporte pas STARTTLS ! %s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr ""
+"Impossible d'initialiser SMTP. Vérifiez la configuration et utilisez --smtp-"
+"debug."
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "échec de l'envoi de %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "Envoi simulé de %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "%s envoyé\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "Simulation OK. Le journal indique :\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "OK. Le journal indique :\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "Résultat : "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "Résultat : OK\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "impossible d'ouvrir le fichier %s"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) Ajout de cc: %s depuis la ligne '%s'\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) Ajout de to: %s depuis la ligne '%s'\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(non-mbox) Ajout de cc: %s depuis la ligne '%s'\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(corps) Ajout de cc: %s depuis la ligne '%s'\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) Impossible d'exécuter '%s'"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) Ajout de %s : %s depuis : '%s'\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) échec de la fermeture du pipe vers '%s'"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "impossible d'envoyer un message comme 7bit"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "codage de transfert invalide"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "impossible d'ouvrir %s :%s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s : le patch contient une ligne plus longue que 998 caractères"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "%s sauté avec un suffix de sauvegarde '%s'.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "Souhaitez-vous réellement envoyer %s ?[y|N] : "
+
+#~ msgid "could not stat '%s"
+#~ msgstr "stat impossible de '%s'"
+
+#~ msgid "tag: tagging "
+#~ msgstr "étiquette: étiquetage de "
+
+#~ msgid "object of unknown type"
+#~ msgstr "objet de type inconnu"
+
+#~ msgid "commit object"
+#~ msgstr "objet commit"
+
+#~ msgid "tree object"
+#~ msgstr "objet arbre"
+
+#~ msgid "blob object"
+#~ msgstr "objet blob"
+
+#~ msgid "other tag object"
+#~ msgstr "objet étiquette autre"
+
+#~ msgid ""
+#~ "There is nothing to exclude from by :(exclude) patterns.\n"
+#~ "Perhaps you forgot to add either ':/' or '.' ?"
+#~ msgstr ""
+#~ "Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
+#~ "Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
+
+#~ msgid "unrecognized format: %%(%s)"
+#~ msgstr "format non reconnu %%(%s)"
+
+#~ msgid ":strip= requires a positive integer argument"
+#~ msgstr ":strip= requiert un argument entier positif"
+
+#~ msgid "ref '%s' does not have %ld components to :strip"
+#~ msgstr "la réf '%s' n'a pas %ld composants à :strip"
+
+#~ msgid "unknown %.*s format %s"
+#~ msgstr "format de %.*s inconnu %s"
+
+# féminin pour une branche
+#~ msgid "[%s: gone]"
+#~ msgstr "[%s: disparue]"
+
+#~ msgid "[%s]"
+#~ msgstr "[%s]"
+
+#~ msgid "[%s: behind %d]"
+#~ msgstr "[%s: en retard de %d]"
+
+#~ msgid "[%s: ahead %d]"
+#~ msgstr "[%s : en avance de %d]"
+
+#~ msgid "[%s: ahead %d, behind %d]"
+#~ msgstr "[%s : en avance de %d, en retard de %d]"
+
+#~ msgid " **** invalid ref ****"
+#~ msgstr " **** référence invalide ****"
+
+#~ msgid "insanely long object directory %.*s"
+#~ msgstr "objet répertoire démentiellement long %.*s"
+
+#~ msgid "git merge [<options>] <msg> HEAD <commit>"
+#~ msgstr "git merge [<options>] <message> HEAD <commit>"
+
+#~ msgid "'%s' is not a commit"
+#~ msgstr "'%s' n'est pas une validation"
+
+#~ msgid "cannot open file '%s'"
+#~ msgstr "impossible d'ouvrir le fichier '%s'"
+
+#~ msgid "could not close file %s"
+#~ msgstr "impossible de fermer le fichier %s"
+
+#~ msgid "tag name too long: %.*s..."
+#~ msgstr "nom d'étiquette trop long : %.*s..."
+
+#~ msgid "tag header too big."
+#~ msgstr "en-tête d'étiquette trop gros."
+
+#~ msgid ""
+#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "marked for discarding"
+#~ msgstr ""
+#~ "Si le patch s'applique proprement, la section éditée sera\n"
+#~ "immediatement marquée comme éliminée"
+
+#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
+#~ msgstr ""
+#~ "Utiliser une heuristique expérimentale reposant sur les lignes vides pour "
+#~ "améliorer le diffs"
+
+#~ msgid "Clever... amending the last one with dirty index."
+#~ msgstr "Malin... correction du dernier avec un index sale."
+
+#~ msgid ""
+#~ "the following submodule (or one of its nested submodules)\n"
+#~ "uses a .git directory:"
+#~ msgid_plural ""
+#~ "the following submodules (or one of their nested submodules)\n"
+#~ "use a .git directory:"
+#~ msgstr[0] ""
+#~ "le sous-module suivant (ou un de ses sous-modules imbriqués)\n"
+#~ "utilise un répertoire .git :"
+#~ msgstr[1] ""
+#~ "les sous-modules suivants (ou un de leurs sous-modules imbriqués)\n"
+#~ "utilisent un répertoire .git :"
+
+#~ msgid ""
+#~ "\n"
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "\n"
+#~ "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout "
+#~ "son historique)"
+
+#~ msgid "Could not write to %s"
+#~ msgstr "Impossible d'écrire dans %s"
+
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Erreur lors de l'emballage de %s."
+
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "Vos modifications locales seraient écrasées par cherry-pick."
+
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Impossible d'annuler un commit pendant l'annulation d'un commit."
+
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr "Impossible de picorer pendant un autre picorage."
+
+#~ msgid "Could not parse line %d."
+#~ msgstr "Impossible d'analyser la ligne %d."
+
+#~ msgid "Could not open %s"
+#~ msgstr "Impossible d'ouvrir %s"
+
+#~ msgid "Could not read %s."
+#~ msgstr "Impossible de lire %s."
+
+#~ msgid "Could not format %s."
+#~ msgstr "Impossible de formater %s."
+
+#~ msgid "%s: %s"
+#~ msgstr "%s : %s"
+
+#~ msgid "cannot open %s: %s"
+#~ msgstr "impossible d'ouvrir %s : %s"
+
+#~ msgid "You need to set your committer info first"
+#~ msgstr "Vous devez d'abord définir vos informations de validateur"
+
 #~ msgid "This is the 2nd commit message:"
 #~ msgstr "Ceci est le deuxième message de validation :"
 
@@ -14106,9 +16784,6 @@ msgstr "Impossible de déterminer le chemin absolu du répertoire git"
 #~ msgid "bug: unhandled diff status %c"
 #~ msgstr "bogue : état de diff non géré %c"
 
-#~ msgid "read of %s failed"
-#~ msgstr "échec de la lecture de %s"
-
 #~ msgid "could not write branch description template"
 #~ msgstr "impossible d'écrire le modèle de description de branche"
 
@@ -14136,9 +16811,6 @@ msgstr "Impossible de déterminer le chemin absolu du répertoire git"
 #~ msgid "Verify that the named commit has a valid GPG signature"
 #~ msgstr "Vérifier que la validation a une signature GPG valide"
 
-#~ msgid "Could not write to '%s'"
-#~ msgstr "Impossible d'écrire dans '%s'"
-
 #~ msgid "Writing SQUASH_MSG"
 #~ msgstr "Écriture de SQUASH_MSG"
 
@@ -14175,8 +16847,8 @@ msgstr "Impossible de déterminer le chemin absolu du répertoire git"
 #~ "or you are unsure what this means choose another name with the '--name' "
 #~ "option."
 #~ msgstr ""
-#~ "ou vous ne savez pas ce que cela signifie de choisir un autre nom avec "
-#~ "l'option '--name'."
+#~ "ou si vous ne savez pas ce que cela signifie, choisissez un autre nom "
+#~ "avec l'option '--name'."
 
 #~ msgid "Submodule work tree '$displaypath' contains a .git directory"
 #~ msgstr ""
@@ -14196,12 +16868,6 @@ msgstr "Impossible de déterminer le chemin absolu du répertoire git"
 #~ msgid "unable to access '%s': %s"
 #~ msgstr "impossible d'accéder à '%s' : %s"
 
-#~ msgid "could not open '%s' for reading: %s"
-#~ msgstr "impossible d'ouvrir '%s' en lecture : %s"
-
-#~ msgid "could not open '%s' for writing: %s"
-#~ msgstr "impossible d'ouvrir '%s' en écriture : %s"
-
 #~ msgid "    git branch -d %s\n"
 #~ msgstr "    git branch -d %s\n"
 
@@ -14489,9 +17155,6 @@ msgstr "Impossible de déterminer le chemin absolu du répertoire git"
 #~ msgid "cannot update HEAD ref"
 #~ msgstr "impossible de mettre à jour la référence HEAD"
 
-#~ msgid "cannot tell cwd"
-#~ msgstr "impossible de déterminer le répertoire de travail courant"
-
 #~ msgid "%s: cannot lock the ref"
 #~ msgstr "%s : impossible de verrouiller la référence"
 
index fed61cfb08a5a606cf00d325d67fc06f006c7a93..db2ff707674728758eb563464683a405e246dd76 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -58,7 +58,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr ""
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr ""
 
@@ -86,12785 +86,15031 @@ msgid ""
 "\n"
 msgstr ""
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
 msgstr ""
 
-#: archive.c:13
-msgid "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
 msgstr ""
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
 msgstr ""
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
 msgstr ""
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
+#: apply.c:130
+msgid "--3way outside a repository"
 msgstr ""
 
-#: archive.c:429
-msgid "fmt"
+#: apply.c:141
+msgid "--index outside a repository"
 msgstr ""
 
-#: archive.c:429
-msgid "archive format"
+#: apply.c:144
+msgid "--cached outside a repository"
 msgstr ""
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
 msgstr ""
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
 msgstr ""
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553
-#: builtin/blame.c:2554 builtin/config.c:59 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:722 builtin/hash-object.c:100
-#: builtin/ls-files.c:460 builtin/ls-files.c:463 builtin/notes.c:399
-#: builtin/notes.c:562 builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
 msgstr ""
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 
-#: archive.c:436
-msgid "report archived files on stderr"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 
-#: archive.c:437
-msgid "store only"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 
-#: archive.c:438
-msgid "compress faster"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
 msgstr ""
 
-#: archive.c:446
-msgid "compress better"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
 msgstr ""
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr ""
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+msgstr[1] ""
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
 msgstr ""
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
+#: apply.c:1759
+msgid "new file depends on old contents"
 msgstr ""
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
+#: apply.c:1761
+msgid "deleted file still has contents"
 msgstr ""
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
 msgstr ""
 
-#: archive.c:461
-msgid "Unexpected option --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
 msgstr ""
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
 msgstr ""
 
-#: archive.c:465
-msgid "Unexpected option --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
 msgstr ""
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
 msgstr ""
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
+msgid "unrecognized binary patch at line %d"
 msgstr ""
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
 msgstr ""
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
+msgid "unable to read symlink %s"
 msgstr ""
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
+msgid "unable to open or read %s"
 msgstr ""
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
+msgid "invalid start of line: '%c'"
 msgstr ""
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: apply.c:3053
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 
-#: bisect.c:732
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
 
-#: bisect.c:737
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+msgid "missing binary patch data for '%s'"
 msgstr ""
 
-#: bisect.c:742
+#: apply.c:3089
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
 
-#: bisect.c:750
+#: apply.c:3135
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
 msgstr ""
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
+msgid "the necessary postimage %s for '%s' cannot be read"
 msgstr ""
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
+msgid "binary patch does not apply to '%s'"
 msgstr ""
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 
-#: bisect.c:947
-msgid "reading bisect refs failed"
+#: apply.c:3211
+#, c-format
+msgid "patch failed: %s:%ld"
 msgstr ""
 
-#: bisect.c:967
+#: apply.c:3333
 #, c-format
-msgid "%s was both %s and %s\n"
+msgid "cannot checkout %s"
 msgstr ""
 
-#: bisect.c:975
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
+msgid "failed to read %s"
 msgstr ""
 
-#: bisect.c:994
+#: apply.c:3389
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
+msgid "reading from '%s' beyond a symbolic link"
+msgstr ""
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] ""
-msgstr[1] ""
+msgid "path %s has been renamed/deleted"
+msgstr ""
 
-#: branch.c:53
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
+msgid "%s: does not exist in index"
 msgstr ""
 
-#: branch.c:67
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Not setting branch %s as its own upstream."
+msgid "%s: does not match index"
 msgstr ""
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
 
-#: branch.c:94
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
+msgid "Falling back to three-way merge...\n"
 msgstr ""
 
-#: branch.c:98
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
+msgid "cannot read the current contents of '%s'"
 msgstr ""
 
-#: branch.c:99
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track local branch %s."
+msgid "Failed to fall back on three-way merge...\n"
 msgstr ""
 
-#: branch.c:104
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
+msgid "Applied patch to '%s' with conflicts.\n"
 msgstr ""
 
-#: branch.c:105
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
+msgid "Applied patch to '%s' cleanly.\n"
 msgstr ""
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
+#: apply.c:3625
+msgid "removal patch leaves file contents"
 msgstr ""
 
-#: branch.c:110
+#: apply.c:3697
 #, c-format
-msgid "Branch %s set up to track local ref %s."
+msgid "%s: wrong type"
 msgstr ""
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
+#: apply.c:3699
+#, c-format
+msgid "%s has type %o, expected %o"
 msgstr ""
 
-#: branch.c:156
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
+msgid "invalid path '%s'"
 msgstr ""
 
-#: branch.c:185
+#: apply.c:3908
 #, c-format
-msgid "'%s' is not a valid branch name."
+msgid "%s: already exists in index"
 msgstr ""
 
-#: branch.c:190
+#: apply.c:3911
 #, c-format
-msgid "A branch named '%s' already exists."
+msgid "%s: already exists in working directory"
 msgstr ""
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
+#: apply.c:3931
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr ""
 
-#: branch.c:218
+#: apply.c:3936
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 
-#: branch.c:220
+#: apply.c:3956
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
+msgid "affected file '%s' is beyond a symbolic link"
 msgstr ""
 
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
+#: apply.c:3960
+#, c-format
+msgid "%s: patch does not apply"
 msgstr ""
 
-#: branch.c:266
+#: apply.c:3975
 #, c-format
-msgid "Not a valid object name: '%s'."
+msgid "Checking patch %s..."
 msgstr ""
 
-#: branch.c:286
+#: apply.c:4066
 #, c-format
-msgid "Ambiguous object name: '%s'."
+msgid "sha1 information is lacking or useless for submodule %s"
 msgstr ""
 
-#: branch.c:291
+#: apply.c:4073
 #, c-format
-msgid "Not a valid branch point: '%s'."
+msgid "mode change for %s, which is not in current HEAD"
 msgstr ""
 
-#: branch.c:345
+#: apply.c:4076
 #, c-format
-msgid "'%s' is already checked out at '%s'"
+msgid "sha1 information is lacking or useless (%s)."
 msgstr ""
 
-#: branch.c:364
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "HEAD of working tree %s is not updated"
+msgid "make_cache_entry failed for path '%s'"
 msgstr ""
 
-#: bundle.c:34
+#: apply.c:4085
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
+msgid "could not add %s to temporary index"
 msgstr ""
 
-#: bundle.c:61
+#: apply.c:4095
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
+msgid "could not write temporary index to %s"
 msgstr ""
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4233
 #, c-format
-msgid "could not open '%s'"
+msgid "unable to remove %s from index"
 msgstr ""
 
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
+#: apply.c:4268
+#, c-format
+msgid "corrupt patch for submodule %s"
 msgstr ""
 
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
+#: apply.c:4274
+#, c-format
+msgid "unable to stat newly created file '%s'"
 msgstr ""
 
-#: bundle.c:185
+#: apply.c:4282
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
+msgid "unable to create backing store for newly created file %s"
 msgstr ""
 
-#: bundle.c:194
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] ""
-msgstr[1] ""
+msgid "unable to add cache entry for %s"
+msgstr ""
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
+#: apply.c:4329
+#, c-format
+msgid "failed to write to '%s'"
 msgstr ""
 
-#: bundle.c:264
-msgid "pack-objects died"
+#: apply.c:4333
+#, c-format
+msgid "closing file '%s'"
 msgstr ""
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr ""
-
-#: bundle.c:353
+#: apply.c:4403
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
+msgid "unable to write file '%s' mode %o"
 msgstr ""
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4501
 #, c-format
-msgid "unrecognized argument: %s"
+msgid "Applied patch %s cleanly."
 msgstr ""
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
+#: apply.c:4509
+msgid "internal error"
 msgstr ""
 
-#: bundle.c:463
+#: apply.c:4512
 #, c-format
-msgid "cannot create '%s'"
-msgstr ""
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] ""
+msgstr[1] ""
 
-#: bundle.c:491
-msgid "index-pack died"
+#: apply.c:4523
+#, c-format
+msgid "truncating .rej filename to %.*s.rej"
 msgstr ""
 
-#: color.c:290
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "invalid color value: %.*s"
+msgid "cannot open %s"
 msgstr ""
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4545
 #, c-format
-msgid "could not parse %s"
+msgid "Hunk #%d applied cleanly."
 msgstr ""
 
-#: commit.c:42
+#: apply.c:4549
 #, c-format
-msgid "%s %s is not a commit!"
+msgid "Rejected hunk #%d."
 msgstr ""
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
+#: apply.c:4659
+#, c-format
+msgid "Skipped patch '%s'."
 msgstr ""
 
-#: config.c:516
-#, c-format
-msgid "bad config line %d in blob %s"
+#: apply.c:4667
+msgid "unrecognized input"
 msgstr ""
 
-#: config.c:520
-#, c-format
-msgid "bad config line %d in file %s"
+#: apply.c:4686
+msgid "unable to read index file"
 msgstr ""
 
-#: config.c:524
+#: apply.c:4823
 #, c-format
-msgid "bad config line %d in standard input"
+msgid "can't open patch '%s': %s"
 msgstr ""
 
-#: config.c:528
+#: apply.c:4850
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] ""
+msgstr[1] ""
 
-#: config.c:532
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] ""
+msgstr[1] ""
 
-#: config.c:536
+#: apply.c:4864
 #, c-format
-msgid "bad config line %d in %s"
-msgstr ""
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] ""
+msgstr[1] ""
 
-#: config.c:655
-msgid "out of range"
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
 msgstr ""
 
-#: config.c:655
-msgid "invalid unit"
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
 msgstr ""
 
-#: config.c:661
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
 msgstr ""
 
-#: config.c:666
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+#: apply.c:4915
+msgid "apply changes matching the given path"
 msgstr ""
 
-#: config.c:669
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
 msgstr ""
 
-#: config.c:672
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 
-#: config.c:675
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+#: apply.c:4921
+msgid "ignore additions made by the patch"
 msgstr ""
 
-#: config.c:678
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 
-#: config.c:681
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 
-#: config.c:768
-#, c-format
-msgid "failed to expand user dir in: '%s'"
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 
-#: config.c:849 config.c:860
-#, c-format
-msgid "bad zlib compression level %d"
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
 msgstr ""
 
-#: config.c:978
-#, c-format
-msgid "invalid mode for object creation: %s"
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
 msgstr ""
 
-#: config.c:1312
-msgid "unable to parse command-line config"
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
 msgstr ""
 
-#: config.c:1362
-msgid "unknown error occurred while reading the configuration files"
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
 msgstr ""
 
-#: config.c:1716
-#, c-format
-msgid "unable to parse '%s' from command-line config"
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 
-#: config.c:1718
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
 msgstr ""
 
-#: config.c:1777
-#, c-format
-msgid "%s has multiple values"
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
 msgstr ""
 
-#: config.c:2311
-#, c-format
-msgid "could not set '%s' to '%s'"
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
 msgstr ""
 
-#: config.c:2313
-#, c-format
-msgid "could not unset '%s'"
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
 msgstr ""
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
-msgid "Checking connectivity"
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
 msgstr ""
 
-#: connected.c:74
-msgid "Could not run 'git rev-list'"
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
 msgstr ""
 
-#: connected.c:94
-msgid "failed write to rev-list"
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
 msgstr ""
 
-#: connected.c:101
-msgid "failed to close rev-list's stdin"
+#: apply.c:4959
+msgid "apply the patch in reverse"
 msgstr ""
 
-#: date.c:97
-msgid "in the future"
+#: apply.c:4961
+msgid "don't expect at least one line of context"
 msgstr ""
 
-#: date.c:103
-#, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:110
-#, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:117
-#, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:124
-#, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] ""
-msgstr[1] ""
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr ""
 
-#: date.c:130
-#, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] ""
-msgstr[1] ""
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr ""
 
-#: date.c:137
-#, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] ""
-msgstr[1] ""
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr ""
 
-#: date.c:148
-#, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] ""
-msgstr[1] ""
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr ""
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:151
-#, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] ""
-msgstr[1] ""
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr ""
 
-#: date.c:156 date.c:161
-#, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] ""
-msgstr[1] ""
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr ""
 
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
 msgstr ""
 
-#: diffcore-rename.c:540
-msgid "Performing inexact rename detection"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
 msgstr ""
 
-#: diff.c:116
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+#: archive.c:13
+msgid "git archive --list"
 msgstr ""
 
-#: diff.c:121
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
 
-#: diff.c:225
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr ""
 
-#: diff.c:277
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
+msgid "pathspec '%s' did not match any files"
 msgstr ""
 
-#: diff.c:3017
-#, c-format
-msgid "external diff died, stopping at %s"
+#: archive.c:417
+msgid "fmt"
 msgstr ""
 
-#: diff.c:3415
-msgid "--follow requires exactly one pathspec"
+#: archive.c:417
+msgid "archive format"
 msgstr ""
 
-#: diff.c:3578
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
 msgstr ""
 
-#: diff.c:3592
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
 msgstr ""
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
 msgstr ""
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
 msgstr ""
 
-#: gpg-interface.c:178
-msgid "gpg failed to sign the data"
+#: archive.c:423
+msgid "read .gitattributes in working directory"
 msgstr ""
 
-#: gpg-interface.c:208
-msgid "could not create temporary file"
+#: archive.c:424
+msgid "report archived files on stderr"
 msgstr ""
 
-#: gpg-interface.c:210
-#, c-format
-msgid "failed writing detached signature to '%s'"
+#: archive.c:425
+msgid "store only"
 msgstr ""
 
-#: grep.c:1792
-#, c-format
-msgid "'%s': unable to read %s"
+#: archive.c:426
+msgid "compress faster"
 msgstr ""
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
-#, c-format
-msgid "failed to stat '%s'"
+#: archive.c:434
+msgid "compress better"
 msgstr ""
 
-#: grep.c:1820
-#, c-format
-msgid "'%s': short read"
+#: archive.c:437
+msgid "list supported archive formats"
 msgstr ""
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
 msgstr ""
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
 msgstr ""
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
 msgstr ""
 
-#: help.c:309
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
 msgstr ""
 
-#: help.c:388
-#, c-format
-msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
+#: archive.c:449
+msgid "Unexpected option --remote"
 msgstr ""
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
 msgstr ""
 
-#: help.c:400
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
+#: archive.c:453
+msgid "Unexpected option --output"
 msgstr ""
 
-#: help.c:404 help.c:470
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:466
+#: archive.c:475
 #, c-format
-msgid "%s: %s - %s"
+msgid "Unknown archive format '%s'"
 msgstr ""
 
-#: lockfile.c:152
+#: archive.c:482
 #, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
+msgid "Argument not supported for format '%s': -%d"
 msgstr ""
 
-#: lockfile.c:160
+#: attr.c:212
 #, c-format
-msgid "Unable to create '%s.lock': %s"
+msgid "%.*s is not a valid attribute name"
 msgstr ""
 
-#: merge.c:41
-msgid "failed to read the cache"
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
 msgstr ""
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
-msgid "unable to write new index file"
+#: bisect.c:444
+#, c-format
+msgid "Could not open file '%s'"
 msgstr ""
 
-#: merge-recursive.c:209
-msgid "(bad commit)\n"
+#: bisect.c:449
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
 msgstr ""
 
-#: merge-recursive.c:231
+#: bisect.c:657
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
+msgid "We cannot bisect more!\n"
 msgstr ""
 
-#: merge-recursive.c:301
-msgid "error building trees"
+#: bisect.c:710
+#, c-format
+msgid "Not a valid commit name %s"
 msgstr ""
 
-#: merge-recursive.c:720
+#: bisect.c:734
 #, c-format
-msgid "failed to create path '%s'%s"
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
 msgstr ""
 
-#: merge-recursive.c:731
+#: bisect.c:739
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
 msgstr ""
 
-#: merge-recursive.c:745 merge-recursive.c:764
-msgid ": perhaps a D/F conflict?"
+#: bisect.c:744
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
 msgstr ""
 
-#: merge-recursive.c:754
+#: bisect.c:752
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
 msgstr ""
 
-#: merge-recursive.c:796
+#: bisect.c:765
 #, c-format
-msgid "cannot read object %s '%s'"
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
 msgstr ""
 
-#: merge-recursive.c:798
+#: bisect.c:800
 #, c-format
-msgid "blob expected for %s '%s'"
+msgid "Bisecting: a merge base must be tested\n"
 msgstr ""
 
-#: merge-recursive.c:822
+#: bisect.c:851
 #, c-format
-msgid "failed to open '%s': %s"
+msgid "a %s revision is needed"
 msgstr ""
 
-#: merge-recursive.c:833
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
 #, c-format
-msgid "failed to symlink '%s': %s"
+msgid "could not create file '%s'"
 msgstr ""
 
-#: merge-recursive.c:838
+#: bisect.c:919
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
+msgid "could not read file '%s'"
 msgstr ""
 
-#: merge-recursive.c:978
-msgid "Failed to execute internal merge"
+#: bisect.c:949
+msgid "reading bisect refs failed"
 msgstr ""
 
-#: merge-recursive.c:982
+#: bisect.c:969
 #, c-format
-msgid "Unable to add %s to database"
+msgid "%s was both %s and %s\n"
 msgstr ""
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: bisect.c:977
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 msgstr ""
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: bisect.c:996
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] ""
+msgstr[1] ""
 
-#: merge-recursive.c:1143
-msgid "rename"
-msgstr ""
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] ""
+msgstr[1] ""
 
-#: merge-recursive.c:1143
-msgid "renamed"
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
 msgstr ""
 
-#: merge-recursive.c:1200
+#: branch.c:67
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
+msgid "Not setting branch %s as its own upstream."
 msgstr ""
 
-#: merge-recursive.c:1225
+#: branch.c:93
 #, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 
-#: merge-recursive.c:1230
-msgid " (left unresolved)"
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
 msgstr ""
 
-#: merge-recursive.c:1292
+#: branch.c:98
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 
-#: merge-recursive.c:1325
+#: branch.c:99
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
+msgid "Branch %s set up to track local branch %s."
 msgstr ""
 
-#: merge-recursive.c:1531
+#: branch.c:104
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
 
-#: merge-recursive.c:1546
+#: branch.c:105
 #, c-format
-msgid "Adding merged %s"
+msgid "Branch %s set up to track remote ref %s."
 msgstr ""
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: branch.c:109
 #, c-format
-msgid "Adding as %s instead"
+msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 
-#: merge-recursive.c:1610
+#: branch.c:110
 #, c-format
-msgid "cannot read object %s"
+msgid "Branch %s set up to track local ref %s."
 msgstr ""
 
-#: merge-recursive.c:1613
-#, c-format
-msgid "object %s is not a blob"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
 msgstr ""
 
-#: merge-recursive.c:1666
-msgid "modify"
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
 msgstr ""
 
-#: merge-recursive.c:1666
-msgid "modified"
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
 msgstr ""
 
-#: merge-recursive.c:1676
-msgid "content"
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
 msgstr ""
 
-#: merge-recursive.c:1683
-msgid "add/add"
+#: branch.c:198
+msgid "Cannot force update the current branch."
 msgstr ""
 
-#: merge-recursive.c:1718
+#: branch.c:218
 #, c-format
-msgid "Skipped %s (merged same as existing)"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 
-#: merge-recursive.c:1732
+#: branch.c:220
 #, c-format
-msgid "Auto-merging %s"
+msgid "the requested upstream branch '%s' does not exist"
 msgstr ""
 
-#: merge-recursive.c:1736 git-submodule.sh:919
-msgid "submodule"
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
 msgstr ""
 
-#: merge-recursive.c:1737
+#: branch.c:265
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
+msgid "Not a valid object name: '%s'."
 msgstr ""
 
-#: merge-recursive.c:1831
+#: branch.c:285
 #, c-format
-msgid "Removing %s"
+msgid "Ambiguous object name: '%s'."
 msgstr ""
 
-#: merge-recursive.c:1857
-msgid "file/directory"
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
 msgstr ""
 
-#: merge-recursive.c:1863
-msgid "directory/file"
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
 msgstr ""
 
-#: merge-recursive.c:1868
+#: branch.c:364
 #, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgid "HEAD of working tree %s is not updated"
 msgstr ""
 
-#: merge-recursive.c:1877
+#: bundle.c:34
 #, c-format
-msgid "Adding %s"
+msgid "'%s' does not look like a v2 bundle file"
 msgstr ""
 
-#: merge-recursive.c:1914
-msgid "Already up-to-date!"
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
 msgstr ""
 
-#: merge-recursive.c:1923
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
 #, c-format
-msgid "merging of trees %s and %s failed"
+msgid "could not open '%s'"
 msgstr ""
 
-#: merge-recursive.c:2006
-msgid "Merging:"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
 msgstr ""
 
-#: merge-recursive.c:2019
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr ""
+
+#: bundle.c:185
 #, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: merge-recursive.c:2058
-msgid "merge returned no commit"
+#: bundle.c:192
+msgid "The bundle records a complete history."
 msgstr ""
 
-#: merge-recursive.c:2121
+#: bundle.c:194
 #, c-format
-msgid "Could not parse object '%s'"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
 msgstr ""
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
-msgid "Unable to write index."
+#: bundle.c:264
+msgid "pack-objects died"
 msgstr ""
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
+#: bundle.c:304
+msgid "rev-list died"
 msgstr ""
 
-#: notes-utils.c:100
+#: bundle.c:353
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
+msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 
-#: notes-utils.c:110
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgid "unrecognized argument: %s"
 msgstr ""
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
-#, c-format
-msgid "Bad %s value: '%s'"
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
 msgstr ""
 
-#: object.c:242
+#: bundle.c:463
 #, c-format
-msgid "unable to parse object: %s"
+msgid "cannot create '%s'"
 msgstr ""
 
-#: parse-options.c:572
-msgid "..."
+#: bundle.c:491
+msgid "index-pack died"
 msgstr ""
 
-#: parse-options.c:590
+#: color.c:300
 #, c-format
-msgid "usage: %s"
+msgid "invalid color value: %.*s"
 msgstr ""
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
 #, c-format
-msgid "   or: %s"
+msgid "could not parse %s"
 msgstr ""
 
-#: parse-options.c:597
+#: commit.c:42
 #, c-format
-msgid "    %s"
+msgid "%s %s is not a commit!"
 msgstr ""
 
-#: parse-options.c:631
-msgid "-NUM"
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
 msgstr ""
 
-#: parse-options-cb.c:108
-#, c-format
-msgid "malformed object name '%s'"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
 msgstr ""
 
-#: path.c:798
-#, c-format
-msgid "Could not make %s writable by group"
+#: config.c:191
+msgid "relative config include conditionals must come from files"
 msgstr ""
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+#: config.c:711
+#, c-format
+msgid "bad config line %d in blob %s"
 msgstr ""
 
-#: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+#: config.c:715
+#, c-format
+msgid "bad config line %d in file %s"
 msgstr ""
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
+#: config.c:719
+#, c-format
+msgid "bad config line %d in standard input"
 msgstr ""
 
-#: pathspec.c:183
+#: config.c:723
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgid "bad config line %d in submodule-blob %s"
 msgstr ""
 
-#: pathspec.c:187
+#: config.c:727
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgid "bad config line %d in command line %s"
 msgstr ""
 
-#: pathspec.c:205
+#: config.c:731
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgid "bad config line %d in %s"
 msgstr ""
 
-#: pathspec.c:230
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
+#: config.c:859
+msgid "out of range"
 msgstr ""
 
-#: pathspec.c:241
-#, c-format
-msgid "%s: '%s' is outside repository"
+#: config.c:859
+msgid "invalid unit"
 msgstr ""
 
-#: pathspec.c:291
+#: config.c:865
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
+msgid "bad numeric config value '%s' for '%s': %s"
 msgstr ""
 
-#: pathspec.c:353
+#: config.c:870
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
 msgstr ""
 
-#: pathspec.c:433
+#: config.c:873
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
 msgstr ""
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
+#: config.c:876
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr ""
 
-#: pretty.c:973
-msgid "unable to parse --pretty format"
+#: config.c:879
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 msgstr ""
 
-#: progress.c:235
-msgid "done"
+#: config.c:882
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
 msgstr ""
 
-#: read-cache.c:1281
+#: config.c:885
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr ""
 
-#: read-cache.c:1291
+#: config.c:980
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+msgid "failed to expand user dir in: '%s'"
 msgstr ""
 
-#: refs.c:551 builtin/merge.c:840
+#: config.c:1075 config.c:1086
 #, c-format
-msgid "Could not open '%s' for writing"
+msgid "bad zlib compression level %d"
 msgstr ""
 
-#: refs/files-backend.c:2534
+#: config.c:1203
 #, c-format
-msgid "could not delete reference %s: %s"
+msgid "invalid mode for object creation: %s"
 msgstr ""
 
-#: refs/files-backend.c:2537
+#: config.c:1359
 #, c-format
-msgid "could not delete references: %s"
+msgid "bad pack compression level %d"
 msgstr ""
 
-#: refs/files-backend.c:2546
-#, c-format
-msgid "could not remove reference %s"
+#: config.c:1557
+msgid "unable to parse command-line config"
 msgstr ""
 
-#: ref-filter.c:55
-#, c-format
-msgid "expected format: %%(color:<color>)"
+#: config.c:1611
+msgid "unknown error occurred while reading the configuration files"
 msgstr ""
 
-#: ref-filter.c:57
+#: config.c:1970
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
+msgid "Invalid %s: '%s'"
 msgstr ""
 
-#: ref-filter.c:71
+#: config.c:1991
 #, c-format
-msgid "unrecognized format: %%(%s)"
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
 msgstr ""
 
-#: ref-filter.c:77
+#: config.c:2017
 #, c-format
-msgid "%%(body) does not take arguments"
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
 msgstr ""
 
-#: ref-filter.c:84
+#: config.c:2028
 #, c-format
-msgid "%%(subject) does not take arguments"
+msgid "unable to parse '%s' from command-line config"
 msgstr ""
 
-#: ref-filter.c:101
+#: config.c:2030
 #, c-format
-msgid "positive value expected contents:lines=%s"
+msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr ""
 
-#: ref-filter.c:103
+#: config.c:2089
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
+msgid "%s has multiple values"
 msgstr ""
 
-#: ref-filter.c:113
+#: config.c:2423 config.c:2648
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
+msgid "fstat on %s failed"
 msgstr ""
 
-#: ref-filter.c:135
+#: config.c:2541
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
+msgid "could not set '%s' to '%s'"
 msgstr ""
 
-#: ref-filter.c:147
+#: config.c:2543 builtin/remote.c:774
 #, c-format
-msgid "unrecognized position:%s"
+msgid "could not unset '%s'"
 msgstr ""
 
-#: ref-filter.c:151
-#, c-format
-msgid "unrecognized width:%s"
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
 msgstr ""
 
-#: ref-filter.c:157
-#, c-format
-msgid "unrecognized %%(align) argument: %s"
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
 msgstr ""
 
-#: ref-filter.c:161
-#, c-format
-msgid "positive width expected with the %%(align) atom"
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr ""
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr ""
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr ""
+
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
 msgstr ""
 
-#: ref-filter.c:244
+#: convert.c:201
 #, c-format
-msgid "malformed field name: %.*s"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
 
-#: ref-filter.c:270
+#: convert.c:205
 #, c-format
-msgid "unknown field name: %.*s"
+msgid "CRLF would be replaced by LF in %s."
 msgstr ""
 
-#: ref-filter.c:372
+#: convert.c:211
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
 
-#: ref-filter.c:424
+#: convert.c:215
 #, c-format
-msgid "malformed format string %s"
+msgid "LF would be replaced by CRLF in %s"
 msgstr ""
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
+#: date.c:97
+msgid "in the future"
 msgstr ""
 
-#: ref-filter.c:883
+#: date.c:103
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr ""
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ref-filter.c:1046
+#: date.c:110
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr ""
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: date.c:117
 #, c-format
-msgid "missing object %s for %s"
-msgstr ""
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: date.c:124
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ref-filter.c:1311
+#: date.c:130
 #, c-format
-msgid "malformed object at '%s'"
-msgstr ""
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ref-filter.c:1373
+#: date.c:137
 #, c-format
-msgid "ignoring ref with broken name %s"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:148
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] ""
+msgstr[1] ""
+
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:156 date.c:161
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr ""
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
 msgstr ""
 
-#: ref-filter.c:1378
+#: diff.c:62
 #, c-format
-msgid "ignoring broken ref %s"
+msgid "option '%s' requires a value"
 msgstr ""
 
-#: ref-filter.c:1651
+#: diff.c:124
 #, c-format
-msgid "format: %%(end) atom missing"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 
-#: ref-filter.c:1705
+#: diff.c:129
 #, c-format
-msgid "malformed object name %s"
+msgid "  Unknown dirstat parameter '%s'\n"
 msgstr ""
 
-#: remote.c:746
+#: diff.c:281
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
 
-#: remote.c:750
+#: diff.c:344
 #, c-format
-msgid "%s usually tracks %s, not %s"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
 msgstr ""
 
-#: remote.c:754
+#: diff.c:3102
 #, c-format
-msgid "%s tracks both %s and %s"
+msgid "external diff died, stopping at %s"
 msgstr ""
 
-#: remote.c:762
-msgid "Internal error"
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
 msgstr ""
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
+#: diff.c:3518
+msgid "--follow requires exactly one pathspec"
 msgstr ""
 
-#: remote.c:1686
+#: diff.c:3681
 #, c-format
-msgid "no such branch: '%s'"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
 msgstr ""
 
-#: remote.c:1689
+#: diff.c:3695
 #, c-format
-msgid "no upstream configured for branch '%s'"
+msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr ""
 
-#: remote.c:1695
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
 msgstr ""
 
-#: remote.c:1710
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
 msgstr ""
 
-#: remote.c:1725
+#: diff.c:4725
 #, c-format
-msgid "branch '%s' has no remote for pushing"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
 msgstr ""
 
-#: remote.c:1736
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
+#: dir.c:1899
+msgid "failed to get kernel name and information"
 msgstr ""
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
+#: dir.c:2018
+msgid "Untracked cache is disabled on this system or location."
 msgstr ""
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
+#: dir.c:2776 dir.c:2781
+#, c-format
+msgid "could not create directories for %s"
 msgstr ""
 
-#: remote.c:2073
+#: dir.c:2806
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgid "could not migrate git directory from '%s' to '%s'"
 msgstr ""
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+#: entry.c:280
+#, c-format
+msgid "could not stat file '%s'"
+msgstr ""
+
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr ""
+
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
 msgstr ""
 
-#: remote.c:2080
+#: fetch-pack.c:280 builtin/archive.c:63
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
+msgid "remote error: %s"
 msgstr ""
 
-#: remote.c:2084
+#: fetch-pack.c:281
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr ""
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
 msgstr ""
 
-#: remote.c:2093
+#: fetch-pack.c:419
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
+msgid "invalid shallow line: %s"
 msgstr ""
 
-#: remote.c:2104
+#: fetch-pack.c:425
 #, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
+msgid "invalid unshallow line: %s"
+msgstr ""
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+#: fetch-pack.c:427
+#, c-format
+msgid "object not found: %s"
 msgstr ""
 
-#: revision.c:2132
-msgid "your current branch appears to be broken"
+#: fetch-pack.c:430
+#, c-format
+msgid "error in object: %s"
 msgstr ""
 
-#: revision.c:2135
+#: fetch-pack.c:432
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
+msgid "no shallow found: %s"
 msgstr ""
 
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
+#: fetch-pack.c:435
+#, c-format
+msgid "expected shallow/unshallow, got %s"
 msgstr ""
 
-#: run-command.c:92
-msgid "open /dev/null failed"
+#: fetch-pack.c:474
+#, c-format
+msgid "got %s %d %s"
 msgstr ""
 
-#: run-command.c:94
+#: fetch-pack.c:488
 #, c-format
-msgid "dup2(%d,%d) failed"
+msgid "invalid commit %s"
 msgstr ""
 
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
+#: fetch-pack.c:521
+msgid "giving up"
 msgstr ""
 
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
 msgstr ""
 
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
+#: fetch-pack.c:543
+#, c-format
+msgid "got %s (%d) %s"
 msgstr ""
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
+#: fetch-pack.c:589
+#, c-format
+msgid "Marking %s as complete"
 msgstr ""
 
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
+#: fetch-pack.c:737
+#, c-format
+msgid "already have %s (%s)"
 msgstr ""
 
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
 msgstr ""
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
 msgstr ""
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: fetch-pack.c:839
 #, c-format
-msgid "Could not write to %s"
+msgid "fetch-pack: unable to fork off %s"
 msgstr ""
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: fetch-pack.c:855
 #, c-format
-msgid "Error wrapping up %s."
+msgid "%s failed"
 msgstr ""
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
 msgstr ""
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
 msgstr ""
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
 msgstr ""
 
-#: sequencer.c:228
-#, c-format
-msgid "%s: fast-forward"
+#: fetch-pack.c:891
+msgid "Server supports no-done"
 msgstr ""
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
-#, c-format
-msgid "%s: Unable to write new index file"
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
 msgstr ""
 
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
 msgstr ""
 
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
+#: fetch-pack.c:905
+msgid "Server supports side-band"
 msgstr ""
 
-#: sequencer.c:393
-#, c-format
-msgid "Could not parse commit %s\n"
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
 msgstr ""
 
-#: sequencer.c:398
-#, c-format
-msgid "Could not parse parent commit %s\n"
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
 msgstr ""
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
 msgstr ""
 
-#: sequencer.c:482
+#: fetch-pack.c:930
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
+msgid "Server version is %.*s"
 msgstr ""
 
-#: sequencer.c:490
-#, c-format
-msgid "Commit %s does not have parent %d"
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
 msgstr ""
 
-#: sequencer.c:494
-#, c-format
-msgid "Mainline was specified but commit %s is not a merge."
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
 msgstr ""
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
-#, c-format
-msgid "%s: cannot parse parent commit %s"
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
 msgstr ""
 
-#: sequencer.c:511
-#, c-format
-msgid "Cannot get commit message for %s"
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr ""
+
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr ""
+
+#: fetch-pack.c:1127
+msgid "no matching remote head"
 msgstr ""
 
-#: sequencer.c:597
+#: fetch-pack.c:1149
 #, c-format
-msgid "could not revert %s... %s"
+msgid "no such remote ref %s"
 msgstr ""
 
-#: sequencer.c:598
+#: fetch-pack.c:1152
 #, c-format
-msgid "could not apply %s... %s"
+msgid "Server does not allow request for unadvertised object %s"
 msgstr ""
 
-#: sequencer.c:633
-msgid "empty commit set passed"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
 msgstr ""
 
-#: sequencer.c:641
-#, c-format
-msgid "git %s: failed to read the index"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
 msgstr ""
 
-#: sequencer.c:645
+#: gpg-interface.c:217
 #, c-format
-msgid "git %s: failed to refresh the index"
+msgid "failed writing detached signature to '%s'"
 msgstr ""
 
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
 msgstr ""
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
+#: grep.c:1796
+#, c-format
+msgid "'%s': unable to read %s"
 msgstr ""
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
+#, c-format
+msgid "failed to stat '%s'"
 msgstr ""
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
+#: grep.c:1824
+#, c-format
+msgid "'%s': short read"
 msgstr ""
 
-#: sequencer.c:732
+#: help.c:218
 #, c-format
-msgid "Could not parse line %d."
+msgid "available git commands in '%s'"
 msgstr ""
 
-#: sequencer.c:737
-msgid "No commits parsed."
+#: help.c:225
+msgid "git commands available from elsewhere on your $PATH"
 msgstr ""
 
-#: sequencer.c:749
-#, c-format
-msgid "Could not open %s"
+#: help.c:256
+msgid "These are common Git commands used in various situations:"
 msgstr ""
 
-#: sequencer.c:753
+#: help.c:321
 #, c-format
-msgid "Could not read %s."
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
 
-#: sequencer.c:760
-#, c-format
-msgid "Unusable instruction sheet: %s"
+#: help.c:376
+msgid "Uh oh. Your system reports no Git commands at all."
 msgstr ""
 
-#: sequencer.c:790
+#: help.c:398
 #, c-format
-msgid "Invalid key: %s"
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#: help.c:403
 #, c-format
-msgid "Invalid value for %s: %s"
+msgid "in %0.1f seconds automatically..."
 msgstr ""
 
-#: sequencer.c:803
+#: help.c:410
 #, c-format
-msgid "Malformed options sheet: %s"
+msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr ""
 
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr ""
+#: help.c:414 help.c:480
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+msgstr[1] ""
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+#: help.c:476
+#, c-format
+msgid "%s: %s - %s"
 msgstr ""
 
-#: sequencer.c:827
-#, c-format
-msgid "Could not create sequencer directory %s"
+#: ident.c:343
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
 msgstr ""
 
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
 msgstr ""
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
+#: ident.c:372
+#, c-format
+msgid "unable to auto-detect email address (got '%s')"
 msgstr ""
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
 msgstr ""
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
+#: ident.c:388
 #, c-format
-msgid "cannot open %s"
+msgid "unable to auto-detect name (got '%s')"
 msgstr ""
 
-#: sequencer.c:888
+#: ident.c:396
 #, c-format
-msgid "cannot read %s: %s"
+msgid "empty ident name (for <%s>) not allowed"
 msgstr ""
 
-#: sequencer.c:889
-msgid "unexpected end of file"
+#: ident.c:402
+#, c-format
+msgid "name consists only of disallowed characters: %s"
 msgstr ""
 
-#: sequencer.c:895
+#: ident.c:417 builtin/commit.c:611
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgid "invalid date format: %s"
 msgstr ""
 
-#: sequencer.c:921
+#: lockfile.c:152
 #, c-format
-msgid "Could not format %s."
+msgid ""
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
 msgstr ""
 
-#: sequencer.c:1066
+#: lockfile.c:160
 #, c-format
-msgid "%s: can't cherry-pick a %s"
+msgid "Unable to create '%s.lock': %s"
 msgstr ""
 
-#: sequencer.c:1069
-#, c-format
-msgid "%s: bad revision"
+#: merge.c:41
+msgid "failed to read the cache"
 msgstr ""
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
+msgid "unable to write new index file"
 msgstr ""
 
-#: setup.c:160
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
 msgstr ""
 
-#: setup.c:173
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+msgid "addinfo_cache failed for path '%s'"
 msgstr ""
 
-#: setup.c:223
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+#: merge-recursive.c:303
+msgid "error building trees"
 msgstr ""
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
+#: merge-recursive.c:727
 #, c-format
-msgid "failed to read %s"
+msgid "failed to create path '%s'%s"
 msgstr ""
 
-#: setup.c:468
+#: merge-recursive.c:738
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
+msgid "Removing %s to make room for subdirectory\n"
 msgstr ""
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
+#: merge-recursive.c:752 merge-recursive.c:771
+msgid ": perhaps a D/F conflict?"
 msgstr ""
 
-#: setup.c:762
+#: merge-recursive.c:761
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
+msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
+#: merge-recursive.c:803 builtin/cat-file.c:34
+#, c-format
+msgid "cannot read object %s '%s'"
 msgstr ""
 
-#: setup.c:845
-msgid "Unable to read current working directory"
+#: merge-recursive.c:805
+#, c-format
+msgid "blob expected for %s '%s'"
 msgstr ""
 
-#: setup.c:920
+#: merge-recursive.c:829
 #, c-format
-msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgid "failed to open '%s': %s"
 msgstr ""
 
-#: setup.c:927
+#: merge-recursive.c:840
 #, c-format
-msgid "Cannot change to '%s/..'"
+msgid "failed to symlink '%s': %s"
 msgstr ""
 
-#: setup.c:989
+#: merge-recursive.c:845
 #, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
+msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
+#: merge-recursive.c:985
+msgid "Failed to execute internal merge"
 msgstr ""
 
-#: sha1_file.c:2434
+#: merge-recursive.c:989
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
+msgid "Unable to add %s to database"
 msgstr ""
 
-#: sha1_file.c:2438
+#: merge-recursive.c:1092
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: sha1_name.c:462
 msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
 
-#: submodule.c:68 submodule.c:102
+#: merge-recursive.c:1097
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
 msgstr ""
 
-#: submodule.c:76
+#: merge-recursive.c:1104
 #, c-format
-msgid "Could not update .gitmodules entry %s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
 msgstr ""
 
-#: submodule.c:109
+#: merge-recursive.c:1109
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
 msgstr ""
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
+#: merge-recursive.c:1143
+msgid "rename"
 msgstr ""
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
+#: merge-recursive.c:1143
+msgid "renamed"
 msgstr ""
 
-#: submodule-config.c:358
+#: merge-recursive.c:1200
 #, c-format
-msgid "invalid value for %s"
+msgid "%s is a directory in %s adding as %s instead"
 msgstr ""
 
-#: trailer.c:237
+#: merge-recursive.c:1225
 #, c-format
-msgid "running trailer command '%s' failed"
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
-#, c-format
-msgid "unknown value '%s' for key '%s'"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
 msgstr ""
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: merge-recursive.c:1292
 #, c-format
-msgid "more than one %s"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 
-#: trailer.c:582
+#: merge-recursive.c:1325
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
+msgid "Renaming %s to %s and %s to %s instead"
 msgstr ""
 
-#: trailer.c:702
+#: merge-recursive.c:1528
 #, c-format
-msgid "could not read input file '%s'"
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 
-#: trailer.c:705
-msgid "could not read from stdin"
+#: merge-recursive.c:1543
+#, c-format
+msgid "Adding merged %s"
 msgstr ""
 
-#: trailer.c:857 builtin/am.c:42
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
-msgid "could not stat %s"
+msgid "Adding as %s instead"
 msgstr ""
 
-#: trailer.c:859
+#: merge-recursive.c:1607
 #, c-format
-msgid "file %s is not a regular file"
+msgid "cannot read object %s"
 msgstr ""
 
-#: trailer.c:861
+#: merge-recursive.c:1610
 #, c-format
-msgid "file %s is not writable by user"
+msgid "object %s is not a blob"
 msgstr ""
 
-#: trailer.c:873
-msgid "could not open temporary file"
+#: merge-recursive.c:1679
+msgid "modify"
 msgstr ""
 
-#: trailer.c:912
-#, c-format
-msgid "could not rename temporary file to %s"
+#: merge-recursive.c:1679
+msgid "modified"
 msgstr ""
 
-#: transport.c:62
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+#: merge-recursive.c:1689
+msgid "content"
 msgstr ""
 
-#: transport.c:151
-#, c-format
-msgid "transport: invalid depth option '%s'"
+#: merge-recursive.c:1696
+msgid "add/add"
 msgstr ""
 
-#: transport.c:771
+#: merge-recursive.c:1732
 #, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
+msgid "Skipped %s (merged same as existing)"
 msgstr ""
 
-#: transport.c:775
+#: merge-recursive.c:1746
 #, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
+msgid "Auto-merging %s"
 msgstr ""
 
-#: transport.c:783
-msgid "Aborting."
+#: merge-recursive.c:1750 git-submodule.sh:944
+msgid "submodule"
 msgstr ""
 
-#: transport-helper.c:1041
+#: merge-recursive.c:1751
 #, c-format
-msgid "Could not read ref %s"
+msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr ""
 
-#: unpack-trees.c:64
+#: merge-recursive.c:1845
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
+msgid "Removing %s"
 msgstr ""
 
-#: unpack-trees.c:66
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
+#: merge-recursive.c:1871
+msgid "file/directory"
 msgstr ""
 
-#: unpack-trees.c:69
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
+#: merge-recursive.c:1877
+msgid "directory/file"
 msgstr ""
 
-#: unpack-trees.c:71
+#: merge-recursive.c:1883
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 
-#: unpack-trees.c:74
+#: merge-recursive.c:1892
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
+msgid "Adding %s"
 msgstr ""
 
-#: unpack-trees.c:76
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
+#: merge-recursive.c:1929
+msgid "Already up-to-date!"
 msgstr ""
 
-#: unpack-trees.c:81
+#: merge-recursive.c:1938
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
+msgid "merging of trees %s and %s failed"
 msgstr ""
 
-#: unpack-trees.c:85
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
+#: merge-recursive.c:2021
+msgid "Merging:"
 msgstr ""
 
-#: unpack-trees.c:87
+#: merge-recursive.c:2034
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: merge-recursive.c:2073
+msgid "merge returned no commit"
 msgstr ""
 
-#: unpack-trees.c:90
+#: merge-recursive.c:2136
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
+msgid "Could not parse object '%s'"
 msgstr ""
 
-#: unpack-trees.c:92
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
+msgid "Unable to write index."
 msgstr ""
 
-#: unpack-trees.c:95
+#: notes-merge.c:273
 #, c-format
 msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
 msgstr ""
 
-#: unpack-trees.c:97
+#: notes-merge.c:280
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
+msgid "You have not concluded your notes merge (%s exists)."
 msgstr ""
 
-#: unpack-trees.c:102
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
 
-#: unpack-trees.c:104
+#: notes-utils.c:100
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
+msgid "Bad notes.rewriteMode value: '%s'"
 msgstr ""
 
-#: unpack-trees.c:107
+#: notes-utils.c:110
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr ""
 
-#: unpack-trees.c:109
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
+msgid "Bad %s value: '%s'"
 msgstr ""
 
-#: unpack-trees.c:112
+#: object.c:240
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
+msgid "unable to parse object: %s"
 msgstr ""
 
-#: unpack-trees.c:114
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
+#: parse-options.c:572
+msgid "..."
 msgstr ""
 
-#: unpack-trees.c:121
+#: parse-options.c:590
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgid "usage: %s"
 msgstr ""
 
-#: unpack-trees.c:124
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
+msgid "   or: %s"
 msgstr ""
 
-#: unpack-trees.c:126
+#: parse-options.c:597
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
+msgid "    %s"
 msgstr ""
 
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
+#: parse-options.c:631
+msgid "-NUM"
 msgstr ""
 
-#: unpack-trees.c:205
+#: parse-options-cb.c:108
 #, c-format
-msgid "Aborting\n"
+msgid "malformed object name '%s'"
 msgstr ""
 
-#: unpack-trees.c:237
-msgid "Checking out files"
+#: path.c:810
+#, c-format
+msgid "Could not make %s writable by group"
 msgstr ""
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
 msgstr ""
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
-#, c-format
-msgid "invalid %XX escape sequence"
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
 msgstr ""
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
+#: pathspec.c:146
+msgid "attr spec must not be empty"
 msgstr ""
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
+#: pathspec.c:189
+#, c-format
+msgid "invalid attribute name %s"
 msgstr ""
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
+#: pathspec.c:254
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
+#: pathspec.c:261
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
+#: pathspec.c:301
+msgid "invalid parameter for pathspec magic 'prefix'"
 msgstr ""
 
-#: worktree.c:282
+#: pathspec.c:322
 #, c-format
-msgid "failed to read '%s'"
+msgid "Invalid pathspec magic '%.*s' in '%s'"
 msgstr ""
 
-#: wrapper.c:222 wrapper.c:392
+#: pathspec.c:327
 #, c-format
-msgid "could not open '%s' for reading and writing"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
 msgstr ""
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: pathspec.c:365
 #, c-format
-msgid "could not open '%s' for writing"
+msgid "Unimplemented pathspec magic '%c' in '%s'"
 msgstr ""
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: pathspec.c:421 pathspec.c:443
 #, c-format
-msgid "could not open '%s' for reading"
+msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr ""
 
-#: wrapper.c:605 wrapper.c:626
+#: pathspec.c:483
 #, c-format
-msgid "unable to access '%s'"
+msgid "%s: 'literal' and 'glob' are incompatible"
 msgstr ""
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
+#: pathspec.c:496
+#, c-format
+msgid "%s: '%s' is outside repository"
 msgstr ""
 
-#: wrapper.c:658
+#: pathspec.c:584
 #, c-format
-msgid "could not write to %s"
+msgid "'%s' (mnemonic: '%c')"
 msgstr ""
 
-#: wrapper.c:660
+#: pathspec.c:594
 #, c-format
-msgid "could not close %s"
+msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
 
-#: wt-status.c:177 wt-status.c:204
+#: pathspec.c:668
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgid "pathspec '%s' is beyond a symbolic link"
 msgstr ""
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
+#: pretty.c:982
+msgid "unable to parse --pretty format"
 msgstr ""
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
+#: read-cache.c:1442
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: read-cache.c:1452
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
+#, c-format
+msgid "could not stat '%s'"
 msgstr ""
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
+#: read-cache.c:2388
+#, c-format
+msgid "unable to open git dir: %s"
 msgstr ""
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
+#: read-cache.c:2400
+#, c-format
+msgid "unable to unlink: %s"
 msgstr ""
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
+#: refs.c:620 builtin/merge.c:844
+#, c-format
+msgid "Could not open '%s' for writing"
 msgstr ""
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
 msgstr ""
 
-#: wt-status.c:223
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+#: refs/files-backend.c:1631
+#, c-format
+msgid "could not delete reference %s: %s"
 msgstr ""
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: refs/files-backend.c:1634
+#, c-format
+msgid "could not delete references: %s"
 msgstr ""
 
-#: wt-status.c:237
+#: refs/files-backend.c:1643
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid "could not remove reference %s"
 msgstr ""
 
-#: wt-status.c:252
-msgid "both deleted:"
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
 msgstr ""
 
-#: wt-status.c:254
-msgid "added by us:"
+#: ref-filter.c:36
+#, c-format
+msgid "ahead %d"
 msgstr ""
 
-#: wt-status.c:256
-msgid "deleted by them:"
+#: ref-filter.c:37
+#, c-format
+msgid "behind %d"
 msgstr ""
 
-#: wt-status.c:258
-msgid "added by them:"
+#: ref-filter.c:38
+#, c-format
+msgid "ahead %d, behind %d"
 msgstr ""
 
-#: wt-status.c:260
-msgid "deleted by us:"
+#: ref-filter.c:104
+#, c-format
+msgid "expected format: %%(color:<color>)"
 msgstr ""
 
-#: wt-status.c:262
-msgid "both added:"
+#: ref-filter.c:106
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
 msgstr ""
 
-#: wt-status.c:264
-msgid "both modified:"
+#: ref-filter.c:120
+#, c-format
+msgid "Integer value expected refname:lstrip=%s"
 msgstr ""
 
-#: wt-status.c:274
-msgid "new file:"
+#: ref-filter.c:124
+#, c-format
+msgid "Integer value expected refname:rstrip=%s"
 msgstr ""
 
-#: wt-status.c:276
-msgid "copied:"
+#: ref-filter.c:126
+#, c-format
+msgid "unrecognized %%(%s) argument: %s"
 msgstr ""
 
-#: wt-status.c:278
-msgid "deleted:"
+#: ref-filter.c:166
+#, c-format
+msgid "%%(body) does not take arguments"
 msgstr ""
 
-#: wt-status.c:280
-msgid "modified:"
+#: ref-filter.c:173
+#, c-format
+msgid "%%(subject) does not take arguments"
 msgstr ""
 
-#: wt-status.c:282
-msgid "renamed:"
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
 msgstr ""
 
-#: wt-status.c:284
-msgid "typechange:"
+#: ref-filter.c:199
+#, c-format
+msgid "positive value expected contents:lines=%s"
 msgstr ""
 
-#: wt-status.c:286
-msgid "unknown:"
+#: ref-filter.c:201
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
 msgstr ""
 
-#: wt-status.c:288
-msgid "unmerged:"
+#: ref-filter.c:214
+#, c-format
+msgid "positive value expected objectname:short=%s"
 msgstr ""
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:372
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
+#: ref-filter.c:218
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
 msgstr ""
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
+#: ref-filter.c:245
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
 msgstr ""
 
-#: wt-status.c:839
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+#: ref-filter.c:257
+#, c-format
+msgid "unrecognized position:%s"
 msgstr ""
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
+#: ref-filter.c:261
+#, c-format
+msgid "unrecognized width:%s"
 msgstr ""
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
+#: ref-filter.c:267
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
 msgstr ""
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
+#: ref-filter.c:271
+#, c-format
+msgid "positive width expected with the %%(align) atom"
 msgstr ""
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
+#: ref-filter.c:286
+#, c-format
+msgid "unrecognized %%(if) argument: %s"
 msgstr ""
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
+#: ref-filter.c:371
+#, c-format
+msgid "malformed field name: %.*s"
 msgstr ""
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
+#: ref-filter.c:397
+#, c-format
+msgid "unknown field name: %.*s"
 msgstr ""
 
-#: wt-status.c:976
-msgid "The current patch is empty."
+#: ref-filter.c:501
+#, c-format
+msgid "format: %%(if) atom used without a %%(then) atom"
 msgstr ""
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
+#: ref-filter.c:561
+#, c-format
+msgid "format: %%(then) atom used without an %%(if) atom"
 msgstr ""
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
+#: ref-filter.c:563
+#, c-format
+msgid "format: %%(then) atom used more than once"
 msgstr ""
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
+#: ref-filter.c:565
+#, c-format
+msgid "format: %%(then) atom used after %%(else)"
 msgstr ""
 
-#: wt-status.c:1109
-msgid "No commands done."
+#: ref-filter.c:591
+#, c-format
+msgid "format: %%(else) atom used without an %%(if) atom"
 msgstr ""
 
-#: wt-status.c:1112
+#: ref-filter.c:593
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] ""
-msgstr[1] ""
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr ""
 
-#: wt-status.c:1123
+#: ref-filter.c:595
 #, c-format
-msgid "  (see more in file %s)"
+msgid "format: %%(else) atom used more than once"
 msgstr ""
 
-#: wt-status.c:1128
-msgid "No commands remaining."
+#: ref-filter.c:608
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
 msgstr ""
 
-#: wt-status.c:1131
+#: ref-filter.c:663
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgid "malformed format string %s"
 msgstr ""
 
-#: wt-status.c:1152
+#: ref-filter.c:1247
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
+msgid "(no branch, rebasing %s)"
 msgstr ""
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
 msgstr ""
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
+#, c-format
+msgid "(HEAD detached at %s)"
 msgstr ""
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
+#, c-format
+msgid "(HEAD detached from %s)"
 msgstr ""
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
+#: ref-filter.c:1265
+msgid "(no branch)"
 msgstr ""
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+#: ref-filter.c:1420 ref-filter.c:1451
+#, c-format
+msgid "missing object %s for %s"
 msgstr ""
 
-#: wt-status.c:1185
+#: ref-filter.c:1423 ref-filter.c:1454
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgid "parse_object_buffer failed on %s for %s"
 msgstr ""
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
+#: ref-filter.c:1692
+#, c-format
+msgid "malformed object at '%s'"
 msgstr ""
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+#: ref-filter.c:1759
+#, c-format
+msgid "ignoring ref with broken name %s"
 msgstr ""
 
-#: wt-status.c:1197
+#: ref-filter.c:1764
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgid "ignoring broken ref %s"
 msgstr ""
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
+#: ref-filter.c:2028
+#, c-format
+msgid "format: %%(end) atom missing"
 msgstr ""
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
+#: ref-filter.c:2109
+#, c-format
+msgid "malformed object name %s"
 msgstr ""
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+#: remote.c:754
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
 msgstr ""
 
-#: wt-status.c:1217
+#: remote.c:758
 #, c-format
-msgid "You are currently cherry-picking commit %s."
+msgid "%s usually tracks %s, not %s"
 msgstr ""
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+#: remote.c:762
+#, c-format
+msgid "%s tracks both %s and %s"
 msgstr ""
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+#: remote.c:770
+msgid "Internal error"
 msgstr ""
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+#: remote.c:1685 remote.c:1787
+msgid "HEAD does not point to a branch"
 msgstr ""
 
-#: wt-status.c:1236
+#: remote.c:1694
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr ""
-
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
+msgid "no such branch: '%s'"
 msgstr ""
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
+#: remote.c:1697
+#, c-format
+msgid "no upstream configured for branch '%s'"
 msgstr ""
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+#: remote.c:1703
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
 
-#: wt-status.c:1257
+#: remote.c:1718
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
+#: remote.c:1730
+#, c-format
+msgid "branch '%s' has no remote for pushing"
 msgstr ""
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
+#: remote.c:1741
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
 msgstr ""
 
-#: wt-status.c:1464
-msgid "On branch "
+#: remote.c:1754
+msgid "push has no destination (push.default is 'nothing')"
 msgstr ""
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
+#: remote.c:1776
+msgid "cannot resolve 'simple' push to a single destination"
 msgstr ""
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
+#: remote.c:2081
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
+#: remote.c:2085
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr ""
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
+#: remote.c:2088
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
 msgstr ""
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr ""
+#: remote.c:2092
+#, c-format
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] ""
+msgstr[1] ""
 
-#: wt-status.c:1500
-msgid "Initial commit"
+#: remote.c:2098
+msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr ""
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr ""
+#: remote.c:2101
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+msgstr[1] ""
 
-#: wt-status.c:1516
-msgid "Ignored files"
+#: remote.c:2109
+msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 
-#: wt-status.c:1520
+#: remote.c:2112
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr ""
-
-#: wt-status.c:1526
-#, c-format
-msgid "Untracked files not listed%s"
-msgstr ""
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+msgstr[1] ""
 
-#: wt-status.c:1534
-msgid "No changes"
+#: remote.c:2122
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 
-#: wt-status.c:1539
-#, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
 msgstr ""
 
-#: wt-status.c:1542
+#: revision.c:2161
 #, c-format
-msgid "no changes added to commit\n"
+msgid "your current branch '%s' does not have any commits yet"
 msgstr ""
 
-#: wt-status.c:1545
-#, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
 msgstr ""
 
-#: wt-status.c:1548
-#, c-format
-msgid "nothing added to commit but untracked files present\n"
+#: run-command.c:125
+msgid "open /dev/null failed"
 msgstr ""
 
-#: wt-status.c:1551
+#: run-command.c:127
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid "dup2(%d,%d) failed"
 msgstr ""
 
-#: wt-status.c:1554 wt-status.c:1559
+#: send-pack.c:150
 #, c-format
-msgid "nothing to commit\n"
+msgid "unable to parse remote unpack status: %s"
 msgstr ""
 
-#: wt-status.c:1557
+#: send-pack.c:152
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid "remote unpack failed: %s"
 msgstr ""
 
-#: wt-status.c:1561
-#, c-format
-msgid "nothing to commit, working tree clean\n"
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
 msgstr ""
 
-#: wt-status.c:1668
-msgid "Initial commit on "
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
 msgstr ""
 
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
+#: send-pack.c:430
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
 
-#: wt-status.c:1701
-msgid "gone"
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
 msgstr ""
 
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
 msgstr ""
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
+#: sequencer.c:215
+msgid "revert"
 msgstr ""
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
-#, c-format
-msgid "failed to unlink '%s'"
+#: sequencer.c:217
+msgid "cherry-pick"
 msgstr ""
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
+#: sequencer.c:219
+msgid "rebase -i"
 msgstr ""
 
-#: builtin/add.c:65
+#: sequencer.c:221
 #, c-format
-msgid "unexpected diff status %c"
+msgid "Unknown action: %d"
 msgstr ""
 
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
 
-#: builtin/add.c:81
-#, c-format
-msgid "remove '%s'\n"
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
 msgstr ""
 
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
+#: sequencer.c:294 sequencer.c:1682
+#, c-format
+msgid "could not lock '%s'"
 msgstr ""
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
+#, c-format
+msgid "could not write to '%s'"
 msgstr ""
 
-#: builtin/add.c:207
+#: sequencer.c:301
 #, c-format
-msgid "Could not open '%s' for writing."
+msgid "could not write eol to '%s'"
 msgstr ""
 
-#: builtin/add.c:211
-msgid "Could not write patch"
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
+#, c-format
+msgid "failed to finalize '%s'."
 msgstr ""
 
-#: builtin/add.c:214
-msgid "editing patch failed"
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
+#, c-format
+msgid "could not read '%s'"
 msgstr ""
 
-#: builtin/add.c:217
+#: sequencer.c:355
 #, c-format
-msgid "Could not stat '%s'"
+msgid "your local changes would be overwritten by %s."
 msgstr ""
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
 msgstr ""
 
-#: builtin/add.c:224
+#: sequencer.c:388
 #, c-format
-msgid "Could not apply '%s'"
+msgid "%s: fast-forward"
 msgstr ""
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
+#, c-format
+msgid "%s: Unable to write new index file"
 msgstr ""
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
 msgstr ""
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
 msgstr ""
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr ""
-
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
+#: sequencer.c:592
+#, c-format
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
+#: sequencer.c:694
+#, c-format
+msgid "could not parse commit %s\n"
 msgstr ""
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
+#: sequencer.c:699
+#, c-format
+msgid "could not parse parent commit %s\n"
 msgstr ""
 
-#: builtin/add.c:260
-msgid "update tracked files"
+#: sequencer.c:821
+#, c-format
+msgid ""
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
+#: sequencer.c:827
+#, c-format
+msgid ""
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
+#: sequencer.c:833 sequencer.c:858
+#, c-format
+msgid "This is a combination of %d commits."
 msgstr ""
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
 msgstr ""
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
+#: sequencer.c:844
+msgid "could not read HEAD"
 msgstr ""
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
 msgstr ""
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
+#: sequencer.c:852
+#, c-format
+msgid "cannot write '%s'"
 msgstr ""
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
 msgstr ""
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
+#: sequencer.c:869
+#, c-format
+msgid "could not read commit message of %s"
 msgstr ""
 
-#: builtin/add.c:292
+#: sequencer.c:876
 #, c-format
-msgid "Use -f if you really want to add them.\n"
+msgid "This is the commit message #%d:"
 msgstr ""
 
-#: builtin/add.c:300
-msgid "adding files failed"
+#: sequencer.c:881
+#, c-format
+msgid "The commit message #%d will be skipped:"
 msgstr ""
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
+#: sequencer.c:886
+#, c-format
+msgid "unknown command: %d"
 msgstr ""
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
+#: sequencer.c:952
+msgid "your index file is unmerged."
 msgstr ""
 
-#: builtin/add.c:352
+#: sequencer.c:970
 #, c-format
-msgid "--chmod param '%s' must be either -x or +x"
+msgid "commit %s is a merge but no -m option was given."
 msgstr ""
 
-#: builtin/add.c:367
+#: sequencer.c:978
 #, c-format
-msgid "Nothing specified, nothing added.\n"
+msgid "commit %s does not have parent %d"
 msgstr ""
 
-#: builtin/add.c:368
+#: sequencer.c:982
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr ""
-
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr ""
-
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
+msgid "mainline was specified but commit %s is not a merge."
 msgstr ""
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
+#: sequencer.c:988
 #, c-format
-msgid "could not read '%s'"
+msgid "cannot get commit message for %s"
 msgstr ""
 
-#: builtin/am.c:426
-msgid "could not parse author script"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
+#, c-format
+msgid "%s: cannot parse parent commit %s"
 msgstr ""
 
-#: builtin/am.c:503
+#: sequencer.c:1071 sequencer.c:1827
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
+msgid "could not rename '%s' to '%s'"
 msgstr ""
 
-#: builtin/am.c:544 builtin/notes.c:301
+#: sequencer.c:1122
 #, c-format
-msgid "Malformed input line: '%s'."
+msgid "could not revert %s... %s"
 msgstr ""
 
-#: builtin/am.c:581 builtin/notes.c:316
+#: sequencer.c:1123
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
+msgid "could not apply %s... %s"
 msgstr ""
 
-#: builtin/am.c:607
-msgid "fseek failed"
+#: sequencer.c:1165
+msgid "empty commit set passed"
 msgstr ""
 
-#: builtin/am.c:787
+#: sequencer.c:1175
 #, c-format
-msgid "could not parse patch '%s'"
+msgid "git %s: failed to read the index"
 msgstr ""
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
+#: sequencer.c:1182
+#, c-format
+msgid "git %s: failed to refresh the index"
 msgstr ""
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
+#: sequencer.c:1303
+#, c-format
+msgid "invalid line %d: %.*s"
 msgstr ""
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
+#: sequencer.c:1311
+#, c-format
+msgid "cannot '%s' without a previous commit"
 msgstr ""
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
+#: sequencer.c:1344
+#, c-format
+msgid "could not read '%s'."
 msgstr ""
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
 msgstr ""
 
-#: builtin/am.c:1001 builtin/clone.c:380
+#: sequencer.c:1358
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr ""
-
-#: builtin/am.c:1005
-msgid "Failed to split patches."
+msgid "unusable instruction sheet: '%s'"
 msgstr ""
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
+#: sequencer.c:1363
+msgid "no commits parsed."
 msgstr ""
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
 msgstr ""
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
 msgstr ""
 
-#: builtin/am.c:1190
+#: sequencer.c:1439
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
+msgid "invalid key: %s"
 msgstr ""
 
-#: builtin/am.c:1402 builtin/log.c:1543
+#: sequencer.c:1442
 #, c-format
-msgid "invalid ident line: %s"
+msgid "invalid value for %s: %s"
 msgstr ""
 
-#: builtin/am.c:1429
+#: sequencer.c:1499
 #, c-format
-msgid "unable to parse commit %s"
+msgid "malformed options sheet: '%s'"
 msgstr ""
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr ""
 
-#: builtin/am.c:1623
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+#: sequencer.c:1541
+#, c-format
+msgid "could not create sequencer directory '%s'"
 msgstr ""
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
+#: sequencer.c:1555
+msgid "could not lock HEAD"
 msgstr ""
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
 msgstr ""
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
 msgstr ""
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
 msgstr ""
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
+#: sequencer.c:1635 builtin/grep.c:910
+#, c-format
+msgid "cannot open '%s'"
 msgstr ""
 
-#: builtin/am.c:1731 builtin/am.c:1735
+#: sequencer.c:1637
 #, c-format
-msgid "cannot resume: %s does not exist."
+msgid "cannot read '%s': %s"
 msgstr ""
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
+#: sequencer.c:1638
+msgid "unexpected end of file"
 msgstr ""
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
+#: sequencer.c:1644
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
 msgstr ""
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
 msgstr ""
 
-#: builtin/am.c:1853 builtin/am.c:1925
+#: sequencer.c:1832 builtin/difftool.c:616
 #, c-format
-msgid "Applying: %.*s"
-msgstr ""
-
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
+msgid "could not copy '%s' to '%s'"
 msgstr ""
 
-#: builtin/am.c:1877
-#, c-format
-msgid "Patch failed at %s %.*s"
+#: sequencer.c:1848
+msgid "could not read index"
 msgstr ""
 
-#: builtin/am.c:1883
+#: sequencer.c:1853
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
 
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
 msgstr ""
 
-#: builtin/am.c:1935
+#: sequencer.c:1865
+#, c-format
 msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
+#: sequencer.c:1920 git-rebase.sh:169
 #, c-format
-msgid "Could not parse object '%s'."
+msgid "Applied autostash."
 msgstr ""
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
+#: sequencer.c:1932
+#, c-format
+msgid "cannot store %s"
 msgstr ""
 
-#: builtin/am.c:2129
+#: sequencer.c:1934 git-rebase.sh:173
+#, c-format
 msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
 msgstr ""
 
-#: builtin/am.c:2192
+#: sequencer.c:2016
 #, c-format
-msgid "Invalid value for --patch-format: %s"
+msgid "Stopped at %s...  %.*s\n"
 msgstr ""
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+#: sequencer.c:2058
+#, c-format
+msgid "unknown command %d"
 msgstr ""
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
+#: sequencer.c:2088
+msgid "could not read orig-head"
 msgstr ""
 
-#: builtin/am.c:2232
-msgid "run interactively"
+#: sequencer.c:2092
+msgid "could not read 'onto'"
 msgstr ""
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
+#: sequencer.c:2099
+#, c-format
+msgid "could not update %s"
 msgstr ""
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
+#: sequencer.c:2106
+#, c-format
+msgid "could not update HEAD to %s"
 msgstr ""
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
 msgstr ""
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
 msgstr ""
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
 msgstr ""
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
+#: sequencer.c:2206
+#, c-format
+msgid "invalid file: '%s'"
 msgstr ""
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
+#: sequencer.c:2208
+#, c-format
+msgid "invalid contents: '%s'"
 msgstr ""
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+#: sequencer.c:2221
+msgid "could not commit staged changes."
 msgstr ""
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: sequencer.c:2301
+#, c-format
+msgid "%s: can't cherry-pick a %s"
 msgstr ""
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
+#: sequencer.c:2305
+#, c-format
+msgid "%s: bad revision"
 msgstr ""
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
 msgstr ""
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
+#: setup.c:165
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 msgstr ""
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
+#: setup.c:178
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
+#: setup.c:228
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134
-#: builtin/pull.c:193 builtin/repack.c:181 builtin/repack.c:185
-#: builtin/show-branch.c:645 builtin/show-ref.c:175 builtin/tag.c:340
-#: parse-options.h:132 parse-options.h:134 parse-options.h:244
-msgid "n"
+#: setup.c:475
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
 msgstr ""
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
+#: setup.c:483
+msgid "unknown repository extensions found:"
 msgstr ""
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
+#: setup.c:776
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
 msgstr ""
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
 msgstr ""
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
+#: setup.c:1010
+msgid "Unable to read current working directory"
 msgstr ""
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
+#: setup.c:1022 setup.c:1028
+#, c-format
+msgid "Cannot change to '%s'"
 msgstr ""
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
+#: setup.c:1041
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
 msgstr ""
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
+#: setup.c:1106
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
 msgstr ""
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
+#: sha1_file.c:559
+#, c-format
+msgid "path '%s' does not exist"
 msgstr ""
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
+#: sha1_file.c:585
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
 msgstr ""
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
+#: sha1_file.c:591
+#, c-format
+msgid "reference repository '%s' is not a local repository."
 msgstr ""
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
+#: sha1_file.c:597
+#, c-format
+msgid "reference repository '%s' is shallow"
 msgstr ""
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
+#: sha1_file.c:605
+#, c-format
+msgid "reference repository '%s' is grafted"
 msgstr ""
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
 msgstr ""
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
 msgstr ""
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
+#: sha1_file.c:2725
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
 msgstr ""
 
-#: builtin/am.c:2348
+#: sha1_name.c:409
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
+msgid "short SHA1 %s is ambiguous"
 msgstr ""
 
-#: builtin/am.c:2372
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+#: sha1_name.c:420
+msgid "The candidates are:"
 msgstr ""
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
+#: sha1_name.c:580
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
 msgstr ""
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
 
-#: builtin/apply.c:153
+#: submodule.c:71 submodule.c:105
 #, c-format
-msgid "unrecognized whitespace option '%s'"
+msgid "Could not find section in .gitmodules where path=%s"
 msgstr ""
 
-#: builtin/apply.c:169
+#: submodule.c:79
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
+msgid "Could not update .gitmodules entry %s"
 msgstr ""
 
-#: builtin/apply.c:854
+#: submodule.c:112
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
+msgid "Could not remove .gitmodules entry for %s"
 msgstr ""
 
-#: builtin/apply.c:863
-#, c-format
-msgid "regexec returned %d for input: %s"
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr ""
+
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
 msgstr ""
 
-#: builtin/apply.c:947
+#: submodule.c:1194
 #, c-format
-msgid "unable to find filename in patch at line %d"
+msgid "'%s' not recognized as a git repository"
 msgstr ""
 
-#: builtin/apply.c:984
+#: submodule.c:1332
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgid "could not start 'git status' in submodule '%s'"
 msgstr ""
 
-#: builtin/apply.c:989
+#: submodule.c:1345
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgid "could not run 'git status' in submodule '%s'"
 msgstr ""
 
-#: builtin/apply.c:990
+#: submodule.c:1421
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgid "submodule '%s' has dirty index"
 msgstr ""
 
-#: builtin/apply.c:995
+#: submodule.c:1678
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
 msgstr ""
 
-#: builtin/apply.c:1489
+#: submodule.c:1690 submodule.c:1746
 #, c-format
-msgid "recount: unexpected line: %.*s"
+msgid "could not lookup name for submodule '%s'"
 msgstr ""
 
-#: builtin/apply.c:1550
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
+msgid "could not create directory '%s'"
 msgstr ""
 
-#: builtin/apply.c:1567
+#: submodule.c:1697
 #, c-format
 msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
+msgstr ""
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
+#: submodule.c:1781
+#, c-format
+msgid "could not recurse into submodule '%s'"
 msgstr ""
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
+#: submodule.c:1825
+msgid "could not start ls-files in .."
 msgstr ""
 
-#: builtin/apply.c:1774
-#, c-format
-msgid "corrupt patch at line %d"
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
 msgstr ""
 
-#: builtin/apply.c:1810
+#: submodule.c:1864
 #, c-format
-msgid "new file %s depends on old contents"
+msgid "ls-tree returned unexpected return code %d"
 msgstr ""
 
-#: builtin/apply.c:1812
+#: submodule-config.c:380
 #, c-format
-msgid "deleted file %s still has contents"
+msgid "invalid value for %s"
 msgstr ""
 
-#: builtin/apply.c:1815
+#: trailer.c:240
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
+msgid "running trailer command '%s' failed"
 msgstr ""
 
-#: builtin/apply.c:1962
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
+msgid "unknown value '%s' for key '%s'"
 msgstr ""
 
-#: builtin/apply.c:1999
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
 #, c-format
-msgid "unrecognized binary patch at line %d"
+msgid "more than one %s"
 msgstr ""
 
-#: builtin/apply.c:2154
+#: trailer.c:702
 #, c-format
-msgid "patch with only garbage at line %d"
+msgid "empty trailer token in trailer '%.*s'"
 msgstr ""
 
-#: builtin/apply.c:2244
+#: trailer.c:722
 #, c-format
-msgid "unable to read symlink %s"
+msgid "could not read input file '%s'"
 msgstr ""
 
-#: builtin/apply.c:2248
-#, c-format
-msgid "unable to open or read %s"
+#: trailer.c:725
+msgid "could not read from stdin"
 msgstr ""
 
-#: builtin/apply.c:2901
+#: trailer.c:949 builtin/am.c:44
 #, c-format
-msgid "invalid start of line: '%c'"
+msgid "could not stat %s"
 msgstr ""
 
-#: builtin/apply.c:3020
+#: trailer.c:951
 #, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
+msgid "file %s is not a regular file"
+msgstr ""
 
-#: builtin/apply.c:3032
+#: trailer.c:953
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgid "file %s is not writable by user"
 msgstr ""
 
-#: builtin/apply.c:3038
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
+#: trailer.c:965
+msgid "could not open temporary file"
 msgstr ""
 
-#: builtin/apply.c:3060
+#: trailer.c:1001
 #, c-format
-msgid "missing binary patch data for '%s'"
+msgid "could not rename temporary file to %s"
 msgstr ""
 
-#: builtin/apply.c:3163
+#: transport.c:62
 #, c-format
-msgid "binary patch does not apply to '%s'"
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
 msgstr ""
 
-#: builtin/apply.c:3169
+#: transport.c:151
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgid "transport: invalid depth option '%s'"
 msgstr ""
 
-#: builtin/apply.c:3190
+#: transport.c:889
 #, c-format
-msgid "patch failed: %s:%ld"
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
 msgstr ""
 
-#: builtin/apply.c:3314
+#: transport.c:893
 #, c-format
-msgid "cannot checkout %s"
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
 msgstr ""
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
+#: transport.c:901
+msgid "Aborting."
 msgstr ""
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
+#: transport-helper.c:1080
 #, c-format
-msgid "path %s has been renamed/deleted"
+msgid "Could not read ref %s"
 msgstr ""
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
-#, c-format
-msgid "%s: does not exist in index"
+#: tree-walk.c:31
+msgid "too-short tree object"
 msgstr ""
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
-#, c-format
-msgid "%s: %s"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
 msgstr ""
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
-#, c-format
-msgid "%s: does not match index"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
 msgstr ""
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
+#: tree-walk.c:113
+msgid "too-short tree file"
 msgstr ""
 
-#: builtin/apply.c:3669
+#: unpack-trees.c:104
 #, c-format
-msgid "%s: wrong type"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
 
-#: builtin/apply.c:3671
+#: unpack-trees.c:106
 #, c-format
-msgid "%s has type %o, expected %o"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: unpack-trees.c:109
 #, c-format
-msgid "invalid path '%s'"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
 msgstr ""
 
-#: builtin/apply.c:3879
+#: unpack-trees.c:111
 #, c-format
-msgid "%s: already exists in index"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:3882
+#: unpack-trees.c:114
 #, c-format
-msgid "%s: already exists in working directory"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
 msgstr ""
 
-#: builtin/apply.c:3902
+#: unpack-trees.c:116
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:3907
+#: unpack-trees.c:121
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:3927
+#: unpack-trees.c:125
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
 
-#: builtin/apply.c:3931
+#: unpack-trees.c:127
 #, c-format
-msgid "%s: patch does not apply"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:3945
+#: unpack-trees.c:130
 #, c-format
-msgid "Checking patch %s..."
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
 msgstr ""
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
+#: unpack-trees.c:132
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:4182
+#: unpack-trees.c:135
 #, c-format
-msgid "unable to remove %s from index"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
 msgstr ""
 
-#: builtin/apply.c:4215
+#: unpack-trees.c:137
 #, c-format
-msgid "corrupt patch for submodule %s"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:4219
+#: unpack-trees.c:142
 #, c-format
-msgid "unable to stat newly created file '%s'"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
 
-#: builtin/apply.c:4224
+#: unpack-trees.c:144
 #, c-format
-msgid "unable to create backing store for newly created file %s"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
+#: unpack-trees.c:147
 #, c-format
-msgid "unable to add cache entry for %s"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
 msgstr ""
 
-#: builtin/apply.c:4260
+#: unpack-trees.c:149
 #, c-format
-msgid "closing file '%s'"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:4313
+#: unpack-trees.c:152
 #, c-format
-msgid "unable to write file '%s' mode %o"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
 msgstr ""
 
-#: builtin/apply.c:4403
+#: unpack-trees.c:154
 #, c-format
-msgid "Applied patch %s cleanly."
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:4411
-msgid "internal error"
+#: unpack-trees.c:161
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
 msgstr ""
 
-#: builtin/apply.c:4414
+#: unpack-trees.c:164
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
 
-#: builtin/apply.c:4424
+#: unpack-trees.c:166
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:4432
+#: unpack-trees.c:168
 #, c-format
-msgid "cannot open %s: %s"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:4445
+#: unpack-trees.c:170
 #, c-format
-msgid "Hunk #%d applied cleanly."
+msgid ""
+"Cannot update submodule:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:4448
+#: unpack-trees.c:247
 #, c-format
-msgid "Rejected hunk #%d."
+msgid "Aborting\n"
 msgstr ""
 
-#: builtin/apply.c:4537
+#: unpack-trees.c:272
 #, c-format
-msgid "Skipped patch '%s'."
+msgid "submodule update strategy not supported for submodule '%s'"
 msgstr ""
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
+#: unpack-trees.c:340
+msgid "Checking out files"
 msgstr ""
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
 msgstr ""
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
+#, c-format
+msgid "invalid %XX escape sequence"
 msgstr ""
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
 msgstr ""
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
 msgstr ""
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
 msgstr ""
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
 msgstr ""
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
 msgstr ""
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
+#: worktree.c:285
+#, c-format
+msgid "failed to read '%s'"
 msgstr ""
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
 msgstr ""
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
 msgstr ""
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
 msgstr ""
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
 msgstr ""
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
+#: wrapper.c:610
+msgid "unable to get current working directory"
 msgstr ""
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
+#: wrapper.c:634
+#, c-format
+msgid "could not write to %s"
 msgstr ""
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
+#: wrapper.c:636
+#, c-format
+msgid "could not close %s"
 msgstr ""
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
+#: wt-status.c:151
+msgid "Unmerged paths:"
 msgstr ""
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
+#: wt-status.c:178 wt-status.c:205
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
 msgstr ""
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
 msgstr ""
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
 msgstr ""
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
 msgstr ""
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
+#: wt-status.c:238
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
+#: wt-status.c:253
+msgid "both deleted:"
 msgstr ""
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
+#: wt-status.c:255
+msgid "added by us:"
 msgstr ""
 
-#: builtin/archive.c:17
-#, c-format
-msgid "could not create archive file '%s'"
+#: wt-status.c:257
+msgid "deleted by them:"
 msgstr ""
 
-#: builtin/archive.c:20
-msgid "could not redirect output"
+#: wt-status.c:259
+msgid "added by them:"
 msgstr ""
 
-#: builtin/archive.c:37
-msgid "git archive: Remote with no URL"
+#: wt-status.c:261
+msgid "deleted by us:"
 msgstr ""
 
-#: builtin/archive.c:58
-msgid "git archive: expected ACK/NAK, got EOF"
+#: wt-status.c:263
+msgid "both added:"
 msgstr ""
 
-#: builtin/archive.c:61
-#, c-format
-msgid "git archive: NACK %s"
+#: wt-status.c:265
+msgid "both modified:"
 msgstr ""
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
+#: wt-status.c:275
+msgid "new file:"
 msgstr ""
 
-#: builtin/archive.c:64
-msgid "git archive: protocol error"
+#: wt-status.c:277
+msgid "copied:"
 msgstr ""
 
-#: builtin/archive.c:68
-msgid "git archive: expected a flush"
+#: wt-status.c:279
+msgid "deleted:"
 msgstr ""
 
-#: builtin/bisect--helper.c:7
-msgid "git bisect--helper --next-all [--no-checkout]"
+#: wt-status.c:281
+msgid "modified:"
 msgstr ""
 
-#: builtin/bisect--helper.c:17
-msgid "perform 'git bisect next'"
+#: wt-status.c:283
+msgid "renamed:"
 msgstr ""
 
-#: builtin/bisect--helper.c:19
-msgid "update BISECT_HEAD instead of checking out the current commit"
+#: wt-status.c:285
+msgid "typechange:"
 msgstr ""
 
-#: builtin/blame.c:33
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
+#: wt-status.c:287
+msgid "unknown:"
 msgstr ""
 
-#: builtin/blame.c:38
-msgid "<rev-opts> are documented in git-rev-list(1)"
+#: wt-status.c:289
+msgid "unmerged:"
 msgstr ""
 
-#: builtin/blame.c:1781
-msgid "Blaming lines"
+#: wt-status.c:371
+msgid "new commits, "
 msgstr ""
 
-#: builtin/blame.c:2536
-msgid "Show blame entries as we find them, incrementally"
+#: wt-status.c:373
+msgid "modified content, "
 msgstr ""
 
-#: builtin/blame.c:2537
-msgid "Show blank SHA-1 for boundary commits (Default: off)"
+#: wt-status.c:375
+msgid "untracked content, "
 msgstr ""
 
-#: builtin/blame.c:2538
-msgid "Do not treat root commits as boundaries (Default: off)"
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
 msgstr ""
 
-#: builtin/blame.c:2539
-msgid "Show work cost statistics"
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
 msgstr ""
 
-#: builtin/blame.c:2540
-msgid "Force progress reporting"
+#: wt-status.c:914
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
 
-#: builtin/blame.c:2541
-msgid "Show output score for blame entries"
+#: wt-status.c:1026
+msgid "You have unmerged paths."
 msgstr ""
 
-#: builtin/blame.c:2542
-msgid "Show original filename (Default: auto)"
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
 msgstr ""
 
-#: builtin/blame.c:2543
-msgid "Show original linenumber (Default: off)"
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
 msgstr ""
 
-#: builtin/blame.c:2544
-msgid "Show in a format designed for machine consumption"
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
 msgstr ""
 
-#: builtin/blame.c:2545
-msgid "Show porcelain format with per-line commit information"
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
 msgstr ""
 
-#: builtin/blame.c:2546
-msgid "Use the same output mode as git-annotate (Default: off)"
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
 msgstr ""
 
-#: builtin/blame.c:2547
-msgid "Show raw timestamp (Default: off)"
+#: wt-status.c:1052
+msgid "The current patch is empty."
 msgstr ""
 
-#: builtin/blame.c:2548
-msgid "Show long commit SHA1 (Default: off)"
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr ""
 
-#: builtin/blame.c:2549
-msgid "Suppress author name and timestamp (Default: off)"
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr ""
 
-#: builtin/blame.c:2550
-msgid "Show author email instead of name (Default: off)"
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 
-#: builtin/blame.c:2551
-msgid "Ignore whitespace differences"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
 msgstr ""
 
-#: builtin/blame.c:2552
-msgid "Spend extra cycles to find better match"
+#: wt-status.c:1191
+msgid "No commands done."
 msgstr ""
 
-#: builtin/blame.c:2553
-msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr ""
+#: wt-status.c:1194
+#, c-format
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/blame.c:2554
-msgid "Use <file>'s contents as the final image"
+#: wt-status.c:1205
+#, c-format
+msgid "  (see more in file %s)"
 msgstr ""
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
-msgid "score"
+#: wt-status.c:1210
+msgid "No commands remaining."
 msgstr ""
 
-#: builtin/blame.c:2555
-msgid "Find line copies within and across files"
+#: wt-status.c:1213
+#, c-format
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] ""
+msgstr[1] ""
+
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
 msgstr ""
 
-#: builtin/blame.c:2556
-msgid "Find line movements within and across files"
+#: wt-status.c:1234
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: builtin/blame.c:2557
-msgid "n,m"
+#: wt-status.c:1239
+msgid "You are currently rebasing."
 msgstr ""
 
-#: builtin/blame.c:2557
-msgid "Process only line range n,m, counting from 1"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
 
-#. TRANSLATORS: This string is used to tell us the maximum
-#. display width for a relative timestamp in "git blame"
-#. output.  For C locale, "4 years, 11 months ago", which
-#. takes 22 places, is the longest among various forms of
-#. relative timestamps, but your language may need more or
-#. fewer display columns.
-#: builtin/blame.c:2649
-msgid "4 years, 11 months ago"
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr ""
 
-#: builtin/branch.c:26
-msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 
-#: builtin/branch.c:27
-msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr ""
 
-#: builtin/branch.c:28
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
+#: wt-status.c:1267
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: builtin/branch.c:29
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
 msgstr ""
 
-#: builtin/branch.c:30
-msgid "git branch [<options>] [-r | -a] [--points-at]"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 
-#: builtin/branch.c:143
+#: wt-status.c:1279
 #, c-format
-msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: builtin/branch.c:147
-#, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
 msgstr ""
 
-#: builtin/branch.c:161
-#, c-format
-msgid "Couldn't look up commit object for '%s'"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 
-#: builtin/branch.c:165
-#, c-format
+#: wt-status.c:1289
 msgid ""
-"The branch '%s' is not fully merged.\n"
-"If you are sure you want to delete it, run 'git branch -D %s'."
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 
-#: builtin/branch.c:178
-msgid "Update of config-file failed"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
 msgstr ""
 
-#: builtin/branch.c:206
-msgid "cannot use -a with -d"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: builtin/branch.c:212
-msgid "Couldn't look up commit object for HEAD"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: builtin/branch.c:226
-#, c-format
-msgid "Cannot delete branch '%s' checked out at '%s'"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 
-#: builtin/branch.c:241
+#: wt-status.c:1318
 #, c-format
-msgid "remote-tracking branch '%s' not found."
+msgid "You are currently reverting commit %s."
 msgstr ""
 
-#: builtin/branch.c:242
-#, c-format
-msgid "branch '%s' not found."
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr ""
 
-#: builtin/branch.c:257
-#, c-format
-msgid "Error deleting remote-tracking branch '%s'"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
 
-#: builtin/branch.c:258
-#, c-format
-msgid "Error deleting branch '%s'"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 
-#: builtin/branch.c:265
+#: wt-status.c:1339
 #, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
+msgid "You are currently bisecting, started from branch '%s'."
 msgstr ""
 
-#: builtin/branch.c:266
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
 msgstr ""
 
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
+#: wt-status.c:1543
+msgid "On branch "
 msgstr ""
 
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
 msgstr ""
 
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
 msgstr ""
 
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
+#: wt-status.c:1556
+msgid "HEAD detached at "
 msgstr ""
 
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
+#: wt-status.c:1558
+msgid "HEAD detached from "
 msgstr ""
 
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
+#: wt-status.c:1561
+msgid "Not currently on any branch."
 msgstr ""
 
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
+#: wt-status.c:1579
+msgid "Initial commit"
 msgstr ""
 
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
+#: wt-status.c:1593
+msgid "Untracked files"
 msgstr ""
 
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
+#: wt-status.c:1595
+msgid "Ignored files"
 msgstr ""
 
-#: builtin/branch.c:378
+#: wt-status.c:1599
 #, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
 msgstr ""
 
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
+#: wt-status.c:1605
 #, c-format
-msgid "(HEAD detached from %s)"
+msgid "Untracked files not listed%s"
 msgstr ""
 
-#: builtin/branch.c:393
-msgid "(no branch)"
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
 msgstr ""
 
-#: builtin/branch.c:544
-#, c-format
-msgid "Branch %s is being rebased at %s"
+#: wt-status.c:1613
+msgid "No changes"
 msgstr ""
 
-#: builtin/branch.c:548
+#: wt-status.c:1618
 #, c-format
-msgid "Branch %s is being bisected at %s"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 
-#: builtin/branch.c:563
-msgid "cannot rename the current branch while not on any."
+#: wt-status.c:1621
+#, c-format
+msgid "no changes added to commit\n"
 msgstr ""
 
-#: builtin/branch.c:573
+#: wt-status.c:1624
 #, c-format
-msgid "Invalid branch name: '%s'"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
 
-#: builtin/branch.c:590
-msgid "Branch rename failed"
+#: wt-status.c:1627
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 
-#: builtin/branch.c:594
+#: wt-status.c:1630
 #, c-format
-msgid "Renamed a misnamed branch '%s' away"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 
-#: builtin/branch.c:597
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
+msgid "nothing to commit\n"
 msgstr ""
 
-#: builtin/branch.c:604
-msgid "Branch is renamed, but update of config-file failed"
+#: wt-status.c:1636
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 
-#: builtin/branch.c:620
+#: wt-status.c:1640
 #, c-format
-msgid ""
-"Please edit the description for the branch\n"
-"  %s\n"
-"Lines starting with '%c' will be stripped.\n"
+msgid "nothing to commit, working tree clean\n"
 msgstr ""
 
-#: builtin/branch.c:651
-msgid "Generic options"
+#: wt-status.c:1749
+msgid "Initial commit on "
 msgstr ""
 
-#: builtin/branch.c:653
-msgid "show hash and subject, give twice for upstream branch"
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
 msgstr ""
 
-#: builtin/branch.c:654
-msgid "suppress informational messages"
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
 msgstr ""
 
-#: builtin/branch.c:655
-msgid "set up tracking mode (see git-pull(1))"
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
 msgstr ""
 
-#: builtin/branch.c:657
-msgid "change upstream info"
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
+#, c-format
+msgid "cannot %s: You have unstaged changes."
 msgstr ""
 
-#: builtin/branch.c:659
-msgid "upstream"
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
 msgstr ""
 
-#: builtin/branch.c:659
-msgid "change the upstream info"
+#: wt-status.c:2288
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
 msgstr ""
 
-#: builtin/branch.c:661
-msgid "use colored output"
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
+#, c-format
+msgid "failed to unlink '%s'"
 msgstr ""
 
-#: builtin/branch.c:662
-msgid "act on remote-tracking branches"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/branch.c:664 builtin/branch.c:665
-msgid "print only branches that contain the commit"
+#: builtin/add.c:80
+#, c-format
+msgid "unexpected diff status %c"
 msgstr ""
 
-#: builtin/branch.c:668
-msgid "Specific git-branch actions:"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
 msgstr ""
 
-#: builtin/branch.c:669
-msgid "list both remote-tracking and local branches"
+#: builtin/add.c:95
+#, c-format
+msgid "remove '%s'\n"
 msgstr ""
 
-#: builtin/branch.c:671
-msgid "delete fully merged branch"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 
-#: builtin/branch.c:672
-msgid "delete branch (even if not merged)"
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
 msgstr ""
 
-#: builtin/branch.c:673
-msgid "move/rename a branch and its reflog"
+#: builtin/add.c:220
+#, c-format
+msgid "Could not open '%s' for writing."
 msgstr ""
 
-#: builtin/branch.c:674
-msgid "move/rename a branch, even if target exists"
+#: builtin/add.c:224
+msgid "Could not write patch"
 msgstr ""
 
-#: builtin/branch.c:675
-msgid "list branch names"
+#: builtin/add.c:227
+msgid "editing patch failed"
 msgstr ""
 
-#: builtin/branch.c:676
-msgid "create the branch's reflog"
+#: builtin/add.c:230
+#, c-format
+msgid "Could not stat '%s'"
 msgstr ""
 
-#: builtin/branch.c:678
-msgid "edit the description for the branch"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
 msgstr ""
 
-#: builtin/branch.c:679
-msgid "force creation, move/rename, deletion"
+#: builtin/add.c:237
+#, c-format
+msgid "Could not apply '%s'"
 msgstr ""
 
-#: builtin/branch.c:680
-msgid "print only branches that are merged"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 
-#: builtin/branch.c:681
-msgid "print only branches that are not merged"
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
 msgstr ""
 
-#: builtin/branch.c:682
-msgid "list branches in columns"
+#: builtin/add.c:269
+msgid "interactive picking"
 msgstr ""
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
-msgid "key"
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
 msgstr ""
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
-msgid "field name to sort on"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
 msgstr ""
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
-msgid "object"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
 msgstr ""
 
-#: builtin/branch.c:687
-msgid "print only branches of the object"
+#: builtin/add.c:273
+msgid "update tracked files"
 msgstr ""
 
-#: builtin/branch.c:705
-msgid "Failed to resolve HEAD as a valid ref."
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
 msgstr ""
 
-#: builtin/branch.c:709 builtin/clone.c:707
-msgid "HEAD not found below refs/heads!"
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
 msgstr ""
 
-#: builtin/branch.c:729
-msgid "--column and --verbose are incompatible"
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 
-#: builtin/branch.c:740 builtin/branch.c:782
-msgid "branch name required"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
 msgstr ""
 
-#: builtin/branch.c:758
-msgid "Cannot give description to detached HEAD"
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
 msgstr ""
 
-#: builtin/branch.c:763
-msgid "cannot edit description of more than one branch"
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
 msgstr ""
 
-#: builtin/branch.c:770
-#, c-format
-msgid "No commit on branch '%s' yet."
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
 msgstr ""
 
-#: builtin/branch.c:773
-#, c-format
-msgid "No branch named '%s'."
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
 msgstr ""
 
-#: builtin/branch.c:788
-msgid "too many branches for a rename operation"
+#: builtin/add.c:305
+#, c-format
+msgid "Use -f if you really want to add them.\n"
 msgstr ""
 
-#: builtin/branch.c:793
-msgid "too many branches to set new upstream"
+#: builtin/add.c:312
+msgid "adding files failed"
 msgstr ""
 
-#: builtin/branch.c:797
-#, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
 msgstr ""
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
-#, c-format
-msgid "no such branch '%s'"
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 
-#: builtin/branch.c:804
+#: builtin/add.c:359
 #, c-format
-msgid "branch '%s' does not exist"
-msgstr ""
-
-#: builtin/branch.c:816
-msgid "too many branches to unset upstream"
+msgid "--chmod param '%s' must be either -x or +x"
 msgstr ""
 
-#: builtin/branch.c:820
-msgid "could not unset upstream of HEAD when it does not point to any branch."
+#: builtin/add.c:374
+#, c-format
+msgid "Nothing specified, nothing added.\n"
 msgstr ""
 
-#: builtin/branch.c:826
+#: builtin/add.c:375
 #, c-format
-msgid "Branch '%s' has no upstream information"
+msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr ""
 
-#: builtin/branch.c:840
-msgid "it does not make sense to create 'HEAD' manually"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
 msgstr ""
 
-#: builtin/branch.c:846
-msgid "-a and -r options to 'git branch' do not make sense with a branch name"
+#: builtin/am.c:412
+msgid "could not parse author script"
 msgstr ""
 
-#: builtin/branch.c:849
+#: builtin/am.c:489
 #, c-format
-msgid ""
-"The --set-upstream flag is deprecated and will be removed. Consider using --"
-"track or --set-upstream-to\n"
+msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr ""
 
-#: builtin/branch.c:866
+#: builtin/am.c:530
 #, c-format
-msgid ""
-"\n"
-"If you wanted to make '%s' track '%s', do this:\n"
-"\n"
+msgid "Malformed input line: '%s'."
 msgstr ""
 
-#: builtin/bundle.c:51
+#: builtin/am.c:567
 #, c-format
-msgid "%s is okay\n"
+msgid "Failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/bundle.c:64
-msgid "Need a repository to create a bundle."
+#: builtin/am.c:593
+msgid "fseek failed"
 msgstr ""
 
-#: builtin/bundle.c:68
-msgid "Need a repository to unbundle."
+#: builtin/am.c:777
+#, c-format
+msgid "could not parse patch '%s'"
 msgstr ""
 
-#: builtin/cat-file.c:443
-msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/am.c:889
+msgid "invalid timestamp"
 msgstr ""
 
-#: builtin/cat-file.c:481
-msgid "<type> can be one of: blob, tree, commit, tag"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
 msgstr ""
 
-#: builtin/cat-file.c:482
-msgid "show object type"
+#: builtin/am.c:897
+msgid "invalid timezone offset"
 msgstr ""
 
-#: builtin/cat-file.c:483
-msgid "show object size"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
 msgstr ""
 
-#: builtin/cat-file.c:485
-msgid "exit with zero when there's no error"
+#: builtin/am.c:991 builtin/clone.c:397
+#, c-format
+msgid "failed to create directory '%s'"
 msgstr ""
 
-#: builtin/cat-file.c:486
-msgid "pretty-print object's content"
+#: builtin/am.c:995
+msgid "Failed to split patches."
 msgstr ""
 
-#: builtin/cat-file.c:488
-msgid "for blob objects, run textconv on object's content"
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
 msgstr ""
 
-#: builtin/cat-file.c:490
-msgid "allow -s and -t to work with broken/corrupt objects"
+#: builtin/am.c:1178
+#, c-format
+msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr ""
 
-#: builtin/cat-file.c:491
-msgid "buffer --batch output"
+#: builtin/am.c:1179
+#, c-format
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr ""
 
-#: builtin/cat-file.c:493
-msgid "show info and content of objects fed from the standard input"
+#: builtin/am.c:1180
+#, c-format
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
 
-#: builtin/cat-file.c:496
-msgid "show info about objects fed from the standard input"
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
 msgstr ""
 
-#: builtin/cat-file.c:499
-msgid "follow in-tree symlinks (used with --batch or --batch-check)"
+#: builtin/am.c:1386 builtin/log.c:1557
+#, c-format
+msgid "invalid ident line: %s"
 msgstr ""
 
-#: builtin/cat-file.c:501
-msgid "show all objects with --batch or --batch-check"
+#: builtin/am.c:1413
+#, c-format
+msgid "unable to parse commit %s"
 msgstr ""
 
-#: builtin/check-attr.c:11
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 
-#: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 
-#: builtin/check-attr.c:19
-msgid "report all attributes set on file"
+#: builtin/am.c:1627
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
 msgstr ""
 
-#: builtin/check-attr.c:20
-msgid "use .gitattributes only from the index"
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
-msgid "read file names from stdin"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
 msgstr ""
 
-#: builtin/check-attr.c:23 builtin/check-ignore.c:24
-msgid "terminate input and output records by a NUL character"
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
 msgstr ""
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
-msgid "suppress progress reporting"
+#: builtin/am.c:1689
+msgid "applying to an empty history"
 msgstr ""
 
-#: builtin/check-ignore.c:26
-msgid "show non-matching input paths"
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
 msgstr ""
 
-#: builtin/check-ignore.c:28
-msgid "ignore index when checking"
+#: builtin/am.c:1735 builtin/am.c:1739
+#, c-format
+msgid "cannot resume: %s does not exist."
 msgstr ""
 
-#: builtin/check-ignore.c:154
-msgid "cannot specify pathnames with --stdin"
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 
-#: builtin/check-ignore.c:157
-msgid "-z only makes sense with --stdin"
+#: builtin/am.c:1760
+msgid "Commit Body is:"
 msgstr ""
 
-#: builtin/check-ignore.c:159
-msgid "no path specified"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr ""
 
-#: builtin/check-ignore.c:163
-msgid "--quiet is only valid with a single pathname"
+#: builtin/am.c:1820
+#, c-format
+msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr ""
 
-#: builtin/check-ignore.c:165
-msgid "cannot have both --quiet and --verbose"
+#: builtin/am.c:1860 builtin/am.c:1932
+#, c-format
+msgid "Applying: %.*s"
 msgstr ""
 
-#: builtin/check-ignore.c:168
-msgid "--non-matching is only valid with --verbose"
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
 msgstr ""
 
-#: builtin/check-mailmap.c:8
-msgid "git check-mailmap [<options>] <contact>..."
+#: builtin/am.c:1884
+#, c-format
+msgid "Patch failed at %s %.*s"
 msgstr ""
 
-#: builtin/check-mailmap.c:13
-msgid "also read contacts from stdin"
+#: builtin/am.c:1890
+#, c-format
+msgid "The copy of the patch that failed is found in: %s"
 msgstr ""
 
-#: builtin/check-mailmap.c:24
-#, c-format
-msgid "unable to parse contact: %s"
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
 msgstr ""
 
-#: builtin/check-mailmap.c:47
-msgid "no contacts specified"
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
 msgstr ""
 
-#: builtin/checkout-index.c:127
-msgid "git checkout-index [<options>] [--] [<file>...]"
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
 msgstr ""
 
-#: builtin/checkout-index.c:144
-msgid "stage should be between 1 and 3 or all"
+#: builtin/am.c:2102
+msgid "failed to clean index"
 msgstr ""
 
-#: builtin/checkout-index.c:160
-msgid "check out all files in the index"
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
 msgstr ""
 
-#: builtin/checkout-index.c:161
-msgid "force overwrite of existing files"
+#: builtin/am.c:2199
+#, c-format
+msgid "Invalid value for --patch-format: %s"
 msgstr ""
 
-#: builtin/checkout-index.c:163
-msgid "no warning for existing files and files not in index"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
 msgstr ""
 
-#: builtin/checkout-index.c:165
-msgid "don't checkout new files"
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
 msgstr ""
 
-#: builtin/checkout-index.c:167
-msgid "update stat information in the index file"
+#: builtin/am.c:2239
+msgid "run interactively"
 msgstr ""
 
-#: builtin/checkout-index.c:171
-msgid "read list of paths from the standard input"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
 msgstr ""
 
-#: builtin/checkout-index.c:173
-msgid "write the content to temporary files"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
 msgstr ""
 
-#: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
-msgid "string"
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
 msgstr ""
 
-#: builtin/checkout-index.c:175
-msgid "when creating files, prepend <string>"
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
 msgstr ""
 
-#: builtin/checkout-index.c:177
-msgid "copy out the files from named stage"
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
 msgstr ""
 
-#: builtin/checkout.c:25
-msgid "git checkout [<options>] <branch>"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
 msgstr ""
 
-#: builtin/checkout.c:26
-msgid "git checkout [<options>] [<branch>] -- <file>..."
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
 msgstr ""
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
-#, c-format
-msgid "path '%s' does not have our version"
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
 msgstr ""
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
-#, c-format
-msgid "path '%s' does not have their version"
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr ""
 
-#: builtin/checkout.c:152
-#, c-format
-msgid "path '%s' does not have all necessary versions"
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 
-#: builtin/checkout.c:196
-#, c-format
-msgid "path '%s' does not have necessary versions"
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
 msgstr ""
 
-#: builtin/checkout.c:213
-#, c-format
-msgid "path '%s': cannot merge"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
 msgstr ""
 
-#: builtin/checkout.c:230
-#, c-format
-msgid "Unable to add merge result for '%s'"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
 msgstr ""
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
-#, c-format
-msgid "'%s' cannot be used with updating paths"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
 msgstr ""
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
-#, c-format
-msgid "'%s' cannot be used with %s"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
 msgstr ""
 
-#: builtin/checkout.c:268
-#, c-format
-msgid "Cannot update paths and switch to branch '%s' at the same time."
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
 msgstr ""
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
-#, c-format
-msgid "path '%s' is unmerged"
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
 msgstr ""
 
-#: builtin/checkout.c:495
-msgid "you need to resolve your current index first"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
 msgstr ""
 
-#: builtin/checkout.c:625
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
+#: builtin/am.c:2303
+msgid "skip the current patch"
 msgstr ""
 
-#: builtin/checkout.c:664
-msgid "HEAD is now at"
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
 msgstr ""
 
-#: builtin/checkout.c:668 builtin/clone.c:661
-msgid "unable to update HEAD"
+#: builtin/am.c:2310
+msgid "lie about committer date"
 msgstr ""
 
-#: builtin/checkout.c:672
-#, c-format
-msgid "Reset branch '%s'\n"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
 msgstr ""
 
-#: builtin/checkout.c:675
-#, c-format
-msgid "Already on '%s'\n"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
 msgstr ""
 
-#: builtin/checkout.c:679
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
 msgstr ""
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
-#, c-format
-msgid "Switched to a new branch '%s'\n"
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
 msgstr ""
 
-#: builtin/checkout.c:683
-#, c-format
-msgid "Switched to branch '%s'\n"
+#: builtin/am.c:2333
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
 msgstr ""
 
-#: builtin/checkout.c:734
-#, c-format
-msgid " ... and %d more.\n"
+#: builtin/am.c:2340
+msgid "failed to read the index"
 msgstr ""
 
-#: builtin/checkout.c:740
+#: builtin/am.c:2355
 #, c-format
-msgid ""
-"Warning: you are leaving %d commit behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgid_plural ""
-"Warning: you are leaving %d commits behind, not connected to\n"
-"any of your branches:\n"
-"\n"
-"%s\n"
-msgstr[0] ""
-msgstr[1] ""
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr ""
 
-#: builtin/checkout.c:759
+#: builtin/am.c:2379
 #, c-format
 msgid ""
-"If you want to keep it by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgid_plural ""
-"If you want to keep them by creating a new branch, this may be a good time\n"
-"to do so with:\n"
-"\n"
-" git branch <new-branch-name> %s\n"
-"\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/checkout.c:795
-msgid "internal error in revision walk"
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
 msgstr ""
 
-#: builtin/checkout.c:799
-msgid "Previous HEAD position was"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
 msgstr ""
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
-msgid "You are on a branch yet to be born"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
 msgstr ""
 
-#: builtin/checkout.c:971
+#: builtin/archive.c:17
 #, c-format
-msgid "only one reference expected, %d given."
+msgid "could not create archive file '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
-#, c-format
-msgid "invalid reference: %s"
+#: builtin/archive.c:20
+msgid "could not redirect output"
 msgstr ""
 
-#: builtin/checkout.c:1040
-#, c-format
-msgid "reference is not a tree: %s"
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
 msgstr ""
 
-#: builtin/checkout.c:1079
-msgid "paths cannot be used with switching branches"
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
 msgstr ""
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/archive.c:61
 #, c-format
-msgid "'%s' cannot be used with switching branches"
+msgid "git archive: NACK %s"
 msgstr ""
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
-#, c-format
-msgid "'%s' cannot be used with '%s'"
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
 msgstr ""
 
-#: builtin/checkout.c:1106
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
 msgstr ""
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
-msgid "branch"
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
 msgstr ""
 
-#: builtin/checkout.c:1140
-msgid "create and checkout a new branch"
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
 msgstr ""
 
-#: builtin/checkout.c:1142
-msgid "create/reset and checkout a branch"
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr ""
 
-#: builtin/checkout.c:1143
-msgid "create reflog for new branch"
+#: builtin/blame.c:33
+msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
 msgstr ""
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
-msgid "detach HEAD at named commit"
+#: builtin/blame.c:38
+msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr ""
 
-#: builtin/checkout.c:1145
-msgid "set upstream info for new branch"
+#: builtin/blame.c:1777
+msgid "Blaming lines"
 msgstr ""
 
-#: builtin/checkout.c:1147
-msgid "new-branch"
+#: builtin/blame.c:2573
+msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 
-#: builtin/checkout.c:1147
-msgid "new unparented branch"
+#: builtin/blame.c:2574
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1148
-msgid "checkout our version for unmerged files"
+#: builtin/blame.c:2575
+msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1150
-msgid "checkout their version for unmerged files"
+#: builtin/blame.c:2576
+msgid "Show work cost statistics"
 msgstr ""
 
-#: builtin/checkout.c:1152
-msgid "force checkout (throw away local modifications)"
+#: builtin/blame.c:2577
+msgid "Force progress reporting"
 msgstr ""
 
-#: builtin/checkout.c:1153
-msgid "perform a 3-way merge with the new branch"
+#: builtin/blame.c:2578
+msgid "Show output score for blame entries"
 msgstr ""
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
-msgid "update ignored files (default)"
+#: builtin/blame.c:2579
+msgid "Show original filename (Default: auto)"
 msgstr ""
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
-msgid "style"
+#: builtin/blame.c:2580
+msgid "Show original linenumber (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1156
-msgid "conflict style (merge or diff3)"
+#: builtin/blame.c:2581
+msgid "Show in a format designed for machine consumption"
 msgstr ""
 
-#: builtin/checkout.c:1159
-msgid "do not limit pathspecs to sparse entries only"
+#: builtin/blame.c:2582
+msgid "Show porcelain format with per-line commit information"
 msgstr ""
 
-#: builtin/checkout.c:1161
-msgid "second guess 'git checkout <no-such-branch>'"
+#: builtin/blame.c:2583
+msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1163
-msgid "do not check if another worktree is holding the given ref"
+#: builtin/blame.c:2584
+msgid "Show raw timestamp (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
-msgid "force progress reporting"
+#: builtin/blame.c:2585
+msgid "Show long commit SHA1 (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1195
-msgid "-b, -B and --orphan are mutually exclusive"
+#: builtin/blame.c:2586
+msgid "Suppress author name and timestamp (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1212
-msgid "--track needs a branch name"
+#: builtin/blame.c:2587
+msgid "Show author email instead of name (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1217
-msgid "Missing branch name; try -b"
+#: builtin/blame.c:2588
+msgid "Ignore whitespace differences"
 msgstr ""
 
-#: builtin/checkout.c:1253
-msgid "invalid path specification"
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
 msgstr ""
 
-#: builtin/checkout.c:1260
-#, c-format
-msgid ""
-"Cannot update paths and switch to branch '%s' at the same time.\n"
-"Did you intend to checkout '%s' which can not be resolved as commit?"
+#: builtin/blame.c:2597
+msgid "Spend extra cycles to find better match"
 msgstr ""
 
-#: builtin/checkout.c:1265
-#, c-format
-msgid "git checkout: --detach does not take a path argument '%s'"
+#: builtin/blame.c:2598
+msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 
-#: builtin/checkout.c:1269
-msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
+#: builtin/blame.c:2599
+msgid "Use <file>'s contents as the final image"
 msgstr ""
 
-#: builtin/clean.c:25
-msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+#: builtin/blame.c:2600 builtin/blame.c:2601
+msgid "score"
 msgstr ""
 
-#: builtin/clean.c:29
-#, c-format
-msgid "Removing %s\n"
+#: builtin/blame.c:2600
+msgid "Find line copies within and across files"
 msgstr ""
 
-#: builtin/clean.c:30
-#, c-format
-msgid "Would remove %s\n"
+#: builtin/blame.c:2601
+msgid "Find line movements within and across files"
 msgstr ""
 
-#: builtin/clean.c:31
-#, c-format
-msgid "Skipping repository %s\n"
+#: builtin/blame.c:2602
+msgid "n,m"
 msgstr ""
 
-#: builtin/clean.c:32
-#, c-format
-msgid "Would skip repository %s\n"
+#: builtin/blame.c:2602
+msgid "Process only line range n,m, counting from 1"
 msgstr ""
 
-#: builtin/clean.c:33
-#, c-format
-msgid "failed to remove %s"
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
 msgstr ""
 
-#: builtin/clean.c:291
-msgid ""
-"Prompt help:\n"
-"1          - select a numbered item\n"
-"foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+#. TRANSLATORS: This string is used to tell us the maximum
+#. display width for a relative timestamp in "git blame"
+#. output.  For C locale, "4 years, 11 months ago", which
+#. takes 22 places, is the longest among various forms of
+#. relative timestamps, but your language may need more or
+#. fewer display columns.
+#: builtin/blame.c:2697
+msgid "4 years, 11 months ago"
 msgstr ""
 
-#: builtin/clean.c:295
-msgid ""
-"Prompt help:\n"
-"1          - select a single item\n"
-"3-5        - select a range of items\n"
-"2-3,6-9    - select multiple ranges\n"
-"foo        - select item based on unique prefix\n"
-"-...       - unselect specified items\n"
-"*          - choose all items\n"
-"           - (empty) finish selecting"
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
 msgstr ""
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
 msgstr ""
 
-#: builtin/clean.c:653
-#, c-format
-msgid "Input ignore patterns>> "
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
 msgstr ""
 
-#: builtin/clean.c:690
-#, c-format
-msgid "WARNING: Cannot find items matched by: %s"
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
 msgstr ""
 
-#: builtin/clean.c:711
-msgid "Select items to delete"
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
 msgstr ""
 
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/blame.c:2851
 #, c-format
-msgid "Remove %s [y/N]? "
+msgid "cannot read blob %s for path %s"
 msgstr ""
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr ""
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/clean.c:785
-msgid ""
-"clean               - start cleaning\n"
-"filter by pattern   - exclude items from deletion\n"
-"select by numbers   - select items to be deleted by numbers\n"
-"ask each            - confirm each deletion (like \"rm -i\")\n"
-"quit                - stop cleaning\n"
-"help                - this screen\n"
-"?                   - help for prompt selection"
+#: builtin/branch.c:26
+msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr ""
 
-#: builtin/clean.c:812
-msgid "*** Commands ***"
+#: builtin/branch.c:27
+msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr ""
 
-#: builtin/clean.c:813
-msgid "What now"
+#: builtin/branch.c:28
+msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr ""
 
-#: builtin/clean.c:821
-msgid "Would remove the following item:"
-msgid_plural "Would remove the following items:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/clean.c:838
-msgid "No more files to clean, exiting."
+#: builtin/branch.c:29
+msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr ""
 
-#: builtin/clean.c:869
-msgid "do not print names of files removed"
+#: builtin/branch.c:30
+msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr ""
 
-#: builtin/clean.c:871
-msgid "force"
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
 msgstr ""
 
-#: builtin/clean.c:872
-msgid "interactive cleaning"
+#: builtin/branch.c:144
+#, c-format
+msgid ""
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
 msgstr ""
 
-#: builtin/clean.c:874
-msgid "remove whole directories"
+#: builtin/branch.c:148
+#, c-format
+msgid ""
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
 msgstr ""
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
-msgid "pattern"
+#: builtin/branch.c:162
+#, c-format
+msgid "Couldn't look up commit object for '%s'"
 msgstr ""
 
-#: builtin/clean.c:876
-msgid "add <pattern> to ignore rules"
+#: builtin/branch.c:166
+#, c-format
+msgid ""
+"The branch '%s' is not fully merged.\n"
+"If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
 
-#: builtin/clean.c:877
-msgid "remove ignored files, too"
+#: builtin/branch.c:179
+msgid "Update of config-file failed"
 msgstr ""
 
-#: builtin/clean.c:879
-msgid "remove only ignored files"
+#: builtin/branch.c:210
+msgid "cannot use -a with -d"
 msgstr ""
 
-#: builtin/clean.c:897
-msgid "-x and -X cannot be used together"
+#: builtin/branch.c:216
+msgid "Couldn't look up commit object for HEAD"
 msgstr ""
 
-#: builtin/clean.c:901
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
+#: builtin/branch.c:230
+#, c-format
+msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr ""
 
-#: builtin/clean.c:904
-msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
+#: builtin/branch.c:245
+#, c-format
+msgid "remote-tracking branch '%s' not found."
 msgstr ""
 
-#: builtin/clone.c:37
-msgid "git clone [<options>] [--] <repo> [<dir>]"
+#: builtin/branch.c:246
+#, c-format
+msgid "branch '%s' not found."
 msgstr ""
 
-#: builtin/clone.c:62
-msgid "don't create a checkout"
+#: builtin/branch.c:261
+#, c-format
+msgid "Error deleting remote-tracking branch '%s'"
 msgstr ""
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
-msgid "create a bare repository"
+#: builtin/branch.c:262
+#, c-format
+msgid "Error deleting branch '%s'"
 msgstr ""
 
-#: builtin/clone.c:67
-msgid "create a mirror repository (implies bare)"
+#: builtin/branch.c:269
+#, c-format
+msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/clone.c:69
-msgid "to clone from a local repository"
+#: builtin/branch.c:270
+#, c-format
+msgid "Deleted branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/clone.c:71
-msgid "don't use local hardlinks, always copy"
+#: builtin/branch.c:441
+#, c-format
+msgid "Branch %s is being rebased at %s"
 msgstr ""
 
-#: builtin/clone.c:73
-msgid "setup as shared repository"
+#: builtin/branch.c:445
+#, c-format
+msgid "Branch %s is being bisected at %s"
 msgstr ""
 
-#: builtin/clone.c:75 builtin/clone.c:77
-msgid "initialize submodules in the clone"
+#: builtin/branch.c:460
+msgid "cannot rename the current branch while not on any."
 msgstr ""
 
-#: builtin/clone.c:79
-msgid "number of submodules cloned in parallel"
+#: builtin/branch.c:470
+#, c-format
+msgid "Invalid branch name: '%s'"
 msgstr ""
 
-#: builtin/clone.c:80 builtin/init-db.c:473
-msgid "template-directory"
+#: builtin/branch.c:487
+msgid "Branch rename failed"
 msgstr ""
 
-#: builtin/clone.c:81 builtin/init-db.c:474
-msgid "directory from which templates will be used"
+#: builtin/branch.c:490
+#, c-format
+msgid "Renamed a misnamed branch '%s' away"
 msgstr ""
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
-msgid "reference repository"
+#: builtin/branch.c:493
+#, c-format
+msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr ""
 
-#: builtin/clone.c:85
-msgid "use --reference only while cloning"
+#: builtin/branch.c:502
+msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
-msgid "name"
+#: builtin/branch.c:518
+#, c-format
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
 msgstr ""
 
-#: builtin/clone.c:87
-msgid "use <name> instead of 'origin' to track upstream"
+#: builtin/branch.c:551
+msgid "Generic options"
 msgstr ""
 
-#: builtin/clone.c:89
-msgid "checkout <branch> instead of the remote's HEAD"
+#: builtin/branch.c:553
+msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 
-#: builtin/clone.c:91
-msgid "path to git-upload-pack on the remote"
+#: builtin/branch.c:554
+msgid "suppress informational messages"
 msgstr ""
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667
-#: builtin/pull.c:201
-msgid "depth"
+#: builtin/branch.c:555
+msgid "set up tracking mode (see git-pull(1))"
 msgstr ""
 
-#: builtin/clone.c:93
-msgid "create a shallow clone of that depth"
+#: builtin/branch.c:557
+msgid "change upstream info"
 msgstr ""
 
-#: builtin/clone.c:95
-msgid "clone only one branch, HEAD or --branch"
+#: builtin/branch.c:559
+msgid "upstream"
 msgstr ""
 
-#: builtin/clone.c:97
-msgid "any cloned submodules will be shallow"
+#: builtin/branch.c:559
+msgid "change the upstream info"
 msgstr ""
 
-#: builtin/clone.c:98 builtin/init-db.c:482
-msgid "gitdir"
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
 msgstr ""
 
-#: builtin/clone.c:99 builtin/init-db.c:483
-msgid "separate git dir from working tree"
+#: builtin/branch.c:561
+msgid "use colored output"
 msgstr ""
 
-#: builtin/clone.c:100
-msgid "key=value"
+#: builtin/branch.c:562
+msgid "act on remote-tracking branches"
 msgstr ""
 
-#: builtin/clone.c:101
-msgid "set config inside the new repository"
+#: builtin/branch.c:564 builtin/branch.c:566
+msgid "print only branches that contain the commit"
 msgstr ""
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
-msgid "use IPv4 addresses only"
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
 msgstr ""
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
-msgid "use IPv6 addresses only"
+#: builtin/branch.c:570
+msgid "Specific git-branch actions:"
 msgstr ""
 
-#: builtin/clone.c:241
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
+#: builtin/branch.c:571
+msgid "list both remote-tracking and local branches"
 msgstr ""
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
+#: builtin/branch.c:573
+msgid "delete fully merged branch"
 msgstr ""
 
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
+#: builtin/branch.c:574
+msgid "delete branch (even if not merged)"
 msgstr ""
 
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
+#: builtin/branch.c:575
+msgid "move/rename a branch and its reflog"
 msgstr ""
 
-#: builtin/clone.c:317
-#, c-format
-msgid "reference repository '%s' is grafted"
+#: builtin/branch.c:576
+msgid "move/rename a branch, even if target exists"
 msgstr ""
 
-#: builtin/clone.c:376
-#, c-format
-msgid "failed to open '%s'"
+#: builtin/branch.c:577
+msgid "list branch names"
 msgstr ""
 
-#: builtin/clone.c:384
-#, c-format
-msgid "%s exists and is not a directory"
+#: builtin/branch.c:578
+msgid "create the branch's reflog"
 msgstr ""
 
-#: builtin/clone.c:398
-#, c-format
-msgid "failed to stat %s\n"
+#: builtin/branch.c:580
+msgid "edit the description for the branch"
 msgstr ""
 
-#: builtin/clone.c:420
-#, c-format
-msgid "failed to create link '%s'"
+#: builtin/branch.c:581
+msgid "force creation, move/rename, deletion"
 msgstr ""
 
-#: builtin/clone.c:424
-#, c-format
-msgid "failed to copy file to '%s'"
+#: builtin/branch.c:582
+msgid "print only branches that are merged"
 msgstr ""
 
-#: builtin/clone.c:449
-#, c-format
-msgid "done.\n"
+#: builtin/branch.c:583
+msgid "print only branches that are not merged"
 msgstr ""
 
-#: builtin/clone.c:461
-msgid ""
-"Clone succeeded, but checkout failed.\n"
-"You can inspect what was checked out with 'git status'\n"
-"and retry the checkout with 'git checkout -f HEAD'\n"
+#: builtin/branch.c:584
+msgid "list branches in columns"
 msgstr ""
 
-#: builtin/clone.c:538
-#, c-format
-msgid "Could not find remote branch %s to clone."
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
+msgid "key"
 msgstr ""
 
-#: builtin/clone.c:633
-msgid "remote did not send all necessary objects"
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
+msgid "field name to sort on"
 msgstr ""
 
-#: builtin/clone.c:649
-#, c-format
-msgid "unable to update %s"
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
+msgid "object"
 msgstr ""
 
-#: builtin/clone.c:698
-msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+#: builtin/branch.c:589
+msgid "print only branches of the object"
 msgstr ""
 
-#: builtin/clone.c:729
-msgid "unable to checkout working tree"
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
 msgstr ""
 
-#: builtin/clone.c:766
-msgid "unable to write parameters to config file"
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
 msgstr ""
 
-#: builtin/clone.c:829
-msgid "cannot repack to clean up"
+#: builtin/branch.c:611
+msgid "Failed to resolve HEAD as a valid ref."
 msgstr ""
 
-#: builtin/clone.c:831
-msgid "cannot unlink temporary alternates file"
+#: builtin/branch.c:615 builtin/clone.c:724
+msgid "HEAD not found below refs/heads!"
 msgstr ""
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
-msgid "Too many arguments."
+#: builtin/branch.c:638
+msgid "--column and --verbose are incompatible"
 msgstr ""
 
-#: builtin/clone.c:867
-msgid "You must specify a repository to clone."
+#: builtin/branch.c:649 builtin/branch.c:701
+msgid "branch name required"
 msgstr ""
 
-#: builtin/clone.c:878
-#, c-format
-msgid "--bare and --origin %s options are incompatible."
+#: builtin/branch.c:677
+msgid "Cannot give description to detached HEAD"
 msgstr ""
 
-#: builtin/clone.c:881
-msgid "--bare and --separate-git-dir are incompatible."
+#: builtin/branch.c:682
+msgid "cannot edit description of more than one branch"
 msgstr ""
 
-#: builtin/clone.c:894
+#: builtin/branch.c:689
 #, c-format
-msgid "repository '%s' does not exist"
+msgid "No commit on branch '%s' yet."
 msgstr ""
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/branch.c:692
 #, c-format
-msgid "depth %s is not a positive number"
+msgid "No branch named '%s'."
 msgstr ""
 
-#: builtin/clone.c:910
-#, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
+#: builtin/branch.c:707
+msgid "too many branches for a rename operation"
 msgstr ""
 
-#: builtin/clone.c:920
-#, c-format
-msgid "working tree '%s' already exists."
+#: builtin/branch.c:712
+msgid "too many branches to set new upstream"
 msgstr ""
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/branch.c:716
 #, c-format
-msgid "could not create leading directories of '%s'"
+msgid ""
+"could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 
-#: builtin/clone.c:938
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
-msgid "could not create work tree dir '%s'"
+msgid "no such branch '%s'"
 msgstr ""
 
-#: builtin/clone.c:956
+#: builtin/branch.c:723
 #, c-format
-msgid "Cloning into bare repository '%s'...\n"
+msgid "branch '%s' does not exist"
 msgstr ""
 
-#: builtin/clone.c:958
-#, c-format
-msgid "Cloning into '%s'...\n"
+#: builtin/branch.c:735
+msgid "too many branches to unset upstream"
 msgstr ""
 
-#: builtin/clone.c:997
-msgid "--depth is ignored in local clones; use file:// instead."
+#: builtin/branch.c:739
+msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 
-#: builtin/clone.c:1000
-msgid "source repository is shallow, ignoring --local"
+#: builtin/branch.c:745
+#, c-format
+msgid "Branch '%s' has no upstream information"
 msgstr ""
 
-#: builtin/clone.c:1005
-msgid "--local is ignored"
+#: builtin/branch.c:759
+msgid "it does not make sense to create 'HEAD' manually"
 msgstr ""
 
-#: builtin/clone.c:1009
-#, c-format
-msgid "Don't know how to clone %s"
+#: builtin/branch.c:765
+msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/branch.c:768
 #, c-format
-msgid "Remote branch %s not found in upstream %s"
-msgstr ""
-
-#: builtin/clone.c:1069
-msgid "You appear to have cloned an empty repository."
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
 msgstr ""
 
-#: builtin/column.c:9
-msgid "git column [<options>]"
+#: builtin/branch.c:785
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
 msgstr ""
 
-#: builtin/column.c:26
-msgid "lookup config vars"
+#: builtin/bundle.c:45
+#, c-format
+msgid "%s is okay\n"
 msgstr ""
 
-#: builtin/column.c:27 builtin/column.c:28
-msgid "layout to use"
+#: builtin/bundle.c:58
+msgid "Need a repository to create a bundle."
 msgstr ""
 
-#: builtin/column.c:29
-msgid "Maximum width"
+#: builtin/bundle.c:62
+msgid "Need a repository to unbundle."
 msgstr ""
 
-#: builtin/column.c:30
-msgid "Padding space on left border"
+#: builtin/cat-file.c:513
+msgid ""
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
 
-#: builtin/column.c:31
-msgid "Padding space on right border"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 msgstr ""
 
-#: builtin/column.c:32
-msgid "Padding space between columns"
+#: builtin/cat-file.c:551
+msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr ""
 
-#: builtin/column.c:51
-msgid "--command must be the first argument"
+#: builtin/cat-file.c:552
+msgid "show object type"
 msgstr ""
 
-#: builtin/commit.c:38
-msgid "git commit [<options>] [--] <pathspec>..."
+#: builtin/cat-file.c:553
+msgid "show object size"
 msgstr ""
 
-#: builtin/commit.c:43
-msgid "git status [<options>] [--] <pathspec>..."
+#: builtin/cat-file.c:555
+msgid "exit with zero when there's no error"
 msgstr ""
 
-#: builtin/commit.c:48
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
+#: builtin/cat-file.c:556
+msgid "pretty-print object's content"
 msgstr ""
 
-#: builtin/commit.c:61
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
+#: builtin/cat-file.c:558
+msgid "for blob objects, run textconv on object's content"
 msgstr ""
 
-#: builtin/commit.c:73
-msgid ""
-"You asked to amend the most recent commit, but doing so would make\n"
-"it empty. You can repeat your command with --allow-empty, or you can\n"
-"remove the commit entirely with \"git reset HEAD^\".\n"
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
 msgstr ""
 
-#: builtin/commit.c:78
-msgid ""
-"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
-"If you wish to commit it anyway, use:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
 msgstr ""
 
-#: builtin/commit.c:85
-msgid "Otherwise, please use 'git reset'\n"
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
 msgstr ""
 
-#: builtin/commit.c:88
-msgid ""
-"If you wish to skip this commit, use:\n"
-"\n"
-"    git reset\n"
-"\n"
-"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
-"the remaining commits.\n"
+#: builtin/cat-file.c:564
+msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr ""
 
-#: builtin/commit.c:308
-msgid "failed to unpack HEAD tree object"
+#: builtin/cat-file.c:565
+msgid "buffer --batch output"
 msgstr ""
 
-#: builtin/commit.c:349
-msgid "unable to create temporary index"
+#: builtin/cat-file.c:567
+msgid "show info and content of objects fed from the standard input"
 msgstr ""
 
-#: builtin/commit.c:355
-msgid "interactive add failed"
+#: builtin/cat-file.c:570
+msgid "show info about objects fed from the standard input"
 msgstr ""
 
-#: builtin/commit.c:368
-msgid "unable to update temporary index"
+#: builtin/cat-file.c:573
+msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 
-#: builtin/commit.c:370
-msgid "Failed to update main cache tree"
+#: builtin/cat-file.c:575
+msgid "show all objects with --batch or --batch-check"
 msgstr ""
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
-msgid "unable to write new_index file"
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
 msgstr ""
 
-#: builtin/commit.c:448
-msgid "cannot do a partial commit during a merge."
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
 msgstr ""
 
-#: builtin/commit.c:450
-msgid "cannot do a partial commit during a cherry-pick."
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
 msgstr ""
 
-#: builtin/commit.c:459
-msgid "cannot read the index"
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
 msgstr ""
 
-#: builtin/commit.c:478
-msgid "unable to write temporary index file"
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
+msgid "read file names from stdin"
 msgstr ""
 
-#: builtin/commit.c:583
-#, c-format
-msgid "commit '%s' lacks author header"
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
 msgstr ""
 
-#: builtin/commit.c:585
-#, c-format
-msgid "commit '%s' has malformed author line"
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
+msgid "suppress progress reporting"
 msgstr ""
 
-#: builtin/commit.c:604
-msgid "malformed --author parameter"
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
 msgstr ""
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
 msgstr ""
 
-#: builtin/commit.c:656
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
+#: builtin/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
 msgstr ""
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
-#, c-format
-msgid "could not lookup commit %s"
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
 msgstr ""
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
-#, c-format
-msgid "(reading log message from standard input)\n"
+#: builtin/check-ignore.c:159
+msgid "no path specified"
 msgstr ""
 
-#: builtin/commit.c:707
-msgid "could not read log from standard input"
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
 msgstr ""
 
-#: builtin/commit.c:711
-#, c-format
-msgid "could not read log file '%s'"
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
 msgstr ""
 
-#: builtin/commit.c:738 builtin/commit.c:746
-msgid "could not read SQUASH_MSG"
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
 msgstr ""
 
-#: builtin/commit.c:743
-msgid "could not read MERGE_MSG"
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [<options>] <contact>..."
 msgstr ""
 
-#: builtin/commit.c:797
-msgid "could not write commit template"
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
 msgstr ""
 
-#: builtin/commit.c:815
+#: builtin/check-mailmap.c:24
 #, c-format
-msgid ""
-"\n"
-"It looks like you may be committing a merge.\n"
-"If this is not correct, please remove the file\n"
-"\t%s\n"
-"and try again.\n"
+msgid "unable to parse contact: %s"
 msgstr ""
 
-#: builtin/commit.c:820
-#, c-format
-msgid ""
-"\n"
-"It looks like you may be committing a cherry-pick.\n"
-"If this is not correct, please remove the file\n"
-"\t%s\n"
-"and try again.\n"
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
 msgstr ""
 
-#: builtin/commit.c:833
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be ignored, and an empty message aborts the commit.\n"
+#: builtin/checkout-index.c:127
+msgid "git checkout-index [<options>] [--] [<file>...]"
 msgstr ""
 
-#: builtin/commit.c:840
-#, c-format
-msgid ""
-"Please enter the commit message for your changes. Lines starting\n"
-"with '%c' will be kept; you may remove them yourself if you want to.\n"
-"An empty message aborts the commit.\n"
+#: builtin/checkout-index.c:144
+msgid "stage should be between 1 and 3 or all"
 msgstr ""
 
-#: builtin/commit.c:860
-#, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
+#: builtin/checkout-index.c:160
+msgid "check out all files in the index"
 msgstr ""
 
-#: builtin/commit.c:868
-#, c-format
-msgid "%sDate:      %s"
+#: builtin/checkout-index.c:161
+msgid "force overwrite of existing files"
 msgstr ""
 
-#: builtin/commit.c:875
-#, c-format
-msgid "%sCommitter: %.*s <%.*s>"
+#: builtin/checkout-index.c:163
+msgid "no warning for existing files and files not in index"
 msgstr ""
 
-#: builtin/commit.c:893
-msgid "Cannot read index"
+#: builtin/checkout-index.c:165
+msgid "don't checkout new files"
 msgstr ""
 
-#: builtin/commit.c:950
-msgid "Error building trees"
+#: builtin/checkout-index.c:167
+msgid "update stat information in the index file"
 msgstr ""
 
-#: builtin/commit.c:965 builtin/tag.c:266
-#, c-format
-msgid "Please supply the message using either -m or -F option.\n"
+#: builtin/checkout-index.c:171
+msgid "read list of paths from the standard input"
 msgstr ""
 
-#: builtin/commit.c:1067
-#, c-format
-msgid "--author '%s' is not 'Name <email>' and matches no existing author"
+#: builtin/checkout-index.c:173
+msgid "write the content to temporary files"
 msgstr ""
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
-#, c-format
-msgid "Invalid untracked files mode '%s'"
+#: builtin/checkout-index.c:174 builtin/column.c:30
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
+msgid "string"
 msgstr ""
 
-#: builtin/commit.c:1119
-msgid "--long and -z are incompatible"
+#: builtin/checkout-index.c:175
+msgid "when creating files, prepend <string>"
 msgstr ""
 
-#: builtin/commit.c:1149
-msgid "Using both --reset-author and --author does not make sense"
+#: builtin/checkout-index.c:177
+msgid "copy out the files from named stage"
 msgstr ""
 
-#: builtin/commit.c:1158
-msgid "You have nothing to amend."
+#: builtin/checkout.c:27
+msgid "git checkout [<options>] <branch>"
 msgstr ""
 
-#: builtin/commit.c:1161
-msgid "You are in the middle of a merge -- cannot amend."
+#: builtin/checkout.c:28
+msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr ""
 
-#: builtin/commit.c:1163
-msgid "You are in the middle of a cherry-pick -- cannot amend."
+#: builtin/checkout.c:153 builtin/checkout.c:186
+#, c-format
+msgid "path '%s' does not have our version"
 msgstr ""
 
-#: builtin/commit.c:1166
-msgid "Options --squash and --fixup cannot be used together"
+#: builtin/checkout.c:155 builtin/checkout.c:188
+#, c-format
+msgid "path '%s' does not have their version"
 msgstr ""
 
-#: builtin/commit.c:1176
-msgid "Only one of -c/-C/-F/--fixup can be used."
+#: builtin/checkout.c:171
+#, c-format
+msgid "path '%s' does not have all necessary versions"
 msgstr ""
 
-#: builtin/commit.c:1178
-msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
+#: builtin/checkout.c:215
+#, c-format
+msgid "path '%s' does not have necessary versions"
 msgstr ""
 
-#: builtin/commit.c:1186
-msgid "--reset-author can be used only with -C, -c or --amend."
+#: builtin/checkout.c:232
+#, c-format
+msgid "path '%s': cannot merge"
 msgstr ""
 
-#: builtin/commit.c:1203
-msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
+#: builtin/checkout.c:249
+#, c-format
+msgid "Unable to add merge result for '%s'"
 msgstr ""
 
-#: builtin/commit.c:1205
-msgid "No paths with --include/--only does not make sense."
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
+#, c-format
+msgid "'%s' cannot be used with updating paths"
 msgstr ""
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
+#: builtin/checkout.c:281 builtin/checkout.c:284
+#, c-format
+msgid "'%s' cannot be used with %s"
 msgstr ""
 
-#: builtin/commit.c:1209
-msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+#: builtin/checkout.c:287
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
-msgid "Invalid cleanup mode %s"
+msgid "path '%s' is unmerged"
 msgstr ""
 
-#: builtin/commit.c:1226
-msgid "Paths with -a does not make sense."
+#: builtin/checkout.c:513
+msgid "you need to resolve your current index first"
 msgstr ""
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
-msgid "show status concisely"
+#: builtin/checkout.c:644
+#, c-format
+msgid "Can not do reflog for '%s': %s\n"
 msgstr ""
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
-msgid "show branch information"
+#: builtin/checkout.c:685
+msgid "HEAD is now at"
 msgstr ""
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
-msgid "machine-readable output"
+#: builtin/checkout.c:689 builtin/clone.c:678
+msgid "unable to update HEAD"
 msgstr ""
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
-msgid "show status in long format (default)"
+#: builtin/checkout.c:693
+#, c-format
+msgid "Reset branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
-msgid "terminate entries with NUL"
+#: builtin/checkout.c:696
+#, c-format
+msgid "Already on '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
-msgid "mode"
+#: builtin/checkout.c:700
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+#: builtin/checkout.c:702 builtin/checkout.c:1090
+#, c-format
+msgid "Switched to a new branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1352
-msgid "show ignored files"
+#: builtin/checkout.c:704
+#, c-format
+msgid "Switched to branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1353 parse-options.h:155
-msgid "when"
+#: builtin/checkout.c:755
+#, c-format
+msgid " ... and %d more.\n"
 msgstr ""
 
-#: builtin/commit.c:1354
+#: builtin/checkout.c:761
+#, c-format
 msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
+"Warning: you are leaving %d commit behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgid_plural ""
+"Warning: you are leaving %d commits behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/commit.c:1356
-msgid "list untracked files in columns"
+#: builtin/checkout.c:780
+#, c-format
+msgid ""
+"If you want to keep it by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgid_plural ""
+"If you want to keep them by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/checkout.c:816
+msgid "internal error in revision walk"
 msgstr ""
 
-#: builtin/commit.c:1442
-msgid "couldn't look up newly created commit"
+#: builtin/checkout.c:820
+msgid "Previous HEAD position was"
 msgstr ""
 
-#: builtin/commit.c:1444
-msgid "could not parse newly created commit"
+#: builtin/checkout.c:847 builtin/checkout.c:1085
+msgid "You are on a branch yet to be born"
 msgstr ""
 
-#: builtin/commit.c:1489
-msgid "detached HEAD"
+#: builtin/checkout.c:991
+#, c-format
+msgid "only one reference expected, %d given."
 msgstr ""
 
-#: builtin/commit.c:1492
-msgid " (root-commit)"
+#: builtin/checkout.c:1031 builtin/worktree.c:214
+#, c-format
+msgid "invalid reference: %s"
 msgstr ""
 
-#: builtin/commit.c:1592
-msgid "suppress summary after successful commit"
+#: builtin/checkout.c:1060
+#, c-format
+msgid "reference is not a tree: %s"
 msgstr ""
 
-#: builtin/commit.c:1593
-msgid "show diff in commit message template"
+#: builtin/checkout.c:1099
+msgid "paths cannot be used with switching branches"
 msgstr ""
 
-#: builtin/commit.c:1595
-msgid "Commit message options"
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
+#, c-format
+msgid "'%s' cannot be used with switching branches"
 msgstr ""
 
-#: builtin/commit.c:1596 builtin/tag.c:351
-msgid "read message from file"
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
+#, c-format
+msgid "'%s' cannot be used with '%s'"
 msgstr ""
 
-#: builtin/commit.c:1597
-msgid "author"
+#: builtin/checkout.c:1126
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 
-#: builtin/commit.c:1597
-msgid "override author for commit"
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
+msgid "branch"
 msgstr ""
 
-#: builtin/commit.c:1598 builtin/gc.c:326
-msgid "date"
+#: builtin/checkout.c:1160
+msgid "create and checkout a new branch"
 msgstr ""
 
-#: builtin/commit.c:1598
-msgid "override date for commit"
+#: builtin/checkout.c:1162
+msgid "create/reset and checkout a branch"
 msgstr ""
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
-msgid "message"
+#: builtin/checkout.c:1163
+msgid "create reflog for new branch"
 msgstr ""
 
-#: builtin/commit.c:1599
-msgid "commit message"
+#: builtin/checkout.c:1164 builtin/worktree.c:333
+msgid "detach HEAD at named commit"
 msgstr ""
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
-msgid "commit"
+#: builtin/checkout.c:1165
+msgid "set upstream info for new branch"
 msgstr ""
 
-#: builtin/commit.c:1600
-msgid "reuse and edit message from specified commit"
+#: builtin/checkout.c:1167
+msgid "new-branch"
 msgstr ""
 
-#: builtin/commit.c:1601
-msgid "reuse message from specified commit"
+#: builtin/checkout.c:1167
+msgid "new unparented branch"
 msgstr ""
 
-#: builtin/commit.c:1602
-msgid "use autosquash formatted message to fixup specified commit"
+#: builtin/checkout.c:1168
+msgid "checkout our version for unmerged files"
 msgstr ""
 
-#: builtin/commit.c:1603
-msgid "use autosquash formatted message to squash specified commit"
+#: builtin/checkout.c:1170
+msgid "checkout their version for unmerged files"
 msgstr ""
 
-#: builtin/commit.c:1604
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
+#: builtin/checkout.c:1172
+msgid "force checkout (throw away local modifications)"
 msgstr ""
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
-msgid "add Signed-off-by:"
+#: builtin/checkout.c:1173
+msgid "perform a 3-way merge with the new branch"
 msgstr ""
 
-#: builtin/commit.c:1606
-msgid "use specified template file"
+#: builtin/checkout.c:1174 builtin/merge.c:234
+msgid "update ignored files (default)"
 msgstr ""
 
-#: builtin/commit.c:1607
-msgid "force edit of commit"
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
+msgid "style"
 msgstr ""
 
-#: builtin/commit.c:1608
-msgid "default"
+#: builtin/checkout.c:1176
+msgid "conflict style (merge or diff3)"
 msgstr ""
 
-#: builtin/commit.c:1608 builtin/tag.c:354
-msgid "how to strip spaces and #comments from message"
+#: builtin/checkout.c:1179
+msgid "do not limit pathspecs to sparse entries only"
 msgstr ""
 
-#: builtin/commit.c:1609
-msgid "include status in commit message template"
+#: builtin/checkout.c:1181
+msgid "second guess 'git checkout <no-such-branch>'"
 msgstr ""
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
-msgid "GPG sign commit"
+#: builtin/checkout.c:1183
+msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 
-#: builtin/commit.c:1614
-msgid "Commit contents options"
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
+msgid "force progress reporting"
 msgstr ""
 
-#: builtin/commit.c:1615
-msgid "commit all changed files"
+#: builtin/checkout.c:1224
+msgid "-b, -B and --orphan are mutually exclusive"
 msgstr ""
 
-#: builtin/commit.c:1616
-msgid "add specified files to index for commit"
+#: builtin/checkout.c:1241
+msgid "--track needs a branch name"
 msgstr ""
 
-#: builtin/commit.c:1617
-msgid "interactively add files"
+#: builtin/checkout.c:1246
+msgid "Missing branch name; try -b"
 msgstr ""
 
-#: builtin/commit.c:1618
-msgid "interactively add changes"
+#: builtin/checkout.c:1282
+msgid "invalid path specification"
 msgstr ""
 
-#: builtin/commit.c:1619
-msgid "commit only specified files"
+#: builtin/checkout.c:1289
+#, c-format
+msgid ""
+"Cannot update paths and switch to branch '%s' at the same time.\n"
+"Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr ""
 
-#: builtin/commit.c:1620
-msgid "bypass pre-commit and commit-msg hooks"
+#: builtin/checkout.c:1294
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr ""
 
-#: builtin/commit.c:1621
-msgid "show what would be committed"
+#: builtin/checkout.c:1298
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
 msgstr ""
 
-#: builtin/commit.c:1632
-msgid "amend previous commit"
+#: builtin/clean.c:25
+msgid ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
 msgstr ""
 
-#: builtin/commit.c:1633
-msgid "bypass post-rewrite hook"
+#: builtin/clean.c:29
+#, c-format
+msgid "Removing %s\n"
 msgstr ""
 
-#: builtin/commit.c:1638
-msgid "ok to record an empty change"
+#: builtin/clean.c:30
+#, c-format
+msgid "Would remove %s\n"
 msgstr ""
 
-#: builtin/commit.c:1640
-msgid "ok to record a change with an empty message"
+#: builtin/clean.c:31
+#, c-format
+msgid "Skipping repository %s\n"
 msgstr ""
 
-#: builtin/commit.c:1669
-msgid "could not parse HEAD commit"
+#: builtin/clean.c:32
+#, c-format
+msgid "Would skip repository %s\n"
 msgstr ""
 
-#: builtin/commit.c:1719
+#: builtin/clean.c:33
 #, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
+msgid "failed to remove %s"
 msgstr ""
 
-#: builtin/commit.c:1726
-msgid "could not read MERGE_MODE"
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
+msgid ""
+"Prompt help:\n"
+"1          - select a numbered item\n"
+"foo        - select item based on unique prefix\n"
+"           - (empty) select nothing\n"
 msgstr ""
 
-#: builtin/commit.c:1745
+#: builtin/clean.c:301 git-add--interactive.perl:623
 #, c-format
-msgid "could not read commit message: %s"
+msgid ""
+"Prompt help:\n"
+"1          - select a single item\n"
+"3-5        - select a range of items\n"
+"2-3,6-9    - select multiple ranges\n"
+"foo        - select item based on unique prefix\n"
+"-...       - unselect specified items\n"
+"*          - choose all items\n"
+"           - (empty) finish selecting\n"
+msgstr ""
+
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
 msgstr ""
 
-#: builtin/commit.c:1756
+#: builtin/clean.c:659
 #, c-format
-msgid "Aborting commit; you did not edit the message.\n"
+msgid "Input ignore patterns>> "
 msgstr ""
 
-#: builtin/commit.c:1761
+#: builtin/clean.c:696
 #, c-format
-msgid "Aborting commit due to empty commit message.\n"
+msgid "WARNING: Cannot find items matched by: %s"
 msgstr ""
 
-#: builtin/commit.c:1809
-msgid ""
-"Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full and quota is\n"
-"not exceeded, and then \"git reset HEAD\" to recover."
+#: builtin/clean.c:717
+msgid "Select items to delete"
 msgstr ""
 
-#: builtin/config.c:9
-msgid "git config [<options>]"
+#. TRANSLATORS: Make sure to keep [y/N] as is
+#: builtin/clean.c:758
+#, c-format
+msgid "Remove %s [y/N]? "
 msgstr ""
 
-#: builtin/config.c:55
-msgid "Config file location"
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
 msgstr ""
 
-#: builtin/config.c:56
-msgid "use global config file"
+#: builtin/clean.c:791
+msgid ""
+"clean               - start cleaning\n"
+"filter by pattern   - exclude items from deletion\n"
+"select by numbers   - select items to be deleted by numbers\n"
+"ask each            - confirm each deletion (like \"rm -i\")\n"
+"quit                - stop cleaning\n"
+"help                - this screen\n"
+"?                   - help for prompt selection"
 msgstr ""
 
-#: builtin/config.c:57
-msgid "use system config file"
+#: builtin/clean.c:818 git-add--interactive.perl:1736
+msgid "*** Commands ***"
 msgstr ""
 
-#: builtin/config.c:58
-msgid "use repository config file"
+#: builtin/clean.c:819 git-add--interactive.perl:1733
+msgid "What now"
 msgstr ""
 
-#: builtin/config.c:59
-msgid "use given config file"
+#: builtin/clean.c:827
+msgid "Would remove the following item:"
+msgid_plural "Would remove the following items:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/clean.c:844
+msgid "No more files to clean, exiting."
 msgstr ""
 
-#: builtin/config.c:60
-msgid "blob-id"
+#: builtin/clean.c:875
+msgid "do not print names of files removed"
 msgstr ""
 
-#: builtin/config.c:60
-msgid "read config from given blob object"
+#: builtin/clean.c:877
+msgid "force"
 msgstr ""
 
-#: builtin/config.c:61
-msgid "Action"
+#: builtin/clean.c:878
+msgid "interactive cleaning"
 msgstr ""
 
-#: builtin/config.c:62
-msgid "get value: name [value-regex]"
+#: builtin/clean.c:880
+msgid "remove whole directories"
 msgstr ""
 
-#: builtin/config.c:63
-msgid "get all values: key [value-regex]"
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
+msgid "pattern"
 msgstr ""
 
-#: builtin/config.c:64
-msgid "get values for regexp: name-regex [value-regex]"
+#: builtin/clean.c:882
+msgid "add <pattern> to ignore rules"
 msgstr ""
 
-#: builtin/config.c:65
-msgid "get value specific for the URL: section[.var] URL"
+#: builtin/clean.c:883
+msgid "remove ignored files, too"
 msgstr ""
 
-#: builtin/config.c:66
-msgid "replace all matching variables: name value [value_regex]"
+#: builtin/clean.c:885
+msgid "remove only ignored files"
 msgstr ""
 
-#: builtin/config.c:67
-msgid "add a new variable: name value"
+#: builtin/clean.c:903
+msgid "-x and -X cannot be used together"
 msgstr ""
 
-#: builtin/config.c:68
-msgid "remove a variable: name [value-regex]"
+#: builtin/clean.c:907
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
 msgstr ""
 
-#: builtin/config.c:69
-msgid "remove all matches: name [value-regex]"
+#: builtin/clean.c:910
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
 msgstr ""
 
-#: builtin/config.c:70
-msgid "rename section: old-name new-name"
+#: builtin/clone.c:37
+msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr ""
 
-#: builtin/config.c:71
-msgid "remove a section: name"
+#: builtin/clone.c:80
+msgid "don't create a checkout"
 msgstr ""
 
-#: builtin/config.c:72
-msgid "list all"
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
+msgid "create a bare repository"
 msgstr ""
 
-#: builtin/config.c:73
-msgid "open an editor"
+#: builtin/clone.c:85
+msgid "create a mirror repository (implies bare)"
 msgstr ""
 
-#: builtin/config.c:74
-msgid "find the color configured: slot [default]"
+#: builtin/clone.c:87
+msgid "to clone from a local repository"
 msgstr ""
 
-#: builtin/config.c:75
-msgid "find the color setting: slot [stdout-is-tty]"
+#: builtin/clone.c:89
+msgid "don't use local hardlinks, always copy"
 msgstr ""
 
-#: builtin/config.c:76
-msgid "Type"
+#: builtin/clone.c:91
+msgid "setup as shared repository"
 msgstr ""
 
-#: builtin/config.c:77
-msgid "value is \"true\" or \"false\""
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
 msgstr ""
 
-#: builtin/config.c:78
-msgid "value is decimal number"
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "initialize submodules in the clone"
 msgstr ""
 
-#: builtin/config.c:79
-msgid "value is --bool or --int"
+#: builtin/clone.c:100
+msgid "number of submodules cloned in parallel"
 msgstr ""
 
-#: builtin/config.c:80
-msgid "value is a path (file or directory name)"
+#: builtin/clone.c:101 builtin/init-db.c:475
+msgid "template-directory"
 msgstr ""
 
-#: builtin/config.c:81
-msgid "Other"
+#: builtin/clone.c:102 builtin/init-db.c:476
+msgid "directory from which templates will be used"
 msgstr ""
 
-#: builtin/config.c:82
-msgid "terminate values with NUL byte"
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
+msgid "reference repository"
 msgstr ""
 
-#: builtin/config.c:83
-msgid "show variable names only"
+#: builtin/clone.c:108
+msgid "use --reference only while cloning"
 msgstr ""
 
-#: builtin/config.c:84
-msgid "respect include directives on lookup"
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
+msgid "name"
 msgstr ""
 
-#: builtin/config.c:85
-msgid "show origin of config (file, standard input, blob, command line)"
+#: builtin/clone.c:110
+msgid "use <name> instead of 'origin' to track upstream"
 msgstr ""
 
-#: builtin/config.c:327
-msgid "unable to parse default color value"
+#: builtin/clone.c:112
+msgid "checkout <branch> instead of the remote's HEAD"
 msgstr ""
 
-#: builtin/config.c:471
-#, c-format
-msgid ""
-"# This is Git's per-user configuration file.\n"
-"[user]\n"
-"# Please adapt and uncomment the following lines:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
+#: builtin/clone.c:114
+msgid "path to git-upload-pack on the remote"
 msgstr ""
 
-#: builtin/config.c:613
-#, c-format
-msgid "cannot create configuration file %s"
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
+msgid "depth"
 msgstr ""
 
-#: builtin/count-objects.c:77
-msgid "git count-objects [-v] [-H | --human-readable]"
+#: builtin/clone.c:116
+msgid "create a shallow clone of that depth"
 msgstr ""
 
-#: builtin/count-objects.c:87
-msgid "print sizes in human readable format"
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
 msgstr ""
 
-#: builtin/describe.c:17
-msgid "git describe [<options>] [<commit-ish>...]"
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
 msgstr ""
 
-#: builtin/describe.c:18
-msgid "git describe [<options>] --dirty"
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
 msgstr ""
 
-#: builtin/describe.c:217
-#, c-format
-msgid "annotated tag %s not available"
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
 msgstr ""
 
-#: builtin/describe.c:221
-#, c-format
-msgid "annotated tag %s has no embedded name"
+#: builtin/clone.c:122
+msgid "clone only one branch, HEAD or --branch"
 msgstr ""
 
-#: builtin/describe.c:223
-#, c-format
-msgid "tag '%s' is really '%s' here"
+#: builtin/clone.c:124
+msgid "any cloned submodules will be shallow"
 msgstr ""
 
-#: builtin/describe.c:250 builtin/log.c:480
-#, c-format
-msgid "Not a valid object name %s"
+#: builtin/clone.c:125 builtin/init-db.c:484
+msgid "gitdir"
 msgstr ""
 
-#: builtin/describe.c:253
-#, c-format
-msgid "%s is not a valid '%s' object"
+#: builtin/clone.c:126 builtin/init-db.c:485
+msgid "separate git dir from working tree"
 msgstr ""
 
-#: builtin/describe.c:270
-#, c-format
-msgid "no tag exactly matches '%s'"
+#: builtin/clone.c:127
+msgid "key=value"
 msgstr ""
 
-#: builtin/describe.c:272
-#, c-format
-msgid "searching to describe %s\n"
+#: builtin/clone.c:128
+msgid "set config inside the new repository"
 msgstr ""
 
-#: builtin/describe.c:319
-#, c-format
-msgid "finished search at %s\n"
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
+msgid "use IPv4 addresses only"
 msgstr ""
 
-#: builtin/describe.c:346
-#, c-format
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
+msgid "use IPv6 addresses only"
+msgstr ""
+
+#: builtin/clone.c:268
 msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
+"No directory name could be guessed.\n"
+"Please specify a directory on the command line"
 msgstr ""
 
-#: builtin/describe.c:350
+#: builtin/clone.c:321
 #, c-format
-msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
+msgid "info: Could not add alternate for '%s': %s\n"
 msgstr ""
 
-#: builtin/describe.c:371
+#: builtin/clone.c:393
 #, c-format
-msgid "traversed %lu commits\n"
+msgid "failed to open '%s'"
 msgstr ""
 
-#: builtin/describe.c:374
+#: builtin/clone.c:401
 #, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
+msgid "%s exists and is not a directory"
 msgstr ""
 
-#: builtin/describe.c:396
-msgid "find the tag that comes after the commit"
+#: builtin/clone.c:415
+#, c-format
+msgid "failed to stat %s\n"
 msgstr ""
 
-#: builtin/describe.c:397
-msgid "debug search strategy on stderr"
+#: builtin/clone.c:437
+#, c-format
+msgid "failed to create link '%s'"
 msgstr ""
 
-#: builtin/describe.c:398
-msgid "use any ref"
+#: builtin/clone.c:441
+#, c-format
+msgid "failed to copy file to '%s'"
 msgstr ""
 
-#: builtin/describe.c:399
-msgid "use any tag, even unannotated"
+#: builtin/clone.c:466
+#, c-format
+msgid "done.\n"
 msgstr ""
 
-#: builtin/describe.c:400
-msgid "always use long format"
+#: builtin/clone.c:478
+msgid ""
+"Clone succeeded, but checkout failed.\n"
+"You can inspect what was checked out with 'git status'\n"
+"and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr ""
 
-#: builtin/describe.c:401
-msgid "only follow first parent"
+#: builtin/clone.c:555
+#, c-format
+msgid "Could not find remote branch %s to clone."
 msgstr ""
 
-#: builtin/describe.c:404
-msgid "only output exact matches"
+#: builtin/clone.c:650
+msgid "remote did not send all necessary objects"
 msgstr ""
 
-#: builtin/describe.c:406
-msgid "consider <n> most recent tags (default: 10)"
+#: builtin/clone.c:666
+#, c-format
+msgid "unable to update %s"
 msgstr ""
 
-#: builtin/describe.c:408
-msgid "only consider tags matching <pattern>"
+#: builtin/clone.c:715
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
-msgid "show abbreviated commit object as fallback"
+#: builtin/clone.c:746
+msgid "unable to checkout working tree"
 msgstr ""
 
-#: builtin/describe.c:411
-msgid "mark"
+#: builtin/clone.c:786
+msgid "unable to write parameters to config file"
 msgstr ""
 
-#: builtin/describe.c:412
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+#: builtin/clone.c:849
+msgid "cannot repack to clean up"
 msgstr ""
 
-#: builtin/describe.c:430
-msgid "--long is incompatible with --abbrev=0"
+#: builtin/clone.c:851
+msgid "cannot unlink temporary alternates file"
 msgstr ""
 
-#: builtin/describe.c:456
-msgid "No names found, cannot describe anything."
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
+msgid "Too many arguments."
 msgstr ""
 
-#: builtin/describe.c:476
-msgid "--dirty is incompatible with commit-ishes"
+#: builtin/clone.c:888
+msgid "You must specify a repository to clone."
 msgstr ""
 
-#: builtin/diff.c:86
+#: builtin/clone.c:901
 #, c-format
-msgid "'%s': not a regular file or symlink"
+msgid "--bare and --origin %s options are incompatible."
 msgstr ""
 
-#: builtin/diff.c:237
-#, c-format
-msgid "invalid option: %s"
+#: builtin/clone.c:904
+msgid "--bare and --separate-git-dir are incompatible."
 msgstr ""
 
-#: builtin/diff.c:360
-msgid "Not a git repository"
+#: builtin/clone.c:917
+#, c-format
+msgid "repository '%s' does not exist"
 msgstr ""
 
-#: builtin/diff.c:403
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
-msgid "invalid object '%s' given."
+msgid "depth %s is not a positive number"
 msgstr ""
 
-#: builtin/diff.c:412
+#: builtin/clone.c:933
 #, c-format
-msgid "more than two blobs given: '%s'"
+msgid "destination path '%s' already exists and is not an empty directory."
 msgstr ""
 
-#: builtin/diff.c:419
+#: builtin/clone.c:943
 #, c-format
-msgid "unhandled object '%s' given."
+msgid "working tree '%s' already exists."
 msgstr ""
 
-#: builtin/fast-export.c:25
-msgid "git fast-export [rev-list-opts]"
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
+#, c-format
+msgid "could not create leading directories of '%s'"
 msgstr ""
 
-#: builtin/fast-export.c:980
-msgid "show progress after <n> objects"
+#: builtin/clone.c:961
+#, c-format
+msgid "could not create work tree dir '%s'"
 msgstr ""
 
-#: builtin/fast-export.c:982
-msgid "select handling of signed tags"
+#: builtin/clone.c:973
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
 msgstr ""
 
-#: builtin/fast-export.c:985
-msgid "select handling of tags that tag filtered objects"
+#: builtin/clone.c:975
+#, c-format
+msgid "Cloning into '%s'...\n"
 msgstr ""
 
-#: builtin/fast-export.c:988
-msgid "Dump marks to this file"
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
 msgstr ""
 
-#: builtin/fast-export.c:990
-msgid "Import marks from this file"
+#: builtin/clone.c:1055
+msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 
-#: builtin/fast-export.c:992
-msgid "Fake a tagger when tags lack one"
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
 msgstr ""
 
-#: builtin/fast-export.c:994
-msgid "Output full tree for each commit"
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
 msgstr ""
 
-#: builtin/fast-export.c:996
-msgid "Use the done feature to terminate the stream"
+#: builtin/clone.c:1062
+msgid "source repository is shallow, ignoring --local"
 msgstr ""
 
-#: builtin/fast-export.c:997
-msgid "Skip output of blob data"
+#: builtin/clone.c:1067
+msgid "--local is ignored"
 msgstr ""
 
-#: builtin/fast-export.c:998
-msgid "refspec"
+#: builtin/clone.c:1071
+#, c-format
+msgid "Don't know how to clone %s"
 msgstr ""
 
-#: builtin/fast-export.c:999
-msgid "Apply refspec to exported refs"
+#: builtin/clone.c:1126 builtin/clone.c:1134
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
 msgstr ""
 
-#: builtin/fast-export.c:1000
-msgid "anonymize output"
+#: builtin/clone.c:1137
+msgid "You appear to have cloned an empty repository."
 msgstr ""
 
-#: builtin/fetch.c:21
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+#: builtin/column.c:9
+msgid "git column [<options>]"
 msgstr ""
 
-#: builtin/fetch.c:22
-msgid "git fetch [<options>] <group>"
+#: builtin/column.c:26
+msgid "lookup config vars"
 msgstr ""
 
-#: builtin/fetch.c:23
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
 msgstr ""
 
-#: builtin/fetch.c:24
-msgid "git fetch --all [<options>]"
+#: builtin/column.c:29
+msgid "Maximum width"
 msgstr ""
 
-#: builtin/fetch.c:93 builtin/pull.c:174
-msgid "fetch from all remotes"
+#: builtin/column.c:30
+msgid "Padding space on left border"
 msgstr ""
 
-#: builtin/fetch.c:95 builtin/pull.c:177
-msgid "append to .git/FETCH_HEAD instead of overwriting"
+#: builtin/column.c:31
+msgid "Padding space on right border"
 msgstr ""
 
-#: builtin/fetch.c:97 builtin/pull.c:180
-msgid "path to upload pack on remote end"
+#: builtin/column.c:32
+msgid "Padding space between columns"
 msgstr ""
 
-#: builtin/fetch.c:98 builtin/pull.c:182
-msgid "force overwrite of local branch"
+#: builtin/column.c:51
+msgid "--command must be the first argument"
 msgstr ""
 
-#: builtin/fetch.c:100
-msgid "fetch from multiple remotes"
+#: builtin/commit.c:38
+msgid "git commit [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/fetch.c:102 builtin/pull.c:184
-msgid "fetch all tags and associated objects"
+#: builtin/commit.c:43
+msgid "git status [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/fetch.c:104
-msgid "do not fetch all tags (--no-tags)"
+#: builtin/commit.c:48
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
 msgstr ""
 
-#: builtin/fetch.c:106
-msgid "number of submodules fetched in parallel"
+#: builtin/commit.c:61
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly:\n"
+"\n"
+"    git config --global user.name \"Your Name\"\n"
+"    git config --global user.email you@example.com\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
 msgstr ""
 
-#: builtin/fetch.c:108 builtin/pull.c:187
-msgid "prune remote-tracking branches no longer on remote"
+#: builtin/commit.c:73
+msgid ""
+"You asked to amend the most recent commit, but doing so would make\n"
+"it empty. You can repeat your command with --allow-empty, or you can\n"
+"remove the commit entirely with \"git reset HEAD^\".\n"
 msgstr ""
 
-#: builtin/fetch.c:109 builtin/pull.c:190
-msgid "on-demand"
+#: builtin/commit.c:78
+msgid ""
+"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
+"If you wish to commit it anyway, use:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
 msgstr ""
 
-#: builtin/fetch.c:110 builtin/pull.c:191
-msgid "control recursive fetching of submodules"
+#: builtin/commit.c:85
+msgid "Otherwise, please use 'git reset'\n"
 msgstr ""
 
-#: builtin/fetch.c:114 builtin/pull.c:199
-msgid "keep downloaded pack"
+#: builtin/commit.c:88
+msgid ""
+"If you wish to skip this commit, use:\n"
+"\n"
+"    git reset\n"
+"\n"
+"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
+"the remaining commits.\n"
 msgstr ""
 
-#: builtin/fetch.c:116
-msgid "allow updating of HEAD ref"
+#: builtin/commit.c:318
+msgid "failed to unpack HEAD tree object"
 msgstr ""
 
-#: builtin/fetch.c:119 builtin/pull.c:202
-msgid "deepen history of shallow clone"
+#: builtin/commit.c:359
+msgid "unable to create temporary index"
 msgstr ""
 
-#: builtin/fetch.c:121 builtin/pull.c:205
-msgid "convert to a complete repository"
+#: builtin/commit.c:365
+msgid "interactive add failed"
 msgstr ""
 
-#: builtin/fetch.c:123 builtin/log.c:1426
-msgid "dir"
+#: builtin/commit.c:378
+msgid "unable to update temporary index"
 msgstr ""
 
-#: builtin/fetch.c:124
-msgid "prepend this to submodule path output"
+#: builtin/commit.c:380
+msgid "Failed to update main cache tree"
 msgstr ""
 
-#: builtin/fetch.c:127
-msgid "default mode for recursion"
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
+msgid "unable to write new_index file"
 msgstr ""
 
-#: builtin/fetch.c:129 builtin/pull.c:208
-msgid "accept refs that update .git/shallow"
+#: builtin/commit.c:458
+msgid "cannot do a partial commit during a merge."
 msgstr ""
 
-#: builtin/fetch.c:130 builtin/pull.c:210
-msgid "refmap"
+#: builtin/commit.c:460
+msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 
-#: builtin/fetch.c:131 builtin/pull.c:211
-msgid "specify fetch refmap"
+#: builtin/commit.c:469
+msgid "cannot read the index"
 msgstr ""
 
-#: builtin/fetch.c:387
-msgid "Couldn't find remote ref HEAD"
+#: builtin/commit.c:488
+msgid "unable to write temporary index file"
 msgstr ""
 
-#: builtin/fetch.c:503
+#: builtin/commit.c:582
 #, c-format
-msgid "configuration fetch.output contains invalid value %s"
+msgid "commit '%s' lacks author header"
 msgstr ""
 
-#: builtin/fetch.c:592
+#: builtin/commit.c:584
 #, c-format
-msgid "object %s not found"
+msgid "commit '%s' has malformed author line"
 msgstr ""
 
-#: builtin/fetch.c:596
-msgid "[up to date]"
+#: builtin/commit.c:603
+msgid "malformed --author parameter"
 msgstr ""
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
-msgid "[rejected]"
+#: builtin/commit.c:655
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
 msgstr ""
 
-#: builtin/fetch.c:610
-msgid "can't fetch in current branch"
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
+#, c-format
+msgid "could not lookup commit %s"
 msgstr ""
 
-#: builtin/fetch.c:619
-msgid "[tag update]"
+#: builtin/commit.c:704 builtin/shortlog.c:294
+#, c-format
+msgid "(reading log message from standard input)\n"
 msgstr ""
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
-msgid "unable to update local ref"
+#: builtin/commit.c:706
+msgid "could not read log from standard input"
 msgstr ""
 
-#: builtin/fetch.c:639
-msgid "[new tag]"
+#: builtin/commit.c:710
+#, c-format
+msgid "could not read log file '%s'"
 msgstr ""
 
-#: builtin/fetch.c:642
-msgid "[new branch]"
+#: builtin/commit.c:737 builtin/commit.c:745
+msgid "could not read SQUASH_MSG"
 msgstr ""
 
-#: builtin/fetch.c:645
-msgid "[new ref]"
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
 msgstr ""
 
-#: builtin/fetch.c:684
-msgid "forced update"
+#: builtin/commit.c:796
+msgid "could not write commit template"
 msgstr ""
 
-#: builtin/fetch.c:689
-msgid "non-fast-forward"
+#: builtin/commit.c:814
+#, c-format
+msgid ""
+"\n"
+"It looks like you may be committing a merge.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
 msgstr ""
 
-#: builtin/fetch.c:733
+#: builtin/commit.c:819
 #, c-format
-msgid "%s did not send all necessary objects\n"
+msgid ""
+"\n"
+"It looks like you may be committing a cherry-pick.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
 msgstr ""
 
-#: builtin/fetch.c:753
+#: builtin/commit.c:832
 #, c-format
-msgid "reject %s because shallow roots are not allowed to be updated"
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be ignored, and an empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/commit.c:839
 #, c-format
-msgid "From %.*s\n"
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be kept; you may remove them yourself if you want to.\n"
+"An empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/fetch.c:850
+#: builtin/commit.c:859
 #, c-format
-msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
+msgid "%sAuthor:    %.*s <%.*s>"
 msgstr ""
 
-#: builtin/fetch.c:904
+#: builtin/commit.c:867
 #, c-format
-msgid "   (%s will become dangling)"
+msgid "%sDate:      %s"
 msgstr ""
 
-#: builtin/fetch.c:905
+#: builtin/commit.c:874
 #, c-format
-msgid "   (%s has become dangling)"
+msgid "%sCommitter: %.*s <%.*s>"
 msgstr ""
 
-#: builtin/fetch.c:937
-msgid "[deleted]"
+#: builtin/commit.c:892
+msgid "Cannot read index"
 msgstr ""
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
-msgid "(none)"
+#: builtin/commit.c:954
+msgid "Error building trees"
 msgstr ""
 
-#: builtin/fetch.c:960
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
-msgid "Refusing to fetch into current branch %s of non-bare repository"
+msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 
-#: builtin/fetch.c:979
+#: builtin/commit.c:1071
 #, c-format
-msgid "Option \"%s\" value \"%s\" is not valid for %s"
+msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 
-#: builtin/fetch.c:982
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
-msgid "Option \"%s\" is ignored for %s\n"
+msgid "Invalid untracked files mode '%s'"
 msgstr ""
 
-#: builtin/fetch.c:1039
-#, c-format
-msgid "Don't know how to fetch from %s"
+#: builtin/commit.c:1124
+msgid "--long and -z are incompatible"
 msgstr ""
 
-#: builtin/fetch.c:1199
-#, c-format
-msgid "Fetching %s\n"
+#: builtin/commit.c:1154
+msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
-#, c-format
-msgid "Could not fetch %s"
+#: builtin/commit.c:1163
+msgid "You have nothing to amend."
 msgstr ""
 
-#: builtin/fetch.c:1219
-msgid ""
-"No remote repository specified.  Please, specify either a URL or a\n"
-"remote name from which new revisions should be fetched."
+#: builtin/commit.c:1166
+msgid "You are in the middle of a merge -- cannot amend."
 msgstr ""
 
-#: builtin/fetch.c:1242
-msgid "You need to specify a tag name."
+#: builtin/commit.c:1168
+msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr ""
 
-#: builtin/fetch.c:1284
-msgid "--depth and --unshallow cannot be used together"
+#: builtin/commit.c:1171
+msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 
-#: builtin/fetch.c:1286
-msgid "--unshallow on a complete repository does not make sense"
+#: builtin/commit.c:1181
+msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
 
-#: builtin/fetch.c:1306
-msgid "fetch --all does not take a repository argument"
+#: builtin/commit.c:1183
+msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr ""
 
-#: builtin/fetch.c:1308
-msgid "fetch --all does not make sense with refspecs"
+#: builtin/commit.c:1191
+msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 
-#: builtin/fetch.c:1319
-#, c-format
-msgid "No such remote or remote group: %s"
+#: builtin/commit.c:1208
+msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 
-#: builtin/fetch.c:1327
-msgid "Fetching a group and specifying refspecs does not make sense"
+#: builtin/commit.c:1210
+msgid "No paths with --include/--only does not make sense."
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:14
-msgid ""
-"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
+#: builtin/commit.c:1212
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:667
-msgid "populate log with at most <n> entries from shortlog"
+#: builtin/commit.c:1224 builtin/tag.c:551
+#, c-format
+msgid "Invalid cleanup mode %s"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:670
-msgid "alias for --log (deprecated)"
+#: builtin/commit.c:1229
+msgid "Paths with -a does not make sense."
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:673
-msgid "text"
+#: builtin/commit.c:1339 builtin/commit.c:1612
+msgid "show status concisely"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:674
-msgid "use <text> as start of message"
+#: builtin/commit.c:1341 builtin/commit.c:1614
+msgid "show branch information"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:675
-msgid "file to read from"
+#: builtin/commit.c:1343
+msgid "version"
 msgstr ""
 
-#: builtin/for-each-ref.c:9
-msgid "git for-each-ref [<options>] [<pattern>]"
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
+msgid "machine-readable output"
 msgstr ""
 
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [--points-at <object>]"
+#: builtin/commit.c:1346 builtin/commit.c:1618
+msgid "show status in long format (default)"
 msgstr ""
 
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+#: builtin/commit.c:1349 builtin/commit.c:1621
+msgid "terminate entries with NUL"
 msgstr ""
 
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
+msgid "mode"
 msgstr ""
 
-#: builtin/for-each-ref.c:27
-msgid "quote placeholders suitably for shells"
+#: builtin/commit.c:1352 builtin/commit.c:1624
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 
-#: builtin/for-each-ref.c:29
-msgid "quote placeholders suitably for perl"
+#: builtin/commit.c:1355
+msgid "show ignored files"
 msgstr ""
 
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for python"
+#: builtin/commit.c:1356 parse-options.h:155
+msgid "when"
 msgstr ""
 
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for Tcl"
+#: builtin/commit.c:1357
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
 msgstr ""
 
-#: builtin/for-each-ref.c:36
-msgid "show only <n> matched refs"
+#: builtin/commit.c:1359
+msgid "list untracked files in columns"
 msgstr ""
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
+#: builtin/commit.c:1435
+msgid "couldn't look up newly created commit"
 msgstr ""
 
-#: builtin/for-each-ref.c:41
-msgid "print only refs which points at the given object"
+#: builtin/commit.c:1437
+msgid "could not parse newly created commit"
 msgstr ""
 
-#: builtin/for-each-ref.c:43
-msgid "print only refs that are merged"
+#: builtin/commit.c:1482
+msgid "detached HEAD"
 msgstr ""
 
-#: builtin/for-each-ref.c:44
-msgid "print only refs that are not merged"
+#: builtin/commit.c:1485
+msgid " (root-commit)"
 msgstr ""
 
-#: builtin/for-each-ref.c:45
-msgid "print only refs which contain the commit"
+#: builtin/commit.c:1582
+msgid "suppress summary after successful commit"
 msgstr ""
 
-#: builtin/fsck.c:519
-msgid "Checking object directories"
+#: builtin/commit.c:1583
+msgid "show diff in commit message template"
 msgstr ""
 
-#: builtin/fsck.c:588
-msgid "git fsck [<options>] [<object>...]"
+#: builtin/commit.c:1585
+msgid "Commit message options"
 msgstr ""
 
-#: builtin/fsck.c:594
-msgid "show unreachable objects"
+#: builtin/commit.c:1586 builtin/tag.c:409
+msgid "read message from file"
 msgstr ""
 
-#: builtin/fsck.c:595
-msgid "show dangling objects"
+#: builtin/commit.c:1587
+msgid "author"
 msgstr ""
 
-#: builtin/fsck.c:596
-msgid "report tags"
+#: builtin/commit.c:1587
+msgid "override author for commit"
 msgstr ""
 
-#: builtin/fsck.c:597
-msgid "report root nodes"
+#: builtin/commit.c:1588 builtin/gc.c:357
+msgid "date"
 msgstr ""
 
-#: builtin/fsck.c:598
-msgid "make index objects head nodes"
+#: builtin/commit.c:1588
+msgid "override date for commit"
 msgstr ""
 
-#: builtin/fsck.c:599
-msgid "make reflogs head nodes (default)"
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
+msgid "message"
 msgstr ""
 
-#: builtin/fsck.c:600
-msgid "also consider packs and alternate objects"
+#: builtin/commit.c:1589
+msgid "commit message"
 msgstr ""
 
-#: builtin/fsck.c:601
-msgid "check only connectivity"
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
+msgid "commit"
 msgstr ""
 
-#: builtin/fsck.c:602
-msgid "enable more strict checking"
+#: builtin/commit.c:1590
+msgid "reuse and edit message from specified commit"
 msgstr ""
 
-#: builtin/fsck.c:604
-msgid "write dangling objects in .git/lost-found"
+#: builtin/commit.c:1591
+msgid "reuse message from specified commit"
 msgstr ""
 
-#: builtin/fsck.c:605 builtin/prune.c:107
-msgid "show progress"
+#: builtin/commit.c:1592
+msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 
-#: builtin/fsck.c:606
-msgid "show verbose names for reachable objects"
+#: builtin/commit.c:1593
+msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 
-#: builtin/fsck.c:671
-msgid "Checking objects"
+#: builtin/commit.c:1594
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 
-#: builtin/gc.c:25
-msgid "git gc [<options>]"
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
+msgid "add Signed-off-by:"
 msgstr ""
 
-#: builtin/gc.c:72
-#, c-format
-msgid "Invalid %s: '%s'"
+#: builtin/commit.c:1596
+msgid "use specified template file"
 msgstr ""
 
-#: builtin/gc.c:139
-#, c-format
-msgid "insanely long object directory %.*s"
+#: builtin/commit.c:1597
+msgid "force edit of commit"
 msgstr ""
 
-#: builtin/gc.c:290
-#, c-format
-msgid ""
-"The last gc run reported the following. Please correct the root cause\n"
-"and remove %s.\n"
-"Automatic cleanup will not be performed until the file is removed.\n"
-"\n"
-"%s"
+#: builtin/commit.c:1598
+msgid "default"
 msgstr ""
 
-#: builtin/gc.c:327
-msgid "prune unreferenced objects"
+#: builtin/commit.c:1598 builtin/tag.c:412
+msgid "how to strip spaces and #comments from message"
 msgstr ""
 
-#: builtin/gc.c:329
-msgid "be more thorough (increased runtime)"
+#: builtin/commit.c:1599
+msgid "include status in commit message template"
 msgstr ""
 
-#: builtin/gc.c:330
-msgid "enable auto-gc mode"
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
+msgid "GPG sign commit"
 msgstr ""
 
-#: builtin/gc.c:331
-msgid "force running gc even if there may be another gc running"
+#: builtin/commit.c:1604
+msgid "Commit contents options"
 msgstr ""
 
-#: builtin/gc.c:373
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
+#: builtin/commit.c:1605
+msgid "commit all changed files"
 msgstr ""
 
-#: builtin/gc.c:375
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
+#: builtin/commit.c:1606
+msgid "add specified files to index for commit"
 msgstr ""
 
-#: builtin/gc.c:376
-#, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
+#: builtin/commit.c:1607
+msgid "interactively add files"
 msgstr ""
 
-#: builtin/gc.c:397
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+#: builtin/commit.c:1608
+msgid "interactively add changes"
 msgstr ""
 
-#: builtin/gc.c:441
-msgid ""
-"There are too many unreachable loose objects; run 'git prune' to remove them."
+#: builtin/commit.c:1609
+msgid "commit only specified files"
 msgstr ""
 
-#: builtin/grep.c:23
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
+#: builtin/commit.c:1610
+msgid "bypass pre-commit and commit-msg hooks"
 msgstr ""
 
-#: builtin/grep.c:219
-#, c-format
-msgid "grep: failed to create thread: %s"
+#: builtin/commit.c:1611
+msgid "show what would be committed"
 msgstr ""
 
-#: builtin/grep.c:277
-#, c-format
-msgid "invalid number of threads specified (%d) for %s"
+#: builtin/commit.c:1622
+msgid "amend previous commit"
 msgstr ""
 
-#: builtin/grep.c:452 builtin/grep.c:487
-#, c-format
-msgid "unable to read tree (%s)"
+#: builtin/commit.c:1623
+msgid "bypass post-rewrite hook"
 msgstr ""
 
-#: builtin/grep.c:502
-#, c-format
-msgid "unable to grep from object of type %s"
+#: builtin/commit.c:1628
+msgid "ok to record an empty change"
 msgstr ""
 
-#: builtin/grep.c:560
-#, c-format
-msgid "switch `%c' expects a numerical value"
+#: builtin/commit.c:1630
+msgid "ok to record a change with an empty message"
+msgstr ""
+
+#: builtin/commit.c:1659
+msgid "could not parse HEAD commit"
 msgstr ""
 
-#: builtin/grep.c:577
+#: builtin/commit.c:1707
 #, c-format
-msgid "cannot open '%s'"
+msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr ""
 
-#: builtin/grep.c:646
-msgid "search in index instead of in the work tree"
+#: builtin/commit.c:1714
+msgid "could not read MERGE_MODE"
 msgstr ""
 
-#: builtin/grep.c:648
-msgid "find in contents not managed by git"
+#: builtin/commit.c:1733
+#, c-format
+msgid "could not read commit message: %s"
 msgstr ""
 
-#: builtin/grep.c:650
-msgid "search in both tracked and untracked files"
+#: builtin/commit.c:1744
+#, c-format
+msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 
-#: builtin/grep.c:652
-msgid "ignore files specified via '.gitignore'"
+#: builtin/commit.c:1749
+#, c-format
+msgid "Aborting commit due to empty commit message.\n"
 msgstr ""
 
-#: builtin/grep.c:655
-msgid "show non-matching lines"
+#: builtin/commit.c:1797
+msgid ""
+"Repository has been updated, but unable to write\n"
+"new_index file. Check that disk is not full and quota is\n"
+"not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
 
-#: builtin/grep.c:657
-msgid "case insensitive matching"
+#: builtin/config.c:9
+msgid "git config [<options>]"
 msgstr ""
 
-#: builtin/grep.c:659
-msgid "match patterns only at word boundaries"
+#: builtin/config.c:56
+msgid "Config file location"
 msgstr ""
 
-#: builtin/grep.c:661
-msgid "process binary files as text"
+#: builtin/config.c:57
+msgid "use global config file"
 msgstr ""
 
-#: builtin/grep.c:663
-msgid "don't match patterns in binary files"
+#: builtin/config.c:58
+msgid "use system config file"
 msgstr ""
 
-#: builtin/grep.c:666
-msgid "process binary files with textconv filters"
+#: builtin/config.c:59
+msgid "use repository config file"
 msgstr ""
 
-#: builtin/grep.c:668
-msgid "descend at most <depth> levels"
+#: builtin/config.c:60
+msgid "use given config file"
 msgstr ""
 
-#: builtin/grep.c:672
-msgid "use extended POSIX regular expressions"
+#: builtin/config.c:61
+msgid "blob-id"
 msgstr ""
 
-#: builtin/grep.c:675
-msgid "use basic POSIX regular expressions (default)"
+#: builtin/config.c:61
+msgid "read config from given blob object"
 msgstr ""
 
-#: builtin/grep.c:678
-msgid "interpret patterns as fixed strings"
+#: builtin/config.c:62
+msgid "Action"
 msgstr ""
 
-#: builtin/grep.c:681
-msgid "use Perl-compatible regular expressions"
+#: builtin/config.c:63
+msgid "get value: name [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:684
-msgid "show line numbers"
+#: builtin/config.c:64
+msgid "get all values: key [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:685
-msgid "don't show filenames"
+#: builtin/config.c:65
+msgid "get values for regexp: name-regex [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:686
-msgid "show filenames"
+#: builtin/config.c:66
+msgid "get value specific for the URL: section[.var] URL"
 msgstr ""
 
-#: builtin/grep.c:688
-msgid "show filenames relative to top directory"
+#: builtin/config.c:67
+msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 
-#: builtin/grep.c:690
-msgid "show only filenames instead of matching lines"
+#: builtin/config.c:68
+msgid "add a new variable: name value"
 msgstr ""
 
-#: builtin/grep.c:692
-msgid "synonym for --files-with-matches"
+#: builtin/config.c:69
+msgid "remove a variable: name [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:695
-msgid "show only the names of files without match"
+#: builtin/config.c:70
+msgid "remove all matches: name [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:697
-msgid "print NUL after filenames"
+#: builtin/config.c:71
+msgid "rename section: old-name new-name"
 msgstr ""
 
-#: builtin/grep.c:699
-msgid "show the number of matches instead of matching lines"
+#: builtin/config.c:72
+msgid "remove a section: name"
 msgstr ""
 
-#: builtin/grep.c:700
-msgid "highlight matches"
+#: builtin/config.c:73
+msgid "list all"
 msgstr ""
 
-#: builtin/grep.c:702
-msgid "print empty line between matches from different files"
+#: builtin/config.c:74
+msgid "open an editor"
 msgstr ""
 
-#: builtin/grep.c:704
-msgid "show filename only once above matches from same file"
+#: builtin/config.c:75
+msgid "find the color configured: slot [default]"
 msgstr ""
 
-#: builtin/grep.c:707
-msgid "show <n> context lines before and after matches"
+#: builtin/config.c:76
+msgid "find the color setting: slot [stdout-is-tty]"
 msgstr ""
 
-#: builtin/grep.c:710
-msgid "show <n> context lines before matches"
+#: builtin/config.c:77
+msgid "Type"
 msgstr ""
 
-#: builtin/grep.c:712
-msgid "show <n> context lines after matches"
+#: builtin/config.c:78
+msgid "value is \"true\" or \"false\""
 msgstr ""
 
-#: builtin/grep.c:714
-msgid "use <n> worker threads"
+#: builtin/config.c:79
+msgid "value is decimal number"
 msgstr ""
 
-#: builtin/grep.c:715
-msgid "shortcut for -C NUM"
+#: builtin/config.c:80
+msgid "value is --bool or --int"
 msgstr ""
 
-#: builtin/grep.c:718
-msgid "show a line with the function name before matches"
+#: builtin/config.c:81
+msgid "value is a path (file or directory name)"
 msgstr ""
 
-#: builtin/grep.c:720
-msgid "show the surrounding function"
+#: builtin/config.c:82
+msgid "Other"
 msgstr ""
 
-#: builtin/grep.c:723
-msgid "read patterns from file"
+#: builtin/config.c:83
+msgid "terminate values with NUL byte"
 msgstr ""
 
-#: builtin/grep.c:725
-msgid "match <pattern>"
+#: builtin/config.c:84
+msgid "show variable names only"
 msgstr ""
 
-#: builtin/grep.c:727
-msgid "combine patterns specified with -e"
+#: builtin/config.c:85
+msgid "respect include directives on lookup"
 msgstr ""
 
-#: builtin/grep.c:739
-msgid "indicate hit with exit status without output"
+#: builtin/config.c:86
+msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
 
-#: builtin/grep.c:741
-msgid "show only matches from files that match all patterns"
+#: builtin/config.c:328
+msgid "unable to parse default color value"
 msgstr ""
 
-#: builtin/grep.c:743
-msgid "show parse tree for grep expression"
+#: builtin/config.c:472
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[user]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
 msgstr ""
 
-#: builtin/grep.c:747
-msgid "pager"
+#: builtin/config.c:615
+#, c-format
+msgid "cannot create configuration file %s"
 msgstr ""
 
-#: builtin/grep.c:747
-msgid "show matching files in the pager"
+#: builtin/config.c:627
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
 msgstr ""
 
-#: builtin/grep.c:750
-msgid "allow calling of grep(1) (ignored by this build)"
+#: builtin/count-objects.c:86
+msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr ""
 
-#: builtin/grep.c:813
-msgid "no pattern given."
+#: builtin/count-objects.c:96
+msgid "print sizes in human readable format"
 msgstr ""
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
-#, c-format
-msgid "invalid number of threads specified (%d)"
+#: builtin/describe.c:18
+msgid "git describe [<options>] [<commit-ish>...]"
 msgstr ""
 
-#: builtin/grep.c:875
-msgid "--open-files-in-pager only works on the worktree"
+#: builtin/describe.c:19
+msgid "git describe [<options>] --dirty"
 msgstr ""
 
-#: builtin/grep.c:901
-msgid "--cached or --untracked cannot be used with --no-index."
+#: builtin/describe.c:53
+msgid "head"
 msgstr ""
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
+#: builtin/describe.c:53
+msgid "lightweight"
 msgstr ""
 
-#: builtin/grep.c:909
-msgid "--[no-]exclude-standard cannot be used for tracked contents."
+#: builtin/describe.c:53
+msgid "annotated"
 msgstr ""
 
-#: builtin/grep.c:917
-msgid "both --cached and trees are given."
+#: builtin/describe.c:250
+#, c-format
+msgid "annotated tag %s not available"
 msgstr ""
 
-#: builtin/hash-object.c:81
-msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
+#: builtin/describe.c:254
+#, c-format
+msgid "annotated tag %s has no embedded name"
 msgstr ""
 
-#: builtin/hash-object.c:82
-msgid "git hash-object  --stdin-paths"
+#: builtin/describe.c:256
+#, c-format
+msgid "tag '%s' is really '%s' here"
 msgstr ""
 
-#: builtin/hash-object.c:93
-msgid "type"
+#: builtin/describe.c:283 builtin/log.c:487
+#, c-format
+msgid "Not a valid object name %s"
 msgstr ""
 
-#: builtin/hash-object.c:93
-msgid "object type"
+#: builtin/describe.c:286
+#, c-format
+msgid "%s is not a valid '%s' object"
 msgstr ""
 
-#: builtin/hash-object.c:94
-msgid "write the object into the object database"
+#: builtin/describe.c:303
+#, c-format
+msgid "no tag exactly matches '%s'"
 msgstr ""
 
-#: builtin/hash-object.c:96
-msgid "read the object from stdin"
+#: builtin/describe.c:305
+#, c-format
+msgid "searching to describe %s\n"
 msgstr ""
 
-#: builtin/hash-object.c:98
-msgid "store file as is without filters"
+#: builtin/describe.c:352
+#, c-format
+msgid "finished search at %s\n"
 msgstr ""
 
-#: builtin/hash-object.c:99
+#: builtin/describe.c:379
+#, c-format
 msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
-msgstr ""
-
-#: builtin/hash-object.c:100
-msgid "process file as it were from this path"
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
 msgstr ""
 
-#: builtin/help.c:41
-msgid "print all available commands"
+#: builtin/describe.c:383
+#, c-format
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
 msgstr ""
 
-#: builtin/help.c:42
-msgid "print list of useful guides"
+#: builtin/describe.c:413
+#, c-format
+msgid "traversed %lu commits\n"
 msgstr ""
 
-#: builtin/help.c:43
-msgid "show man page"
+#: builtin/describe.c:416
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
 msgstr ""
 
-#: builtin/help.c:44
-msgid "show manual in web browser"
+#: builtin/describe.c:438
+msgid "find the tag that comes after the commit"
 msgstr ""
 
-#: builtin/help.c:46
-msgid "show info page"
+#: builtin/describe.c:439
+msgid "debug search strategy on stderr"
 msgstr ""
 
-#: builtin/help.c:52
-msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
+#: builtin/describe.c:440
+msgid "use any ref"
 msgstr ""
 
-#: builtin/help.c:64
-#, c-format
-msgid "unrecognized help format '%s'"
+#: builtin/describe.c:441
+msgid "use any tag, even unannotated"
 msgstr ""
 
-#: builtin/help.c:91
-msgid "Failed to start emacsclient."
+#: builtin/describe.c:442
+msgid "always use long format"
 msgstr ""
 
-#: builtin/help.c:104
-msgid "Failed to parse emacsclient version."
+#: builtin/describe.c:443
+msgid "only follow first parent"
 msgstr ""
 
-#: builtin/help.c:112
-#, c-format
-msgid "emacsclient version '%d' too old (< 22)."
+#: builtin/describe.c:446
+msgid "only output exact matches"
 msgstr ""
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
-#, c-format
-msgid "failed to exec '%s'"
+#: builtin/describe.c:448
+msgid "consider <n> most recent tags (default: 10)"
 msgstr ""
 
-#: builtin/help.c:205
-#, c-format
-msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
+#: builtin/describe.c:450
+msgid "only consider tags matching <pattern>"
 msgstr ""
 
-#: builtin/help.c:217
-#, c-format
-msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
 msgstr ""
 
-#: builtin/help.c:334
-#, c-format
-msgid "'%s': unknown man viewer."
+#: builtin/describe.c:454 builtin/name-rev.c:357
+msgid "show abbreviated commit object as fallback"
 msgstr ""
 
-#: builtin/help.c:351
-msgid "no man viewer handled the request"
+#: builtin/describe.c:455 builtin/describe.c:458
+msgid "mark"
 msgstr ""
 
-#: builtin/help.c:359
-msgid "no info viewer handled the request"
+#: builtin/describe.c:456
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 
-#: builtin/help.c:401
-msgid "Defining attributes per path"
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
 msgstr ""
 
-#: builtin/help.c:402
-msgid "Everyday Git With 20 Commands Or So"
+#: builtin/describe.c:477
+msgid "--long is incompatible with --abbrev=0"
 msgstr ""
 
-#: builtin/help.c:403
-msgid "A Git glossary"
+#: builtin/describe.c:506
+msgid "No names found, cannot describe anything."
 msgstr ""
 
-#: builtin/help.c:404
-msgid "Specifies intentionally untracked files to ignore"
+#: builtin/describe.c:549
+msgid "--dirty is incompatible with commit-ishes"
 msgstr ""
 
-#: builtin/help.c:405
-msgid "Defining submodule properties"
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
 msgstr ""
 
-#: builtin/help.c:406
-msgid "Specifying revisions and ranges for Git"
+#: builtin/diff.c:83
+#, c-format
+msgid "'%s': not a regular file or symlink"
 msgstr ""
 
-#: builtin/help.c:407
-msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
+#: builtin/diff.c:234
+#, c-format
+msgid "invalid option: %s"
 msgstr ""
 
-#: builtin/help.c:408
-msgid "An overview of recommended workflows with Git"
+#: builtin/diff.c:358
+msgid "Not a git repository"
 msgstr ""
 
-#: builtin/help.c:420
-msgid "The common Git guides are:\n"
+#: builtin/diff.c:401
+#, c-format
+msgid "invalid object '%s' given."
 msgstr ""
 
-#: builtin/help.c:441 builtin/help.c:458
+#: builtin/diff.c:410
 #, c-format
-msgid "usage: %s%s"
+msgid "more than two blobs given: '%s'"
 msgstr ""
 
-#: builtin/help.c:474
+#: builtin/diff.c:417
 #, c-format
-msgid "`git %s' is aliased to `%s'"
+msgid "unhandled object '%s' given."
 msgstr ""
 
-#: builtin/index-pack.c:153
-#, c-format
-msgid "unable to open %s"
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
 msgstr ""
 
-#: builtin/index-pack.c:203
+#: builtin/difftool.c:241
 #, c-format
-msgid "object type mismatch at %s"
+msgid "failed: %d"
 msgstr ""
 
-#: builtin/index-pack.c:223
+#: builtin/difftool.c:283
 #, c-format
-msgid "did not receive expected object %s"
+msgid "could not read symlink %s"
 msgstr ""
 
-#: builtin/index-pack.c:226
+#: builtin/difftool.c:285
 #, c-format
-msgid "object %s: expected type %s, found %s"
+msgid "could not read symlink file %s"
 msgstr ""
 
-#: builtin/index-pack.c:268
+#: builtin/difftool.c:293
 #, c-format
-msgid "cannot fill %d byte"
-msgid_plural "cannot fill %d bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:278
-msgid "early EOF"
+msgid "could not read object %s for symlink %s"
 msgstr ""
 
-#: builtin/index-pack.c:279
-msgid "read error on input"
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
 msgstr ""
 
-#: builtin/index-pack.c:291
-msgid "used more bytes than were available"
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
 msgstr ""
 
-#: builtin/index-pack.c:298
-msgid "pack too large for current definition of off_t"
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
 msgstr ""
 
-#: builtin/index-pack.c:314
+#: builtin/difftool.c:622
 #, c-format
-msgid "unable to create '%s'"
+msgid "temporary files exist in '%s'."
 msgstr ""
 
-#: builtin/index-pack.c:319
-#, c-format
-msgid "cannot open packfile '%s'"
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
 msgstr ""
 
-#: builtin/index-pack.c:333
-msgid "pack signature mismatch"
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
 msgstr ""
 
-#: builtin/index-pack.c:335
-#, c-format
-msgid "pack version %<PRIu32> unsupported"
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
 msgstr ""
 
-#: builtin/index-pack.c:353
-#, c-format
-msgid "pack has bad object at offset %<PRIuMAX>: %s"
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
 msgstr ""
 
-#: builtin/index-pack.c:475
-#, c-format
-msgid "inflate returned %d"
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
 msgstr ""
 
-#: builtin/index-pack.c:524
-msgid "offset value overflow for delta base object"
+#: builtin/difftool.c:680
+msgid "<tool>"
 msgstr ""
 
-#: builtin/index-pack.c:532
-msgid "delta base offset is out of bound"
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
 msgstr ""
 
-#: builtin/index-pack.c:540
-#, c-format
-msgid "unknown object type %d"
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
 msgstr ""
 
-#: builtin/index-pack.c:571
-msgid "cannot pread pack file"
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
 msgstr ""
 
-#: builtin/index-pack.c:573
-#, c-format
-msgid "premature end of pack file, %<PRIuMAX> byte missing"
-msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:599
-msgid "serious inflate inconsistency"
+#: builtin/difftool.c:688
+msgid "<command>"
 msgstr ""
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
 msgstr ""
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
-#, c-format
-msgid "unable to read %s"
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
 msgstr ""
 
-#: builtin/index-pack.c:814
-#, c-format
-msgid "cannot read existing object %s"
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
 msgstr ""
 
-#: builtin/index-pack.c:828
-#, c-format
-msgid "invalid blob object %s"
+#: builtin/fast-export.c:25
+msgid "git fast-export [rev-list-opts]"
 msgstr ""
 
-#: builtin/index-pack.c:842
-#, c-format
-msgid "invalid %s"
+#: builtin/fast-export.c:980
+msgid "show progress after <n> objects"
 msgstr ""
 
-#: builtin/index-pack.c:845
-msgid "Error in object"
+#: builtin/fast-export.c:982
+msgid "select handling of signed tags"
 msgstr ""
 
-#: builtin/index-pack.c:847
-#, c-format
-msgid "Not all child objects of %s are reachable"
+#: builtin/fast-export.c:985
+msgid "select handling of tags that tag filtered objects"
 msgstr ""
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
-msgid "failed to apply delta"
+#: builtin/fast-export.c:988
+msgid "Dump marks to this file"
 msgstr ""
 
-#: builtin/index-pack.c:1120
-msgid "Receiving objects"
+#: builtin/fast-export.c:990
+msgid "Import marks from this file"
 msgstr ""
 
-#: builtin/index-pack.c:1120
-msgid "Indexing objects"
+#: builtin/fast-export.c:992
+msgid "Fake a tagger when tags lack one"
 msgstr ""
 
-#: builtin/index-pack.c:1152
-msgid "pack is corrupted (SHA1 mismatch)"
+#: builtin/fast-export.c:994
+msgid "Output full tree for each commit"
 msgstr ""
 
-#: builtin/index-pack.c:1157
-msgid "cannot fstat packfile"
+#: builtin/fast-export.c:996
+msgid "Use the done feature to terminate the stream"
 msgstr ""
 
-#: builtin/index-pack.c:1160
-msgid "pack has junk at the end"
+#: builtin/fast-export.c:997
+msgid "Skip output of blob data"
 msgstr ""
 
-#: builtin/index-pack.c:1171
-msgid "confusion beyond insanity in parse_pack_objects()"
+#: builtin/fast-export.c:998
+msgid "refspec"
 msgstr ""
 
-#: builtin/index-pack.c:1196
-msgid "Resolving deltas"
+#: builtin/fast-export.c:999
+msgid "Apply refspec to exported refs"
 msgstr ""
 
-#: builtin/index-pack.c:1207
-#, c-format
-msgid "unable to create thread: %s"
+#: builtin/fast-export.c:1000
+msgid "anonymize output"
 msgstr ""
 
-#: builtin/index-pack.c:1249
-msgid "confusion beyond insanity"
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 
-#: builtin/index-pack.c:1255
-#, c-format
-msgid "completed with %d local object"
-msgid_plural "completed with %d local objects"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/fetch.c:22
+msgid "git fetch [<options>] <group>"
+msgstr ""
 
-#: builtin/index-pack.c:1267
-#, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
+#: builtin/fetch.c:23
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr ""
 
-#: builtin/index-pack.c:1271
-#, c-format
-msgid "pack has %d unresolved delta"
-msgid_plural "pack has %d unresolved deltas"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/fetch.c:24
+msgid "git fetch --all [<options>]"
+msgstr ""
 
-#: builtin/index-pack.c:1295
-#, c-format
-msgid "unable to deflate appended object (%d)"
+#: builtin/fetch.c:95 builtin/pull.c:175
+msgid "fetch from all remotes"
 msgstr ""
 
-#: builtin/index-pack.c:1371
-#, c-format
-msgid "local object %s is corrupt"
+#: builtin/fetch.c:97 builtin/pull.c:178
+msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr ""
 
-#: builtin/index-pack.c:1395
-msgid "error while closing pack file"
+#: builtin/fetch.c:99 builtin/pull.c:181
+msgid "path to upload pack on remote end"
 msgstr ""
 
-#: builtin/index-pack.c:1408
-#, c-format
-msgid "cannot write keep file '%s'"
+#: builtin/fetch.c:100 builtin/pull.c:183
+msgid "force overwrite of local branch"
 msgstr ""
 
-#: builtin/index-pack.c:1416
-#, c-format
-msgid "cannot close written keep file '%s'"
+#: builtin/fetch.c:102
+msgid "fetch from multiple remotes"
 msgstr ""
 
-#: builtin/index-pack.c:1429
-msgid "cannot store pack file"
+#: builtin/fetch.c:104 builtin/pull.c:185
+msgid "fetch all tags and associated objects"
 msgstr ""
 
-#: builtin/index-pack.c:1440
-msgid "cannot store index file"
+#: builtin/fetch.c:106
+msgid "do not fetch all tags (--no-tags)"
 msgstr ""
 
-#: builtin/index-pack.c:1473
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
+#: builtin/fetch.c:108
+msgid "number of submodules fetched in parallel"
 msgstr ""
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
-#, c-format
-msgid "no threads support, ignoring %s"
+#: builtin/fetch.c:110 builtin/pull.c:188
+msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 
-#: builtin/index-pack.c:1542
-#, c-format
-msgid "Cannot open existing pack file '%s'"
+#: builtin/fetch.c:111 builtin/pull.c:191
+msgid "on-demand"
 msgstr ""
 
-#: builtin/index-pack.c:1544
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
+#: builtin/fetch.c:112 builtin/pull.c:192
+msgid "control recursive fetching of submodules"
 msgstr ""
 
-#: builtin/index-pack.c:1591
-#, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/fetch.c:116 builtin/pull.c:200
+msgid "keep downloaded pack"
+msgstr ""
 
-#: builtin/index-pack.c:1598
-#, c-format
-msgid "chain length = %d: %lu object"
-msgid_plural "chain length = %d: %lu objects"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/fetch.c:118
+msgid "allow updating of HEAD ref"
+msgstr ""
 
-#: builtin/index-pack.c:1611
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
+msgid "deepen history of shallow clone"
 msgstr ""
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
-#, c-format
-msgid "bad %s"
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
 msgstr ""
 
-#: builtin/index-pack.c:1730
-msgid "--fix-thin cannot be used without --stdin"
+#: builtin/fetch.c:129 builtin/pull.c:206
+msgid "convert to a complete repository"
 msgstr ""
 
-#: builtin/index-pack.c:1738
-msgid "--verify with no packfile name given"
+#: builtin/fetch.c:131 builtin/log.c:1440
+msgid "dir"
 msgstr ""
 
-#: builtin/init-db.c:55
-#, c-format
-msgid "cannot stat '%s'"
+#: builtin/fetch.c:132
+msgid "prepend this to submodule path output"
 msgstr ""
 
-#: builtin/init-db.c:61
-#, c-format
-msgid "cannot stat template '%s'"
+#: builtin/fetch.c:135
+msgid "default mode for recursion"
 msgstr ""
 
-#: builtin/init-db.c:66
-#, c-format
-msgid "cannot opendir '%s'"
+#: builtin/fetch.c:137 builtin/pull.c:209
+msgid "accept refs that update .git/shallow"
 msgstr ""
 
-#: builtin/init-db.c:77
-#, c-format
-msgid "cannot readlink '%s'"
+#: builtin/fetch.c:138 builtin/pull.c:211
+msgid "refmap"
 msgstr ""
 
-#: builtin/init-db.c:79
-#, c-format
-msgid "cannot symlink '%s' '%s'"
+#: builtin/fetch.c:139 builtin/pull.c:212
+msgid "specify fetch refmap"
 msgstr ""
 
-#: builtin/init-db.c:85
-#, c-format
-msgid "cannot copy '%s' to '%s'"
+#: builtin/fetch.c:395
+msgid "Couldn't find remote ref HEAD"
 msgstr ""
 
-#: builtin/init-db.c:89
+#: builtin/fetch.c:513
 #, c-format
-msgid "ignoring template %s"
+msgid "configuration fetch.output contains invalid value %s"
 msgstr ""
 
-#: builtin/init-db.c:120
+#: builtin/fetch.c:606
 #, c-format
-msgid "templates not found %s"
+msgid "object %s not found"
 msgstr ""
 
-#: builtin/init-db.c:135
-#, c-format
-msgid "not copying templates from '%s': %s"
+#: builtin/fetch.c:610
+msgid "[up to date]"
 msgstr ""
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
+#: builtin/fetch.c:623 builtin/fetch.c:703
+msgid "[rejected]"
 msgstr ""
 
-#: builtin/init-db.c:344
-#, c-format
-msgid "unable to handle file type %d"
+#: builtin/fetch.c:624
+msgid "can't fetch in current branch"
 msgstr ""
 
-#: builtin/init-db.c:347
-#, c-format
-msgid "unable to move %s to %s"
+#: builtin/fetch.c:633
+msgid "[tag update]"
 msgstr ""
 
-#: builtin/init-db.c:402
-#, c-format
-msgid "Reinitialized existing shared Git repository in %s%s\n"
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
+msgid "unable to update local ref"
 msgstr ""
 
-#: builtin/init-db.c:403
-#, c-format
-msgid "Reinitialized existing Git repository in %s%s\n"
+#: builtin/fetch.c:653
+msgid "[new tag]"
 msgstr ""
 
-#: builtin/init-db.c:407
-#, c-format
-msgid "Initialized empty shared Git repository in %s%s\n"
+#: builtin/fetch.c:656
+msgid "[new branch]"
 msgstr ""
 
-#: builtin/init-db.c:408
-#, c-format
-msgid "Initialized empty Git repository in %s%s\n"
+#: builtin/fetch.c:659
+msgid "[new ref]"
 msgstr ""
 
-#: builtin/init-db.c:455
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
+#: builtin/fetch.c:698
+msgid "forced update"
 msgstr ""
 
-#: builtin/init-db.c:478
-msgid "permissions"
+#: builtin/fetch.c:703
+msgid "non-fast-forward"
 msgstr ""
 
-#: builtin/init-db.c:479
-msgid "specify that the git repository is to be shared amongst several users"
+#: builtin/fetch.c:748
+#, c-format
+msgid "%s did not send all necessary objects\n"
 msgstr ""
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/fetch.c:768
 #, c-format
-msgid "cannot mkdir %s"
+msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 
-#: builtin/init-db.c:522
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
-msgid "cannot chdir to %s"
+msgid "From %.*s\n"
 msgstr ""
 
-#: builtin/init-db.c:543
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
+"some local refs could not be updated; try running\n"
+" 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
 
-#: builtin/init-db.c:571
+#: builtin/fetch.c:921
 #, c-format
-msgid "Cannot access work tree '%s'"
+msgid "   (%s will become dangling)"
 msgstr ""
 
-#: builtin/interpret-trailers.c:15
-msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
+#: builtin/fetch.c:922
+#, c-format
+msgid "   (%s has become dangling)"
 msgstr ""
 
-#: builtin/interpret-trailers.c:26
-msgid "edit files in place"
+#: builtin/fetch.c:954
+msgid "[deleted]"
 msgstr ""
 
-#: builtin/interpret-trailers.c:27
-msgid "trim empty trailers"
+#: builtin/fetch.c:955 builtin/remote.c:1022
+msgid "(none)"
 msgstr ""
 
-#: builtin/interpret-trailers.c:28
-msgid "trailer"
+#: builtin/fetch.c:978
+#, c-format
+msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 
-#: builtin/interpret-trailers.c:29
-msgid "trailer(s) to add"
+#: builtin/fetch.c:997
+#, c-format
+msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr ""
 
-#: builtin/interpret-trailers.c:42
-msgid "no input file given for in-place editing"
+#: builtin/fetch.c:1000
+#, c-format
+msgid "Option \"%s\" is ignored for %s\n"
 msgstr ""
 
-#: builtin/log.c:44
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
+#: builtin/fetch.c:1076
+#, c-format
+msgid "Don't know how to fetch from %s"
 msgstr ""
 
-#: builtin/log.c:45
-msgid "git show [<options>] <object>..."
+#: builtin/fetch.c:1236
+#, c-format
+msgid "Fetching %s\n"
 msgstr ""
 
-#: builtin/log.c:84
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
-msgid "invalid --decorate option: %s"
+msgid "Could not fetch %s"
 msgstr ""
 
-#: builtin/log.c:139
-msgid "suppress diff output"
+#: builtin/fetch.c:1256
+msgid ""
+"No remote repository specified.  Please, specify either a URL or a\n"
+"remote name from which new revisions should be fetched."
 msgstr ""
 
-#: builtin/log.c:140
-msgid "show source"
+#: builtin/fetch.c:1279
+msgid "You need to specify a tag name."
 msgstr ""
 
-#: builtin/log.c:141
-msgid "Use mail map file"
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
 msgstr ""
 
-#: builtin/log.c:142
-msgid "decorate options"
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
 msgstr ""
 
-#: builtin/log.c:145
-msgid "Process line range n,m in file, counting from 1"
+#: builtin/fetch.c:1328
+msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 
-#: builtin/log.c:241
-#, c-format
-msgid "Final output: %d %s\n"
+#: builtin/fetch.c:1330
+msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 
-#: builtin/log.c:486
-#, c-format
-msgid "git show %s: bad file"
+#: builtin/fetch.c:1352
+msgid "fetch --all does not take a repository argument"
 msgstr ""
 
-#: builtin/log.c:500 builtin/log.c:594
-#, c-format
-msgid "Could not read object %s"
+#: builtin/fetch.c:1354
+msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 
-#: builtin/log.c:618
+#: builtin/fetch.c:1365
 #, c-format
-msgid "Unknown type: %d"
+msgid "No such remote or remote group: %s"
 msgstr ""
 
-#: builtin/log.c:739
-msgid "format.headers without value"
+#: builtin/fetch.c:1373
+msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 
-#: builtin/log.c:839
-msgid "name of output directory is too long"
+#: builtin/fmt-merge-msg.c:14
+msgid ""
+"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr ""
 
-#: builtin/log.c:854
-#, c-format
-msgid "Cannot open patch file %s"
+#: builtin/fmt-merge-msg.c:663
+msgid "populate log with at most <n> entries from shortlog"
 msgstr ""
 
-#: builtin/log.c:868
-msgid "Need exactly one range."
+#: builtin/fmt-merge-msg.c:666
+msgid "alias for --log (deprecated)"
 msgstr ""
 
-#: builtin/log.c:878
-msgid "Not a range."
+#: builtin/fmt-merge-msg.c:669
+msgid "text"
 msgstr ""
 
-#: builtin/log.c:984
-msgid "Cover letter needs email format"
+#: builtin/fmt-merge-msg.c:670
+msgid "use <text> as start of message"
 msgstr ""
 
-#: builtin/log.c:1064
-#, c-format
-msgid "insane in-reply-to: %s"
+#: builtin/fmt-merge-msg.c:671
+msgid "file to read from"
 msgstr ""
 
-#: builtin/log.c:1092
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
+#: builtin/for-each-ref.c:9
+msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr ""
 
-#: builtin/log.c:1137
-msgid "Two output directories?"
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
 msgstr ""
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
-#, c-format
-msgid "Unknown commit %s"
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
 msgstr ""
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
 msgstr ""
 
-#: builtin/log.c:1259
-msgid "Could not find exact merge base."
+#: builtin/for-each-ref.c:27
+msgid "quote placeholders suitably for shells"
 msgstr ""
 
-#: builtin/log.c:1263
-msgid ""
-"Failed to get upstream, if you want to record base commit automatically,\n"
-"please use git branch --set-upstream-to to track a remote branch.\n"
-"Or you could specify base commit by --base=<base-commit-id> manually."
+#: builtin/for-each-ref.c:29
+msgid "quote placeholders suitably for perl"
 msgstr ""
 
-#: builtin/log.c:1283
-msgid "Failed to find exact merge base"
+#: builtin/for-each-ref.c:31
+msgid "quote placeholders suitably for python"
 msgstr ""
 
-#: builtin/log.c:1294
-msgid "base commit should be the ancestor of revision list"
+#: builtin/for-each-ref.c:33
+msgid "quote placeholders suitably for Tcl"
 msgstr ""
 
-#: builtin/log.c:1298
-msgid "base commit shouldn't be in revision list"
+#: builtin/for-each-ref.c:36
+msgid "show only <n> matched refs"
 msgstr ""
 
-#: builtin/log.c:1347
-msgid "cannot get patch id"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
 msgstr ""
 
-#: builtin/log.c:1404
-msgid "use [PATCH n/m] even with a single patch"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
 msgstr ""
 
-#: builtin/log.c:1407
-msgid "use [PATCH] even with multiple patches"
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
 msgstr ""
 
-#: builtin/log.c:1411
-msgid "print patches to standard out"
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
 msgstr ""
 
-#: builtin/log.c:1413
-msgid "generate a cover letter"
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
 msgstr ""
 
-#: builtin/log.c:1415
-msgid "use simple number sequence for output file names"
+#: builtin/fsck.c:554
+msgid "Checking object directories"
 msgstr ""
 
-#: builtin/log.c:1416
-msgid "sfx"
+#: builtin/fsck.c:646
+msgid "git fsck [<options>] [<object>...]"
 msgstr ""
 
-#: builtin/log.c:1417
-msgid "use <sfx> instead of '.patch'"
+#: builtin/fsck.c:652
+msgid "show unreachable objects"
 msgstr ""
 
-#: builtin/log.c:1419
-msgid "start numbering patches at <n> instead of 1"
+#: builtin/fsck.c:653
+msgid "show dangling objects"
 msgstr ""
 
-#: builtin/log.c:1421
-msgid "mark the series as Nth re-roll"
+#: builtin/fsck.c:654
+msgid "report tags"
 msgstr ""
 
-#: builtin/log.c:1423
-msgid "Use [<prefix>] instead of [PATCH]"
+#: builtin/fsck.c:655
+msgid "report root nodes"
 msgstr ""
 
-#: builtin/log.c:1426
-msgid "store resulting files in <dir>"
+#: builtin/fsck.c:656
+msgid "make index objects head nodes"
 msgstr ""
 
-#: builtin/log.c:1429
-msgid "don't strip/add [PATCH]"
+#: builtin/fsck.c:657
+msgid "make reflogs head nodes (default)"
 msgstr ""
 
-#: builtin/log.c:1432
-msgid "don't output binary diffs"
+#: builtin/fsck.c:658
+msgid "also consider packs and alternate objects"
 msgstr ""
 
-#: builtin/log.c:1434
-msgid "output all-zero hash in From header"
+#: builtin/fsck.c:659
+msgid "check only connectivity"
 msgstr ""
 
-#: builtin/log.c:1436
-msgid "don't include a patch matching a commit upstream"
+#: builtin/fsck.c:660
+msgid "enable more strict checking"
 msgstr ""
 
-#: builtin/log.c:1438
-msgid "show patch format instead of default (patch + stat)"
+#: builtin/fsck.c:662
+msgid "write dangling objects in .git/lost-found"
 msgstr ""
 
-#: builtin/log.c:1440
-msgid "Messaging"
+#: builtin/fsck.c:663 builtin/prune.c:107
+msgid "show progress"
 msgstr ""
 
-#: builtin/log.c:1441
-msgid "header"
+#: builtin/fsck.c:664
+msgid "show verbose names for reachable objects"
 msgstr ""
 
-#: builtin/log.c:1442
-msgid "add email header"
+#: builtin/fsck.c:725
+msgid "Checking objects"
 msgstr ""
 
-#: builtin/log.c:1443 builtin/log.c:1445
-msgid "email"
+#: builtin/gc.c:25
+msgid "git gc [<options>]"
 msgstr ""
 
-#: builtin/log.c:1443
-msgid "add To: header"
-msgstr ""
-
-#: builtin/log.c:1445
-msgid "add Cc: header"
-msgstr ""
-
-#: builtin/log.c:1447
-msgid "ident"
-msgstr ""
-
-#: builtin/log.c:1448
-msgid "set From address to <ident> (or committer ident if absent)"
-msgstr ""
-
-#: builtin/log.c:1450
-msgid "message-id"
-msgstr ""
-
-#: builtin/log.c:1451
-msgid "make first mail a reply to <message-id>"
-msgstr ""
-
-#: builtin/log.c:1452 builtin/log.c:1455
-msgid "boundary"
+#: builtin/gc.c:78
+#, c-format
+msgid "Failed to fstat %s: %s"
 msgstr ""
 
-#: builtin/log.c:1453
-msgid "attach the patch"
+#: builtin/gc.c:310
+#, c-format
+msgid "Can't stat %s"
 msgstr ""
 
-#: builtin/log.c:1456
-msgid "inline the patch"
+#: builtin/gc.c:319
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
 msgstr ""
 
-#: builtin/log.c:1460
-msgid "enable message threading, styles: shallow, deep"
+#: builtin/gc.c:358
+msgid "prune unreferenced objects"
 msgstr ""
 
-#: builtin/log.c:1462
-msgid "signature"
+#: builtin/gc.c:360
+msgid "be more thorough (increased runtime)"
 msgstr ""
 
-#: builtin/log.c:1463
-msgid "add a signature"
+#: builtin/gc.c:361
+msgid "enable auto-gc mode"
 msgstr ""
 
-#: builtin/log.c:1464
-msgid "base-commit"
+#: builtin/gc.c:362
+msgid "force running gc even if there may be another gc running"
 msgstr ""
 
-#: builtin/log.c:1465
-msgid "add prerequisite tree info to the patch series"
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
 msgstr ""
 
-#: builtin/log.c:1467
-msgid "add a signature from a file"
+#: builtin/gc.c:407
+#, c-format
+msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 
-#: builtin/log.c:1468
-msgid "don't print the patch filenames"
+#: builtin/gc.c:409
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
 msgstr ""
 
-#: builtin/log.c:1558
-msgid "-n and -k are mutually exclusive."
+#: builtin/gc.c:410
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
+#: builtin/gc.c:431
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 
-#: builtin/log.c:1568
-msgid "--name-only does not make sense"
+#: builtin/gc.c:475
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 
-#: builtin/log.c:1570
-msgid "--name-status does not make sense"
+#: builtin/grep.c:25
+msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr ""
 
-#: builtin/log.c:1572
-msgid "--check does not make sense"
+#: builtin/grep.c:232
+#, c-format
+msgid "grep: failed to create thread: %s"
 msgstr ""
 
-#: builtin/log.c:1602
-msgid "standard output, or directory, which one?"
+#: builtin/grep.c:290
+#, c-format
+msgid "invalid number of threads specified (%d) for %s"
 msgstr ""
 
-#: builtin/log.c:1604
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
-msgid "Could not create directory '%s'"
+msgid "unable to read tree (%s)"
 msgstr ""
 
-#: builtin/log.c:1698
+#: builtin/grep.c:829
 #, c-format
-msgid "unable to read signature file '%s'"
+msgid "unable to grep from object of type %s"
 msgstr ""
 
-#: builtin/log.c:1769
-msgid "Failed to create output files"
+#: builtin/grep.c:893
+#, c-format
+msgid "switch `%c' expects a numerical value"
 msgstr ""
 
-#: builtin/log.c:1818
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+#: builtin/grep.c:980
+msgid "search in index instead of in the work tree"
 msgstr ""
 
-#: builtin/log.c:1872
-#, c-format
-msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+#: builtin/grep.c:982
+msgid "find in contents not managed by git"
 msgstr ""
 
-#: builtin/ls-files.c:379
-msgid "git ls-files [<options>] [<file>...]"
+#: builtin/grep.c:984
+msgid "search in both tracked and untracked files"
 msgstr ""
 
-#: builtin/ls-files.c:428
-msgid "identify the file status with tags"
+#: builtin/grep.c:986
+msgid "ignore files specified via '.gitignore'"
 msgstr ""
 
-#: builtin/ls-files.c:430
-msgid "use lowercase letters for 'assume unchanged' files"
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
 msgstr ""
 
-#: builtin/ls-files.c:432
-msgid "show cached files in the output (default)"
+#: builtin/grep.c:990
+msgid "basename"
 msgstr ""
 
-#: builtin/ls-files.c:434
-msgid "show deleted files in the output"
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
 msgstr ""
 
-#: builtin/ls-files.c:436
-msgid "show modified files in the output"
+#: builtin/grep.c:994
+msgid "show non-matching lines"
 msgstr ""
 
-#: builtin/ls-files.c:438
-msgid "show other files in the output"
+#: builtin/grep.c:996
+msgid "case insensitive matching"
 msgstr ""
 
-#: builtin/ls-files.c:440
-msgid "show ignored files in the output"
+#: builtin/grep.c:998
+msgid "match patterns only at word boundaries"
 msgstr ""
 
-#: builtin/ls-files.c:443
-msgid "show staged contents' object name in the output"
+#: builtin/grep.c:1000
+msgid "process binary files as text"
 msgstr ""
 
-#: builtin/ls-files.c:445
-msgid "show files on the filesystem that need to be removed"
+#: builtin/grep.c:1002
+msgid "don't match patterns in binary files"
 msgstr ""
 
-#: builtin/ls-files.c:447
-msgid "show 'other' directories' names only"
+#: builtin/grep.c:1005
+msgid "process binary files with textconv filters"
 msgstr ""
 
-#: builtin/ls-files.c:449
-msgid "show line endings of files"
+#: builtin/grep.c:1007
+msgid "descend at most <depth> levels"
 msgstr ""
 
-#: builtin/ls-files.c:451
-msgid "don't show empty directories"
+#: builtin/grep.c:1011
+msgid "use extended POSIX regular expressions"
 msgstr ""
 
-#: builtin/ls-files.c:454
-msgid "show unmerged files in the output"
+#: builtin/grep.c:1014
+msgid "use basic POSIX regular expressions (default)"
 msgstr ""
 
-#: builtin/ls-files.c:456
-msgid "show resolve-undo information"
+#: builtin/grep.c:1017
+msgid "interpret patterns as fixed strings"
 msgstr ""
 
-#: builtin/ls-files.c:458
-msgid "skip files matching pattern"
+#: builtin/grep.c:1020
+msgid "use Perl-compatible regular expressions"
 msgstr ""
 
-#: builtin/ls-files.c:461
-msgid "exclude patterns are read from <file>"
+#: builtin/grep.c:1023
+msgid "show line numbers"
 msgstr ""
 
-#: builtin/ls-files.c:464
-msgid "read additional per-directory exclude patterns in <file>"
+#: builtin/grep.c:1024
+msgid "don't show filenames"
 msgstr ""
 
-#: builtin/ls-files.c:466
-msgid "add the standard git exclusions"
+#: builtin/grep.c:1025
+msgid "show filenames"
 msgstr ""
 
-#: builtin/ls-files.c:469
-msgid "make the output relative to the project top directory"
+#: builtin/grep.c:1027
+msgid "show filenames relative to top directory"
 msgstr ""
 
-#: builtin/ls-files.c:472
-msgid "if any <file> is not in the index, treat this as an error"
+#: builtin/grep.c:1029
+msgid "show only filenames instead of matching lines"
 msgstr ""
 
-#: builtin/ls-files.c:473
-msgid "tree-ish"
+#: builtin/grep.c:1031
+msgid "synonym for --files-with-matches"
 msgstr ""
 
-#: builtin/ls-files.c:474
-msgid "pretend that paths removed since <tree-ish> are still present"
+#: builtin/grep.c:1034
+msgid "show only the names of files without match"
 msgstr ""
 
-#: builtin/ls-files.c:476
-msgid "show debugging data"
+#: builtin/grep.c:1036
+msgid "print NUL after filenames"
 msgstr ""
 
-#: builtin/ls-remote.c:7
-msgid ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"                     [-q | --quiet] [--exit-code] [--get-url]\n"
-"                     [--symref] [<repository> [<refs>...]]"
+#: builtin/grep.c:1038
+msgid "show the number of matches instead of matching lines"
 msgstr ""
 
-#: builtin/ls-remote.c:50
-msgid "do not print remote URL"
+#: builtin/grep.c:1039
+msgid "highlight matches"
 msgstr ""
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
-msgid "exec"
+#: builtin/grep.c:1041
+msgid "print empty line between matches from different files"
 msgstr ""
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
-msgid "path of git-upload-pack on the remote host"
+#: builtin/grep.c:1043
+msgid "show filename only once above matches from same file"
 msgstr ""
 
-#: builtin/ls-remote.c:56
-msgid "limit to tags"
+#: builtin/grep.c:1046
+msgid "show <n> context lines before and after matches"
 msgstr ""
 
-#: builtin/ls-remote.c:57
-msgid "limit to heads"
+#: builtin/grep.c:1049
+msgid "show <n> context lines before matches"
 msgstr ""
 
-#: builtin/ls-remote.c:58
-msgid "do not show peeled tags"
+#: builtin/grep.c:1051
+msgid "show <n> context lines after matches"
 msgstr ""
 
-#: builtin/ls-remote.c:60
-msgid "take url.<base>.insteadOf into account"
+#: builtin/grep.c:1053
+msgid "use <n> worker threads"
 msgstr ""
 
-#: builtin/ls-remote.c:62
-msgid "exit with exit code 2 if no matching refs are found"
+#: builtin/grep.c:1054
+msgid "shortcut for -C NUM"
 msgstr ""
 
-#: builtin/ls-remote.c:64
-msgid "show underlying ref in addition to the object pointed by it"
+#: builtin/grep.c:1057
+msgid "show a line with the function name before matches"
 msgstr ""
 
-#: builtin/ls-tree.c:28
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+#: builtin/grep.c:1059
+msgid "show the surrounding function"
 msgstr ""
 
-#: builtin/ls-tree.c:128
-msgid "only show trees"
+#: builtin/grep.c:1062
+msgid "read patterns from file"
 msgstr ""
 
-#: builtin/ls-tree.c:130
-msgid "recurse into subtrees"
+#: builtin/grep.c:1064
+msgid "match <pattern>"
 msgstr ""
 
-#: builtin/ls-tree.c:132
-msgid "show trees when recursing"
+#: builtin/grep.c:1066
+msgid "combine patterns specified with -e"
 msgstr ""
 
-#: builtin/ls-tree.c:135
-msgid "terminate entries with NUL byte"
+#: builtin/grep.c:1078
+msgid "indicate hit with exit status without output"
 msgstr ""
 
-#: builtin/ls-tree.c:136
-msgid "include object size"
+#: builtin/grep.c:1080
+msgid "show only matches from files that match all patterns"
 msgstr ""
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
-msgid "list only filenames"
+#: builtin/grep.c:1082
+msgid "show parse tree for grep expression"
 msgstr ""
 
-#: builtin/ls-tree.c:143
-msgid "use full path names"
+#: builtin/grep.c:1086
+msgid "pager"
 msgstr ""
 
-#: builtin/ls-tree.c:145
-msgid "list entire tree; not just current directory (implies --full-name)"
+#: builtin/grep.c:1086
+msgid "show matching files in the pager"
 msgstr ""
 
-#: builtin/merge.c:46
-msgid "git merge [<options>] [<commit>...]"
+#: builtin/grep.c:1089
+msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 
-#: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
+#: builtin/grep.c:1153
+msgid "no pattern given."
 msgstr ""
 
-#: builtin/merge.c:48
-msgid "git merge --abort"
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
 msgstr ""
 
-#: builtin/merge.c:102
-msgid "switch `m' requires a value"
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
 msgstr ""
 
-#: builtin/merge.c:139
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
-msgid "Could not find merge strategy '%s'.\n"
+msgid "invalid number of threads specified (%d)"
 msgstr ""
 
-#: builtin/merge.c:140
-#, c-format
-msgid "Available strategies are:"
+#: builtin/grep.c:1251
+msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 
-#: builtin/merge.c:145
-#, c-format
-msgid "Available custom strategies are:"
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
 msgstr ""
 
-#: builtin/merge.c:195 builtin/pull.c:126
-msgid "do not show a diffstat at the end of the merge"
+#: builtin/grep.c:1280
+msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 
-#: builtin/merge.c:198 builtin/pull.c:129
-msgid "show a diffstat at the end of the merge"
+#: builtin/grep.c:1286
+msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 
-#: builtin/merge.c:199 builtin/pull.c:132
-msgid "(synonym to --stat)"
+#: builtin/grep.c:1294
+msgid "both --cached and trees are given."
 msgstr ""
 
-#: builtin/merge.c:201 builtin/pull.c:135
-msgid "add (at most <n>) entries from shortlog to merge commit message"
+#: builtin/hash-object.c:81
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
+"[--] <file>..."
 msgstr ""
 
-#: builtin/merge.c:204 builtin/pull.c:138
-msgid "create a single commit instead of doing a merge"
+#: builtin/hash-object.c:82
+msgid "git hash-object  --stdin-paths"
 msgstr ""
 
-#: builtin/merge.c:206 builtin/pull.c:141
-msgid "perform a commit if the merge succeeds (default)"
+#: builtin/hash-object.c:94
+msgid "type"
 msgstr ""
 
-#: builtin/merge.c:208 builtin/pull.c:144
-msgid "edit message before committing"
+#: builtin/hash-object.c:94
+msgid "object type"
 msgstr ""
 
-#: builtin/merge.c:209
-msgid "allow fast-forward (default)"
+#: builtin/hash-object.c:95
+msgid "write the object into the object database"
 msgstr ""
 
-#: builtin/merge.c:211 builtin/pull.c:150
-msgid "abort if fast-forward is not possible"
+#: builtin/hash-object.c:97
+msgid "read the object from stdin"
 msgstr ""
 
-#: builtin/merge.c:215 builtin/pull.c:153
-msgid "verify that the named commit has a valid GPG signature"
+#: builtin/hash-object.c:99
+msgid "store file as is without filters"
 msgstr ""
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
-msgid "strategy"
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 
-#: builtin/merge.c:217 builtin/pull.c:158
-msgid "merge strategy to use"
+#: builtin/hash-object.c:101
+msgid "process file as it were from this path"
 msgstr ""
 
-#: builtin/merge.c:218 builtin/pull.c:161
-msgid "option=value"
+#: builtin/help.c:42
+msgid "print all available commands"
 msgstr ""
 
-#: builtin/merge.c:219 builtin/pull.c:162
-msgid "option for selected merge strategy"
+#: builtin/help.c:43
+msgid "exclude guides"
 msgstr ""
 
-#: builtin/merge.c:221
-msgid "merge commit message (for a non-fast-forward merge)"
+#: builtin/help.c:44
+msgid "print list of useful guides"
 msgstr ""
 
-#: builtin/merge.c:225
-msgid "abort the current in-progress merge"
+#: builtin/help.c:45
+msgid "show man page"
 msgstr ""
 
-#: builtin/merge.c:227 builtin/pull.c:169
-msgid "allow merging unrelated histories"
+#: builtin/help.c:46
+msgid "show manual in web browser"
 msgstr ""
 
-#: builtin/merge.c:255
-msgid "could not run stash."
+#: builtin/help.c:48
+msgid "show info page"
 msgstr ""
 
-#: builtin/merge.c:260
-msgid "stash failed"
+#: builtin/help.c:54
+msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr ""
 
-#: builtin/merge.c:265
+#: builtin/help.c:66
 #, c-format
-msgid "not a valid object: %s"
+msgid "unrecognized help format '%s'"
 msgstr ""
 
-#: builtin/merge.c:284 builtin/merge.c:301
-msgid "read-tree failed"
+#: builtin/help.c:93
+msgid "Failed to start emacsclient."
 msgstr ""
 
-#: builtin/merge.c:331
-msgid " (nothing to squash)"
+#: builtin/help.c:106
+msgid "Failed to parse emacsclient version."
 msgstr ""
 
-#: builtin/merge.c:342
+#: builtin/help.c:114
 #, c-format
-msgid "Squash commit -- not updating HEAD\n"
+msgid "emacsclient version '%d' too old (< 22)."
 msgstr ""
 
-#: builtin/merge.c:392
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
-msgid "No merge message -- not updating HEAD\n"
+msgid "failed to exec '%s'"
 msgstr ""
 
-#: builtin/merge.c:443
+#: builtin/help.c:207
 #, c-format
-msgid "'%s' does not point to a commit"
+msgid ""
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
 
-#: builtin/merge.c:533
+#: builtin/help.c:219
 #, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr ""
-
-#: builtin/merge.c:652
-msgid "Not handling anything other than two heads merge."
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
 msgstr ""
 
-#: builtin/merge.c:666
+#: builtin/help.c:336
 #, c-format
-msgid "Unknown option for merge-recursive: -X%s"
+msgid "'%s': unknown man viewer."
 msgstr ""
 
-#: builtin/merge.c:681
-#, c-format
-msgid "unable to write %s"
+#: builtin/help.c:353
+msgid "no man viewer handled the request"
 msgstr ""
 
-#: builtin/merge.c:733
-#, c-format
-msgid "Could not read from '%s'"
+#: builtin/help.c:361
+msgid "no info viewer handled the request"
 msgstr ""
 
-#: builtin/merge.c:742
-#, c-format
-msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+#: builtin/help.c:403
+msgid "Defining attributes per path"
 msgstr ""
 
-#: builtin/merge.c:748
-#, c-format
-msgid ""
-"Please enter a commit message to explain why this merge is necessary,\n"
-"especially if it merges an updated upstream into a topic branch.\n"
-"\n"
-"Lines starting with '%c' will be ignored, and an empty message aborts\n"
-"the commit.\n"
+#: builtin/help.c:404
+msgid "Everyday Git With 20 Commands Or So"
 msgstr ""
 
-#: builtin/merge.c:772
-msgid "Empty commit message."
+#: builtin/help.c:405
+msgid "A Git glossary"
 msgstr ""
 
-#: builtin/merge.c:792
-#, c-format
-msgid "Wonderful.\n"
+#: builtin/help.c:406
+msgid "Specifies intentionally untracked files to ignore"
 msgstr ""
 
-#: builtin/merge.c:847
-#, c-format
-msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
+#: builtin/help.c:407
+msgid "Defining submodule properties"
 msgstr ""
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
+#: builtin/help.c:408
+msgid "Specifying revisions and ranges for Git"
 msgstr ""
 
-#: builtin/merge.c:904
-msgid "No current branch."
+#: builtin/help.c:409
+msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr ""
 
-#: builtin/merge.c:906
-msgid "No remote for the current branch."
+#: builtin/help.c:410
+msgid "An overview of recommended workflows with Git"
 msgstr ""
 
-#: builtin/merge.c:908
-msgid "No default upstream defined for the current branch."
+#: builtin/help.c:422
+msgid "The common Git guides are:\n"
 msgstr ""
 
-#: builtin/merge.c:913
+#: builtin/help.c:440
 #, c-format
-msgid "No remote-tracking branch for %s from %s"
+msgid "`git %s' is aliased to `%s'"
 msgstr ""
 
-#: builtin/merge.c:960
+#: builtin/help.c:462 builtin/help.c:479
 #, c-format
-msgid "Bad value '%s' in environment '%s'"
+msgid "usage: %s%s"
 msgstr ""
 
-#: builtin/merge.c:1034
+#: builtin/index-pack.c:154
 #, c-format
-msgid "could not close '%s'"
+msgid "unable to open %s"
 msgstr ""
 
-#: builtin/merge.c:1061
+#: builtin/index-pack.c:204
 #, c-format
-msgid "not something we can merge in %s: %s"
-msgstr ""
-
-#: builtin/merge.c:1095
-msgid "not something we can merge"
+msgid "object type mismatch at %s"
 msgstr ""
 
-#: builtin/merge.c:1162
-msgid "There is no merge to abort (MERGE_HEAD missing)."
+#: builtin/index-pack.c:224
+#, c-format
+msgid "did not receive expected object %s"
 msgstr ""
 
-#: builtin/merge.c:1178
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
+#: builtin/index-pack.c:227
+#, c-format
+msgid "object %s: expected type %s, found %s"
 msgstr ""
 
-#: builtin/merge.c:1185
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
+#: builtin/index-pack.c:269
+#, c-format
+msgid "cannot fill %d byte"
+msgid_plural "cannot fill %d bytes"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/merge.c:1188
-msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
+#: builtin/index-pack.c:279
+msgid "early EOF"
 msgstr ""
 
-#: builtin/merge.c:1197
-msgid "You cannot combine --squash with --no-ff."
+#: builtin/index-pack.c:280
+msgid "read error on input"
 msgstr ""
 
-#: builtin/merge.c:1205
-msgid "No commit specified and merge.defaultToUpstream not set."
+#: builtin/index-pack.c:292
+msgid "used more bytes than were available"
 msgstr ""
 
-#: builtin/merge.c:1222
-msgid "Squash commit into empty head not supported yet"
+#: builtin/index-pack.c:299
+msgid "pack too large for current definition of off_t"
 msgstr ""
 
-#: builtin/merge.c:1224
-msgid "Non-fast-forward commit does not make sense into an empty head"
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
 msgstr ""
 
-#: builtin/merge.c:1229
+#: builtin/index-pack.c:317
 #, c-format
-msgid "%s - not something we can merge"
+msgid "unable to create '%s'"
 msgstr ""
 
-#: builtin/merge.c:1231
-msgid "Can merge only exactly one commit into empty head"
+#: builtin/index-pack.c:323
+#, c-format
+msgid "cannot open packfile '%s'"
 msgstr ""
 
-#: builtin/merge.c:1287
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+#: builtin/index-pack.c:337
+msgid "pack signature mismatch"
 msgstr ""
 
-#: builtin/merge.c:1290
+#: builtin/index-pack.c:339
 #, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgid "pack version %<PRIu32> unsupported"
 msgstr ""
 
-#: builtin/merge.c:1293
+#: builtin/index-pack.c:357
 #, c-format
-msgid "Commit %s does not have a GPG signature."
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr ""
 
-#: builtin/merge.c:1296
+#: builtin/index-pack.c:479
 #, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
+msgid "inflate returned %d"
 msgstr ""
 
-#: builtin/merge.c:1358
-msgid "refusing to merge unrelated histories"
+#: builtin/index-pack.c:528
+msgid "offset value overflow for delta base object"
 msgstr ""
 
-#: builtin/merge.c:1367
-msgid "Already up-to-date."
+#: builtin/index-pack.c:536
+msgid "delta base offset is out of bound"
 msgstr ""
 
-#: builtin/merge.c:1382
+#: builtin/index-pack.c:544
 #, c-format
-msgid "Updating %s..%s\n"
+msgid "unknown object type %d"
 msgstr ""
 
-#: builtin/merge.c:1419
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
+#: builtin/index-pack.c:575
+msgid "cannot pread pack file"
 msgstr ""
 
-#: builtin/merge.c:1426
+#: builtin/index-pack.c:577
 #, c-format
-msgid "Nope.\n"
-msgstr ""
-
-#: builtin/merge.c:1451
-msgid "Already up-to-date. Yeeah!"
-msgstr ""
+msgid "premature end of pack file, %<PRIuMAX> byte missing"
+msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/merge.c:1457
-msgid "Not possible to fast-forward, aborting."
+#: builtin/index-pack.c:603
+msgid "serious inflate inconsistency"
 msgstr ""
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
-msgid "Rewinding the tree to pristine...\n"
+msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
 
-#: builtin/merge.c:1484
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
-msgid "Trying merge strategy %s...\n"
+msgid "unable to read %s"
 msgstr ""
 
-#: builtin/merge.c:1550
+#: builtin/index-pack.c:814
 #, c-format
-msgid "No merge strategy handled the merge.\n"
+msgid "cannot read existing object info %s"
 msgstr ""
 
-#: builtin/merge.c:1552
+#: builtin/index-pack.c:822
 #, c-format
-msgid "Merge with strategy %s failed.\n"
+msgid "cannot read existing object %s"
 msgstr ""
 
-#: builtin/merge.c:1561
+#: builtin/index-pack.c:836
 #, c-format
-msgid "Using the %s to prepare resolving by hand.\n"
+msgid "invalid blob object %s"
 msgstr ""
 
-#: builtin/merge.c:1573
+#: builtin/index-pack.c:850
 #, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr ""
-
-#: builtin/merge-base.c:29
-msgid "git merge-base [-a | --all] <commit> <commit>..."
+msgid "invalid %s"
 msgstr ""
 
-#: builtin/merge-base.c:30
-msgid "git merge-base [-a | --all] --octopus <commit>..."
+#: builtin/index-pack.c:853
+msgid "Error in object"
 msgstr ""
 
-#: builtin/merge-base.c:31
-msgid "git merge-base --independent <commit>..."
+#: builtin/index-pack.c:855
+#, c-format
+msgid "Not all child objects of %s are reachable"
 msgstr ""
 
-#: builtin/merge-base.c:32
-msgid "git merge-base --is-ancestor <commit> <commit>"
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
+msgid "failed to apply delta"
 msgstr ""
 
-#: builtin/merge-base.c:33
-msgid "git merge-base --fork-point <ref> [<commit>]"
+#: builtin/index-pack.c:1128
+msgid "Receiving objects"
 msgstr ""
 
-#: builtin/merge-base.c:214
-msgid "output all common ancestors"
+#: builtin/index-pack.c:1128
+msgid "Indexing objects"
 msgstr ""
 
-#: builtin/merge-base.c:216
-msgid "find ancestors for a single n-way merge"
+#: builtin/index-pack.c:1160
+msgid "pack is corrupted (SHA1 mismatch)"
 msgstr ""
 
-#: builtin/merge-base.c:218
-msgid "list revs not reachable from others"
+#: builtin/index-pack.c:1165
+msgid "cannot fstat packfile"
 msgstr ""
 
-#: builtin/merge-base.c:220
-msgid "is the first one ancestor of the other?"
+#: builtin/index-pack.c:1168
+msgid "pack has junk at the end"
 msgstr ""
 
-#: builtin/merge-base.c:222
-msgid "find where <commit> forked from reflog of <ref>"
+#: builtin/index-pack.c:1179
+msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr ""
 
-#: builtin/merge-file.c:8
-msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
+#: builtin/index-pack.c:1202
+msgid "Resolving deltas"
 msgstr ""
 
-#: builtin/merge-file.c:33
-msgid "send results to standard output"
+#: builtin/index-pack.c:1213
+#, c-format
+msgid "unable to create thread: %s"
 msgstr ""
 
-#: builtin/merge-file.c:34
-msgid "use a diff3 based merge"
+#: builtin/index-pack.c:1255
+msgid "confusion beyond insanity"
 msgstr ""
 
-#: builtin/merge-file.c:35
-msgid "for conflicts, use our version"
-msgstr ""
+#: builtin/index-pack.c:1261
+#, c-format
+msgid "completed with %d local object"
+msgid_plural "completed with %d local objects"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/merge-file.c:37
-msgid "for conflicts, use their version"
+#: builtin/index-pack.c:1273
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr ""
 
-#: builtin/merge-file.c:39
-msgid "for conflicts, use a union version"
-msgstr ""
+#: builtin/index-pack.c:1277
+#, c-format
+msgid "pack has %d unresolved delta"
+msgid_plural "pack has %d unresolved deltas"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/merge-file.c:42
-msgid "for conflicts, use this marker size"
+#: builtin/index-pack.c:1301
+#, c-format
+msgid "unable to deflate appended object (%d)"
 msgstr ""
 
-#: builtin/merge-file.c:43
-msgid "do not warn about conflicts"
+#: builtin/index-pack.c:1377
+#, c-format
+msgid "local object %s is corrupt"
 msgstr ""
 
-#: builtin/merge-file.c:45
-msgid "set labels for file1/orig-file/file2"
+#: builtin/index-pack.c:1403
+msgid "error while closing pack file"
 msgstr ""
 
-#: builtin/mktree.c:65
-msgid "git mktree [-z] [--missing] [--batch]"
+#: builtin/index-pack.c:1415
+#, c-format
+msgid "cannot write keep file '%s'"
 msgstr ""
 
-#: builtin/mktree.c:152
-msgid "input is NUL terminated"
+#: builtin/index-pack.c:1423
+#, c-format
+msgid "cannot close written keep file '%s'"
 msgstr ""
 
-#: builtin/mktree.c:153 builtin/write-tree.c:24
-msgid "allow missing objects"
+#: builtin/index-pack.c:1433
+msgid "cannot store pack file"
 msgstr ""
 
-#: builtin/mktree.c:154
-msgid "allow creation of more than one tree"
+#: builtin/index-pack.c:1441
+msgid "cannot store index file"
 msgstr ""
 
-#: builtin/mv.c:15
-msgid "git mv [<options>] <source>... <destination>"
+#: builtin/index-pack.c:1479
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
 msgstr ""
 
-#: builtin/mv.c:70
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
-msgid "Directory %s is in index and no submodule?"
+msgid "no threads support, ignoring %s"
 msgstr ""
 
-#: builtin/mv.c:72 builtin/rm.c:317
-msgid "Please stage your changes to .gitmodules or stash them to proceed"
+#: builtin/index-pack.c:1547
+#, c-format
+msgid "Cannot open existing pack file '%s'"
 msgstr ""
 
-#: builtin/mv.c:90
+#: builtin/index-pack.c:1549
 #, c-format
-msgid "%.*s is in index"
+msgid "Cannot open existing pack idx file for '%s'"
 msgstr ""
 
-#: builtin/mv.c:112
-msgid "force move/rename even if target exists"
-msgstr ""
+#: builtin/index-pack.c:1596
+#, c-format
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/mv.c:113
-msgid "skip move/rename errors"
-msgstr ""
+#: builtin/index-pack.c:1603
+#, c-format
+msgid "chain length = %d: %lu object"
+msgid_plural "chain length = %d: %lu objects"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/mv.c:155
+#: builtin/index-pack.c:1616
 #, c-format
-msgid "destination '%s' is not a directory"
+msgid "packfile name '%s' does not end with '.pack'"
 msgstr ""
 
-#: builtin/mv.c:166
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
-msgid "Checking rename of '%s' to '%s'\n"
+msgid "bad %s"
 msgstr ""
 
-#: builtin/mv.c:170
-msgid "bad source"
+#: builtin/index-pack.c:1737
+msgid "--fix-thin cannot be used without --stdin"
 msgstr ""
 
-#: builtin/mv.c:173
-msgid "can not move directory into itself"
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
 msgstr ""
 
-#: builtin/mv.c:176
-msgid "cannot move directory over file"
+#: builtin/index-pack.c:1747
+msgid "--verify with no packfile name given"
 msgstr ""
 
-#: builtin/mv.c:185
-msgid "source directory is empty"
+#: builtin/init-db.c:54
+#, c-format
+msgid "cannot stat '%s'"
 msgstr ""
 
-#: builtin/mv.c:210
-msgid "not under version control"
+#: builtin/init-db.c:60
+#, c-format
+msgid "cannot stat template '%s'"
 msgstr ""
 
-#: builtin/mv.c:213
-msgid "destination exists"
+#: builtin/init-db.c:65
+#, c-format
+msgid "cannot opendir '%s'"
 msgstr ""
 
-#: builtin/mv.c:221
+#: builtin/init-db.c:76
 #, c-format
-msgid "overwriting '%s'"
+msgid "cannot readlink '%s'"
 msgstr ""
 
-#: builtin/mv.c:224
-msgid "Cannot overwrite"
+#: builtin/init-db.c:78
+#, c-format
+msgid "cannot symlink '%s' '%s'"
 msgstr ""
 
-#: builtin/mv.c:227
-msgid "multiple sources for the same target"
+#: builtin/init-db.c:84
+#, c-format
+msgid "cannot copy '%s' to '%s'"
 msgstr ""
 
-#: builtin/mv.c:229
-msgid "destination directory does not exist"
+#: builtin/init-db.c:88
+#, c-format
+msgid "ignoring template %s"
 msgstr ""
 
-#: builtin/mv.c:236
+#: builtin/init-db.c:119
 #, c-format
-msgid "%s, source=%s, destination=%s"
+msgid "templates not found %s"
 msgstr ""
 
-#: builtin/mv.c:257
+#: builtin/init-db.c:134
 #, c-format
-msgid "Renaming %s to %s\n"
+msgid "not copying templates from '%s': %s"
 msgstr ""
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/init-db.c:327
 #, c-format
-msgid "renaming '%s' failed"
+msgid "unable to handle file type %d"
 msgstr ""
 
-#: builtin/name-rev.c:258
-msgid "git name-rev [<options>] <commit>..."
+#: builtin/init-db.c:330
+#, c-format
+msgid "unable to move %s to %s"
 msgstr ""
 
-#: builtin/name-rev.c:259
-msgid "git name-rev [<options>] --all"
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
 msgstr ""
 
-#: builtin/name-rev.c:260
-msgid "git name-rev [<options>] --stdin"
+#: builtin/init-db.c:403
+#, c-format
+msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/name-rev.c:312
-msgid "print only names (no SHA-1)"
+#: builtin/init-db.c:404
+#, c-format
+msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/name-rev.c:313
-msgid "only use tags to name the commits"
+#: builtin/init-db.c:408
+#, c-format
+msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/name-rev.c:315
-msgid "only use refs matching <pattern>"
+#: builtin/init-db.c:409
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/name-rev.c:317
-msgid "list all commits reachable from all refs"
+#: builtin/init-db.c:457
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [<directory>]"
 msgstr ""
 
-#: builtin/name-rev.c:318
-msgid "read from stdin"
+#: builtin/init-db.c:480
+msgid "permissions"
 msgstr ""
 
-#: builtin/name-rev.c:319
-msgid "allow to print `undefined` names (default)"
+#: builtin/init-db.c:481
+msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 
-#: builtin/name-rev.c:325
-msgid "dereference tags in the input (internal use)"
+#: builtin/init-db.c:515 builtin/init-db.c:520
+#, c-format
+msgid "cannot mkdir %s"
 msgstr ""
 
-#: builtin/notes.c:25
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
+#: builtin/init-db.c:524
+#, c-format
+msgid "cannot chdir to %s"
 msgstr ""
 
-#: builtin/notes.c:26
+#: builtin/init-db.c:545
+#, c-format
 msgid ""
-"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
-"| (-c | -C) <object>] [<object>]"
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
 msgstr ""
 
-#: builtin/notes.c:27
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
+#: builtin/init-db.c:573
+#, c-format
+msgid "Cannot access work tree '%s'"
 msgstr ""
 
-#: builtin/notes.c:28
+#: builtin/interpret-trailers.c:15
 msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
-msgstr ""
-
-#: builtin/notes.c:29
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<token>[(=|:)<value>])...] [<file>...]"
 msgstr ""
 
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] show [<object>]"
+#: builtin/interpret-trailers.c:26
+msgid "edit files in place"
 msgstr ""
 
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+#: builtin/interpret-trailers.c:27
+msgid "trim empty trailers"
 msgstr ""
 
-#: builtin/notes.c:32
-msgid "git notes merge --commit [-v | -q]"
+#: builtin/interpret-trailers.c:28
+msgid "trailer"
 msgstr ""
 
-#: builtin/notes.c:33
-msgid "git notes merge --abort [-v | -q]"
+#: builtin/interpret-trailers.c:29
+msgid "trailer(s) to add"
 msgstr ""
 
-#: builtin/notes.c:34
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
+#: builtin/interpret-trailers.c:42
+msgid "no input file given for in-place editing"
 msgstr ""
 
-#: builtin/notes.c:35
-msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
+#: builtin/log.c:44
+msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr ""
 
-#: builtin/notes.c:36
-msgid "git notes [--ref <notes-ref>] get-ref"
+#: builtin/log.c:45
+msgid "git show [<options>] <object>..."
 msgstr ""
 
-#: builtin/notes.c:41
-msgid "git notes [list [<object>]]"
+#: builtin/log.c:89
+#, c-format
+msgid "invalid --decorate option: %s"
 msgstr ""
 
-#: builtin/notes.c:46
-msgid "git notes add [<options>] [<object>]"
+#: builtin/log.c:144
+msgid "suppress diff output"
 msgstr ""
 
-#: builtin/notes.c:51
-msgid "git notes copy [<options>] <from-object> <to-object>"
+#: builtin/log.c:145
+msgid "show source"
 msgstr ""
 
-#: builtin/notes.c:52
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
+#: builtin/log.c:146
+msgid "Use mail map file"
 msgstr ""
 
-#: builtin/notes.c:57
-msgid "git notes append [<options>] [<object>]"
+#: builtin/log.c:147
+msgid "decorate options"
 msgstr ""
 
-#: builtin/notes.c:62
-msgid "git notes edit [<object>]"
+#: builtin/log.c:150
+msgid "Process line range n,m in file, counting from 1"
 msgstr ""
 
-#: builtin/notes.c:67
-msgid "git notes show [<object>]"
+#: builtin/log.c:246
+#, c-format
+msgid "Final output: %d %s\n"
 msgstr ""
 
-#: builtin/notes.c:72
-msgid "git notes merge [<options>] <notes-ref>"
+#: builtin/log.c:493
+#, c-format
+msgid "git show %s: bad file"
 msgstr ""
 
-#: builtin/notes.c:73
-msgid "git notes merge --commit [<options>]"
+#: builtin/log.c:507 builtin/log.c:601
+#, c-format
+msgid "Could not read object %s"
 msgstr ""
 
-#: builtin/notes.c:74
-msgid "git notes merge --abort [<options>]"
+#: builtin/log.c:625
+#, c-format
+msgid "Unknown type: %d"
 msgstr ""
 
-#: builtin/notes.c:79
-msgid "git notes remove [<object>]"
+#: builtin/log.c:746
+msgid "format.headers without value"
 msgstr ""
 
-#: builtin/notes.c:84
-msgid "git notes prune [<options>]"
+#: builtin/log.c:846
+msgid "name of output directory is too long"
 msgstr ""
 
-#: builtin/notes.c:89
-msgid "git notes get-ref"
+#: builtin/log.c:861
+#, c-format
+msgid "Cannot open patch file %s"
 msgstr ""
 
-#: builtin/notes.c:94
-msgid "Write/edit the notes for the following object:"
+#: builtin/log.c:875
+msgid "Need exactly one range."
 msgstr ""
 
-#: builtin/notes.c:147
-#, c-format
-msgid "unable to start 'show' for object '%s'"
+#: builtin/log.c:885
+msgid "Not a range."
 msgstr ""
 
-#: builtin/notes.c:151
-msgid "could not read 'show' output"
+#: builtin/log.c:991
+msgid "Cover letter needs email format"
 msgstr ""
 
-#: builtin/notes.c:159
+#: builtin/log.c:1071
 #, c-format
-msgid "failed to finish 'show' for object '%s'"
+msgid "insane in-reply-to: %s"
 msgstr ""
 
-#: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
+#: builtin/log.c:1098
+msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr ""
 
-#: builtin/notes.c:203
-msgid "unable to write note object"
+#: builtin/log.c:1148
+msgid "Two output directories?"
 msgstr ""
 
-#: builtin/notes.c:205
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
-msgid "The note contents have been left in %s"
+msgid "Unknown commit %s"
 msgstr ""
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
-msgid "cannot read '%s'"
+msgid "Failed to resolve '%s' as a valid ref."
 msgstr ""
 
-#: builtin/notes.c:235 builtin/tag.c:442
-#, c-format
-msgid "could not open or read '%s'"
+#: builtin/log.c:1270
+msgid "Could not find exact merge base."
 msgstr ""
 
-#: builtin/notes.c:257
-#, c-format
-msgid "Failed to read object '%s'."
+#: builtin/log.c:1274
+msgid ""
+"Failed to get upstream, if you want to record base commit automatically,\n"
+"please use git branch --set-upstream-to to track a remote branch.\n"
+"Or you could specify base commit by --base=<base-commit-id> manually."
 msgstr ""
 
-#: builtin/notes.c:261
-#, c-format
-msgid "Cannot read note data from non-blob object '%s'."
+#: builtin/log.c:1294
+msgid "Failed to find exact merge base"
 msgstr ""
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
-msgid "too many parameters"
+#: builtin/log.c:1305
+msgid "base commit should be the ancestor of revision list"
 msgstr ""
 
-#: builtin/notes.c:376 builtin/notes.c:663
-#, c-format
-msgid "No note found for object %s."
+#: builtin/log.c:1309
+msgid "base commit shouldn't be in revision list"
 msgstr ""
 
-#: builtin/notes.c:397 builtin/notes.c:560
-msgid "note contents as a string"
+#: builtin/log.c:1358
+msgid "cannot get patch id"
 msgstr ""
 
-#: builtin/notes.c:400 builtin/notes.c:563
-msgid "note contents in a file"
+#: builtin/log.c:1415
+msgid "use [PATCH n/m] even with a single patch"
 msgstr ""
 
-#: builtin/notes.c:403 builtin/notes.c:566
-msgid "reuse and edit specified note object"
+#: builtin/log.c:1418
+msgid "use [PATCH] even with multiple patches"
 msgstr ""
 
-#: builtin/notes.c:406 builtin/notes.c:569
-msgid "reuse specified note object"
+#: builtin/log.c:1422
+msgid "print patches to standard out"
 msgstr ""
 
-#: builtin/notes.c:409 builtin/notes.c:572
-msgid "allow storing empty note"
+#: builtin/log.c:1424
+msgid "generate a cover letter"
 msgstr ""
 
-#: builtin/notes.c:410 builtin/notes.c:481
-msgid "replace existing notes"
+#: builtin/log.c:1426
+msgid "use simple number sequence for output file names"
 msgstr ""
 
-#: builtin/notes.c:435
-#, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
+#: builtin/log.c:1427
+msgid "sfx"
 msgstr ""
 
-#: builtin/notes.c:450 builtin/notes.c:529
-#, c-format
-msgid "Overwriting existing notes for object %s\n"
+#: builtin/log.c:1428
+msgid "use <sfx> instead of '.patch'"
 msgstr ""
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
-#, c-format
-msgid "Removing note for object %s\n"
+#: builtin/log.c:1430
+msgid "start numbering patches at <n> instead of 1"
 msgstr ""
 
-#: builtin/notes.c:482
-msgid "read objects from stdin"
+#: builtin/log.c:1432
+msgid "mark the series as Nth re-roll"
 msgstr ""
 
-#: builtin/notes.c:484
-msgid "load rewriting config for <command> (implies --stdin)"
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
 msgstr ""
 
-#: builtin/notes.c:502
-msgid "too few parameters"
+#: builtin/log.c:1437
+msgid "Use [<prefix>] instead of [PATCH]"
 msgstr ""
 
-#: builtin/notes.c:523
-#, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
+#: builtin/log.c:1440
+msgid "store resulting files in <dir>"
 msgstr ""
 
-#: builtin/notes.c:535
-#, c-format
-msgid "Missing notes on source object %s. Cannot copy."
+#: builtin/log.c:1443
+msgid "don't strip/add [PATCH]"
 msgstr ""
 
-#: builtin/notes.c:587
-#, c-format
-msgid ""
-"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
-"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
+#: builtin/log.c:1446
+msgid "don't output binary diffs"
 msgstr ""
 
-#: builtin/notes.c:753
-#, c-format
-msgid "unknown notes merge strategy %s"
+#: builtin/log.c:1448
+msgid "output all-zero hash in From header"
 msgstr ""
 
-#: builtin/notes.c:769
-msgid "General options"
+#: builtin/log.c:1450
+msgid "don't include a patch matching a commit upstream"
 msgstr ""
 
-#: builtin/notes.c:771
-msgid "Merge options"
+#: builtin/log.c:1452
+msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 
-#: builtin/notes.c:773
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
+#: builtin/log.c:1454
+msgid "Messaging"
 msgstr ""
 
-#: builtin/notes.c:775
-msgid "Committing unmerged notes"
+#: builtin/log.c:1455
+msgid "header"
 msgstr ""
 
-#: builtin/notes.c:777
-msgid "finalize notes merge by committing unmerged notes"
+#: builtin/log.c:1456
+msgid "add email header"
 msgstr ""
 
-#: builtin/notes.c:779
-msgid "Aborting notes merge resolution"
+#: builtin/log.c:1457 builtin/log.c:1459
+msgid "email"
 msgstr ""
 
-#: builtin/notes.c:781
-msgid "abort notes merge"
+#: builtin/log.c:1457
+msgid "add To: header"
 msgstr ""
 
-#: builtin/notes.c:792
-msgid "cannot mix --commit, --abort or -s/--strategy"
+#: builtin/log.c:1459
+msgid "add Cc: header"
 msgstr ""
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
+#: builtin/log.c:1461
+msgid "ident"
 msgstr ""
 
-#: builtin/notes.c:821
-#, c-format
-msgid "Unknown -s/--strategy: %s"
+#: builtin/log.c:1462
+msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 
-#: builtin/notes.c:858
-#, c-format
-msgid "A notes merge into %s is already in-progress at %s"
+#: builtin/log.c:1464
+msgid "message-id"
 msgstr ""
 
-#: builtin/notes.c:861
-#, c-format
-msgid "Failed to store link to current notes ref (%s)"
+#: builtin/log.c:1465
+msgid "make first mail a reply to <message-id>"
 msgstr ""
 
-#: builtin/notes.c:863
-#, c-format
-msgid ""
-"Automatic notes merge failed. Fix conflicts in %s and commit the result with "
-"'git notes merge --commit', or abort the merge with 'git notes merge --"
-"abort'.\n"
+#: builtin/log.c:1466 builtin/log.c:1469
+msgid "boundary"
 msgstr ""
 
-#: builtin/notes.c:885
-#, c-format
-msgid "Object %s has no note\n"
+#: builtin/log.c:1467
+msgid "attach the patch"
 msgstr ""
 
-#: builtin/notes.c:897
-msgid "attempt to remove non-existent note is not an error"
+#: builtin/log.c:1470
+msgid "inline the patch"
 msgstr ""
 
-#: builtin/notes.c:900
-msgid "read object names from the standard input"
+#: builtin/log.c:1474
+msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
-msgid "do not remove, show only"
+#: builtin/log.c:1476
+msgid "signature"
 msgstr ""
 
-#: builtin/notes.c:939
-msgid "report pruned notes"
+#: builtin/log.c:1477
+msgid "add a signature"
 msgstr ""
 
-#: builtin/notes.c:981
-msgid "notes-ref"
+#: builtin/log.c:1478
+msgid "base-commit"
 msgstr ""
 
-#: builtin/notes.c:982
-msgid "use notes from <notes-ref>"
+#: builtin/log.c:1479
+msgid "add prerequisite tree info to the patch series"
 msgstr ""
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
-#, c-format
-msgid "Unknown subcommand: %s"
+#: builtin/log.c:1481
+msgid "add a signature from a file"
 msgstr ""
 
-#: builtin/pack-objects.c:28
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
+#: builtin/log.c:1482
+msgid "don't print the patch filenames"
 msgstr ""
 
-#: builtin/pack-objects.c:29
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+#: builtin/log.c:1572
+msgid "-n and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
-#, c-format
-msgid "deflate error (%d)"
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/pack-objects.c:766
-msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
+#: builtin/log.c:1582
+msgid "--name-only does not make sense"
 msgstr ""
 
-#: builtin/pack-objects.c:779
-msgid "Writing objects"
+#: builtin/log.c:1584
+msgid "--name-status does not make sense"
 msgstr ""
 
-#: builtin/pack-objects.c:1037
-msgid "disabling bitmap writing, as some objects are not being packed"
+#: builtin/log.c:1586
+msgid "--check does not make sense"
 msgstr ""
 
-#: builtin/pack-objects.c:2197
-msgid "Compressing objects"
+#: builtin/log.c:1616
+msgid "standard output, or directory, which one?"
 msgstr ""
 
-#: builtin/pack-objects.c:2611
+#: builtin/log.c:1618
 #, c-format
-msgid "unsupported index version %s"
+msgid "Could not create directory '%s'"
 msgstr ""
 
-#: builtin/pack-objects.c:2615
+#: builtin/log.c:1712
 #, c-format
-msgid "bad index version '%s'"
+msgid "unable to read signature file '%s'"
 msgstr ""
 
-#: builtin/pack-objects.c:2645
-msgid "do not show progress meter"
+#: builtin/log.c:1784
+msgid "Failed to create output files"
 msgstr ""
 
-#: builtin/pack-objects.c:2647
-msgid "show progress meter"
+#: builtin/log.c:1833
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr ""
 
-#: builtin/pack-objects.c:2649
-msgid "show progress meter during object writing phase"
+#: builtin/log.c:1887
+#, c-format
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr ""
 
-#: builtin/pack-objects.c:2652
-msgid "similar to --all-progress when progress meter is shown"
+#: builtin/ls-files.c:468
+msgid "git ls-files [<options>] [<file>...]"
 msgstr ""
 
-#: builtin/pack-objects.c:2653
-msgid "version[,offset]"
+#: builtin/ls-files.c:517
+msgid "identify the file status with tags"
 msgstr ""
 
-#: builtin/pack-objects.c:2654
-msgid "write the pack index file in the specified idx format version"
+#: builtin/ls-files.c:519
+msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 
-#: builtin/pack-objects.c:2657
-msgid "maximum size of each output pack file"
+#: builtin/ls-files.c:521
+msgid "show cached files in the output (default)"
 msgstr ""
 
-#: builtin/pack-objects.c:2659
-msgid "ignore borrowed objects from alternate object store"
+#: builtin/ls-files.c:523
+msgid "show deleted files in the output"
 msgstr ""
 
-#: builtin/pack-objects.c:2661
-msgid "ignore packed objects"
+#: builtin/ls-files.c:525
+msgid "show modified files in the output"
 msgstr ""
 
-#: builtin/pack-objects.c:2663
-msgid "limit pack window by objects"
+#: builtin/ls-files.c:527
+msgid "show other files in the output"
 msgstr ""
 
-#: builtin/pack-objects.c:2665
-msgid "limit pack window by memory in addition to object limit"
+#: builtin/ls-files.c:529
+msgid "show ignored files in the output"
 msgstr ""
 
-#: builtin/pack-objects.c:2667
-msgid "maximum length of delta chain allowed in the resulting pack"
+#: builtin/ls-files.c:532
+msgid "show staged contents' object name in the output"
 msgstr ""
 
-#: builtin/pack-objects.c:2669
-msgid "reuse existing deltas"
+#: builtin/ls-files.c:534
+msgid "show files on the filesystem that need to be removed"
 msgstr ""
 
-#: builtin/pack-objects.c:2671
-msgid "reuse existing objects"
+#: builtin/ls-files.c:536
+msgid "show 'other' directories' names only"
 msgstr ""
 
-#: builtin/pack-objects.c:2673
-msgid "use OFS_DELTA objects"
+#: builtin/ls-files.c:538
+msgid "show line endings of files"
 msgstr ""
 
-#: builtin/pack-objects.c:2675
-msgid "use threads when searching for best delta matches"
+#: builtin/ls-files.c:540
+msgid "don't show empty directories"
 msgstr ""
 
-#: builtin/pack-objects.c:2677
-msgid "do not create an empty pack output"
+#: builtin/ls-files.c:543
+msgid "show unmerged files in the output"
 msgstr ""
 
-#: builtin/pack-objects.c:2679
-msgid "read revision arguments from standard input"
+#: builtin/ls-files.c:545
+msgid "show resolve-undo information"
 msgstr ""
 
-#: builtin/pack-objects.c:2681
-msgid "limit the objects to those that are not yet packed"
+#: builtin/ls-files.c:547
+msgid "skip files matching pattern"
 msgstr ""
 
-#: builtin/pack-objects.c:2684
-msgid "include objects reachable from any reference"
+#: builtin/ls-files.c:550
+msgid "exclude patterns are read from <file>"
 msgstr ""
 
-#: builtin/pack-objects.c:2687
-msgid "include objects referred by reflog entries"
+#: builtin/ls-files.c:553
+msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
 
-#: builtin/pack-objects.c:2690
-msgid "include objects referred to by the index"
+#: builtin/ls-files.c:555
+msgid "add the standard git exclusions"
 msgstr ""
 
-#: builtin/pack-objects.c:2693
-msgid "output pack to stdout"
+#: builtin/ls-files.c:558
+msgid "make the output relative to the project top directory"
 msgstr ""
 
-#: builtin/pack-objects.c:2695
-msgid "include tag objects that refer to objects to be packed"
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
 msgstr ""
 
-#: builtin/pack-objects.c:2697
-msgid "keep unreachable objects"
+#: builtin/ls-files.c:563
+msgid "if any <file> is not in the index, treat this as an error"
 msgstr ""
 
-#: builtin/pack-objects.c:2699
-msgid "pack loose unreachable objects"
+#: builtin/ls-files.c:564
+msgid "tree-ish"
 msgstr ""
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
+#: builtin/ls-files.c:565
+msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 
-#: builtin/pack-objects.c:2701
-msgid "unpack unreachable objects newer than <time>"
+#: builtin/ls-files.c:567
+msgid "show debugging data"
 msgstr ""
 
-#: builtin/pack-objects.c:2704
-msgid "create thin packs"
+#: builtin/ls-remote.c:7
+msgid ""
+"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
+"                     [-q | --quiet] [--exit-code] [--get-url]\n"
+"                     [--symref] [<repository> [<refs>...]]"
 msgstr ""
 
-#: builtin/pack-objects.c:2706
-msgid "create packs suitable for shallow fetches"
+#: builtin/ls-remote.c:52
+msgid "do not print remote URL"
 msgstr ""
 
-#: builtin/pack-objects.c:2708
-msgid "ignore packs that have companion .keep file"
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
+msgid "exec"
 msgstr ""
 
-#: builtin/pack-objects.c:2710
-msgid "pack compression level"
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
+msgid "path of git-upload-pack on the remote host"
 msgstr ""
 
-#: builtin/pack-objects.c:2712
-msgid "do not hide commits by grafts"
+#: builtin/ls-remote.c:58
+msgid "limit to tags"
 msgstr ""
 
-#: builtin/pack-objects.c:2714
-msgid "use a bitmap index if available to speed up counting objects"
+#: builtin/ls-remote.c:59
+msgid "limit to heads"
 msgstr ""
 
-#: builtin/pack-objects.c:2716
-msgid "write a bitmap index together with the pack index"
+#: builtin/ls-remote.c:60
+msgid "do not show peeled tags"
 msgstr ""
 
-#: builtin/pack-objects.c:2829
-msgid "Counting objects"
+#: builtin/ls-remote.c:62
+msgid "take url.<base>.insteadOf into account"
 msgstr ""
 
-#: builtin/pack-refs.c:6
-msgid "git pack-refs [<options>]"
+#: builtin/ls-remote.c:64
+msgid "exit with exit code 2 if no matching refs are found"
 msgstr ""
 
-#: builtin/pack-refs.c:14
-msgid "pack everything"
+#: builtin/ls-remote.c:66
+msgid "show underlying ref in addition to the object pointed by it"
 msgstr ""
 
-#: builtin/pack-refs.c:15
-msgid "prune loose refs (default)"
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr ""
 
-#: builtin/prune-packed.c:7
-msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
+#: builtin/ls-tree.c:126
+msgid "only show trees"
 msgstr ""
 
-#: builtin/prune-packed.c:40
-msgid "Removing duplicate objects"
+#: builtin/ls-tree.c:128
+msgid "recurse into subtrees"
 msgstr ""
 
-#: builtin/prune.c:11
-msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+#: builtin/ls-tree.c:130
+msgid "show trees when recursing"
 msgstr ""
 
-#: builtin/prune.c:106 builtin/worktree.c:128
-msgid "report pruned objects"
+#: builtin/ls-tree.c:133
+msgid "terminate entries with NUL byte"
 msgstr ""
 
-#: builtin/prune.c:109 builtin/worktree.c:130
-msgid "expire objects older than <time>"
+#: builtin/ls-tree.c:134
+msgid "include object size"
 msgstr ""
 
-#: builtin/prune.c:123
-msgid "cannot prune in a precious-objects repo"
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
+msgid "list only filenames"
 msgstr ""
 
-#: builtin/pull.c:72
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
+#: builtin/ls-tree.c:141
+msgid "use full path names"
 msgstr ""
 
-#: builtin/pull.c:120
-msgid "Options related to merging"
+#: builtin/ls-tree.c:143
+msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 
-#: builtin/pull.c:123
-msgid "incorporate changes by rebasing rather than merging"
+#: builtin/merge.c:46
+msgid "git merge [<options>] [<commit>...]"
 msgstr ""
 
-#: builtin/pull.c:147 builtin/revert.c:101
-msgid "allow fast-forward"
+#: builtin/merge.c:47
+msgid "git merge --abort"
 msgstr ""
 
-#: builtin/pull.c:156
-msgid "automatically stash/stash pop before and after rebase"
+#: builtin/merge.c:48
+msgid "git merge --continue"
 msgstr ""
 
-#: builtin/pull.c:172
-msgid "Options related to fetching"
+#: builtin/merge.c:103
+msgid "switch `m' requires a value"
 msgstr ""
 
-#: builtin/pull.c:194
-msgid "number of submodules pulled in parallel"
+#: builtin/merge.c:140
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
 msgstr ""
 
-#: builtin/pull.c:283
+#: builtin/merge.c:141
 #, c-format
-msgid "Invalid value for pull.ff: %s"
+msgid "Available strategies are:"
 msgstr ""
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
+#: builtin/merge.c:146
+#, c-format
+msgid "Available custom strategies are:"
 msgstr ""
 
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
+#: builtin/merge.c:196 builtin/pull.c:127
+msgid "do not show a diffstat at the end of the merge"
 msgstr ""
 
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+#: builtin/merge.c:199 builtin/pull.c:130
+msgid "show a diffstat at the end of the merge"
 msgstr ""
 
-#: builtin/pull.c:463
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
+#: builtin/merge.c:200 builtin/pull.c:133
+msgid "(synonym to --stat)"
 msgstr ""
 
-#: builtin/pull.c:465
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
+#: builtin/merge.c:202 builtin/pull.c:136
+msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 
-#: builtin/pull.c:466
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
+#: builtin/merge.c:205 builtin/pull.c:139
+msgid "create a single commit instead of doing a merge"
 msgstr ""
 
-#: builtin/pull.c:469
-#, c-format
-msgid ""
-"You asked to pull from the remote '%s', but did not specify\n"
-"a branch. Because this is not the default configured remote\n"
-"for your current branch, you must specify a branch on the command line."
+#: builtin/merge.c:207 builtin/pull.c:142
+msgid "perform a commit if the merge succeeds (default)"
 msgstr ""
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
-msgid "You are not currently on a branch."
+#: builtin/merge.c:209 builtin/pull.c:145
+msgid "edit message before committing"
 msgstr ""
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
-msgid "Please specify which branch you want to rebase against."
+#: builtin/merge.c:210
+msgid "allow fast-forward (default)"
 msgstr ""
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
-msgid "Please specify which branch you want to merge with."
+#: builtin/merge.c:212 builtin/pull.c:151
+msgid "abort if fast-forward is not possible"
 msgstr ""
 
-#: builtin/pull.c:479 builtin/pull.c:494
-msgid "See git-pull(1) for details."
+#: builtin/merge.c:216 builtin/pull.c:154
+msgid "verify that the named commit has a valid GPG signature"
 msgstr ""
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
-#: git-parse-remote.sh:64
-msgid "<remote>"
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
+msgid "strategy"
 msgstr ""
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
-#: git-parse-remote.sh:65
-msgid "<branch>"
+#: builtin/merge.c:218 builtin/pull.c:159
+msgid "merge strategy to use"
 msgstr ""
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
-msgid "There is no tracking information for the current branch."
+#: builtin/merge.c:219 builtin/pull.c:162
+msgid "option=value"
 msgstr ""
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:"
+#: builtin/merge.c:220 builtin/pull.c:163
+msgid "option for selected merge strategy"
 msgstr ""
 
-#: builtin/pull.c:503
-#, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
+#: builtin/merge.c:222
+msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 
-#: builtin/pull.c:820
-msgid "ignoring --verify-signatures for rebase"
+#: builtin/merge.c:226
+msgid "abort the current in-progress merge"
 msgstr ""
 
-#: builtin/pull.c:867
-msgid "--[no-]autostash option is only valid with --rebase."
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
 msgstr ""
 
-#: builtin/pull.c:875
-msgid "Updating an unborn branch with changes added to the index."
+#: builtin/merge.c:230 builtin/pull.c:170
+msgid "allow merging unrelated histories"
 msgstr ""
 
-#: builtin/pull.c:903
-#, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
+#: builtin/merge.c:258
+msgid "could not run stash."
+msgstr ""
+
+#: builtin/merge.c:263
+msgid "stash failed"
 msgstr ""
 
-#: builtin/pull.c:908
+#: builtin/merge.c:268
 #, c-format
-msgid ""
-"Cannot fast-forward your working tree.\n"
-"After making sure that you saved anything precious from\n"
-"$ git diff %s\n"
-"output, run\n"
-"$ git reset --hard\n"
-"to recover."
+msgid "not a valid object: %s"
 msgstr ""
 
-#: builtin/pull.c:923
-msgid "Cannot merge multiple branches into empty head."
+#: builtin/merge.c:287 builtin/merge.c:304
+msgid "read-tree failed"
 msgstr ""
 
-#: builtin/pull.c:927
-msgid "Cannot rebase onto multiple branches."
+#: builtin/merge.c:334
+msgid " (nothing to squash)"
 msgstr ""
 
-#: builtin/push.c:16
-msgid "git push [<options>] [<repository> [<refspec>...]]"
+#: builtin/merge.c:345
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
 msgstr ""
 
-#: builtin/push.c:89
-msgid "tag shorthand without <tag>"
+#: builtin/merge.c:395
+#, c-format
+msgid "No merge message -- not updating HEAD\n"
 msgstr ""
 
-#: builtin/push.c:99
-msgid "--delete only accepts plain target ref names"
+#: builtin/merge.c:446
+#, c-format
+msgid "'%s' does not point to a commit"
 msgstr ""
 
-#: builtin/push.c:143
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
+#: builtin/merge.c:536
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr ""
 
-#: builtin/push.c:146
+#: builtin/merge.c:656
+msgid "Not handling anything other than two heads merge."
+msgstr ""
+
+#: builtin/merge.c:670
 #, c-format
-msgid ""
-"The upstream branch of your current branch does not match\n"
-"the name of your current branch.  To push to the upstream branch\n"
-"on the remote, use\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"To push to the branch of the same name on the remote, use\n"
-"\n"
-"    git push %s %s\n"
-"%s"
+msgid "Unknown option for merge-recursive: -X%s"
 msgstr ""
 
-#: builtin/push.c:161
+#: builtin/merge.c:685
 #, c-format
-msgid ""
-"You are not currently on a branch.\n"
-"To push the history leading to the current (detached HEAD)\n"
-"state now, use\n"
-"\n"
-"    git push %s HEAD:<name-of-remote-branch>\n"
+msgid "unable to write %s"
 msgstr ""
 
-#: builtin/push.c:175
+#: builtin/merge.c:737
 #, c-format
-msgid ""
-"The current branch %s has no upstream branch.\n"
-"To push the current branch and set the remote as upstream, use\n"
-"\n"
-"    git push --set-upstream %s %s\n"
+msgid "Could not read from '%s'"
 msgstr ""
 
-#: builtin/push.c:183
+#: builtin/merge.c:746
 #, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 
-#: builtin/push.c:186
+#: builtin/merge.c:752
 #, c-format
 msgid ""
-"You are pushing to remote '%s', which is not the upstream of\n"
-"your current branch '%s', without telling me what to push\n"
-"to update which remote branch."
+"Please enter a commit message to explain why this merge is necessary,\n"
+"especially if it merges an updated upstream into a topic branch.\n"
+"\n"
+"Lines starting with '%c' will be ignored, and an empty message aborts\n"
+"the commit.\n"
 msgstr ""
 
-#: builtin/push.c:242
-msgid ""
-"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+#: builtin/merge.c:776
+msgid "Empty commit message."
 msgstr ""
 
-#: builtin/push.c:249
-msgid ""
-"Updates were rejected because the tip of your current branch is behind\n"
-"its remote counterpart. Integrate the remote changes (e.g.\n"
-"'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
+#: builtin/merge.c:796
+#, c-format
+msgid "Wonderful.\n"
 msgstr ""
 
-#: builtin/push.c:255
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. Check out this branch and integrate the remote changes\n"
-"(e.g. 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
+#: builtin/merge.c:851
+#, c-format
+msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 
-#: builtin/push.c:261
-msgid ""
-"Updates were rejected because the remote contains work that you do\n"
-"not have locally. This is usually caused by another repository pushing\n"
-"to the same ref. You may want to first integrate the remote changes\n"
-"(e.g., 'git pull ...') before pushing again.\n"
-"See the 'Note about fast-forwards' in 'git push --help' for details."
+#: builtin/merge.c:890
+msgid "No current branch."
 msgstr ""
 
-#: builtin/push.c:268
-msgid "Updates were rejected because the tag already exists in the remote."
+#: builtin/merge.c:892
+msgid "No remote for the current branch."
 msgstr ""
 
-#: builtin/push.c:271
-msgid ""
-"You cannot update a remote ref that points at a non-commit object,\n"
-"or update a remote ref to make it point at a non-commit object,\n"
-"without using the '--force' option.\n"
+#: builtin/merge.c:894
+msgid "No default upstream defined for the current branch."
 msgstr ""
 
-#: builtin/push.c:331
+#: builtin/merge.c:899
 #, c-format
-msgid "Pushing to %s\n"
+msgid "No remote-tracking branch for %s from %s"
 msgstr ""
 
-#: builtin/push.c:335
+#: builtin/merge.c:946
 #, c-format
-msgid "failed to push some refs to '%s'"
+msgid "Bad value '%s' in environment '%s'"
 msgstr ""
 
-#: builtin/push.c:366
+#: builtin/merge.c:1020
 #, c-format
-msgid "bad repository '%s'"
+msgid "could not close '%s'"
 msgstr ""
 
-#: builtin/push.c:367
-msgid ""
-"No configured push destination.\n"
-"Either specify the URL from the command-line or configure a remote "
-"repository using\n"
-"\n"
-"    git remote add <name> <url>\n"
-"\n"
-"and then push using the remote name\n"
-"\n"
-"    git push <name>\n"
+#: builtin/merge.c:1047
+#, c-format
+msgid "not something we can merge in %s: %s"
 msgstr ""
 
-#: builtin/push.c:385
-msgid "--all and --tags are incompatible"
+#: builtin/merge.c:1081
+msgid "not something we can merge"
 msgstr ""
 
-#: builtin/push.c:386
-msgid "--all can't be combined with refspecs"
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
 msgstr ""
 
-#: builtin/push.c:391
-msgid "--mirror and --tags are incompatible"
+#: builtin/merge.c:1150
+msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/push.c:392
-msgid "--mirror can't be combined with refspecs"
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
 msgstr ""
 
-#: builtin/push.c:397
-msgid "--all and --mirror are incompatible"
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/push.c:515
-msgid "repository"
+#: builtin/merge.c:1182
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you merge."
 msgstr ""
 
-#: builtin/push.c:516 builtin/send-pack.c:161
-msgid "push all refs"
+#: builtin/merge.c:1189
+msgid ""
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you merge."
 msgstr ""
 
-#: builtin/push.c:517 builtin/send-pack.c:163
-msgid "mirror all refs"
+#: builtin/merge.c:1192
+msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 
-#: builtin/push.c:519
-msgid "delete refs"
+#: builtin/merge.c:1201
+msgid "You cannot combine --squash with --no-ff."
 msgstr ""
 
-#: builtin/push.c:520
-msgid "push tags (can't be used with --all or --mirror)"
+#: builtin/merge.c:1209
+msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 
-#: builtin/push.c:523 builtin/send-pack.c:164
-msgid "force updates"
+#: builtin/merge.c:1226
+msgid "Squash commit into empty head not supported yet"
 msgstr ""
 
-#: builtin/push.c:525 builtin/send-pack.c:175
-msgid "refname>:<expect"
+#: builtin/merge.c:1228
+msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 
-#: builtin/push.c:526 builtin/send-pack.c:176
-msgid "require old value of ref to be at this value"
+#: builtin/merge.c:1233
+#, c-format
+msgid "%s - not something we can merge"
 msgstr ""
 
-#: builtin/push.c:529
-msgid "control recursive pushing of submodules"
+#: builtin/merge.c:1235
+msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 
-#: builtin/push.c:531 builtin/send-pack.c:169
-msgid "use thin pack"
+#: builtin/merge.c:1269
+#, c-format
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
-msgid "receive pack program"
+#: builtin/merge.c:1272
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 
-#: builtin/push.c:534
-msgid "set upstream for git pull/status"
+#: builtin/merge.c:1275
+#, c-format
+msgid "Commit %s does not have a GPG signature."
 msgstr ""
 
-#: builtin/push.c:537
-msgid "prune locally removed refs"
+#: builtin/merge.c:1278
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
 msgstr ""
 
-#: builtin/push.c:539
-msgid "bypass pre-push hook"
+#: builtin/merge.c:1340
+msgid "refusing to merge unrelated histories"
 msgstr ""
 
-#: builtin/push.c:540
-msgid "push missing but relevant tags"
+#: builtin/merge.c:1349
+msgid "Already up-to-date."
 msgstr ""
 
-#: builtin/push.c:543 builtin/send-pack.c:166
-msgid "GPG sign the push"
+#: builtin/merge.c:1359
+#, c-format
+msgid "Updating %s..%s\n"
 msgstr ""
 
-#: builtin/push.c:545 builtin/send-pack.c:170
-msgid "request atomic transaction on remote side"
+#: builtin/merge.c:1400
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
 msgstr ""
 
-#: builtin/push.c:546
-msgid "server-specific"
+#: builtin/merge.c:1407
+#, c-format
+msgid "Nope.\n"
 msgstr ""
 
-#: builtin/push.c:546
-msgid "option to transmit"
+#: builtin/merge.c:1432
+msgid "Already up-to-date. Yeeah!"
 msgstr ""
 
-#: builtin/push.c:560
-msgid "--delete is incompatible with --all, --mirror and --tags"
+#: builtin/merge.c:1438
+msgid "Not possible to fast-forward, aborting."
 msgstr ""
 
-#: builtin/push.c:562
-msgid "--delete doesn't make sense without any refs"
+#: builtin/merge.c:1461 builtin/merge.c:1540
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
 msgstr ""
 
-#: builtin/push.c:579
-msgid "push options must not have new line characters"
+#: builtin/merge.c:1465
+#, c-format
+msgid "Trying merge strategy %s...\n"
 msgstr ""
 
-#: builtin/read-tree.c:37
-msgid ""
-"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
-"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
-"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+#: builtin/merge.c:1531
+#, c-format
+msgid "No merge strategy handled the merge.\n"
 msgstr ""
 
-#: builtin/read-tree.c:110
-msgid "write resulting index to <file>"
+#: builtin/merge.c:1533
+#, c-format
+msgid "Merge with strategy %s failed.\n"
 msgstr ""
 
-#: builtin/read-tree.c:113
-msgid "only empty the index"
+#: builtin/merge.c:1542
+#, c-format
+msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 
-#: builtin/read-tree.c:115
-msgid "Merging"
+#: builtin/merge.c:1554
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
 
-#: builtin/read-tree.c:117
-msgid "perform a merge in addition to a read"
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a | --all] <commit> <commit>..."
 msgstr ""
 
-#: builtin/read-tree.c:119
-msgid "3-way merge if no file level merging required"
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a | --all] --octopus <commit>..."
 msgstr ""
 
-#: builtin/read-tree.c:121
-msgid "3-way merge in presence of adds and removes"
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
 msgstr ""
 
-#: builtin/read-tree.c:123
-msgid "same as -m, but discard unmerged entries"
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
 msgstr ""
 
-#: builtin/read-tree.c:124
-msgid "<subdirectory>/"
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr ""
 
-#: builtin/read-tree.c:125
-msgid "read the tree into the index under <subdirectory>/"
+#: builtin/merge-base.c:217
+msgid "output all common ancestors"
 msgstr ""
 
-#: builtin/read-tree.c:128
-msgid "update working tree with merge result"
+#: builtin/merge-base.c:219
+msgid "find ancestors for a single n-way merge"
 msgstr ""
 
-#: builtin/read-tree.c:130
-msgid "gitignore"
+#: builtin/merge-base.c:221
+msgid "list revs not reachable from others"
 msgstr ""
 
-#: builtin/read-tree.c:131
-msgid "allow explicitly ignored files to be overwritten"
+#: builtin/merge-base.c:223
+msgid "is the first one ancestor of the other?"
 msgstr ""
 
-#: builtin/read-tree.c:134
-msgid "don't check the working tree after merging"
+#: builtin/merge-base.c:225
+msgid "find where <commit> forked from reflog of <ref>"
 msgstr ""
 
-#: builtin/read-tree.c:135
-msgid "don't update the index or the work tree"
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
+"<orig-file> <file2>"
 msgstr ""
 
-#: builtin/read-tree.c:137
-msgid "skip applying sparse checkout filter"
+#: builtin/merge-file.c:32
+msgid "send results to standard output"
 msgstr ""
 
-#: builtin/read-tree.c:139
-msgid "debug unpack-trees"
+#: builtin/merge-file.c:33
+msgid "use a diff3 based merge"
 msgstr ""
 
-#: builtin/receive-pack.c:25
-msgid "git receive-pack <git-dir>"
+#: builtin/merge-file.c:34
+msgid "for conflicts, use our version"
 msgstr ""
 
-#: builtin/receive-pack.c:1843
-msgid "quiet"
+#: builtin/merge-file.c:36
+msgid "for conflicts, use their version"
 msgstr ""
 
-#: builtin/receive-pack.c:1857
-msgid "You must specify a directory."
-msgstr ""
-
-#: builtin/reflog.c:423
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: builtin/reflog.c:540 builtin/reflog.c:545
-#, c-format
-msgid "'%s' is not a valid timestamp"
+#: builtin/merge-file.c:38
+msgid "for conflicts, use a union version"
 msgstr ""
 
-#: builtin/remote.c:12
-msgid "git remote [-v | --verbose]"
+#: builtin/merge-file.c:41
+msgid "for conflicts, use this marker size"
 msgstr ""
 
-#: builtin/remote.c:13
-msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
+#: builtin/merge-file.c:42
+msgid "do not warn about conflicts"
 msgstr ""
 
-#: builtin/remote.c:14 builtin/remote.c:34
-msgid "git remote rename <old> <new>"
+#: builtin/merge-file.c:44
+msgid "set labels for file1/orig-file/file2"
 msgstr ""
 
-#: builtin/remote.c:15 builtin/remote.c:39
-msgid "git remote remove <name>"
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
 msgstr ""
 
-#: builtin/remote.c:16 builtin/remote.c:44
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
 msgstr ""
 
-#: builtin/remote.c:17
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr ""
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/remote.c:18
-msgid "git remote prune [-n | --dry-run] <name>"
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
 msgstr ""
 
-#: builtin/remote.c:19
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
 msgstr ""
 
-#: builtin/remote.c:20
-msgid "git remote set-branches [--add] <name> <branch>..."
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
 msgstr ""
 
-#: builtin/remote.c:21 builtin/remote.c:70
-msgid "git remote get-url [--push] [--all] <name>"
+#: builtin/mktree.c:65
+msgid "git mktree [-z] [--missing] [--batch]"
 msgstr ""
 
-#: builtin/remote.c:22 builtin/remote.c:75
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+#: builtin/mktree.c:152
+msgid "input is NUL terminated"
 msgstr ""
 
-#: builtin/remote.c:23 builtin/remote.c:76
-msgid "git remote set-url --add <name> <newurl>"
+#: builtin/mktree.c:153 builtin/write-tree.c:24
+msgid "allow missing objects"
 msgstr ""
 
-#: builtin/remote.c:24 builtin/remote.c:77
-msgid "git remote set-url --delete <name> <url>"
+#: builtin/mktree.c:154
+msgid "allow creation of more than one tree"
 msgstr ""
 
-#: builtin/remote.c:29
-msgid "git remote add [<options>] <name> <url>"
+#: builtin/mv.c:16
+msgid "git mv [<options>] <source>... <destination>"
 msgstr ""
 
-#: builtin/remote.c:49
-msgid "git remote set-branches <name> <branch>..."
+#: builtin/mv.c:82
+#, c-format
+msgid "Directory %s is in index and no submodule?"
 msgstr ""
 
-#: builtin/remote.c:50
-msgid "git remote set-branches --add <name> <branch>..."
+#: builtin/mv.c:84 builtin/rm.c:290
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 
-#: builtin/remote.c:55
-msgid "git remote show [<options>] <name>"
+#: builtin/mv.c:102
+#, c-format
+msgid "%.*s is in index"
 msgstr ""
 
-#: builtin/remote.c:60
-msgid "git remote prune [<options>] <name>"
+#: builtin/mv.c:124
+msgid "force move/rename even if target exists"
 msgstr ""
 
-#: builtin/remote.c:65
-msgid "git remote update [<options>] [<group> | <remote>]..."
+#: builtin/mv.c:125
+msgid "skip move/rename errors"
 msgstr ""
 
-#: builtin/remote.c:94
+#: builtin/mv.c:167
 #, c-format
-msgid "Updating %s"
-msgstr ""
-
-#: builtin/remote.c:126
-msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
+msgid "destination '%s' is not a directory"
 msgstr ""
 
-#: builtin/remote.c:143
+#: builtin/mv.c:178
 #, c-format
-msgid "unknown mirror argument: %s"
+msgid "Checking rename of '%s' to '%s'\n"
 msgstr ""
 
-#: builtin/remote.c:159
-msgid "fetch the remote branches"
+#: builtin/mv.c:182
+msgid "bad source"
 msgstr ""
 
-#: builtin/remote.c:161
-msgid "import all tags and associated objects when fetching"
+#: builtin/mv.c:185
+msgid "can not move directory into itself"
 msgstr ""
 
-#: builtin/remote.c:164
-msgid "or do not fetch any tag at all (--no-tags)"
+#: builtin/mv.c:188
+msgid "cannot move directory over file"
 msgstr ""
 
-#: builtin/remote.c:166
-msgid "branch(es) to track"
+#: builtin/mv.c:197
+msgid "source directory is empty"
 msgstr ""
 
-#: builtin/remote.c:167
-msgid "master branch"
+#: builtin/mv.c:222
+msgid "not under version control"
 msgstr ""
 
-#: builtin/remote.c:168
-msgid "push|fetch"
+#: builtin/mv.c:225
+msgid "destination exists"
 msgstr ""
 
-#: builtin/remote.c:169
-msgid "set up remote as a mirror to push to or fetch from"
+#: builtin/mv.c:233
+#, c-format
+msgid "overwriting '%s'"
 msgstr ""
 
-#: builtin/remote.c:181
-msgid "specifying a master branch makes no sense with --mirror"
+#: builtin/mv.c:236
+msgid "Cannot overwrite"
 msgstr ""
 
-#: builtin/remote.c:183
-msgid "specifying branches to track makes sense only with fetch mirrors"
+#: builtin/mv.c:239
+msgid "multiple sources for the same target"
 msgstr ""
 
-#: builtin/remote.c:190 builtin/remote.c:629
-#, c-format
-msgid "remote %s already exists."
+#: builtin/mv.c:241
+msgid "destination directory does not exist"
 msgstr ""
 
-#: builtin/remote.c:194 builtin/remote.c:633
+#: builtin/mv.c:248
 #, c-format
-msgid "'%s' is not a valid remote name"
+msgid "%s, source=%s, destination=%s"
 msgstr ""
 
-#: builtin/remote.c:234
+#: builtin/mv.c:269
 #, c-format
-msgid "Could not setup master '%s'"
+msgid "Renaming %s to %s\n"
 msgstr ""
 
-#: builtin/remote.c:336
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
-msgid "Could not get fetch map for refspec %s"
+msgid "renaming '%s' failed"
 msgstr ""
 
-#: builtin/remote.c:437 builtin/remote.c:445
-msgid "(matching)"
+#: builtin/name-rev.c:289
+msgid "git name-rev [<options>] <commit>..."
 msgstr ""
 
-#: builtin/remote.c:449
-msgid "(delete)"
+#: builtin/name-rev.c:290
+msgid "git name-rev [<options>] --all"
 msgstr ""
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
-#, c-format
-msgid "No such remote: %s"
+#: builtin/name-rev.c:291
+msgid "git name-rev [<options>] --stdin"
 msgstr ""
 
-#: builtin/remote.c:639
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
+#: builtin/name-rev.c:346
+msgid "print only names (no SHA-1)"
 msgstr ""
 
-#: builtin/remote.c:659
-#, c-format
-msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
+#: builtin/name-rev.c:347
+msgid "only use tags to name the commits"
 msgstr ""
 
-#: builtin/remote.c:695
-#, c-format
-msgid "deleting '%s' failed"
+#: builtin/name-rev.c:349
+msgid "only use refs matching <pattern>"
 msgstr ""
 
-#: builtin/remote.c:729
-#, c-format
-msgid "creating '%s' failed"
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
 msgstr ""
 
-#: builtin/remote.c:792
-msgid ""
-"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
-"to delete it, use:"
-msgid_plural ""
-"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
-"to delete them, use:"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/name-rev.c:353
+msgid "list all commits reachable from all refs"
+msgstr ""
 
-#: builtin/remote.c:806
-#, c-format
-msgid "Could not remove config section '%s'"
+#: builtin/name-rev.c:354
+msgid "read from stdin"
 msgstr ""
 
-#: builtin/remote.c:907
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
+#: builtin/name-rev.c:355
+msgid "allow to print `undefined` names (default)"
 msgstr ""
 
-#: builtin/remote.c:910
-msgid " tracked"
+#: builtin/name-rev.c:361
+msgid "dereference tags in the input (internal use)"
 msgstr ""
 
-#: builtin/remote.c:912
-msgid " stale (use 'git remote prune' to remove)"
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes-ref>] [list [<object>]]"
 msgstr ""
 
-#: builtin/remote.c:914
-msgid " ???"
+#: builtin/notes.c:26
+msgid ""
+"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
+"| (-c | -C) <object>] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:955
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
 msgstr ""
 
-#: builtin/remote.c:963
-#, c-format
-msgid "rebases interactively onto remote %s"
+#: builtin/notes.c:28
+msgid ""
+"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
+"(-c | -C) <object>] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:964
-#, c-format
-msgid "rebases onto remote %s"
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:967
-#, c-format
-msgid " merges with remote %s"
+#: builtin/notes.c:30
+msgid "git notes [--ref <notes-ref>] show [<object>]"
 msgstr ""
 
-#: builtin/remote.c:970
-#, c-format
-msgid "merges with remote %s"
+#: builtin/notes.c:31
+msgid ""
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
 msgstr ""
 
-#: builtin/remote.c:973
-#, c-format
-msgid "%-*s    and with remote %s\n"
+#: builtin/notes.c:32
+msgid "git notes merge --commit [-v | -q]"
 msgstr ""
 
-#: builtin/remote.c:1016
-msgid "create"
+#: builtin/notes.c:33
+msgid "git notes merge --abort [-v | -q]"
 msgstr ""
 
-#: builtin/remote.c:1019
-msgid "delete"
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes-ref>] remove [<object>...]"
 msgstr ""
 
-#: builtin/remote.c:1023
-msgid "up to date"
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
 msgstr ""
 
-#: builtin/remote.c:1026
-msgid "fast-forwardable"
+#: builtin/notes.c:36
+msgid "git notes [--ref <notes-ref>] get-ref"
 msgstr ""
 
-#: builtin/remote.c:1029
-msgid "local out of date"
+#: builtin/notes.c:41
+msgid "git notes [list [<object>]]"
 msgstr ""
 
-#: builtin/remote.c:1036
-#, c-format
-msgid "    %-*s forces to %-*s (%s)"
+#: builtin/notes.c:46
+msgid "git notes add [<options>] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:1039
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
+#: builtin/notes.c:51
+msgid "git notes copy [<options>] <from-object> <to-object>"
 msgstr ""
 
-#: builtin/remote.c:1043
-#, c-format
-msgid "    %-*s forces to %s"
+#: builtin/notes.c:52
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
 msgstr ""
 
-#: builtin/remote.c:1046
-#, c-format
-msgid "    %-*s pushes to %s"
+#: builtin/notes.c:57
+msgid "git notes append [<options>] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:1114
-msgid "do not query remotes"
+#: builtin/notes.c:62
+msgid "git notes edit [<object>]"
 msgstr ""
 
-#: builtin/remote.c:1141
-#, c-format
-msgid "* remote %s"
+#: builtin/notes.c:67
+msgid "git notes show [<object>]"
 msgstr ""
 
-#: builtin/remote.c:1142
-#, c-format
-msgid "  Fetch URL: %s"
+#: builtin/notes.c:72
+msgid "git notes merge [<options>] <notes-ref>"
 msgstr ""
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
-msgid "(no URL)"
+#: builtin/notes.c:73
+msgid "git notes merge --commit [<options>]"
 msgstr ""
 
-#. TRANSLATORS: the colon ':' should align with
-#. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
-#, c-format
-msgid "  Push  URL: %s"
+#: builtin/notes.c:74
+msgid "git notes merge --abort [<options>]"
 msgstr ""
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
-#, c-format
-msgid "  HEAD branch: %s"
+#: builtin/notes.c:79
+msgid "git notes remove [<object>]"
 msgstr ""
 
-#: builtin/remote.c:1158
-msgid "(not queried)"
+#: builtin/notes.c:84
+msgid "git notes prune [<options>]"
 msgstr ""
 
-#: builtin/remote.c:1160
-msgid "(unknown)"
+#: builtin/notes.c:89
+msgid "git notes get-ref"
 msgstr ""
 
-#: builtin/remote.c:1164
-#, c-format
-msgid ""
-"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
+#: builtin/notes.c:94
+msgid "Write/edit the notes for the following object:"
 msgstr ""
 
-#: builtin/remote.c:1176
+#: builtin/notes.c:147
 #, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1179 builtin/remote.c:1206
-msgid " (status not queried)"
+msgid "unable to start 'show' for object '%s'"
 msgstr ""
 
-#: builtin/remote.c:1188
-msgid "  Local branch configured for 'git pull':"
-msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1196
-msgid "  Local refs will be mirrored by 'git push'"
+#: builtin/notes.c:151
+msgid "could not read 'show' output"
 msgstr ""
 
-#: builtin/remote.c:1203
+#: builtin/notes.c:159
 #, c-format
-msgid "  Local ref configured for 'git push'%s:"
-msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1224
-msgid "set refs/remotes/<name>/HEAD according to remote"
+msgid "failed to finish 'show' for object '%s'"
 msgstr ""
 
-#: builtin/remote.c:1226
-msgid "delete refs/remotes/<name>/HEAD"
+#: builtin/notes.c:194
+msgid "please supply the note contents using either -m or -F option"
 msgstr ""
 
-#: builtin/remote.c:1241
-msgid "Cannot determine remote HEAD"
+#: builtin/notes.c:203
+msgid "unable to write note object"
 msgstr ""
 
-#: builtin/remote.c:1243
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
+#: builtin/notes.c:205
+#, c-format
+msgid "the note contents have been left in %s"
 msgstr ""
 
-#: builtin/remote.c:1253
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
-msgid "Could not delete %s"
+msgid "cannot read '%s'"
 msgstr ""
 
-#: builtin/remote.c:1261
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
-msgid "Not a valid ref: %s"
+msgid "could not open or read '%s'"
 msgstr ""
 
-#: builtin/remote.c:1263
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
 #, c-format
-msgid "Could not setup %s"
+msgid "failed to resolve '%s' as a valid ref."
 msgstr ""
 
-#: builtin/remote.c:1281
+#: builtin/notes.c:257
 #, c-format
-msgid " %s will become dangling!"
+msgid "failed to read object '%s'."
 msgstr ""
 
-#: builtin/remote.c:1282
+#: builtin/notes.c:261
 #, c-format
-msgid " %s has become dangling!"
+msgid "cannot read note data from non-blob object '%s'."
 msgstr ""
 
-#: builtin/remote.c:1292
+#: builtin/notes.c:301
 #, c-format
-msgid "Pruning %s"
+msgid "malformed input line: '%s'."
 msgstr ""
 
-#: builtin/remote.c:1293
+#: builtin/notes.c:316
 #, c-format
-msgid "URL: %s"
+msgid "failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/remote.c:1309
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
 #, c-format
-msgid " * [would prune] %s"
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr ""
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
+msgid "too many parameters"
 msgstr ""
 
-#: builtin/remote.c:1312
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid " * [pruned] %s"
+msgid "no note found for object %s."
 msgstr ""
 
-#: builtin/remote.c:1357
-msgid "prune remotes after fetching"
+#: builtin/notes.c:399 builtin/notes.c:562
+msgid "note contents as a string"
 msgstr ""
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
-#, c-format
-msgid "No such remote '%s'"
+#: builtin/notes.c:402 builtin/notes.c:565
+msgid "note contents in a file"
 msgstr ""
 
-#: builtin/remote.c:1436
-msgid "add branch"
+#: builtin/notes.c:405 builtin/notes.c:568
+msgid "reuse and edit specified note object"
 msgstr ""
 
-#: builtin/remote.c:1443
-msgid "no remote specified"
+#: builtin/notes.c:408 builtin/notes.c:571
+msgid "reuse specified note object"
 msgstr ""
 
-#: builtin/remote.c:1460
-msgid "query push URLs rather than fetch URLs"
+#: builtin/notes.c:411 builtin/notes.c:574
+msgid "allow storing empty note"
 msgstr ""
 
-#: builtin/remote.c:1462
-msgid "return all URLs"
+#: builtin/notes.c:412 builtin/notes.c:483
+msgid "replace existing notes"
 msgstr ""
 
-#: builtin/remote.c:1490
+#: builtin/notes.c:437
 #, c-format
-msgid "no URLs configured for remote '%s'"
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
 msgstr ""
 
-#: builtin/remote.c:1516
-msgid "manipulate push URLs"
+#: builtin/notes.c:452 builtin/notes.c:531
+#, c-format
+msgid "Overwriting existing notes for object %s\n"
 msgstr ""
 
-#: builtin/remote.c:1518
-msgid "add URL"
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
+#, c-format
+msgid "Removing note for object %s\n"
 msgstr ""
 
-#: builtin/remote.c:1520
-msgid "delete URLs"
+#: builtin/notes.c:484
+msgid "read objects from stdin"
 msgstr ""
 
-#: builtin/remote.c:1527
-msgid "--add --delete doesn't make sense"
+#: builtin/notes.c:486
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr ""
+
+#: builtin/notes.c:504
+msgid "too few parameters"
 msgstr ""
 
-#: builtin/remote.c:1568
+#: builtin/notes.c:525
 #, c-format
-msgid "Invalid old URL pattern: %s"
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
 msgstr ""
 
-#: builtin/remote.c:1576
+#: builtin/notes.c:537
 #, c-format
-msgid "No such URL found: %s"
+msgid "missing notes on source object %s. Cannot copy."
 msgstr ""
 
-#: builtin/remote.c:1578
-msgid "Will not delete all non-push URLs"
+#: builtin/notes.c:589
+#, c-format
+msgid ""
+"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
+"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr ""
 
-#: builtin/remote.c:1592
-msgid "be verbose; must be placed before a subcommand"
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
 msgstr ""
 
-#: builtin/repack.c:17
-msgid "git repack [<options>]"
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
 msgstr ""
 
-#: builtin/repack.c:160
-msgid "pack everything in a single pack"
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
 msgstr ""
 
-#: builtin/repack.c:162
-msgid "same as -a, and turn unreachable objects loose"
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
 msgstr ""
 
-#: builtin/repack.c:165
-msgid "remove redundant packs, and run git-prune-packed"
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
 msgstr ""
 
-#: builtin/repack.c:167
-msgid "pass --no-reuse-delta to git-pack-objects"
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
 msgstr ""
 
-#: builtin/repack.c:169
-msgid "pass --no-reuse-object to git-pack-objects"
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
 msgstr ""
 
-#: builtin/repack.c:171
-msgid "do not run git-update-server-info"
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
 msgstr ""
 
-#: builtin/repack.c:174
-msgid "pass --local to git-pack-objects"
+#: builtin/notes.c:754
+#, c-format
+msgid "unknown notes merge strategy %s"
 msgstr ""
 
-#: builtin/repack.c:176
-msgid "write bitmap index"
+#: builtin/notes.c:770
+msgid "General options"
 msgstr ""
 
-#: builtin/repack.c:177
-msgid "approxidate"
+#: builtin/notes.c:772
+msgid "Merge options"
 msgstr ""
 
-#: builtin/repack.c:178
-msgid "with -A, do not loosen objects older than this"
+#: builtin/notes.c:774
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
 msgstr ""
 
-#: builtin/repack.c:180
-msgid "with -a, repack unreachable objects"
+#: builtin/notes.c:776
+msgid "Committing unmerged notes"
 msgstr ""
 
-#: builtin/repack.c:182
-msgid "size of the window used for delta compression"
+#: builtin/notes.c:778
+msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 
-#: builtin/repack.c:183 builtin/repack.c:187
-msgid "bytes"
+#: builtin/notes.c:780
+msgid "Aborting notes merge resolution"
 msgstr ""
 
-#: builtin/repack.c:184
-msgid "same as the above, but limit memory size instead of entries count"
+#: builtin/notes.c:782
+msgid "abort notes merge"
 msgstr ""
 
-#: builtin/repack.c:186
-msgid "limits the maximum delta depth"
+#: builtin/notes.c:793
+msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr ""
 
-#: builtin/repack.c:188
-msgid "maximum size of each packfile"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
 msgstr ""
 
-#: builtin/repack.c:190
-msgid "repack objects in packs marked with .keep"
+#: builtin/notes.c:822
+#, c-format
+msgid "unknown -s/--strategy: %s"
 msgstr ""
 
-#: builtin/repack.c:200
-msgid "cannot delete packs in a precious-objects repo"
+#: builtin/notes.c:859
+#, c-format
+msgid "a notes merge into %s is already in-progress at %s"
 msgstr ""
 
-#: builtin/repack.c:204
-msgid "--keep-unreachable and -A are incompatible"
+#: builtin/notes.c:862
+#, c-format
+msgid "failed to store link to current notes ref (%s)"
 msgstr ""
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/notes.c:864
 #, c-format
-msgid "failed to remove '%s'"
+msgid ""
+"Automatic notes merge failed. Fix conflicts in %s and commit the result with "
+"'git notes merge --commit', or abort the merge with 'git notes merge --"
+"abort'.\n"
 msgstr ""
 
-#: builtin/replace.c:19
-msgid "git replace [-f] <object> <replacement>"
+#: builtin/notes.c:886
+#, c-format
+msgid "Object %s has no note\n"
 msgstr ""
 
-#: builtin/replace.c:20
-msgid "git replace [-f] --edit <object>"
+#: builtin/notes.c:898
+msgid "attempt to remove non-existent note is not an error"
 msgstr ""
 
-#: builtin/replace.c:21
-msgid "git replace [-f] --graft <commit> [<parent>...]"
+#: builtin/notes.c:901
+msgid "read object names from the standard input"
 msgstr ""
 
-#: builtin/replace.c:22
-msgid "git replace -d <object>..."
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
 msgstr ""
 
-#: builtin/replace.c:23
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
+#: builtin/notes.c:940
+msgid "report pruned notes"
 msgstr ""
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
-#, c-format
-msgid "Not a valid object name: '%s'"
+#: builtin/notes.c:982
+msgid "notes-ref"
 msgstr ""
 
-#: builtin/replace.c:355
-#, c-format
-msgid "bad mergetag in commit '%s'"
+#: builtin/notes.c:983
+msgid "use notes from <notes-ref>"
 msgstr ""
 
-#: builtin/replace.c:357
+#: builtin/notes.c:1018
 #, c-format
-msgid "malformed mergetag in commit '%s'"
+msgid "unknown subcommand: %s"
 msgstr ""
 
-#: builtin/replace.c:368
-#, c-format
+#: builtin/pack-objects.c:29
 msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
+"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 
-#: builtin/replace.c:401
-#, c-format
-msgid "the original commit '%s' has a gpg signature."
+#: builtin/pack-objects.c:30
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
 
-#: builtin/replace.c:402
-msgid "the signature will be removed in the replacement commit!"
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
+#, c-format
+msgid "deflate error (%d)"
 msgstr ""
 
-#: builtin/replace.c:408
-#, c-format
-msgid "could not write replacement commit for: '%s'"
+#: builtin/pack-objects.c:770
+msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 
-#: builtin/replace.c:432
-msgid "list replace refs"
+#: builtin/pack-objects.c:783
+msgid "Writing objects"
 msgstr ""
 
-#: builtin/replace.c:433
-msgid "delete replace refs"
+#: builtin/pack-objects.c:1063
+msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 
-#: builtin/replace.c:434
-msgid "edit existing object"
+#: builtin/pack-objects.c:2426
+msgid "Compressing objects"
 msgstr ""
 
-#: builtin/replace.c:435
-msgid "change a commit's parents"
+#: builtin/pack-objects.c:2829
+#, c-format
+msgid "unsupported index version %s"
 msgstr ""
 
-#: builtin/replace.c:436
-msgid "replace the ref if it exists"
+#: builtin/pack-objects.c:2833
+#, c-format
+msgid "bad index version '%s'"
 msgstr ""
 
-#: builtin/replace.c:437
-msgid "do not pretty-print contents for --edit"
+#: builtin/pack-objects.c:2863
+msgid "do not show progress meter"
 msgstr ""
 
-#: builtin/replace.c:438
-msgid "use this format"
+#: builtin/pack-objects.c:2865
+msgid "show progress meter"
 msgstr ""
 
-#: builtin/rerere.c:12
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+#: builtin/pack-objects.c:2867
+msgid "show progress meter during object writing phase"
 msgstr ""
 
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
+#: builtin/pack-objects.c:2870
+msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 
-#: builtin/reset.c:26
-msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+#: builtin/pack-objects.c:2871
+msgid "version[,offset]"
 msgstr ""
 
-#: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
+#: builtin/pack-objects.c:2872
+msgid "write the pack index file in the specified idx format version"
 msgstr ""
 
-#: builtin/reset.c:28
-msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+#: builtin/pack-objects.c:2875
+msgid "maximum size of each output pack file"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "mixed"
+#: builtin/pack-objects.c:2877
+msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "soft"
+#: builtin/pack-objects.c:2879
+msgid "ignore packed objects"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "hard"
+#: builtin/pack-objects.c:2881
+msgid "limit pack window by objects"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "merge"
+#: builtin/pack-objects.c:2883
+msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "keep"
+#: builtin/pack-objects.c:2885
+msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 
-#: builtin/reset.c:74
-msgid "You do not have a valid HEAD."
+#: builtin/pack-objects.c:2887
+msgid "reuse existing deltas"
 msgstr ""
 
-#: builtin/reset.c:76
-msgid "Failed to find tree of HEAD."
+#: builtin/pack-objects.c:2889
+msgid "reuse existing objects"
 msgstr ""
 
-#: builtin/reset.c:82
-#, c-format
-msgid "Failed to find tree of %s."
+#: builtin/pack-objects.c:2891
+msgid "use OFS_DELTA objects"
 msgstr ""
 
-#: builtin/reset.c:100
-#, c-format
-msgid "HEAD is now at %s"
+#: builtin/pack-objects.c:2893
+msgid "use threads when searching for best delta matches"
 msgstr ""
 
-#: builtin/reset.c:183
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
+#: builtin/pack-objects.c:2895
+msgid "do not create an empty pack output"
 msgstr ""
 
-#: builtin/reset.c:276
-msgid "be quiet, only report errors"
+#: builtin/pack-objects.c:2897
+msgid "read revision arguments from standard input"
 msgstr ""
 
-#: builtin/reset.c:278
-msgid "reset HEAD and index"
+#: builtin/pack-objects.c:2899
+msgid "limit the objects to those that are not yet packed"
 msgstr ""
 
-#: builtin/reset.c:279
-msgid "reset only HEAD"
+#: builtin/pack-objects.c:2902
+msgid "include objects reachable from any reference"
 msgstr ""
 
-#: builtin/reset.c:281 builtin/reset.c:283
-msgid "reset HEAD, index and working tree"
+#: builtin/pack-objects.c:2905
+msgid "include objects referred by reflog entries"
 msgstr ""
 
-#: builtin/reset.c:285
-msgid "reset HEAD but keep local changes"
+#: builtin/pack-objects.c:2908
+msgid "include objects referred to by the index"
 msgstr ""
 
-#: builtin/reset.c:288
-msgid "record only the fact that removed paths will be added later"
+#: builtin/pack-objects.c:2911
+msgid "output pack to stdout"
 msgstr ""
 
-#: builtin/reset.c:305
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
+#: builtin/pack-objects.c:2913
+msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 
-#: builtin/reset.c:313
-#, c-format
-msgid "Failed to resolve '%s' as a valid tree."
+#: builtin/pack-objects.c:2915
+msgid "keep unreachable objects"
 msgstr ""
 
-#: builtin/reset.c:322
-msgid "--patch is incompatible with --{hard,mixed,soft}"
+#: builtin/pack-objects.c:2917
+msgid "pack loose unreachable objects"
 msgstr ""
 
-#: builtin/reset.c:331
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+#: builtin/pack-objects.c:2919
+msgid "unpack unreachable objects newer than <time>"
 msgstr ""
 
-#: builtin/reset.c:333
-#, c-format
-msgid "Cannot do %s reset with paths."
+#: builtin/pack-objects.c:2922
+msgid "create thin packs"
 msgstr ""
 
-#: builtin/reset.c:343
-#, c-format
-msgid "%s reset is not allowed in a bare repository"
+#: builtin/pack-objects.c:2924
+msgid "create packs suitable for shallow fetches"
 msgstr ""
 
-#: builtin/reset.c:347
-msgid "-N can only be used with --mixed"
+#: builtin/pack-objects.c:2926
+msgid "ignore packs that have companion .keep file"
 msgstr ""
 
-#: builtin/reset.c:364
-msgid "Unstaged changes after reset:"
+#: builtin/pack-objects.c:2928
+msgid "pack compression level"
 msgstr ""
 
-#: builtin/reset.c:370
-#, c-format
-msgid "Could not reset index file to revision '%s'."
+#: builtin/pack-objects.c:2930
+msgid "do not hide commits by grafts"
 msgstr ""
 
-#: builtin/reset.c:374
-msgid "Could not write new index file."
+#: builtin/pack-objects.c:2932
+msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 
-#: builtin/rev-list.c:362
-msgid "rev-list does not support display of notes"
+#: builtin/pack-objects.c:2934
+msgid "write a bitmap index together with the pack index"
 msgstr ""
 
-#: builtin/rev-parse.c:358
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+#: builtin/pack-objects.c:3061
+msgid "Counting objects"
 msgstr ""
 
-#: builtin/rev-parse.c:363
-msgid "keep the `--` passed as an arg"
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [<options>]"
 msgstr ""
 
-#: builtin/rev-parse.c:365
-msgid "stop parsing after the first non-option argument"
+#: builtin/pack-refs.c:14
+msgid "pack everything"
 msgstr ""
 
-#: builtin/rev-parse.c:368
-msgid "output in stuck long form"
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
 msgstr ""
 
-#: builtin/rev-parse.c:499
-msgid ""
-"git rev-parse --parseopt [<options>] -- [<args>...]\n"
-"   or: git rev-parse --sq-quote [<arg>...]\n"
-"   or: git rev-parse [<options>] [<arg>...]\n"
-"\n"
-"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
 msgstr ""
 
-#: builtin/revert.c:22
-msgid "git revert [<options>] <commit-ish>..."
+#: builtin/prune-packed.c:40
+msgid "Removing duplicate objects"
 msgstr ""
 
-#: builtin/revert.c:23
-msgid "git revert <subcommand>"
+#: builtin/prune.c:11
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr ""
 
-#: builtin/revert.c:28
-msgid "git cherry-pick [<options>] <commit-ish>..."
+#: builtin/prune.c:106
+msgid "report pruned objects"
 msgstr ""
 
-#: builtin/revert.c:29
-msgid "git cherry-pick <subcommand>"
+#: builtin/prune.c:109
+msgid "expire objects older than <time>"
+msgstr ""
+
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
 msgstr ""
 
-#: builtin/revert.c:71
+#: builtin/pull.c:51 builtin/pull.c:53
 #, c-format
-msgid "%s: %s cannot be used with %s"
+msgid "Invalid value for %s: %s"
 msgstr ""
 
-#: builtin/revert.c:80
-msgid "end revert or cherry-pick sequence"
+#: builtin/pull.c:73
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 
-#: builtin/revert.c:81
-msgid "resume revert or cherry-pick sequence"
+#: builtin/pull.c:121
+msgid "Options related to merging"
 msgstr ""
 
-#: builtin/revert.c:82
-msgid "cancel revert or cherry-pick sequence"
+#: builtin/pull.c:124
+msgid "incorporate changes by rebasing rather than merging"
 msgstr ""
 
-#: builtin/revert.c:83
-msgid "don't automatically commit"
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
+msgid "allow fast-forward"
 msgstr ""
 
-#: builtin/revert.c:84
-msgid "edit the commit message"
+#: builtin/pull.c:157
+msgid "automatically stash/stash pop before and after rebase"
 msgstr ""
 
-#: builtin/revert.c:87
-msgid "parent number"
+#: builtin/pull.c:173
+msgid "Options related to fetching"
 msgstr ""
 
-#: builtin/revert.c:89
-msgid "merge strategy"
+#: builtin/pull.c:195
+msgid "number of submodules pulled in parallel"
 msgstr ""
 
-#: builtin/revert.c:90
-msgid "option"
+#: builtin/pull.c:284
+#, c-format
+msgid "Invalid value for pull.ff: %s"
 msgstr ""
 
-#: builtin/revert.c:91
-msgid "option for merge strategy"
+#: builtin/pull.c:397
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
 msgstr ""
 
-#: builtin/revert.c:100
-msgid "append commit name"
+#: builtin/pull.c:399
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 
-#: builtin/revert.c:102
-msgid "preserve initially empty commits"
+#: builtin/pull.c:400
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
 msgstr ""
 
-#: builtin/revert.c:103
-msgid "allow commits with empty messages"
+#: builtin/pull.c:403
+#, c-format
+msgid ""
+"You asked to pull from the remote '%s', but did not specify\n"
+"a branch. Because this is not the default configured remote\n"
+"for your current branch, you must specify a branch on the command line."
 msgstr ""
 
-#: builtin/revert.c:104
-msgid "keep redundant, empty commits"
+#: builtin/pull.c:408 git-parse-remote.sh:73
+msgid "You are not currently on a branch."
 msgstr ""
 
-#: builtin/revert.c:192
-msgid "revert failed"
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
+msgid "Please specify which branch you want to rebase against."
 msgstr ""
 
-#: builtin/revert.c:207
-msgid "cherry-pick failed"
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
+msgid "Please specify which branch you want to merge with."
 msgstr ""
 
-#: builtin/rm.c:17
-msgid "git rm [<options>] [--] <file>..."
+#: builtin/pull.c:413 builtin/pull.c:428
+msgid "See git-pull(1) for details."
 msgstr ""
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
+#: git-parse-remote.sh:64
+msgid "<remote>"
+msgstr ""
 
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
+#: git-parse-remote.sh:65
+msgid "<branch>"
 msgstr ""
 
-#: builtin/rm.c:230
-msgid ""
-"the following file has staged content different from both the\n"
-"file and the HEAD:"
-msgid_plural ""
-"the following files have staged content different from both the\n"
-"file and the HEAD:"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/pull.c:423 git-parse-remote.sh:75
+msgid "There is no tracking information for the current branch."
+msgstr ""
 
-#: builtin/rm.c:235
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
-"\n"
-"(use -f to force removal)"
+"If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
 
-#: builtin/rm.c:239
-msgid "the following file has changes staged in the index:"
-msgid_plural "the following files have changes staged in the index:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/pull.c:437
+#, c-format
 msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
 msgstr ""
 
-#: builtin/rm.c:251
-msgid "the following file has local modifications:"
-msgid_plural "the following files have local modifications:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/rm.c:269
-msgid "do not list removed files"
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
 msgstr ""
 
-#: builtin/rm.c:270
-msgid "only remove from the index"
+#: builtin/pull.c:801
+msgid "--[no-]autostash option is only valid with --rebase."
 msgstr ""
 
-#: builtin/rm.c:271
-msgid "override the up-to-date check"
+#: builtin/pull.c:809
+msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 
-#: builtin/rm.c:272
-msgid "allow recursive removal"
+#: builtin/pull.c:812
+msgid "pull with rebase"
 msgstr ""
 
-#: builtin/rm.c:274
-msgid "exit with a zero status even if nothing matched"
+#: builtin/pull.c:813
+msgid "please commit or stash them."
 msgstr ""
 
-#: builtin/rm.c:335
+#: builtin/pull.c:838
 #, c-format
-msgid "not removing '%s' recursively without -r"
+msgid ""
+"fetch updated the current branch head.\n"
+"fast-forwarding your working tree from\n"
+"commit %s."
 msgstr ""
 
-#: builtin/rm.c:374
+#: builtin/pull.c:843
 #, c-format
-msgid "git rm: unable to remove %s"
-msgstr ""
-
-#: builtin/send-pack.c:18
 msgid ""
-"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
-"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> "
-"[<ref>...]\n"
-"  --all and explicit <ref> specification are mutually exclusive."
-msgstr ""
-
-#: builtin/send-pack.c:160
-msgid "remote name"
-msgstr ""
-
-#: builtin/send-pack.c:171
-msgid "use stateless RPC protocol"
+"Cannot fast-forward your working tree.\n"
+"After making sure that you saved anything precious from\n"
+"$ git diff %s\n"
+"output, run\n"
+"$ git reset --hard\n"
+"to recover."
 msgstr ""
 
-#: builtin/send-pack.c:172
-msgid "read refs from stdin"
+#: builtin/pull.c:858
+msgid "Cannot merge multiple branches into empty head."
 msgstr ""
 
-#: builtin/send-pack.c:173
-msgid "print status from remote helper"
+#: builtin/pull.c:862
+msgid "Cannot rebase onto multiple branches."
 msgstr ""
 
-#: builtin/shortlog.c:13
-msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+#: builtin/push.c:16
+msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 
-#: builtin/shortlog.c:242
-msgid "sort output according to the number of commits per author"
+#: builtin/push.c:89
+msgid "tag shorthand without <tag>"
 msgstr ""
 
-#: builtin/shortlog.c:244
-msgid "Suppress commit descriptions, only provides commit count"
+#: builtin/push.c:99
+msgid "--delete only accepts plain target ref names"
 msgstr ""
 
-#: builtin/shortlog.c:246
-msgid "Show the email address of each author"
+#: builtin/push.c:143
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 
-#: builtin/shortlog.c:247
-msgid "w[,i1[,i2]]"
-msgstr ""
-
-#: builtin/shortlog.c:248
-msgid "Linewrap output"
+#: builtin/push.c:146
+#, c-format
+msgid ""
+"The upstream branch of your current branch does not match\n"
+"the name of your current branch.  To push to the upstream branch\n"
+"on the remote, use\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"To push to the branch of the same name on the remote, use\n"
+"\n"
+"    git push %s %s\n"
+"%s"
 msgstr ""
 
-#: builtin/show-branch.c:10
+#: builtin/push.c:161
+#, c-format
 msgid ""
-"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
-"\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
-"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
-"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
+"You are not currently on a branch.\n"
+"To push the history leading to the current (detached HEAD)\n"
+"state now, use\n"
+"\n"
+"    git push %s HEAD:<name-of-remote-branch>\n"
 msgstr ""
 
-#: builtin/show-branch.c:14
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
+#: builtin/push.c:175
+#, c-format
+msgid ""
+"The current branch %s has no upstream branch.\n"
+"To push the current branch and set the remote as upstream, use\n"
+"\n"
+"    git push --set-upstream %s %s\n"
 msgstr ""
 
-#: builtin/show-branch.c:640
-msgid "show remote-tracking and local branches"
+#: builtin/push.c:183
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 
-#: builtin/show-branch.c:642
-msgid "show remote-tracking branches"
+#: builtin/push.c:186
+#, c-format
+msgid ""
+"You are pushing to remote '%s', which is not the upstream of\n"
+"your current branch '%s', without telling me what to push\n"
+"to update which remote branch."
 msgstr ""
 
-#: builtin/show-branch.c:644
-msgid "color '*!+-' corresponding to the branch"
+#: builtin/push.c:245
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 
-#: builtin/show-branch.c:646
-msgid "show <n> more commits after the common ancestor"
+#: builtin/push.c:252
+msgid ""
+"Updates were rejected because the tip of your current branch is behind\n"
+"its remote counterpart. Integrate the remote changes (e.g.\n"
+"'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/show-branch.c:648
-msgid "synonym to more=-1"
+#: builtin/push.c:258
+msgid ""
+"Updates were rejected because a pushed branch tip is behind its remote\n"
+"counterpart. Check out this branch and integrate the remote changes\n"
+"(e.g. 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/show-branch.c:649
-msgid "suppress naming strings"
+#: builtin/push.c:264
+msgid ""
+"Updates were rejected because the remote contains work that you do\n"
+"not have locally. This is usually caused by another repository pushing\n"
+"to the same ref. You may want to first integrate the remote changes\n"
+"(e.g., 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/show-branch.c:651
-msgid "include the current branch"
+#: builtin/push.c:271
+msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 
-#: builtin/show-branch.c:653
-msgid "name commits with their object names"
+#: builtin/push.c:274
+msgid ""
+"You cannot update a remote ref that points at a non-commit object,\n"
+"or update a remote ref to make it point at a non-commit object,\n"
+"without using the '--force' option.\n"
 msgstr ""
 
-#: builtin/show-branch.c:655
-msgid "show possible merge bases"
+#: builtin/push.c:334
+#, c-format
+msgid "Pushing to %s\n"
 msgstr ""
 
-#: builtin/show-branch.c:657
-msgid "show refs unreachable from any other ref"
+#: builtin/push.c:338
+#, c-format
+msgid "failed to push some refs to '%s'"
 msgstr ""
 
-#: builtin/show-branch.c:659
-msgid "show commits in topological order"
+#: builtin/push.c:369
+#, c-format
+msgid "bad repository '%s'"
 msgstr ""
 
-#: builtin/show-branch.c:662
-msgid "show only commits not on the first branch"
+#: builtin/push.c:370
+msgid ""
+"No configured push destination.\n"
+"Either specify the URL from the command-line or configure a remote "
+"repository using\n"
+"\n"
+"    git remote add <name> <url>\n"
+"\n"
+"and then push using the remote name\n"
+"\n"
+"    git push <name>\n"
 msgstr ""
 
-#: builtin/show-branch.c:664
-msgid "show merges reachable from only one tip"
+#: builtin/push.c:388
+msgid "--all and --tags are incompatible"
 msgstr ""
 
-#: builtin/show-branch.c:666
-msgid "topologically sort, maintaining date order where possible"
+#: builtin/push.c:389
+msgid "--all can't be combined with refspecs"
 msgstr ""
 
-#: builtin/show-branch.c:669
-msgid "<n>[,<base>]"
+#: builtin/push.c:394
+msgid "--mirror and --tags are incompatible"
 msgstr ""
 
-#: builtin/show-branch.c:670
-msgid "show <n> most recent ref-log entries starting at base"
+#: builtin/push.c:395
+msgid "--mirror can't be combined with refspecs"
 msgstr ""
 
-#: builtin/show-ref.c:10
-msgid ""
-"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
+#: builtin/push.c:400
+msgid "--all and --mirror are incompatible"
 msgstr ""
 
-#: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>]"
+#: builtin/push.c:518
+msgid "repository"
 msgstr ""
 
-#: builtin/show-ref.c:165
-msgid "only show tags (can be combined with heads)"
+#: builtin/push.c:519 builtin/send-pack.c:162
+msgid "push all refs"
 msgstr ""
 
-#: builtin/show-ref.c:166
-msgid "only show heads (can be combined with tags)"
+#: builtin/push.c:520 builtin/send-pack.c:164
+msgid "mirror all refs"
 msgstr ""
 
-#: builtin/show-ref.c:167
-msgid "stricter reference checking, requires exact ref path"
+#: builtin/push.c:522
+msgid "delete refs"
 msgstr ""
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
-msgid "show the HEAD reference, even if it would be filtered out"
+#: builtin/push.c:523
+msgid "push tags (can't be used with --all or --mirror)"
 msgstr ""
 
-#: builtin/show-ref.c:174
-msgid "dereference tags into object IDs"
+#: builtin/push.c:526 builtin/send-pack.c:165
+msgid "force updates"
 msgstr ""
 
-#: builtin/show-ref.c:176
-msgid "only show SHA1 hash using <n> digits"
+#: builtin/push.c:528 builtin/send-pack.c:179
+msgid "refname>:<expect"
 msgstr ""
 
-#: builtin/show-ref.c:180
-msgid "do not print results to stdout (useful with --verify)"
+#: builtin/push.c:529 builtin/send-pack.c:180
+msgid "require old value of ref to be at this value"
 msgstr ""
 
-#: builtin/show-ref.c:182
-msgid "show refs from stdin that aren't in local repository"
+#: builtin/push.c:532
+msgid "control recursive pushing of submodules"
 msgstr ""
 
-#: builtin/stripspace.c:17
-msgid "git stripspace [-s | --strip-comments]"
+#: builtin/push.c:534 builtin/send-pack.c:173
+msgid "use thin pack"
 msgstr ""
 
-#: builtin/stripspace.c:18
-msgid "git stripspace [-c | --comment-lines]"
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
+msgid "receive pack program"
 msgstr ""
 
-#: builtin/stripspace.c:35
-msgid "skip and remove all lines starting with comment character"
+#: builtin/push.c:537
+msgid "set upstream for git pull/status"
 msgstr ""
 
-#: builtin/stripspace.c:38
-msgid "prepend comment character and space to each line"
+#: builtin/push.c:540
+msgid "prune locally removed refs"
 msgstr ""
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
-#, c-format
-msgid "No such ref: %s"
+#: builtin/push.c:542
+msgid "bypass pre-push hook"
 msgstr ""
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
-#, c-format
-msgid "Expecting a full ref name, got %s"
+#: builtin/push.c:543
+msgid "push missing but relevant tags"
 msgstr ""
 
-#: builtin/submodule--helper.c:71
-#, c-format
-msgid "cannot strip one component off url '%s'"
+#: builtin/push.c:546 builtin/send-pack.c:167
+msgid "GPG sign the push"
 msgstr ""
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
-msgid "alternative anchor for relative paths"
+#: builtin/push.c:548 builtin/send-pack.c:174
+msgid "request atomic transaction on remote side"
 msgstr ""
 
-#: builtin/submodule--helper.c:283
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+#: builtin/push.c:549 builtin/send-pack.c:170
+msgid "server-specific"
 msgstr ""
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
-#, c-format
-msgid "No url found for submodule path '%s' in .gitmodules"
+#: builtin/push.c:549 builtin/send-pack.c:171
+msgid "option to transmit"
 msgstr ""
 
-#: builtin/submodule--helper.c:364
-#, c-format
-msgid "Failed to register url for submodule path '%s'"
+#: builtin/push.c:563
+msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
 
-#: builtin/submodule--helper.c:368
-#, c-format
-msgid "Submodule '%s' (%s) registered for path '%s'\n"
+#: builtin/push.c:565
+msgid "--delete doesn't make sense without any refs"
 msgstr ""
 
-#: builtin/submodule--helper.c:378
-#, c-format
-msgid "warning: command update mode suggested for submodule '%s'\n"
+#: builtin/push.c:584
+msgid "push options must not have new line characters"
 msgstr ""
 
-#: builtin/submodule--helper.c:385
-#, c-format
-msgid "Failed to register update mode for submodule path '%s'"
+#: builtin/read-tree.c:40
+msgid ""
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
 msgstr ""
 
-#: builtin/submodule--helper.c:404
-msgid "Suppress output for initializing a submodule"
+#: builtin/read-tree.c:130
+msgid "write resulting index to <file>"
 msgstr ""
 
-#: builtin/submodule--helper.c:409
-msgid "git submodule--helper init [<path>]"
+#: builtin/read-tree.c:133
+msgid "only empty the index"
 msgstr ""
 
-#: builtin/submodule--helper.c:430
-msgid "git submodule--helper name <path>"
+#: builtin/read-tree.c:135
+msgid "Merging"
 msgstr ""
 
-#: builtin/submodule--helper.c:436
-#, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
+#: builtin/read-tree.c:137
+msgid "perform a merge in addition to a read"
 msgstr ""
 
-#: builtin/submodule--helper.c:486
-msgid "where the new submodule will be cloned to"
+#: builtin/read-tree.c:139
+msgid "3-way merge if no file level merging required"
 msgstr ""
 
-#: builtin/submodule--helper.c:489
-msgid "name of the new submodule"
+#: builtin/read-tree.c:141
+msgid "3-way merge in presence of adds and removes"
 msgstr ""
 
-#: builtin/submodule--helper.c:492
-msgid "url where to clone the submodule from"
+#: builtin/read-tree.c:143
+msgid "same as -m, but discard unmerged entries"
 msgstr ""
 
-#: builtin/submodule--helper.c:498
-msgid "depth for shallow clones"
+#: builtin/read-tree.c:144
+msgid "<subdirectory>/"
 msgstr ""
 
-#: builtin/submodule--helper.c:504
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
+#: builtin/read-tree.c:145
+msgid "read the tree into the index under <subdirectory>/"
 msgstr ""
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
+#: builtin/read-tree.c:148
+msgid "update working tree with merge result"
 msgstr ""
 
-#: builtin/submodule--helper.c:531
-#, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
+#: builtin/read-tree.c:150
+msgid "gitignore"
 msgstr ""
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
+#: builtin/read-tree.c:151
+msgid "allow explicitly ignored files to be overwritten"
 msgstr ""
 
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
+#: builtin/read-tree.c:154
+msgid "don't check the working tree after merging"
 msgstr ""
 
-#: builtin/submodule--helper.c:559
-#, c-format
-msgid "could not get submodule directory for '%s'"
+#: builtin/read-tree.c:155
+msgid "don't update the index or the work tree"
 msgstr ""
 
-#: builtin/submodule--helper.c:611
-#, c-format
-msgid "Submodule path '%s' not initialized"
+#: builtin/read-tree.c:157
+msgid "skip applying sparse checkout filter"
 msgstr ""
 
-#: builtin/submodule--helper.c:615
-msgid "Maybe you want to use 'update --init'?"
+#: builtin/read-tree.c:159
+msgid "debug unpack-trees"
 msgstr ""
 
-#: builtin/submodule--helper.c:641
-#, c-format
-msgid "Skipping unmerged submodule %s"
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
 msgstr ""
 
-#: builtin/submodule--helper.c:662
-#, c-format
-msgid "Skipping submodule '%s'"
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
 msgstr ""
 
-#: builtin/submodule--helper.c:792
-#, c-format
-msgid "Failed to clone '%s'. Retry scheduled"
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
 msgstr ""
 
-#: builtin/submodule--helper.c:803
-#, c-format
-msgid "Failed to clone '%s' a second time, aborting"
+#: builtin/receive-pack.c:27
+msgid "git receive-pack <git-dir>"
 msgstr ""
 
-#: builtin/submodule--helper.c:824
-msgid "path into the working tree"
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
 msgstr ""
 
-#: builtin/submodule--helper.c:827
-msgid "path into the working tree, across nested submodule boundaries"
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
 msgstr ""
 
-#: builtin/submodule--helper.c:831
-msgid "rebase, merge, checkout or none"
+#: builtin/receive-pack.c:1888
+msgid "quiet"
 msgstr ""
 
-#: builtin/submodule--helper.c:835
-msgid "Create a shallow clone truncated to the specified number of revisions"
+#: builtin/receive-pack.c:1902
+msgid "You must specify a directory."
 msgstr ""
 
-#: builtin/submodule--helper.c:838
-msgid "parallel jobs"
+#: builtin/reflog.c:423
+#, c-format
+msgid "'%s' for '%s' is not a valid timestamp"
 msgstr ""
 
-#: builtin/submodule--helper.c:840
-msgid "whether the initial clone should follow the shallow recommendation"
+#: builtin/reflog.c:540 builtin/reflog.c:545
+#, c-format
+msgid "'%s' is not a valid timestamp"
 msgstr ""
 
-#: builtin/submodule--helper.c:841
-msgid "don't print cloning progress"
+#: builtin/remote.c:12
+msgid "git remote [-v | --verbose]"
 msgstr ""
 
-#: builtin/submodule--helper.c:846
-msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+#: builtin/remote.c:13
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
 msgstr ""
 
-#: builtin/submodule--helper.c:856
-msgid "bad value for update parameter"
+#: builtin/remote.c:14 builtin/remote.c:34
+msgid "git remote rename <old> <new>"
 msgstr ""
 
-#: builtin/submodule--helper.c:927
-#, c-format
-msgid ""
-"Submodule (%s) branch configured to inherit branch from superproject, but "
-"the superproject is not on any branch"
+#: builtin/remote.c:15 builtin/remote.c:39
+msgid "git remote remove <name>"
 msgstr ""
 
-#: builtin/submodule--helper.c:977
-msgid "submodule--helper subcommand must be called with a subcommand"
+#: builtin/remote.c:16 builtin/remote.c:44
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
 msgstr ""
 
-#: builtin/submodule--helper.c:984
-#, c-format
-msgid "'%s' is not a valid submodule--helper subcommand"
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
 msgstr ""
 
-#: builtin/symbolic-ref.c:7
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
 msgstr ""
 
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref -d [-q] <name>"
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
 msgstr ""
 
-#: builtin/symbolic-ref.c:40
-msgid "suppress error message for non-symbolic (detached) refs"
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
 msgstr ""
 
-#: builtin/symbolic-ref.c:41
-msgid "delete symbolic ref"
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
 msgstr ""
 
-#: builtin/symbolic-ref.c:42
-msgid "shorten ref output"
+#: builtin/remote.c:22 builtin/remote.c:75
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
 msgstr ""
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason"
+#: builtin/remote.c:23 builtin/remote.c:76
+msgid "git remote set-url --add <name> <newurl>"
 msgstr ""
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason of the update"
+#: builtin/remote.c:24 builtin/remote.c:77
+msgid "git remote set-url --delete <name> <url>"
 msgstr ""
 
-#: builtin/tag.c:23
-msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
-"[<head>]"
+#: builtin/remote.c:29
+msgid "git remote add [<options>] <name> <url>"
 msgstr ""
 
-#: builtin/tag.c:24
-msgid "git tag -d <tagname>..."
+#: builtin/remote.c:49
+msgid "git remote set-branches <name> <branch>..."
 msgstr ""
 
-#: builtin/tag.c:25
-msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+#: builtin/remote.c:50
+msgid "git remote set-branches --add <name> <branch>..."
 msgstr ""
 
-#: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
+#: builtin/remote.c:55
+msgid "git remote show [<options>] <name>"
 msgstr ""
 
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
+#: builtin/remote.c:60
+msgid "git remote prune [<options>] <name>"
 msgstr ""
 
-#: builtin/tag.c:86
-#, c-format
-msgid "tag '%s' not found."
+#: builtin/remote.c:65
+msgid "git remote update [<options>] [<group> | <remote>]..."
 msgstr ""
 
-#: builtin/tag.c:101
+#: builtin/remote.c:94
 #, c-format
-msgid "Deleted tag '%s' (was %s)\n"
+msgid "Updating %s"
 msgstr ""
 
-#: builtin/tag.c:117
-#, c-format
+#: builtin/remote.c:126
 msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
 msgstr ""
 
-#: builtin/tag.c:121
+#: builtin/remote.c:143
 #, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be kept; you may remove them yourself if you "
-"want to.\n"
+msgid "unknown mirror argument: %s"
 msgstr ""
 
-#: builtin/tag.c:199
-msgid "unable to sign the tag"
+#: builtin/remote.c:159
+msgid "fetch the remote branches"
 msgstr ""
 
-#: builtin/tag.c:201
-msgid "unable to write tag file"
+#: builtin/remote.c:161
+msgid "import all tags and associated objects when fetching"
 msgstr ""
 
-#: builtin/tag.c:226
-msgid "bad object type."
+#: builtin/remote.c:164
+msgid "or do not fetch any tag at all (--no-tags)"
 msgstr ""
 
-#: builtin/tag.c:239
-msgid "tag header too big."
+#: builtin/remote.c:166
+msgid "branch(es) to track"
 msgstr ""
 
-#: builtin/tag.c:275
-msgid "no tag message?"
+#: builtin/remote.c:167
+msgid "master branch"
 msgstr ""
 
-#: builtin/tag.c:281
-#, c-format
-msgid "The tag message has been left in %s\n"
+#: builtin/remote.c:168
+msgid "push|fetch"
 msgstr ""
 
-#: builtin/tag.c:339
-msgid "list tag names"
+#: builtin/remote.c:169
+msgid "set up remote as a mirror to push to or fetch from"
 msgstr ""
 
-#: builtin/tag.c:341
-msgid "print <n> lines of each tag message"
+#: builtin/remote.c:181
+msgid "specifying a master branch makes no sense with --mirror"
 msgstr ""
 
-#: builtin/tag.c:343
-msgid "delete tags"
+#: builtin/remote.c:183
+msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr ""
 
-#: builtin/tag.c:344
-msgid "verify tags"
+#: builtin/remote.c:190 builtin/remote.c:629
+#, c-format
+msgid "remote %s already exists."
 msgstr ""
 
-#: builtin/tag.c:346
-msgid "Tag creation options"
+#: builtin/remote.c:194 builtin/remote.c:633
+#, c-format
+msgid "'%s' is not a valid remote name"
 msgstr ""
 
-#: builtin/tag.c:348
-msgid "annotated tag, needs a message"
+#: builtin/remote.c:234
+#, c-format
+msgid "Could not setup master '%s'"
 msgstr ""
 
-#: builtin/tag.c:350
-msgid "tag message"
+#: builtin/remote.c:336
+#, c-format
+msgid "Could not get fetch map for refspec %s"
 msgstr ""
 
-#: builtin/tag.c:352
-msgid "annotated and GPG-signed tag"
+#: builtin/remote.c:437 builtin/remote.c:445
+msgid "(matching)"
 msgstr ""
 
-#: builtin/tag.c:356
-msgid "use another key to sign the tag"
+#: builtin/remote.c:449
+msgid "(delete)"
 msgstr ""
 
-#: builtin/tag.c:357
-msgid "replace the tag if exists"
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
+#, c-format
+msgid "No such remote: %s"
 msgstr ""
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
-msgid "create a reflog"
+#: builtin/remote.c:639
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
 msgstr ""
 
-#: builtin/tag.c:360
-msgid "Tag listing options"
+#: builtin/remote.c:659
+#, c-format
+msgid ""
+"Not updating non-default fetch refspec\n"
+"\t%s\n"
+"\tPlease update the configuration manually if necessary."
 msgstr ""
 
-#: builtin/tag.c:361
-msgid "show tag list in columns"
+#: builtin/remote.c:695
+#, c-format
+msgid "deleting '%s' failed"
 msgstr ""
 
-#: builtin/tag.c:362 builtin/tag.c:363
-msgid "print only tags that contain the commit"
+#: builtin/remote.c:729
+#, c-format
+msgid "creating '%s' failed"
 msgstr ""
 
-#: builtin/tag.c:364
-msgid "print only tags that are merged"
-msgstr ""
+#: builtin/remote.c:794
+msgid ""
+"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
+"to delete it, use:"
+msgid_plural ""
+"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
+"to delete them, use:"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/tag.c:365
-msgid "print only tags that are not merged"
+#: builtin/remote.c:808
+#, c-format
+msgid "Could not remove config section '%s'"
 msgstr ""
 
-#: builtin/tag.c:370
-msgid "print only tags of the object"
+#: builtin/remote.c:909
+#, c-format
+msgid " new (next fetch will store in remotes/%s)"
 msgstr ""
 
-#: builtin/tag.c:399
-msgid "--column and -n are incompatible"
+#: builtin/remote.c:912
+msgid " tracked"
 msgstr ""
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
+#: builtin/remote.c:914
+msgid " stale (use 'git remote prune' to remove)"
 msgstr ""
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
+#: builtin/remote.c:916
+msgid " ???"
 msgstr ""
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
+#: builtin/remote.c:957
+#, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr ""
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
+#: builtin/remote.c:965
+#, c-format
+msgid "rebases interactively onto remote %s"
 msgstr ""
 
-#: builtin/tag.c:433
-msgid "only one -F or -m option is allowed."
+#: builtin/remote.c:966
+#, c-format
+msgid "rebases onto remote %s"
 msgstr ""
 
-#: builtin/tag.c:452
-msgid "too many params"
+#: builtin/remote.c:969
+#, c-format
+msgid " merges with remote %s"
 msgstr ""
 
-#: builtin/tag.c:458
+#: builtin/remote.c:972
 #, c-format
-msgid "'%s' is not a valid tag name."
+msgid "merges with remote %s"
 msgstr ""
 
-#: builtin/tag.c:463
+#: builtin/remote.c:975
 #, c-format
-msgid "tag '%s' already exists"
+msgid "%-*s    and with remote %s\n"
 msgstr ""
 
-#: builtin/tag.c:491
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
+#: builtin/remote.c:1018
+msgid "create"
 msgstr ""
 
-#: builtin/unpack-objects.c:490
-msgid "Unpacking objects"
+#: builtin/remote.c:1021
+msgid "delete"
 msgstr ""
 
-#: builtin/update-index.c:79
-#, c-format
-msgid "failed to create directory %s"
+#: builtin/remote.c:1025
+msgid "up to date"
 msgstr ""
 
-#: builtin/update-index.c:85
-#, c-format
-msgid "failed to stat %s"
+#: builtin/remote.c:1028
+msgid "fast-forwardable"
 msgstr ""
 
-#: builtin/update-index.c:95
+#: builtin/remote.c:1031
+msgid "local out of date"
+msgstr ""
+
+#: builtin/remote.c:1038
 #, c-format
-msgid "failed to create file %s"
+msgid "    %-*s forces to %-*s (%s)"
 msgstr ""
 
-#: builtin/update-index.c:103
+#: builtin/remote.c:1041
 #, c-format
-msgid "failed to delete file %s"
+msgid "    %-*s pushes to %-*s (%s)"
 msgstr ""
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/remote.c:1045
 #, c-format
-msgid "failed to delete directory %s"
+msgid "    %-*s forces to %s"
 msgstr ""
 
-#: builtin/update-index.c:133
+#: builtin/remote.c:1048
 #, c-format
-msgid "Testing mtime in '%s' "
+msgid "    %-*s pushes to %s"
 msgstr ""
 
-#: builtin/update-index.c:145
-msgid "directory stat info does not change after adding a new file"
+#: builtin/remote.c:1116
+msgid "do not query remotes"
 msgstr ""
 
-#: builtin/update-index.c:158
-msgid "directory stat info does not change after adding a new directory"
+#: builtin/remote.c:1143
+#, c-format
+msgid "* remote %s"
 msgstr ""
 
-#: builtin/update-index.c:171
-msgid "directory stat info changes after updating a file"
+#: builtin/remote.c:1144
+#, c-format
+msgid "  Fetch URL: %s"
 msgstr ""
 
-#: builtin/update-index.c:182
-msgid "directory stat info changes after adding a file inside subdirectory"
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
+msgid "(no URL)"
 msgstr ""
 
-#: builtin/update-index.c:193
-msgid "directory stat info does not change after deleting a file"
+#. TRANSLATORS: the colon ':' should align with
+#. the one in "  Fetch URL: %s" translation
+#: builtin/remote.c:1156 builtin/remote.c:1158
+#, c-format
+msgid "  Push  URL: %s"
 msgstr ""
 
-#: builtin/update-index.c:206
-msgid "directory stat info does not change after deleting a directory"
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
+#, c-format
+msgid "  HEAD branch: %s"
 msgstr ""
 
-#: builtin/update-index.c:213
-msgid " OK"
+#: builtin/remote.c:1160
+msgid "(not queried)"
 msgstr ""
 
-#: builtin/update-index.c:575
-msgid "git update-index [<options>] [--] [<file>...]"
+#: builtin/remote.c:1162
+msgid "(unknown)"
 msgstr ""
 
-#: builtin/update-index.c:930
-msgid "continue refresh even when index needs update"
+#: builtin/remote.c:1166
+#, c-format
+msgid ""
+"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
 
-#: builtin/update-index.c:933
-msgid "refresh: ignore submodules"
-msgstr ""
+#: builtin/remote.c:1178
+#, c-format
+msgid "  Remote branch:%s"
+msgid_plural "  Remote branches:%s"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/update-index.c:936
-msgid "do not ignore new files"
+#: builtin/remote.c:1181 builtin/remote.c:1207
+msgid " (status not queried)"
 msgstr ""
 
-#: builtin/update-index.c:938
-msgid "let files replace directories and vice-versa"
-msgstr ""
+#: builtin/remote.c:1190
+msgid "  Local branch configured for 'git pull':"
+msgid_plural "  Local branches configured for 'git pull':"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/update-index.c:940
-msgid "notice files missing from worktree"
+#: builtin/remote.c:1198
+msgid "  Local refs will be mirrored by 'git push'"
 msgstr ""
 
-#: builtin/update-index.c:942
-msgid "refresh even if index contains unmerged entries"
-msgstr ""
+#: builtin/remote.c:1204
+#, c-format
+msgid "  Local ref configured for 'git push'%s:"
+msgid_plural "  Local refs configured for 'git push'%s:"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/update-index.c:945
-msgid "refresh stat information"
+#: builtin/remote.c:1225
+msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr ""
 
-#: builtin/update-index.c:949
-msgid "like --refresh, but ignore assume-unchanged setting"
+#: builtin/remote.c:1227
+msgid "delete refs/remotes/<name>/HEAD"
 msgstr ""
 
-#: builtin/update-index.c:953
-msgid "<mode>,<object>,<path>"
+#: builtin/remote.c:1242
+msgid "Cannot determine remote HEAD"
 msgstr ""
 
-#: builtin/update-index.c:954
-msgid "add the specified entry to the index"
+#: builtin/remote.c:1244
+msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 
-#: builtin/update-index.c:963
-msgid "mark files as \"not changing\""
+#: builtin/remote.c:1254
+#, c-format
+msgid "Could not delete %s"
 msgstr ""
 
-#: builtin/update-index.c:966
-msgid "clear assumed-unchanged bit"
+#: builtin/remote.c:1262
+#, c-format
+msgid "Not a valid ref: %s"
 msgstr ""
 
-#: builtin/update-index.c:969
-msgid "mark files as \"index-only\""
+#: builtin/remote.c:1264
+#, c-format
+msgid "Could not setup %s"
 msgstr ""
 
-#: builtin/update-index.c:972
-msgid "clear skip-worktree bit"
+#: builtin/remote.c:1282
+#, c-format
+msgid " %s will become dangling!"
 msgstr ""
 
-#: builtin/update-index.c:975
-msgid "add to index only; do not add content to object database"
+#: builtin/remote.c:1283
+#, c-format
+msgid " %s has become dangling!"
 msgstr ""
 
-#: builtin/update-index.c:977
-msgid "remove named paths even if present in worktree"
+#: builtin/remote.c:1293
+#, c-format
+msgid "Pruning %s"
 msgstr ""
 
-#: builtin/update-index.c:979
-msgid "with --stdin: input lines are terminated by null bytes"
+#: builtin/remote.c:1294
+#, c-format
+msgid "URL: %s"
 msgstr ""
 
-#: builtin/update-index.c:981
-msgid "read list of paths to be updated from standard input"
+#: builtin/remote.c:1310
+#, c-format
+msgid " * [would prune] %s"
 msgstr ""
 
-#: builtin/update-index.c:985
-msgid "add entries from standard input to the index"
+#: builtin/remote.c:1313
+#, c-format
+msgid " * [pruned] %s"
 msgstr ""
 
-#: builtin/update-index.c:989
-msgid "repopulate stages #2 and #3 for the listed paths"
+#: builtin/remote.c:1358
+msgid "prune remotes after fetching"
 msgstr ""
 
-#: builtin/update-index.c:993
-msgid "only update entries that differ from HEAD"
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
+#, c-format
+msgid "No such remote '%s'"
 msgstr ""
 
-#: builtin/update-index.c:997
-msgid "ignore files missing from worktree"
+#: builtin/remote.c:1437
+msgid "add branch"
 msgstr ""
 
-#: builtin/update-index.c:1000
-msgid "report actions to standard output"
+#: builtin/remote.c:1444
+msgid "no remote specified"
 msgstr ""
 
-#: builtin/update-index.c:1002
-msgid "(for porcelains) forget saved unresolved conflicts"
+#: builtin/remote.c:1461
+msgid "query push URLs rather than fetch URLs"
 msgstr ""
 
-#: builtin/update-index.c:1006
-msgid "write index in this format"
+#: builtin/remote.c:1463
+msgid "return all URLs"
 msgstr ""
 
-#: builtin/update-index.c:1008
-msgid "enable or disable split index"
+#: builtin/remote.c:1491
+#, c-format
+msgid "no URLs configured for remote '%s'"
 msgstr ""
 
-#: builtin/update-index.c:1010
-msgid "enable/disable untracked cache"
+#: builtin/remote.c:1517
+msgid "manipulate push URLs"
 msgstr ""
 
-#: builtin/update-index.c:1012
-msgid "test if the filesystem supports untracked cache"
+#: builtin/remote.c:1519
+msgid "add URL"
 msgstr ""
 
-#: builtin/update-index.c:1014
-msgid "enable untracked cache without testing the filesystem"
+#: builtin/remote.c:1521
+msgid "delete URLs"
 msgstr ""
 
-#: builtin/update-index.c:1134
-msgid "Untracked cache disabled"
+#: builtin/remote.c:1528
+msgid "--add --delete doesn't make sense"
 msgstr ""
 
-#: builtin/update-index.c:1146
+#: builtin/remote.c:1569
 #, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr ""
-
-#: builtin/update-ref.c:9
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr ""
-
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+msgid "Invalid old URL pattern: %s"
 msgstr ""
 
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>] --stdin [-z]"
+#: builtin/remote.c:1577
+#, c-format
+msgid "No such URL found: %s"
 msgstr ""
 
-#: builtin/update-ref.c:363
-msgid "delete the reference"
+#: builtin/remote.c:1579
+msgid "Will not delete all non-push URLs"
 msgstr ""
 
-#: builtin/update-ref.c:365
-msgid "update <refname> not the one it points to"
+#: builtin/remote.c:1593
+msgid "be verbose; must be placed before a subcommand"
 msgstr ""
 
-#: builtin/update-ref.c:366
-msgid "stdin has NUL-terminated arguments"
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
 msgstr ""
 
-#: builtin/update-ref.c:367
-msgid "read updates from stdin"
+#: builtin/repack.c:17
+msgid "git repack [<options>]"
 msgstr ""
 
-#: builtin/update-server-info.c:6
-msgid "git update-server-info [--force]"
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
 msgstr ""
 
-#: builtin/update-server-info.c:14
-msgid "update the info files from scratch"
+#: builtin/repack.c:166
+msgid "pack everything in a single pack"
 msgstr ""
 
-#: builtin/verify-commit.c:17
-msgid "git verify-commit [-v | --verbose] <commit>..."
+#: builtin/repack.c:168
+msgid "same as -a, and turn unreachable objects loose"
 msgstr ""
 
-#: builtin/verify-commit.c:72
-msgid "print commit contents"
+#: builtin/repack.c:171
+msgid "remove redundant packs, and run git-prune-packed"
 msgstr ""
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
-msgid "print raw gpg status output"
+#: builtin/repack.c:173
+msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr ""
 
-#: builtin/verify-pack.c:54
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+#: builtin/repack.c:175
+msgid "pass --no-reuse-object to git-pack-objects"
 msgstr ""
 
-#: builtin/verify-pack.c:64
-msgid "verbose"
+#: builtin/repack.c:177
+msgid "do not run git-update-server-info"
 msgstr ""
 
-#: builtin/verify-pack.c:66
-msgid "show statistics only"
+#: builtin/repack.c:180
+msgid "pass --local to git-pack-objects"
 msgstr ""
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
+#: builtin/repack.c:182
+msgid "write bitmap index"
 msgstr ""
 
-#: builtin/verify-tag.c:34
-msgid "print tag contents"
+#: builtin/repack.c:183
+msgid "approxidate"
 msgstr ""
 
-#: builtin/worktree.c:15
-msgid "git worktree add [<options>] <path> [<branch>]"
+#: builtin/repack.c:184
+msgid "with -A, do not loosen objects older than this"
 msgstr ""
 
-#: builtin/worktree.c:16
-msgid "git worktree list [<options>]"
+#: builtin/repack.c:186
+msgid "with -a, repack unreachable objects"
 msgstr ""
 
-#: builtin/worktree.c:17
-msgid "git worktree lock [<options>] <path>"
+#: builtin/repack.c:188
+msgid "size of the window used for delta compression"
 msgstr ""
 
-#: builtin/worktree.c:18
-msgid "git worktree prune [<options>]"
+#: builtin/repack.c:189 builtin/repack.c:193
+msgid "bytes"
 msgstr ""
 
-#: builtin/worktree.c:19
-msgid "git worktree unlock <path>"
+#: builtin/repack.c:190
+msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 
-#: builtin/worktree.c:42
-#, c-format
-msgid "Removing worktrees/%s: not a valid directory"
+#: builtin/repack.c:192
+msgid "limits the maximum delta depth"
 msgstr ""
 
-#: builtin/worktree.c:48
-#, c-format
-msgid "Removing worktrees/%s: gitdir file does not exist"
+#: builtin/repack.c:194
+msgid "maximum size of each packfile"
 msgstr ""
 
-#: builtin/worktree.c:53
-#, c-format
-msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
+#: builtin/repack.c:196
+msgid "repack objects in packs marked with .keep"
 msgstr ""
 
-#: builtin/worktree.c:64
-#, c-format
-msgid "Removing worktrees/%s: invalid gitdir file"
+#: builtin/repack.c:206
+msgid "cannot delete packs in a precious-objects repo"
 msgstr ""
 
-#: builtin/worktree.c:80
-#, c-format
-msgid "Removing worktrees/%s: gitdir file points to non-existent location"
+#: builtin/repack.c:210
+msgid "--keep-unreachable and -A are incompatible"
 msgstr ""
 
-#: builtin/worktree.c:204
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
-msgid "'%s' already exists"
+msgid "failed to remove '%s'"
 msgstr ""
 
-#: builtin/worktree.c:236
-#, c-format
-msgid "could not create directory of '%s'"
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
 msgstr ""
 
-#: builtin/worktree.c:272
-#, c-format
-msgid "Preparing %s (identifier %s)"
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
 msgstr ""
 
-#: builtin/worktree.c:323
-msgid "checkout <branch> even if already checked out in other worktree"
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
 msgstr ""
 
-#: builtin/worktree.c:325
-msgid "create a new branch"
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
 msgstr ""
 
-#: builtin/worktree.c:327
-msgid "create or reset a branch"
+#: builtin/replace.c:23
+msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr ""
 
-#: builtin/worktree.c:329
-msgid "populate the new working tree"
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
+#, c-format
+msgid "Not a valid object name: '%s'"
 msgstr ""
 
-#: builtin/worktree.c:337
-msgid "-b, -B, and --detach are mutually exclusive"
+#: builtin/replace.c:360
+#, c-format
+msgid "bad mergetag in commit '%s'"
 msgstr ""
 
-#: builtin/worktree.c:470
-msgid "reason for locking"
+#: builtin/replace.c:362
+#, c-format
+msgid "malformed mergetag in commit '%s'"
 msgstr ""
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/replace.c:373
 #, c-format
-msgid "'%s' is not a working tree"
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
 msgstr ""
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
-msgid "The main working tree cannot be locked or unlocked"
+#: builtin/replace.c:406
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
 msgstr ""
 
-#: builtin/worktree.c:489
-#, c-format
-msgid "'%s' is already locked, reason: %s"
+#: builtin/replace.c:407
+msgid "the signature will be removed in the replacement commit!"
 msgstr ""
 
-#: builtin/worktree.c:491
+#: builtin/replace.c:413
 #, c-format
-msgid "'%s' is already locked"
+msgid "could not write replacement commit for: '%s'"
 msgstr ""
 
-#: builtin/worktree.c:519
-#, c-format
-msgid "'%s' is not locked"
+#: builtin/replace.c:437
+msgid "list replace refs"
 msgstr ""
 
-#: builtin/write-tree.c:13
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+#: builtin/replace.c:438
+msgid "delete replace refs"
 msgstr ""
 
-#: builtin/write-tree.c:26
-msgid "<prefix>/"
+#: builtin/replace.c:439
+msgid "edit existing object"
 msgstr ""
 
-#: builtin/write-tree.c:27
-msgid "write tree object for a subdirectory <prefix>"
+#: builtin/replace.c:440
+msgid "change a commit's parents"
 msgstr ""
 
-#: builtin/write-tree.c:30
-msgid "only useful for debugging"
+#: builtin/replace.c:441
+msgid "replace the ref if it exists"
 msgstr ""
 
-#: upload-pack.c:20
-msgid "git upload-pack [<options>] <dir>"
+#: builtin/replace.c:442
+msgid "do not pretty-print contents for --edit"
 msgstr ""
 
-#: upload-pack.c:837
-msgid "quit after a single request/response exchange"
+#: builtin/replace.c:443
+msgid "use this format"
 msgstr ""
 
-#: upload-pack.c:839
-msgid "exit immediately after initial ref advertisement"
+#: builtin/rerere.c:12
+msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr ""
 
-#: upload-pack.c:841
-msgid "do not try <directory>/.git/ if <directory> is no Git directory"
+#: builtin/rerere.c:58
+msgid "register clean resolutions in index"
 msgstr ""
 
-#: upload-pack.c:843
+#: builtin/reset.c:26
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr ""
+
+#: builtin/reset.c:27
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr ""
+
+#: builtin/reset.c:28
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr ""
+
+#: builtin/reset.c:34
+msgid "mixed"
+msgstr ""
+
+#: builtin/reset.c:34
+msgid "soft"
+msgstr ""
+
+#: builtin/reset.c:34
+msgid "hard"
+msgstr ""
+
+#: builtin/reset.c:34
+msgid "merge"
+msgstr ""
+
+#: builtin/reset.c:34
+msgid "keep"
+msgstr ""
+
+#: builtin/reset.c:74
+msgid "You do not have a valid HEAD."
+msgstr ""
+
+#: builtin/reset.c:76
+msgid "Failed to find tree of HEAD."
+msgstr ""
+
+#: builtin/reset.c:82
+#, c-format
+msgid "Failed to find tree of %s."
+msgstr ""
+
+#: builtin/reset.c:100
+#, c-format
+msgid "HEAD is now at %s"
+msgstr ""
+
+#: builtin/reset.c:183
+#, c-format
+msgid "Cannot do a %s reset in the middle of a merge."
+msgstr ""
+
+#: builtin/reset.c:276
+msgid "be quiet, only report errors"
+msgstr ""
+
+#: builtin/reset.c:278
+msgid "reset HEAD and index"
+msgstr ""
+
+#: builtin/reset.c:279
+msgid "reset only HEAD"
+msgstr ""
+
+#: builtin/reset.c:281 builtin/reset.c:283
+msgid "reset HEAD, index and working tree"
+msgstr ""
+
+#: builtin/reset.c:285
+msgid "reset HEAD but keep local changes"
+msgstr ""
+
+#: builtin/reset.c:288
+msgid "record only the fact that removed paths will be added later"
+msgstr ""
+
+#: builtin/reset.c:305
+#, c-format
+msgid "Failed to resolve '%s' as a valid revision."
+msgstr ""
+
+#: builtin/reset.c:313
+#, c-format
+msgid "Failed to resolve '%s' as a valid tree."
+msgstr ""
+
+#: builtin/reset.c:322
+msgid "--patch is incompatible with --{hard,mixed,soft}"
+msgstr ""
+
+#: builtin/reset.c:331
+msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+msgstr ""
+
+#: builtin/reset.c:333
+#, c-format
+msgid "Cannot do %s reset with paths."
+msgstr ""
+
+#: builtin/reset.c:343
+#, c-format
+msgid "%s reset is not allowed in a bare repository"
+msgstr ""
+
+#: builtin/reset.c:347
+msgid "-N can only be used with --mixed"
+msgstr ""
+
+#: builtin/reset.c:364
+msgid "Unstaged changes after reset:"
+msgstr ""
+
+#: builtin/reset.c:370
+#, c-format
+msgid "Could not reset index file to revision '%s'."
+msgstr ""
+
+#: builtin/reset.c:374
+msgid "Could not write new index file."
+msgstr ""
+
+#: builtin/rev-list.c:354
+msgid "rev-list does not support display of notes"
+msgstr ""
+
+#: builtin/rev-parse.c:393
+msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+msgstr ""
+
+#: builtin/rev-parse.c:398
+msgid "keep the `--` passed as an arg"
+msgstr ""
+
+#: builtin/rev-parse.c:400
+msgid "stop parsing after the first non-option argument"
+msgstr ""
+
+#: builtin/rev-parse.c:403
+msgid "output in stuck long form"
+msgstr ""
+
+#: builtin/rev-parse.c:534
+msgid ""
+"git rev-parse --parseopt [<options>] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [<options>] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+msgstr ""
+
+#: builtin/revert.c:22
+msgid "git revert [<options>] <commit-ish>..."
+msgstr ""
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr ""
+
+#: builtin/revert.c:28
+msgid "git cherry-pick [<options>] <commit-ish>..."
+msgstr ""
+
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr ""
+
+#: builtin/revert.c:89
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr ""
+
+#: builtin/revert.c:98
+msgid "end revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:99
+msgid "resume revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:100
+msgid "cancel revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:101
+msgid "don't automatically commit"
+msgstr ""
+
+#: builtin/revert.c:102
+msgid "edit the commit message"
+msgstr ""
+
+#: builtin/revert.c:105
+msgid "parent-number"
+msgstr ""
+
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr ""
+
+#: builtin/revert.c:108
+msgid "merge strategy"
+msgstr ""
+
+#: builtin/revert.c:109
+msgid "option"
+msgstr ""
+
+#: builtin/revert.c:110
+msgid "option for merge strategy"
+msgstr ""
+
+#: builtin/revert.c:119
+msgid "append commit name"
+msgstr ""
+
+#: builtin/revert.c:121
+msgid "preserve initially empty commits"
+msgstr ""
+
+#: builtin/revert.c:122
+msgid "allow commits with empty messages"
+msgstr ""
+
+#: builtin/revert.c:123
+msgid "keep redundant, empty commits"
+msgstr ""
+
+#: builtin/revert.c:211
+msgid "revert failed"
+msgstr ""
+
+#: builtin/revert.c:224
+msgid "cherry-pick failed"
+msgstr ""
+
+#: builtin/rm.c:17
+msgid "git rm [<options>] [--] <file>..."
+msgstr ""
+
+#: builtin/rm.c:205
+msgid ""
+"the following file has staged content different from both the\n"
+"file and the HEAD:"
+msgid_plural ""
+"the following files have staged content different from both the\n"
+"file and the HEAD:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/rm.c:210
+msgid ""
+"\n"
+"(use -f to force removal)"
+msgstr ""
+
+#: builtin/rm.c:214
+msgid "the following file has changes staged in the index:"
+msgid_plural "the following files have changes staged in the index:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/rm.c:218 builtin/rm.c:227
+msgid ""
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
+msgstr ""
+
+#: builtin/rm.c:224
+msgid "the following file has local modifications:"
+msgid_plural "the following files have local modifications:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/rm.c:242
+msgid "do not list removed files"
+msgstr ""
+
+#: builtin/rm.c:243
+msgid "only remove from the index"
+msgstr ""
+
+#: builtin/rm.c:244
+msgid "override the up-to-date check"
+msgstr ""
+
+#: builtin/rm.c:245
+msgid "allow recursive removal"
+msgstr ""
+
+#: builtin/rm.c:247
+msgid "exit with a zero status even if nothing matched"
+msgstr ""
+
+#: builtin/rm.c:308
+#, c-format
+msgid "not removing '%s' recursively without -r"
+msgstr ""
+
+#: builtin/rm.c:347
+#, c-format
+msgid "git rm: unable to remove %s"
+msgstr ""
+
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr ""
+
+#: builtin/send-pack.c:18
+msgid ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
+"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> "
+"[<ref>...]\n"
+"  --all and explicit <ref> specification are mutually exclusive."
+msgstr ""
+
+#: builtin/send-pack.c:161
+msgid "remote name"
+msgstr ""
+
+#: builtin/send-pack.c:175
+msgid "use stateless RPC protocol"
+msgstr ""
+
+#: builtin/send-pack.c:176
+msgid "read refs from stdin"
+msgstr ""
+
+#: builtin/send-pack.c:177
+msgid "print status from remote helper"
+msgstr ""
+
+#: builtin/shortlog.c:13
+msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+msgstr ""
+
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr ""
+
+#: builtin/shortlog.c:250
+msgid "sort output according to the number of commits per author"
+msgstr ""
+
+#: builtin/shortlog.c:252
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr ""
+
+#: builtin/shortlog.c:254
+msgid "Show the email address of each author"
+msgstr ""
+
+#: builtin/shortlog.c:255
+msgid "w[,i1[,i2]]"
+msgstr ""
+
+#: builtin/shortlog.c:256
+msgid "Linewrap output"
+msgstr ""
+
+#: builtin/show-branch.c:10
+msgid ""
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
+msgstr ""
+
+#: builtin/show-branch.c:14
+msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr ""
+
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr ""
+
+#: builtin/show-branch.c:632
+msgid "show remote-tracking and local branches"
+msgstr ""
+
+#: builtin/show-branch.c:634
+msgid "show remote-tracking branches"
+msgstr ""
+
+#: builtin/show-branch.c:636
+msgid "color '*!+-' corresponding to the branch"
+msgstr ""
+
+#: builtin/show-branch.c:638
+msgid "show <n> more commits after the common ancestor"
+msgstr ""
+
+#: builtin/show-branch.c:640
+msgid "synonym to more=-1"
+msgstr ""
+
+#: builtin/show-branch.c:641
+msgid "suppress naming strings"
+msgstr ""
+
+#: builtin/show-branch.c:643
+msgid "include the current branch"
+msgstr ""
+
+#: builtin/show-branch.c:645
+msgid "name commits with their object names"
+msgstr ""
+
+#: builtin/show-branch.c:647
+msgid "show possible merge bases"
+msgstr ""
+
+#: builtin/show-branch.c:649
+msgid "show refs unreachable from any other ref"
+msgstr ""
+
+#: builtin/show-branch.c:651
+msgid "show commits in topological order"
+msgstr ""
+
+#: builtin/show-branch.c:654
+msgid "show only commits not on the first branch"
+msgstr ""
+
+#: builtin/show-branch.c:656
+msgid "show merges reachable from only one tip"
+msgstr ""
+
+#: builtin/show-branch.c:658
+msgid "topologically sort, maintaining date order where possible"
+msgstr ""
+
+#: builtin/show-branch.c:661
+msgid "<n>[,<base>]"
+msgstr ""
+
+#: builtin/show-branch.c:662
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr ""
+
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr ""
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr ""
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr ""
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr ""
+
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr ""
+
+#: builtin/show-ref.c:10
+msgid ""
+"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
+msgstr ""
+
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr ""
+
+#: builtin/show-ref.c:159
+msgid "only show tags (can be combined with heads)"
+msgstr ""
+
+#: builtin/show-ref.c:160
+msgid "only show heads (can be combined with tags)"
+msgstr ""
+
+#: builtin/show-ref.c:161
+msgid "stricter reference checking, requires exact ref path"
+msgstr ""
+
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
+msgid "show the HEAD reference, even if it would be filtered out"
+msgstr ""
+
+#: builtin/show-ref.c:168
+msgid "dereference tags into object IDs"
+msgstr ""
+
+#: builtin/show-ref.c:170
+msgid "only show SHA1 hash using <n> digits"
+msgstr ""
+
+#: builtin/show-ref.c:174
+msgid "do not print results to stdout (useful with --verify)"
+msgstr ""
+
+#: builtin/show-ref.c:176
+msgid "show refs from stdin that aren't in local repository"
+msgstr ""
+
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr ""
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr ""
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr ""
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and space to each line"
+msgstr ""
+
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
+#, c-format
+msgid "No such ref: %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
+msgid "alternative anchor for relative paths"
+msgstr ""
+
+#: builtin/submodule--helper.c:310
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr ""
+
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
+#, c-format
+msgid "No url found for submodule path '%s' in .gitmodules"
+msgstr ""
+
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr ""
+
+#: builtin/submodule--helper.c:406
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:410
+#, c-format
+msgid "Submodule '%s' (%s) registered for path '%s'\n"
+msgstr ""
+
+#: builtin/submodule--helper.c:420
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr ""
+
+#: builtin/submodule--helper.c:427
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:443
+msgid "Suppress output for initializing a submodule"
+msgstr ""
+
+#: builtin/submodule--helper.c:448
+msgid "git submodule--helper init [<path>]"
+msgstr ""
+
+#: builtin/submodule--helper.c:476
+msgid "git submodule--helper name <path>"
+msgstr ""
+
+#: builtin/submodule--helper.c:482
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr ""
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr ""
+
+#: builtin/submodule--helper.c:633
+msgid "where the new submodule will be cloned to"
+msgstr ""
+
+#: builtin/submodule--helper.c:636
+msgid "name of the new submodule"
+msgstr ""
+
+#: builtin/submodule--helper.c:639
+msgid "url where to clone the submodule from"
+msgstr ""
+
+#: builtin/submodule--helper.c:645
+msgid "depth for shallow clones"
+msgstr ""
+
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr ""
+
+#: builtin/submodule--helper.c:653
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
+msgstr ""
+
+#: builtin/submodule--helper.c:684
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr ""
+
+#: builtin/submodule--helper.c:699
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:764
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr ""
+
+#: builtin/submodule--helper.c:768
+msgid "Maybe you want to use 'update --init'?"
+msgstr ""
+
+#: builtin/submodule--helper.c:793
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:814
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:942
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr ""
+
+#: builtin/submodule--helper.c:953
+#, c-format
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr ""
+
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
+msgid "path into the working tree"
+msgstr ""
+
+#: builtin/submodule--helper.c:977
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr ""
+
+#: builtin/submodule--helper.c:981
+msgid "rebase, merge, checkout or none"
+msgstr ""
+
+#: builtin/submodule--helper.c:985
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr ""
+
+#: builtin/submodule--helper.c:988
+msgid "parallel jobs"
+msgstr ""
+
+#: builtin/submodule--helper.c:990
+msgid "whether the initial clone should follow the shallow recommendation"
+msgstr ""
+
+#: builtin/submodule--helper.c:991
+msgid "don't print cloning progress"
+msgstr ""
+
+#: builtin/submodule--helper.c:998
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr ""
+
+#: builtin/submodule--helper.c:1008
+msgid "bad value for update parameter"
+msgstr ""
+
+#: builtin/submodule--helper.c:1079
+#, c-format
+msgid ""
+"Submodule (%s) branch configured to inherit branch from superproject, but "
+"the superproject is not on any branch"
+msgstr ""
+
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr ""
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr ""
+
+#: builtin/submodule--helper.c:1226
+msgid "submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr ""
+
+#: builtin/submodule--helper.c:1239
+#, c-format
+msgid "'%s' is not a valid submodule--helper subcommand"
+msgstr ""
+
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [<options>] <name> [<ref>]"
+msgstr ""
+
+#: builtin/symbolic-ref.c:8
+msgid "git symbolic-ref -d [-q] <name>"
+msgstr ""
+
+#: builtin/symbolic-ref.c:40
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr ""
+
+#: builtin/symbolic-ref.c:41
+msgid "delete symbolic ref"
+msgstr ""
+
+#: builtin/symbolic-ref.c:42
+msgid "shorten ref output"
+msgstr ""
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason"
+msgstr ""
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason of the update"
+msgstr ""
+
+#: builtin/tag.c:23
+msgid ""
+"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
+"[<head>]"
+msgstr ""
+
+#: builtin/tag.c:24
+msgid "git tag -d <tagname>..."
+msgstr ""
+
+#: builtin/tag.c:25
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+msgstr ""
+
+#: builtin/tag.c:27
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr ""
+
+#: builtin/tag.c:83
+#, c-format
+msgid "tag '%s' not found."
+msgstr ""
+
+#: builtin/tag.c:99
+#, c-format
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr ""
+
+#: builtin/tag.c:128
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
+msgstr ""
+
+#: builtin/tag.c:132
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be kept; you may remove them yourself if you "
+"want to.\n"
+msgstr ""
+
+#: builtin/tag.c:210
+msgid "unable to sign the tag"
+msgstr ""
+
+#: builtin/tag.c:212
+msgid "unable to write tag file"
+msgstr ""
+
+#: builtin/tag.c:236
+msgid "bad object type."
+msgstr ""
+
+#: builtin/tag.c:282
+msgid "no tag message?"
+msgstr ""
+
+#: builtin/tag.c:289
+#, c-format
+msgid "The tag message has been left in %s\n"
+msgstr ""
+
+#: builtin/tag.c:397
+msgid "list tag names"
+msgstr ""
+
+#: builtin/tag.c:399
+msgid "print <n> lines of each tag message"
+msgstr ""
+
+#: builtin/tag.c:401
+msgid "delete tags"
+msgstr ""
+
+#: builtin/tag.c:402
+msgid "verify tags"
+msgstr ""
+
+#: builtin/tag.c:404
+msgid "Tag creation options"
+msgstr ""
+
+#: builtin/tag.c:406
+msgid "annotated tag, needs a message"
+msgstr ""
+
+#: builtin/tag.c:408
+msgid "tag message"
+msgstr ""
+
+#: builtin/tag.c:410
+msgid "annotated and GPG-signed tag"
+msgstr ""
+
+#: builtin/tag.c:414
+msgid "use another key to sign the tag"
+msgstr ""
+
+#: builtin/tag.c:415
+msgid "replace the tag if exists"
+msgstr ""
+
+#: builtin/tag.c:416 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr ""
+
+#: builtin/tag.c:418
+msgid "Tag listing options"
+msgstr ""
+
+#: builtin/tag.c:419
+msgid "show tag list in columns"
+msgstr ""
+
+#: builtin/tag.c:420 builtin/tag.c:422
+msgid "print only tags that contain the commit"
+msgstr ""
+
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr ""
+
+#: builtin/tag.c:424
+msgid "print only tags that are merged"
+msgstr ""
+
+#: builtin/tag.c:425
+msgid "print only tags that are not merged"
+msgstr ""
+
+#: builtin/tag.c:430
+msgid "print only tags of the object"
+msgstr ""
+
+#: builtin/tag.c:469
+msgid "--column and -n are incompatible"
+msgstr ""
+
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr ""
+
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr ""
+
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr ""
+
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr ""
+
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr ""
+
+#: builtin/tag.c:510
+msgid "only one -F or -m option is allowed."
+msgstr ""
+
+#: builtin/tag.c:529
+msgid "too many params"
+msgstr ""
+
+#: builtin/tag.c:535
+#, c-format
+msgid "'%s' is not a valid tag name."
+msgstr ""
+
+#: builtin/tag.c:540
+#, c-format
+msgid "tag '%s' already exists"
+msgstr ""
+
+#: builtin/tag.c:570
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
+msgstr ""
+
+#: builtin/unpack-objects.c:493
+msgid "Unpacking objects"
+msgstr ""
+
+#: builtin/update-index.c:79
+#, c-format
+msgid "failed to create directory %s"
+msgstr ""
+
+#: builtin/update-index.c:85
+#, c-format
+msgid "failed to stat %s"
+msgstr ""
+
+#: builtin/update-index.c:95
+#, c-format
+msgid "failed to create file %s"
+msgstr ""
+
+#: builtin/update-index.c:103
+#, c-format
+msgid "failed to delete file %s"
+msgstr ""
+
+#: builtin/update-index.c:110 builtin/update-index.c:216
+#, c-format
+msgid "failed to delete directory %s"
+msgstr ""
+
+#: builtin/update-index.c:135
+#, c-format
+msgid "Testing mtime in '%s' "
+msgstr ""
+
+#: builtin/update-index.c:149
+msgid "directory stat info does not change after adding a new file"
+msgstr ""
+
+#: builtin/update-index.c:162
+msgid "directory stat info does not change after adding a new directory"
+msgstr ""
+
+#: builtin/update-index.c:175
+msgid "directory stat info changes after updating a file"
+msgstr ""
+
+#: builtin/update-index.c:186
+msgid "directory stat info changes after adding a file inside subdirectory"
+msgstr ""
+
+#: builtin/update-index.c:197
+msgid "directory stat info does not change after deleting a file"
+msgstr ""
+
+#: builtin/update-index.c:210
+msgid "directory stat info does not change after deleting a directory"
+msgstr ""
+
+#: builtin/update-index.c:217
+msgid " OK"
+msgstr ""
+
+#: builtin/update-index.c:568
+msgid "git update-index [<options>] [--] [<file>...]"
+msgstr ""
+
+#: builtin/update-index.c:923
+msgid "continue refresh even when index needs update"
+msgstr ""
+
+#: builtin/update-index.c:926
+msgid "refresh: ignore submodules"
+msgstr ""
+
+#: builtin/update-index.c:929
+msgid "do not ignore new files"
+msgstr ""
+
+#: builtin/update-index.c:931
+msgid "let files replace directories and vice-versa"
+msgstr ""
+
+#: builtin/update-index.c:933
+msgid "notice files missing from worktree"
+msgstr ""
+
+#: builtin/update-index.c:935
+msgid "refresh even if index contains unmerged entries"
+msgstr ""
+
+#: builtin/update-index.c:938
+msgid "refresh stat information"
+msgstr ""
+
+#: builtin/update-index.c:942
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr ""
+
+#: builtin/update-index.c:946
+msgid "<mode>,<object>,<path>"
+msgstr ""
+
+#: builtin/update-index.c:947
+msgid "add the specified entry to the index"
+msgstr ""
+
+#: builtin/update-index.c:956
+msgid "mark files as \"not changing\""
+msgstr ""
+
+#: builtin/update-index.c:959
+msgid "clear assumed-unchanged bit"
+msgstr ""
+
+#: builtin/update-index.c:962
+msgid "mark files as \"index-only\""
+msgstr ""
+
+#: builtin/update-index.c:965
+msgid "clear skip-worktree bit"
+msgstr ""
+
+#: builtin/update-index.c:968
+msgid "add to index only; do not add content to object database"
+msgstr ""
+
+#: builtin/update-index.c:970
+msgid "remove named paths even if present in worktree"
+msgstr ""
+
+#: builtin/update-index.c:972
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr ""
+
+#: builtin/update-index.c:974
+msgid "read list of paths to be updated from standard input"
+msgstr ""
+
+#: builtin/update-index.c:978
+msgid "add entries from standard input to the index"
+msgstr ""
+
+#: builtin/update-index.c:982
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr ""
+
+#: builtin/update-index.c:986
+msgid "only update entries that differ from HEAD"
+msgstr ""
+
+#: builtin/update-index.c:990
+msgid "ignore files missing from worktree"
+msgstr ""
+
+#: builtin/update-index.c:993
+msgid "report actions to standard output"
+msgstr ""
+
+#: builtin/update-index.c:995
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr ""
+
+#: builtin/update-index.c:999
+msgid "write index in this format"
+msgstr ""
+
+#: builtin/update-index.c:1001
+msgid "enable or disable split index"
+msgstr ""
+
+#: builtin/update-index.c:1003
+msgid "enable/disable untracked cache"
+msgstr ""
+
+#: builtin/update-index.c:1005
+msgid "test if the filesystem supports untracked cache"
+msgstr ""
+
+#: builtin/update-index.c:1007
+msgid "enable untracked cache without testing the filesystem"
+msgstr ""
+
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+
+#: builtin/update-index.c:1131
+msgid "Untracked cache disabled"
+msgstr ""
+
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+
+#: builtin/update-index.c:1143
+#, c-format
+msgid "Untracked cache enabled for '%s'"
+msgstr ""
+
+#: builtin/update-ref.c:9
+msgid "git update-ref [<options>] -d <refname> [<old-val>]"
+msgstr ""
+
+#: builtin/update-ref.c:10
+msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+msgstr ""
+
+#: builtin/update-ref.c:11
+msgid "git update-ref [<options>] --stdin [-z]"
+msgstr ""
+
+#: builtin/update-ref.c:363
+msgid "delete the reference"
+msgstr ""
+
+#: builtin/update-ref.c:365
+msgid "update <refname> not the one it points to"
+msgstr ""
+
+#: builtin/update-ref.c:366
+msgid "stdin has NUL-terminated arguments"
+msgstr ""
+
+#: builtin/update-ref.c:367
+msgid "read updates from stdin"
+msgstr ""
+
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr ""
+
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr ""
+
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v | --verbose] <commit>..."
+msgstr ""
+
+#: builtin/verify-commit.c:72
+msgid "print commit contents"
+msgstr ""
+
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
+msgid "print raw gpg status output"
+msgstr ""
+
+#: builtin/verify-pack.c:54
+msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+msgstr ""
+
+#: builtin/verify-pack.c:64
+msgid "verbose"
+msgstr ""
+
+#: builtin/verify-pack.c:66
+msgid "show statistics only"
+msgstr ""
+
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr ""
+
+#: builtin/verify-tag.c:36
+msgid "print tag contents"
+msgstr ""
+
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr ""
+
+#: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr ""
+
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr ""
+
+#: builtin/worktree.c:18
+msgid "git worktree prune [<options>]"
+msgstr ""
+
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr ""
+
+#: builtin/worktree.c:43
+#, c-format
+msgid "Removing worktrees/%s: not a valid directory"
+msgstr ""
+
+#: builtin/worktree.c:49
+#, c-format
+msgid "Removing worktrees/%s: gitdir file does not exist"
+msgstr ""
+
+#: builtin/worktree.c:54
+#, c-format
+msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
+msgstr ""
+
+#: builtin/worktree.c:65
+#, c-format
+msgid "Removing worktrees/%s: invalid gitdir file"
+msgstr ""
+
+#: builtin/worktree.c:81
+#, c-format
+msgid "Removing worktrees/%s: gitdir file points to non-existent location"
+msgstr ""
+
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr ""
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr ""
+
+#: builtin/worktree.c:204
+#, c-format
+msgid "'%s' already exists"
+msgstr ""
+
+#: builtin/worktree.c:235
+#, c-format
+msgid "could not create directory of '%s'"
+msgstr ""
+
+#: builtin/worktree.c:274
+#, c-format
+msgid "Preparing %s (identifier %s)"
+msgstr ""
+
+#: builtin/worktree.c:328
+msgid "checkout <branch> even if already checked out in other worktree"
+msgstr ""
+
+#: builtin/worktree.c:330
+msgid "create a new branch"
+msgstr ""
+
+#: builtin/worktree.c:332
+msgid "create or reset a branch"
+msgstr ""
+
+#: builtin/worktree.c:334
+msgid "populate the new working tree"
+msgstr ""
+
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr ""
+
+#: builtin/worktree.c:343
+msgid "-b, -B, and --detach are mutually exclusive"
+msgstr ""
+
+#: builtin/worktree.c:478
+msgid "reason for locking"
+msgstr ""
+
+#: builtin/worktree.c:490 builtin/worktree.c:523
+#, c-format
+msgid "'%s' is not a working tree"
+msgstr ""
+
+#: builtin/worktree.c:492 builtin/worktree.c:525
+msgid "The main working tree cannot be locked or unlocked"
+msgstr ""
+
+#: builtin/worktree.c:497
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr ""
+
+#: builtin/worktree.c:499
+#, c-format
+msgid "'%s' is already locked"
+msgstr ""
+
+#: builtin/worktree.c:527
+#, c-format
+msgid "'%s' is not locked"
+msgstr ""
+
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr ""
+
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr ""
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr ""
+
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr ""
+
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr ""
+
+#: upload-pack.c:1040
+msgid "quit after a single request/response exchange"
+msgstr ""
+
+#: upload-pack.c:1042
+msgid "exit immediately after initial ref advertisement"
+msgstr ""
+
+#: upload-pack.c:1044
+msgid "do not try <directory>/.git/ if <directory> is no Git directory"
+msgstr ""
+
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr ""
 
-#: credential-cache--daemon.c:271
-msgid "print debugging messages to stderr"
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+
+#: credential-cache--daemon.c:271
+msgid "print debugging messages to stderr"
+msgstr ""
+
+#: git.c:14
+msgid ""
+"'git help -a' and 'git help -g' list available subcommands and some\n"
+"concept guides. See 'git help <command>' or 'git help <concept>'\n"
+"to read about a specific subcommand or concept."
+msgstr ""
+
+#: http.c:336
+#, c-format
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr ""
+
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr ""
+
+#: http.c:366
+msgid "Public key pinning not supported with cURL < 7.44.0"
+msgstr ""
+
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr ""
+
+#: common-cmds.h:9
+msgid "start a working area (see also: git help tutorial)"
+msgstr ""
+
+#: common-cmds.h:10
+msgid "work on the current change (see also: git help everyday)"
+msgstr ""
+
+#: common-cmds.h:11
+msgid "examine the history and state (see also: git help revisions)"
+msgstr ""
+
+#: common-cmds.h:12
+msgid "grow, mark and tweak your common history"
+msgstr ""
+
+#: common-cmds.h:13
+msgid "collaborate (see also: git help workflows)"
+msgstr ""
+
+#: common-cmds.h:17
+msgid "Add file contents to the index"
+msgstr ""
+
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
+msgstr ""
+
+#: common-cmds.h:19
+msgid "List, create, or delete branches"
+msgstr ""
+
+#: common-cmds.h:20
+msgid "Switch branches or restore working tree files"
+msgstr ""
+
+#: common-cmds.h:21
+msgid "Clone a repository into a new directory"
+msgstr ""
+
+#: common-cmds.h:22
+msgid "Record changes to the repository"
+msgstr ""
+
+#: common-cmds.h:23
+msgid "Show changes between commits, commit and working tree, etc"
+msgstr ""
+
+#: common-cmds.h:24
+msgid "Download objects and refs from another repository"
+msgstr ""
+
+#: common-cmds.h:25
+msgid "Print lines matching a pattern"
+msgstr ""
+
+#: common-cmds.h:26
+msgid "Create an empty Git repository or reinitialize an existing one"
+msgstr ""
+
+#: common-cmds.h:27
+msgid "Show commit logs"
+msgstr ""
+
+#: common-cmds.h:28
+msgid "Join two or more development histories together"
+msgstr ""
+
+#: common-cmds.h:29
+msgid "Move or rename a file, a directory, or a symlink"
+msgstr ""
+
+#: common-cmds.h:30
+msgid "Fetch from and integrate with another repository or a local branch"
+msgstr ""
+
+#: common-cmds.h:31
+msgid "Update remote refs along with associated objects"
+msgstr ""
+
+#: common-cmds.h:32
+msgid "Reapply commits on top of another base tip"
+msgstr ""
+
+#: common-cmds.h:33
+msgid "Reset current HEAD to the specified state"
+msgstr ""
+
+#: common-cmds.h:34
+msgid "Remove files from the working tree and from the index"
+msgstr ""
+
+#: common-cmds.h:35
+msgid "Show various types of objects"
+msgstr ""
+
+#: common-cmds.h:36
+msgid "Show the working tree status"
+msgstr ""
+
+#: common-cmds.h:37
+msgid "Create, list, delete or verify a tag object signed with GPG"
+msgstr ""
+
+#: parse-options.h:145
+msgid "expiry-date"
+msgstr ""
+
+#: parse-options.h:160
+msgid "no-op (backward compatibility)"
+msgstr ""
+
+#: parse-options.h:238
+msgid "be more verbose"
+msgstr ""
+
+#: parse-options.h:240
+msgid "be more quiet"
+msgstr ""
+
+#: parse-options.h:246
+msgid "use <n> digits to display SHA-1s"
+msgstr ""
+
+#: rerere.h:40
+msgid "update the index with reused conflict resolution if possible"
+msgstr ""
+
+#: git-bisect.sh:54
+msgid "You need to start by \"git bisect start\""
+msgstr ""
+
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:60
+msgid "Do you want me to do it for you [Y/n]? "
+msgstr ""
+
+#: git-bisect.sh:121
+#, sh-format
+msgid "unrecognised option: '$arg'"
+msgstr ""
+
+#: git-bisect.sh:125
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
+msgstr ""
+
+#: git-bisect.sh:154
+msgid "Bad HEAD - I need a HEAD"
+msgstr ""
+
+#: git-bisect.sh:167
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+msgstr ""
+
+#: git-bisect.sh:177
+msgid "won't bisect on cg-seek'ed tree"
+msgstr ""
+
+#: git-bisect.sh:181
+msgid "Bad HEAD - strange symbolic ref"
+msgstr ""
+
+#: git-bisect.sh:233
+#, sh-format
+msgid "Bad bisect_write argument: $state"
+msgstr ""
+
+#: git-bisect.sh:262
+#, sh-format
+msgid "Bad rev input: $arg"
+msgstr ""
+
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr ""
+
+#: git-bisect.sh:290
+#, sh-format
+msgid "Bad rev input: $rev"
+msgstr ""
+
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
+msgstr ""
+
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgstr ""
+
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:328
+msgid "Are you sure [Y/n]? "
+msgstr ""
+
+#: git-bisect.sh:340
+#, sh-format
+msgid ""
+"You need to give me at least one $bad_syn and one $good_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+msgstr ""
+
+#: git-bisect.sh:343
+#, sh-format
+msgid ""
+"You need to start by \"git bisect start\".\n"
+"You then need to give me at least one $good_syn and one $bad_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+msgstr ""
+
+#: git-bisect.sh:414 git-bisect.sh:546
+msgid "We are not bisecting."
+msgstr ""
+
+#: git-bisect.sh:421
+#, sh-format
+msgid "'$invalid' is not a valid commit"
+msgstr ""
+
+#: git-bisect.sh:430
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
+msgstr ""
+
+#: git-bisect.sh:458
+msgid "No logfile given"
+msgstr ""
+
+#: git-bisect.sh:459
+#, sh-format
+msgid "cannot read $file for replaying"
+msgstr ""
+
+#: git-bisect.sh:480
+msgid "?? what are you talking about?"
+msgstr ""
+
+#: git-bisect.sh:492
+#, sh-format
+msgid "running $command"
+msgstr ""
+
+#: git-bisect.sh:499
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
+msgstr ""
+
+#: git-bisect.sh:525
+msgid "bisect run cannot continue any more"
+msgstr ""
+
+#: git-bisect.sh:531
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
+msgstr ""
+
+#: git-bisect.sh:538
+msgid "bisect run success"
+msgstr ""
+
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr ""
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr ""
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr ""
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr ""
+
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgstr ""
+
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr ""
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+
+#: git-merge-octopus.sh:46
+msgid ""
+"Error: Your local changes to the following files would be overwritten by "
+"merge"
+msgstr ""
+
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
+msgstr ""
+
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
+msgstr ""
+
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr ""
+
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr ""
+
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr ""
+
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr ""
+
+#: git-merge-octopus.sh:102
+msgid "Simple merge did not work, trying automatic merge."
+msgstr ""
+
+#: git-rebase.sh:58
+msgid ""
+"When you have resolved this problem, run \"git rebase --continue\".\n"
+"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
+"To check out the original branch and stop rebasing, run \"git rebase --abort"
+"\"."
+msgstr ""
+
+#: git-rebase.sh:158 git-rebase.sh:397
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr ""
+
+#: git-rebase.sh:172
+#, sh-format
+msgid "Cannot store $stash_sha1"
+msgstr ""
+
+#: git-rebase.sh:212
+msgid "The pre-rebase hook refused to rebase."
+msgstr ""
+
+#: git-rebase.sh:217
+msgid "It looks like git-am is in progress. Cannot rebase."
+msgstr ""
+
+#: git-rebase.sh:358
+msgid "No rebase in progress?"
+msgstr ""
+
+#: git-rebase.sh:369
+msgid "The --edit-todo action can only be used during interactive rebase."
+msgstr ""
+
+#: git-rebase.sh:376
+msgid "Cannot read HEAD"
+msgstr ""
+
+#: git-rebase.sh:379
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
+msgstr ""
+
+#: git-rebase.sh:419
+#, sh-format
+msgid ""
+"It seems that there is already a $state_dir_base directory, and\n"
+"I wonder if you are in the middle of another rebase.  If that is the\n"
+"case, please try\n"
+"\t$cmd_live_rebase\n"
+"If that is not the case, please\n"
+"\t$cmd_clear_stale_rebase\n"
+"and run me again.  I am stopping in case you still have something\n"
+"valuable there."
+msgstr ""
+
+#: git-rebase.sh:470
+#, sh-format
+msgid "invalid upstream $upstream_name"
+msgstr ""
+
+#: git-rebase.sh:494
+#, sh-format
+msgid "$onto_name: there are more than one merge bases"
+msgstr ""
+
+#: git-rebase.sh:497 git-rebase.sh:501
+#, sh-format
+msgid "$onto_name: there is no merge base"
+msgstr ""
+
+#: git-rebase.sh:506
+#, sh-format
+msgid "Does not point to a valid commit: $onto_name"
+msgstr ""
+
+#: git-rebase.sh:529
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
+msgstr ""
+
+#: git-rebase.sh:562
+msgid "Cannot autostash"
+msgstr ""
+
+#: git-rebase.sh:567
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
+msgstr ""
+
+#: git-rebase.sh:571
+msgid "Please commit or stash them."
+msgstr ""
+
+#: git-rebase.sh:591
+#, sh-format
+msgid "Current branch $branch_name is up to date."
+msgstr ""
+
+#: git-rebase.sh:595
+#, sh-format
+msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 
-#: git.c:14
+#: git-rebase.sh:606
+#, sh-format
+msgid "Changes from $mb to $onto:"
+msgstr ""
+
+#: git-rebase.sh:615
+msgid "First, rewinding head to replay your work on top of it..."
+msgstr ""
+
+#: git-rebase.sh:625
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
+msgstr ""
+
+#: git-stash.sh:53
+msgid "git stash clear with parameters is unimplemented"
+msgstr ""
+
+#: git-stash.sh:94
+msgid "You do not have the initial commit yet"
+msgstr ""
+
+#: git-stash.sh:109
+msgid "Cannot save the current index state"
+msgstr ""
+
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr ""
+
+#: git-stash.sh:144 git-stash.sh:157
+msgid "Cannot save the current worktree state"
+msgstr ""
+
+#: git-stash.sh:161
+msgid "No changes selected"
+msgstr ""
+
+#: git-stash.sh:164
+msgid "Cannot remove temporary index (can't happen)"
+msgstr ""
+
+#: git-stash.sh:177
+msgid "Cannot record working tree state"
+msgstr ""
+
+#: git-stash.sh:209
+#, sh-format
+msgid "Cannot update $ref_stash with $w_commit"
+msgstr ""
+
+#. TRANSLATORS: $option is an invalid option, like
+#. `--blah-blah'. The 7 spaces at the beginning of the
+#. second line correspond to "error: ". So you should line
+#. up the second line with however many characters the
+#. translation of "error: " takes in your language. E.g. in
+#. English this is:
+#.
+#. $ git stash save --blah-blah 2>&1 | head -n 2
+#. error: unknown option for 'stash save': --blah-blah
+#. To provide a message, use git stash save -- '--blah-blah'
+#: git-stash.sh:265
+#, sh-format
 msgid ""
-"'git help -a' and 'git help -g' list available subcommands and some\n"
-"concept guides. See 'git help <command>' or 'git help <concept>'\n"
-"to read about a specific subcommand or concept."
+"error: unknown option for 'stash save': $option\n"
+"       To provide a message, use git stash save -- '$option'"
 msgstr ""
 
-#: http.c:323
-msgid "Public key pinning not supported with cURL < 7.44.0"
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
 msgstr ""
 
-#: common-cmds.h:9
-msgid "start a working area (see also: git help tutorial)"
+#: git-stash.sh:286
+msgid "No local changes to save"
 msgstr ""
 
-#: common-cmds.h:10
-msgid "work on the current change (see also: git help everyday)"
+#: git-stash.sh:291
+msgid "Cannot initialize stash"
 msgstr ""
 
-#: common-cmds.h:11
-msgid "examine the history and state (see also: git help revisions)"
+#: git-stash.sh:295
+msgid "Cannot save the current status"
 msgstr ""
 
-#: common-cmds.h:12
-msgid "grow, mark and tweak your common history"
+#: git-stash.sh:296
+#, sh-format
+msgid "Saved working directory and index state $stash_msg"
 msgstr ""
 
-#: common-cmds.h:13
-msgid "collaborate (see also: git help workflows)"
+#: git-stash.sh:323
+msgid "Cannot remove worktree changes"
 msgstr ""
 
-#: common-cmds.h:17
-msgid "Add file contents to the index"
+#: git-stash.sh:471
+#, sh-format
+msgid "unknown option: $opt"
 msgstr ""
 
-#: common-cmds.h:18
-msgid "Use binary search to find the commit that introduced a bug"
+#: git-stash.sh:484
+msgid "No stash found."
 msgstr ""
 
-#: common-cmds.h:19
-msgid "List, create, or delete branches"
+#: git-stash.sh:491
+#, sh-format
+msgid "Too many revisions specified: $REV"
 msgstr ""
 
-#: common-cmds.h:20
-msgid "Switch branches or restore working tree files"
+#: git-stash.sh:506
+#, sh-format
+msgid "$reference is not a valid reference"
 msgstr ""
 
-#: common-cmds.h:21
-msgid "Clone a repository into a new directory"
+#: git-stash.sh:534
+#, sh-format
+msgid "'$args' is not a stash-like commit"
 msgstr ""
 
-#: common-cmds.h:22
-msgid "Record changes to the repository"
+#: git-stash.sh:545
+#, sh-format
+msgid "'$args' is not a stash reference"
 msgstr ""
 
-#: common-cmds.h:23
-msgid "Show changes between commits, commit and working tree, etc"
+#: git-stash.sh:553
+msgid "unable to refresh index"
 msgstr ""
 
-#: common-cmds.h:24
-msgid "Download objects and refs from another repository"
+#: git-stash.sh:557
+msgid "Cannot apply a stash in the middle of a merge"
 msgstr ""
 
-#: common-cmds.h:25
-msgid "Print lines matching a pattern"
+#: git-stash.sh:565
+msgid "Conflicts in index. Try without --index."
 msgstr ""
 
-#: common-cmds.h:26
-msgid "Create an empty Git repository or reinitialize an existing one"
+#: git-stash.sh:567
+msgid "Could not save index tree"
 msgstr ""
 
-#: common-cmds.h:27
-msgid "Show commit logs"
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
 msgstr ""
 
-#: common-cmds.h:28
-msgid "Join two or more development histories together"
+#: git-stash.sh:601
+msgid "Cannot unstage modified files"
 msgstr ""
 
-#: common-cmds.h:29
-msgid "Move or rename a file, a directory, or a symlink"
+#: git-stash.sh:616
+msgid "Index was not unstashed."
 msgstr ""
 
-#: common-cmds.h:30
-msgid "Fetch from and integrate with another repository or a local branch"
+#: git-stash.sh:630
+msgid "The stash is kept in case you need it again."
 msgstr ""
 
-#: common-cmds.h:31
-msgid "Update remote refs along with associated objects"
+#: git-stash.sh:639
+#, sh-format
+msgid "Dropped ${REV} ($s)"
 msgstr ""
 
-#: common-cmds.h:32
-msgid "Reapply commits on top of another base tip"
+#: git-stash.sh:640
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
 msgstr ""
 
-#: common-cmds.h:33
-msgid "Reset current HEAD to the specified state"
+#: git-stash.sh:648
+msgid "No branch name specified"
 msgstr ""
 
-#: common-cmds.h:34
-msgid "Remove files from the working tree and from the index"
+#: git-stash.sh:727
+msgid "(To restore them type \"git stash apply\")"
 msgstr ""
 
-#: common-cmds.h:35
-msgid "Show various types of objects"
+#: git-submodule.sh:181
+msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 
-#: common-cmds.h:36
-msgid "Show the working tree status"
+#: git-submodule.sh:191
+#, sh-format
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+msgstr ""
+
+#: git-submodule.sh:210
+#, sh-format
+msgid "'$sm_path' already exists in the index"
+msgstr ""
+
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr ""
+
+#: git-submodule.sh:218
+#, sh-format
+msgid ""
+"The following path is ignored by one of your .gitignore files:\n"
+"$sm_path\n"
+"Use -f if you really want to add it."
+msgstr ""
+
+#: git-submodule.sh:236
+#, sh-format
+msgid "Adding existing repo at '$sm_path' to the index"
+msgstr ""
+
+#: git-submodule.sh:238
+#, sh-format
+msgid "'$sm_path' already exists and is not a valid git repo"
+msgstr ""
+
+#: git-submodule.sh:246
+#, sh-format
+msgid "A git directory for '$sm_name' is found locally with remote(s):"
+msgstr ""
+
+#: git-submodule.sh:248
+#, sh-format
+msgid ""
+"If you want to reuse this local git directory instead of cloning again from\n"
+"  $realrepo\n"
+"use the '--force' option. If the local git directory is not the correct "
+"repo\n"
+"or you are unsure what this means choose another name with the '--name' "
+"option."
+msgstr ""
+
+#: git-submodule.sh:254
+#, sh-format
+msgid "Reactivating local git directory for submodule '$sm_name'."
+msgstr ""
+
+#: git-submodule.sh:266
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr ""
+
+#: git-submodule.sh:271
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr ""
+
+#: git-submodule.sh:280
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr ""
+
+#: git-submodule.sh:341
+#, sh-format
+msgid "Entering '$displaypath'"
+msgstr ""
+
+#: git-submodule.sh:361
+#, sh-format
+msgid "Stopping at '$displaypath'; script returned non-zero status."
+msgstr ""
+
+#: git-submodule.sh:432
+#, sh-format
+msgid "pathspec and --all are incompatible"
+msgstr ""
+
+#: git-submodule.sh:437
+#, sh-format
+msgid "Use '--all' if you really want to deinitialize all submodules"
+msgstr ""
+
+#: git-submodule.sh:457
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains a .git directory\n"
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+msgstr ""
+
+#: git-submodule.sh:465
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+msgstr ""
+
+#: git-submodule.sh:468
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr ""
+
+#: git-submodule.sh:469
+#, sh-format
+msgid "Could not remove submodule work tree '$displaypath'"
+msgstr ""
+
+#: git-submodule.sh:472
+#, sh-format
+msgid "Could not create empty submodule directory '$displaypath'"
+msgstr ""
+
+#: git-submodule.sh:481
+#, sh-format
+msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+msgstr ""
+
+#: git-submodule.sh:637
+#, sh-format
+msgid "Unable to find current revision in submodule path '$displaypath'"
+msgstr ""
+
+#: git-submodule.sh:647
+#, sh-format
+msgid "Unable to fetch in submodule path '$sm_path'"
+msgstr ""
+
+#: git-submodule.sh:652
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
 msgstr ""
 
-#: common-cmds.h:37
-msgid "Create, list, delete or verify a tag object signed with GPG"
+#: git-submodule.sh:670
+#, sh-format
+msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr ""
 
-#: parse-options.h:145
-msgid "expiry-date"
+#: git-submodule.sh:676
+#, sh-format
+msgid ""
+"Fetched in submodule path '$displaypath', but it did not contain $sha1. "
+"Direct fetching of that commit failed."
 msgstr ""
 
-#: parse-options.h:160
-msgid "no-op (backward compatibility)"
+#: git-submodule.sh:683
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: parse-options.h:237
-msgid "be more verbose"
+#: git-submodule.sh:684
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr ""
 
-#: parse-options.h:239
-msgid "be more quiet"
+#: git-submodule.sh:688
+#, sh-format
+msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: parse-options.h:245
-msgid "use <n> digits to display SHA-1s"
+#: git-submodule.sh:689
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr ""
 
-#: rerere.h:40
-msgid "update the index with reused conflict resolution if possible"
+#: git-submodule.sh:694
+#, sh-format
+msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-bisect.sh:54
-msgid "You need to start by \"git bisect start\""
+#: git-submodule.sh:695
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr ""
 
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-bisect.sh:60
-msgid "Do you want me to do it for you [Y/n]? "
+#: git-submodule.sh:700
+#, sh-format
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 
-#: git-bisect.sh:121
+#: git-submodule.sh:701
 #, sh-format
-msgid "unrecognised option: '$arg'"
+msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr ""
 
-#: git-bisect.sh:125
+#: git-submodule.sh:732
 #, sh-format
-msgid "'$arg' does not appear to be a valid revision"
+msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
 
-#: git-bisect.sh:154
-msgid "Bad HEAD - I need a HEAD"
+#: git-submodule.sh:840
+msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 
-#: git-bisect.sh:167
+#: git-submodule.sh:892
 #, sh-format
-msgid ""
-"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+msgid "unexpected mode $mod_dst"
 msgstr ""
 
-#: git-bisect.sh:177
-msgid "won't bisect on cg-seek'ed tree"
+#: git-submodule.sh:912
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr ""
 
-#: git-bisect.sh:181
-msgid "Bad HEAD - strange symbolic ref"
+#: git-submodule.sh:915
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr ""
 
-#: git-bisect.sh:233
+#: git-submodule.sh:918
 #, sh-format
-msgid "Bad bisect_write argument: $state"
+msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 
-#: git-bisect.sh:262
+#: git-submodule.sh:1064
 #, sh-format
-msgid "Bad rev input: $arg"
+msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 
-#: git-bisect.sh:281
+#: git-submodule.sh:1136
 #, sh-format
-msgid "Bad rev input: $bisected_head"
+msgid "Synchronizing submodule url for '$displaypath'"
 msgstr ""
 
-#: git-bisect.sh:290
+#: git-parse-remote.sh:89
 #, sh-format
-msgid "Bad rev input: $rev"
+msgid "See git-${cmd}(1) for details."
 msgstr ""
 
-#: git-bisect.sh:299
+#: git-rebase--interactive.sh:140
 #, sh-format
-msgid "'git bisect $TERM_BAD' can take only one argument."
+msgid "Rebasing ($new_count/$total)"
 msgstr ""
 
-#: git-bisect.sh:322
-#, sh-format
-msgid "Warning: bisecting only with a $TERM_BAD commit."
+#: git-rebase--interactive.sh:156
+msgid ""
+"\n"
+"Commands:\n"
+" p, pick = use commit\n"
+" r, reword = use commit, but edit the commit message\n"
+" e, edit = use commit, but stop for amending\n"
+" s, squash = use commit, but meld into previous commit\n"
+" f, fixup = like \"squash\", but discard this commit's log message\n"
+" x, exec = run command (the rest of the line) using shell\n"
+" d, drop = remove commit\n"
+"\n"
+"These lines can be re-ordered; they are executed from top to bottom.\n"
 msgstr ""
 
-#. TRANSLATORS: Make sure to include [Y] and [n] in your
-#. translation. The program will only accept English input
-#. at this point.
-#: git-bisect.sh:328
-msgid "Are you sure [Y/n]? "
+#: git-rebase--interactive.sh:171
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
 msgstr ""
 
-#: git-bisect.sh:340
-#, sh-format
+#: git-rebase--interactive.sh:175
 msgid ""
-"You need to give me at least one $bad_syn and one $good_syn revision.\n"
-"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
 msgstr ""
 
-#: git-bisect.sh:343
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
-"You need to start by \"git bisect start\".\n"
-"You then need to give me at least one $good_syn and one $bad_syn revision.\n"
-"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+"You can amend the commit now, with\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Once you are satisfied with your changes, run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
 
-#: git-bisect.sh:414 git-bisect.sh:546
-msgid "We are not bisecting."
+#: git-rebase--interactive.sh:236
+#, sh-format
+msgid "$sha1: not a commit that can be picked"
 msgstr ""
 
-#: git-bisect.sh:421
+#: git-rebase--interactive.sh:275
 #, sh-format
-msgid "'$invalid' is not a valid commit"
+msgid "Invalid commit name: $sha1"
 msgstr ""
 
-#: git-bisect.sh:430
+#: git-rebase--interactive.sh:317
+msgid "Cannot write current commit's replacement sha1"
+msgstr ""
+
+#: git-rebase--interactive.sh:369
 #, sh-format
-msgid ""
-"Could not check out original HEAD '$branch'.\n"
-"Try 'git bisect reset <commit>'."
+msgid "Fast-forward to $sha1"
 msgstr ""
 
-#: git-bisect.sh:458
-msgid "No logfile given"
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
 msgstr ""
 
-#: git-bisect.sh:459
+#: git-rebase--interactive.sh:380
 #, sh-format
-msgid "cannot read $file for replaying"
+msgid "Cannot move HEAD to $first_parent"
 msgstr ""
 
-#: git-bisect.sh:480
-msgid "?? what are you talking about?"
+#: git-rebase--interactive.sh:385
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
 msgstr ""
 
-#: git-bisect.sh:492
+#: git-rebase--interactive.sh:399
 #, sh-format
-msgid "running $command"
+msgid "Error redoing merge $sha1"
 msgstr ""
 
-#: git-bisect.sh:499
+#: git-rebase--interactive.sh:407
 #, sh-format
-msgid ""
-"bisect run failed:\n"
-"exit code $res from '$command' is < 0 or >= 128"
+msgid "Could not pick $sha1"
 msgstr ""
 
-#: git-bisect.sh:525
-msgid "bisect run cannot continue any more"
+#: git-rebase--interactive.sh:416
+#, sh-format
+msgid "This is the commit message #${n}:"
 msgstr ""
 
-#: git-bisect.sh:531
+#: git-rebase--interactive.sh:421
 #, sh-format
-msgid ""
-"bisect run failed:\n"
-"'bisect_state $state' exited with error code $res"
+msgid "The commit message #${n} will be skipped:"
 msgstr ""
 
-#: git-bisect.sh:538
-msgid "bisect run success"
+#: git-rebase--interactive.sh:432
+#, sh-format
+msgid "This is a combination of $count commit."
+msgid_plural "This is a combination of $count commits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: git-rebase--interactive.sh:441
+#, sh-format
+msgid "Cannot write $fixup_msg"
 msgstr ""
 
-#: git-bisect.sh:565
-msgid "please use two different terms"
+#: git-rebase--interactive.sh:444
+msgid "This is a combination of 2 commits."
 msgstr ""
 
-#: git-bisect.sh:575
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
-msgid "'$term' is not a valid term"
+msgid "Could not apply $sha1... $rest"
 msgstr ""
 
-#: git-bisect.sh:578
+#: git-rebase--interactive.sh:559
 #, sh-format
-msgid "can't use the builtin command '$term' as a term"
+msgid ""
+"Could not amend commit after successfully picking $sha1... $rest\n"
+"This is most likely due to an empty commit message, or the pre-commit hook\n"
+"failed. If the pre-commit hook failed, you may need to resolve the issue "
+"before\n"
+"you are able to reword the commit."
 msgstr ""
 
-#: git-bisect.sh:587 git-bisect.sh:593
+#: git-rebase--interactive.sh:574
 #, sh-format
-msgid "can't change the meaning of term '$term'"
+msgid "Stopped at $sha1_abbrev... $rest"
 msgstr ""
 
-#: git-bisect.sh:606
+#: git-rebase--interactive.sh:589
 #, sh-format
-msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgid "Cannot '$squash_style' without a previous commit"
 msgstr ""
 
-#: git-bisect.sh:636
-msgid "no terms defined"
+#: git-rebase--interactive.sh:631
+#, sh-format
+msgid "Executing: $rest"
 msgstr ""
 
-#: git-bisect.sh:653
+#: git-rebase--interactive.sh:639
 #, sh-format
+msgid "Execution failed: $rest"
+msgstr ""
+
+#: git-rebase--interactive.sh:641
+msgid "and made changes to the index and/or the working tree"
+msgstr ""
+
+#: git-rebase--interactive.sh:643
 msgid ""
-"invalid argument $arg for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
 
-#: git-merge-octopus.sh:46
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:656
+#, sh-format
 msgid ""
-"Error: Your local changes to the following files would be overwritten by "
-"merge"
+"Execution succeeded: $rest\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
 
-#: git-merge-octopus.sh:61
-msgid "Automated merge did not work."
+#: git-rebase--interactive.sh:667
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
 msgstr ""
 
-#: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+#: git-rebase--interactive.sh:668
+msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr ""
 
-#: git-merge-octopus.sh:73
+#: git-rebase--interactive.sh:703
 #, sh-format
-msgid "Unable to find common commit with $pretty_name"
+msgid "Successfully rebased and updated $head_name."
 msgstr ""
 
-#: git-merge-octopus.sh:77
-#, sh-format
-msgid "Already up-to-date with $pretty_name"
+#: git-rebase--interactive.sh:750
+msgid "Could not skip unnecessary pick commands"
 msgstr ""
 
-#: git-merge-octopus.sh:89
+#: git-rebase--interactive.sh:908
 #, sh-format
-msgid "Fast-forwarding to: $pretty_name"
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
 msgstr ""
 
-#: git-merge-octopus.sh:97
+#: git-rebase--interactive.sh:941
 #, sh-format
-msgid "Trying simple merge with $pretty_name"
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
 msgstr ""
 
-#: git-merge-octopus.sh:102
-msgid "Simple merge did not work, trying automatic merge."
+#: git-rebase--interactive.sh:980
+msgid "could not detach HEAD"
 msgstr ""
 
-#: git-rebase.sh:56
+#: git-rebase--interactive.sh:1018
 msgid ""
-"When you have resolved this problem, run \"git rebase --continue\".\n"
-"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
-"To check out the original branch and stop rebasing, run \"git rebase --abort"
-"\"."
-msgstr ""
-
-#: git-rebase.sh:156 git-rebase.sh:395
-#, sh-format
-msgid "Could not move back to $head_name"
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
 msgstr ""
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
+#: git-rebase--interactive.sh:1026
+msgid ""
+"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
+"\n"
+"Use 'git config rebase.missingCommitsCheck' to change the level of "
+"warnings.\n"
+"The possible behaviours are: ignore, warn, error."
 msgstr ""
 
-#: git-rebase.sh:170
+#: git-rebase--interactive.sh:1037
 #, sh-format
-msgid "Cannot store $stash_sha1"
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
 msgstr ""
 
-#: git-rebase.sh:171
+#: git-rebase--interactive.sh:1054
 msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
 msgstr ""
 
-#: git-rebase.sh:210
-msgid "The pre-rebase hook refused to rebase."
+#: git-rebase--interactive.sh:1055
+msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr ""
 
-#: git-rebase.sh:215
-msgid "It looks like git-am is in progress. Cannot rebase."
+#: git-rebase--interactive.sh:1083
+msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr ""
 
-#: git-rebase.sh:356
-msgid "No rebase in progress?"
+#: git-rebase--interactive.sh:1088
+#, sh-format
+msgid ""
+"You have staged changes in your working tree.\n"
+"If these changes are meant to be\n"
+"squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
 
-#: git-rebase.sh:367
-msgid "The --edit-todo action can only be used during interactive rebase."
+#: git-rebase--interactive.sh:1105
+msgid "Error trying to find the author identity to amend commit"
 msgstr ""
 
-#: git-rebase.sh:374
-msgid "Cannot read HEAD"
+#: git-rebase--interactive.sh:1110
+msgid ""
+"You have uncommitted changes in your working tree. Please commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
 
-#: git-rebase.sh:377
-msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
+msgid "Could not commit staged changes."
 msgstr ""
 
-#: git-rebase.sh:414
-#, sh-format
+#: git-rebase--interactive.sh:1147
 msgid ""
-"It seems that there is already a $state_dir_base directory, and\n"
-"I wonder if you are in the middle of another rebase.  If that is the\n"
-"case, please try\n"
-"\t$cmd_live_rebase\n"
-"If that is not the case, please\n"
-"\t$cmd_clear_stale_rebase\n"
-"and run me again.  I am stopping in case you still have something\n"
-"valuable there."
+"\n"
+"You are editing the todo file of an ongoing interactive rebase.\n"
+"To continue rebase after editing, run:\n"
+"    git rebase --continue\n"
+"\n"
 msgstr ""
 
-#: git-rebase.sh:465
-#, sh-format
-msgid "invalid upstream $upstream_name"
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
+msgid "Could not execute editor"
 msgstr ""
 
-#: git-rebase.sh:489
+#: git-rebase--interactive.sh:1168
 #, sh-format
-msgid "$onto_name: there are more than one merge bases"
+msgid "Could not checkout $switch_to"
 msgstr ""
 
-#: git-rebase.sh:492 git-rebase.sh:496
-#, sh-format
-msgid "$onto_name: there is no merge base"
+#: git-rebase--interactive.sh:1173
+msgid "No HEAD?"
 msgstr ""
 
-#: git-rebase.sh:501
+#: git-rebase--interactive.sh:1174
 #, sh-format
-msgid "Does not point to a valid commit: $onto_name"
+msgid "Could not create temporary $state_dir"
 msgstr ""
 
-#: git-rebase.sh:524
-#, sh-format
-msgid "fatal: no such branch: $branch_name"
+#: git-rebase--interactive.sh:1176
+msgid "Could not mark as interactive"
 msgstr ""
 
-#: git-rebase.sh:557
-msgid "Cannot autostash"
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
+msgid "Could not init rewritten commits"
 msgstr ""
 
-#: git-rebase.sh:562
+#: git-rebase--interactive.sh:1291
 #, sh-format
-msgid "Created autostash: $stash_abbrev"
-msgstr ""
+msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
+msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
+msgstr[0] ""
+msgstr[1] ""
 
-#: git-rebase.sh:566
-msgid "Please commit or stash them."
+#: git-rebase--interactive.sh:1296
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
 msgstr ""
 
-#: git-rebase.sh:586
-#, sh-format
-msgid "Current branch $branch_name is up to date."
+#: git-rebase--interactive.sh:1303
+msgid "Note that empty commits are commented out"
 msgstr ""
 
-#: git-rebase.sh:590
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, sh-format
-msgid "Current branch $branch_name is up to date, rebase forced."
+msgid "usage: $dashless $USAGE"
 msgstr ""
 
-#: git-rebase.sh:601
+#: git-sh-setup.sh:190
 #, sh-format
-msgid "Changes from $mb to $onto:"
-msgstr ""
-
-#: git-rebase.sh:610
-msgid "First, rewinding head to replay your work on top of it..."
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
 msgstr ""
 
-#: git-rebase.sh:620
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
-msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr ""
-
-#: git-stash.sh:50
-msgid "git stash clear with parameters is unimplemented"
+msgid "fatal: $program_name cannot be used without a working tree."
 msgstr ""
 
-#: git-stash.sh:73
-msgid "You do not have the initial commit yet"
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
 msgstr ""
 
-#: git-stash.sh:88
-msgid "Cannot save the current index state"
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
 
-#: git-stash.sh:123 git-stash.sh:136
-msgid "Cannot save the current worktree state"
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
 msgstr ""
 
-#: git-stash.sh:140
-msgid "No changes selected"
+#: git-sh-setup.sh:229
+#, sh-format
+msgid "Cannot $action: You have unstaged changes."
 msgstr ""
 
-#: git-stash.sh:143
-msgid "Cannot remove temporary index (can't happen)"
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr ""
 
-#: git-stash.sh:156
-msgid "Cannot record working tree state"
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
 msgstr ""
 
-#: git-stash.sh:188
+#: git-sh-setup.sh:248
 #, sh-format
-msgid "Cannot update $ref_stash with $w_commit"
+msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr ""
 
-#. TRANSLATORS: $option is an invalid option, like
-#. `--blah-blah'. The 7 spaces at the beginning of the
-#. second line correspond to "error: ". So you should line
-#. up the second line with however many characters the
-#. translation of "error: " takes in your language. E.g. in
-#. English this is:
-#.
-#. $ git stash save --blah-blah 2>&1 | head -n 2
-#. error: unknown option for 'stash save': --blah-blah
-#. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
-#, sh-format
-msgid ""
-"error: unknown option for 'stash save': $option\n"
-"       To provide a message, use git stash save -- '$option'"
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
 msgstr ""
 
-#: git-stash.sh:259
-msgid "No local changes to save"
+#: git-sh-setup.sh:372
+msgid "You need to run this command from the toplevel of the working tree."
 msgstr ""
 
-#: git-stash.sh:263
-msgid "Cannot initialize stash"
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
 msgstr ""
 
-#: git-stash.sh:267
-msgid "Cannot save the current status"
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
 msgstr ""
 
-#: git-stash.sh:268
-#, sh-format
-msgid "Saved working directory and index state $stash_msg"
+#: git-add--interactive.perl:239
+msgid "staged"
 msgstr ""
 
-#: git-stash.sh:285
-msgid "Cannot remove worktree changes"
+#: git-add--interactive.perl:239
+msgid "unstaged"
 msgstr ""
 
-#: git-stash.sh:404
-#, sh-format
-msgid "unknown option: $opt"
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
 msgstr ""
 
-#: git-stash.sh:414
-msgid "No stash found."
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
 msgstr ""
 
-#: git-stash.sh:421
-#, sh-format
-msgid "Too many revisions specified: $REV"
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
 msgstr ""
 
-#: git-stash.sh:427
-#, sh-format
-msgid "$reference is not a valid reference"
-msgstr ""
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] ""
+msgstr[1] ""
 
-#: git-stash.sh:455
-#, sh-format
-msgid "'$args' is not a stash-like commit"
-msgstr ""
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] ""
+msgstr[1] ""
 
-#: git-stash.sh:466
-#, sh-format
-msgid "'$args' is not a stash reference"
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: git-add--interactive.perl:662
+msgid "Update"
 msgstr ""
 
-#: git-stash.sh:474
-msgid "unable to refresh index"
+#: git-add--interactive.perl:674
+msgid "Revert"
 msgstr ""
 
-#: git-stash.sh:478
-msgid "Cannot apply a stash in the middle of a merge"
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
 msgstr ""
 
-#: git-stash.sh:486
-msgid "Conflicts in index. Try without --index."
+#: git-add--interactive.perl:708
+msgid "Add untracked"
 msgstr ""
 
-#: git-stash.sh:488
-msgid "Could not save index tree"
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
 msgstr ""
 
-#: git-stash.sh:522
-msgid "Cannot unstage modified files"
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
 msgstr ""
 
-#: git-stash.sh:537
-msgid "Index was not unstashed."
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
 msgstr ""
 
-#: git-stash.sh:551
-msgid "The stash is kept in case you need it again."
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
 msgstr ""
 
-#: git-stash.sh:560
-#, sh-format
-msgid "Dropped ${REV} ($s)"
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
 msgstr ""
 
-#: git-stash.sh:561
-#, sh-format
-msgid "${REV}: Could not drop stash entry"
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
 msgstr ""
 
-#: git-stash.sh:569
-msgid "No branch name specified"
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
 msgstr ""
 
-#: git-stash.sh:641
-msgid "(To restore them type \"git stash apply\")"
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
 msgstr ""
 
-#: git-submodule.sh:183
-msgid "Relative path can only be used from the toplevel of the working tree"
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
 msgstr ""
 
-#: git-submodule.sh:193
-#, sh-format
-msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
 msgstr ""
 
-#: git-submodule.sh:210
-#, sh-format
-msgid "'$sm_path' already exists in the index"
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
 msgstr ""
 
-#: git-submodule.sh:214
-#, sh-format
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
 msgid ""
-"The following path is ignored by one of your .gitignore files:\n"
-"$sm_path\n"
-"Use -f if you really want to add it."
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
 msgstr ""
 
-#: git-submodule.sh:232
-#, sh-format
-msgid "Adding existing repo at '$sm_path' to the index"
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
 msgstr ""
 
-#: git-submodule.sh:234
-#, sh-format
-msgid "'$sm_path' already exists and is not a valid git repo"
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
 msgstr ""
 
-#: git-submodule.sh:242
-#, sh-format
-msgid "A git directory for '$sm_name' is found locally with remote(s):"
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
 msgstr ""
 
-#: git-submodule.sh:244
-#, sh-format
+#: git-add--interactive.perl:1205
 msgid ""
-"If you want to reuse this local git directory instead of cloning again from\n"
-"  $realrepo\n"
-"use the '--force' option. If the local git directory is not the correct "
-"repo\n"
-"or you are unsure what this means choose another name with the '--name' "
-"option."
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
 msgstr ""
 
-#: git-submodule.sh:250
-#, sh-format
-msgid "Reactivating local git directory for submodule '$sm_name'."
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
 msgstr ""
 
-#: git-submodule.sh:262
-#, sh-format
-msgid "Unable to checkout submodule '$sm_path'"
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
 msgstr ""
 
-#: git-submodule.sh:267
-#, sh-format
-msgid "Failed to add submodule '$sm_path'"
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
 msgstr ""
 
-#: git-submodule.sh:276
-#, sh-format
-msgid "Failed to register submodule '$sm_path'"
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
 msgstr ""
 
-#: git-submodule.sh:323
-#, sh-format
-msgid "Entering '$displaypath'"
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
 msgstr ""
 
-#: git-submodule.sh:343
-#, sh-format
-msgid "Stopping at '$displaypath'; script returned non-zero status."
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
 msgstr ""
 
-#: git-submodule.sh:414
-#, sh-format
-msgid "pathspec and --all are incompatible"
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
 msgstr ""
 
-#: git-submodule.sh:419
-#, sh-format
-msgid "Use '--all' if you really want to deinitialize all submodules"
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
 msgstr ""
 
-#: git-submodule.sh:439
-#, sh-format
-msgid ""
-"Submodule work tree '$displaypath' contains a .git directory\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
 msgstr ""
 
-#: git-submodule.sh:447
-#, sh-format
-msgid ""
-"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
-"discard them"
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
 msgstr ""
 
-#: git-submodule.sh:450
-#, sh-format
-msgid "Cleared directory '$displaypath'"
+#: git-add--interactive.perl:1297
+msgid "Patch update"
 msgstr ""
 
-#: git-submodule.sh:451
-#, sh-format
-msgid "Could not remove submodule work tree '$displaypath'"
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:454
-#, sh-format
-msgid "Could not create empty submodule directory '$displaypath'"
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:463
-#, sh-format
-msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:612
-#, sh-format
-msgid "Unable to find current revision in submodule path '$displaypath'"
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:622
-#, sh-format
-msgid "Unable to fetch in submodule path '$sm_path'"
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:627
-#, sh-format
-msgid ""
-"Unable to find current ${remote_name}/${branch} revision in submodule path "
-"'$sm_path'"
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:645
-#, sh-format
-msgid "Unable to fetch in submodule path '$displaypath'"
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:651
-#, sh-format
-msgid ""
-"Fetched in submodule path '$displaypath', but it did not contain $sha1. "
-"Direct fetching of that commit failed."
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:658
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:659
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:663
-#, sh-format
-msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:664
-#, sh-format
-msgid "Submodule path '$displaypath': rebased into '$sha1'"
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:669
-#, sh-format
-msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:670
-#, sh-format
-msgid "Submodule path '$displaypath': merged in '$sha1'"
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:675
-#, sh-format
-msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:676
-#, sh-format
-msgid "Submodule path '$displaypath': '$command $sha1'"
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:707
-#, sh-format
-msgid "Failed to recurse into submodule path '$displaypath'"
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:815
-msgid "The --cached option cannot be used with the --files option"
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:867
-#, sh-format
-msgid "unexpected mode $mod_dst"
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:887
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_src"
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:890
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
 msgstr ""
 
-#: git-submodule.sh:893
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
 msgstr ""
 
-#: git-submodule.sh:918
-msgid "blob"
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
 msgstr ""
 
-#: git-submodule.sh:1040
-#, sh-format
-msgid "Failed to recurse into submodule path '$sm_path'"
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
 msgstr ""
 
-#: git-submodule.sh:1107
-#, sh-format
-msgid "Synchronizing submodule url for '$displaypath'"
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
 msgstr ""
 
-#: git-parse-remote.sh:89
-#, sh-format
-msgid "See git-${cmd}(1) for details."
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:131
-#, sh-format
-msgid "Rebasing ($new_count/$total)"
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:147
-msgid ""
-"\n"
-"Commands:\n"
-" p, pick = use commit\n"
-" r, reword = use commit, but edit the commit message\n"
-" e, edit = use commit, but stop for amending\n"
-" s, squash = use commit, but meld into previous commit\n"
-" f, fixup = like \"squash\", but discard this commit's log message\n"
-" x, exec = run command (the rest of the line) using shell\n"
-" d, drop = remove commit\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:162
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:166
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
 msgstr ""
 
-#: git-rebase--interactive.sh:202
-#, sh-format
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
 msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"\tgit commit --amend $gpg_sign_opt_quoted\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"\tgit rebase --continue"
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:227
-#, sh-format
-msgid "$sha1: not a commit that can be picked"
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
 msgstr ""
 
-#: git-rebase--interactive.sh:266
-#, sh-format
-msgid "Invalid commit name: $sha1"
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
 msgstr ""
 
-#: git-rebase--interactive.sh:308
-msgid "Cannot write current commit's replacement sha1"
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
 msgstr ""
 
-#: git-rebase--interactive.sh:360
-#, sh-format
-msgid "Fast-forward to $sha1"
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:362
-#, sh-format
-msgid "Cannot fast-forward to $sha1"
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:371
-#, sh-format
-msgid "Cannot move HEAD to $first_parent"
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
 msgstr ""
 
-#: git-rebase--interactive.sh:376
-#, sh-format
-msgid "Refusing to squash a merge: $sha1"
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:390
-#, sh-format
-msgid "Error redoing merge $sha1"
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:398
-#, sh-format
-msgid "Could not pick $sha1"
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:407
-#, sh-format
-msgid "This is the commit message #${n}:"
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:412
-#, sh-format
-msgid "The commit message #${n} will be skipped:"
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:423
-#, sh-format
-msgid "This is a combination of $count commit."
-msgid_plural "This is a combination of $count commits."
-msgstr[0] ""
-msgstr[1] ""
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr ""
 
-#: git-rebase--interactive.sh:431
-#, sh-format
-msgid "Cannot write $fixup_msg"
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:434
-msgid "This is a combination of 2 commits."
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
-#, sh-format
-msgid "Could not apply $sha1... $rest"
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:549
-#, sh-format
+#: git-send-email.perl:589
+#, perl-format
 msgid ""
-"Could not amend commit after successfully picking $sha1... $rest\n"
-"This is most likely due to an empty commit message, or the pre-commit hook\n"
-"failed. If the pre-commit hook failed, you may need to resolve the issue "
-"before\n"
-"you are able to reword the commit."
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:564
-#, sh-format
-msgid "Stopped at $sha1_abbrev... $rest"
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
 msgstr ""
 
-#: git-rebase--interactive.sh:579
-#, sh-format
-msgid "Cannot '$squash_style' without a previous commit"
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:621
-#, sh-format
-msgid "Executing: $rest"
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:629
-#, sh-format
-msgid "Execution failed: $rest"
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
 msgstr ""
 
-#: git-rebase--interactive.sh:631
-msgid "and made changes to the index and/or the working tree"
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
 msgstr ""
 
-#: git-rebase--interactive.sh:633
+#: git-send-email.perl:678
 msgid ""
-"You can fix the problem, and then run\n"
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
 "\n"
-"\tgit rebase --continue"
+"Clear the body content if you don't wish to send a summary.\n"
 msgstr ""
 
-#. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
-#, sh-format
-msgid ""
-"Execution succeeded: $rest\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"\tgit rebase --continue"
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
 msgstr ""
 
-#: git-rebase--interactive.sh:657
-#, sh-format
-msgid "Unknown command: $command $sha1 $rest"
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
 msgstr ""
 
-#: git-rebase--interactive.sh:658
-msgid "Please fix this using 'git rebase --edit-todo'."
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:693
-#, sh-format
-msgid "Successfully rebased and updated $head_name."
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:740
-msgid "Could not skip unnecessary pick commands"
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
 msgstr ""
 
-#: git-rebase--interactive.sh:898
-#, sh-format
+#: git-send-email.perl:809
 msgid ""
-"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
-" - $line"
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:931
-#, sh-format
-msgid ""
-"Warning: the command isn't recognized in the following line:\n"
-" - $line"
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
 msgstr ""
 
-#: git-rebase--interactive.sh:970
-msgid "could not detach HEAD"
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1008
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):"
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
 msgstr ""
 
-#: git-rebase--interactive.sh:1016
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error."
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1027
-#, sh-format
-msgid ""
-"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
-"Ignoring."
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
 msgstr ""
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1045
-msgid "Or you can abort the rebase with 'git rebase --abort'."
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
 msgstr ""
 
-#: git-rebase--interactive.sh:1069
-msgid "Could not remove CHERRY_PICK_HEAD"
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
 msgstr ""
 
-#: git-rebase--interactive.sh:1074
-#, sh-format
+#: git-send-email.perl:1309
 msgid ""
-"You have staged changes in your working tree.\n"
-"If these changes are meant to be\n"
-"squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend $gpg_sign_opt_quoted\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
 "\n"
-"  git commit $gpg_sign_opt_quoted\n"
-"\n"
-"In both case, once you're done, continue with:\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
 "\n"
-"  git rebase --continue\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1091
-msgid "Error trying to find the author identity to amend commit"
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
 msgstr ""
 
-#: git-rebase--interactive.sh:1096
-msgid ""
-"You have uncommitted changes in your working tree. Please commit them\n"
-"first and then run 'git rebase --continue' again."
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
 msgstr ""
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
-msgid "Could not commit staged changes."
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
 msgstr ""
 
-#: git-rebase--interactive.sh:1129
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
 msgstr ""
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
-msgid "Could not execute editor"
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
 msgstr ""
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1153
-#, sh-format
-msgid "Could not checkout $switch_to"
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1158
-msgid "No HEAD?"
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1159
-#, sh-format
-msgid "Could not create temporary $state_dir"
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1161
-msgid "Could not mark as interactive"
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
 msgstr ""
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
-msgid "Could not init rewritten commits"
+#: git-send-email.perl:1438
+msgid "Result: "
 msgstr ""
 
-#: git-rebase--interactive.sh:1276
-#, sh-format
-msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
-msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
-msgstr[0] ""
-msgstr[1] ""
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr ""
 
-#: git-rebase--interactive.sh:1281
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
 msgstr ""
 
-#: git-rebase--interactive.sh:1288
-msgid "Note that empty commits are commented out"
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
 msgstr ""
 
-#: git-sh-setup.sh:89 git-sh-setup.sh:94
-#, sh-format
-msgid "usage: $dashless $USAGE"
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
 msgstr ""
 
-#: git-sh-setup.sh:190
-#, sh-format
-msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
 msgstr ""
 
-#: git-sh-setup.sh:199 git-sh-setup.sh:206
-#, sh-format
-msgid "fatal: $program_name cannot be used without a working tree."
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
 msgstr ""
 
-#: git-sh-setup.sh:220
-msgid "Cannot rebase: You have unstaged changes."
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
 msgstr ""
 
-#: git-sh-setup.sh:223
-msgid "Cannot rewrite branches: You have unstaged changes."
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
 msgstr ""
 
-#: git-sh-setup.sh:229
-#, sh-format
-msgid "Cannot $action: You have unstaged changes."
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
 msgstr ""
 
-#: git-sh-setup.sh:242
-msgid "Cannot rebase: Your index contains uncommitted changes."
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
 msgstr ""
 
-#: git-sh-setup.sh:248
-#, sh-format
-msgid "Cannot $action: Your index contains uncommitted changes."
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
 msgstr ""
 
-#: git-sh-setup.sh:372
-msgid "You need to run this command from the toplevel of the working tree."
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
 msgstr ""
 
-#: git-sh-setup.sh:377
-msgid "Unable to determine absolute path of git directory"
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr ""
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr ""
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
 msgstr ""
index d89a6fbb6c9eb901fa9b928df03ea4bdb84c9d67..f9499bb3599c93f38022663eca38150b32f34b98 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -1,10 +1,10 @@
 # Git Korean translation
-# Copyright (C) 2015-2016 Changwoo Ryu and contributors
+# Copyright (C) 2015-2017 Changwoo Ryu and contributors
 # This file is distributed under the same license as the Git package.
 #
 # Contributors:
 #  Hyunjun Kim <yoloseem AT users.noreply.github.com>, 2015.
-#  Changwoo Ryu <cwryu@debian.org>, 2015-2016.
+#  Changwoo Ryu <cwryu@debian.org>, 2015-2017.
 #
 # - 작업자는 위 Contributors 목록에 추가해 주세요.
 # - 번역하면서 80컬럼을 넘어가지 않도록 해 주세요.
@@ -58,8 +58,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-15 22:43+0800\n"
-"PO-Revision-Date: 2016-08-21 22:41+0900\n"
+"POT-Creation-Date: 2017-02-18 01:00+0800\n"
+"PO-Revision-Date: 2017-02-19 19:33+0900\n"
 "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
 "Language-Team: Git Korean translation <http://github.com/changwoo/git-l10n-"
 "ko>\n"
@@ -111,7 +111,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "해결하지 못한 충돌 때문에 끝납니다."
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1206
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "병합 작업을 다 마치지 않았습니다 (MERGE_HEAD 파일이 있습니다)."
 
@@ -150,3880 +150,4653 @@ msgstr ""
 "  git checkout -b <새-브랜치-이름>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<옵션>] <트리-따위> [<경로>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "알 수 없는 공백 옵션 '%s'"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "알 수 없는 공백 무시 옵션 '%s'"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <저장소> [--exec <명령>] [<옵션>] <트리-따위> [<경로"
-">...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject 및 --3way 옵션은 같이 쓸 수 없습니다."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <저장소> [--exec <명령>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached 및 --3way 옵션은 같이 쓸 수 없습니다."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "'%s' 경로명세가 어떤 파일과도 일치하지 않습니다"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "저장소 밖에서 --3way 옵션 사용"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "형식"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "저장소 밖에서 --index 옵션 사용"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "ì\95\95ì¶\95 í\98\95ì\8b\9d"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "ì \80ì\9e¥ì\86\8c ë°\96ì\97\90ì\84\9c --cached ì\98µì\85\98 ì\82¬ì\9a©"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "접두어"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "타임스탬프 정규식을 준비할 수 없습니다 (%s)"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "아카이브의 각 경로 이름의 앞에 지정한 경로를 붙입니다"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec()에서 다음 입력에 대해 %d번을 리턴했습니다: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "파일"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "패치의 %d번 줄에 파일 이름을 찾을 수 없습니다"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "아카이브를 이 파일에 씁니다"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply: 잘못된 git-diff - %2$d번 줄에서 /dev/null을 기대했지만, '%1$s'이"
+"(가) 왔습니다"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "작업 폴더의 .gitattributes를 읽습니다"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply: 잘못된 git-diff - %d번 줄에 새 파일 이름이 올바르지 않습니다"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "아카이브에 포함된 파일을 표준오류로 표시합니다"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: 잘못된 git-diff - %d번 줄에 예전 파일 이름이 올바르지 않습니다"
 
-#: archive.c:437
-msgid "store only"
-msgstr "저장만 하기"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에서 /dev/null을 기대했습니다"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "더 빠르게 압축"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: 예상치 못한 줄: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "더 작게 압축"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "%d번 줄에 헤더 없는 패치 부분: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "지원하는 압축 형식의 목록을 표시합니다"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"경로 이름 부분에서 %d개를 제거라 때 git diff 헤더에 파일 이름 정보가 없습니"
+"다. (%d번 줄)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "저장소"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr "git diff 헤더에 파일 이름 정보가 없습니다 (%d번 줄)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "ì\9b\90격 ì \80ì\9e¥ì\86\8c <ì \80ì\9e¥ì\86\8c\97\90ì\84\9c ì\95\84ì¹´ì\9d´ë¸\8c를 ê°\80ì ¸ì\98µ니다"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "ì\83\88 í\8c\8cì\9d¼ì\9d´ ì\98\88ì \84 ë\82´ì\9a©ì\97\90 ì\9d\98ì¡´í\95©니다"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "명령"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "삭제한 파일에 아직 내용이 들어 있습니다"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "원격 git-upload-archive 명령의 경로"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "패치가 %d번 줄에서 망가졌습니다"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "예상치 못한 옵션 --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "새 파일 %s이(가) 예전 내용에 의존합니다"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "--exec 옵션은 --remote 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "삭제한 파일 %s이(가) 아직 내용이 들어 있습니다"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "예상치 못한 옵션 --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** 경고: %s 파일의 내용이 비어 있지만 삭제되지 않았습니다"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "알 수 없는 아카이브 형식 '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "%d번 줄에 바이너리 패치가 손상되었습니다: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "'%s' 형식에서는 지원하지 않는 인자: -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "%d번 줄에 바이너리 패치가 이해할 수 없습니다"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"git attributes에서 반대 패턴은 무시됩니다.\n"
-"앞에 느낌표를 쓰려면 '\\!'를 사용하십시오."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "%d번 줄에 쓰레기 데이터만 있는 패치"
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "'%s' 파일을 열 수 없습니다"
+msgid "unable to read symlink %s"
+msgstr "%s 심볼릭 링크를 읽을 수 없습니다"
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "'%s' 파일 안에 잘못된 따옴표가 붙은 내용: %s"
+msgid "unable to open or read %s"
+msgstr "%s을(를) 열거나 읽을 수 없습니다"
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "더 이상 이등분할 수 없습니다!\n"
+msgid "invalid start of line: '%c'"
+msgstr "줄 시작이 잘못됨: '%c'"
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "올바른 커밋 이름이 아닙니다 (%s)"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "패치 %d번 부분 %d번 줄에서 성공 (오프셋 %d번 줄)"
 
-#: bisect.c:732
+#: apply.c:3053
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"%s 병합 베이스가 비정상입니다.\n"
-"버그가 %s 및 [%s] 사이에서 고쳐졌다는 뜻입니다.\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "컨텍스트가 (%ld/%ld)로 줄어듭니다. (%d번 줄에서 적용)"
 
-#: bisect.c:737
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"%s 병합 베이스가 새롭습니다.\n"
-"속성이 %s 및 [%s] 사이에서 변경되었습니다.\n"
+"다음을 검색하던 중:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "'%s'에 대한 바이너리 패치 데이터가 없습니다"
+
+#: apply.c:3089
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"%s 병합 베이스가 %s입니다.\n"
-"처음 '%s' 커밋이 %s 및 [%s] 사이라는 뜻입니다.\n"
+"반대 헝크가 없으면 '%s'에 대한 바이너리 패치를 반대로 적용할 수 없습니다"
 
-#: bisect.c:750
+#: apply.c:3135
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"일부 %s 리비전이 %s 리비전의 과거 항목이 아닙니다.\n"
-"git bisect 명령은 이 경우에는 올바르게 동작하지 않습니다.\n"
-"%s 및 %s 리비전을 잘못 쓴 것 아닙니까?\n"
+"전체 인덱스 라인이 없으면 '%s'에 대한 바이너리 패치를 적용할 수 없습니다"
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-"%s 및 %s 사이의 머지 베이스를 건너뜁니다.\n"
-"그러므로 처음 %s 커밋이 %s 및 %s 사이에 있는지 확신할 수 없습니다.\n"
-"어쨌든 계속합니다."
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "패치가 '%s'(%s)에 적용되지만, 현재 내용과 일치하지 않습니다."
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "이등분: 병합 베이스를 시험해야 합니다\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "패치는 빈 '%s'에 적용되지만, 현재 비어 있지 않습니다"
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
-msgstr "하나의 %s 리비전이 필요합니다"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "'%2$s'에 대한 필요한 %1$s 포스트이미지를 읽을 수 없습니다"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
-msgstr "'%s' 파일을 만들 수 없습니다"
+msgid "binary patch does not apply to '%s'"
+msgstr "바이너리 패치를 '%s'에 적용할 수 없습니다"
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
-msgstr "'%s' 파일을 읽을 수 없습니다"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"'%s'에 대한 바이너리 패치가 올바르지 않은 결과를 만듭니다. (기대한 값 %s, 실"
+"제 %s)"
 
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "이등분 레퍼런스 읽기에 실패했습니다"
+#: apply.c:3211
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "패치 실패: %s:%ld"
 
-#: bisect.c:967
+#: apply.c:3333
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%sì\9d\80\8a\94) %s ë°\8f %s ëª¨ë\91\90ì\97\90 í\95´ë\8b¹ë\90©ë\8b\88ë\8b¤\n"
+msgid "cannot checkout %s"
+msgstr "%sì\9d\84(를) ê°\80ì ¸ì\98¬ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
 
-#: bisect.c:975
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:248
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"시험 가능한 커밋이 없습니다.\n"
-"잘못도니 경로 파라미터로 시작하지 않았습니까?\n"
+msgid "failed to read %s"
+msgstr "%s을(를) 읽는데 실패했습니다"
 
-#: bisect.c:994
+#: apply.c:3389
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(대략 %d 단계)"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "심볼릭 링크 뒤에 있는 '%s' 읽기"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "이등분: %2$s 뒤에 시험할 리비전이 %1$d개 남았습니다\n"
+msgid "path %s has been renamed/deleted"
+msgstr "%s 경로가 이름이 바뀌었거나 삭제되었습니다"
 
-#: branch.c:53
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"오류를 수정한 다음 원격 추적 정보를\n"
-"\"git branch --set-upstream-to=%s%s%s\" 명령을\n"
-"실행해 수정할 수 있습니다."
+msgid "%s: does not exist in index"
+msgstr "%s: 인덱스에 없습니다"
 
-#: branch.c:67
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "%s 브랜치를 자신의 업스트림으로 지정하지 않음."
+msgid "%s: does not match index"
+msgstr "%s: 인덱스와 맞지 않습니다"
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr ""
-"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었"
-"습니다."
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
 
-#: branch.c:94
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "%s 브랜치가 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었습니다."
+msgid "Falling back to three-way merge...\n"
+msgstr "3-방향 병합으로 대신합니다...\n"
 
-#: branch.c:98
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr ""
-"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 따라가도록 설정되었습니다."
+msgid "cannot read the current contents of '%s'"
+msgstr "'%s'의 현재 내용을 읽을 수 없습니다"
 
-#: branch.c:99
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "%s 브랜치가 %s 브랜치를 따라가도록 설정되었습니다."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "3-방향 병합으로 대신하는데 실패했습니다...\n"
 
-#: branch.c:104
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
-"%s 브랜치가 리베이스를 통해 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "패치를 '%s'에 충돌이 있는 상태로 적용.\n"
 
-#: branch.c:105
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "%s 브랜치가 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "패치를 '%s'에 패치 문제 없이 적용.\n"
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"%s 브랜치가 리베이스를 통해 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "제거하는 패치 다음에 파일 내용이 남았습니다"
 
-#: branch.c:110
+#: apply.c:3697
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "%s 브랜치가 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "업스트림 브랜치 설정을 쓸 수 없습니다"
+msgid "%s: wrong type"
+msgstr "%s: 잘못된 종류"
 
-#: branch.c:156
+#: apply.c:3699
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "따라가지 않음: %s 레퍼런스에 대해 애매한 정보"
+msgid "%s has type %o, expected %o"
+msgstr "%s의 종류가 %o이지만 %o이(가) 되어야 합니다"
 
-#: branch.c:185
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s'은(는) 올바른 브랜치 이름이 아닙니다."
+msgid "invalid path '%s'"
+msgstr "잘못된 경로 '%s'"
 
-#: branch.c:190
+#: apply.c:3908
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "이름이 '%s'인 브랜치가 이미 있습니다."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "현재 브랜치를 강제로 업데이트할 수 없습니다."
+msgid "%s: already exists in index"
+msgstr "%s: 이미 인덱스에 있습니다"
 
-#: branch.c:218
+#: apply.c:3911
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"따라가기 정보를 설정할 수 없습니다. 시작 위치 '%s'이(가) 브랜치가 아닙니다."
+msgid "%s: already exists in working directory"
+msgstr "%s: 이미 작업 디렉터리에 있습니다"
 
-#: branch.c:220
+#: apply.c:3931
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "요청한 업스트림 '%s' 브랜치가 없습니다"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"리모트에 이미 있는 업스트림 브랜치를 기반으로 작업하려면,\n"
-"먼저 \"git fetch\"로 가져 리모트 브랜치를 가져옵니다.\n"
-"\n"
-"새 로컬 브랜치를 거기에 해당하는 리모트 브랜치로 push하려면,\n"
-"\"git push -u\"로 push하는 업스트림을 설정할 수 있습니다."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "%2$s의 새 모드(%1$o)가 예전 모드(%3$o)와 다릅니다"
 
-#: branch.c:266
+#: apply.c:3936
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "올바른 오브젝트 이름이 아닙니다: '%s'."
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "%2$s의 새 모드(%1$o)가 %4$s의 예전 모드(%3$o)와 다릅니다"
 
-#: branch.c:286
+#: apply.c:3956
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "ì\95 ë§¤í\95\9c ì\98¤ë¸\8cì \9dí\8a¸ ì\9d´ë¦\84: '%s'."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "ì\98\81í\96¥ ë°\9bë\8a\94 '%s' í\8c\8cì\9d¼ì\9d´ ì\8b¬ë³¼ë¦­ ë§\81í\81¬ ë\92¤ì\97\90 ì\9e\88ì\8aµë\8b\88ë\8b¤"
 
-#: branch.c:291
+#: apply.c:3960
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "올바른 브랜치 위치가 아닙니다: '%s'."
+msgid "%s: patch does not apply"
+msgstr "%s: 패치를 적용하지 않습니다"
 
-#: branch.c:345
+#: apply.c:3975
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s'은(는) 이미 '%s' 위치에 받아져 있습니다"
+msgid "Checking patch %s..."
+msgstr "%s 패치를 확인하는 중입니다..."
 
-#: branch.c:364
+#: apply.c:4066
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "작업 폴더 %s의 헤드가 업데이트되지 않았습니다"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "sha1 정보가 없거나 %s 하위 모듈에서 쓸 수 없습니다"
 
-#: bundle.c:34
+#: apply.c:4073
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' 파일이 버전2 번들 파일로 보이지 않습니다"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "%s에 대한 모드 변경이지만, 현재 HEAD에 없습니다"
 
-#: bundle.c:61
+#: apply.c:4076
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "인식할 수 없는 헤더: %s%s (%d)"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "sha1 정보가 없거나 쓸 수 없습니다 (%s)."
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4081 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "could not open '%s'"
-msgstr "'%s'을(를) 열 수 없습니다"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "저장소에 필수적인 다음 커밋이 없습니다:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "리비전 walk 준비가 실패했습니다"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "경로 '%s'에 대해 make_cache_entry 실패"
 
-#: bundle.c:185
+#: apply.c:4085
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "번들에 다음 레퍼런스 %d개가 있습니다:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "번들은 전체 커밋 내역을 기록합니다."
+msgid "could not add %s to temporary index"
+msgstr "임시 인덱스에 %s 항목을 추가할 수 없습니다"
 
-#: bundle.c:194
+#: apply.c:4095
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "번들에 다음 레퍼런스 %d개가 필요합니다:"
-
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "pack-objects 명령을 실행할 수 없습니다"
+msgid "could not write temporary index to %s"
+msgstr "임시 인덱스를 %s에 쓸 수 없습니다"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "pack-objects 명령이 죽었습니다"
-
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list 명령이 죽었습니다"
-
-#: bundle.c:353
+#: apply.c:4233
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "rev-list 옵션에서 '%s' 레퍼런스가 제외되었습니다"
+msgid "unable to remove %s from index"
+msgstr "인덱스에서 %s을(를) 제거할 수 없습니다"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4268
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "알 수 없는 인자: %s"
-
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "빈 번들은 만들지 않습니다."
+msgid "corrupt patch for submodule %s"
+msgstr "하위 모듈 %s에 대해 손상된 패치"
 
-#: bundle.c:463
+#: apply.c:4274
 #, c-format
-msgid "cannot create '%s'"
-msgstr "'%s'을(를) 만들 수 없습니다"
-
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "index-pack 명령이 죽었습니다"
+msgid "unable to stat newly created file '%s'"
+msgstr "새로 만든 파일 '%s'에 대해 stat()할 수 없습니다"
 
-#: color.c:290
+#: apply.c:4282
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "ì\9e\98못ë\90\9c ì\83\89 ê°\92: %.*s"
+msgid "unable to create backing store for newly created file %s"
+msgstr "ì\83\88ë¡\9c ë§\8cë\93  í\8c\8cì\9d¼ '%s'ì\97\90 ë\8c\80í\95´ ì\98\88ë¹\84 ì \80ì\9e¥ì\86\8c를 ë§\8cë\93¤ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "could not parse %s"
-msgstr "parse %s을(를) 파싱할 수 없습니다"
+msgid "unable to add cache entry for %s"
+msgstr "%s에 대해 캐시 항목을 추가할 수 없습니다"
 
-#: commit.c:42
+#: apply.c:4329
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s, 커밋이 아닙니다"
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "메모리 바닥남"
+msgid "failed to write to '%s'"
+msgstr "'%s'에 쓰는데 실패했습니다"
 
-#: config.c:516
+#: apply.c:4333
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "블롭 %2$s 안에 %1$d번 줄에 잘못된 설정"
+msgid "closing file '%s'"
+msgstr "'%s' 파일을 닫는 중입니다"
 
-#: config.c:520
+#: apply.c:4403
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "파일 %2$s 안에 %1$d번 줄에 잘못된 설정"
+msgid "unable to write file '%s' mode %o"
+msgstr "'%s' 파일에 쓸 수 없습니다 ('%o' 모드)"
 
-#: config.c:524
+#: apply.c:4501
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "표준 입력 안에 %d번 줄에 잘못된 설정"
+msgid "Applied patch %s cleanly."
+msgstr "%s 패치 깔끔하게 적용."
 
-#: config.c:528
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "하위 모듈 블롭 %2$s 안에 %1$d번 줄에 잘못된 설정"
+#: apply.c:4509
+msgid "internal error"
+msgstr "내부 오류"
 
-#: config.c:532
+#: apply.c:4512
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "명령행 %2$s 안에 %1$d번 줄에 잘못된 설정"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "%%s 패치를 (%d개 거부) 적용..."
 
-#: config.c:536
+#: apply.c:4523
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "%2$s 안에 %1$d번 줄에 잘못된 설정"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "truncating .rej 파일 이름을 '%.*s.rej'(으)로 자름"
 
-#: config.c:660
+#: apply.c:4531 builtin/fetch.c:737 builtin/fetch.c:986
 #, c-format
-msgid "bad numeric config value '%s' for '%s': out of range"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s'): 범위 벗어남"
+msgid "cannot open %s"
+msgstr "%s을(를) 열 수 없습니다"
 
-#: config.c:661
+#: apply.c:4545
 #, c-format
-msgid "bad numeric config value '%s' for '%s': invalid unit"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s'): 단위 잘못됨"
+msgid "Hunk #%d applied cleanly."
+msgstr "패치 부위 #%d 깔끔하게 적용."
 
-#: config.c:667
+#: apply.c:4549
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: out of range"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 블롭 %s): 범위 벗어남"
+msgid "Rejected hunk #%d."
+msgstr "패치 부위 #%d 거부됨."
 
-#: config.c:668
+#: apply.c:4659
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: invalid unit"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 블롭 %s): 단위 잘못됨"
+msgid "Skipped patch '%s'."
+msgstr "패치 '%s' 건너뜀."
 
-#: config.c:672
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: out of range"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 파일 %s): 범위 벗어남"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "인식할 수 없는 입력"
 
-#: config.c:673
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: invalid unit"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 파일 %s): 단위 잘못됨"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "인덱스 파일을 읽을 수 없습니다"
 
-#: config.c:677
+#: apply.c:4824
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: out of range"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 표준입력): 범위 벗어남"
+msgid "can't open patch '%s': %s"
+msgstr "'%s' 패치를 열 수 없습니다: %s"
 
-#: config.c:678
+#: apply.c:4849
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: invalid unit"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 표준입력): 단위 잘못됨"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "공백 오류 %d개를 넘어갑니다"
 
-#: config.c:682
+#: apply.c:4855 apply.c:4870
 #, c-format
-msgid ""
-"bad numeric config value '%s' for '%s' in submodule-blob %s: out of range"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 하위 모듈 블롭 %s): 범위 벗어남"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d번 줄에서 공백 오류를 추가합니다."
 
-#: config.c:683
+#: apply.c:4863
 #, c-format
-msgid ""
-"bad numeric config value '%s' for '%s' in submodule-blob %s: invalid unit"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 하위 모듈 블롭 %s): 단위 잘못됨"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "공백 오류를 바로잡은 뒤에 %d번 줄 적용."
 
-#: config.c:687
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: out of range"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 명령행 %s): 범위 벗어남"
+#: apply.c:4879 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "새 인덱스 파일에 쓸 수 없습니다"
 
-#: config.c:688
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: invalid unit"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 명령행 %s): 단위 잘못됨"
+#: apply.c:4910 apply.c:4913 builtin/am.c:2277 builtin/am.c:2280
+#: builtin/clone.c:95 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:281 builtin/submodule--helper.c:591
+#: builtin/submodule--helper.c:594 builtin/submodule--helper.c:960
+#: builtin/submodule--helper.c:963 builtin/submodule--helper.c:1104
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "경로"
 
-#: config.c:692
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: out of range"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', %s 안에): 범위 벗어남"
+#: apply.c:4911
+msgid "don't apply changes matching the given path"
+msgstr "주어진 경로에 해당하는 변경 사항을 적용하지 않습니다"
 
-#: config.c:693
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: invalid unit"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', %s 안에): 단위 잘못됨"
+#: apply.c:4914
+msgid "apply changes matching the given path"
+msgstr "주어진 경로에 해당하는 변경 사항을 적용합니다"
 
-#: config.c:780
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "다음에 사용자 디렉터리 확장에 실패: '%s'"
+#: apply.c:4916 builtin/am.c:2286
+msgid "num"
+msgstr "개수"
 
-#: config.c:861 config.c:872
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr "%d번은 올바른 zlib 압축 단계가 아닙니다"
+#: apply.c:4917
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "전통적인 diff 경로 앞의 <개수>개의 앞 슬래시(/)를 제거합니다"
 
-#: config.c:990
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "오브젝트 생성 모드가 올바르지 않습니다: %s"
+#: apply.c:4920
+msgid "ignore additions made by the patch"
+msgstr "패치에서 추가하는 파일을 무시합니다"
 
-#: config.c:1324
-msgid "unable to parse command-line config"
-msgstr "명령행 설정을 파싱할 수 없습니다"
+#: apply.c:4922
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "패치를 적용하는 대신, 입력에 대한 diffstat을 출력합니다"
 
-#: config.c:1374
-msgid "unknown error occurred while reading the configuration files"
-msgstr "ì\84¤ì \95 í\8c\8cì\9d¼ì\9d\84 ì\9d½ë\8a\94 ì¤\91 ì\95\8c ì\88\98 ì\97\86ë\8a\94 ì\98¤ë¥\98ê°\80 ì\83\9dê²¼ì\8aµ니다"
+#: apply.c:4926
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "ì\8b­ì§\84ì\88\98ë¡\9c ì¶\94ê°\80 ë°\8f ì\82­ì \9cí\95\9c ì¤\84 ì\88\98를 í\91\9cì\8b\9cí\95©니다"
 
-#: config.c:1728
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "명령행 설정에서 '%s'을(를) 설정할 수 없습니다"
+#: apply.c:4928
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "패치를 적용하는 대신, 입력에 대한 요약을 출력합니다"
 
-#: config.c:1730
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "'%2$s' 파일의 %3$d번 줄 '%1$s' 설정 변수가 잘못되었습니다"
+#: apply.c:4930
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "패치를 적용하는 대신, 패치를 적용 가능한지 확인합니다"
 
-#: config.c:1789
-#, c-format
-msgid "%s has multiple values"
-msgstr "%s은(는) 여러 개 값이 있습니다"
+#: apply.c:4932
+msgid "make sure the patch is applicable to the current index"
+msgstr "현재 인덱스에서 패치가 적용 가능한지 확인합니다"
 
-#: config.c:2323
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "'%s'을(를) '%s'(으)로 설정할 수 없습니다"
+#: apply.c:4934
+msgid "apply a patch without touching the working tree"
+msgstr "작업 폴더를 바꾸지 않고 패치를 적용합니다"
 
-#: config.c:2325
-#, c-format
-msgid "could not unset '%s'"
-msgstr "'%s' 설정을 지울 수 없습니다"
+#: apply.c:4936
+msgid "accept a patch that touches outside the working area"
+msgstr "작업 영역 밖의 파일을 바꾸는 패치를 허용합니다"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "연결을 확인하는 중입니다"
+#: apply.c:4938
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "그리고 패치도 적용합니다 (--stat/--summary/--check 옵션과 같이 사용)"
 
-#: connected.c:74
-msgid "Could not run 'git rev-list'"
-msgstr "'git rev-list'를 실행할 수 없습니다"
+#: apply.c:4940
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "패치를 적용하지 않으면 3-방향 병합을 시도합니다"
 
-#: connected.c:94
-msgid "failed write to rev-list"
-msgstr "rev-list 쓰기에 실패했습니다"
+#: apply.c:4942
+msgid "build a temporary index based on embedded index information"
+msgstr "내장 인덱스 정보를 사용해 임시 인덱스를 만듭니다"
 
-#: connected.c:101
-msgid "failed to close rev-list's stdin"
-msgstr "rev-list의 표준입력을 닫는데 실패했습니다"
+#: apply.c:4945 builtin/checkout-index.c:169 builtin/ls-files.c:507
+msgid "paths are separated with NUL character"
+msgstr "경로를 NUL 문자로 구분합니다"
 
-#: date.c:97
-msgid "in the future"
-msgstr "미래에"
+#: apply.c:4947
+msgid "ensure at least <n> lines of context match"
+msgstr "최소한 <n>줄이 컨텍스트와 일치하는지 확인합니다"
 
-#: date.c:103
-#, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu초 전"
+#: apply.c:4948 builtin/am.c:2265
+msgid "action"
+msgstr "동작"
 
-#: date.c:110
-#, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu분 전"
+#: apply.c:4949
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "공백 오류가 있는 추가됐거나 수정된 줄을 찾습니다"
 
-#: date.c:117
-#, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu시간 전"
+#: apply.c:4952 apply.c:4955
+msgid "ignore changes in whitespace when finding context"
+msgstr "컨텍스트를 찾을 때 공백 변경 사항을 무시합니다"
 
-#: date.c:124
-#, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu일 전"
+#: apply.c:4958
+msgid "apply the patch in reverse"
+msgstr "패치를 반대 순서로 적용합니다"
 
-#: date.c:130
-#, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu주 전"
+#: apply.c:4960
+msgid "don't expect at least one line of context"
+msgstr "최소한의 컨텍스트 한 줄도 없이 적용합니다"
 
-#: date.c:137
-#, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu달 전"
+#: apply.c:4962
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "거부된 패치 부분을 대응되는 *.rej 파일에 남겨둡니다"
 
-#: date.c:148
-#, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu년"
+#: apply.c:4964
+msgid "allow overlapping hunks"
+msgstr "패치 부분이 겹쳐도 허용합니다"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:151
-#, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s %lu달 전"
+#: apply.c:4965 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1860 builtin/mv.c:122 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "자세히 표시"
 
-#: date.c:156 date.c:161
-#, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu년 전"
+#: apply.c:4967
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "파일 끝에 줄바꿈이 빠졌음을 잘못 검색한 경우에 무시합니다"
 
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "'%s' 순서 파일을 읽는데 실패했습니다"
+#: apply.c:4970
+msgid "do not trust the line counts in the hunk headers"
+msgstr "패치 부분의 헤더의 줄 수를 신용하지 않습니다"
 
-#: diffcore-rename.c:540
-msgid "Performing inexact rename detection"
-msgstr "부정확한 이름 바꾸기 탐색을 수행하는 중"
+#: apply.c:4972 builtin/am.c:2274
+msgid "root"
+msgstr "최상위"
 
-#: diff.c:116
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  dirstat 자름 퍼센트 값 '%s' 파싱에 실패했습니다\n"
+#: apply.c:4973
+msgid "prepend <root> to all filenames"
+msgstr "모든 파일 이름에 <최상위>를 앞에 붙입니다"
 
-#: diff.c:121
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  알 수 없는 dirstat 파라미터 '%s'\n"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<옵션>] <트리-따위> [<경로>...]"
 
-#: diff.c:225
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "'diff.submodule' 설정 변수에 알 수 없는 값: '%s'"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: diff.c:277
-#, c-format
+#: archive.c:14
 msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
-"'diff.submodule' 설정 변수에 오류:\n"
-"%s'"
-
-#: diff.c:3017
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr "외부 diff 프로그램이 죽음, %s 위치에서 멈춤"
+"git archive --remote <저장소> [--exec <명령>] [<옵션>] <트리-따위> [<경로"
+">...]"
 
-#: diff.c:3415
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow 옵션에는 정확히 하나의 경로명세가 필요합니다"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <저장소> [--exec <명령>] --list"
 
-#: diff.c:3578
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"--dirstat/-X 옵션 파라미터를 파싱하는데 실패했습니다:\n"
-"%s"
+msgid "pathspec '%s' did not match any files"
+msgstr "'%s' 경로명세가 어떤 파일과도 일치하지 않습니다"
 
-#: diff.c:3592
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "--submodule 옵션 파라미터 파싱에 실패했습니다: '%s'"
+#: archive.c:429
+msgid "fmt"
+msgstr "형식"
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "커ë\84\90 ì\9d´ë¦\84ê³¼ ì \95보를 ê°\80ì ¸ì\98¤ë\8a\94ë\8d° ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
+#: archive.c:429
+msgid "archive format"
+msgstr "ì\95\95ì¶\95 í\98\95ì\8b\9d"
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr "ì\9d´ ì\8b\9cì\8a¤í\85\9c ë\98\90ë\8a\94 ì\9c\84ì¹\98ì\97\90ì\84\9cë\8a\94 ì¶\94ì \81ë\90\98ì§\80 ì\95\8aë\8a\94 ìº\90ì\8b\9c를 ì\82¬ì\9a©í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤."
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "ì \91ë\91\90ì\96´"
 
-#: gpg-interface.c:178
-msgid "gpg failed to sign the data"
-msgstr "gpg에서 데이터를 서명하는데 실패했습니다."
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "아카이브의 각 경로 이름의 앞에 지정한 경로를 붙입니다"
 
-#: gpg-interface.c:208
-msgid "could not create temporary file"
-msgstr "임시 파일을 만들 수 없습니다"
+#: archive.c:432 builtin/blame.c:2607 builtin/blame.c:2608 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1054
+#: builtin/hash-object.c:101 builtin/ls-files.c:541 builtin/ls-files.c:544
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:109
+#: parse-options.h:153
+msgid "file"
+msgstr "파일"
 
-#: gpg-interface.c:210
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "분리된 서명을 '%s'에 쓰는데 실패했습니다"
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "아카이브를 이 파일에 씁니다"
 
-#: grep.c:1792
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s': %s을(를) 읽을 수 없습니다"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "작업 폴더의 .gitattributes를 읽습니다"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
-#, c-format
-msgid "failed to stat '%s'"
-msgstr "'%s'에 대해 stat()이 실패했습니다"
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "아카이브에 포함된 파일을 표준오류로 표시합니다"
 
-#: grep.c:1820
-#, c-format
-msgid "'%s': short read"
-msgstr "'%s': 읽다가 잘림"
+#: archive.c:437
+msgid "store only"
+msgstr "저장만 하기"
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "'%s'에 있는 깃 명령"
+#: archive.c:438
+msgid "compress faster"
+msgstr "더 빠르게 압축"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "ë\8b¤ë¥¸ $PATHì\97\90 ì\9e\88ë\8a\94 ê¹\83 ëª\85ë ¹"
+#: archive.c:446
+msgid "compress better"
+msgstr "ë\8d\94 ì\9e\91ê²\8c ì\95\95ì¶\95"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "다음은 여러가지 상황에서 자주 사용하는 깃 명령입니다:"
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "지원하는 압축 형식의 목록을 표시합니다"
 
-#: help.c:309
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-"'%s'은(는) 깃 명령으로 보이지만, 실행할 수\n"
-"없습니다. 아마도 git-%s 망가진 것 같습니다."
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:85 builtin/clone.c:88
+#: builtin/submodule--helper.c:603 builtin/submodule--helper.c:969
+msgid "repo"
+msgstr "저장소"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "ì\96´ë\9d¼ë\9d¼. ì\8b\9cì\8a¤í\85\9cì\97\90 ê¹\83 ëª\85ë ¹ì\9d´ í\95\98ë\82\98ë\8f\84 ì\97\86ë\8b¤ê³  ë\82\98ì\98µë\8b\88ë\8b¤."
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "ì\9b\90격 ì \80ì\9e¥ì\86\8c <ì \80ì\9e¥ì\86\8c\97\90ì\84\9c ì\95\84ì¹´ì\9d´ë¸\8c를 ê°\80ì ¸ì\98µë\8b\88ë\8b¤"
 
-#: help.c:388
-#, c-format
-msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
-msgstr ""
-"경고: 이름이 '%s'인 깃 명령을 실행했지만, 그 명령이 없습니다.\n"
-"자동으로 '%s' 명령이라고 가정하고 계속합니다"
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "명령"
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "(%0.1f초 뒤에)..."
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "원격 git-upload-archive 명령의 경로"
 
-#: help.c:400
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: '%s'은(는) 깃 명령이 아닙니다. 'git --help'를 참고하십시오."
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "예상치 못한 옵션 --remote"
 
-#: help.c:404 help.c:470
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"다음을 의도하신 것 아니었나요?"
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "--exec 옵션은 --remote 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "예상치 못한 옵션 --output"
 
-#: help.c:466
+#: archive.c:487
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+msgid "Unknown archive format '%s'"
+msgstr "알 수 없는 아카이브 형식 '%s'"
 
-#: lockfile.c:152
+#: archive.c:494
 #, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "'%s' 형식에서는 지원하지 않는 인자: -%d"
+
+#: attr.c:263
 msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
 msgstr ""
-"'%s.lock' 파일을 만들 수 없습니다: %s.\n"
-"\n"
-"이 저장소에서 다른 깃 프로세스가 실행 중인 것으로 보입니다. (예를\n"
-"들어 'git commit' 명령으로 편집기가 열려 있다든지.) 모든 프로세스를\n"
-"끝냈는지 확인하시고 다시 시도해 보십시오. 그래도 계속 실패하면, 이\n"
-"저장소에서 깃 프로세스가 전에 이상 종료했을 수도 있습니다:\n"
-"수동으로 해당 파일을 제거하고 계속하십시오."
+"git attributes에서 반대 패턴은 무시됩니다.\n"
+"앞에 느낌표를 쓰려면 '\\!'를 사용하십시오."
 
-#: lockfile.c:160
+#: bisect.c:441
 #, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "'%s.lock'을 만들 수 없습니다: %s"
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "캐시를 읽는데 실패했습니다"
-
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "새 인덱스 파일을 쓸 수 없습니다"
+msgid "Could not open file '%s'"
+msgstr "'%s' 파일을 열 수 없습니다"
 
-#: merge-recursive.c:212
-msgid "(bad commit)\n"
-msgstr "(잘못된 커밋)\n"
+#: bisect.c:446
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "'%s' 파일 안에 잘못된 따옴표가 붙은 내용: %s"
 
-#: merge-recursive.c:234
+#: bisect.c:655
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "'%s' 경로에 대해 addinfo_cache가 실패했습니다"
+msgid "We cannot bisect more!\n"
+msgstr "더 이상 이등분할 수 없습니다!\n"
 
-#: merge-recursive.c:304
-msgid "error building trees"
-msgstr "트리 빌드에 오류"
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "올바른 커밋 이름이 아닙니다 (%s)"
 
-#: merge-recursive.c:723
+#: bisect.c:732
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "'%s' 경로 만들기에 실패했습니다%s"
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"%s 병합 베이스가 비정상입니다.\n"
+"버그가 %s 및 [%s] 사이에서 고쳐졌다는 뜻입니다.\n"
 
-#: merge-recursive.c:734
+#: bisect.c:737
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "하위 디렉터리에 공간을 만드려고 %s을(를) 제거합니다\n"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"%s 병합 베이스가 새롭습니다.\n"
+"속성이 %s 및 [%s] 사이에서 변경되었습니다.\n"
 
-#: merge-recursive.c:748 merge-recursive.c:767
-msgid ": perhaps a D/F conflict?"
-msgstr ": 아마도 D/F 충돌?"
+#: bisect.c:742
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"%s 병합 베이스가 %s입니다.\n"
+"처음 '%s' 커밋이 %s 및 [%s] 사이라는 뜻입니다.\n"
 
-#: merge-recursive.c:757
+#: bisect.c:750
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "'%s' 위치의 추적되지 않는 파일을 잃기를 거부합니다"
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"일부 %s 리비전이 %s 리비전의 과거 항목이 아닙니다.\n"
+"git bisect 명령은 이 경우에는 올바르게 동작하지 않습니다.\n"
+"%s 및 %s 리비전을 잘못 쓴 것 아닙니까?\n"
 
-#: merge-recursive.c:799
+#: bisect.c:763
 #, c-format
-msgid "cannot read object %s '%s'"
-msgstr "%s '%s' 오브젝트를 읽을 수 없음"
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"%s 및 %s 사이의 머지 베이스를 건너뜁니다.\n"
+"그러므로 처음 %s 커밋이 %s 및 %s 사이에 있는지 확신할 수 없습니다.\n"
+"어쨌든 계속합니다."
 
-#: merge-recursive.c:801
+#: bisect.c:798
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "%s '%s'에 대해 블롭을 예상"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "이등분: 병합 베이스를 시험해야 합니다\n"
 
-#: merge-recursive.c:825
+#: bisect.c:849
 #, c-format
-msgid "failed to open '%s': %s"
-msgstr "'%s'을(를) 여는데 실패: %s"
+msgid "a %s revision is needed"
+msgstr "하나의 %s 리비전이 필요합니다"
 
-#: merge-recursive.c:836
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:262
 #, c-format
-msgid "failed to symlink '%s': %s"
-msgstr "'%s' 심볼릭 링크에 실패: %s"
+msgid "could not create file '%s'"
+msgstr "'%s' 파일을 만들 수 없습니다"
 
-#: merge-recursive.c:841
+#: bisect.c:917
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "다음을 어떻게 할지 알 수 없습니다: %06o %s '%s'"
+msgid "could not read file '%s'"
+msgstr "'%s' 파일을 읽을 수 없습니다"
 
-#: merge-recursive.c:981
-msgid "Failed to execute internal merge"
-msgstr "내부 병합 실행에 실패"
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "이등분 레퍼런스 읽기에 실패했습니다"
 
-#: merge-recursive.c:985
+#: bisect.c:967
 #, c-format
-msgid "Unable to add %s to database"
-msgstr "%sì\9d\84(를) ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì¶\94ê°\80í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
+msgid "%s was both %s and %s\n"
+msgstr "%sì\9d\80\8a\94) %s ë°\8f %s ëª¨ë\91\90ì\97\90 í\95´ë\8b¹ë\90©ë\8b\88ë\8b¤\n"
 
-#: merge-recursive.c:1084 merge-recursive.c:1098
+#: bisect.c:975
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 msgstr ""
-"충돌! (%s/삭제): %s (위치 %s) 및 %s (%s에서) 삭제. %s 버전의 %s 트리에 남음."
+"시험 가능한 커밋이 없습니다.\n"
+"잘못도니 경로 파라미터로 시작하지 않았습니까?\n"
 
-#: merge-recursive.c:1090 merge-recursive.c:1103
+#: bisect.c:994
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-"충돌! (%s/삭제): %s (위치 %s) 및 %s (위치 %s) 삭제. %s 버전의 %s 트리에 "
-"%s(으)로 남음."
-
-#: merge-recursive.c:1146
-msgid "rename"
-msgstr "이름바꾸기"
-
-#: merge-recursive.c:1146
-msgid "renamed"
-msgstr "이름바꿈"
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(대략 %d 단계)"
 
-#: merge-recursive.c:1203
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s은(는) %s에 있는 디렉터리로 %s(으)로 이름을 바꿉니다"
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "이등분: %2$s 뒤에 시험할 리비전이 %1$d개 남았습니다\n"
 
-#: merge-recursive.c:1228
+#: branch.c:53
 #, c-format
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
 msgstr ""
-"충돌! (이름바꾸기/이름바꾸기): \"%3$s\" 브랜치에서 이름바꾸기 \"%1$s\"->"
-"\"%2$s\" \"%6$s\" 브랜치에서 이름 바꾸기 \"%4$s\"->\"%5$s\"%7$s"
+"\n"
+"오류를 수정한 다음 원격 추적 정보를\n"
+"\"git branch --set-upstream-to=%s%s%s\" 명령을\n"
+"실행해 수정할 수 있습니다."
 
-#: merge-recursive.c:1233
-msgid " (left unresolved)"
-msgstr " (해결되지 않음)"
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "%s 브랜치를 자신의 업스트림으로 지정하지 않음."
 
-#: merge-recursive.c:1295
+#: branch.c:93
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
-"충돌! (rename/rename): 이름 바꾸기 %s->%s (위치 %s). 이름 바꾸기 %s->%s (위"
-"ì¹\98 %s)"
+"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었"
+"ì\8aµë\8b\88ë\8b¤."
 
-#: merge-recursive.c:1328
+#: branch.c:94
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "대신 이름을 %s에서 %s(으)로 바꾸고 %s에서 %s(으)로 바꿉니다"
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "%s 브랜치가 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었습니다."
 
-#: merge-recursive.c:1534
+#: branch.c:98
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr "충돌! (rename/add): 이름 바꾸기 %s->%s (위치 %s). %s 추가 (위치 %s)"
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 따라가도록 설정되었습니다."
 
-#: merge-recursive.c:1549
+#: branch.c:99
 #, c-format
-msgid "Adding merged %s"
-msgstr "병합된 %s을(를) 추가합니다"
+msgid "Branch %s set up to track local branch %s."
+msgstr "%s 브랜치가 %s 브랜치를 따라가도록 설정되었습니다."
 
-#: merge-recursive.c:1556 merge-recursive.c:1769
+#: branch.c:104
 #, c-format
-msgid "Adding as %s instead"
-msgstr "대신 %s(으)로 추가합니다"
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
 
-#: merge-recursive.c:1613
+#: branch.c:105
 #, c-format
-msgid "cannot read object %s"
-msgstr "%s 오브젝트를 읽을 수 없습니다"
+msgid "Branch %s set up to track remote ref %s."
+msgstr "%s 브랜치가 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
 
-#: merge-recursive.c:1616
+#: branch.c:109
 #, c-format
-msgid "object %s is not a blob"
-msgstr "%s 오브젝트는 블롭이 아닙니다"
-
-#: merge-recursive.c:1669
-msgid "modify"
-msgstr "수정"
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
 
-#: merge-recursive.c:1669
-msgid "modified"
-msgstr "수정됨"
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "%s 브랜치가 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
 
-#: merge-recursive.c:1679
-msgid "content"
-msgstr "내용"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "업스트림 브랜치 설정을 쓸 수 없습니다"
 
-#: merge-recursive.c:1686
-msgid "add/add"
-msgstr "추가/추가"
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "따라가지 않음: %s 레퍼런스에 대해 애매한 정보"
 
-#: merge-recursive.c:1721
+#: branch.c:185
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "건너뛰기: %s (기존과 같게 병합)"
+msgid "'%s' is not a valid branch name."
+msgstr "'%s'은(는) 올바른 브랜치 이름이 아닙니다."
 
-#: merge-recursive.c:1735
+#: branch.c:190
 #, c-format
-msgid "Auto-merging %s"
-msgstr "ì\9e\90ë\8f\99 ë³\91í\95©: %s"
+msgid "A branch named '%s' already exists."
+msgstr "ì\9d´ë¦\84ì\9d´ '%s'ì\9d¸ ë¸\8cë\9e\9cì¹\98ê°\80 ì\9d´ë¯¸ ì\9e\88ì\8aµë\8b\88ë\8b¤."
 
-#: merge-recursive.c:1739 git-submodule.sh:919
-msgid "submodule"
-msgstr "í\95\98ì\9c\84 ëª¨ë\93\88"
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "í\98\84ì\9e¬ ë¸\8cë\9e\9cì¹\98를 ê°\95ì \9cë¡\9c ì\97\85ë\8d°ì\9d´í\8a¸í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤."
 
-#: merge-recursive.c:1740
+#: branch.c:218
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "충돌! (%s): %s에 병합 충돌"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"따라가기 정보를 설정할 수 없습니다. 시작 위치 '%s'이(가) 브랜치가 아닙니다."
 
-#: merge-recursive.c:1834
+#: branch.c:220
 #, c-format
-msgid "Removing %s"
-msgstr "제거: %s"
-
-#: merge-recursive.c:1860
-msgid "file/directory"
-msgstr "파일/디렉터리"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "요청한 업스트림 '%s' 브랜치가 없습니다"
 
-#: merge-recursive.c:1866
-msgid "directory/file"
-msgstr "디렉터리/파일"
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"리모트에 이미 있는 업스트림 브랜치를 기반으로 작업하려면,\n"
+"먼저 \"git fetch\"로 가져 리모트 브랜치를 가져옵니다.\n"
+"\n"
+"새 로컬 브랜치를 거기에 해당하는 리모트 브랜치로 push하려면,\n"
+"\"git push -u\"로 push하는 업스트림을 설정할 수 있습니다."
 
-#: merge-recursive.c:1871
+#: branch.c:265
 #, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-"충돌! (%s): 이름이 %s인 디렉터리가 %s에 있습니다. %s을(를) %s(으)로 추가합니"
-"다"
+msgid "Not a valid object name: '%s'."
+msgstr "올바른 오브젝트 이름이 아닙니다: '%s'."
 
-#: merge-recursive.c:1880
+#: branch.c:285
 #, c-format
-msgid "Adding %s"
-msgstr "ì\94ê°\80: %s"
+msgid "Ambiguous object name: '%s'."
+msgstr "ì\95 ë§¤í\95\9c ì\98¤ë¸\8cì \9dí\8a¸ ì\9d´ë¦\84: '%s'."
 
-#: merge-recursive.c:1917
-msgid "Already up-to-date!"
-msgstr "이미 업데이트 상태입니다!"
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "올바른 브랜치 위치가 아닙니다: '%s'."
 
-#: merge-recursive.c:1926
+#: branch.c:344
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "%s ë°\8f %s í\8a¸ë¦¬ì\9d\98 ë³\91í\95©ì\9d´ ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s'ì\9d\80\8a\94) ì\9d´ë¯¸ '%s' ì\9c\84ì¹\98ì\97\90 ë°\9bì\95\84ì ¸ ì\9e\88ì\8aµë\8b\88ë\8b¤"
 
-#: merge-recursive.c:2009
-msgid "Merging:"
-msgstr "병합:"
+#: branch.c:363
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "작업 폴더 %s의 헤드가 업데이트되지 않았습니다"
 
-#: merge-recursive.c:2022
+#: bundle.c:34
 #, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "과거의 공통 커밋 %u개 발견:"
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' 파일이 버전2 번들 파일로 보이지 않습니다"
 
-#: merge-recursive.c:2061
-msgid "merge returned no commit"
-msgstr "병합 결과에 커밋이 없습니다"
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "인식할 수 없는 헤더: %s%s (%d)"
 
-#: merge-recursive.c:2124
+#: bundle.c:87 sequencer.c:1331 sequencer.c:1752 builtin/commit.c:777
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "'%s' 오브젝트를 파싱할 수 없습니다"
+msgid "could not open '%s'"
+msgstr "'%s'을(를) 열 수 없습니다"
 
-#: merge-recursive.c:2138 builtin/merge.c:641 builtin/merge.c:788
-msgid "Unable to write index."
-msgstr "ì\9d¸ë\8d±ì\8a¤ë¥¼ ì\93¸ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤."
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "ì \80ì\9e¥ì\86\8cì\97\90 í\95\84ì\88\98ì \81ì\9d¸ ë\8b¤ì\9d\8c ì»¤ë°\8bì\9d´ ì\97\86ì\8aµë\8b\88ë\8b¤:"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "초기화하지 않았거나 레퍼런스하지 않은 notes 트리를 커밋할 수 없습니다"
+#: bundle.c:163 ref-filter.c:1499 sequencer.c:1154 sequencer.c:2290
+#: builtin/blame.c:2820 builtin/commit.c:1061 builtin/log.c:348
+#: builtin/log.c:890 builtin/log.c:1340 builtin/log.c:1666 builtin/log.c:1909
+#: builtin/merge.c:360 builtin/shortlog.c:177
+msgid "revision walk setup failed"
+msgstr "리비전 walk 준비가 실패했습니다"
 
-#: notes-utils.c:100
+#: bundle.c:185
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "잘못된 notes.rewriteMode 값: '%s'"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "번들에 다음 레퍼런스 %d개가 있습니다:"
 
-#: notes-utils.c:110
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "%s에서 노트를 다시 쓰기를 거부합니다 (refs/notes/ 밖임)"
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "번들은 전체 커밋 내역을 기록합니다."
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: bundle.c:194
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "잘못된 %s 값: '%s'"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "번들에 다음 레퍼런스 %d개가 필요합니다:"
 
-#: object.c:242
-#, c-format
-msgid "unable to parse object: %s"
-msgstr "오브젝트를 파싱할 수 없습니다: %s"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "pack-objects 명령을 실행할 수 없습니다"
 
-#: parse-options.c:572
-msgid "..."
-msgstr "..."
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "pack-objects 명령이 죽었습니다"
 
-#: parse-options.c:590
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list 명령이 죽었습니다"
+
+#: bundle.c:353
 #, c-format
-msgid "usage: %s"
-msgstr "사용법: %s"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "rev-list 옵션에서 '%s' 레퍼런스가 제외되었습니다"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:282
 #, c-format
-msgid "   or: %s"
-msgstr "  또는: %s"
+msgid "unrecognized argument: %s"
+msgstr "알 수 없는 인자: %s"
 
-#: parse-options.c:597
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "빈 번들은 만들지 않습니다."
+
+#: bundle.c:463
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "cannot create '%s'"
+msgstr "'%s'을(를) 만들 수 없습니다"
 
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-NUM"
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "index-pack 명령이 죽었습니다"
 
-#: parse-options-cb.c:108
+#: color.c:300
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "잘못된 형식의 오브젝트 이름 '%s'"
+msgid "invalid color value: %.*s"
+msgstr "잘못된 색 값: %.*s"
 
-#: path.c:796
+#: commit.c:40 sequencer.c:1564 builtin/am.c:421 builtin/am.c:457
+#: builtin/am.c:1493 builtin/am.c:2127
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "%s을(를) 그룹에서 쓰기 가능하도록 만들 수 없습니다"
+msgid "could not parse %s"
+msgstr "parse %s을(를) 파싱할 수 없습니다"
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr "'glob' 및 'noglob' 경로명세 전체 설정은 호환되지 않습니다"
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s, 커밋이 아닙니다"
 
-#: pathspec.c:143
+#: commit.c:1514
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
 msgstr ""
-"'literal' 경로명세 전체 설정은 다른 경로명세 전체 설정과 호환되지 않습니다"
+"경고: 커밋 메시지가 UTF-8 인코딩에 맞지 않습니다.\n"
+"메시지를 수정한 다음 커밋을 수정하거나, 설정의 i18n.commitencoding\n"
+"변수를 프로젝트가 사용 중인 인코딩으로 맞추십시오.\n"
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "경로명세 지시어 'prefix'에 잘못된 파라미터"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "메모리 바닥남"
 
-#: pathspec.c:183
+#: config.c:518
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "잘못된 경로명세 지시어 '%.*s' (위치 '%s')"
-
-#: pathspec.c:187
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "경로 명세 지시어 끝에 ')' 빠짐 (위치 '%s')"
-
-#: pathspec.c:205
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "구현되지 않은 경로명세 지시어 '%c' (위치 '%s')"
+msgid "bad config line %d in blob %s"
+msgstr "블롭 %2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: pathspec.c:230
+#: config.c:522
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: 'literal'과 'glob'은 호환되지 않습니다"
+msgid "bad config line %d in file %s"
+msgstr "파일 %2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: pathspec.c:241
+#: config.c:526
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: '%s'은(는) 저장소 밖입니다"
+msgid "bad config line %d in standard input"
+msgstr "표준 입력 안에 %d번 줄에 잘못된 설정"
 
-#: pathspec.c:291
+#: config.c:530
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "경로명세 '%s'은(는) ''%.*s' 하위 모듈 안에 있습니다"
+msgid "bad config line %d in submodule-blob %s"
+msgstr "하위 모듈 블롭 %2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: pathspec.c:353
+#: config.c:534
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr "%s: 경로명세 지시어가 이 명령어에서 지원하지 않습니다: %s"
+msgid "bad config line %d in command line %s"
+msgstr "명령행 %2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: pathspec.c:433
+#: config.c:538
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "'%s' 경로명세는 심볼릭 링크 아래에 있습니다"
-
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-":(exclude) 패턴으로 제외할 사항이 없습니다.\n"
-"':/' 또는 '.' 추가를 잊으신 것 아닙니까?"
+msgid "bad config line %d in %s"
+msgstr "%2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: pretty.c:973
-msgid "unable to parse --pretty format"
-msgstr "--pretty 형식을 파싱할 수 없습니다"
+#: config.c:657
+msgid "out of range"
+msgstr "범위를 벗어남"
 
-#: progress.c:235
-msgid "done"
-msgstr "완료"
+#: config.c:657
+msgid "invalid unit"
+msgstr "단위가 잘못됨"
 
-#: read-cache.c:1281
+#: config.c:663
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"index.version이 설정되었지만, 이 값이 잘못되었습니다.\n"
-"%i 버전을 사용합니다"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s'): %s"
 
-#: read-cache.c:1291
+#: config.c:668
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"GIT_INDEX_VERSION이 설정되었지만, 이 값이 잘못되었습니다.\n"
-"%i 버전을 사용합니다"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 블롭 %s): %s"
 
-#: refs.c:551 builtin/merge.c:840
+#: config.c:671
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 파일 %s): %s"
 
-#: refs/files-backend.c:2534
+#: config.c:674
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "%s 레퍼런스를 삭제할 수 없습니다: %s"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 표준입력): %s"
 
-#: refs/files-backend.c:2537
+#: config.c:677
 #, c-format
-msgid "could not delete references: %s"
-msgstr "레퍼런스를 삭제할 수 없습니다: %s"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 하위 모듈 블롭 %s): %s"
 
-#: refs/files-backend.c:2546
+#: config.c:680
 #, c-format
-msgid "could not remove reference %s"
-msgstr "%s 레퍼런스를 제거할 수 없습니다"
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 명령행 %s): %s"
 
-#: ref-filter.c:55
+#: config.c:683
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "ì\98\88ì\83\81í\95\9c í\98\95ì\8b\9d: %%(color:<ì\83\89>)"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "ì\9e\98못ë\90\9c ì\88\98ì¹\98 ì\84¤ì \95 ê°\92 '%s' (í\82¤ '%s', %s ì\95\88ì\97\90): %s"
 
-#: ref-filter.c:57
+#: config.c:770
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "인식할 수 없는 색: %%(color:%s)"
+msgid "failed to expand user dir in: '%s'"
+msgstr "다음에 사용자 디렉터리 확장에 실패: '%s'"
 
-#: ref-filter.c:71
+#: config.c:865 config.c:876
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "알 수 없는 형식: %%(%s)"
+msgid "bad zlib compression level %d"
+msgstr "%d번은 올바른 zlib 압축 단계가 아닙니다"
 
-#: ref-filter.c:77
+#: config.c:993
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body)에 인자를 받지 않습니다"
+msgid "invalid mode for object creation: %s"
+msgstr "오브젝트 생성 모드가 올바르지 않습니다: %s"
 
-#: ref-filter.c:84
+#: config.c:1149
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject)에 인자를 받지 않습니다"
+msgid "bad pack compression level %d"
+msgstr "잘못 묶음 압축 단계 %d"
 
-#: ref-filter.c:101
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "'contents:lines=%s'에서 0보다 큰 값이 와야 합니다"
+#: config.c:1339
+msgid "unable to parse command-line config"
+msgstr "명령행 설정을 파싱할 수 없습니다"
 
-#: ref-filter.c:103
-#, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "알 수 없는 %%(contents) 인자: %s"
+#: config.c:1389
+msgid "unknown error occurred while reading the configuration files"
+msgstr "설정 파일을 읽는 중 알 수 없는 오류가 생겼습니다"
 
-#: ref-filter.c:113
+#: config.c:1743
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "알 수 없는 %%(objectname) 인자: %s"
+msgid "unable to parse '%s' from command-line config"
+msgstr "명령행 설정에서 '%s'을(를) 설정할 수 없습니다"
 
-#: ref-filter.c:135
+#: config.c:1745
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "예상한 형식: %%(align:<너비>,<위치>)"
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "'%2$s' 파일의 %3$d번 줄 '%1$s' 설정 변수가 잘못되었습니다"
 
-#: ref-filter.c:147
+#: config.c:1804
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "인식할 수 없는 위치:%s"
+msgid "%s has multiple values"
+msgstr "%s은(는) 여러 개 값이 있습니다"
 
-#: ref-filter.c:151
+#: config.c:2225 config.c:2450
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "인식할 수 없는 너비:%s"
+msgid "fstat on %s failed"
+msgstr "%s에 대해 fstat 실패"
 
-#: ref-filter.c:157
+#: config.c:2343
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "인식할 수 없는 %%(align) 인자:%s"
+msgid "could not set '%s' to '%s'"
+msgstr "'%s'을(를) '%s'(으)로 설정할 수 없습니다"
 
-#: ref-filter.c:161
+#: config.c:2345
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "%%(align) 아톰에 너비가 0보다 커야 합니다"
+msgid "could not unset '%s'"
+msgstr "'%s' 설정을 지울 수 없습니다"
 
-#: ref-filter.c:244
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr "잘못된 형식의 필드 이름: %.*s"
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "리모트 측이 최초 연결했을 때 연결을 끊었습니다"
 
-#: ref-filter.c:270
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr "알 수 없는 필드 이름: %.*s"
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"리모트 저장소에서 읽을 수 없습니다\n"
+"\n"
+"올바른 접근 권한이 있는지, 그리고 저장소가 있는지\n"
+"확인하십시오."
 
-#: ref-filter.c:372
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "형식: %%(end) 아톰이 대응되는 아톰 없이 사용되었습니다"
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "연결을 확인하는 중입니다"
 
-#: ref-filter.c:424
-#, c-format
-msgid "malformed format string %s"
-msgstr "잘못된 형식의 문자열 %s"
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "'git rev-list'를 실행할 수 없습니다"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= 명령에는 0보다 큰 정수 인자가 필요합니다"
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "rev-list 쓰기에 실패했습니다"
 
-#: ref-filter.c:883
-#, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "'%s' 레퍼런스에 :strip할 구성 요소 %ld개가 없습니다"
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "rev-list의 표준입력을 닫는데 실패했습니다"
 
-#: ref-filter.c:1046
+#: convert.c:201
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "알 수 없는 %.*s 형식 %s"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"%s에서 CRLF는 LF로 바뀝니다.\n"
+"작업 디렉터리에서는 원래 줄 바꿈 형식을 유지합니다."
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: convert.c:205
 #, c-format
-msgid "missing object %s for %s"
-msgstr "없는 오브젝트 %s, %s에 대해"
+msgid "CRLF would be replaced by LF in %s."
+msgstr "%s에서 CRLF는 LF로 바뀝니다."
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: convert.c:211
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "%s에 parse_object_buffer 실패 (%s에 대해)"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"%s에서 LF는 CRLF로 바뀝니다.\n"
+"작업 디렉터리에서는 원래 줄 바꿈 형식을 유지합니다."
 
-#: ref-filter.c:1311
+#: convert.c:215
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "'%s'에 잘못된 형식의 오브젝트"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "%s에서 LF는 CRLF로 바뀝니다."
 
-#: ref-filter.c:1373
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "망가진 이름 %s에 레퍼런스를 무시합니다"
+#: date.c:97
+msgid "in the future"
+msgstr "미래에"
 
-#: ref-filter.c:1378
+#: date.c:103
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "망가진 레퍼런스 %s 무시"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu초 전"
 
-#: ref-filter.c:1651
+#: date.c:110
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "형식: %%(end) 아톰이 없습니다"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu분 전"
 
-#: ref-filter.c:1705
+#: date.c:117
 #, c-format
-msgid "malformed object name %s"
-msgstr "잘못된 형식의 오브젝트 이름 %s"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu시간 전"
 
-#: remote.c:746
+#: date.c:124
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "%s 및 %s을(를) 모두 %s에 가져올 수 없습니다"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu일 전"
 
-#: remote.c:750
+#: date.c:130
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s은(는) 보통 %s을(를) 추적하고, %s을(를) 추적하지 않습니다"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu주 전"
 
-#: remote.c:754
+#: date.c:137
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s은(는) %s 및 %s 모두 추적합니다"
-
-#: remote.c:762
-msgid "Internal error"
-msgstr "내부 오류"
-
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD가 브랜치를 가리키지 않습니다"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu달 전"
 
-#: remote.c:1686
+#: date.c:148
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "그런 브랜치가 없습니다: '%s'"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu년"
 
-#: remote.c:1689
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "'%s' 브랜치에 대해 업스트림을 설정하지 않았습니다"
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s %lu달 전"
 
-#: remote.c:1695
+#: date.c:156 date.c:161
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "업스트림 '%s' 브랜치가 리모트 추적 브랜치로 저장되지 않았습니다"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu년 전"
 
-#: remote.c:1710
+#: diffcore-order.c:24
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr "리모트 '%2$s'의 푸시 대상 '%1$s'에 로컬 추적 브랜치가 없습니다"
+msgid "failed to read orderfile '%s'"
+msgstr "'%s' 순서 파일을 읽는데 실패했습니다"
 
-#: remote.c:1725
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "'%s' 브랜치에 푸시 리모트가 없습니다"
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "부정확한 이름 바꾸기 탐색을 수행하는 중"
 
-#: remote.c:1736
+#: diff.c:62
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "'%s'에 대한 푸시 레퍼런스명세에 '%s'이(가) 들어 있지 않습니다"
-
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "푸시의 대상이 없습니다 (push.default가 'nothing'입니다)"
+msgid "option '%s' requires a value"
+msgstr "'%s' 옵션에는 값이 필요합니다"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "하나의 대상에 대해 'simple' 푸시를 처리할 수 없습니다"
-
-#: remote.c:2073
+#: diff.c:124
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "현재 브랜치가 '%s' 기반이지만, 업스트림이 없어졌습니다.\n"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  dirstat 자름 퍼센트 값 '%s' 파싱에 실패했습니다\n"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (바로잡으려면 \"git branch --unset-upstream\"을 사용하십시오)\n"
+#: diff.c:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  알 수 없는 dirstat 파라미터 '%s'\n"
 
-#: remote.c:2080
+#: diff.c:281
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "브랜치가 '%s'에 맞게 업데이트된 상태입니다.\n"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "'diff.submodule' 설정 변수에 알 수 없는 값: '%s'"
 
-#: remote.c:2084
+#: diff.c:344
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "브랜치가 '%s'보다 %d개 커밋만큼 앞에 있습니다.\n"
-
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (로컬에 있는 커밋을 제출하려면 \"git push\"를 사용하십시오)\n"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"'diff.submodule' 설정 변수에 오류:\n"
+"%s'"
 
-#: remote.c:2093
+#: diff.c:3085
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] "브랜치가 '%s'보다 %d개 커밋 뒤에 있고, 앞으로 돌릴 수 있습니다.\n"
+msgid "external diff died, stopping at %s"
+msgstr "외부 diff 프로그램이 죽음, %s 위치에서 멈춤"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (로컬 브랜치를 업데이트하려면 \"git pull\"을 사용하십시오)\n"
+#: diff.c:3411
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr ""
+"\"--name-only, --name-status, --check, -s 옵션 중 하나만 쓸 수 있습니다"
+
+#: diff.c:3501
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow 옵션에는 정확히 하나의 경로명세가 필요합니다"
 
-#: remote.c:2104
+#: diff.c:3664
 #, c-format
 msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"현재 브랜치와 '%s'이(가) 갈라졌습니다,\n"
-"다른 커밋이 각각 %d개와 %d개 있습니다.\n"
-
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
 msgstr ""
-"  (리모트의 브랜치를 현재 브랜치로 병합하려면 \"git pull\"을 사용하십시오)\n"
-
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "현재 브랜치가 망가진 것처럼 보입니다"
+"--dirstat/-X 옵션 파라미터를 파싱하는데 실패했습니다:\n"
+"%s"
 
-#: revision.c:2135
+#: diff.c:3678
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "현재 '%s' 브랜치에 아직 아무 커밋도 없습니다"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "--submodule 옵션 파라미터 파싱에 실패했습니다: '%s'"
 
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent 옵션은 --bisect 옵션과 호환되지 않습니다"
+#: diff.c:4696
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "파일이 너무 많아서 부정확한 이름 바꾸기 검색 기능을 건너뜁니다."
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "/dev/null 열기 실패"
+#: diff.c:4699
+msgid "only found copies from modified paths due to too many files."
+msgstr "파일이 너무 많아서 수정한 경로의 복사본만 찾았습니다."
 
-#: run-command.c:94
+#: diff.c:4702
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) 실패"
-
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "푸시 인증서 서명에 실패했습니다"
-
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "받는 쪽에서 --signed 푸시를 지원하지 않습니다"
-
-#: send-pack.c:413
 msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"받는 쪽에서 --signed 푸시를 지원하지 않으므로 푸시 인증서를 보내지 않습니다"
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr "%s 변수를 최소한 %d(으)로 설정하고 명령을 다시 시도해 보십시오."
 
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "받는 쪽에서 --atomic 푸시를 지원하지 않습니다"
-
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "받는 쪽에서 푸시 옵션을 지원하지 않습니다"
-
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
-"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오"
+#: dir.c:1862
+msgid "failed to get kernel name and information"
+msgstr "커널 이름과 정보를 가져오는데 실패했습니다"
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
-"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오.\n"
-"그리고 결과물을 'git commit'으로 커밋하십시오"
+#: dir.c:1981
+msgid "Untracked cache is disabled on this system or location."
+msgstr "이 시스템 또는 위치에서는 추적되지 않는 캐시를 사용하지 않습니다."
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: dir.c:2759
 #, c-format
-msgid "Could not write to %s"
-msgstr "%s에 쓸 수 없습니다"
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 git 디렉터리를 옮겨올 수 없습니다"
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
-#, c-format
-msgid "Error wrapping up %s."
-msgstr "%s 잠그는데 오류."
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: 얕은 목록을 예상함"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "로컬 변경 사항을 cherry-pick 때문에 덮어 쓰게 됩니다."
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ACK/NAK가 와야 하지만, EOF를 받았습니다"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "로컬 변경 사항을 revert 때문에 덮어 쓰게 됩니다."
+#: fetch-pack.c:243
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK가 와야 하지만, '%s'을(를) 받았습니다"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "변경 사항을 스테이징하거나 스태시한 다음 계속하십시오."
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc 옵션은 multi_ack_detailed가 필요합니다"
 
-#: sequencer.c:228
+#: fetch-pack.c:381
 #, c-format
-msgid "%s: fast-forward"
-msgstr "%s: 정방향 진행"
+msgid "invalid shallow line: %s"
+msgstr "shallow 줄이 잘못됨: %s"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
+#: fetch-pack.c:387
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: 새 인덱스 파일을 쓸 수 없습니다"
-
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "HEAD 커밋을 처리할 수 없습니다\n"
-
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "캐시 트리를 업데이트할 수 없습니다\n"
+msgid "invalid unshallow line: %s"
+msgstr "unshallow 줄이 잘못됨: %s"
 
-#: sequencer.c:393
+#: fetch-pack.c:389
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "%s 커밋을 파싱할 수 없습니다\n"
+msgid "object not found: %s"
+msgstr "오브젝트가 없습니다: %s"
 
-#: sequencer.c:398
+#: fetch-pack.c:392
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "%s 이전 커밋을 파싱할 수 없습니다\n"
-
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "인덱스 파일이 병합되지 않았습니다."
+msgid "error in object: %s"
+msgstr "오브젝트에 오류: %s"
 
-#: sequencer.c:482
+#: fetch-pack.c:394
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "%s 커밋은 병합이지만 -m 옵션이 주어지지 않았습니다."
+msgid "no shallow found: %s"
+msgstr "shallow가 없습니다: %s"
 
-# FIXME: "parent %d" 번호가 무슨 의미?
-#: sequencer.c:490
+#: fetch-pack.c:397
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Commit %s 커밋에 이전 커밋 %d이(가) 없습니다"
+msgid "expected shallow/unshallow, got %s"
+msgstr "shallow/unshallow가 와야 하지만, %s을(를) 받았습니다"
 
-#: sequencer.c:494
+#: fetch-pack.c:436
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "ë©\94ì\9d¸ë\9d¼ì\9d¸ì\9d\84 ì§\80ì \95í\96\88ì§\80ë§\8c %s ì»¤ë°\8bì\9d´ ë³\91í\95© ì»¤ë°\8bì\9d´ ì\95\84ë\8b\99ë\8b\88ë\8b¤."
+msgid "got %s %d %s"
+msgstr "ë°\9bì\9d\8c: %s %d %s"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: fetch-pack.c:450
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: %s 이전 커밋을 파싱할 수 없습니다"
+msgid "invalid commit %s"
+msgstr "잘못된 커밋 %s"
+
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "포기함"
+
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "완료"
 
-#: sequencer.c:511
+#: fetch-pack.c:505
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "%s에 대한 커밋 메시지를 가져올 수 없습니다"
+msgid "got %s (%d) %s"
+msgstr "받음: %s (%d) %s"
 
-#: sequencer.c:597
+#: fetch-pack.c:551
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "다음을 되돌릴(revert) 수 없습니다: %s... %s"
+msgid "Marking %s as complete"
+msgstr "%s 항목을 완료로 표시"
 
-#: sequencer.c:598
+#: fetch-pack.c:697
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "다음을 적용할(apply) 수 없습니다: %s... %s"
+msgid "already have %s (%s)"
+msgstr "이미 %s (%s) 있음"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "빈 커밋 모음을 건너 뜁니다"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: 사이드밴드 디멀티플렉서를 fork할 수 없습니다"
+
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "프로토콜 오류: 잘못된 묶음 헤더"
 
-#: sequencer.c:641
+#: fetch-pack.c:799
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: 인덱스 읽기에 실패했습니다"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: %s 명령을 fork할 수 없습니다"
 
-#: sequencer.c:645
+#: fetch-pack.c:815
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: 인덱스 새로 고침에 실패했습니다"
+msgid "%s failed"
+msgstr "%s 실패"
 
-#: sequencer.c:705
-msgid "Cannot revert during a another revert."
-msgstr "되돌리는(revert) 중에 또 다른 되돌리기를 할 수 없습니다."
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "사이드밴드 디멀티플렉서에 오류"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "빼오기(cherry-pick) 중에 되돌리기(revert)를 할 수 없습니다."
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "서버에서 shallow 클라이언트를 지원하지 않습니다"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "되돌리기(revert) 중에 빼오기(cherry-pick)를 할 수 없습니다"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "서버에서 multi_ack_detailed를 지원합니다"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "빼오기(revert) 중에 또 다른 빼오기를 할 수 없습니다"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "서버에서 no-done을 지원합니다"
 
-#: sequencer.c:732
-#, c-format
-msgid "Could not parse line %d."
-msgstr "%d번 줄을 파싱할 수 없습니다."
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "서버에서 multi_ack를 지원합니다"
 
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "파싱한 커밋이 없습니다."
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "서버에서 side-band-64k를 지원합니다"
 
-#: sequencer.c:749
-#, c-format
-msgid "Could not open %s"
-msgstr "%s을(를) 열 수 없습니다"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "서버에서 side-band를 지원합니다"
 
-#: sequencer.c:753
-#, c-format
-msgid "Could not read %s."
-msgstr "%s을(를) 읽을 수 없습니다."
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "서버에서 allow-tip-sha1-in-want를 지원합니다"
 
-#: sequencer.c:760
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "사용 불가능 인스트럭션 파일: %s"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "서버에서 allow-reachable-sha1-in-want를 지원합니다"
 
-#: sequencer.c:790
-#, c-format
-msgid "Invalid key: %s"
-msgstr "잘못된 키: %s"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "서버에서 ofs-delta를 지원합니다"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#: fetch-pack.c:890
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "%s의 값이 올바르지 않습니다: %s"
+msgid "Server version is %.*s"
+msgstr "서버 버전이 %.*s입니다"
 
-#: sequencer.c:803
-#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "형식이 잘못된 옵션 파일: %s"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "서버에서 --shallow-signed 옵션을 지원하지 않습니다"
 
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "ì\9d´ë¯¸ ì»¤ë°\8b ë¹¼ì\98¤ê¸°(cherry-pick) ë\98\90ë\8a\94 ë\90\98ë\8f\8c리기(revert)ê°\80 ì§\84í\96\89 ì¤\91ì\9e\85니다"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "ì\84\9cë²\84ì\97\90ì\84\9c --shallow-exclude ì\98µì\85\98ì\9d\84 ì§\80ì\9b\90í\95\98ì§\80 ì\95\8aì\8aµ니다"
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "\"git cherry-pick (--continue | --quit | --abort)\" ëª\85ë ¹ì\9d\84 í\95´ ë³´ì\8b­ì\8b\9cì\98¤"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "ì\84\9cë²\84ì\97\90ì\84\9c --deepen ì\98µì\85\98ì\9d\84 ì§\80ì\9b\90í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤"
 
-#: sequencer.c:827
-#, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "%s 시퀀서 디렉터리를 만들 수 없습니다"
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "공통 커밋 없음"
 
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중이지 않습니다"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: 가져오기 실패."
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "HEAD를 구해 올 수 없습니다"
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "해당하는 리모트 헤드가 없습니다"
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "새로 만들고 있는 브랜치에서 중지할 수 없습니다"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg에서 데이터를 서명하는데 실패했습니다."
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
-#, c-format
-msgid "cannot open %s"
-msgstr "%s을(를) 열 수 없습니다"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "임시 파일을 만들 수 없습니다"
 
-#: sequencer.c:888
+#: gpg-interface.c:217
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "%s을(를) 읽을 수 없습니다: %s"
+msgid "failed writing detached signature to '%s'"
+msgstr "분리된 서명을 '%s'에 쓰는데 실패했습니다"
 
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "예상치 못하게 파일이 끝났습니다"
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "log.graphColors에 잘못된 색을 ('%.*s') 무시합니다"
 
-#: sequencer.c:895
+#: grep.c:1794
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "빼오기 전에 저장한 HEAD 파일이('%s') 손상되었습니다"
+msgid "'%s': unable to read %s"
+msgstr "'%s': %s을(를) 읽을 수 없습니다"
 
-#: sequencer.c:921
+#: grep.c:1811 builtin/clone.c:381 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
-msgid "Could not format %s."
-msgstr "%s에 포매팅할 수 없습니다."
+msgid "failed to stat '%s'"
+msgstr "'%s'에 대해 stat()이 실패했습니다"
 
-#: sequencer.c:1066
+#: grep.c:1822
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: %s 커밋을 빼올 수 없습니다"
+msgid "'%s': short read"
+msgstr "'%s': 읽다가 잘림"
 
-#: sequencer.c:1069
+#: help.c:218
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: 잘못된 리비전"
+msgid "available git commands in '%s'"
+msgstr "'%s'에 있는 깃 명령"
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "최초의 커밋을 되돌릴 수 없습니다"
+#: help.c:225
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "다른 $PATH에 있는 깃 명령"
 
-#: setup.c:160
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s: 작업 폴더에 그런 경로가 없습니다.\n"
-"로컬에 없는 경로를 지정하려면 'git <명령> -- <경로>...' 식으로 사용하십시오."
+#: help.c:256
+msgid "These are common Git commands used in various situations:"
+msgstr "다음은 여러가지 상황에서 자주 사용하는 깃 명령입니다:"
 
-#: setup.c:173
+#: help.c:321
 #, c-format
 msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
-"애매한 인자 '%s': 알 수 없는 리비전 또는 작업 폴더에 없는 경로.\n"
-"경로와 리비전을 구분하려면 다음과 같이 '--'를 사용하십시오:\n"
-"'git <명령> [<리비전>...] -- [<파일>...]'"
+"'%s'은(는) 깃 명령으로 보이지만, 실행할 수\n"
+"없습니다. 아마도 git-%s 망가진 것 같습니다."
 
-#: setup.c:223
+#: help.c:376
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "어라라. 시스템에 깃 명령이 하나도 없다고 나옵니다."
+
+#: help.c:398
 #, c-format
 msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
-"애매한 인자 '%s': 알 수 없는 리비전 및 파일 이름\n"
-"경로와 리비전을 구분하려면 다음과 같이 '--'를 사용하십시오:\n"
-"'git <명령> [<리비전>...] -- [<파일>...]'"
+"경고: 이름이 '%s'인 깃 명령을 실행했지만, 그 명령이 없습니다.\n"
+"자동으로 '%s' 명령이라고 가정하고 계속합니다"
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
+#: help.c:403
 #, c-format
-msgid "failed to read %s"
-msgstr "%s을(를) 읽는데 실패했습니다"
+msgid "in %0.1f seconds automatically..."
+msgstr "(%0.1f초 뒤에)..."
 
-#: setup.c:468
+#: help.c:410
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "깃 저장소 버전 <= %d 버전을 기대하지만, %d 버전이 발견되었습니다"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s'은(는) 깃 명령이 아닙니다. 'git --help'를 참고하십시오."
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "알 수 없는 저장소 확장이 있습니다:"
+#: help.c:414 help.c:480
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"다음을 의도하신 것 아니었나요?"
 
-#: setup.c:762
+#: help.c:476
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "(현재 폴더 또는 상위 폴더가) 깃 저장소가 아닙니다: %s"
-
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "현재 디렉터리로 돌아올 수 없습니다"
-
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "현재 작업 디렉터리를 읽을 수 없습니다"
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: setup.c:920
-#, c-format
+#: ident.c:334
 msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
 msgstr ""
-"(현재 폴더 또는 마운트 위치 %s까지 상위 폴더가) 깃 저장소가 아닙니다\n"
-"파일 시스템 경계에서 중지합니다. (GIT_DISCOVERY_ACROSS_FILESYSTEM 설정되지 않음)"
+"\n"
+"*** 내가 누구인지 설정하십시오.\n"
+"\n"
+"다음을 실행하면,\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"내 이름\"\n"
+"\n"
+"계정의 기본 신원 정보를 설정합니다.\n"
+"--global 옵션을 빼면 이 저장소서만 신원 정보를 설정합니다.\n"
+"\n"
 
-#: setup.c:927
+#: lockfile.c:152
 #, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "'%s/..' 위치로 이동할 수 없습니다"
-
-#: setup.c:989
-#, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-"core.sharedRepository 파일모드 값에 (0%.3o) 문제가 있습니다.\n"
-"파일의 소유자에 읽기와 쓰기 권한이 있어야 합니다."
-
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "오프셋이 묶음 파일 앞입니다 (망가진 .idx?)"
-
-#: sha1_file.c:2434
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "오프셋이 %s의 묶음 인덱스 시작보다 앞입니다 (망가진 인덱스?)"
-
-#: sha1_file.c:2438
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "오프셋이 %s의 묶음 인덱스 끝보다 뒤입니다 (망가진 인덱스?)"
-
-#: sha1_name.c:462
 msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
+"Unable to create '%s.lock': %s.\n"
 "\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
 msgstr ""
-"깃에서는 보통 40개의 16진수 문자로 끝나는 레퍼런스를 만들지 않습니다.\n"
-"16진수 문자 40자를 지정했을 때 이 레퍼런스가 무시되기 때문입니다. 이\n"
-"레퍼런스는 실수로 만들어졌을 수도 있습니다. 예를 들어,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
+"'%s.lock' 파일을 만들 수 없습니다: %s.\n"
 "\n"
-"여기서 \"$br\"은 비어 있으므로 40자 레퍼런스가 만들어집니다. 이 레퍼런스를\n"
-"확인해 보시고 잘못 만들어진 것이면 지우십시오. 이 메시지를 보고 싶지\n"
-"않으면 \"git config advice.objectNameWarning false\" 명령을 사용하십시오."
-
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"병합하지 않은 .gitmodules를 바꿀 수 없습니다. 병합 충돌을 먼저 해결하십시오"
-
-#: submodule.c:68 submodule.c:102
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "경로가 %s일 때 .gitmodules의 섹션을 찾을 수 없습니다"
+"이 저장소에서 다른 깃 프로세스가 실행 중인 것으로 보입니다. (예를\n"
+"들어 'git commit' 명령으로 편집기가 열려 있다든지.) 모든 프로세스를\n"
+"끝냈는지 확인하시고 다시 시도해 보십시오. 그래도 계속 실패하면, 이\n"
+"저장소에서 깃 프로세스가 전에 이상 종료했을 수도 있습니다:\n"
+"수동으로 해당 파일을 제거하고 계속하십시오."
 
-#: submodule.c:76
+#: lockfile.c:160
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ".gitmodules 항목 %s을(를) 업데이트할 수 없습니다"
+msgid "Unable to create '%s.lock': %s"
+msgstr "'%s.lock'을 만들 수 없습니다: %s"
 
-#: submodule.c:109
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "%s에 대한 .gitmodules 항목을 제거할 수 없습니다"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "캐시를 읽는데 실패했습니다"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "업데이트한 .gitmodules를 커밋할 사항으로 표시하는데 실패"
+#: merge.c:96 builtin/am.c:2000 builtin/am.c:2035 builtin/checkout.c:374
+#: builtin/checkout.c:588 builtin/clone.c:731
+msgid "unable to write new index file"
+msgstr "새 인덱스 파일을 쓸 수 없습니다"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "submodule.fetchJobs 값에 음수를 쓸 수 없습니다"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(잘못된 커밋)\n"
 
-#: submodule-config.c:358
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
-msgid "invalid value for %s"
-msgstr "%s의 값이 올바르지 않습니다"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "'%s' 경로에 대해 addinfo_cache가 실패했습니다"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "트레일러 명령 '%s' 실행 실패"
+#: merge-recursive.c:303
+msgid "error building trees"
+msgstr "트리 빌드에 오류"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: merge-recursive.c:727
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "알 수 없는 값 '%s', 키 '%s'"
+msgid "failed to create path '%s'%s"
+msgstr "'%s' 경로 만들기에 실패했습니다%s"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: merge-recursive.c:738
 #, c-format
-msgid "more than one %s"
-msgstr "%s이(가) 여러개입니다"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "하위 디렉터리에 공간을 만드려고 %s을(를) 제거합니다\n"
 
-#: trailer.c:582
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "트레일러 '%.*s'에서 빈 트레일러 토큰"
+#: merge-recursive.c:752 merge-recursive.c:771
+msgid ": perhaps a D/F conflict?"
+msgstr ": 아마도 D/F 충돌?"
 
-#: trailer.c:702
+#: merge-recursive.c:761
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "'%s' 입력 파일을 읽을 수 없습니다"
-
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "표준 입력에서 읽을 수 없습니다"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "'%s' 위치의 추적되지 않는 파일을 잃기를 거부합니다"
 
-#: trailer.c:857 builtin/am.c:42
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
-msgid "could not stat %s"
-msgstr "%s에 대해 stat()할 수 없습니다"
+msgid "cannot read object %s '%s'"
+msgstr "%s '%s' 오브젝트를 읽을 수 없음"
 
-#: trailer.c:859
+#: merge-recursive.c:805
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "'%s' 파일이 일반 파일이 아닙니다"
+msgid "blob expected for %s '%s'"
+msgstr "%s '%s'에 대해 블롭을 예상"
 
-#: trailer.c:861
+#: merge-recursive.c:829
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "사용자가 %s 파일에 쓸 수 없습니다"
-
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "임시 파일을 열 수 없습니다: %s"
+msgid "failed to open '%s': %s"
+msgstr "'%s'을(를) 여는데 실패: %s"
 
-#: trailer.c:912
+#: merge-recursive.c:840
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "임시 파일 이름을 '%s'(으)로 바꿀 수 없습니다"
+msgid "failed to symlink '%s': %s"
+msgstr "'%s' 심볼릭 링크에 실패: %s"
 
-#: transport.c:62
+#: merge-recursive.c:845
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "'%1$s'의 업스트림을 '%3$s'의 '%2$s'(으)로 설정할 것입니다\n"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "다음을 어떻게 할지 알 수 없습니다: %06o %s '%s'"
 
-#: transport.c:151
+#: merge-recursive.c:985
+msgid "Failed to execute internal merge"
+msgstr "내부 병합 실행에 실패"
+
+#: merge-recursive.c:989
 #, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport: 잘못된 깊이 옵션: %s"
+msgid "Unable to add %s to database"
+msgstr "%s을(를) 데이터베이스에 추가할 수 없습니다"
 
-#: transport.c:771
+#: merge-recursive.c:1088 merge-recursive.c:1102
 #, c-format
 msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
-"다음 하위 모듈 경로에 리모트 어디에도 없는\n"
-"변경 사항이 있습니다:\n"
+"충돌! (%s/삭제): %s (위치 %s) 및 %s (%s에서) 삭제. %s 버전의 %s 트리에 남음."
 
-#: transport.c:775
+#: merge-recursive.c:1094 merge-recursive.c:1107
 #, c-format
 msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
 msgstr ""
-"\n"
-"리모트에 푸시하려면\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"또는 해당 경로로 cd한 다음\n"
-"\n"
-"\tgit push\n"
-"\n"
-"명령을 시도해 보십시오\n"
-"\n"
+"충돌! (%s/삭제): %s (위치 %s) 및 %s (위치 %s) 삭제. %s 버전의 %s 트리에 "
+"%s(으)로 남음."
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "ì¤\91ì§\80í\95¨."
+#: merge-recursive.c:1150
+msgid "rename"
+msgstr "ì\9d´ë¦\84ë°\94꾸기"
 
-#: transport-helper.c:1041
-#, c-format
-msgid "Could not read ref %s"
-msgstr "%s 레퍼런스를 읽을 수 없습니다"
+#: merge-recursive.c:1150
+msgid "renamed"
+msgstr "이름바꿈"
 
-#: unpack-trees.c:64
+#: merge-recursive.c:1207
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"다음 파일의 로컬 변경 사항을 체크아웃 때문에 덮어 쓰게 됩니다:\n"
-"%%s브랜치를 전환하기 전에 변경 사항을 커밋하거나 스태시하십시오."
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s은(는) %s에 있는 디렉터리로 %s(으)로 이름을 바꿉니다"
 
-#: unpack-trees.c:66
+#: merge-recursive.c:1232
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
-"다음 파일의 로컬 변경 사항을 체크아웃 때문에 덮어 쓰게 됩니다:\n"
-"%%s"
+"충돌! (이름바꾸기/이름바꾸기): \"%3$s\" 브랜치에서 이름바꾸기 \"%1$s\"->"
+"\"%2$s\" \"%6$s\" 브랜치에서 이름 바꾸기 \"%4$s\"->\"%5$s\"%7$s"
 
-#: unpack-trees.c:69
+#: merge-recursive.c:1237
+msgid " (left unresolved)"
+msgstr " (해결되지 않음)"
+
+#: merge-recursive.c:1299
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
-"다음 파일의 로컬 변경 사항을 병합 때문에 덮어 쓰게 됩니다:\n"
-"%%s병합하기 전에 변경 사항을 커밋하거나 스태시하십시오."
+"충돌! (rename/rename): 이름 바꾸기 %s->%s (위치 %s). 이름 바꾸기 %s->%s (위"
+"치 %s)"
 
-#: unpack-trees.c:71
+#: merge-recursive.c:1332
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr "다음 파일의 로컬 변경 사항을 병합 때문에 덮어 쓰게 됩니다."
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "대신 이름을 %s에서 %s(으)로 바꾸고 %s에서 %s(으)로 바꿉니다"
 
-#: unpack-trees.c:74
+#: merge-recursive.c:1535
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"다음 파일의 로컬 변경 사항을 %s 때문에 덮어 쓰게 됩니다:\n"
-"%%s%s 전에 변경 사항을 커밋하거나 스태시하십시오."
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr "충돌! (rename/add): 이름 바꾸기 %s->%s (위치 %s). %s 추가 (위치 %s)"
 
-#: unpack-trees.c:76
+#: merge-recursive.c:1550
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"다음 파일의 로컬 변경 사항을 %s 때문에 덮어 쓰게 됩니다:\n"
-"%%s"
+msgid "Adding merged %s"
+msgstr "병합된 %s을(를) 추가합니다"
 
-#: unpack-trees.c:81
+#: merge-recursive.c:1557 merge-recursive.c:1771
 #, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"다음 디렉터리를 업데이트하면 그 안의 추적하지 않는 파일을 잃어버립니다:\n"
-"%s"
+msgid "Adding as %s instead"
+msgstr "대신 %s(으)로 추가합니다"
 
-#: unpack-trees.c:85
+#: merge-recursive.c:1614
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"체크아웃 때문에 추적하지 않는 다음 작업 폴더의 파일이 제거됩니다:\n"
-"%%s브랜치를 전환하기 전에 이 파일을 옮기거나 제거하십시오."
+msgid "cannot read object %s"
+msgstr "%s 오브젝트를 읽을 수 없습니다"
 
-#: unpack-trees.c:87
+#: merge-recursive.c:1617
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"체크아웃 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
-"%%s"
+msgid "object %s is not a blob"
+msgstr "%s 오브젝트는 블롭이 아닙니다"
 
-#: unpack-trees.c:90
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"병합 때문에 추적하지 않는 다음 작업 폴더의 파일이 제거됩니다:\n"
-"%%s병합하기 전에 이 파일을 옮기거나 제거하십시오."
+#: merge-recursive.c:1670
+msgid "modify"
+msgstr "수정"
+
+#: merge-recursive.c:1670
+msgid "modified"
+msgstr "수정됨"
 
-#: unpack-trees.c:92
+#: merge-recursive.c:1680
+msgid "content"
+msgstr "내용"
+
+#: merge-recursive.c:1687
+msgid "add/add"
+msgstr "추가/추가"
+
+#: merge-recursive.c:1723
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"병합 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
-"%%s"
+msgid "Skipped %s (merged same as existing)"
+msgstr "건너뛰기: %s (기존과 같게 병합)"
 
-#: unpack-trees.c:95
+#: merge-recursive.c:1737
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"%s 때문에 추적하지 않는 다음 작업 폴더의 파일이 제거됩니다:\n"
-"%%s%s 하기 전에 이 파일을 옮기거나 제거하십시오."
+msgid "Auto-merging %s"
+msgstr "자동 병합: %s"
+
+#: merge-recursive.c:1741 git-submodule.sh:930
+msgid "submodule"
+msgstr "하위 모듈"
 
-#: unpack-trees.c:97
+#: merge-recursive.c:1742
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"%s 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
-"%%s"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "충돌! (%s): %s에 병합 충돌"
 
-#: unpack-trees.c:102
+#: merge-recursive.c:1836
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"체크아웃 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:\n"
-"%%s브랜치를 전환하기 전에 이 파일을 옮기거나 제거하십시오."
+msgid "Removing %s"
+msgstr "제거: %s"
 
-#: unpack-trees.c:104
+#: merge-recursive.c:1862
+msgid "file/directory"
+msgstr "파일/디렉터리"
+
+#: merge-recursive.c:1868
+msgid "directory/file"
+msgstr "디렉터리/파일"
+
+#: merge-recursive.c:1874
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
-"ì²´í\81¬ì\95\84ì\9b\83 ë\95\8c문ì\97\90 ì¶\94ì \81í\95\98ì§\80 ì\95\8aë\8a\94 ë\8b¤ì\9d\8c ì\9e\91ì\97\85 í\8f´ë\8d\94 í\8c\8cì\9d¼ì\9d\84 ë\8d®ì\96´ì\94\81ë\8b\88ë\8b¤:\n"
-"%%s"
+"충ë\8f\8c! (%s): ì\9d´ë¦\84ì\9d´ %sì\9d¸ ë\94\94ë \89í\84°ë¦¬ê°\80 %sì\97\90 ì\9e\88ì\8aµë\8b\88ë\8b¤. %sì\9d\84(를) %s(ì\9c¼)ë¡\9c ì¶\94ê°\80í\95©ë\8b\88"
+""
 
-#: unpack-trees.c:107
+#: merge-recursive.c:1883
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"병합 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:\n"
-"%%s병합하기 전에 이 파일을 옮기거나 제거하십시오."
+msgid "Adding %s"
+msgstr "추가: %s"
 
-#: unpack-trees.c:109
+#: merge-recursive.c:1920
+msgid "Already up-to-date!"
+msgstr "이미 업데이트 상태입니다!"
+
+#: merge-recursive.c:1929
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"병합 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
-"%%s"
+msgid "merging of trees %s and %s failed"
+msgstr "%s 및 %s 트리의 병합이 실패했습니다"
+
+#: merge-recursive.c:2012
+msgid "Merging:"
+msgstr "병합:"
 
-#: unpack-trees.c:112
+#: merge-recursive.c:2025
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"%s 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:\n"
-"%%s%s 하기 전에 이 파일을 옮기거나 제거하십시오."
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "과거의 공통 커밋 %u개 발견:"
+
+#: merge-recursive.c:2064
+msgid "merge returned no commit"
+msgstr "병합 결과에 커밋이 없습니다"
+
+#: merge-recursive.c:2127
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다"
+
+#: merge-recursive.c:2141 builtin/merge.c:645 builtin/merge.c:792
+msgid "Unable to write index."
+msgstr "인덱스를 쓸 수 없습니다."
 
-#: unpack-trees.c:114
+#: notes-merge.c:273
 #, c-format
 msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
 msgstr ""
-"%s 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
-"%%s"
+"이전의 노트 병합을 다 마치지 않았습니다 (%s 있음).\n"
+"새로 노트 병합을 시작하기 전에 'git notes merge --commit'\n"
+"또는 'git notes merge --abort'로 이전 병합을 커밋/중지하십시오."
 
-#: unpack-trees.c:121
+#: notes-merge.c:280
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "'%s' 항목이 '%s'와(과) 겹칩니다.  묶을 수 없습니다."
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "노트 병합 작업을 다 마치지 않았습니다. (%s 있음)"
+
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "초기화하지 않았거나 레퍼런스하지 않은 notes 트리를 커밋할 수 없습니다"
 
-#: unpack-trees.c:124
+#: notes-utils.c:100
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"드문 체크아웃을 업데이트할 수 없습니다. 다음 항목이 최신으로 업데이트되지 않았습니다:\n"
-"%s"
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "잘못된 notes.rewriteMode 값: '%s'"
 
-#: unpack-trees.c:126
+#: notes-utils.c:110
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"드문 체크아웃 업데이트 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니"
-"다:\n"
-"%s"
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "%s에서 노트를 다시 쓰기를 거부합니다 (refs/notes/ 밖임)"
 
-#: unpack-trees.c:128
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"드문 체크아웃 업데이트 때문에 추적하지 않는 다음 작업 폴더 파일을 제거합니"
-"다:\n"
-"%s"
+msgid "Bad %s value: '%s'"
+msgstr "잘못된 %s 값: '%s'"
 
-#: unpack-trees.c:205
+#: object.c:240
 #, c-format
-msgid "Aborting\n"
-msgstr "ì¤\91ì§\80í\95¨\n"
+msgid "unable to parse object: %s"
+msgstr "ì\98¤ë¸\8cì \9dí\8a¸ë¥¼ í\8c\8cì\8b±í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: %s"
 
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "파일을 가져옵니다"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "URL 스킴 이름이 잘못되었거나 '://'가 뒤에 붙지 않았습니다"
+#: parse-options.c:590
+#, c-format
+msgid "usage: %s"
+msgstr "사용법: %s"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "잘못된 %XX 이스케이프 시퀀스"
+msgid "   or: %s"
+msgstr "  또는: %s"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "호스트가 없고 스킴이 'file:'이 아닙니다"
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
+msgstr "    %s"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "'file:' URL에는 포트 번호를 쓸 수 없습니다"
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "호스트 이름에 잘못된 문자"
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "잘못된 형식의 오브젝트 이름 '%s'"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "잘못된 포트 번호"
+#: path.c:826
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "%s을(를) 그룹에서 쓰기 가능하도록 만들 수 없습니다"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "경로에서 잘못된 '..' 부분"
+#: pathspec.c:142
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "'glob' 및 'noglob' 경로명세 전체 설정은 호환되지 않습니다"
 
-#: worktree.c:282
+#: pathspec.c:149
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+"'literal' 경로명세 전체 설정은 다른 경로명세 전체 설정과 호환되지 않습니다"
+
+#: pathspec.c:188
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "경로명세 지시어 'prefix'에 잘못된 파라미터"
+
+#: pathspec.c:201
 #, c-format
-msgid "failed to read '%s'"
-msgstr "'%s'을(를) 읽는데 실패했습니다"
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "잘못된 경로명세 지시어 '%.*s' (위치 '%s')"
 
-#: wrapper.c:222 wrapper.c:392
+#: pathspec.c:206
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "읽기와 쓰기용으로 '%s'을(를) 열 수 없습니다"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "경로 명세 지시어 끝에 ')' 빠짐 (위치 '%s')"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: pathspec.c:238
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "구현되지 않은 경로명세 지시어 '%c' (위치 '%s')"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: pathspec.c:293 pathspec.c:315
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "'%s'을(를) 읽기용으로 열 수 없습니다"
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "경로명세 '%s'은(는) ''%.*s' 하위 모듈 안에 있습니다"
 
-#: wrapper.c:605 wrapper.c:626
+#: pathspec.c:350
 #, c-format
-msgid "unable to access '%s'"
-msgstr "'%s'에 접근할 수 없습니다"
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal'과 'glob'은 호환되지 않습니다"
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "현재 작업 디렉터리를 가져올 수 없습니다"
+#: pathspec.c:363
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s'은(는) 저장소 밖입니다"
 
-#: wrapper.c:658
+#: pathspec.c:451
 #, c-format
-msgid "could not write to %s"
-msgstr "%s에 쓸 수 없습니다"
+msgid "'%s' (mnemonic: '%c')"
+msgstr "'%s' (단축키: '%c')"
 
-#: wrapper.c:660
+#: pathspec.c:461
 #, c-format
-msgid "could not close %s"
-msgstr "%s을(를) 닫을 수 없습니다"
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: 경로명세 지시어가 이 명령어에서 지원하지 않습니다: %s"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "병합하지 않은 경로:"
+#: pathspec.c:511
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"경로명세로 빈 문자열을 넣는 일은 다음 릴리스에서 오류로 취급할 예정입니다. 모"
+"든 경로를 지정하려면 점(.)을 사용하십시오."
 
-#: wt-status.c:177 wt-status.c:204
+#: pathspec.c:535
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (스테이지 해제하려면 \"git reset %s <파일>...\"을 사용하십시오)"
-
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (스테이지 해제하려면 \"git rm --cached <파일>...\"을 사용하십시오)"
-
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (해결했다고 표시하려면 \"git add <파일>...\"을 사용하십시오)"
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "'%s' 경로명세는 심볼릭 링크 아래에 있습니다"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: pathspec.c:544
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
-"  (해결했다고 표시하려면 알맞게 \"git add/rm <파일>...\"을 사용하십시오)"
-
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (해결했다고 표시하려면 \"git rm <파일>...\"을 사용하십시오)"
-
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "커밋할 변경 사항:"
-
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "커밋하도록 정하지 않은 변경 사항:"
-
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (무엇을 커밋할지 바꾸려면 \"git add <파일>...\"을 사용하십시오)"
+":(exclude) 패턴으로 제외할 사항이 없습니다.\n"
+"':/' 또는 '.' 추가를 잊으신 것 아닙니까?"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (무엇을 커밋할지 바꾸려면 \"git add/rm <파일>...\"을 사용하십시오)"
+#: pretty.c:982
+msgid "unable to parse --pretty format"
+msgstr "--pretty 형식을 파싱할 수 없습니다"
 
-#: wt-status.c:223
+#: read-cache.c:1307
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"  (작업 폴더의 변경 사항을 버리려면 \"git checkout -- <파일>...\"을 사용하십"
-"시오)"
+"index.version이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: read-cache.c:1317
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"  (하위 모듈의 추적되지 않는 파일이나 수정된 내용을 커밋하거나 버리십시오)"
+"GIT_INDEX_VERSION이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
 
-#: wt-status.c:237
+#: refs.c:576 builtin/merge.c:844
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (커밋할 사항에 포함하려면 \"git %s <파일>...\"을 사용하십시오)"
+msgid "Could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "양쪽에서 삭제:"
+#: refs/files-backend.c:2481
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "%s 레퍼런스를 삭제할 수 없습니다: %s"
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "이 쪽에서 추가:"
+#: refs/files-backend.c:2484
+#, c-format
+msgid "could not delete references: %s"
+msgstr "레퍼런스를 삭제할 수 없습니다: %s"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "저 쪽에서 삭제:"
+#: refs/files-backend.c:2493
+#, c-format
+msgid "could not remove reference %s"
+msgstr "%s 레퍼런스를 제거할 수 없습니다"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "저 쪽에서 추가:"
+#: ref-filter.c:56
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "예상한 형식: %%(color:<색>)"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "이 쪽에서 삭제:"
+#: ref-filter.c:58
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "인식할 수 없는 색: %%(color:%s)"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "양쪽에서 추가:"
+#: ref-filter.c:72
+#, c-format
+msgid "unrecognized format: %%(%s)"
+msgstr "알 수 없는 형식: %%(%s)"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "양쪽에서 수정:"
+#: ref-filter.c:78
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body)에 인자를 받지 않습니다"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "새 파일:"
+#: ref-filter.c:85
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject)에 인자를 받지 않습니다"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "복사함:"
+#: ref-filter.c:92
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers)에 인자를 받지 않습니다"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "삭제함:"
+#: ref-filter.c:111
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "'contents:lines=%s'에서 0보다 큰 값이 와야 합니다"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "수정함:"
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "알 수 없는 %%(contents) 인자: %s"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "이름 바꿈:"
+#: ref-filter.c:123
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "알 수 없는 %%(objectname) 인자: %s"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "종류 바뀜:"
+#: ref-filter.c:145
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "예상한 형식: %%(align:<너비>,<위치>)"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "알 수 없음:"
+#: ref-filter.c:157
+#, c-format
+msgid "unrecognized position:%s"
+msgstr "인식할 수 없는 위치:%s"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "병합하지 않음:"
+#: ref-filter.c:161
+#, c-format
+msgid "unrecognized width:%s"
+msgstr "인식할 수 없는 너비:%s"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "새 커밋, "
+#: ref-filter.c:167
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "인식할 수 없는 %%(align) 인자:%s"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "수정한 내용, "
+#: ref-filter.c:171
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "%%(align) 아톰에 너비가 0보다 커야 합니다"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "추적하지 않은 내용, "
+#: ref-filter.c:255
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "잘못된 형식의 필드 이름: %.*s"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "변경되었지만 업데이트하지 않은 하위 모듈:"
+#: ref-filter.c:281
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "알 수 없는 필드 이름: %.*s"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "커밋할 하위 모듈의 변경 사항:"
+#: ref-filter.c:383
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "형식: %%(end) 아톰이 대응되는 아톰 없이 사용되었습니다"
 
-#: wt-status.c:839
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr ""
-"위의 줄을 바꾸지 마십시오.\n"
-"아래 있는 내용은 모두 제거됩니다."
+#: ref-filter.c:435
+#, c-format
+msgid "malformed format string %s"
+msgstr "잘못된 형식의 문자열 %s"
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "병합하지 않은 경로가 있습니다."
+#: ref-filter.c:898
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= 명령에는 0보다 큰 정수 인자가 필요합니다"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (충돌을 바로잡고 \"git commit\"을 실행하십시오)"
+#: ref-filter.c:903
+#, c-format
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "'%s' 레퍼런스에 :strip할 구성 요소 %ld개가 없습니다"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (병합을 중단하려면 \"git merge --abort\"를 사용하십시오)"
+#: ref-filter.c:1066
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "알 수 없는 %.*s 형식 %s"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "모든 충돌을 바로잡았지만 아직 병합하는 중입니다."
+#: ref-filter.c:1086 ref-filter.c:1117
+#, c-format
+msgid "missing object %s for %s"
+msgstr "없는 오브젝트 %s, %s에 대해"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (병합을 마무리하려면 \"git commit\"을 사용하십시오)"
+#: ref-filter.c:1089 ref-filter.c:1120
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "%s에 parse_object_buffer 실패 (%s에 대해)"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "am 세션 중간에 있습니다."
+#: ref-filter.c:1343
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "'%s'에 잘못된 형식의 오브젝트"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "현재 패치가 비어 있습니다."
+#: ref-filter.c:1410
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "망가진 이름 %s에 레퍼런스를 무시합니다"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (충돌을 바로잡은 다음 \"git am --continue\"를 사용하십시오)"
+#: ref-filter.c:1415
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "망가진 레퍼런스 %s 무시"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (이 패치를 건너 뛰려면 \"git am --skip\"을 사용하십시오)"
+#: ref-filter.c:1670
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "형식: %%(end) 아톰이 없습니다"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (원본 브랜치를 복구하려면 \"git am --abort\"를 사용하십시오)"
+#: ref-filter.c:1734
+#, c-format
+msgid "malformed object name %s"
+msgstr "잘못된 형식의 오브젝트 이름 %s"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "완료한 명령 없음."
+#: remote.c:754
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "%s 및 %s을(를) 모두 %s에 가져올 수 없습니다"
 
-#: wt-status.c:1112
+#: remote.c:758
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "최근 완료한 명령 (%d개 명령 완료):"
+msgid "%s usually tracks %s, not %s"
+msgstr "%s은(는) 보통 %s을(를) 추적하고, %s을(를) 추적하지 않습니다"
 
-#: wt-status.c:1123
+#: remote.c:762
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (자세한 정보는 %s 파일 참고)"
+msgid "%s tracks both %s and %s"
+msgstr "%s은(는) %s 및 %s 모두 추적합니다"
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "ëª\85ë ¹ì\9d´ ë\82¨ì\95\84ì\9e\88ì§\80 ì\95\8aì\9d\8c."
+#: remote.c:770
+msgid "Internal error"
+msgstr "ë\82´ë¶\80 ì\98¤ë¥\98"
 
-#: wt-status.c:1131
-#, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "다음에 할 명령 (%d개 명령 남음):"
+#: remote.c:1685 remote.c:1787
+msgid "HEAD does not point to a branch"
+msgstr "HEAD가 브랜치를 가리키지 않습니다"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (보고 편집하려면 \"git rebase --edit-todo\"를 사용하십시오)"
+#: remote.c:1694
+#, c-format
+msgid "no such branch: '%s'"
+msgstr "그런 브랜치가 없습니다: '%s'"
 
-#: wt-status.c:1152
+#: remote.c:1697
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중입니다."
+msgid "no upstream configured for branch '%s'"
+msgstr "'%s' 브랜치에 대해 업스트림을 설정하지 않았습니다"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "현재 리베이스하는 중입니다."
+#: remote.c:1703
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "업스트림 '%s' 브랜치가 리모트 추적 브랜치로 저장되지 않았습니다"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (충돌을 바로잡고 \"git rebase --continue\"를 사용하십시오)"
+#: remote.c:1718
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "리모트 '%2$s'의 푸시 대상 '%1$s'에 로컬 추적 브랜치가 없습니다"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (이 패치를 건너뛰려면 \"git rebase --skip\"을 사용하십시오)"
-
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (원본 브랜치를 가져오려면 \"git rebase --abort\"를 사용하십시오)"
-
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
-"  (모든 충돌을 바로잡았습니다: \"git rebase --continue\"를 실행하십시오)"
+#: remote.c:1730
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "'%s' 브랜치에 푸시 리모트가 없습니다"
 
-#: wt-status.c:1185
+#: remote.c:1741
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 분리하는 중입니다."
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "'%s'에 대한 푸시 레퍼런스명세에 '%s'이(가) 들어 있지 않습니다"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "í\98\84ì\9e¬ ë¦¬ë² ì\9d´ì\8a¤í\95\98ë\8a\94 ì¤\91 ì»¤ë°\8bì\9d\84 ë¶\84리í\95\98ë\8a\94 ì¤\91ì\9e\85ë\8b\88ë\8b¤."
+#: remote.c:1754
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "í\91¸ì\8b\9cì\9d\98 ë\8c\80ì\83\81ì\9d´ ì\97\86ì\8aµë\8b\88ë\8b¤ (push.defaultê°\80 'nothing'ì\9e\85ë\8b\88ë\8b¤)"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "  (작업 폴더가 깨끗해지면, \"git rebase --continue\"를 실행하십시오)"
+#: remote.c:1776
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "하나의 대상에 대해 'simple' 푸시를 처리할 수 없습니다"
 
-#: wt-status.c:1197
+#: remote.c:2081
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr "'%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 편집하는 중입니다."
-
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "리베이스 중에 커밋을 편집하는 중입니다."
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "현재 브랜치가 '%s' 기반이지만, 업스트림이 없어졌습니다.\n"
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (현재 커밋을 수정하려면 \"git commit --amend\"을 사용하십시오)"
+#: remote.c:2085
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (바로잡으려면 \"git branch --unset-upstream\"을 사용하십시오)\n"
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (변경 사항에 만족할 때 \"git rebase --continue\"를 사용하십시오)"
+#: remote.c:2088
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "브랜치가 '%s'에 맞게 업데이트된 상태입니다.\n"
 
-#: wt-status.c:1217
+#: remote.c:2092
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "현재 %s 커밋을 뽑아 내고 있습니다."
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "브랜치가 '%s'보다 %d개 커밋만큼 앞에 있습니다.\n"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (충돌을 바로잡고 \"git cherry-pick --continue\"를 실행하십시오)"
+#: remote.c:2098
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (로컬에 있는 커밋을 제출하려면 \"git push\"를 사용하십시오)\n"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (모든 충돌을 바로잡았습니다: \"git cherry-pick --continue\"를 실행하십시오)"
+#: remote.c:2101
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] "브랜치가 '%s'보다 %d개 커밋 뒤에 있고, 앞으로 돌릴 수 있습니다.\n"
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (ë½\91기 ì\9e\91ì\97\85ì\9d\84 ì·¨ì\86\8cí\95\98려면 \"git cherry-pick --abort\"를 ì\82¬ì\9a©í\95\98ì\8b­ì\8b\9cì\98¤)"
+#: remote.c:2109
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (ë¡\9c컬 ë¸\8cë\9e\9cì¹\98를 ì\97\85ë\8d°ì\9d´í\8a¸í\95\98려면 \"git pull\"ì\9d\84 ì\82¬ì\9a©í\95\98ì\8b­ì\8b\9cì\98¤)\n"
 
-#: wt-status.c:1236
+#: remote.c:2112
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "현재 %s 커밋을 되돌리는 중입니다."
-
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (충돌을 바로잡고 \"git revert --continue\"를 실행하십시오)"
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"현재 브랜치와 '%s'이(가) 갈라졌습니다,\n"
+"다른 커밋이 각각 %d개와 %d개 있습니다.\n"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
+#: remote.c:2122
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
-"  (모ë\93  ì¶©ë\8f\8cì\9d\84 ë°\94ë¡\9cì\9e¡ì\95\98ì\8aµë\8b\88ë\8b¤: \"git revert --continue\"를 ì\8b¤í\96\89í\95\98ì\8b­ì\8b\9cì\98¤)"
+"  (리모í\8a¸ì\9d\98 ë¸\8cë\9e\9cì¹\98를 í\98\84ì\9e¬ ë¸\8cë\9e\9cì¹\98ë¡\9c ë³\91í\95©í\95\98려면 \"git pull\"ì\9d\84 ì\82¬ì\9a©í\95\98ì\8b­ì\8b\9cì\98¤)\n"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (되돌리기 작업을 취소하려면 \"git revert --abort\"를 사용하십시오)"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "현재 브랜치가 망가진 것처럼 보입니다"
 
-#: wt-status.c:1257
+#: revision.c:2161
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "'이등분하는 중입니다. '%s' 브랜치부터 시작."
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "현재 '%s' 브랜치에 아직 아무 커밋도 없습니다"
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "'이등분하는 중입니다."
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent 옵션은 --bisect 옵션과 호환되지 않습니다"
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (원래 브랜치로 돌아가려면 \"git bisect reset\"을 사용하십시오)"
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "/dev/null 열기 실패"
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "현재 브랜치 "
+#: run-command.c:127
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) 실패"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "대화형 리베이스 진행 중. 갈 위치는 "
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "푸시 인증서 서명에 실패했습니다"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "리베ì\9d´ì\8a¤ ì§\84í\96\89 ì¤\91. ê°\88 ì\9c\84ì¹\98ë\8a\94 "
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "ë°\9bë\8a\94 ìª½ì\97\90ì\84\9c --signed í\91¸ì\8b\9c를 ì§\80ì\9b\90í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD가 다음 위치에서 분리: "
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr ""
+"받는 쪽에서 --signed 푸시를 지원하지 않으므로 푸시 인증서를 보내지 않습니다"
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD가 다음으로부터 분리: "
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "받는 쪽에서 --atomic 푸시를 지원하지 않습니다"
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "현재 어떤 브랜치도 사용하지 않음."
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "받는 쪽에서 푸시 옵션을 지원하지 않습니다"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "최초 커밋"
+#: sequencer.c:215
+msgid "revert"
+msgstr "revert"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "추적하지 않는 파일"
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "cherry-pick"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "무시한 파일"
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
 
-#: wt-status.c:1520
+#: sequencer.c:221
 #, c-format
+msgid "Unknown action: %d"
+msgstr "알 수 없는 동작: %d"
+
+#: sequencer.c:278
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
-"추적하지 않는 파일을 모두 확인하는데 %.2f초가 걸렸습니다.\n"
-"'status -uno' 옵션을 쓰면 빨라질 수도 있지만, 새 파일을\n"
-"직접 찾아서 추가해야 합니다. ('git help status' 참고)"
+"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
+"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오"
+
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
+"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오.\n"
+"그리고 결과물을 'git commit'으로 커밋하십시오"
 
-#: wt-status.c:1526
+#: sequencer.c:294 sequencer.c:1667
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "추적하지 않는 파일을 보지 않습니다%s"
+msgid "could not lock '%s'"
+msgstr "'%s'을(를) 잠글 수 없습니다"
 
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)"
+#: sequencer.c:297 sequencer.c:1545 sequencer.c:1672 sequencer.c:1686
+#, c-format
+msgid "could not write to '%s'"
+msgstr "'%s'에 쓸 수 없습니다"
 
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "변경 사항 없음"
+#: sequencer.c:301
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "'%s'에 줄바꿈을 쓸 수 없습니다"
 
-#: wt-status.c:1539
+#: sequencer.c:305 sequencer.c:1550 sequencer.c:1674
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr ""
-"커밋할 변경 사항을 추가하지 않았습니다 (\"git add\" 및/또는 \"git commit -a"
-"\"를\n"
-"사용하십시오)\n"
+msgid "failed to finalize '%s'."
+msgstr "'%s' 마치는데 실패했습니다."
 
-#: wt-status.c:1542
+#: sequencer.c:329 sequencer.c:808 sequencer.c:1571 builtin/am.c:259
+#: builtin/commit.c:749 builtin/merge.c:1036
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "커밋할 변경 사항을 추가하지 않았습니다\n"
+msgid "could not read '%s'"
+msgstr "'%s'에서 읽을 수 없습니다"
 
-#: wt-status.c:1545
+#: sequencer.c:355
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "로컬 변경 사항을 %s 때문에 덮어 쓰게 됩니다."
+
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "변경 사항을 커밋하거나 스태시한 다음 계속하십시오."
+
+#: sequencer.c:388
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: 정방향 진행"
+
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: 새 인덱스 파일을 쓸 수 없습니다"
+
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "HEAD 커밋을 처리할 수 없습니다\n"
+
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "캐시 트리를 업데이트할 수 없습니다\n"
+
+#: sequencer.c:592
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
-"커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "
-"\"git\n"
-"add\"를 사용하십시오)\n"
+"작업 폴더에 스테이징한 변경 사항이 있습니다.\n"
+"이 변경 사항을 이전 커밋에 합치려면,\n"
+"다음을 실행하십시오:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"새 커밋으로 만드려면 다음을 실행하십시오:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"어떤 경우이든, 마친 다음에 다음 명령으로 계속합니다:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: wt-status.c:1548
+#: sequencer.c:688
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다\n"
+msgid "could not parse commit %s\n"
+msgstr "%s 커밋을 파싱할 수 없습니다\n"
 
-#: wt-status.c:1551
+#: sequencer.c:693
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-"커밋할 사항 없음 (파일을 만들거나 복사하고 \"git add\"를 사용하면 추적합니"
-"다)\n"
+msgid "could not parse parent commit %s\n"
+msgstr "%s 이전 커밋을 파싱할 수 없습니다\n"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: sequencer.c:815
 #, c-format
-msgid "nothing to commit\n"
-msgstr "커밋할 사항 없음\n"
+msgid ""
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
+msgstr ""
+"커밋 합치기 메시지의 첫 줄이 예상치 못함:\n"
+"\n"
+"\t%.*s"
 
-#: wt-status.c:1557
+#: sequencer.c:821
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"커밋할 사항 없음 (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)\n"
+"커밋 합치기 메시지의 첫 줄이 잘못됨:\n"
+"\n"
+"\t%.*s"
 
-#: wt-status.c:1561
+#: sequencer.c:827 sequencer.c:852
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "커밋할 사항 없음, 작업 폴더 깨끗함\n"
+msgid "This is a combination of %d commits."
+msgstr "커밋 %d개가 섞인 결과입니다."
 
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "최초 커밋, 브랜치: "
+#: sequencer.c:836
+msgid "need a HEAD to fixup"
+msgstr "바로잡으려면 HEAD가 필요합니다"
 
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (브랜치 없음)"
+#: sequencer.c:838
+msgid "could not read HEAD"
+msgstr "HEAD를 읽을 수 없습니다"
 
-#: wt-status.c:1701
-msgid "gone"
-msgstr "없음"
+#: sequencer.c:840
+msgid "could not read HEAD's commit message"
+msgstr "HEAD의 커밋 메시지를 읽을 수 없습니다"
 
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "다음 뒤에: "
+#: sequencer.c:846
+#, c-format
+msgid "cannot write '%s'"
+msgstr "'%s'을(를) 쓸 수 없습니다"
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "다음 앞에: "
+#: sequencer.c:855 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "1번째 커밋 메시지입니다:"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: sequencer.c:863
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "'%s' 파일 삭제에 실패했습니다"
+msgid "could not read commit message of %s"
+msgstr "%s의 커밋 메시지를 읽을 수 없습니다"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<옵션>] [--] <경로명세>..."
+#: sequencer.c:870
+#, c-format
+msgid "This is the commit message #%d:"
+msgstr "커밋 메시지 #%d번입니다:"
 
-#: builtin/add.c:65
+#: sequencer.c:875
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "ì\98\88ì\83\81ì¹\98 ëª»í\95\9c diff ì\83\81í\83\9c %c"
+msgid "The commit message #%d will be skipped:"
+msgstr "커ë°\8b ë©\94ì\8b\9cì§\80 #%dë²\88ì\9d\84 ê±´ë\84\88ë\9c\81ë\8b\88ë\8b¤:"
 
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "파일 업데이트가 실패했습니다"
-
-#: builtin/add.c:81
+#: sequencer.c:880
 #, c-format
-msgid "remove '%s'\n"
-msgstr "'%s' 제거\n"
+msgid "unknown command: %d"
+msgstr "알 수 없는 명령: %d"
 
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "인덱스를 새로 고친 다음 커밋 표시하지 않은 변경 사항:"
-
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "인덱스를 읽을 수 없습니다"
+#: sequencer.c:946
+msgid "your index file is unmerged."
+msgstr "인덱스 파일이 병합되지 않았습니다."
 
-#: builtin/add.c:207
+#: sequencer.c:964
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "'%s' 파일을 쓰기용으로 열 수 없습니다."
-
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "패치를 쓸 수 없습니다"
-
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "패치 편집에 실패했습니다"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "%s 커밋은 병합이지만 -m 옵션이 주어지지 않았습니다."
 
-#: builtin/add.c:217
+# FIXME: "parent %d" 번호가 무슨 의미?
+#: sequencer.c:972
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "'%s'을(를) stat()할 수 없습니다"
-
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "빈 패치. 중지."
+msgid "commit %s does not have parent %d"
+msgstr "%s 커밋에 이전 커밋 %d이(가) 없습니다"
 
-#: builtin/add.c:224
+#: sequencer.c:976
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "'%s'을(를) 적용할 수 없습니다"
-
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "다음 경로는 .gitignore 파일 중 하나 때문에 무시합니다:\n"
-
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "가짜로 실행"
-
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "자세히 표시"
-
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "대화식으로 고릅니다"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "메인라인을 지정했지만 %s 커밋이 병합 커밋이 아닙니다."
 
-#: builtin/add.c:257 builtin/checkout.c:1156 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "대화식으로 변경된 부분을 선택합니다"
+#: sequencer.c:982
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "%s에 대한 커밋 메시지를 가져올 수 없습니다"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "현재 diff를 편집하고 적용합니다"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1001
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: %s 이전 커밋을 파싱할 수 없습니다"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "무시하는 파일의 추가를 허용합니다"
+#: sequencer.c:1063 sequencer.c:1812
+#, c-format
+msgid "could not rename '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 이름을 바꿀 수 없습니다"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "추적되는 파일을 업데이트합니다"
+#: sequencer.c:1114
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "다음을 되돌릴(revert) 수 없습니다: %s... %s"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "나중에 추가할 것이라는 사실만 기록합니다"
+#: sequencer.c:1115
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "다음을 적용할(apply) 수 없습니다: %s... %s"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr "추적되고 추적되지 않는 모든 파일의 변경 사항을 추가합니다"
+#: sequencer.c:1157
+msgid "empty commit set passed"
+msgstr "빈 커밋 모음을 건너 뜁니다"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "작업 폴더에서 제거한 경로를 무시합니다 (--no-all과 동일)"
+#: sequencer.c:1167
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: 인덱스 읽기에 실패했습니다"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "추가하지 않고 인덱스만 새로 고칩니다"
+#: sequencer.c:1174
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: 인덱스 새로 고침에 실패했습니다"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "오류 때문에 추가할 수 없는 파일을 건너뜁니다"
+#: sequencer.c:1294
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "잘못된 줄 %d: %.*s"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "가짜로 실행했을 때 파일을 무시하는지 확인합니다"
+#: sequencer.c:1302
+#, c-format
+msgid "cannot '%s' without a previous commit"
+msgstr "이전 커밋 없이 '%s' 수행할 수 없습니다"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: sequencer.c:1334
+#, c-format
+msgid "could not read '%s'."
+msgstr "'%s'에서 읽을 수 없습니다."
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "목록의 파일에서 실행 가능 비트를 바꿉니다"
+#: sequencer.c:1341
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "'git rebase --edit-todo' 명령으로 바로잡으십시오."
 
-#: builtin/add.c:292
+#: sequencer.c:1343
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "ì \95ë§\90ë¡\9c ì¶\94ê°\80í\95\98려면 -f ì\98µì\85\98ì\9d\84 ì\82¬ì\9a©í\95\98ì\8b­ì\8b\9cì\98¤.\n"
+msgid "unusable instruction sheet: '%s'"
+msgstr "ì\82¬ì\9a© ë¶\88ê°\80ë\8a¥ ì\9d¸ì\8a¤í\8a¸ë\9f­ì\85\98 ì\8b\9cí\8a¸: '%s'"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "í\8c\8cì\9d¼ ì¶\94ê°\80ê°\80 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
+#: sequencer.c:1348
+msgid "no commits parsed."
+msgstr "í\8c\8cì\8b±í\95\9c ì»¤ë°\8bì\9d´ ì\97\86ì\8aµë\8b\88ë\8b¤."
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A 및 -u 옵션은 서로 호환되지 않습니다"
+#: sequencer.c:1359
+msgid "cannot cherry-pick during a revert."
+msgstr "되돌리기(revert) 중에 빼오기(cherry-pick)를 할 수 없습니다."
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr ""
-"--ignore-missing 옵션은 --dry-run 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
+#: sequencer.c:1361
+msgid "cannot revert during a cherry-pick."
+msgstr "빼오기(cherry-pick) 중에 되돌리기(revert)를 할 수 없습니다."
 
-#: builtin/add.c:352
+#: sequencer.c:1424
 #, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "--chmod 파라미터 '%s'은(는) -x 또는 +x 형식이어야 합니다"
+msgid "invalid key: %s"
+msgstr "잘못된 키: %s"
 
-#: builtin/add.c:367
+#: sequencer.c:1427
 #, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "아무 것도 지정하지 않았으므로 아무 것도 추가하지 않습니다.\n"
+msgid "invalid value for %s: %s"
+msgstr "%s의 값이 잘못됨: %s"
 
-#: builtin/add.c:368
+#: sequencer.c:1484
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "'git add .' 명령을 실행하려고 한 것 아니었습니까?\n"
+msgid "malformed options sheet: '%s'"
+msgstr "형식이 잘못된 옵션 시트: '%s'"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "인덱스 파일이 손상되었습니다"
+#: sequencer.c:1522
+msgid "a cherry-pick or revert is already in progress"
+msgstr "이미 커밋 빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중입니다"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "ì\83\88 ì\9d¸ë\8d±ì\8a¤ í\8c\8cì\9d¼ì\97\90 ì\93¸ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
+#: sequencer.c:1523
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "\"git cherry-pick (--continue | --quit | --abort)\" ëª\85ë ¹ì\9d\84 í\95´ ë³´ì\8b­ì\8b\9cì\98¤"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
+#: sequencer.c:1526
 #, c-format
-msgid "could not read '%s'"
-msgstr "'%s'에서 읽을 수 없습니다"
+msgid "could not create sequencer directory '%s'"
+msgstr "'%s' 시퀀서 디렉터리를 만들 수 없습니다"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "작성자 스크립트를 파싱할 수 없습니다"
+#: sequencer.c:1540
+msgid "could not lock HEAD"
+msgstr "HEAD를 잠글 수 없습니다"
 
-#: builtin/am.c:503
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "applypatch-msg 훅 때문에 '%s'이(가) 삭제되었습니다."
+#: sequencer.c:1596 sequencer.c:2150
+msgid "no cherry-pick or revert in progress"
+msgstr "빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중이지 않습니다"
+
+#: sequencer.c:1598
+msgid "cannot resolve HEAD"
+msgstr "HEAD를 구해 올 수 없습니다"
 
-#: builtin/am.c:544 builtin/notes.c:301
+#: sequencer.c:1600 sequencer.c:1634
+msgid "cannot abort from a branch yet to be born"
+msgstr "새로 만들고 있는 브랜치에서 중지할 수 없습니다"
+
+#: sequencer.c:1620 builtin/grep.c:904
 #, c-format
-msgid "Malformed input line: '%s'."
-msgstr "잘못된 형식의 입력 줄: '%s'."
+msgid "cannot open '%s'"
+msgstr "'%s'을(를) 열 수 없습니다"
 
-#: builtin/am.c:581 builtin/notes.c:316
+#: sequencer.c:1622
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "'%s'ì\97\90ì\84\9c '%s'(ì\9c¼)ë¡\9c ë\85¸í\8a¸ë¥¼ ë³µì\82¬í\95\98ë\8a\94ë\8d° ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
+msgid "cannot read '%s': %s"
+msgstr "'%s'ì\9d\84(를) ì\9d½ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: %s"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "fseek 실패"
+#: sequencer.c:1623
+msgid "unexpected end of file"
+msgstr "예상치 못하게 파일이 끝났습니다"
 
-#: builtin/am.c:787
+#: sequencer.c:1629
 #, c-format
-msgid "could not parse patch '%s'"
-msgstr "'%s' 패치를 파싱할 수 없습니다"
-
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "한번에 하나의 StGIT 패치 시리즈만 적용할 수 있습니다"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "빼오기 전에 저장한 HEAD 파일이('%s') 손상되었습니다"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "시각이 잘못되었습니다"
+#: sequencer.c:1640
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr "HEAD를 옮긴 것 같습니다. 되돌리지 않습니다. HEAD를 확인하십시오!"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "Date 줄이 잘못되었습니다"
+#: sequencer.c:1777 sequencer.c:2049
+msgid "cannot read HEAD"
+msgstr "HEAD를 읽을 수 없습니다"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "시간대 오프셋이 잘못되었습니다"
+#: sequencer.c:1817 builtin/difftool.c:574
+#, c-format
+msgid "could not copy '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 복사할 수 없습니다"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "패치 형식 검색이 실패했습니다."
+#: sequencer.c:1833
+msgid "could not read index"
+msgstr "인덱스를 읽을 수 없습니다"
 
-#: builtin/am.c:1001 builtin/clone.c:380
+#: sequencer.c:1838
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "'%s' 디렉터리 만들기가 실패했습니다"
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"실행 실패: %s\n"
+"%s문제를 바로잡고, 다음을 실행하십시오\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "패치를 쪼개는데 실패했습니다."
+#: sequencer.c:1844
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "그리고 인덱스 그리고/또는 작업 폴더에 변경 사항이 있습니다\n"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "인덱스 파일을 쓸 수 없습니다"
+#: sequencer.c:1850
+#, c-format
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"실행 성공: %s\n"
+"하지만 변경 사항을 인덱스 및/또는 작업 폴더에 남겨둡니다.\n"
+"변경 사항을 커밋하거나 스태시에 넣으려면, 다음을 실행하십시오:\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#: builtin/am.c:1188
+#: sequencer.c:1905 git-rebase.sh:168
 #, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "ì\9d´ ë¬¸ì \9c를 í\95´ê²°í\96\88ì\9d\84 ë\95\8c \"%s --continue\"를 ì\8b¤í\96\89í\95\98ì\8b­ì\8b\9cì\98¤."
+msgid "Applied autostash."
+msgstr "ì\9e\90ë\8f\99ì\8a¤í\83\9cì\8b\9c ì \81ì\9a©."
 
-#: builtin/am.c:1189
+#: sequencer.c:1917
 #, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "이 패치를 건너뛰려면, 그 대신 \"%s --skip\"을 실행하십시오."
+msgid "cannot store %s"
+msgstr "%s을(를) 저장할 수 없습니다"
 
-#: builtin/am.c:1190
+#: sequencer.c:1919 git-rebase.sh:172
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
 msgstr ""
-"원래 브랜치를 복구하고 패치 적용을 중지하려면 \"%s --abort\"를 실행하십시오."
-
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "패치가 비어 있습니다. 잘못 쪼개지지 않았나요?"
+"자동스태시 적용에 충돌이 발생했습니다.\n"
+"변경 사항은 스태시 안에 안전하게 들어 있습니다.\n"
+"언제든지 \"git stash pop\" 또는 \"git stash drop\"을 실행할 수 있습니다.\n"
 
-#: builtin/am.c:1402 builtin/log.c:1543
+#: sequencer.c:2000
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "잘못된 신원 줄: %s"
+msgid "stopped at %s... %.*s"
+msgstr "%s...%.*s 위치에서 멈췄습니다"
 
-#: builtin/am.c:1429
+#: sequencer.c:2027
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "%s 커밋을 파싱할 수 없습니다"
+msgid "unknown command %d"
+msgstr "알 수 없는 명령 %d"
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
+#: sequencer.c:2057
+msgid "could not read orig-head"
+msgstr "orig-head를 읽을 수 없습니다"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr "인덱스 정보를 사용해 기본 트리를 다시 만듭니다..."
+#: sequencer.c:2061
+msgid "could not read 'onto'"
+msgstr "'onto'를 읽을 수 없습니다"
 
-#: builtin/am.c:1623
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-"패치를 직접 편집하셨습니까?\n"
-"이 패치는 인덱스에 기록된 블롭에는 적용되지 않습니다."
+#: sequencer.c:2068
+#, c-format
+msgid "could not update %s"
+msgstr "%s을(를) 업데이트할 수 없습니다"
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "베이스 패치 적용 및 3-방향 병합으로 대신합니다..."
+#: sequencer.c:2075
+#, c-format
+msgid "could not update HEAD to %s"
+msgstr "HEAD를 %s 위치로 업데이트할 수 없습니다"
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "ë³\80ê²½ ì\82¬í\95­ì\97\90ì\84\9c ë³\91í\95©í\95\98ë\8a\94ë\8d° ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤."
+#: sequencer.c:2159
+msgid "cannot rebase: You have unstaged changes."
+msgstr "리베ì\9d´ì\8a¤í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: ì\8a¤í\85\8cì\9d´ì§\95í\95\98ì§\80 ì\95\8aì\9d\80 ë³\80ê²½ ì\82¬í\95­ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤."
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree가 트리를 쓰는데 실패했습니다"
+#: sequencer.c:2164
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "CHERRY_PICK_HEAD를 제거할 수 없습니다"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "빈 커밋 내역에 대해 적용합니다"
+#: sequencer.c:2173
+msgid "cannot amend non-existing commit"
+msgstr "없는 커밋을 수정할 수 없습니다"
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "커ë°\8b ì\98¤ë¸\8cì \9dí\8a¸ë¥¼ ì\93°ë\8a\94ë\8d° ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
+#: sequencer.c:2175
+#, c-format
+msgid "invalid file: '%s'"
+msgstr "ì\9e\98못ë\90\9c í\82¤: '%s'"
 
-#: builtin/am.c:1731 builtin/am.c:1735
+#: sequencer.c:2177
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "다시 시작할 수 없습니다: %s이(가) 없습니다."
+msgid "invalid contents: '%s'"
+msgstr "잘못된 내용: '%s'"
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
+#: sequencer.c:2180
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
-"터미널에 표준 입력이 연결되지 않은 상태에서 대화형으로 실행할 수 없습니다."
+"\n"
+"작업 폴더에 커밋하지 않은 변경 사항이 있습니다. 이 사항을 먼저\n"
+"커밋하고 'git rebase --continue' 명령을 다시 실행하십시오."
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "커ë°\8b ë³¸ë¬¸ì\9d\80:"
+#: sequencer.c:2190
+msgid "could not commit staged changes."
+msgstr "ì\8a¤í\85\8cì\9d´ì§\95í\95\9c ë³\80ê²½ ì\82¬í\95­ì\9d\84 ì»¤ë°\8bí\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤."
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "적용? 예[y]/아니오[n]/편집[e]/패치 보기[v]/모두 적용[a]: "
+#: sequencer.c:2270
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: %s 커밋을 빼올 수 없습니다"
 
-#: builtin/am.c:1816
+#: sequencer.c:2274
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "변경된 인덱스: 패치를 적용할 수 없습니다 (dirty: %s)"
-
-#: builtin/am.c:1853 builtin/am.c:1925
-#, c-format
-msgid "Applying: %.*s"
-msgstr "적용하는 중: %.*s"
+msgid "%s: bad revision"
+msgstr "%s: 잘못된 리비전"
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "변경 사항 없음 -- 패치가 이미 적용되었습니다."
+#: sequencer.c:2307
+msgid "can't revert as initial commit"
+msgstr "최초의 커밋으로 되돌릴 수 없습니다"
 
-#: builtin/am.c:1877
+#: setup.c:160
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "패치가 %s %.*s 위치에서 실패했습니다"
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s: 작업 폴더에 그런 경로가 없습니다.\n"
+"로컬에 없는 경로를 지정하려면 'git <명령> -- <경로>...' 식으로 사용하십시오."
 
-#: builtin/am.c:1883
+#: setup.c:173
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "실패한 패치의 복사본이 다음 위치에 있습니다: %s"
-
-#: builtin/am.c:1928
 msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"변경 사항이 없습니다 - 'git add' 사용을 잊으셨습니까?\n"
-"커밋으로 표시할 사항이 남아 있지 않으면, 이미 같은 패치에서 적용된\n"
-"경우일 수도 있습니다. 그런 경우에는 이 패치를 건너뛰면 됩니다."
+"애매한 인자 '%s': 알 수 없는 리비전 또는 작업 폴더에 없는 경로.\n"
+"경로와 리비전을 구분하려면 다음과 같이 '--'를 사용하십시오:\n"
+"'git <명령> [<리비전>...] -- [<파일>...]'"
 
-#: builtin/am.c:1935
+#: setup.c:223
+#, c-format
 msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"인덱스에 병합하지 않은 경로가 남아 있습니다.\n"
-"'git add' 사용을 잊지 않으셨습니까?"
+"애매한 인자 '%s': 알 수 없는 리비전 및 파일 이름\n"
+"경로와 리비전을 구분하려면 다음과 같이 '--'를 사용하십시오:\n"
+"'git <명령> [<리비전>...] -- [<파일>...]'"
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
+#: setup.c:470
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "'%s' 오브젝트를 파싱할 수 없습니다."
+msgid "Expected git repo version <= %d, found %d"
+msgstr "깃 저장소 버전 <= %d 버전을 기대하지만, %d 버전이 발견되었습니다"
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "인덱스 지우기에 실패했습니다"
+#: setup.c:478
+msgid "unknown repository extensions found:"
+msgstr "알 수 없는 저장소 확장이 있습니다:"
+
+#: setup.c:768
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "(현재 폴더 또는 상위 폴더가) 깃 저장소가 아닙니다: %s"
+
+#: setup.c:770 setup.c:922 builtin/index-pack.c:1643
+msgid "Cannot come back to cwd"
+msgstr "현재 디렉터리로 돌아올 수 없습니다"
+
+#: setup.c:852
+msgid "Unable to read current working directory"
+msgstr "현재 작업 디렉터리를 읽을 수 없습니다"
 
-#: builtin/am.c:2129
+#: setup.c:927
+#, c-format
 msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
 msgstr ""
-"마지막 'am' 실패 이후 HEAD를 옮긴 것 같습니다.\n"
-"ORIG_HEAD로 되돌리지 않습니다."
+"(현재 폴더 또는 마운트 위치 %s까지 상위 폴더가) 깃 저장소가 아닙니다\n"
+"파일 시스템 경계에서 중지합니다. (GIT_DISCOVERY_ACROSS_FILESYSTEM 설정되지 않"
+"음)"
 
-#: builtin/am.c:2192
+#: setup.c:934
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "--patch-format 옵션에 대해 잘못된 값: %s"
+msgid "Cannot change to '%s/..'"
+msgstr "'%s/..' 위치로 이동할 수 없습니다"
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<옵션>] [(<mbox>|<Maildir>)...]"
+#: setup.c:996
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"core.sharedRepository 파일모드 값에 (0%.3o) 문제가 있습니다.\n"
+"파일의 소유자에 읽기와 쓰기 권한이 있어야 합니다."
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<옵션>] (--continue | --skip | --abort)"
+#: sha1_file.c:490
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "'%s' 경로가 없습니다"
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "대화형으로 실행합니다"
+#: sha1_file.c:516
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"레퍼런스 '%s' 저장소를 연결된 체크아웃으로 쓰기는 아직 지원하지 않습니다."
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "아무 동작도 하지 않습니다 (과거부터 있었던 옵션)"
+#: sha1_file.c:522
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "레퍼런스 '%s' 저장소가 로컬 저장소가 아닙니다."
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "필요하면 3-방향 병합으로 대신하도록 허용합니다"
+#: sha1_file.c:528
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "레퍼런스 '%s' 저장소가 얕은 저장소입니다"
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "간략히 표시합니다"
+#: sha1_file.c:536
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "레퍼런스 '%s' 저장소가 붙어 있는 저장소입니다"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "커ë°\8b ë©\94ì\8b\9cì§\80ì\97\90 Signed-off-by ì¤\84ì\9d\84 ë\82¨ê¹\81ë\8b\88ë\8b¤"
+#: sha1_file.c:1176
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "ì\98¤í\94\84ì\85\8bì\9d´ ë¬¶ì\9d\8c í\8c\8cì\9d¼ ì\95\9eì\9e\85ë\8b\88ë\8b¤ (ë§\9dê°\80ì§\84 .idx?)"
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "UTF-8 인코딩으로 변환합니다 (기본값)"
+#: sha1_file.c:2637
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "오프셋이 %s의 묶음 인덱스 시작보다 앞입니다 (망가진 인덱스?)"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "git-mailinfo에 -k 옵션을 씁니다"
+#: sha1_file.c:2641
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "오프셋이 %s의 묶음 인덱스 끝보다 뒤입니다 (망가진 인덱스?)"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "git-mailinfo에 -b 옵션을 씁니다"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "짧은 SHA1 %s은(는) 여럿에 대응됩니다"
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "git-mailinfo에 -m 옵션을 씁니다"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "후보는 다음과 같습니다:"
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "mbox 형식에 대해 git-mailsplit에 --keep-cr 옵션을 사용합니다"
+#: sha1_name.c:578
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"깃에서는 보통 40개의 16진수 문자로 끝나는 레퍼런스를 만들지 않습니다.\n"
+"16진수 문자 40자를 지정했을 때 이 레퍼런스가 무시되기 때문입니다. 이\n"
+"레퍼런스는 실수로 만들어졌을 수도 있습니다. 예를 들어,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"여기서 \"$br\"은 비어 있으므로 40자 레퍼런스가 만들어집니다. 이 레퍼런스를\n"
+"확인해 보시고 잘못 만들어진 것이면 지우십시오. 이 메시지를 보고 싶지\n"
+"않으면 \"git config advice.objectNameWarning false\" 명령을 사용하십시오."
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: submodule.c:65 submodule.c:99
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
-"am.keepcr에 무관하게 git-mailsplit에 --keep-cr 옵션을 사용하지 않습니다."
+"병합하지 않은 .gitmodules를 바꿀 수 없습니다. 병합 충돌을 먼저 해결하십시오"
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "절취선 앞의 모든 사항을 무시합니다"
+#: submodule.c:69 submodule.c:103
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "경로가 %s일 때 .gitmodules의 섹션을 찾을 수 없습니다"
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "동작"
+#: submodule.c:77
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr ".gitmodules 항목 %s을(를) 업데이트할 수 없습니다"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "git-apply에 넘깁니다"
+#: submodule.c:110
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "%s에 대한 .gitmodules 항목을 제거할 수 없습니다"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "ìµ\9cì\83\81ì\9c\84"
+#: submodule.c:121
+msgid "staging updated .gitmodules failed"
+msgstr "ì\97\85ë\8d°ì\9d´í\8a¸í\95\9c .gitmodules를 ì»¤ë°\8bí\95  ì\82¬í\95­ì\9c¼ë¡\9c í\91\9cì\8b\9cí\95\98ë\8a\94ë\8d° ì\8b¤í\8c¨"
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "경로"
+#: submodule.c:159
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "submodule.fetchJobs 값에 음수를 쓸 수 없습니다"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: submodule.c:1184
+#, c-format
+msgid "could not start 'git status in submodule '%s'"
+msgstr "서브모듈 '%s'에서 'git status'를 시작할 수 없습니다"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "개수"
+#: submodule.c:1197
+#, c-format
+msgid "could not run 'git status in submodule '%s'"
+msgstr "서브모듈 '%s'에서 'git status'를 실행할 수 없습니다"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "형식"
+#: submodule.c:1398
+#, c-format
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr ""
+"여러 개의 작업 폴더가 있는 하위 모듈 '%s'에 대해 relocate_gitdir은 지원하지 "
+"않습니다"
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "패치의 형식"
+#: submodule.c:1410 submodule.c:1471
+#, c-format
+msgid "could not lookup name for submodule '%s'"
+msgstr "하위 모듈 '%s'의 이름을 찾아볼 수 없습니다"
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "패치 실패가 발생했을 때 오류 메시지 대신 사용합니다"
+#: submodule.c:1414 submodule.c:1474 builtin/submodule--helper.c:640
+#: builtin/submodule--helper.c:650
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "'%s' 디렉터리를 만들 수 없습니다"
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "충돌을 해결한 다음 패치 적용을 계속합니다"
+#: submodule.c:1420
+#, c-format
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
+msgstr ""
+"'%s%s'의 깃 디렉터리를 옮깁니다:\n"
+"'%s'에서\n"
+"'%s'(으)로\n"
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "--continue 옵션과 동일"
+#: submodule.c:1512
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "재귀적으로 '%s' 하위 모듈에 들어갈 수 없습니다"
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "현재 패치 건너뛰기"
+#: submodule-config.c:360
+#, c-format
+msgid "invalid value for %s"
+msgstr "%s의 값이 올바르지 않습니다"
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "원래 브랜치를 복구하고 패치 적용 작업을 중지합니다."
+#: trailer.c:240
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "트레일러 명령 '%s' 실행 실패"
 
-# NOTE: 옵션의 의미는 이게 맞다. 원문에서는 사용자가
-# --committer-date-is-author-date라는 옵션을 보고 의미를 알 수 있다고 가정하고 있다.
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "커미í\84° ì\8b\9cê°\81ì\9d\84 ì\9e\91ì\84±ì\9e\90 ì\8b\9cê°\81ì\9c¼ë¡\9c ë\84£ì\8aµë\8b\88ë\8b¤"
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "ì\95\8c ì\88\98 ì\97\86ë\8a\94 ê°\92 '%s', í\82¤ '%s'"
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "현재 시각을 작성자 시각으로 사용합니다"
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "%s이(가) 여러개입니다"
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "í\82¤-ID"
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "í\8a¸ë \88ì\9d¼ë\9f¬ '%.*s'ì\97\90ì\84\9c ë¹\88 í\8a¸ë \88ì\9d¼ë\9f¬ í\86 í\81°"
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "GPG 서명 커밋"
+#: trailer.c:722
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "'%s' 입력 파일을 읽을 수 없습니다"
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(git-rebase를 위한 내부 용도)"
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "표준 입력에서 읽을 수 없습니다"
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
-msgstr ""
-"-b/--binary 옵션은 오랜 시간 동안 아무 동작도 하지 않았으므로, 이\n"
-"옵션은 제거될 예정입니다. 이제 사용하지 마십시오."
+#: trailer.c:949 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "%s에 대해 stat()할 수 없습니다"
+
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "'%s' 파일이 일반 파일이 아닙니다"
+
+#: trailer.c:953
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "사용자가 %s 파일에 쓸 수 없습니다"
+
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "임시 파일을 열 수 없습니다: %s"
+
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "임시 파일 이름을 '%s'(으)로 바꿀 수 없습니다"
+
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "'%1$s'의 업스트림을 '%3$s'의 '%2$s'(으)로 설정합니다\n"
+
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: 잘못된 깊이 옵션: %s"
+
+#: transport.c:885
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"다음 하위 모듈 경로에 리모트 어디에도 없는\n"
+"변경 사항이 있습니다:\n"
+
+#: transport.c:889
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"리모트에 푸시하려면\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"또는 해당 경로로 cd한 다음\n"
+"\n"
+"\tgit push\n"
+"\n"
+"명령을 시도해 보십시오\n"
+"\n"
+
+#: transport.c:897
+msgid "Aborting."
+msgstr "중지함."
+
+#: transport-helper.c:1082
+#, c-format
+msgid "Could not read ref %s"
+msgstr "%s 레퍼런스를 읽을 수 없습니다"
+
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "너무 짧은 트리 오브젝트"
+
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "트리 엔트리에 잘못된 형식의 모드"
+
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "트리 엔트리에 빈 파일 이름"
+
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "너무 짧은 트리 파일"
+
+#: unpack-trees.c:99
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr ""
+"다음 파일의 로컬 변경 사항을 체크아웃 때문에 덮어 쓰게 됩니다:\n"
+"%%s브랜치를 전환하기 전에 변경 사항을 커밋하거나 스태시하십시오."
+
+#: unpack-trees.c:101
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"다음 파일의 로컬 변경 사항을 체크아웃 때문에 덮어 쓰게 됩니다:\n"
+"%%s"
+
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"다음 파일의 로컬 변경 사항을 병합 때문에 덮어 쓰게 됩니다:\n"
+"%%s병합하기 전에 변경 사항을 커밋하거나 스태시하십시오."
+
+#: unpack-trees.c:106
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr "다음 파일의 로컬 변경 사항을 병합 때문에 덮어 쓰게 됩니다."
+
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"다음 파일의 로컬 변경 사항을 %s 때문에 덮어 쓰게 됩니다:\n"
+"%%s%s 전에 변경 사항을 커밋하거나 스태시하십시오."
+
+#: unpack-trees.c:111
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"다음 파일의 로컬 변경 사항을 %s 때문에 덮어 쓰게 됩니다:\n"
+"%%s"
+
+#: unpack-trees.c:116
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
+msgstr ""
+"다음 디렉터리를 업데이트하면 그 안의 추적하지 않는 파일을 잃어버립니다:\n"
+"%s"
+
+#: unpack-trees.c:120
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더의 파일이 제거됩니다:\n"
+"%%s브랜치를 전환하기 전에 이 파일을 옮기거나 제거하십시오."
+
+#: unpack-trees.c:122
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
+"%%s"
+
+#: unpack-trees.c:125
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"병합 때문에 추적하지 않는 다음 작업 폴더의 파일이 제거됩니다:\n"
+"%%s병합하기 전에 이 파일을 옮기거나 제거하십시오."
+
+#: unpack-trees.c:127
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"병합 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
+"%%s"
+
+#: unpack-trees.c:130
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"%s 때문에 추적하지 않는 다음 작업 폴더의 파일이 제거됩니다:\n"
+"%%s%s 하기 전에 이 파일을 옮기거나 제거하십시오."
+
+#: unpack-trees.c:132
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"%s 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
+"%%s"
+
+#: unpack-trees.c:137
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:\n"
+"%%s브랜치를 전환하기 전에 이 파일을 옮기거나 제거하십시오."
+
+#: unpack-trees.c:139
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
+"%%s"
+
+#: unpack-trees.c:142
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"병합 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:\n"
+"%%s병합하기 전에 이 파일을 옮기거나 제거하십시오."
+
+#: unpack-trees.c:144
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"병합 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
+"%%s"
+
+#: unpack-trees.c:147
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"%s 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:\n"
+"%%s%s 하기 전에 이 파일을 옮기거나 제거하십시오."
+
+#: unpack-trees.c:149
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"%s 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
+"%%s"
+
+#: unpack-trees.c:156
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "'%s' 항목이 '%s'와(과) 겹칩니다.  묶을 수 없습니다."
+
+#: unpack-trees.c:159
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"드문 체크아웃을 업데이트할 수 없습니다. 다음 항목이 최신으로 업데이트되지 않"
+"았습니다:\n"
+"%s"
+
+#: unpack-trees.c:161
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"드문 체크아웃 업데이트 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니"
+"다:\n"
+"%s"
+
+#: unpack-trees.c:163
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"드문 체크아웃 업데이트 때문에 추적하지 않는 다음 작업 폴더 파일을 제거합니"
+"다:\n"
+"%s"
+
+#: unpack-trees.c:240
+#, c-format
+msgid "Aborting\n"
+msgstr "중지함\n"
+
+#: unpack-trees.c:270
+msgid "Checking out files"
+msgstr "파일을 가져옵니다"
+
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "URL 스킴 이름이 잘못되었거나 '://'가 뒤에 붙지 않았습니다"
+
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "잘못된 %XX 이스케이프 시퀀스"
+
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "호스트가 없고 스킴이 'file:'이 아닙니다"
+
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "'file:' URL에는 포트 번호를 쓸 수 없습니다"
+
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "호스트 이름에 잘못된 문자"
+
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "잘못된 포트 번호"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "경로에서 잘못된 '..' 부분"
+
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "'%s'을(를) 읽는데 실패했습니다"
+
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "읽기와 쓰기용으로 '%s'을(를) 열 수 없습니다"
+
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:320 builtin/am.c:759
+#: builtin/am.c:847 builtin/commit.c:1700 builtin/merge.c:1033
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "'%s'을(를) 읽기용으로 열 수 없습니다"
+
+#: wrapper.c:605 wrapper.c:626
+#, c-format
+msgid "unable to access '%s'"
+msgstr "'%s'에 접근할 수 없습니다"
+
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "현재 작업 디렉터리를 가져올 수 없습니다"
+
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "%s에 쓸 수 없습니다"
+
+#: wrapper.c:660
+#, c-format
+msgid "could not close %s"
+msgstr "%s을(를) 닫을 수 없습니다"
+
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "병합하지 않은 경로:"
+
+#: wt-status.c:178 wt-status.c:205
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git reset %s <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git rm --cached <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git add <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (해결했다고 표시하려면 알맞게 \"git add/rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "커밋할 변경 사항:"
+
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "커밋하도록 정하지 않은 변경 사항:"
+
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add/rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (작업 폴더의 변경 사항을 버리려면 \"git checkout -- <파일>...\"을 사용하십"
+"시오)"
+
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (하위 모듈의 추적되지 않는 파일이나 수정된 내용을 커밋하거나 버리십시오)"
+
+#: wt-status.c:238
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (커밋할 사항에 포함하려면 \"git %s <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "양쪽에서 삭제:"
+
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "이 쪽에서 추가:"
+
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "저 쪽에서 삭제:"
+
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "저 쪽에서 추가:"
+
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "이 쪽에서 삭제:"
+
+#: wt-status.c:263
+msgid "both added:"
+msgstr "양쪽에서 추가:"
+
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "양쪽에서 수정:"
+
+#: wt-status.c:275
+msgid "new file:"
+msgstr "새 파일:"
+
+#: wt-status.c:277
+msgid "copied:"
+msgstr "복사함:"
+
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "삭제함:"
+
+#: wt-status.c:281
+msgid "modified:"
+msgstr "수정함:"
+
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "이름 바꿈:"
+
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "종류 바뀜:"
+
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "알 수 없음:"
+
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "병합하지 않음:"
+
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "새 커밋, "
+
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "수정한 내용, "
+
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "추적하지 않은 내용, "
+
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "변경되었지만 업데이트하지 않은 하위 모듈:"
+
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "커밋할 하위 모듈의 변경 사항:"
+
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"위의 줄을 바꾸지 마십시오.\n"
+"아래 있는 내용은 모두 제거됩니다."
+
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "병합하지 않은 경로가 있습니다."
+
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (충돌을 바로잡고 \"git commit\"을 실행하십시오)"
+
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (병합을 중단하려면 \"git merge --abort\"를 사용하십시오)"
+
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "모든 충돌을 바로잡았지만 아직 병합하는 중입니다."
+
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (병합을 마무리하려면 \"git commit\"을 사용하십시오)"
+
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "am 세션 중간에 있습니다."
+
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "현재 패치가 비어 있습니다."
+
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (충돌을 바로잡은 다음 \"git am --continue\"를 사용하십시오)"
+
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너 뛰려면 \"git am --skip\"을 사용하십시오)"
+
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (원본 브랜치를 복구하려면 \"git am --abort\"를 사용하십시오)"
+
+#: wt-status.c:1176
+msgid "git-rebase-todo is missing."
+msgstr "git-rebase-todo가 없습니다."
+
+#: wt-status.c:1178
+msgid "No commands done."
+msgstr "완료한 명령 없음."
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "인덱스 읽기에 실패했습니다"
+#: wt-status.c:1181
+#, c-format
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "최근 완료한 명령 (%d개 명령 완료):"
+
+#: wt-status.c:1192
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (자세한 정보는 %s 파일 참고)"
+
+#: wt-status.c:1197
+msgid "No commands remaining."
+msgstr "명령이 남아있지 않음."
+
+#: wt-status.c:1200
+#, c-format
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "다음에 할 명령 (%d개 명령 남음):"
+
+#: wt-status.c:1208
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (보고 편집하려면 \"git rebase --edit-todo\"를 사용하십시오)"
+
+#: wt-status.c:1221
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중입니다."
+
+#: wt-status.c:1226
+msgid "You are currently rebasing."
+msgstr "현재 리베이스하는 중입니다."
+
+#: wt-status.c:1240
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (충돌을 바로잡고 \"git rebase --continue\"를 사용하십시오)"
+
+#: wt-status.c:1242
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너뛰려면 \"git rebase --skip\"을 사용하십시오)"
+
+#: wt-status.c:1244
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (원본 브랜치를 가져오려면 \"git rebase --abort\"를 사용하십시오)"
+
+#: wt-status.c:1250
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git rebase --continue\"를 실행하십시오)"
+
+#: wt-status.c:1254
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 분리하는 중입니다."
+
+#: wt-status.c:1259
+msgid "You are currently splitting a commit during a rebase."
+msgstr "현재 리베이스하는 중 커밋을 분리하는 중입니다."
+
+#: wt-status.c:1262
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (작업 폴더가 깨끗해지면, \"git rebase --continue\"를 실행하십시오)"
+
+#: wt-status.c:1266
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "'%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 편집하는 중입니다."
+
+#: wt-status.c:1271
+msgid "You are currently editing a commit during a rebase."
+msgstr "리베이스 중에 커밋을 편집하는 중입니다."
+
+#: wt-status.c:1274
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (현재 커밋을 수정하려면 \"git commit --amend\"을 사용하십시오)"
+
+#: wt-status.c:1276
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (변경 사항에 만족할 때 \"git rebase --continue\"를 사용하십시오)"
+
+#: wt-status.c:1286
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "현재 %s 커밋을 뽑아 내고 있습니다."
+
+#: wt-status.c:1291
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (충돌을 바로잡고 \"git cherry-pick --continue\"를 실행하십시오)"
+
+#: wt-status.c:1294
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git cherry-pick --continue\"를 실행하십시오)"
+
+#: wt-status.c:1296
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (뽑기 작업을 취소하려면 \"git cherry-pick --abort\"를 사용하십시오)"
+
+#: wt-status.c:1305
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "현재 %s 커밋을 되돌리는 중입니다."
+
+#: wt-status.c:1310
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (충돌을 바로잡고 \"git revert --continue\"를 실행하십시오)"
+
+#: wt-status.c:1313
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git revert --continue\"를 실행하십시오)"
+
+#: wt-status.c:1315
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (되돌리기 작업을 취소하려면 \"git revert --abort\"를 사용하십시오)"
+
+#: wt-status.c:1326
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "'이등분하는 중입니다. '%s' 브랜치부터 시작."
+
+#: wt-status.c:1330
+msgid "You are currently bisecting."
+msgstr "'이등분하는 중입니다."
+
+#: wt-status.c:1333
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (원래 브랜치로 돌아가려면 \"git bisect reset\"을 사용하십시오)"
+
+#: wt-status.c:1530
+msgid "On branch "
+msgstr "현재 브랜치 "
+
+#: wt-status.c:1536
+msgid "interactive rebase in progress; onto "
+msgstr "대화형 리베이스 진행 중. 갈 위치는 "
+
+#: wt-status.c:1538
+msgid "rebase in progress; onto "
+msgstr "리베이스 진행 중. 갈 위치는 "
+
+#: wt-status.c:1543
+msgid "HEAD detached at "
+msgstr "HEAD가 다음 위치에서 분리: "
+
+#: wt-status.c:1545
+msgid "HEAD detached from "
+msgstr "HEAD가 다음으로부터 분리: "
+
+#: wt-status.c:1548
+msgid "Not currently on any branch."
+msgstr "현재 어떤 브랜치도 사용하지 않음."
+
+#: wt-status.c:1566
+msgid "Initial commit"
+msgstr "최초 커밋"
+
+#: wt-status.c:1580
+msgid "Untracked files"
+msgstr "추적하지 않는 파일"
+
+#: wt-status.c:1582
+msgid "Ignored files"
+msgstr "무시한 파일"
+
+#: wt-status.c:1586
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+"추적하지 않는 파일을 모두 확인하는데 %.2f초가 걸렸습니다.\n"
+"'status -uno' 옵션을 쓰면 빨라질 수도 있지만, 새 파일을\n"
+"직접 찾아서 추가해야 합니다. ('git help status' 참고)"
+
+#: wt-status.c:1592
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "추적하지 않는 파일을 보지 않습니다%s"
+
+#: wt-status.c:1594
+msgid " (use -u option to show untracked files)"
+msgstr " (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)"
+
+#: wt-status.c:1600
+msgid "No changes"
+msgstr "변경 사항 없음"
+
+#: wt-status.c:1605
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"커밋할 변경 사항을 추가하지 않았습니다 (\"git add\" 및/또는 \"git commit -a"
+"\"를\n"
+"사용하십시오)\n"
+
+#: wt-status.c:1608
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "커밋할 변경 사항을 추가하지 않았습니다\n"
+
+#: wt-status.c:1611
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "
+"\"git\n"
+"add\"를 사용하십시오)\n"
+
+#: wt-status.c:1614
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다\n"
+
+#: wt-status.c:1617
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"커밋할 사항 없음 (파일을 만들거나 복사하고 \"git add\"를 사용하면 추적합니"
+"다)\n"
+
+#: wt-status.c:1620 wt-status.c:1625
+#, c-format
+msgid "nothing to commit\n"
+msgstr "커밋할 사항 없음\n"
+
+#: wt-status.c:1623
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"커밋할 사항 없음 (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)\n"
+
+#: wt-status.c:1627
+#, c-format
+msgid "nothing to commit, working tree clean\n"
+msgstr "커밋할 사항 없음, 작업 폴더 깨끗함\n"
+
+#: wt-status.c:1734
+msgid "Initial commit on "
+msgstr "최초 커밋, 브랜치: "
+
+#: wt-status.c:1738
+msgid "HEAD (no branch)"
+msgstr "HEAD (브랜치 없음)"
+
+#: wt-status.c:1767
+msgid "gone"
+msgstr "없음"
+
+#: wt-status.c:1769 wt-status.c:1777
+msgid "behind "
+msgstr "다음 뒤에: "
+
+#: wt-status.c:1772 wt-status.c:1775
+msgid "ahead "
+msgstr "다음 앞에: "
+
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2277
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "%s 할 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
+
+#: wt-status.c:2283
+msgid "additionally, your index contains uncommitted changes."
+msgstr "추가로, 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
+#: wt-status.c:2285
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "%s 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "'%s' 파일 삭제에 실패했습니다"
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<옵션>] [--] <경로명세>..."
+
+#: builtin/add.c:80
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "예상치 못한 diff 상태 %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "파일 업데이트가 실패했습니다"
+
+#: builtin/add.c:95
+#, c-format
+msgid "remove '%s'\n"
+msgstr "'%s' 제거\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "인덱스를 새로 고친 다음 커밋 표시하지 않은 변경 사항:"
+
+#: builtin/add.c:209 builtin/rev-parse.c:845
+msgid "Could not read the index"
+msgstr "인덱스를 읽을 수 없습니다"
+
+#: builtin/add.c:220
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "'%s' 파일을 쓰기용으로 열 수 없습니다."
+
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "패치를 쓸 수 없습니다"
+
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "패치 편집에 실패했습니다"
 
-#: builtin/am.c:2348
+#: builtin/add.c:230
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "이전 리베이스 디렉터리 %s이(가) 아직 있고 mbox를 지정했습니다."
+msgid "Could not stat '%s'"
+msgstr "'%s'을(를) stat()할 수 없습니다"
 
-#: builtin/am.c:2372
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-"벗어난 %s 디렉터리가 발견되었습니다.\n"
-"제거하려면 \"git am --abort\"를 사용하십시오."
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "빈 패치. 중지."
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "해소 작업이 진행 중입니다. 다시 시작하지 않습니다."
+#: builtin/add.c:237
+#, c-format
+msgid "Could not apply '%s'"
+msgstr "'%s'을(를) 적용할 수 없습니다"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<옵션>] [<패치>...]"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "다음 경로는 .gitignore 파일 중 하나 때문에 무시합니다:\n"
 
-#: builtin/apply.c:153
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "알 수 없는 공백 옵션 '%s'"
+#: builtin/add.c:266 builtin/clean.c:870 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1326 builtin/rm.c:241 builtin/send-pack.c:162
+msgid "dry run"
+msgstr "가짜로 실행"
 
-#: builtin/apply.c:169
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "알 수 없는 공백 무시 옵션 '%s'"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "대화식으로 고릅니다"
 
-#: builtin/apply.c:854
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "타임스탬프 정규식을 준비할 수 없습니다 (%s)"
+#: builtin/add.c:270 builtin/checkout.c:1159 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "대화식으로 변경된 부분을 선택합니다"
 
-#: builtin/apply.c:863
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec()에서 다음 입력에 대해 %d번을 리턴했습니다: %s"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "현재 diff를 편집하고 적용합니다"
 
-#: builtin/apply.c:947
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "패치의 %d번 줄에 파일 이름을 찾을 수 없습니다"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "무시하는 파일의 추가를 허용합니다"
 
-#: builtin/apply.c:984
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-"git apply: 잘못된 git-diff - %2$d번 줄에서 /dev/null을 기대했지만, '%1$s'이"
-"(가) 왔습니다"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "추적되는 파일을 업데이트합니다"
 
-#: builtin/apply.c:989
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-"git apply: 잘못된 git-diff - %d번 줄에 새 파일 이름이 올바르지 않습니다"
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "나중에 추가할 것이라는 사실만 기록합니다"
 
-#: builtin/apply.c:990
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-"git apply: 잘못된 git-diff - %d번 줄에 예전 파일 이름이 올바르지 않습니다"
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "추적되고 추적되지 않는 모든 파일의 변경 사항을 추가합니다"
 
-#: builtin/apply.c:995
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: 잘못된 git-diff - %d번 줄에서 /dev/null을 기대했습니다"
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "작업 폴더에서 제거한 경로를 무시합니다 (--no-all과 동일)"
 
-#: builtin/apply.c:1489
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: 예상치 못한 줄: %.*s"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "추가하지 않고 인덱스만 새로 고칩니다"
 
-#: builtin/apply.c:1550
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "%d번 줄에 헤더 없는 패치 부분: %.*s"
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "오류 때문에 추가할 수 없는 파일을 건너뜁니다"
 
-#: builtin/apply.c:1567
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"경로 이름 부분에서 %d개를 제거라 때 git diff 헤더에 파일 이름 정보가 없습니"
-"다. (%d번 줄)"
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "가짜로 실행했을 때 파일을 무시하는지 확인합니다"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "새 파일이 예전 내용에 의존합니다"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "삭제한 파일에 아직 내용이 들어 있습니다"
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "목록의 파일에서 실행 가능 비트를 바꿉니다"
 
-#: builtin/apply.c:1774
+#: builtin/add.c:305
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "패치가 %d번 줄에서 망가졌습니다"
+msgid "Use -f if you really want to add them.\n"
+msgstr "정말로 추가하려면 -f 옵션을 사용하십시오.\n"
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "새 파일 %s이(가) 예전 내용에 의존합니다"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "파일 추가가 실패했습니다"
 
-#: builtin/apply.c:1812
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "삭제한 파일 %s이(가) 아직 내용이 들어 있습니다"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A 및 -u 옵션은 서로 호환되지 않습니다"
 
-#: builtin/apply.c:1815
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** 경고: %s 파일의 내용이 비어 있지만 삭제되지 않았습니다"
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr ""
+"--ignore-missing 옵션은 --dry-run 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
 
-#: builtin/apply.c:1962
+#: builtin/add.c:359
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "%d번 줄에 바이너리 패치가 손상되었습니다: %.*s"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod 파라미터 '%s'은(는) -x 또는 +x 형식이어야 합니다"
 
-#: builtin/apply.c:1999
+#: builtin/add.c:374
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "%d번 줄에 바이너리 패치가 이해할 수 없습니다"
+msgid "Nothing specified, nothing added.\n"
+msgstr "아무 것도 지정하지 않았으므로 아무 것도 추가하지 않습니다.\n"
 
-#: builtin/apply.c:2154
+#: builtin/add.c:375
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "%d번 줄에 쓰레기 데이터만 있는 패치"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "'git add .' 명령을 실행하려고 한 것 아니었습니까?\n"
 
-#: builtin/apply.c:2244
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "%s 심볼릭 링크를 읽을 수 없습니다"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:279
+#: builtin/checkout.c:472 builtin/clean.c:914 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "인덱스 파일이 손상되었습니다"
 
-#: builtin/apply.c:2248
-#, c-format
-msgid "unable to open or read %s"
-msgstr "%s을(를) 열거나 읽을 수 없습니다"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "작성자 스크립트를 파싱할 수 없습니다"
 
-#: builtin/apply.c:2901
+#: builtin/am.c:491
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "줄 시작이 잘못됨: '%c'"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "applypatch-msg 훅 때문에 '%s'이(가) 삭제되었습니다."
 
-#: builtin/apply.c:3020
+#: builtin/am.c:532
 #, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "패치 %d번 부분 %d번 줄에서 성공 (오프셋 %d줄)"
+msgid "Malformed input line: '%s'."
+msgstr "잘못된 형식의 입력 줄: '%s'."
 
-#: builtin/apply.c:3032
+#: builtin/am.c:569
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "컨텍스트가 (%ld/%ld)로 줄어듭니다. (%d번 줄에서 적용)"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 노트를 복사하는데 실패했습니다"
 
-#: builtin/apply.c:3038
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"다음을 검색하던 중:\n"
-"%.*s"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "fseek 실패"
 
-#: builtin/apply.c:3060
+#: builtin/am.c:775
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "'%s'에 대한 바이너리 패치 데이터가 없습니다"
+msgid "could not parse patch '%s'"
+msgstr "'%s' 패치를 파싱할 수 없습니다"
 
-#: builtin/apply.c:3163
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "바이너리 패치를 '%s'에 적용할 수 없습니다"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "한번에 하나의 StGIT 패치 시리즈만 적용할 수 있습니다"
 
-#: builtin/apply.c:3169
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"'%s'에 대한 바이너리 패치가 올바르지 않은 결과를 만듭니다. (기대한 값 %s, 실"
-"제 %s)"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "시각이 잘못되었습니다"
 
-#: builtin/apply.c:3190
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "패치 실패: %s:%ld"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "Date 줄이 잘못되었습니다"
 
-#: builtin/apply.c:3314
-#, c-format
-msgid "cannot checkout %s"
-msgstr "%s을(를) 가져올 수 없습니다"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "시간대 오프셋이 잘못되었습니다"
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "심볼릭 링크 뒤에 있는 '%s' 읽기"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "패치 형식 검색이 실패했습니다."
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "%s ê²½ë¡\9cê°\80 ì\9d´ë¦\84ì\9d´ ë°\94ë\80\8cì\97\88ê±°ë\82\98 ì\82­ì \9cë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤"
+msgid "failed to create directory '%s'"
+msgstr "'%s' ë\94\94ë \89í\84°ë¦¬ ë§\8cë\93¤ê¸°ê°\80 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "패치를 쪼개는데 실패했습니다."
+
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "인덱스 파일을 쓸 수 없습니다"
+
+#: builtin/am.c:1176
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: 인덱스에 없습니다"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "이 문제를 해결했을 때 \"%s --continue\"를 실행하십시오."
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
+#: builtin/am.c:1177
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "이 패치를 건너뛰려면, 그 대신 \"%s --skip\"을 실행하십시오."
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: 인덱스와 맞지 않습니다"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"원래 브랜치를 복구하고 패치 적용을 중지하려면 \"%s --abort\"를 실행하십시오."
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "제거하는 패치 다음에 파일 내용이 남았습니다"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "패치가 비어 있습니다. 잘못 쪼개지지 않았나요?"
 
-#: builtin/apply.c:3669
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: 잘못된 종류"
+msgid "invalid ident line: %s"
+msgstr "잘못된 신원 줄: %s"
 
-#: builtin/apply.c:3671
+#: builtin/am.c:1417
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s의 종류가 %o이지만 %o이(가) 되어야 합니다"
+msgid "unable to parse commit %s"
+msgstr "%s 커밋을 파싱할 수 없습니다"
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
-#, c-format
-msgid "invalid path '%s'"
-msgstr "잘못된 경로 '%s'"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
 
-#: builtin/apply.c:3879
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s: 이미 인덱스에 있습니다"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr "인덱스 정보를 사용해 기본 트리를 다시 만듭니다..."
 
-#: builtin/apply.c:3882
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: 이미 작업 디렉터리에 있습니다"
+#: builtin/am.c:1631
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"패치를 직접 편집하셨습니까?\n"
+"이 패치는 인덱스에 기록된 블롭에는 적용되지 않습니다."
 
-#: builtin/apply.c:3902
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "%2$s의 새 모드(%1$o)가 예전 모드(%3$o)와 다릅니다"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "베이스 패치 적용 및 3-방향 병합으로 대신합니다..."
 
-#: builtin/apply.c:3907
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "%2$s의 새 모드(%1$o)가 %4$s의 예전 모드(%3$o)와 다릅니다"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "변경 사항에서 병합하는데 실패했습니다."
 
-#: builtin/apply.c:3927
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "영향 받는 '%s' 파일이 심볼릭 링크 뒤에 있습니다"
+#: builtin/am.c:1686 builtin/merge.c:632
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree가 트리를 쓰는데 실패했습니다"
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: 패치를 적용하지 않습니다"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "빈 커밋 내역에 대해 적용합니다"
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "%s 패치를 확인하는 중입니다..."
+#: builtin/am.c:1706 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "커밋 오브젝트를 쓰는데 실패했습니다"
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "경로 '%s'에 대해 make_cache_entry 실패"
+msgid "cannot resume: %s does not exist."
+msgstr "다시 시작할 수 없습니다: %s이(가) 없습니다."
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "인덱스에서 %s을(를) 제거할 수 없습니다"
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"터미널에 표준 입력이 연결되지 않은 상태에서 대화형으로 실행할 수 없습니다."
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "하위 모듈 %s에 대해 손상된 패치"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "커밋 본문은:"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "새로 만든 파일 '%s'에 대해 stat()할 수 없습니다"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1774
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "적용? 예[y]/아니오[n]/편집[e]/패치 보기[v]/모두 적용[a]: "
 
-#: builtin/apply.c:4224
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "새로 만든 파일 '%s'에 대해 예비 저장소를 만들 수 없습니다"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "변경된 인덱스: 패치를 적용할 수 없습니다 (dirty: %s)"
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "%s에 대해 캐시 항목을 추가할 수 없습니다"
+msgid "Applying: %.*s"
+msgstr "적용하는 중: %.*s"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "'%s' 파일을 닫는 중입니다"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "변경 사항 없음 -- 패치가 이미 적용되었습니다."
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1885
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "'%s' 파일에 쓸 수 없습니다 ('%o' 모드)"
+msgid "Patch failed at %s %.*s"
+msgstr "패치가 %s %.*s 위치에서 실패했습니다"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1891
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "%s 패치 깔끔하게 적용."
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "실패한 패치의 복사본이 다음 위치에 있습니다: %s"
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "내부 오류"
+#: builtin/am.c:1936
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"변경 사항이 없습니다 - 'git add' 사용을 잊으셨습니까?\n"
+"커밋으로 표시할 사항이 남아 있지 않으면, 이미 같은 패치에서 적용된\n"
+"경우일 수도 있습니다. 그런 경우에는 이 패치를 건너뛰면 됩니다."
 
-#: builtin/apply.c:4414
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "%%s 패치를 (%d개 거부) 적용..."
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"인덱스에 병합하지 않은 경로가 남아 있습니다.\n"
+"'git add' 사용을 잊지 않으셨습니까?"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "truncating .rej 파일 이름을 '%.*s.rej'(으)로 자름"
+msgid "Could not parse object '%s'."
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다."
 
-#: builtin/apply.c:4432
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "%s을(를) 열 수 없습니다: %s"
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "인덱스 지우기에 실패했습니다"
 
-#: builtin/apply.c:4445
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "패치 부위 #%d 깔끔하게 적용."
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"마지막 'am' 실패 이후 HEAD를 옮긴 것 같습니다.\n"
+"ORIG_HEAD로 되돌리지 않습니다."
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2200
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "패치 부위 #%d 거부됨."
+msgid "Invalid value for --patch-format: %s"
+msgstr "--patch-format 옵션에 대해 잘못된 값: %s"
 
-#: builtin/apply.c:4537
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr "패치 '%s' 건너뜀."
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<옵션>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "인식할 수 없는 입력"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<옵션>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "인덱스 파일을 읽을 수 없습니다"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "대화형으로 실행합니다"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "ì \80ì\9e¥ì\86\8c ë°\96ì\97\90ì\84\9c --3way ì\98µì\85\98 ì\82¬ì\9a©"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "ì\95\84무 ë\8f\99ì\9e\91ë\8f\84 í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤ (과거ë¶\80í\84° ì\9e\88ì\97\88ë\8d\98 ì\98µì\85\98)"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "저장소 밖에서 --index 옵션 사용"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "필요하면 3-방향 병합으로 대신하도록 허용합니다"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "저장소 밖에서 --cached 옵션 사용"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "간략히 표시합니다"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "'%s' 패치를 열 수 없습니다"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "커밋 메시지에 Signed-off-by 줄을 남깁니다"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "공백 오류 %d개를 넘어갑니다"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "UTF-8 인코딩으로 변환합니다 (기본값)"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d줄에서 공백 오류를 추가합니다."
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "git-mailinfo에 -k 옵션을 씁니다"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "주어진 경로에 해당하는 변경 사항을 적용하지 않습니다"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "git-mailinfo에 -b 옵션을 씁니다"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "주어진 경로에 해당하는 변경 사항을 적용합니다"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "git-mailinfo에 -m 옵션을 씁니다"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "전통적인 diff 경로 앞의 <개수>개의 앞 슬래시(/)를 제거합니다"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "mbox 형식에 대해 git-mailsplit에 --keep-cr 옵션을 사용합니다"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "패치에서 추가하는 파일을 무시합니다"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"am.keepcr에 무관하게 git-mailsplit에 --keep-cr 옵션을 사용하지 않습니다."
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "패치를 적용하는 대신, 입력에 대한 diffstat을 출력합니다"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "절취선 앞의 모든 사항을 무시합니다"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "십진수로 추가 및 삭제한 줄 수를 표시합니다"
+#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
+#: builtin/am.c:2278 builtin/am.c:2281 builtin/am.c:2284 builtin/am.c:2287
+#: builtin/am.c:2293
+msgid "pass it through git-apply"
+msgstr "git-apply에 넘깁니다"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "패치를 적용하는 대신, 입력에 대한 요약을 출력합니다"
+#: builtin/am.c:2283 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1038 builtin/merge.c:202 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:644 builtin/show-ref.c:169 builtin/tag.c:355
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "패치를 적용하는 대신, 패치를 적용 가능한지 확인합니다"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:387 builtin/verify-tag.c:38
+msgid "format"
+msgstr "형식"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "í\98\84ì\9e¬ ì\9d¸ë\8d±ì\8a¤ì\97\90ì\84\9c í\8c¨ì¹\98ê°\80 ì \81ì\9a© ê°\80ë\8a¥í\95\9cì§\80 í\99\95ì\9d¸í\95©ë\8b\88ë\8b¤"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "í\8c¨ì¹\98ì\9d\98 í\98\95ì\8b\9d"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "작업 폴더를 바꾸지 않고 패치를 적용합니다"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "패치 실패가 발생했을 때 오류 메시지 대신 사용합니다"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "ì\9e\91ì\97\85 ì\98\81ì\97­ ë°\96ì\9d\98 í\8c\8cì\9d¼ì\9d\84 ë°\94꾸ë\8a\94 í\8c¨ì¹\98를 í\97\88ì\9a©합니다"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "충ë\8f\8cì\9d\84 í\95´ê²°í\95\9c ë\8b¤ì\9d\8c í\8c¨ì¹\98 ì \81ì\9a©ì\9d\84 ê³\84ì\86\8d합니다"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "그리고 패치도 적용합니다 (--stat/--summary/--check 옵션과 같이 사용)"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "--continue 옵션과 동일"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "í\8c¨ì¹\98를 ì \81ì\9a©í\95\98ì§\80 ì\95\8aì\9c¼ë©´ 3-ë°©í\96¥ ë³\91í\95©ì\9d\84 ì\8b\9cë\8f\84í\95©ë\8b\88ë\8b¤"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "í\98\84ì\9e¬ í\8c¨ì¹\98 ê±´ë\84\88ë\9b°ê¸°"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr "내장 인덱스 정보를 사용해 임시 인덱스를 만듭니다"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "원래 브랜치를 복구하고 패치 적용 작업을 중지합니다."
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "경로를 NUL 문자로 구분합니다"
+# NOTE: 옵션의 의미는 이게 맞다. 원문에서는 사용자가
+# --committer-date-is-author-date라는 옵션을 보고 의미를 알 수 있다고 가정하고 있다.
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "커미터 시각을 작성자 시각으로 넣습니다"
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "최소한 <n>줄이 컨텍스트와 일치하는지 확인합니다"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "현재 시각을 작성자 시각으로 사용합니다"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "공백 오류가 있는 추가됐거나 수정된 줄을 찾습니다"
+#: builtin/am.c:2315 builtin/commit.c:1600 builtin/merge.c:233
+#: builtin/pull.c:165 builtin/revert.c:92 builtin/tag.c:370
+msgid "key-id"
+msgstr "키-ID"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "컨텍스트를 찾을 때 공백 변경 사항을 무시합니다"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "GPG 서명 커밋"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "패치를 반대 순서로 적용합니다"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(git-rebase를 위한 내부 용도)"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "최소한의 컨텍스트 한 줄도 없이 적용합니다"
+#: builtin/am.c:2334
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"-b/--binary 옵션은 오랜 시간 동안 아무 동작도 하지 않았으므로, 이\n"
+"옵션은 제거될 예정입니다. 이제 사용하지 마십시오."
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "거부된 패치 부분을 대응되는 *.rej 파일에 남겨둡니다"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "인덱스 읽기에 실패했습니다"
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "패치 부분이 겹쳐도 허용합니다"
+#: builtin/am.c:2356
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "이전 리베이스 디렉터리 %s이(가) 아직 있고 mbox를 지정했습니다."
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "파일 끝에 줄바꿈이 빠졌음을 잘못 검색한 경우에 무시합니다"
+#: builtin/am.c:2380
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"벗어난 %s 디렉터리가 발견되었습니다.\n"
+"제거하려면 \"git am --abort\"를 사용하십시오."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "í\8c¨ì¹\98 ë¶\80ë¶\84ì\9d\98 í\97¤ë\8d\94ì\9d\98 ì¤\84 ì\88\98를 ì\8b ì\9a©í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤"
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "í\95´ì\86\8c ì\9e\91ì\97\85ì\9d´ ì§\84í\96\89 ì¤\91ì\9e\85ë\8b\88ë\8b¤. ë\8b¤ì\8b\9c ì\8b\9cì\9e\91í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "모든 파일 이름에 <최상위>를 앞에 붙입니다"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<옵션>] [<패치>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4080,116 +4853,161 @@ msgstr "git blame [<옵션>] [<리비전-옵션>] [<리비전>] [--] <파일>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<리비전-옵션>은 git-rev-list(1)에 설명되어 있습니다"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1786
 msgid "Blaming lines"
 msgstr "블레임 줄"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2582
 msgid "Show blame entries as we find them, incrementally"
 msgstr "블레임 항목을 찾자마자 점진적으로 표시합니다"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2583
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "가장자리 커밋에 대해 빈 SHA-1을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2584
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "최상위 커밋을 가장자리 커밋으로 취급하지 않습니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2585
 msgid "Show work cost statistics"
 msgstr "작업 비용 통계를 표시합니다"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2586
 msgid "Force progress reporting"
 msgstr "강제로 진행 상황을 표시합니다"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2587
 msgid "Show output score for blame entries"
 msgstr "블레임 항목에 대해 출력 점수를 표시합니다"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2588
 msgid "Show original filename (Default: auto)"
 msgstr "원래 파일 이름 표시 (기본값: 자동)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2589
 msgid "Show original linenumber (Default: off)"
 msgstr "원래 줄 번호 표시 (기본값: 하지 않음)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2590
 msgid "Show in a format designed for machine consumption"
 msgstr "컴퓨터 처리용으로 설계된 형식으로 표시합니다"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2591
 msgid "Show porcelain format with per-line commit information"
 msgstr "줄마다 커밋 정보가 표시되는 사용자용 형식으로 표시합니다"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2592
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "git-annotate와 동일한 형식을 사용합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2593
 msgid "Show raw timestamp (Default: off)"
 msgstr "내부 형식으로 시각을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2594
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "길게 커밋 SHA1을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2595
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "작성자 이름과 시각을 표시하지 않습니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2596
 msgid "Show author email instead of name (Default: off)"
 msgstr "작성자 이름 대신에 전자메일을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2597
 msgid "Ignore whitespace differences"
 msgstr "공백 문자 차이점을 무시합니다"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2604
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "diff를 향상하는데 실험적인 휴리스틱을 사용합니다"
+
+#: builtin/blame.c:2606
 msgid "Spend extra cycles to find better match"
 msgstr "더 일치하는 항목을 찾는데 더 시간을 소모합니다"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2607
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "git-rev-list를 호출하는 대신 <파일>에서 리비전을 사용합니다"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2608
 msgid "Use <file>'s contents as the final image"
 msgstr "<파일>의 내용을 최종 이미지로 사용합니다"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2609 builtin/blame.c:2610
 msgid "score"
 msgstr "점수"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2609
 msgid "Find line copies within and across files"
 msgstr "파일 내부와 파일 사이의 복사된 줄을 찾습니다"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2610
 msgid "Find line movements within and across files"
 msgstr "파일 내부와 파일 사이의 옮겨진 줄을 찾습니다"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2611
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2611
 msgid "Process only line range n,m, counting from 1"
 msgstr "n,m줄 (1번 줄부터 시작) 사이의 범위만 처리"
 
+#: builtin/blame.c:2658
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"--progress 옵션은 --incremental 옵션이나 포스레인 형식에서 사용할 수 없습니다"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2706
 msgid "4 years, 11 months ago"
 msgstr "4년 11달 전"
 
+#: builtin/blame.c:2786
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents 및 --reverse 옵션은 호환되지 않습니다."
+
+#: builtin/blame.c:2806
+msgid "cannot use --contents with final commit object name"
+msgstr "--contents 옵션을 마지막 오브젝트 이름에 사용할 수 없습니다"
+
+#: builtin/blame.c:2811
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse 및 --first-parent 옵션을 같이 쓰면 최근 커밋을 지정해야 합니다"
+
+#: builtin/blame.c:2838
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse 및 --first-parent 옵션을 같이 쓰면 최초-상위 체인과 범위가 필요합니"
+"다"
+
+#: builtin/blame.c:2849
+#, c-format
+msgid "no such path %s in %s"
+msgstr "%s 경로가 %s 안에 없습니다"
+
+#: builtin/blame.c:2860
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "%s 경로에 대해 %s 블롭을 읽을 수 없음"
+
+#: builtin/blame.c:2879
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "%s 파일에는 줄이 %lu개 뿐입니다"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<옵션>] [-r | -a] [--merged | --no-merged]"
@@ -4361,44 +5179,44 @@ msgstr "(HEAD %s(으)로부터 분리됨)"
 msgid "(no branch)"
 msgstr "(브랜치 없음)"
 
-#: builtin/branch.c:544
+#: builtin/branch.c:535
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "%s 브랜치를 %s 위치에 리베이스합니다"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:539
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "%s 브랜치를 %s 위치에서 bisect합니다"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:554
 msgid "cannot rename the current branch while not on any."
 msgstr "브랜치 위에 없으면서 현재 브랜치 이름을 바꿀 수 없습니다."
 
-#: builtin/branch.c:573
+#: builtin/branch.c:564
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "잘못된 브랜치 이름: '%s'"
 
-#: builtin/branch.c:590
+#: builtin/branch.c:581
 msgid "Branch rename failed"
 msgstr "브랜치 이름 바꾸기 실패"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:585
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "이름이 잘못된 '%s' 브랜치의 이름을 다르게 바꿉니다"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:588
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "브랜치 이름을 %s(으)로 바꾸지만, HEAD를 업데이트하지 않습니다!"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:595
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "브랜치의 이름을 바꾸지만, config-file 업데이트가 실패했습니다"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:611
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4409,160 +5227,168 @@ msgstr ""
 "  %s\n"
 "'%c' 문자로 시작하는 줄은 무시됩니다.\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:643
 msgid "Generic options"
 msgstr "일반 옵션"
 
 # FIXME: give twice?
-#: builtin/branch.c:653
+#: builtin/branch.c:645
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "해시와 제목을 표시하고, 업스트림 브랜치에 대한 위치를 표시합니다"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:646
 msgid "suppress informational messages"
 msgstr "여러가지 안내 메시지를 표시하지 않습니다"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:647
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "추적 모드를 설정합니다 (git-pull(1) 참고)"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:649
 msgid "change upstream info"
 msgstr "업스트림 정보를 바꿉니다"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:651
 msgid "upstream"
 msgstr "업스트림"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:651
 msgid "change the upstream info"
 msgstr "업스트림 정보를 바꿉니다"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:652
+msgid "Unset the upstream info"
+msgstr "업스트림 정보를 해제합니다"
+
+#: builtin/branch.c:653
 msgid "use colored output"
 msgstr "여러 색으로 출력합니다"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:654
 msgid "act on remote-tracking branches"
 msgstr "리모트 추적 브랜치에 대해 동작합니다"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:656 builtin/branch.c:657
 msgid "print only branches that contain the commit"
 msgstr "커밋이 있는 브랜치만 표시합니다"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:660
 msgid "Specific git-branch actions:"
 msgstr "특정 git-branch 동작:"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:661
 msgid "list both remote-tracking and local branches"
 msgstr "리모트와 로컬의 브랜치 목록을 모두 표시합니다"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:663
 msgid "delete fully merged branch"
 msgstr "완전히 병합된 브랜치를 삭제합니다"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:664
 msgid "delete branch (even if not merged)"
 msgstr "브랜치를 삭제합니다 (병합되지 않았더라도)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:665
 msgid "move/rename a branch and its reflog"
 msgstr "브랜치와 그 reflog를 옮기거나 이름을 바꿉니다"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:666
 msgid "move/rename a branch, even if target exists"
 msgstr "대상이 이미 있더라도 브랜치를 옮기거나 이름을 바꿉니다"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:667
 msgid "list branch names"
 msgstr "브랜치 이름 목록을 표시합니다"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:668
 msgid "create the branch's reflog"
 msgstr "브랜치의 reflog를 만듭니다"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:670
 msgid "edit the description for the branch"
 msgstr "브랜치의 설명을 편집합니다"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:671
 msgid "force creation, move/rename, deletion"
 msgstr "강제로 만들고, 옮기거나 이름을 바꾸고, 삭제합니다"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:672
 msgid "print only branches that are merged"
 msgstr "병합되는 브랜치만 표시합니다"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:673
 msgid "print only branches that are not merged"
 msgstr "병합되지 않는 브랜치만 표시합니다"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:674
 msgid "list branches in columns"
 msgstr "목록을 여러 열로 표시합니다"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:675 builtin/for-each-ref.c:38 builtin/tag.c:381
 msgid "key"
 msgstr "키"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:676 builtin/for-each-ref.c:39 builtin/tag.c:382
 msgid "field name to sort on"
 msgstr "정렬한 기준이 되는 필드 이름"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:678 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:384
 msgid "object"
 msgstr "오브젝트"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:679
 msgid "print only branches of the object"
 msgstr "해당 오브젝트의 브랜치만 표시합니다"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:681 builtin/for-each-ref.c:46 builtin/tag.c:388
+msgid "sorting and filtering are case insensitive"
+msgstr "정렬과 필터링은 대소문자를 구분하지 않습니다"
+
+#: builtin/branch.c:698
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "HEAD를 올바른 레퍼런스로 구해내는데 실패했습니다."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:702 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "레퍼런스/헤드 아래에 HEAD가 없습니다!"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:724
 msgid "--column and --verbose are incompatible"
 msgstr "--column 및 --verbose 옵션은 호환되지 않습니다"
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:735 builtin/branch.c:787
 msgid "branch name required"
 msgstr "브랜치 이름이 필요합니다"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:763
 msgid "Cannot give description to detached HEAD"
 msgstr "분리된 HEAD에 대한 설명을 부여할 수 없습니다"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:768
 msgid "cannot edit description of more than one branch"
 msgstr "여러 브랜치에 대한 설명을 편집할 수 없습니다"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:775
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "아직 '%s' 브랜치에 커밋이 없습니다."
 
-#: builtin/branch.c:773
+#: builtin/branch.c:778
 #, c-format
 msgid "No branch named '%s'."
 msgstr "이름이 '%s'인 브랜치가 없습니다."
 
-#: builtin/branch.c:788
+#: builtin/branch.c:793
 msgid "too many branches for a rename operation"
 msgstr "이름 바꾸기 작업에 대해 브랜치가 너무 많습니다"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:798
 msgid "too many branches to set new upstream"
 msgstr "새 업스트림을 설정하는데 브랜치가 너무 많습니다"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:802
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -4570,41 +5396,41 @@ msgstr ""
 "HEAD의 업스트림을 %s(으)로 설정할 수 없습니다. 어떤 브랜치도 가리키지 않습니"
 "다."
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:805 builtin/branch.c:827 builtin/branch.c:848
 #, c-format
 msgid "no such branch '%s'"
 msgstr "그런 브랜치가 ('%s') 없습니다"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:809
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "'%s' 브랜치가 없습니다"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:821
 msgid "too many branches to unset upstream"
 msgstr "업스트림 설정을 해제하는데 브랜치가 너무 많습니다"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:825
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "HEAD의 업스트림 설정을 해제할 수 없습니다. 어떤 브랜치도 가리키지 않습니다."
 
-#: builtin/branch.c:826
+#: builtin/branch.c:831
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "'%s' 브랜치에 업스트림 정보가 없습니다"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:845
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "'HEAD'를 수동으로 만드는 건 앞뒤가 맞지 않습니다"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:851
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "'git branch'에 대해 -a 및 -r 옵션은 브랜치 이름과 같이 쓰면 앞뒤가 맞지 않습"
 "니다"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:854
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4613,7 +5439,7 @@ msgstr ""
 "--set-upstream 옵션은 더 이상 사용되지 않고 제거될 예정입니다. --track 또는 "
 "--set-upstream-to 옵션을 사용해 보십시오\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:871
 #, c-format
 msgid ""
 "\n"
@@ -4636,64 +5462,80 @@ msgstr "번들을 만드려면 저장소가 필요합니다."
 msgid "Need a repository to unbundle."
 msgstr "번들을 해제하려면 저장소가 필요합니다."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<종류"
-">|--textconv) <오브젝트>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <종류> | --textconv | --filters) [--path=<경로>] <오브젝트>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<종류>는 다음 중 하나가 될 수 있습니다: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "오브젝트 종류를 봅니다"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "오브젝트 크기를 봅니다"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "오류가 없을 때 0을 리턴하고 끝냅니다"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "오브젝트의 내용을 예쁘게 표시합니다"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "블롭 오브젝트에 대해서는, 오브젝트의 내용에 대해 textconv를 실행합니다"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "블롭 오브젝트에 대해서는, 오브젝트의 내용에 대해 필터를 실행합니다"
+
+#: builtin/cat-file.c:561 git-submodule.sh:929
+msgid "blob"
+msgstr "블롭"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "--textconv/--filters 옵션에 경로를 지정합니다"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "-s 및 -t 옵션이 손상된 오브젝트에 대해 동작하도록 허용합니다"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "--batch 출력에 대해 버퍼링합니다"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr "표준 입력에서 입력된 오브젝트의 정보와 내용을 표시합니다"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "표준 입력에서 입력된 오브젝트의 정보를 표시합니다"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "트리 내부의 심볼릭 링크를 따라갑니다 (--batch 또는 --batch-check와 같이 사용)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "--batch 또는 --batch-check에서 모든 오브젝트를 표시합니다"
 
@@ -4713,7 +5555,7 @@ msgstr "파일에 설정된 모든 속성을 표시합니다"
 msgid "use .gitattributes only from the index"
 msgstr "인덱스에서만 .gitattributes를 사용합니다"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "표준 입력에서 파일 이름을 읽습니다"
 
@@ -4721,7 +5563,7 @@ msgstr "표준 입력에서 파일 이름을 읽습니다"
 msgid "terminate input and output records by a NUL character"
 msgstr "NUL 문자를 기준으로 자료 입력 및 출력을 멈춥니다"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1140 builtin/gc.c:332
 msgid "suppress progress reporting"
 msgstr "진행 상황 표시를 하지 않습니다"
 
@@ -4811,9 +5653,9 @@ msgid "write the content to temporary files"
 msgstr "내용을 임시 파일에 씁니다"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:597 builtin/submodule--helper.c:600
+#: builtin/submodule--helper.c:606 builtin/submodule--helper.c:967
+#: builtin/worktree.c:471
 msgid "string"
 msgstr "문자열"
 
@@ -4884,7 +5726,7 @@ msgstr "경로를 업데이트하고 '%s' 브랜치로 전환하는 일은 동
 msgid "path '%s' is unmerged"
 msgstr "'%s' 경로를 병합하지 않았습니다"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "현재 인덱스를 먼저 해결해야 합니다"
 
@@ -4893,45 +5735,45 @@ msgstr "현재 인덱스를 먼저 해결해야 합니다"
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "'%s'에 대해 reflog할 수 없습니다: %s\n"
 
-#: builtin/checkout.c:663
+#: builtin/checkout.c:666
 msgid "HEAD is now at"
 msgstr "HEAD의 현재 위치는"
 
-#: builtin/checkout.c:667 builtin/clone.c:661
+#: builtin/checkout.c:670 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "HEAD를 업데이트할 수 없습니다"
 
-#: builtin/checkout.c:671
+#: builtin/checkout.c:674
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "'%s' 브랜치 리셋\n"
 
-#: builtin/checkout.c:674
+#: builtin/checkout.c:677
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "이미 '%s'에 있습니다\n"
 
-#: builtin/checkout.c:678
+#: builtin/checkout.c:681
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "'%s' 브랜치로 전환하고 리셋합니다\n"
 
-#: builtin/checkout.c:680 builtin/checkout.c:1069
+#: builtin/checkout.c:683 builtin/checkout.c:1072
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "새로 만든 '%s' 브랜치로 전환합니다\n"
 
-#: builtin/checkout.c:682
+#: builtin/checkout.c:685
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "'%s' 브랜치로 전환합니다\n"
 
-#: builtin/checkout.c:733
+#: builtin/checkout.c:736
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... 그리고 %d개 더.\n"
 
-#: builtin/checkout.c:739
+#: builtin/checkout.c:742
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4949,7 +5791,7 @@ msgstr[0] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:758
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4970,151 +5812,151 @@ msgstr[0] ""
 " git branch <새-브랜치-이름> %s\n"
 "\n"
 
-#: builtin/checkout.c:794
+#: builtin/checkout.c:797
 msgid "internal error in revision walk"
 msgstr "리비전 walk에 내부 오류"
 
-#: builtin/checkout.c:798
+#: builtin/checkout.c:801
 msgid "Previous HEAD position was"
 msgstr "이전 HEAD 위치는"
 
-#: builtin/checkout.c:825 builtin/checkout.c:1064
+#: builtin/checkout.c:828 builtin/checkout.c:1067
 msgid "You are on a branch yet to be born"
 msgstr "현재 위치가 만들 예정인 브랜치에 있습니다"
 
-#: builtin/checkout.c:970
+#: builtin/checkout.c:973
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "하나의 레퍼런스만 지정해야 하지만 %d개를 지정했습니다."
 
-#: builtin/checkout.c:1010 builtin/worktree.c:214
+#: builtin/checkout.c:1013 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "잘못된 레퍼런스: %s"
 
-#: builtin/checkout.c:1039
+#: builtin/checkout.c:1042
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "레퍼런스가 트리가 아닙니다: %s"
 
-#: builtin/checkout.c:1078
+#: builtin/checkout.c:1081
 msgid "paths cannot be used with switching branches"
 msgstr "브랜치를 전환하는데 경로를 사용할 수 없습니다"
 
-#: builtin/checkout.c:1081 builtin/checkout.c:1085
+#: builtin/checkout.c:1084 builtin/checkout.c:1088
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' 옵션은 브랜치를 전환할 때 쓸 수 없습니다"
 
-#: builtin/checkout.c:1089 builtin/checkout.c:1092 builtin/checkout.c:1097
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1092 builtin/checkout.c:1095 builtin/checkout.c:1100
+#: builtin/checkout.c:1103
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' 옵션은 '%s' 옵션과 같이 쓸 수 없습니다"
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1108
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "브랜치를 커밋이 아닌 '%s'(으)로 전환할 수 없습니다"
 
-#: builtin/checkout.c:1138 builtin/checkout.c:1140 builtin/clone.c:88
+#: builtin/checkout.c:1141 builtin/checkout.c:1143 builtin/clone.c:93
 #: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
 #: builtin/worktree.c:326
 msgid "branch"
 msgstr "브랜치"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1142
 msgid "create and checkout a new branch"
 msgstr "새 브랜치를 만들고 가져옵니다"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1144
 msgid "create/reset and checkout a branch"
 msgstr "브랜치를 만들거나 리셋하고 가져옵니다"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1145
 msgid "create reflog for new branch"
 msgstr "새 브랜치에 대한 reflog를 만듭니다"
 
-#: builtin/checkout.c:1143 builtin/worktree.c:328
+#: builtin/checkout.c:1146 builtin/worktree.c:328
 msgid "detach HEAD at named commit"
 msgstr "HEAD를 해당 커밋에서 분리합니다"
 
-#: builtin/checkout.c:1144
+#: builtin/checkout.c:1147
 msgid "set upstream info for new branch"
 msgstr "새 브랜치에 대한 업스트림 정보를 설정합니다"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1149
 msgid "new-branch"
 msgstr "새-브랜치"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1149
 msgid "new unparented branch"
 msgstr "상위 브랜치가 없는 새 브랜치"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1150
 msgid "checkout our version for unmerged files"
 msgstr "병합되지 않은 파일에 대해 우리쪽 버전을 가져옵니다"
 
-#: builtin/checkout.c:1149
+#: builtin/checkout.c:1152
 msgid "checkout their version for unmerged files"
 msgstr "병합되지 않은 파일에 대해 상대편 버전을 가져옵니다"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1154
 msgid "force checkout (throw away local modifications)"
 msgstr "강제로 체크아웃합니다 (로컬에서 수정한 사항을 버립니다)"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1155
 msgid "perform a 3-way merge with the new branch"
 msgstr "새 브랜치에 대해 3-방향 병합을 수행합니다"
 
-#: builtin/checkout.c:1153 builtin/merge.c:231
+#: builtin/checkout.c:1156 builtin/merge.c:235
 msgid "update ignored files (default)"
 msgstr "무시하는 파일을 업데이트합니다 (기본값)"
 
-#: builtin/checkout.c:1154 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1157 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "스타일"
 
-#: builtin/checkout.c:1155
+#: builtin/checkout.c:1158
 msgid "conflict style (merge or diff3)"
 msgstr "충돌 스타일 (merge 또는 diff3)"
 
 # FIXME: 의미 불명
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1161
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "경로명세를 드문 항목에만 제한하지 않습니다"
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1163
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "'git checkout <없는-브랜치>'에 대해 추측합니다"
 
-#: builtin/checkout.c:1162
+#: builtin/checkout.c:1165
 msgid "do not check if another worktree is holding the given ref"
 msgstr "다른 작업폴더에 주어진 레퍼런스가 있는지 확인하지 않습니다"
 
-#: builtin/checkout.c:1163 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
+#: builtin/checkout.c:1166 builtin/clone.c:63 builtin/fetch.c:119
+#: builtin/merge.c:232 builtin/pull.c:117 builtin/push.c:539
 #: builtin/send-pack.c:168
 msgid "force progress reporting"
 msgstr "강제로 진행 상황을 표시합니다"
 
-#: builtin/checkout.c:1194
+#: builtin/checkout.c:1197
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B 및 --orphan 옵션은 서로 호환되지 않습니다"
 
-#: builtin/checkout.c:1211
+#: builtin/checkout.c:1214
 msgid "--track needs a branch name"
 msgstr "--track 옵션은 브랜치 이름이 필요합니다"
 
-#: builtin/checkout.c:1216
+#: builtin/checkout.c:1219
 msgid "Missing branch name; try -b"
 msgstr "브랜치 이름이 없습니다. -b 옵션을 사용해 보십시오"
 
-#: builtin/checkout.c:1252
+#: builtin/checkout.c:1255
 msgid "invalid path specification"
 msgstr "경로 명세가 잘못되었습니다"
 
-#: builtin/checkout.c:1259
+#: builtin/checkout.c:1262
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5123,12 +5965,12 @@ msgstr ""
 "동시에 경로를 업데이트하고 '%s' 브랜치로 전환할 수 없습니다.\n"
 "커밋을 확인할 수 없는 '%s'을(를) 가져오려고 하셨습니까?"
 
-#: builtin/checkout.c:1264
+#: builtin/checkout.c:1267
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach 옵션은 경로 인자를 받지 않습니다 '%s'"
 
-#: builtin/checkout.c:1268
+#: builtin/checkout.c:1271
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5167,19 +6009,21 @@ msgstr "%s 저장소 건너뛸 예정\n"
 msgid "failed to remove %s"
 msgstr "%s 제거에 실패했습니다"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:291 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
 "프롬프트 도움말:\n"
 "1          - 해당 번호의 항목을 선택\n"
 "foo        - 유일한 접두어에 해당하는 항목 선택\n"
-"           - (빈 입력) 선택하지 않음"
+"           - (빈 입력) 선택하지 않음\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:295 git-add--interactive.perl:632
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5188,7 +6032,7 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
 "프롬프트 도움말:\n"
 "1          - 해당 번호의 항목을 선택\n"
@@ -5197,12 +6041,13 @@ msgstr ""
 "foo        - 유일한 접두어에 해당하는 항목 선택\n"
 "-...       - 해당 항목 선택 해제\n"
 "*          - 모든 항목 선택\n"
-"           - (빈 입력) 선택 마침"
+"           - (빈 입력) 선택 마침\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "어라라 (%s)?"
+#: builtin/clean.c:511 git-add--interactive.perl:598
+#: git-add--interactive.perl:603
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "어라라 (%s)?\n"
 
 #: builtin/clean.c:653
 #, c-format
@@ -5224,9 +6069,10 @@ msgstr "삭제할 항목을 선택하십시오"
 msgid "Remove %s [y/N]? "
 msgstr "%s 제거합니까 [y/N]? "
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "끝."
+#: builtin/clean.c:777 git-add--interactive.perl:1669
+#, c-format
+msgid "Bye.\n"
+msgstr "끝.\n"
 
 #: builtin/clean.c:785
 msgid ""
@@ -5246,11 +6092,11 @@ msgstr ""
 "help                - 이 화면 표시\n"
 "?                   - 프롬프트 선택 도움말"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:812 git-add--interactive.perl:1745
 msgid "*** Commands ***"
 msgstr "*** 명령 ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:813 git-add--interactive.perl:1742
 msgid "What now"
 msgstr "무엇을 할까요"
 
@@ -5279,8 +6125,8 @@ msgstr "대화형 지우기"
 msgid "remove whole directories"
 msgstr "전체 디렉터리 제거"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:1056
+#: builtin/ls-files.c:538 builtin/name-rev.c:313 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "패턴"
 
@@ -5320,112 +6166,129 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<옵션>] [--] <저장소> [<디렉터리>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "체크아웃을 만들지 않습니다"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "간략한 저장소를 만듭니다"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "미러 저장소를 만듭니다 (간략한 저장소로 취급)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "로컬 저장소에서 복제합니다"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "로컬 하드링크를 사용하지 않고, 항상 복사합니다"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "공유 저장소로 설정합니다"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "복제한 결과물에서 하위 모듈을 초기화합니다"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:82
 msgid "number of submodules cloned in parallel"
 msgstr "병렬적으로 복제하는 하위모듈 개수"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "서식-디렉터리"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "서식을 사용할 디렉터리 위치"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:604
+#: builtin/submodule--helper.c:970
 msgid "reference repository"
 msgstr "레퍼런스 저장소"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "복제할 경우에만 --reference를 사용합니다"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "이름"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "업스트림 추적에 'origin' 대신 <이름>을 사용합니다"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "리모트의 HEAD 대신 <브랜치>를 가져옵니다"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "리모트의 git-upload-pack 경로"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:999 builtin/pull.c:202
 msgid "depth"
 msgstr "깊이"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "지정한 깊이의 얕은 복제를 만듭니다"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2836
+#: parse-options.h:142
+msgid "time"
+msgstr "시각"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "지정한 시간 이후의 얕은 복제를 만듭니다"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "리비전"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr "리비전을 제외해 얕은 복제의 커밋 내역을 깊게 만듭니다"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "하나의 브랜치만 복제합니다 (HEAD 또는 --branch로 지정)"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:106
 msgid "any cloned submodules will be shallow"
 msgstr "모든 복제한 하위 모듈은 얕은 모듈입니다"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "깃 디렉터리를 작업 폴더와 별개의 위치에 놓습니다"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "키=값"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "새 저장소 안에서 설정합니다"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:111 builtin/fetch.c:140 builtin/push.c:550
 msgid "use IPv4 addresses only"
 msgstr "IPv4 주소만 사용합니다"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:552
 msgid "use IPv6 addresses only"
 msgstr "IPv6 주소만 사용합니다"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5433,58 +6296,42 @@ msgstr ""
 "디렉터리 이름을 알아낼 수 없습니다.\n"
 "명령행에서 디렉터리를 지정하십시오"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"레퍼런스 '%s' 저장소를 연결된 체크아웃으로 쓰기는 아직 지원하지 않습니다."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "레퍼런스 '%s' 저장소가 로컬 저장소가 아닙니다."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "레퍼런스 '%s' 저장소가 얕은 저장소입니다"
-
-#: builtin/clone.c:317
+#: builtin/clone.c:303
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "레퍼런스 '%s' 저장소가 붙어 있는 저장소입니다"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "정보: '%s'에 대한 보조 파일을 추가할 수 없습니다: %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:375
 #, c-format
 msgid "failed to open '%s'"
 msgstr "'%s'을(를) 여는데 실패"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "'%s'이(가) 있지만 디렉터리가 아닙니다"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "'%s'에 대해 stat()이 실패했습니다\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "'%s' 링크를 만드는데 실패했습니다"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "파일을 '%s'(으)로 복사하는데 실패했습니다"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "완료.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5494,122 +6341,143 @@ msgstr ""
 "'git status' 명령으로 무엇을 체크아웃했는지 살펴볼 수 있고\n"
 "'git checkout -f HEAD'로 체크아웃을 다시 할 수 있습니다\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "복제할 리모트의 %s 브랜치를 찾을 수 없습니다."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "리모트에서 필요한 오브젝트를 모두 보내지 않았습니다"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "%s을(를) 업데이트할 수 없습니다"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "리모트 HEAD가 없는 레퍼런스를 참고하므로, 체크아웃할 수 없습니다.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "작업 폴더를 체크아웃할 수 없습니다"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "파라미터를 설정 파일에 쓸 수 없습니다"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "정리용으로 repack할 수 없습니다"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "보조 임시 파일을 삭제할 수 없습니다"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1857
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "너무 인자가 많습니다."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "복제할 저장소를 지정해야 합니다."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare 및 --origin %s 옵션은 호환되지 않습니다."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare 및 --separate-git-dir 옵션은 호환되지 않습니다."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "'%s' 저장소가 없습니다"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:905 builtin/fetch.c:1335
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "깊이가(%s) 0보다 큰 수가 아닙니다"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "대상 경로가('%s') 이미 있고 빈 디렉터리가 아닙니다."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "작업 폴더가('%s') 이미 있습니다."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/difftool.c:252
+#: builtin/submodule--helper.c:659 builtin/worktree.c:222
+#: builtin/worktree.c:249
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "'%s'의 앞 디렉터리를 만들 수 없습니다"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "작업 디렉터리를('%s') 만들 수 없습니다"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "간략한 저장소로('%s') 복제합니다...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "'%s'에 복제합니다...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:963
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"clone --recursive 옵션은 --reference 및 --reference-if-able 옵션을 같이 쓰는 "
+"것과 호환되지 않습니다"
+
+#: builtin/clone.c:1019
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "--depth 옵션은 로컬 복제에서 무시됩니다. 대신에 'file://'을 사용하십시오."
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-since 옵션은 로컬 복제에서 무시됩니다. 대신에 'file://'을 사용하십"
+"시오."
+
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude 옵션은 로컬 복제에서 무시됩니다. 대신에 'file://'을 사용하"
+"십시오."
+
+#: builtin/clone.c:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr "원본 저장소가 얕은 저장소이므로, --local 옵션을 무시합니다"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local 옵션은 무시됩니다"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "%s의 복제 방법을 알지 못합니다"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "리모트의 %s 브랜치가 업스트림 %s에 없습니다"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "빈 저장소를 복제한 것처럼 보입니다."
 
@@ -5749,66 +6617,66 @@ msgstr ""
 "그 다음에 \"git cherry-pick --continue\"를 하면 나머지 커밋에\n"
 "대해 커밋 빼오기를 다시 시작합니다.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "HEAD 트리 오브젝트의 묶음을 푸는데 실패했습니다"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "임시 인덱스를 만들 수 없습니다"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "대화형 추가가 실패했습니다"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "임시 인덱스를 업데이트할 수 없습니다"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "주요 캐시 트리를 업데이트하는데 실패했습니다"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "new_index 파일에 쓸 수 없습니다"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "병합하는 중 부분 커밋을 할 수 없습니다."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "커밋 빼오기를 하는 중 부분 커밋을 할 수 없습니다."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "인덱스를 읽을 수 없습니다"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "임시 인덱스 파일을 쓸 수 없습니다"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "'%s' 커밋에 작성자 헤더가 없습니다"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "'%s' 커밋의 작성자 헤더 형식이 잘못되었습니다"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "--author 파라미터 형식이 잘못되었습니다"
 
-#: builtin/commit.c:612
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "시각 형식이 잘못되었습니다: %s"
 
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5816,38 +6684,38 @@ msgstr ""
 "현재 커밋 메시지에서 사용되지 않는 주석 문자를\n"
 "선택할 수 없습니다"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "%s 커밋을 찾아볼 수 없습니다"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:295
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(표준 입력에서 로그 메시지를 읽음)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "표준 입력에서 로그 메시지를 읽을 수 없습니다"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "'%s' 로그 파일을 읽을 수 없습니다"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "SQUASH_MSG를 읽을 수 없습니다"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "MERGE_MSG를 읽을 수 없습니다"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "커밋 서식을 쓸 수 없습니다"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5862,7 +6730,7 @@ msgstr ""
 "\t%s\n"
 "다시 시도하십시오.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5877,7 +6745,7 @@ msgstr ""
 "\t%s\n"
 "다시 시도하십시오.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5886,7 +6754,7 @@ msgstr ""
 "변경 사항에 대한 커밋 메시지를 입력하십시오. '%c' 문자로 시작하는\n"
 "줄은 무시되고, 메시지를 입력하지 않으면 커밋이 중지됩니다.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5897,149 +6765,149 @@ msgstr ""
 "줄은 보존되니, 필요하면 직접 제거하십시오. 메시지를 입력하지\n"
 "않으면 커밋이 중지됩니다.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%s작성자:    %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%s시각:      %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%s커미터: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "인덱스를 읽을 수 없습니다"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "트리를 만드는데 오류"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:280
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "메시지를 -m 또는 -F 옵션으로 입력하십시오.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' 옵션이 '이름 <전자메일>' 형식이 아니고 기존 작성자에도 없습니다"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "추적되지 않는 파일 모드가 ('%s') 잘못되었습니다"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long 및 -z 옵션은 호환되지 않습니다"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "--reset-author 및 --author 옵션을 모두 사용하면 앞뒤가 맞지 않습니다"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "바꿀 사항이 없습니다."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "병합 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "커밋 빼오기 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "--squash 및 --fixup 옵션은 같이 쓸 수 없습니다"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "-c/-C/-F/--fixup 옵션 중에 하나만 사용할 수 있습니다."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "-m 옵션은 -c/-C/-F/--fixup 옵션과 같이 쓸 수 없습니다."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author 옵션은 -C, -c 또는 --amend 옵션과 같이 써야 합니다."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "--include/--only/--all/--interactive/--patch 옵션 중 하나만 사용할 수 있습니"
 "다."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "경로가 없이 --include/--only 옵션을 쓰면 앞뒤가 맞지 않습니다."
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "기발하네요... 마지막을 변경된 인덱스로 바꿉니다."
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "-i 또는 -o 없이 명시적인 경로를 지정했습니다. --only 경로를 가정합니다..."
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:495
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "잘못된 정리 모드 %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "-a 옵션과 경로를 같이 사용하면 앞뒤가 맞지 않습니다."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "상태를 간략하게 표시합니다"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "브랜치 정보를 표시합니다"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "버전"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:442
 msgid "machine-readable output"
 msgstr "컴퓨터가 읽을 수 있는 형식"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "긴 형식으로 상태를 표시합니다 (기본값)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "NUL 문자로 항목을 끝냅니다"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:368
 msgid "mode"
 msgstr "모드"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "추적되지 않는 파일을 표시합니다. 추가 옵션: all, normal, no (기본값: all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "무시되는 파일을 표시합니다"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "언제"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6047,198 +6915,198 @@ msgstr ""
 "하위 모듈의 변경을 무시합니다. 추가 옵션: all, dirty, untracked. (기본값: "
 "all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "추적되지 않는 파일의 목록을 여러 열로 표시합니다"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "새로 만든 커밋을 찾아볼 수 없습니다"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr "새로 만든 커밋을 파싱할 수 없습니다"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "HEAD 분리됨"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr " (최상위-커밋)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "성공적인 커밋 후에 요약을 표시하지 않습니다"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "커밋 메시지 서식에 diff를 표시합니다"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "커밋 메시지 옵션"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:366
 msgid "read message from file"
 msgstr "파일에서 메시지를 읽습니다"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "작성자"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "커밋의 작성자를 지정합니다"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:333
 msgid "date"
 msgstr "시각"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "커밋의 시각을 지정합니다"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:222 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:364
 msgid "message"
 msgstr "메시지"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "커밋 메시지"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:81
 msgid "commit"
 msgstr "커밋"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "지정한 커밋의 메시지를 재사용하고 편집합니다"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "지정한 커밋에서 메시지를 재사용합니다"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "지정한 커밋을 수정하는데 autosquash 형식 메시지를 사용합니다"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "지정한 커밋을 합치는데 autosquash 형식 메시지를 사용합니다"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "커밋을 내가 작성한 것으로 만듭니다 (-C/-c/--amend와 같이 사용)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "Signed-off-by: 줄을 추가합니다"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "지정한 서식 파일을 사용합니다"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "커밋 편집을 강제합니다"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "기본값"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:369
 msgid "how to strip spaces and #comments from message"
 msgstr "메시지에서 공백과 #주석을 지웁니다"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "커밋 메시지 서식에 상태를 포함합니다"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
+#: builtin/commit.c:1601 builtin/merge.c:234 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "GPG 서명 커밋"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "커밋 내용 옵션"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "변경된 파일을 모두 커밋합니다"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "지정한 파일을 커밋할 인덱스에 추가합니다"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "대화형으로 파일을 추가합니다"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "대화형으로 변경 사항을 추가합니다"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "지정한 파일만 커밋합니다"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "커밋 전 후크와 커밋 메시지 후크를 건너뜁니다"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "무엇을 커밋할지 표시합니다"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "바로 앞 커밋을 바꿉니다"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
 msgstr "다시쓰기 후 후크를 건너뜁니다"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "빈 변경 사항을 기록하도록 허용합니다"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "빈 메시지와 같이 변경 사항을 기록하도록 허용합니다"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "HEAD 커밋을 파싱할 수 없습니다"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "손상된 MERGE_HEAD 파일 (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "MERGE_MODE를 읽을 수 없습니다"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "커밋 메시지를 읽을 수 없습니다: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "커밋을 중지합니다. 메시지를 편집하지 않았습니다.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "커밋을 중지합니다. 커밋 메시지가 비어 있습니다.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6404,11 +7272,21 @@ msgstr ""
 msgid "cannot create configuration file %s"
 msgstr "%s 설정 파일을 만들 수 없습니다"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:625
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"여러 개의 값을 하나의 값으로 덮어쓸 수 없습니다.\n"
+"%s을(를) 변경하려면 정규식을 쓰거나, --add 또는 --replace-all 옵션을\n"
+"사용하십시오."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "사람이 읽기 좋은 형식으로 크기를 표시합니다"
 
@@ -6528,7 +7406,7 @@ msgstr "<n>개의 가장 최근의 태그만 고려합니다 (기본값: 10)"
 msgid "only consider tags matching <pattern>"
 msgstr "<패턴>과 일치하는 태그만 고려합니다"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "대안으로 요약한 커밋 오브젝트를 표시합니다"
 
@@ -6550,37 +7428,123 @@ msgstr "이름이 없습니다. 아무것도 설명할 수 없습니다."
 
 #: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
-msgstr "--dirty ì\98µì\85\98ì\9d\80 ì»¤ë°\8bê°\99ì\9d\80 í\95­ëª©ê³¼ í\98¸í\99\98ë\90\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤"
+msgstr "--dirty 옵션은 커밋같은 항목과 호환되지 않습니다"
 
-#: builtin/diff.c:86
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': 일반 파일이나 심볼릭 링크가 아닙니다"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "잘못된 옵션: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "깃 저장소가 아닙니다"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "잘못된 '%s' 오브젝트가 주어졌습니다."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "두 개보다 많은 블롭이 주어졌습니다: '%s'"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "처리하지 않은 '%s' 오브젝트가 주어졌습니다."
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr "git difftool [<옵션>] [<커밋> [<커밋>]] [--] [<경로>...]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "실패: %d"
+
+#: builtin/difftool.c:342
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"컴바인드 diff 형식은 ('-c' 및 '--cc') 디렉터리 diff 모드에서는\n"
+"('-d' 및 '--dir-diff') 지원하지 않습니다."
+
+#: builtin/difftool.c:567
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "두 파일이 수정되었습니다: '%s' 및 '%s'."
+
+#: builtin/difftool.c:569
+msgid "working tree file has been left."
+msgstr "작업 폴더가 남겨져 있습니다."
+
+#: builtin/difftool.c:580
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "임시 파일이 '%s'에 있습니다."
+
+#: builtin/difftool.c:581
+msgid "you may want to cleanup or recover these."
+msgstr "이 파일을 지우거나 복구할 수 있습니다."
+
+#: builtin/difftool.c:626
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "`diff.tool` 대신 `diff.guitool`을 사용하십시오"
+
+#: builtin/difftool.c:628
+msgid "perform a full-directory diff"
+msgstr "전체 디렉터리 diff를 수행합니다"
+
+#: builtin/difftool.c:630
+msgid "do not prompt before launching a diff tool"
+msgstr "diff 도구를 실행하기 전에 프롬프트를 표시하지 않습니다"
+
+#: builtin/difftool.c:636
+msgid "use symlinks in dir-diff mode"
+msgstr "dir-diff 모드에서 심볼릭 링크를 사용합니다"
+
+#: builtin/difftool.c:637
+msgid "<tool>"
+msgstr "<도구>"
+
+#: builtin/difftool.c:638
+msgid "use the specified diff tool"
+msgstr "지정한 diff 도구를 사용합니다"
+
+#: builtin/difftool.c:640
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr "`--tool` 옵션에서 사용할 수 있는 diff 도구 목록을 표시합니다"
+
+#: builtin/difftool.c:643
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr ""
+"실행한 diff 도구가 0이 아닌 코드를 리턴하면 'git-difftool'이 끝나게 합니다"
+
+#: builtin/difftool.c:645
+msgid "<command>"
+msgstr "<명령>"
+
+#: builtin/difftool.c:646
+msgid "specify a custom command for viewing diffs"
+msgstr "diff를 보는 명령어를 사용자가 지정합니다"
+
+#: builtin/difftool.c:670
+msgid "no <tool> given for --tool=<tool>"
+msgstr "--tool=<도구> 옵션에 <도구>가 주어지지 않았습니다"
+
+#: builtin/difftool.c:677
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "--extcmd=<명령> 옵션에 <명령>이 주어지지 않았습니다"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-옵션]"
@@ -6649,161 +7613,165 @@ msgstr "git fetch --multiple [<옵션>] [(<저장소> | <그룹>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<옵션>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "모든 리모트에서 가져옵니다"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "덮어쓰지 말고 .git/FETCH_HEAD에 덧붙입니다"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "리모트 쪽에 묶음을 업로드할 경로"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "로컬 브랜치를 강제로 덮어씁니다"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "여러 리모트에서 가져옵니다"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "모든 태그와 관련 오브젝트를 가져옵니다"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "모든 태그를 가져오지 않습니다 (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "병렬적으로 받아오는 하위모듈 개수"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "리모트에 이제 없는 리모트 추적 브랜치를 잘라냅니다"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "주문형"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "하위 모듈 재귀적으로 가져오기 방식을 설정합니다"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "다운로드한 묶음을 보존합니다"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "HEAD 레퍼런스 업데이트를 허용합니다"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "얕은 복제의 커밋 내역을 깊게 만듭니다"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "얕은 복제의 커밋 내역을 시간을 기준으로 깊게 만듭니다"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "완전한 저장소로 전환합니다"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "디렉터리"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "하위 모듈 경로 출력의 앞에 이 디렉터리를 붙입니다"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "재귀 기본 모드"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr ".git/shallow를 업데이트하는 레퍼런스를 허용합니다"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "레퍼런스맵"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "레퍼런스맵 가져오기를 지정합니다"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "리모트 레퍼런스 HEAD를 찾을 수 없습니다"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:511
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "fetch.output 설정에 잘못된 값이 있습니다: %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:604
 #, c-format
 msgid "object %s not found"
 msgstr "%s 오브젝트가 없습니다"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:608
 msgid "[up to date]"
 msgstr "[최신 상태]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:621 builtin/fetch.c:701
 msgid "[rejected]"
 msgstr "[거부됨]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:622
 msgid "can't fetch in current branch"
 msgstr "현재 브랜치에서 가져올 수 없음"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:631
 msgid "[tag update]"
 msgstr "[태그 업데이트]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:632 builtin/fetch.c:665 builtin/fetch.c:681
+#: builtin/fetch.c:696
 msgid "unable to update local ref"
 msgstr "로컬 레퍼런스를 업데이트할 수 없습니다"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:651
 msgid "[new tag]"
 msgstr "[새로운 태그]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:654
 msgid "[new branch]"
 msgstr "[새로운 브랜치]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:657
 msgid "[new ref]"
 msgstr "[새로운 레퍼런스]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:696
 msgid "forced update"
 msgstr "강제 업데이트"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:701
 msgid "non-fast-forward"
 msgstr "정방향 진행이 아님"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:746
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s이(가) 모든 필요한 오브젝트를 보내지 않았습니다\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:766
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "얕은 최상위의 업데이트가 허용되지 않으므로 %s을(를) 거부합니다"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:853 builtin/fetch.c:949
 #, c-format
 msgid "From %.*s\n"
 msgstr "%.*s URL에서\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:864
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6812,55 +7780,55 @@ msgstr ""
 "업데이트할 수 없는 로컬 레퍼런스가 있습니다. 과거 충돌 브랜치를\n"
 " 제거하려면 'git remote prune %s' 명령을 실행해 보십시오"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:919
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s 레퍼런스가 연결이 끊어지게 됩니다)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:920
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s 레퍼런스가 연결이 끊어졌습니다)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:952
 msgid "[deleted]"
 msgstr "[삭제됨]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:953 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(없음)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:976
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "간략한 저장소가 아닌 저장소의 현재 %s 브랜치로 가져오기를 거절합니다"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:995
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "\"%s\" 옵션의 \"%s\" 값은 %s에 대해 올바르지 않습니다"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:998
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "\"%s\" 옵션은 '%s'에 대해 무시됩니다\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1074
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "'%s'에서 가져오는 방법을 알 수 없습니다"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1234
 #, c-format
 msgid "Fetching %s\n"
 msgstr "%s을(를) 가져오는 중\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1236 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "%s을(를) 가져올 수 없습니다"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1254
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6868,33 +7836,41 @@ msgstr ""
 "리모트 저장소를 지정하지 않았습니다. 새 리비전을 가져올 수 있는\n"
 "URL이나 리모트 이름을 지정하십시오."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1277
 msgid "You need to specify a tag name."
 msgstr "태그 이름을 지정해야 합니다."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1319
+msgid "Negative depth in --deepen is not supported"
+msgstr "--deepen 옵션에 음수 깊이는 지원하지 않습니다"
+
+#: builtin/fetch.c:1321
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "-deepen, --depth 옵션 중 하나만 쓸 수 있습니다"
+
+#: builtin/fetch.c:1326
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth 및 --unshallow 옵션은 같이 쓸 수 없습니다"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1328
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 "완전한 저장소에 대해 --unshallow 옵션을 사용하는 건 앞뒤가 맞지 않습니다"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1350
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all 명령에 저장소 인자가 없습니다"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1352
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all 명령은 레퍼런스명세 인자와 같이 쓰면 앞뒤가 맞지 않습니다"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1363
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "그런 리모트나 리모트 그룹이 없습니다: %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1371
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "그룹을 가져오고 레퍼런스명세를 지정하면 앞뒤가 맞지 않습니다"
 
@@ -6904,23 +7880,23 @@ msgid ""
 msgstr ""
 "git fmt-merge-msg [-m <메시지>] [--log[=<n>] | --no-log] [--file <파일>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "shortlog에서 최대 <n>개 로그를 표시합니다"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "--log와 동일 (없어질 예정)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "텍스트"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "<텍스트>를 시작 메시지로 사용합니다"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "읽어들일 파일"
 
@@ -6960,7 +7936,7 @@ msgstr "티클에 적합하게 플레이스홀더를 인용합니다"
 msgid "show only <n> matched refs"
 msgstr "<n>개의 해당하는 레퍼런스만 표시합니다"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
+#: builtin/for-each-ref.c:37 builtin/tag.c:387 builtin/verify-tag.c:38
 msgid "format to use for the output"
 msgstr "출력에 사용할 형식"
 
@@ -6980,63 +7956,63 @@ msgstr "병합하지 않는 레퍼런스만 표시합니다"
 msgid "print only refs which contain the commit"
 msgstr "커밋이 들어 있는 레퍼런스만 표시합니다"
 
-#: builtin/fsck.c:519
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "오브젝트 디렉터리를 확인하는 중입니다"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<옵션>] [<오브젝트>...]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "접근할 수 없는 오브젝트를 표시합니다"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "연결이 끊어진 오브젝트를 표시합니다"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "태그를 알립니다"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "최상위 노드를 알립니다"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "인덱스 오브젝트 헤드 노드를 만듭니다"
 
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "reflog 헤드 노드를 만듭니다 (기본값)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "묶음과 보조 오브젝트도 만듭니다"
 
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "연결만 확인합니다"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "더 엄격하게 확인합니다"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr ".git/lost-found 안에 연결이 끊어진 오브젝트를 씁니다"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "진행 상황을 표시합니다"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "접근할 수 없는 오브젝트의 이름을 자세히 표시합니다"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "오브젝트를 확인합니다"
 
@@ -7054,7 +8030,7 @@ msgstr "잘못된 %s: '%s'"
 msgid "insanely long object directory %.*s"
 msgstr "비정상적으로 긴 오브젝트 디렉터리 %.*s"
 
-#: builtin/gc.c:290
+#: builtin/gc.c:297
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7069,38 +8045,38 @@ msgstr ""
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:334
 msgid "prune unreferenced objects"
 msgstr "레퍼런스하지 않는 오브젝트를 잘라냅니다"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:336
 msgid "be more thorough (increased runtime)"
 msgstr "더 자세히 검사합니다 (실행 시간 늘어남)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:337
 msgid "enable auto-gc mode"
 msgstr "자동 가비지컬렉터 모드를 사용합니다"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:338
 msgid "force running gc even if there may be another gc running"
 msgstr "이미 가비지컬렉터가 실행 중이더라도 강제로 가비지컬렉터를 실행합니다"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:380
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr "최적 성능을 위해 백그라운드에서 자동으로 저장소의 묶음을 만듭니다.\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:382
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "최적 성능을 위해 자동으로 저장소의 묶음을 만듭니다.\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:383
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "수동 관리 작업은 \"git help gc\" 내용을 참고하십시오.\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:404
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -7108,245 +8084,256 @@ msgstr ""
 "가비지컬렉터가 이미 '%s' 컴퓨터에서 %<PRIuMAX> PID로 실행 중입니다 (아니면 --"
 "force를 사용하십시오)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:448
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "느슨한 오브젝트가 너무 많습니다. 제거하려면 'git prune'을 실행하십시오."
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<옵션>] [-e] <패턴> [<리비전>...] [[--] <경로>...]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: 스레드를 만드는데 실패했습니다: %s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "잘못된 스레드 수를 %2$s에 대해 지정했습니다 (%1$d)"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:763 builtin/grep.c:804
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "트리를 읽을 수 없습니다 (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:823
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "종류가 %s인 오브젝트에서 grep을 할 수 없습니다"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:887
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "`%c' 옵션에는 숫자 값이 와야 합니다"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "'%s'을(를) 열 수 없습니다"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:973
 msgid "search in index instead of in the work tree"
 msgstr "작업 폴더 대신에 인덱스에서 검색합니다"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:975
 msgid "find in contents not managed by git"
 msgstr "깃으로 관리하지 않은 내용에서 찾습니다"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:977
 msgid "search in both tracked and untracked files"
 msgstr "추적되는 파일과 추적되지 않는 파일 모두에서 검색합니다"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:979
 msgid "ignore files specified via '.gitignore'"
 msgstr "'.gitignore'로 지정한 파일을 무시합니다"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:981
+msgid "recursivley search in each submodule"
+msgstr "하위 모듈에 재귀적으로 검색합니다"
+
+#: builtin/grep.c:983
+msgid "basename"
+msgstr "베이스이름"
+
+#: builtin/grep.c:984
+msgid "prepend parent project's basename to output"
+msgstr "프로젝트의 베이스일므을 출력 앞에 붙입니다"
+
+#: builtin/grep.c:987
 msgid "show non-matching lines"
 msgstr "일치하지 않는 줄을 표시합니다"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:989
 msgid "case insensitive matching"
-msgstr "ë\8c\80ì\86\8c문ì\9e\90 êµ¬ë³\84í\95\98ì§\80 ì\95\8aê³  ë§\9e춥니다"
+msgstr "ë\8c\80ì\86\8c문ì\9e\90 êµ¬ë³\84í\95\98ì§\80 ì\95\8aê³  ë¹\84êµ\90í\95©니다"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:991
 msgid "match patterns only at word boundaries"
 msgstr "단어 경계 부분에 대해서만 패턴을 맞춥니다"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:993
 msgid "process binary files as text"
 msgstr "바이너리 파일을 텍스트로 처리합니다"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:995
 msgid "don't match patterns in binary files"
 msgstr "바이너리 파일에서 패턴을 맞추지 않습니다"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:998
 msgid "process binary files with textconv filters"
 msgstr "textconv 필터를 사용해 바이너리 파일을 처리합니다"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1000
 msgid "descend at most <depth> levels"
 msgstr "최대 <깊이> 단계만큼 내려갑니다"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1004
 msgid "use extended POSIX regular expressions"
 msgstr "POSIX 확장 정규식을 사용합니다"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1007
 msgid "use basic POSIX regular expressions (default)"
 msgstr "기본 POSIX 정규식을 사용합니다 (기본값)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1010
 msgid "interpret patterns as fixed strings"
 msgstr "패턴을 고정 문자열로 해석합니다"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1013
 msgid "use Perl-compatible regular expressions"
 msgstr "펄과 호환되는 정규식을 사용합니다"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1016
 msgid "show line numbers"
 msgstr "줄 번호를 표시합니다"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1017
 msgid "don't show filenames"
 msgstr "파일 이름을 표시하지 않습니다"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1018
 msgid "show filenames"
 msgstr "파일 이름을 표시합니다"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1020
 msgid "show filenames relative to top directory"
 msgstr "파일 이름을 최상위 디렉터리 상대 경로로 표시합니다"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1022
 msgid "show only filenames instead of matching lines"
 msgstr "일치하는 줄을 표시하지 않고 파일 이름만 표시합니다"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1024
 msgid "synonym for --files-with-matches"
 msgstr "--files-with-matches 옵션과 동일"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1027
 msgid "show only the names of files without match"
 msgstr "일치하지 않는 파일의 이름만 표시합니다"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1029
 msgid "print NUL after filenames"
 msgstr "파일 이름 다음에 NUL을 출력합니다"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1031
 msgid "show the number of matches instead of matching lines"
 msgstr "일치하는 줄을 표시하지 않고 일치하는 수를 표시합니다"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1032
 msgid "highlight matches"
 msgstr "일치하는 부분을 강조합니다"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1034
 msgid "print empty line between matches from different files"
 msgstr "다른 파일 사이에 일치하는 부분의 사이에 빈 줄을 출력합니다"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1036
 msgid "show filename only once above matches from same file"
 msgstr "같은 파일에서 여러 개가 일치하면 파일 이름을 한 번만 표시합니다"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1039
 msgid "show <n> context lines before and after matches"
 msgstr "일치하는 부분 앞뒤에 컨텍스트를 <n>줄 표시합니다"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1042
 msgid "show <n> context lines before matches"
 msgstr "일치하는 부분 앞에 컨텍스트를 <n>줄 표시합니다"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1044
 msgid "show <n> context lines after matches"
 msgstr "일치하는 부분 뒤에 컨텍스트를 <n>줄 표시합니다"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1046
 msgid "use <n> worker threads"
 msgstr "<n>개의 작업 스레드를 사용합니다"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1047
 msgid "shortcut for -C NUM"
 msgstr "-C NUM 옵션의 줄임"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1050
 msgid "show a line with the function name before matches"
 msgstr "일치 항목 앞에 함수 이름 줄을 표시합니다"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1052
 msgid "show the surrounding function"
 msgstr "들어 있는 함수를 표시합니다"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1055
 msgid "read patterns from file"
 msgstr "파일에서 패턴을 읽습니다"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1057
 msgid "match <pattern>"
 msgstr "<패턴>과 일치"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1059
 msgid "combine patterns specified with -e"
 msgstr "-e 옵션으로 지정한 패턴을 결합합니다"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1071
 msgid "indicate hit with exit status without output"
 msgstr "출력하지 않고 일치하는 항목을 exit() 상태 번호로 리턴합니다"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1073
 msgid "show only matches from files that match all patterns"
 msgstr "모든 패턴과 일치하는 파일의 일치하는 부분만 표시합니다"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1075
 msgid "show parse tree for grep expression"
 msgstr "grep 표현식에 대한 파싱 트리를 표시합니다"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1079
 msgid "pager"
 msgstr "페이저"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1079
 msgid "show matching files in the pager"
 msgstr "일치하는 파일을 페이저 프로그램에서 표시합니다"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1082
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "grep(1) 실행을 허용합니다 (이 빌드에서는 무시)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1146
 msgid "no pattern given."
 msgstr "패턴을 지정하지 않았습니다."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1178 builtin/index-pack.c:1482
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "잘못된 스레드 수를 지정했습니다 (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1215
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 옵션은 작업 폴더에서만 동작합니다"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1238
+msgid "option not supported with --recurse-submodules."
+msgstr "--recurse-submodules와 같이 지원하지 않는 옵션입니다."
+
+#: builtin/grep.c:1244
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 "--cached 또는 --untracked 옵션은 --no-index 옵션과 같이 쓸 수 없습니다."
 
-#: builtin/grep.c:906
+#: builtin/grep.c:1249
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index 또는 --untracked 옵션은 리비전과 같이 쓸 수 없습니다."
 
-#: builtin/grep.c:909
+#: builtin/grep.c:1252
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 옵션은 추적되는 내용에 대해 쓸 수 없습니다."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1260
 msgid "both --cached and trees are given."
 msgstr "--cached 옵션과 트리를 모두 지정했습니다."
 
@@ -7362,83 +8349,87 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "종류"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "오브젝트 종류"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "오브젝트를 오브젝트 데이터베이스로 씁니다"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "표준 입력에서 오브젝트를 읽습니다"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "파일을 필터 없이 그대로 저장합니다"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr "임의의 쓰레기 데이터를 해시해 손상된 오브젝트를 만듭니다 (디버깅용)"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "파일이 이 경로에서 온 것처럼 처리합니다"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "사용 가능한 모든 명령의 목록을 표시합니다"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "설명서 제외"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "유용한 안내서 목록을 표시합니다"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "맨 페이지를 표시합니다"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "웹 브라우저에서 설명서를 표시합니다"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "인포 페이지를 표시합니다"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<명령>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "'%s' 도움말 포맷을 인식할 수 없습니다"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "emacsclient 시작에 실패했습니다."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "emacsclient 버전 파싱에 실패했습니다."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "emacsclient '%d' 버전은 너무 과거 (< 22) 버전입니다."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "실행 실패: '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7447,7 +8438,7 @@ msgstr ""
 "'%s': 지원하지 않는 맨 페이지 보기 프로그램 경로.\n"
 "대신에 'man.<도구>.cmd' 옵션을 사용해 보십시오."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7456,421 +8447,429 @@ msgstr ""
 "'%s': 지원하지 않는 맨 페이지 보기 프로그램 명령.\n"
 "대신에 'man.<도구>.path' 옵션을 사용해 보십시오."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': 알 수 없는 맨 페이지 보기 프로그램."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "요청을 처리한 맨 페이지 보기 프로그램이 없습니다"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "요청을 처리한 인포 페이지 보기 프로그램이 없습니다"
 
-#: builtin/help.c:408
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "경로마다 속성 정의하기"
 
-#: builtin/help.c:409
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "매일매일 사용하는 20개 내외의 깃 명령"
 
-#: builtin/help.c:410
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "깃 용어 사전"
 
-#: builtin/help.c:411
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "의도적으로 추적하지 않는 파일을 무시하게 지정하기"
 
-#: builtin/help.c:412
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "하위 모듈 속성 정의하기"
 
-#: builtin/help.c:413
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "깃의 리비전 및 범위를 지정하기"
 
-#: builtin/help.c:414
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "깃 따라하기 안내서 (버전 1.5.1 이후)"
 
-#: builtin/help.c:415
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "추천하는 깃 활용 작업 순서의 개요"
 
-#: builtin/help.c:427
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "자주 사용하는 깃 안내서는 다음과 같습니다:\n"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "사용법: %s%s"
-
-#: builtin/help.c:481
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s' 명령은 `%s' 명령의 단축입니다"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "사용법: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "%s을(를) 열 수 없습니다"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "오브젝트 종류가 맞지 않습니다 (%s)"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "예상한 %s 오브젝트를 받지 않았습니다"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "%s 오브젝트: 예상한 종류 %s, 실제 %s"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "%d 바이트를 채울 수 없습니다"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "너무 빨리 파일이 끝남"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "입력에 읽기 오류"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "있는 바이트보다 더 많이 사용합니다"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "현재 정의된 off_t에 비해 묶음이 너무 큽니다"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "묶음 크기가 최대 허용 크기를 넘었습니다"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "'%s'을(를) 만들 수 없습니다"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "'%s' 묶음 파일을 열 수 없습니다"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "묶음 서명이 맞지 않습니다"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "묶음의 %<PRIu32> 버전을 지원하지 않습니다"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:356
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "묶음의 %<PRIuMAX> 오프셋에 잘못된 오브젝트가 있습니다: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "inflate가 %d번을 리턴했습니다"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "델타 베이스 오브젝트에 대해 오프셋 값이 오버플로우"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr "델타 베이스 오프셋이 범위를 벗어났습니다"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "알 수 없는 오브젝트 종류 %d번"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "묶음 파일에 대해 pread를 할 수 없습니다"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:576
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "묶음 파일이 너무 일찍 끝남. %<PRIuMAX> 바이트 부족"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "심각한 inflate 부조화"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:748 builtin/index-pack.c:754 builtin/index-pack.c:777
+#: builtin/index-pack.c:813 builtin/index-pack.c:822
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1 충돌이 %s에서 발견되었습니다!"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
+#: builtin/index-pack.c:751 builtin/pack-objects.c:164
 #: builtin/pack-objects.c:256
 #, c-format
 msgid "unable to read %s"
 msgstr "%s을(를) 읽을 수 없습니다"
 
-#: builtin/index-pack.c:814
+#: builtin/index-pack.c:819
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "기존 %s 오브젝트를 읽을 수 없습니다"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:833
 #, c-format
 msgid "invalid blob object %s"
 msgstr "잘못된 블롭 오브젝트 %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:847
 #, c-format
 msgid "invalid %s"
 msgstr "잘못된 %s"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:850
 msgid "Error in object"
 msgstr "오브젝트에 오류"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:852
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "%s의 모든 하위 오브젝트에 접근할 수 없습니다"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:924 builtin/index-pack.c:955
 msgid "failed to apply delta"
 msgstr "델타를 적용하는데 실패했습니다"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1125
 msgid "Receiving objects"
 msgstr "오브젝트를 받는 중"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1125
 msgid "Indexing objects"
 msgstr "오브젝트 인덱스를 만드는 중"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1157
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "묶음이 손상되었습니다 (SHA1 일치하지 않음)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1162
 msgid "cannot fstat packfile"
 msgstr "묶음 파일에 대해 fstat()할 수 없습니다"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1165
 msgid "pack has junk at the end"
 msgstr "묶음의 끝에 쓰레기 데이터가 있습니다"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1176
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "parse_pack_objects()에서 극심한 혼란"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1199
 msgid "Resolving deltas"
 msgstr "델타를 알아내는 중"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1210
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "스레드를 만들 수 없습니다: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1252
 msgid "confusion beyond insanity"
 msgstr "극심한 혼란"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1258
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "로컬 오브젝트 %d개 마침"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1270
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "%s에 대해 예상치 못한 테일 체크섬 (디스크 손상?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1274
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "묶음에 알아내지 못한 델타 %d개가 있습니다"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1298
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "추가한 오브젝트를 deflate할 수 없습니다 (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1374
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "%s 로컬 오브젝트가 손상되었습니다"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1398
 msgid "error while closing pack file"
 msgstr "묶음 파일을 닫는데 오류"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1411
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "'%s' 보존 파일을 쓸 수 없습니다"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1419
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "쓴 '%s' 보존 파일을 닫지 못했습니다"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1432
 msgid "cannot store pack file"
 msgstr "묶음 파일을 저장할 수 없습니다"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1443
 msgid "cannot store index file"
 msgstr "인덱스 파일을 저장할 수 없습니다"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1476
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "잘못된 pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1486 builtin/index-pack.c:1683
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "스레드 기능이 없습니다. %s 무시"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1544
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "기존 '%s' 묶음 파일을 열 수 없습니다"
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1546
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "'%s'에 대한 기존 묶음 idx 파일을 열 수 없습니다"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1593
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "델타 아님: 오브젝트 %d개"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1600
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "체인 길이 = %d: 오브젝트 %lu개"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1613
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "'%s' 묶음파일 이름이 '.pack'으로 끝나지 않습니다"
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1695 builtin/index-pack.c:1698
+#: builtin/index-pack.c:1714 builtin/index-pack.c:1718
 #, c-format
 msgid "bad %s"
 msgstr "잘못된 %s"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1734
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin 옵션은 --stdin 옵션과 같이 쓸 수 없습니다"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1736
+msgid "--stdin requires a git repository"
+msgstr "--stdin 옵션은 깃 저장소가 필요합니다"
+
+#: builtin/index-pack.c:1744
 msgid "--verify with no packfile name given"
 msgstr "--verify 옵션에 묶음파일 이름을 지정하지 않았습니다"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "'%s'을(를) stat()할 수 없습니다"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "'%s' 서식을 stat()할 수 없습니다"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "'%s'을(를) opendir()할 수 없습니다"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "'%s'을(를) readlink()할 수 없습니다"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "'%s'을(를) '%s'에 symlink()할 수 없습니다"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "'%s'을(를) '%s'에 복사할 수 없습니다"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "%s 서식을 무시합니다"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "%s에 서식이 없습니다"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "'%s'에서 서식을 복사하지 않습니다: %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s 파일이 이미 있습니다"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "파일 종류 %d번을 처리할 수 없습니다"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "%s을(를) %s(으)로 옮길 수 없습니다"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s 파일이 이미 있습니다"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "%s%s 안의 기존 공유 깃 저장소를 다시 초기화했습니다\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "%s%s 안의 기존 깃 저장소를 다시 초기화했습니다\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "%s%s 안의 빈 공유 깃 저장소를 다시 초기화했습니다\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "%s%s 안의 빈 깃 저장소를 다시 초기화했습니다\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7878,25 +8877,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<서식-디렉터리>] [--shared[=<권"
 "한>]] [<디렉터리>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "권한"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "깃 저장소를 다른 사용자가 공유할 수 있게 지정"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "%s에 대해 mkdir를 할 수 없습니다"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "%s에 대해 chdir를 할 수 없습니다"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7905,7 +8904,7 @@ msgstr ""
 "%s (또는 --work-tree=<디렉터리>) 허용되지 않음. %s (또는 --git-"
 "dir=<directory>) 지정이 없으면"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "작업 폴더 '%s'에 접근할 수 없습니다"
@@ -8016,37 +9015,34 @@ msgstr "범위가 아닙니다."
 msgid "Cover letter needs email format"
 msgstr "커버레터는 전자메일 형식이어야 합니다"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "정신나간 in-reply-to 헤더: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<옵션>] [<시작시각> | <리비전-범위>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "출력 디렉터리가 두개?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
 #, c-format
 msgid "Unknown commit %s"
 msgstr "알 수 없는 커밋 %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:476
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "'%s'을(를) 올바른 레퍼런스로 알아내는데 실패했습니다."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1263
 msgid "Could not find exact merge base."
 msgstr "정확한 병합 기준점을 찾을 수 없습니다."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1267
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8057,209 +9053,213 @@ msgstr ""
 "아니면 직접 '--base=<기준점-커밋-ID>' 옵션으로 기준점 커밋을 지정할\n"
 "수도 있습니다."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1287
 msgid "Failed to find exact merge base"
 msgstr "정확한 병합 기준점을 찾는데 실패했습니다"
 
-#: builtin/log.c:1294
+#: builtin/log.c:1298
 msgid "base commit should be the ancestor of revision list"
 msgstr "기준점 커밋은 리비전 목록의 상위 커밋이어야 합니다"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1302
 msgid "base commit shouldn't be in revision list"
 msgstr "기준점 커밋은 리비전 목록에 들어 있으면 안 됩니다"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1351
 msgid "cannot get patch id"
 msgstr "패치 ID를 알아낼 수 없습니다"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "하나의 패치에 대해서도 [PATCh n/m]을 붙입니다"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "여러 개 패치에 대해서도 [PATCH]를 붙입니다"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "패치를 표준 출력으로 표시합니다"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "커버레터를 만듭니다"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "출력 파일 이름에 간단한 일련 번호를 사용합니다"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "확장자"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "'.patch' 대신 <확장자>를 사용합니다"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "패치 번호를 1 대신 <n>에서 시작합니다"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "시리즈를 N번째 re-roll로 표시합니다"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "[PATCH] 대신 [RFC PATCH]를 사용합니다"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "[PATCH] 대신 [<접두어>]를 사용합니다"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "결과 파일을 <디렉터리>에 저장합니다"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "[PATCH]를 자르거나 추가하지 않습니다"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "바이너리 diff를 만들지 않습니다"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "From 헤더에서 모두 0인 해시를 출력합니다"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "업스트림에 있는 패치를 포함하지 않습니다"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "기본값 (패치 + 통계) 대신 패치 형식을 표시합니다"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "메시징"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1448
 msgid "header"
 msgstr "헤더"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "전자메일 헤더"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "전자메일"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "To: 헤더를 추가합니다"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "Cc: 헤더를 추가합니다"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "신원"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "<신원>에서 From 주소를 설정합니다 (없으면 커미터 주소 신원 사용)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "메시지-ID"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "첫 메일을 <메시지-ID>에 대한 답장 메일로 만듭니다"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "경계"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "패치를 첨부합니다"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "패치를 본문에 포함합니다"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "메시지에 스레드를 사용, 스타일: shallow, deep"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "서명"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "서명을 추가합니다"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1471
 msgid "base-commit"
 msgstr "베이스-커밋"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1472
 msgid "add prerequisite tree info to the patch series"
 msgstr "전제조건 트리 정보를 패치 시리즈에 추가합니다"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "파일에서 서명을 추가합니다"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "패치 파일 이름을 표시하지 않습니다"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n 및 -k 옵션은 하나만 써야 합니다."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix 및 -k 옵션은 하나만 써야 합니다."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc 및 -k 옵션은 하나만 써야 합니다."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only 옵션은 앞뒤가 맞지 않습니다"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status 옵션은 앞뒤가 맞지 않습니다"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check 옵션은 앞뒤가 맞지 않습니다"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "표준 출력이나 디렉터리 중에 하나만 지정해야 합니다."
 
-#: builtin/log.c:1604
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "'%s' 디렉터리를 만들 수 없습니다"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "'%s' 서명 파일을 읽을 수 없습니다"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "출력 파일을 만드는데 실패했습니다"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<업스트림> [<헤드> [<한계값>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8267,99 +9267,103 @@ msgstr ""
 "추적되는 리모트 브랜치를 찾을 수 없습니다. <업스트림>을 수동으로 지정하십시"
 "오.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:460
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<옵션>] [<파일>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:509
 msgid "identify the file status with tags"
 msgstr "파일 상태를 태그와 같이 표시합니다"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:511
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "'변경되지 않았다고 가정' 파일에 소문자를 사용합니다"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:513
 msgid "show cached files in the output (default)"
 msgstr "출력에 캐시된 파일을 표시합니다 (기본값)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:515
 msgid "show deleted files in the output"
 msgstr "출력에 삭제된 파일을 표시합니다"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:517
 msgid "show modified files in the output"
 msgstr "출력에 수정된 파일을 표시합니다"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:519
 msgid "show other files in the output"
 msgstr "출력에 기타 파일을 표시합니다"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:521
 msgid "show ignored files in the output"
 msgstr "출력에 무시된 파일을 표시합니다"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:524
 msgid "show staged contents' object name in the output"
 msgstr "출력에 커밋 표시된 내용의 오브젝트 이름을 표시합니다"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:526
 msgid "show files on the filesystem that need to be removed"
 msgstr "파일 시스템에서 제거해야 하는 파일을 표시합니다"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:528
 msgid "show 'other' directories' names only"
 msgstr "기타 디렉터리의 이름만 표시합니다"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:530
 msgid "show line endings of files"
 msgstr "파일의 줄 끝을 표시합니다"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:532
 msgid "don't show empty directories"
 msgstr "빈 디렉터리 표시하지 않기"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:535
 msgid "show unmerged files in the output"
 msgstr "출력에 병합하지 않은 파일을 표시합니다"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:537
 msgid "show resolve-undo information"
 msgstr "resolve-undo 정보를 표시합니다"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:539
 msgid "skip files matching pattern"
 msgstr "패턴에 일치하는 파일을 건너뜁니다"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:542
 msgid "exclude patterns are read from <file>"
 msgstr "제외할 패턴을 <파일>에서 읽습니다"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:545
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "<파일>에서 추가적인 디렉터리별 제외 패턴을 읽습니다"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:547
 msgid "add the standard git exclusions"
 msgstr "표준 깃 제외 패턴을 추가합니다"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:550
 msgid "make the output relative to the project top directory"
 msgstr "최상위 디렉터리 상대 경로로 출력합니다"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:553
+msgid "recurse through submodules"
+msgstr "하위 모듈에 재귀적으로 적용"
+
+#: builtin/ls-files.c:555
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "<파일>이 인덱스 안에 없으면 오류로 취급합니다"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:556
 msgid "tree-ish"
 msgstr "트리-따위"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:557
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr "<트리-따위> 뒤로 제거한 경로가 있다고 가정합니다"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:559
 msgid "show debugging data"
 msgstr "디버깅 데이터를 표시합니다"
 
@@ -8413,35 +9417,35 @@ msgstr "레퍼런스와 레퍼런스가 가리키는 오브젝트를 표시합
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<옵션>] <트리-따위> [<경로>...]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "트리만 표시"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
 msgstr "하위 트리로 재귀적으로 적용"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "재귀적으로 적용할 때 트리 표시"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "항목을 NUL 바이트로 끝냅니다"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "오브젝트 크기 포함"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "파일 이름만 목록 표시"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "전체 경로 이름 사용"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "전체 트리 목록 표시, 현재 디렉터리만 아니라 (--full-name 옵션 포함)"
 
@@ -8457,161 +9461,169 @@ msgstr "git merge [<옵션>] <메시지> HEAD <커밋>"
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:49
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:104
 msgid "switch `m' requires a value"
 msgstr "`m' 옵션에는 값이 필요합니다"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:141
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "'%s' 병합 전략을 찾을 수 없습니다.\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:142
 #, c-format
 msgid "Available strategies are:"
 msgstr "사용 가능한 전략은:"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:147
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "사용 가능한 사용자 설정 전략은:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:197 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "병합이 끝날 때 diffstat을 표시하지 않습니다"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:200 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "병합이 끝날 때 diffstat을 표시합니다"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:201 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(--stat 옵션과 동일)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:203 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "병합 커밋의 메시지에 shortlog 항목을 (최대 <n>개) 추가합니다"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:206 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "병합하는 대신 하나의 커밋을 만듭니다"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "병합이 성공하면 커밋을 합니다 (기본값)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:210 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "커밋 전에 메시지를 편집합니다"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:211
 msgid "allow fast-forward (default)"
 msgstr "정방향 진행을 허용합니다 (기본값)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:213 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "정방향 진행이 불가능하면 중지합니다"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "지정한 커밋에 올바른 GPG 서명이 있는지 검증합니다"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
+#: builtin/merge.c:218 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "전략"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:219 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "사용할 병합 전략"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:220 builtin/pull.c:162
 msgid "option=value"
 msgstr "옵션=값"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:221 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "선택한 병합 전략에 대한 옵션"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:223
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "병합 커밋 메시지 (정방향이 아닌 병합에 대해)"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:227
 msgid "abort the current in-progress merge"
 msgstr "현재 진행 중인 병합을 중지합니다"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:229
+msgid "continue the current in-progress merge"
+msgstr "현재 진행 중인 병합을 계속합니다"
+
+#: builtin/merge.c:231 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "관계 없는 커밋 내역의 병합을 허용합니다"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:259
 msgid "could not run stash."
 msgstr "stash를 실행할 수 없습니다."
 
-#: builtin/merge.c:260
+#: builtin/merge.c:264
 msgid "stash failed"
 msgstr "스태시 실패"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:269
 #, c-format
 msgid "not a valid object: %s"
 msgstr "올바른 오브젝트가 아닙니다: %s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:288 builtin/merge.c:305
 msgid "read-tree failed"
 msgstr "read-tree 실패"
 
-#: builtin/merge.c:331
+#: builtin/merge.c:335
 msgid " (nothing to squash)"
 msgstr " (합칠 내용이 없습니다)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:346
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "커밋 합치기 -- HEAD를 업데이트하지 않습니다\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:396
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "병합 메시지가 없습니다 -- HEAD를 업데이트하지 않습니다\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:447
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s'이(가) 커밋을 가리키지 않습니다"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:537
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "잘못된 branch.%s.mergeoptions 문자열: %s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "두 개의 헤드 병합 외에는 처리하지 않습니다."
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "merge-recursive에 대해 알 수 없는 옵션: -X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "%s에 쓸 수 없습니다"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "'%s'에서 읽을 수 없습니다"
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "병합을 커밋하지 않습니다. 병합을 마치려면 'git commit'을 사용하십시오.\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8627,66 +9639,78 @@ msgstr ""
 "'%c' 문자로 시작하는 줄은 무시되고, 메시지가 비어 있으면 커밋을\n"
 "중지합니다.\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "빈 커밋 메시지."
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "훌륭합니다.\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.\n"
 
-#: builtin/merge.c:863
+#: builtin/merge.c:867
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s'은(는) 커밋이 아닙니다"
 
-#: builtin/merge.c:904
+#: builtin/merge.c:908
 msgid "No current branch."
 msgstr "현재 브랜치가 없습니다."
 
-#: builtin/merge.c:906
+#: builtin/merge.c:910
 msgid "No remote for the current branch."
 msgstr "현재 브랜치에 대한 리모트가 없습니다."
 
-#: builtin/merge.c:908
+#: builtin/merge.c:912
 msgid "No default upstream defined for the current branch."
 msgstr "현재 브랜치에 대해 기본 업스트림을 지정하지 않았습니다."
 
-#: builtin/merge.c:913
+#: builtin/merge.c:917
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "리모트 %2$s에서 %1$s에 대한 리모트 추적 브랜치가 없습니다"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:964
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "잘못된 값 '%s', 환경 '%s'"
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1038
 #, c-format
 msgid "could not close '%s'"
 msgstr "'%s'을(를) 닫을 수 없습니다"
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1065
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "%s 안에서 병합할 수 있는 항목이 아닙니다: %s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1099
 msgid "not something we can merge"
 msgstr "병합할 수 있는 항목이 아닙니다"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1167
+msgid "--abort expects no arguments"
+msgstr "--abort 옵션은 인자를 받지 않습니다"
+
+#: builtin/merge.c:1171
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "중지할 병합 작업이 없습니다. (MERGE_HEAD가 없음)"
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1183
+msgid "--continue expects no arguments"
+msgstr "--continue 옵션은 인자를 받지 않습니다"
+
+#: builtin/merge.c:1187
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "진행 중인 병합 작업이 없습니다. (MERGE_HEAD가 없음)"
+
+#: builtin/merge.c:1203
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8694,7 +9718,7 @@ msgstr ""
 "병합을 마치지 않았습니다. (MERGE_HEAD 있음)\n"
 "병합하기 전에 변경 사항을 커밋하십시오."
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1210
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8702,112 +9726,112 @@ msgstr ""
 "커밋 빼오기를 마치지 않았습니다. (COMMIT_PICK_HEAD 있음)\n"
 "병합하기 전에 변경 사항을 커밋하십시오."
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1213
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "커밋 빼오기를 마치지 않았습니다. (CHERRY_PICK_HEAD 있음)"
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1222
 msgid "You cannot combine --squash with --no-ff."
 msgstr "--squash 옵션을 --no-ff 옵션과 같이 쓸 수 없습니다."
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1230
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "커밋을 지정하지 않았고  merge.defaultToUpstream를 설정하지 않았습니다."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1247
 msgid "Squash commit into empty head not supported yet"
 msgstr "빈 헤드로 커밋을 합치기는 지원하지 않습니다"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1249
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "정방향이 아닌 커밋은 빈 헤드에서는 앞뒤가 맞지 않습니다"
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1254
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 병합할 수 있는 항목이 아닙니다"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1256
 msgid "Can merge only exactly one commit into empty head"
 msgstr "빈 헤드에는 정확히 하나의 커밋만 병합할 수 있습니다"
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1312
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "%s 커밋에 신뢰하지 않는 (서명자가 %s라고 하는) GPG 서명이 있습니다."
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1315
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "%s 커밋에 잘못된 (서명자가 %s라고 하는) GPG 서명이 있습니다."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1318
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "%s 커밋에 GPG 서명이 없습니다."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1321
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "%s 커밋에 %s의 올바른 GPG 서명이 없습니다\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1383
 msgid "refusing to merge unrelated histories"
 msgstr "관계 없는 커밋 내역의 병합을 거부합니다"
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1392
 msgid "Already up-to-date."
 msgstr "이미 업데이트 상태입니다."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1402
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "업데이트 중 %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1443
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "아주 간단한 인덱스 내부 병합을 시도합니다...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1450
 #, c-format
 msgid "Nope.\n"
 msgstr "아님.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1475
 msgid "Already up-to-date. Yeeah!"
 msgstr "이미 업데이트 상태입니다. 야호!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1481
 msgid "Not possible to fast-forward, aborting."
 msgstr "정방향이 불가능하므로, 중지합니다."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1504 builtin/merge.c:1583
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "트리를 본래 위치로 되돌립니다...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1508
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "병합 전략 %s 시도...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1574
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "병합을 처리한 전략이 없습니다.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1576
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "전략 %s(으)로 병합이 실패했습니다.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1585
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "수동 해결의 준비를 위해 %s 전략을 사용합니다.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1597
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "자동 병합이 잘 진행되었습니다. 요청한대로 커밋 전에 중지합니다\n"
@@ -8832,23 +9856,23 @@ msgstr "git merge-base --is-ancestor <커밋> <커밋>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <레퍼런스> [<커밋>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "모든 과거 공통 커밋을 출력합니다"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "하나의 n-방향 병합에 대한 과거 커밋을 찾습니다"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "다른 곳에서 접근 불가능한 리비전 목록을 출력합니다"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "첫번째가 다른 것의 과거 커밋인지 여부?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "<레퍼런스>의 reflog에서 <커밋>이 분리된 위치를 찾습니다"
 
@@ -8892,6 +9916,36 @@ msgstr "충돌에 대해 경고하지 않습니다"
 msgid "set labels for file1/orig-file/file2"
 msgstr "<파일1>/<본래-파일>/<파일2>에 대한 레이블을 설정합니다"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "알 수 없는 옵션: %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "베이스를 %d개 보다 많이 쓸 수 없습니다. %s 무시합니다."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "두 개의 헤드 병합 외에는 처리하지 않습니다."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "'%s' 레퍼런스를 알아낼 수 없습니다"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "%s 병합, %s 항목과\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -8908,135 +9962,135 @@ msgstr "없는 오브젝트를 허용합니다"
 msgid "allow creation of more than one tree"
 msgstr "여러개 트리 만들기를 허용합니다"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<옵션>] <원본>... <대상>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "%s 디렉터리가 인덱스에 있고 하위 모듈이 없습니다?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr "계속하려면 .gitmodules의 변경 사항을 스테이지에 넣거나 스태시 하십시오"
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s이(가) 인덱스에 있습니다"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "대상이 이미 있어도 강제로 옮기기/이름 바꾸기를 합니다"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "옮기기/이름 바꾸기 오류를 건너 뜁니다"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "대상이 ('%s') 디렉터리가 아닙니다"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "'%s'을(를) '%s'(으)로 이름 바꾸기합니다\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "잘못된 원본"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "디렉터리를 자기 자신으로 옮길 수 없습니다"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "디렉터리를 파일로 옮길 수 없습니다"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "원본 디렉터리가 비어 있습니다"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "버전 컨트롤 중이 아닙니다"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "대상이 있습니다"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "'%s' 덮어쓰기"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "덮어쓸 수 없습니다"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "동일한 대상에 대해 여러 개 원본"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "대상 디렉터리가 없습니다"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, 원본=%s, 대상=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "이름 바꾸기, '%s'에서 '%s'(으)로\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "'%s'의 이름 바꾸기가 실패했습니다"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<옵션>] <커밋>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<옵션>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<옵션>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "이름만 표시 (SHA-1 없이)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "커밋을 지정할 때 태그만 사용합니다"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "<패턴>과 일치하는 레퍼런스만 사용합니다"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "모든 레퍼런스에서 접근 가능한 모든 커밋 목록을 표시합니다"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "표준입력에서 읽습니다"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "`정의되지 않은' 이름 표시를 허용합니다 (기본값)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "입력의 태그 레퍼런스를 따라갑니다 (내부 사용)"
 
@@ -9170,7 +10224,7 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "오브젝트 '%s'에 대해 'show'를 마치는데 실패했습니다"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
+msgid "please supply the note contents using either -m or -F option"
 msgstr "노트 내용을 -m 또는 -F 옵션으로 입력하십시오"
 
 #: builtin/notes.c:203
@@ -9179,65 +10233,89 @@ msgstr "노트 오브젝트를 쓸 수 없습니다"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
+msgid "the note contents have been left in %s"
 msgstr "노트 내용은 %s에 남습니다"
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:460
 #, c-format
 msgid "cannot read '%s'"
 msgstr "'%s'을(를) 읽을 수 없습니다"
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:463
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "'%s'을(를) 열거나 읽을 수 없습니다"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:659
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "'%s'을(를) 올바른 레퍼런스로 알아내는데 실패했습니다."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
+msgid "failed to read object '%s'."
 msgstr "'%s' 오브젝트 읽기에 실패했습니다."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
+msgid "cannot read note data from non-blob object '%s'."
 msgstr "블롭이 아닌 '%s' 오브젝트에 대해 노트 데이터를 읽을 수 없습니다."
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "잘못된 형식의 입력 줄: '%s'."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 노트를 복사하는데 실패했습니다"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "%s에서 노트를 %s 하기를 거부합니다 (refs/notes/ 밖임)"
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:652
+#: builtin/notes.c:802 builtin/notes.c:949 builtin/notes.c:970
 msgid "too many parameters"
 msgstr "파라미터가 너무 많습니다"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:665
 #, c-format
-msgid "No note found for object %s."
+msgid "no note found for object %s."
 msgstr "%s 오브젝트에 대해 노트가 없습니다."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "문자열로 노트 내용"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "파일 안에 노트 내용"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "지정한 노트 오브젝트를 재사용하고 편집합니다"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "지정한 노트 오브젝트를 재사용합니다"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "빈 노트 저장을 허용합니다"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "기존 노트를 바꿉니다"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9246,29 +10324,29 @@ msgstr ""
 "노트를 추가할 수 없습니다. %s 오브젝트에 대한 기존 노트가 있습니다. 기존 노트"
 "를 덮어쓰려면 '-f' 옵션을 사용하십시오"
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "%s 오브젝트에 대한 기존 노트를 덮어씁니다\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "%s 오브젝트에 대한 노트를 제거합니다\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "표준 입력에서 오브젝트를 읽습니다"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "<명령>에 대한 다시쓰기 설정을 읽어들입니다 (--stdin 옵션 포함)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "파라미터가 너무 적습니다"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9277,12 +10355,12 @@ msgstr ""
 "노트를 복사할 수 없습니다. %s 오브젝트에 대한 기존 노트가 있습니다. 기존 노트"
 "를 덮어쓰려면 '-f' 옵션을 사용하십시오"
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
+msgid "missing notes on source object %s. Cannot copy."
 msgstr "원본 %s 오브젝트에 대한 노트가 없습니다. 복사할 수 없습니다."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9291,20 +10369,52 @@ msgstr ""
 "-m/-F/-c/-C 옵션은 'edit' 하위 명령에 대해 사용을 권하지 않습니다.\n"
 "대신에 'git notes add -f -m/-F/-c/-C' 명령을 사용하십시오.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "NOTES_MERGE_PARTIAL 레퍼런스 삭제에 실패했습니다"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "NOTES_MERGE_REF 레퍼런스 삭제에 실패했습니다"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "'git notes merge' 작업트리 제거에 실패했습니다"
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "NOTES_MERGE_PARTIAL 레퍼런스 읽기에 실패했습니다"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "NOTES_MERGE_PARTIAL에서 커밋을 찾을 수 없습니다."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "NOTES_MERGE_PARTIAL에서 커밋을 파싱할 수 없습니다."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "NOTES_MERGE_REF 알아내기에 실패했습니다"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "노트 병합을 마치는데 실패했습니다"
+
+#: builtin/notes.c:755
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "알 수 없는 노트 병합 전략 %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "일반 옵션"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "병합 옵션"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9312,94 +10422,97 @@ msgstr ""
 "주어진 전략을 사용해 노트 충돌을 해결합니다 (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "병합하지 않은 노트 커밋"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "병합하지 않은 노트를 커밋해 노트 병합을 마칩니다"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "노트 병합 해결 중지"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "노트 병합을 중지합니다"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:794
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "--commit, --abort, -s/--strategy 옵션을 섞어 쓸 수 없습니다"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
 msgstr "병합할 노트 레퍼런스를 지정해야 합니다"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:823
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "알 수 없는 전략(-s/--strategy): %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:860
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
+msgid "a notes merge into %s is already in-progress at %s"
 msgstr "%s 위치로 노트 병합이 이미 %s에서 진행중입니다"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:863
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
+msgid "failed to store link to current notes ref (%s)"
 msgstr "현재 노트 레퍼런스의 (%s) 링크를 저장하는데 실패했습니다."
 
-#: builtin/notes.c:863
+#: builtin/notes.c:865
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
 "'git notes merge --commit', or abort the merge with 'git notes merge --"
 "abort'.\n"
-msgstr "자동 노트 병합이 실패했습니다. %s 안의 충돌을 바로잡고 결과를 'git notes merge --commit' 명령으로 커밋하십시오. 또는 'git notes merge --abort' 명령으로 병합을 중지하십시오.\n"
+msgstr ""
+"자동 노트 병합이 실패했습니다. %s 안의 충돌을 바로잡고 결과를 'git notes "
+"merge --commit' 명령으로 커밋하십시오. 또는 'git notes merge --abort' 명령으"
+"로 병합을 중지하십시오.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "%s 오브젝트에 노트가 없습니다\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "없는 노트를 제거하려는 시도를 오류가 아닌 것으로 취급합니다"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "표준 입력에서 오브젝트 이름을 읽습니다"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "제거하지 않고, 보여주기만 합니다"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:941
 msgid "report pruned notes"
 msgstr "잘라낸 노트를 알립니다"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "노트-레퍼런스"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "<노트-레퍼런스>에서 노트를 사용합니다"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1019
 #, c-format
-msgid "Unknown subcommand: %s"
+msgid "unknown subcommand: %s"
 msgstr "알 수 없는 하위 명령: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<옵션>...] [< <레퍼런스목록> | < <오브젝트목록>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
@@ -9420,166 +10533,162 @@ msgstr ""
 msgid "Writing objects"
 msgstr "오브젝트 쓰는 중"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1068
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "묶음에 들어있지 않은 오브젝트가 있으므로, 비트맵 쓰기를 하지 않습니다"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2344
 msgid "Compressing objects"
 msgstr "오브젝트 압축하는 중"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2747
 #, c-format
 msgid "unsupported index version %s"
 msgstr "지원하지 않는 인덱스 버전 %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2751
 #, c-format
 msgid "bad index version '%s'"
 msgstr "잘못된 인덱스 버전 '%s'"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2781
 msgid "do not show progress meter"
 msgstr "진행률을 표시하지 않습니다"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2783
 msgid "show progress meter"
 msgstr "진행률을 표시합니다"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2785
 msgid "show progress meter during object writing phase"
 msgstr "오브젝트 쓰기 단계에서 진행률을 표시합니다"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2788
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "진행률이 표시될 때 --all-progress와 비슷합니다"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2789
 msgid "version[,offset]"
 msgstr "버전[,오프셋]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2790
 msgid "write the pack index file in the specified idx format version"
 msgstr "지정한 버전의 인덱스 형식에 따라 묶음 인덱스 파일을 씁니다"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2793
 msgid "maximum size of each output pack file"
 msgstr "출력 묶음 파일의 최대 크기"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2795
 msgid "ignore borrowed objects from alternate object store"
 msgstr "보조 오브젝트 저장소에서 빌려온 오브젝트를 무시합니다"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2797
 msgid "ignore packed objects"
 msgstr "묶음 오브젝트를 무시합니다"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2799
 msgid "limit pack window by objects"
 msgstr "묶음 윈도우를 오브젝트 단위로 제한합니다"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2801
 msgid "limit pack window by memory in addition to object limit"
 msgstr "묶음 윈도우를 오브젝트 단위에 추가로 메모리 단위로 제한합니다"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2803
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "결과물 묶음에서 허용되는 최대 길이의 델타 체인"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2805
 msgid "reuse existing deltas"
 msgstr "기존 델타를 재사용합니다"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2807
 msgid "reuse existing objects"
 msgstr "기존 오브젝트를 재사용합니다"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2809
 msgid "use OFS_DELTA objects"
 msgstr "OFS_DELTA 오브젝트를 사용합니다"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2811
 msgid "use threads when searching for best delta matches"
 msgstr "최상의 델타 일치를 검색하는데 스레드를 사용합니다"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2813
 msgid "do not create an empty pack output"
 msgstr "빈 묶음 출력을 만들지 않습니다"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2815
 msgid "read revision arguments from standard input"
 msgstr "표준 입력에서 리비전 인자를 읽습니다"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2817
 msgid "limit the objects to those that are not yet packed"
 msgstr "묶지 않는 오브젝트 수를 제한합니다"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2820
 msgid "include objects reachable from any reference"
 msgstr "모든 레퍼런스에서 접근 가능한 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2823
 msgid "include objects referred by reflog entries"
 msgstr "reflog 항목에서 레퍼런스할 수 있는 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2826
 msgid "include objects referred to by the index"
 msgstr "인덱스에서< 레퍼런스하는 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2829
 msgid "output pack to stdout"
 msgstr "묶음을 표준 출력으로 출력합니다"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2831
 msgid "include tag objects that refer to objects to be packed"
 msgstr "묶음에 들어갈 오브젝트를 레퍼런스하는 태그 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2833
 msgid "keep unreachable objects"
 msgstr "접근 불가능 오브젝트를 보존합니다"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2835
 msgid "pack loose unreachable objects"
 msgstr "느슨한 접근 불가능 오브젝트를 묶습니다"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "시각"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2837
 msgid "unpack unreachable objects newer than <time>"
 msgstr "<시각>보다 새로운 접근 불가능 오브젝트의 묶음을 풉니다"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2840
 msgid "create thin packs"
 msgstr "얇은 묶음을 만듭니다"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2842
 msgid "create packs suitable for shallow fetches"
 msgstr "얕은 가져오기에 적합한 묶음을 만듭니다"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2844
 msgid "ignore packs that have companion .keep file"
 msgstr "해당하는 .keep 파일이 있는 묶음을 무시합니다"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2846
 msgid "pack compression level"
 msgstr "묶음 압축 단계"
 
 # FIXME: graft?
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2848
 msgid "do not hide commits by grafts"
 msgstr "붙어 있는 커밋을 숨기지 않습니다"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2850
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "가능하면 비트맵 인덱스를 사용해 오브젝트 세기 속도를 높입니다"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2852
 msgid "write a bitmap index together with the pack index"
 msgstr "묶음 인덱스와 같이 비트맵 인덱스를 씁니다"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:2979
 msgid "Counting objects"
 msgstr "오브젝트 개수 세는 중"
 
@@ -9607,77 +10716,68 @@ msgstr "중복된 오브젝트 제거"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <시각>] [--] [<헤드>...]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "잘라낸 오브젝트를 알립니다"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
-msgstr "<시각>보다 오래 된 오브젝트ê°\80 ë§\8cë£\8cë\90©ë\8b\88ë\8b¤"
+msgstr "<시각>보다 오래 된 오브젝트를 ë§\8cë£\8cí\95©ë\8b\88ë\8b¤"
 
 #: builtin/prune.c:123
 msgid "cannot prune in a precious-objects repo"
 msgstr "precious-objects 저장소에서 잘라낼 수 없습니다"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "%s의 값이 올바르지 않습니다: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<옵션>] [<저장소> [<레퍼런스명세>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "병합 관련 옵션"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "변경 사항을 적용할 때 병합하는 대신 리베이스합니다"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "정방향 진행을 허용합니다"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "리베이스 전과 후에 stash 및 stash pop을 자동으로 합니다"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "가져오기 관련 옵션"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "병렬적으로 풀을 실행할 하위모듈 개수"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "pull.ff에 대해 잘못된 값: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-"리베이스로 풀을 할 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "추가로, 인덱스에 커밋하지 않은 변경 사항이 있습니다."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"리베이스로 풀을 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
 msgstr "가져온 레퍼런스 중에 리베이스할 대상 후보가 없습니다."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr "가져온 레퍼런스 중에 병합할 대상 후보가 없습니다."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9685,7 +10785,7 @@ msgstr ""
 "보통 이런 경우는 리모트 쪽에는 없는 와일드카드 레퍼런스명세가\n"
 "주어졌을 때 일어납니다."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9696,42 +10796,42 @@ msgstr ""
 "이 리모트는 현재 브랜치에 대해 기본으로 설정된 리모트가\n"
 "아니기 때문에, 명령행에서 브랜치를 지정해야 합니다."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "현재 어떤 브랜치 위에도 있지 않습니다."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "어떤 브랜치를 대상으로 리베이스할지 지정하십시오."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "어떤 브랜치를 대상으로 병합할지 지정하십시오."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "자세한 정보는 git-pull(1) 페이지를 참고하십시오."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<리모트>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:455
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<브랜치>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "현재 브랜치에 추적 정보가 없습니다."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr "이 브랜치에 대한 추적 정보를 설정하려면 다음과 같이 할 수 있습니다:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9740,19 +10840,27 @@ msgstr ""
 "설정에서 리모트의 '%s' 레퍼런스와 병합하도록 지정했지만,\n"
 "그런 레퍼런스를 가져오지 않았습니다."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "리베이스에 대해 --verify-signatures 옵션을 무시합니다"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash 옵션은 --rebase 옵션과 같이 써야 합니다."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "만들어지지 않은 브랜치를 인덱스에 추가된 변경 사항으로 업데이트합니다."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "리베이스로 풀하기"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "커밋하거나 스태시에 넣으십시오."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9763,7 +10871,7 @@ msgstr ""
 "작업 폴더를 %s 커밋에서 정방향\n"
 "진행합니다."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9780,11 +10888,11 @@ msgstr ""
 "$ git reset --hard\n"
 "복구됩니다."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "여러 브랜치를 빈 헤드로 병합할 수 없습니다."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "여러 브랜치로 리베이스할 수 없습니다."
 
@@ -9879,13 +10987,13 @@ msgstr ""
 "'%s' 브랜치의 업스트림이 아닙니다. 어떤 리모트 브랜치에 무엇을\n"
 "푸시할지 설정하지 않았습니다."
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "푸시할 레퍼런스명세를 지정하지 않았고, push.default 값이 'nothing'입니다."
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -9898,7 +11006,7 @@ msgstr ""
 "자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
 "참고하십시오."
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -9911,7 +11019,7 @@ msgstr ""
 "자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
 "참고하십시오."
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -9927,11 +11035,11 @@ msgstr ""
 "자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
 "참고하십시오."
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "리모트에 태그가 이미 있기 때문에 업데이트가 거부되었습니다."
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -9941,22 +11049,22 @@ msgstr ""
 "레퍼런스를 업데이트하거나, 커밋이 아닌 오브젝트를 가리키도록\n"
 "업데이트할 수 없습니다.\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "다음에 푸시: %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "레퍼런스를 '%s'에 푸시하는데 실패했습니다"
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "잘못된 저장소 '%s'"
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -9977,112 +11085,112 @@ msgstr ""
 "\n"
 "    git push <name>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "--all 및 --tags 옵션은 호환되지 않습니다"
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "--all 옵션은 레퍼런스명세와 같이 쓸 수 없습니다"
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror 및 --tags 옵션은 호환되지 않습니다"
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror 옵션은 레퍼런스명세와 같이 쓸 수 없습니다"
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "--all 및 --mirror 옵션은 호환되지 않습니다"
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "저장소"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "모든 레퍼런스 푸시하기"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "모든 레퍼런스 미러"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "레퍼런스 삭제"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "태그 푸시하기 (--all 또는 --mirror 옵션과 같이 쓸 수 없음)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "강제로 업데이트"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "레퍼런스이름>:<예상"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "레퍼런스의 과거 값이 이 값이어야 합니다"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "재귀적 하위 모듈 푸시 방식을 설정합니다"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "얇은 묶음을 사용합니다"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "receive pack 프로그램"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "git pull/status에 대한 업스트림을 설정합니다"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "로컬에서 제거한 레퍼런스를 잘라냅니다"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "푸시 전 후크를 건너뜁니다"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "빠졌지만 관련된 태그를 푸시합니다"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "푸시에 GPG 서명"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "리모트 쪽에 원자 트랜잭션을 요청합니다"
 
-#: builtin/push.c:546
+#: builtin/push.c:549
 msgid "server-specific"
 msgstr "서버-전용-옵션"
 
-#: builtin/push.c:546
+#: builtin/push.c:549
 msgid "option to transmit"
 msgstr "전송할 옵션"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete 옵션은 --all, --mirror, --tags 옵션과 호환되지 않습니다"
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete 옵션은 레퍼런스 없이 앞뒤가 맞지 않습니다"
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr "푸시 옵션에는 줄바꿈 문자가 들어갈 수 없습니다"
 
@@ -10160,15 +11268,62 @@ msgstr "드문 체크아웃 필터 적용을 건너뜁니다"
 msgid "debug unpack-trees"
 msgstr "unpack-trees 디버깅"
 
-#: builtin/receive-pack.c:25
+#: builtin/receive-pack.c:26
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <git-dir>"
 
-#: builtin/receive-pack.c:1845
+#: builtin/receive-pack.c:793
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"기본값으로 간략한 저장소가 아닌 현재 브랜치의 업데이트는 거부됩니다.\n"
+"업데이트하면 인덱스와 작업 트리가 푸시한 내용과 일치하지 않게 되므로,\n"
+"'git reset --hard'로 작업 트리를 HEAD에 맞춰야 합니다.\n"
+"\n"
+"리모트 저장소에서 'receive.denyCurrentBranch' 설정 변수를 'ignore'나\n"
+"'warn'으로 설정하면 현재 브랜치로 푸시할 수 있습니다. 하지만 작업\n"
+"트리의 내용을 푸시할 내용에 맞추는 게 아니라면 추천하지 않습니다.\n"
+"\n"
+"이 메시지를 보지 않고 기본 동작을 계속 하려면,\n"
+"'receive.denyCurrentBranch' 설정 변수를 'refuse'로 설정하십시오."
+
+#: builtin/receive-pack.c:813
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"기본값으로, 현재 브랜치의 삭제는 거부됩니다. 다음에 'git clone'할 때\n"
+"아무 파일도 체크아웃하지 않게 되므로 혼동을 일으키기 때문입니다.\n"
+"\n"
+"'receive.denyDeleteCurrent' 설정 변수를 'ignore'나 'warn'으로 설정하면\n"
+"(경고 메시지를 포함하거나 포함하지 않고) 현재 브랜치를 삭제할 수\n"
+"있습니다.\n"
+"\n"
+"이 메시지를 보지 않으려면, 이 설정 변수를 'refuse'로 설정하십시오."
+
+#: builtin/receive-pack.c:1883
 msgid "quiet"
 msgstr "출력 않기"
 
-#: builtin/receive-pack.c:1859
+#: builtin/receive-pack.c:1897
 msgid "You must specify a directory."
 msgstr "디렉터리를 지정해야 합니다."
 
@@ -10495,7 +11650,7 @@ msgstr "* 리모트 %s"
 msgid "  Fetch URL: %s"
 msgstr "  가져오기 URL: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(URL 없음)"
 
@@ -10531,7 +11686,7 @@ msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  리모트 브랜치:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (상태를 질의하지 않음)"
 
@@ -10544,220 +11699,233 @@ msgstr[0] "  'git pull'에 사용할 로컬 브랜치를 설정:"
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  로컬 레퍼런스를 'git push'로 미러링할 예정"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1202
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  로컬 레퍼런스를 'git push'로 미러링%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "레퍼런스/리모트/<이름>/HEAD 값을 리모트에 맞게 설정합니다"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "레퍼런스/리모트/<이름>/HEAD 값을 삭제합니다"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "리모트 HEAD를 결정할 수 없습니다"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "리모트 HEAD 브랜치가 여러개입니다. 다음 중 하나를 명시적으로 지정하십시오:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "%s을(를) 삭제할 수 없습니다"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "올바른 레퍼런스가 아닙니다: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "%s을(를) 설정할 수 없습니다"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s의 연결이 끊어집니다!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s의 연결이 끊어졌습니다!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "잘라냄: %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [잘라낼 예정] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [잘라냄] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "가져온 후에 리모트를 잘라냅니다"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "그런 리모트가 없습니다 ('%s')"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "브랜치를 추가합니다"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "리모트를 지정하지 않았습니다"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "가져오기 URL이 아니라 푸시 URL을 질의합니다"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "모든 URL을 리턴합니다"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "'%s' 리모트에 대한 URL을 설정하지 않았습니다"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "푸시 URL을 지정합니다"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "URL을 추가합니다"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "URL을 삭제합니다"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete 옵션을 둘다 쓰면 안 됩니다"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "잘못된 오래전 URL 패턴: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "그런 URL이 없습니다: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "푸시용이 아닌 모든 URL을 삭제하지 않습니다"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "자세히 표시합니다 (하위 명령 앞에 와야 합니다)"
 
+#: builtin/remote.c:1622
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "알 수 없는 하위 명령: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<옵션>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"점진적인 repack은 비트맵 인덱스와 호환되지 않습니다.\n"
+"--no-write-bitmap-index를 사용하거나 pack.writebitmaps 설정을 끄십시오."
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "하나의 묶음 안에 모두 묶습니다"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "-a와 동일하고, 접근 불가능 오브젝트를 느슨하게 바꿉니다"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "여분의 묶음을 제거하고, git-prune-packed를 실행합니다"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "git-pack-objects에 --no-reuse-delta 옵션을 넘깁니다"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "git-pack-objects에 --no-reuse-object 옵션을 넘깁니다"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "git-update-server-info를 실행하지 않습니다"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "git-pack-objects에 --local 옵션을 넘깁니다"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "비트맵 인덱스를 씁니다"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "대략의시각"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr ""
 "-A에 추가로, 지정한 시각보다 오래된 오브젝트를 느슨하게 만들지 않습니다"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "-a와 같이, 접근 불가능 오브젝트를 다시 묶습니다"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
 msgstr "델타 압축에 사용할 윈도우 크기"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "바이트수"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "위와 동일하지만, 항목 수 대신 메모리 크기를 제한합니다"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
 msgstr "최대 델타 깊이를 제한합니다"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "묶음 파일의 최대 크기"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr ".keep으로 표시된 묶음의 오브젝트를 다시 묶습니다"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "precious-objects 저장소의 묶음을 삭제할 수 없습니다"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable 및 -A 옵션은 호환되지 않습니다"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "'%s' 제거에 실패했습니다"
@@ -10862,8 +12030,8 @@ msgid ""
 msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<커밋>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <트리-따위> [--] <경로>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<트리-따위>] [--] <경로>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -10983,27 +12151,27 @@ msgstr "인덱스 파일을 '%s' 리비전으로 리셋할 수 없습니다."
 msgid "Could not write new index file."
 msgstr "새 인덱스 파일을 쓸 수 없습니다."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list는 노트 표시를 지원하지 않습니다"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:391
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<옵션>] -- [<인자>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:396
 msgid "keep the `--` passed as an arg"
 msgstr "인자로 넘긴 `--`를 유지합니다"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:398
 msgid "stop parsing after the first non-option argument"
 msgstr "첫번째 옵션이 아닌 인자 뒤에 파싱을 중지합니다"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:401
 msgid "output in stuck long form"
 msgstr "stuck long 형식으로 출력합니다"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:532
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11096,7 +12264,7 @@ msgstr "여분의 빈 커밋을 유지합니다"
 msgid "revert failed"
 msgstr "되돌리기 실패"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "cherry-pick 실패"
 
@@ -11104,26 +12272,7 @@ msgstr "cherry-pick 실패"
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<옵션>] [--] <파일>..."
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"다음 하위 모듈이 (또는 그 내부 하위 모듈이) .git\n"
-"디렉터리를 사용합니다:"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(정말로 그 커밋 내역까지 포함해 제거하려면 'rm -rf'를 사용하십시오)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11134,7 +12283,7 @@ msgstr[0] ""
 "다음 파일에 파일과 HEAD 모두 다른 스테이징한 내용이\n"
 "있습니다:"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11142,12 +12291,12 @@ msgstr ""
 "\n"
 "(강제로 제거하려면 -f 옵션을 사용하십시오)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
 msgstr[0] "다음 파일이 인덱스에 스테이징한 변경 사항이 있습니다:"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11155,41 +12304,46 @@ msgstr ""
 "\n"
 "(파일을 유지하려면 --cached 옵션, 강제로 제거하려면 -f 옵션을 사용하십시오)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "다음 파일에 로컬 수정 사항이 있습니다:"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "제거한 파일 목록을 표시하지 않습니다"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "인덱스에서만 제거합니다"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "최신 버전 확인을 하지 않습니다"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "재귀적 제거를 허용합니다"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "아무 것도 일치하지 않으면 상태 0번으로 끝납니다"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "-r 옵션이 없으면 재귀적으로 '%s'을(를) 제거하지 않습니다"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm: %s을(를) 제거할 수 없습니다"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "'%s'을(를) 제거할 수 없습니다"
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11222,23 +12376,27 @@ msgstr "리모트 도움 프로그램의 상태를 표시합니다"
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [<옵션>] [<리비전-범위>] [[--] [<경로>...]]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:249
+msgid "Group by committer rather than author"
+msgstr "작성자가 아닌 커미터로 묶습니다"
+
+#: builtin/shortlog.c:251
 msgid "sort output according to the number of commits per author"
 msgstr "작성자별 커밋 수에 따라 정렬합니다"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:253
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr "커밋 설명을 생략하고, 커밋 수만 표시합니다"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:255
 msgid "Show the email address of each author"
 msgstr "작성자의 전자메일 주소를 표시합니다"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:256
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:257
 msgid "Linewrap output"
 msgstr "줄바꿈 출력"
 
@@ -11258,70 +12416,123 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<베이스>]] [--list] [<레퍼런스>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:375
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "%s 무시. 레퍼런스를 %d개보다 많이 처리할 수 없습니다"
+
+#: builtin/show-branch.c:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "%s와(과) 일치하는 레퍼런스가 없습니다"
+
+#: builtin/show-branch.c:639
 msgid "show remote-tracking and local branches"
 msgstr "리모트 추적 및 로컬 브랜치를 표시합니다"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:641
 msgid "show remote-tracking branches"
 msgstr "리모트 추적 브랜치를 표시합니다"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "브랜치에 따른 '*!+-' 표시에 색을 입힙니다"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 msgid "show <n> more commits after the common ancestor"
 msgstr "공통 이전 커밋 뒤의 <n>개의 커밋을 표시합니다"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:647
 msgid "synonym to more=-1"
 msgstr "--more=-1 옵션과 동일"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "이름 문자열을 표시하지 않습니다"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "현재 브랜치를 포함"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 msgid "name commits with their object names"
 msgstr "커밋의 이름을 그 오브젝트 이름으로 붙입니다"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:654
 msgid "show possible merge bases"
 msgstr "가능한 병합 기준점을 표시합니다"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 msgid "show refs unreachable from any other ref"
 msgstr "다른 어떤 레퍼런스에서도 접근 불가능한 레퍼런스를 표시합니다"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:658
 msgid "show commits in topological order"
 msgstr "위상 순서에 따라 커밋을 표시합니다"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 msgid "show only commits not on the first branch"
 msgstr "첫 브랜치에 없는 커밋만 표시합니다"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:663
 msgid "show merges reachable from only one tip"
 msgstr "하나의 끝에서만 접근 가능한 병합을 표시합니다"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:665
 msgid "topologically sort, maintaining date order where possible"
 msgstr "가능하면 시간 순서를 유지하면서 위상 순서로 정렬"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<베이스>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "기준부터 시작해 최대 <n>개의 최근 ref-log 항목을 표시합니다"
 
+#: builtin/show-branch.c:703
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog 옵션은 --all, --remotes, --independent, --merge-base 옵션과 호환되"
+"지 않습니다"
+
+#: builtin/show-branch.c:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "브랜치를 지정하지 않았고, HEAD가 올바르지 않습니다"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "--reflog 옵션은 브랜치 이름이 필요합니다"
+
+#: builtin/show-branch.c:733
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "한 번에 %d개 항목만 표시할 수 있습니다."
+
+#: builtin/show-branch.c:737
+#, c-format
+msgid "no such ref %s"
+msgstr "그런 레퍼런스가 없습니다: %s"
+
+#: builtin/show-branch.c:829
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "레퍼런스를 %d개보다 많이 처리할 수 없습니다."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s'은(는) 올바른 레퍼런스가 아닙니다."
+
+#: builtin/show-branch.c:836
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "%s 커밋을 찾을 수 없음 (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11334,35 +12545,35 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<패턴>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "태그만 표시 (헤드와 결합 가능)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "헤드만 표시 (태그와 결합 가능)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr "더 엄격한 레퍼런스 검사, 정확히 하나의 레퍼런스 경로 필요"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "HEAD 레퍼런스를 표시합니다 (필터링되서 제외되더라도)"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
 msgstr "태그를 오브젝트 ID로 따라갑니다"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "SHA-1 표시에 <n>개의 숫자만 사용합니다"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "표준 출력에 결과를 표시하지 않습니다 (--verify 옵션과 사용하면 좋음)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr "로컬 저장소에 없는 레퍼런스를 표준 입력에서 읽어 표시합니다"
 
@@ -11382,12 +12593,12 @@ msgstr "주석 문자로 시작하는 모든 줄을 건너뛰고 제거합니다
 msgid "prepend comment character and space to each line"
 msgstr "각 줄의 앞에 주석 문자와 공백을 붙입니다"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1062
 #, c-format
 msgid "No such ref: %s"
 msgstr "그런 레퍼런스가 없습니다: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1071
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "전체 레퍼런스 이름이 필요하지만, 입력은 %s"
@@ -11397,74 +12608,92 @@ msgstr "전체 레퍼런스 이름이 필요하지만, 입력은 %s"
 msgid "cannot strip one component off url '%s'"
 msgstr "'%s' URL 하나의 단계를 잘라낼 수 없습니다"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:592
 msgid "alternative anchor for relative paths"
 msgstr "상대 경로에 사용할 또다른 기준"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<경로>] [<경로>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:333 builtin/submodule--helper.c:347
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr ".gitmodules에서 하위 모듈 경로 '%s'에 대한 URL이 없습니다"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:373
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "하위 모듈 경로 '%s'에 대한 URL을 등록하는데 실패했습니다"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:377
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "'%3$s' 경로에 대해 '%1$s' (%2$s) 하위 모듈 등록\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:387
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "경고: '%s' 하위 모듈에 대해 커맨드 업데이트 모드가 제안되었습니다\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:394
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr "'%s' 하위 모듈에 대해 업데이트 모드 등록이 실패했습니다"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:410
 msgid "Suppress output for initializing a submodule"
 msgstr "하위 모듈 초기화에 출력을 하지 않습니다"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:415
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<경로>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:436
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <경로>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:442
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "경로 '%s'에 대해 .gitmodules에 있는 하위모듈 매핑이 없습니다"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:525 builtin/submodule--helper.c:528
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "'%s' 하위 모듈에 보조 오브젝트를 추가할 수 없습니다: %s"
+
+#: builtin/submodule--helper.c:564
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "submodule.alternateErrorStrategy에 대한 값이('%s') 알 수 없는 값입니다"
+
+#: builtin/submodule--helper.c:571
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "submodule.alternateLocation에 대한 값이('%s') 알 수 없는 값입니다"
+
+#: builtin/submodule--helper.c:595
 msgid "where the new submodule will be cloned to"
 msgstr "새 하위 모듈을 복제할 대상 위치"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:598
 msgid "name of the new submodule"
 msgstr "새 하위 모듈 이름"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:601
 msgid "url where to clone the submodule from"
 msgstr "하위 모듈을 복제해 올 URL"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:607
 msgid "depth for shallow clones"
 msgstr "얕은 복제에 사용할 깊이"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:610 builtin/submodule--helper.c:980
+msgid "force cloning progress"
+msgstr "복제 진행 상황을 항상 표시합니다"
+
+#: builtin/submodule--helper.c:615
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11472,108 +12701,118 @@ msgstr ""
 "git submodule--helper clone [--prefix=<경로>] [--quiet] [--reference <저장소"
 ">] [--name <이름>] [--depth <깊이>] --url <url> --path <경로>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "'%s' 디렉터리를 만들 수 없습니다"
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:646
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "'%s'에서 하위 모듈 경로 '%s'에 복제하는데 실패했습니다"
 
-#: builtin/submodule--helper.c:547
+#: builtin/submodule--helper.c:662
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "'%s' 파일을 열 수 없습니다"
 
-#: builtin/submodule--helper.c:552
+#: builtin/submodule--helper.c:667
 #, c-format
 msgid "could not close file %s"
 msgstr "%s 파일을 닫을 수 없습니다"
 
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:674
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "'%s'에 대한 하위 모듈 디렉터리를 가져올 수 없습니다"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:742
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "'%s' 하위 모듈 경로가 초기화되지 않았습니다"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:746
 msgid "Maybe you want to use 'update --init'?"
 msgstr "'update --init'을 하려고 한 것 아니었습니까?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:772
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "병합하지 하위 모듈 %s 건너뜀"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "하위 모듈 '%s' 건너뜀"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:929
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "'%s' 복제하는데 실패했습니다. 재시도 예정"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:940
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "두번째 '%s' 복제하는데 실패했습니다. 중지합니다"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:961 builtin/submodule--helper.c:1105
 msgid "path into the working tree"
 msgstr "작업 폴더로 가는 경로"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:964
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "작업 폴더로 가는 경로, 내장된 하위 모듈의 경계 통과"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:968
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout 또는 none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:972
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "지정한 개수의 리비전에서 잘린 얕은 복제를 만듭니다"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:975
 msgid "parallel jobs"
 msgstr "병렬 작업 개수"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:977
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "최초 복제가 얕은 복제 추천을 따를지 여부"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:978
 msgid "don't print cloning progress"
 msgstr "복제 과정을 표시하지 않습니다"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:985
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<경로>] [<경로>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:995
 msgid "bad value for update parameter"
 msgstr "파라미터 업데이트에 값이 잘못되었습니다"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1066
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
 "the superproject is not on any branch"
-msgstr "하위 모듈 (%s) 브랜치가 상위 프로젝트 브랜치를 이어받도록 설정되었지만, 상위 프로젝트에 브랜치가 없습니다"
+msgstr ""
+"하위 모듈 (%s) 브랜치가 상위 프로젝트 브랜치를 이어받도록 설정되었지만, 상위 "
+"프로젝트에 브랜치가 없습니다"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1106
+msgid "recurse into submodules"
+msgstr "하위 모듈에 재귀적으로 적용"
+
+#: builtin/submodule--helper.c:1112
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir [<경로>...]"
+
+#: builtin/submodule--helper.c:1157
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "submodule--helper 하위 명령은 하위 명령으로 호출해야 합니다"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1164
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s에서 --super-prefix 옵션을 지원하지 않습니다"
+
+#: builtin/submodule--helper.c:1170
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s'은(는) 올바른 submodule--helper 하위 명령이 아닙니다"
@@ -11627,25 +12866,25 @@ msgstr ""
 "\t\t[--format=<형식>] [--[no-]merged [<커밋>]] [<패턴>...]"
 
 #: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <태그이름>..."
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<형식>] <태그이름>..."
 
-#: builtin/tag.c:81
+#: builtin/tag.c:82
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "태그 이름이 너무 깁니다: %.*s..."
 
-#: builtin/tag.c:86
+#: builtin/tag.c:87
 #, c-format
 msgid "tag '%s' not found."
 msgstr "'%s' 태그가 없습니다."
 
-#: builtin/tag.c:101
+#: builtin/tag.c:102
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "'%s' 태그 삭제함 (과거 %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:131
 #, c-format
 msgid ""
 "\n"
@@ -11658,7 +12897,7 @@ msgstr ""
 "  %s\n"
 "'%c' 문자로 시작하는 줄은 무시됩니다.\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:135
 #, c-format
 msgid ""
 "\n"
@@ -11672,143 +12911,143 @@ msgstr ""
 "  %s\n"
 "'%c' 문자로 시작하는 줄은 유지됩니다. 제거하려면 직접 지워야 합니다.\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:213
 msgid "unable to sign the tag"
 msgstr "태그에 서명할 수 없습니다"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:215
 msgid "unable to write tag file"
 msgstr "태그 파일을 쓸 수 없습니다"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:240
 msgid "bad object type."
 msgstr "잘못된 오브젝트 종류."
 
-#: builtin/tag.c:239
+#: builtin/tag.c:253
 msgid "tag header too big."
 msgstr "태그 헤더가 너무 큽니다."
 
-#: builtin/tag.c:275
+#: builtin/tag.c:289
 msgid "no tag message?"
 msgstr "태그 메시지 없음?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:295
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "태그 메시지가 %s 파일에 남아 있습니다\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:354
 msgid "list tag names"
 msgstr "태그 이름 목록을 표시합니다"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:356
 msgid "print <n> lines of each tag message"
 msgstr "각 태그 메시지의 <n>줄을 표시합니다"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:358
 msgid "delete tags"
 msgstr "태그를 삭제합니다"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:359
 msgid "verify tags"
 msgstr "태그를 검증합니다"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:361
 msgid "Tag creation options"
 msgstr "태그 만들기 옵션"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:363
 msgid "annotated tag, needs a message"
 msgstr "주석 달린 태그, 메시지가 필요합니다"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:365
 msgid "tag message"
 msgstr "태그 메시지"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:367
 msgid "annotated and GPG-signed tag"
 msgstr "주석 달리고 GPG 서명한 태그"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:371
 msgid "use another key to sign the tag"
 msgstr "태그를 서명하는데 지정한 키를 사용합니다"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:372
 msgid "replace the tag if exists"
 msgstr "태그가 있으면 바꿉니다"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:373 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "reflog를 만듭니다"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:375
 msgid "Tag listing options"
 msgstr "태그 목록 보기 옵션"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:376
 msgid "show tag list in columns"
 msgstr "태그 목록을 여러 열로 표시합니다"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:377 builtin/tag.c:378
 msgid "print only tags that contain the commit"
 msgstr "해당 커밋이 들어 있는 태그만 표시합니다"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:379
 msgid "print only tags that are merged"
 msgstr "병합된 태그만 표시합니다"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:380
 msgid "print only tags that are not merged"
 msgstr "병합되지 않은 태그만 표시합니다"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:385
 msgid "print only tags of the object"
 msgstr "해당 오브젝트의 태그만 표시합니다"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:415
 msgid "--column and -n are incompatible"
 msgstr "--column 및 -n 옵션은 호환되지 않습니다"
 
-#: builtin/tag.c:419
+#: builtin/tag.c:437
 msgid "-n option is only allowed with -l."
 msgstr "-n 옵션은 -l 옵션과 같이 써야 합니다."
 
-#: builtin/tag.c:421
+#: builtin/tag.c:439
 msgid "--contains option is only allowed with -l."
 msgstr "--contains 옵션은 -l 옵션과 같이 써야 합니다."
 
-#: builtin/tag.c:423
+#: builtin/tag.c:441
 msgid "--points-at option is only allowed with -l."
 msgstr "--points-at 옵션은 -l 옵션과 같이 써야 합니다."
 
-#: builtin/tag.c:425
+#: builtin/tag.c:443
 msgid "--merged and --no-merged option are only allowed with -l"
 msgstr "--merged 및 --no-merged 옵션은 -l 옵션과 같이 써야 합니다."
 
-#: builtin/tag.c:433
+#: builtin/tag.c:454
 msgid "only one -F or -m option is allowed."
 msgstr "하나의 -F 또는 -m 옵션만 쓸 수 있습니다."
 
-#: builtin/tag.c:452
+#: builtin/tag.c:473
 msgid "too many params"
 msgstr "파라미터가 너무 많습니다"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:479
 #, c-format
 msgid "'%s' is not a valid tag name."
-msgstr "'%s'은9는) 올바른 태그 이름이 아닙니다."
+msgstr "'%s'은(는) 올바른 태그 이름이 아닙니다."
 
-#: builtin/tag.c:463
+#: builtin/tag.c:484
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "태그 '%s'이(가) 이미 있습니다"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:512
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "태그 '%s' 업데이트 (과거 %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "오브젝트 묶음 푸는 중"
 
@@ -11870,132 +13109,148 @@ msgstr "디렉터리를 삭제한 후에 디렉터리 정보가 바뀌지 않았
 msgid " OK"
 msgstr " 오케이"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:564
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<옵션>] [--] [<파일>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 msgid "continue refresh even when index needs update"
 msgstr "인덱스에 업데이트가 필요하더라도 새로 고침을 계속합니다"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:922
 msgid "refresh: ignore submodules"
 msgstr "새로 고침: 하위 모듈 무시"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "새 파일을 무시할 수 않습니다"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 msgid "let files replace directories and vice-versa"
 msgstr "디렉터리를 파일로, 또는 그 반대로 바꿀 수 있게 허용합니다"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:929
 msgid "notice files missing from worktree"
 msgstr "작업폴더에서 알림 파일이 없습니다"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:931
 msgid "refresh even if index contains unmerged entries"
 msgstr "인덱스에 병합하지 않은 항목이 있어도 새로 고칩니다"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:934
 msgid "refresh stat information"
 msgstr "파일 정보를 새로 고칩니다"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "--refresh와 동일하지만, assume-unchanged 설정을 무시합니다"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:942
 msgid "<mode>,<object>,<path>"
 msgstr "<모드>,<오브젝트>,<경로>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "지정한 항목을 인덱스에 추가합니다"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "파일을 \"바꾸지 않음\"으로 표시합니다"
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "바꾸지 않음으로 가정 (assumed-unchanged) 비트를 지웁니다"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "파일을 인덱스 전용으로 (\"index-only\") 표시합니다"
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "작업폴더 건너뛰기 (skip-worktree) 비트를 지웁니다"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:964
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "인덱스에만 추가합니다. 내용을 오브젝트 데이터베이스에 추가하지 않습니다"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:966
 msgid "remove named paths even if present in worktree"
 msgstr "작업 폴더에 있어도 해당 경로를 제거합니다"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:968
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "--stdin과 같이 사용: 입력 줄은 NUL 바이트로 끝납니다"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:970
 msgid "read list of paths to be updated from standard input"
 msgstr "표준 입력에서 업데이트할 경로의 목록을 읽습니다"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:974
 msgid "add entries from standard input to the index"
 msgstr "표준 입력에서 읽은 항목을 인덱스에 추가합니다"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:978
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "경로 목록에 대해 #2 및 #3 스테이징을 다시 합니다"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:982
 msgid "only update entries that differ from HEAD"
 msgstr "HEAD와 다른 항목만 업데이트합니다"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:986
 msgid "ignore files missing from worktree"
 msgstr "작업 폴더에 없는 파일을 무시합니다"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:989
 msgid "report actions to standard output"
 msgstr "표준 출력에 동작을 알립니다"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "저장한 해결되지 않은 충돌을 무시합니다 (사용자용 명령 용도)"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:995
 msgid "write index in this format"
 msgstr "인덱스를 이 형식으로 씁니다"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "스플릿 인덱스를 켜거나 끕니다"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "추적하지 않는 캐시 사용을 켜거나 끕니다"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 msgid "test if the filesystem supports untracked cache"
 msgstr "파일 시스템이 추적하지 않는 캐시를 지원하는지 검사합니다"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1003
 msgid "enable untracked cache without testing the filesystem"
 msgstr "파일 시스템 시험 없이 추적하지 않는 캐시를 사용합니다"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1120
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache값이 참입니다. 정말로 추적하지 않는 파일 캐시를 사용하지 "
+"않으려면 이 값을 제거하거나 바꾸십시오."
+
+#: builtin/update-index.c:1124
 msgid "Untracked cache disabled"
-msgstr "추적되지 않는 캐시를 사용하지 않습니다"
+msgstr "추적되지 않는 파일 캐시를 사용하지 않습니다"
+
+#: builtin/update-index.c:1132
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache값이 거짓입니다. 정말로 추적하지 않는 파일 캐시를 사용하려"
+"면 이 값을 제거하거나 바꾸십시오."
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1136
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "'%s'에 대해 추적되지 않는 캐시를 사용하지 않습니다"
@@ -12044,7 +13299,7 @@ msgstr "git verify-commit [-v | --verbose] <커밋>..."
 msgid "print commit contents"
 msgstr "커밋 내용을 표시합니다"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "원본 GPG 상태를 출력합니다"
 
@@ -12060,11 +13315,11 @@ msgstr "자세히 표시"
 msgid "show statistics only"
 msgstr "통계만 표시"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <태그>..."
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<형식>] <태그>..."
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "태그 내용 표시"
 
@@ -12113,6 +13368,14 @@ msgstr "worktrees/%s 제거: gitdir 파일이 올바르지 않습니다"
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "worktrees/%s 제거: gitdir 파일이 없는 위치를 가리킵니다"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "잘라낸 작업 폴더를 알립니다"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "<시각>보다 오래 된 작업 폴더를 만료합니다"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
@@ -12148,30 +13411,30 @@ msgstr "새 작업 폴더를 만듭니다"
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B, --detach 옵션 중 하나만 쓸 수 있습니다"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:472
 msgid "reason for locking"
 msgstr "잠그는 이유"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:484 builtin/worktree.c:517
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "'%s'은(는) 작업 폴더가 아닙니다"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:486 builtin/worktree.c:519
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "메인 작업 폴더를 잠그거나 잠금 해제할 수 없습니다"
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:491
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "'%s'은(는) 이미 잠겼습니다. 이유: %s"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:493
 #, c-format
 msgid "'%s' is already locked"
 msgstr "'%s'은(는) 이미 잠겼습니다"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:521
 #, c-format
 msgid "'%s' is not locked"
 msgstr "'%s'은(는) 잠기지 않았습니다"
@@ -12192,26 +13455,40 @@ msgstr "하위 디렉터리 <접두어>에 대해 트리 오브젝트를 씁니
 msgid "only useful for debugging"
 msgstr "디버깅 용도로만 사용"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<옵션>] <디렉터리>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1036
 msgid "quit after a single request/response exchange"
 msgstr "하나의 요청/응답 교환 뒤에 끝납니다"
 
-#: upload-pack.c:839
+#: upload-pack.c:1038
 msgid "exit immediately after initial ref advertisement"
 msgstr "최초 레퍼런스 알림 뒤에 즉시 끝납니다"
 
-#: upload-pack.c:841
+#: upload-pack.c:1040
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr "<디렉터리>가 깃 디렉터리가 아니면 <디렉터리>/.git/ 폴더를 시도하지 않습니다."
+msgstr ""
+"<디렉터리>가 깃 디렉터리가 아니면 <디렉터리>/.git/ 폴더를 시도하지 않습니다."
 
-#: upload-pack.c:843
+#: upload-pack.c:1042
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "<n>초 동안 반응이 없으면 전송을 중지합니다"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"소켓 디렉터리의 권한이 너무 느슨합니다. 다른 사용자가\n"
+"캐시에 들어 있는 비밀 정보를 읽을 수 있습니다. 다음을 실행해 보십시오:\n"
+"\n"
+"\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "디버깅 메시지를 표준오류로 출력합니다"
@@ -12226,10 +13503,31 @@ msgstr ""
 "목록을 볼 수 있습니다. 특정 하위 명령어나 개념에 대해 읽어 보려면 'git help\n"
 "<명령>' 또는 'git help <개념>' 명령을 실행하십시오."
 
-#: http.c:323
+# HTTP delegation
+#: http.c:344
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "딜리게이션 컨트롤은 cURL 7.44.0 앞 버전에서는 지원하지 않습니다"
+
+#: http.c:353
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "공개 키 고정은 cURL 7.44.0 앞 버전에서는 지원하지 않습니다"
 
+#: http.c:1713
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"리다이렉션에서 URL 베이스를 업데이트할 수 없습니다:\n"
+"       요청: %s\n"
+" 리다이렉트: %s"
+
+#: remote-curl.c:319
+#, c-format
+msgid "redirecting to %s"
+msgstr "%s(으)로 리다이렉트"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "작업 공간 시작 (참고: git help tutorial)"
@@ -12342,15 +13640,15 @@ msgstr "만료-시각"
 msgid "no-op (backward compatibility)"
 msgstr "아무 동작도 하지 않음 (호환용)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "더 자세히 표시합니다"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "더 간략히 표시합니다"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "SHA-1 표시에 <n>개의 숫자를 사용합니다"
 
@@ -12566,7 +13864,7 @@ msgid "Automated merge did not work."
 msgstr "자동 병합이 동작하지 않았습니다."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "옥토퍼스 전략 병합을 할 수 없습니다."
 
 #: git-merge-octopus.sh:73
@@ -12593,7 +13891,7 @@ msgstr "$pretty_name에 간단한 병합 시도합니다"
 msgid "Simple merge did not work, trying automatic merge."
 msgstr "간단한 병합이 동작하지 않습니다. 자동 병합을 시도합니다."
 
-#: git-rebase.sh:56
+#: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12605,51 +13903,37 @@ msgstr ""
 "원래 브랜치를 체크아웃하고 리베이스를 중지하려면, \"git rebase --abort\"를 실"
 "행하십시오."
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:157 git-rebase.sh:396
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "'$head_name' 위치로 돌아갈 수 없습니다"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "자동스태시 적용."
-
-#: git-rebase.sh:170
+#: git-rebase.sh:171
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "\"$stash_sha1\"을(를) 저장할 수 없습니다"
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"자동스태시 적용에 충돌이 발생했습니다.\n"
-"변경 사항은 스태시 안에 안전하게 들어 있습니다.\n"
-"언제든지 \"git stash pop\" 또는 \"git stash drop\"을 실행할 수 있습니다.\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:211
 msgid "The pre-rebase hook refused to rebase."
 msgstr "리베이스 전 후크에서 리베이스를 거부했습니다."
 
-#: git-rebase.sh:215
+#: git-rebase.sh:216
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "git-am이 진행 중인 것처럼 보입니다. 리베이스할 수 없습니다."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:357
 msgid "No rebase in progress?"
 msgstr "리베이스가 진행 중이지 않습니다"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:368
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "--edit-todo 동작은 대화형 리베이스에서만 사용할 수 있습니다."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:375
 msgid "Cannot read HEAD"
 msgstr "HEAD를 읽을 수 없습니다"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:378
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -12657,7 +13941,7 @@ msgstr ""
 "모든 병합 충돌을 편집하고 git add\n"
 "명령으로 해결되었다고 표시해야 합니다"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:418
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12678,64 +13962,64 @@ msgstr ""
 "이 명령을 다시 실행하십시오. 중요한 사항이 남아 있을 경우를\n"
 "대비해 여기서 멈춥니다."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:469
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "잘못된 업스트림 $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:493
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: 여러 개의 병합 베이스가 있습니다"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:496 git-rebase.sh:500
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: 병합 베이스가 없습니다"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:505
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "올바른 커밋을 가리키지 않습니다: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:528
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "치명적 이상: 그런 브랜치가 없습니다: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:561
 msgid "Cannot autostash"
 msgstr "자동 스태시를 할 수 없습니다"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:566
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "자동 스태시를 만들었습니다: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:570
 msgid "Please commit or stash them."
 msgstr "커밋하거나 스태시에 넣으십시오."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:594
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다. 강제 리베이스합니다."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:605
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "변경 사항 '$mb'에서 '$onto'(으)로:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:614
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "작업 사항을 다시 넣기 위해 먼저 헤드를 뒤로 돌립니다..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:624
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name 브랜치를 $onto_name 위치로 정방향 진행합니다."
@@ -12752,6 +14036,10 @@ msgstr "아직 최초 커밋이 없습니다"
 msgid "Cannot save the current index state"
 msgstr "현재 인덱스 상태를 저장할 수 없습니다"
 
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "추적하지 않는 파일을 저장할 수 없습니다"
+
 #: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "현재 작업 폴더 상태를 저장할 수 없습니다"
@@ -12792,6 +14080,11 @@ msgstr ""
 "오류: 'stash save'에 대해 알 수 없는 옵션: $option\n"
 "       메시지를 넘기려면, 다음과 같이 쓰십시오: git stash save -- '$option'"
 
+#: git-stash.sh:251
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr ""
+"--patch 옵션과 --include-untracked 또는 --all 옵션을 동시에 쓸 수 없습니다"
+
 #: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "저장할 로컬 변경 사항이 없습니다"
@@ -12813,86 +14106,90 @@ msgstr "작업 폴더와 $stash_msg 인덱스 상태를 저장했습니다"
 msgid "Cannot remove worktree changes"
 msgstr "작업폴더 변경 사항을 제거할 수 없습니다"
 
-#: git-stash.sh:404
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "알 수 없는 옵션: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:416
 msgid "No stash found."
 msgstr "스태시가 없습니다."
 
-#: git-stash.sh:421
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "너무 많은 리비전을 지정했습니다: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference은(는) 올바른 레퍼런스가 아닙니다"
 
-#: git-stash.sh:455
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args'은(는) 스태시 커밋이 아닙니다"
 
-#: git-stash.sh:466
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args'은(는) 스태시 레퍼런스가 아닙니다"
 
-#: git-stash.sh:474
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "인덱스를 새로 고칠 수 없습니다"
 
-#: git-stash.sh:478
+#: git-stash.sh:489
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "병합 도중에 스태시를 적용할 수 없습니다"
 
-#: git-stash.sh:486
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "인덱스에 충돌. --index 없이 시도해 보십시오."
 
-#: git-stash.sh:488
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "인덱스 트리를 저장할 수 없습니다"
 
-#: git-stash.sh:522
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "스태시에서 추적하지 않는 파일을 복구할 수 없습니다"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "수정한 파일을 스테이지에서 뺄 수 없습니다"
 
-#: git-stash.sh:537
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "인덱스가 스태시에서 빠졌습니다."
 
-#: git-stash.sh:551
+#: git-stash.sh:562
 msgid "The stash is kept in case you need it again."
 msgstr "다시 필요할 때를 대비해 스태시를 보관합니다."
 
-#: git-stash.sh:560
+#: git-stash.sh:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} 지움 ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: 스태시 항목을 지울 수 없습니다"
 
-#: git-stash.sh:569
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "브랜치 이름을 지정하지 않았습니다"
 
-#: git-stash.sh:641
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(복구하려면 \"git stash apply\"를 실행하십시오)"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "상대 경로는 작업 폴더의 최상위에서만 쓸 수 있습니다"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "저장소 URL: '$repo' 값은 절대 경로거나 ./ 또는 ../로 시작해야 합니다."
@@ -12902,7 +14199,12 @@ msgstr "저장소 URL: '$repo' 값은 절대 경로거나 ./ 또는 ../로 시
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path'은(는) 이미 인덱스에 있습니다"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "'$sm_path'은(는) 이미 인덱스에 있고 하위 모듈이 아닙니다"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12913,22 +14215,22 @@ msgstr ""
 "$sm_path\n"
 "정말로 추가하려면 -f 옵션을 사용하십시오."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "'$sm_path'의 기존 저장소를 인덱스에 추가합니다"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path'이(가) 이미 있고 올바른 git 저장소가 아닙니다"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "'$sm_name'에 대한 깃 디렉터리가 로컬에서 리모트가 있는 채로 있습니다:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -12943,47 +14245,47 @@ msgstr ""
 "'--force' 옵션을 사용하십시오. 로컬 깃 디렉터리가 올바른 저장소가 아니거나\n"
 "무슨 의미인지 잘 모르겠으면 '--name' 옵션으로 다른 이름을 선택하십시오."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "로컬 깃 디렉터리를 '$sm_name' 하위모듈로 다시 활성화합니다."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "'$sm_path' 하위 모듈을 체크아웃할 수 없습니다"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "'$sm_path' 하위 모듈을 추가하는데 실패했습니다"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "'$sm_path' 하위 모듈을 등록하는데 실패했습니다"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:327
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "'$displaypath' 들어감"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:347
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "'$displaypath'에서 멈춤. 스크립트가 0이 아닌 상태를 리턴함."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:418
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "경로명세 및 --all 옵션은 호환되지 않습니다"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:423
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "정말로 모든 하위 모듈 초기화를 해제하려면 '--all'을 사용하십시오"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:443
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
@@ -12992,7 +14294,7 @@ msgstr ""
 "하위 모듈 작업 폴더 '$displaypath'에 .git 디렉터리가 들어 있습니다\n"
 "(정말로 그 커밋 내역까지 포함해 제거하려면 'rm -rf'를 사용하십시오)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:451
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13001,136 +14303,136 @@ msgstr ""
 "하위 모듈 작업 폴더에 ('$displaypath') 로컬 수정 사항이 있습니다. 버리려면 '-"
 "f'를 사용하십시오"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:454
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "'$displaypath' 디렉터리를 지웁니다"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "하위 모듈 디렉터리를 ('$displaypath') 제거할 수 없습니다"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:458
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "빈 하위 모듈 디렉터리를 ('$displaypath') 만들 수 없습니다"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:467
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "'$name' 하위 모듈이 ($url) '$displaypath' 경로에 대해 등록되지 않았습니다"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:623
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "하위 모듈 경로에서 ('$displaypath') 현재 리비전을 찾을 수 없습니다"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:633
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "하위 모듈 경로 '$sm_path'에서 가져올 수 없습니다"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:638
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
 "'$sm_path'"
-msgstr "하위 모듈 경로 '$sm_path'에서 현재 ${remote_name}/${branch} 리비전을 찾을 수 없습니다"
+msgstr ""
+"하위 모듈 경로 '$sm_path'에서 현재 ${remote_name}/${branch} 리비전을 찾을 수 "
+"없습니다"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:656
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "하위 모듈 경로 '$displaypath'에서 가져올 수 없습니다"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:662
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
 "Direct fetching of that commit failed."
-msgstr "'$displaypath' 하위 모듈 경로에서 가져왔지만, $sha1 커밋이 들어있지 않습니다. 이 커밋을 직접 가져오는데 실패했습니다."
+msgstr ""
+"'$displaypath' 하위 모듈 경로에서 가져왔지만, $sha1 커밋이 들어있지 않습니"
+"다. 이 커밋을 직접 가져오는데 실패했습니다."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:669
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 체크아웃할 수 없습니다"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:670
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "하위 모듈 경로 '$displaypath': '$sha1' 체크아웃"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 리베이스할 수 없습니다"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "하위 모듈 경로 '$displaypath': '$sha1'(으)로 리베이스"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:680
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1' 병합할 수 없습니다"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:681
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "하위 모듈 경로 '$displaypath': '$sha1'에서 병합"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:686
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr "'$command $sha1' 실행이 하위 모듈 경로 '$displaypath'에서 실패했습니다"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:687
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "하위 모듈 경로 '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:718
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "재귀적으로 하위 모듈 경로 '$displaypath'에 들어가는데 실패했습니다"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:826
 msgid "The --cached option cannot be used with the --files option"
 msgstr "--cached 옵션은 --files 옵션과 같이 쓸 수 없습니다"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:878
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "예상치 못한 모드 $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:898
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  경고: '$display_name'에 '$sha1_src' 커밋이 들어있지 않습니다"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:901
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  경고: '$display_name'에 '$sha1_dst' 커밋이 들어있지 않습니다"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:904
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  경고: '$display_name'에 '$sha1_src' 및 '$sha1_dst' 커밋이 들어있지 않습니다"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "블롭"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1051
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "재귀적으로 하위 모듈 경로 '$sm_path'에 들어가는데 실패했습니다"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1118
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "하위 모듈 URL을 '$displaypath'에 대해 동기화"
@@ -13140,12 +14442,12 @@ msgstr "하위 모듈 URL을 '$displaypath'에 대해 동기화"
 msgid "See git-${cmd}(1) for details."
 msgstr "자세한 정보는 git-${cmd}(1) 페이지를 참고하십시오."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "리베이스중 ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13171,19 +14473,23 @@ msgstr ""
 "\n"
 "이 줄은 순서를 바꿀 수 있습니다. 위에서 아래 순서로 실행합니다.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr "\n줄을 제거하지 않습니다. 커밋을 제거하려면 명시적으로 'drop'을 사용하십시오.\n"
+msgstr ""
+"\n"
+"줄을 제거하지 않습니다. 커밋을 제거하려면 명시적으로 'drop'을 사용하십시오.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr "\n여기 줄을 제거하면 해당 커밋을 잃어버립니다!\n"
+msgstr ""
+"\n"
+"여기 줄을 제거하면 해당 커밋을 잃어버립니다!\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13202,210 +14508,82 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: 빼오기가 가능한 커밋이 아닙니다"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "잘못된 커밋 이름: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "현재 커밋의 대체 sha1을 쓸 수 없습니다"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "정방향 진행, $sha1 위치로"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "$sha1 위치로 정방향 진행할 수 없습니다"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "HEAD를 $first_parent 위치로 옮길 수 없습니다"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "병합 squash 거부: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "$sha1 병합을 다시 하는데 오류"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "$sha1을 빼오기 할 수 없습니다"
 
-#: git-rebase--interactive.sh:408 git-rebase--interactive.sh:474
-msgid "This is the 1st commit message:"
-msgstr "1번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:409
-msgid "This is the 2nd commit message:"
-msgstr "2번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:410
-msgid "This is the 3rd commit message:"
-msgstr "3번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:411
-msgid "This is the 4th commit message:"
-msgstr "4번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:412
-msgid "This is the 5th commit message:"
-msgstr "5번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:413
-msgid "This is the 6th commit message:"
-msgstr "6번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:414
-msgid "This is the 7th commit message:"
-msgstr "7번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:415
-msgid "This is the 8th commit message:"
-msgstr "8번째 커밋 메시지입니다:"
-
 #: git-rebase--interactive.sh:416
-msgid "This is the 9th commit message:"
-msgstr "9번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:417
-msgid "This is the 10th commit message:"
-msgstr "10번째 커밋 메시지입니다:"
-
-#. TRANSLATORS: if the language you are translating into
-#. doesn't allow you to compose a sentence in this fashion,
-#. consider translating as if this and the following few strings
-#. were "This is the commit message ${n}:"
-#: git-rebase--interactive.sh:422
-#, sh-format
-msgid "This is the ${n}th commit message:"
-msgstr "${n}번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:423
-#, sh-format
-msgid "This is the ${n}st commit message:"
-msgstr "${n}번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:424
-#, sh-format
-msgid "This is the ${n}nd commit message:"
-msgstr "${n}번째 커밋 메시지입니다:"
-
-#: git-rebase--interactive.sh:425
 #, sh-format
-msgid "This is the ${n}rd commit message:"
-msgstr "${n}번째 커밋 메시지입니다:"
+msgid "This is the commit message #${n}:"
+msgstr "커밋 메시지 #${n}번입니다:"
 
-#: git-rebase--interactive.sh:426
+#: git-rebase--interactive.sh:421
 #, sh-format
-msgid "This is the commit message ${n}:"
-msgstr "커밋 메시지 ${n}입니다:"
+msgid "The commit message #${n} will be skipped:"
+msgstr "#${n}번째 커밋 메시지를 건너뜁니다:"
 
 #: git-rebase--interactive.sh:432
-msgid "The 1st commit message will be skipped:"
-msgstr "1번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:433
-msgid "The 2nd commit message will be skipped:"
-msgstr "2번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:434
-msgid "The 3rd commit message will be skipped:"
-msgstr "3번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:435
-msgid "The 4th commit message will be skipped:"
-msgstr "4번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:436
-msgid "The 5th commit message will be skipped:"
-msgstr "5번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:437
-msgid "The 6th commit message will be skipped:"
-msgstr "6번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:438
-msgid "The 7th commit message will be skipped:"
-msgstr "7번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:439
-msgid "The 8th commit message will be skipped:"
-msgstr "8번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:440
-msgid "The 9th commit message will be skipped:"
-msgstr "9번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:441
-msgid "The 10th commit message will be skipped:"
-msgstr "10번째 커밋 메시지를 건너뜁니다:"
-
-#. TRANSLATORS: if the language you are translating into
-#. doesn't allow you to compose a sentence in this fashion,
-#. consider translating as if this and the following few strings
-#. were "The commit message ${n} will be skipped:"
-#: git-rebase--interactive.sh:446
-#, sh-format
-msgid "The ${n}th commit message will be skipped:"
-msgstr "${n}번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:447
-#, sh-format
-msgid "The ${n}st commit message will be skipped:"
-msgstr "${n}번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:448
-#, sh-format
-msgid "The ${n}nd commit message will be skipped:"
-msgstr "${n}번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:449
-#, sh-format
-msgid "The ${n}rd commit message will be skipped:"
-msgstr "${n}번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:450
-#, sh-format
-msgid "The commit message ${n} will be skipped:"
-msgstr "${n}번째 커밋 메시지를 건너뜁니다:"
-
-#: git-rebase--interactive.sh:462
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "커밋 $count개가 섞인 결과입니다."
 
-#: git-rebase--interactive.sh:470
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "$fixup_msg를 쓸 수 없습니다"
 
-#: git-rebase--interactive.sh:473
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "커밋 2개가 섞인 결과입니다."
 
-#: git-rebase--interactive.sh:514 git-rebase--interactive.sh:557
-#: git-rebase--interactive.sh:560
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "다음을 적용할(apply) 수 없습니다: $sha1... $rest"
 
-#: git-rebase--interactive.sh:588
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13418,31 +14596,31 @@ msgstr ""
 "대부분의 경우 빈 커밋 메시지 때문이거나, 또는 커밋 전 후크가 실패했기\n"
 "때문입니다. 커밋 메시지를 수정하기 전에 이 문제를 먼저 해결해야 합니다."
 
-#: git-rebase--interactive.sh:603
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "다음에서 멈춥니다: $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:618
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "이전 커밋 없이 '$squash_style' 수행할 수 없습니다"
 
-#: git-rebase--interactive.sh:660
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "실행 중: $rest"
 
-#: git-rebase--interactive.sh:668
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "실행 실패: $rest"
 
-#: git-rebase--interactive.sh:670
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "그리고 인덱스 그리고/또는 작업 폴더에 변경 사항이 있습니다"
 
-#: git-rebase--interactive.sh:672
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13453,7 +14631,7 @@ msgstr ""
 "\tgit rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:685
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13468,25 +14646,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:696
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "알 수 없는 명령: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:697
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "'git rebase --edit-todo' 명령으로 바로잡으십시오."
 
-#: git-rebase--interactive.sh:732
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "성공적으로 리베이스했고 $head_name 업데이트했습니다."
 
-#: git-rebase--interactive.sh:779
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
 msgstr "불필요한 빼오기 명령을 건너뛸 수 없습니다"
 
-#: git-rebase--interactive.sh:937
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13495,7 +14673,7 @@ msgstr ""
 "경고: 다음 줄에서 해당 SHA-1이 없거나 커밋이 아닙니다:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13504,11 +14682,11 @@ msgstr ""
 "경고: 다음 줄에서 명령어가 무엇인지 알 수 없습니다:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:1009
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "HEAD는 분리할 수 없습니다"
 
-#: git-rebase--interactive.sh:1047
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13516,7 +14694,7 @@ msgstr ""
 "경고: 일부 커밋이 의도치 않게 버려졌을 수도 있습니다.\n"
 "버려진 커밋 (최근에서 과거 순서):"
 
-#: git-rebase--interactive.sh:1055
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13524,31 +14702,39 @@ msgid ""
 "warnings.\n"
 "The possible behaviours are: ignore, warn, error."
 msgstr ""
-"이 메시지를 보지 않으려면, \"drop\"을 사용해 명시적으로 커밋을 제거하십시오.\n"
+"이 메시지를 보지 않으려면, \"drop\"을 사용해 명시적으로 커밋을 제거하십시"
+"오.\n"
 "\n"
-"'git config rebase.missingCommitsCheck' 명령으로 경고 단계를 바꿀 수 있습니다.\n"
+"'git config rebase.missingCommitsCheck' 명령으로 경고 단계를 바꿀 수 있습니"
+"다.\n"
 "가능한 동작은: ignore, warn, error"
 
-#: git-rebase--interactive.sh:1066
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
 "Ignoring."
-msgstr "rebase.missingCommitsCheck 옵션에 대해 인식할 수 없는 $check_level 설정. 무시합니다."
+msgstr ""
+"rebase.missingCommitsCheck 옵션에 대해 인식할 수 없는 $check_level 설정. 무시"
+"합니다."
 
-#: git-rebase--interactive.sh:1083
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "'git rebase --edit-todo' 명령으로 바로잡을 수 있습니다."
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"'git rebase --edit-todo' 명령으로 바로잡을 수 있고 'git rebase --continue' 명"
+"령을 실행합니다."
 
-#: git-rebase--interactive.sh:1084
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "아니면 'git rebase --abort' 명령으로 리베이스를 중지할 수도 있습니다."
 
-#: git-rebase--interactive.sh:1108
+#: git-rebase--interactive.sh:1079
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "CHERRY_PICK_HEAD를 제거할 수 없습니다"
 
-#: git-rebase--interactive.sh:1113
+#: git-rebase--interactive.sh:1084
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13561,7 +14747,7 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
@@ -13579,11 +14765,11 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1130
+#: git-rebase--interactive.sh:1101
 msgid "Error trying to find the author identity to amend commit"
 msgstr "커밋을 수정한 작성자 신원을 찾는데 오류"
 
-#: git-rebase--interactive.sh:1135
+#: git-rebase--interactive.sh:1106
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
@@ -13591,11 +14777,11 @@ msgstr ""
 "작업 폴더에 커밋하지 않은 변경 사항이 있습니다. 이 사항을 먼저\n"
 "커밋하고 'git rebase --continue' 명령을 다시 실행하십시오."
 
-#: git-rebase--interactive.sh:1140 git-rebase--interactive.sh:1144
+#: git-rebase--interactive.sh:1111 git-rebase--interactive.sh:1115
 msgid "Could not commit staged changes."
 msgstr "스테이징한 변경 사항은 커밋할 수 없습니다."
 
-#: git-rebase--interactive.sh:1168
+#: git-rebase--interactive.sh:1139
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13609,50 +14795,49 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1176 git-rebase--interactive.sh:1337
+#: git-rebase--interactive.sh:1147 git-rebase--interactive.sh:1305
 msgid "Could not execute editor"
 msgstr "편집기를 실행할 수 없습니다"
 
-#: git-rebase--interactive.sh:1184
-msgid "You need to set your committer info first"
-msgstr "먼저 커밋하는 사람 정보를 설정해야 합니다"
-
-#: git-rebase--interactive.sh:1192
+#: git-rebase--interactive.sh:1160
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "$switch_to를 체크아웃할 수 없습니다"
 
-#: git-rebase--interactive.sh:1197
+#: git-rebase--interactive.sh:1165
 msgid "No HEAD?"
 msgstr "HEAD가 없습니다?"
 
-#: git-rebase--interactive.sh:1198
+#: git-rebase--interactive.sh:1166
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "임시로 $state_dir 디렉터리를 만들 수 없습니다"
 
-#: git-rebase--interactive.sh:1200
+#: git-rebase--interactive.sh:1168
 msgid "Could not mark as interactive"
 msgstr "대화형으로 표시할 수 없습니다."
 
-#: git-rebase--interactive.sh:1210 git-rebase--interactive.sh:1215
+#: git-rebase--interactive.sh:1178 git-rebase--interactive.sh:1183
 msgid "Could not init rewritten commits"
 msgstr "다시 작성된 커밋을 초기화할 수 없습니다"
 
-#: git-rebase--interactive.sh:1315
+#: git-rebase--interactive.sh:1283
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "리베이스 $shortrevisions, $shortonto 위로 (명령 $todocount개)"
 
-#: git-rebase--interactive.sh:1320
+#: git-rebase--interactive.sh:1288
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
 "\n"
-msgstr "\n하지만 모두 제거할 경우, 리베이스를 중지합니다.\n\n"
+msgstr ""
+"\n"
+"하지만 모두 제거할 경우, 리베이스를 중지합니다.\n"
+"\n"
 
-#: git-rebase--interactive.sh:1327
+#: git-rebase--interactive.sh:1295
 msgid "Note that empty commits are commented out"
 msgstr "단 빈 커밋은 주석 처리되었습니다."
 
@@ -13679,6 +14864,11 @@ msgstr "리베이스할 수 없습니다: 스테이징하지 않은 변경 사
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr "브랜치를 다시 쓸 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr ""
+"리베이스로 풀을 할 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13688,11 +14878,20 @@ msgstr "$action 할 수 없습니다: 스테이징하지 않은 변경 사항이
 msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr "리베이스할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"리베이스로 풀을 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr "$action 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "추가로, 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr "이 명령은 작업 폴더의 최상위에서만 쓸 수 있습니다."
@@ -13700,3 +14899,868 @@ msgstr "이 명령은 작업 폴더의 최상위에서만 쓸 수 있습니다."
 #: git-sh-setup.sh:377
 msgid "Unable to determine absolute path of git directory"
 msgstr "깃 디렉터리의 절대 경로를 알아낼 수 없습니다"
+
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%12s %12s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "스테이징"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "안스테이징"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:322
+msgid "binary"
+msgstr "바이너리"
+
+#: git-add--interactive.perl:306 git-add--interactive.perl:360
+msgid "nothing"
+msgstr "없음"
+
+#: git-add--interactive.perl:342 git-add--interactive.perl:357
+msgid "unchanged"
+msgstr "안바뀜"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "경로 %d개 추가\n"
+
+#: git-add--interactive.perl:656
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "경로 %d개 업데이트\n"
+
+#: git-add--interactive.perl:659
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "경로 %d개 되돌림\n"
+
+#: git-add--interactive.perl:662
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "경로 %d개 건드림\n"
+
+#: git-add--interactive.perl:671
+msgid "Update"
+msgstr "업데이트"
+
+#: git-add--interactive.perl:683
+msgid "Revert"
+msgstr "되돌리기"
+
+#: git-add--interactive.perl:706
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "주의: %s은(는) 현재 추적하지 않습니다.\n"
+
+#: git-add--interactive.perl:717
+msgid "Add untracked"
+msgstr "추적하지 않는 파일 추가"
+
+#: git-add--interactive.perl:723
+msgid "No untracked files.\n"
+msgstr "추적하지 않는 파일 없음.\n"
+
+#: git-add--interactive.perl:1039
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"패치가 깔끔하게 적용되면, 편집 부분은 즉시 스테이징으로\n"
+"표시됩니다."
+
+#: git-add--interactive.perl:1042
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr ""
+"패치가 깔끔하게 적용되면, 편집 부분은 즉시 스태시에\n"
+"표시됩니다."
+
+#: git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr ""
+"패치가 깔끔하게 적용되면, 편집 부분은 즉시 스테이징 아님으로\n"
+"표시됩니다."
+
+#: git-add--interactive.perl:1048 git-add--interactive.perl:1057
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"패치가 깔끔하게 적용되면, 편집 부분은 즉시 적용으로\n"
+"표시됩니다."
+
+#: git-add--interactive.perl:1051
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding"
+msgstr ""
+"패치가 깔끔하게 적용되면, 편집 부분은 즉시 버림으로\n"
+"표시됩니다"
+
+#: git-add--interactive.perl:1054
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr ""
+"패치가 깔끔하게 적용되면, 편집 부분은 즉시 버림으로\n"
+"표시됩니다."
+
+#: git-add--interactive.perl:1067
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr "부분 편집 파일을 쓰기용으로 여는데 실패: '%s'"
+
+#: git-add--interactive.perl:1068
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr "수동 부분 편집 모드 -- 빠른 설명은 맨 아래를 보십시오.\n"
+
+#: git-add--interactive.perl:1074
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"'%s' 줄을 제거하려면, 줄을 ' ' 줄로 만드십시오 (컨텍스트).\n"
+"'%s' 줄을 제거하려면, 줄을 삭제하십시오..\n"
+"%s(으)로 시작하는 줄은 제거됩니다\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1082
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"깔끔하게 적용되지 않으면, 다시 편집할 기회가 있습니다. 모든 줄을 제거할 경"
+"우,\n"
+"편집은 중단되고 이 부분은 변경되지 않은 상태로 남아있게 됩니다.\n"
+
+#: git-add--interactive.perl:1096
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr "부분 편집 파일을 읽기용으로 여는데 실패: '%s'"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1187
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr ""
+"편집한 부분이 적용되지 않습니다. 다시 편집하시겠습니까 (\"no\"라고 하면 버립"
+"니다!) [y/n]? "
+
+#: git-add--interactive.perl:1196
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 이 부분 스테이징\n"
+"n - 이 부분 스테이징하지 않음\n"
+"q - 끝내기. 이 부분과 나머지 모두 스테이징하지 않음\n"
+"a - 이 부분과 파일의 뒤 부분 모두 스테이징\n"
+"d - 이 부분과 파일의 뒤 부분 모두 스테이징하지 않음"
+
+#: git-add--interactive.perl:1202
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 이 부분 스태시\n"
+"n - 이 부분 스태시하지 않음\n"
+"q - 끝내기. 이 부분과 나머지 모두 스태시하지 않음\n"
+"a - 이 부분과 파일의 뒤 부분 모두 스태시\n"
+"d - 이 부분과 파일의 뒤 부분 모두 스태시하지 않음"
+
+#: git-add--interactive.perl:1208
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 이 부분 스테이징 해제\n"
+"n - 이 부분 스테이징 해제하지 않음\n"
+"q - 끝내기. 이 부분과 나머지 모두 스테이징 해제하지 않음\n"
+"a - 이 부분과 파일의 뒤 부분 모두 스테이징 해제\n"
+"d - 이 부분과 파일의 뒤 부분 모두 스테이징 해제하지 않음"
+
+#: git-add--interactive.perl:1214
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 이 부분 인덱스에 적용\n"
+"n - 이 부분 인덱스에 적용하지 않음\n"
+"q - 끝내기. 이 부분과 나머지 모두 적용하지 않음\n"
+"a - 이 부분과 파일의 뒤 부분 모두 \n"
+"d - 이 부분과 파일의 뒤 부분 모두 적용하지 않음"
+
+#: git-add--interactive.perl:1220
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 이 부분 작업 폴더에서 버림\n"
+"n - 이 부분 작업 폴더에서 버리지 않음\n"
+"q - 끝내기. 이 부분과 나머지 모두 버리지 않음\n"
+"a - 이 부분과 파일의 뒤 부분 모두 버림\n"
+"d - 이 부분과 파일의 뒤 부분 모두 버리지 않음"
+
+#: git-add--interactive.perl:1226
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 이 부분 인덱스와 작업 폴더에서 버림\n"
+"n - 이 부분 인덱스와 작업 폴더에서 버리지 않음\n"
+"q - 끝내기. 이 부분과 나머지 모두 버리지 않음\n"
+"a - 이 부분과 파일의 뒤 부분 모두 버림\n"
+"d - 이 부분과 파일의 뒤 부분 모두 버리지 않음"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 이 부분 인덱스와 작업 폴더에 적용\n"
+"n - 이 부분 인덱스와 작업 폴더에 적용하지 않음\n"
+"q - 끝내기. 이 부분과 나머지 모두 적용하지 않음\n"
+"a - 이 부분과 파일의 뒤 부분 모두 \n"
+"d - 이 부분과 파일의 뒤 부분 모두 적용하지 않음"
+
+#: git-add--interactive.perl:1241
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g - 이동할 부분 선택\n"
+"/ - 주어진 정규식에 맞는 부분 검색\n"
+"j - 이 부분 미결정 상태로 남겨두고, 다음 미결정 부분 보기\n"
+"J - 이 부분 미결정 상태로 남겨두고, 다음 부분 보기\n"
+"k - 이 부분 미결정 상태로 남겨두고, 이전 미결정 부분 보기\n"
+"K - 이 부분 미결정 상태로 남겨두고, 이전 부분 보기\n"
+"s - 현재 부분을 작은 부분을 쪼개기\n"
+"e - 현재 부분을 수동으로 편집\n"
+"? - 도움말 보기\n"
+
+#: git-add--interactive.perl:1272
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "선택한 부분은 인덱스에 적용되지 않습니다!\n"
+
+#: git-add--interactive.perl:1273
+msgid "Apply them to the worktree anyway? "
+msgstr "그래도 작업 폴더에 적용할까요?"
+
+#: git-add--interactive.perl:1276
+msgid "Nothing was applied.\n"
+msgstr "아무 것도 적용되지 않았습니다.\n"
+
+#: git-add--interactive.perl:1287
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "병합하지 않은 사항 무시: %s\n"
+
+#: git-add--interactive.perl:1296
+msgid "Only binary files changed.\n"
+msgstr "바이너리 파일만 바뀌었습니다.\n"
+
+#: git-add--interactive.perl:1298
+msgid "No changes.\n"
+msgstr "변경 사항 없음.\n"
+
+#: git-add--interactive.perl:1306
+msgid "Patch update"
+msgstr "패치 업데이트"
+
+#: git-add--interactive.perl:1358
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "모드 변경을 스테이징합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "삭제를 스테이징합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "이 부분 스테이징합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1363
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "모드 변경 스태시합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "삭제 스태시합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "이 부분 스태시합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1368
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "모드 변경 스태시 해제합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "삭제 스태시 해제합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "이 부분 스태시 해제합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1373
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "모드 변경을 인덱스에 적용합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "삭제를 인덱스에 적용합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "이 부분을 인덱스에 적용합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1378
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "모드 변경을 작업 폴더에서 버립니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "삭제를 작업 폴더에서 버립니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "이 부분을 작업 폴더에서 버립니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1383
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "모드 변경을 인덱스와 작업 폴더에서 버립니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1384
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "삭제를 인덱스와 작업 폴더에서 버립니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1385
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "이 부분을 인덱스와 작업 폴더에서 버립니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1388
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "모드 변경을 인덱스와 작업 폴더에 적용합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1389
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "삭제를 인덱스와 작업 폴더에 적용합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1390
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "이 부분을 인덱스와 작업 폴더에 적용합니까 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1493
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "어느 부분으로 이동합니까 (더 보려면 <ret>)? "
+
+#: git-add--interactive.perl:1495
+msgid "go to which hunk? "
+msgstr "어느 부분으로 이동합니까? "
+
+#: git-add--interactive.perl:1504
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "잘못된 번호: '%s'\n"
+
+#: git-add--interactive.perl:1509
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "미안합니다. 부분이 %d개 밖에 없습니다.\n"
+
+#: git-add--interactive.perl:1535
+msgid "search for regex? "
+msgstr "정규식을 검색합니까?"
+
+#: git-add--interactive.perl:1548
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "잘못된 형태의 검색 정규식 %s: %s\n"
+
+#: git-add--interactive.perl:1558
+msgid "No hunk matches the given pattern\n"
+msgstr "[주어진 패턴에 맞는 부분이 없습니다\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1592
+msgid "No previous hunk\n"
+msgstr "이전 부분이 없습니다\n"
+
+#: git-add--interactive.perl:1579 git-add--interactive.perl:1598
+msgid "No next hunk\n"
+msgstr "다음 부분이 없습니다\n"
+
+#: git-add--interactive.perl:1606
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "%d개 부분으로 나눕니다.\n"
+
+#: git-add--interactive.perl:1658
+msgid "Review diff"
+msgstr "diff 검토"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1677
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff\t      - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        - 변경 사항이 있는 경로를 표시합니다\n"
+"update        - 변경 사항 스테이징 모음에 작업 폴더 상태를 추가합니다\n"
+"revert        - 변경 사항 스테이징 모음을 HEAD 버전으로 되돌립니다\n"
+"patch         - 바뀐 부분을 골라서 개별적으로 업데이트합니다\n"
+"diff          - HEAD와 인덱스 사이의 차이점을 봅니다\n"
+"add untracked - 추적되지 않는 파일의 내용을 변경 사항 스테이징 모음에 추가합"
+"니다\n"
+
+#: git-add--interactive.perl:1694 git-add--interactive.perl:1699
+#: git-add--interactive.perl:1702 git-add--interactive.perl:1709
+#: git-add--interactive.perl:1713 git-add--interactive.perl:1719
+msgid "missing --"
+msgstr "-- 빠짐"
+
+#: git-add--interactive.perl:1715
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "알 수 없는 --patch 모드: %s"
+
+#: git-add--interactive.perl:1721 git-add--interactive.perl:1727
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "인자가 (%s) 잘못되었고, --가 와야 합니다"
+
+# 주의: 초 단위일 경우를 말한다
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr "지역 시간대와 GMT의 차이가 분 단위가 아닙니다\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "지역 시각 오프셋이 24시간보다 크거나 작습니다\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "편집기가 비정상적으로 끝나서, 모두 중지합니다"
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr "'%s' 안에 작성 중이었던 중간 버전의 전자메일이 들어 있습니다.\n"
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "'%s.final' 안에 작성한 전자메일이 들어 있습니다.\n"
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-aliases 옵션은 다른 옵션과 호환되지 않습니다\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "저장소 밖에서 git format-patch 명령을 실행할 수 없습니다\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "알 수 없는 --suppress-cc 필드: '%s'\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "알 수 없는 --confirm 설정: '%s'\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr "경고: 따옴표가 있는 sendmail 별칭은 지원하지 않습니다: %s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "경고: `:include:`는 지원하지 않습니다: %s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr "경고: `/file` 또는 `|pipe` 리다이렉션은 지원하지 않습니다: %s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "경고: sendmail 줄이 인식되지 않습니다: %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+"'%s' 파일이 있지만 이 파일은 패치를 만들 대상인 커밋의 범위가\n"
+"될 수도 있습니다. 다음과 같이 애매함을 없애 주십시오...\n"
+"\n"
+"    * 파일을 의도했다면 \"./%s\"(이)라고 쓰고, 아니면\n"
+"    * 범위를 의도했다면 --format-patch 옵션 사용\n"
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "%s에 opendir 실패: %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"치명적 오류: %s: %s\n"
+"경고: 패치를 보내지 않았습니다\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"패치 파일을 지정하지 않았습니다\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "%s 안에 제목 줄이 없습니다?"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "%s에 쓰려고 여는데 실패: %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+"\"GIT:\"으로 시작하는 줄은 제거됩니다.\n"
+"작성 중인 패치에 대해 전체 diffstat을 포함하거나\n"
+"목차를 포함해 보십시오.\n"
+"\n"
+"요약을 보내는 게 아니라면 본문 내용을 지우십시오.\n"
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "%s.final을 여는데 실패: %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "%s을(를) 여는데 실패: %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr "To/Cc/Bcc 필드가 해석되지 않아서, 무시합니다\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "요약 전자메일이 비어 있어서 넘어갑니다.\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "정말로 <%s>을(를) 사용하시겠습니까 [y/N]? "
+
+# 주의: '8bit'이라고 그대로 쓴다. 메일 encoding 헤더에 쓸 literal을 가리킴
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr ""
+"다음 파일이 8bit이지만, Content-Transfer-Encoding을 설정하지 않았습니다.\n"
+
+# 주의: '8bit'이라고 그대로 쓴다. 메일 encoding 헤더에 쓸 literal을 가리킴
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "어떤 8bit 인코딩을 선언합니까 [UTF-8]? "
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+"보내지 않습니다. 다음 패치가\n"
+"\t%s\n"
+"제목 서식인 '*** SUBJECT HERE ***'가 들어 있습니다. 정말로 보내려면 --force "
+"옵션을 사용하십시오.\n"
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "누구에게 전자메일을 보내야 합니까 (보낼 대상이 있다면)?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "치명적 오류: '%s' 별칭은 자기 자신을 가리킵니다\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr "첫 메일에 대해 (있다면) Message-ID가 In-Reply-To에 사용되었습니다? "
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "오류: 다음에서 올바른 주소를 추출할 수 없습니다: %s\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr "이 주소로 무엇을 하시겠습니까? ([q]끝내기|[d]버리기|[e]편집): "
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "\"%s\" CA 경로가 없습니다"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+"    위의 Cc 목록은 패치 커밋 메시지에 들어 있는 추가 주소로\n"
+"    확장됩니다. 기본값으로 확장되기 전에 send-email에서\n"
+"    물어봅니다. 이런 동작은 sendmail.confirm 설정에서\n"
+"    조정할 수 있습니다.\n"
+"\n"
+"    정보를 더 보려면, 'git send-email --help'를 실행하십시오.\n"
+"    현재 동작을 유지하려면, 이 메시지를 무시하고,\n"
+"    'git config --global sendemail.confirm auto' 명령을\n"
+"    실행하십시오.\n"
+"\n"
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "이 전자메일을 보내시겠습니까? ([y]예|[n]아니오|[q]끝내기|[a]모두): "
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "필요한 전자메일 답장 보냅니다"
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "필요한 SMTP 서버를 제대로 지정하지 않았습니다."
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "서버에서 STARTTLS를 지원하지 않습니다! %s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr ""
+"SMTP를 제대로 초기화할 수 없습니다. 설정을 확인하고 --smtp-debug 옵션을 사용"
+"하십시오."
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "%s을(를) 보내는데 실패했습니다\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "%s 보내는 흉내\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "%s 보냄\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "성공 흉내. 기록은:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "성공. 기록은:\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "결과: "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "결과: 정상\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "%s 파일을 열 수 없습니다"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) cc: %s 추가, '%s' 줄에서\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) to: %s 추가, '%s' 줄에서\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox아님) cc: %s 추가, '%s' 줄에서\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(본문) cc: %s 추가, '%s' 줄에서\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) '%s'을 실행할 수 없습니다"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) %s: %s 추가, '%s' 줄에서\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) '%s'(을)를 향한 파이프를 닫는데 실패했습니다"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "메시지를 7비트로 보낼 수 없습니다"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "잘못된 전송 인코딩"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "%s을(를) 열 수 없습니다: %s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s: 패치에 998자보다 더 긴 줄이 들어 있습니다"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "%s 넘어감, 예비 확장자 '%s' 있음.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "정말로 %s 파일을 보내시겠습니까? [y|N]: "
index c8658dfd25945a4b7ceea389e137392a130dd41d..8a2d55a8b6664056dbbd8781ebf9d3e883c7b54d 100644 (file)
@@ -4,13 +4,13 @@
 # This file is distributed under the same license as the Git package.
 # Contributors:
 # - Marco Sousa <marcomsousa AT gmail.com>
-# Vasco Almeida <vascomalmeida@sapo.pt>, 2016.
+# Vasco Almeida <vascomalmeida@sapo.pt>, 2016, 2017.
 msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-09-03 12:00+0000\n"
+"POT-Creation-Date: 2017-04-23 09:54+0800\n"
+"PO-Revision-Date: 2017-05-01 21:17+0000\n"
 "Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
 "Language-Team: Portuguese\n"
 "Language: pt\n"
@@ -63,7 +63,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "A terminar devido a conflito não resolvido."
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Não concluído a integração (MERGE_HEAD presente)."
 
@@ -102,631 +102,1347 @@ msgstr ""
 "  git checkout -b <novo-nome-ramo>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<opções>] <árvore-etc> [<caminho>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "opção de espaço em branco não reconhecida '%s'"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "opção de ignorar espaço em branco não reconhecida '%s'"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <repo> [--exec <cmd>] [<opções>] <árvore-etc> "
-"[<caminho>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject e --3way não podem ser usados juntos."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <repo> [--exec <cmd>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached e --3way não podem ser usados juntos."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "o especificador de caminho '%s' não corresponde a nenhum ficheiro"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way fora de um repositório"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "fmt"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index fora de um repositório"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "formato do arquivo"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached fora de um repositório"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "prefixo"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Não é possível preparar a regexp de carimbo de data/hora %s"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "preceder o prefixo a cada nome de caminho dentro do arquivo"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec retornou %d para a entra: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "ficheiro"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "não foi possível encontrar o nome do ficheiro no patch na linha %d"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "escrever o arquivo para este ficheiro"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply: git-diff incorreto - esperava-se /dev/null, obteve-se %s na linha "
+"%d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "ler .gitattributes do diretório de trabalho"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+"git apply: git-diff incorreto - o nome do novo ficheiro na linha %d é "
+"inconsistente"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "listar ficheiros arquivados para stderr"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+"git apply: git-diff incorreto - o nome do ficheiro antigo na linha %d é "
+"inconsistente"
 
-#: archive.c:437
-msgid "store only"
-msgstr "armazenar apenas"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: git-diff incorreto - esperava-se /dev/null na linha %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "compressão rápida"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recontagem: linha inesperada: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "compressão ótima"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "fragmento de patch sem cabeçalho na linha %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "listar formatos de arquivo suportados"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"o cabeçalho do git diff não revelou o nome do ficheiro depois de se remover "
+"%d componente do caminho (linha %d)"
+msgstr[1] ""
+"o cabeçalho do git diff não revelou o nome do ficheiro depois de se remover "
+"%d componentes de caminho (linha %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "repo"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr "o cabeçalho do git diff não revela o nome do ficheiro (linha %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "obter o arquivo a partir do repositório remoto <repo>"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "o novo ficheiro depende de conteúdos antigos"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "comando"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "o ficheiro eliminado ainda tem conteúdos"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "caminho para o comando git-upload-archive no remoto"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "patch corrompido na linha %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Opção inesperada --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "o novo ficheiro %s depende de conteúdos antigos"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "A opção --exec só pode ser usada em conjunto com --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "o ficheiro eliminado %s ainda tem conteúdos"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Opção inesperada --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** aviso: o ficheiro %s ficará vazio, mas não será eliminado"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Formato de arquivo desconhecido '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "patch binário corrompido na linha %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Argumento não suportado para o formato '%s': -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "patch binário não reconhecido na linha %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Os padrões negativos são ignorados nos atributos do git\n"
-"Use '\\!' para uma exclamação literal à esquerda."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "patch incompreensível na linha %d"
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "Não foi possível abrir o ficheiro '%s'"
+msgid "unable to read symlink %s"
+msgstr "não é possível ler a ligação simbólica %s"
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Conteúdo incorretamente citado no ficheiro '%s': %s"
+msgid "unable to open or read %s"
+msgstr "não é possível abrir ou ler %s"
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "Não se está a bissetar mais!\n"
+msgid "invalid start of line: '%c'"
+msgstr "início de linha inválido: '%c'"
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "%s não é um nome de commit válido"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "Excerto nº%d bem sucedido na linha %d (%d linha deslocada)."
+msgstr[1] "Excerto nº%d bem sucedido na linha %d (%d linhas deslocadas)."
 
-#: bisect.c:732
+#: apply.c:3053
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"A base de integração %s é má (bad).\n"
-"Significa que o bug foi corrigido entre %s e [%s].\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Contexto reduzido para (%ld/%ld) para aplicar o fragmento em %d"
 
-#: bisect.c:737
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"A base de integração %s é nova (new).\n"
-"A propriedade foi mudada entre %s e [%s].\n"
+"ao procura por:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "falta de dados do patch binário '%s'"
+
+#: apply.c:3089
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"A base de integração %s é %s.\n"
-"Significa que o primeiro commit '%s' está entre %s e [%s].\n"
+"não é possível aplicar o reverso de um patch binário a '%s' sem o excerto "
+"reverso"
 
-#: bisect.c:750
+#: apply.c:3135
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"Algumas revisões %s não antecedem a revisão %s.\n"
-"git bisect não pode funcionar corretamente nesta situação.\n"
-"Talvez confundiu revisões %s e %s?\n"
+"não é possível aplicar patch binário a '%s' sem linha de índice completa"
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"tem-se que saltar a base de integração entre %s e [%s].\n"
-"Portanto não se pode ter a certeza que o primeiro commit %s está entre %s e "
-"%s.\n"
-"Continua-se de qualquer maneira."
+"o patch aplica-se a '%s' (%s), que não corresponde aos conteúdos atuais."
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "A bissetar: uma base de integração tem de ser testada\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "o patch aplica-se a um '%s' vazio mas não está vazio"
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
-msgstr "precisa-se de uma revisão %s"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "não é possível ler a postimage necessária %s de '%s'"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
-msgstr "não foi possível criar o ficheiro '%s'"
+msgid "binary patch does not apply to '%s'"
+msgstr "o patch binário não foi aplicado corretamente a '%s'"
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
-msgstr "não foi possível ler o ficheiro '%s'"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"o patch binário aplicado a '%s' gera resultados incorretos (esperava-se %s, "
+"obteve-se %s)"
 
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "falha ao ler referências bissetadas"
+#: apply.c:3211
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "falha ao aplicar o patch: %s:%ld"
 
-#: bisect.c:967
+#: apply.c:3333
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s era %s e %s em simultâneo\n"
+msgid "cannot checkout %s"
+msgstr "não é possível extrair %s"
 
-#: bisect.c:975
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"Nenhum commit testável encontrado.\n"
-"Talvez tenha começado com parâmetros de caminho incorretos?\n"
+msgid "failed to read %s"
+msgstr "falha ao ler %s"
 
-#: bisect.c:994
+#: apply.c:3389
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(aproximadamente %d passo)"
-msgstr[1] "(aproximadamente %d passos)"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "a ler '%s' indicado por uma ligação simbólica"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "A bissetar: falta %d revisão para testar depois desta %s\n"
-msgstr[1] "A bissetar: faltam %d revisões para testar depois desta %s\n"
+msgid "path %s has been renamed/deleted"
+msgstr "o caminho %s foi eliminado ou mudou de nome"
 
-#: branch.c:53
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"Após resolver a causa do erro, pode tentar corrigir\n"
-"o ramo remoto que deve ser seguido, invocando\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
+msgid "%s: does not exist in index"
+msgstr "%s: não existe no índice"
 
-#: branch.c:67
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "O ramo %s não foi configurado com ramo a montante dele próprio."
+msgid "%s: does not match index"
+msgstr "%s: não tem correspondência no índice"
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr "Ramo %s configurado para seguir o ramo remoto %s de %s por rebase."
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr ""
+"o repositório não tem o blob necessário para recorrer a integração com 3 "
+"pontos."
 
-#: branch.c:94
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Ramo %s configurado para seguir o ramo remoto %s de %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "A recorrer a integração com 3 pontos...\n"
 
-#: branch.c:98
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "Ramo %s configurado para seguir o ramo local %s por rebase."
+msgid "cannot read the current contents of '%s'"
+msgstr "não é possível ler o conteúdo atual de '%s'"
 
-#: branch.c:99
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Ramo %s configurado para seguir o ramo local %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Falha a recorrer a integração com 3 pontos...\n"
 
-#: branch.c:104
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Ramo %s configurado para seguir a referência remota %s por rebase."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Patch aplicado a '%s' com conflitos.\n"
 
-#: branch.c:105
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Ramo %s configurado para seguir a referência remota %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Patch aplicado a '%s' com sucesso.\n"
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr "Ramo %s configurado para seguir a referência local %s por rebase."
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "patch de remoção deixa conteúdos no ficheiro"
 
-#: branch.c:110
+#: apply.c:3697
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Ramo %s configurado para seguir a referência local %s."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Não foi possível escrever a configuração do ramo a montante"
+msgid "%s: wrong type"
+msgstr "%s: tipo errado"
 
-#: branch.c:156
+#: apply.c:3699
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Não seguido: informação da referência %s ambígua"
+msgid "%s has type %o, expected %o"
+msgstr "%s é do tipo %o, esperado %o"
 
-#: branch.c:185
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' não é um nome válido para um ramo."
+msgid "invalid path '%s'"
+msgstr "caminho inválido '%s'"
 
-#: branch.c:190
+#: apply.c:3908
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Já existe um ramo designado '%s'."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Não é possível forçar a atualização do ramo atual."
+msgid "%s: already exists in index"
+msgstr "%s: já existe no índice"
 
-#: branch.c:218
+#: apply.c:3911
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"Não é possível configurar ramo a seguir; o ponto inicial '%s' não é um ramo."
+msgid "%s: already exists in working directory"
+msgstr "%s: já existe no diretório de trabalho"
 
-#: branch.c:220
+#: apply.c:3931
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "o ramo a montante solicitado '%s' não existe"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Se pretende efetuar rebase do seu trabalho sobre um ramo\n"
-"a montante que já existe no remoto, pode ser necessário\n"
-"executar \"git fetch\" para obtê-lo.\n"
-"\n"
-"Se pretende publicar um novo ramo local que irá seguir\n"
-"o seu homólogo remoto, pode usar \"git push -u\" para configurar\n"
-"o respetivo ramo a montante, ao mesmo tempo que publica."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "o novo modo (%o) de %s não corresponde ao modo antigo (%o)"
 
-#: branch.c:266
+#: apply.c:3936
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Nome de objeto inválido: '%s'."
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "o novo modo (%o) de %s não corresponde ao modo antigo (%o) de %s"
 
-#: branch.c:286
+#: apply.c:3956
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Nome de objeto ambíguo: '%s'."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "o ficheiro afetado '%s' é indicado por uma ligação simbólica"
 
-#: branch.c:291
+#: apply.c:3960
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ponto no ramo inválido: '%s'."
+msgid "%s: patch does not apply"
+msgstr "%s: patch não se aplica com sucesso"
 
-#: branch.c:345
+#: apply.c:3975
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' foi já extraído em '%s'"
+msgid "Checking patch %s..."
+msgstr "A verificar o patch %s..."
 
-#: branch.c:364
+#: apply.c:4066
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "HEAD da árvore de trabalho %s não está atualizada"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "falta informação de sha1 ou não é útil para o submódulo %s"
 
-#: bundle.c:34
+#: apply.c:4073
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' não parece ser um ficheiro bundle v2"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "alteração de modo de %s que não está na HEAD atual"
 
-#: bundle.c:61
+#: apply.c:4076
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "cabeçalho não reconhecido: %s%s (%d)"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "falta informação de sha1 ou não é útil (%s)."
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "could not open '%s'"
-msgstr "não foi possível abrir '%s'"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "O repositório não possuí estes commits pré-requisitados:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "falha ao configurar percurso de revisões"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "falha ao invocar make_cache_entry em '%s'"
 
-#: bundle.c:185
+#: apply.c:4085
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "O bundle contém esta referência:"
-msgstr[1] "O bundle contém estas %d referências:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "O pacote regista um histórico completo."
+msgid "could not add %s to temporary index"
+msgstr "não foi possível adicionar %s ao índice temporário"
 
-#: bundle.c:194
+#: apply.c:4095
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "O bundle requer esta referência:"
-msgstr[1] "O bundle requer estas %d referências:"
-
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Não foi possível lançar pack-objects"
-
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "pack-objects terminou inesperadamente"
+msgid "could not write temporary index to %s"
+msgstr "não foi possível escrever índice temporário para %s"
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list terminou inesperadamente"
+#: apply.c:4233
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "não é possível remover %s do índice"
 
-#: bundle.c:353
+#: apply.c:4268
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "a referência '%s' é excluída pelas opções de rev-list"
+msgid "corrupt patch for submodule %s"
+msgstr "patch corrompido no submódulo %s"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4274
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "argumento não reconhecido: %s"
+msgid "unable to stat newly created file '%s'"
+msgstr "não é possível obter estado do novo ficheiro criado '%s'"
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Criação de bundle vazio recusada."
+#: apply.c:4282
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+"não é possível criar armazenamento de segurança do ficheiro recém-criado %s"
 
-#: bundle.c:463
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "cannot create '%s'"
-msgstr "não é possível criar '%s'"
+msgid "unable to add cache entry for %s"
+msgstr "não é possível adicionar %s à cache"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "index-pack terminou inesperadamente"
+#: apply.c:4329
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "falha ao escrever para '%s'"
 
-#: color.c:290
+#: apply.c:4333
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "valor de cor inválido: %.*s"
+msgid "closing file '%s'"
+msgstr "a fechar o ficheiro '%s'"
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4403
 #, c-format
-msgid "could not parse %s"
-msgstr "não foi possível analisar %s"
+msgid "unable to write file '%s' mode %o"
+msgstr "não é possível escrever o ficheiro '%s' com o modo %o"
 
-#: commit.c:42
+#: apply.c:4501
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s não é um commit!"
+msgid "Applied patch %s cleanly."
+msgstr "Patch %s aplicado com sucesso."
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "memória esgotada"
+#: apply.c:4509
+msgid "internal error"
+msgstr "erro interno"
 
-#: config.c:516
+#: apply.c:4512
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "linha de configuração %d incorreta no blob %s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "A aplicar patch %%s com %d rejeição..."
+msgstr[1] "A aplicar patch %%s com %d rejeições..."
 
-#: config.c:520
+#: apply.c:4523
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "linha de configuração %d incorreta no ficheiro %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "a truncar o nome do ficheiro .rej em %.*s.rej"
 
-#: config.c:524
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "linha de configuração %d incorreta na entrada padrão"
+msgid "cannot open %s"
+msgstr "não é possível abrir %s"
 
-#: config.c:528
+#: apply.c:4545
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "linha de configuração %d incorreta no submódulo-blob %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Excerto nº%d aplicado com sucesso."
 
-#: config.c:532
+#: apply.c:4549
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "linha de configuração %d incorreta na linha de comandos %s"
+msgid "Rejected hunk #%d."
+msgstr "Excerto nº%d rejeitado."
 
-#: config.c:536
+#: apply.c:4659
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "linha de configuração %d incorreta em %s"
+msgid "Skipped patch '%s'."
+msgstr "Patch '%s' ignorado."
 
-#: config.c:655
-msgid "out of range"
-msgstr "fora de intervalo"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "entrada não reconhecida"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "unidade inválida"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "não foi possível ler o ficheiro de índice"
 
-#: config.c:661
+#: apply.c:4823
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "valor numérico '%s' da configuração '%s' incorreto: %s"
+msgid "can't open patch '%s': %s"
+msgstr "não é possível abrir o patch '%s': %s"
 
-#: config.c:666
+#: apply.c:4850
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "valor numérico '%s' da configuração '%s' incorreto no blob %s: %s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "%d erro de espaço em branco reprimido"
+msgstr[1] "%d erros de espaço em branco reprimidos"
 
-#: config.c:669
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "valor numérico '%s' da configuração '%s' incorreto no ficheiro %s: %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d linha adiciona erros de espaço em branco."
+msgstr[1] "%d linhas adicionam erros de espaço em branco."
 
-#: config.c:672
+#: apply.c:4864
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d linha aplicada depois de corrigir erros de espaço em branco."
+msgstr[1] "%d linhas aplicadas depois de corrigir erros de espaço em branco."
+
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "Não foi possível escrever novo ficheiro de índice"
+
+#: apply.c:4911 apply.c:4914 builtin/am.c:2277 builtin/am.c:2280
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "caminho"
+
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "não aplicar alterações que correspondam ao caminho fornecido"
+
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "aplicar alterações que correspondam ao caminho fornecido"
+
+#: apply.c:4917 builtin/am.c:2286
+msgid "num"
+msgstr "num"
+
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "remover <num> barras à esquerda dos caminhos de diff tradicional"
+
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "ignorar adições feitas pelo patch"
+
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "em vez de aplicar o patch, mostrar o diffstat da entrada"
+
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "mostrar número de linhas adicionadas e removidas em notação decimal"
+
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "em vez de aplicar o patch, mostrar um resumo da entrada"
+
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "em vez de aplicar o patch, verificar se o patch pode ser aplicado"
+
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr "garantir que o patch pode ser aplicado ao índice atual"
+
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "aplicar um patch sem tocar na árvore de trabalho"
+
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr "aceitar patches que alteram ficheiros fora da área de trabalho"
+
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "aplicar o patch também (use com --stat/--summary/--check)"
+
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "tentar integração com três pontos se um patch não se aplica com êxito"
+
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+"construir um índice temporário baseado na informação incorporada do índice"
+
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:508
+msgid "paths are separated with NUL character"
+msgstr "os caminhos estão separados por caracteres NUL"
+
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr "garantir que, pelo menos, <n> linhas de contexto coincidem"
+
+#: apply.c:4949 builtin/am.c:2265
+msgid "action"
+msgstr "ação"
+
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "detetar linhas novas ou modificadas que tenham espaços em branco"
+
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignorar alterações de espaço em branco ao procurar contexto"
+
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "aplicar o patch em reverso"
+
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "não esperar nenhuma linha de contexto"
+
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "deixar os excertos rejeitados nos respetivos ficheiros *.rej"
+
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "permitir a sobreposição de excertos"
+
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "ser verboso"
+
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr ""
+"tolerar deteções incorretas de falta de nova linha no final do ficheiro"
+
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "não confiar na contagem de linhas no cabeçalho dos excertos"
+
+#: apply.c:4973 builtin/am.c:2274
+msgid "root"
+msgstr "raiz"
+
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "preceder <root> a todos os nomes de ficheiro"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<opções>] <árvore-etc> [<caminho>...]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <repo> [--exec <cmd>] [<opções>] <árvore-etc> "
+"[<caminho>...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <repo> [--exec <cmd>] --list"
+
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "o especificador de caminho '%s' não corresponde a nenhum ficheiro"
+
+#: archive.c:417
+msgid "fmt"
+msgstr "fmt"
+
+#: archive.c:417
+msgid "archive format"
+msgstr "formato do arquivo"
+
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "prefixo"
+
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "preceder o prefixo a cada nome de caminho dentro do arquivo"
+
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:542 builtin/ls-files.c:545
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "ficheiro"
+
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "escrever o arquivo para este ficheiro"
+
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr "ler .gitattributes do diretório de trabalho"
+
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "listar ficheiros arquivados para stderr"
+
+#: archive.c:425
+msgid "store only"
+msgstr "armazenar apenas"
+
+#: archive.c:426
+msgid "compress faster"
+msgstr "compressão rápida"
+
+#: archive.c:434
+msgid "compress better"
+msgstr "compressão ótima"
+
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "listar formatos de arquivo suportados"
+
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "repo"
+
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "obter o arquivo a partir do repositório remoto <repo>"
+
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "comando"
+
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "caminho para o comando git-upload-archive no remoto"
+
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "Opção inesperada --remote"
+
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "A opção --exec só pode ser usada em conjunto com --remote"
+
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "Opção inesperada --output"
+
+#: archive.c:475
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Formato de arquivo desconhecido '%s'"
+
+#: archive.c:482
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argumento não suportado para o formato '%s': -%d"
+
+#: attr.c:212
+#, c-format
+msgid "%.*s is not a valid attribute name"
+msgstr "%.*s não é um nome de atributo válido"
+
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Os padrões negativos são ignorados nos atributos do git\n"
+"Use '\\!' para uma exclamação literal à esquerda."
+
+#: bisect.c:443
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Não foi possível abrir o ficheiro '%s'"
+
+#: bisect.c:448
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Conteúdo incorretamente citado no ficheiro '%s': %s"
+
+#: bisect.c:656
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Não se está a bissetar mais!\n"
+
+#: bisect.c:709
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "%s não é um nome de commit válido"
+
+#: bisect.c:733
+#, c-format
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"A base de integração %s é má (bad).\n"
+"Significa que o bug foi corrigido entre %s e [%s].\n"
+
+#: bisect.c:738
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"A base de integração %s é nova (new).\n"
+"A propriedade foi mudada entre %s e [%s].\n"
+
+#: bisect.c:743
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"A base de integração %s é %s.\n"
+"Significa que o primeiro commit '%s' está entre %s e [%s].\n"
+
+#: bisect.c:751
+#, c-format
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Algumas revisões %s não antecedem a revisão %s.\n"
+"git bisect não pode funcionar corretamente nesta situação.\n"
+"Talvez confundiu revisões %s e %s?\n"
+
+#: bisect.c:764
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"tem-se que saltar a base de integração entre %s e [%s].\n"
+"Portanto não se pode ter a certeza que o primeiro commit %s está entre %s e "
+"%s.\n"
+"Continua-se de qualquer maneira."
+
+#: bisect.c:799
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "A bissetar: uma base de integração tem de ser testada\n"
+
+#: bisect.c:850
+#, c-format
+msgid "a %s revision is needed"
+msgstr "precisa-se de uma revisão %s"
+
+#: bisect.c:867 builtin/notes.c:174 builtin/tag.c:255
+#, c-format
+msgid "could not create file '%s'"
+msgstr "não foi possível criar o ficheiro '%s'"
+
+#: bisect.c:918
+#, c-format
+msgid "could not read file '%s'"
+msgstr "não foi possível ler o ficheiro '%s'"
+
+#: bisect.c:948
+msgid "reading bisect refs failed"
+msgstr "falha ao ler referências bissetadas"
+
+#: bisect.c:968
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s era %s e %s em simultâneo\n"
+
+#: bisect.c:976
+#, c-format
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"Nenhum commit testável encontrado.\n"
+"Talvez tenha começado com parâmetros de caminho incorretos?\n"
+
+#: bisect.c:995
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(aproximadamente %d passo)"
+msgstr[1] "(aproximadamente %d passos)"
+
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:999
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "A bissetar: falta %d revisão para testar depois desta %s\n"
+msgstr[1] "A bissetar: faltam %d revisões para testar depois desta %s\n"
+
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"Após resolver a causa do erro, pode tentar corrigir\n"
+"o ramo remoto que deve ser seguido, invocando\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "O ramo %s não foi configurado com ramo a montante dele próprio."
+
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr "Ramo %s configurado para seguir o ramo remoto %s de %s por rebase."
+
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Ramo %s configurado para seguir o ramo remoto %s de %s."
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "Ramo %s configurado para seguir o ramo local %s por rebase."
+
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "Ramo %s configurado para seguir o ramo local %s."
+
+#: branch.c:104
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Ramo %s configurado para seguir a referência remota %s por rebase."
+
+#: branch.c:105
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Ramo %s configurado para seguir a referência remota %s."
+
+#: branch.c:109
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr "Ramo %s configurado para seguir a referência local %s por rebase."
+
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "Ramo %s configurado para seguir a referência local %s."
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Não foi possível escrever a configuração do ramo a montante"
+
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Não seguido: informação da referência %s ambígua"
+
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' não é um nome válido para um ramo."
+
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "Já existe um ramo designado '%s'."
+
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Não é possível forçar a atualização do ramo atual."
+
+#: branch.c:218
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"Não é possível configurar ramo a seguir; o ponto inicial '%s' não é um ramo."
+
+#: branch.c:220
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "o ramo a montante solicitado '%s' não existe"
+
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Se pretende efetuar rebase do seu trabalho sobre um ramo\n"
+"a montante que já existe no remoto, pode ser necessário\n"
+"executar \"git fetch\" para obtê-lo.\n"
+"\n"
+"Se pretende publicar um novo ramo local que irá seguir\n"
+"o seu homólogo remoto, pode usar \"git push -u\" para configurar\n"
+"o respetivo ramo a montante, ao mesmo tempo que publica."
+
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "Nome de objeto inválido: '%s'."
+
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "Nome de objeto ambíguo: '%s'."
+
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "Ponto no ramo inválido: '%s'."
+
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' foi já extraído em '%s'"
+
+#: branch.c:364
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD da árvore de trabalho %s não está atualizada"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' não parece ser um ficheiro bundle v2"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "cabeçalho não reconhecido: %s%s (%d)"
+
+#: bundle.c:87 sequencer.c:1339 sequencer.c:1760 builtin/commit.c:777
+#, c-format
+msgid "could not open '%s'"
+msgstr "não foi possível abrir '%s'"
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "O repositório não possuí estes commits pré-requisitados:"
+
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2299
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "falha ao configurar percurso de revisões"
+
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "O bundle contém esta referência:"
+msgstr[1] "O bundle contém estas %d referências:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "O pacote regista um histórico completo."
+
+#: bundle.c:194
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "O bundle requer esta referência:"
+msgstr[1] "O bundle requer estas %d referências:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Não foi possível lançar pack-objects"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "pack-objects terminou inesperadamente"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list terminou inesperadamente"
+
+#: bundle.c:353
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "a referência '%s' é excluída pelas opções de rev-list"
+
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "argumento não reconhecido: %s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Criação de bundle vazio recusada."
+
+#: bundle.c:463
+#, c-format
+msgid "cannot create '%s'"
+msgstr "não é possível criar '%s'"
+
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "index-pack terminou inesperadamente"
+
+#: color.c:300
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "valor de cor inválido: %.*s"
+
+#: commit.c:40 sequencer.c:1572 builtin/am.c:421 builtin/am.c:457
+#: builtin/am.c:1493 builtin/am.c:2127
+#, c-format
+msgid "could not parse %s"
+msgstr "não foi possível analisar %s"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s não é um commit!"
+
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"aviso: a mensagem de commit não conforma com UTF-8.\n"
+"Pode querer emendá-lo depois de corrigir a mensagem ou definir a\n"
+"variável de configuração i18n.commitencoding com a codificação que\n"
+"o seu projeto utiliza.\n"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "memória esgotada"
+
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr "configuração relativa com inclusão condicional deve provir de ficheiros"
+
+#: config.c:701
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "linha de configuração %d incorreta no blob %s"
+
+#: config.c:705
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "linha de configuração %d incorreta no ficheiro %s"
+
+#: config.c:709
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "linha de configuração %d incorreta na entrada padrão"
+
+#: config.c:713
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "linha de configuração %d incorreta no submódulo-blob %s"
+
+#: config.c:717
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "linha de configuração %d incorreta na linha de comandos %s"
+
+#: config.c:721
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "linha de configuração %d incorreta em %s"
+
+#: config.c:840
+msgid "out of range"
+msgstr "fora de intervalo"
+
+#: config.c:840
+msgid "invalid unit"
+msgstr "unidade inválida"
+
+#: config.c:846
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valor numérico '%s' da configuração '%s' incorreto: %s"
+
+#: config.c:851
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "valor numérico '%s' da configuração '%s' incorreto no blob %s: %s"
+
+#: config.c:854
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "valor numérico '%s' da configuração '%s' incorreto no ficheiro %s: %s"
+
+#: config.c:857
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr ""
 "valor numérico '%s' da configuração '%s' incorreto na entrada padrão: %s"
 
-#: config.c:675
+#: config.c:860
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 msgstr ""
 "valor numérico '%s' da configuração '%s' incorreto no submódulo-blob %s: %s"
 
-#: config.c:678
+#: config.c:863
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
 msgstr ""
 "valor numérico '%s' da configuração '%s' incorreto na linha de comandos %s: "
 "%s"
 
-#: config.c:681
+#: config.c:866
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr "valor numérico '%s' da configuração '%s' incorreto em %s: %s"
 
-#: config.c:768
+#: config.c:953
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "falha ao expandir diretório de utilizador em: '%s'"
 
-#: config.c:849 config.c:860
+#: config.c:1048 config.c:1059
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "nível de compressão zlib %d incorreto"
 
-#: config.c:978
+#: config.c:1176
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "modo inválido para criação de objeto: %s"
 
-#: config.c:1312
+#: config.c:1332
+#, c-format
+msgid "bad pack compression level %d"
+msgstr "nível de compactação do pacote %d incorreto"
+
+#: config.c:1522
 msgid "unable to parse command-line config"
 msgstr "não é possível analisar configuração de linha de comandos"
 
-#: config.c:1362
+#: config.c:1572
 msgid "unknown error occurred while reading the configuration files"
 msgstr ""
 "ocorreu um erro desconhecido durante a leitura dos ficheiros de configuração"
 
-#: config.c:1716
+#: config.c:1931
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "Inválido %s: '%s'"
+
+#: config.c:1952
+#, c-format
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr ""
+"valor '%s' de core.untrackedCache desconhecido; usar 'keep' valor por omissão"
+
+#: config.c:1978
+#, c-format
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
+msgstr "o valor '%d' de splitIndex.maxPercentChange deve estar entre 0 e 100"
+
+#: config.c:1989
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "não é possível analisar '%s' da configuração de linha de comandos"
 
-#: config.c:1718
+#: config.c:1991
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "variável de configuração '%s' incorreta no ficheiro '%s' na linha %d"
 
-#: config.c:1777
+#: config.c:2050
 #, c-format
 msgid "%s has multiple values"
 msgstr "%s tem múltiplos valores"
 
-#: config.c:2311
+#: config.c:2384 config.c:2609
+#, c-format
+msgid "fstat on %s failed"
+msgstr "falha de fstat de %s"
+
+#: config.c:2502
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "não foi possível definir '%s' como '%s'"
 
-#: config.c:2313
+#: config.c:2504 builtin/remote.c:774
 #, c-format
 msgid "could not unset '%s'"
 msgstr "não foi possível reiniciar '%s'"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "O remoto desligou após contacto inicial"
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"Não foi possível ler do repositório remoto.\n"
+"\n"
+"Certifica-se que tem os direitos de acesso corretos\n"
+"e que o repositório existe."
+
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "A verificar conectividade"
 
-#: connected.c:74
+#: connected.c:75
 msgid "Could not run 'git rev-list'"
 msgstr "Não foi possível executar 'git rev-list'"
 
-#: connected.c:94
+#: connected.c:95
 msgid "failed write to rev-list"
 msgstr "falha ao escrever para rev-list"
 
-#: connected.c:101
+#: connected.c:102
 msgid "failed to close rev-list's stdin"
 msgstr "falha ao fechar entrada padrão de rev-list"
 
+#: convert.c:201
+#, c-format
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"CRLF será substituído por LF em %s.\n"
+"O final de linha original será mantido no ficheiro da sua árvore de trabalho."
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF será substituído por LF em %s."
+
+#: convert.c:211
+#, c-format
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"LF será substituído por CRLF em %s.\n"
+"O final de linha original será mantido no ficheiro da sua árvore de trabalho."
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF será substituído por CRLF em %s."
+
 #: date.c:97
 msgid "in the future"
 msgstr "no futuro"
@@ -800,26 +1516,31 @@ msgstr[1] "há %lu anos"
 msgid "failed to read orderfile '%s'"
 msgstr "falha ao ler o ficheiro de comando '%s'"
 
-#: diffcore-rename.c:540
+#: diffcore-rename.c:536
 msgid "Performing inexact rename detection"
 msgstr "Deteção de mudança de nome inexata em curso"
 
-#: diff.c:116
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "a opção '%s' requer um valor"
+
+#: diff.c:124
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  Falha ao analisar percentagem limite de dirstat '%s'\n"
 
-#: diff.c:121
+#: diff.c:129
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Parâmetro de dirstat desconhecido '%s'\n"
 
-#: diff.c:225
+#: diff.c:281
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Valor desconhecido na variável de configuração 'diff.submodule': '%s'"
 
-#: diff.c:277
+#: diff.c:344
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -828,16 +1549,20 @@ msgstr ""
 "Erros encontrados na variável de configuração 'diff.dirstat':\n"
 "%s"
 
-#: diff.c:3017
+#: diff.c:3102
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "o diff externo terminou inesperadamente, interrompido em %s"
 
-#: diff.c:3415
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check e -s são mutuamente exclusivos"
+
+#: diff.c:3518
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow requer exatamente um único especificador de caminho"
 
-#: diff.c:3578
+#: diff.c:3681
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -846,61 +1571,276 @@ msgstr ""
 "Falha ao analisar parâmetro da opção --dirstat/-X:\n"
 "%s"
 
-#: diff.c:3592
+#: diff.c:3695
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Falha ao analisar parâmetro da opção --submodule: '%s'"
 
-#: dir.c:1823
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
+msgstr ""
+"a deteção mudança de nome inexata foi omitida devido a demasiados ficheiros."
+
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
+msgstr ""
+"só foram encontradas cópias de caminhos modificados devido a demasiados "
+"ficheiros."
+
+#: diff.c:4725
+#, c-format
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"pode tentar definir a variável %s para, pelo menos, %d e repetir o comando."
+
+#: dir.c:1899
 msgid "failed to get kernel name and information"
 msgstr "falha ao obter nome e informação do kernel"
 
-#: dir.c:1942
+#: dir.c:2018
 msgid "Untracked cache is disabled on this system or location."
 msgstr "A cache não controlada está desativada neste sistema ou localização."
 
-#: gpg-interface.c:178
+#: dir.c:2776 dir.c:2781
+#, c-format
+msgid "could not create directories for %s"
+msgstr "não foi possível criar o diretórios para %s"
+
+#: dir.c:2806
+#, c-format
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "não foi possível migrar o diretório git de '%s' para '%s'"
+
+#: entry.c:280
+#, c-format
+msgid "could not stat file '%s'"
+msgstr "não foi possível obter stat do ficheiro '%s'"
+
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: esperava-se lista rasa"
+
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: esperava-se ACK/NAK, obteve-se EOF"
+
+#: fetch-pack.c:279
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: esperava-se ACK/NAK, obteve-se '%s'"
+
+#: fetch-pack.c:331
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc requer multi_ack_detailed"
+
+#: fetch-pack.c:417
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "linha rasa inválida: %s"
+
+#: fetch-pack.c:423
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "linha para aprofundar inválida: %s"
+
+#: fetch-pack.c:425
+#, c-format
+msgid "object not found: %s"
+msgstr "objeto não encontrado: %s"
+
+#: fetch-pack.c:428
+#, c-format
+msgid "error in object: %s"
+msgstr "erro no objeto: %s"
+
+#: fetch-pack.c:430
+#, c-format
+msgid "no shallow found: %s"
+msgstr "raso não encontrado: %s"
+
+#: fetch-pack.c:433
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "esperava-se raso/aprofundar, obteve-se %s"
+
+#: fetch-pack.c:472
+#, c-format
+msgid "got %s %d %s"
+msgstr "obteve-se %s %d %s"
+
+#: fetch-pack.c:486
+#, c-format
+msgid "invalid commit %s"
+msgstr "commit inválido %s"
+
+#: fetch-pack.c:519
+msgid "giving up"
+msgstr "desistência"
+
+#: fetch-pack.c:529 progress.c:235
+msgid "done"
+msgstr "concluído"
+
+#: fetch-pack.c:541
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "obteve-se %s (%d) %s"
+
+#: fetch-pack.c:587
+#, c-format
+msgid "Marking %s as complete"
+msgstr "Marcado %s como completo"
+
+#: fetch-pack.c:735
+#, c-format
+msgid "already have %s (%s)"
+msgstr "já se tem %s (%s)"
+
+#: fetch-pack.c:773
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: não é possível efetuar fork de sideband demultiplexer"
+
+#: fetch-pack.c:781
+msgid "protocol error: bad pack header"
+msgstr "erro de protocolo: cabeçalho de pacote incorreto"
+
+#: fetch-pack.c:837
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: não é possível criar processo filho %s"
+
+#: fetch-pack.c:853
+#, c-format
+msgid "%s failed"
+msgstr "%s falhou"
+
+#: fetch-pack.c:855
+msgid "error in sideband demultiplexer"
+msgstr "erro no sideband demultiplexer"
+
+#: fetch-pack.c:882
+msgid "Server does not support shallow clients"
+msgstr "O servidor não suporta clientes rasos"
+
+#: fetch-pack.c:886
+msgid "Server supports multi_ack_detailed"
+msgstr "O servidor suporta multi_ack_detailed"
+
+#: fetch-pack.c:889
+msgid "Server supports no-done"
+msgstr "O servidor suporta no-done"
+
+#: fetch-pack.c:895
+msgid "Server supports multi_ack"
+msgstr "O servidor suporta muilti_ack"
+
+#: fetch-pack.c:899
+msgid "Server supports side-band-64k"
+msgstr "O servidor suporta side-band-64k"
+
+#: fetch-pack.c:903
+msgid "Server supports side-band"
+msgstr "O servidor suporta side-band"
+
+#: fetch-pack.c:907
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "O servidor suporta allow-tip-sha1-in-want"
+
+#: fetch-pack.c:911
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "O servidor suporta allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:921
+msgid "Server supports ofs-delta"
+msgstr "O servidor suporta ofs-delta"
+
+#: fetch-pack.c:928
+#, c-format
+msgid "Server version is %.*s"
+msgstr "A versão do servidor é %.*s"
+
+#: fetch-pack.c:934
+msgid "Server does not support --shallow-since"
+msgstr "O servidor não suporta --shallow-since"
+
+#: fetch-pack.c:938
+msgid "Server does not support --shallow-exclude"
+msgstr "O servidor não suporta --shallow-exclude"
+
+#: fetch-pack.c:940
+msgid "Server does not support --deepen"
+msgstr "O servidor não suporta --deepen"
+
+#: fetch-pack.c:951
+msgid "no common commits"
+msgstr "nenhum commit em comum"
+
+#: fetch-pack.c:963
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: falha ao obter."
+
+#: fetch-pack.c:1125
+msgid "no matching remote head"
+msgstr "nenhuma cabeça remota correspondente"
+
+#: fetch-pack.c:1147
+#, c-format
+msgid "no such remote ref %s"
+msgstr "referência remota %s inexistente"
+
+#: fetch-pack.c:1150
+#, c-format
+msgid "Server does not allow request for unadvertised object %s"
+msgstr "O servidor não permite pedido do objeto não anunciado %s"
+
+#: gpg-interface.c:185
 msgid "gpg failed to sign the data"
 msgstr "gpg não assinou os dados"
 
-#: gpg-interface.c:208
+#: gpg-interface.c:215
 msgid "could not create temporary file"
 msgstr "não foi possível criar ficheiro temporário"
 
-#: gpg-interface.c:210
+#: gpg-interface.c:217
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "falha ao escrever assinatura destacada em '%s'"
 
-#: grep.c:1792
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "ignorar cor inválida '%.*s' em log.graphColors"
+
+#: grep.c:1796
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': não foi possível ler %s"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "falha ao invocar stat de '%s'"
 
-#: grep.c:1820
+#: grep.c:1824
 #, c-format
 msgid "'%s': short read"
 msgstr "'%s': leitura truncada"
 
-#: help.c:205
+#: help.c:218
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "comandos do git disponível em '%s'"
 
-#: help.c:212
+#: help.c:225
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "comandos do git disponíveis noutras localizações em $PATH"
 
-#: help.c:244
+#: help.c:256
 msgid "These are common Git commands used in various situations:"
 msgstr "Estes são comandos do Git comuns usados em diversas situações:"
 
-#: help.c:309
+#: help.c:321
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -909,11 +1849,11 @@ msgstr ""
 "'%s' parece ser um comando do git, mas não é possível\n"
 "executá-lo. Talvez git-%s esteja danificado?"
 
-#: help.c:366
+#: help.c:376
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Oh não. Não há nenhum comando do Git disponível no sistema."
 
-#: help.c:388
+#: help.c:398
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -922,17 +1862,17 @@ msgstr ""
 "AVISO: Invocou um comando do Git designado '%s' que não existe.\n"
 "Continuando, assumindo que queria dizer '%s'"
 
-#: help.c:393
+#: help.c:403
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "automaticamente em %0.1f..."
 
-#: help.c:400
+#: help.c:410
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: '%s' não é um comando do git. Consulte 'git --help'."
 
-#: help.c:404 help.c:470
+#: help.c:414 help.c:480
 msgid ""
 "\n"
 "Did you mean this?"
@@ -946,11 +1886,71 @@ msgstr[1] ""
 "\n"
 "Queria dizer deste?"
 
-#: help.c:466
+#: help.c:476
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
+#: ident.c:343
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"*** Por favor diga que é.\n"
+"\n"
+"Execute\n"
+"\n"
+"  git config --global user.email \"eu@exemplo.com\"\n"
+"  git config --global user.name \"Meu Nome\"\n"
+"\n"
+"para definir a identidade predefinida da sua conta.\n"
+"Omita --global para definir a identidade apenas neste repositório.\n"
+"\n"
+
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "nenhum e-mail indicado e a deteção automática está desativada"
+
+#: ident.c:372
+#, c-format
+msgid "unable to auto-detect email address (got '%s')"
+msgstr ""
+"não é possível detetar automaticamente endereço de e-mail (obteve-se '%s')"
+
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "nenhum nome indicado e a deteção automática está desativada"
+
+#: ident.c:388
+#, c-format
+msgid "unable to auto-detect name (got '%s')"
+msgstr "não é possível detetar automaticamente o nome (obteve-se '%s')"
+
+#: ident.c:396
+#, c-format
+msgid "empty ident name (for <%s>) not allowed"
+msgstr "nome de identificação vazio (de <%s>) não é permitido"
+
+#: ident.c:402
+#, c-format
+msgid "name consists only of disallowed characters: %s"
+msgstr "nome consiste apenas de caracteres não permitidos: %s"
+
+#: ident.c:417 builtin/commit.c:611
+#, c-format
+msgid "invalid date format: %s"
+msgstr "formato de data inválido: %s"
+
 #: lockfile.c:152
 #, c-format
 msgid ""
@@ -979,8 +1979,8 @@ msgstr "Não é foi possível criar '%s.lock': %s"
 msgid "failed to read the cache"
 msgstr "falha ao ler a cache"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
+#: merge.c:96 builtin/am.c:2000 builtin/am.c:2035 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
 msgid "unable to write new index file"
 msgstr "não foi possível escrever novo ficheiro de índice"
 
@@ -988,69 +1988,69 @@ msgstr "não foi possível escrever novo ficheiro de índice"
 msgid "(bad commit)\n"
 msgstr "(commit incorreto)\n"
 
-#: merge-recursive.c:231
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache falhou no caminho '%s'"
 
-#: merge-recursive.c:301
+#: merge-recursive.c:303
 msgid "error building trees"
 msgstr "erro ao construir árvores"
 
-#: merge-recursive.c:720
+#: merge-recursive.c:727
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "falha ao criar o caminho '%s'%s"
 
-#: merge-recursive.c:731
+#: merge-recursive.c:738
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "A remover %s para criar espaço para o subdiretório\n"
 
-#: merge-recursive.c:745 merge-recursive.c:764
+#: merge-recursive.c:752 merge-recursive.c:771
 msgid ": perhaps a D/F conflict?"
 msgstr ": talvez um conflito D/F?"
 
-#: merge-recursive.c:754
+#: merge-recursive.c:761
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "perda de ficheiro não controlado em '%s' recusada"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "não é possível ler o objeto %s: '%s'"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:805
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob para %s '%s' esperado"
 
-#: merge-recursive.c:822
+#: merge-recursive.c:829
 #, c-format
 msgid "failed to open '%s': %s"
 msgstr "falha ao abrir '%s': %s"
 
-#: merge-recursive.c:833
+#: merge-recursive.c:840
 #, c-format
 msgid "failed to symlink '%s': %s"
 msgstr "falha ao criar a ligação simbólica '%s': %s"
 
-#: merge-recursive.c:838
+#: merge-recursive.c:845
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "não sei o que fazer com %06o %s '%s'"
 
-#: merge-recursive.c:978
+#: merge-recursive.c:985
 msgid "Failed to execute internal merge"
 msgstr "Falha ao executar integração interna"
 
-#: merge-recursive.c:982
+#: merge-recursive.c:989
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Não é possível adicionar %s à base de dados"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1059,7 +2059,16 @@ msgstr ""
 "CONFLITO (%s/eliminar): %s eliminado em %s e %s em %s. Versão de %s de %s "
 "deixada na árvore."
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: merge-recursive.c:1097
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
+msgstr ""
+"CONFLITO (%s/eliminar): %s eliminado em %s e %s para %s em %s. Versão de %s "
+"de %s deixada na árvore."
+
+#: merge-recursive.c:1104
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1068,6 +2077,15 @@ msgstr ""
 "CONFLITO (%s/eliminar): %s eliminado em %s e %s em %s. Versão de %s de %s "
 "deixada na árvore em %s."
 
+#: merge-recursive.c:1109
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
+msgstr ""
+"CONFLITO (%s/eliminar): %s eliminado em %s e %s para %s em %s. Versão de %s "
+"de %s deixada na árvore em %s."
+
 #: merge-recursive.c:1143
 msgid "rename"
 msgstr "mudar nome"
@@ -1106,125 +2124,141 @@ msgstr ""
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "A mudar o nome de %s para %s e de %s para %s, em alternativa"
 
-#: merge-recursive.c:1531
+#: merge-recursive.c:1528
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "CONFLITO (mudar nome/adicionar): Mudar o nome %s->%s em %s. %s adicionado em "
 "%s"
 
-#: merge-recursive.c:1546
+#: merge-recursive.c:1543
 #, c-format
 msgid "Adding merged %s"
 msgstr "A adicionar %s integrado"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
 msgid "Adding as %s instead"
 msgstr "A adicionar como %s, em alternativa."
 
-#: merge-recursive.c:1610
+#: merge-recursive.c:1607
 #, c-format
 msgid "cannot read object %s"
 msgstr "não foi possível ler o objeto %s"
 
-#: merge-recursive.c:1613
+#: merge-recursive.c:1610
 #, c-format
 msgid "object %s is not a blob"
 msgstr "o objeto %s não é um blob"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modify"
 msgstr "modificar"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modified"
 msgstr "modificado"
 
-#: merge-recursive.c:1676
+#: merge-recursive.c:1689
 msgid "content"
 msgstr "conteúdo"
 
-#: merge-recursive.c:1683
+#: merge-recursive.c:1696
 msgid "add/add"
 msgstr "adicionar/adicionar"
 
-#: merge-recursive.c:1718
+#: merge-recursive.c:1732
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ignorado (integrado é igual ao existente)"
 
-#: merge-recursive.c:1732
+#: merge-recursive.c:1746
 #, c-format
 msgid "Auto-merging %s"
 msgstr "A integrar automaticamente %s"
 
-#: merge-recursive.c:1736 git-submodule.sh:919
+#: merge-recursive.c:1750 git-submodule.sh:944
 msgid "submodule"
 msgstr "submódulo"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1751
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "CONFLITO (%s): conflito de integração em %s"
 
-#: merge-recursive.c:1831
+#: merge-recursive.c:1845
 #, c-format
 msgid "Removing %s"
 msgstr "A remover %s"
 
-#: merge-recursive.c:1857
+#: merge-recursive.c:1871
 msgid "file/directory"
 msgstr "ficheiro/diretório"
 
-#: merge-recursive.c:1863
+#: merge-recursive.c:1877
 msgid "directory/file"
 msgstr "diretório/ficheiro"
 
-#: merge-recursive.c:1868
+#: merge-recursive.c:1883
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "CONFLITO (%s): Há um diretório designado %s em %s. A adicionar %s como %s"
 
-#: merge-recursive.c:1877
+#: merge-recursive.c:1892
 #, c-format
 msgid "Adding %s"
 msgstr "A adicionar %s"
 
-#: merge-recursive.c:1914
+#: merge-recursive.c:1929
 msgid "Already up-to-date!"
 msgstr "Já está atualizado!"
 
-#: merge-recursive.c:1923
+#: merge-recursive.c:1938
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "falha ao integrar as árvores %s e %s"
 
-#: merge-recursive.c:2006
+#: merge-recursive.c:2021
 msgid "Merging:"
 msgstr "A integrar:"
 
-#: merge-recursive.c:2019
+#: merge-recursive.c:2034
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "%u antecessor comum encontrado:"
 msgstr[1] "%u antecessores comuns encontrados:"
 
-#: merge-recursive.c:2058
+#: merge-recursive.c:2073
 msgid "merge returned no commit"
 msgstr "a integração não retornou nenhum commit"
 
-#: merge-recursive.c:2121
+#: merge-recursive.c:2136
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Não foi possível analisar o objeto '%s'"
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
 msgid "Unable to write index."
 msgstr "Não é possível escrever no índice."
 
+#: notes-merge.c:273
+#, c-format
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
+msgstr ""
+"Não concluíu a integração de notas anterior (%s existe).\n"
+"Use 'git notes merge --commit' ou 'git notes merge --abort' para submeter/"
+"abortar a integração anterior antes de começar uma nova integração de notas."
+
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Não concluído a integração de integração de notas (%s presente)."
+
 #: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
@@ -1247,7 +2281,7 @@ msgstr "Reescrita de notas em %s (fora de refs/notes/) recusada"
 msgid "Bad %s value: '%s'"
 msgstr "Valor incorreto de %s: '%s'"
 
-#: object.c:242
+#: object.c:240
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "não foi possível analisar o objeto: %s"
@@ -1282,18 +2316,37 @@ msgstr "-NUM"
 msgid "malformed object name '%s'"
 msgstr "nome do objeto malformado '%s'"
 
-#: path.c:798
+#: path.c:805
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Não foi possível dar permissão de escrita ao grupo a %s"
 
-#: pathspec.c:133
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
+msgstr ""
+"O carácter de escape '\\' não pode ser usado como último carácter no valor "
+"de attr"
+
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
+msgstr "Só se pode especificar um 'attr:'."
+
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "especificador attr não pode estar vazio"
+
+#: pathspec.c:189
+#, c-format
+msgid "invalid attribute name %s"
+msgstr "nome de atributo inválido %s"
+
+#: pathspec.c:254
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
 "as definições globais 'glob' e 'noglob' de especificador de caminho "
 "(pathspec) são incompatíveis"
 
-#: pathspec.c:143
+#: pathspec.c:261
 msgid ""
 "global 'literal' pathspec setting is incompatible with all other global "
 "pathspec settings"
@@ -1301,68 +2354,69 @@ msgstr ""
 "a definição global de especificador de caminho 'literal' é incompatível com "
 "todas as outras definições globais de especificador de caminho (pathspec)"
 
-#: pathspec.c:177
+#: pathspec.c:301
 msgid "invalid parameter for pathspec magic 'prefix'"
 msgstr "parâmetro inválido na mágica 'prefix' do especificador de caminho"
 
-#: pathspec.c:183
+#: pathspec.c:322
 #, c-format
 msgid "Invalid pathspec magic '%.*s' in '%s'"
 msgstr "Mágica do especificador de caminho '%.*s' inválida em '%s'"
 
-#: pathspec.c:187
+#: pathspec.c:327
 #, c-format
 msgid "Missing ')' at the end of pathspec magic in '%s'"
 msgstr "Falta um ')' no final da mágica do especificador de caminho em '%s'"
 
-#: pathspec.c:205
+#: pathspec.c:365
 #, c-format
 msgid "Unimplemented pathspec magic '%c' in '%s'"
 msgstr "Mágica de especificador de caminho '%c' em '%s' não implementada"
 
-#: pathspec.c:230
+#: pathspec.c:421 pathspec.c:443
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "O caminho '%s' está dentro do submódulo '%.*s'"
+
+#: pathspec.c:483
 #, c-format
 msgid "%s: 'literal' and 'glob' are incompatible"
 msgstr "%s: 'literal' e 'glob' são incompatíveis"
 
-#: pathspec.c:241
+#: pathspec.c:496
 #, c-format
 msgid "%s: '%s' is outside repository"
 msgstr "%s: '%s' está fora do repositório"
 
-#: pathspec.c:291
+#: pathspec.c:584
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "O caminho '%s' está dentro do submódulo '%.*s'"
+msgid "'%s' (mnemonic: '%c')"
+msgstr "'%s' (mnemónica: '%c')"
 
-#: pathspec.c:353
+#: pathspec.c:594
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
 "%s: mágica de especificador de caminho não suportada por este comando: %s"
 
-#: pathspec.c:433
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"cadeias de caracteres vazias como especificadores de caminho tornar-se-ão "
+"inválidas nas próximas versões. Use . para corresponder a todos os caminhos"
+
+#: pathspec.c:668
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "o especificador de caminho '%s' é indicado por uma ligação simbólica"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-"Não há nada para excluir de acordo com o padrão :(excluir).\n"
-"Talvez se tenha esquecido de acrescentar ':/' ou '.' ?"
-
-#: pretty.c:973
+#: pretty.c:982
 msgid "unable to parse --pretty format"
 msgstr "não foi possível analisar o formato de --pretty"
 
-#: progress.c:235
-msgid "done"
-msgstr "concluído"
-
-#: read-cache.c:1281
+#: read-cache.c:1307
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1371,7 +2425,7 @@ msgstr ""
 "index.version definido, mas com valor inválido.\n"
 "A usar a versão %i"
 
-#: read-cache.c:1291
+#: read-cache.c:1317
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1380,252 +2434,360 @@ msgstr ""
 "GIT_INDEX_VERSION definido, mas com valor inválido.\n"
 "A usar a versão %i"
 
-#: refs.c:551 builtin/merge.c:840
+#: read-cache.c:2232
+#, c-format
+msgid "could not stat '%s"
+msgstr "não foi possível obter stat de '%s'"
+
+#: read-cache.c:2245
+#, c-format
+msgid "unable to open git dir: %s"
+msgstr "não é possível diretório git: %s"
+
+#: read-cache.c:2257
+#, c-format
+msgid "unable to unlink: %s"
+msgstr "não é possível invocar unlink: %s"
+
+#: refs.c:619 builtin/merge.c:844
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Não foi possível abrir '%s' para escrita"
 
-#: refs/files-backend.c:2534
+#: refs/files-backend.c:2531
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "não foi possível eliminar a referência %s: %s"
 
-#: refs/files-backend.c:2537
+#: refs/files-backend.c:2534
 #, c-format
 msgid "could not delete references: %s"
 msgstr "não foi possível eliminar as referências: %s"
 
-#: refs/files-backend.c:2546
+#: refs/files-backend.c:2543
 #, c-format
 msgid "could not remove reference %s"
 msgstr "não foi possível eliminar a referência %s"
 
-#: ref-filter.c:55
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "desaparecido"
+
+#: ref-filter.c:36
+#, c-format
+msgid "ahead %d"
+msgstr "à frente %d"
+
+#: ref-filter.c:37
+#, c-format
+msgid "behind %d"
+msgstr "atrás %d"
+
+#: ref-filter.c:38
+#, c-format
+msgid "ahead %d, behind %d"
+msgstr "à frente %d, atrás %d"
+
+#: ref-filter.c:104
 #, c-format
 msgid "expected format: %%(color:<color>)"
 msgstr "formato esperado: %%(color:<cor>)"
 
-#: ref-filter.c:57
+#: ref-filter.c:106
 #, c-format
 msgid "unrecognized color: %%(color:%s)"
 msgstr "cor não reconhecida: %%(color:%s)"
 
-#: ref-filter.c:71
+#: ref-filter.c:120
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "formato não reconhecido: %%(%s)"
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "valor inteiro esperado refname:lstrip=%s"
 
-#: ref-filter.c:77
+#: ref-filter.c:124
+#, c-format
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "Valor inteiro esperado refname:rstrip=%s"
+
+#: ref-filter.c:126
+#, c-format
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "argumento de %%(%s) não reconhecido: %s"
+
+#: ref-filter.c:166
 #, c-format
 msgid "%%(body) does not take arguments"
 msgstr "%%(body) não leva argumentos"
 
-#: ref-filter.c:84
+#: ref-filter.c:173
 #, c-format
 msgid "%%(subject) does not take arguments"
 msgstr "%%(subject) não leva argumentos"
 
-#: ref-filter.c:101
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) não leva argumentos"
+
+#: ref-filter.c:199
 #, c-format
 msgid "positive value expected contents:lines=%s"
 msgstr "valor positivo esperado contents:lines=%s"
 
-#: ref-filter.c:103
+#: ref-filter.c:201
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
 msgstr "argumento de %%(contents) não reconhecido: %s"
 
-#: ref-filter.c:113
+#: ref-filter.c:214
+#, c-format
+msgid "positive value expected objectname:short=%s"
+msgstr "valor positivo esperado objectname:short=%s"
+
+#: ref-filter.c:218
 #, c-format
 msgid "unrecognized %%(objectname) argument: %s"
 msgstr "argumento de %%(objectname) não reconhecido: %s"
 
-#: ref-filter.c:135
+#: ref-filter.c:245
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "formato esperado: %%(align:<largura>,<posição>)"
 
-#: ref-filter.c:147
+#: ref-filter.c:257
 #, c-format
 msgid "unrecognized position:%s"
 msgstr "posição não reconhecida:%s"
 
-#: ref-filter.c:151
+#: ref-filter.c:261
 #, c-format
 msgid "unrecognized width:%s"
 msgstr "largura não reconhecida:%s"
 
-#: ref-filter.c:157
+#: ref-filter.c:267
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
 msgstr "argumento de %%(align) não reconhecido: %s"
 
-#: ref-filter.c:161
+#: ref-filter.c:271
 #, c-format
 msgid "positive width expected with the %%(align) atom"
 msgstr "largura positiva esperada com o átomo %%(algn)"
 
-#: ref-filter.c:244
+#: ref-filter.c:286
+#, c-format
+msgid "unrecognized %%(if) argument: %s"
+msgstr "argumento de %%(if) não reconhecido: %s"
+
+#: ref-filter.c:371
 #, c-format
 msgid "malformed field name: %.*s"
 msgstr "nome de ficheiro malformado: %.*s"
 
-#: ref-filter.c:270
+#: ref-filter.c:397
 #, c-format
 msgid "unknown field name: %.*s"
 msgstr "nome do campo desconhecido: %.*s"
 
-#: ref-filter.c:372
+#: ref-filter.c:501
+#, c-format
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "formato: átomo %%(if) utilizado sem átomo %%(then) correspondente"
+
+#: ref-filter.c:561
+#, c-format
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "formato: átomo %%(then) utilizado sem átomo %%(if) correspondente"
+
+#: ref-filter.c:563
+#, c-format
+msgid "format: %%(then) atom used more than once"
+msgstr "formato: átomo %%(then) utilizado mais que uma vez"
+
+#: ref-filter.c:565
+#, c-format
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "formato: átomo %%(then) utilizado depois de %%(else)"
+
+#: ref-filter.c:591
+#, c-format
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "formato: átomo %%(else) utilizado sem átomo %%(if) correspondente"
+
+#: ref-filter.c:593
+#, c-format
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "formato: átomo %%(else) utilizado sem átomo %%(then) correspondente"
+
+#: ref-filter.c:595
+#, c-format
+msgid "format: %%(else) atom used more than once"
+msgstr "formato: átomo %%(else) utilizado mais que uma vez"
+
+#: ref-filter.c:608
 #, c-format
 msgid "format: %%(end) atom used without corresponding atom"
 msgstr "formato: átomo %%(end) utilizado sem átomo correspondente"
 
-#: ref-filter.c:424
+#: ref-filter.c:663
 #, c-format
 msgid "malformed format string %s"
 msgstr "cadeia malformada %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= requer um inteiro positivo como argumento"
+#: ref-filter.c:1247
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(nenhum ramo, a efetuar rebase de %s)"
+
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(nenhum ramo, bissecção iniciada em %s)"
 
-#: ref-filter.c:883
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "a referência '%s' não tem %ld componentes como se indica em :strip"
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD destacada em %s)"
 
-#: ref-filter.c:1046
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "formato de %.*s desconhecido %s"
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD destacada de %s)"
+
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(nenhum ramo)"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: ref-filter.c:1420 ref-filter.c:1451
 #, c-format
 msgid "missing object %s for %s"
 msgstr "falta o objeto %s de %s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: ref-filter.c:1423 ref-filter.c:1454
 #, c-format
 msgid "parse_object_buffer failed on %s for %s"
 msgstr "falha ao invocar parse_object_buffer sobre %s de %s"
 
-#: ref-filter.c:1311
+#: ref-filter.c:1692
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "objeto malformado em '%s'"
 
-#: ref-filter.c:1373
+#: ref-filter.c:1759
 #, c-format
 msgid "ignoring ref with broken name %s"
 msgstr "a referência %s com nome danificado foi ignorada"
 
-#: ref-filter.c:1378
+#: ref-filter.c:1764
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "a referência %s danificada foi ignorada"
 
-#: ref-filter.c:1651
+#: ref-filter.c:2028
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "formato: falta átomo %%(end)"
 
-#: ref-filter.c:1705
+#: ref-filter.c:2109
 #, c-format
 msgid "malformed object name %s"
 msgstr "nome de objeto malformado %s"
 
-#: remote.c:746
+#: remote.c:754
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Não é possível obter %s e %s ao mesmo tempo para %s"
 
-#: remote.c:750
+#: remote.c:758
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s geralmente segue %s, não %s"
 
-#: remote.c:754
+#: remote.c:762
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s segue %s e %s em simultâneo"
 
-#: remote.c:762
+#: remote.c:770
 msgid "Internal error"
 msgstr "Erro interno"
 
-#: remote.c:1677 remote.c:1720
+#: remote.c:1685 remote.c:1787
 msgid "HEAD does not point to a branch"
 msgstr "HEAD não aponta para um ramo"
 
-#: remote.c:1686
+#: remote.c:1694
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "ramo inexistente: '%s'"
 
-#: remote.c:1689
+#: remote.c:1697
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "nenhum ramo a montante configurado para o ramo '%s'"
 
-#: remote.c:1695
+#: remote.c:1703
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
 "o ramo a montante '%s' não está guardado como um ramo de monitorização remoto"
 
-#: remote.c:1710
+#: remote.c:1718
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "o destino de publicação '%s' no remoto '%s' não é seguido por nenhum ramo "
 "local"
 
-#: remote.c:1725
+#: remote.c:1730
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "o ramo '%s' não tem nenhum remoto para publicar"
 
-#: remote.c:1736
+#: remote.c:1741
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr ""
 "'%2$s' não faz parte dos especificadores de referência de '%1$s' para "
 "publicação"
 
-#: remote.c:1749
+#: remote.c:1754
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "publicação sem destino (push.default é 'nothing')"
 
-#: remote.c:1771
+#: remote.c:1776
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "não é possível resolver a publicação 'simple' num único destino"
 
-#: remote.c:2073
+#: remote.c:2081
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "A base do seu ramo é '%s', mas o ramo a montante desapareceu.\n"
 
-#: remote.c:2077
+#: remote.c:2085
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (use \"git branch --unset-upstream\" para corrigir)\n"
 
-#: remote.c:2080
+#: remote.c:2088
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "O seu ramo está atualizado com '%s'.\n"
 
-#: remote.c:2084
+#: remote.c:2092
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "O seu ramo está à frente de '%s' por %d commit.\n"
 msgstr[1] "O seu ramo está à frente de '%s' por %d commits.\n"
 
-#: remote.c:2090
+#: remote.c:2098
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (use \"git push\" para publicar os commits locais)\n"
 
-#: remote.c:2093
+#: remote.c:2101
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1637,11 +2799,11 @@ msgstr[1] ""
 "O seu ramo está atrás de '%s' por %d commits, podendo ser atualizado com "
 "avanço rápido.\n"
 
-#: remote.c:2101
+#: remote.c:2109
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (use \"git pull\" para atualizar o seu ramo local)\n"
 
-#: remote.c:2104
+#: remote.c:2112
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1656,41 +2818,51 @@ msgstr[1] ""
 "O seu ramo e '%s' divergiram,\n"
 "tendo cada um %d e %d commits diferentes, respetivamente.\n"
 
-#: remote.c:2114
+#: remote.c:2122
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (use \"git pull\" para integrar o ramo remoto no seu ramo)\n"
 
-#: revision.c:2132
+#: revision.c:2158
 msgid "your current branch appears to be broken"
 msgstr "o ramo atual parece estar danificado"
 
-#: revision.c:2135
+#: revision.c:2161
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "o ramo atual '%s' ainda não contém nenhum commit"
 
-#: revision.c:2329
+#: revision.c:2355
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent é incompatível com --bisect"
 
-#: run-command.c:92
+#: run-command.c:125
 msgid "open /dev/null failed"
 msgstr "falha ao abrir /dev/null"
 
-#: run-command.c:94
+#: run-command.c:127
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) falhou"
 
-#: send-pack.c:298
+#: send-pack.c:150
+#, c-format
+msgid "unable to parse remote unpack status: %s"
+msgstr "não é possível analisar status de descompactação remota: %s"
+
+#: send-pack.c:152
+#, c-format
+msgid "remote unpack failed: %s"
+msgstr "descompactação remota falhou: %s"
+
+#: send-pack.c:315
 msgid "failed to sign the push certificate"
 msgstr "falha ao assinar o certificado de publicação"
 
-#: send-pack.c:411
+#: send-pack.c:428
 msgid "the receiving end does not support --signed push"
 msgstr "o recetor não suporta publicação com --signed"
 
-#: send-pack.c:413
+#: send-pack.c:430
 msgid ""
 "not sending a push certificate since the receiving end does not support --"
 "signed push"
@@ -1698,15 +2870,32 @@ msgstr ""
 "certificado de publicação não enviado uma vez que o recetor não suporta "
 "publicação com --signed"
 
-#: send-pack.c:425
+#: send-pack.c:442
 msgid "the receiving end does not support --atomic push"
 msgstr "o recetor não suporta publicação com --atomic"
 
-#: send-pack.c:430
+#: send-pack.c:447
 msgid "the receiving end does not support push options"
 msgstr "o recetor não suporta opções de publicação"
 
-#: sequencer.c:174
+#: sequencer.c:215
+msgid "revert"
+msgstr "reverter"
+
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "cherry-pick"
+
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
+
+#: sequencer.c:221
+#, c-format
+msgid "Unknown action: %d"
+msgstr "Ação desconhecida: %d"
+
+#: sequencer.c:278
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1714,7 +2903,7 @@ msgstr ""
 "depois de resolver os conflitos, marque os caminhos corrigidos\n"
 "com 'git add <caminhos>' ou 'git rm <caminhos>'"
 
-#: sequencer.c:177
+#: sequencer.c:281
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1724,2336 +2913,2208 @@ msgstr ""
 "com 'git add <caminhos>' ou 'git rm <caminhos>'\n"
 "e submeta o resultado com 'git commit'"
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
-#, c-format
-msgid "Could not write to %s"
-msgstr "Não foi possível escrever em %s"
-
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
-#, c-format
-msgid "Error wrapping up %s."
-msgstr "Erro ao rematar %s."
-
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "As suas alterações locais serão substituídas por cherry-pick."
-
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "As suas alterações locais serão substituídas por revert."
-
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Submeta ou esconda as suas alterações para continuar."
-
-#: sequencer.c:228
-#, c-format
-msgid "%s: fast-forward"
-msgstr "%s: avanço rápido"
-
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Não foi possível escrever novo ficheiro de índice"
-
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "Não foi possível resolver o commit HEAD\n"
-
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "Não foi possível atualizar a árvore de cache\n"
-
-#: sequencer.c:393
+#: sequencer.c:294 sequencer.c:1675
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Não foi possível analisar o commit %s\n"
+msgid "could not lock '%s'"
+msgstr "não foi possível bloquear '%s'"
 
-#: sequencer.c:398
+#: sequencer.c:297 sequencer.c:1553 sequencer.c:1680 sequencer.c:1694
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Não foi possível analisar o commit pai %s\n"
+msgid "could not write to '%s'"
+msgstr "não foi possível escrever em '%s'"
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "Ficheiro de índice não integrado."
-
-#: sequencer.c:482
+#: sequencer.c:301
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "O commit %s é uma integração mas não foi fornecida nenhuma opção -m."
+msgid "could not write eol to '%s'"
+msgstr "não foi possível escrever fim de linha em '%s'"
 
-#: sequencer.c:490
+#: sequencer.c:305 sequencer.c:1558 sequencer.c:1682
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "O commit %s não tem o pai %d"
+msgid "failed to finalize '%s'."
+msgstr "falha ao finalizar '%s'."
 
-#: sequencer.c:494
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1579 builtin/am.c:259
+#: builtin/commit.c:749 builtin/merge.c:1018
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr ""
-"A linha principal foi especificada mas o commit %s não é uma integração."
+msgid "could not read '%s'"
+msgstr "não foi possível ler '%s'"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: sequencer.c:355
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: não foi possível analisar o commit pai %s"
+msgid "your local changes would be overwritten by %s."
+msgstr "as suas alterações locais serão substituídas ao %s."
 
-#: sequencer.c:511
-#, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Não é possível obter a mensagem de commit de %s"
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "submeta ou esconda as suas alterações para continuar."
 
-#: sequencer.c:597
+#: sequencer.c:388
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "não foi possível reverter %s... %s"
+msgid "%s: fast-forward"
+msgstr "%s: avanço rápido"
 
-#: sequencer.c:598
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "não foi possível aplicar %s... %s"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Não foi possível escrever novo ficheiro de índice"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "o conjunto de commits especificado está vazio"
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "não foi possível resolver o commit HEAD\n"
 
-#: sequencer.c:641
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: falha ao ler o índice"
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "não foi possível atualizar a árvore de cache\n"
 
-#: sequencer.c:645
+#: sequencer.c:592
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: falha ao atualizar o índice"
-
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "Não é possível reverter durante outra reversão."
-
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "Não é possível reverter durante um cherry-pick."
-
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "Não é possível efetuar cherry-pick durante uma reversão."
-
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
+msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
-"Não é possível efetuar cherry-pick durante outro cherry-pick. durante um "
-"cherry-pick."
-
-#: sequencer.c:732
-#, c-format
-msgid "Could not parse line %d."
-msgstr "Não foi possível analisar a linha %d."
-
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "Nenhum commit analisado."
-
-#: sequencer.c:749
-#, c-format
-msgid "Could not open %s"
-msgstr "Não foi possível abrir %s"
-
-#: sequencer.c:753
-#, c-format
-msgid "Could not read %s."
-msgstr "Não foi possível ler %s."
-
-#: sequencer.c:760
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Folha de instruções inutilizável: %s"
-
-#: sequencer.c:790
-#, c-format
-msgid "Invalid key: %s"
-msgstr "Chave inválida: %s"
-
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
-#, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Valor inválido de %s: %s"
-
-#: sequencer.c:803
-#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Folha de opções malformada: %s"
-
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "cherry-pick ou revert em curso"
-
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "tente \"git cherry-pick (--continue | --quit |--abort)\""
-
-#: sequencer.c:827
-#, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Não foi possível criar o diretório do sequenciador %s"
-
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "nenhum cherry-pick ou revert em curso"
-
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "não é possível resolver HEAD"
-
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "não é possível abortar um ramo ainda não criado"
-
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
-#, c-format
-msgid "cannot open %s"
-msgstr "não é possível abrir %s"
-
-#: sequencer.c:888
-#, c-format
-msgid "cannot read %s: %s"
-msgstr "não é possível ler %s: %s"
-
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "fim de ficheiro inesperado"
-
-#: sequencer.c:895
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "o ficheiro HEAD de pre-cherry-pick '%s' está corrompido"
-
-#: sequencer.c:921
-#, c-format
-msgid "Could not format %s."
-msgstr "Não foi possível formatar %s."
+"tem alterações preparadas na árvore de trabalho\n"
+"Se tenciona esmagar estas alterações no commit anterior, execute:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"Se tenciona pô-las num novo commit, execute:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"Em ambos os casos, quando estiver pronto, continue com:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: sequencer.c:1066
+#: sequencer.c:694
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: não é possível efetuar cherry-pick de %s"
+msgid "could not parse commit %s\n"
+msgstr "não foi possível analisar o commit %s\n"
 
-#: sequencer.c:1069
+#: sequencer.c:699
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: revisão incorreta"
-
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "Não é possível reverter como commit inicial"
+msgid "could not parse parent commit %s\n"
+msgstr "não foi possível analisar o commit pai %s\n"
 
-#: setup.c:160
+#: sequencer.c:821
 #, c-format
 msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"%s: não há tal caminho na árvore de trabalho.\n"
-"Use 'git <comando> -- <caminho>...' para especificar caminhos que não "
-"existem localmente."
+"1ª linha inesperada da mensagem de squash:\n"
+"\n"
+"\t%.*s"
 
-#: setup.c:173
+#: sequencer.c:827
 #, c-format
 msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"argumento ambíguo '%s': revisão ou caminho desconhecidos não encontrado na "
-"árvore de trabalho.\n"
-"Use '--' para separar caminhos de revisões, assim:\n"
-"'git <comando> [<revisão>...] -- [<ficheiro>...]'"
+"1ª linha inválida da mensagem de squash:\n"
+"\n"
+"\t%.*s"
 
-#: setup.c:223
+#: sequencer.c:833 sequencer.c:858
 #, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"argumento ambíguo '%s': revisão e nome de ficheiro\n"
-"Use '--' para separar caminhos de revisões, assim:\n"
-"'git <comando> [<revisão>...] -- [<ficheiro>...]'"
+msgid "This is a combination of %d commits."
+msgstr "Isto é a combinação de %d commits."
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
-#, c-format
-msgid "failed to read %s"
-msgstr "falha ao ler %s"
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "necessária uma HEAD para fixup"
 
-#: setup.c:468
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Esperava-se versão do repositório git <= %d, obteve-se %d"
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "não foi possível ler HEAD"
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "extensões de repositório desconhecidas encontradas:"
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
+msgstr "não foi possível ler a mensagem de commit de HEAD"
 
-#: setup.c:762
+#: sequencer.c:852
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "Não é um repositório git (ou um dos diretórios pai): %s"
+msgid "cannot write '%s'"
+msgstr "não é possível escrever '%s'"
 
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "Não é possível voltar ao diretório de trabalho atual"
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "Esta é a 1ª mensagem de commit:"
 
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "Não é possível ler o diretório de trabalho atual"
+#: sequencer.c:869
+#, c-format
+msgid "could not read commit message of %s"
+msgstr "não foi possível ler a mensagem de commit de %s"
 
-#: setup.c:920
+#: sequencer.c:876
 #, c-format
-msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-"Não é um repositório git (ou um diretório pai até ao ponto de montagem %s)\n"
-"Interrompido no limite do sistema de ficheiros "
-"(GIT_DISCOVERY_ACROSS_FILESYSTEM não definido)."
+msgid "This is the commit message #%d:"
+msgstr "Esta é a mensagem de commit nº%d:"
 
-#: setup.c:927
+#: sequencer.c:881
 #, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "Não é possível mudar para '%s/..'"
+msgid "The commit message #%d will be skipped:"
+msgstr "A mensagem de commit #%d será ignorada:"
 
-#: setup.c:989
+#: sequencer.c:886
 #, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-"Problema com o valor core.sharedRepository modo de ficheiro (0%.3o).\n"
-"O dono dos ficheiros tem de ter sempre permissões de leitura e escrita."
+msgid "unknown command: %d"
+msgstr "comando desconhecido: %d"
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "offset antes do fim do ficheiro de pacote (.idx danificado?)"
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "ficheiro de índice não integrado."
 
-#: sha1_file.c:2434
+#: sequencer.c:970
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "offset antes do início do índice do pacote %s (índice corrompido?)"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "o commit %s é uma integração mas não foi fornecida a opção -m."
 
-#: sha1_file.c:2438
+#: sequencer.c:978
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "offset depois do fim do índice do pacote %s (índice truncado?)"
+msgid "commit %s does not have parent %d"
+msgstr "o commit %s não tem o pai %d"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
+#: sequencer.c:982
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
 msgstr ""
-"Normalmente o Git nunca cria referências que terminem em 40 caracteres "
-"hexadecimais,\n"
-"pois uma referência destas seria ignorada se indicasse só 40 caracteres "
-"hexadecimais.\n"
-"Estas referências podem ser criadas por engano. Como no exemplo,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"onde \"$br\" está vazio e é criada uma referência de 40 caracteres "
-"hexadecimais.\n"
-"Analise estas referências e elimine-as se desejar. Desative esta\n"
-"mensagem executando \"git config advice.objectNameWarning false\""
+"a linha principal foi especificada mas o commit %s não é uma integração."
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"Não é possível alterar .gitmodules não integrado, resolva primeiro os "
-"conflitos de integração"
+#: sequencer.c:988
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "não é possível obter a mensagem de commit de %s"
 
-#: submodule.c:68 submodule.c:102
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Secção de .gitmodules cujo path=%s não encontrada"
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: não foi possível analisar o commit pai %s"
 
-#: submodule.c:76
+#: sequencer.c:1071 sequencer.c:1820
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Não foi possível atualizar o elemento %s de .gitmodules"
+msgid "could not rename '%s' to '%s'"
+msgstr "não foi possível mudar o nome de '%s' para '%s'"
 
-#: submodule.c:109
+#: sequencer.c:1122
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Não foi possível remover o elemento %s de .gitmodules"
+msgid "could not revert %s... %s"
+msgstr "não foi possível reverter %s... %s"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "falha ao preparar .gitmodules atualizado"
+#: sequencer.c:1123
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "não foi possível aplicar %s... %s"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "não é permitido valores negativos em submodule.fetchJobs"
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "o conjunto de commits especificado está vazio"
 
-#: submodule-config.c:358
+#: sequencer.c:1175
 #, c-format
-msgid "invalid value for %s"
-msgstr "valor inválido de %s"
+msgid "git %s: failed to read the index"
+msgstr "git %s: falha ao ler o índice"
 
-#: trailer.c:237
+#: sequencer.c:1182
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "falha ao executar o comando trailer '%s'"
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: falha ao atualizar o índice"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: sequencer.c:1302
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "valor desconhecido '%s' da chave '%s'"
+msgid "invalid line %d: %.*s"
+msgstr "linha %d inválida: %.*s"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: sequencer.c:1310
 #, c-format
-msgid "more than one %s"
-msgstr "mais do que um %s"
+msgid "cannot '%s' without a previous commit"
+msgstr "não é possível efetuar '%s' sem um commit anterior"
 
-#: trailer.c:582
+#: sequencer.c:1342
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "token terminador vazio no terminador '%.*s'"
+msgid "could not read '%s'."
+msgstr "não foi possível ler '%s'."
 
-#: trailer.c:702
+#: sequencer.c:1349
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "corrija-o usando 'git rebase --edit-todo'."
+
+#: sequencer.c:1351
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "não foi possível ler o ficheiro de entrada '%s'"
+msgid "unusable instruction sheet: '%s'"
+msgstr "folha de instruções inutilizável: '%s'"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "não foi possível ler da entrada padrão"
+#: sequencer.c:1356
+msgid "no commits parsed."
+msgstr "nenhum commit analisado."
+
+#: sequencer.c:1367
+msgid "cannot cherry-pick during a revert."
+msgstr "não é possível efetuar cherry-pick durante uma reversão."
+
+#: sequencer.c:1369
+msgid "cannot revert during a cherry-pick."
+msgstr "não é possível reverter durante um cherry-pick."
 
-#: trailer.c:857 builtin/am.c:42
+#: sequencer.c:1432
 #, c-format
-msgid "could not stat %s"
-msgstr "não foi possível obter stat de %s"
+msgid "invalid key: %s"
+msgstr "chave inválida: %s"
 
-#: trailer.c:859
+#: sequencer.c:1435
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "o ficheiro %s não é um ficheiro regular"
+msgid "invalid value for %s: %s"
+msgstr "valor inválido de %s: %s"
 
-#: trailer.c:861
+#: sequencer.c:1492
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "o ficheiro %s não pode ser escrito pelo utilizador"
+msgid "malformed options sheet: '%s'"
+msgstr "folha de opções malformada: '%s'"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "não foi possível abrir ficheiro temporário"
+#: sequencer.c:1530
+msgid "a cherry-pick or revert is already in progress"
+msgstr "cherry-pick ou revert em curso"
 
-#: trailer.c:912
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr "não foi possível mudar o nome do ficheiro temporário para %s"
+#: sequencer.c:1531
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "tente \"git cherry-pick (--continue | --quit |--abort)\""
 
-#: transport.c:62
+#: sequencer.c:1534
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Iria definir o ramo a montante de '%s' como '%s' de '%s'\n"
+msgid "could not create sequencer directory '%s'"
+msgstr "não foi possível criar o diretório do sequenciador '%s'"
 
-#: transport.c:151
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transporte: opção de profundidade '%s' inválida"
+#: sequencer.c:1548
+msgid "could not lock HEAD"
+msgstr "não foi possível bloquear HEAD"
 
-#: transport.c:771
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-"Os seguintes caminhos de submódulo contêm alterações que\n"
-"não puderam ser encontradas a nenhum remoto:\n"
+#: sequencer.c:1604 sequencer.c:2159
+msgid "no cherry-pick or revert in progress"
+msgstr "nenhum cherry-pick ou revert em curso"
 
-#: transport.c:775
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-"\n"
-"Por favor tente\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"ou cd para o caminho e use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"para publicá-las no remoto.\n"
-"\n"
+#: sequencer.c:1606
+msgid "cannot resolve HEAD"
+msgstr "não é possível resolver HEAD"
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "Abortado."
+#: sequencer.c:1608 sequencer.c:1642
+msgid "cannot abort from a branch yet to be born"
+msgstr "não é possível abortar um ramo ainda não criado"
 
-#: transport-helper.c:1041
+#: sequencer.c:1628 builtin/grep.c:910
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Não foi possível ler a referência %s"
+msgid "cannot open '%s'"
+msgstr "não é possível abrir '%s'"
 
-#: unpack-trees.c:64
+#: sequencer.c:1630
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
-"extrair:\n"
-"%%sSubmeta as suas alterações ou esconda-as antes de trocar de ramo."
+msgid "cannot read '%s': %s"
+msgstr "não é possível ler '%s': %s"
 
-#: unpack-trees.c:66
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
-"extrair:\n"
-"%%s"
+#: sequencer.c:1631
+msgid "unexpected end of file"
+msgstr "fim de ficheiro inesperado"
 
-#: unpack-trees.c:69
+#: sequencer.c:1637
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
-"integrar:\n"
-"%%sSubmeta as suas alterações ou esconda-as antes de integrar."
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "o ficheiro HEAD de pre-cherry-pick '%s' está corrompido"
 
-#: unpack-trees.c:71
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
-"integrar:\n"
-"%%s"
+#: sequencer.c:1648
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr "Parece que a HEAD se moveu. Não recuando, verifique a HEAD."
 
-#: unpack-trees.c:74
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"As suas alterações locais nos seguintes ficheiros seriam substituídas por "
-"%s:\n"
-"%%sSubmeta as suas alterações ou esconda-as antes de efetuar %s."
+#: sequencer.c:1785 sequencer.c:2058
+msgid "cannot read HEAD"
+msgstr "não é possível ler HEAD"
 
-#: unpack-trees.c:76
+#: sequencer.c:1825 builtin/difftool.c:616
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"As suas alterações locais nos seguintes ficheiros seriam substituídas por "
-"%s:\n"
-"%%s"
+msgid "could not copy '%s' to '%s'"
+msgstr "não foi possível copiar '%s' para '%s'"
 
-#: unpack-trees.c:81
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"Perder-se-iam ficheiros não controlados ao atualizar os seguintes "
-"diretórios:\n"
-"%s"
+#: sequencer.c:1841
+msgid "could not read index"
+msgstr "não foi possível ler o índice"
 
-#: unpack-trees.c:85
+#: sequencer.c:1846
 #, c-format
 msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
-"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
-"removidos ao extrair:\n"
-"%%sMova ou remova-os antes de trocar de ramos."
+"a execução falhou: %s\n"
+"%sPode corrigir o problema e executar\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+
+#: sequencer.c:1852
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "e fez alterações ao índice e/ou à árvore de trabalho\n"
 
-#: unpack-trees.c:87
+#: sequencer.c:1858
 #, c-format
 msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
-"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
-"removidos ao extrair:\n"
-"%%s"
+"Executado com sucesso: %s\n"
+"mas deixou alterações no índice e/ou na árvore de trabalho\n"
+"Submeta ou esconda as alterações e execute\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#: unpack-trees.c:90
+#: sequencer.c:1913 git-rebase.sh:168
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
-"removidos ao integrar:\n"
-"%%sMova ou remova-os antes de integrar."
+msgid "Applied autostash."
+msgstr "Pilha automática (autostash) aplicada."
 
-#: unpack-trees.c:92
+#: sequencer.c:1925
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
-"removidos ao integrar:\n"
-"%%s"
+msgid "cannot store %s"
+msgstr "não é possível guardar %s"
 
-#: unpack-trees.c:95
+#: sequencer.c:1927 git-rebase.sh:172
 #, c-format
 msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
 msgstr ""
-"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
-"removidos por %s:\n"
-"%%sMova ou remova-os antes de efetuar %s."
+"Surgiram conflitos ao aplicar a pilha automática (autostash).\n"
+"As suas alterações estão guardadas na pilha.\n"
+"Pode executar \"git stash pop\" ou \"git stash drop\" oportunamente.\n"
 
-#: unpack-trees.c:97
+#: sequencer.c:2009
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
-"removidos por %s:\n"
-"%%s"
+msgid "Stopped at %s...  %.*s\n"
+msgstr "Parou a %s...  %.*s\n"
 
-#: unpack-trees.c:102
+#: sequencer.c:2036
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
-"substituídos ao extrair:\n"
-"%%sMova ou remova-os antes de trocar de ramos."
+msgid "unknown command %d"
+msgstr "comando desconhecido %d"
 
-#: unpack-trees.c:104
+#: sequencer.c:2066
+msgid "could not read orig-head"
+msgstr "não foi possível ler orig-head"
+
+#: sequencer.c:2070
+msgid "could not read 'onto'"
+msgstr "não foi possível ler 'onto'"
+
+#: sequencer.c:2077
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
-"substituídos ao extrair:\n"
-"%%s"
+msgid "could not update %s"
+msgstr "não foi possível atualizar %s"
 
-#: unpack-trees.c:107
+#: sequencer.c:2084
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
-"substituídos ao integrar:\n"
-"%%sMova ou remova-os antes de integrar."
+msgid "could not update HEAD to %s"
+msgstr "não foi possível atualizar HEAD para %s"
 
-#: unpack-trees.c:109
+#: sequencer.c:2168
+msgid "cannot rebase: You have unstaged changes."
+msgstr "não é possível rebasear: tem alterações não preparadas."
+
+#: sequencer.c:2173
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "não foi possível remover CHERRY_PICK_HEAD"
+
+#: sequencer.c:2182
+msgid "cannot amend non-existing commit"
+msgstr "não é possível emendar commit não-existente"
+
+#: sequencer.c:2184
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
-"substituídos ao integrar:\n"
-"%%s"
+msgid "invalid file: '%s'"
+msgstr "ficheiro inválido: '%s'"
 
-#: unpack-trees.c:112
+#: sequencer.c:2186
 #, c-format
+msgid "invalid contents: '%s'"
+msgstr "conteúdo inválido: '%s'"
+
+#: sequencer.c:2189
 msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
-"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
-"substituídos por %s:\n"
-"%%sMova ou remova-os antes de efetuar %s."
+"\n"
+"Tem alterações por submeter na árvore de trabalho. Submeta-as primeiro\n"
+"e execute 'git rebase --continue' de novo."
 
-#: unpack-trees.c:114
+#: sequencer.c:2199
+msgid "could not commit staged changes."
+msgstr "não foi possível submeter as alterações preparadas."
+
+#: sequencer.c:2279
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
-"substituídos por %s:\n"
-"%%s"
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: não é possível efetuar cherry-pick de %s"
 
-#: unpack-trees.c:121
+#: sequencer.c:2283
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "A entrada '%s' sobrepõe-se com '%s'. Não é possível vincular."
+msgid "%s: bad revision"
+msgstr "%s: revisão incorreta"
 
-#: unpack-trees.c:124
+#: sequencer.c:2316
+msgid "can't revert as initial commit"
+msgstr "não é possível reverter como commit inicial"
+
+#: setup.c:165
 #, c-format
 msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 msgstr ""
-"Não é possível extrair esparsamente: as seguintes entradas não estão "
-"atualizadas:\n"
-"%s"
+"%s: não há tal caminho na árvore de trabalho.\n"
+"Use 'git <comando> -- <caminho>...' para especificar caminhos que não "
+"existem localmente."
 
-#: unpack-trees.c:126
+#: setup.c:178
 #, c-format
 msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"Os seguintes ficheiros na árvore de trabalho seriam substituídos ao "
-"atualizar a extração esparsa:\n"
-"%s"
+"argumento ambíguo '%s': revisão ou caminho desconhecidos não encontrado na "
+"árvore de trabalho.\n"
+"Use '--' para separar caminhos de revisões, assim:\n"
+"'git <comando> [<revisão>...] -- [<ficheiro>...]'"
 
-#: unpack-trees.c:128
+#: setup.c:228
 #, c-format
 msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"Os seguintes ficheiros na árvore de trabalho seriam removidos ao atualizar a "
-"extração esparsa:\n"
-"%s"
+"argumento ambíguo '%s': revisão e nome de ficheiro\n"
+"Use '--' para separar caminhos de revisões, assim:\n"
+"'git <comando> [<revisão>...] -- [<ficheiro>...]'"
 
-#: unpack-trees.c:205
+#: setup.c:475
 #, c-format
-msgid "Aborting\n"
-msgstr "A abortar\n"
-
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "A extrair ficheiros"
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Esperava-se versão do repositório git <= %d, obteve-se %d"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "nome de esquema de URL inválido ou falta do sufixo '://'"
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "extensões de repositório desconhecidas encontradas:"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: setup.c:776
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "sequencia de escape %XX inválida"
-
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "sistema anfitrião não indicado e o esquema não é do tipo 'file:'"
-
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "um URL do tipo 'file:' não pode ter um número de porta"
-
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "caracteres inválidos no nome do anfitrião"
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Não é um repositório git (ou um dos diretórios pai): %s"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "número de porta inválido"
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "Não é possível voltar ao diretório de trabalho atual"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "segmento de caminho '..' inválido"
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "Não é possível ler o diretório de trabalho atual"
 
-#: worktree.c:282
+#: setup.c:1022 setup.c:1028
 #, c-format
-msgid "failed to read '%s'"
-msgstr "falha ao ler '%s'"
+msgid "Cannot change to '%s'"
+msgstr "não é possível mudar para '%s'"
 
-#: wrapper.c:222 wrapper.c:392
+#: setup.c:1041
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "não foi possível abrir '%s' para leitura e escrita"
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Não é um repositório git (ou um diretório pai até ao ponto de montagem %s)\n"
+"Interrompido no limite do sistema de ficheiros "
+"(GIT_DISCOVERY_ACROSS_FILESYSTEM não definido)."
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: setup.c:1106
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "não foi possível abrir '%s' para escrita"
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Problema com o valor core.sharedRepository modo de ficheiro (0%.3o).\n"
+"O dono dos ficheiros tem de ter sempre permissões de leitura e escrita."
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: sha1_file.c:559
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "não foi possível abrir '%s' para leitura"
+msgid "path '%s' does not exist"
+msgstr "o caminho '%s' não existe"
 
-#: wrapper.c:605 wrapper.c:626
+#: sha1_file.c:585
 #, c-format
-msgid "unable to access '%s'"
-msgstr "não é possível aceder a '%s'"
-
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "não é possível de obter o diretório de trabalho atual"
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr ""
+"ainda não é suportada a funcionalidade que permite ter o repositório de "
+"referência '%s' como uma extração ligada."
 
-#: wrapper.c:658
+#: sha1_file.c:591
 #, c-format
-msgid "could not write to %s"
-msgstr "não foi possível escrever para %s"
+msgid "reference repository '%s' is not a local repository."
+msgstr "o repositório de referência '%s' não é um repositório local."
 
-#: wrapper.c:660
+#: sha1_file.c:597
 #, c-format
-msgid "could not close %s"
-msgstr "não foi possível fechar %s"
-
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Caminhos não integrados:"
+msgid "reference repository '%s' is shallow"
+msgstr "o repositório de referência '%s' é raso"
 
-#: wt-status.c:177 wt-status.c:204
+#: sha1_file.c:605
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (use \"git reset %s <ficheiro>...\" para despreparar)"
-
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (use \"git rm --cached <ficheiro>...\" para despreparar)"
-
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (use \"git add <ficheiro>...\" para marcar como resolvido)"
-
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (use \"git add/rm <ficheiro>...\" conforme apropriado para marcar como "
-"resolvido)"
+msgid "reference repository '%s' is grafted"
+msgstr "o repositório de referência '%s' está enxertado"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (use \"git rm <ficheiro>...\" para marcar como resolvido)"
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "offset antes do fim do ficheiro de pacote (.idx danificado?)"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "Alterações para serem submetidas:"
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "offset antes do início do índice do pacote %s (índice corrompido?)"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Alterações não preparadas para submeter:"
+#: sha1_file.c:2725
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "offset depois do fim do índice do pacote %s (índice truncado?)"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (use \"git add <ficheiro>...\" para atualizar o que será submetido)"
+#: sha1_name.c:409
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "SHA1 curto %s é ambíguo"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-"  (use \"git add/rm <ficheiro>...\" para atualizar o que será submetido)"
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "Os candidatos são:"
 
-#: wt-status.c:223
+#: sha1_name.c:580
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
 msgstr ""
-"  (use \"git checkout -- <ficheiro>...\" para descartar alterações no "
-"diretório de trabalho)"
+"Normalmente o Git nunca cria referências que terminem em 40 caracteres "
+"hexadecimais,\n"
+"pois uma referência destas seria ignorada se indicasse só 40 caracteres "
+"hexadecimais.\n"
+"Estas referências podem ser criadas por engano. Como no exemplo,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"onde \"$br\" está vazio e é criada uma referência de 40 caracteres "
+"hexadecimais.\n"
+"Analise estas referências e elimine-as se desejar. Desative esta\n"
+"mensagem executando \"git config advice.objectNameWarning false\""
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
-"  (submeta ou descarte o conteúdo modificado ou não controlado nos "
-"submódulos)"
+"Não é possível alterar .gitmodules não integrado, resolva primeiro os "
+"conflitos de integração"
 
-#: wt-status.c:237
+#: submodule.c:71 submodule.c:105
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (use \"git %s <ficheiro>...\" para incluir no que será submetido)"
-
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "eliminado por ambos:"
-
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "adicionado por nós:"
-
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "eliminado por eles:"
-
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "adicionado por eles:"
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Secção de .gitmodules cujo path=%s não encontrada"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "eliminado por nós:"
+#: submodule.c:79
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Não foi possível atualizar o elemento %s de .gitmodules"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "adicionado por ambos:"
+#: submodule.c:112
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Não foi possível remover o elemento %s de .gitmodules"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "modificado por ambos:"
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "falha ao preparar .gitmodules atualizado"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "novo ficheiro:"
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "não é permitido valores negativos em submodule.fetchJobs"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "copiado:"
+#: submodule.c:1194
+#, c-format
+msgid "'%s' not recognized as a git repository"
+msgstr "'%s' não é reconhecido como um repositório git"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "eliminado:"
+#: submodule.c:1332
+#, c-format
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "não foi possível iniciar 'git status' no submódulo '%s'"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "modificado:"
+#: submodule.c:1345
+#, c-format
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "não foi possível executar 'git status' no submódulo '%s'"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "nome mudado:"
+#: submodule.c:1421
+#, c-format
+msgid "submodule '%s' has dirty index"
+msgstr "o submódulo '%s' tem índice sujo"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "tipo alterado:"
+#: submodule.c:1679
+#, c-format
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr ""
+"relocate_gitdir para submodule '%s' com mais do que uma árvore de trabalho "
+"não suportado"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "desconhecido:"
+#: submodule.c:1691 submodule.c:1747
+#, c-format
+msgid "could not lookup name for submodule '%s'"
+msgstr "não foi possível procurar pelo submódulo '%s'"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "não integrado:"
+#: submodule.c:1695 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "não foi possível criar o diretório '%s'"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "novos commits, "
+#: submodule.c:1698
+#, c-format
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
+msgstr ""
+"A migrar diretório git de '%s%s' de\n"
+"'%s' para\n"
+"'%s'\n"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "conteúdo modificado, "
+#: submodule.c:1782
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "não foi possível percorrer recursivamente o submódulo '%s'"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "conteúdo não controlado, "
+#: submodule.c:1826
+msgid "could not start ls-files in .."
+msgstr "não foi possível iniciar ls-files em .."
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Submódulos alterados mas não atualizados:"
+#: submodule.c:1846
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "BUG: returned path string doesn't match cwd?"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Alterações em submódulos para serem submetidas:"
+#: submodule.c:1865
+#, c-format
+msgid "ls-tree returned unexpected return code %d"
+msgstr "ls-tree retornou código de retorno inesperado %d"
 
-#: wt-status.c:839
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr ""
-"Não altere a linha acima.\n"
-"Tudo o que estiver abaixo será removido."
+#: submodule-config.c:380
+#, c-format
+msgid "invalid value for %s"
+msgstr "valor inválido de %s"
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Há caminhos não integrados."
+#: trailer.c:240
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "falha ao executar o comando trailer '%s'"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (corrija os conflitos e execute \"git commit\")"
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "valor desconhecido '%s' da chave '%s'"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (use \"git am --abort\" para abortar a integração)"
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "mais do que um %s"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Todos os conflitos foram corrigidos mas ainda está a integrar."
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "token terminador vazio no terminador '%.*s'"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (use \"git commit\" para concluir a integração)"
+#: trailer.c:722
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "não foi possível ler o ficheiro de entrada '%s'"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Sessão am em curso."
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "não foi possível ler da entrada padrão"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "O patch atual está vazio."
+#: trailer.c:949 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "não foi possível obter stat de %s"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (corrija os conflitos e execute \"git am --continue\")"
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "o ficheiro %s não é um ficheiro regular"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (use \"git am --skip\" para ignorar este patch)"
+#: trailer.c:953
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "o ficheiro %s não pode ser escrito pelo utilizador"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (use \"git am --abort\" para restaurar o ramo original)"
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "não foi possível abrir ficheiro temporário"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "Nenhum comando concluído."
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "não foi possível mudar o nome do ficheiro temporário para %s"
 
-#: wt-status.c:1112
+#: transport.c:62
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Último comando concluído (%d comando concluído):"
-msgstr[1] "Últimos comandos concluídos (%d comandos concluídos):"
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Iria definir o ramo a montante de '%s' como '%s' de '%s'\n"
 
-#: wt-status.c:1123
+#: transport.c:151
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (veja mais no ficheiro %s)"
+msgid "transport: invalid depth option '%s'"
+msgstr "transporte: opção de profundidade '%s' inválida"
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "Nenhum comando por concluir."
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Os seguintes caminhos de submódulo contêm alterações que\n"
+"não puderam ser encontradas a nenhum remoto:\n"
 
-#: wt-status.c:1131
+#: transport.c:893
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Próximo comando a executar (%d comando restante):"
-msgstr[1] "Próximos comandos a executar (%d comandos restantes):"
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Por favor tente\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"ou cd para o caminho e use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"para publicá-las no remoto.\n"
+"\n"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (use \"git rebase --edit-todo\" para visualizar e editar)"
+#: transport.c:901
+msgid "Aborting."
+msgstr "Abortado."
 
-#: wt-status.c:1152
+#: transport-helper.c:1080
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Está a realizar rebase do ramo '%s' sobre '%s'."
+msgid "Could not read ref %s"
+msgstr "Não foi possível ler a referência %s"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Está a rebasear neste momento."
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "objeto árvore demasiado curto"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (corrija os conflitos e execute \"git rebase --continue\")"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "modo na entrada de árvore malformado"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (use \"git rebase --skip\" para ignorar este patch)"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "nome de ficheiro vazio na entrada de árvore"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (use \"git rebase --abort\" para restaurar o ramo original)"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "ficheiro de árvore demasiado curto"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
-"  (todos os conflitos foram corrigidos: execute \"git rebase --continue\")"
+"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
+"extrair:\n"
+"%%sSubmeta as suas alterações ou esconda-as antes de trocar de ramo."
 
-#: wt-status.c:1185
+#: unpack-trees.c:106
 #, c-format
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Está a dividir um commit ao mesmo tempo que se efetua rebase do ramo '%s' "
-"sobre '%s'."
-
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Está a dividir um commit durante um rebase."
-
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
 msgstr ""
-"  (Assim que o diretório de trabalho estiver limpo, execute \"git rebase --"
-"continue\")"
+"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
+"extrair:\n"
+"%%s"
 
-#: wt-status.c:1197
+#: unpack-trees.c:109
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
 msgstr ""
-"Está a editar um commit ao mesmo tempo que efetua rebase do ramo '%s' sobre "
-"'%s'."
-
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Está a editar um commit durante um rebase."
-
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (use \"git commit --amend\" para emendar o commit atual)"
+"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
+"integrar:\n"
+"%%sSubmeta as suas alterações ou esconda-as antes de integrar."
 
-#: wt-status.c:1207
+#: unpack-trees.c:111
+#, c-format
 msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
-"  (use \"git rebase --continue\" assim que estiver satisfeito com as "
-"alterações)"
+"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
+"integrar:\n"
+"%%s"
 
-#: wt-status.c:1217
+#: unpack-trees.c:114
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Está a realizar cherry-pick do commit %s."
-
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (corrija os conflitos e execute \"git cherry-pick --continue\")"
-
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
 msgstr ""
-"  (todos os conflitos foram corrigidos: execute \"git cherry-pick --continue"
-"\")"
+"As suas alterações locais nos seguintes ficheiros seriam substituídas por "
+"%s:\n"
+"%%sSubmeta as suas alterações ou esconda-as antes de efetuar %s."
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+#: unpack-trees.c:116
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"  (use \"git cherry-pick --abort\" para cancelar a operação de cherry-pick)"
+"As suas alterações locais nos seguintes ficheiros seriam substituídas por "
+"%s:\n"
+"%%s"
 
-#: wt-status.c:1236
+#: unpack-trees.c:121
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Está a reverter o commit %s neste comento."
-
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (corrija dos conflitos e execute \"git revert --continue\")"
-
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
 msgstr ""
-"  (todos os conflitos foram corrigidos: execute \"git revert --continue\")"
-
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (use \"git rever --abort\" para cancelar a operação de reversão)"
+"Atualizar os seguintes diretórios perde os ficheiros não controlos dentro "
+"deles:\n"
+"%s"
 
-#: wt-status.c:1257
+#: unpack-trees.c:125
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Está a bissetar, iniciado a partir do ramo '%s'."
-
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Está a bissetar neste momento."
-
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (use \"git bisect reset\" para voltar ao ramo original)"
-
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "No ramo "
-
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "rebase interativo em curso; sobre "
-
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "rebase em curso; sobre "
-
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD destacada em "
-
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD destacada de "
-
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Não se encontra em nenhum ramo neste momento."
-
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Commit inicial"
-
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Ficheiros não controlados"
-
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Ficheiros ignorados"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
+"removidos ao extrair:\n"
+"%%sMova ou remova-os antes de trocar de ramos."
 
-#: wt-status.c:1520
+#: unpack-trees.c:127
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
 msgstr ""
-"A enumeração dos ficheiros não controlados demorou %.2f segundos\n"
-"a concluir. 'status -uno' pode acelerar o processo, mas deve ter\n"
-"cuidado de não se esquecer de adicionar novos ficheiros\n"
-"(consulte 'git help status')."
+"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
+"removidos ao extrair:\n"
+"%%s"
 
-#: wt-status.c:1526
+#: unpack-trees.c:130
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Ficheiros não controlados não listados%s"
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (use a opção -u para mostrar os ficheiros não controlados)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Sem alterações"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
+"removidos ao integrar:\n"
+"%%sMova ou remova-os antes de integrar."
 
-#: wt-status.c:1539
+#: unpack-trees.c:132
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
 msgstr ""
-"nenhuma alteração adicionada para submeter (use \"git add\" e/ou \"git "
-"commit -a\")\n"
+"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
+"removidos ao integrar:\n"
+"%%s"
 
-#: wt-status.c:1542
+#: unpack-trees.c:135
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "nenhuma alteração adicionada para submeter\n"
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
+"removidos por %s:\n"
+"%%sMova ou remova-os antes de efetuar %s."
 
-#: wt-status.c:1545
+#: unpack-trees.c:137
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
 msgstr ""
-"não foi adicionado nada para submeter, mas existem ficheiros não controlados "
-"(use \"git add\" para controlá-los)\n"
+"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
+"removidos por %s:\n"
+"%%s"
 
-#: wt-status.c:1548
+#: unpack-trees.c:142
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
-"não foi adicionado nada para submeter, mas existem ficheiros não "
-"controlados\n"
+"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
+"substituídos ao extrair:\n"
+"%%sMova ou remova-os antes de trocar de ramos."
 
-#: wt-status.c:1551
+#: unpack-trees.c:144
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
 msgstr ""
-"não há nada para submeter (crie/copie ficheiros e use \"git add\" para "
-"controlá-los)\n"
+"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
+"substituídos ao extrair:\n"
+"%%s"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:147
 #, c-format
-msgid "nothing to commit\n"
-msgstr "não há nada para submeter\n"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
+"substituídos ao integrar:\n"
+"%%sMova ou remova-os antes de integrar."
 
-#: wt-status.c:1557
+#: unpack-trees.c:149
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
-"não há nada para submeter (use -u para mostrar os ficheiros não "
-"controlados)\n"
+"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
+"substituídos ao integrar:\n"
+"%%s"
 
-#: wt-status.c:1561
+#: unpack-trees.c:152
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "não há nada para submeter, árvore de trabalho limpa\n"
-
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Commit inicial em "
-
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (nenhum ramo)"
-
-#: wt-status.c:1701
-msgid "gone"
-msgstr "desaparecido"
-
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "atrás "
-
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "à frente "
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
+"substituídos por %s:\n"
+"%%sMova ou remova-os antes de efetuar %s."
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: unpack-trees.c:154
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "falha ao invocar unlink de '%s'"
-
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<opções>] [--] <caminho>..."
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
+"substituídos por %s:\n"
+"%%s"
 
-#: builtin/add.c:65
+#: unpack-trees.c:161
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "diff status inesperado %c"
-
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "falha ao atualizar os ficheiros"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "A entrada '%s' sobrepõe-se com '%s'. Não é possível vincular."
 
-#: builtin/add.c:81
+#: unpack-trees.c:164
 #, c-format
-msgid "remove '%s'\n"
-msgstr "remover '%s'\n"
-
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Alterações não preparadas depois de atualizar o índice:"
-
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Não foi possível ler o índice"
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"Não é possível extrair esparsamente: as seguintes entradas não estão "
+"atualizadas:\n"
+"%s"
 
-#: builtin/add.c:207
+#: unpack-trees.c:166
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Não foi possível abrir '%s' para escrita."
-
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "Não foi possível escrever patch"
-
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "falha ao editar patch"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Os seguintes ficheiros na árvore de trabalho seriam substituídos ao "
+"atualizar a extração esparsa:\n"
+"%s"
 
-#: builtin/add.c:217
+#: unpack-trees.c:168
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Não foi possível obter stat de '%s'"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Os seguintes ficheiros na árvore de trabalho seriam removidos ao atualizar a "
+"extração esparsa:\n"
+"%s"
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "Patch vazio. Abortado."
+#: unpack-trees.c:170
+#, c-format
+msgid ""
+"Cannot update submodule:\n"
+"%s"
+msgstr ""
+"Não é possível atualizar submódulo:\n"
+"%s"
 
-#: builtin/add.c:224
+#: unpack-trees.c:247
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Não foi possível aplicar '%s'"
+msgid "Aborting\n"
+msgstr "A abortar\n"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "Os seguintes caminhos estão ignorados por algum ficheiro .gitignore:\n"
+#: unpack-trees.c:272
+#, c-format
+msgid "submodule update strategy not supported for submodule '%s'"
+msgstr "não foi possível procurar pelo submódulo '%s'"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "simular ação"
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "A extrair ficheiros"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "ser verboso"
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "nome de esquema de URL inválido ou falta do sufixo '://'"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "seleção interativa"
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "sequencia de escape %XX inválida"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "selecionar blocos interativamente"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "sistema anfitrião não indicado e o esquema não é do tipo 'file:'"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "editar o diff atual e aplicá-lo"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "um URL do tipo 'file:' não pode ter um número de porta"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "permitir adicionar ficheiros ignorados"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "caracteres inválidos no nome do anfitrião"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "atualizar ficheiros controlados"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "número de porta inválido"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "registar apenas o facto de que o caminho será adicionado mais tarde"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "segmento de caminho '..' inválido"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr ""
-"adicionar alterações de todos os ficheiros controlados ou não controlados"
+#: worktree.c:285
+#, c-format
+msgid "failed to read '%s'"
+msgstr "falha ao ler '%s'"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-"ignorar caminhos removidos na árvore de trabalho (o mesmo que --no-all)"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "não foi possível abrir '%s' para leitura e escrita"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "não adicionar, apenas atualizar o índice"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "não foi possível abrir '%s' para escrita"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "ignorar ficheiros que não podem ser adicionados por causa de erros"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:320 builtin/am.c:759
+#: builtin/am.c:847 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "não foi possível abrir '%s' para leitura"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "verificar quais os ficheiros ignorados na simulação"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
+msgstr "não é possível aceder a '%s'"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "não é possível de obter o diretório de trabalho atual"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "substituir o bit executável dos ficheiros listados"
+#: wrapper.c:634
+#, c-format
+msgid "could not write to %s"
+msgstr "não foi possível escrever para %s"
 
-#: builtin/add.c:292
+#: wrapper.c:636
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Use -f se deseja mesmo adicioná-los.\n"
+msgid "could not close %s"
+msgstr "não foi possível fechar %s"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "falha ao adicionar ficheiros"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Caminhos não integrados:"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A e -u são mutuamente incompatíveis"
+#: wt-status.c:178 wt-status.c:205
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (use \"git reset %s <ficheiro>...\" para despreparar)"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "A opção --ignore-missing só pode ser usada em conjunto com --dry-run"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (use \"git rm --cached <ficheiro>...\" para despreparar)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "o parâmetro '%s' de --chmod tem de ser -x ou +x"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (use \"git add <ficheiro>...\" para marcar como resolvido)"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Não foi especificado nada, nada adicionado.\n"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (use \"git add/rm <ficheiro>...\" conforme apropriado para marcar como "
+"resolvido)"
 
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Queria dizer 'git add .'?\n"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (use \"git rm <ficheiro>...\" para marcar como resolvido)"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "ficheiro de índice corrompido"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "Alterações para serem submetidas:"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "Não foi possível escrever novo ficheiro de índice"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "Alterações não preparadas para submeter:"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "não foi possível ler '%s'"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (use \"git add <ficheiro>...\" para atualizar o que será submetido)"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "não foi possível analisar o autor do script"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr ""
+"  (use \"git add/rm <ficheiro>...\" para atualizar o que será submetido)"
 
-#: builtin/am.c:503
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' foi eliminado pelo hook applypatch-msg"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (use \"git checkout -- <ficheiro>...\" para descartar alterações no "
+"diretório de trabalho)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Linha de entrada malformada: '%s'."
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (submeta ou descarte o conteúdo modificado ou não controlado nos "
+"submódulos)"
 
-#: builtin/am.c:581 builtin/notes.c:316
+#: wt-status.c:238
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Falha ao copiar notas de '%s' para '%s'"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (use \"git %s <ficheiro>...\" para incluir no que será submetido)"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "falha ao invocar fseek"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "eliminado por ambos:"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "não foi possível analisar o patch '%s'"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "adicionado por nós:"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Só pode ser aplicada uma série de patches StGIT duma só vez"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "eliminado por eles:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "carimbo de data/hora inválido"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "adicionado por eles:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "linha de Data inválida"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "eliminado por nós:"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "mudança de fuso horário inválida"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "adicionado por ambos:"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Falha ao detetar o formato do patch."
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "modificado por ambos:"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "falha ao criar o diretório '%s'"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "novo ficheiro:"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Falha ao dividir patches."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "copiado:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "não é possível escrever o ficheiro de índice"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "eliminado:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Após resolver este problema, execute \"%s --continue\"."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "modificado:"
+
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "nome mudado:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "Se preferir ignorar este patch, execute \"%s --skip\"."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "tipo alterado:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-"Para restaurar o ramo original e interromper a aplicação dos patches, "
-"execute \"%s --abort\"."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "desconhecido:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "O patch está vazio. Foi dividido incorretamente?"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "não integrado:"
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "linha de identidade inválida: %s"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "novos commits, "
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "não foi possível analisar o commit %s"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "conteúdo modificado, "
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"O repositório não tem os blobs necessários para recorrer a integração com 3 "
-"pontos."
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "conteúdo não controlado, "
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr "A usar informação do índice para reconstruir uma árvore de base..."
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "Submódulos alterados mas não atualizados:"
 
-#: builtin/am.c:1623
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "Alterações em submódulos para serem submetidas:"
+
+#: wt-status.c:914
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
-"Editou o patch manualmente?\n"
-"Não é possível aplicá-lo aos blobs registados no índice."
+"Não altere a linha acima.\n"
+"Tudo o que estiver abaixo será removido."
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-"A recorrer a uma de base para aplicação de patches e integração com 3 "
-"pontos..."
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "Há caminhos não integrados."
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "Falha ao integrar as alterações."
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (corrija os conflitos e execute \"git commit\")"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree falhou ao escrever uma árvore"
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (use \"git am --abort\" para abortar a integração)"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "a aplicar a um histórico vazio"
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "Todos os conflitos foram corrigidos mas ainda está a integrar."
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "falha ao escrever objeto de commit"
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (use \"git commit\" para concluir a integração)"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "não é possível continuar: %s não existe."
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "Sessão am em curso."
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"não é possível entrar em modo interativo sem um entrada padrão conectada a "
-"um terminal."
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "O patch atual está vazio."
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "Corpo do commit:"
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (corrija os conflitos e execute \"git am --continue\")"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Aplicar? [y]sim/[n]ão/[e]ditar/[v]er patch/[a]ceitar todos: "
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (use \"git am --skip\" para ignorar este patch)"
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Índice modificado: não é possível aplicar patches (modificado: %s)"
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (use \"git am --abort\" para restaurar o ramo original)"
 
-#: builtin/am.c:1853 builtin/am.c:1925
-#, c-format
-msgid "Applying: %.*s"
-msgstr "A aplicar: %.*s"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "git-rebase-todo não existe."
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Nenhuma alteração -- Já foi aplicado o patch."
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "Nenhum comando concluído."
 
-#: builtin/am.c:1877
+#: wt-status.c:1194
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Falha ao aplicar o patch em %s %.*s"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Último comando concluído (%d comando concluído):"
+msgstr[1] "Últimos comandos concluídos (%d comandos concluídos):"
 
-#: builtin/am.c:1883
+#: wt-status.c:1205
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "A cópia do patch que falhou encontra-se em: %s"
-
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Sem alterações - esqueceu-se de usar 'git add'?\n"
-"Se não há nada por preparar, provavelmente essas mesmas alterações\n"
-"já foram introduzidas; pode querer ignorar este patch."
+msgid "  (see more in file %s)"
+msgstr "  (veja mais no ficheiro %s)"
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr ""
-"Ainda há caminhos não integrados no índice.\n"
-"Esqueceu-se de usar 'git add'?"
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "Nenhum comando por concluir."
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1213
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Não foi possível analisar o objeto '%s'."
-
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "falha ao limpar o índice"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Próximo comando a executar (%d comando restante):"
+msgstr[1] "Próximos comandos a executar (%d comandos restantes):"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-"Parece que a HEAD foi movida desde a última vez que o 'am' falhou.\n"
-"Não recuando a ORIG_HEAD"
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (use \"git rebase --edit-todo\" para visualizar e editar)"
 
-#: builtin/am.c:2192
+#: wt-status.c:1234
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Valor inválido de --patch-format: %s"
-
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<opções>] [(<mbox>|<Maildir>)...]"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Está a realizar rebase do ramo '%s' sobre '%s'."
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<opções>] (--continue | --skip | --abort)"
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "Está a rebasear neste momento."
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "executar interativamente"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (corrija os conflitos e execute \"git rebase --continue\")"
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "opção histórica -- sem-ação"
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (use \"git rebase --skip\" para ignorar este patch)"
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "permitir recorrer a integração com 3 pontos se necessário"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (use \"git rebase --abort\" para restaurar o ramo original)"
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "silencioso"
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (todos os conflitos foram corrigidos: execute \"git rebase --continue\")"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "adicionar uma linha com Signed-of-by no fim da mensagem de commit"
+#: wt-status.c:1267
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Está a dividir um commit ao mesmo tempo que se efetua rebase do ramo '%s' "
+"sobre '%s'."
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "recodificar em utf8 (predefinição)"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Está a dividir um commit durante um rebase."
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "passar a opção -k ao git-mailinfo"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Assim que o diretório de trabalho estiver limpo, execute \"git rebase --"
+"continue\")"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "passar a opção -b ao git-mailinfo"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Está a editar um commit ao mesmo tempo que efetua rebase do ramo '%s' sobre "
+"'%s'."
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "passar a opção -m ao git-mailinfo"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr "Está a editar um commit durante um rebase."
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "passar a opção --keep-cr ao gitmailsplit para formato de mbox"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (use \"git commit --amend\" para emendar o commit atual)"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
-"não passar a opção --keep-cr ao git-mailsplit independentemente de am.keepcr"
+"  (use \"git rebase --continue\" assim que estiver satisfeito com as "
+"alterações)"
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "retirar todo o conteúdo antes da linha de tesoura"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Está a realizar cherry-pick do commit %s."
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "ação"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (corrija os conflitos e execute \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "transmitir ao git-apply"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (todos os conflitos foram corrigidos: execute \"git cherry-pick --continue"
+"\")"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "raiz"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (use \"git cherry-pick --abort\" para cancelar a operação de cherry-pick)"
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "caminho"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Está a reverter o commit %s neste comento."
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (corrija dos conflitos e execute \"git revert --continue\")"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "num"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+"  (todos os conflitos foram corrigidos: execute \"git revert --continue\")"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "formato"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (use \"git rever --abort\" para cancelar a operação de reversão)"
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "formato de apresentação de patches"
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Está a bissetar, iniciado a partir do ramo '%s'."
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "substituir a mensagem de erro quando a aplicação do patch falha"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "Está a bissetar neste momento."
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "continuar a aplicar os patches depois de resolver os conflitos"
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (use \"git bisect reset\" para voltar ao ramo original)"
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "sinónimo de --continue"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "No ramo "
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "ignorar o patch atual"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "rebase interativo em curso; sobre "
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "restaurar o ramo original e abortar a operação de patch."
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "rebase em curso; sobre "
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "mentir sobre a data de commit"
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "HEAD destacada em "
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "usar a data e hora atual como data de autor"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "HEAD destacada de "
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "id-chave"
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "Não se encontra em nenhum ramo neste momento."
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "assinar os commits com GPG"
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "Commit inicial"
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(uso interno de git-rebase)"
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "Ficheiros não controlados"
+
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "Ficheiros ignorados"
 
-#: builtin/am.c:2326
+#: wt-status.c:1599
+#, c-format
 msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
 msgstr ""
-"A opção -b/--binary há muito que é ignorada e será\n"
-"futuramente removida. Por favor não a use."
+"A enumeração dos ficheiros não controlados demorou %.2f segundos\n"
+"a concluir. 'status -uno' pode acelerar o processo, mas deve ter\n"
+"cuidado de não se esquecer de adicionar novos ficheiros\n"
+"(consulte 'git help status')."
 
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "falha ao ler o índice"
+#: wt-status.c:1605
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Ficheiros não controlados não listados%s"
+
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr " (use a opção -u para mostrar os ficheiros não controlados)"
+
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "Sem alterações"
 
-#: builtin/am.c:2348
+#: wt-status.c:1618
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
-"o diretório de rebesa anterior %s ainda existe, mas foi fornecida uma mbox."
+"nenhuma alteração adicionada para submeter (use \"git add\" e/ou \"git "
+"commit -a\")\n"
+
+#: wt-status.c:1621
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "nenhuma alteração adicionada para submeter\n"
 
-#: builtin/am.c:2372
+#: wt-status.c:1624
 #, c-format
 msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
-"Diretório abandonado %s encontrado.\n"
-"Use \"git am --abort\" para o remover."
-
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "A operação de resolução não está em curso, não retomando."
+"não foi adicionado nada para submeter, mas existem ficheiros não controlados "
+"(use \"git add\" para controlá-los)\n"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<opções>] [<patch>...]"
+#: wt-status.c:1627
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr ""
+"não foi adicionado nada para submeter, mas existem ficheiros não "
+"controlados\n"
 
-#: builtin/apply.c:153
+#: wt-status.c:1630
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "opção de espaço em branco não reconhecida '%s'"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"não há nada para submeter (crie/copie ficheiros e use \"git add\" para "
+"controlá-los)\n"
 
-#: builtin/apply.c:169
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "opção de ignorar espaço em branco não reconhecida '%s'"
+msgid "nothing to commit\n"
+msgstr "não há nada para submeter\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1636
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Não é possível preparar a regexp de carimbo de data/hora %s"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"não há nada para submeter (use -u para mostrar os ficheiros não "
+"controlados)\n"
 
-#: builtin/apply.c:863
+#: wt-status.c:1640
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec retornou %d para a entra: %s"
+msgid "nothing to commit, working tree clean\n"
+msgstr "não há nada para submeter, árvore de trabalho limpa\n"
 
-#: builtin/apply.c:947
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "Commit inicial em "
+
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD (nenhum ramo)"
+
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "atrás "
+
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "à frente "
+
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "não foi possível encontrar o nome do ficheiro no patch na linha %d"
+msgid "cannot %s: You have unstaged changes."
+msgstr "não é possível efetuar %s: tem alterações não preparadas."
 
-#: builtin/apply.c:984
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
+msgstr "além disso, o índice contém alterações não submetidas."
+
+#: wt-status.c:2288
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-"git apply: git-diff incorreto - esperava-se /dev/null, obteve-se %s na linha "
-"%d"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "não é possível efetuar %s: o índice contém alterações não submetidas."
 
-#: builtin/apply.c:989
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-"git apply: git-diff incorreto - o nome do novo ficheiro na linha %d é "
-"inconsistente"
+msgid "failed to unlink '%s'"
+msgstr "falha ao invocar unlink de '%s'"
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<opções>] [--] <caminho>..."
 
-#: builtin/apply.c:990
+#: builtin/add.c:80
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-"git apply: git-diff incorreto - o nome do ficheiro antigo na linha %d é "
-"inconsistente"
+msgid "unexpected diff status %c"
+msgstr "diff status inesperado %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "falha ao atualizar os ficheiros"
 
-#: builtin/apply.c:995
+#: builtin/add.c:95
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: git-diff incorreto - esperava-se /dev/null na linha %d"
+msgid "remove '%s'\n"
+msgstr "remover '%s'\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Alterações não preparadas depois de atualizar o índice:"
+
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "Não foi possível ler o índice"
 
-#: builtin/apply.c:1489
+#: builtin/add.c:220
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recontagem: linha inesperada: %.*s"
+msgid "Could not open '%s' for writing."
+msgstr "Não foi possível abrir '%s' para escrita."
+
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Não foi possível escrever patch"
 
-#: builtin/apply.c:1550
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "falha ao editar patch"
+
+#: builtin/add.c:230
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragmento de patch sem cabeçalho na linha %d: %.*s"
+msgid "Could not stat '%s'"
+msgstr "Não foi possível obter stat de '%s'"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Patch vazio. Abortado."
 
-#: builtin/apply.c:1567
+#: builtin/add.c:237
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"o cabeçalho do git diff não revelou o nome do ficheiro depois de se remover "
-"%d componente do caminho (linha %d)"
-msgstr[1] ""
-"o cabeçalho do git diff não revelou o nome do ficheiro depois de se remover "
-"%d componentes de caminho (linha %d)"
+msgid "Could not apply '%s'"
+msgstr "Não foi possível aplicar '%s'"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "o novo ficheiro depende de conteúdos antigos"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "Os seguintes caminhos estão ignorados por algum ficheiro .gitignore:\n"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "o ficheiro eliminado ainda tem conteúdos"
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "simular ação"
 
-#: builtin/apply.c:1774
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "patch corrompido na linha %d"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "seleção interativa"
+
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "selecionar blocos interativamente"
+
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "editar o diff atual e aplicá-lo"
+
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "permitir adicionar ficheiros ignorados"
+
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "atualizar ficheiros controlados"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "registar apenas o facto de que o caminho será adicionado mais tarde"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr ""
+"adicionar alterações de todos os ficheiros controlados ou não controlados"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr ""
+"ignorar caminhos removidos na árvore de trabalho (o mesmo que --no-all)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "não adicionar, apenas atualizar o índice"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "ignorar ficheiros que não podem ser adicionados por causa de erros"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "verificar quais os ficheiros ignorados na simulação"
+
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "o novo ficheiro %s depende de conteúdos antigos"
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "substituir o bit executável dos ficheiros listados"
 
-#: builtin/apply.c:1812
+#: builtin/add.c:305
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "o ficheiro eliminado %s ainda tem conteúdos"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Use -f se deseja mesmo adicioná-los.\n"
 
-#: builtin/apply.c:1815
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** aviso: o ficheiro %s ficará vazio, mas não será eliminado"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "falha ao adicionar ficheiros"
 
-#: builtin/apply.c:1962
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "patch binário corrompido na linha %d: %.*s"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A e -u são mutuamente incompatíveis"
 
-#: builtin/apply.c:1999
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "patch binário não reconhecido na linha %d"
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "A opção --ignore-missing só pode ser usada em conjunto com --dry-run"
 
-#: builtin/apply.c:2154
+#: builtin/add.c:359
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "patch incompreensível na linha %d"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "o parâmetro '%s' de --chmod tem de ser -x ou +x"
 
-#: builtin/apply.c:2244
+#: builtin/add.c:374
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "não é possível ler a ligação simbólica %s"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Não foi especificado nada, nada adicionado.\n"
 
-#: builtin/apply.c:2248
+#: builtin/add.c:375
 #, c-format
-msgid "unable to open or read %s"
-msgstr "não é possível abrir ou ler %s"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Queria dizer 'git add .'?\n"
 
-#: builtin/apply.c:2901
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "início de linha inválido: '%c'"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "ficheiro de índice corrompido"
 
-#: builtin/apply.c:3020
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "Excerto nº%d bem sucedido na linha %d (%d linha deslocada)."
-msgstr[1] "Excerto nº%d bem sucedido na linha %d (%d linhas deslocadas)."
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "não foi possível analisar o autor do script"
 
-#: builtin/apply.c:3032
+#: builtin/am.c:491
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Contexto reduzido para (%ld/%ld) para aplicar o fragmento em %d"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' foi eliminado pelo hook applypatch-msg"
 
-#: builtin/apply.c:3038
+#: builtin/am.c:532
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"ao procura por:\n"
-"%.*s"
+msgid "Malformed input line: '%s'."
+msgstr "Linha de entrada malformada: '%s'."
 
-#: builtin/apply.c:3060
+#: builtin/am.c:569
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "falta de dados do patch binário '%s'"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Falha ao copiar notas de '%s' para '%s'"
 
-#: builtin/apply.c:3163
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "o patch binário não foi aplicado corretamente a '%s'"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "falha ao invocar fseek"
 
-#: builtin/apply.c:3169
+#: builtin/am.c:775
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"o patch binário aplicado a '%s' gera resultados incorretos (esperava-se %s, "
-"obteve-se %s)"
+msgid "could not parse patch '%s'"
+msgstr "não foi possível analisar o patch '%s'"
 
-#: builtin/apply.c:3190
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "falha ao aplicar o patch: %s:%ld"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Só pode ser aplicada uma série de patches StGIT duma só vez"
 
-#: builtin/apply.c:3314
-#, c-format
-msgid "cannot checkout %s"
-msgstr "não é possível extrair %s"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "carimbo de data/hora inválido"
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "a ler '%s' indicado por uma ligação simbólica"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "linha de Data inválida"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "o caminho %s foi eliminado ou mudou de nome"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "mudança de fuso horário inválida"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: não existe no índice"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Falha ao detetar o formato do patch."
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
+#: builtin/am.c:989 builtin/clone.c:397
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "failed to create directory '%s'"
+msgstr "falha ao criar o diretório '%s'"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
-#, c-format
-msgid "%s: does not match index"
-msgstr "%s: não tem correspondência no índice"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Falha ao dividir patches."
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "patch de remoção deixa conteúdos no ficheiro"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "não é possível escrever o ficheiro de índice"
 
-#: builtin/apply.c:3669
+#: builtin/am.c:1176
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: tipo errado"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Após resolver este problema, execute \"%s --continue\"."
 
-#: builtin/apply.c:3671
+#: builtin/am.c:1177
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s é do tipo %o, esperado %o"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Se preferir ignorar este patch, execute \"%s --skip\"."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: builtin/am.c:1178
 #, c-format
-msgid "invalid path '%s'"
-msgstr "caminho inválido '%s'"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"Para restaurar o ramo original e interromper a aplicação dos patches, "
+"execute \"%s --abort\"."
 
-#: builtin/apply.c:3879
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s: já existe no índice"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "O patch está vazio. Foi dividido incorretamente?"
 
-#: builtin/apply.c:3882
+#: builtin/am.c:1390 builtin/log.c:1557
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: já existe no diretório de trabalho"
+msgid "invalid ident line: %s"
+msgstr "linha de identidade inválida: %s"
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1417
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "o novo modo (%o) de %s não corresponde ao modo antigo (%o)"
+msgid "unable to parse commit %s"
+msgstr "não foi possível analisar o commit %s"
 
-#: builtin/apply.c:3907
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "o novo modo (%o) de %s não corresponde ao modo antigo (%o) de %s"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"O repositório não tem os blobs necessários para recorrer a integração com 3 "
+"pontos."
 
-#: builtin/apply.c:3927
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "o ficheiro afetado '%s' é indicado por uma ligação simbólica"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr "A usar informação do índice para reconstruir uma árvore de base..."
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: patch não se aplica com sucesso"
+#: builtin/am.c:1631
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Editou o patch manualmente?\n"
+"Não é possível aplicá-lo aos blobs registados no índice."
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "A verificar o patch %s..."
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr ""
+"A recorrer a uma de base para aplicação de patches e integração com 3 "
+"pontos..."
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "falha ao invocar make_cache_entry em '%s'"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Falha ao integrar as alterações."
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "não é possível remover %s do índice"
+#: builtin/am.c:1686 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree falhou ao escrever uma árvore"
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "patch corrompido no submódulo %s"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "a aplicar a um histórico vazio"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "não é possível obter estado do novo ficheiro criado '%s'"
+#: builtin/am.c:1706 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "falha ao escrever objeto de commit"
 
-#: builtin/apply.c:4224
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "unable to create backing store for newly created file %s"
+msgid "cannot resume: %s does not exist."
+msgstr "não é possível continuar: %s não existe."
+
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
-"não é possível criar armazenamento de segurança do ficheiro recém-criado %s"
+"não é possível entrar em modo interativo sem um entrada padrão conectada a "
+"um terminal."
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "não é possível adicionar %s à cache"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Corpo do commit:"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "a fechar o ficheiro '%s'"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1774
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "Aplicar? [y]sim/[n]ão/[e]ditar/[v]er patch/[a]ceitar todos: "
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "não é possível escrever o ficheiro '%s' com o modo %o"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Índice modificado: não é possível aplicar patches (modificado: %s)"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Patch %s aplicado com sucesso."
+msgid "Applying: %.*s"
+msgstr "A aplicar: %.*s"
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "erro interno"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Nenhuma alteração -- Já foi aplicado o patch."
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1885
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "A aplicar patch %%s com %d rejeição..."
-msgstr[1] "A aplicar patch %%s com %d rejeições..."
+msgid "Patch failed at %s %.*s"
+msgstr "Falha ao aplicar o patch em %s %.*s"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1891
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "a truncar o nome do ficheiro .rej em %.*s.rej"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "A cópia do patch que falhou encontra-se em: %s"
 
-#: builtin/apply.c:4432
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "não é possível abrir %s: %s"
+#: builtin/am.c:1936
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Sem alterações - esqueceu-se de usar 'git add'?\n"
+"Se não há nada por preparar, provavelmente essas mesmas alterações\n"
+"já foram introduzidas; pode querer ignorar este patch."
+
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Ainda há caminhos não integrados no índice.\n"
+"Esqueceu-se de usar 'git add'?"
 
-#: builtin/apply.c:4445
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Excerto nº%d aplicado com sucesso."
+msgid "Could not parse object '%s'."
+msgstr "Não foi possível analisar o objeto '%s'."
+
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "falha ao limpar o índice"
 
-#: builtin/apply.c:4448
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr "Excerto nº%d rejeitado."
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Parece que a HEAD foi movida desde a última vez que o 'am' falhou.\n"
+"Não recuando a ORIG_HEAD"
 
-#: builtin/apply.c:4537
+#: builtin/am.c:2200
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "Patch '%s' ignorado."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Valor inválido de --patch-format: %s"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "entrada não reconhecida"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<opções>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "não foi possível ler o ficheiro de índice"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<opções>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way fora de um repositório"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "executar interativamente"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index fora de um repositório"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "opção histórica -- sem-ação"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached fora de um repositório"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "permitir recorrer a integração com 3 pontos se necessário"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "não é possível abrir o patch '%s'"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "silencioso"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "%d erro de espaço em branco reprimido"
-msgstr[1] "%d erros de espaço em branco reprimidos"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "adicionar uma linha com Signed-of-by no fim da mensagem de commit"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d linha adiciona erros de espaço em branco."
-msgstr[1] "%d linhas adicionam erros de espaço em branco."
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "recodificar em utf8 (predefinição)"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "não aplicar alterações que correspondam ao caminho fornecido"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "passar a opção -k ao git-mailinfo"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "aplicar alterações que correspondam ao caminho fornecido"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "passar a opção -b ao git-mailinfo"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "remover <num> barras à esquerda dos caminhos de diff tradicional"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "passar a opção -m ao git-mailinfo"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "ignorar adições feitas pelo patch"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "passar a opção --keep-cr ao gitmailsplit para formato de mbox"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "em vez de aplicar o patch, mostrar o diffstat da entrada"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"não passar a opção --keep-cr ao git-mailsplit independentemente de am.keepcr"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "mostrar número de linhas adicionadas e removidas em notação decimal"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "retirar todo o conteúdo antes da linha de tesoura"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "em vez de aplicar o patch, mostrar um resumo da entrada"
+#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
+#: builtin/am.c:2278 builtin/am.c:2281 builtin/am.c:2284 builtin/am.c:2287
+#: builtin/am.c:2293
+msgid "pass it through git-apply"
+msgstr "transmitir ao git-apply"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "em vez de aplicar o patch, verificar se o patch pode ser aplicado"
+#: builtin/am.c:2283 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "garantir que o patch pode ser aplicado ao índice atual"
+#: builtin/am.c:2289 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:442 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "formato"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "aplicar um patch sem tocar na árvore de trabalho"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "formato de apresentação de patches"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "aceitar patches que alteram ficheiros fora da área de trabalho"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "substituir a mensagem de erro quando a aplicação do patch falha"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "aplicar o patch também (use com --stat/--summary/--check)"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "continuar a aplicar os patches depois de resolver os conflitos"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "tentar integração com três pontos se um patch não se aplica com êxito"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "sinónimo de --continue"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-"construir um índice temporário baseado na informação incorporada do índice"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "ignorar o patch atual"
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "os caminhos estão separados por caracteres NUL"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "restaurar o ramo original e abortar a operação de patch."
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "garantir que, pelo menos, <n> linhas de contexto coincidem"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "mentir sobre a data de commit"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "detetar linhas novas ou modificadas que tenham espaços em branco"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "usar a data e hora atual como data de autor"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignorar alterações de espaço em branco ao procurar contexto"
+#: builtin/am.c:2315 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "id-chave"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "aplicar o patch em reverso"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "assinar os commits com GPG"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "não esperar nenhuma linha de contexto"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(uso interno de git-rebase)"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "deixar os excertos rejeitados nos respetivos ficheiros *.rej"
+#: builtin/am.c:2334
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"A opção -b/--binary há muito que é ignorada e será\n"
+"futuramente removida. Por favor não a use."
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "permitir a sobreposição de excertos"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "falha ao ler o índice"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
+#: builtin/am.c:2356
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
 msgstr ""
-"tolerar deteções incorretas de falta de nova linha no final do ficheiro"
+"o diretório de rebesa anterior %s ainda existe, mas foi fornecida uma mbox."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "não confiar na contagem de linhas no cabeçalho dos excertos"
+#: builtin/am.c:2380
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Diretório abandonado %s encontrado.\n"
+"Use \"git am --abort\" para o remover."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "preceder <root> a todos os nomes de ficheiro"
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "A operação de resolução não está em curso, não retomando."
+
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<opções>] [<patch>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4110,118 +5171,163 @@ msgstr "git blame [<opções>] [<rev-opções>] [<rev>] [--] <ficheiro>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-opções> estão documentadas em git-rev-list(1)"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1777
 msgid "Blaming lines"
 msgstr "Linhas de culpa"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2573
 msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 "Mostrar entradas de culpa à medida que forem encontradas, incrementalmente"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2574
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Mostar SHA-1 dos commits limite em branco (Predefinição: desativado)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2575
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Não tratar os commits raiz como limites (Predefinição: desativado)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2576
 msgid "Show work cost statistics"
 msgstr "Mostrar estatísticas de custo de atividade"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2577
 msgid "Force progress reporting"
 msgstr "Forçar informação de progresso"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2578
 msgid "Show output score for blame entries"
 msgstr "Mostrar a pontuação das entradas de culpa"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2579
 msgid "Show original filename (Default: auto)"
 msgstr "Mostrar o nome do ficheiro original (Predefinição: auto)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2580
 msgid "Show original linenumber (Default: off)"
 msgstr "Mostrar números de linha originais (Predefinição: desativado)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2581
 msgid "Show in a format designed for machine consumption"
 msgstr "Mostrar em formato próprio para ser consumo por uma máquina"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2582
 msgid "Show porcelain format with per-line commit information"
 msgstr "Mostrar em formato de porcelana com informações de commit por linha"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2583
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Usar o mesmo modo de saída que git-annotate (Predefinição: desativado)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2584
 msgid "Show raw timestamp (Default: off)"
 msgstr "Mostrar carimbo de data/hora em bruto (Predefinição: desativado)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2585
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Mostrar SHA1 longo de commit (Predefinição: desativado)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2586
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr ""
 "Suprimir nome de autor e carimbo de data/hora (Predefinição: desativado)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2587
 msgid "Show author email instead of name (Default: off)"
 msgstr "Mostrar o email do autor em vez do nome (Predefinição: desativado)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2588
 msgid "Ignore whitespace differences"
 msgstr "Ignorar as diferenças de espaço em branco"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "Usar um heurística experimental para melhorar diffs"
+
+#: builtin/blame.c:2597
 msgid "Spend extra cycles to find better match"
 msgstr "Despender ciclos extra para encontrar uma melhor correspondência"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2598
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Usar revisões do <ficheiro> em vez de invocar git-rev-list"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2599
 msgid "Use <file>'s contents as the final image"
 msgstr "Usar o conteúdo do <ficheiro> como imagem final"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2600 builtin/blame.c:2601
 msgid "score"
 msgstr "pontuação"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2600
 msgid "Find line copies within and across files"
 msgstr "Localizar linhas copiadas dentro e entre ficheiros"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2601
 msgid "Find line movements within and across files"
 msgstr "Localizar linhas movidas dentro e entre ficheiros"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "Process only line range n,m, counting from 1"
 msgstr "Processar apenas o intervalo de linhas n,m, a cantar de 1"
 
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"--progress não pode ser usado com --incremental ou formatos de porcelana"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2697
 msgid "4 years, 11 months ago"
 msgstr "há 4 anos e 11 meses atrás"
 
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents e --reverse não se misturam bem."
+
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr "não é possível usar --contents com nome de objeto commit final"
+
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse e --first-parent juntos requer que se especifique o último commit"
+
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse --first-parent juntos requer intervalo ao longo do primeiro-pai"
+
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
+msgstr "o caminho %s não existe em %s"
+
+#: builtin/blame.c:2851
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "não é possível ler o blob %s do caminho %s"
+
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "o ficheiro %s só tem %lu linha"
+msgstr[1] "o ficheiro %s só tem %lu linhas"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<opções>] [-r | -a] [--merged | --no-merged]"
@@ -4242,7 +5348,11 @@ msgstr "git branch [<opções>] (-m | -M) [<ramo-antigo>] <novo-ramo>"
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<opções>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:143
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [<opções>] [-r | -a] [--format]"
+
+#: builtin/branch.c:144
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -4251,7 +5361,7 @@ msgstr ""
 "a eliminar o ramo '%s' integrado em\n"
 "         '%s', mas ainda não integrado em HEAD."
 
-#: builtin/branch.c:147
+#: builtin/branch.c:148
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -4260,12 +5370,12 @@ msgstr ""
 "ramo '%s' não eliminado, visto que ainda não foi integrado em\n"
 "         '%s', apesar de já ter sido integrado em HEAD."
 
-#: builtin/branch.c:161
+#: builtin/branch.c:162
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Não foi possível pesquisar pelo objeto commit de '%s'"
 
-#: builtin/branch.c:165
+#: builtin/branch.c:166
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -4274,165 +5384,93 @@ msgstr ""
 "O ramo '%s' não foi totalmente integrado.\n"
 "Se tem a certeza que o quer eliminar, execute 'git branch -D %s'."
 
-#: builtin/branch.c:178
+#: builtin/branch.c:179
 msgid "Update of config-file failed"
 msgstr "Falha ao atualizar o ficheiro de configuração"
 
-#: builtin/branch.c:206
+#: builtin/branch.c:210
 msgid "cannot use -a with -d"
 msgstr "não é possível usar -a com -d"
 
-#: builtin/branch.c:212
+#: builtin/branch.c:216
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Não foi possível pesquisar pelo objeto commit de HEAD"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Não é possível eliminar o ramo '%s' extraído em '%s'"
 
-#: builtin/branch.c:241
+#: builtin/branch.c:245
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "ramo de monitorização remoto '%s' não encontrado."
 
-#: builtin/branch.c:242
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "ramo '%s' não encontrado."
 
-#: builtin/branch.c:257
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Erro a eliminar o ramo de monitorização remoto '%s'"
 
-#: builtin/branch.c:258
+#: builtin/branch.c:262
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Erro a eliminar ramo '%s'"
 
-#: builtin/branch.c:265
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Ramo de monitorização remoto %s eliminado (era %s).\n"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:270
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Ramo %s eliminado (era %s).\n"
 
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: desaparecido]"
-
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
-
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: atrás %d]"
-
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
-msgstr "[atrás %d]"
-
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: à frente %d]"
-
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
-msgstr "[à frente %d]"
-
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: à frente %d, atrás %d]"
-
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[à frente %d, atrás %d]"
-
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
-msgstr " **** referências inválida ****"
-
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(nenhum ramo, a efetuar rebase de %s)"
-
-#: builtin/branch.c:378
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(nenhum ramo, bissecção iniciada em %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD destacada em %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD destacada de %s)"
-
-#: builtin/branch.c:393
-msgid "(no branch)"
-msgstr "(nenhum ramo)"
-
-#: builtin/branch.c:544
+#: builtin/branch.c:441
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "O ramo %s está a ser rebaseado em %s"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:445
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "O ramo %s está a ser bissetado em %s"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:460
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "não é possível mudar o nome do ramo atual vista que não se encontra num ramo."
 
-#: builtin/branch.c:573
+#: builtin/branch.c:470
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nome de ramo inválido: '%s'"
 
-#: builtin/branch.c:590
+#: builtin/branch.c:487
 msgid "Branch rename failed"
 msgstr "Falha ao mudar o nome do ramo"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:490
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "O ramo incorretamente denominado '%s' mudou de nome"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:493
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "O nome do ramo mudou para %s, mas a HEAD não está atualizada!"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:502
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "O ramo mudou de nome, mas a atualização do ficheiro de configuração falhou"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:518
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4443,159 +5481,176 @@ msgstr ""
 "  %s\n"
 "Linha começadas com '%c' serão ignoradas.\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:551
 msgid "Generic options"
 msgstr "Opções genéricas"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:553
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "apresentar hash e assunto, duplique para ramos a montante"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:554
 msgid "suppress informational messages"
 msgstr "suprimir mensagens informativas"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:555
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "configurar modo de seguimento (consulte git-pull(1))"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:557
 msgid "change upstream info"
 msgstr "alterar a informação do ramo a montante"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "upstream"
 msgstr "a montante"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "change the upstream info"
 msgstr "alterar a informação do ramo a montante"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "Remover a informação do ramo a montante"
+
+#: builtin/branch.c:561
 msgid "use colored output"
 msgstr "usar saída colorida"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:562
 msgid "act on remote-tracking branches"
 msgstr "atuar sobre ramos de monitorização remotos"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:564 builtin/branch.c:566
 msgid "print only branches that contain the commit"
 msgstr "imprimir apenas ramos que contenham o commit"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "imprimir apenas ramos que não contenham o commit"
+
+#: builtin/branch.c:570
 msgid "Specific git-branch actions:"
 msgstr "Ações específicas do git-branch:"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:571
 msgid "list both remote-tracking and local branches"
 msgstr "listar ramos de monitorização remotos e ramos locais"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:573
 msgid "delete fully merged branch"
 msgstr "eliminar um ramo totalmente integrado"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:574
 msgid "delete branch (even if not merged)"
 msgstr "eliminar um ramo (mesmo que não tenha sido integrado)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:575
 msgid "move/rename a branch and its reflog"
 msgstr "mover ou mudar o nome de um ramo e o seu reflog"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:576
 msgid "move/rename a branch, even if target exists"
 msgstr "mover ou mudar o nome de um ramo, mesmo que o destino já exista"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:577
 msgid "list branch names"
 msgstr "listar os nomes dos ramos"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:578
 msgid "create the branch's reflog"
 msgstr "criar reflog do ramo"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:580
 msgid "edit the description for the branch"
 msgstr "editar a descrição do ramo"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:581
 msgid "force creation, move/rename, deletion"
 msgstr "forçar criação, mover/mudar o nome ou exclusão"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:582
 msgid "print only branches that are merged"
 msgstr "imprimir apenas os ramos que foram integrados"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:583
 msgid "print only branches that are not merged"
 msgstr "imprimir apenas os ramos que não foram integrados"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:584
 msgid "list branches in columns"
 msgstr "listar os ramos em colunas"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
 msgid "key"
 msgstr "chave"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
 msgid "field name to sort on"
 msgstr "nome do campo pelo qual ordernar"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
 msgid "object"
 msgstr "objeto"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:589
 msgid "print only branches of the object"
 msgstr "imprimir apenas os ramos do objeto"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "ordenar e filtrar são insensíveis a maiúsculas"
+
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "formato a usar na saída"
+
+#: builtin/branch.c:611
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Falha ao resolver HEAD numa referência válida."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:615 builtin/clone.c:724
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD não encontrada em refs/heads!"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:638
 msgid "--column and --verbose are incompatible"
 msgstr "--column e --verbose são incompatíveis"
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:649 builtin/branch.c:701
 msgid "branch name required"
 msgstr "nome do ramo é obrigatório"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:677
 msgid "Cannot give description to detached HEAD"
 msgstr "Não é possível atribuir descrição a HEAD destacada"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:682
 msgid "cannot edit description of more than one branch"
 msgstr "não é possível editar a descrição de mais do que um ramo"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:689
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Ainda não há commits no ramo '%s'."
 
-#: builtin/branch.c:773
+#: builtin/branch.c:692
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Não há nenhum ramo denominado '%s'."
 
-#: builtin/branch.c:788
+#: builtin/branch.c:707
 msgid "too many branches for a rename operation"
 msgstr "demasiados ramos para uma operação de mudança de nome"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:712
 msgid "too many branches to set new upstream"
 msgstr "demasiados ramos para definir novo ramo a montante"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:716
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -4603,41 +5658,41 @@ msgstr ""
 "não foi possível definir %s como ramo a montante de HEAD visto que esta não "
 "aponta para um ramo."
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
 msgid "no such branch '%s'"
 msgstr "o ramo '%s' não existe"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:723
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "o ramo '%s' não existe"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:735
 msgid "too many branches to unset upstream"
 msgstr "demasiados ramos para remover a definição de ramo a montante"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:739
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "não foi possível remover a definição de ramo a montante de HEAD visto que "
 "esta não aponta para um ramo."
 
-#: builtin/branch.c:826
+#: builtin/branch.c:745
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "O ramo '%s' não tem informação sobre o ramo a montante"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:759
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "não faz sentido criar 'HEAD' manualmente"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:765
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "as opções -a e -r de 'git branch' não fazem sentido com um nome de ramo"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:768
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4646,7 +5701,7 @@ msgstr ""
 "A opção --set-upstream é obsoleta e será removida. Considere o uso de --"
 "track ou --set-upstream-to\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:785
 #, c-format
 msgid ""
 "\n"
@@ -4657,78 +5712,94 @@ msgstr ""
 "Se quer que '%s' siga '%s', faça:\n"
 "\n"
 
-#: builtin/bundle.c:51
+#: builtin/bundle.c:45
 #, c-format
 msgid "%s is okay\n"
 msgstr "%s está correto\n"
 
-#: builtin/bundle.c:64
+#: builtin/bundle.c:58
 msgid "Need a repository to create a bundle."
 msgstr "É necessário um repositório para criar um bundle."
 
-#: builtin/bundle.c:68
+#: builtin/bundle.c:62
 msgid "Need a repository to unbundle."
 msgstr "É preciso um repositório para desempacotar."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<tipo>|--textconv) <objeto>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <tipo> | --textconv | --filters) [--path=<caminho>] <objeto>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<tipo> pode ser um de: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "mostrar tipo do objeto"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "mostrar tamanho do objeto"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "sair com retorno zero quando não houver erros"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "mostrar conteúdo do objeto com impressão bonita"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "executar textconv no conteúdo de objetos blob"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "para objetos blob, correr filtros sobre o conteúdo do objeto"
+
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "blob"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "usar um caminho específico para --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "permitir que -s e -t funcionem com objetos danificados/corrompidos"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "carregar a saída de --batch"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr "mostrar informação e conteúdo dos objetos fornecidos na entrada padrão"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "mostrar informação sobre os objetos fornecidos na entrada padrão"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "seguir ligações simbólica no interior da árvore (usado com --batch ou --"
 "batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "mostrar todos os objetos com --batch ou --batch-check"
 
@@ -4748,7 +5819,7 @@ msgstr "apresentar todos os atributos definidos no ficheiro"
 msgid "use .gitattributes only from the index"
 msgstr "usar .gitattributes apenas a partir do índice"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "ler os nomes dos ficheiros da entrada padrão"
 
@@ -4756,7 +5827,7 @@ msgstr "ler os nomes dos ficheiros da entrada padrão"
 msgid "terminate input and output records by a NUL character"
 msgstr "terminar registos da entrada e da saída com um carácter NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:352
 msgid "suppress progress reporting"
 msgstr "suprimir informação de progresso"
 
@@ -4848,9 +5919,9 @@ msgid "write the content to temporary files"
 msgstr "escrever o conteúdo em ficheiros temporários"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:472
 msgid "string"
 msgstr "cadeia"
 
@@ -4862,114 +5933,114 @@ msgstr "preceder <cadeia> ao criar ficheiros"
 msgid "copy out the files from named stage"
 msgstr "copiar os ficheiros do estágio indicado"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:27
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [<opções>] <ramo>"
 
-#: builtin/checkout.c:26
+#: builtin/checkout.c:28
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<opções>] [<ramo>] -- <ficheiro>..."
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/checkout.c:153 builtin/checkout.c:186
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "o caminho '%s' não tem a nossa versão"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:155 builtin/checkout.c:188
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "o caminho '%s' não tem a versão deles"
 
-#: builtin/checkout.c:152
+#: builtin/checkout.c:171
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "o caminho '%s' não tem todas as versões necessárias"
 
-#: builtin/checkout.c:196
+#: builtin/checkout.c:215
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "o caminho '%s' não tem as versões necessárias"
 
-#: builtin/checkout.c:213
+#: builtin/checkout.c:232
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "caminho '%s': não é possível integrar"
 
-#: builtin/checkout.c:230
+#: builtin/checkout.c:249
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Não é possível adicionar os resultados da integração de '%s'"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' não pode ser usado com caminhos em atualização"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:281 builtin/checkout.c:284
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' não pode ser usado com %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:287
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Não é possível atualizar os caminhos e mudar para o ramo '%s' ao mesmo tempo."
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "o caminho '%s' não foi integrado"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:513
 msgid "you need to resolve your current index first"
 msgstr "primeiro deve resolver o índice atual"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:644
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Não é possível efetuar reflog de '%s': %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:685
 msgid "HEAD is now at"
 msgstr "HEAD está agora em"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:689 builtin/clone.c:678
 msgid "unable to update HEAD"
 msgstr "não foi possível atualizar HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:693
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Repor ramo '%s'\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:696
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Já em '%s'\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:700
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Mudou para e repôs o ramo '%s'\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:702 builtin/checkout.c:1090
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Mudou para o novo ramo '%s'\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:704
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Mudou para o ramo '%s'\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:755
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... e mais %d.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4990,7 +6061,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:780
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -5017,151 +6088,151 @@ msgstr[1] ""
 " git branch <nome-do-novo-ramo> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:816
 msgid "internal error in revision walk"
 msgstr "erro interno durante o curso de revisões"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:820
 msgid "Previous HEAD position was"
 msgstr "A posição anterior de HEAD era"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:847 builtin/checkout.c:1085
 msgid "You are on a branch yet to be born"
 msgstr "Está num ramo ainda não criado"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:991
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "esperava-se apenas uma referência, %d fornecidas."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1031 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referência inválida: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1060
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "a referência não é uma árvore: %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1099
 msgid "paths cannot be used with switching branches"
 msgstr "não podem ser usados caminhos ao mudar de ramo"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' não pode ser usado ao mudar de ramo"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' não pode ser usado com '%s'"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1126
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Não é possível mudar de ramo para '%s', visto que não é um commit"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:325
+#: builtin/worktree.c:327
 msgid "branch"
 msgstr "ramo"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1160
 msgid "create and checkout a new branch"
 msgstr "criar e extrair um novo ramo"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1162
 msgid "create/reset and checkout a branch"
 msgstr "criar/repor e extrair um ramo"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1163
 msgid "create reflog for new branch"
 msgstr "criar reflog do novo ramo"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1164 builtin/worktree.c:329
 msgid "detach HEAD at named commit"
 msgstr "destacar HEAD no commit indicado"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1165
 msgid "set upstream info for new branch"
 msgstr "definir a informação do ramo a montante do novo ramo"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new-branch"
 msgstr "novo-ramo"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new unparented branch"
 msgstr "novo ramo sem pai"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1168
 msgid "checkout our version for unmerged files"
 msgstr "extrair a nossa versão dos ficheiros não integrados"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1170
 msgid "checkout their version for unmerged files"
 msgstr "extrair a versão deles dos ficheiros não integrados"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1172
 msgid "force checkout (throw away local modifications)"
 msgstr "forçar extração (descartar modificações locais)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1173
 msgid "perform a 3-way merge with the new branch"
 msgstr "realizar uma integração com 3 pontos com o novo ramo"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1174 builtin/merge.c:234
 msgid "update ignored files (default)"
 msgstr "atualizar ficheiros ignorados (predefinição)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
 msgid "style"
 msgstr "estilo"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1176
 msgid "conflict style (merge or diff3)"
 msgstr "estilo de conflito (merge ou diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1179
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "não restringir especificadores de caminho a entradas esparsas"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1181
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "tentar adivinhar 'git checkout <ramo-inexistente>'"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1183
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "não verificar se outra árvore de trabalho contém a referência fornecida"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
 msgid "force progress reporting"
 msgstr "forçar informação de progresso"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1224
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B e --orphan são mutuamente exclusivos"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1241
 msgid "--track needs a branch name"
 msgstr "--track requer um nome dum ramo"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1246
 msgid "Missing branch name; try -b"
 msgstr "Falta um nome dum ramo; tente -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1282
 msgid "invalid path specification"
 msgstr "especificação de caminho inválida"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1289
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5171,12 +6242,12 @@ msgstr ""
 "tempo.\n"
 "Pretendia extrair '%s' o qual não pode ser resolvido como commit?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1294
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach não aceita um caminho como argumento '%s'"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1298
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5215,19 +6286,21 @@ msgstr "Ignoraria o repositório %s\n"
 msgid "failed to remove %s"
 msgstr "falha ao remover %s"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
 "Ajuda de linha de comandos:\n"
 "1          - selecionar um item numerado\n"
 "foo        - selecionar item baseado no prefixo único\n"
-"           - (vazio) não seleciona nada"
+"           - (vazio) não seleciona nada\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:301 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5236,7 +6309,7 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
 "Ajuda de linha de comandos:\n"
 "1          - selecionar um único item\n"
@@ -5245,38 +6318,40 @@ msgstr ""
 "foo        - selecionar item baseado no prefixo único\n"
 "-...       - desselecionar itens especificados\n"
 "*          - escolher todos os itens\n"
-"           - (vazio) concluir seleção"
+"           - (vazio) concluir seleção\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "O quê (%s)?"
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "O quê (%s)?\n"
 
-#: builtin/clean.c:653
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Introduza padrões a ignorar>> "
 
-#: builtin/clean.c:690
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "AVISO: não foram encontrados itens correspondentes a: %s"
 
-#: builtin/clean.c:711
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Selecione itens para eliminar"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/clean.c:758
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Remover %s [y/N]? "
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Adeus."
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "Adeus.\n"
 
-#: builtin/clean.c:785
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -5294,62 +6369,63 @@ msgstr ""
 "help                - esta ajuda\n"
 "?                   - ajuda para seleção em linha de comandos"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:818 git-add--interactive.perl:1736
 msgid "*** Commands ***"
 msgstr "*** Comandos ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:819 git-add--interactive.perl:1733
 msgid "What now"
 msgstr "E agora"
 
-#: builtin/clean.c:821
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Removeria o seguinte item:"
 msgstr[1] "Removeria os seguintes itens:"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Não há mais ficheiros por limpar, a terminar."
 
-#: builtin/clean.c:869
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "não imprimir os nomes dos ficheiros removidos"
 
-#: builtin/clean.c:871
+#: builtin/clean.c:877
 msgid "force"
 msgstr "forçar"
 
-#: builtin/clean.c:872
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "limpeza interativa"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "remover diretórios inteiros"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:539 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "padrão"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "adicionar <padrão> às regras ignoradas"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "também remover ficheiros ignorados"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "remover apenas ficheiros ignorados"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x e -X não pode ser usados juntos"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:907
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -5357,7 +6433,7 @@ msgstr ""
 "clean.requireForce definido como true e nenhum -i, -n, ou -f fornecido; "
 "limpeza recusada"
 
-#: builtin/clean.c:904
+#: builtin/clean.c:910
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -5369,112 +6445,134 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<opções>] [--] <repo> [<dir>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:80
 msgid "don't create a checkout"
 msgstr "não criar uma extração"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "criar um repositório nu"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:85
 msgid "create a mirror repository (implies bare)"
 msgstr "criar um repositório espelhado (implica repositório nu)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:87
 msgid "to clone from a local repository"
 msgstr "para clonar de um repositório local"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:89
 msgid "don't use local hardlinks, always copy"
 msgstr "não usar ligações fixas, copiar sempre"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:91
 msgid "setup as shared repository"
 msgstr "configurar como repositório partilhado"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "pathspec"
+
+#: builtin/clone.c:93 builtin/clone.c:97
 msgid "initialize submodules in the clone"
 msgstr "inicializar submódulos no clone"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:100
 msgid "number of submodules cloned in parallel"
 msgstr "número de submódulos clonados em paralelo"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:101 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "diretório-modelo"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:102 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "diretório que contém os modelos usados"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
 msgid "reference repository"
 msgstr "repositório de referência"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:108
 msgid "use --reference only while cloning"
 msgstr "usar --reference apenas para clonar"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
 msgid "name"
 msgstr "nome"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:110
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "usar <nome> em vez de 'origin' para seguir o ramo a montante"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:112
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "extrair <ramo> em vez da HEAD do remoto"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:114
 msgid "path to git-upload-pack on the remote"
 msgstr "caminho para git-upload-pack no remoto"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "profundidade"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:116
 msgid "create a shallow clone of that depth"
 msgstr "criar um clone raso com essa profundidade"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "hora"
+
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr "criar um clone raso desde uma data específica"
+
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "revisão"
+
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr "aprofundar o histórico de um clone raso, excluindo a revisão"
+
+#: builtin/clone.c:122
 msgid "clone only one branch, HEAD or --branch"
 msgstr "clonar apenas um ramo, HEAD ou --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:124
 msgid "any cloned submodules will be shallow"
 msgstr "qualquer submódulo clonado será raso"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:125 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:126 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "separar o repositório git da árvore de trabalho"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:127
 msgid "key=value"
 msgstr "chave=valor"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:128
 msgid "set config inside the new repository"
 msgstr "definir configuração dentro do novo repositório"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
 msgid "use IPv4 addresses only"
 msgstr "usar apenas endereços IPv4"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
 msgid "use IPv6 addresses only"
 msgstr "usar apenas endereços IPv6"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:268
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5482,59 +6580,42 @@ msgstr ""
 "Não foi possível adivinhar o nome do diretório.\n"
 "Especifique um diretório na linha de comandos"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"ainda não é suportada a funcionalidade que permite ter o repositório de "
-"referência '%s' como uma extração ligada."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "o repositório de referência '%s' não é um repositório local."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "o repositório de referência '%s' é raso"
-
-#: builtin/clone.c:317
+#: builtin/clone.c:321
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "o repositório de referência '%s' está enxertado"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: Não foi possível adicionar sobressalente de '%s': %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:393
 #, c-format
 msgid "failed to open '%s'"
 msgstr "falha ao abrir '%s'"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:401
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existe e não é um diretório"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:415
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "falha ao invocar stat de %s\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:437
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "falha ao criar a ligação '%s'"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:441
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "falha ao copiar o ficheiro para '%s'"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:466
 #, c-format
 msgid "done.\n"
 msgstr "concluído.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:478
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5544,124 +6625,140 @@ msgstr ""
 "Pode inspecionar o que foi extraído com 'git status'\n"
 "e repetir a extração com 'git checkout -f HEAD'\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:555
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Ramo remoto %s não encontrado para clonar."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:650
 msgid "remote did not send all necessary objects"
 msgstr "o remoto não enviou todos os objetos necessários"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:666
 #, c-format
 msgid "unable to update %s"
 msgstr "não foi possível atualizar %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:715
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "a HEAD remota referencia uma referência inexistente, não é possível "
 "extrair.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:746
 msgid "unable to checkout working tree"
 msgstr "não foi possível extrair a árvore de trabalho"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:786
 msgid "unable to write parameters to config file"
 msgstr "não foi possível escrever os parâmetros no ficheiro de configuração"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:849
 msgid "cannot repack to clean up"
 msgstr "não é possível reempacotar para limpar"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:851
 msgid "cannot unlink temporary alternates file"
 msgstr ""
 "não é possível invocar unlink sobre o ficheiro sobressalente temporário"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:884 builtin/receive-pack.c:1901
 msgid "Too many arguments."
 msgstr "Demasiados argumentos."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:888
 msgid "You must specify a repository to clone."
 msgstr "Deve especificar um repositório para clonar."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:901
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "as opções --bare e --origin %s são incompatíveis."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:904
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare e --separate-git-dir são incompatíveis."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:917
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "o repositório '%s' não existe"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "profundidade %s não é um número positivo"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:933
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "o caminho de destino '%s' já existe e não é um diretório vazio."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:943
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "a árvore de trabalho '%s' já existe."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
 #: builtin/worktree.c:222 builtin/worktree.c:249
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "não foi possível criar os diretórios superiores de '%s'"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:961
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "não foi possível criar o diretório de árvore de trabalho '%s'"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:973
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "A clonar no repositório nu '%s'...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:975
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "A clonar em '%s'...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"clone --recursive não é compatível com ambos --reference e --reference-if-"
+"able"
+
+#: builtin/clone.c:1055
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth é ignorado em clones locais; use file:// ."
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since é ignorado em clones locais; use file:// ."
+
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr "--shallow-exclude é ignorado em clones locais; use file:// ."
+
+#: builtin/clone.c:1062
 msgid "source repository is shallow, ignoring --local"
 msgstr "o repositório de origem é raso, --local ignorado"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1067
 msgid "--local is ignored"
 msgstr "--local ignorado"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1071
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Não sei como clonar %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1126 builtin/clone.c:1134
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "O ramo remoto %s não foi encontrado no repositório a montante %s"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1137
 msgid "You appear to have cloned an empty repository."
 msgstr "Parece foi clonado um repositório vazio."
 
@@ -5800,66 +6897,61 @@ msgstr ""
 "Depois \"git cherry-pick --continue\" irá retomar o cherry-pick\n"
 "dos restantes commits.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "falha ao descompactar o objeto árvore HEAD"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "não foi possível criar índice temporário"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "falha ao adicionar interativamente"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "não é possível atualizar o índice temporário"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Falha ao atualizar a árvore de cache principal"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "não é possível escrever o ficheiro new_index"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "não é possível fazer um commit parcial durante uma integração."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "não é possível fazer um commit parcial durante um cherry-pick."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "não é possível ler o índice"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "não é possível escrever ficheiro de índice temporário"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "o commit '%s' não tem cabeçalho de autor"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "o commit '%s' tem a linha de autor malformada"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "parâmetro --author malformado"
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
-msgstr "formato de data inválido: %s"
-
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5867,38 +6959,38 @@ msgstr ""
 "não foi possível selecionar um carácter de comentário que\n"
 "não estivesse já a ser usado na mensagem de commit atual"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "não foi possível consultar o commit %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:294
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(a ler mensagem de log da entrada padrão)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "não foi possível ler o log da entrada padrão"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "não é possível ler o ficheiro de log '%s'"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "não foi possível ler SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "não foi possível ler MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "não foi possível escrever o modelo de commit"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5913,7 +7005,7 @@ msgstr ""
 "\t%s\n"
 "e tente de novo.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5928,7 +7020,7 @@ msgstr ""
 "\t%s\n"
 "e tente outra vez.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5938,7 +7030,7 @@ msgstr ""
 "Linhas começadas com '%c' serão ignoradas, e uma mensagem vazia\n"
 "aborta o commit.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5949,149 +7041,149 @@ msgstr ""
 "Linhas começadas com '%c' serão mantidas; pode removê-las se o desejar.\n"
 "Uma mensagem vazia aborta o commit.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:    %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sData:      %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sCommitter: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Não é possível ler o índice"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Erro ao construir árvores"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Indique a mensagem usando as opções -m ou -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' não é do tipo 'Nome <email>' e não corresponde a um autor "
 "existente"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Modo inválido de ficheiros não controlados '%s'"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long e -z são incompatíveis"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Não faz sentido usar --reset-author e --author ao mesmo tempo"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Não há nada para emendar."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Integração em curso -- não é possível emendar."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Cherry-pick em curso -- não é possível emendar."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "As opções --squash e --fixup não podem ser usadas juntas"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Apenas um entre -c/-C/-F/--fixup pode ser usado."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "A opção -m não pode ser combinada com -c/C/-F/--fixup."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author só pode ser usado com -C, -c ou --amend."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Apenas um entre --include/--only/--all/--interactive/--patch pode ser usado."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "As opções --include/--only não fazem sentido sem indicar caminhos."
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "Inteligente... a emendar o último commit com o índice sujo."
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Caminhos explícitos especificados sem -i ou -o; assumindo --only..."
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:551
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Modo de limpeza inválido %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "Indicar caminhos com -a não faz sentido."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "mostrar status de forma concisa"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "mostrar informação do ramo"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "versão"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:443
 msgid "machine-readable output"
 msgstr "saída inteligível por máquina"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "apresentar status em formato longo (predefinição)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "terminar entradas com NUL"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
 msgid "mode"
 msgstr "modo"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "mostrar ficheiros não controlados, modo é opcional: all, normal, no. "
 "(Predefinição: all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "mostrar ficheiros ignorados"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "quando"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6099,200 +7191,200 @@ msgstr ""
 "ignorar alterações em submódulos, quando é opcional: all, dirty, untracked. "
 "(Predefinição: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "listar ficheiros não controlados em colunas"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "não foi possível consultar o commit recém-criado"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr "não foi possível analisar o commit recém-criado"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "HEAD destacada"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr " (commit-raiz)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "suprimir o resumo depois de submeter com sucesso"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "mostrar diff no modelo da mensagem de commit"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "Opções de mensagem de commit"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:409
 msgid "read message from file"
 msgstr "ler mensagem de um ficheiro"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "autor"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "substituir autor do commit"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:353
 msgid "date"
 msgstr "data"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "substituir data do commit"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
 msgid "message"
 msgstr "mensagem"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "mensagem de commit"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
 msgid "commit"
 msgstr "commit"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "reutilizar e editar a mensagem de um commit especificado"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "reutilizar a mensagem de um commit especificado"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "usar mensagem com formato autosquash para corrigir o commit especificado"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "usar mensagem com formato autosquash para esmagar o commit especificado"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "agora sou eu o autor do commit (usado com C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
 msgid "add Signed-off-by:"
 msgstr "adicionar Signed-off-by:"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "usar ficheiro de modelo especificado"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "forçar edição do commit"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "predefinição"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:412
 msgid "how to strip spaces and #comments from message"
 msgstr "como retirar espaços e #comentários da mensagem"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "incluir status no modelo da mensagem de commit"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
 msgid "GPG sign commit"
 msgstr "assinar o commit com GPG"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "Opções de conteúdo do commit"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "submeter todos os ficheiros alterados"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "adicionar ficheiros especificados ao índice para submeter"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "adicionar ficheiros interativamente"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "adicionar alterações interativamente"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "submeter somente os ficheiros especificados"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "ignorar pre-commit e commit-msg hooks"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "mostrar o que seria submetido"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "emendar o commit anterior"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
 msgstr "ignorar post-rewrite hook"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "aceitar o registo duma alteração vazia"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "aceitar o registo duma alteração com uma mensagem vazia"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "não foi possível analisar o commit HEAD"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Ficheiro MERGE_HEAD corrompido (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "não foi possível ler MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "não foi possível ler a mensagem de commit: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "A abortar o commit; não editou a mensagem.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "A abortar o commit uma vez que a mensagem de commit está vazia.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6456,68 +7548,89 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:613
+#: builtin/config.c:611
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "não é possível criar o ficheiro de configuração %s"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:623
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"não é possível substituir múltiplos valores por um único valor\n"
+"\tUse uma regexp, --add ou --replace-all para alterar %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "imprimir dimensões em formato inteligível por humanos"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [<options>] [<commit-ish>...]"
 msgstr "git describe [<opções>] [<commit-etc>...]"
 
-#: builtin/describe.c:18
+#: builtin/describe.c:19
 msgid "git describe [<options>] --dirty"
 msgstr "git describe [<opções>] --dirty"
 
-#: builtin/describe.c:217
+#: builtin/describe.c:53
+msgid "head"
+msgstr "cabeça"
+
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "leve"
+
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "anotado"
+
+#: builtin/describe.c:250
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "a tag anotada %s não está disponível"
 
-#: builtin/describe.c:221
+#: builtin/describe.c:254
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "a tag anotada %s não tem nenhum nome incorporado"
 
-#: builtin/describe.c:223
+#: builtin/describe.c:256
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "a tag '%s' está de facto em '%s'"
 
-#: builtin/describe.c:250 builtin/log.c:480
+#: builtin/describe.c:283 builtin/log.c:487
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s não é um nome de objeto válido"
 
-#: builtin/describe.c:253
+#: builtin/describe.c:286
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s não é um objeto '%s' válido"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:303
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "nenhuma tag corresponde exatamente a '%s'"
 
-#: builtin/describe.c:272
+#: builtin/describe.c:305
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "à procurar da descrição de %s\n"
 
-#: builtin/describe.c:319
+#: builtin/describe.c:352
 #, c-format
 msgid "finished search at %s\n"
 msgstr "a pesquisa terminou em %s\n"
 
-#: builtin/describe.c:346
+#: builtin/describe.c:379
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -6526,7 +7639,7 @@ msgstr ""
 "Não é possível usar tags anotadas para descrever '%s'.\n"
 "No entanto, é possível com tags não anotadas: tente --tags."
 
-#: builtin/describe.c:350
+#: builtin/describe.c:383
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -6535,12 +7648,12 @@ msgstr ""
 "Não é possível usar tags para descrever '%s'.\n"
 "Tente --always, ou crie algumas tags."
 
-#: builtin/describe.c:371
+#: builtin/describe.c:413
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu commits percorridos\n"
 
-#: builtin/describe.c:374
+#: builtin/describe.c:416
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -6549,97 +7662,214 @@ msgstr ""
 "mais de %i tags encontradas; foram listadas as %i mais recentes\n"
 "pesquisa interrompida em %s\n"
 
-#: builtin/describe.c:396
+#: builtin/describe.c:438
 msgid "find the tag that comes after the commit"
 msgstr "localizar a tag que vem após o commit"
 
-#: builtin/describe.c:397
+#: builtin/describe.c:439
 msgid "debug search strategy on stderr"
 msgstr "depurar a estratégia de procura para stderr"
 
-#: builtin/describe.c:398
+#: builtin/describe.c:440
 msgid "use any ref"
 msgstr "usar uma referência qualquer"
 
-#: builtin/describe.c:399
+#: builtin/describe.c:441
 msgid "use any tag, even unannotated"
 msgstr "usar uma tag qualquer, mesmo não anotada"
 
-#: builtin/describe.c:400
+#: builtin/describe.c:442
 msgid "always use long format"
 msgstr "usar sempre formato longo"
 
-#: builtin/describe.c:401
+#: builtin/describe.c:443
 msgid "only follow first parent"
 msgstr "seguir só o primeiro pai"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:446
 msgid "only output exact matches"
 msgstr "imprimir apenas correspondências exatas"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:448
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "considerar as <n> tags mais recentes (predefinição: 10)"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:450
 msgid "only consider tags matching <pattern>"
 msgstr "apenas considerar tags que correspondam ao <padrão>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "não considerar tags que correspondam ao <padrão>"
+
+#: builtin/describe.c:454 builtin/name-rev.c:357
 msgid "show abbreviated commit object as fallback"
 msgstr "mostrar objetos de commit abreviados em recurso"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:455 builtin/describe.c:458
 msgid "mark"
 msgstr "marca"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:456
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 "acrescentar <marca> se a árvore de trabalho contiver alterações "
 "(predefinição: \"-dirty\")"
 
-#: builtin/describe.c:430
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr ""
+"acrescentar <marca> no caso de árvore de trabalho quebrada (predefinição: \"-"
+"broken\")"
+
+#: builtin/describe.c:477
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long é incompatível com --abbrev=0"
 
-#: builtin/describe.c:456
+#: builtin/describe.c:506
 msgid "No names found, cannot describe anything."
 msgstr "Nenhum nome encontrado, não é possível descrever."
 
-#: builtin/describe.c:476
+#: builtin/describe.c:549
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty é incompatível com commits ou semelhantes"
 
-#: builtin/diff.c:86
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "--broken é incompatível com commits ou semelhantes"
+
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': não é um ficheiro regular nem uma ligação simbólica"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "opção inválida: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Não é um repositório git"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objeto inválido '%s' fornecido."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "mais do que dois blobs fornecidos: '%s'"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "objeto sem tratamento '%s' fornecido."
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr "git difftool [<opções>] [<commit> [<commit>]] [--] [<caminho>...]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "falha: %d"
+
+#: builtin/difftool.c:283
+#, c-format
+msgid "could not read symlink %s"
+msgstr "não foi possível ler a ligação simbólica %s"
+
+#: builtin/difftool.c:285
+#, c-format
+msgid "could not read symlink file %s"
+msgstr "não foi possível ler o ficheiro de ligação simbólica %s"
+
+#: builtin/difftool.c:293
+#, c-format
+msgid "could not read object %s for symlink %s"
+msgstr "não foi possível ler o objeto %s da ligação simbólica %s"
+
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"formatos diff combinado('-c' e '--cc') não são suportados em\n"
+"modo diff diretório ('-d' e '--dir-diff')."
+
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "ambos os ficheiros modificados: '%s' e '%s'."
+
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "ficheiro de árvore de trabalho foi deixado."
+
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "existem ficheiros temporários em '%s'."
+
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "pode querer limpar ou recuperá-los."
+
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "use 'diff.guitool' em vez de 'diff.tool'"
+
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "efetuar diff diretório completo"
+
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "não perguntar antes de lançar uma ferramenta diff"
+
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "usar symlinks no modi dir-diff"
+
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "<ferramenta>"
+
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "usar a ferramenta diff especificada"
+
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr ""
+"imprimir uma lista de ferramentas diff que podem ser usadas com '--tool'"
+
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr ""
+"fazer com que 'git-difftool' termine quando uma ferramenta diff invocada "
+"retorna um código de saída não nulo"
+
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "<comando>"
+
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "especificar um comando personalizado para ver diffs"
+
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "nenhuma <ferramenta> dada a --tool=<ferramenta>"
+
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "nenhum <cmd> dado a --extcmd=<cmd>"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [opções-de-rev-list]"
@@ -6709,162 +7939,166 @@ msgstr "git fetch --multiple [<opções>] [(<repositório> | <grupo>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<opções>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "obter de todos os remotos"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "acrescentar a .git/FETCH_HEAD em vez de substituir"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "caminho para o comando upload pack no remoto"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "forçar a substituição do ramo local"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "obter de múltiplos remotos"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "obter todas as tags e objetos associados"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "não obter todas as tags (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "número de submódulos obtidos em paralelo"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "eliminar os ramos de monitorização remotos que já não existem no remoto"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "on-demand"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "controlar a obtenção recursiva de submódulos"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "manter o pacote transferido"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "permitir a atualização da referência HEAD"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "aprofundar o histórico de um clone raso"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "aprofundar o histórico de repositório raso com base na data"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "converter num repositório completo"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1440
 msgid "dir"
 msgstr "dir"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "preceder isto ao caminho do submódulo"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "modo recursivo por omissão"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "aceitar referência que atualizem .git/shallow"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "mapa de referências"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "especificar mapa de referências"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "Referência remota HEAD não encontrada"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:513
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "a configuração fetch.ouput contém o valor inválido %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:606
 #, c-format
 msgid "object %s not found"
 msgstr "objeto %s não encontrado"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:610
 msgid "[up to date]"
 msgstr "[atualizado]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:623 builtin/fetch.c:703
 msgid "[rejected]"
 msgstr "[rejeitado]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:624
 msgid "can't fetch in current branch"
 msgstr "não é possível obter no ramo atual"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:633
 msgid "[tag update]"
 msgstr "[tag atualizada]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
 msgid "unable to update local ref"
 msgstr "não é possível atualizar a referência local"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:653
 msgid "[new tag]"
 msgstr "[nova tag]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:656
 msgid "[new branch]"
 msgstr "[novo ramo]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:659
 msgid "[new ref]"
 msgstr "[nova referência]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:698
 msgid "forced update"
 msgstr "atualização forçada"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:703
 msgid "non-fast-forward"
 msgstr "sem avanço-rápido"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:748
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s não enviou todos os objetos necessários\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:768
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "%s rejeitado, porque as raízes rasas não podem ser atualizadas"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
 msgid "From %.*s\n"
 msgstr "De %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6873,55 +8107,55 @@ msgstr ""
 "algumas referências locais não puderam ser atualizadas; tente executar\n"
 " 'git remote prune %s' para remover algum ramo antigo em conflito"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:921
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s ficará suspenso)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s ficou suspenso)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:954
 msgid "[deleted]"
 msgstr "[eliminado]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:955 builtin/remote.c:1022
 msgid "(none)"
 msgstr "(nenhum)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:978
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Obtenção de objetos no ramo atual %s de um repositório não nu recusada"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:997
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "O valor \"%2$s\" da opção \"%1$s\" não é válido em %3$s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1000
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Opção \"%s\" ignorada em %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1076
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Não sei como obter de %s"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1236
 #, c-format
 msgid "Fetching %s\n"
 msgstr "A obter de %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Não foi possível obter de %s"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1256
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6929,32 +8163,40 @@ msgstr ""
 "Nenhum repositório remoto especificado. Especifique um URL ou\n"
 "o nome remoto a partir do qual as novas revisões devem ser obtidas."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1279
 msgid "You need to specify a tag name."
 msgstr "Deve especificar um nome para a tag."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "Não é suportada profundidade negativa em --deepen"
+
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen e --depth são mutuamente exclusivos"
+
+#: builtin/fetch.c:1328
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth e --unshallow não podem ser usados juntos"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1330
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "usar --unshallow num repositório completo não faz sentido"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1352
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all não leva um repositório como argumento"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1354
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all não faz sentido com especificadores de referência"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1365
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "O remoto ou grupo remoto não existe: %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1373
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Não faz sentido obter um grupo e especificar uma referência"
 
@@ -6965,23 +8207,23 @@ msgstr ""
 "git fmt-merge-msg [-m <mensagem>] [--log[=<n>] | --no-log] [--file "
 "<ficheiro>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "povoar o registo com, no máximo, <n> entradas do shortlog"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "alias de --log (obsoleto)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "texto"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "usar <texto> no início da mensagem"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "ficheiro a ler"
 
@@ -6994,12 +8236,12 @@ msgid "git for-each-ref [--points-at <object>]"
 msgstr "git for-each-ref [--points-at <objeto>]"
 
 #: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<objeto>]]"
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<commit>]]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<objeto>]]"
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
 
 #: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
@@ -7024,10 +8266,6 @@ msgstr "envolver os marcadores de posição em aspas de forma adequada para Tcl"
 msgid "show only <n> matched refs"
 msgstr "mostrar apenas <n> referências correspondidas"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "formato a usar na saída"
-
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
 msgstr "imprimir apenas referências que apontem para o objeto fornecido"
@@ -7044,63 +8282,67 @@ msgstr "imprimir apenas referências não integrada"
 msgid "print only refs which contain the commit"
 msgstr "imprimir apenas referências que contenham o commit"
 
-#: builtin/fsck.c:519
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "imprimir apenas referências que não contenham o commit"
+
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "A verificar diretórios de objetos"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<opções>] [<objeto>...]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "mostrar objetos inalcançáveis"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "mostrar objetos suspensos"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "mostrar tags"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "mostrar nós raiz"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "considerar objetos do índice como nós cabeça"
 
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "considerar os reflogs como nós cabeça (predefinição)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "considerar também pacotes e objetos sobressalente"
 
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "verificar só a conetividade"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "ativar verificação mais rigorosa"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr "escrever objetos suspensos em .git/lost-found"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "mostrar progresso"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "mostrar nomes verbosos de objetos inalcançáveis"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "A verificar objetos"
 
@@ -7108,17 +8350,17 @@ msgstr "A verificar objetos"
 msgid "git gc [<options>]"
 msgstr "git gc [<opções>]"
 
-#: builtin/gc.c:72
+#: builtin/gc.c:78
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "Inválido %s: '%s'"
+msgid "Failed to fstat %s: %s"
+msgstr "falha ao invocar fstat sobre %s: %s"
 
-#: builtin/gc.c:139
+#: builtin/gc.c:306
 #, c-format
-msgid "insanely long object directory %.*s"
-msgstr "diretório de objetos demasiado longo %.*s"
+msgid "Can't stat %s"
+msgstr "não é possível invocar stat sobre %s"
 
-#: builtin/gc.c:290
+#: builtin/gc.c:315
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7133,40 +8375,45 @@ msgstr ""
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:354
 msgid "prune unreferenced objects"
 msgstr "eliminar ficheiros não referenciados"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:356
 msgid "be more thorough (increased runtime)"
 msgstr "ser mais minucioso (aumenta o tempo de execução)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:357
 msgid "enable auto-gc mode"
 msgstr "ativar modo auto-gc"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:358
 msgid "force running gc even if there may be another gc running"
 msgstr "forçar a execução do gc mesmo que haja outro gc a executar"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:375
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "falha ao analisar o valor %s de gc.logexpiry"
+
+#: builtin/gc.c:403
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "A autocompactar o repositório em segundo plano para obter um melhor "
 "desempenho.\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:405
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "A autocompactar o repositório para obter um melhor desempenho.\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:406
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Consulte \"git help gc\" para ler sobre manutenção manual.\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:427
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -7174,250 +8421,266 @@ msgstr ""
 "gc já a executar na máquina '%s' pid %<PRIuMAX> (use --force se não for o "
 "caso)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:471
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Existem demasiados objeto soltos inalcançáveis; execute 'git prune' para os "
 "remover."
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<opções>] [-e] <padrão> [<rev>...] [[--] <caminho>...]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: falha ao criar thread: %s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "o número de threads especificado em %2$s é inválido (%1$d)"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "não foi possível ler a árvore (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:829
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "não foi possível efetuar grep de objetos do tipo %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:893
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "a opção '%c' espera um valor numérico"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "não é possível abrir '%s'"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:980
 msgid "search in index instead of in the work tree"
 msgstr "procurar no índice em vez de procurar na árvore de trabalho"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:982
 msgid "find in contents not managed by git"
 msgstr "procurar em conteúdos não geridos pelo git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:984
 msgid "search in both tracked and untracked files"
 msgstr "procurar em ficheiros controlados e não controlados"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:986
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorar ficheiros especificados via '.gitignore'"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "procurar recursivamente em cada submódulo"
+
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "nomebase"
+
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "preceder o nomebase do projeto pai na saída"
+
+#: builtin/grep.c:994
 msgid "show non-matching lines"
 msgstr "mostrar linhas não correspondidas"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:996
 msgid "case insensitive matching"
 msgstr "não diferenciar maiúsculas de minúsculas"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:998
 msgid "match patterns only at word boundaries"
 msgstr "corresponder padrões apenas a palavras"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:1000
 msgid "process binary files as text"
 msgstr "processar ficheiros binários como texto"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:1002
 msgid "don't match patterns in binary files"
 msgstr "ignorar ficheiros binários"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:1005
 msgid "process binary files with textconv filters"
 msgstr "processar ficheiros binários com filtros textconv"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1007
 msgid "descend at most <depth> levels"
 msgstr "descer no máximo até <profundidade>"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1011
 msgid "use extended POSIX regular expressions"
 msgstr "usar expressões regulares estendidas do POSIX"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1014
 msgid "use basic POSIX regular expressions (default)"
 msgstr "usar expressões regulares básicas do POSIX (predefinição)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1017
 msgid "interpret patterns as fixed strings"
 msgstr "interpretar padrões como cadeias de caracteres fixas"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1020
 msgid "use Perl-compatible regular expressions"
 msgstr "usar expressões regulares compatíveis com Perl"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1023
 msgid "show line numbers"
 msgstr "mostrar números de linha"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1024
 msgid "don't show filenames"
 msgstr "não mostrar nomes de ficheiro"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1025
 msgid "show filenames"
 msgstr "mostrar nomes de ficheiro"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1027
 msgid "show filenames relative to top directory"
 msgstr "mostrar nomes de ficheiro relativamente ao diretório superior"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1029
 msgid "show only filenames instead of matching lines"
 msgstr "mostrar apenas nomes de ficheiro em vez de linhas correspondidas"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1031
 msgid "synonym for --files-with-matches"
 msgstr "sinónimo de --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1034
 msgid "show only the names of files without match"
 msgstr "mostrar apenas nomes de ficheiro sem correspondência"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1036
 msgid "print NUL after filenames"
 msgstr "imprimir NUL depois dos nomes de ficheiro"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1038
 msgid "show the number of matches instead of matching lines"
 msgstr "mostrar o número de correspondências em vez das linha correspondidas"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1039
 msgid "highlight matches"
 msgstr "realçar correspondências"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1041
 msgid "print empty line between matches from different files"
 msgstr ""
 "imprimir uma linha em branco entre correspondências de diferentes ficheiros"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1043
 msgid "show filename only once above matches from same file"
 msgstr ""
 "mostrar só uma vez o nome do ficheiro acima das correspondências dentro do "
 "mesmo ficheiro"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1046
 msgid "show <n> context lines before and after matches"
 msgstr "mostrar <n> linhas de contexto antes e depois das correspondências"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1049
 msgid "show <n> context lines before matches"
 msgstr "mostrar <n> linhas de contexto antes das correspondências"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1051
 msgid "show <n> context lines after matches"
 msgstr "mostrar <n> linhas de contexto depois das correspondências"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1053
 msgid "use <n> worker threads"
 msgstr "usar <n> threads de trabalho"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1054
 msgid "shortcut for -C NUM"
 msgstr "atalho para -C NUM"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1057
 msgid "show a line with the function name before matches"
 msgstr "mostrar uma linha com o nome da função antes das correspondências"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1059
 msgid "show the surrounding function"
 msgstr "mostrar a função circundante"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1062
 msgid "read patterns from file"
 msgstr "ler padrões do ficheiro"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1064
 msgid "match <pattern>"
 msgstr "procurar <padrão>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1066
 msgid "combine patterns specified with -e"
 msgstr "combinar padrões especificados com -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1078
 msgid "indicate hit with exit status without output"
 msgstr "indicar padrão encontrado no valor de saída, mas não imprimir"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1080
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "mostrar apenas correspondências de ficheiro que tenham todos os padrões"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1082
 msgid "show parse tree for grep expression"
 msgstr "mostrar árvore de analise da expressões grep"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "pager"
 msgstr "paginador"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "show matching files in the pager"
 msgstr "mostrar ficheiros com correspondências no paginador"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1089
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permitir invocar grep(1) (ignorado nesta compilação)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1153
 msgid "no pattern given."
 msgstr "nenhum padrão fornecido."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr "--no-index ou --untracked não podem ser usados em revisões"
+
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
+msgstr "não foi possível resolver revisão: %s"
+
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "número de threads especificado inválido (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1251
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager só funciona na árvore de trabalho"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "opção não suportada com --recurse-submodules."
+
+#: builtin/grep.c:1280
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached ou --untracked não podem ser usados com --no-index."
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr "--no-index ou --untracked não podem ser usados em revisões."
-
-#: builtin/grep.c:909
+#: builtin/grep.c:1286
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "--[no-]exclude-standard não podem ser usados em conteúdos não controlados."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1294
 msgid "both --cached and trees are given."
 msgstr "--cached e árvores foram fornecidos simultaneamente."
 
@@ -7433,85 +8696,89 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "tipo"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "tipo do objeto"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "escrever o objeto na base de dados de objetos"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "ler o objeto da entrada padrão"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "guardar o ficheiro tal como está, sem filtros"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 "obter hash de lixo aleatório para criar objetos corrompidos para depurar o "
 "Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "processar o ficheiro como se este fosse do caminho indicado"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "imprimir todos os comandos disponíveis"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "excluir guias"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "imprimir lista de guias úteis"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "mostrar página do manual"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "mostrar o manual no navegador web"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "mostrar página info"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<comando>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "formato de ajuda não reconhecido '%s'"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "Falha ao iniciar emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "Falha ao analisar a versão do emacsclient."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "a versão do emacsclient '%d' é demasiado antiga (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "falha ao executar '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7520,7 +8787,7 @@ msgstr ""
 "'%s': caminho para visualizador de manual não suportado.\n"
 "Considere usar 'man.<ferramenta>.cmd'."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7529,428 +8796,441 @@ msgstr ""
 "'%s': comando de visualizador de manual suportado.\n"
 "Considere usar 'man.<ferramenta>.path'."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s': visualizador de manual desconhecido."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "nenhum visualizador de manual atendeu o pedido"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "nenhum visualizador de info atendeu o pedido"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Definir atributos por caminho"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Diário Git com mais ou menos 20 Comandos"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Um Glossário do Git"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr ""
 "Especificar ficheiros não controlados para serem intencionalmente ignorados"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Definir propriedades de submódulos"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Especificar revisões e intervalos do Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Uma introdução ao Git (versão 1.5.1 ou mais recente)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Uma descrição geral dos fluxos de trabalho recomendados para o Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Os guias comuns do Git:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "utilização: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "'git %s' é um alias de '%s'"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "utilização: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "não foi possível abrir %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "incompatibilidade de tipo de objeto em %s"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "o objeto esperado %s não foi recebido"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "objeto %s: tipo esperado %s, obtido %s"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "não é possível preencher %d byte"
 msgstr[1] "não é possível preencher %d bytes"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "fim de ficheiro (EOF) prematuro"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "erro de leitura da entrada"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "foram usados mais bytes dos que estavam disponíveis"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "pacote demasiado grande para a definição atual de off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "o pacote excede o tamanho máximo permitido"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "não foi possível criar '%s'"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:323
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "não é possível abrir o ficheiro de pacote '%s'"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:337
 msgid "pack signature mismatch"
 msgstr "a assinatura do pacote não corresponde"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:339
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "versão de pacote %<PRIu32> não suportada"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:357
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "pacote com objeto incorreto no offset %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:479
 #, c-format
 msgid "inflate returned %d"
 msgstr "a descompactação retornou %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:528
 msgid "offset value overflow for delta base object"
 msgstr "delta de objeto base com capacidade excedida no valor de offset"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:536
 msgid "delta base offset is out of bound"
 msgstr "offset da base delta está fora do limite"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:544
 #, c-format
 msgid "unknown object type %d"
 msgstr "objeto de tipo desconhecido %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:575
 msgid "cannot pread pack file"
 msgstr "não é possível invocar pread sobre o ficheiro de pacote"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:577
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "fim prematuro de ficheiro de pacote, falta %<PRIuMAX> byte"
 msgstr[1] "fim prematuro de ficheiro de pacote, faltam %<PRIuMAX> bytes"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:603
 msgid "serious inflate inconsistency"
 msgstr "inconsistência de descompactação grave"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "COLISÃO DE SHA1 COM %s ENCONTRADA!"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
 msgid "unable to read %s"
 msgstr "não foi possível ler %s"
 
 #: builtin/index-pack.c:814
 #, c-format
+msgid "cannot read existing object info %s"
+msgstr "não é possível ler informação de objeto existente %s"
+
+#: builtin/index-pack.c:822
+#, c-format
 msgid "cannot read existing object %s"
 msgstr "não é possível ler o objeto existente %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:836
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objeto blob inválido %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:850
 #, c-format
 msgid "invalid %s"
 msgstr "inválido %s"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:853
 msgid "Error in object"
 msgstr "Erro no objeto"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:855
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Nem todos os objetos filhos de %s são alcançáveis"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
 msgid "failed to apply delta"
 msgstr "falha ao aplicar delta"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Receiving objects"
 msgstr "A receber objetos"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Indexing objects"
 msgstr "A indexar objetos"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1160
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "pacote corrompido (SHA1 não corresponde)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1165
 msgid "cannot fstat packfile"
 msgstr "não é possível invocar fstat sobre o ficheiro de pacote"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1168
 msgid "pack has junk at the end"
 msgstr "pacote com lixo no final"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1179
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "extrema confusão em parse_pack_objects()"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1202
 msgid "Resolving deltas"
 msgstr "A resolver deltas"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1213
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "não foi possível criar thread: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1255
 msgid "confusion beyond insanity"
 msgstr "extrema confusão"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1261
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "concluído com %d objeto local"
 msgstr[1] "concluído com %d objetos locais"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1273
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Soma de verificação inesperada no final de %s (corrupção no disco?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1277
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "pacote com %d delta não resolvido"
 msgstr[1] "pacote com %d deltas não resolvidos"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1301
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "não é possível compactar objeto acrescentado (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1377
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "objeto local %s corrompido"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1403
 msgid "error while closing pack file"
 msgstr "erro ao fechar ficheiro de pacote"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1415
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "não é possível escrever o ficheiro de conservação '%s'"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1423
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "não é possível fechar o ficheiro de conservação '%s' escrito"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1433
 msgid "cannot store pack file"
 msgstr "não é possível guardar ficheiro de pacote"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "não é possível guardar o ficheiro índice"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1479
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "pack.indexversion=%<PRIu32> incorreto"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "sem suporte de threads, %s ignorado"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1547
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Não é possível abrir o ficheiro de pacote '%s' existente"
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1549
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Não é possível abrir o ficheiro de índice do pacote existente de '%s'"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1596
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "%d objeto não delta"
 msgstr[1] "%d objetos não delta"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1603
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "comprimento de cadeia = %d: %lu objeto"
 msgstr[1] "comprimento de cadeia = %d: %lu objetos"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1616
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "o nome do ficheiro de pacote '%s' não termina em '.pack'"
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
 msgid "bad %s"
 msgstr "%s incorreto"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1737
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin não pode ser usado sem --stdin"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "--stdin requer um repositório git"
+
+#: builtin/index-pack.c:1747
 msgid "--verify with no packfile name given"
 msgstr "--verify sem nome do ficheiro de pacote indicado"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "não é possível invocar stat sobre '%s'"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "não é possível invocar stat sobre o modelo '%s'"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "não é possível abrir (opendir) '%s'"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "não é possível ler (readlink) '%s'"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "não é possível criar a ligação simbólica '%s' '%s'"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "não é possível copiar '%s' para '%s'"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "modelo %s ignorado"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "modelos não encontrados em %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "modelos não copiados de '%s': %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s já existe"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "não foi possível processar o tipo de ficheiro %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "não foi possível mover %s para %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s já existe"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Repositório Git partilhado e existente reinicializado em %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Repositório Git existem reinicializado em %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Repositório Git vazio e partilhado inicializado em %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Repositório Git vazio inicializado em %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7958,26 +9238,26 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<diretório-modelo>] [--"
 "shared[=<permissões>]] [<diretório>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "permissões"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 "especificar que o repositório git será partilhado por vários utilizadores"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "não é possível criar o diretório %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "não é possível mudar para o diretório %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7986,7 +9266,7 @@ msgstr ""
 "%s (ou --work-tree=<diretório>) não é permitido sem especificar %s (ou --git-"
 "dir=<diretório>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Não é possível aceder à árvore de trabalho '%s'"
@@ -8027,107 +9307,104 @@ msgstr "git log [<opções>] [<intervalo-de-revisões>] [[--] <caminho>...]"
 msgid "git show [<options>] <object>..."
 msgstr "git show [<opções>] <objeto>..."
 
-#: builtin/log.c:84
+#: builtin/log.c:89
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "opção --decorate inválida: %s"
 
-#: builtin/log.c:139
+#: builtin/log.c:144
 msgid "suppress diff output"
 msgstr "suprimir saída do diff"
 
-#: builtin/log.c:140
+#: builtin/log.c:145
 msgid "show source"
 msgstr "mostrar origem"
 
-#: builtin/log.c:141
+#: builtin/log.c:146
 msgid "Use mail map file"
 msgstr "usar ficheiro de mapeamento de correio"
 
-#: builtin/log.c:142
+#: builtin/log.c:147
 msgid "decorate options"
 msgstr "opções de decoração"
 
-#: builtin/log.c:145
+#: builtin/log.c:150
 msgid "Process line range n,m in file, counting from 1"
 msgstr "processar intervalo de linhas n,m, a contar a partir de 1"
 
-#: builtin/log.c:241
+#: builtin/log.c:246
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Resultado final: %d %s\n"
 
-#: builtin/log.c:486
+#: builtin/log.c:493
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: ficheiro incorreto"
 
-#: builtin/log.c:500 builtin/log.c:594
+#: builtin/log.c:507 builtin/log.c:601
 #, c-format
 msgid "Could not read object %s"
 msgstr "Não foi possível ler o objeto %s"
 
-#: builtin/log.c:618
+#: builtin/log.c:625
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Tipo desconhecido: %d"
 
-#: builtin/log.c:739
+#: builtin/log.c:746
 msgid "format.headers without value"
 msgstr "format.headers sem valor"
 
-#: builtin/log.c:839
+#: builtin/log.c:846
 msgid "name of output directory is too long"
 msgstr "o nome do diretório de saída é demasiado longo"
 
-#: builtin/log.c:854
+#: builtin/log.c:861
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Não é possível abrir o ficheiro de patch %s"
 
-#: builtin/log.c:868
+#: builtin/log.c:875
 msgid "Need exactly one range."
 msgstr "É necessário exatamente um intervalo."
 
-#: builtin/log.c:878
+#: builtin/log.c:885
 msgid "Not a range."
 msgstr "Não é um intervalo."
 
-#: builtin/log.c:984
+#: builtin/log.c:991
 msgid "Cover letter needs email format"
 msgstr "A carta de apresentação precisa de um formato de e-mail"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1071
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to incorreto: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1098
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<opções>] [<desde> | <intervalo-de-revisões>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1148
 msgid "Two output directories?"
 msgstr "Dois diretórios de saída?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Commit desconhecido %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Falha ao resolver '%s' numa referência válida."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1270
 msgid "Could not find exact merge base."
 msgstr "Não foi possível encontrar a base exata de integração."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1274
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8138,213 +9415,217 @@ msgstr ""
 "use branch --set-upstream-to para seguir um ramo remoto.\n"
 "Ou pode especificar o commit base com --base=<base-commit-id> manualmente."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1294
 msgid "Failed to find exact merge base"
 msgstr "Falha ao procurar base exata de integração"
 
-#: builtin/log.c:1294
+#: builtin/log.c:1305
 msgid "base commit should be the ancestor of revision list"
 msgstr "o commit base deve ser o antecessor da lista de revisões"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1309
 msgid "base commit shouldn't be in revision list"
 msgstr "o commit base não deve fazer parte da lista de revisões"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1358
 msgid "cannot get patch id"
 msgstr "não é possível obter o id do patch"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1415
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "usar [PATCH n/m] mesmo com um único patch"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1418
 msgid "use [PATCH] even with multiple patches"
 msgstr "usar [PATCH] mesmo com múltiplos patches"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1422
 msgid "print patches to standard out"
 msgstr "imprimir patches para a saída padrão"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1424
 msgid "generate a cover letter"
 msgstr "gerar uma carta de apresentação"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1426
 msgid "use simple number sequence for output file names"
 msgstr ""
 "usar uma sequência de números simples para denominar os ficheiros gerados"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1427
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1428
 msgid "use <sfx> instead of '.patch'"
 msgstr "usar <sfx> em vez de '.patch'"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1430
 msgid "start numbering patches at <n> instead of 1"
 msgstr "começar a numerar os patches em <n> em vez de 1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1432
 msgid "mark the series as Nth re-roll"
 msgstr "marcar a série como a n-ésima reiteração"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Usar [RFC PATCH] em vez de [PATCH]"
+
+#: builtin/log.c:1437
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "usar [<prefixo>] em vez de [PATCH]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1440
 msgid "store resulting files in <dir>"
 msgstr "guardar os ficheiros resultantes em <dir>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1443
 msgid "don't strip/add [PATCH]"
 msgstr "não tirar/inserir [PATCH]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1446
 msgid "don't output binary diffs"
 msgstr "não gerar diffs binários"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1448
 msgid "output all-zero hash in From header"
 msgstr "preencher o cabeçalho From com hash de zeros"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1450
 msgid "don't include a patch matching a commit upstream"
 msgstr "não incluir um patch que coincida com um commit a montante"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1452
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "mostrar no formato de patch em vez de no formato por omissão (patch + stat)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1454
 msgid "Messaging"
 msgstr "Mensagem"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1455
 msgid "header"
 msgstr "cabeçalho"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1456
 msgid "add email header"
 msgstr "adicionar cabeçalho de e-mail"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1457 builtin/log.c:1459
 msgid "email"
 msgstr "e-mail"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1457
 msgid "add To: header"
 msgstr "adicionar cabeçalho To:"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1459
 msgid "add Cc: header"
 msgstr "adicionar cabeçalho Cc:"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1461
 msgid "ident"
 msgstr "identidade"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1462
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "definir o endereço From como <identidade> (ou como identidade do committer "
 "se não indicado)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1464
 msgid "message-id"
 msgstr "id-mensagem"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1465
 msgid "make first mail a reply to <message-id>"
 msgstr "usar o primeiro email para responder a <id-mensagem>"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1466 builtin/log.c:1469
 msgid "boundary"
 msgstr "limite"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1467
 msgid "attach the patch"
 msgstr "anexar o patch"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1470
 msgid "inline the patch"
 msgstr "incorporar o patch"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1474
 msgid "enable message threading, styles: shallow, deep"
 msgstr "ativar mensagens por tópicos, estilos: shallow (raso), deep (profundo)"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1476
 msgid "signature"
 msgstr "assinatura"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1477
 msgid "add a signature"
 msgstr "adicionar uma assinatura"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1478
 msgid "base-commit"
 msgstr "commit-base"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1479
 msgid "add prerequisite tree info to the patch series"
 msgstr "adicionar informação pré-requisito da árvore à série de patches"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1481
 msgid "add a signature from a file"
 msgstr "adicionar uma assinatura de um ficheiro"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1482
 msgid "don't print the patch filenames"
 msgstr "não imprimir os nomes dos ficheiros de patch"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1572
 msgid "-n and -k are mutually exclusive."
 msgstr "-n e -k são mutuamente exclusivos."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix e -k são mutuamente exclusivos."
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc e -k são mutuamente exclusivos."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1582
 msgid "--name-only does not make sense"
 msgstr "--name-only não faz sentido"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1584
 msgid "--name-status does not make sense"
 msgstr "--name-status não faz sentido"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1586
 msgid "--check does not make sense"
 msgstr "--check não faz sentido"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1616
 msgid "standard output, or directory, which one?"
 msgstr "saída padrão, ou diretório, qual deles?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1618
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Não foi possível criar o diretório '%s'"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1712
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "não é possível ler o ficheiro de assinatura '%s'"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1784
 msgid "Failed to create output files"
 msgstr "Falha ao criar os ficheiros de saída"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1833
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<ramo-a-montante> [<head> [<limite>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1887
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8352,103 +9633,107 @@ msgstr ""
 "O ramo remoto seguido não foi encontrado, especifique <ramo-a-montante> "
 "manualmente.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:461
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<opções>] [<ficheiro>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:510
 msgid "identify the file status with tags"
 msgstr "identificar o estado do ficheiro com tags"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:512
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "usar letras minúsculas para ficheiros 'assumido não alterado' ('assume "
 "unchanged')"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:514
 msgid "show cached files in the output (default)"
 msgstr "mostrar ficheiros em cache na saída (predefinição)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:516
 msgid "show deleted files in the output"
 msgstr "mostrar ficheiros eliminados na saída"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:518
 msgid "show modified files in the output"
 msgstr "mostrar ficheiros modificados na saída"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:520
 msgid "show other files in the output"
 msgstr "mostrar outros ficheiros na saída"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:522
 msgid "show ignored files in the output"
 msgstr "mostrar ficheiros ignorados na saída"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:525
 msgid "show staged contents' object name in the output"
 msgstr "mostrar nome de objetos com conteúdo preparado, na saída"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:527
 msgid "show files on the filesystem that need to be removed"
 msgstr ""
 "mostrar ficheiros no sistema de ficheiros que precisam de ser removidos"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:529
 msgid "show 'other' directories' names only"
 msgstr "mostrar nomes de diretórios 'other' (outro)"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:531
 msgid "show line endings of files"
 msgstr "mostrar finais de linha dos ficheiros"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:533
 msgid "don't show empty directories"
 msgstr "não mostrar diretórios vazios"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:536
 msgid "show unmerged files in the output"
 msgstr "mostrar ficheiros não integrados na saída"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:538
 msgid "show resolve-undo information"
 msgstr "mostrar informação de resolver-desfazer"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:540
 msgid "skip files matching pattern"
 msgstr "ignorar ficheiros que correspondam ao padrão"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:543
 msgid "exclude patterns are read from <file>"
 msgstr "ler padrões de exclusão do <ficheiro>"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:546
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "ler padrões de exclusão por diretório do <ficheiro>"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:548
 msgid "add the standard git exclusions"
 msgstr "incluir as exclusões standard do git"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:551
 msgid "make the output relative to the project top directory"
 msgstr "mostrar os caminhos relativamente ao diretório superior do projeto"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:554
+msgid "recurse through submodules"
+msgstr "percorrer submódulos recursivamente"
+
+#: builtin/ls-files.c:556
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "se um <ficheiro> não estiver no índice, tratar como erro"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:557
 msgid "tree-ish"
 msgstr "árvore-etc"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:558
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "fingir que os caminhos removidos desde <árvore-etc> ainda estão presentes"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:560
 msgid "show debugging data"
 msgstr "mostrar dados de depuração"
 
@@ -8462,39 +9747,39 @@ msgstr ""
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<repositório> [<referências>...]]"
 
-#: builtin/ls-remote.c:50
+#: builtin/ls-remote.c:52
 msgid "do not print remote URL"
 msgstr "não imprimir URL remoto"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
 msgid "exec"
 msgstr "exec"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
 msgid "path of git-upload-pack on the remote host"
 msgstr "caminho para git-upload-pack no servidor remoto"
 
-#: builtin/ls-remote.c:56
+#: builtin/ls-remote.c:58
 msgid "limit to tags"
 msgstr "restringir-se a tags"
 
-#: builtin/ls-remote.c:57
+#: builtin/ls-remote.c:59
 msgid "limit to heads"
 msgstr "restringir-se a cabeças"
 
-#: builtin/ls-remote.c:58
+#: builtin/ls-remote.c:60
 msgid "do not show peeled tags"
 msgstr "não mostrar tags descascadas"
 
-#: builtin/ls-remote.c:60
+#: builtin/ls-remote.c:62
 msgid "take url.<base>.insteadOf into account"
 msgstr "ter url.<base>.insteadOf em conta"
 
-#: builtin/ls-remote.c:62
+#: builtin/ls-remote.c:64
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr "terminar com código de saída 2 se não forem encontradas referências"
 
-#: builtin/ls-remote.c:64
+#: builtin/ls-remote.c:66
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "mostrar a referência subjacente em adição ao objeto por ela apontado"
 
@@ -8502,35 +9787,35 @@ msgstr "mostrar a referência subjacente em adição ao objeto por ela apontado"
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<opções>] <árvore-etc> [<caminho>...]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "mostrar apenas árvores"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
 msgstr "percorrer as subárvores recursivamente"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "mostrar árvores ao percorrer"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "terminar entradas com o byte NUL"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "incluir dimensão dos objetos"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "listar apenas os nomes de ficheiro"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "usar nomes de caminho completos"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 "mostrar a árvore completa; não apenas o diretório atual (implica --full-name)"
@@ -8540,171 +9825,175 @@ msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<opções>] [<commit>...]"
 
 #: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<opções>] <msg> HEAD <commit>"
-
-#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
 msgid "switch `m' requires a value"
 msgstr "a opção 'm' requer um valor"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Estratégia de integração '%s' não encontrada.\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:141
 #, c-format
 msgid "Available strategies are:"
 msgstr "Estratégias disponíveis:"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Estratégias personalizadas disponíveis:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:196 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "não apresentar um diffstat ao fim da integração"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "mostrar um diffstat ao fim da integração"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:200 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(sinónimo de --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:202 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "adicionar (no máximo <n>) entradas do shortlog à mensagem de commit da "
 "integração"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:205 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "criar um único commit em vez de realizar uma integração"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:207 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "realizar um commit se a integração for bem sucedida (predefinição)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:209 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "editar a mensagem antes de submeter"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:210
 msgid "allow fast-forward (default)"
 msgstr "permitir avanço rápido (predefinição)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:212 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "abortar se não é possível efetuar avanço rápido"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:216 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "verificar se o commit tem uma assinatura GPG válida"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
 msgid "strategy"
 msgstr "estratégia"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:218 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "estratégia de integração a usar"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:219 builtin/pull.c:162
 msgid "option=value"
 msgstr "opção=valor"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:220 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "opções da estratégia de integração selecionada"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "mensagem de commit (de integração não suscetível a avanço rápido)"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:226
 msgid "abort the current in-progress merge"
 msgstr "abortar integração em curso"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "continuar a integração em curso"
+
+#: builtin/merge.c:230 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "permitir integração de históricos não relacionados"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:258
 msgid "could not run stash."
 msgstr "não foi possível executar o comando stash."
 
-#: builtin/merge.c:260
+#: builtin/merge.c:263
 msgid "stash failed"
 msgstr "falha ao executar o comando stash"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:268
 #, c-format
 msgid "not a valid object: %s"
 msgstr "nome de objeto inválido: %s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:287 builtin/merge.c:304
 msgid "read-tree failed"
 msgstr "falha ao executar o comando read-tree"
 
-#: builtin/merge.c:331
+#: builtin/merge.c:334
 msgid " (nothing to squash)"
 msgstr " (não há nada para esmagar)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:345
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Commit esmagado -- HEAD não atualizada\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:395
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Nenhuma mensagem de integração -- HEAD não atualizada\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' não aponta para um commit"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:536
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Valor de branch.%s.mergeoptions incorreto: %s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "Não se processa outra coisa senão incorporação de duas cabeças."
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Opção desconhecida de merge-recursive: -X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "não foi possível escrever %s"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Não foi possível ler '%s'"
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Commit de integração não realizado; use 'git commit' para concluir a "
 "integração.\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8720,68 +10009,75 @@ msgstr ""
 "Linhas começadas com '%c' são ignoradas e uma mensagem vazia\n"
 "aborta o commit.\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "Mensagem de commit vazia."
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Maravilhoso.\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Falha ao realizar integração automática; corrija os conflitos e submeta o "
 "resultado.\n"
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "'%s' não é um commit"
-
-#: builtin/merge.c:904
+#: builtin/merge.c:890
 msgid "No current branch."
 msgstr "Nenhum ramo atual."
 
-#: builtin/merge.c:906
+#: builtin/merge.c:892
 msgid "No remote for the current branch."
 msgstr "Não há um remoto para o ramo atual."
 
-#: builtin/merge.c:908
+#: builtin/merge.c:894
 msgid "No default upstream defined for the current branch."
 msgstr "Não está definido nenhum ramo a montante para o ramo atual."
 
-#: builtin/merge.c:913
+#: builtin/merge.c:899
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Nenhum ramo de monitorização remoto seguido por %s de %s"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:946
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Valor '%s' incorreto no ambiente '%s'"
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1020
 #, c-format
 msgid "could not close '%s'"
 msgstr "não foi possível fechar '%s'"
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1047
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "não se pode integrar em %s: %s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1081
 msgid "not something we can merge"
 msgstr "não se pode integrar"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "--abort não leva argumentos"
+
+#: builtin/merge.c:1150
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Não há nenhuma integração para se abortar (MERGE_HEAD não presente)."
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "--continue não leva argumentos"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "Não há nenhuma integração em curso (MERGE_HEAD não presente)."
+
+#: builtin/merge.c:1182
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8789,7 +10085,7 @@ msgstr ""
 "Não concluiu a integração (MERGE_HEAD presente).\n"
 "Submeta as suas alterações antes de integrar."
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1189
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8797,117 +10093,117 @@ msgstr ""
 "Cherry-pick não concluído (CHERRY_PICK_HEAD presente).\n"
 "Submeta as suas alterações antes de integrar."
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1192
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Cherry-pick não concluído (CHERRY_PICK_HEAD presente)."
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1201
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Não é possível combinar --squash e --no-ff."
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1209
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Nenhum commit especificado e merge.defaultToUpstream não definido."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1226
 msgid "Squash commit into empty head not supported yet"
 msgstr "Esmagar um commit numa cabeça vazia ainda não é suportado"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1228
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Não faz sentido submeter de modo não suscetível a avanço rápido, numa cabeça "
 "vazia"
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1233
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - não é algo se possa integrar"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1235
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Só se pode integrar exatamente um commit numa cabeça vazia"
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "A assinatura GPG do commit %s, alegadamente assinada por %s, não é de "
 "confiança."
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 "A assinatura GPG do commit %s, alegadamente assinada por %s, está incorreta."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "O commit %s não tem uma assinatura GPG."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1278
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "A assinatura GPG do commit %s por %s está correta\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1340
 msgid "refusing to merge unrelated histories"
 msgstr "integração de históricos não relacionados recusada"
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1349
 msgid "Already up-to-date."
 msgstr "Já está atualizado."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1359
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "A atualizar %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1400
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "A tentar integração mesmo trivial no interior do índice...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1407
 #, c-format
 msgid "Nope.\n"
 msgstr "Não.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1432
 msgid "Already up-to-date. Yeeah!"
 msgstr "Já está atualizado. Sim!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1438
 msgid "Not possible to fast-forward, aborting."
 msgstr "Não é possível avançar rapidamente, a abortar."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1461 builtin/merge.c:1540
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "A recuar a árvore ao seu estado original...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1465
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "A tentar a estratégia de integração %s...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1531
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Nenhuma estratégia de integração conseguiu processar a integração.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1533
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Falha ao integrar com a estratégia %s.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1542
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "A usar %s para preparar resolução manual.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1554
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8934,23 +10230,23 @@ msgstr "git merge-base --is-ancestor <commit> <commit>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <referência> [<commit>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "mostrar todos os antecessores"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "encontrar antecessores de uma única integração com n pontos"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "listar revisões não alcançáveis a partir de outras"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "o primeiro é antecessor do segundo?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr ""
 "descobrir onde foi que o <commit> divergiu usando o reflog da <referência>"
@@ -8963,38 +10259,69 @@ msgstr ""
 "git merge-file [<opções>] [-L <nome1> [-L <orig> [-L <nome2>]]] <ficheiro1> "
 "<ficheiro-orig> <ficheiro2>"
 
-#: builtin/merge-file.c:33
+#: builtin/merge-file.c:32
 msgid "send results to standard output"
 msgstr "enviar resultados para a saída padrão"
 
-#: builtin/merge-file.c:34
+#: builtin/merge-file.c:33
 msgid "use a diff3 based merge"
 msgstr "usar integração baseada em diff3"
 
-#: builtin/merge-file.c:35
+#: builtin/merge-file.c:34
 msgid "for conflicts, use our version"
 msgstr "usar a nossa versão em caso de conflito"
 
-#: builtin/merge-file.c:37
+#: builtin/merge-file.c:36
 msgid "for conflicts, use their version"
 msgstr "usar a versão deles em caso de conflito"
 
-#: builtin/merge-file.c:39
+#: builtin/merge-file.c:38
 msgid "for conflicts, use a union version"
 msgstr "usar a união das versões em caso de conflito"
 
-#: builtin/merge-file.c:42
+#: builtin/merge-file.c:41
 msgid "for conflicts, use this marker size"
 msgstr "usar este comprimento de marcador para os conflitos"
 
-#: builtin/merge-file.c:43
+#: builtin/merge-file.c:42
 msgid "do not warn about conflicts"
 msgstr "não alertar sobre conflitos"
 
-#: builtin/merge-file.c:45
+#: builtin/merge-file.c:44
 msgid "set labels for file1/orig-file/file2"
 msgstr "definir identificares para ficheiro1/ficheiro-orig/ficheiro2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "opção desconhecido %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "não foi possível analisar o objeto '%s'"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "não é possível processar mais do que %d base. Ignorar %s."
+msgstr[1] "não é possível processar mais do que %d bases. Ignorar %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "não se pode processar outra coisa senão integração de duas cabeças."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "não foi possível resolver a referência %s"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "A integrar %s com %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -9011,136 +10338,140 @@ msgstr "permitir objetos não presentes"
 msgid "allow creation of more than one tree"
 msgstr "permitir a criação de mais do que uma árvore"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<opções>] <origem>... <destino>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "O diretório %s está no índice porém nenhum submódulo?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "Prepare as suas alterações em .gitmodules ou esconda-as para prosseguir"
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s está no índice"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "forçar mover/mudar o nome mesmo que o destino exista"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "ignorar erros ao mover/mudar o nome"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "o destino '%s' não é um diretório"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "A verificar a mudança de nome de '%s' para '%s'\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "origem incorreta"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "não é possível mover um diretório para dentro de si próprio"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "não é possível mover um diretório para um ficheiro"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "o diretório de origem está vazio"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "não está no controlo de versões"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "o destino já existe"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "a substituir '%s'"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "Não é possível substituir"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "múltiplas origens para o mesmo destino"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "o diretório de destino não existe"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, origem=%s, destino=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "A mudar de nome de %s para %s\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "falha ao mudar o nome de '%s'"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:289
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<opções>] <commit>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:290
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<opções>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:291
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<opções>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:346
 msgid "print only names (no SHA-1)"
 msgstr "imprimir apenas nomes (sem SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:347
 msgid "only use tags to name the commits"
 msgstr "usar apenas tags para designar commits"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:349
 msgid "only use refs matching <pattern>"
 msgstr "usar apenas referência que correspondam ao <padrão>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "ignorar referências que correspondam ao <padrão>"
+
+#: builtin/name-rev.c:353
 msgid "list all commits reachable from all refs"
 msgstr "listar todos os commits alcançáveis a partir de todas as referências"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:354
 msgid "read from stdin"
 msgstr "ler da entrada padrão"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:355
 msgid "allow to print `undefined` names (default)"
 msgstr "permitir imprimir nomes 'indefinidos' (predefinição)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:361
 msgid "dereference tags in the input (internal use)"
 msgstr "desreferenciar tags na entrada (uso interno)"
 
@@ -9273,8 +10604,8 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "falha ao concluir o comando 'show' sobre o objeto '%s'"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
-msgstr "Forneça o conteúdo da nota usando a opção -m ou -F"
+msgid "please supply the note contents using either -m or -F option"
+msgstr "forneça o conteúdo da nota usando a opção -m ou -F"
 
 #: builtin/notes.c:203
 msgid "unable to write note object"
@@ -9282,65 +10613,89 @@ msgstr "não é possível escrever o objeto de nota"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "O conteúdo da nota foi guardado em %s"
+msgid "the note contents have been left in %s"
+msgstr "o conteúdo da nota foi colocado em %s"
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
 msgid "cannot read '%s'"
 msgstr "não é possível ler '%s'"
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "não foi possível abrir ou ler '%s'"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "falha ao resolver '%s' como uma referência válida."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Falha ao ler o objeto '%s'."
+msgid "failed to read object '%s'."
+msgstr "falha ao ler o objeto '%s'."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "Não é possível ler os dados da nota de um objeto não-blob '%s'."
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "não é possível ler os dados da nota de um objeto não-blob '%s'."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "linha de entrada malformada: '%s'."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "falha ao copiar notas de '%s' para '%s'"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "foi recusado efetuar %s de notas em %s (fora de refs/notes/)"
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
 msgid "too many parameters"
 msgstr "demasiados parâmetros"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid "No note found for object %s."
-msgstr "A nota do objeto %s não foi encontrada."
+msgid "no note found for object %s."
+msgstr "nenhuma nota encontrada para o objeto %s."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "conteúdo da nota sob a forma de cadeia de caracteres"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "conteúdo da nota de um ficheiro"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "reutilizar e editar o objeto de nota especificado"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "reutilizar o objeto de nota especificado"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "permitir guardar uma nota vazia"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "substituir notas existentes"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9349,29 +10704,29 @@ msgstr ""
 "Não é possível adicionar notas. Notas do objeto %s encontradas. Use '-f' "
 "para substituí-las."
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "A substituir as notas existentes do objeto %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "A remover a nota do objeto %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "ler objetos da entrada padrão"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "carregar configuração de reescrita do <comando> (implica --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "parâmetros insuficientes"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9380,12 +10735,12 @@ msgstr ""
 "Não é possível copiar notas. Notas do objeto %s encontradas. Use '-f' para "
 "substituí-las."
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Não existem notas no objeto de origem %s. Não é possível copiar."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "faltam notas no objeto de origem %s. Não é possível copiar."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9394,20 +10749,52 @@ msgstr ""
 "As opções -m/-F/-c/-C são obsoletas no subcomando 'edit'.\n"
 "Use 'git notes add -f -m/-F/-c/-C' em seu lugar.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "falha ao eliminar a referência NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "falha ao eliminar a referência NOTES_MERGE_REF"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "falha ao remover a árvore de trabalho de 'git notes merge'"
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "falha ao ler referência NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "não foi possível encontrar o commit de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "não foi possível analisar o commit de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "falha ao resolver NOTES_MERGE_REF"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "falha ao finalizar integração de notas"
+
+#: builtin/notes.c:754
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "estratégia de integração de notas %s desconhecida"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:770
 msgid "General options"
 msgstr "Opções gerais"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:772
 msgid "Merge options"
 msgstr "Opções de integração"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:774
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9415,46 +10802,46 @@ msgstr ""
 "resolver conflitos nas notas usando a estratégia indicada (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:776
 msgid "Committing unmerged notes"
 msgstr "A submeter notas não integradas"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:778
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "concluir integração de notas, submetendo notas não integradas"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:780
 msgid "Aborting notes merge resolution"
 msgstr "A abortar resolução de integração das notas"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:782
 msgid "abort notes merge"
 msgstr "abortar integração das notas"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:793
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "não é possível misturar --commit, --abort ou -s/--strategy"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
-msgstr "Tem de especificar uma referência de notas para integrar"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
+msgstr "tem de especificar uma referência de notas para integrar"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:822
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "-s/--strategy desconhecida: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:859
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Uma integração das notas em %s já está em curso em %s"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "uma integração das notas em %s já está em curso em %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:862
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
-msgstr "Falha ao guardar ligação à referência de notas atual (%s)"
+msgid "failed to store link to current notes ref (%s)"
+msgstr "falha ao guardar ligação à referência de notas atual (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:864
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9465,48 +10852,48 @@ msgstr ""
 "submeta o resultado com 'git notes merge --commit' ou aborte a integração "
 "com 'git notes merge --abort'.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:886
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "O objeto %s não tem nenhuma nota\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:898
 msgid "attempt to remove non-existent note is not an error"
 msgstr "não considerar como erro a remoção de uma nota não existente"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:901
 msgid "read object names from the standard input"
 msgstr "ler nome dos objetos da entrada padrão"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "não remover, mostrar apenas"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:940
 msgid "report pruned notes"
 msgstr "reportar notas podadas"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:982
 msgid "notes-ref"
 msgstr "notes-ref"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:983
 msgid "use notes from <notes-ref>"
 msgstr "usar notas de <notes-ref>"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1018
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Subcomando desconhecido: %s"
+msgid "unknown subcommand: %s"
+msgstr "subcomando desconhecido: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<opções>...] [< <lista-referências> | < <lista-"
 "objetos>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
@@ -9518,181 +10905,177 @@ msgstr ""
 msgid "deflate error (%d)"
 msgstr "erro ao compactar (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:770
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "a desativar escrita de mapa de bits, os pacotes são divididos devido a pack."
 "packSizeLimit"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:783
 msgid "Writing objects"
 msgstr "A escrever objetos"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1063
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "a desativar escrita de mapa de bits, visto que alguns objetos não estão a "
 "ser compactados"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2426
 msgid "Compressing objects"
 msgstr "A comprimir objetos"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2829
 #, c-format
 msgid "unsupported index version %s"
 msgstr "versão de índice %s não suportada"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2833
 #, c-format
 msgid "bad index version '%s'"
 msgstr "versão de índice '%s' incorreta"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2863
 msgid "do not show progress meter"
 msgstr "não mostrar medidor de progresso"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2865
 msgid "show progress meter"
 msgstr "mostrar medidor de progresso"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2867
 msgid "show progress meter during object writing phase"
 msgstr "mostrar medidor de progresso durante a fase de escrita de objetos"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2870
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "semelhante a --all-progress quando o medidor de progresso é mostrado"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2871
 msgid "version[,offset]"
 msgstr "versão[,offset]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2872
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "escrever o ficheiro de índice do pacote na versão de formato especificada"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2875
 msgid "maximum size of each output pack file"
 msgstr "tamanho máximo de cada ficheiro de pacote gerado"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2877
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorar objetos emprestados do arquivo de objetos sobressalentes"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2879
 msgid "ignore packed objects"
 msgstr "ignorar objetos compactados"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2881
 msgid "limit pack window by objects"
 msgstr "limitar a janela de compactação por objetos"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2883
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "limitar a janela de compactação por memória em adição ao limite por objetos"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2885
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "tamanho máximo de cadeias delta permitidas no pacote resultante"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2887
 msgid "reuse existing deltas"
 msgstr "reutilizar deltas existentes"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2889
 msgid "reuse existing objects"
 msgstr "reutilizar objetos existentes"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2891
 msgid "use OFS_DELTA objects"
 msgstr "usar objetos OFS_DELTA"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2893
 msgid "use threads when searching for best delta matches"
 msgstr "usar threads ao procurar pela melhor correspondência delta"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2895
 msgid "do not create an empty pack output"
 msgstr "não criar um pacote vazio"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2897
 msgid "read revision arguments from standard input"
 msgstr "ler argumentos de revisão da entrada padrão"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2899
 msgid "limit the objects to those that are not yet packed"
 msgstr "restringir-se aos objetos que ainda não foram compactados"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2902
 msgid "include objects reachable from any reference"
 msgstr "incluir objetos alcançáveis a partir de qualquer referência"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2905
 msgid "include objects referred by reflog entries"
 msgstr "incluir objetos referenciados por entradas do reflog"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2908
 msgid "include objects referred to by the index"
 msgstr "incluir objetos referenciados pelo índice"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2911
 msgid "output pack to stdout"
 msgstr "gerar pacote para a saída padrão"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2913
 msgid "include tag objects that refer to objects to be packed"
 msgstr "incluir objetos tag que refiram objetos a compactar"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2915
 msgid "keep unreachable objects"
 msgstr "manter objetos inalcançáveis"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2917
 msgid "pack loose unreachable objects"
 msgstr "empacotar objetos soltos inalcançáveis"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "hora"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2919
 msgid "unpack unreachable objects newer than <time>"
-msgstr "descompactar objetos inalcançáveis mais recentes que <hora>"
+msgstr "descompactar objetos inalcançáveis mais recentes que <tempo>"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2922
 msgid "create thin packs"
 msgstr "criar pacotes finos"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2924
 msgid "create packs suitable for shallow fetches"
 msgstr "criar pacotes adequados para obter em repositórios pouco profundos"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2926
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorar pacotes que tenham um ficheiro .keep"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2928
 msgid "pack compression level"
 msgstr "nível de compactação do pacote"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2930
 msgid "do not hide commits by grafts"
 msgstr "não esconder commits introduzidos por enxertos"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2932
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "usar um índice de mapa de bits se disponível, para acelerar a contagem de "
 "objetos"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2934
 msgid "write a bitmap index together with the pack index"
 msgstr "escrever um índice de mapa de bits juntamente com o índice do pacote"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:3061
 msgid "Counting objects"
 msgstr "A contar objetos"
 
@@ -9718,67 +11101,59 @@ msgstr "A remover objetos duplicados"
 
 #: builtin/prune.c:11
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
-msgstr "git prune [-n] [-v] [--expire <hora>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire <tempo>] [--] [<head>...]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "apresentar objetos eliminados"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
-msgstr "expirar objetos mais antigos que <hora>"
+msgstr "expirar objetos mais antigos que <tempo>"
 
 #: builtin/prune.c:123
 msgid "cannot prune in a precious-objects repo"
 msgstr "não é possível limpar num repositório de objetos-preciosos"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Valor inválido de %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<opções>] [<repositório> [<especificador-de-referência>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Opções relativas a integração"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "incorporar alterações por rebase em vez de integrar"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
 msgid "allow fast-forward"
 msgstr "permitir avanço rápido"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "empilhar/desempilhar automaticamente antes de depois de rebase"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Opções relacionadas com obtenção de objetos"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "número de submódulos puxados em paralelo"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Valor inválido de pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "Não é possível puxar com rebase: tem alterações não preparadas."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Além disso, o índice contém alterações não submetidas."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"Não é possível puxar com rebase: o índice contém alterações não submetidas."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9786,14 +11161,14 @@ msgstr ""
 "Não há nenhum candidato com o qual realizar rebase de entre as referências "
 "que se acabaram de obter."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "Não há nenhum candidato com o qual integrar de entre as referências que se "
 "acabaram obter."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9801,7 +11176,7 @@ msgstr ""
 "Geralmente, significa que forneceu um especificador de referência\n"
 "com um carácter universal (wildcard) que não corresponde a nenhum remoto."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9812,44 +11187,44 @@ msgstr ""
 "Uma vez que este não é o remoto configurado por predefinição\n"
 "do ramo atual, deve especificar um ramo na linha de comandos."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Não se encontra em nenhum ramo de momento."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Especifique o ramo sobre o qual pretende realizar rebase."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Especifique o ramo com o qual pretende integrar."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Consulte git-pull(1) para obter mais detalhes."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<remoto>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:455
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<ramo>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "O ramo atual não segue nenhum ramo."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
 "Se deseja definir o ramo que deve ser seguido por este ramo, pode fazê-lo "
 "com:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9858,21 +11233,29 @@ msgstr ""
 "A configuração indica para integrar com a referência '%s'\n"
 "do remoto, mas aquela referência não foi obtida."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "ignorado --verify-signatures para rebase"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "a opção --[no-]autostash só é válida com --rebase."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "A atualizar um ramo que ainda não foi criado e com alterações adicionadas ao "
 "índice."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "puxar com rebase"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "submeta ou esconda-as."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9883,7 +11266,7 @@ msgstr ""
 "a avançar a árvore de trabalho a partir do\n"
 "commit %s."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9900,11 +11283,11 @@ msgstr ""
 "$ git reset --hard\n"
 "para recuperar."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Não é possível integrar múltiplos ramos numa cabeça vazia."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Não é possível efetuar rebase sobre múltiplos ramos."
 
@@ -9997,14 +11380,14 @@ msgstr ""
 "do ramo atual '%s'. Deve indicar o que pretende publicar e que ramo\n"
 "remoto atualizar."
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Não indicou nenhum especificador de referência para publicar e o valor de "
 "push.default é \"nothing\"."
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -10016,7 +11399,7 @@ msgstr ""
 "'git pull ...') antes de publicar de novo.\n"
 "Consulte 'Note about fast-forwards' em 'git push --help' para obter detalhes."
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -10028,7 +11411,7 @@ msgstr ""
 "as alterações remotas (e.g. 'git pull ...') antes de publicar de novo.\n"
 "Consulte 'Note about fast-forwards' em 'git push --help' para obter detalhes."
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -10043,11 +11426,11 @@ msgstr ""
 "(e.g., 'git pull ...') antes de publicar de novo.\n"
 "Consulte 'Note about fast-forwards' em 'git push --help' para obter detalhes."
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "As atualizações foram rejeitadas porque a tag já existe no remoto."
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -10057,22 +11440,22 @@ msgstr ""
 "objeto não commit, ou atualizar uma referência remota fazendo-a\n"
 "apontar para um objeto não commit, sem usar a opção '--force'.\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "A publicar em %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "falha ao publicar algumas referências em '%s'"
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "repositório '%s' incorreto"
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -10094,116 +11477,116 @@ msgstr ""
 "\n"
 "    git push <nome>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "--all e --tags são incompatíveis"
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "--all não pode ser combinado com especificadores de referências"
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror e --tags são incompatíveis"
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror não pode ser combinado com especificadores de referências"
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "--all e --mirror são incompatíveis"
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "repositório"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:162
 msgid "push all refs"
 msgstr "publicar todas as referências"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:164
 msgid "mirror all refs"
 msgstr "replicar todas as referências"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "eliminar referências"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "publicar tags (não pode ser usado com --all ou --mirror)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:165
 msgid "force updates"
 msgstr "forçar atualização"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:179
 msgid "refname>:<expect"
 msgstr "nome da referência>:<esperado"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:180
 msgid "require old value of ref to be at this value"
 msgstr "exigir que o antigo valor da referência tenha este valor"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "controlar a publicação recursiva de submódulos"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:173
 msgid "use thin pack"
 msgstr "usar pacote fino"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
 msgid "receive pack program"
 msgstr "programa receive pack"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "definir o ramo a montante usado com git pull/status"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "eliminar referências removidas localmente"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "ignorar pre-push hook"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "publicar tags perdidas mas relevantes"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:167
 msgid "GPG sign the push"
 msgstr "assinar publicação com GPG"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:174
 msgid "request atomic transaction on remote side"
 msgstr "solicitar transação atómica no servidor remoto"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:170
 msgid "server-specific"
 msgstr "específico do servidor"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:171
 msgid "option to transmit"
 msgstr "opção para transmitir"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete é incompatível com --all, --mirror e --tags"
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete não faz sentido sem uma referência"
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr "as opções de publicação não podem ter carateres de nova linha"
 
-#: builtin/read-tree.c:37
+#: builtin/read-tree.c:40
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -10214,81 +11597,143 @@ msgstr ""
 "sparse-checkout] [--index-output=<ficheiro>] (--empty | <árvore-etc1> "
 "[<árvore-etc2> [<árvore-etc3>]])"
 
-#: builtin/read-tree.c:110
+#: builtin/read-tree.c:130
 msgid "write resulting index to <file>"
 msgstr "escrever o índice resultante no <ficheiro>"
 
-#: builtin/read-tree.c:113
+#: builtin/read-tree.c:133
 msgid "only empty the index"
 msgstr "apenas esvaziar o índice"
 
-#: builtin/read-tree.c:115
+#: builtin/read-tree.c:135
 msgid "Merging"
 msgstr "A integrar"
 
-#: builtin/read-tree.c:117
+#: builtin/read-tree.c:137
 msgid "perform a merge in addition to a read"
 msgstr "realizar uma integração em adição a uma leitura"
 
-#: builtin/read-tree.c:119
+#: builtin/read-tree.c:139
 msgid "3-way merge if no file level merging required"
 msgstr ""
 "integrar com 3 pontos se a integração ao nível de ficheiros não for "
 "necessária"
 
-#: builtin/read-tree.c:121
+#: builtin/read-tree.c:141
 msgid "3-way merge in presence of adds and removes"
 msgstr "integrar com 3 ponto na presença de adições e remoções"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:143
 msgid "same as -m, but discard unmerged entries"
 msgstr "o mesmo que -m, mas descartar entradas não integradas"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:144
 msgid "<subdirectory>/"
 msgstr "<subdiretório>/"
 
-#: builtin/read-tree.c:125
+#: builtin/read-tree.c:145
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "ler a árvore em <subdiretório>/ para o índice"
 
-#: builtin/read-tree.c:128
+#: builtin/read-tree.c:148
 msgid "update working tree with merge result"
 msgstr "atualizar a árvore de trabalho com os resultados da integração"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:150
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:131
+#: builtin/read-tree.c:151
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "permitir que os ficheiros explicitamente ignorados sejam substituídos"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:154
 msgid "don't check the working tree after merging"
 msgstr "não verificar a árvore de trabalho depois de integrar"
 
-#: builtin/read-tree.c:135
+#: builtin/read-tree.c:155
 msgid "don't update the index or the work tree"
 msgstr "não atualizar o índice ou a árvore de trabalho"
 
-#: builtin/read-tree.c:137
+#: builtin/read-tree.c:157
 msgid "skip applying sparse checkout filter"
 msgstr "ignorar a aplicação do filtro de extração esparsa"
 
-#: builtin/read-tree.c:139
+#: builtin/read-tree.c:159
 msgid "debug unpack-trees"
 msgstr "depurar unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase--helper [<opções>]"
+
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "continuar rebase"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "abortar rebase"
+
+#: builtin/receive-pack.c:27
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <git-dir>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:796
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Por predefinição, atualizar o ramo atual num repositório não-nu\n"
+"é proibido, porque tornará o índice e a árvore de trabalho inconsistentes\n"
+"com o que publicou e requererá 'git reset --hard' para igualar a\n"
+"árvore de trabalho à HEAD.\n"
+"\n"
+"Pode definir a variável configuração 'receive.denyCurrentBranch'\n"
+"como 'ignore' ou 'warn' no repositório remoto para permitir publicar\n"
+"para o ramo atual dele; no entanto, não é recomendando a menos que\n"
+"consiga de outra forma atualizar a árvore de trabalho dele para\n"
+"refletir o que publicou.\n"
+"\n"
+"Para suprimir esta mensagem e manter o comportamento predefinido, defina a "
+"variável de configuração 'receive.denyCurrentBranch' como 'refuse'."
+
+#: builtin/receive-pack.c:816
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Por predefinição, eliminar o ramo atual é proibido, porque o próximo\n"
+"'git clone' não resultará em nenhum ficheiro extraído, causando confusão.\n"
+"\n"
+"Pode definir a variável de configuração 'receive.denyDeleteCurrent' como\n"
+"'warn' ou 'ignore' no repositório remoto para permitir eliminar o\n"
+"ramo atual, com ou sem uma mensagem de aviso.\n"
+"\n"
+"Para suprimir esta mensagem, pode definí-la como 'refuse'."
+
+#: builtin/receive-pack.c:1889
 msgid "quiet"
 msgstr "silencioso"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1903
 msgid "You must specify a directory."
 msgstr "Deve especificar um diretório."
 
@@ -10467,7 +11912,7 @@ msgstr "(correspondente)"
 msgid "(delete)"
 msgstr "(eliminado)"
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
 #, c-format
 msgid "No such remote: %s"
 msgstr "Remoto inexistente: %s"
@@ -10500,7 +11945,7 @@ msgstr "falha ao eliminar '%s'"
 msgid "creating '%s' failed"
 msgstr "falha ao criar '%s'"
 
-#: builtin/remote.c:792
+#: builtin/remote.c:794
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -10514,379 +11959,392 @@ msgstr[1] ""
 "Nota: alguns ramos fora da hierarquia refs/remotes/ não foram removidos;\n"
 "para os remover, use:"
 
-#: builtin/remote.c:806
+#: builtin/remote.c:808
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Não foi possível remover a secção de configuração '%s'"
 
-#: builtin/remote.c:907
+#: builtin/remote.c:909
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " novo (os próxima objetos obtidos serão guardados em remotes/%s)"
 
-#: builtin/remote.c:910
+#: builtin/remote.c:912
 msgid " tracked"
 msgstr " seguido"
 
-#: builtin/remote.c:912
+#: builtin/remote.c:914
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " obsoleto (use 'git remote prune' para remover)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:916
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:955
+#: builtin/remote.c:957
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr ""
 "branch.%s.merge inválido; não é possível rebasear sobre mais do que um ramo"
 
-#: builtin/remote.c:963
+#: builtin/remote.c:965
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "rebaseia interativamente sobre %s do remoto"
 
-#: builtin/remote.c:964
+#: builtin/remote.c:966
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "rebaseia sobre %s do remoto"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:969
 #, c-format
 msgid " merges with remote %s"
 msgstr " integra com %s do remoto"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:972
 #, c-format
 msgid "merges with remote %s"
 msgstr "integra com %s do remoto"
 
-#: builtin/remote.c:973
+#: builtin/remote.c:975
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s    e com o %s do remoto\n"
 
-#: builtin/remote.c:1016
+#: builtin/remote.c:1018
 msgid "create"
 msgstr "criado"
 
-#: builtin/remote.c:1019
+#: builtin/remote.c:1021
 msgid "delete"
 msgstr "eliminado"
 
-#: builtin/remote.c:1023
+#: builtin/remote.c:1025
 msgid "up to date"
 msgstr "atualizado"
 
-#: builtin/remote.c:1026
+#: builtin/remote.c:1028
 msgid "fast-forwardable"
 msgstr "pode ser avançado rapidamente"
 
-#: builtin/remote.c:1029
+#: builtin/remote.c:1031
 msgid "local out of date"
 msgstr "local desatualizado"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1038
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s força em %-*s (%s)"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s publica em %-*s (%s)"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1045
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s força em %s"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s publica em %s"
 
-#: builtin/remote.c:1114
+#: builtin/remote.c:1116
 msgid "do not query remotes"
 msgstr "não consultar remotos"
 
-#: builtin/remote.c:1141
+#: builtin/remote.c:1143
 #, c-format
 msgid "* remote %s"
 msgstr "* remoto %s"
 
-#: builtin/remote.c:1142
+#: builtin/remote.c:1144
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Obter    do URL: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
 msgid "(no URL)"
 msgstr "(nenhum URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  Publicar no URL: %s"
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Ramo HEAD: %s"
 
-#: builtin/remote.c:1158
+#: builtin/remote.c:1160
 msgid "(not queried)"
 msgstr "(não consultado)"
 
-#: builtin/remote.c:1160
+#: builtin/remote.c:1162
 msgid "(unknown)"
 msgstr "(desconhecido)"
 
-#: builtin/remote.c:1164
+#: builtin/remote.c:1166
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  Ramo HEAD (o remoto HEAD é ambíguo, pode ser um dos seguintes):\n"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1178
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Ramo remoto:%s"
 msgstr[1] "  Ramos remotos:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1181 builtin/remote.c:1207
 msgid " (status not queried)"
 msgstr " (estado não consultado)"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1190
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Ramo local configurado para 'git pull':"
 msgstr[1] "  Ramos locais configurados para 'git pull':"
 
-#: builtin/remote.c:1196
+#: builtin/remote.c:1198
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Referências locais serão refletidas (mirror) por 'git push'"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1204
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Referência local configurada para 'git push'%s:"
 msgstr[1] "  Referências locais configuradas para 'git push'%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1225
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "definir refs/remotes/<nome>/HEAD de acordo com o remoto"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1227
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "eliminar refs/remotes/<nome>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1242
 msgid "Cannot determine remote HEAD"
 msgstr "Não é possível determinar o remoto HEAD"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1244
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Múltiplos ramos HEAD remotos. Escolha um explicitamente com:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1254
 #, c-format
 msgid "Could not delete %s"
 msgstr "Não foi possível eliminar %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1262
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Referência inválida: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1264
 #, c-format
 msgid "Could not setup %s"
 msgstr "Não foi possível configurar %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1282
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s ficará suspenso!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1283
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s ficou suspenso!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1293
 #, c-format
 msgid "Pruning %s"
 msgstr "A eliminar %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1294
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1310
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [eliminaria] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1313
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [eliminado] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1358
 msgid "prune remotes after fetching"
 msgstr "eliminar remotos depois de obter"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Remoto inexistente '%s'"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1437
 msgid "add branch"
 msgstr "adicionar ramo"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1444
 msgid "no remote specified"
 msgstr "nenhum remoto especificado"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1461
 msgid "query push URLs rather than fetch URLs"
 msgstr "consultar URLs de publicação em vez de URLs utilizados para obter"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1463
 msgid "return all URLs"
 msgstr "retornar todos os URLs"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1491
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "o remoto '%s' não tem nenhum URL configurado"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1517
 msgid "manipulate push URLs"
 msgstr "manipular URLs de publicação"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1519
 msgid "add URL"
 msgstr "adicionar URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1521
 msgid "delete URLs"
 msgstr "eliminar URLs"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1528
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete não faz sentido"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1569
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Padrão de URL antigo inválido: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1577
 #, c-format
 msgid "No such URL found: %s"
 msgstr "URL não encontrado: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1579
 msgid "Will not delete all non-push URLs"
 msgstr "Não é possível remover todos os URLs de não publicação"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1593
 msgid "be verbose; must be placed before a subcommand"
 msgstr "ser verboso; deve ser colocado antes de um subcomando"
 
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Subcomando desconhecido: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<opções>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"Repacks incrementais são incompatíveis com índices bitmap. Use\n"
+"--no-write-bitmap-índex ou desative a configuração pack.writebitmaps."
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "compactar tudo num único pacote"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "o mesmo que -a, e soltar objetos inalcançáveis"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "remover pacotes redundantes e executar git-prune-packed"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passar --no-reuse-delta ao git-pack-objects"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passar --no-reuse-object ao git-pack-objects"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "não executar git-update-server-info"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "passar --local ao git-pack-objects"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "escrever índice de mapa de bits"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "aproximar"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr "com -A, não soltar mais objetos além destes"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "com -a, reempacotar objetos inalcançáveis"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
 msgstr "dimensão da janela usada em compressão de deltas"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "bytes"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "o mesmo que o anterior, mas limitar a memória usada em vez do número de "
 "entradas"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
 msgstr "limitar a profundidade máxima de delta"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "tamanho máximo de cada ficheiro de pacote"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr "reempacotar objetos em pacotes marcados com .keep"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "não é possível eliminar pacotes num repositório de objetos-preciosos"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable e -A são incompatíveis"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "falha ao remover '%s'"
@@ -10911,22 +12369,22 @@ msgstr "git replace -d <objeto>..."
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<formato>] [-l [<padrão>]]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/replace.c:329 builtin/replace.c:367 builtin/replace.c:395
 #, c-format
 msgid "Not a valid object name: '%s'"
 msgstr "Nome de objeto inválido: '%s'"
 
-#: builtin/replace.c:355
+#: builtin/replace.c:359
 #, c-format
 msgid "bad mergetag in commit '%s'"
 msgstr "mergetag incorreta no commit '%s'"
 
-#: builtin/replace.c:357
+#: builtin/replace.c:361
 #, c-format
 msgid "malformed mergetag in commit '%s'"
 msgstr "mergetag malformada no commit '%s'"
 
-#: builtin/replace.c:368
+#: builtin/replace.c:372
 #, c-format
 msgid ""
 "original commit '%s' contains mergetag '%s' that is discarded; use --edit "
@@ -10935,45 +12393,45 @@ msgstr ""
 "o commit original '%s' contém a mergetag '%s' que foi excluída; use --edit "
 "em vez de --graft"
 
-#: builtin/replace.c:401
+#: builtin/replace.c:405
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
 msgstr "o commit original '%s' tem uma assinatura gpg."
 
-#: builtin/replace.c:402
+#: builtin/replace.c:406
 msgid "the signature will be removed in the replacement commit!"
 msgstr "a assinatura será removida do commit suplente!"
 
-#: builtin/replace.c:408
+#: builtin/replace.c:412
 #, c-format
 msgid "could not write replacement commit for: '%s'"
 msgstr "não foi possível escrever o commit suplente de: '%s'"
 
-#: builtin/replace.c:432
+#: builtin/replace.c:436
 msgid "list replace refs"
 msgstr "listar referências substituídas"
 
-#: builtin/replace.c:433
+#: builtin/replace.c:437
 msgid "delete replace refs"
 msgstr "eliminar referências substituídas"
 
-#: builtin/replace.c:434
+#: builtin/replace.c:438
 msgid "edit existing object"
 msgstr "editar objeto existente"
 
-#: builtin/replace.c:435
+#: builtin/replace.c:439
 msgid "change a commit's parents"
 msgstr "mudar os pais de um commit"
 
-#: builtin/replace.c:436
+#: builtin/replace.c:440
 msgid "replace the ref if it exists"
 msgstr "substituir a referência se esta existir"
 
-#: builtin/replace.c:437
+#: builtin/replace.c:441
 msgid "do not pretty-print contents for --edit"
 msgstr "não mostrar o conteúdo de --edit com impressão bonita"
 
-#: builtin/replace.c:438
+#: builtin/replace.c:442
 msgid "use this format"
 msgstr "usar este formato"
 
@@ -10993,8 +12451,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <árvore-etc> [--] <caminhos>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<árvore-etc>] [--] <caminhos>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11113,27 +12571,27 @@ msgstr "Não foi possível repor o ficheiro índice para a revisão '%s'."
 msgid "Could not write new index file."
 msgstr "Não foi possível escrever novo ficheiro de índice."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list não suporta apresentação de notas"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:393
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<opções>] -- [<argumentos>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:398
 msgid "keep the `--` passed as an arg"
 msgstr "conservar '--' passado como argumento"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:400
 msgid "stop parsing after the first non-option argument"
 msgstr "parar de analisar depois do primeiro argumento que não seja uma opção"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:403
 msgid "output in stuck long form"
 msgstr "mostrar em formato fixo e longo"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:534
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11164,68 +12622,72 @@ msgstr "git cherry-pick [<opções>] <commit-etc>..."
 msgid "git cherry-pick <subcommand>"
 msgstr "git cherry-pick <subcommando>"
 
-#: builtin/revert.c:71
+#: builtin/revert.c:89
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s: %s não pode ser usado com %s"
 
-#: builtin/revert.c:80
+#: builtin/revert.c:98
 msgid "end revert or cherry-pick sequence"
 msgstr "terminar reversão ou cherry-pick"
 
-#: builtin/revert.c:81
+#: builtin/revert.c:99
 msgid "resume revert or cherry-pick sequence"
 msgstr "retomar a reversão ou cherry-pick"
 
-#: builtin/revert.c:82
+#: builtin/revert.c:100
 msgid "cancel revert or cherry-pick sequence"
 msgstr "cancelar reversão ou cherry-pick"
 
-#: builtin/revert.c:83
+#: builtin/revert.c:101
 msgid "don't automatically commit"
 msgstr "não submeter automaticamente"
 
-#: builtin/revert.c:84
+#: builtin/revert.c:102
 msgid "edit the commit message"
 msgstr "editar a mensagem de commit"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "número de pai"
+#: builtin/revert.c:105
+msgid "parent-number"
+msgstr "número-pai"
 
-#: builtin/revert.c:89
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "selecionar pai principal"
+
+#: builtin/revert.c:108
 msgid "merge strategy"
 msgstr "estratégia de integração"
 
-#: builtin/revert.c:90
+#: builtin/revert.c:109
 msgid "option"
 msgstr "opção"
 
-#: builtin/revert.c:91
+#: builtin/revert.c:110
 msgid "option for merge strategy"
 msgstr "opção de estratégia de integração"
 
-#: builtin/revert.c:100
+#: builtin/revert.c:119
 msgid "append commit name"
 msgstr "acrescentar nome do commit"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:121
 msgid "preserve initially empty commits"
 msgstr "preservar commits inicialmente vazios"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:122
 msgid "allow commits with empty messages"
 msgstr "permitir commits com mensagens vazias"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:123
 msgid "keep redundant, empty commits"
 msgstr "manter commits redundantes e vazios"
 
-#: builtin/revert.c:192
+#: builtin/revert.c:211
 msgid "revert failed"
 msgstr "falha ao reverter"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:224
 msgid "cherry-pick failed"
 msgstr "falha ao efetuar cherry-pick"
 
@@ -11233,29 +12695,7 @@ msgstr "falha ao efetuar cherry-pick"
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<opções>] [--] <ficheiro>..."
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"o submódulo seguinte (ou um dos seus submódulos aninhados)\n"
-"usa um diretório .git:"
-msgstr[1] ""
-"os submódulos seguintes (ou um dos seus submódulos)\n"
-"usam um diretório .git:"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(use 'rm -rf' se pretende mesmo removê-lo, incluindo todo o seu histórico)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11269,7 +12709,7 @@ msgstr[1] ""
 "os seguintes ficheiros têm conteúdo preparado no índice diferente\n"
 "do conteúdo no ficheiro e em HEAD:"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11277,13 +12717,13 @@ msgstr ""
 "\n"
 "(use -f para forçar remoção)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
 msgstr[0] "o seguinte ficheiro contém alterações preparadas no índice:"
 msgstr[1] "os seguintes ficheiros contêm alterações preparadas no índice:"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11291,42 +12731,47 @@ msgstr ""
 "\n"
 "(use --cached para manter o ficheiro, ou -f para forçar remoção)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "o seguinte ficheiro contém alterações locais:"
 msgstr[1] "os seguintes ficheiros contêm alterações locais:"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "não listar ficheiros removidos"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "remover apenas do índice"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "ignorar verificação de atualização"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "permitir remoção recursiva"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "sair com valor zero mesmo quando não há correspondência"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "não remover '%s' recursivamente sem -r"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm: não é possível remover %s"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "não foi possível remover '%s'"
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11340,19 +12785,19 @@ msgstr ""
 "  --all e especificação explicita duma <referência> são mutuamente "
 "exclusivos."
 
-#: builtin/send-pack.c:160
+#: builtin/send-pack.c:161
 msgid "remote name"
 msgstr "nome do remoto"
 
-#: builtin/send-pack.c:171
+#: builtin/send-pack.c:175
 msgid "use stateless RPC protocol"
 msgstr "use protocolo RPC sem estado"
 
-#: builtin/send-pack.c:172
+#: builtin/send-pack.c:176
 msgid "read refs from stdin"
 msgstr "ler referências do stdin"
 
-#: builtin/send-pack.c:173
+#: builtin/send-pack.c:177
 msgid "print status from remote helper"
 msgstr "imprimir estado do programa auxiliar remoto"
 
@@ -11361,23 +12806,27 @@ msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr ""
 "git shortlog [<opções>] [<intervalo-de-revisões>] [[--] [<caminho>...]]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr "agrupar por committer em vez de autor"
+
+#: builtin/shortlog.c:250
 msgid "sort output according to the number of commits per author"
 msgstr "ordenar saída de acordo com o número de commits por autor"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:252
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr "suprimir a descrição dos commits, fornecer apenas o número de commits"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:254
 msgid "Show the email address of each author"
 msgstr "Mostrar o endereço de e-mail de cada autor"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:255
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:256
 msgid "Linewrap output"
 msgstr "ajustar linhas"
 
@@ -11397,71 +12846,126 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<referência>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "ignorar %s; não é possível processar mais do que %d referência"
+msgstr[1] "ingorar %s; não é possível processar mais do que %d referências"
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr "nenhuma referência corresponde com %s"
+
+#: builtin/show-branch.c:632
 msgid "show remote-tracking and local branches"
 msgstr "mostrar os ramos de monitorização remotos e os ramos locais"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:634
 msgid "show remote-tracking branches"
 msgstr "mostrar os ramos de monitorização remotos"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:636
 msgid "color '*!+-' corresponding to the branch"
 msgstr "colorir '*!+-' correspondendo ao ramo"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:638
 msgid "show <n> more commits after the common ancestor"
 msgstr "mostrar mais <n> commits depois do antecessor comum"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:640
 msgid "synonym to more=-1"
 msgstr "sinónimo de more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:641
 msgid "suppress naming strings"
 msgstr "suprimir a cadeias de caracteres de nomes"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:643
 msgid "include the current branch"
 msgstr "incluir o ramo atual"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:645
 msgid "name commits with their object names"
 msgstr "designar commits pelos seus nomes de objeto"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:647
 msgid "show possible merge bases"
 msgstr "mostrar possíveis bases de integração"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:649
 msgid "show refs unreachable from any other ref"
 msgstr "mostrar referências inalcançáveis a partir de outras referências"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:651
 msgid "show commits in topological order"
 msgstr "mostrar commits em ordem topológica"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:654
 msgid "show only commits not on the first branch"
 msgstr "mostrar apenas commits não presentes no primeiro ramo"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:656
 msgid "show merges reachable from only one tip"
 msgstr "mostrar integrações alcançáveis a partir duma única ponta"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:658
 msgid "topologically sort, maintaining date order where possible"
 msgstr ""
 "ordenar topologicamente, mantendo a ordenação por data sempre que possível"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:661
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:662
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "mostrar as <n> entradas de ref-log mais recente a partir da base"
 
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog é incompatível com --all, --remotes, --independent or --merge-base"
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "nenhum ramo fornecido e HEAD não é válida"
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "a opção --reflog precisa do nome de um ramo"
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "apenas %d entrada podem ser mostradas neste momento."
+msgstr[1] "apenas %d entradas podem ser mostradas neste momento."
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr "referência inexistente %s"
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "não é possível processar mais do que %d revisão."
+msgstr[1] "não é possível processar mais do que %d revisões."
+
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' não é uma referência válida."
+
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "não é possível encontrar o commit %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11474,37 +12978,37 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<padrão>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "mostrar apenas tags (pode ser combinado com heads)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "mostrar apenas cabeças (pode ser combinado com tags)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 "verificação de referências mais rigorosa, requer o caminho exato da "
 "referência"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "mostrar a referência HEAD, mesmo que fosse filtrada"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
 msgstr "desreferenciar tags em IDs de objeto"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "mostrar hash SHA1 com <n> digitos"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "não imprimir resultados para o stdout (útil com --verify)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr "mostrar referências do stdin que não estão no repositório local"
 
@@ -11525,12 +13029,12 @@ msgstr ""
 msgid "prepend comment character and space to each line"
 msgstr "preceder cada linha com um carácter de comentário e um espaço"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
 msgid "No such ref: %s"
 msgstr "Referência inexistente: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Esperava-se um nome completo de uma referência, obteve-se %s"
@@ -11540,75 +13044,102 @@ msgstr "Esperava-se um nome completo de uma referência, obteve-se %s"
 msgid "cannot strip one component off url '%s'"
 msgstr "não é possível tirar um componente do URL '%s'"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
 msgid "alternative anchor for relative paths"
 msgstr "âncora alternativa para caminhos relativos"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:310
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<caminho>] [<caminho>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:382
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "Nenhum URL encontrado para o caminho de submódulo '%s' em .gitmodules"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr ""
+"não é possível encontrar configuração '%s'. Assumir que este repositório é o "
+"próprio repositório a montante autoritário."
+
+#: builtin/submodule--helper.c:406
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "Falha ao registar o URL do caminho de submódulo '%s'"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:410
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Submódulo '%s' (%s) registado com caminho '%s'\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:420
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "aviso: modo de atualização do comando sugerido para o submódulo '%s'\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:427
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr "Falha ao registar o modo de atualização do caminho de submódulo '%s'"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:443
 msgid "Suppress output for initializing a submodule"
 msgstr "Suprimir a saída ao inicializar um submódulo"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:448
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<caminho>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:476
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <caminho>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:482
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr ""
 "nenhum mapeamento de submódulo do caminho '%s' encontrado em .gitmodules"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "o submódulo '%s' não pode adicionar sobressalente: %s"
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "O valor '%s' de submodule.alternateErrorStrategy não é reconhecido"
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "O valor '%s' de submodule.alternateLocation não é reconhecido"
+
+#: builtin/submodule--helper.c:633
 msgid "where the new submodule will be cloned to"
 msgstr "sítio para aonde o novo submódulo será clonado"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:636
 msgid "name of the new submodule"
 msgstr "nome do novo submódulo"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:639
 msgid "url where to clone the submodule from"
 msgstr "url donde clonar o submódulos"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:645
 msgid "depth for shallow clones"
 msgstr "profundidade de clones rasos"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "forçar progresso da clonagem"
+
+#: builtin/submodule--helper.c:653
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11616,99 +13147,84 @@ msgstr ""
 "git submodule--helper clone [--prefix=<caminho>] [--quiet] [--reference "
 "<repositório>] [--name <nome>] [--depth <depth>] --url <url> --path <caminho>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "não foi possível criar o diretório '%s'"
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:684
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "falha ao clonar '%s' no caminho de submódulo '%s'"
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "não é possível abrir o ficheiro '%s'"
-
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
-msgstr "não é possível fechar o ficheiro %s"
-
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:699
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "não foi possível obter o diretório do submódulo de '%s'"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:764
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Caminho de submódulo '%s' não inicializado"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:768
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Pretendia usar 'update --init'?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "A ignorar submódulo %s não integrado"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:814
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "A ignorar submódulo '%s'"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:942
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "Falha ao clonar '%s'. Nova tentativa agendada"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:953
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "Falha ao clonar '%s' pela segunda vez, abortado"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
 msgid "path into the working tree"
 msgstr "caminho para a árvore de trabalho"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:977
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr ""
 "caminho para a árvore de trabalho, atravessando limites de submódulos "
 "aninhados"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:981
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout ou none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:985
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "criar um clone raso, truncado ao número especificado de revisões"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:988
 msgid "parallel jobs"
 msgstr "trabalhos em paralelo"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:990
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "se o clone inicial deve seguir a recomendação rasa"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:991
 msgid "don't print cloning progress"
 msgstr "não imprimir progresso da clonagem"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:998
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<caminho>] [<caminho>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:1008
 msgid "bad value for update parameter"
 msgstr "valor incorreto no parâmetro update"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1079
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11717,11 +13233,24 @@ msgstr ""
 "O ramo do submódulo (%s) foi configurado para herdar o ramo do superprojeto, "
 "mas o superprojeto não está em nenhum ramo"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "percorrer submódulos recursivamente"
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir [<caminho>...]"
+
+#: builtin/submodule--helper.c:1226
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "o subcomando submodule--helper deve ser invocado com um subcomando"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s não suporta --super-prefix"
+
+#: builtin/submodule--helper.c:1239
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' não é um subcomando válido de submodule--helper"
@@ -11769,32 +13298,29 @@ msgstr "git tag -d <nome-da-tag>..."
 
 #: builtin/tag.c:25
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <objeto>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] "
+"[--points-at <objeto>]\n"
 "\t\t[--format=<formato>] [--[no-]merged [<commit>]] [<padrão>...]"
 
 #: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <nome-da-tag>..."
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<formato>] <nometag>..."
 
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "o nome da tag é demasiado longo: %.*s..."
-
-#: builtin/tag.c:86
+#: builtin/tag.c:83
 #, c-format
 msgid "tag '%s' not found."
 msgstr "tag '%s' não encontrada."
 
-#: builtin/tag.c:101
+#: builtin/tag.c:99
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' eliminada (era %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:128
 #, c-format
 msgid ""
 "\n"
@@ -11807,7 +13333,7 @@ msgstr ""
 "  %s\n"
 "Linha começadas com '%c' serão ignoradas.\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:132
 #, c-format
 msgid ""
 "\n"
@@ -11821,143 +13347,171 @@ msgstr ""
 "  %s\n"
 "Linhas começadas com '%c' serão mantidas; pode removê-las se o desejar.\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:210
 msgid "unable to sign the tag"
 msgstr "não foi possível assinar a tag"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:212
 msgid "unable to write tag file"
 msgstr "não foi possível escrever o ficheiro da tag"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:236
 msgid "bad object type."
 msgstr "tipo de objeto incorreto."
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "cabeçalho da tag demasiado longo."
-
-#: builtin/tag.c:275
+#: builtin/tag.c:282
 msgid "no tag message?"
 msgstr "sem mensagem de tag?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:289
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "A mensagem da tag foi guardada em %s\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:312
+msgid "tag: tagging "
+msgstr "tag: a colocar tag"
+
+#: builtin/tag.c:320
+msgid "object of unknown type"
+msgstr "objeto de tipo desconhecido"
+
+#: builtin/tag.c:327
+msgid "commit object"
+msgstr "objeto commit"
+
+#: builtin/tag.c:335
+msgid "tree object"
+msgstr "objeto árvore"
+
+#: builtin/tag.c:338
+msgid "blob object"
+msgstr "objeto blob"
+
+#: builtin/tag.c:341
+msgid "other tag object"
+msgstr "outro objeto tag"
+
+#: builtin/tag.c:397
 msgid "list tag names"
 msgstr "listar os nomes das tag"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:399
 msgid "print <n> lines of each tag message"
 msgstr "imprimir <n> linhas de cada mensagem de tag"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:401
 msgid "delete tags"
 msgstr "eliminar tags"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:402
 msgid "verify tags"
 msgstr "verificar tags"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:404
 msgid "Tag creation options"
 msgstr "Opções de criação de tags"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:406
 msgid "annotated tag, needs a message"
 msgstr "tag anotada, é necessário uma mensagem"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:408
 msgid "tag message"
 msgstr "mensagem da tag"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:410
 msgid "annotated and GPG-signed tag"
 msgstr "tag anotada e assinada com GPG"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:414
 msgid "use another key to sign the tag"
 msgstr "usar outra chave para assinar a tag"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:415
 msgid "replace the tag if exists"
 msgstr "substituir a tag se esta existir"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:416 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "criar um reflog"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:418
 msgid "Tag listing options"
 msgstr "Opções de listagem de tags"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:419
 msgid "show tag list in columns"
 msgstr "mostrar a lista de tags em colunas"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:420 builtin/tag.c:422
 msgid "print only tags that contain the commit"
 msgstr "imprimir apenas tags que contenham o commit"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "imprimir apenas tags que não contenham o commit"
+
+#: builtin/tag.c:424
 msgid "print only tags that are merged"
 msgstr "imprimir apenas as tags que foram integradas"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:425
 msgid "print only tags that are not merged"
 msgstr "imprimir apenas as tags que não foram integradas"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:430
 msgid "print only tags of the object"
 msgstr "imprimir apenas as tags do objeto"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:469
 msgid "--column and -n are incompatible"
 msgstr "--column e -n são incompatíveis"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "a opção -n só é permitida com -l."
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "a opção -n só é permitida no modo lista"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "a opção --contains só é permitida com -l."
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "a opção --contains só é permitida no modo lista"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "a opção --points-at só é permitida com -l."
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "a opção --contains só é permitida no modo lista"
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "as opções --merged e --no-merged só são permitidas com -l"
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "a opção --points-at só é permitida no modo lista"
+
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr "as opções --merged e --no-merged só são permitidas no modo lista"
 
-#: builtin/tag.c:433
+#: builtin/tag.c:510
 msgid "only one -F or -m option is allowed."
 msgstr "só é permitido um opção -F ou -m."
 
-#: builtin/tag.c:452
+#: builtin/tag.c:529
 msgid "too many params"
 msgstr "demasiado parâmetros"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:535
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' não é um nome de tag válido."
 
-#: builtin/tag.c:463
+#: builtin/tag.c:540
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "a tag '%s' já existe"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:570
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Tag '%s' atualizada (era %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "A descompactar objetos"
 
@@ -11981,181 +13535,213 @@ msgstr "falha ao criar o ficheiro %s"
 msgid "failed to delete file %s"
 msgstr "falha ao eliminar o ficheiro %s"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/update-index.c:110 builtin/update-index.c:216
 #, c-format
 msgid "failed to delete directory %s"
 msgstr "falha ao eliminar o diretório %s"
 
-#: builtin/update-index.c:133
+#: builtin/update-index.c:135
 #, c-format
 msgid "Testing mtime in '%s' "
 msgstr "A testar mtime em '%s' "
 
-#: builtin/update-index.c:145
+#: builtin/update-index.c:149
 msgid "directory stat info does not change after adding a new file"
 msgstr ""
 "a informação de stat do diretório não mudou depois de adicionar um novo "
 "ficheiro"
 
-#: builtin/update-index.c:158
+#: builtin/update-index.c:162
 msgid "directory stat info does not change after adding a new directory"
 msgstr ""
 "a informação de stat do diretório não mudou depois de adicionar um novo "
 "diretório"
 
-#: builtin/update-index.c:171
+#: builtin/update-index.c:175
 msgid "directory stat info changes after updating a file"
 msgstr "a informação de stat mudou depois de atualizar um ficheiro"
 
-#: builtin/update-index.c:182
+#: builtin/update-index.c:186
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 "a informação de stat do diretório mudou depois de adicionar um ficheiro "
 "dentro dum subdiretório"
 
-#: builtin/update-index.c:193
+#: builtin/update-index.c:197
 msgid "directory stat info does not change after deleting a file"
 msgstr ""
 "a informação de stat do diretório não mudou depois de eliminar um ficheiro"
 
-#: builtin/update-index.c:206
+#: builtin/update-index.c:210
 msgid "directory stat info does not change after deleting a directory"
 msgstr ""
 "a informação de stat do diretório não mudou depois de eliminar um diretório"
 
-#: builtin/update-index.c:213
+#: builtin/update-index.c:217
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:568
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<opções>] [--] [<ficheiro>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:923
 msgid "continue refresh even when index needs update"
 msgstr "continuar a refrescar mesmo quando o índice precise de ser atualizado"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:926
 msgid "refresh: ignore submodules"
 msgstr "refrescar: ignorar submódulos"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:929
 msgid "do not ignore new files"
 msgstr "não ignorar novos ficheiros"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:931
 msgid "let files replace directories and vice-versa"
 msgstr "deixar que os ficheiros substituam os diretórios e vice-versa"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:933
 msgid "notice files missing from worktree"
 msgstr "avisar sobre ficheiros que faltem na árvore de trabalho"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:935
 msgid "refresh even if index contains unmerged entries"
 msgstr "refrescar mesmo que o índice contenha entradas não integradas"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:938
 msgid "refresh stat information"
 msgstr "refrescar informação de stat"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:942
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "como --refresh, mas ignorar a definição assume-unchanged"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:946
 msgid "<mode>,<object>,<path>"
 msgstr "<modo>,<objeto>,<caminho>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:947
 msgid "add the specified entry to the index"
 msgstr "adicionar o elemento especificado ao índice"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:956
 msgid "mark files as \"not changing\""
 msgstr "marcar ficheiros como \"não alterados\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:959
 msgid "clear assumed-unchanged bit"
 msgstr "limpar o bit assumed-unchanged"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:962
 msgid "mark files as \"index-only\""
 msgstr "marcar ficheiros como \"únicos do índice\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:965
 msgid "clear skip-worktree bit"
 msgstr "limpar o bit ignorar-árvore-de-trabalho"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:968
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "só adicionar ao índice; não adicionar o conteúdo à base de dados de objetos"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:970
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "remover os caminhos mencionado mesmo se estiverem presentes na árvore de "
 "trabalho"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:972
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "com --stdin: as linhas da entrada são terminadas com bytes nulos"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:974
 msgid "read list of paths to be updated from standard input"
 msgstr "ler lista de caminho a atualizar da entrada padrão"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:978
 msgid "add entries from standard input to the index"
 msgstr "adicionar elementos da entrada padrão ao índice"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:982
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "repovoar as fases nº2 e nº3 dos caminhos listados"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:986
 msgid "only update entries that differ from HEAD"
 msgstr "atualizar apenas elementos que difiram de HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:990
 msgid "ignore files missing from worktree"
 msgstr "ignorar ficheiros não presentes na árvore de trabalho"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:993
 msgid "report actions to standard output"
 msgstr "mostrar ações na saída padrão"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:995
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr ""
 "(para porcelanas) esquecer conflitos guardados que não foram resolvidos"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:999
 msgid "write index in this format"
 msgstr "escrever o índice neste formato"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:1001
 msgid "enable or disable split index"
 msgstr "ativar ou desativar a divisão do índice"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:1003
 msgid "enable/disable untracked cache"
 msgstr "ativar ou desativar cache não controlada"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1005
 msgid "test if the filesystem supports untracked cache"
 msgstr "testar se o sistema de ficheiros suporta cache não controlada"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1007
 msgid "enable untracked cache without testing the filesystem"
 msgstr "ativar cache não controlada sem testar o sistema de ficheiros"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+"core.splitIndex está definida como false; remova ou altere-a se pretende "
+"mesmo ativar índice separado"
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"core.splitIndex está definida como true; remova ou altere-a se pretende "
+"mesmo desativar índice separado"
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache está definida como true; remova ou altere-a se pretende "
+"mesmo desativar a cache não controlada"
+
+#: builtin/update-index.c:1131
 msgid "Untracked cache disabled"
 msgstr "A cache não controlada está desativada"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache está definida como false; remova ou altere-a se pretende "
+"mesmo ativar a cache não controlada"
+
+#: builtin/update-index.c:1143
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "A cache não controlada de '%s' foi ativada."
@@ -12207,7 +13793,7 @@ msgstr "git verify-commit [-v | --verbose] <commit>..."
 msgid "print commit contents"
 msgstr "imprimir conteúdo do commit"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "imprimir informação do gpg em bruto"
 
@@ -12223,11 +13809,11 @@ msgstr "verboso"
 msgid "show statistics only"
 msgstr "mostrar apenas estatísticas"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <tag>..."
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<formato>] <tag>..."
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "imprimir conteúdo da tag"
 
@@ -12278,6 +13864,14 @@ msgstr ""
 "A remover worktrees/%s: o ficheiro gitdir aponta para uma localização "
 "inexistente"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "reportar árvores de trabalho podadas"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "expirar árvores de trabalho mais antigos que <tempo>"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
@@ -12293,51 +13887,51 @@ msgstr "não foi possível criar o diretório de '%s'"
 msgid "Preparing %s (identifier %s)"
 msgstr "A preparar %s (identificador %s)"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:324
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 "extrair o <ramo> mesmo se já tenha sido extraído noutra árvore de trabalho"
 
-#: builtin/worktree.c:325
+#: builtin/worktree.c:326
 msgid "create a new branch"
 msgstr "criar um novo ramo"
 
-#: builtin/worktree.c:327
+#: builtin/worktree.c:328
 msgid "create or reset a branch"
 msgstr "criar ou repor um ramo"
 
-#: builtin/worktree.c:329
+#: builtin/worktree.c:330
 msgid "populate the new working tree"
 msgstr "povoar a nova árvore de trabalho"
 
-#: builtin/worktree.c:337
+#: builtin/worktree.c:338
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B e --detach são mutuamente exclusivos"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:473
 msgid "reason for locking"
 msgstr "razão de trancar"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:485 builtin/worktree.c:518
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "'%s' não é uma árvore de trabalho"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:487 builtin/worktree.c:520
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "A árvore de trabalho principal não pode ser trancada nem destrancada"
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:492
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "'%s' já está trancada, razão: %s"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:494
 #, c-format
 msgid "'%s' is already locked"
 msgstr "'%s' já está trancada"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:522
 #, c-format
 msgid "'%s' is not locked"
 msgstr "'%s' não está trancada"
@@ -12358,26 +13952,40 @@ msgstr "escrever objeto árvore do subdiretório <prefixo>"
 msgid "only useful for debugging"
 msgstr "apenas útil para depuração"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<opções>] <dir>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1040
 msgid "quit after a single request/response exchange"
 msgstr "terminar depois de uma única troca de pedido/resposta"
 
-#: upload-pack.c:839
+#: upload-pack.c:1042
 msgid "exit immediately after initial ref advertisement"
 msgstr "sair imediatamente depois do anúncio inicial da referência"
 
-#: upload-pack.c:841
+#: upload-pack.c:1044
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr "não tentar <diretório>/.git/ se o <diretório> não for um diretório Git"
 
-#: upload-pack.c:843
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "interromper transferência depois de <n> segundos de inatividade"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"As permissões do diretório do socket são demasiado fracas; outros\n"
+"utilizadores poderão conseguir as suas credenciais em cache. Considere "
+"executar:\n"
+"\n"
+"\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "imprimir mensagens de depuração no stderr"
@@ -12392,10 +14000,30 @@ msgstr ""
 "guias de conceitos. Consulte 'git help <comando>' ou 'git help <conceito>'\n"
 "para ler sobre um subcomando ou conceito específico."
 
-#: http.c:323
+#: http.c:355
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Não é suportado delegar controlo com cURL < 7.22.0"
+
+#: http.c:364
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "Não é suportado afixar chaves públicas com cURL < 7.44.0"
 
+#: http.c:1755
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"não é possível atualizar base de url de redireção:\n"
+"  pedido para: %s\n"
+"    redireção: %s"
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "a redirecionar para %s "
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "iniciar uma área de trabalho (consulte também: git help tutorial)"
@@ -12509,15 +14137,15 @@ msgstr "data-de-validade"
 msgid "no-op (backward compatibility)"
 msgstr "sem-ação (retrocompatibilidade)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "ser mais verboso"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "ser mais silencioso"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "usar <n> dígitos para mostrar SHA-1s"
 
@@ -12736,8 +14364,8 @@ msgid "Automated merge did not work."
 msgstr "A integração automática não funcionou."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
-msgstr "Não devia estar a fazer um Polvo."
+msgid "Should not be doing an octopus."
+msgstr "Não se deviria estar a fazer um polvo."
 
 #: git-merge-octopus.sh:73
 #, sh-format
@@ -12763,7 +14391,7 @@ msgstr "A tentar integração simples com $pretty_name"
 msgid "Simple merge did not work, trying automatic merge."
 msgstr "A integração simples não funcionou, a tentar integração automática."
 
-#: git-rebase.sh:56
+#: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12775,51 +14403,37 @@ msgstr ""
 "Para extrair o ramo original e interromper o rebase, execute \"git rebase --"
 "abort\"."
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:157 git-rebase.sh:396
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Não foi possível voltar para $head_name"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "Pilha automática (autostash) aplicada."
-
-#: git-rebase.sh:170
+#: git-rebase.sh:171
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Não é possível guardar $stash_sha1"
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"Surgiram conflitos ao aplicar a pilha automática (autostash).\n"
-"As suas alterações estão guardadas na pilha.\n"
-"Pode executar \"git stash pop\" ou \"git stash drop\" oportunamente.\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:211
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Rebase recusado pelo hook pre-rebase."
 
-#: git-rebase.sh:215
+#: git-rebase.sh:216
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Parece que o git-am está em curso. Não é possível efetuar rebase."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:357
 msgid "No rebase in progress?"
 msgstr "Rebase não está em curso?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:368
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "A ação --edit-todo só pode ser usada durante um rebase interativo."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:375
 msgid "Cannot read HEAD"
 msgstr "Não é possível ler HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:378
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -12827,7 +14441,7 @@ msgstr ""
 "Deve editar todos os conflitos da integração\n"
 "e marcá-los como resolvidos usando git add"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:418
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12848,98 +14462,102 @@ msgstr ""
 "e execute o comando de novo. A execução foi interrompida no caso de\n"
 "ainda ter algo importante nesse sítio."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:469
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "$upstream_name a montante inválido"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:493
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: há mais do que uma base de integração"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:496 git-rebase.sh:500
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: não há nenhuma base de integração"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:505
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Não aponta para um commit válido: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:528
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: ramo inexistente: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:561
 msgid "Cannot autostash"
 msgstr "Não é possível empilhar automaticamente (autostash)"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:566
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Pilha automática (autostash) criada: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:570
 msgid "Please commit or stash them."
 msgstr "Submeta ou esconda-as."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "O ramo atual $branch_name está atualizado."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:594
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "O ramo atual $branch_name está atualizado, rebase forçado."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:605
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Alterações de $mb para $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:614
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
-"Primeiro, a recuar a cabeça para replicar as suas alterações no topo desta..."
+"Primeiro, a recuar a cabeça para replicar as suas alterações no topo dela..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:624
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name avançado rapidamente para $onto_name."
 
-#: git-stash.sh:50
+#: git-stash.sh:53
 msgid "git stash clear with parameters is unimplemented"
 msgstr "não está implementado git stash clear com parâmetros"
 
-#: git-stash.sh:73
+#: git-stash.sh:94
 msgid "You do not have the initial commit yet"
 msgstr "O commit inicial ainda não existe"
 
-#: git-stash.sh:88
+#: git-stash.sh:109
 msgid "Cannot save the current index state"
 msgstr "Não é possível guardar o estado atual do índice"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "Não é possível guardar os ficheiros não controlados"
+
+#: git-stash.sh:144 git-stash.sh:157
 msgid "Cannot save the current worktree state"
 msgstr "Não é possível guardar o estado atual da árvore de trabalho"
 
-#: git-stash.sh:140
+#: git-stash.sh:161
 msgid "No changes selected"
 msgstr "Nenhuma alteração selecionada"
 
-#: git-stash.sh:143
+#: git-stash.sh:164
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Não é possível remover o índice temporário (não pode acontecer)"
 
-#: git-stash.sh:156
+#: git-stash.sh:177
 msgid "Cannot record working tree state"
 msgstr "Não é possível gravar o estado da árvore de trabalho"
 
-#: git-stash.sh:188
+#: git-stash.sh:209
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Não é possível atualizar $ref_stash com $w_commit"
@@ -12954,7 +14572,7 @@ msgstr "Não é possível atualizar $ref_stash com $w_commit"
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
+#: git-stash.sh:265
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -12963,109 +14581,118 @@ msgstr ""
 "erro: opção desconhecida de 'stash save': $option\n"
 "      Para fornecer uma mensagem, use git stash save -- '$option'"
 
-#: git-stash.sh:259
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr ""
+"Não é possível usar --patch e --include-untracked ou --all ao mesmo tempo"
+
+#: git-stash.sh:286
 msgid "No local changes to save"
 msgstr "Não há alterações locais para guardar"
 
-#: git-stash.sh:263
+#: git-stash.sh:291
 msgid "Cannot initialize stash"
 msgstr "Não é possível inicializar a pilha"
 
-#: git-stash.sh:267
+#: git-stash.sh:295
 msgid "Cannot save the current status"
 msgstr "Não é possível guardar o estado atual"
 
-#: git-stash.sh:268
+#: git-stash.sh:296
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
 msgstr "Diretório de trabalho e estado do índice $stash_msg guardados"
 
-#: git-stash.sh:285
+#: git-stash.sh:323
 msgid "Cannot remove worktree changes"
 msgstr "Não é possível remover as alterações da árvore de trabalho"
 
-#: git-stash.sh:404
+#: git-stash.sh:471
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "opção desconhecido: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:484
 msgid "No stash found."
 msgstr "Nenhuma pilha encontrada."
 
-#: git-stash.sh:421
+#: git-stash.sh:491
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Demasiadas revisões especificadas: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:506
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference não é uma referência válida"
 
-#: git-stash.sh:455
+#: git-stash.sh:534
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' não é um commit semelhante a pilha"
 
-#: git-stash.sh:466
+#: git-stash.sh:545
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' não é uma referência de pilha"
 
-#: git-stash.sh:474
+#: git-stash.sh:553
 msgid "unable to refresh index"
 msgstr "não foi possível refrescar o índice"
 
-#: git-stash.sh:478
+#: git-stash.sh:557
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Não é possível aplicar uma pilha durante uma integração"
 
-#: git-stash.sh:486
+#: git-stash.sh:565
 msgid "Conflicts in index. Try without --index."
 msgstr "Conflitos no índice. Tente sem --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:567
 msgid "Could not save index tree"
 msgstr "Não foi possível guardar árvore do índice"
 
-#: git-stash.sh:522
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "Não foi possível restaurar os ficheiros não controlados da pilha"
+
+#: git-stash.sh:601
 msgid "Cannot unstage modified files"
 msgstr "Não é possível despreparar os ficheiros modificado"
 
-#: git-stash.sh:537
+#: git-stash.sh:616
 msgid "Index was not unstashed."
 msgstr "O índice não foi reposto."
 
-#: git-stash.sh:551
+#: git-stash.sh:630
 msgid "The stash is kept in case you need it again."
 msgstr "A pilha é guarda no caso de precisar dela de novo."
 
-#: git-stash.sh:560
+#: git-stash.sh:639
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "A descartar ${REV} ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:640
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Não foi possível descartar elemento da pilha"
 
-#: git-stash.sh:569
+#: git-stash.sh:648
 msgid "No branch name specified"
 msgstr "Nenhum nome de ramo especificado"
 
-#: git-stash.sh:641
+#: git-stash.sh:727
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Para os restaurar execute \"git stash apply\")"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Os caminhos relativos só podem ser usados a partir do topo da árvore de "
 "trabalho"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL do repositório: '$repo' deve ser absoluto ou começar com ./|../"
@@ -13075,7 +14702,12 @@ msgstr "URL do repositório: '$repo' deve ser absoluto ou começar com ./|../"
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' já existe no índice"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "'$sm_path' já existe no índicee não é um submódulo"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -13086,23 +14718,23 @@ msgstr ""
 "$sm_path\n"
 "Use -f se pretende mesmo adicioná-lo."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "A adicionar repositório existente em '$sm_path' ao índice"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' já existe e não é uma repositório git válido"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Um diretório git de '$sm_name' foi encontrado localmente com os remotos:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -13118,58 +14750,58 @@ msgstr ""
 "ou não tem a certeza o que isto significa escolha outro nome com a opção '--"
 "name'."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "A reativar o diretório git local do submódulo '$sm_name'."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Não foi possível extrair o submódulo '$sm_path'"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Falha ao adicionar o submódulo '$sm_path'"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Falha ao registar o submódulo '$sm_path'"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:341
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "A entrar em '$displaypath'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:361
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr ""
 "Interrompido em '$displaypath'; o script retornou um valor diferente de zero."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:432
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "especificador de caminho e --all são incompatíveis"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:437
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr ""
 "Use '--all' se pretende mesmo anular a inicialização todos os submódulos"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
-"A árvore de trabalho do submódulo '$displaypath' contem um diretório .git\n"
+"A árvore de trabalho do submódulo '$displaypath' contém um diretório .git\n"
 "(use 'rm -rf' se pretende mesmo removê-lo, incluindo todo o seu histórico)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13178,41 +14810,41 @@ msgstr ""
 "A árvore de trabalho do submódulo '$displaypath' contém alterações locais; "
 "use '-f' para as descartar"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:468
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Diretório '$displaypath' limpo"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:469
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Não foi possível remover a árvore de trabalho do submódulo '$displaypath'"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:472
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Não foi possível criar o diretório vazio do submódulo '$displaypath'"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:481
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "O registo do submódulo '$name' ($url) foi removido do caminho '$displaypath'"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "Não foi possível encontrar a revisão atual no caminho de submódulo "
 "'$displaypath'"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:647
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Não foi possível obter no caminho de submódulo '$sm_path'"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13221,12 +14853,12 @@ msgstr ""
 "Não foi possível encontrar a revisão atual ${remote_name}/${branch} no "
 "caminho de submódulo '$sm_path'"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:670
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Não é possível obter no caminho de submódulo '$displaypath'"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:676
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
@@ -13235,88 +14867,84 @@ msgstr ""
 "Obteve-se no caminho de submódulo '$displaypath', mas não continha $sha1. "
 "Falha ao obter aquele commit diretamente."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:683
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Não é possível extrair '$sha1' no caminho de submódulo '$displaypath'"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:684
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Caminho de submódulo '$displaypath': '$sha1' extraído"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:688
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Não foi possível efetuar rebase de '$sha1' no caminho de submódulo "
 "'$displaypath'"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:689
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Caminho de submódulo '$displaypath': rebase concluído em '$sha1'"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:694
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Não é possível integrar '$sha1' no caminho de submódulo '$displaypath'"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:695
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Caminho de submódulo '$displaypath': integrado em '$sha1'"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:700
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "Falha ao executar '$command $sha1' no caminho de submódulo '$displaypath'"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:701
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Caminho de submódulo '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:732
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Falha ao percorrer o caminho de submódulo '$displaypath'"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 msgid "The --cached option cannot be used with the --files option"
 msgstr "A opção --cached não pode ser usada com a opção --files"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:892
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "modo inesperado $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Aviso: $display_name não contém o commit $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:915
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Warn: $display_name não contém o commit $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:918
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Warn: $display_name contém os commits $sha1_src e $sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1064
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Falha ao percorrer recursivamente o caminho de submódulo '$sm_path'"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1136
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "A sincronizar o URL do submódulo '$displaypath'"
@@ -13326,12 +14954,12 @@ msgstr "A sincronizar o URL do submódulo '$displaypath'"
 msgid "See git-${cmd}(1) for details."
 msgstr "Consulte git-${cmd}(1) para obter mais detalhes."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "A rebasear ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13357,7 +14985,7 @@ msgstr ""
 "\n"
 "Estas linhas pode ser reordenadas; são executadas de cima para baixo.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13365,7 +14993,7 @@ msgstr ""
 "\n"
 "Não remover nenhum linha. Use 'drop' explicitamente para remover um commit.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
@@ -13373,7 +15001,7 @@ msgstr ""
 "\n"
 "Se remover uma linha daqui AQUELE COMMIT SERÁ PERDIDO.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13392,87 +15020,83 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: não é um commit que se possa apanhar"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Nome de commit inválido: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "Não é possível escrever o sha1 substituto do commit"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Avanço-rápido para $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "Não é possível avançar rapidamente para $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "Não é possível mover HEAD para $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "Recusa-se a esmagar uma integração: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Erro ao refazer integração $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "Não foi possível apanhar $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Esta é a mensagem de commit nº${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "A mensagem de commit nº${n} será ignorada:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Isto é a combinação de $count commit."
 msgstr[1] "Isto é a combinação de $count commits."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "Não é possível escrever $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "Isto é a combinação de 2 commits."
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
-msgstr "Esta é a 1ª mensagem de commit:"
-
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "Não foi possível aplicar $sha1... $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13489,31 +15113,31 @@ msgstr ""
 "poder\n"
 "reformular a mensagem do commit."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "Parou em $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "Não é possível efetuar '$squash_style' sem um commit anterior"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "A executar: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "Falha ao executar: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "e fez alterações ao índice e/ou à árvore de trabalho"
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13524,7 +15148,7 @@ msgstr ""
 "\tgit rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13539,25 +15163,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Comando desconhecido: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Corrija-o usando 'git rebase --edit-todo'."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "$head_name rebaseado e atualizado com sucesso."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
 msgstr "Não foi possível saltar comandos pick desnecessários"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13566,7 +15190,7 @@ msgstr ""
 "Aviso: falta o SHA-1 ou a seguinte linha não tem um commit:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13575,11 +15199,11 @@ msgstr ""
 "Aviso: o comando não é reconhecido na seguinte linha:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "não foi possível destacar HEAD"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13587,7 +15211,7 @@ msgstr ""
 "Aviso: alguns commits podem ter sido descartados acidentalmente.\n"
 "Commits descartados (mais novo para o mais velho):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13601,7 +15225,7 @@ msgstr ""
 "Use 'git config rebase.missingCommitsCheck' para mudar o nível de avisos.\n"
 "O comportamentos possíveis são: ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
@@ -13610,19 +15234,23 @@ msgstr ""
 "Definição $check_level desconhecida da opção rebase.missingCommitsCheck. "
 "Ignorado."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Pode corrí-lo com 'git rebase --edit-todo'."
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Pode corrí-lo com 'git rebase --edit-todo' e depois executar 'git rebase --"
+"continue'."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "Ou pode abortar o rebase com 'git rebase --abort'."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1083
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "Não foi possível remover CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1088
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13635,7 +15263,7 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
@@ -13653,11 +15281,11 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1105
 msgid "Error trying to find the author identity to amend commit"
 msgstr "Erro ao tentar encontrar a identidade do autor para emendar o commit"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1110
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
@@ -13665,11 +15293,11 @@ msgstr ""
 "Tem alterações por submeter na árvore de trabalho. Submeta-as primeiro\n"
 "e execute 'git rebase --continue' de novo."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
 msgid "Could not commit staged changes."
 msgstr "Não foi possível submeter as alterações preparadas."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1147
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13683,44 +15311,40 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
 msgid "Could not execute editor"
 msgstr "Não foi possível executar o editor"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Primeiro tem de definir a sua informação de committer"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1168
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "Não foi possível extrair $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1173
 msgid "No HEAD?"
 msgstr "Sem HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1174
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "Não foi possível criar $state_dir temporário"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1176
 msgid "Could not mark as interactive"
 msgstr "Não foi possível marcar como interativo"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
 msgid "Could not init rewritten commits"
 msgstr "Não foi possível inicializar commits reescritos"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1291
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Rebase $shortrevisions sobre $shortonto ($todocount comando)"
 msgstr[1] "Rebase $shortrevisions sobre $shortonto ($todocount comandos)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1296
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
@@ -13730,7 +15354,7 @@ msgstr ""
 "No entanto, se remover tudo, o rebase será abortado.\n"
 "\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1303
 msgid "Note that empty commits are commented out"
 msgstr "Note que commits vazios são comentados"
 
@@ -13758,6 +15382,10 @@ msgstr "Não é possível rebasear: tem alterações não preparadas."
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr "Não é possível reescrever ramos: tem alterações não preparadas."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "Não é possível puxar com rebase: tem alterações não preparadas."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13767,12 +15395,21 @@ msgstr "Não é possível efetuar $action: tem alterações não preparadas."
 msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr "Não é possível rebasear: o índice contém alterações não submetidas."
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"Não é possível puxar com rebase: o índice contém alterações não submetidas."
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr ""
 "Não é possível efetuar $action: o índice contém alterações não submetidas."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Além disso, o índice contém alterações não submetidas."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr ""
@@ -13782,6 +15419,1013 @@ msgstr ""
 msgid "Unable to determine absolute path of git directory"
 msgstr "Não é possível determinar o caminho absoluto do diretório git"
 
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%12s %12s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "preparado"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "não preparado"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "binário"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "nada"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "não alterado"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "%d caminho adicionar\n"
+msgstr[1] "%d caminhos adicionados\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "%d caminho atualizado\n"
+msgstr[1] "%d caminhos atualizados\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "%d caminho revertido\n"
+msgstr[1] "%d caminhos revertidos\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "%d caminho afetado\n"
+msgstr[1] "%d caminhos afetados\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "Atualizar"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "Reverter"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "nota: %s é agora não controlado.\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "Adicionar não controlados"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "Nenhum ficheiros não controlado.\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"Se o patch se aplicar corretamente, o excerto editado será marcado\n"
+"como preparado imediatamente."
+
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr ""
+"Se o patch se aplicar corretamente, o excerto editado será marcado\n"
+"como escondido imediatamente."
+
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr ""
+"Se o patch se aplicar corretamente, o excerto editado será marcado\n"
+"como não preparado imediatamente."
+
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"Se o patch se aplicar corretamente, o excerto editado será marcado\n"
+"para ser aplicado imediatamente."
+
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr ""
+"Se o patch se aplicar corretamente, o excerto editado será marcado\n"
+"para ser descartado imediatamente."
+
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr ""
+"não foi possível abrir o ficheiro de edição do excerto para escrita: %s"
+
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr "Modo de edição manual de excerto -- ver guia rápido abaixo no final.\n"
+
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"Para remover linhas '%s', torne-as linhas ' ' (contexto).\n"
+"Para remover linhas '%s', elimine-as.\n"
+"Linhas começadas com %s serão removidas.\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"Se não se aplicar corretamente, ser-lhe-á dada oportunidade para editar\n"
+"de novo.  Se todas as linhas do excerto forem removidas, a edição é\n"
+"abortada e o exceto é deixado inalterado.\n"
+
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr ""
+"não foi possível abrir o ficheiro de edição do excerto para leitura: %s"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr ""
+"O excerto que editou não aplica.\n"
+"Edite de novo (responder \"não\" descarta!) [y/n]? "
+
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - preparar este excerto\n"
+"n - não preparar este excerto\n"
+"q - sair; não preparar este excerto nem os restantes\n"
+"a - preparar este excerto e todos os excertos seguintes no ficheiro\n"
+"d - não preparar este excerto nem os excertos seguintes no ficheiro"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - esconder este excerto\n"
+"n - não esconder este excerto\n"
+"q - sair; não esconder este excerto nem os restantes\n"
+"a - esconder este excerto e todos os seguintes no ficheiro\n"
+"d - não esconder este excerto nem os excertos seguintes no ficheiro"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - despreparar este excerto\n"
+"n - não despreparar este excerto\n"
+"q - sair; não despreparar este excerto nem outros restantes\n"
+"a - despreparar este excerto e todos os excertos seguintes no ficheiro\n"
+"d - não despreparar este excerto nem os excertos seguintes no ficheiro"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - aplicar este excerto ao índice\n"
+"n - não aplicar este excerto ao índice\n"
+"q - sair; não aplicar este excerto nem os restantes\n"
+"a - aplicar este excerto e todos os excertos seguintes no ficheiro\n"
+"d - não aplicar este excerto nem os excertos seguintes no ficheiro"
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - descartar este excerto da árvore de trabalho\n"
+"n - não descartar este excerto da árvore de trabalho\n"
+"q - sair; não descartar este excerto nem os restantes\n"
+"a - descartar este excerto e todos os excertos seguintes no ficheiro\n"
+"d - não descartar este excerto nem os excertos seguintes no ficheiro"
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - descartar este excerto do índice e da árvore de trabalho\n"
+"n - não descartar este excerto do índice nem da árvore de trabalho\n"
+"q - sair; não descartar este excerto nem nenhum dos restantes\n"
+"a - descartar este excerto e todos os excertos seguintes no ficheiro\n"
+"d - não descartar este excerto nem os excertos seguintes no ficheiro"
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - aplicar este excerto ao índice e à árvore de trabalho\n"
+"n - não aplicar este excerto ao índice e à árvore de trabalho\n"
+"q - sair; não aplicar este excerto ou restantes\n"
+"a - aplicar este excerto e todos os excertos seguintes no ficheiro\n"
+"d - não aplicar este excerto nem os excertos seguintes no ficheiro"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g - selecionar um excerto para ir\n"
+"/ - procurar por um excerto correspondendo à regex dada\n"
+"j - deixar este excerto indecidido, ver excerto seguinte indecidido\n"
+"J - deixar este excerto indecidido, ver excerto seguinte\n"
+"k - deixar este excerto indecidido, ver excerto anterior indecidido\n"
+"K - deixar este excerto indecidido, ver excerto anterior\n"
+"s - dividir o excerto atual em excertos mais pequenos\n"
+"e - editar manualmente o excerto atual\n"
+"? - imprimir ajuda\n"
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "Os excertos selecionados não aplicam ao índice!\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "Aplicá-los à árvore de trabalho mesmo assim? "
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "Não foi aplicado nada.\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "ignorado não integrado: %s\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "Apenas ficheiros binários alterados.\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "Sem alterações.\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "Atualizar patch"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Preparar alteração de modo [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Preparar eliminação [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Preparar este excerto [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Esconder alteração de modo [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Esconder eliminação [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Esconder este excerto [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Não preparar alteração de modo [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Não preparar eliminação [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Não preparar este excerto [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "Aplicar alteração de modo ao índice [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "Aplicar eliminação ao índice [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "Aplicar este excerto ao índice [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Descartar alteração de modo da árvore de trabalho [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Descartar eliminação da árvore de trabalho [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Descartar este excerto da árvore de trabalho [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Descartar alteração de modo do índice e da árvore de trabalho [y,n,q,a,d,/"
+"%s,?]? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Descartar eliminação do índice e da árvore de trabalho [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Descartar este excerto do índice e da árvore de trabalho [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Aplicar alteração de modo ao índice e à árvore de trabalho [y,n,q,a,d,/"
+"%s,?]? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Aplicar eliminação ao índice e à árvore de trabalho [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Aplicar este excerto ao índice e à árvore de trabalho [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "ir para que excerto (<ret> para ver mais)? "
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "ir para que excerto? "
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "Número inválido: '%s'\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "Lamento, apenas %d excerto disponível.\n"
+msgstr[1] "Lamento, apenas %d excertos disponíveis.\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "procurar por regex? "
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "Regexp de pesquisa malformada %s: %s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "Nenhum excerto corresponde ao padrão fornecido\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "Nenhum excerto anterior\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "Nenhum excerto seguinte\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "Dividir em %d excerto.\n"
+msgstr[1] "Dividir em %d excertos.\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "Rever diff"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        - mostrar caminhos com alterações\n"
+"update        - adicionar o estado da árvore de trabalho ao conjunto de "
+"alterações preparadas\n"
+"revert        - reverter conjunto de alterações preparadas de volta à versão "
+"de HEAD\n"
+"patch         - escolher excertos e atualizar seletivamente\n"
+"diff          - ver diff entre HEAD e índice\n"
+"add untracked - adicionar conteúdos de ficheiros não controlados ao conjunto "
+"de alterações preparadas\n"
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "falta --"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "Mode de --patch desconhecido: %s"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "argumento inválido %s, esperava-se --"
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr "a zona local difere de GMT por um intervalo não arrendado ao minuto\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "a diferença de tempo local é maior ou igual a 24 horas\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "o editor saiu com erros, abortar tudo"
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr "'%s' contém uma versão intermédia do e-mail que esteve a compor.\n"
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "'%s.final' contém o e-mail composto.\n"
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-aliases incompatível com outras opções\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "Não é possível executar git format-patch fora de um repositório\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "Campo de --suppress-cc desconhecido: '%s'\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "Definidição --confirm desconhecida: '%s'\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr "aviso: sendmail alias com aspas não é suportado: %s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "aviso: `:include:` não suportado: %s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr "aviso: `/file` ou redireção `|pipe` não suportado: %s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "aviso: linha sendmail não é reconhecida: %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+"O ficheiro '%s' existe mas também pode ser um intervalo de commits\n"
+"para os quais produzir patches.  Por favor desambigue...\n"
+"\n"
+"    * Dizendo \"./%s\" se pretende um ficheiro; ou\n"
+"    * Passando a opção --format-patch se pretende um intervalo de commits.\n"
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "Falha ao abrir diretório %s: %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"fatal: %s: %s\n"
+"aviso: nenhum patch foi enviado\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"Nenhum ficheiro patch especificado!\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "Nenhum linha de assunto em %s?"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "Falha ao abrir %s para escrita: %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+"Linhas começadas com \"GIT:\" serão removidos.\n"
+"Considere incluir um diffstat geral ou tabela de conteúdos\n"
+"do patch que está a escrever.\n"
+"\n"
+"Apague o conteúdo do corpo se não deseja enviar um sumário.\n"
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "Falha ao abrir %s.final: %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "Falha ao abrir %s: %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr "Os campos To/Cc/Bcc não são interpretados ainda, foram ignorados\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "O e-mail de sumário está vazio, saltá-lo à frente\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "Tem a certeza que quer usar <%s> [y/N]? "
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr ""
+"Os seguintes ficheiros são 8bit, mas não declaram um Content-Transfer-"
+"Encoding.\n"
+
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "Que codificação 8bit se deve declarar [UTF-8]? "
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+"Recusar envio porque o patch\n"
+"\t%s\n"
+"tem o assunto modelo '*** SUBJECT HERE ***'. Passe --force se pretende mesmo "
+"enviar.\n"
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "Para quem devem ser enviados os e-mails (se alguém)?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "fatal: alias '%s' expande para si próprio\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr ""
+"Message-ID para ser usado como In-Reply-To para o primeiro e-mail (se "
+"algum)? "
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "erro: não é possível extrair um endereço válido de: %s\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr "O que fazer com este endereço? ([q]uit|[d]rop|[e]dit): "
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "O caminho de CA '%s' não existe"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+"    A lista de Cc acima foi expandida com endereços\n"
+"    adicionais encontrados na mensagem de commit do patch.\n"
+"    Por omissão send-email pergunta antes de enviar quando\n"
+"    isto ocorre. Este comportamento é controlado pela definição\n"
+"    de configuração sendemail.confirm.\n"
+"\n"
+"    Para informação adicional, execute 'git send-email --help'.\n"
+"    Para reter o comportamento atual, mas suprimir esta mensagem,\n"
+"    execute 'git config --global sendemail.confirm auto'.\n"
+"\n"
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "Enviar este e-mail? ([y]es|[n]o|[q]uit|[a]ll): "
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "É necessária resposta se deseja enviar este e-mail"
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "O servidor SMTP necessário não está definido corretamente."
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "O servidor não suporta STARTTLS! %s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr ""
+"Não é possível inicializar SMTP devidamente. Verifique a configuração e use "
+"--smtp-debug."
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "Falha ao enviar %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "Simulado-Enviado %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "Enviado %s\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "Simulado-OK. O registo diz:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "OK. O registo diz:\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "Resultado: "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "Resultado: OK\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "não é possível abrir o ficheiro %s"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) Adicionar cc: %s da linha '%s'\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) Adicionar para: %s da linha '%s'\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(non-mbox) Adicionar cc: %s da linha '%s'\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(body) Adicionar cc: %s da linha '%s'\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) Não foi possível executar '%s'"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) Adicionar %s: %s de: '%s'\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) falha ao fechar pipe para '%s'"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "não é possível enviar mensagem como 7bit"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "codificação de transferência inválida"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "não é possível abrir %s: %s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s: o patch contém uma linha mais longa que 998 carateres"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "Saltar %s com sufixo de backup '%s'.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "Deseja mesmo enviar %s? [y|N]: "
+
+#~ msgid ""
+#~ "There is nothing to exclude from by :(exclude) patterns.\n"
+#~ "Perhaps you forgot to add either ':/' or '.' ?"
+#~ msgstr ""
+#~ "Não há nada para excluir de acordo com o padrão :(excluir).\n"
+#~ "Talvez se tenha esquecido de acrescentar ':/' ou '.' ?"
+
+#~ msgid "unrecognized format: %%(%s)"
+#~ msgstr "formato não reconhecido: %%(%s)"
+
+#~ msgid ":strip= requires a positive integer argument"
+#~ msgstr ":strip= requer um inteiro positivo como argumento"
+
+#~ msgid "ref '%s' does not have %ld components to :strip"
+#~ msgstr "a referência '%s' não tem %ld componentes como se indica em :strip"
+
+#~ msgid "unknown %.*s format %s"
+#~ msgstr "formato de %.*s desconhecido %s"
+
+#~ msgid "[%s: gone]"
+#~ msgstr "[%s: desaparecido]"
+
+#~ msgid "[%s]"
+#~ msgstr "[%s]"
+
+#~ msgid "[%s: behind %d]"
+#~ msgstr "[%s: atrás %d]"
+
+#~ msgid "[%s: ahead %d]"
+#~ msgstr "[%s: à frente %d]"
+
+#~ msgid "[%s: ahead %d, behind %d]"
+#~ msgstr "[%s: à frente %d, atrás %d]"
+
+#~ msgid " **** invalid ref ****"
+#~ msgstr " **** referências inválida ****"
+
+#~ msgid "insanely long object directory %.*s"
+#~ msgstr "diretório de objetos demasiado longo %.*s"
+
+#~ msgid "git merge [<options>] <msg> HEAD <commit>"
+#~ msgstr "git merge [<opções>] <msg> HEAD <commit>"
+
+#~ msgid "'%s' is not a commit"
+#~ msgstr "'%s' não é um commit"
+
+#~ msgid "cannot open file '%s'"
+#~ msgstr "não é possível abrir o ficheiro '%s'"
+
+#~ msgid "could not close file %s"
+#~ msgstr "não é possível fechar o ficheiro %s"
+
+#~ msgid "tag name too long: %.*s..."
+#~ msgstr "o nome da tag é demasiado longo: %.*s..."
+
+#~ msgid "tag header too big."
+#~ msgstr "cabeçalho da tag demasiado longo."
+
+#~ msgid ""
+#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "marked for discarding"
+#~ msgstr ""
+#~ "Se o patch se aplicar corretamente, o excerto editado será marcado\n"
+#~ "para ser descartado imediatamente."
+
+#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
+#~ msgstr ""
+#~ "Usar uma heurística experimental baseada em linhas brancas para melhorar "
+#~ "diffs"
+
+#~ msgid "Clever... amending the last one with dirty index."
+#~ msgstr "Inteligente... a emendar o último commit com o índice sujo."
+
+#~ msgid ""
+#~ "the following submodule (or one of its nested submodules)\n"
+#~ "uses a .git directory:"
+#~ msgid_plural ""
+#~ "the following submodules (or one of their nested submodules)\n"
+#~ "use a .git directory:"
+#~ msgstr[0] ""
+#~ "o submódulo seguinte (ou um dos seus submódulos aninhados)\n"
+#~ "usa um diretório .git:"
+#~ msgstr[1] ""
+#~ "os submódulos seguintes (ou um dos seus submódulos)\n"
+#~ "usam um diretório .git:"
+
+#~ msgid ""
+#~ "\n"
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "\n"
+#~ "(use 'rm -rf' se pretende mesmo removê-lo, incluindo todo o seu histórico)"
+
+#~ msgid "Could not write to %s"
+#~ msgstr "Não foi possível escrever em %s"
+
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Erro ao rematar %s."
+
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "As suas alterações locais serão substituídas por cherry-pick."
+
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Não é possível reverter durante outra reversão."
+
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr ""
+#~ "Não é possível efetuar cherry-pick durante outro cherry-pick. durante um "
+#~ "cherry-pick."
+
+#~ msgid "Could not parse line %d."
+#~ msgstr "Não foi possível analisar a linha %d."
+
+#~ msgid "Could not open %s"
+#~ msgstr "Não foi possível abrir %s"
+
+#~ msgid "Could not read %s."
+#~ msgstr "Não foi possível ler %s."
+
+#~ msgid "Could not format %s."
+#~ msgstr "Não foi possível formatar %s."
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "cannot open %s: %s"
+#~ msgstr "não é possível abrir %s: %s"
+
+#~ msgid "You need to set your committer info first"
+#~ msgstr "Primeiro tem de definir a sua informação de committer"
+
 #~ msgid "bad numeric config value '%s' for '%s': invalid unit"
 #~ msgstr ""
 #~ "valor numérico '%s' da configuração '%s' incorreto: unidade inválida"
@@ -13926,9 +16570,6 @@ msgstr "Não é possível determinar o caminho absoluto do diretório git"
 #~ msgid "could not open %s for writing"
 #~ msgstr "não foi possível abrir %s para escrita"
 
-#~ msgid "read of %s failed"
-#~ msgstr "falha ao ler %s"
-
 #~ msgid "could not write branch description template"
 #~ msgstr "não foi possível escrever o modelo da descrição do ramo"
 
@@ -13956,9 +16597,6 @@ msgstr "Não é possível determinar o caminho absoluto do diretório git"
 #~ msgid "Verify that the named commit has a valid GPG signature"
 #~ msgstr "verificar se o commit tem uma assinatura GPG válida"
 
-#~ msgid "Could not write to '%s'"
-#~ msgstr "Não foi possível escrever em '%s'"
-
 #~ msgid "Writing SQUASH_MSG"
 #~ msgstr "A escrever SQUASH_MSG"
 
@@ -14013,12 +16651,6 @@ msgstr "Não é possível determinar o caminho absoluto do diretório git"
 #~ msgid "unable to access '%s': %s"
 #~ msgstr "não é possível aceder a '%s': %s"
 
-#~ msgid "could not open '%s' for reading: %s"
-#~ msgstr "não foi possível abrir '%s' para leitura: %s"
-
-#~ msgid "could not open '%s' for writing: %s"
-#~ msgstr "não foi possível abrir '%s' para escrita: %s"
-
 #~ msgid "    git branch -d %s\n"
 #~ msgstr "    git branch -d %s\n"
 
@@ -14120,9 +16752,6 @@ msgstr "Não é possível determinar o caminho absoluto do diretório git"
 #~ "Migrar commits locais para a cabeça atualizada em relação ao ramo a "
 #~ "montante"
 
-#~ msgid " 0 files changed\n"
-#~ msgstr " 0 ficheros modificados\n"
-
 #~ msgid " %d file changed"
 #~ msgid_plural " %d files changed"
 #~ msgstr[0] " %d ficheiro modificado"
@@ -14171,8 +16800,5 @@ msgstr "Não é possível determinar o caminho absoluto do diretório git"
 #~ msgid "--"
 #~ msgstr "--"
 
-#~ msgid "cherry-pick"
-#~ msgstr "cherry-pick"
-
 #~ msgid "Please enter the commit message for your changes."
 #~ msgstr "Por favor insira a mensagem de commit das suas alterações."
index 7feffd0712e82fe3c69a177b769b13c33fddb71f..a92ddcf08df3ea4a47105c281a10ba83d8c1468f 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git Russian Localization Project\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-05-24 23:42+0800\n"
-"PO-Revision-Date: 2016-06-30 13:28+0000\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-28 23:58+0000\n"
 "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n"
 "MIME-Version: 1.0\n"
@@ -25,3457 +25,4227 @@ msgstr ""
 msgid "hint: %.*s\n"
 msgstr "подсказка: %.*s\n"
 
-#: advice.c:88
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
+msgstr "Невозможно выполнить копирование коммита в текущую ветку, так как у вас имеются не слитые файлы."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr "Невозможно закоммитить, так как у вас имеются не слитые файлы."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+msgstr "Невозможно выполнить слияние, так как у вас имеются не слитые файлы."
+
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
+msgstr "Невозможно выполнить получение, так как у вас имеются не слитые файлы."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+msgstr "Невозможно обратить изменения, так как у вас имеются не слитые файлы."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr "Невозможно выполнить %s, так как у вас имеются не слитые файлы."
+
+#: advice.c:101
 msgid ""
 "Fix them up in the work tree, and then use 'git add/rm <file>'\n"
 "as appropriate to mark resolution and make a commit."
 msgstr "Исправьте их в рабочем каталоге, затем запустите «git add/rm <файл>»,\nчтобы пометить исправление и сделайте коммит."
 
-#: advice.c:101 builtin/merge.c:1238
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
+msgstr "Выход из-за неразрешенного конфликта."
+
+#: advice.c:114 builtin/merge.c:1181
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Вы не завершили слияние (присутствует файл MERGE_HEAD)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Перед слиянием, выполните коммит ваших изменений."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
 msgstr "Выход из-за незавершенного слияния."
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<опции>] <указатель-дерева> [<путь>…]"
-
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
-
-#: archive.c:14
+#: advice.c:123
+#, c-format
 msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> "
-"[<path>...]"
-msgstr "git archive --remote <репозиторий> [--exec <команда>] [<опции>] <указатель-дерева> [<путь>…]"
-
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <репозиторий> [--exec <команда>] --list"
+"Note: checking out '%s'.\n"
+"\n"
+"You are in 'detached HEAD' state. You can look around, make experimental\n"
+"changes and commit them, and you can discard any commits you make in this\n"
+"state without impacting any branches by performing another checkout.\n"
+"\n"
+"If you want to create a new branch to retain commits you create, you may\n"
+"do so (now or later) by using -b with the checkout command again. Example:\n"
+"\n"
+"  git checkout -b <new-branch-name>\n"
+"\n"
+msgstr "Примечание: переход на «%s».\n\nВы сейчас в состоянии «отделённого HEAD». Вы можете осмотреться, сделать\nэкспериментальные изменения и закоммитить их, также вы можете отменить\nизменения любых коммитов в этом состоянии не затрагивая любые ветки и\nне переходя на них.\n\nЕсли вы хотите создать новую ветку и сохранить свои коммиты, то вы\nможете сделать это (сейчас или позже) вызвав команду checkout снова,\nно с параметром -b. Например:\n\n  git checkout -b <имя-новой-ветки>\n\n"
 
-#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
+#: apply.c:57
 #, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "спецификация пути «%s» не соответствует ни одному файлу"
-
-#: archive.c:429
-msgid "fmt"
-msgstr "формат"
-
-#: archive.c:429
-msgid "archive format"
-msgstr "формат архива"
+msgid "unrecognized whitespace option '%s'"
+msgstr "неопознанная опция для пробелов «%s»"
 
-#: archive.c:430 builtin/log.c:1395
-msgid "prefix"
-msgstr "префикс"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "неопознанная опция для игнорирования пробелов «%s»"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "добавлять префикс перед каждым путем файла в архиве"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject и --3way нельзя использовать одновременно."
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2548
-#: builtin/blame.c:2549 builtin/config.c:60 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:722 builtin/hash-object.c:100
-#: builtin/ls-files.c:459 builtin/ls-files.c:462 builtin/notes.c:398
-#: builtin/notes.c:561 builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "файл"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached и --3way нельзя использовать одновременно."
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "запись архива в этот файл"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way вне репозитория"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "читать .gitattributes в рабочем каталоге"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index вне репозитория"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "отчет об архивированных файлах в stderr"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached вне репозитория"
 
-#: archive.c:437
-msgid "store only"
-msgstr "только хранение"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Не удалось подготовить регулярное выражение для метки времени %s"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "сжимать быстрее"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec возвратил %d для ввода: %s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "сжимать лучше"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "не удалось найти имя файла в строке патча %d"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "перечислить поддерживаемые форматы архивов"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr "git apply: плохой git-diff — ожидалось /dev/null, получено %s на строке %d"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:776
-msgid "repo"
-msgstr "репозиторий"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr "git apply: плохой git-diff — не согласующееся новое имя файла на строке %d"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "получить архив из внешнего <репозитория>"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr "git apply: плохой git-diff — не согласующееся старое имя файла на строке %d"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "команда"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: плохой git-diff  — ожидалось /dev/null на строке %d"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "путь к команде git-upload-archive на машине с внешним репозиторием"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: не ожидаемая строка: %.*s"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr "Отрицающие шаблоны в атрибутах git игнорируются.\nИспользуйте «\\!» для буквального использования символа в значении «восклицательный знак»."
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "фрагмент изменений без заголовка на строке %d: %.*s"
 
-#: branch.c:53
+#: apply.c:1577
 #, c-format
 msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr "\nПосле исправления причины ошибки,\nвы можете исправить информацию об отслеживаемой\nвнешней ветке, с помощью команды\n«git branch --set-upstream-to=%s%s%s»."
+"git diff header lacks filename information when removing %d leading pathname"
+" component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname"
+" components (line %d)"
+msgstr[0] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущего компонента пути к файлу (строка %d)"
+msgstr[1] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
+msgstr[2] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
+msgstr[3] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
 
-#: branch.c:67
+#: apply.c:1589
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Ð\9dе Ñ\83Ñ\81Ñ\82анавливаÑ\8e Ð²ÐµÑ\82кÑ\83 %s, Ñ\82ак Ñ\82ак Ð¾Ð½Ð° Ð¿Ñ\80инадлежиÑ\82 Ð²Ñ\8bÑ\88еÑ\81Ñ\82оÑ\8fÑ\89емÑ\83 Ñ\80епозиÑ\82оÑ\80иÑ\8e."
+msgid "git diff header lacks filename information (line %d)"
+msgstr "заголовок git diff Ð½Ðµ Ñ\81одеÑ\80жиÑ\82 Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ð¾Ð± Ð¸Ð¼ÐµÐ½Ð¸ Ñ\84айла (Ñ\81Ñ\82Ñ\80ока %d)"
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr "Ветка %s отслеживает внешнюю ветку %s из %s перемещением."
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "новый файл зависит от старого содержимого"
 
-#: branch.c:94
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Ветка %s отслеживает внешнюю ветку %s из %s."
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "удаленный файл все еще имеет содержимое"
 
-#: branch.c:98
+#: apply.c:1795
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 %s Ð¿ÐµÑ\80емеÑ\89ением."
+msgid "corrupt patch at line %d"
+msgstr "паÑ\82Ñ\87 Ð¿Ð¾Ð²Ñ\80ежден Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
 
-#: branch.c:99
+#: apply.c:1832
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 %s."
+msgid "new file %s depends on old contents"
+msgstr "новÑ\8bй Ñ\84айл %s Ð·Ð°Ð²Ð¸Ñ\81иÑ\82 Ð¾Ñ\82 Ñ\81Ñ\82аÑ\80ого Ñ\81одеÑ\80жимого"
 
-#: branch.c:104
+#: apply.c:1834
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Ветка %s отслеживает внешнюю ссылку %s перемещением."
+msgid "deleted file %s still has contents"
+msgstr "удаленный файл %s все еще имеет содержимое"
 
-#: branch.c:105
+#: apply.c:1837
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Ветка %s отслеживает внешнюю ссылку %s."
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** предупреждение: файл %s становится пустым, но не удаляется"
 
-#: branch.c:109
+#: apply.c:1984
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s Ð¿ÐµÑ\80емеÑ\89ением."
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "повÑ\80ежденнÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d: %.*s"
 
-#: branch.c:110
+#: apply.c:2021
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Ветка %s отслеживает локальную ссылку %s."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Не удалось записать настройки вышестоящей ветки"
+msgid "unrecognized binary patch at line %d"
+msgstr "неопознанный двоичный патч на строке %d"
 
-#: branch.c:156
+#: apply.c:2182
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Ð\9dе Ð¾Ñ\82Ñ\81леживаеÑ\82Ñ\81Ñ\8f: Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ\87наÑ\8f Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð´Ð»Ñ\8f Ñ\81Ñ\81Ñ\8bлки %s"
+msgid "patch with only garbage at line %d"
+msgstr "паÑ\82Ñ\87 Ñ\81 Ð¼Ñ\83Ñ\81оÑ\80ом Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
 
-#: branch.c:185
+#: apply.c:2274
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "«%s» не является действительным именем ветки."
+msgid "unable to read symlink %s"
+msgstr "не удалось прочитать символьную ссылку %s"
 
-#: branch.c:190
+#: apply.c:2278
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Ð\92еÑ\82ка Ñ\81 Ð¸Ð¼ÐµÐ½ÐµÐ¼ Â«%s» Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82."
+msgid "unable to open or read %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¿Ñ\80оÑ\87еÑ\81Ñ\82Ñ\8c %s"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Не удалось принудительно обновить текущую ветку."
+#: apply.c:2931
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "неправильное начало строки: «%c»"
 
-#: branch.c:218
+#: apply.c:3050
 #, c-format
-msgid ""
-"Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr "Не удалось настроить информацию отслеживания; стартовая точка «%s» не является веткой."
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "Часть #%d успешно применена на %d (со сдвигом в %d строку)."
+msgstr[1] "Часть #%d успешно применена на %d (со сдвигом в %d строки)."
+msgstr[2] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
+msgstr[3] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
 
-#: branch.c:220
+#: apply.c:3062
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "запÑ\80оÑ\88еннаÑ\8f Ð²ÐµÑ\82ка Ð²Ñ\8bÑ\88еÑ\81Ñ\82оÑ\8fÑ\89его Ñ\80епозиÑ\82оÑ\80иÑ\8f Â«%s» Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Ð\9aонÑ\82екÑ\81Ñ\82 Ñ\81Ñ\83жен Ð´Ð¾ (%ld/%ld), Ñ\87Ñ\82обÑ\8b Ð¿Ñ\80имениÑ\82Ñ\8c Ñ\84Ñ\80агменÑ\82 Ð½Ð° %d Ñ\81Ñ\82Ñ\80оке"
 
-#: branch.c:222
+#: apply.c:3068
+#, c-format
 msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr "\nЕсли вы планируете основывать свою работу на вышестоящей ветке, которая уже существует во внешнем репозитории, вам может потребоваться запустить «git fetch» для ее получения.\n\nЕсли вы планируете отправить новую локальную ветку, которая будет отслеживаться, во внешний репозиторий, вам может потребоваться запустить «git push -u» — чтобы сохранить настройку вышестоящего репозитория для отправки."
+"while searching for:\n"
+"%.*s"
+msgstr "при поиске:\n%.*s"
 
-#: branch.c:266
+#: apply.c:3090
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое Ð¸Ð¼Ñ\8f Ð¾Ð±Ñ\8aекÑ\82а: Â«%s»."
+msgid "missing binary patch data for '%s'"
+msgstr "пÑ\80опÑ\83Ñ\89енÑ\8b Ð´Ð°Ð½Ð½Ñ\8bе Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð°Ñ\82Ñ\87а Ð´Ð»Ñ\8f Â«%s»"
 
-#: branch.c:286
+#: apply.c:3098
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Ð\9dеоднознаÑ\87ное Ð¸Ð¼Ñ\8f Ð¾Ð±Ñ\8aекÑ\82а: Â«%s»."
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr "невозможно Ð²Ñ\8bполниÑ\82Ñ\8c reverse-apply Ð´Ð»Ñ\8f Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð°Ñ\82Ñ\87а, Ð±ÐµÐ· Ð¾Ð±Ñ\80аÑ\89ениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð±Ð»Ð¾ÐºÐ° Â«%s»"
 
-#: branch.c:291
+#: apply.c:3144
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имаÑ\8f Ñ\82оÑ\87ка Ð²ÐµÑ\82ки: Â«%s»."
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "невозможно Ð¿Ñ\80имениÑ\82Ñ\8c Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Â«%s» Ð±ÐµÐ· Ñ\81Ñ\82Ñ\80оки Ñ\81 Ñ\83казанной Ð¿Ð¾Ð»Ð½Ð¾Ð¹ Ð²ÐµÑ\80Ñ\81ией Ð¸Ð½Ð´ÐµÐºÑ\81а"
 
-#: branch.c:345
+#: apply.c:3154
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "«%s» уже находится на «%s»"
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "патч применятся к файлу «%s» (%s), но его текущее содержимое не соотвествует ожидаемому."
 
-#: branch.c:364
+#: apply.c:3162
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "HEAD рабочего каталога %s не обновлён"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "патч применяется к пустому файлу «%s», но файл не пустой"
 
-#: bundle.c:34
+#: apply.c:3180
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "«%s» не похож на файл пакета версии 2"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "не удалось прочитать необходимую посылку %s для «%s»"
 
-#: bundle.c:61
+#: apply.c:3193
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "неопознанный заголовок: %s%s (%d)"
+msgid "binary patch does not apply to '%s'"
+msgstr "не удалось применить двоичный патч к «%s»"
 
-#: bundle.c:87 builtin/commit.c:777
+#: apply.c:3199
 #, c-format
-msgid "could not open '%s'"
-msgstr "не удалось открыть «%s»"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "В репозитории отсутствуют необходимые коммиты:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:627 sequencer.c:1073
-#: builtin/blame.c:2755 builtin/commit.c:1056 builtin/log.c:340
-#: builtin/log.c:863 builtin/log.c:1308 builtin/log.c:1633 builtin/log.c:1875
-#: builtin/merge.c:361 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "сбой инициализации прохода по редакциям"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr "после применения двоичного патча для «%s» был получен неправильный результат (ожидалось %s, получено %s)"
 
-#: bundle.c:185
+#: apply.c:3220
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Пакет содержит эту %d ссылку:"
-msgstr[1] "Пакет содержит эти %d ссылки:"
-msgstr[2] "Пакет содержит эти %d ссылок:"
-msgstr[3] "Пакет содержит эти %d ссылок:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Пакет содержит полную историю."
+msgid "patch failed: %s:%ld"
+msgstr "ошибка применения изменений: %s:%ld"
 
-#: bundle.c:194
+#: apply.c:3342
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Пакет требует эту %d ссылку:"
-msgstr[1] "Пакет требует эти %d ссылки:"
-msgstr[2] "Пакет требует эти %d ссылок:"
-msgstr[3] "Пакет требует эти %d ссылок:"
+msgid "cannot checkout %s"
+msgstr "не удалось переключить состояние на %s"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Не удалось создать объекты пакета"
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
+#, c-format
+msgid "failed to read %s"
+msgstr "не удалось прочитать %s"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "критическая ошибка pack-objects"
+#: apply.c:3398
+#, c-format
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "чтение из «%s» за символической ссылкой"
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "критическая ошибка rev-list"
+#: apply.c:3427 apply.c:3667
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "путь %s был переименован/удален"
 
-#: bundle.c:353
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "ссылка «%s» исключена в соответствии с опциями rev-list"
+msgid "%s: does not exist in index"
+msgstr "%s: нет в индексе"
 
-#: bundle.c:443 builtin/log.c:163 builtin/log.c:1538 builtin/shortlog.c:273
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "неопознанный аргумент: %s"
+msgid "%s: does not match index"
+msgstr "%s: не совпадает с индексом"
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Ð\9eÑ\82клонение Ñ\81озданиÑ\8f Ð¿Ñ\83Ñ\81Ñ\82ого Ð¿Ð°ÐºÐµÑ\82а."
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "в Ñ\80епозиÑ\82оÑ\80ии Ð¾Ñ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ð½ÐµÐ¾Ð±Ñ\85одимÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¾Ð±Ñ\8aекÑ\82 Ð´Ð»Ñ\8f Ð¾Ñ\82каÑ\82а Ðº Ñ\82Ñ\80Ñ\91Ñ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8e."
 
-#: bundle.c:463
+#: apply.c:3557
 #, c-format
-msgid "cannot create '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c Â«%s»"
+msgid "Falling back to three-way merge...\n"
+msgstr "Ð\9eÑ\82каÑ\82 Ðº Ñ\82Ñ\80Ñ\91Ñ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8eâ\80¦\n"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "критическая ошибка index-pack"
+#: apply.c:3573 apply.c:3577
+#, c-format
+msgid "cannot read the current contents of '%s'"
+msgstr "не удалось прочитать текущее содержимое «%s»"
 
-#: color.c:275
+#: apply.c:3589
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "недопÑ\83Ñ\81Ñ\82имое Ð·Ð½Ð°Ñ\87ение Ñ\86веÑ\82а: %.*s"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82каÑ\82иÑ\82Ñ\8cÑ\81Ñ\8f Ðº Ñ\82Ñ\80Ñ\91Ñ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8eâ\80¦\n"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1504
-#: builtin/am.c:2134
+#: apply.c:3603
 #, c-format
-msgid "could not parse %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c %s"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Ð\9fаÑ\82Ñ\87 Ð¿Ñ\80именен Ðº Â«%s» Ñ\81 ÐºÐ¾Ð½Ñ\84ликÑ\82ами.\n"
 
-#: commit.c:42
+#: apply.c:3608
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s не является коммитом!"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Патч применен к «%s» без ошибок.\n"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "память исчерпана"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "патч удаления не удалил содержимое файла"
 
-#: config.c:475 config.c:477
+#: apply.c:3706
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "ошибка в %d строке файла конфигурации в %s %s"
+msgid "%s: wrong type"
+msgstr "%s: неправильный тип"
 
-#: config.c:593
+#: apply.c:3708
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "неправильное числовое значение «%s» для «%s» в %s %s: %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s имеет тип %o, а ожидался %o"
 
-#: config.c:595
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "неправильное числовое значение «%s» для «%s»: %s"
+msgid "invalid path '%s'"
+msgstr "неправильный путь «%s»"
 
-#: config.c:680
+#: apply.c:3917
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "сбой разворачивания пути каталога пользователя: «%s»"
+msgid "%s: already exists in index"
+msgstr "%s: уже содержится в индексе"
 
-#: config.c:761 config.c:772
+#: apply.c:3920
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "неправильный уровень сжатия zlib %d"
+msgid "%s: already exists in working directory"
+msgstr "%s: уже содержится в рабочем каталоге"
 
-#: config.c:890
+#: apply.c:3940
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "недопустимый режим создания объекта: %s"
-
-#: config.c:1228
-msgid "unable to parse command-line config"
-msgstr "не удалось разобрать конфигурацию из командной строки"
-
-#: config.c:1284
-msgid "unknown error occured while reading the configuration files"
-msgstr "произошла неизвестная ошибка при чтении файлов конфигурации"
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o)"
 
-#: config.c:1629
+#: apply.c:3945
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Â«%s» Ð² ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ии Ð¸Ð· ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80оки"
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "новÑ\8bй Ñ\80ежим Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s Ð½Ðµ Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81Ñ\82аÑ\80омÑ\83 Ñ\80ежимÑ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s"
 
-#: config.c:1631
+#: apply.c:3965
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "непÑ\80авилÑ\8cнаÑ\8f Ð¿ÐµÑ\80еменнаÑ\8f ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ии Â«%s» Ð² Ñ\84айле Â«%s» Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "заÑ\82Ñ\80онÑ\83Ñ\82Ñ\8bй Ñ\84айл Â«%s» Ð½Ð°Ñ\85одиÑ\82Ñ\81Ñ\8f Ð·Ð° Ñ\81имволиÑ\87еÑ\81кой Ñ\81Ñ\81Ñ\8bлкой"
 
-#: config.c:1690
+#: apply.c:3969
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s имеет несколько значений"
+msgid "%s: patch does not apply"
+msgstr "%s: не удалось применить патч"
 
-#: config.c:2224
+#: apply.c:3984
 #, c-format
-msgid "could not set '%s' to '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\83Ñ\81Ñ\82ановиÑ\82Ñ\8c Â«%s» Ð² Â«%s»"
+msgid "Checking patch %s..."
+msgstr "Ð\9fÑ\80овеÑ\80ка Ð¿Ð°Ñ\82Ñ\87а %sâ\80¦"
 
-#: config.c:2226
+#: apply.c:4075
 #, c-format
-msgid "could not unset '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81бÑ\80оÑ\81иÑ\82Ñ\8c Ð·Ð½Ð°Ñ\87ение Ð´Ð»Ñ\8f Â«%s»"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "инÑ\84оÑ\80маÑ\86иÑ\8f Ð¾Ð± sha1 Ð¾Ñ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ð¸Ð»Ð¸ Ð±ÐµÑ\81полезна Ð´Ð»Ñ\8f Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8f %s"
 
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Не удалось запустить «git rev-list»"
+#: apply.c:4082
+#, c-format
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "изменен режим для %s, который не находится в текущем HEAD"
 
-#: connected.c:89
-msgid "failed write to rev-list"
-msgstr "сбой записи в rev-list"
+#: apply.c:4085
+#, c-format
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "информация об sha1 отсутствует или бесполезна (%s)."
 
-#: connected.c:96
-msgid "failed to close rev-list's stdin"
-msgstr "сбой закрытия стандартного ввода у rev-list"
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
+#, c-format
+msgid "make_cache_entry failed for path '%s'"
+msgstr "сбой make_cache_entry для пути «%s»"
 
-#: date.c:95
-msgid "in the future"
-msgstr "в будущем"
+#: apply.c:4094
+#, c-format
+msgid "could not add %s to temporary index"
+msgstr "не удалось добавить %s во временный индекс"
 
-#: date.c:101
+#: apply.c:4104
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu секунду назад"
-msgstr[1] "%lu секунды назад"
-msgstr[2] "%lu секунд назад"
-msgstr[3] "%lu секунд назад"
+msgid "could not write temporary index to %s"
+msgstr "не удалось записать временный индкекс в %s"
 
-#: date.c:108
+#: apply.c:4242
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu минуту назад"
-msgstr[1] "%lu минуты назад"
-msgstr[2] "%lu минут назад"
-msgstr[3] "%lu минут назад"
+msgid "unable to remove %s from index"
+msgstr "не удалось удалить %s из индекса"
 
-#: date.c:115
+#: apply.c:4277
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu час назад"
-msgstr[1] "%lu часа назад"
-msgstr[2] "%lu часов назад"
-msgstr[3] "%lu часов назад"
+msgid "corrupt patch for submodule %s"
+msgstr "поврежденный патч для подмодуля %s"
 
-#: date.c:122
+#: apply.c:4283
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu день назад"
-msgstr[1] "%lu дня назад"
-msgstr[2] "%lu дней назад"
-msgstr[3] "%lu дней назад"
+msgid "unable to stat newly created file '%s'"
+msgstr "не удалось выполнить stat для созданного файла «%s»"
 
-#: date.c:128
+#: apply.c:4291
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu неделю назад"
-msgstr[1] "%lu недели назад"
-msgstr[2] "%lu недель назад"
-msgstr[3] "%lu недель назад"
+msgid "unable to create backing store for newly created file %s"
+msgstr "не удалось создать вспомогательный файл для созданного файла %s"
 
-#: date.c:135
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu месяц назад"
-msgstr[1] "%lu месяца назад"
-msgstr[2] "%lu месяцев назад"
-msgstr[3] "%lu месяцев назад"
+msgid "unable to add cache entry for %s"
+msgstr "не удалось создать запись в кэше для %s"
 
-#: date.c:146
+#: apply.c:4338
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu год"
-msgstr[1] "%lu года"
-msgstr[2] "%lu лет"
-msgstr[3] "%lu лет"
+msgid "failed to write to '%s'"
+msgstr "не удалось записать в «%s»"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4342
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s и %lu месяц назад"
-msgstr[1] "%s и %lu месяца назад"
-msgstr[2] "%s и %lu месяцев назад"
-msgstr[3] "%s и %lu месяцев назад"
+msgid "closing file '%s'"
+msgstr "закрытие файла «%s»"
 
-#: date.c:154 date.c:159
+#: apply.c:4412
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu год назад"
-msgstr[1] "%lu года назад"
-msgstr[2] "%lu лет назад"
-msgstr[3] "%lu лет назад"
+msgid "unable to write file '%s' mode %o"
+msgstr "не удалось записать файл «%s» с режимом доступа %o"
 
-#: diffcore-order.c:24
+#: apply.c:4510
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "сбой чтения orderfile «%s»"
+msgid "Applied patch %s cleanly."
+msgstr "Патч %s применен без ошибок."
 
-#: diffcore-rename.c:538
-msgid "Performing inexact rename detection"
-msgstr "Ð\92Ñ\8bполнÑ\8fеÑ\82Ñ\81Ñ\8f Ð½ÐµÑ\82оÑ\87ное Ð¾Ð¿Ñ\80еделение Ð¿ÐµÑ\80еименованиÑ\8f"
+#: apply.c:4518
+msgid "internal error"
+msgstr "внÑ\83Ñ\82Ñ\80еннÑ\8fÑ\8f Ð¾Ñ\88ибка"
 
-#: diff.c:116
+#: apply.c:4521
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  Сбой разбора величины среза (cut-off) у dirstat «%s»\n"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Применение патча %%s с %d отказом…"
+msgstr[1] "Применение патча %%s с %d отказами…"
+msgstr[2] "Применение патча %%s с %d отказами…"
+msgstr[3] "Применение патча %%s с %d отказами…"
 
-#: diff.c:121
+#: apply.c:4532
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "Неизвестный параметр dirstat: «%s»\n"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "усечение имени .rej файла до %.*s.rej"
 
-#: diff.c:225
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Ð\9dеизвеÑ\81Ñ\82ное Ð·Ð½Ð°Ñ\87ениÑ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еменной Â«diff.submodule»: Â«%s»"
+msgid "cannot open %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c %s"
 
-#: diff.c:277
+#: apply.c:4554
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr "Найдены ошибки в переменной «diff.dirstat»:\n%s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Блок №%d применен без ошибок."
 
-#: diff.c:3007
+#: apply.c:4558
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "критическая ошибка при внешнем сравнении, останов на %s"
-
-#: diff.c:3405
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow требует ровно одной спецификации пути"
+msgid "Rejected hunk #%d."
+msgstr "Блок №%d отклонен."
 
-#: diff.c:3568
+#: apply.c:4668
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr "Сбой разбора параметра опции --dirstat/-X :\n%s"
+msgid "Skipped patch '%s'."
+msgstr "Патч «%s» пропущен."
 
-#: diff.c:3582
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Сбой разбора параметра опции --submodule: «%s»"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "не распознанный ввод"
 
-#: dir.c:1823
-msgid "failed to get kernel name and information"
-msgstr "не удалось получить имя ядра и информацию"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "не удалось прочитать файл индекса"
+
+#: apply.c:4833
+#, c-format
+msgid "can't open patch '%s': %s"
+msgstr "не удалось открыть патч «%s»: %s"
+
+#: apply.c:4858
+#, c-format
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "пропущена %d ошибка в пробельных символах"
+msgstr[1] "пропущено %d ошибки в пробельных символах"
+msgstr[2] "пропущено %d ошибок в пробельных символах"
+msgstr[3] "пропущено %d ошибок в пробельных символах"
+
+#: apply.c:4864 apply.c:4879
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d строка добавила ошибки в пробельных символах."
+msgstr[1] "%d строки добавили ошибки в пробельных символах."
+msgstr[2] "%d строк добавили ошибки в пробельных символах."
+msgstr[3] "%d строк добавили ошибки в пробельных символах."
+
+#: apply.c:4872
+#, c-format
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d строка добавлена после исправления ошибок в пробелах."
+msgstr[1] "%d строки добавлено после исправления ошибок в пробелах."
+msgstr[2] "%d строк добавлено после исправления ошибок в пробелах."
+msgstr[3] "%d строки добавлено после исправления ошибок в пробелах."
+
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Не удалось записать новый файл индекса"
+
+#: apply.c:4919 apply.c:4922 builtin/am.c:2277 builtin/am.c:2280
+#: builtin/clone.c:95 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:281 builtin/submodule--helper.c:407
+#: builtin/submodule--helper.c:589 builtin/submodule--helper.c:592
+#: builtin/submodule--helper.c:944 builtin/submodule--helper.c:947
+msgid "path"
+msgstr "путь"
+
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "не применять изменения по указанному пути"
+
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "применять изменения по указанному пути"
+
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "количество"
+
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "удалить <количество> ведущих косых черт из традиционных путей списка изменений"
+
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "игнорировать добавления, сделанные этим патчем"
+
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "вместо применения патча вывести статистику добавлений и удалений для ввода"
+
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "показать количество добавленных и удаленных строк в десятичном представлении"
+
+#: apply.c:4937
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "вместо применения патча вывести статистику изменений для ввода"
+
+#: apply.c:4939
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "вместо применения патча проверить подходит ли он"
+
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "проверить, что патч применяется к текущему индексу"
+
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "применить патч, не изменяя рабочий каталог"
+
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "принять патч, который затрагивает файлы за рабочим каталогом"
+
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "а также применить патч (используйте с --stat/--summary/--check)"
+
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "попытаться сделать трехходовое слияние, если патч не применяется"
+
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr "построить временный индекс, основанный на встроенной информации об индексе"
+
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "пути, отделённые НУЛЕВЫМ символом"
+
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "удостовериться, что по крайней мере <n> строк контекста совпадают"
+
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "действие"
+
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "определять новые или модифицированные строки, у которых есть ошибки в пробельных символах"
+
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "игнорировать изменения в пробельных символах при поиске контекста"
+
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "применить патч с обращением изменений"
+
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "не ожидать как минимум одной строки контекста"
+
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "оставить отклоненные блоки изменений в соответствующих *.rej файлах"
+
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "разрешить перекрывающиеся блоки изменений"
+
+#: apply.c:4974 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1339 builtin/count-objects.c:94 builtin/fsck.c:593
+#: builtin/log.c:1860 builtin/mv.c:110 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "быть многословнее"
+
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "разрешить некорректно определенные пропущенные пустые строки в конце файла"
+
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+msgstr "не доверять количеству строк из заголовка блока изменений"
+
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "корень"
+
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "добавить <корень> спереди ко всем именам файлов"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<опции>] <указатель-дерева> [<путь>…]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> "
+"[<path>...]"
+msgstr "git archive --remote <репозиторий> [--exec <команда>] [<опции>] <указатель-дерева> [<путь>…]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <репозиторий> [--exec <команда>] --list"
+
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "спецификация пути «%s» не соответствует ни одному файлу"
+
+#: archive.c:429
+msgid "fmt"
+msgstr "формат"
+
+#: archive.c:429
+msgid "archive format"
+msgstr "формат архива"
+
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "префикс"
+
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "добавлять префикс перед каждым путем файла в архиве"
+
+#: archive.c:432 builtin/blame.c:2603 builtin/blame.c:2604 builtin/config.c:59
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:723
+#: builtin/hash-object.c:101 builtin/ls-files.c:539 builtin/ls-files.c:542
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:109
+#: parse-options.h:153
+msgid "file"
+msgstr "файл"
+
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "запись архива в этот файл"
+
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "читать .gitattributes в рабочем каталоге"
+
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "отчет об архивированных файлах в stderr"
+
+#: archive.c:437
+msgid "store only"
+msgstr "только хранение"
+
+#: archive.c:438
+msgid "compress faster"
+msgstr "сжимать быстрее"
+
+#: archive.c:446
+msgid "compress better"
+msgstr "сжимать лучше"
+
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "перечислить поддерживаемые форматы архивов"
+
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:85 builtin/clone.c:88
+#: builtin/submodule--helper.c:601 builtin/submodule--helper.c:953
+msgid "repo"
+msgstr "репозиторий"
+
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "получить архив из внешнего <репозитория>"
+
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "команда"
+
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "путь к команде git-upload-archive на машине с внешним репозиторием"
+
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Неожиданная опция --remote"
+
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "Опция --exec может использоваться только вместе с --remote"
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Неожиданная опция --output"
+
+#: archive.c:487
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Неизвестный формат архива «%s»"
+
+#: archive.c:494
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Аргумент не поддерживается для формата «%s»: -%d"
+
+#: attr.c:263
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr "Отрицающие шаблоны в атрибутах git игнорируются.\nИспользуйте «\\!» для буквального использования символа в значении «восклицательный знак»."
+
+#: bisect.c:441
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Не удалось открыть файл «%s»"
+
+#: bisect.c:446
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Плохое содержимое файла «%s»: %s"
+
+#: bisect.c:655
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Невозможно продолжить бинарный поиск!\n"
+
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "Недопустимое имя коммита %s"
+
+#: bisect.c:732
+#, c-format
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr "База слияния %s является плохим коммитом.\nЭто значит, что ошибка была исправлена где-то между %s и [%s].\n"
+
+#: bisect.c:737
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr "База слияния %s является новой.\nСвойство было изменено где-то между %s и [%s].\n"
+
+#: bisect.c:742
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr "База слияния %s является %s.\nЭто значит, что «%s» коммит находится где-то между %s и [%s].\n"
+
+#: bisect.c:750
+#, c-format
+msgid ""
+"Some %s revs are not ancestor of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr "Несколько %s коммитов не являются предками %s коммита.\nВ этом случае git bisect не может работать правильно.\nВозможно, вы перепутали редакции %s и %s местами?\n"
+
+#: bisect.c:763
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr "База слияния между %s и [%s] должно быть пропущена.\nПоэтому мы не можем быть уверены, что первый %s коммит находится между %s и %s.\nНо все же продолжаем поиск."
+
+#: bisect.c:798
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Бинарный поиск: база слияния должна быть проверена\n"
+
+#: bisect.c:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "нужно указать %s редакцию"
+
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "не удалось создать файл «%s»"
+
+#: bisect.c:917
+#, c-format
+msgid "could not read file '%s'"
+msgstr "не удалось прочитать файл «%s»"
+
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "сбой при чтении ссылок двоичного поиска"
+
+#: bisect.c:967
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s была одновременно и %s и %s\n"
+
+#: bisect.c:975
+#, c-format
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr "Тестируемый коммит не найден.\nВозможно, вы начали поиск с указанием неправильного параметра пути?\n"
+
+#: bisect.c:994
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(примерно %d шаг)"
+msgstr[1] "(примерно %d шага)"
+msgstr[2] "(примерно %d шагов)"
+msgstr[3] "(примерно %d шагов)"
+
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Бинарный поиск: %d редакцию осталось проверить после этой %s\n"
+msgstr[1] "Бинарный поиск: %d редакции осталось проверить после этой %s\n"
+msgstr[2] "Бинарный поиск: %d редакций осталось проверить после этой %s\n"
+msgstr[3] "Бинарный поиск: %d редакций осталось проверить после этой %s\n"
+
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr "\nПосле исправления причины ошибки,\nвы можете исправить информацию об отслеживаемой\nвнешней ветке, с помощью команды\n«git branch --set-upstream-to=%s%s%s»."
+
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "Не устанавливаю ветку %s, так так она принадлежит вышестоящему репозиторию."
+
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr "Ветка %s отслеживает внешнюю ветку %s из %s перемещением."
+
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Ветка %s отслеживает внешнюю ветку %s из %s."
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "Ветка %s отслеживает локальную ветку %s перемещением."
+
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "Ветка %s отслеживает локальную ветку %s."
+
+#: branch.c:104
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Ветка %s отслеживает внешнюю ссылку %s перемещением."
+
+#: branch.c:105
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Ветка %s отслеживает внешнюю ссылку %s."
+
+#: branch.c:109
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr "Ветка %s отслеживает локальную ссылку %s перемещением."
+
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "Ветка %s отслеживает локальную ссылку %s."
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Не удалось записать настройки вышестоящей ветки"
+
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Не отслеживается: неоднозначная информация для ссылки %s"
+
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "«%s» не является действительным именем ветки."
+
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "Ветка с именем «%s» уже существует."
+
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Не удалось принудительно обновить текущую ветку."
+
+#: branch.c:218
+#, c-format
+msgid ""
+"Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr "Не удалось настроить информацию отслеживания; стартовая точка «%s» не является веткой."
+
+#: branch.c:220
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "запрошенная ветка вышестоящего репозитория «%s» не существует"
+
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr "\nЕсли вы планируете основывать свою работу на вышестоящей ветке, которая уже существует во внешнем репозитории, вам может потребоваться запустить «git fetch» для ее получения.\n\nЕсли вы планируете отправить новую локальную ветку, которая будет отслеживаться, во внешний репозиторий, вам может потребоваться запустить «git push -u» — чтобы сохранить настройку вышестоящего репозитория для отправки."
+
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "Недопустимое имя объекта: «%s»."
+
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "Неоднозначное имя объекта: «%s»."
+
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "Недопустимая точка ветки: «%s»."
 
-#: dir.c:1942
-msgid "Untracked cache is disabled on this system or location."
-msgstr "Кэш неотслеживаемых файлов отключен на этой системе или в этом месте."
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "«%s» уже находится на «%s»"
 
-#: gpg-interface.c:166 gpg-interface.c:235
-msgid "could not run gpg."
-msgstr "не удалось запустить gpg."
+#: branch.c:363
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD рабочего каталога %s не обновлён"
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg не принял данные"
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "«%s» не похож на файл пакета версии 2"
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg не удалось подписать данные"
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "неопознанный заголовок: %s%s (%d)"
 
-#: gpg-interface.c:222
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "could not create temporary file '%s'"
-msgstr "не удалось создать временный файл «%s»"
+msgid "could not open '%s'"
+msgstr "не удалось открыть «%s»"
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "В репозитории отсутствуют необходимые коммиты:"
+
+#: bundle.c:163 ref-filter.c:1462 sequencer.c:830 sequencer.c:1374
+#: builtin/blame.c:2814 builtin/commit.c:1061 builtin/log.c:348
+#: builtin/log.c:890 builtin/log.c:1340 builtin/log.c:1666 builtin/log.c:1909
+#: builtin/merge.c:356 builtin/shortlog.c:170
+msgid "revision walk setup failed"
+msgstr "сбой инициализации прохода по редакциям"
 
-#: gpg-interface.c:224
+#: bundle.c:185
 #, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr "сбой записи отсоединенной подписи в «%s»"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "Пакет содержит эту %d ссылку:"
+msgstr[1] "Пакет содержит эти %d ссылки:"
+msgstr[2] "Пакет содержит эти %d ссылок:"
+msgstr[3] "Пакет содержит эти %d ссылок:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Пакет содержит полную историю."
 
-#: grep.c:1718
+#: bundle.c:194
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "«%s»: не удалось прочесть %s"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "Пакет требует эту %d ссылку:"
+msgstr[1] "Пакет требует эти %d ссылки:"
+msgstr[2] "Пакет требует эти %d ссылок:"
+msgstr[3] "Пакет требует эти %d ссылок:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Не удалось создать объекты пакета"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "критическая ошибка pack-objects"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "критическая ошибка rev-list"
 
-#: grep.c:1735 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: bundle.c:353
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "не удалось выполнить stat «%s»"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "ссылка «%s» исключена в соответствии с опциями rev-list"
 
-#: grep.c:1746
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
 #, c-format
-msgid "'%s': short read"
-msgstr "«%s»: слишком мало данных прочитано"
+msgid "unrecognized argument: %s"
+msgstr "неопознанный аргумент: %s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Отклонение создания пустого пакета."
 
-#: help.c:205
+#: bundle.c:463
 #, c-format
-msgid "available git commands in '%s'"
-msgstr "доÑ\81Ñ\82Ñ\83пнÑ\8bе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b git Ð² «%s»"
+msgid "cannot create '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c «%s»"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "команды git, доступные в других местах вашего $PATH"
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "критическая ошибка index-pack"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Стандартные команды Git используемые в различных ситуациях:"
+#: color.c:290
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "недопустимое значение цвета: %.*s"
+
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
+#, c-format
+msgid "could not parse %s"
+msgstr "не удалось разобрать %s"
 
-#: help.c:309
+#: commit.c:42
 #, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s не является коммитом!"
+
+#: commit.c:1514
 msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr "«%s» похоже на команду git, но нам не удалось ее запустить. Возможно, git-%s  не работает?"
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr "Предупреждение: сообщение коммита не соответствует UTF-8.\nВозможно, вы захотите исправить его после исправления сообщения\nили настроить опцию i18n.commitencoding и указать кодировку\nсообщений, которую использует ваш проект.\n"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Ð\9eй-Ñ\91й! Ð\92аÑ\88а Ñ\81иÑ\81Ñ\82ема Ð½Ðµ Ñ\81ообÑ\89аеÑ\82 Ð½Ð¸ Ð¾ ÐºÐ°ÐºÐ¸Ñ\85 ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\85 Git Ð²Ð¾Ð¾Ð±Ñ\89е."
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "памÑ\8fÑ\82Ñ\8c Ð¸Ñ\81Ñ\87еÑ\80пана"
 
-#: help.c:388
+#: config.c:516
 #, c-format
-msgid ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
-msgstr "ВНИМАНИЕ: Вы вызвали команду Git «%s», но такой не существует.\nПродолжаем с предположением, что вы имели в виду «%s»"
+msgid "bad config line %d in blob %s"
+msgstr "ошибка в %d строке двоичного объекта %s"
 
-#: help.c:393
+#: config.c:520
 #, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "через %0.1f секунд автоматически…"
+msgid "bad config line %d in file %s"
+msgstr "ошибка в %d строке файла %s"
 
-#: help.c:400
+#: config.c:524
 #, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: «%s» не является командой git. Смотрите «git --help»."
+msgid "bad config line %d in standard input"
+msgstr "ошибка в %d строке стандартного ввода"
+
+#: config.c:528
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "ошибка в %d строке двоичного объекта подмодуля %s"
+
+#: config.c:532
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "ошибка в %d строке коммандной строки %s"
+
+#: config.c:536
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "ошибка в %d строке в %s"
+
+#: config.c:655
+msgid "out of range"
+msgstr "вне диапазона"
+
+#: config.c:655
+msgid "invalid unit"
+msgstr "неправильное число"
+
+#: config.c:661
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "неправильное числовое значение «%s» для «%s»: %s"
+
+#: config.c:666
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в двоичном объекте %s: %s"
+
+#: config.c:669
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в файле %s: %s"
+
+#: config.c:672
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "неправильное числовое значение «%s» для «%s» на стандартном вводе: %s"
+
+#: config.c:675
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в двоичном объекте подмодуля %s: %s"
+
+#: config.c:678
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» на коммандной строке %s: %s"
+
+#: config.c:681
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "неправильное числовое значение «%s» для «%s» в %s: %s"
+
+#: config.c:768
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "сбой разворачивания пути каталога пользователя: «%s»"
+
+#: config.c:852 config.c:863
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "неправильный уровень сжатия zlib %d"
+
+#: config.c:978
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "недопустимый режим создания объекта: %s"
+
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "не удалось разобрать конфигурацию из командной строки"
+
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr "произошла неизвестная ошибка при чтении файлов конфигурации"
+
+#: config.c:1716
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "не удалось разобрать «%s» в конфигурации из командной строки"
 
-#: help.c:404 help.c:464
+#: config.c:1718
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "неправильная переменная конфигурации «%s» в файле «%s» на строке %d"
+
+#: config.c:1777
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s имеет несколько значений"
+
+#: config.c:2311
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "не удалось установить «%s» в «%s»"
+
+#: config.c:2313
+#, c-format
+msgid "could not unset '%s'"
+msgstr "не удалось сбросить значение для «%s»"
+
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Внешний сервер отсоединился до начала сеанса связи"
+
+#: connect.c:51
 msgid ""
+"Could not read from remote repository.\n"
 "\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] "\nВозможно, вы имели в виду это?"
-msgstr[1] "\nВозможно, вы имели в виду что-то из этого?"
-msgstr[2] "\nВозможно, вы имели в виду что-то из этого?"
-msgstr[3] "\nВозможно, вы имели в виду что-то из этого?"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr "Не удалось прочитать из внешнего репозитория.\n\nУдостоверьтесь, что у вас есть необходимые права доступа\nи репозиторий существует."
+
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Проверка соединения"
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Не удалось запустить «git rev-list»"
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "сбой записи в rev-list"
+
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "сбой закрытия стандартного ввода у rev-list"
 
-#: help.c:460
+#: convert.c:201
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s — %s"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr "CRLF будет заменен на LF в %s.\nФайл будет иметь свои оригинальные концы строк в рашей рабочей копии."
 
-#: lockfile.c:152
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF будет заменен на LF в %s."
+
+#: convert.c:211
 #, c-format
 msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr "Не удалось создать «%s.lock»: %s.\n\nПохоже, что другой процесс git запущен в этом репозитории,\nнапример редактор открыт из «git commit». Пожалуйста, убедитесь,\nчто все процессы были завершены и потом попробуйте снова.\nЕсли это не поможет, то возможно процесс git был ранее завершен\nс ошибкой в этом репозитории: \nудалите файл вручную для продолжения."
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr "LF будет заменен на CRLF в %s.\nФайл будет иметь свои оригинальные концы строк в рашей рабочей копии."
 
-#: lockfile.c:160
+#: convert.c:215
 #, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr "Не удалось создать «%s.lock»: %s"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF будет заменен на CRLF в %s"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "сбой чтения кэша"
+#: date.c:97
+msgid "in the future"
+msgstr "в будущем"
 
-#: merge.c:94 builtin/am.c:2007 builtin/am.c:2042 builtin/checkout.c:375
-#: builtin/checkout.c:586 builtin/clone.c:732
-msgid "unable to write new index file"
-msgstr "не удалось записать новый файл индекса"
+#: date.c:103
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu секунду назад"
+msgstr[1] "%lu секунды назад"
+msgstr[2] "%lu секунд назад"
+msgstr[3] "%lu секунд назад"
+
+#: date.c:110
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu минуту назад"
+msgstr[1] "%lu минуты назад"
+msgstr[2] "%lu минут назад"
+msgstr[3] "%lu минут назад"
+
+#: date.c:117
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu час назад"
+msgstr[1] "%lu часа назад"
+msgstr[2] "%lu часов назад"
+msgstr[3] "%lu часов назад"
+
+#: date.c:124
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu день назад"
+msgstr[1] "%lu дня назад"
+msgstr[2] "%lu дней назад"
+msgstr[3] "%lu дней назад"
+
+#: date.c:130
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu неделю назад"
+msgstr[1] "%lu недели назад"
+msgstr[2] "%lu недель назад"
+msgstr[3] "%lu недель назад"
 
-#: merge-recursive.c:189
+#: date.c:137
 #, c-format
-msgid "(bad commit)\n"
-msgstr "(плохой коммит)\n"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu месяц назад"
+msgstr[1] "%lu месяца назад"
+msgstr[2] "%lu месяцев назад"
+msgstr[3] "%lu месяцев назад"
 
-#: merge-recursive.c:209
+#: date.c:148
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "сбой addinfo_cache для пути «%s»"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu год"
+msgstr[1] "%lu года"
+msgstr[2] "%lu лет"
+msgstr[3] "%lu лет"
 
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "ошибка при построении деревьев"
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s и %lu месяц назад"
+msgstr[1] "%s и %lu месяца назад"
+msgstr[2] "%s и %lu месяцев назад"
+msgstr[3] "%s и %lu месяцев назад"
 
-#: merge-recursive.c:689
+#: date.c:156 date.c:161
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "не удалось создать путь «%s»%s"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu год назад"
+msgstr[1] "%lu года назад"
+msgstr[2] "%lu лет назад"
+msgstr[3] "%lu лет назад"
 
-#: merge-recursive.c:700
+#: diffcore-order.c:24
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "Удаление %s, чтобы освободить место для подкаталогов\n"
+msgid "failed to read orderfile '%s'"
+msgstr "сбой чтения orderfile «%s»"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ": возможно, конфликт каталогов/файлов?"
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Выполняется неточное определение переименования"
 
-#: merge-recursive.c:725
+#: diff.c:62
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "оÑ\82каз Ð¿Ð¾Ñ\82еÑ\80и Ð½ÐµÐ¾Ñ\82Ñ\81леживаемого Ñ\84айла Ð² Â«%s»"
+msgid "option '%s' requires a value"
+msgstr "паÑ\80амеÑ\82Ñ\80 Â«%s» Ñ\82Ñ\80ебÑ\83еÑ\82 Ñ\83казаниÑ\8f Ð·Ð½Ð°Ñ\87ениÑ\8f"
 
-#: merge-recursive.c:765
+#: diff.c:124
 #, c-format
-msgid "cannot read object %s '%s'"
-msgstr "невозможно прочитать объект %s «%s»"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  Сбой разбора величины среза (cut-off) у dirstat «%s»\n"
 
-#: merge-recursive.c:767
+#: diff.c:129
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "ожидаеÑ\82Ñ\81Ñ\8f Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¾Ð±Ñ\8aекÑ\82 Ð´Ð»Ñ\8f %s Â«%s»"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй Ð¿Ð°Ñ\80амеÑ\82Ñ\80 dirstat: Â«%s»\n"
 
-#: merge-recursive.c:790 builtin/clone.c:376
+#: diff.c:283
 #, c-format
-msgid "failed to open '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c «%s»"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Ð\9dеизвеÑ\81Ñ\82ное Ð·Ð½Ð°Ñ\87ениÑ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еменной Â«diff.submodule»: «%s»"
 
-#: merge-recursive.c:798
+#: diff.c:346
 #, c-format
-msgid "failed to symlink '%s'"
-msgstr "не удалось создать символьную ссылку «%s»"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr "Найдены ошибки в переменной «diff.dirstat»:\n%s"
 
-#: merge-recursive.c:801
+#: diff.c:3087
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "не понятно, что делать с %06o %s «%s»"
-
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "Не удалось запустить внутреннее слияние"
+msgid "external diff died, stopping at %s"
+msgstr "критическая ошибка при внешнем сравнении, останов на %s"
 
-#: merge-recursive.c:943
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "Не удалось добавить %s в базу данных"
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check и -s нельзя использовать одновременно"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "объект неподдерживаемого типа в дереве"
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow требует ровно одной спецификации пути"
 
-#: merge-recursive.c:1034 merge-recursive.c:1048
+#: diff.c:3665
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr "Ð\9aÐ\9eÐ\9dФÐ\9bÐ\98Ð\9aТ (%s/Ñ\83даление): %s Ñ\83далено Ð² %s Ð¸ %s Ð² %s. Ð\92еÑ\80Ñ\81иÑ\8f %s Ð¸Ð· %s Ð¾Ñ\81Ñ\82авлена Ð² Ð´ÐµÑ\80еве."
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr "Сбой Ñ\80азбоÑ\80а Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Ð¾Ð¿Ñ\86ии --dirstat/-X :\n%s"
 
-#: merge-recursive.c:1040 merge-recursive.c:1053
+#: diff.c:3679
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве на %s."
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Сбой разбора параметра опции --submodule: «%s»"
 
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "пеÑ\80еименование"
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "неÑ\82оÑ\87ное Ð¾Ð¿Ñ\80еделение Ð¿ÐµÑ\80еименованиÑ\8f Ð±Ñ\8bло Ð¿Ñ\80опÑ\83Ñ\89ено Ð¸Ð·-за Ñ\81лиÑ\88ком Ð±Ð¾Ð»Ñ\8cÑ\88ого ÐºÐ¾Ð»Ð¸Ñ\87еÑ\81Ñ\82ва Ñ\84айлов."
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "пеÑ\80еименовано"
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr "найденÑ\8b Ñ\82олÑ\8cко ÐºÐ¾Ð¿Ð¸Ð¸ Ð¸Ð· Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ\8bÑ\85 Ð¿Ñ\83Ñ\82ей Ð¸Ð·-за Ñ\81лиÑ\88ком Ð±Ð¾Ð»Ñ\8cÑ\88ого ÐºÐ¾Ð»Ð¸Ñ\87еÑ\81Ñ\82ва Ñ\84айлов."
 
-#: merge-recursive.c:1150
+#: diff.c:4706
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s — это каталог в %s, добавляем как %s вместо этого"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr "возможно вы захотите установить переменную %s в как минимум значение %d и повторить вызов команды."
+
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "не удалось получить имя ядра и информацию"
+
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr "Кэш неотслеживаемых файлов отключен на этой системе или в этом месте."
 
-#: merge-recursive.c:1172
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: ожидается передача списка для получение части"
+
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ожидается ACK/NAK, а получено EOF"
+
+#: fetch-pack.c:243
 #, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename "
-"\"%s\"->\"%s\" in \"%s\"%s"
-msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»%s"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ожидается ACK/NAK, а получено «%s»"
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr " (оставлено неразрешенным)"
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc требует multi_ack_detailed"
 
-#: merge-recursive.c:1231
+#: fetch-pack.c:381
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr "Ð\9aÐ\9eÐ\9dФÐ\9bÐ\98Ð\9aТ (пеÑ\80еименование/пеÑ\80еименование): Ð\9fеÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s» Ð¸ Ð¿ÐµÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s»"
+msgid "invalid shallow line: %s"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ñ\87аÑ\81Ñ\82иÑ\87ного Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f: %s"
 
-#: merge-recursive.c:1261
+#: fetch-pack.c:387
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Ð\9fеÑ\80еименовÑ\8bваÑ\8e %s Ð² %s Ð¸ %s Ð² %s Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\8dÑ\82ого"
+msgid "invalid unshallow line: %s"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f: %s"
 
-#: merge-recursive.c:1460
+#: fetch-pack.c:389
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr "Ð\9aÐ\9eÐ\9dФÐ\9bÐ\98Ð\9aТ (пеÑ\80еименование/добавление): Ð\9fеÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s» Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ Â«%s» Ð² Ð²ÐµÑ\82ке Â«%s»"
+msgid "object not found: %s"
+msgstr "обÑ\8aекÑ\82 Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½: %s"
 
-#: merge-recursive.c:1470
+#: fetch-pack.c:392
 #, c-format
-msgid "Adding merged %s"
-msgstr "Ð\94обавление Ñ\81лиÑ\82ого %s"
+msgid "error in object: %s"
+msgstr "оÑ\88ибка Ð² Ð¾Ð±Ñ\8aекÑ\82е: %s"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
+#: fetch-pack.c:394
 #, c-format
-msgid "Adding as %s instead"
-msgstr "Добавление вместо этого как %s"
+msgid "no shallow found: %s"
+msgstr "частичный клон не найден: %s"
 
-#: merge-recursive.c:1526
+#: fetch-pack.c:397
 #, c-format
-msgid "cannot read object %s"
-msgstr "невозможно Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82 Â«%s»"
+msgid "expected shallow/unshallow, got %s"
+msgstr "ожидалоÑ\81Ñ\8c shallow/unshallow, Ð° Ð¿Ð¾Ð»Ñ\83Ñ\87ено %s"
 
-#: merge-recursive.c:1529
+#: fetch-pack.c:436
 #, c-format
-msgid "object %s is not a blob"
-msgstr "обÑ\8aекÑ\82 %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bм Ð¾Ð±Ñ\8aекÑ\82ом"
+msgid "got %s %d %s"
+msgstr "полÑ\83Ñ\87ено %s %d %s"
 
-#: merge-recursive.c:1581
-msgid "modify"
-msgstr "изменение"
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
+msgstr "недопустимый коммит %s"
 
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "изменено"
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "оÑ\81Ñ\82анавливаÑ\8e Ð´Ð°Ð»Ñ\8cнейÑ\88ие Ð¿Ð¾Ð¿Ñ\8bÑ\82ки"
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "содержимое"
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "готово"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "добавление/добавление"
+#: fetch-pack.c:505
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "получено %s (%d) %s"
 
-#: merge-recursive.c:1632
+#: fetch-pack.c:551
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "Пропуск %s (слиты одинаковые изменения как существующие)"
+msgid "Marking %s as complete"
+msgstr "Помечаю %s как завершенный"
 
-#: merge-recursive.c:1646
+#: fetch-pack.c:697
 #, c-format
-msgid "Auto-merging %s"
-msgstr "Автослияние %s"
+msgid "already have %s (%s)"
+msgstr "уже есть %s (%s)"
 
-#: merge-recursive.c:1650 git-submodule.sh:941
-msgid "submodule"
-msgstr "подмодуль"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: не удалось запустить программу разбора данных"
 
-#: merge-recursive.c:1651
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "КОНФЛИКТ (%s): Конфликт слияния в %s"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "ошибка протокола: неправильный заголовок потока"
 
-#: merge-recursive.c:1737
+#: fetch-pack.c:799
 #, c-format
-msgid "Removing %s"
-msgstr "Удаление %s"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: не удалось запустить программу %s"
 
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "файл/каталог"
+#: fetch-pack.c:815
+#, c-format
+msgid "%s failed"
+msgstr "%s завершен с ошибкой"
 
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "каÑ\82алог/Ñ\84айл"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "пÑ\80оизоÑ\88ла  Ð¾Ñ\88ибка Ð²  Ð¿Ñ\80огÑ\80амме Ñ\80азбоÑ\80а Ð´Ð°Ð½Ð½Ñ\8bÑ\85"
 
-#: merge-recursive.c:1773
-#, c-format
-msgid ""
-"CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr "КОНФЛИКТ (%s): Уже существует каталог с именем «%s» в «%s». Добавление «%s» как «%s»"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Сервер не поддерживает клиентов с частичным клонированием"
 
-#: merge-recursive.c:1781
-#, c-format
-msgid "Adding %s"
-msgstr "Добавление %s"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Сервер поддерживает multi_ack_detailed"
 
-#: merge-recursive.c:1798
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Ð\9aÑ\80иÑ\82иÑ\87еÑ\81каÑ\8f Ð¾Ñ\88ибка Ñ\81лиÑ\8fниÑ\8f, Ñ\82акого Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ñ\81лÑ\83Ñ\87аÑ\82Ñ\8cÑ\81Ñ\8f."
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "СеÑ\80веÑ\80 Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 no-done"
 
-#: merge-recursive.c:1817
-msgid "Already up-to-date!"
-msgstr "Уже Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾!"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "СеÑ\80веÑ\80 Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 multi_ack"
 
-#: merge-recursive.c:1826
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "сбой слияния деревьев «%s» и «%s»"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Сервер поддерживает side-band-64k"
 
-#: merge-recursive.c:1856
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr "Необработанный путь??? %s"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Сервер поддерживает side-band"
 
-#: merge-recursive.c:1904
-msgid "Merging:"
-msgstr "СлиÑ\8fние:"
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "СеÑ\80веÑ\80 Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 allow-tip-sha1-in-want"
 
-#: merge-recursive.c:1917
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "найден %u общий предок:"
-msgstr[1] "найдено %u общих предка:"
-msgstr[2] "найдено %u общих предков:"
-msgstr[3] "найдено %u общих предков:"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Сервер поддерживает allow-reachable-sha1-in-want"
 
-#: merge-recursive.c:1954
-msgid "merge returned no commit"
-msgstr "слияние не вернуло коммит"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Сервер поддерживает ofs-delta"
 
-#: merge-recursive.c:2011
+#: fetch-pack.c:890
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82 Â«%s»"
+msgid "Server version is %.*s"
+msgstr "Ð\92еÑ\80Ñ\81иÑ\8f Ñ\81еÑ\80веÑ\80а %.*s"
 
-#: merge-recursive.c:2022 builtin/merge.c:649 builtin/merge.c:831
-msgid "Unable to write index."
-msgstr "Ð\9dе Ñ\83даеÑ\82Ñ\81Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81."
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "СеÑ\80веÑ\80 Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 --shallow-since"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "Ð\9dелÑ\8cзÑ\8f Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82иÑ\82Ñ\8c Ð½ÐµÐ¸Ð½Ð¸Ñ\86иализиÑ\80ованное Ð¸Ð»Ð¸ Ð½Ðµ Ð¸Ð¼ÐµÑ\8eÑ\89ее Ñ\81Ñ\81Ñ\8bлок Ð´ÐµÑ\80ево Ð·Ð°Ð¼ÐµÑ\82ок"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "СеÑ\80веÑ\80 Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 --shallow-exclude"
 
-#: notes-utils.c:100
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Неправильное значение notes.rewriteMode: «%s»"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Сервер не поддерживает --deepen"
 
-#: notes-utils.c:110
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "Отказ в перезаписи заметок в %s (за пределами refs/notes/)"
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "не общих коммитов"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Неправильное значение переменной %s: «%s»"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: ошибка при получении данных."
 
-#: object.c:242
-#, c-format
-msgid "unable to parse object: %s"
-msgstr "не удалось разобрать объект: %s"
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "нет соотвествующего внешнего указателя на ветку"
 
-#: parse-options.c:572
-msgid "..."
-msgstr ""
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg не удалось подписать данные"
 
-#: parse-options.c:590
-#, c-format
-msgid "usage: %s"
-msgstr "использование: %s"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "не удалось создать временный файл"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:594
+#: gpg-interface.c:217
 #, c-format
-msgid "   or: %s"
-msgstr "          или: %s"
+msgid "failed writing detached signature to '%s'"
+msgstr "сбой записи отсоединенной подписи в «%s»"
 
-#: parse-options.c:597
+#: grep.c:1782
 #, c-format
-msgid "    %s"
-msgstr "            %s"
+msgid "'%s': unable to read %s"
+msgstr "«%s»: не удалось прочесть %s"
 
-#: parse-options.c:631
-msgid "-NUM"
-msgstr "-КОЛИЧЕСТВО"
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
+#, c-format
+msgid "failed to stat '%s'"
+msgstr "не удалось выполнить stat «%s»"
 
-#: parse-options-cb.c:108
+#: grep.c:1810
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "Неправильное имя объекта «%s»"
+msgid "'%s': short read"
+msgstr "«%s»: слишком мало данных прочитано"
 
-#: path.c:796
+#: help.c:203
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80едоÑ\81Ñ\82авиÑ\82Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ðº %s Ð½Ð° Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c"
+msgid "available git commands in '%s'"
+msgstr "доÑ\81Ñ\82Ñ\83пнÑ\8bе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b git Ð² Â«%s»"
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr "глобалÑ\8cнÑ\8bе Ð¾Ð¿Ñ\86ии Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и Â«glob» Ð¸ Â«noglob» Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "командÑ\8b git, Ð´Ð¾Ñ\81Ñ\82Ñ\83пнÑ\8bе Ð² Ð´Ñ\80Ñ\83гиÑ\85 Ð¼ÐµÑ\81Ñ\82аÑ\85 Ð²Ð°Ñ\88его $PATH"
 
-#: pathspec.c:143
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "Стандартные команды Git используемые в различных ситуациях:"
+
+#: help.c:306
+#, c-format
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr "глобальная опция спецификации пути «literal» не совместима с другими глобальными спецификаторами доступа"
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr "«%s» похоже на команду git, но нам не удалось ее запустить. Возможно, git-%s  не работает?"
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "непÑ\80авилÑ\8cнÑ\8bй Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð´Ð»Ñ\8f Ð¼Ð°Ð³Ð¸Ñ\87еÑ\81кого Ñ\81лова Â«prefix» Ð² Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и "
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Ð\9eй-Ñ\91й! Ð\92аÑ\88а Ñ\81иÑ\81Ñ\82ема Ð½Ðµ Ñ\81ообÑ\89аеÑ\82 Ð½Ð¸ Ð¾ ÐºÐ°ÐºÐ¸Ñ\85 ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ\85 Git Ð²Ð¾Ð¾Ð±Ñ\89е."
 
-#: pathspec.c:183
+#: help.c:383
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "неправильное магическое слово «%.*s» в спецификации пути «%s»"
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr "ВНИМАНИЕ: Вы вызвали команду Git «%s», но такой не существует.\nПродолжаем с предположением, что вы имели в виду «%s»"
 
-#: pathspec.c:187
+#: help.c:388
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "Пропущено «)» в конце магического слова спецификации пути «%s»"
+msgid "in %0.1f seconds automatically..."
+msgstr "через %0.1f секунд автоматически…"
 
-#: pathspec.c:205
+#: help.c:395
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Нереализованное магическое слово «%c» спецификации пути «%s»"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: «%s» не является командой git. Смотрите «git --help»."
 
-#: pathspec.c:230
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: «literal» и «glob» не совместимы"
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] "\nВозможно, вы имели в виду это?"
+msgstr[1] "\nВозможно, вы имели в виду что-то из этого?"
+msgstr[2] "\nВозможно, вы имели в виду что-то из этого?"
+msgstr[3] "\nВозможно, вы имели в виду что-то из этого?"
 
-#: pathspec.c:241
+#: help.c:461
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: «%s» вне репозитория"
+msgid "%s: %s - %s"
+msgstr "%s: %s — %s"
 
-#: pathspec.c:291
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Спецификация пути «%s» в подмодуле «%.*s»"
+#: ident.c:334
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr "\n*** Пожалуйста, скажите мне кто вы есть.\n\nЗапустите\n\n  git config --global user.email \"you@example.com\"\n  git config --global user.name \"Ваше Имя\"\n\nдля указания идентификационных данных аккаунта по умолчанию.\nПропустите параметр --global для указания данных только для этого репозитория.\n\n"
 
-#: pathspec.c:353
+#: lockfile.c:152
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr "%s: магические слова в спецификации пути не поддерживаются командой: %s"
+msgid ""
+"Unable to create '%s.lock': %s.\n"
+"\n"
+"Another git process seems to be running in this repository, e.g.\n"
+"an editor opened by 'git commit'. Please make sure all processes\n"
+"are terminated then try again. If it still fails, a git process\n"
+"may have crashed in this repository earlier:\n"
+"remove the file manually to continue."
+msgstr "Не удалось создать «%s.lock»: %s.\n\nПохоже, что другой процесс git запущен в этом репозитории,\nнапример редактор открыт из «git commit». Пожалуйста, убедитесь,\nчто все процессы были завершены и потом попробуйте снова.\nЕсли это не поможет, то возможно процесс git был ранее завершен\nс ошибкой в этом репозитории: \nудалите файл вручную для продолжения."
 
-#: pathspec.c:433
+#: lockfile.c:160
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "спецификация пути «%s» находится за символической ссылкой"
+msgid "Unable to create '%s.lock': %s"
+msgstr "Не удалось создать «%s.lock»: %s"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr "Не указан шаблон для исключения с помощью :(exclude).\nВозможно, вы забыли «:/» или «.» ?"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "сбой чтения кэша"
 
-#: pretty.c:971
-msgid "unable to parse --pretty format"
-msgstr "не удалось разобрать формат для --pretty"
+#: merge.c:96 builtin/am.c:2000 builtin/am.c:2035 builtin/checkout.c:374
+#: builtin/checkout.c:588 builtin/clone.c:731
+msgid "unable to write new index file"
+msgstr "не удалось записать новый файл индекса"
 
-#: progress.c:235
-msgid "done"
-msgstr "готово"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(плохой коммит)\n"
 
-#: read-cache.c:1281
+#: merge-recursive.c:231
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr "index.version указан, но значение недействительное.\nИспользую версию %i"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "сбой addinfo_cache для пути «%s»"
+
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "ошибка при построении деревьев"
 
-#: read-cache.c:1291
+#: merge-recursive.c:720
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr "GIT_INDEX_VERSION указан, но значение недействительное.\nИспользую версию %i"
+msgid "failed to create path '%s'%s"
+msgstr "не удалось создать путь «%s»%s"
 
-#: refs.c:543 builtin/merge.c:764 builtin/merge.c:883 builtin/merge.c:985
-#: builtin/merge.c:995
+#: merge-recursive.c:731
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Не удалось открыть «%s» для записи"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Удаление %s, чтобы освободить место для подкаталогов\n"
+
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": возможно, конфликт каталогов/файлов?"
 
-#: refs/files-backend.c:2243
+#: merge-recursive.c:754
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлкÑ\83 %s: %s"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "оÑ\82каз Ð¿Ð¾Ñ\82еÑ\80и Ð½ÐµÐ¾Ñ\82Ñ\81леживаемого Ñ\84айла Ð² Â«%s»"
 
-#: refs/files-backend.c:2246
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "could not delete references: %s"
-msgstr "не удалось удалить ссылки: %s"
+msgid "cannot read object %s '%s'"
+msgstr "невозможно прочитать объект %s «%s»"
 
-#: refs/files-backend.c:2255
+#: merge-recursive.c:798
 #, c-format
-msgid "could not remove reference %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлки %s"
+msgid "blob expected for %s '%s'"
+msgstr "ожидаеÑ\82Ñ\81Ñ\8f Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¾Ð±Ñ\8aекÑ\82 Ð´Ð»Ñ\8f %s Â«%s»"
 
-#: ref-filter.c:55
+#: merge-recursive.c:822
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "ожидаемÑ\8bй Ñ\84оÑ\80маÑ\82: %%(color:<color>)"
+msgid "failed to open '%s': %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s»: %s"
 
-#: ref-filter.c:57
+#: merge-recursive.c:833
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "неопознанный цвет: %%(color:%s)"
+msgid "failed to symlink '%s': %s"
+msgstr "не удалось создать символьную ссылку «%s»: %s"
 
-#: ref-filter.c:71
+#: merge-recursive.c:838
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "неопознанный формат: %%(%s)"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "не понятно, что делать с %06o %s «%s»"
 
-#: ref-filter.c:77
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "Не удалось запустить внутреннее слияние"
+
+#: merge-recursive.c:982
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) не принимает аргументов"
+msgid "Unable to add %s to database"
+msgstr "Не удалось добавить %s в базу данных"
 
-#: ref-filter.c:84
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) не принимает аргументов"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве."
 
-#: ref-filter.c:101
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "положительное значение ожидает содержимое:lines=%s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr "КОНФЛИКТ (%s/удаление): %s удалено в %s и %s в %s. Версия %s из %s оставлена в дереве на %s."
 
-#: ref-filter.c:103
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "переименование"
+
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "переименовано"
+
+#: merge-recursive.c:1200
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "неопознанный аргумент %%(contents): %s"
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s — это каталог в %s, добавляем как %s вместо этого"
 
-#: ref-filter.c:113
+#: merge-recursive.c:1225
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "неопознанный аргумент %%(objectname): %s"
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename "
+"\"%s\"->\"%s\" in \"%s\"%s"
+msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»%s"
 
-#: ref-filter.c:135
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (оставлено неразрешенным)"
+
+#: merge-recursive.c:1292
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "ожидаемÑ\8bй Ñ\84оÑ\80маÑ\82: %%(align:<width>,<position>)"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr "Ð\9aÐ\9eÐ\9dФÐ\9bÐ\98Ð\9aТ (пеÑ\80еименование/пеÑ\80еименование): Ð\9fеÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s» Ð¸ Ð¿ÐµÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s»"
 
-#: ref-filter.c:147
+#: merge-recursive.c:1325
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "неопознаннаÑ\8f Ð¿Ð¾Ð·Ð¸Ñ\86иÑ\8f:%s"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "Ð\9fеÑ\80еименовÑ\8bваÑ\8e %s Ð² %s Ð¸ %s Ð² %s Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\8dÑ\82ого"
 
-#: ref-filter.c:151
+#: merge-recursive.c:1531
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "неопознаннаÑ\8f Ñ\88иÑ\80ина:%s"
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr "Ð\9aÐ\9eÐ\9dФÐ\9bÐ\98Ð\9aТ (пеÑ\80еименование/добавление): Ð\9fеÑ\80еименование Â«%s»â\86\92«%s» Ð² Ð²ÐµÑ\82ке Â«%s» Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ Â«%s» Ð² Ð²ÐµÑ\82ке Â«%s»"
 
-#: ref-filter.c:157
+#: merge-recursive.c:1546
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "неопознаннÑ\8bй Ð°Ñ\80гÑ\83менÑ\82 %%(align): %s"
+msgid "Adding merged %s"
+msgstr "Ð\94обавление Ñ\81лиÑ\82ого %s"
 
-#: ref-filter.c:161
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "ожидаеÑ\82Ñ\81Ñ\8f Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ\82елÑ\8cнаÑ\8f Ñ\88иÑ\80ина Ñ\81 Ñ\83казанием Ñ\87аÑ\81Ñ\82иÑ\86Ñ\8b %%(align)"
+msgid "Adding as %s instead"
+msgstr "Ð\94обавление Ð²Ð¼ÐµÑ\81Ñ\82о Ñ\8dÑ\82ого ÐºÐ°Ðº %s"
 
-#: ref-filter.c:244
+#: merge-recursive.c:1610
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "непÑ\80авилÑ\8cное Ð¸Ð¼Ñ\8f Ð¿Ð¾Ð»Ñ\8f: %.*s"
+msgid "cannot read object %s"
+msgstr "невозможно Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82 Â«%s»"
 
-#: ref-filter.c:270
+#: merge-recursive.c:1613
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "неизвеÑ\81Ñ\82ное Ð¸Ð¼Ñ\8f Ð¿Ð¾Ð»Ñ\8f: %.*s"
+msgid "object %s is not a blob"
+msgstr "обÑ\8aекÑ\82 %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bм Ð¾Ð±Ñ\8aекÑ\82ом"
 
-#: ref-filter.c:372
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "изменение"
+
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "изменено"
+
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "содержимое"
+
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "добавление/добавление"
+
+#: merge-recursive.c:1718
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "формат: частица %%(end) использована без соответствующей частицы"
+msgid "Skipped %s (merged same as existing)"
+msgstr "Пропуск %s (слиты одинаковые изменения как существующие)"
 
-#: ref-filter.c:424
+#: merge-recursive.c:1732
 #, c-format
-msgid "malformed format string %s"
-msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ñ\84оÑ\80маÑ\82а %s"
+msgid "Auto-merging %s"
+msgstr "Ð\90вÑ\82оÑ\81лиÑ\8fние %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= требует наличия положительного целого аргумента"
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "подмодуль"
 
-#: ref-filter.c:883
+#: merge-recursive.c:1737
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "ссылка «%s» не содержит %ld компонент для :strip"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "КОНФЛИКТ (%s): Конфликт слияния в %s"
 
-#: ref-filter.c:1046
+#: merge-recursive.c:1831
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "неизвеÑ\81Ñ\82нÑ\8bй %.*s Ñ\84оÑ\80маÑ\82 %s"
+msgid "Removing %s"
+msgstr "Удаление %s"
 
-#: ref-filter.c:1066 ref-filter.c:1097
-#, c-format
-msgid "missing object %s for %s"
-msgstr "не найден объект %s для %s"
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "файл/каталог"
 
-#: ref-filter.c:1069 ref-filter.c:1100
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "сбой при выполнении parse_object_buffer на %s для %s"
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "каталог/файл"
 
-#: ref-filter.c:1311
+#: merge-recursive.c:1868
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "Повреждённый объект «%s»"
+msgid ""
+"CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr "КОНФЛИКТ (%s): Уже существует каталог с именем «%s» в «%s». Добавление «%s» как «%s»"
 
-#: ref-filter.c:1373
+#: merge-recursive.c:1877
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "игноÑ\80иÑ\80Ñ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 Ñ\81 Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\8bм Ð¸Ð¼ÐµÐ½ÐµÐ¼ %s"
+msgid "Adding %s"
+msgstr "Ð\94обавление %s"
 
-#: ref-filter.c:1378
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr "игнорирую неправильную ссылку %s"
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Уже обновлено!"
 
-#: ref-filter.c:1651
+#: merge-recursive.c:1923
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "format: пропущена частица %%(end)"
+msgid "merging of trees %s and %s failed"
+msgstr "сбой слияния деревьев «%s» и «%s»"
 
-#: ref-filter.c:1705
-#, c-format
-msgid "malformed object name %s"
-msgstr "неправильное имя объекта %s"
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "Слияние:"
 
-#: remote.c:746
+#: merge-recursive.c:2019
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "Нельзя извлечь одновременно %s и %s в %s"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "найден %u общий предок:"
+msgstr[1] "найдено %u общих предка:"
+msgstr[2] "найдено %u общих предков:"
+msgstr[3] "найдено %u общих предков:"
 
-#: remote.c:750
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s обычно отслеживает %s, а не %s"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "слияние не вернуло коммит"
 
-#: remote.c:754
+#: merge-recursive.c:2121
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s отслеживает и %s и %s"
-
-#: remote.c:762
-msgid "Internal error"
-msgstr "Внутренняя ошибка"
+msgid "Could not parse object '%s'"
+msgstr "Не удалось разобрать объект «%s»"
 
-#: remote.c:1678 remote.c:1721
-msgid "HEAD does not point to a branch"
-msgstr "HEAD не указывает на ветку"
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "Не удается записать индекс."
 
-#: remote.c:1687
+#: notes-merge.c:273
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "нет такой ветки: «%s»"
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to commit/abort the previous merge before you start a new notes merge."
+msgstr "Вы не закончили предыдущее слияние заметок (%s существует).\nЗапустите «git notes merge --commit» или «git notes merge --abort» для коммита или отмены предыдущего слияния и запуска нового слияния заметок."
 
-#: remote.c:1690
+#: notes-merge.c:280
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "вÑ\8bÑ\88еÑ\81Ñ\82оÑ\8fÑ\89аÑ\8f Ð²ÐµÑ\82ка Ð½Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\80оена Ð´Ð»Ñ\8f Ð²ÐµÑ\82ки Â«%s»"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Ð\92Ñ\8b Ð½Ðµ Ð·Ð°ÐºÐ¾Ð½Ñ\87или Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89ее Ñ\81лиÑ\8fние Ð·Ð°Ð¼ÐµÑ\82ок (%s Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82)."
 
-#: remote.c:1696
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "вышестоящая ветка «%s» не сохранена как отслеживаемая ветка"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "Нельзя закоммитить неинициализированное или не имеющее ссылок дерево заметок"
 
-#: remote.c:1711
+#: notes-utils.c:100
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr "назнаÑ\87ение Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки Â«%s» Ð½Ð° Ð²Ð½ÐµÑ\88нем Ñ\81еÑ\80веÑ\80е Â«%s» Ð½Ðµ Ð¸Ð¼ÐµÐµÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cной Ð¾Ñ\82Ñ\81леживаемой Ð²ÐµÑ\82ки"
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Ð\9dепÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение notes.rewriteMode: Â«%s»"
 
-#: remote.c:1726
+#: notes-utils.c:110
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "веÑ\82ка Â«%s» Ð½Ðµ Ð¸Ð¼ÐµÐµÑ\82 Ð²Ð½ÐµÑ\88него Ñ\81еÑ\80веÑ\80а Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки"
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "Ð\9eÑ\82каз Ð² Ð¿ÐµÑ\80езапиÑ\81и Ð·Ð°Ð¼ÐµÑ\82ок Ð² %s (за Ð¿Ñ\80еделами refs/notes/)"
 
-#: remote.c:1737
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "спецификации пути для отправки «%s» не включают в себя «%s»"
+msgid "Bad %s value: '%s'"
+msgstr "Неправильное значение переменной %s: «%s»"
 
-#: remote.c:1750
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "отправка не имеет точки назначения (push.default выставлен в «nothing»)"
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "не удалось разобрать объект: %s"
 
-#: remote.c:1772
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "не удалось выполнить «simple» отправку в единственную точку назначения"
+#: parse-options.c:572
+msgid "..."
+msgstr ""
 
-#: remote.c:2074
+#: parse-options.c:590
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "Ваша ветка базируется на «%s», но вышестоящий репозиторий исчез.\n"
-
-#: remote.c:2078
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "(для исправления запустите «git branch --unset-upstream»)\n"
+msgid "usage: %s"
+msgstr "использование: %s"
 
-#: remote.c:2081
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Ваша ветка обновлена в соответствии с «%s».\n"
+msgid "   or: %s"
+msgstr "          или: %s"
 
-#: remote.c:2085
+#: parse-options.c:597
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Ваша ветка опережает «%s» на %d коммит.\n"
-msgstr[1] "Ваша ветка опережает «%s» на %d коммита.\n"
-msgstr[2] "Ваша ветка опережает «%s» на %d коммитов.\n"
-msgstr[3] "Ваша ветка опережает «%s» на %d коммитов.\n"
+msgid "    %s"
+msgstr "            %s"
 
-#: remote.c:2091
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (используйте «git push», чтобы опубликовать ваши локальные коммиты)\n"
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-КОЛИЧЕСТВО"
 
-#: remote.c:2094
+#: parse-options-cb.c:108
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] "Ваша ветка отстает от «%s» на %d коммит и может быть перемотана вперед.\n"
-msgstr[1] "Ваша ветка отстает от «%s» на %d коммита и может быть перемотана вперед.\n"
-msgstr[2] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
-msgstr[3] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
-
-#: remote.c:2102
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (используйте «git pull», чтобы обновить вашу локальную ветку)\n"
+msgid "malformed object name '%s'"
+msgstr "Неправильное имя объекта «%s»"
 
-#: remote.c:2105
+#: path.c:826
 #, c-format
+msgid "Could not make %s writable by group"
+msgstr "Не удалось предоставить доступ к %s на запись"
+
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "глобальные опции спецификации пути «glob» и «noglob» нельзя использовать одновременно"
+
+#: pathspec.c:143
 msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разный коммит в каждой соответственно.\n"
-msgstr[1] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммита в каждой соответственно.\n"
-msgstr[2] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
-msgstr[3] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr "глобальная опция спецификации пути «literal» не совместима с другими глобальными спецификаторами доступа"
 
-#: remote.c:2115
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (используйте «git pull», чтобы слить внешнюю ветку в вашу)\n"
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "неправильный параметр для магического слова «prefix» в спецификации пути "
 
-#: revision.c:2142
-msgid "your current branch appears to be broken"
-msgstr "похоже, ваша текущая ветка повреждена"
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "неправильное магическое слово «%.*s» в спецификации пути «%s»"
 
-#: revision.c:2145
+#: pathspec.c:187
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "ваÑ\88а Ñ\82екÑ\83Ñ\89аÑ\8f Ð²ÐµÑ\82ка Â«%s» ÐµÑ\89е Ð½Ðµ Ñ\81одеÑ\80жиÑ\82 Ð½Ð¸ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "Ð\9fÑ\80опÑ\83Ñ\89ено Â«)» Ð² ÐºÐ¾Ð½Ñ\86е Ð¼Ð°Ð³Ð¸Ñ\87еÑ\81кого Ñ\81лова Ñ\81пеÑ\86иÑ\84икаÑ\86ии Ð¿Ñ\83Ñ\82и Â«%s»"
 
-#: revision.c:2339
-msgid "--first-parent is incompatible with --bisect"
-msgstr "опцию --first-parent нельзя использовать одновременно с --bisect"
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Нереализованное магическое слово «%c» спецификации пути «%s»"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "сбой открытия /dev/null"
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: «literal» и «glob» не совместимы"
 
-#: run-command.c:94
+#: pathspec.c:241
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) сбой"
+msgid "%s: '%s' is outside repository"
+msgstr "%s: «%s» вне репозитория"
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-msgstr "сбой подписания сертификата отправки"
+#: pathspec.c:291
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Спецификация пути «%s» в подмодуле «%.*s»"
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "принимающая сторона не поддерживает отправку с опцией --signed"
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: магические слова в спецификации пути не поддерживаются командой: %s"
 
-#: send-pack.c:406
+#: pathspec.c:408
 msgid ""
-"not sending a push certificate since the receiving end does not support "
-"--signed push"
-msgstr "не Ð¾Ñ\82пÑ\80авлÑ\8fем Ñ\81еÑ\80Ñ\82иÑ\84икаÑ\82 Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки, Ñ\82ак ÐºÐ°Ðº Ð¿Ñ\80инимаÑ\8eÑ\89аÑ\8f Ñ\81Ñ\82оÑ\80она Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 Ð¾Ñ\82пÑ\80авкÑ\83 Ñ\81 Ð¾Ð¿Ñ\86ией --signed"
+"empty strings as pathspecs will be made invalid in upcoming releases. please"
+" use . instead if you meant to match all paths"
+msgstr "пÑ\83Ñ\81Ñ\82Ñ\8bе Ñ\81Ñ\82Ñ\80оки ÐºÐ°Ðº Ñ\81пеÑ\86иÑ\84икаÑ\82оÑ\80Ñ\8b Ð¿Ñ\83Ñ\82и Ð±Ñ\83дÑ\83Ñ\82 Ñ\81деланÑ\8b Ð½ÐµÐ´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имÑ\8bми Ð² Ñ\81ледÑ\83Ñ\8eÑ\89иÑ\85 Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\85. Ð¸Ñ\81полÑ\8cзÑ\83йÑ\82е Ð²Ð¼ÐµÑ\81Ñ\82о Ð½Ð¸Ñ\85 Â«.», Ñ\87Ñ\82о Ð·Ð½Ð°Ñ\87иÑ\82 Ñ\81ооÑ\82веÑ\81Ñ\82вие Ð²Ñ\81ем Ð¿Ñ\83Ñ\82Ñ\8fм"
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "принимающая сторона не поддерживает отправку с опцией --atomic"
+#: pathspec.c:440
+#, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "спецификация пути «%s» находится за символической ссылкой"
 
-#: sequencer.c:174
+#: pathspec.c:449
 msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr "поÑ\81ле Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84ликÑ\82ов, Ð¿Ð¾Ð¼ÐµÑ\82Ñ\8cÑ\82е Ð¸Ñ\81пÑ\80авленнÑ\8bе Ð¿Ñ\83Ñ\82и\nÑ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e Â«git add <пÑ\83Ñ\82и>» Ð¸Ð»Ð¸ Â«git rm <пÑ\83Ñ\82и>»"
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr "Ð\9dе Ñ\83казан Ñ\88аблон Ð´Ð»Ñ\8f Ð¸Ñ\81клÑ\8eÑ\87ениÑ\8f Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e :(exclude).\nÐ\92озможно, Ð²Ñ\8b Ð·Ð°Ð±Ñ\8bли Â«:/» Ð¸Ð»Ð¸ Â«.» ?"
 
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr "после разрешения конфликтов, пометьте исправленные пути\nс помощью «git add <пути>» или «git rm <пути>»\nи сделайте коммит с помощью «git commit»"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "не удалось разобрать формат для --pretty"
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:912
+#: read-cache.c:1315
 #, c-format
-msgid "Could not write to %s"
-msgstr "Не удалось записать в %s"
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr "index.version указан, но значение недействительное.\nИспользую версию %i"
 
-#: sequencer.c:193
+#: read-cache.c:1325
 #, c-format
-msgid "Error wrapping up %s"
-msgstr "Ошибка оборачивания %s"
-
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Ваши локальные изменение будут перезаписаны копией коммита."
-
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Ваши локальные изменения будут перезаписаны обратными изменениями коммита."
-
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Сделайте коммит или спрячьте ваши изменения для продолжения."
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr "GIT_INDEX_VERSION указан, но значение недействительное.\nИспользую версию %i"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: refs.c:576 builtin/merge.c:840
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Не удалось записать файл индекса"
-
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Не удалось определить HEAD коммит\n"
-
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Не удалось обновить дерево кэша\n"
+msgid "Could not open '%s' for writing"
+msgstr "Не удалось открыть «%s» для записи"
 
-#: sequencer.c:390
+#: refs/files-backend.c:2481
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s\n"
+msgid "could not delete reference %s: %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлкÑ\83 %s: %s"
 
-#: sequencer.c:395
+#: refs/files-backend.c:2484
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Ñ\80одиÑ\82елÑ\8cÑ\81кÑ\83Ñ\8e ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s\n"
+msgid "could not delete references: %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлки: %s"
 
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Ваш файл индекса не слит."
+#: refs/files-backend.c:2493
+#, c-format
+msgid "could not remove reference %s"
+msgstr "не удалось удалить ссылки %s"
 
-#: sequencer.c:479
+#: ref-filter.c:55
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Ð\9aоммиÑ\82 %s â\80\94 Ñ\8dÑ\82о ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82\81лиÑ\8fние, Ð½Ð¾ Ð¾Ð¿Ñ\86иÑ\8f -m Ð½Ðµ Ñ\83казана."
+msgid "expected format: %%(color:<color>)"
+msgstr "ожидаемÑ\8bй Ñ\84оÑ\80маÑ\82: %%(color:<color>)"
 
-#: sequencer.c:487
+#: ref-filter.c:57
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "У ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а %s Ð½ÐµÑ\82 Ð¿Ñ\80едка %d"
+msgid "unrecognized color: %%(color:%s)"
+msgstr "неопознаннÑ\8bй Ñ\86веÑ\82: %%(color:%s)"
 
-#: sequencer.c:491
+#: ref-filter.c:71
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Ð\9eÑ\81новнаÑ\8f Ð²ÐµÑ\82ка Ñ\83казана, Ð½Ð¾ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\81лиÑ\8fнием."
+msgid "unrecognized format: %%(%s)"
+msgstr "неопознаннÑ\8bй Ñ\84оÑ\80маÑ\82: %%(%s)"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#: ref-filter.c:77
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: не удалось разобрать родительский коммит для %s"
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) не принимает аргументов"
 
-#: sequencer.c:508
+#: ref-filter.c:84
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Не удалось получить сообщение коммита для %s"
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) не принимает аргументов"
 
-#: sequencer.c:594
+#: ref-filter.c:101
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ð±Ñ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а %sâ\80¦ %s"
+msgid "positive value expected contents:lines=%s"
+msgstr "положиÑ\82елÑ\8cное Ð·Ð½Ð°Ñ\87ение Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ\82 Ñ\81одеÑ\80жимое:lines=%s"
 
-#: sequencer.c:595
+#: ref-filter.c:103
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "не удалось применить коммит %s… %s"
-
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "передан пустой набор коммитов"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "неопознанный аргумент %%(contents): %s"
 
-#: sequencer.c:638
+#: ref-filter.c:113
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: сбой чтения индекса"
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "неопознанный аргумент %%(objectname): %s"
 
-#: sequencer.c:642
+#: ref-filter.c:135
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: сбой обновления индекса"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "ожидаемый формат: %%(align:<width>,<position>)"
 
-#: sequencer.c:702
+#: ref-filter.c:147
 #, c-format
-msgid "Cannot %s during a %s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c %s Ð²Ð¾ Ð²Ñ\80емÑ\8f %s"
+msgid "unrecognized position:%s"
+msgstr "неопознаннаÑ\8f Ð¿Ð¾Ð·Ð¸Ñ\86иÑ\8f:%s"
 
-#: sequencer.c:724
+#: ref-filter.c:151
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Не удалось разобрать строку %d."
-
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Коммиты не разобраны."
+msgid "unrecognized width:%s"
+msgstr "неопознанная ширина:%s"
 
-#: sequencer.c:741
+#: ref-filter.c:157
 #, c-format
-msgid "Could not open %s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c %s"
+msgid "unrecognized %%(align) argument: %s"
+msgstr "неопознаннÑ\8bй Ð°Ñ\80гÑ\83менÑ\82 %%(align): %s"
 
-#: sequencer.c:745
+#: ref-filter.c:161
 #, c-format
-msgid "Could not read %s."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c %s."
+msgid "positive width expected with the %%(align) atom"
+msgstr "ожидаеÑ\82Ñ\81Ñ\8f Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ\82елÑ\8cнаÑ\8f Ñ\88иÑ\80ина Ñ\81 Ñ\83казанием Ñ\87аÑ\81Ñ\82иÑ\86Ñ\8b %%(align)"
 
-#: sequencer.c:752
+#: ref-filter.c:244
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Ð\9dепÑ\80игоднаÑ\8f Ð´Ð»Ñ\8f Ð¸Ñ\81полÑ\8cзованиÑ\8f ÐºÐ°Ñ\80Ñ\82а Ñ\81 Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83кÑ\86иÑ\8fми: %s"
+msgid "malformed field name: %.*s"
+msgstr "непÑ\80авилÑ\8cное Ð¸Ð¼Ñ\8f Ð¿Ð¾Ð»Ñ\8f: %.*s"
 
-#: sequencer.c:782
+#: ref-filter.c:270
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Ð\9dедейÑ\81Ñ\82виÑ\82елÑ\8cнÑ\8bй ÐºÐ»Ñ\8eÑ\87: %s"
+msgid "unknown field name: %.*s"
+msgstr "неизвеÑ\81Ñ\82ное Ð¸Ð¼Ñ\8f Ð¿Ð¾Ð»Ñ\8f: %.*s"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: ref-filter.c:372
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Неправильное значение %s: %s"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "формат: частица %%(end) использована без соответствующей частицы"
 
-#: sequencer.c:795
+#: ref-filter.c:424
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Повреждённая карта с опциями: %s"
-
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "копирование или обращение изменений коммита уже выполняются"
+msgid "malformed format string %s"
+msgstr "неправильная строка формата %s"
 
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "попробуйте «git cherry-pick (--continue | --quit | --abort)»"
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= требует наличия положительного целого аргумента"
 
-#: sequencer.c:819
+#: ref-filter.c:883
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Не удалось создать каталог для указателя следования коммитов %s"
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "ссылка «%s» не содержит %ld компонент для :strip"
 
-#: sequencer.c:835 sequencer.c:916
+#: ref-filter.c:1046
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Ошибка оборачивания %s."
-
-#: sequencer.c:854 sequencer.c:986
-msgid "no cherry-pick or revert in progress"
-msgstr "копирование или обращение изменений коммита уже выполняются"
-
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "не удалось определить HEAD"
-
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
-msgstr "нельзя отменить изменения с ветки, которая еще не создана"
+msgid "unknown %.*s format %s"
+msgstr "неизвестный %.*s формат %s"
 
-#: sequencer.c:878 builtin/fetch.c:610 builtin/fetch.c:851
+#: ref-filter.c:1066 ref-filter.c:1097
 #, c-format
-msgid "cannot open %s"
-msgstr "не удалось открыть %s"
+msgid "missing object %s for %s"
+msgstr "не найден объект %s для %s"
 
-#: sequencer.c:880
+#: ref-filter.c:1069 ref-filter.c:1100
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "не удалось прочитать %s: %s"
-
-#: sequencer.c:881
-msgid "unexpected end of file"
-msgstr "неожиданный конец файла"
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "сбой при выполнении parse_object_buffer на %s для %s"
 
-#: sequencer.c:887
+#: ref-filter.c:1311
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "сохраненный файл с HEAD перед копированием коммита «%s» поврежден"
+msgid "malformed object at '%s'"
+msgstr "Повреждённый объект «%s»"
 
-#: sequencer.c:909
+#: ref-filter.c:1373
 #, c-format
-msgid "Could not format %s."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82Ñ\84оÑ\80маÑ\82иÑ\80оваÑ\82Ñ\8c %s."
+msgid "ignoring ref with broken name %s"
+msgstr "игноÑ\80иÑ\80Ñ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 Ñ\81 Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\8bм Ð¸Ð¼ÐµÐ½ÐµÐ¼ %s"
 
-#: sequencer.c:1054
+#: ref-filter.c:1378
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: не удалось скопировать коммит %s"
+msgid "ignoring broken ref %s"
+msgstr "игнорирую неправильную ссылку %s"
 
-#: sequencer.c:1057
+#: ref-filter.c:1633
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: плохая редакция"
-
-#: sequencer.c:1091
-msgid "Can't revert as initial commit"
-msgstr "Нельзя обратить изменения изначального коммита"
-
-#: sequencer.c:1092
-msgid "Can't cherry-pick into empty head"
-msgstr "Нельзя скопировать коммит в пустую ветку"
+msgid "format: %%(end) atom missing"
+msgstr "format: пропущена частица %%(end)"
 
-#: setup.c:248
+#: ref-filter.c:1687
 #, c-format
-msgid "failed to read %s"
-msgstr "не удалось прочитать %s"
+msgid "malformed object name %s"
+msgstr "неправильное имя объекта %s"
 
-#: setup.c:468
+#: remote.c:746
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Ожидаемая версия git репозитория <= %d, а обнаружена %d"
-
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "обнаружены неизвестные расширения репозитория:"
-
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "сдвиг до конца файла пакета (возможно, повреждён файл .idx?)"
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Нельзя извлечь одновременно %s и %s в %s"
 
-#: sha1_file.c:2458
+#: remote.c:750
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "сдвиг до начала индекса пакета для %s (повреждён индекс?)"
+msgid "%s usually tracks %s, not %s"
+msgstr "%s обычно отслеживает %s, а не %s"
 
-#: sha1_file.c:2462
+#: remote.c:754
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "сдвиг за пределами индекса пакета для %s (обрезан индекс?)"
+msgid "%s tracks both %s and %s"
+msgstr "%s отслеживает и %s и %s"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr "Обычно Git не создает ссылки, оканчивающиеся на 40 шестнадцатеричных\nсимволов, потому, что они будут игнорироваться, когда вы просто\nукажете это 40-символьное шестнадцатеричное число. Такие ссылки\nмогли быть созданы по ошибке. Например, с помощью:\n\n  git checkout -b $br $(git rev-parse …)\n\n, если «$br» оказался пустым, то ссылка с 40-символьным\nшестнадцатеричным числом будет создана. Пожалуйста, просмотрите эти\nссылки и, возможно, удалите их. Вы можете отключить это сообщение\nзапустив «git config advice.objectNameWarning false»"
+#: remote.c:762
+msgid "Internal error"
+msgstr "Внутренняя ошибка"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr "Не удалось изменить не слитый .gitmodules, сначала разрешите конфликты"
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD не указывает на ветку"
 
-#: submodule.c:68 submodule.c:102
+#: remote.c:1686
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð½Ð°Ð¹Ñ\82и Ñ\80аздел Ð² .gitmodules, Ð³Ð´Ðµ Ð¿Ñ\83Ñ\82Ñ\8c Ñ\80авен %s"
+msgid "no such branch: '%s'"
+msgstr "неÑ\82 Ñ\82акой Ð²ÐµÑ\82ки: Â«%s»"
 
-#: submodule.c:76
+#: remote.c:1689
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr " Не удалось обновить .gitmodules запись %s"
+msgid "no upstream configured for branch '%s'"
+msgstr "вышестоящая ветка не настроена для ветки «%s»"
 
-#: submodule.c:109
+#: remote.c:1695
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Не удалось удалить запись в .gitmodules для %s"
-
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "сбой индексирования обновленного .gitmodules"
-
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "нельзя использовать отприцательные значения для submodule.fetchJobs"
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "вышестоящая ветка «%s» не сохранена как отслеживаемая ветка"
 
-#: submodule-config.c:355
+#: remote.c:1710
 #, c-format
-msgid "invalid value for %s"
-msgstr "непÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение %s"
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "назнаÑ\87ение Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки Â«%s» Ð½Ð° Ð²Ð½ÐµÑ\88нем Ñ\81еÑ\80веÑ\80е Â«%s» Ð½Ðµ Ð¸Ð¼ÐµÐµÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cной Ð¾Ñ\82Ñ\81леживаемой Ð²ÐµÑ\82ки"
 
-#: trailer.c:237
+#: remote.c:1725
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "сбой при запуске команды завершителя «%s»"
+msgid "branch '%s' has no remote for pushing"
+msgstr "ветка «%s» не имеет внешнего сервера для отправки"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: remote.c:1736
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "неизвестное значение «%s» для ключа «%s»"
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "спецификации пути для отправки «%s» не включают в себя «%s»"
+
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "отправка не имеет точки назначения (push.default выставлен в «nothing»)"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "не удалось выполнить «simple» отправку в единственную точку назначения"
+
+#: remote.c:2073
 #, c-format
-msgid "more than one %s"
-msgstr "больше одного %s"
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "Ваша ветка базируется на «%s», но вышестоящий репозиторий исчез.\n"
+
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "(для исправления запустите «git branch --unset-upstream»)\n"
 
-#: trailer.c:582
+#: remote.c:2080
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "пÑ\83Ñ\81Ñ\82аÑ\8f Ð¿Ð¾Ñ\81леднÑ\8fÑ\8f Ð»ÐµÐºÑ\81ема Ð² Ð·Ð°Ð²ÐµÑ\80Ñ\88иÑ\82еле Â«%.*s»"
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Ð\92аÑ\88а Ð²ÐµÑ\82ка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° Ð² Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вии Ñ\81 Â«%s».\n"
 
-#: trailer.c:702
+#: remote.c:2084
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "не удалось прочитать входной файл «%s»"
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Ваша ветка опережает «%s» на %d коммит.\n"
+msgstr[1] "Ваша ветка опережает «%s» на %d коммита.\n"
+msgstr[2] "Ваша ветка опережает «%s» на %d коммитов.\n"
+msgstr[3] "Ваша ветка опережает «%s» на %d коммитов.\n"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "не удалось прочитать из стандартного ввода"
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (используйте «git push», чтобы опубликовать ваши локальные коммиты)\n"
 
-#: trailer.c:857 builtin/am.c:42
+#: remote.c:2093
 #, c-format
-msgid "could not stat %s"
-msgstr "не удалось выполнить stat для %s"
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] "Ваша ветка отстает от «%s» на %d коммит и может быть перемотана вперед.\n"
+msgstr[1] "Ваша ветка отстает от «%s» на %d коммита и может быть перемотана вперед.\n"
+msgstr[2] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
+msgstr[3] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
 
-#: trailer.c:859
-#, c-format
-msgid "file %s is not a regular file"
-msgstr "файл %s не является обычным файлом"
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (используйте «git pull», чтобы обновить вашу локальную ветку)\n"
 
-#: trailer.c:861
+#: remote.c:2104
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "файл %s не доступен на запись пользователю"
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разный коммит в каждой соответственно.\n"
+msgstr[1] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммита в каждой соответственно.\n"
+msgstr[2] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
+msgstr[3] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "не удалось создать временный файл"
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr "  (используйте «git pull», чтобы слить внешнюю ветку в вашу)\n"
 
-#: trailer.c:912
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr "не удалось переименовать временный файл в %s"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "похоже, ваша текущая ветка повреждена"
 
-#: transport-helper.c:1041
+#: revision.c:2161
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\81Ñ\81Ñ\8bлкÑ\83 %s"
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "ваÑ\88а Ñ\82екÑ\83Ñ\89аÑ\8f Ð²ÐµÑ\82ка Â«%s» ÐµÑ\89е Ð½Ðµ Ñ\81одеÑ\80жиÑ\82 Ð½Ð¸ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
-#: unpack-trees.c:64
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you can switch branches."
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%sСделайте коммит или спрячьте ваши изменения перед переключением веток."
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "опцию --first-parent нельзя использовать одновременно с --bisect"
 
-#: unpack-trees.c:66
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%s"
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "сбой открытия /dev/null"
 
-#: unpack-trees.c:69
+#: run-command.c:108
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you can merge."
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%sСделайте коммит или спрячьте ваши изменения перед слиянием веток."
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) сбой"
 
-#: unpack-trees.c:71
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%s"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "сбой подписания сертификата отправки"
 
-#: unpack-trees.c:74
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you can %s."
-msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при %s:\n%%sСделайте коммит или спрячьте ваши изменения перед %s."
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "принимающая сторона не поддерживает отправку с опцией --signed"
 
-#: unpack-trees.c:76
-#, c-format
+#: send-pack.c:412
 msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr "Ð\92аÑ\88и Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ñ\83казаннÑ\8bÑ\85 Ñ\84айлаÑ\85 Ð±Ñ\83дÑ\83Ñ\82 Ð¿ÐµÑ\80езапиÑ\81анÑ\8b Ð¿Ñ\80и %s:\n%%s"
+"not sending a push certificate since the receiving end does not support "
+"--signed push"
+msgstr "не Ð¾Ñ\82пÑ\80авлÑ\8fем Ñ\81еÑ\80Ñ\82иÑ\84икаÑ\82 Ð´Ð»Ñ\8f Ð¾Ñ\82пÑ\80авки, Ñ\82ак ÐºÐ°Ðº Ð¿Ñ\80инимаÑ\8eÑ\89аÑ\8f Ñ\81Ñ\82оÑ\80она Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 Ð¾Ñ\82пÑ\80авкÑ\83 Ñ\81 Ð¾Ð¿Ñ\86ией --signed"
 
-#: unpack-trees.c:81
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr "Обновление указанных каталогов приведет к потере неотслеживаемых файлов в них:\n%s"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "принимающая сторона не поддерживает отправку с опцией --atomic"
 
-#: unpack-trees.c:85
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you can switch branches."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "принимающая сторона не поддерживает отправку с опциями"
 
-#: unpack-trees.c:87
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%s"
+#: sequencer.c:171
+msgid "revert"
+msgstr "обратить изменения"
 
-#: unpack-trees.c:90
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you can merge."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "копировать коммит"
 
-#: unpack-trees.c:92
-#, c-format
+#: sequencer.c:228
 msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr "УказаннÑ\8bе Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b Ð² Ñ\80абоÑ\87ем ÐºÐ°Ñ\82алоге Ð±Ñ\83дÑ\83Ñ\82 Ñ\83даленÑ\8b Ð¿Ñ\80и Ñ\81лиÑ\8fнии:\n%%s"
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr "поÑ\81ле Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84ликÑ\82ов, Ð¿Ð¾Ð¼ÐµÑ\82Ñ\8cÑ\82е Ð¸Ñ\81пÑ\80авленнÑ\8bе Ð¿Ñ\83Ñ\82и\nÑ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e Â«git add <пÑ\83Ñ\82и>» Ð¸Ð»Ð¸ Â«git rm <пÑ\83Ñ\82и>»"
 
-#: unpack-trees.c:95
-#, c-format
+#: sequencer.c:231
 msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you can %s."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%sПереместите эти файлы или удалите их перед %s."
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr "после разрешения конфликтов, пометьте исправленные пути\nс помощью «git add <пути>» или «git rm <пути>»\nи сделайте коммит с помощью «git commit»"
 
-#: unpack-trees.c:97
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%s"
+msgid "could not lock '%s'"
+msgstr "не удалось заблокировать «%s»"
 
-#: unpack-trees.c:102
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by checkout:\n"
-"%%sPlease move or remove them before you can switch branches."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+msgid "could not write to '%s'"
+msgstr "не удалось записать в «%s»"
 
-#: unpack-trees.c:104
+#: sequencer.c:251
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by checkout:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%s"
+msgid "could not write eol to '%s'"
+msgstr "не удалось записать eol в «%s»"
 
-#: unpack-trees.c:107
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you can merge."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
+msgid "failed to finalize '%s'."
+msgstr "не удалось завершить «%s»."
 
-#: unpack-trees.c:109
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%s"
+msgid "could not read '%s'"
+msgstr "не удалось прочитать «%s»"
 
-#: unpack-trees.c:112
+#: sequencer.c:305
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you can %s."
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при %s:\n%%sПереместите эти файлы или удалите их перед %s."
+msgid "your local changes would be overwritten by %s."
+msgstr "ваши локальные изменения будут перезаписаны %s."
 
-#: unpack-trees.c:114
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при %s:\n%%s"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "для продолжения закоммитьте ваши изменения или спрячьте их."
 
-#: unpack-trees.c:121
+#: sequencer.c:324
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "Запись «%s» частично совпадает с «%s».  Не удалось назначить соответствие."
+msgid "%s: fast-forward"
+msgstr "%s: перемотка вперед"
 
-#: unpack-trees.c:124
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr "Не удалось обновить частичное состояние: следующие элементы не последней версии:\n%s"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Не удалось записать файл индекса"
 
-#: unpack-trees.c:126
-#, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout update:\n"
-"%s"
-msgstr "Указанные файлы из рабочего каталога будут перезаписаны при обновлении частичного состояния:\n%s"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "не удалось распознать HEAD коммит\n"
 
-#: unpack-trees.c:128
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "не удалось обновить дерево кэша\n"
+
+#: sequencer.c:483
 #, c-format
 msgid ""
-"The following Working tree files would be removed by sparse checkout update:\n"
-"%s"
-msgstr "Указанные файлы из рабочего каталога будут удалены при обновлении частичного состояния:\n%s"
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
+msgstr "у вас имеются проиндексированные изменения в рабочем каталоге. Если эти изменения должны быть объеденены с предыдущим коммитом, то запустите:\n\n  git commit --amend %s\n\nЕсли же они должны быть помещены в новый коммит, то запустите:\n\n  git commit %s\n\nВ любом случае, после того как вы закончите, продолжить перемещение можно выполнив:\n\n  git rebase --continue\n"
 
-#: unpack-trees.c:205
+#: sequencer.c:567
 #, c-format
-msgid "Aborting\n"
-msgstr "Прерываю\n"
-
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Распаковка файлов"
+msgid "could not parse commit %s\n"
+msgstr "не удалось разобрать коммит %s\n"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "Неправильная имя URL схемы или пропущен суффикс «://»"
-
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:572
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "неправильная управляющая последовательность %XX"
-
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "пропущено имя сервера и схема доступа не «file:»"
-
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "URL со схемой «file:» не может содержать номер порта"
-
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "неправильные символы в имени сервера"
-
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "неправильный номер порта"
+msgid "could not parse parent commit %s\n"
+msgstr "не удалось разобрать родительский коммит %s\n"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\87аÑ\81Ñ\82Ñ\8c Ð¿Ñ\83Ñ\82и Â«..»"
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "ваÑ\88 Ð¸Ð½Ð´ÐµÐºÑ\81 Ð½Ðµ Ñ\81лиÑ\82."
 
-#: wrapper.c:222 wrapper.c:381
+#: sequencer.c:675
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s» Ð´Ð»Ñ\8f Ñ\87Ñ\82ениÑ\8f Ð¸ Ð·Ð°Ð¿Ð¸Ñ\81и"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "коммиÑ\82 %s â\80\94 Ñ\8dÑ\82о ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82\81лиÑ\8fние, Ð½Ð¾ Ð¾Ð¿Ñ\86иÑ\8f -m Ð½Ðµ Ñ\83казана."
 
-#: wrapper.c:224 wrapper.c:383 builtin/am.c:779
+#: sequencer.c:683
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "не удалось открыть «%s» для записи"
+msgid "commit %s does not have parent %d"
+msgstr "у коммита %s нет предка %d"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/am.c:772
-#: builtin/am.c:860 builtin/commit.c:1711 builtin/merge.c:1086
-#: builtin/pull.c:407
+#: sequencer.c:687
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s» Ð´Ð»Ñ\8f Ñ\87Ñ\82ениÑ\8f"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "оÑ\81новнаÑ\8f Ð²ÐµÑ\82ка Ñ\83казана, Ð½Ð¾ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\81лиÑ\8fнием."
 
-#: wrapper.c:594 wrapper.c:615
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
 #, c-format
-msgid "unable to access '%s'"
-msgstr "«%s» недоступно"
-
-#: wrapper.c:623
-msgid "unable to get current working directory"
-msgstr "не удалось получить текущий рабочий каталог"
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: не удалось разобрать родительский коммит для %s"
 
-#: wrapper.c:650
+#: sequencer.c:705
 #, c-format
-msgid "could not open %s for writing"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s» Ð´Ð»Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81и"
+msgid "cannot get commit message for %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ñ\81ообÑ\89ение ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð´Ð»Ñ\8f %s"
 
-#: wrapper.c:661 builtin/am.c:410
+#: sequencer.c:797
 #, c-format
-msgid "could not write to %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð² %s"
+msgid "could not revert %s... %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ð±Ñ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а %sâ\80¦ %s"
 
-#: wrapper.c:667
+#: sequencer.c:798
 #, c-format
-msgid "could not close %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°ÐºÑ\80Ñ\8bÑ\82Ñ\8c %s"
+msgid "could not apply %s... %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80имениÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %sâ\80¦ %s"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Ð\9dе Ñ\81лиÑ\82Ñ\8bе Ð¿Ñ\83Ñ\82и:"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "пеÑ\80едан Ð¿Ñ\83Ñ\81Ñ\82ой Ð½Ð°Ð±Ð¾Ñ\80 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов"
 
-#: wt-status.c:177 wt-status.c:204
+#: sequencer.c:843
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (используйте «git reset %s <файл>…», чтобы убрать из индекса)"
-
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)"
+msgid "git %s: failed to read the index"
+msgstr "git %s: сбой чтения индекса"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (используйте «git add <файл>…», чтобы пометить разрешение конфликта)"
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: сбой обновления индекса"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (используйте «git add/rm <файл>…», чтобы пометить выбранное разрешение конфликта)"
+#: sequencer.c:944
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "неправильная строка %d: %.*s"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (используйте «git rm <файл>…», чтобы пометить разрешение конфликта)"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "коммиты не разобраны."
 
-#: wt-status.c:198 wt-status.c:881
-msgid "Changes to be committed:"
-msgstr "Изменения, которые будут включены в коммит:"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "не удалось прочитать «%s»."
 
-#: wt-status.c:216 wt-status.c:890
-msgid "Changes not staged for commit:"
-msgstr "Изменения, которые не в индексе для коммита:"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "непригодная для использования карта с инструкциями: «%s»"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (используйте «git add <файл>…», чтобы добавить файл в индекс)"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "нельзя скопировать коммит во время процесса обращения коммита."
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (используйте «git add/rm <файл>…», чтобы добавить или удалить файл из индекса)"
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "нельзя обратить изменения коммита во время копирования коммита."
 
-#: wt-status.c:223
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working "
-"directory)"
-msgstr "  (используйте «git checkout -- <файл>…», чтобы отменить изменения\n   в рабочем каталоге)"
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "недействительный ключ: %s"
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr "  (сделайте коммит или отмените изменения в неотслеживаемом или измененном содержимом в подмодулях)"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "неправильное значение %s: %s"
 
-#: wt-status.c:237
+#: sequencer.c:1063
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (используйте «git %s <файл>…», чтобы добавить в то, что будет включено в коммит)"
+msgid "malformed options sheet: '%s'"
+msgstr "испорченная карта с опциями: «%s»"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "оба Ñ\83даленÑ\8b:"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "копиÑ\80ование Ð¸Ð»Ð¸ Ð¾Ð±Ñ\80аÑ\89ение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ñ\83же Ð²Ñ\8bполнÑ\8fÑ\8eÑ\82Ñ\81Ñ\8f"
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "добавлено Ð½Ð°Ð¼Ð¸:"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "попÑ\80обÑ\83йÑ\82е Â«git cherry-pick (--continue | --quit | --abort)»"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "удалено ими:"
+#: sequencer.c:1106
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "не удалось создать каталог для указателя следования коммитов «%s»"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "добавлено Ð¸Ð¼Ð¸:"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c HEAD"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "удалено нами:"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "копирование или обращение изменений коммита уже выполняются"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "оба Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ\8b:"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ð¿Ñ\80еделиÑ\82Ñ\8c HEAD"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "оба Ð¸Ð·Ð¼ÐµÐ½Ñ\8b:"
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "нелÑ\8cзÑ\8f Ð¾Ñ\82мениÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ñ\81 Ð²ÐµÑ\82ки, ÐºÐ¾Ñ\82оÑ\80аÑ\8f ÐµÑ\89е Ð½Ðµ Ñ\81оздана"
 
-#: wt-status.c:266
+#: sequencer.c:1175 builtin/grep.c:578
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "оÑ\88ибка: Ð½ÐµÐ¾Ð±Ñ\80абоÑ\82аннÑ\8bй Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81 Ð½Ðµ Ñ\81лиÑ\82Ñ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ %x"
+msgid "cannot open '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s»"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "новый файл:"
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "не удалось прочитать «%s»: %s"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "скопировано:"
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "неожиданный конец файла"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "удалено:"
+#: sequencer.c:1184
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "сохраненный файл с HEAD перед копированием коммита «%s» поврежден"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "изменено:"
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: не удалось скопировать коммит %s"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "переименовано:"
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: плохая редакция"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "изменен Ñ\82ип:"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "нелÑ\8cзÑ\8f Ð²Ð¾Ð·Ð²Ñ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð½Ð°Ñ\87алÑ\8cнÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "неизвестно:"
+#: setup.c:160
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr "%s: нет такого пути в рабочем каталоге.\nИспользуйте «git <команда> -- <путь>…» для указания путей, которые не существуют локально."
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "не слитые:"
+#: setup.c:173
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr "неоднозначный аргумент «%s»: неизвестная редакция или не путь в рабочем каталоге.\nИспользуйте «--» для отделения путей от редакций, вот так:\n«git <команда> [<редакция>…] -- [<файл>…]»"
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "новые коммиты, "
+#: setup.c:223
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr "неоднозначный аргумент «%s»: является одновременно и редакцией и именем файла.\nИспользуйте «--» для отделения путей от редакций, вот так:\n«git <команда> [<редакция>…] -- [<файл>…]»"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "изменено содержимое, "
+#: setup.c:468
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Ожидаемая версия git репозитория <= %d, а обнаружена %d"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "неоÑ\82Ñ\81леживаемое Ñ\81одеÑ\80жимое, "
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "обнаÑ\80Ñ\83женÑ\8b Ð½ÐµÐ¸Ð·Ð²ÐµÑ\81Ñ\82нÑ\8bе Ñ\80аÑ\81Ñ\88иÑ\80ениÑ\8f Ñ\80епозиÑ\82оÑ\80иÑ\8f:"
 
-#: wt-status.c:391
+#: setup.c:762
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "оÑ\88ибка: Ð½ÐµÐ¾Ð±Ñ\80абоÑ\82аннÑ\8bй Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ %c"
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Ð\9dе Ð½Ð°Ð¹Ð´ÐµÐ½ git Ñ\80епозиÑ\82оий (или Ð¾Ð´Ð¸Ð½ Ð¸Ð· ÐµÐ³Ð¾ ÐºÐ°Ñ\82алогов): %s"
 
-#: wt-status.c:755
-msgid "Submodules changed but not updated:"
-msgstr "Ð\98змененнÑ\8bе, Ð½Ð¾ Ð½Ðµ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8bе Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли:"
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð²ÐµÑ\80нÑ\83Ñ\82Ñ\8cÑ\81Ñ\8f Ð² Ñ\82екÑ\83Ñ\89ий Ñ\80абоÑ\87ий ÐºÐ°Ñ\82алог"
 
-#: wt-status.c:757
-msgid "Submodule changes to be committed:"
-msgstr "Ð\98зменениÑ\8f Ð² Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8fÑ\85, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\87енÑ\8b:"
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ñ\80абоÑ\87ий ÐºÐ°Ñ\82алог"
 
-#: wt-status.c:838
+#: setup.c:920
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr "Не трогайте строку выше этой.\nВсё, что ниже — будет удалено."
-
-#: wt-status.c:949
-msgid "You have unmerged paths."
-msgstr "У вас есть не слитые пути."
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr "Не найден git репозитоий (или один из его каталогов вплоть до точки монтирования %s)\nОстанавливаю поиск на границе файловой системы (так как GIT_DISCOVERY_ACROSS_FILESYSTEM не установлен)."
 
-#: wt-status.c:952
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (разрешите конфликты, затем запустите «git commit»)"
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "Перейти в «%s/..»"
 
-#: wt-status.c:956
-msgid "All conflicts fixed but you are still merging."
-msgstr "Все конфликты исправлены, но вы все еще в процессе слияния."
+#: setup.c:989
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr "Проблема со значением режима доступа к файлу core.sharedRepository (0%.3o).\nВладелец файлов должен всегда иметь права на чтение и на запись."
 
-#: wt-status.c:959
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (используйте «git commit», чтобы завершить слияние)"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "путь «%s» не существует"
 
-#: wt-status.c:969
-msgid "You are in the middle of an am session."
-msgstr "Вы в процессе сессии am."
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "ссылаемый репозиторий «%s» как связанное состояние, пока не поддерживается."
 
-#: wt-status.c:972
-msgid "The current patch is empty."
-msgstr "Текущий патч пустой."
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "ссылаемый репозиторий «%s» не является локальным."
 
-#: wt-status.c:976
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git am --continue»)"
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "ссылаемый репозиторий «%s» является частичным"
 
-#: wt-status.c:978
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (используйте «git am --skip», чтобы пропустить этот патч)"
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "ссылаемый репозиторий «%s» является сращенным"
 
-#: wt-status.c:980
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (используйте «git am --abort», чтобы восстановить оригинальную ветку)"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "сдвиг до конца файла пакета (возможно, повреждён файл .idx?)"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "Команды не выполнены."
+#: sha1_file.c:2592
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "сдвиг до начала индекса пакета для %s (повреждён индекс?)"
 
-#: wt-status.c:1108
+#: sha1_file.c:2596
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Последняя команда выполнена (%d команда выполнена):"
-msgstr[1] "Последняя команда выполнена (%d команды выполнено):"
-msgstr[2] "Последняя команда выполнена (%d команд выполнено):"
-msgstr[3] "Последняя команда выполнена (%d команд выполнено):"
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "сдвиг за пределами индекса пакета для %s (обрезан индекс?)"
 
-#: wt-status.c:1119
+#: sha1_name.c:407
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (смотрите дополнительно в файле %s)"
+msgid "short SHA1 %s is ambiguous"
+msgstr "сокращённый SHA1 идентификатор %s неоднозначен"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Команд больше не осталось."
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Возможно, вы имели в виду:"
+
+#: sha1_name.c:578
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr "Обычно Git не создает ссылки, оканчивающиеся на 40 шестнадцатеричных\nсимволов, потому, что они будут игнорироваться, когда вы просто\nукажете это 40-символьное шестнадцатеричное число. Такие ссылки\nмогли быть созданы по ошибке. Например, с помощью:\n\n  git checkout -b $br $(git rev-parse …)\n\n, если «$br» оказался пустым, то ссылка с 40-символьным\nшестнадцатеричным числом будет создана. Пожалуйста, просмотрите эти\nссылки и, возможно, удалите их. Вы можете отключить это сообщение\nзапустив «git config advice.objectNameWarning false»"
 
-#: wt-status.c:1127
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr "Не удалось изменить не слитый .gitmodules, сначала разрешите конфликты"
+
+#: submodule.c:68 submodule.c:102
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Следующая команда для выполнения (%d команда осталась):"
-msgstr[1] "Следующая команда для выполнения (%d команды осталось):"
-msgstr[2] "Следующая команда для выполнения (%d команд осталось):"
-msgstr[3] "Следующая команда для выполнения (%d команд осталось):"
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Не удалось найти раздел в .gitmodules, где путь равен %s"
 
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (используйте «git rebase --edit-todo», чтобы просмотреть и изменить)"
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr " Не удалось обновить .gitmodules запись %s"
 
-#: wt-status.c:1148
+#: submodule.c:109
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð¿ÐµÑ\80емеÑ\89аеÑ\82е Ð²ÐµÑ\82кÑ\83 Â«%s» Ð½Ð°Ð´ Â«%s»."
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð² .gitmodules Ð´Ð»Ñ\8f %s"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Вы сейчас перемещаете ветку."
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "сбой индексирования обновленного .gitmodules"
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git rebase --continue»)"
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "нельзя использовать отприцательные значения для submodule.fetchJobs"
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (используйте «git rebase --skip», чтобы пропустить этот патч)"
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "неправильное значение %s"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (используйте «git rebase --abort», чтобы перейти на оригинальную ветку)"
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "сбой при запуске команды завершителя «%s»"
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git rebase --continue»)"
+#: trailer.c:471 trailer.c:475 trailer.c:479 trailer.c:533 trailer.c:537
+#: trailer.c:541
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "неизвестное значение «%s» для ключа «%s»"
 
-#: wt-status.c:1181
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "Вы сейчас разделяете коммит при перемещении ветки  «%s» над «%s»."
+msgid "more than one %s"
+msgstr "больше одного %s"
 
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Вы сейчас разделяете коммит при перемещении ветки."
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "пустая последняя лексема в завершителе «%.*s»"
 
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "(Как только ваш рабочий каталог будет чистый, запустите «git rebase --continue»)"
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "не удалось прочитать входной файл «%s»"
 
-#: wt-status.c:1193
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "не удалось прочитать из стандартного ввода"
+
+#: trailer.c:929 builtin/am.c:44
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ñ\80едакÑ\82иÑ\80Ñ\83еÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¿Ñ\80и Ð¿ÐµÑ\80емеÑ\89ении Ð²ÐµÑ\82ки  Â«%s» Ð½Ð°Ð´ Â«%s»."
+msgid "could not stat %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c stat Ð´Ð»Ñ\8f %s"
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "Вы сейчас редактируете коммит при перемещении ветки."
+#: trailer.c:931
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "файл %s не является обычным файлом"
 
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (используйте «git commit --amend», чтобы исправить текущий коммит)"
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "файл %s не доступен на запись пользователю"
 
-#: wt-status.c:1203
-msgid "  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (используйте «git rebase --continue», когда будете довольны изменениями)"
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "не удалось создать временный файл"
 
-#: wt-status.c:1213
+#: trailer.c:983
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Ð\92Ñ\8b ÐºÐ¾Ð¿Ð¸Ñ\80Ñ\83еÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s."
+msgid "could not rename temporary file to %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c Ð²Ñ\80еменнÑ\8bй Ñ\84айл Ð² %s"
 
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git cherry-pick --continue»)"
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Будет установлен вышестоящий репозиторий для «%s» на «%s» с «%s»\n"
 
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git cherry-pick --continue»)"
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "транспорт: неправильный параметр глубины «%s»"
 
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (используйте «git cherry-pick --abort», чтобы отменить копирования коммита)"
+#: transport.c:817
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr "Подмодули по указанным путям содержат изменения, которые не найдены ни на одном из внешних репозиториев:\n"
 
-#: wt-status.c:1232
+#: transport.c:821
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Вы сейчас обращаете изменения коммита %s."
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr "\nПопробуйте выполнить\n\n\tgit push --recurse-submodules=on-demand\n\nили перейти в каталог с помощью команды cd и выполнить\n\n\tgit push\n\nдля их отправки на внешний репозиторий.\n"
+
+#: transport.c:829
+msgid "Aborting."
+msgstr "Прерываю."
+
+#: transport-helper.c:1075
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Не удалось прочитать ссылку %s"
 
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git revert --continue»)"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "слишком  короткий объект дерева"
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git revert --continue»)"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "неправильный режим в записи дерева"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (используйте «git revert --abort», чтобы отменить операцию обращения изменений коммита)"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "пустое имя файла в записи дерева"
 
-#: wt-status.c:1253
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "слишком  короткий файл дерева"
+
+#: unpack-trees.c:64
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Вы сейчас в процессе двоичного поиска, начатого с ветки «%s»."
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%sСделайте коммит или спрячьте ваши изменения перед переключением веток."
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "Вы сейчас в процессе двоичного поиска."
+#: unpack-trees.c:66
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%s"
 
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (используйте «git bisect reset», чтобы вернуться на исходную ветку)"
+#: unpack-trees.c:69
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%sСделайте коммит или спрячьте ваши изменения перед слиянием веток."
 
-#: wt-status.c:1460
-msgid "On branch "
-msgstr "На ветке "
+#: unpack-trees.c:71
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%s"
 
-#: wt-status.c:1466
-msgid "interactive rebase in progress; onto "
-msgstr "интерактивное перемещение в процессе; над "
+#: unpack-trees.c:74
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при %s:\n%%sСделайте коммит или спрячьте ваши изменения перед %s."
 
-#: wt-status.c:1468
-msgid "rebase in progress; onto "
-msgstr "перемещение в процессе; над "
+#: unpack-trees.c:76
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при %s:\n%%s"
 
-#: wt-status.c:1473
-msgid "HEAD detached at "
-msgstr "HEAD отделён на "
+#: unpack-trees.c:81
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr "Обновление указанных каталогов приведет к потере неотслеживаемых файлов в них:\n%s"
 
-#: wt-status.c:1475
-msgid "HEAD detached from "
-msgstr "HEAD отделён начиная с "
+#: unpack-trees.c:85
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: wt-status.c:1478
-msgid "Not currently on any branch."
-msgstr "Сейчас ни на одной из веток"
+#: unpack-trees.c:87
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при переключении на состояние:\n%%s"
 
-#: wt-status.c:1496
-msgid "Initial commit"
-msgstr "Начальный коммит"
+#: unpack-trees.c:90
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: wt-status.c:1510
-msgid "Untracked files"
-msgstr "Неотслеживаемые файлы"
+#: unpack-trees.c:92
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при слиянии:\n%%s"
 
-#: wt-status.c:1512
-msgid "Ignored files"
-msgstr "Игнорируемые файлы"
+#: unpack-trees.c:95
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%sПереместите эти файлы или удалите их перед %s."
 
-#: wt-status.c:1516
+#: unpack-trees.c:97
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
-msgstr "%.2f секунды занял вывод списка неотслеживаемых файлов. «status -uno» возможно может ускорить это, но будьте внимательны, и не забудьте добавить новые файлы вручную (смотрите «git help status» для подробностей)."
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%s"
 
-#: wt-status.c:1522
+#: unpack-trees.c:102
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Неотслеживаемые файлы не показаны%s"
+msgid ""
+"The following untracked working tree files would be overwritten by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: wt-status.c:1524
-msgid " (use -u option to show untracked files)"
-msgstr "(используйте опцию «-u», чтобы показать неотслеживаемые файлы)"
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by checkout:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%s"
 
-#: wt-status.c:1530
-msgid "No changes"
-msgstr "Нет изменений"
+#: unpack-trees.c:107
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%sПереместите эти файлы или удалите их перед переключением веток."
 
-#: wt-status.c:1535
+#: unpack-trees.c:109
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr "нет изменений добавленных для коммита\n(используйте «git add» и/или «git commit -a»)\n"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%s"
 
-#: wt-status.c:1538
+#: unpack-trees.c:112
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "нет изменений добавленных для коммита\n"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при %s:\n%%sПереместите эти файлы или удалите их перед %s."
 
-#: wt-status.c:1541
+#: unpack-trees.c:114
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr "ниÑ\87его Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ Ð² ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82, Ð½Ð¾ ÐµÑ\81Ñ\82Ñ\8c Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b (иÑ\81полÑ\8cзÑ\83йÑ\82е Â«git add», Ñ\87Ñ\82обÑ\8b Ð¾Ñ\82Ñ\81леживаÑ\82Ñ\8c Ð¸Ñ\85)\n"
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr "УказаннÑ\8bе Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b Ð² Ñ\80абоÑ\87ем ÐºÐ°Ñ\82алоге Ð±Ñ\83дÑ\83Ñ\82 Ð¿ÐµÑ\80езапиÑ\81анÑ\8b Ð¿Ñ\80и %s:\n%%s"
 
-#: wt-status.c:1544
+#: unpack-trees.c:121
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "ниÑ\87его Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ Ð² ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82, Ð½Ð¾ ÐµÑ\81Ñ\82Ñ\8c Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b\n"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Ð\97апиÑ\81Ñ\8c Â«%s» Ñ\87аÑ\81Ñ\82иÑ\87но Ñ\81овпадаеÑ\82 Ñ\81 Â«%s».  Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð½Ð°Ð·Ð½Ð°Ñ\87иÑ\82Ñ\8c Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вие."
 
-#: wt-status.c:1547
+#: unpack-trees.c:124
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr "нечего коммитить (создайте/скопируйте файлы, затем запустите «git add», чтобы отслеживать их)\n"
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr "Не удалось обновить частичное состояние: следующие элементы не последней версии:\n%s"
 
-#: wt-status.c:1550 wt-status.c:1555
+#: unpack-trees.c:126
 #, c-format
-msgid "nothing to commit\n"
-msgstr "нечего коммитить\n"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout update:\n"
+"%s"
+msgstr "Указанные файлы из рабочего каталога будут перезаписаны при обновлении частичного состояния:\n%s"
 
-#: wt-status.c:1553
+#: unpack-trees.c:128
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr "нечего коммитить (используйте опцию «-u», чтобы показать неотслеживаемые файлы)\n"
+msgid ""
+"The following working tree files would be removed by sparse checkout update:\n"
+"%s"
+msgstr "Указанные файлы из рабочего каталога будут удалены при обновлении частичного состояния:\n%s"
 
-#: wt-status.c:1557
+#: unpack-trees.c:205
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "неÑ\87его ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82иÑ\82Ñ\8c, Ð½ÐµÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\80абоÑ\87ем ÐºÐ°Ñ\82алоге\n"
+msgid "Aborting\n"
+msgstr "Ð\9fÑ\80еÑ\80Ñ\8bваÑ\8e\n"
 
-#: wt-status.c:1664
-msgid "Initial commit on "
-msgstr "Ð\9dаÑ\87алÑ\8cнÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð½Ð° "
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "РаÑ\81паковка Ñ\84айлов"
 
-#: wt-status.c:1668
-msgid "HEAD (no branch)"
-msgstr "HEAD (нет ветки)"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "Неправильная имя URL схемы или пропущен суффикс «://»"
 
-#: wt-status.c:1697
-msgid "gone"
-msgstr "исчез"
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "неправильная управляющая последовательность %XX"
 
-#: wt-status.c:1699 wt-status.c:1707
-msgid "behind "
-msgstr "позади"
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "пропущено имя сервера и схема доступа не «file:»"
 
-#: wt-status.c:1702 wt-status.c:1705
-msgid "ahead "
-msgstr "впереди "
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "URL со схемой «file:» не может содержать номер порта"
+
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "неправильные символы в имени сервера"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "неправильный номер порта"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "неправильная часть пути «..»"
+
+#: worktree.c:282
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "сбой отсоединения «%s»"
+msgid "failed to read '%s'"
+msgstr "не удалось прочитать «%s»"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<опции>] [--] <спецификация-пути>…"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "не удалось открыть «%s» для чтения и записи"
 
-#: builtin/add.c:65
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "неожиданный статус различий %c"
+msgid "could not open '%s' for writing"
+msgstr "не удалось открыть «%s» для записи"
 
-#: builtin/add.c:70 builtin/commit.c:280
-msgid "updating files failed"
-msgstr "сбой при обновлении файлов"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:320 builtin/am.c:759
+#: builtin/am.c:847 builtin/commit.c:1705 builtin/merge.c:1029
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "не удалось открыть «%s» для чтения"
 
-#: builtin/add.c:80
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "remove '%s'\n"
-msgstr "удалить «%s»\n"
+msgid "unable to access '%s'"
+msgstr "«%s» недоступно"
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Ð\9dепÑ\80оиндекÑ\81иÑ\80ованнÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¿Ð¾Ñ\81ле Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f Ð¸Ð½Ð´ÐµÐºÑ\81а:"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ñ\80абоÑ\87ий ÐºÐ°Ñ\82алог"
 
-#: builtin/add.c:194 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Не удалось прочитать индекс"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "не удалось записать в %s"
 
-#: builtin/add.c:205
+#: wrapper.c:660
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Не удалось открыть «%s» для записи."
+msgid "could not close %s"
+msgstr "не удалось закрыть %s"
+
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Не слитые пути:"
+
+#: wt-status.c:178 wt-status.c:205
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (используйте «git reset %s <файл>…», чтобы убрать из индекса)"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "Не удалось записать патч"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "сбой при редактировании патча"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (используйте «git add <файл>…», чтобы пометить разрешение конфликта)"
 
-#: builtin/add.c:215
-#, c-format
-msgid "Could not stat '%s'"
-msgstr "Не удалось выполнить stat для «%s»"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr "  (используйте «git add/rm <файл>…», чтобы пометить выбранное разрешение конфликта)"
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Пустой патч. Операция прервана."
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (используйте «git rm <файл>…», чтобы пометить разрешение конфликта)"
 
-#: builtin/add.c:222
-#, c-format
-msgid "Could not apply '%s'"
-msgstr "Не удалось применить «%s»"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Изменения, которые будут включены в коммит:"
 
-#: builtin/add.c:232
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "СледÑ\83Ñ\8eÑ\89ие Ð¿Ñ\83Ñ\82и Ð¸Ð³Ð½Ð¾Ñ\80иÑ\80Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f Ð¾Ð´Ð½Ð¸Ð¼ Ð¸Ð· Ð²Ð°Ñ\88иÑ\85 Ñ\84айлов .gitignore:\n"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Ð\98зменениÑ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:511
-#: builtin/remote.c:1332 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "пробный запуск"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (используйте «git add <файл>…», чтобы добавить файл в индекс)"
 
-#: builtin/add.c:250 builtin/apply.c:4563 builtin/check-ignore.c:19
-#: builtin/commit.c:1333 builtin/count-objects.c:85 builtin/fsck.c:557
-#: builtin/log.c:1826 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "быть многословнее"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (используйте «git add/rm <файл>…», чтобы добавить или удалить файл из индекса)"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "интерактивный выбор"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working "
+"directory)"
+msgstr "  (используйте «git checkout -- <файл>…», чтобы отменить изменения\n   в рабочем каталоге)"
 
-#: builtin/add.c:253 builtin/checkout.c:1154 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "интерактивный выбор блоков"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr "  (сделайте коммит или отмените изменения в неотслеживаемом или измененном содержимом в подмодулях)"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "отредактировать текущий файл различий и применить его"
+#: wt-status.c:238
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (используйте «git %s <файл>…», чтобы добавить в то, что будет включено в коммит)"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "разрешить добавление игнорируемых иначе файлов"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "оба удалены:"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "обновиÑ\82Ñ\8c Ð¾Ñ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "добавлено Ð½Ð°Ð¼Ð¸:"
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
-msgstr "записать только факт, что путь будет добавлен позже"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "удалено ими:"
 
-#: builtin/add.c:258
-msgid "add changes from all tracked and untracked files"
-msgstr "добавиÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¸Ð· Ð²Ñ\81еÑ\85 Ð¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 Ð¸ Ð½ÐµÐ¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 Ñ\84айлов"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "добавлено Ð¸Ð¼Ð¸:"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "игнорировать пути удаленные из рабочего каталога (тоже, что и --no-all)"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "удалено нами:"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "не Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c, Ñ\82олÑ\8cко Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "оба Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ\8b:"
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
-msgstr "пÑ\80опÑ\83Ñ\81каÑ\82Ñ\8c Ñ\84айлÑ\8b, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½Ðµ Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ\8b Ð¸Ð·-за Ð¾Ñ\88ибок"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "оба Ð¸Ð·Ð¼ÐµÐ½Ñ\8b:"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "удостовериться, что даже недостающие файлы будут проигнорированы при  пробном запуске"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "новый файл:"
 
-#: builtin/add.c:287
-#, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Используйте -f, если вы действительно хотите добавить их.\n"
+#: wt-status.c:277
+msgid "copied:"
+msgstr "скопировано:"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "ошибка при добавлении файлов"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "удалено:"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A и -u нельзя использовать одновременно"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "изменено:"
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Ð\9eпÑ\86иÑ\8f --ignore-missing Ð¼Ð¾Ð¶ÐµÑ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f Ñ\82олÑ\8cко Ð²Ð¼ÐµÑ\81Ñ\82е Ñ\81 --dry-run"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "пеÑ\80еименовано:"
 
-#: builtin/add.c:352
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Ничего не указано, ничего не добавлено.\n"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "изменен тип:"
 
-#: builtin/add.c:353
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Возможно, вы имели в виду «git add .»?\n"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "неизвестно:"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:339 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "файл индекса поврежден"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "не слитые:"
 
-#: builtin/add.c:439 builtin/apply.c:4661 builtin/mv.c:283 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð½Ð¾Ð²Ñ\8bй Ñ\84айл Ð¸Ð½Ð´ÐµÐºÑ\81а"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "новÑ\8bе ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8b"
 
-#: builtin/am.c:256 builtin/commit.c:749 builtin/merge.c:1089
-#, c-format
-msgid "could not read '%s'"
-msgstr "не удалось прочитать «%s»"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "изменено содержимое, "
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "не удалось разобрать сценарий авторства"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "неотслеживаемое содержимое, "
 
-#: builtin/am.c:507
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "«%s» был удален перехватчиком applypatch-msg"
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Измененные, но не обновленные подмодули:"
 
-#: builtin/am.c:548 builtin/notes.c:300
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Неправильная строка ввода: «%s»."
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Изменения в подмодулях, которые будут закоммичены:"
 
-#: builtin/am.c:585 builtin/notes.c:315
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Не удалось скопировать заметку из «%s» в «%s»"
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr "Не трогайте строку выше этой.\nВсё, что ниже — будет удалено."
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "сбой при выполнении fseek"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "У вас есть не слитые пути."
 
-#: builtin/am.c:788
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "не удалось разобрать патч «%s»"
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (разрешите конфликты, затем запустите «git commit»)"
 
-#: builtin/am.c:853
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Только серия патчей StGIT может быть применена за раз"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (используйте «git merge --abort», чтобы остановить операцию слияния)"
 
-#: builtin/am.c:900
-msgid "invalid timestamp"
-msgstr "недопÑ\83Ñ\81Ñ\82имаÑ\8f Ð¼ÐµÑ\82ка Ð´Ð°Ñ\82Ñ\8b/вÑ\80емени"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Ð\92Ñ\81е ÐºÐ¾Ð½Ñ\84ликÑ\82Ñ\8b Ð¸Ñ\81пÑ\80авленÑ\8b, Ð½Ð¾ Ð²Ñ\8b Ð²Ñ\81е ÐµÑ\89е Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ñ\81лиÑ\8fниÑ\8f."
 
-#: builtin/am.c:903 builtin/am.c:911
-msgid "invalid Date line"
-msgstr "недопустимая строка даты"
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (используйте «git commit», чтобы завершить слияние)"
 
-#: builtin/am.c:908
-msgid "invalid timezone offset"
-msgstr "недопÑ\83Ñ\81Ñ\82имое Ñ\81меÑ\89ение Ñ\87аÑ\81ового Ð¿Ð¾Ñ\8fÑ\81а"
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Ð\92Ñ\8b Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ñ\81еÑ\81Ñ\81ии am."
 
-#: builtin/am.c:995
-msgid "Patch format detection failed."
-msgstr "Сбой Ð¾Ð¿Ñ\80еделениÑ\8f Ñ\84оÑ\80маÑ\82а Ð¿Ð°Ñ\82Ñ\87а."
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "ТекÑ\83Ñ\89ий Ð¿Ð°Ñ\82Ñ\87 Ð¿Ñ\83Ñ\81Ñ\82ой."
 
-#: builtin/am.c:1000 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "не удалось создать каталог «%s»"
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git am --continue»)"
 
-#: builtin/am.c:1004
-msgid "Failed to split patches."
-msgstr "Не удалось разделить патчи на части."
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (используйте «git am --skip», чтобы пропустить этот патч)"
 
-#: builtin/am.c:1136 builtin/commit.c:365
-msgid "unable to write index file"
-msgstr "не удалось записать индекс"
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (используйте «git am --abort», чтобы восстановить оригинальную ветку)"
 
-#: builtin/am.c:1187
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Когда вы устраните эту проблему, запустите «%s --continue»."
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Команды не выполнены."
 
-#: builtin/am.c:1188
+#: wt-status.c:1175
 #, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "Если вы хотите пропустить этот патч, то запустите «%s --skip»."
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Последняя команда выполнена (%d команда выполнена):"
+msgstr[1] "Последняя команда выполнена (%d команды выполнено):"
+msgstr[2] "Последняя команда выполнена (%d команд выполнено):"
+msgstr[3] "Последняя команда выполнена (%d команд выполнено):"
 
-#: builtin/am.c:1189
+#: wt-status.c:1186
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr "Чтобы вернуться на предыдущую ветку и остановить применение изменений, запустите «%s --abort»."
+msgid "  (see more in file %s)"
+msgstr "  (смотрите дополнительно в файле %s)"
 
-#: builtin/am.c:1327
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Ð\9fаÑ\82Ñ\87 Ð¿Ñ\83Ñ\81Ñ\82. Ð\92озможно, Ð¾Ð½ Ð±Ñ\8bл Ð½ÐµÐ¿Ñ\80авилÑ\8cно Ñ\80азделÑ\91н?"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Ð\9aоманд Ð±Ð¾Ð»Ñ\8cÑ\88е Ð½Ðµ Ð¾Ñ\81Ñ\82алоÑ\81Ñ\8c."
 
-#: builtin/am.c:1401 builtin/log.c:1516
+#: wt-status.c:1194
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "неправильная строка идентификации: %s"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Следующая команда для выполнения (%d команда осталась):"
+msgstr[1] "Следующая команда для выполнения (%d команды осталось):"
+msgstr[2] "Следующая команда для выполнения (%d команд осталось):"
+msgstr[3] "Следующая команда для выполнения (%d команд осталось):"
+
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (используйте «git rebase --edit-todo», чтобы просмотреть и изменить)"
 
-#: builtin/am.c:1428
+#: wt-status.c:1215
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð¿ÐµÑ\80емеÑ\89аеÑ\82е Ð²ÐµÑ\82кÑ\83 Â«%s» Ð½Ð°Ð´ Â«%s»."
 
-#: builtin/am.c:1630
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "В репозитории отсутствуют двоичные объекты, необходимые для отката к трехходовому слиянию."
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Вы сейчас перемещаете ветку."
 
-#: builtin/am.c:1632
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Использую индекс для реконструкции базового дерева…"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git rebase --continue»)"
 
-#: builtin/am.c:1651
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr "Вы вручную изменяли патч?\nОн не накладывается без ошибок на двоичные объекты, записанные в его заголовке."
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (используйте «git rebase --skip», чтобы пропустить этот патч)"
 
-#: builtin/am.c:1657
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Откат к применению изменений к базовому коммиту с помощью трехходового слияния…"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (используйте «git rebase --abort», чтобы перейти на оригинальную ветку)"
 
-#: builtin/am.c:1672
-msgid "Failed to merge in the changes."
-msgstr "Не удалось слить изменения."
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git rebase --continue»)"
 
-#: builtin/am.c:1696 builtin/merge.c:636
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree не удалось записать дерево"
+#: wt-status.c:1248
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "Вы сейчас разделяете коммит при перемещении ветки  «%s» над «%s»."
 
-#: builtin/am.c:1703
-msgid "applying to an empty history"
-msgstr "пÑ\80именение Ðº Ð¿Ñ\83Ñ\81Ñ\82ой Ð¸Ñ\81Ñ\82оÑ\80ии"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ñ\80азделÑ\8fеÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¿Ñ\80и Ð¿ÐµÑ\80емеÑ\89ении Ð²ÐµÑ\82ки."
 
-#: builtin/am.c:1716 builtin/commit.c:1775 builtin/merge.c:841
-#: builtin/merge.c:866
-msgid "failed to write commit object"
-msgstr "сбой записи объекта коммита"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "(Как только ваш рабочий каталог будет чистый, запустите «git rebase --continue»)"
 
-#: builtin/am.c:1748 builtin/am.c:1752
+#: wt-status.c:1260
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "нелÑ\8cзÑ\8f Ð¿Ñ\80одолжниÑ\82Ñ\8c: %s Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 "
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ñ\80едакÑ\82иÑ\80Ñ\83еÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¿Ñ\80и Ð¿ÐµÑ\80емеÑ\89ении Ð²ÐµÑ\82ки  Â«%s» Ð½Ð°Ð´ Â«%s»."
 
-#: builtin/am.c:1768
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¸Ð½Ñ\82еÑ\80акÑ\82ивное Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ, Ð±ÐµÐ· stdin Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87енного Ðº Ñ\82еÑ\80миналÑ\83."
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ñ\80едакÑ\82иÑ\80Ñ\83еÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¿Ñ\80и Ð¿ÐµÑ\80емеÑ\89ении Ð²ÐµÑ\82ки."
 
-#: builtin/am.c:1773
-msgid "Commit Body is:"
-msgstr "Тело коммита:"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (используйте «git commit --amend», чтобы исправить текущий коммит)"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#: builtin/am.c:1783
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Применить? [y] - да/[n] - нет/[e] - редактировать/[v] - просмотреть патч/[a] - применить всё: "
+#: wt-status.c:1270
+msgid "  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (используйте «git rebase --continue», когда будете довольны изменениями)"
 
-#: builtin/am.c:1833
+#: wt-status.c:1280
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Ð\98ндекÑ\81 Ð½Ðµ Ð¿Ñ\83Ñ\81Ñ\82ой: Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¿Ñ\80именÑ\8fÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87и (в Ð¸Ð½Ð´ÐµÐºÑ\81е: %s)"
+msgid "You are currently cherry-picking commit %s."
+msgstr "Ð\92Ñ\8b ÐºÐ¾Ð¿Ð¸Ñ\80Ñ\83еÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s."
 
-#: builtin/am.c:1868 builtin/am.c:1940
-#, c-format
-msgid "Applying: %.*s"
-msgstr "Применение: %.*s"
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git cherry-pick --continue»)"
 
-#: builtin/am.c:1884
-msgid "No changes -- Patch already applied."
-msgstr "Нет изменений — Патч уже применен."
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git cherry-pick --continue»)"
 
-#: builtin/am.c:1892
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Ошибка применения изменений на %s %.*s"
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (используйте «git cherry-pick --abort», чтобы отменить копирования коммита)"
 
-#: builtin/am.c:1898
+#: wt-status.c:1299
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "Ð\9aопиÑ\8e Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80имениÑ\82Ñ\8c, Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ð¹Ñ\82и Ð²: %s"
+msgid "You are currently reverting commit %s."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð¾Ð±Ñ\80аÑ\89аеÑ\82е Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а %s."
 
-#: builtin/am.c:1943
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr "Нет изменений — возможно, вы забыли вызвать «git add»?\nЕсли ничего не осталось для индексации, то, скорее всего, что-то другое уже сделало те же изменения; возможно, вам следует пропустить этот патч."
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git revert --continue»)"
 
-#: builtin/am.c:1950
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr "У вас все еще имеются не слитые пути в индексе.\nВозможно, вы забыли вызвать «git add»?"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git revert --continue»)"
 
-#: builtin/am.c:2058 builtin/am.c:2062 builtin/am.c:2074 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (используйте «git revert --abort», чтобы отменить операцию обращения изменений коммита)"
+
+#: wt-status.c:1320
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82 «%s»."
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð¾Ð¸Ñ\81ка, Ð½Ð°Ñ\87аÑ\82ого Ñ\81 Ð²ÐµÑ\82ки «%s»."
 
-#: builtin/am.c:2110
-msgid "failed to clean index"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\87иÑ\81Ñ\82иÑ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð¾Ð¸Ñ\81ка."
 
-#: builtin/am.c:2144
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr "Похоже, что вы переместили HEAD с момента последней ошибки выполнения «am».\nПеремотка на ORIG_HEAD не выполняется"
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (используйте «git bisect reset», чтобы вернуться на исходную ветку)"
 
-#: builtin/am.c:2205
-#, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Неправильное значение для --patch-format: %s"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "На ветке "
 
-#: builtin/am.c:2238
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<опции>] [(<mbox>|<Maildir>)…]"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "интерактивное перемещение в процессе; над "
 
-#: builtin/am.c:2239
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<опции>] (--continue | --skip | --abort)"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "перемещение в процессе; над "
 
-#: builtin/am.c:2245
-msgid "run interactively"
-msgstr "запустить в интерактивном режиме"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD отделён на "
 
-#: builtin/am.c:2247
-msgid "historical option -- no-op"
-msgstr "историческая опция — ничего не делает"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD отделён начиная с "
 
-#: builtin/am.c:2249
-msgid "allow fall back on 3way merging if needed"
-msgstr "разрешить откатиться к трехходовому слиянию, если нужно"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Сейчас ни на одной из веток"
 
-#: builtin/am.c:2250 builtin/init-db.c:478 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "тихий режим"
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Начальный коммит"
 
-#: builtin/am.c:2252
-msgid "add a Signed-off-by line to the commit message"
-msgstr "добавиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80окÑ\83 Signed-off-by Ðº Ñ\81ообÑ\89ениÑ\8e ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Ð\9dеоÑ\82Ñ\81леживаемÑ\8bе Ñ\84айлÑ\8b"
 
-#: builtin/am.c:2255
-msgid "recode into utf8 (default)"
-msgstr "пеÑ\80екодиÑ\80оваÑ\82Ñ\8c Ð² utf8 (по Ñ\83молÑ\87аниÑ\8e)"
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Ð\98гноÑ\80иÑ\80Ñ\83емÑ\8bе Ñ\84айлÑ\8b"
 
-#: builtin/am.c:2257
-msgid "pass -k flag to git-mailinfo"
-msgstr "передать флаг -k в git-mailinfo"
+#: wt-status.c:1580
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr "%.2f секунды занял вывод списка неотслеживаемых файлов. «status -uno» возможно может ускорить это, но будьте внимательны, и не забудьте добавить новые файлы вручную (смотрите «git help status» для подробностей)."
 
-#: builtin/am.c:2259
-msgid "pass -b flag to git-mailinfo"
-msgstr "передать флаг -b в git-mailinfo"
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Неотслеживаемые файлы не показаны%s"
 
-#: builtin/am.c:2261
-msgid "pass -m flag to git-mailinfo"
-msgstr "передать флаг -m в git-mailinfo"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr "(используйте опцию «-u», чтобы показать неотслеживаемые файлы)"
 
-#: builtin/am.c:2263
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг --keep-cr Ð² git-mailsplit Ð´Ð»Ñ\8f Ñ\84оÑ\80маÑ\82а mbox"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Ð\9dеÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
 
-#: builtin/am.c:2266
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "не передавать --keep-cr флаг в git-mailsplit вне зависимости от am.keepcr"
+#: wt-status.c:1599
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr "нет изменений добавленных для коммита\n(используйте «git add» и/или «git commit -a»)\n"
 
-#: builtin/am.c:2269
-msgid "strip everything before a scissors line"
-msgstr "обрезать все до строки обрезки"
+#: wt-status.c:1602
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "нет изменений добавленных для коммита\n"
 
-#: builtin/am.c:2270 builtin/apply.c:4546
-msgid "action"
-msgstr "действие"
+#: wt-status.c:1605
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr "ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)\n"
 
-#: builtin/am.c:2271 builtin/am.c:2274 builtin/am.c:2277 builtin/am.c:2280
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292
-#: builtin/am.c:2298
-msgid "pass it through git-apply"
-msgstr "передать его в git-apply"
+#: wt-status.c:1608
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "ничего не добавлено в коммит, но есть неотслеживаемые файлы\n"
 
-#: builtin/am.c:2279 builtin/apply.c:4570
-msgid "root"
-msgstr "корень"
+#: wt-status.c:1611
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr "нечего коммитить (создайте/скопируйте файлы, затем запустите «git add», чтобы отслеживать их)\n"
 
-#: builtin/am.c:2282 builtin/am.c:2285 builtin/apply.c:4508
-#: builtin/apply.c:4511 builtin/clone.c:90 builtin/fetch.c:95
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:404 builtin/submodule--helper.c:485
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:767
-#: builtin/submodule--helper.c:770
-msgid "path"
-msgstr "путь"
+#: wt-status.c:1614 wt-status.c:1619
+#, c-format
+msgid "nothing to commit\n"
+msgstr "нечего коммитить\n"
 
-#: builtin/am.c:2288 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:199 builtin/pull.c:134
-#: builtin/pull.c:193 builtin/repack.c:178 builtin/repack.c:182
-#: builtin/show-branch.c:645 builtin/show-ref.c:175 builtin/tag.c:340
-#: parse-options.h:132 parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1617
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "нечего коммитить (используйте опцию «-u», чтобы показать неотслеживаемые файлы)\n"
 
-#: builtin/am.c:2291 builtin/apply.c:4514
-msgid "num"
-msgstr "количество"
+#: wt-status.c:1621
+#, c-format
+msgid "nothing to commit, working tree clean\n"
+msgstr "нечего коммитить, нет изменений в рабочем каталоге\n"
 
-#: builtin/am.c:2294 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "формат"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Начальный коммит на "
 
-#: builtin/am.c:2295
-msgid "format the patch(es) are in"
-msgstr "формат, в котором находятся патчи"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (нет ветки)"
 
-#: builtin/am.c:2301
-msgid "override error message when patch failure occurs"
-msgstr "пеÑ\80еопÑ\80еделиÑ\82Ñ\8c Ñ\81ообÑ\89ение Ð¾Ð± Ð¾Ñ\88ибке, ÐµÑ\81ли Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð½Ð°Ð»Ð¾Ð¶Ð¸Ñ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "иÑ\81Ñ\87ез"
 
-#: builtin/am.c:2303
-msgid "continue applying patches after resolving a conflict"
-msgstr "продолжить применение изменений после разрешения конфиликта"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "позади"
 
-#: builtin/am.c:2306
-msgid "synonyms for --continue"
-msgstr "синоним для --continue"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "впереди "
 
-#: builtin/am.c:2309
-msgid "skip the current patch"
-msgstr "пропустить текущий патч"
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "не удалось выполнить %s: У вас есть непроиндексированные изменения."
 
-#: builtin/am.c:2312
-msgid "restore the original branch and abort the patching operation."
-msgstr "воÑ\81Ñ\81Ñ\82ановиÑ\82Ñ\8c Ð¾Ñ\80игиналÑ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 Ð¸ Ð¾Ñ\82мениÑ\82Ñ\8c Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8e Ð¿Ñ\80именениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹."
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "к Ñ\82омÑ\83 Ð¶Ðµ, Ð² Ð²Ð°Ñ\88ем Ð¸Ð½Ð´ÐµÐºÑ\81е ÐµÑ\81Ñ\82Ñ\8c Ð½ÐµÐ·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\87еннÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f."
 
-#: builtin/am.c:2316
-msgid "lie about committer date"
-msgstr "соврать о дате коммитера"
+#: wt-status.c:2278
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "не удалось выполнить %s: В вашем индексе есть незакоммиченные изменения."
 
-#: builtin/am.c:2318
-msgid "use current timestamp for author date"
-msgstr "использовать текущее время как время авторства"
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "сбой отсоединения «%s»"
 
-#: builtin/am.c:2320 builtin/commit.c:1609 builtin/merge.c:228
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "key-id"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<опции>] [--] <спецификация-пути>…"
 
-#: builtin/am.c:2321
-msgid "GPG-sign commits"
-msgstr "подписать коммиты с помощью GPG"
+#: builtin/add.c:80
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "неожиданный статус различий %c"
 
-#: builtin/am.c:2324
-msgid "(internal use for git-rebase)"
-msgstr "(внутреннее использование для git-rebase)"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "сбой при обновлении файлов"
 
-#: builtin/am.c:2339
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
-msgstr "Опция -b/--binary уже долгое время ничего не делает и будет удалена с следующих версиях Git. Пожалуйста, не используйте ее."
+#: builtin/add.c:95
+#, c-format
+msgid "remove '%s'\n"
+msgstr "удалить «%s»\n"
 
-#: builtin/am.c:2346
-msgid "failed to read the index"
-msgstr "сбой чтения индекса"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Непроиндексированные изменения после обновления индекса:"
 
-#: builtin/am.c:2361
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "предыдущий каталог перемещения %s еще существует, но передан mbox."
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "Не удалось прочитать индекс"
 
-#: builtin/am.c:2385
+#: builtin/add.c:220
 #, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr "Найден забытый каталог %s.\nИспользуйте «git am --abort», чтобы удалить его."
+msgid "Could not open '%s' for writing."
+msgstr "Не удалось открыть «%s» для записи."
 
-#: builtin/am.c:2391
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Ð\9eпеÑ\80аÑ\86иÑ\8f Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84ликÑ\82ов Ð½Ðµ Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ð²Ñ\8bполнениÑ\8f, Ð½Ðµ Ð¿Ñ\80одолжаем."
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<опции>] [<патч>…]"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "сбой при редактировании патча"
 
-#: builtin/apply.c:111
+#: builtin/add.c:230
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "неопознаннаÑ\8f Ð¾Ð¿Ñ\86иÑ\8f Ð´Ð»Ñ\8f Ð¿Ñ\80обелов «%s»"
+msgid "Could not stat '%s'"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c stat Ð´Ð»Ñ\8f «%s»"
 
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "неопознанная опция для игнорирования пробелов «%s»"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Пустой патч. Операция прервана."
 
-#: builtin/apply.c:818
+#: builtin/add.c:237
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Не удалось подготовить регулярное выражение для метки времени %s"
+msgid "Could not apply '%s'"
+msgstr "Не удалось применить «%s»"
 
-#: builtin/apply.c:827
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec возвратил %d для ввода: %s"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n"
 
-#: builtin/apply.c:908
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "не удалось найти имя файла в строке патча %d"
+#: builtin/add.c:266 builtin/clean.c:870 builtin/fetch.c:115 builtin/mv.c:111
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:521
+#: builtin/remote.c:1326 builtin/rm.c:268 builtin/send-pack.c:162
+msgid "dry run"
+msgstr "пробный запуск"
 
-#: builtin/apply.c:937
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr "git apply: плохой git-diff — ожидалось /dev/null, получено %s на строке %d"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "интерактивный выбор"
 
-#: builtin/apply.c:942
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply: плохой git-diff — не согласующееся новое имя файла на строке %d"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "интерактивный выбор блоков"
 
-#: builtin/apply.c:943
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply: плохой git-diff — не согласующееся старое имя файла на строке %d"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "отредактировать текущий файл различий и применить его"
 
-#: builtin/apply.c:949
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: плохой git-diff  — ожидалось /dev/null на строке %d"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "разрешить добавление игнорируемых иначе файлов"
 
-#: builtin/apply.c:1406
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: не ожидаемая строка: %.*s"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "обновить отслеживаемые файлы"
 
-#: builtin/apply.c:1463
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "фрагмент изменений без заголовка на строке %d: %.*s"
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "записать только факт, что путь будет добавлен позже"
 
-#: builtin/apply.c:1480
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname"
-" component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname"
-" components (line %d)"
-msgstr[0] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущего компонента пути к файлу (строка %d)"
-msgstr[1] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
-msgstr[2] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
-msgstr[3] "заголовок git diff не нашел информацию об имени файла при удалении %d ведущих компонент пути к файлу (строка %d)"
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "добавить изменения из всех отслеживаемых и неотслеживаемых файлов"
 
-#: builtin/apply.c:1646
-msgid "new file depends on old contents"
-msgstr "новÑ\8bй Ñ\84айл Ð·Ð°Ð²Ð¸Ñ\81иÑ\82 Ð¾Ñ\82 Ñ\81Ñ\82аÑ\80ого Ñ\81одеÑ\80жимого"
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "игноÑ\80иÑ\80оваÑ\82Ñ\8c Ð¿Ñ\83Ñ\82и Ñ\83даленнÑ\8bе Ð¸Ð· Ñ\80абоÑ\87его ÐºÐ°Ñ\82алога (Ñ\82оже, Ñ\87Ñ\82о Ð¸ --no-all)"
 
-#: builtin/apply.c:1648
-msgid "deleted file still has contents"
-msgstr "удаленный файл все еще имеет содержимое"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "не добавлять, только обновить индекс"
 
-#: builtin/apply.c:1674
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "патч поврежден на строке %d"
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "пропускать файлы, которые не могут быть добавлены из-за ошибок"
 
-#: builtin/apply.c:1710
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "новый файл %s зависит от старого содержимого"
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "удостовериться, что даже недостающие файлы будут проигнорированы при  пробном запуске"
 
-#: builtin/apply.c:1712
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "удаленный файл %s все еще имеет содержимое"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:1715
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** предупреждение: файл %s становится пустым, но не удаляется"
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "переопределить бит выполнения на указанных файлах"
 
-#: builtin/apply.c:1861
+#: builtin/add.c:305
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "повÑ\80ежденнÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d: %.*s"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Ð\98Ñ\81полÑ\8cзÑ\83йÑ\82е -f, ÐµÑ\81ли Ð²Ñ\8b Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\82елÑ\8cно Ñ\85оÑ\82иÑ\82е Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82Ñ\8c Ð¸Ñ\85.\n"
 
-#: builtin/apply.c:1895
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "неопознанный двоичный патч на строке %d"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "ошибка при добавлении файлов"
 
-#: builtin/apply.c:2048
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "патч с мусором на строке %d"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A и -u нельзя использовать одновременно"
 
-#: builtin/apply.c:2138
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "не удалось прочитать символьную ссылку %s"
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "Опция --ignore-missing может использоваться только вместе с --dry-run"
 
-#: builtin/apply.c:2142
+#: builtin/add.c:359
 #, c-format
-msgid "unable to open or read %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¿Ñ\80оÑ\87еÑ\81Ñ\82Ñ\8c %s"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "паÑ\80амеÑ\82Ñ\80 --chmod Â«%s» Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ\8bÑ\82Ñ\8c -x Ð¸Ð»Ð¸ +x"
 
-#: builtin/apply.c:2775
+#: builtin/add.c:374
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "непÑ\80авилÑ\8cное Ð½Ð°Ñ\87ало Ñ\81Ñ\82Ñ\80оки: Â«%c»"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Ð\9dиÑ\87его Ð½Ðµ Ñ\83казано, Ð½Ð¸Ñ\87его Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾.\n"
 
-#: builtin/apply.c:2894
+#: builtin/add.c:375
 #, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "Часть #%d успешно применена на %d (со сдвигом в %d строку)."
-msgstr[1] "Часть #%d успешно применена на %d (со сдвигом в %d строки)."
-msgstr[2] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
-msgstr[3] "Часть #%d успешно применена на %d (со сдвигом в %d строк)."
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Возможно, вы имели в виду «git add .»?\n"
 
-#: builtin/apply.c:2906
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Контекст сужен до (%ld/%ld), чтобы применить фрагмент на %d строке"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:279
+#: builtin/checkout.c:472 builtin/clean.c:914 builtin/commit.c:350
+#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "файл индекса поврежден"
 
-#: builtin/apply.c:2912
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr "при поиске:\n%.*s"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "не удалось разобрать сценарий авторства"
 
-#: builtin/apply.c:2932
+#: builtin/am.c:491
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "пропущены данные двоичного патча для «%s»"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "«%s» был удален перехватчиком applypatch-msg"
 
-#: builtin/apply.c:3033
+#: builtin/am.c:532
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80имениÑ\82Ñ\8c Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ðº Â«%s»"
+msgid "Malformed input line: '%s'."
+msgstr "Ð\9dепÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð²Ð²Ð¾Ð´Ð°: Â«%s»."
 
-#: builtin/apply.c:3039
+#: builtin/am.c:569
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "поÑ\81ле Ð¿Ñ\80именениÑ\8f Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð°Ñ\82Ñ\87а Ð´Ð»Ñ\8f Â«%s» Ð±Ñ\8bл Ð¿Ð¾Ð»Ñ\83Ñ\87ен Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\8bй Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82 (ожидалоÑ\81Ñ\8c %s, Ð¿Ð¾Ð»Ñ\83Ñ\87ено %s)"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\81копиÑ\80оваÑ\82Ñ\8c Ð·Ð°Ð¼ÐµÑ\82кÑ\83 Ð¸Ð· Â«%s» Ð² Â«%s»"
 
-#: builtin/apply.c:3060
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "ошибка применения изменений: %s:%ld"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "сбой при выполнении fseek"
 
-#: builtin/apply.c:3184
+#: builtin/am.c:775
 #, c-format
-msgid "cannot checkout %s"
-msgstr "не удалось переключить состояние на %s"
+msgid "could not parse patch '%s'"
+msgstr "не удалось разобрать патч «%s»"
 
-#: builtin/apply.c:3229 builtin/apply.c:3240 builtin/apply.c:3285
-#, c-format
-msgid "read of %s failed"
-msgstr "ошибка чтения %s"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Только серия патчей StGIT может быть применена за раз"
 
-#: builtin/apply.c:3237
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "чтение из «%s» за символической ссылкой"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "недопустимая метка даты/времени"
 
-#: builtin/apply.c:3265 builtin/apply.c:3487
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "путь %s был переименован/удален"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "недопустимая строка даты"
 
-#: builtin/apply.c:3346 builtin/apply.c:3501
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: нет в индексе"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "недопустимое смещение часового пояса"
 
-#: builtin/apply.c:3350 builtin/apply.c:3493 builtin/apply.c:3515
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Сбой определения формата патча."
 
-#: builtin/apply.c:3355 builtin/apply.c:3509
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: не совпадает с индексом"
+msgid "failed to create directory '%s'"
+msgstr "не удалось создать каталог «%s»"
 
-#: builtin/apply.c:3457
-msgid "removal patch leaves file contents"
-msgstr "паÑ\82Ñ\87 Ñ\83далениÑ\8f Ð½Ðµ Ñ\83далил Ñ\81одеÑ\80жимое Ñ\84айла"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азделиÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87и Ð½Ð° Ñ\87аÑ\81Ñ\82и."
 
-#: builtin/apply.c:3526
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s: неправильный тип"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "не удалось записать индекс"
 
-#: builtin/apply.c:3528
+#: builtin/am.c:1176
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s имеет тип %o, а ожидался %o"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Когда вы устраните эту проблему, запустите «%s --continue»."
 
-#: builtin/apply.c:3687 builtin/apply.c:3689
+#: builtin/am.c:1177
 #, c-format
-msgid "invalid path '%s'"
-msgstr "непÑ\80авилÑ\8cнÑ\8bй Ð¿Ñ\83Ñ\82Ñ\8c Â«%s»"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Ð\95Ñ\81ли Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 Ð¿Ð°Ñ\82Ñ\87, Ñ\82о Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82е Â«%s --skip»."
 
-#: builtin/apply.c:3744
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s: уже содержится в индексе"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr "Чтобы вернуться на предыдущую ветку и остановить применение изменений, запустите «%s --abort»."
 
-#: builtin/apply.c:3747
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: уже содержится в рабочем каталоге"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Патч пуст. Возможно, он был неправильно разделён?"
 
-#: builtin/apply.c:3767
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "новÑ\8bй Ñ\80ежим Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s Ð½Ðµ Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81Ñ\82аÑ\80омÑ\83 Ñ\80ежимÑ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o)"
+msgid "invalid ident line: %s"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\86ии: %s"
 
-#: builtin/apply.c:3772
+#: builtin/am.c:1417
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "новÑ\8bй Ñ\80ежим Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s Ð½Ðµ Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\81Ñ\82аÑ\80омÑ\83 Ñ\80ежимÑ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83па (%o) Ð´Ð»Ñ\8f %s"
+msgid "unable to parse commit %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80азобÑ\80аÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %s"
 
-#: builtin/apply.c:3792
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "затронутый файл «%s» находится за символической ссылкой"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "В репозитории отсутствуют двоичные объекты, необходимые для отката к трехходовому слиянию."
 
-#: builtin/apply.c:3796
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: не удалось применить патч"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr "Использую индекс для реконструкции базового дерева…"
 
-#: builtin/apply.c:3810
-#, c-format
-msgid "Checking patch %s..."
-msgstr "Проверка патча %s…"
+#: builtin/am.c:1631
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr "Вы вручную изменяли патч?\nОн не накладывается без ошибок на двоичные объекты, записанные в его заголовке."
 
-#: builtin/apply.c:3903 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "сбой make_cache_entry для пути «%s»"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Откат к применению изменений к базовому коммиту с помощью трехходового слияния…"
+
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Не удалось слить изменения."
+
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree не удалось записать дерево"
 
-#: builtin/apply.c:4046
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "не удалось удалить %s из индекса"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "применение к пустой истории"
 
-#: builtin/apply.c:4075
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "поврежденный патч для подмодуля %s"
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "сбой записи объекта коммита"
 
-#: builtin/apply.c:4079
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "не удалось выполнить stat для созданного файла «%s»"
+msgid "cannot resume: %s does not exist."
+msgstr "нельзя продолжнить: %s не существует "
 
-#: builtin/apply.c:4084
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "не удалось создать вспомогательный файл для созданного файла %s"
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr "не удалось использовать интерактивное поведение, без stdin подключенного к терминалу."
 
-#: builtin/apply.c:4087 builtin/apply.c:4195
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "не удалось создать запись в кэше для %s"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Тело коммита:"
 
-#: builtin/apply.c:4120
-#, c-format
-msgid "closing file '%s'"
-msgstr "закрытие файла «%s»"
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#: builtin/am.c:1774
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "Применить? [y] - да/[n] - нет/[e] - редактировать/[v] - просмотреть патч/[a] - применить всё: "
 
-#: builtin/apply.c:4169
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ñ\84айл Â«%s» Ñ\81 Ñ\80ежимом Ð´Ð¾Ñ\81Ñ\82Ñ\83па %o"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Ð\98ндекÑ\81 Ð½Ðµ Ð¿Ñ\83Ñ\81Ñ\82ой: Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¿Ñ\80именÑ\8fÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87и (в Ð¸Ð½Ð´ÐµÐºÑ\81е: %s)"
 
-#: builtin/apply.c:4256
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Патч %s применен без ошибок."
+msgid "Applying: %.*s"
+msgstr "Применение: %.*s"
 
-#: builtin/apply.c:4264
-msgid "internal error"
-msgstr "внÑ\83Ñ\82Ñ\80еннÑ\8fÑ\8f Ð¾Ñ\88ибка"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Ð\9dеÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ â\80\94 Ð\9fаÑ\82Ñ\87 Ñ\83же Ð¿Ñ\80именен."
 
-#: builtin/apply.c:4267
+#: builtin/am.c:1885
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Применение патча %%s с %d отказом…"
-msgstr[1] "Применение патча %%s с %d отказами…"
-msgstr[2] "Применение патча %%s с %d отказами…"
-msgstr[3] "Применение патча %%s с %d отказами…"
+msgid "Patch failed at %s %.*s"
+msgstr "Ошибка применения изменений на %s %.*s"
 
-#: builtin/apply.c:4277
+#: builtin/am.c:1891
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "усечение имени .rej файла до %.*s.rej"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "Копию изменений, которые не удалось применить, вы можете найти в: %s"
 
-#: builtin/apply.c:4285
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "не удалось открыть %s: %s"
+#: builtin/am.c:1936
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr "Нет изменений — возможно, вы забыли вызвать «git add»?\nЕсли ничего не осталось для индексации, то, скорее всего, что-то другое уже сделало те же изменения; возможно, вам следует пропустить этот патч."
 
-#: builtin/apply.c:4298
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Блок №%d применен без ошибок."
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr "У вас все еще имеются не слитые пути в индексе.\nВозможно, вы забыли вызвать «git add»?"
 
-#: builtin/apply.c:4301
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Блок №%d отклонен."
+msgid "Could not parse object '%s'."
+msgstr "Не удалось разобрать объект «%s»."
+
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "не удалось очистить индекс"
+
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr "Похоже, что вы переместили HEAD с момента последней ошибки выполнения «am».\nПеремотка на ORIG_HEAD не выполняется"
 
-#: builtin/apply.c:4387
+#: builtin/am.c:2200
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "Ð\9fаÑ\82Ñ\87 Â«%s» Ð¿Ñ\80опÑ\83Ñ\89ен."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Ð\9dепÑ\80авилÑ\8cное Ð·Ð½Ð°Ñ\87ение Ð´Ð»Ñ\8f --patch-format: %s"
 
-#: builtin/apply.c:4395
-msgid "unrecognized input"
-msgstr "не распознанный ввод"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<опции>] [(<mbox> | <Maildir>)…]"
 
-#: builtin/apply.c:4406
-msgid "unable to read index file"
-msgstr "не удалось прочитать файл индекса"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<опции>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4509
-msgid "don't apply changes matching the given path"
-msgstr "не Ð¿Ñ\80именÑ\8fÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¿Ð¾ Ñ\83казанномÑ\83 Ð¿Ñ\83Ñ\82и"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "запÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ð² Ð¸Ð½Ñ\82еÑ\80акÑ\82ивном Ñ\80ежиме"
 
-#: builtin/apply.c:4512
-msgid "apply changes matching the given path"
-msgstr "пÑ\80именÑ\8fÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¿Ð¾ Ñ\83казанномÑ\83 Ð¿Ñ\83Ñ\82и"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "иÑ\81Ñ\82оÑ\80иÑ\87еÑ\81каÑ\8f Ð¾Ð¿Ñ\86иÑ\8f â\80\94 Ð½Ð¸Ñ\87его Ð½Ðµ Ð´ÐµÐ»Ð°ÐµÑ\82"
 
-#: builtin/apply.c:4515
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "Ñ\83далиÑ\82Ñ\8c <колиÑ\87еÑ\81Ñ\82во> Ð²ÐµÐ´Ñ\83Ñ\89иÑ\85 ÐºÐ¾Ñ\81Ñ\8bÑ\85 Ñ\87еÑ\80Ñ\82 Ð¸Ð· Ñ\82Ñ\80адиÑ\86ионнÑ\8bÑ\85 Ð¿Ñ\83Ñ\82ей Ñ\81пиÑ\81ка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "Ñ\80азÑ\80еÑ\88иÑ\82Ñ\8c Ð¾Ñ\82каÑ\82иÑ\82Ñ\8cÑ\81Ñ\8f Ðº Ñ\82Ñ\80еÑ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8e, ÐµÑ\81ли Ð½Ñ\83жно"
 
-#: builtin/apply.c:4518
-msgid "ignore additions made by the patch"
-msgstr "игнорировать добавления, сделанные этим патчем"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "тихий режим"
 
-#: builtin/apply.c:4520
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "вмеÑ\81Ñ\82о Ð¿Ñ\80именениÑ\8f Ð¿Ð°Ñ\82Ñ\87а Ð²Ñ\8bвеÑ\81Ñ\82и Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82икÑ\83 Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹ Ð¸ Ñ\83далений Ð´Ð»Ñ\8f Ð²Ð²Ð¾Ð´а"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "добавиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80окÑ\83 Signed-off-by Ðº Ñ\81ообÑ\89ениÑ\8e ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
-#: builtin/apply.c:4524
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "показаÑ\82Ñ\8c ÐºÐ¾Ð»Ð¸Ñ\87еÑ\81Ñ\82во Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ\8bÑ\85 Ð¸ Ñ\83даленнÑ\8bÑ\85 Ñ\81Ñ\82Ñ\80ок Ð² Ð´ÐµÑ\81Ñ\8fÑ\82иÑ\87ном Ð¿Ñ\80едÑ\81Ñ\82авлении"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "пеÑ\80екодиÑ\80оваÑ\82Ñ\8c Ð² utf8 (по Ñ\83молÑ\87аниÑ\8e)"
 
-#: builtin/apply.c:4526
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "вмеÑ\81Ñ\82о Ð¿Ñ\80именениÑ\8f Ð¿Ð°Ñ\82Ñ\87а Ð²Ñ\8bвеÑ\81Ñ\82и Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82икÑ\83 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð´Ð»Ñ\8f Ð²Ð²Ð¾Ð´Ð°"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг -k Ð² git-mailinfo"
 
-#: builtin/apply.c:4528
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "вмеÑ\81Ñ\82о Ð¿Ñ\80именениÑ\8f Ð¿Ð°Ñ\82Ñ\87а Ð¿Ñ\80овеÑ\80иÑ\82Ñ\8c Ð¿Ð¾Ð´Ñ\85одиÑ\82 Ð»Ð¸ Ð¾Ð½"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг -b Ð² git-mailinfo"
 
-#: builtin/apply.c:4530
-msgid "make sure the patch is applicable to the current index"
-msgstr "проверить, что патч применяется к текущему индексу"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "передать флаг -m в git-mailinfo"
 
-#: builtin/apply.c:4532
-msgid "apply a patch without touching the working tree"
-msgstr "применить патч, не изменяя рабочий каталог"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "передать флаг --keep-cr в git-mailsplit для формата mbox"
 
-#: builtin/apply.c:4534
-msgid "accept a patch that touches outside the working area"
-msgstr "пÑ\80инÑ\8fÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87, ÐºÐ¾Ñ\82оÑ\80Ñ\8bй Ð·Ð°Ñ\82Ñ\80агиваеÑ\82 Ñ\84айлÑ\8b Ð·Ð° Ñ\80абоÑ\87им ÐºÐ°Ñ\82алогом"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr "не Ð¿ÐµÑ\80едаваÑ\82Ñ\8c --keep-cr Ñ\84лаг Ð² git-mailsplit Ð²Ð½Ðµ Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82и Ð¾Ñ\82 am.keepcr"
 
-#: builtin/apply.c:4536
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "а Ñ\82акже Ð¿Ñ\80имениÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87 (иÑ\81полÑ\8cзÑ\83йÑ\82е Ñ\81 --stat/--summary/--check)"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "обÑ\80езаÑ\82Ñ\8c Ð²Ñ\81е Ð´Ð¾ Ñ\81Ñ\82Ñ\80оки Ð¾Ð±Ñ\80езки"
 
-#: builtin/apply.c:4538
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "попытаться сделать трехходовое слияние, если патч не применяется"
+#: builtin/am.c:2266 builtin/am.c:2269 builtin/am.c:2272 builtin/am.c:2275
+#: builtin/am.c:2278 builtin/am.c:2281 builtin/am.c:2284 builtin/am.c:2287
+#: builtin/am.c:2293
+msgid "pass it through git-apply"
+msgstr "передать его в git-apply"
 
-#: builtin/apply.c:4540
-msgid "build a temporary index based on embedded index information"
-msgstr "построить временный индекс, основанный на встроенной информации об индексе"
+#: builtin/am.c:2283 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:707 builtin/merge.c:200 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:181 builtin/repack.c:185
+#: builtin/show-branch.c:644 builtin/show-ref.c:175 builtin/tag.c:340
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4543 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "пути, отделённые НУЛЕВЫМ символом"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "формат"
 
-#: builtin/apply.c:4545
-msgid "ensure at least <n> lines of context match"
-msgstr "Ñ\83доÑ\81Ñ\82овеÑ\80иÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\87Ñ\82о Ð¿Ð¾ ÐºÑ\80айней Ð¼ÐµÑ\80е <n> Ñ\81Ñ\82Ñ\80ок ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82а Ñ\81овпадаÑ\8eÑ\82"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "Ñ\84оÑ\80маÑ\82, Ð² ÐºÐ¾Ñ\82оÑ\80ом Ð½Ð°Ñ\85одÑ\8fÑ\82Ñ\81Ñ\8f Ð¿Ð°Ñ\82Ñ\87и"
 
-#: builtin/apply.c:4547
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "опÑ\80еделÑ\8fÑ\82Ñ\8c Ð½Ð¾Ð²Ñ\8bе Ð¸Ð»Ð¸ Ð¼Ð¾Ð´Ð¸Ñ\84иÑ\86иÑ\80ованнÑ\8bе Ñ\81Ñ\82Ñ\80оки, Ñ\83 ÐºÐ¾Ñ\82оÑ\80Ñ\8bÑ\85 ÐµÑ\81Ñ\82Ñ\8c Ð¾Ñ\88ибки Ð² Ð¿Ñ\80обелÑ\8cнÑ\8bÑ\85 Ñ\81имволаÑ\85"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "пеÑ\80еопÑ\80еделиÑ\82Ñ\8c Ñ\81ообÑ\89ение Ð¾Ð± Ð¾Ñ\88ибке, ÐµÑ\81ли Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð½Ð°Ð»Ð¾Ð¶Ð¸Ñ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f"
 
-#: builtin/apply.c:4550 builtin/apply.c:4553
-msgid "ignore changes in whitespace when finding context"
-msgstr "игноÑ\80иÑ\80оваÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ð¿Ñ\80обелÑ\8cнÑ\8bÑ\85 Ñ\81имволаÑ\85 Ð¿Ñ\80и Ð¿Ð¾Ð¸Ñ\81ке ÐºÐ¾Ð½Ñ\82екÑ\81та"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "пÑ\80одолжиÑ\82Ñ\8c Ð¿Ñ\80именение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð¿Ð¾Ñ\81ле Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84иликта"
 
-#: builtin/apply.c:4556
-msgid "apply the patch in reverse"
-msgstr "применить патч с обращением изменений"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "синоним для --continue"
 
-#: builtin/apply.c:4558
-msgid "don't expect at least one line of context"
-msgstr "не Ð¾Ð¶Ð¸Ð´Ð°Ñ\82Ñ\8c ÐºÐ°Ðº Ð¼Ð¸Ð½Ð¸Ð¼Ñ\83м Ð¾Ð´Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80оки ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82а"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "пÑ\80опÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ð¿Ð°Ñ\82Ñ\87"
 
-#: builtin/apply.c:4560
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "оÑ\81Ñ\82авиÑ\82Ñ\8c Ð¾Ñ\82клоненнÑ\8bе Ð±Ð»Ð¾ÐºÐ¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89иÑ\85 *.rej Ñ\84айлаÑ\85"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "воÑ\81Ñ\81Ñ\82ановиÑ\82Ñ\8c Ð¾Ñ\80игиналÑ\8cнÑ\83Ñ\8e Ð²ÐµÑ\82кÑ\83 Ð¸ Ð¾Ñ\82мениÑ\82Ñ\8c Ð¾Ð¿ÐµÑ\80аÑ\86иÑ\8e Ð¿Ñ\80именениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹."
 
-#: builtin/apply.c:4562
-msgid "allow overlapping hunks"
-msgstr "Ñ\80азÑ\80еÑ\88иÑ\82Ñ\8c Ð¿ÐµÑ\80екÑ\80Ñ\8bваÑ\8eÑ\89иеÑ\81Ñ\8f Ð±Ð»Ð¾ÐºÐ¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "Ñ\81овÑ\80аÑ\82Ñ\8c Ð¾ Ð´Ð°Ñ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82еÑ\80а"
 
-#: builtin/apply.c:4565
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "разрешить некорректно определенные пропущенные пустые строки в конце файла"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "использовать текущее время как время авторства"
 
-#: builtin/apply.c:4568
-msgid "do not trust the line counts in the hunk headers"
-msgstr "не доверять количеству строк из заголовка блока изменений"
+#: builtin/am.c:2315 builtin/commit.c:1605 builtin/merge.c:229
+#: builtin/pull.c:165 builtin/revert.c:92 builtin/tag.c:355
+msgid "key-id"
+msgstr "key-id"
 
-#: builtin/apply.c:4571
-msgid "prepend <root> to all filenames"
-msgstr "добавиÑ\82Ñ\8c <коÑ\80енÑ\8c> Ñ\81пеÑ\80еди ÐºÐ¾ Ð²Ñ\81ем Ð¸Ð¼ÐµÐ½Ð°Ð¼ Ñ\84айлов"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "подпиÑ\81аÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8b Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e GPG"
 
-#: builtin/apply.c:4593
-msgid "--3way outside a repository"
-msgstr "--3way вне репозитория"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(внутреннее использование для git-rebase)"
 
-#: builtin/apply.c:4601
-msgid "--index outside a repository"
-msgstr "--index вне репозитория"
+#: builtin/am.c:2334
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr "Опция -b/--binary уже долгое время ничего не делает и будет удалена с следующих версиях Git. Пожалуйста, не используйте ее."
 
-#: builtin/apply.c:4604
-msgid "--cached outside a repository"
-msgstr "--cached вне репозитория"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "сбой чтения индекса"
 
-#: builtin/apply.c:4623
+#: builtin/am.c:2356
 #, c-format
-msgid "can't open patch '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87 Â«%s»"
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "пÑ\80едÑ\8bдÑ\83Ñ\89ий ÐºÐ°Ñ\82алог Ð¿ÐµÑ\80емеÑ\89ениÑ\8f %s ÐµÑ\89е Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82, Ð½Ð¾ Ð¿ÐµÑ\80едан mbox."
 
-#: builtin/apply.c:4637
+#: builtin/am.c:2380
 #, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "пропущена %d ошибка в пробельных символах"
-msgstr[1] "пропущено %d ошибки в пробельных символах"
-msgstr[2] "пропущено %d ошибок в пробельных символах"
-msgstr[3] "пропущено %d ошибок в пробельных символах"
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr "Найден забытый каталог %s.\nИспользуйте «git am --abort», чтобы удалить его."
 
-#: builtin/apply.c:4643 builtin/apply.c:4653
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d строка добавила ошибки в пробельных символах."
-msgstr[1] "%d строки добавили ошибки в пробельных символах."
-msgstr[2] "%d строк добавили ошибки в пробельных символах."
-msgstr[3] "%d строк добавили ошибки в пробельных символах."
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Операция разрешения конфликтов не в процессе выполнения, не продолжаем."
+
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<опции>] [<патч>…]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -3532,116 +4302,164 @@ msgstr "git blame [<опции>] [<опции-редакции>] [<редакц
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<опции-rev-list> документированы в git-rev-list(1)"
 
-#: builtin/blame.c:1782
+#: builtin/blame.c:1781
 msgid "Blaming lines"
 msgstr "Просмотр авторов строк"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Показать записи авторства постепенно, в процессе нахождения"
 
-#: builtin/blame.c:2532
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Не показывать SHA-1 для коммитов, не входящих в границы запроса (По умолчанию: отключено)"
 
-#: builtin/blame.c:2533
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Не воспринимать корневые коммиты как граничные (По умолчанию: отключено)"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Показать статистику расходов на выполнение запроса"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Принудительно выводить прогресс выполнения"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Показать оценку для записей авторства"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "Показать оригинальное имя файла (По умолчанию: автоматически)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "Показать оригинальные номера строк (По умолчанию: отключено)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Показать в формате для программного разбора"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr "Показать в машиночитаемом формате, с построчной информацией о коммите"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Использовать такой же формат вывода, как и git-annotate (По умолчанию: отключено)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Показать необработанные временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Показать длинный SHA1 идентификатор коммита (По умолчанию: отключено)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Не показывать имя автора и временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2591
 msgid "Show author email instead of name (Default: off)"
 msgstr "Показать почту автора вместо имени (По умолчанию: отключено)"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Игнорировать различия в пробелах"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr "Использовать эксперементальную эвристику, основанную на отступах, чтобы улучшить файлы различий"
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
+msgstr "Использовать эксперементальную эвристику, основанную на пустых строках, чтобы улучшить файлы различий"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "Потратить больше времени, для нахождения лучших совпадений"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Использовать редакции из <файла> вместо вызова git-rev-list"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Использовать содержимое <файла> как финальный снимок"
 
-#: builtin/blame.c:2550 builtin/blame.c:2551
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "мин-длина"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "Найти копирование строк в пределах и между файлами"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "Найти перемещения строк в пределах и между файлами"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "начало,конец"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2607
 msgid "Process only line range n,m, counting from 1"
 msgstr "Обработать только строки в диапазоне начало,конец, начиная с 1"
 
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr "--progress нельзя использовать одновременно с --incremental или машиночитаемым (porcelain) форматом"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2641
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "4 года и 11 месяцев назад"
 
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents и --reverse не очень сочетаются."
+
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
+msgstr "нельзя использовать --contents с указанием финального имени объекта"
+
+#: builtin/blame.c:2805
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr "при --reverse и --first-parent вместе нужно указывать конкретный последний коммит"
+
+#: builtin/blame.c:2832
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr "при указании --reverse и --first-parent вместе, требуется также указать диапазон по цепочке первого родителя"
+
+#: builtin/blame.c:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "нет такого пути %s в %s"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "невозможно прочитать объект %s для пути %s"
+
+#: builtin/blame.c:2873
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "файл %s содержит только %lu строку"
+msgstr[1] "файл %s содержит только %lu строки"
+msgstr[2] "файл %s содержит только %lu строк"
+msgstr[3] "файл %s содержит только %lu строки"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<опции>] [-r | -a] [--merged | --no-merged]"
@@ -3735,118 +4553,122 @@ msgstr "Внешняя отслеживаемая ветка %s удалена (
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Ветка %s удалена (была %s).\n"
 
-#: builtin/branch.c:309
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: пропал]"
 
-#: builtin/branch.c:314
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: позади %d]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[позади %d]"
 
-#: builtin/branch.c:325
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: впереди %d]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[впереди %d]"
 
-#: builtin/branch.c:330
+#: builtin/branch.c:333
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: впереди %d, позади %d]"
 
-#: builtin/branch.c:333
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[впереди %d, позади %d]"
 
-#: builtin/branch.c:346
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** недействительная ссылка ****"
 
-#: builtin/branch.c:372
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(нет ветки, перемещение %s)"
 
-#: builtin/branch.c:375
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(нет ветки, двоичный поиск начат на %s)"
 
 #. TRANSLATORS: make sure this matches
 #. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:381
+#: builtin/branch.c:384
 #, c-format
 msgid "(HEAD detached at %s)"
 msgstr "(HEAD отделён на %s)"
 
 #. TRANSLATORS: make sure this matches
 #. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:386
+#: builtin/branch.c:389
 #, c-format
 msgid "(HEAD detached from %s)"
 msgstr "(HEAD отделён начиная с %s)"
 
-#: builtin/branch.c:390
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(нет ветки)"
 
-#: builtin/branch.c:541
+#: builtin/branch.c:544
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Производится перемещение ветки %s на %s"
 
-#: builtin/branch.c:545
+#: builtin/branch.c:548
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Производится двоичный поиск в ветке %s на %s"
 
-#: builtin/branch.c:560
+#: builtin/branch.c:563
 msgid "cannot rename the current branch while not on any."
 msgstr "невозможно переименовать текущую ветку, если вы не находитесь ни на одной из них."
 
-#: builtin/branch.c:570
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Недействительное имя ветки: «%s»"
 
-#: builtin/branch.c:587
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "Сбой переименования ветки"
 
-#: builtin/branch.c:591
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Переименована неправильно названная ветка «%s»"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:597
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Ветка переименована в %s, но HEAD не обновлен!"
 
-#: builtin/branch.c:601
+#: builtin/branch.c:604
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Ветка переименована, но произошел сбой обновления файла конфигурации"
 
-#: builtin/branch.c:623
-msgid "could not write branch description template"
-msgstr "не удалось записать шаблон описания ветки"
+#: builtin/branch.c:620
+#, c-format
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr "Измените описание для ветки:\n  %s\nСтроки, начинающиеся с «%c» будут вырезаны.\n"
 
 #: builtin/branch.c:651
 msgid "Generic options"
@@ -3876,6 +4698,10 @@ msgstr "вышестоящая"
 msgid "change the upstream info"
 msgstr "изменить информацию о вышестоящей ветке"
 
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Убрать информацию о вышестоящей ветке"
+
 #: builtin/branch.c:661
 msgid "use colored output"
 msgstr "использовать цветной вывод"
@@ -3948,8 +4774,8 @@ msgstr "ключ"
 msgid "field name to sort on"
 msgstr "имя поля, по которому выполнить сортировку"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:401
-#: builtin/notes.c:404 builtin/notes.c:564 builtin/notes.c:567
+#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
 #: builtin/tag.c:369
 msgid "object"
 msgstr "объект"
@@ -3962,7 +4788,7 @@ msgstr "вывод только веток, определенного объе
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не удалось определить HEAD как действительную ссылку."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD не найден в refs/heads!"
 
@@ -4065,61 +4891,75 @@ msgstr "Требуется репозиторий для создания пак
 msgid "Need a repository to unbundle."
 msgstr "Требуется репозиторий для распаковки."
 
-#: builtin/cat-file.c:428
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-"
-"type]|-e|-p|<type>|--textconv) <object>"
-msgstr "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<тип>|--textconv) <объект>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | "
+"-p | <type> | --textconv | --filters) [--path=<path>] <object>"
+msgstr "git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <тип> | --textconv | --filters) [--path=<путь>] <объект>"
 
-#: builtin/cat-file.c:429
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | "
+"--filters]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --filters]"
 
-#: builtin/cat-file.c:466
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<тип> может быть одним из: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:467
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "показать тип объекта"
 
-#: builtin/cat-file.c:468
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "показать размер объекта"
 
-#: builtin/cat-file.c:470
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "выйти с нулевым кодом возврата, если нет ошибки"
 
-#: builtin/cat-file.c:471
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "структурированный вывод содержимого объекта"
 
-#: builtin/cat-file.c:473
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "запустить texconv на содержимом двоичных объектов "
 
-#: builtin/cat-file.c:475
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "запуск фильтров на содержимом двоичных объектов "
+
+#: builtin/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
+msgstr "двоичный объект"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "использовать определенный путь для --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "разрешить -s и -t работать с повреждёнными объектами"
 
-#: builtin/cat-file.c:476
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "буфферировать вывод --batch"
 
-#: builtin/cat-file.c:478
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr "показать информацию и содержимое объектов, переданных из стандартного ввода"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "показать информацию об объектах, переданных из стандартного ввода"
 
-#: builtin/cat-file.c:484
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr "переходить по символьным ссылкам внутри дерева (используется с опциями --batch и --batch-check)"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "показать все объекты с опциями --batch или --batch-check"
 
@@ -4139,7 +4979,7 @@ msgstr "вывести все атрибуты установленные для
 msgid "use .gitattributes only from the index"
 msgstr "использовать только .gitattributes из индекса"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "прочитать имена файлов из стандартного ввода"
 
@@ -4147,7 +4987,7 @@ msgstr "прочитать имена файлов из стандартного
 msgid "terminate input and output records by a NUL character"
 msgstr "окончание ввода и вывода записей по НУЛЕВОМУ символу"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1135 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "не выводить прогресс выполнения"
 
@@ -4237,9 +5077,9 @@ msgid "write the content to temporary files"
 msgstr "записать содержимое во временные файлы"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:491 builtin/submodule--helper.c:494
-#: builtin/submodule--helper.c:497 builtin/submodule--helper.c:500
-#: builtin/submodule--helper.c:774
+#: builtin/submodule--helper.c:595 builtin/submodule--helper.c:598
+#: builtin/submodule--helper.c:604 builtin/submodule--helper.c:951
+#: builtin/worktree.c:469
 msgid "string"
 msgstr "строка"
 
@@ -4305,63 +5145,59 @@ msgstr "«%s» нельзя использовать одновременно с
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "Нельзя обновлять пути и переключаться на ветку «%s» одновременно."
 
-#: builtin/checkout.c:279 builtin/checkout.c:473
-msgid "corrupt index file"
-msgstr "файл индекса поврежден"
-
 #: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "путь «%s» не слит"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "сначала нужно разрешить конфликты в вашем текущем индексе"
 
-#: builtin/checkout.c:622
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Не удалось создать журнал ссылок для «%s»: %s\n"
 
-#: builtin/checkout.c:660
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD сейчас на"
 
-#: builtin/checkout.c:664 builtin/clone.c:661
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "не удалось обновить HEAD"
 
-#: builtin/checkout.c:668
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Сброс ветки «%s»\n"
 
-#: builtin/checkout.c:671
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Уже на «%s»\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Переключение и сброс ветки «%s»\n"
 
-#: builtin/checkout.c:677 builtin/checkout.c:1067
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Переключено на новую ветку «%s»\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Переключено на ветку «%s»\n"
 
-#: builtin/checkout.c:731
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " … и еще %d.\n"
 
-#: builtin/checkout.c:737
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4378,7 +5214,7 @@ msgstr[1] "Предупреждение: вы оставляете позади
 msgstr[2] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 msgstr[3] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 
-#: builtin/checkout.c:756
+#: builtin/checkout.c:758
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4397,162 +5233,162 @@ msgstr[1] "Если вы хотите сохранить их с помощью
 msgstr[2] "Если вы хотите сохранить их с помощью создания новой ветки, то сейчас самое время\nсделать это с помощью:\n\n git branch <имя-новой-ветки> %s\n"
 msgstr[3] "Если вы хотите сохранить их с помощью создания новой ветки, то сейчас самое время\nсделать это с помощью:\n\n git branch <имя-новой-ветки> %s\n"
 
-#: builtin/checkout.c:792
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "внутренняя ошибка при хождении по редакциям"
 
-#: builtin/checkout.c:796
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "Предыдущая позиция HEAD была"
 
-#: builtin/checkout.c:823 builtin/checkout.c:1062
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Вы находитесь на еще не созданной ветке"
 
-#: builtin/checkout.c:968
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "ожидается только одна ссылка, а передано %d."
 
-#: builtin/checkout.c:1008 builtin/worktree.c:212
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправильная ссылка: %s"
 
-#: builtin/checkout.c:1037
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "в дереве нет такой ссылки: %s"
 
-#: builtin/checkout.c:1076
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "нельзя использовать пути при переключении веток"
 
-#: builtin/checkout.c:1079 builtin/checkout.c:1083
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "нельзя использовать «%s» при переключении веток"
 
-#: builtin/checkout.c:1087 builtin/checkout.c:1090 builtin/checkout.c:1095
-#: builtin/checkout.c:1098
+#: builtin/checkout.c:1089 builtin/checkout.c:1092 builtin/checkout.c:1097
+#: builtin/checkout.c:1100
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "«%s» нельзя использовать одновременно с «%s»"
 
-#: builtin/checkout.c:1103
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Нельзя переключить ветку на не коммит «%s»"
 
-#: builtin/checkout.c:1136 builtin/checkout.c:1138 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:323
-#: builtin/worktree.c:325
+#: builtin/checkout.c:1138 builtin/checkout.c:1140 builtin/clone.c:93
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
+#: builtin/worktree.c:326
 msgid "branch"
 msgstr "ветка"
 
-#: builtin/checkout.c:1137
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "создать и переключиться на новую ветку"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "создать/сбросить и перключиться на новую ветку"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "создать журнал ссылок для новой ветки"
 
-#: builtin/checkout.c:1141
-msgid "detach the HEAD at named commit"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
 msgstr "отсоединить HEAD на указанном коммите"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "установить информацию о вышестоящей ветке для новой ветки"
 
-#: builtin/checkout.c:1144
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "новая-ветка"
 
-#: builtin/checkout.c:1144
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "новая ветка без родителей"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "переключиться на нашу версию для не слитых файлов"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "переключиться на их версию для не слитых файлов"
 
-#: builtin/checkout.c:1149
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "принудительное переключение на состояние (отбрасывает все локальные изменения)"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "выполнить трехходовое слияние с новой веткой"
 
-#: builtin/checkout.c:1151 builtin/merge.c:230
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "обновить игнорируемые файлы (по умолчанию)"
 
-#: builtin/checkout.c:1152 builtin/log.c:1432 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "стиль"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "стиль конфликтов слияния (merge или diff3)"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "не ограничивать спецификаторы пути только частичными записями"
 
-#: builtin/checkout.c:1158
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "пересмотр «git checkout <нет-такой-ветки>»"
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1162
 msgid "do not check if another worktree is holding the given ref"
 msgstr "не проверять, что другое дерево уже содержит указанную ссылку"
 
-#: builtin/checkout.c:1161 builtin/clone.c:60 builtin/fetch.c:116
-#: builtin/merge.c:227 builtin/pull.c:116 builtin/push.c:526
+#: builtin/checkout.c:1163 builtin/clone.c:63 builtin/fetch.c:119
+#: builtin/merge.c:228 builtin/pull.c:117 builtin/push.c:536
 #: builtin/send-pack.c:168
 msgid "force progress reporting"
 msgstr "принудительно выводить прогресс"
 
-#: builtin/checkout.c:1192
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B и --orphan нельзя использовать одновременно"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track требует имя ветки"
 
-#: builtin/checkout.c:1214
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Пропущено имя ветки; попробуйте -b"
 
-#: builtin/checkout.c:1250
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "неправильная спецификация пути"
 
-#: builtin/checkout.c:1257
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr "Нельзя обновить пути и одновременно переключиться на ветку «%s».\nВы хотели переключиться на «%s», что не может быть определено как коммит?"
 
-#: builtin/checkout.c:1262
+#: builtin/checkout.c:1264
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach не принимает путь «%s» как аргумент"
 
-#: builtin/checkout.c:1266
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4684,8 +5520,8 @@ msgstr "интерактивная очистка"
 msgid "remove whole directories"
 msgstr "удалить каталоги полностью"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:456 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:725
+#: builtin/ls-files.c:536 builtin/name-rev.c:313 builtin/show-ref.c:182
 msgid "pattern"
 msgstr "шаблон"
 
@@ -4721,290 +5557,306 @@ msgstr "clean.requireForce установлен по умолчанию как t
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<опции>] [--] <репозиторий> [<каталог>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "не переключать рабочую копию на HEAD"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:473
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "создать голый репозиторий"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "создать зеркало репозитория (включает в себя и параметр bare)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "для клонирования из локального репозитория"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "не использовать жесткие ссылки, всегда копировать файлы"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "настроить как общедоступный репозиторий"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "инициализировать подмодули в клоне"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:82
 msgid "number of submodules cloned in parallel"
 msgstr "количество подмодулей, которые будут клонированы парралельно"
 
-#: builtin/clone.c:80 builtin/init-db.c:470
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "каталог-шаблонов"
 
-#: builtin/clone.c:81 builtin/init-db.c:471
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "каталог, шаблоны из которого будут использованы"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:498
-#: builtin/submodule--helper.c:777
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "ссылаемый репозиторий"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "используйте --reference только при клонировании"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "имя"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "использовать <имя> вместо «origin» для отслеживания вышестоящего репозитория"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "переключиться на <ветку>, вместо HEAD внешнего репозитория"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "путь к git-upload-pack на внешнем репозитории"
 
-#: builtin/clone.c:92 builtin/fetch.c:117 builtin/grep.c:667
-#: builtin/pull.c:201
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "глубина"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "сделать частичный клон указанной глубины"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "время"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "сделать частичный клон до определенного времени"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "редакция"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr "углубить историю частичного клона исключая редакцию"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "клонировать только одну ветку, HEAD или --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:106
 msgid "any cloned submodules will be shallow"
 msgstr "все склонированные подмодули будут частичными клонами"
 
-#: builtin/clone.c:98 builtin/init-db.c:479
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "каталог-git"
 
-#: builtin/clone.c:99 builtin/init-db.c:480
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "разместить каталог git отдельно от рабочей копии"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "ключ=значение"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "установить параметры внутри нового репозитория"
 
-#: builtin/clone.c:102 builtin/fetch.c:131 builtin/push.c:536
+#: builtin/clone.c:111 builtin/fetch.c:140 builtin/push.c:547
 msgid "use IPv4 addresses only"
 msgstr "использовать только IPv4 адреса"
 
-#: builtin/clone.c:104 builtin/fetch.c:133 builtin/push.c:538
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
 msgid "use IPv6 addresses only"
 msgstr "использовать только IPv6 адреса"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
 msgstr "Имя каталога не может быть угадано.\nУкажите имя каталога с помощью параметра командной строки"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "ссылаемый репозиторий «%s» как связанное состояние, пока не поддерживается."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "ссылаемый репозиторий «%s» не является локальным."
-
-#: builtin/clone.c:314
+#: builtin/clone.c:303
 #, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "ссылаемый репозиторий «%s» является частичным"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "информация: Не удалось добавить альтернативу для «%s»: %s\n"
 
-#: builtin/clone.c:317
+#: builtin/clone.c:375
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "ссылаемый репозиторий «%s» является сращенным"
+msgid "failed to open '%s'"
+msgstr "не удалось открыть «%s»"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s уже существует и не является каталогом"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "не удалось выполнить stat %s\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "не удалось создать ссылку «%s»"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "не удалось копировать файл в «%s»"
 
-#: builtin/clone.c:449 builtin/clone.c:633
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "готово.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
 "and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr "Клонирование прошло успешно, но во время переключения состояния произошла ошибка.\nС помощь команды «git status» вы можете просмотреть, какие файлы были обновлены, а повторить попытку переключения на ветку с помощью «git checkout -f HEAD»\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Не удалось найти внешнюю ветку %s для клонирования."
 
-#: builtin/clone.c:628
-#, c-format
-msgid "Checking connectivity... "
-msgstr "Проверка соединения… "
-
-#: builtin/clone.c:631
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "внешний репозиторий прислал не все необходимые объекты"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "не удалось обновить %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "внешний HEAD ссылается на несуществующую ссылку, нельзя переключиться на такую версию.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "не удалось переключиться на версию в рабочем каталоге"
 
-#: builtin/clone.c:767
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "не удалось записать параметры в файл конфигурации"
 
-#: builtin/clone.c:830
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "не удалось выполнить перепаковку для очистки"
 
-#: builtin/clone.c:832
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "не удалось отсоединить временные альтернативные файлы"
 
-#: builtin/clone.c:864 builtin/receive-pack.c:1731
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Слишком много аргументов."
 
-#: builtin/clone.c:868
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Вы должны указать репозиторий для клонирования."
 
-#: builtin/clone.c:879
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare и --origin %s нельзя использовать одновременно."
 
-#: builtin/clone.c:882
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare и --separate-git-dir нельзя использовать одновременно."
 
-#: builtin/clone.c:895
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "репозиторий «%s» не существует"
 
-#: builtin/clone.c:901 builtin/fetch.c:1174
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "глубина %s не является положительным числом"
 
-#: builtin/clone.c:911
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "целевой путь «%s» уже существует и не является пустым каталогом."
 
-#: builtin/clone.c:921
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "рабочий каталог «%s» уже существует."
 
-#: builtin/clone.c:936 builtin/clone.c:947 builtin/submodule--helper.c:547
-#: builtin/worktree.c:220 builtin/worktree.c:247
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/submodule--helper.c:657
+#: builtin/worktree.c:222 builtin/worktree.c:249
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "не удалось создать родительские каталоги для «%s»"
 
-#: builtin/clone.c:939
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "не удалось создать рабочий каталог «%s»"
 
-#: builtin/clone.c:957
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Клонирование в голый репозиторий «%s»…\n"
 
-#: builtin/clone.c:959
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Клонирование в «%s»…\n"
 
-#: builtin/clone.c:998
+#: builtin/clone.c:963
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-"
+"if-able"
+msgstr "клонирование с параметром --recursive нельзя использовать одновременно ни с --reference, ни с --reference-if-able"
+
+#: builtin/clone.c:1019
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth игнорируется на локальных клонах; вместо этого используйте file://."
 
-#: builtin/clone.c:1001
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since игнорируется на локальных клонах; используйте file:// вместо этого."
+
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr "--shallow-exclude игнорируется на локальных клонах; используйте file:// вместо этого."
+
+#: builtin/clone.c:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr "исходный репозиторий является частичным, --local игнорируется"
 
-#: builtin/clone.c:1006
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local игнорируется"
 
-#: builtin/clone.c:1010
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Не знаю как клонировать %s"
 
-#: builtin/clone.c:1059 builtin/clone.c:1067
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Внешняя ветка %s не найдена в вышестоящем репозитории %s"
 
-#: builtin/clone.c:1070
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Похоже, что вы клонировали пустой репозиторий."
 
@@ -5107,43 +5959,43 @@ msgid ""
 "the remaining commits.\n"
 msgstr "Если вы хотите пропустит этот коммит, используйте команду:\n\n    git reset\n\nПосле этого «git cherry-pick --continue» продолжит копирование оставшихся коммитов.\n"
 
-#: builtin/commit.c:307
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "сбой распаковки объекта дерева HEAD"
 
-#: builtin/commit.c:348
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "не удалось создать временный индекс"
 
-#: builtin/commit.c:354
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "сбой интерактивного добавления"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "не удалось обновить временный индекс"
 
-#: builtin/commit.c:369
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Сбой при обновлении основного кэша дерева"
 
-#: builtin/commit.c:393 builtin/commit.c:416 builtin/commit.c:465
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "не удалось записать файл new_index"
 
-#: builtin/commit.c:447
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "нельзя создать частичный коммит во время слияния."
 
-#: builtin/commit.c:449
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "нельзя создать частичный коммит во время копирования коммита."
 
-#: builtin/commit.c:458
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "не удалось прочитать индекс"
 
-#: builtin/commit.c:477
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "не удалось записать временный файл индекса"
 
@@ -5172,12 +6024,12 @@ msgid ""
 "in the current commit message"
 msgstr "нельзя выбрать символ комментария, который\nне используется в текущем сообщении коммита"
 
-#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1091
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "не удалось запросить коммит %s"
 
-#: builtin/commit.c:704 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(чтение файла журнала из стандартного ввода)\n"
@@ -5257,322 +6109,326 @@ msgstr "%sКоммитер:  %.*s <%.*s>"
 msgid "Cannot read index"
 msgstr "Не удалось прочитать индекс"
 
-#: builtin/commit.c:949
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Ошибка при построении деревьев"
 
-#: builtin/commit.c:964 builtin/tag.c:266
+#: builtin/commit.c:969 builtin/tag.c:266
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Пожалуйста, укажите сообщение, при указании опций -m или -F.\n"
 
-#: builtin/commit.c:1066
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr "--author «%s» не в формате «Имя <почта>» и не совпадает с существующим автором"
 
-#: builtin/commit.c:1081 builtin/commit.c:1321
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Неправильный режим неотслеживаемых файлов «%s»"
 
-#: builtin/commit.c:1118
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long и -z нельзя использовать одновременно"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Указание одновременно опций --reset-author и --author не имеет смысла"
 
-#: builtin/commit.c:1157
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Нечего исправлять."
 
-#: builtin/commit.c:1160
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Вы в процессе слияния —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1162
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Вы в процессе копирования коммита —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1165
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Опции --squash и --fixup не могут использоваться одновременно"
 
-#: builtin/commit.c:1175
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Может использоваться только одна из опций -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1177
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Опция -m не может использоваться с -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1185
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author может использоваться только одновременно с опциями -C, -c или --amend."
 
-#: builtin/commit.c:1202
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "Может использоваться только одна из опций --include/--only/--all/--interactive/--patch."
 
-#: builtin/commit.c:1204
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "Указание путей каталогов с опциями --include/--only не имеет смысла."
 
-#: builtin/commit.c:1206
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Умно… отмена последнего с измененным индексом."
 
-#: builtin/commit.c:1208
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Пути явно указаны пути без опций -i или -o; предполагаю опцию --only…"
 
-#: builtin/commit.c:1220 builtin/tag.c:474
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Неправильное значение режима очистки %s"
 
-#: builtin/commit.c:1225
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "С опцией -a указание пути не имеет смысла."
 
-#: builtin/commit.c:1335 builtin/commit.c:1621
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "кратко показать статус"
 
-#: builtin/commit.c:1337 builtin/commit.c:1623
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "показать информацию о версии"
 
-#: builtin/commit.c:1339 builtin/commit.c:1625 builtin/push.c:512
-#: builtin/worktree.c:437
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "версия"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "машиночитаемый вывод"
 
-#: builtin/commit.c:1342 builtin/commit.c:1627
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "показать статус в длинном формате (по умолчанию)"
 
-#: builtin/commit.c:1345 builtin/commit.c:1630
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "завершать записи НУЛЕВЫМ байтом"
 
-#: builtin/commit.c:1347 builtin/commit.c:1633 builtin/fast-export.c:981
+#: builtin/commit.c:1353 builtin/commit.c:1629 builtin/fast-export.c:981
 #: builtin/fast-export.c:984 builtin/tag.c:353
 msgid "mode"
 msgstr "режим"
 
-#: builtin/commit.c:1348 builtin/commit.c:1633
+#: builtin/commit.c:1354 builtin/commit.c:1629
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "показать неотслеживаемые файлы, опциональные режимы: all (все), normal (как обычно), no (нет). (По умолчанию: all)"
 
-#: builtin/commit.c:1351
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "показать игнорируемые файлы"
 
-#: builtin/commit.c:1352 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "когда"
 
-#: builtin/commit.c:1353
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr "игнорировать изменения в подмодулях, опционально когда: all (всегда), dirty (измененные), untracked (неотслеживаемые). (По умолчанию: all)"
 
-#: builtin/commit.c:1355
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "показать неотслеживаемые файлы по столбцам"
 
-#: builtin/commit.c:1441
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "нельзя запросить новосозданный коммит"
 
-#: builtin/commit.c:1443
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "нельзя разобрать новосозданный коммит"
 
-#: builtin/commit.c:1488
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "отделённый HEAD"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (корневой коммит)"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "не выводить сводку после успешного коммита"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "добавить список изменений в шаблон сообщения коммита"
 
-#: builtin/commit.c:1594
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Опции сообщения коммита"
 
-#: builtin/commit.c:1595 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "прочитать сообщение из файла"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "автор"
 
-#: builtin/commit.c:1596
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "подменить автора коммита"
 
-#: builtin/commit.c:1597 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "дата"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "подменить дату коммита"
 
-#: builtin/commit.c:1598 builtin/merge.c:219 builtin/notes.c:395
-#: builtin/notes.c:558 builtin/tag.c:349
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
 msgid "message"
 msgstr "сообщение"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "сообщение коммита"
 
-#: builtin/commit.c:1599 builtin/commit.c:1600 builtin/commit.c:1601
-#: builtin/commit.c:1602 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1595 builtin/commit.c:1596 builtin/commit.c:1597
+#: builtin/commit.c:1598 parse-options.h:257 ref-filter.h:79
 msgid "commit"
 msgstr "коммит"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "использовать и отредактировать сообщение от указанного коммита"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "использовать сообщение указанного коммита"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для исправления указанного коммита"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для уплотнения указанного коммита"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1599
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "коммит теперь за моим авторством (с использованием -C/-c/--amend)"
 
-#: builtin/commit.c:1604 builtin/log.c:1382 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "добавить Signed-off-by:"
 
-#: builtin/commit.c:1605
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "использовать указанный файл шаблона"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "принудительно редактировать коммит"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "по-умолчанию"
 
-#: builtin/commit.c:1607 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "как удалять пробелы и #комментарии из сообщения коммита"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "включить статус файлов в шаблон сообщения коммита"
 
-#: builtin/commit.c:1610 builtin/merge.c:229 builtin/pull.c:165
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "подписать коммит с помощью GPG"
 
-#: builtin/commit.c:1613
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Опции содержимого коммита"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "закоммитить все измененные файлы"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "добавить указанные файлы в индекс для коммита"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "интерактивное добавление файлов"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "интерактивное добавление изменений"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "закоммитить только указанные файлы"
 
-#: builtin/commit.c:1619
-msgid "bypass pre-commit hook"
-msgstr "пропустить перехватчик перед-коммитом"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "пропустить перехватчик pre-commit и commit-msg"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "показать, что будет закоммичено"
 
-#: builtin/commit.c:1631
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "исправить предыдущий коммит"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
-msgstr "пропустить перехватчик после-перезаписи"
+msgstr "пропустить перехватчик post-rewrite"
 
-#: builtin/commit.c:1637
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "разрешить запись пустого коммита"
 
-#: builtin/commit.c:1639
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "разрешить запись изменений с пустым сообщением"
 
-#: builtin/commit.c:1668
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "не удалось разобрать HEAD коммит"
 
-#: builtin/commit.c:1718
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Файл MERGE_HEAD поврежден (%s)"
 
-#: builtin/commit.c:1725
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "не удалось прочитать MERGE_MODE"
 
-#: builtin/commit.c:1744
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "не удалось открыть сообщение коммита: %s"
 
-#: builtin/commit.c:1755
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Отмена коммита; вы не изменили сообщение.\n"
 
-#: builtin/commit.c:1760
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Отмена коммита из-за пустого сообщения коммита.\n"
 
-#: builtin/commit.c:1808
+#: builtin/commit.c:1802
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -5583,139 +6439,139 @@ msgstr "Репозиторий был обновлен, но не удалось
 msgid "git config [<options>]"
 msgstr "git config [<опции>]"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "Config file location"
 msgstr "Размещение файла конфигурации"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use global config file"
 msgstr "использовать глобальный файл конфигурации"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use system config file"
 msgstr "использовать системный файл конфигурации"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "use repository config file"
 msgstr "использовать файл конфигурации репозитория"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "use given config file"
 msgstr "использовать указанный файл конфигурации"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "blob-id"
 msgstr "идент-двоичн-объекта"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "read config from given blob object"
 msgstr "прочитать настройки из указанного двоичного объекта"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "Action"
 msgstr "Действие"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get value: name [value-regex]"
 msgstr "получить значение: имя [шаблон-значений]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get all values: key [value-regex]"
 msgstr "получить все значения: ключ [шаблон-значений]"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "получить значения по шаблону: шаблон-имен [шаблон-значений]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "получить значение, специфичное для URL: раздел[.переменная] URL"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "заменить все соответствующие переменные: имя значение [шаблон-значений]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "add a new variable: name value"
 msgstr "добавить новую переменную: имя значение"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "remove a variable: name [value-regex]"
 msgstr "удалить переменную: имя [шаблон-значений]"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove all matches: name [value-regex]"
 msgstr "удалить все совпадающие: имя [шаблон-значений]"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "rename section: old-name new-name"
 msgstr "переименовать раздел: старое-имя новое-имя"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "remove a section: name"
 msgstr "удалить раздел: имя"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "list all"
 msgstr "показать весь список"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "open an editor"
 msgstr "открыть в редакторе"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "find the color configured: slot [default]"
 msgstr "найти настроенный цвет: раздел [по-умолчанию]"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "проверить, существует ли настроенный цвет: раздел [stdout-есть-tty]"
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "Type"
 msgstr "Тип"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is \"true\" or \"false\""
 msgstr "значение — это «true» (правда) или «false» (ложь)"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is decimal number"
 msgstr "значение — это десятичное число"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "value is --bool or --int"
 msgstr "значение — это --bool или --int"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "value is a path (file or directory name)"
 msgstr "значение — это путь (к файлу или каталогу)"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "Other"
 msgstr "Другое"
 
-#: builtin/config.c:83
+#: builtin/config.c:82
 msgid "terminate values with NUL byte"
 msgstr "завершать значения НУЛЕВЫМ байтом"
 
-#: builtin/config.c:84
+#: builtin/config.c:83
 msgid "show variable names only"
 msgstr "показывать только имена переменных"
 
-#: builtin/config.c:85
+#: builtin/config.c:84
 msgid "respect include directives on lookup"
 msgstr "учитывать директивы include (включения файлов) при запросе"
 
-#: builtin/config.c:86
+#: builtin/config.c:85
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr "показать источник настройки (файл, стандартный ввод, двоичный объект, командная строка)"
 
-#: builtin/config.c:328
+#: builtin/config.c:327
 msgid "unable to parse default color value"
 msgstr "не удалось разобрать значение цвета по умолчанию"
 
-#: builtin/config.c:472
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5725,16 +6581,23 @@ msgid ""
 "#\temail = %s\n"
 msgstr "# Это файл конфигурации пользователя Git.\n[user]\n# Пожалуйста, адаптируйте и раскомментируйте следующие строки:\n#\tuser = %s\n#\temail = %s\n"
 
-#: builtin/config.c:614
+#: builtin/config.c:613
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "не удалось создать файл конфигурации %s"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:625
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr "нельзя перезаписать несколько значений одним\n       Используйте регулярные выражения, параметры --add или --replace-all, чтобы изменить %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "вывод размеров в удобочитаемом для человека виде"
 
@@ -5761,10 +6624,10 @@ msgstr "аннотированная метка %s не содержит вст
 msgid "tag '%s' is really '%s' here"
 msgstr "метка «%s» уже здесь «%s»"
 
-#: builtin/describe.c:250 builtin/log.c:465
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
 msgid "Not a valid object name %s"
-msgstr "Ð\9dедейÑ\81Ñ\82виÑ\82елÑ\8cное имя объекта %s"
+msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое имя объекта %s"
 
 #: builtin/describe.c:253
 #, c-format
@@ -5848,7 +6711,7 @@ msgstr "рассматривать последние <n> меток (по ум
 msgid "only consider tags matching <pattern>"
 msgstr "рассматривать только метки по <шаблону>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "если не найдено, показать сокращенный номер редакции коммита"
 
@@ -5882,21 +6745,21 @@ msgstr "«%s»: не является обычным файлом или сим
 msgid "invalid option: %s"
 msgstr "неправильный параметр: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:361
 msgid "Not a git repository"
-msgstr "Не является репозиторием git"
+msgstr "Не найден git репозитоий"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "передан неправильный объект «%s»."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "передано больше двух двоичных объектов: «%s»"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "передан необработанный объект «%s»."
@@ -5953,262 +6816,275 @@ msgstr "Применить спецификацию ссылки к экспор
 msgid "anonymize output"
 msgstr "сделать вывод анонимным"
 
-#: builtin/fetch.c:20
+#: builtin/fetch.c:21
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<опции>] [<репозиторий> [<спецификация-ссылки>…]]"
 
-#: builtin/fetch.c:21
+#: builtin/fetch.c:22
 msgid "git fetch [<options>] <group>"
 msgstr "git fetch [<опции>] <группа>"
 
-#: builtin/fetch.c:22
+#: builtin/fetch.c:23
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr "git fetch --multiple [<опции>] [(<репозиторий> | <группа>)…]"
 
-#: builtin/fetch.c:23
+#: builtin/fetch.c:24
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<опции>]"
 
-#: builtin/fetch.c:92 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "извлечь со всех внешних репозиториев"
 
-#: builtin/fetch.c:94 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "дописать к .git/FETCH_HEAD вместо перезаписи"
 
-#: builtin/fetch.c:96 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "путь к программе упаковки пакета на машине с внешним репозиторием"
 
-#: builtin/fetch.c:97 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "принудительная перезапись локальной ветки"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "извлечь с нескольких внешних репозиториев"
 
-#: builtin/fetch.c:101 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "извлечь все метки и связанные объекты"
 
-#: builtin/fetch.c:103
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "не извлекать все метки (--no-tags)"
 
-#: builtin/fetch.c:105
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "количество подмодулей, которые будут скачаны парралельно"
 
-#: builtin/fetch.c:107 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "почистить отслеживаемые внешние ветки, которых уже нет на внешнем репозитории"
 
-#: builtin/fetch.c:108 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "по требованию"
 
-#: builtin/fetch.c:109 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "управление рекурсивным извлечением подмодулей"
 
-#: builtin/fetch.c:113 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "оставить загруженный пакет данных"
 
-#: builtin/fetch.c:115
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "разрешить обновление ссылки HEAD"
 
-#: builtin/fetch.c:118 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
-msgstr "глубокая история частичного клона"
+msgstr "улугубить историю частичного клона"
+
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "углубить историю частичного клона основываясь на времени"
 
-#: builtin/fetch.c:120 builtin/pull.c:205
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "преобразовать в полный репозиторий"
 
-#: builtin/fetch.c:122 builtin/log.c:1399
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "каталог"
 
-#: builtin/fetch.c:123
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "присоединять это спереди к выводу путей подмодуля"
 
-#: builtin/fetch.c:126
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "режим по умолчанию для рекурсии"
 
-#: builtin/fetch.c:128 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "принимать ссылки, которые обновляют .git/shallow"
 
-#: builtin/fetch.c:129 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "соответствие-ссылок"
 
-#: builtin/fetch.c:130 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "указать соответствие ссылок при извлечении"
 
-#: builtin/fetch.c:386
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "Не удалось найти ссылку HEAD на внешнем репозитории"
 
-#: builtin/fetch.c:466
+#: builtin/fetch.c:514
+#, c-format
+msgid "configuration fetch.output contains invalid value %s"
+msgstr "опция fetch.output содержит неправильное значение для %s"
+
+#: builtin/fetch.c:607
 #, c-format
 msgid "object %s not found"
 msgstr "объект %s не найден"
 
-#: builtin/fetch.c:471
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[актуально]"
 
-#: builtin/fetch.c:485
-#, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s → %s  (не удалось извлечь в текущую ветку)"
-
-#: builtin/fetch.c:486 builtin/fetch.c:574
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[отклонено]"
 
-#: builtin/fetch.c:497
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "нельзя извлечь текущую ветку"
+
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[обновление метки]"
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (не удалось обновить локальную ссылку)"
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "не удалось обновить локальную ссылку"
 
-#: builtin/fetch.c:517
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[новая метка]"
 
-#: builtin/fetch.c:520
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[новая ветка]"
 
-#: builtin/fetch.c:523
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[новая ссылка]"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "не удалось обновить локальную ссылку"
-
-#: builtin/fetch.c:569
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "принудительное обновление"
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(без перемотки вперед)"
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "без перемотки вперед"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:749
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s не отправил все необходимые объекты\n"
 
-#: builtin/fetch.c:637
+#: builtin/fetch.c:769
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "%s отклонено из-за того, что частичные корни не разрешено обновлять"
 
-#: builtin/fetch.c:724 builtin/fetch.c:816
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "Из %.*s\n"
 
-#: builtin/fetch.c:735
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr "не удалось обновить некоторые локальные ссылки; попробуйте запустить «git remote prune %s», чтобы почистить старые, конфликтующие ветки"
 
-#: builtin/fetch.c:787
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s будет висящей веткой)"
 
-#: builtin/fetch.c:788
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s стала висящей веткой)"
 
-#: builtin/fetch.c:820
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[удалено]"
 
-#: builtin/fetch.c:821 builtin/remote.c:1025
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(нет)"
 
-#: builtin/fetch.c:841
+#: builtin/fetch.c:979
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Отказ получения в текущую ветку %s не голого репозитория"
 
-#: builtin/fetch.c:860
+#: builtin/fetch.c:998
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Неправильное значение «%2$s» для параметра «%1$s» для %3$s"
 
-#: builtin/fetch.c:863
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Параметр «%s» игнорируется для %s\n"
 
-#: builtin/fetch.c:920
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Не знаю как извлечь с %s"
 
-#: builtin/fetch.c:1080
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Извлечение из %s\n"
 
-#: builtin/fetch.c:1082 builtin/remote.c:96
+#: builtin/fetch.c:1239 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Не удалось извлечь %s"
 
-#: builtin/fetch.c:1100
+#: builtin/fetch.c:1257
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr "Не указан внешний репозиторий. Укажите URL или имя внешнего репозитория из которого должны извлекаться новые редакции."
 
-#: builtin/fetch.c:1123
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Вам нужно указать имя метки."
 
-#: builtin/fetch.c:1165
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Отрицательная грубина для --deepen не поддерживается"
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen и --depth нельзя использовать одновременно"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr "нельзя использовать одновременно --depth и --unshallow"
 
-#: builtin/fetch.c:1167
+#: builtin/fetch.c:1331
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow не имеет смысла на полном репозитории"
 
-#: builtin/fetch.c:1187
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all не принимает имя репозитория как аргумент"
 
-#: builtin/fetch.c:1189
+#: builtin/fetch.c:1355
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all не имеет смысла при указании спецификаций ссылок"
 
-#: builtin/fetch.c:1200
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Нет такого внешнего репозитория или группы: %s"
 
-#: builtin/fetch.c:1208
+#: builtin/fetch.c:1374
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Получение группы и указание спецификаций ссылок не имеет смысла"
 
@@ -6217,23 +7093,23 @@ msgid ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr "git fmt-merge-msg [-m <сообщение>] [--log[=<n>] | --no-log] [--file <файл>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "отправить в журнал <n> записей из короткого журнала"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "сокращение для --log (устаревшее)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "текст"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "использовать <текст> как начальное сообщение"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "файл для чтения"
 
@@ -6293,63 +7169,63 @@ msgstr "вывод только не слитых ссылок"
 msgid "print only refs which contain the commit"
 msgstr "вывод только ссылок, которые содержат коммит"
 
-#: builtin/fsck.c:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Проверка соединения"
-
-#: builtin/fsck.c:486
+#: builtin/fsck.c:519
 msgid "Checking object directories"
 msgstr "Проверка каталогов объектов"
 
-#: builtin/fsck.c:552
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<опции>] [<объект>…]"
 
-#: builtin/fsck.c:558
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
 msgstr "показать недоступные объекты"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "показать объекты, на которые нет ссылок"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "вывести отчет по меткам"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "вывести отчет по корневым узлам"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:598
 msgid "make index objects head nodes"
 msgstr "воспринимать объекты в индексе как корневые узлы"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "создать корневые узлы журналов ссылок (по умолчанию)"
 
-#: builtin/fsck.c:564
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
 msgstr "также проверять пакеты и альтернативные объекты"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "только проверить соединение"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "использовать более строгую проверку"
 
-#: builtin/fsck.c:568
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "записать объекты на которые нет ссылок в .git/lost-found"
 
-#: builtin/fsck.c:569 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "показать прогресс выполнения"
 
-#: builtin/fsck.c:630
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "показать подробные имена для недоступных объектов"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "Проверка объектов"
 
@@ -6434,224 +7310,219 @@ msgstr "grep: сбой создания потока: %s"
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "указано недопустимое количество потоков (%d) для %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:453 builtin/grep.c:488
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "не удалось прочитать дерево (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:503
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "не удалось выполнить grep из объекта типа %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "параметр «%c» ожидает числовое значение"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "не удалось открыть «%s»"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "искать в индексе, а не в рабочем каталоге"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "искать в содержимом не управляемым git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "искать и в отслеживаемых, и в неотслеживаемых файлах"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "игнорировать файлы указанные в «.gitignore»"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "искать в несовпадающих строках"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "без учета регистра"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "искать совпадения шаблона только на границах слов"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "обработка двоичных файлов как текста"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "не искать совпадения шаблона в двоичных файлах"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "обрабатываться двоичные файлы с помощью фильтров textconv"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "на глубине максиму <глубина> уровней"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "использовать расширенные регулярные выражения POSIX"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "использовать базовые регулярные выражения POSIX (по умолчанию)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "интерпретировать шаблоны как фиксированные строки"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "использовать Perl-совместимые регулярные выражения"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "вывести номера строк"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "не выводить имена файлов"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "выводить имена файлов"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "выводить имена файлов относительно каталога репозитория"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "выводить только имена файлов, а не совпадающие строки"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "синоним для --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "выводить только несовпадающие имена файлов"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "выводить двоичный НОЛЬ после списка имен файлов"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "выводить количество совпадений, а не совпадающие строки"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "подсвечивать совпадения"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr "выводить пустую строку после совпадений из разных файлов"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:705
 msgid "show filename only once above matches from same file"
 msgstr "выводить имя файла только раз на несколько совпадений в одном файле"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "показать <n> строк контекста перед и после совпадения"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "показать <n> строк контекста перед совпадением"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "показать <n> строк контекста после совпадения"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "использовать <кол> рабочих потоков"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "тоже, что и -C КОЛИЧЕСТВО"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "показать строку с именем функции перед совпадением"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "показать окружающую функцию"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "прочитать шаблоны из файла"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "поиск соответствий с <шаблоном>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "объединить шаблоны указанные с помощью -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "ничего не выводить, указать на совпадение с помощью кода выхода"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr "показать только совпадения из файлов в которых совпадают все шаблоны"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "показать дерево разбора для выражения поиска"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "пейджер"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "показать совпадающие файлы с помощью программы-пейджера"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "разрешить вызов grep(1) (игнорируется в этой сборке)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "не задан шаблон."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1477
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "указано неправильное количество потоков (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager работает только в рабочем каталоге"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached или --untracked нельзя использовать одновременно с --no-index."
 
-#: builtin/grep.c:906
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index или --untracked нельзя использовать одновременно с указанием редакции."
 
-#: builtin/grep.c:909
+#: builtin/grep.c:910
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard не может использоваться для отслеживаемого содержимого."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "указано одновременно --cached и дерево."
 
@@ -6665,176 +7536,180 @@ msgstr "git hash-object [-t <тип>] [-w] [--path=<файл> | --no-filters] [-
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "тип"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "тип объекта"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "запись объекта в базу данных объектов"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "прочитать объект из стандартного ввода"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "сохранить файл без использования фильтров"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr "хэшировать любой мусор и создавать поврежденные объекты для отладки Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "обработать файл так, будто он находится по указанному пути"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "вывести список всех доступных команд"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "исключить руководства"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "вывести список полезных руководств"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "открыть руководство в формате man"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "открыть руководство в веб-браузере"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "открыть руководство в формате info"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<команда>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "неопознанный формат руководства «%s»"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "Сбой при запуске emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "Сбой при определении версии emacsclient."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "версия emacsclient «%d» слишком старая (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "сбой при запуске «%s»"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr "«%s»: путь для неподдерживаемой программы просмотра man.\nВместо этого используйте «man.<программа>.cmd»."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
 "Please consider using 'man.<tool>.path' instead."
 msgstr "«%s»: команда для неподдерживаемой программы просмотра man.\nВместо этого используйте «man.<программа>.path»."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "«%s»: неизвестная программа просмотра man."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "программа просмотра man не обработала запрос"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "программа просмотра info не обработала запрос"
 
-#: builtin/help.c:408
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Определение атрибутов для путей файлов или каталогов"
 
-#: builtin/help.c:409
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Повседневный Git с 20 командами или около того"
 
-#: builtin/help.c:410
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Глоссарий Git"
 
-#: builtin/help.c:411
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Указание специально игнорируемых файлов"
 
-#: builtin/help.c:412
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Определение свойств подмодулей"
 
-#: builtin/help.c:413
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Указание редакций и диапазонов для Git"
 
-#: builtin/help.c:414
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Учебное введение в Git (для версии 1.5.1 или новее)"
 
-#: builtin/help.c:415
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Обзор рекомендуемых последовательностей выполняемых действий с Git"
 
-#: builtin/help.c:427
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Основные руководства Git:\n"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "использование: %s%s"
-
-#: builtin/help.c:481
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "«git %s» — это сокращение для «%s»"
 
-#: builtin/index-pack.c:152
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "использование: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "не удалось открыть %s"
 
-#: builtin/index-pack.c:202
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "несоответствие типа объекта на %s"
 
-#: builtin/index-pack.c:222
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "ожидаемый объект не получен на %s"
 
-#: builtin/index-pack.c:225
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "объект %s: ожидаемый тип %s, получен %s"
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
@@ -6843,159 +7718,163 @@ msgstr[1] "не удалось заполнить %d байта"
 msgstr[2] "не удалось заполнить %d байтов"
 msgstr[3] "не удалось заполнить %d байтов"
 
-#: builtin/index-pack.c:277
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "неожиданный конец файла"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "ошибка чтения ввода"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "использовано больше байт, чем было доступно"
 
-#: builtin/index-pack.c:297
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "пакет слишком большой для текущего определения off_t"
 
-#: builtin/index-pack.c:313
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "размер пакета превышает максимальный допустимый"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "не удалось создать «%s»"
 
-#: builtin/index-pack.c:318
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "не удалось открыть файл пакета «%s»"
 
-#: builtin/index-pack.c:332
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "несоответствие подписи пакета"
 
-#: builtin/index-pack.c:334
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "версия пакета %<PRIu32> не поддерживается"
 
-#: builtin/index-pack.c:352
+#: builtin/index-pack.c:356
 #, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "в Ð¿Ð°ÐºÐµÑ\82е Ñ\81одеÑ\80жиÑ\82Ñ\81Ñ\8f Ð¿Ð¾Ð²Ñ\80ежденнÑ\8bй Ð¾Ð±Ñ\8aекÑ\82 Ð¿Ð¾ Ñ\81меÑ\89ениÑ\8e %lu: %s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "пакеÑ\82 Ñ\81одеÑ\80жиÑ\82 Ð¿Ð»Ð¾Ñ\85ой Ð¾Ð±Ñ\8aекÑ\82 Ð¿Ð¾ Ñ\81меÑ\89ениÑ\8e %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:473
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "программа сжатия вернула %d"
 
-#: builtin/index-pack.c:522
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "переполнение значения смещения у базового объекта дельты"
 
-#: builtin/index-pack.c:530
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr "смещение базовой дельты вышло за допустимые пределы"
 
-#: builtin/index-pack.c:538
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "неизвестный тип объекта %d"
 
-#: builtin/index-pack.c:569
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "не удалось выполнить pread для файла пакета"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:576
 #, c-format
-msgid "premature end of pack file, %lu byte missing"
-msgid_plural "premature end of pack file, %lu bytes missing"
-msgstr[0] "преждевременное окончание файла пакета, %lu байт отсутствует"
-msgstr[1] "преждевременное окончание файла пакета, %lu байта отсутствует"
-msgstr[2] "преждевременное окончание файла пакета, %lu байтов отсутствует"
-msgstr[3] "преждевременное окончание файла пакета, %lu байтов отсутствует"
+msgid "premature end of pack file, %<PRIuMAX> byte missing"
+msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
+msgstr[0] "преждевременное окончание файла пакета, %<PRIuMAX> байт отсутствует"
+msgstr[1] "преждевременное окончание файла пакета, %<PRIuMAX> байта отсутствует"
+msgstr[2] "преждевременное окончание файла пакета, %<PRIuMAX> байтов отсутствует"
+msgstr[3] "преждевременное окончание файла пакета, %<PRIuMAX> байтов отсутствует"
 
-#: builtin/index-pack.c:597
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "серьезное несоответствие при распаковке"
 
-#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772
-#: builtin/index-pack.c:806 builtin/index-pack.c:815
+#: builtin/index-pack.c:748 builtin/index-pack.c:754 builtin/index-pack.c:777
+#: builtin/index-pack.c:811 builtin/index-pack.c:820
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "НАЙДЕНА КОЛЛИЗИЯ SHA1 С %s !"
 
-#: builtin/index-pack.c:746 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
 #, c-format
 msgid "unable to read %s"
 msgstr "не удалось прочитать %s"
 
-#: builtin/index-pack.c:812
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "не удалось прочитать существующий объект %s"
 
-#: builtin/index-pack.c:826
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "неправильный файл двоичного объекта %s"
 
-#: builtin/index-pack.c:840
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "неправильный %s"
 
-#: builtin/index-pack.c:843
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Ошибка в объекте"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:850
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Не все дочерние объекты %s достижимы"
 
-#: builtin/index-pack.c:917 builtin/index-pack.c:948
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
 msgid "failed to apply delta"
 msgstr "сбой при применении дельты"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
 msgstr "Получение объектов"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
 msgstr "Индексирование объектов"
 
-#: builtin/index-pack.c:1150
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "пакет поврежден (несоответствие SHA1)"
 
-#: builtin/index-pack.c:1155
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "не удалось выполнить fstat для файла пакета"
 
-#: builtin/index-pack.c:1158
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "файл пакета содержит мусор в конце"
 
-#: builtin/index-pack.c:1169
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "безумная путаница в parse_pack_objects()"
 
-#: builtin/index-pack.c:1194
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
 msgstr "Определение изменений"
 
-#: builtin/index-pack.c:1205
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "не удалось создать поток: %s"
 
-#: builtin/index-pack.c:1247
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "безумная путаница"
 
-#: builtin/index-pack.c:1253
+#: builtin/index-pack.c:1256
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
@@ -7004,12 +7883,12 @@ msgstr[1] "завершено с %d локальными объектами"
 msgstr[2] "завершено с %d локальными объектами"
 msgstr[3] "завершено с %d локальными объектами"
 
-#: builtin/index-pack.c:1265
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Неожиданная контрольная сумма в конце %s (диск поврежден?)"
 
-#: builtin/index-pack.c:1269
+#: builtin/index-pack.c:1272
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
@@ -7018,59 +7897,59 @@ msgstr[1] "пакет содержит %d неразрешенные дельт
 msgstr[2] "пакет содержит %d неразрешенных дельт"
 msgstr[3] "пакет содержит %d неразрешенных дельт"
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "нельзя сжать присоединенный объект (%d)"
 
-#: builtin/index-pack.c:1369
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "локальный объект %s поврежден"
 
-#: builtin/index-pack.c:1393
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "ошибка при закрытии файла пакета"
 
-#: builtin/index-pack.c:1406
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "не удалось записать файл удержания «%s»"
 
-#: builtin/index-pack.c:1414
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "не удалось закрыть записанный файл удержания «%s»"
 
-#: builtin/index-pack.c:1427
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "не удалось сохранить файл пакета"
 
-#: builtin/index-pack.c:1438
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "не удалось сохранить файл индекса"
 
-#: builtin/index-pack.c:1471
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "плохой pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1481 builtin/index-pack.c:1678
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "нет поддержки потоков, игнорирование %s"
 
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Не удалось открыть существующий файл пакета «%s»"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1544
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Не удалось открыть существующий файл индекса для «%s»"
 
-#: builtin/index-pack.c:1589
+#: builtin/index-pack.c:1591
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
@@ -7079,7 +7958,7 @@ msgstr[1] "не дельты: %d объекта"
 msgstr[2] "не дельты: %d объектов"
 msgstr[3] "не дельты: %d объектов"
 
-#: builtin/index-pack.c:1596
+#: builtin/index-pack.c:1598
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
@@ -7088,141 +7967,137 @@ msgstr[1] "длина цепочки = %d: %lu объекта"
 msgstr[2] "длина цепочки = %d: %lu объектов"
 msgstr[3] "длина цепочки = %d: %lu объектов"
 
-#: builtin/index-pack.c:1609
+#: builtin/index-pack.c:1611
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "имя пакета «%s» не оканчивается на «.pack»"
 
-#: builtin/index-pack.c:1638
-msgid "Cannot come back to cwd"
-msgstr "Не удалось вернуться в текущий рабочий каталог"
-
-#: builtin/index-pack.c:1690 builtin/index-pack.c:1693
-#: builtin/index-pack.c:1705 builtin/index-pack.c:1709
+#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
+#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
 #, c-format
 msgid "bad %s"
 msgstr "плохой %s"
 
-#: builtin/index-pack.c:1723
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin нельзя использовать без --stdin"
 
-#: builtin/index-pack.c:1731
+#: builtin/index-pack.c:1740
 msgid "--verify with no packfile name given"
 msgstr "--verify без указания имени файла пакета"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "не удалось выполнить stat для «%s»"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "не удалось выполнить stat для шаблона «%s»"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "не удалось выполнить opendir для «%s»"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "не удалось выполнить readlink для «%s»"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "не удалось создать символьную ссылку «%s» на «%s»"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "не удалось скопировать файл «%s» в «%s»"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "игнорирование шаблона %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "шаблоны не найдены %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "не копирую шаблоны из «%s»: %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s уже существует"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "не удается обработать файл типа %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "не удается переместить файл %s в %s"
 
-#. TRANSLATORS: The first '%s' is either "Reinitialized
-#. existing" or "Initialized empty", the second " shared" or
-#. "", and the last '%s%s' is the verbatim directory name.
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s уже существует"
+
 #: builtin/init-db.c:403
 #, c-format
-msgid "%s%s Git repository in %s%s\n"
-msgstr "%s%s репозиторий Git в %s%s\n"
+msgid "Reinitialized existing shared Git repository in %s%s\n"
+msgstr "Переинициализирован существующий общий репозиторий Git в %s%s\n"
 
 #: builtin/init-db.c:404
-msgid "Reinitialized existing"
-msgstr "Переинициализация существующего"
+#, c-format
+msgid "Reinitialized existing Git repository in %s%s\n"
+msgstr "Переинициализирован существующий репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:404
-msgid "Initialized empty"
-msgstr "Инициализирован пустой"
+#: builtin/init-db.c:408
+#, c-format
+msgid "Initialized empty shared Git repository in %s%s\n"
+msgstr "Инициализирован пустой общий репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:405
-msgid " shared"
-msgstr " общий"
+#: builtin/init-db.c:409
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
+msgstr "Инициализирован пустой репозиторий Git в %s%s\n"
 
-#: builtin/init-db.c:452
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] "
 "[--shared[=<permissions>]] [<directory>]"
 msgstr "git init [-q | --quiet] [--bare] [--template=<каталог-шаблонов>] [--shared[=<права-доступа>]] [<каталог>]"
 
-#: builtin/init-db.c:475
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "права-доступа"
 
-#: builtin/init-db.c:476
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "укажите, если репозиторий git будет использоваться несколькими пользователями"
 
-#: builtin/init-db.c:510 builtin/init-db.c:515
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "не удалось выполнить mkdir %s"
 
-#: builtin/init-db.c:519
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "не удалось выполнить chdir в %s"
 
-#: builtin/init-db.c:540
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr "%s (или --work-tree=<каталог>) нельзя использовать без указания %s (или --git-dir=<каталог>)"
 
-#: builtin/init-db.c:568
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Не удалось получить доступ к рабочему каталогу «%s»"
@@ -7253,423 +8128,428 @@ msgstr "завершители для добавления"
 msgid "no input file given for in-place editing"
 msgstr "ничего не передано, для редактирования файлов на месте"
 
-#: builtin/log.c:43
+#: builtin/log.c:44
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [<опции>] [<диапазон-редакций>] [[--] <путь>…]"
 
-#: builtin/log.c:44
+#: builtin/log.c:45
 msgid "git show [<options>] <object>..."
 msgstr "git show [<опции>] <объект>…"
 
-#: builtin/log.c:83
+#: builtin/log.c:84
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "неправильный параметр для --decorate: %s"
 
-#: builtin/log.c:137
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "не выводить различия"
 
-#: builtin/log.c:138
+#: builtin/log.c:140
 msgid "show source"
 msgstr "показать источник"
 
-#: builtin/log.c:139
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "Использовать файл соответствия почтовых адресов"
 
-#: builtin/log.c:140
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "опции формата вывода ссылок"
 
-#: builtin/log.c:143
+#: builtin/log.c:145
 msgid "Process line range n,m in file, counting from 1"
 msgstr "Обработать диапазон строк n,m из файла, начиная с 1"
 
-#: builtin/log.c:239
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Финальный вывод: %d %s\n"
 
-#: builtin/log.c:471
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: плохой файл"
 
-#: builtin/log.c:485 builtin/log.c:578
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "Не удалось прочитать объект %s"
 
-#: builtin/log.c:602
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Неизвестный тип объекта: %d"
 
-#: builtin/log.c:722
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "в format.headers не указано значение"
 
-#: builtin/log.c:812
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "слишком длинное имя выходного каталога"
 
-#: builtin/log.c:827
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Ну удалось открыть файл изменений %s"
 
-#: builtin/log.c:841
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "Нужен только один диапазон."
 
-#: builtin/log.c:851
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "Не является диапазоном."
 
-#: builtin/log.c:957
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "Сопроводительное письмо должно быть в формате электронной почты"
 
-#: builtin/log.c:1036
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ошибка в поле in-reply-to: %s"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<опции>] [<начиная-с> | <диапазон-редакций>]"
 
-#: builtin/log.c:1109
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Два выходных каталога?"
 
-#: builtin/log.c:1216 builtin/log.c:1857 builtin/log.c:1859 builtin/log.c:1871
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Неизвестный коммит %s"
 
-#: builtin/log.c:1226 builtin/notes.c:253 builtin/notes.c:304
-#: builtin/notes.c:306 builtin/notes.c:369 builtin/notes.c:424
-#: builtin/notes.c:510 builtin/notes.c:515 builtin/notes.c:593
-#: builtin/notes.c:656 builtin/notes.c:881 builtin/tag.c:455
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Не удалось разрешить «%s» как ссылку."
 
-#: builtin/log.c:1231
+#: builtin/log.c:1263
 msgid "Could not find exact merge base."
 msgstr "Не удалось найти точную базу слияния."
 
-#: builtin/log.c:1235
+#: builtin/log.c:1267
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
 "Or you could specify base commit by --base=<base-commit-id> manually."
 msgstr "Не удалось получить вышестоящую ветку. Если вы хотите записать базовый коммит автомитически, то используйте git branch --set-upstream-to для отслеживания внешней ветки.\nИли же вы можете указать базовый коммит указанием --base=<идентификатор-базового-коммита> вручную."
 
-#: builtin/log.c:1255
+#: builtin/log.c:1287
 msgid "Failed to find exact merge base"
 msgstr "Не удалось найти точную базу слияния"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1298
 msgid "base commit should be the ancestor of revision list"
 msgstr "базовый коммит должен быть предком списка редакций"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1302
 msgid "base commit shouldn't be in revision list"
 msgstr "базовый коммит не должен быть в списке редакций"
 
-#: builtin/log.c:1319
+#: builtin/log.c:1351
 msgid "cannot get patch id"
 msgstr "не удалось получить идентификатор патча"
 
-#: builtin/log.c:1377
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "выводить [PATCH n/m] даже когда один патч"
 
-#: builtin/log.c:1380
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "выводить [PATCH] даже когда несколько патчей"
 
-#: builtin/log.c:1384
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "выводить патчи на стандартный вывод"
 
-#: builtin/log.c:1386
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "генерировать сопроводительное письмо"
 
-#: builtin/log.c:1388
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "использовать простую последовательность чисел для имен выходных файлов"
 
-#: builtin/log.c:1389
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "суффикс"
 
-#: builtin/log.c:1390
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "использовать суффикс <суффикс> вместо «.patch»"
 
-#: builtin/log.c:1392
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "начать нумерацию патчей с <n>, а не с 1"
 
-#: builtin/log.c:1394
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "пометить серию как энную попытку"
 
-#: builtin/log.c:1396
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Использовать [RFC PATCH] вместо [PATCH]"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Использовать [<префикс>] вместо [PATCH]"
 
-#: builtin/log.c:1399
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "сохранить результирующие файлы в <каталог>"
 
-#: builtin/log.c:1402
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "не обрезать/добавлять [PATCH]"
 
-#: builtin/log.c:1405
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "не выводить двоичные различия"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "выводить нулевую хэш-сумму в заголовке From"
 
-#: builtin/log.c:1409
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "не включать патч, если коммит уже есть в вышестоящей ветке"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "выводить в формате патча, а не в стандартном (патч + статистика)"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "Передача сообщений"
 
-#: builtin/log.c:1414
+#: builtin/log.c:1448
 msgid "header"
 msgstr "заголовок"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "добавить заголовок сообщения"
 
-#: builtin/log.c:1416 builtin/log.c:1418
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "почта"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "добавить заголовок To:"
 
-#: builtin/log.c:1418
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "добавить заголовок Cc:"
 
-#: builtin/log.c:1420
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "идентификатор"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "установить адрес отправителя на <идентификатор> (или на идентификатор коммитера, если отсутствует)"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "идентификатор-сообщения"
 
-#: builtin/log.c:1424
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "сделать первое письмо ответом на <идентификатор-сообщения>"
 
-#: builtin/log.c:1425 builtin/log.c:1428
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "вложение"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "приложить патч"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "включить патч в текст письма"
 
-#: builtin/log.c:1433
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "включить в письмах иерархичность, стили: shallow (частичную), deep (глубокую)"
 
-#: builtin/log.c:1435
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "подпись"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "добавить подпись"
 
-#: builtin/log.c:1437
+#: builtin/log.c:1471
 msgid "base-commit"
 msgstr "базовый коммит"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1472
 msgid "add prerequisite tree info to the patch series"
 msgstr "добавить информацию о требовании дерева к серии патчей"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "добавить подпись из файла"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "не выводить имена файлов патчей"
 
-#: builtin/log.c:1531
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n и -k нельзя использовать одновременно"
 
-#: builtin/log.c:1533
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix и -k нельзя использовать одновременно."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc и -k нельзя использовать одновременно."
 
-#: builtin/log.c:1541
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only не имеет смысла"
 
-#: builtin/log.c:1543
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status не имеет смысла"
 
-#: builtin/log.c:1545
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check не имеет смысла"
 
-#: builtin/log.c:1573
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "стандартный вывод или каталог?"
 
-#: builtin/log.c:1575
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Не удалось создать каталог «%s»"
 
-#: builtin/log.c:1672
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "не удалось прочитать файл подписи «%s»"
 
-#: builtin/log.c:1743
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "Сбой при создании выходных файлов"
 
-#: builtin/log.c:1792
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<вышестоящая-ветка> [<голова> [<ограничение>]]]"
 
-#: builtin/log.c:1846
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> "
 "manually.\n"
 msgstr "Не удалось найти отслеживаемую внешнюю ветку, укажите <вышестоящую-ветку> вручную.\n"
 
-#: builtin/ls-files.c:378
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<опции>] [<файл>…]"
 
-#: builtin/ls-files.c:427
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "выводить имена файлов с метками"
 
-#: builtin/ls-files.c:429
+#: builtin/ls-files.c:509
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "использовать символы в нижнем регистре для «предположительно без изменений» файлов"
 
-#: builtin/ls-files.c:431
+#: builtin/ls-files.c:511
 msgid "show cached files in the output (default)"
 msgstr "показывать кэшированные файлы при выводе (по умолчанию)"
 
-#: builtin/ls-files.c:433
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "показывать удаленные файлы при выводе"
 
-#: builtin/ls-files.c:435
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "показывать измененные файлы при выводе"
 
-#: builtin/ls-files.c:437
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "показывать другие файлы при выводе"
 
-#: builtin/ls-files.c:439
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "показывать игнорируемые файлы при выводе"
 
-#: builtin/ls-files.c:442
+#: builtin/ls-files.c:522
 msgid "show staged contents' object name in the output"
 msgstr "показывать имя индексированного объекта на выводе"
 
-#: builtin/ls-files.c:444
+#: builtin/ls-files.c:524
 msgid "show files on the filesystem that need to be removed"
 msgstr "показывать файлы в файловой системе, которые должны быть удалены"
 
-#: builtin/ls-files.c:446
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "показывать только имена у «других» каталогов"
 
-#: builtin/ls-files.c:448
+#: builtin/ls-files.c:528
 msgid "show line endings of files"
 msgstr "показать концы строк файлов"
 
-#: builtin/ls-files.c:450
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "не показывать пустые каталоги"
 
-#: builtin/ls-files.c:453
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
 msgstr "показывать не слитые файлы на выводе"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
 msgstr "показывать информации о разрешении конфликтов и отмене"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "пропустить файлы, соответствующие шаблону"
 
-#: builtin/ls-files.c:460
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "прочитать шаблоны исключения из <файл>"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:543
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "прочитать дополнительные покаталожные шаблоны исключения из <файл>"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "добавить стандартные исключения git"
 
-#: builtin/ls-files.c:468
+#: builtin/ls-files.c:548
 msgid "make the output relative to the project top directory"
 msgstr "выводить пути относительно корневого каталога проекта"
 
-#: builtin/ls-files.c:471
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "рекурсивно по подмодулям"
+
+#: builtin/ls-files.c:553
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "если какой-либо <файл> не в индексе, считать это ошибкой"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:554
 msgid "tree-ish"
 msgstr "указатель-дерева"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:555
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr "притвориться, что пути удалены, т.к. <указатель-дерева> еще существует"
 
-#: builtin/ls-files.c:475
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "показать отладочную информацию"
 
@@ -7752,186 +8632,172 @@ msgstr "использовать полные пути"
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "вывести полное дерево; не только текущий каталог (включает в себя --full-name)"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<опции>] [<коммит>…]"
 
-#: builtin/merge.c:46
+#: builtin/merge.c:47
 msgid "git merge [<options>] <msg> HEAD <commit>"
 msgstr "git merge [<опции>] <сообщение> HEAD <коммит>"
 
-#: builtin/merge.c:47
+#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:101
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "при указании параметра «m» требуется указать значение"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:139
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Не удалось найти стратегию слияния «%s».\n"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "Доступные стратегии:"
 
-#: builtin/merge.c:144
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Доступные пользовательские стратегии:"
 
-#: builtin/merge.c:194 builtin/pull.c:126
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "не выводить статистику изменений после окончания слияния"
 
-#: builtin/merge.c:197 builtin/pull.c:129
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "вывести статистику изменений после окончания слияния"
 
-#: builtin/merge.c:198 builtin/pull.c:132
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(синоним для --stat)"
 
-#: builtin/merge.c:200 builtin/pull.c:135
+#: builtin/merge.c:201 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "добавить (максимум <n>) записей из короткого журнала в сообщение коммита у слияния"
 
-#: builtin/merge.c:203 builtin/pull.c:138
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "создать один коммит, вместо выполнения слияния"
 
-#: builtin/merge.c:205 builtin/pull.c:141
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "сделать коммит, если слияние прошло успешно (по умолчанию)"
 
-#: builtin/merge.c:207 builtin/pull.c:144
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "отредактировать сообщение перед выполнением коммита"
 
-#: builtin/merge.c:208
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "разрешить перемотку вперед (по умолчанию)"
 
-#: builtin/merge.c:210 builtin/pull.c:150
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "отменить выполнение слияния, если перемотка вперед невозможна"
 
-#: builtin/merge.c:214
-msgid "Verify that the named commit has a valid GPG signature"
-msgstr "Ð\9fроверить, что указанный коммит имеет верную электронную подпись GPG"
+#: builtin/merge.c:215 builtin/pull.c:154
+msgid "verify that the named commit has a valid GPG signature"
+msgstr "проверить, что указанный коммит имеет верную электронную подпись GPG"
 
-#: builtin/merge.c:215 builtin/notes.c:771 builtin/pull.c:157
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "стратегия"
 
-#: builtin/merge.c:216 builtin/pull.c:158
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "используемая стратегия слияния"
 
-#: builtin/merge.c:217 builtin/pull.c:161
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "опция=значение"
 
-#: builtin/merge.c:218 builtin/pull.c:162
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "опции для выбранной стратегии слияния"
 
-#: builtin/merge.c:220
+#: builtin/merge.c:221
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "сообщение коммита для слияния (для слияния без перемотки вперед)"
 
-#: builtin/merge.c:224
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
 msgstr "отменить выполнение происходящего слияния"
 
-#: builtin/merge.c:226 builtin/pull.c:169
+#: builtin/merge.c:227 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "разрешить слияние несвязанных историй изменений"
 
-#: builtin/merge.c:254
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "не удалось выполнить stash."
 
-#: builtin/merge.c:259
+#: builtin/merge.c:260
 msgid "stash failed"
 msgstr "сбой при выполнении stash"
 
-#: builtin/merge.c:264
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "неправильный объект: %s"
 
-#: builtin/merge.c:283 builtin/merge.c:300
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "сбой при выполнении read-tree"
 
-#: builtin/merge.c:330
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (нечего уплотнять)"
 
-#: builtin/merge.c:343
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Уплотнение коммита — не обновляя HEAD\n"
 
-#: builtin/merge.c:347 builtin/merge.c:767 builtin/merge.c:987
-#: builtin/merge.c:1000
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "Не удалось записать в «%s»"
-
-#: builtin/merge.c:375
-msgid "Writing SQUASH_MSG"
-msgstr "Запись SQUASH_MSG"
-
-#: builtin/merge.c:377
-msgid "Finishing SQUASH_MSG"
-msgstr "Завершение SQUASH_MSG"
-
-#: builtin/merge.c:400
+#: builtin/merge.c:392
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Нет сообщения слияния — не обновляем HEAD\n"
 
-#: builtin/merge.c:451
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "«%s» не указывает на коммит"
 
-#: builtin/merge.c:541
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Неправильная строка branch.%s.mergeoptions: %s"
 
-#: builtin/merge.c:660
+#: builtin/merge.c:652
 msgid "Not handling anything other than two heads merge."
 msgstr "Не обрабатываю ничего, кроме слияния двух указателей на ветки."
 
-#: builtin/merge.c:674
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Неизвестный параметр merge-recursive: -X%s"
 
-#: builtin/merge.c:687
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "не удалось записать %s"
 
-#: builtin/merge.c:776
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Не удалось прочесть из «%s»"
 
-#: builtin/merge.c:785
+#: builtin/merge.c:742
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr "Не выполняю коммит слияния; используйте «git commit» для завершения слияния.\n"
 
-#: builtin/merge.c:791
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -7941,161 +8807,183 @@ msgid ""
 "the commit.\n"
 msgstr "Пожалуйста, введите сообщение коммита, для объяснения, зачем нужно\nэто слияние, особенно, если это слияние обновленной вышестоящей\nветки в тематическую ветку.\n\nСтроки, начинающиеся с «%c» будут проигнорированы, а пустое\nсообщение отменяет процесс коммита.\n"
 
-#: builtin/merge.c:815
+#: builtin/merge.c:772
 msgid "Empty commit message."
 msgstr "Пустое сообщение коммита."
 
-#: builtin/merge.c:835
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Прекрасно.\n"
 
-#: builtin/merge.c:890
+#: builtin/merge.c:847
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "Не удалось провести автоматическое слияние; исправьте конфликты и сделайте коммит результата.\n"
 
-#: builtin/merge.c:906
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "«%s» не является коммитом"
 
-#: builtin/merge.c:947
+#: builtin/merge.c:904
 msgid "No current branch."
 msgstr "Нет текущей ветки."
 
-#: builtin/merge.c:949
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "У текущей ветки нет внешнего репозитория."
 
-#: builtin/merge.c:951
+#: builtin/merge.c:908
 msgid "No default upstream defined for the current branch."
 msgstr "Для текущей ветки не указана вышестоящая ветка по умолчанию."
 
-#: builtin/merge.c:956
+#: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Не указана внешняя отслеживаемая ветка для %s на %s"
 
-#: builtin/merge.c:1091
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Плохое значение «%s» в переменной окружения «%s»"
+
+#: builtin/merge.c:1034
 #, c-format
 msgid "could not close '%s'"
 msgstr "не удалось закрыть «%s»"
 
-#: builtin/merge.c:1219
+#: builtin/merge.c:1061
+#, c-format
+msgid "not something we can merge in %s: %s"
+msgstr "не является тем, что можно слить в %s: %s"
+
+#: builtin/merge.c:1095
+msgid "not something we can merge"
+msgstr "не является тем, что можно слить"
+
+#: builtin/merge.c:1162
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Нет слияния, которое можно отменить (отсутствует файл MERGE_HEAD)."
 
-#: builtin/merge.c:1235
+#: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr "Вы не завершили слияние (присутствует файл MERGE_HEAD).\nВыполните коммит ваших изменений, перед слиянием."
 
-#: builtin/merge.c:1242
+#: builtin/merge.c:1185
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr "Вы не завершили копирование коммита (присутствует файл CHERRY_PICK_HEAD).\nПожалуйста, закоммитьте ваши изменения, перед слиянием."
 
-#: builtin/merge.c:1245
+#: builtin/merge.c:1188
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Вы не завершили копирование коммита (присутствует файл CHERRY_PICK_HEAD)."
 
-#: builtin/merge.c:1254
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Нельзя использовать одновременно --squash и --no-ff."
 
-#: builtin/merge.c:1262
+#: builtin/merge.c:1205
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Коммит не указан и параметр merge.defaultToUpstream не установлен."
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1222
 msgid "Squash commit into empty head not supported yet"
 msgstr "Уплотнение коммита в пустую ветку еще не поддерживается"
 
-#: builtin/merge.c:1281
+#: builtin/merge.c:1224
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Коммит, не являющийся перемоткой вперед, нет смысла делать в пустую ветку."
 
-#: builtin/merge.c:1286
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s не является тем, что можно слить"
 
-#: builtin/merge.c:1288
+#: builtin/merge.c:1231
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Можно только один коммит в пустую ветку."
 
-#: builtin/merge.c:1344
+#: builtin/merge.c:1287
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "Коммит %s содержит не доверенную GPG подпись, предположительно от %s."
 
-#: builtin/merge.c:1347
+#: builtin/merge.c:1290
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Коммит %s содержит плохую GPG подпись, предположительно от %s."
 
-#: builtin/merge.c:1350
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Коммит %s не содержит GPG подпись."
 
-#: builtin/merge.c:1353
+#: builtin/merge.c:1296
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Коммит %s содержит действительную GPG подпись, от %s.\n"
 
-#: builtin/merge.c:1415
+#: builtin/merge.c:1358
 msgid "refusing to merge unrelated histories"
 msgstr "отказ слияния несвязанных историй изменений"
 
-#: builtin/merge.c:1439
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Уже обновлено."
+
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Обновление %s..%s\n"
 
-#: builtin/merge.c:1476
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Попытка тривиального слияния в индексе…\n"
 
-#: builtin/merge.c:1483
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "Не вышло.\n"
 
-#: builtin/merge.c:1515
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Уже обновлено. Круто!"
+
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
 msgstr "Перемотка вперед невозможна, отмена."
 
-#: builtin/merge.c:1538 builtin/merge.c:1617
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Перемотка дерева к исходному состоянию…\n"
 
-#: builtin/merge.c:1542
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Попытка слияния с помощью стратегии %s…\n"
 
-#: builtin/merge.c:1608
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ни одна стратегия слияния не обработала слияние.\n"
 
-#: builtin/merge.c:1610
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Сбой при слиянии с помощью стратегии %s.\n"
 
-#: builtin/merge.c:1619
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Использую %s для подготовки ручного разрешения конфликтов.\n"
 
-#: builtin/merge.c:1631
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "Автоматическое слияние прошло успешно; как и запрашивали, остановлено перед выполнением коммита\n"
@@ -8120,23 +9008,23 @@ msgstr "git merge-base --is-ancestor <коммит> <коммит>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <ссылка> [<коммит>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "вывести всех общих предков"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "вывести предков для одного многоходового слияния"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "вывести список редаций, которые не достижимы из друг друга"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "является первым предком второго указанного коммита?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "найти журнале ссылок <ссылка> где именно <коммит> разветвился"
 
@@ -8178,6 +9066,39 @@ msgstr "не предупреждать о конфликтах"
 msgid "set labels for file1/orig-file/file2"
 msgstr "установить метки для файл1/ориг-файл/файл2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "неизвестная опция %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "не удалось разобрать объект «%s»"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "невозможно обработать больше %d базы. Игнорирую %s."
+msgstr[1] "невозможно обработать больше %d баз. Игнорирую %s."
+msgstr[2] "невозможно обработать больше %d баз. Игнорирую %s."
+msgstr[3] "невозможно обработать больше %d базы. Игнорирую %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "не обрабатываю ничего, кроме слияния двух указателей на ветки."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "не удалось распознать ссылку «%s»"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Слияние %s и %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -8220,109 +9141,109 @@ msgstr "принудительно перемещать/переименоват
 msgid "skip move/rename errors"
 msgstr "пропускать ошибки при перемещении/переименовании"
 
-#: builtin/mv.c:152
+#: builtin/mv.c:155
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "целевой путь «%s» не является каталогом"
 
-#: builtin/mv.c:163
+#: builtin/mv.c:166
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Проверка переименования из «%s» в «%s»\n"
 
-#: builtin/mv.c:167
+#: builtin/mv.c:170
 msgid "bad source"
 msgstr "плохой источник"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:173
 msgid "can not move directory into itself"
 msgstr "нельзя переместить каталог в самого себя"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:176
 msgid "cannot move directory over file"
 msgstr "нельзя переместить каталог в файл"
 
-#: builtin/mv.c:182
+#: builtin/mv.c:185
 msgid "source directory is empty"
 msgstr "исходный каталог пуст"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:210
 msgid "not under version control"
 msgstr "не под версионным контролем"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:213
 msgid "destination exists"
 msgstr "целевой путь уже существует"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:221
 #, c-format
 msgid "overwriting '%s'"
 msgstr "перезапись «%s»"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:224
 msgid "Cannot overwrite"
 msgstr "Не удалось перезаписать"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:227
 msgid "multiple sources for the same target"
 msgstr "несколько источников для одного целевого пути"
 
-#: builtin/mv.c:226
+#: builtin/mv.c:229
 msgid "destination directory does not exist"
 msgstr "целевой каталог не существует"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:236
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, откуда=%s, куда=%s"
 
-#: builtin/mv.c:254
+#: builtin/mv.c:257
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Переименование %s в %s\n"
 
-#: builtin/mv.c:260 builtin/remote.c:714 builtin/repack.c:365
+#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "сбой при переименовании «%s»"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<опции>] <коммит>…"
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<опции>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<опции>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "выводить только имена (без SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "использовать только метки для именования коммитов"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "использовать только ссылки, соответствующие <шаблону> "
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "вывести список всех коммитов, достижимых со всех ссылок"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "прочитать из стандартного ввода"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "разрешить вывод «undefined», если не найдено (по умолчанию)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "разыменовывать введенные метки (для внутреннего использования)"
 
@@ -8431,6 +9352,10 @@ msgstr "git notes prune [<опции>]"
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
+#: builtin/notes.c:94
+msgid "Write/edit the notes for the following object:"
+msgstr "Записать/изменить заметки для следующего объекта:"
+
 #: builtin/notes.c:147
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -8445,366 +9370,456 @@ msgstr "не удалось прочитать вывод «show»"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "не удалось завершить «show» для объекта «%s»"
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
-msgstr "не удалось создать файл «%s»"
-
-#: builtin/notes.c:193
-msgid "Please supply the note contents using either -m or -F option"
-msgstr "Пожалуйста, укажите содержимое заметки, используя опцию -m или -F"
+#: builtin/notes.c:194
+msgid "please supply the note contents using either -m or -F option"
+msgstr "пожалуйста, укажите содержимое заметки, используя опцию -m или -F"
 
-#: builtin/notes.c:202
+#: builtin/notes.c:203
 msgid "unable to write note object"
 msgstr "не удалось записать объект заметки"
 
-#: builtin/notes.c:204
+#: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Содержимое заметки осталось в %s"
+msgid "the note contents have been left in %s"
+msgstr "содержимое заметки осталось в %s"
 
-#: builtin/notes.c:232 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "не удалось прочитать «%s»"
 
-#: builtin/notes.c:234 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "не удалось открыть или прочитать «%s»"
 
-#: builtin/notes.c:256
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:659
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "не удалось разрешить «%s» как ссылку."
+
+#: builtin/notes.c:257
+#, c-format
+msgid "failed to read object '%s'."
+msgstr "не удалось прочитать объект «%s»."
+
+#: builtin/notes.c:261
+#, c-format
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "не удалось прочитать данные заметки из недвоичного объекта «%s»."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "неправильная введенная строка: «%s»."
+
+#: builtin/notes.c:316
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82 Â«%s»."
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81копиÑ\80оваÑ\82Ñ\8c Ð·Ð°Ð¼ÐµÑ\82кÑ\83 Ð¸Ð· Â«%s» Ð² Â«%s»"
 
-#: builtin/notes.c:260
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð´Ð°Ð½Ð½Ñ\8bе Ð·Ð°Ð¼ÐµÑ\82ки Ð¸Ð· Ð½ÐµÐ´Ð²Ð¾Ð¸Ñ\87ного Ð¾Ð±Ñ\8aекÑ\82а Â«%s»."
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "оÑ\82каз Ð² Ð¿ÐµÑ\80езапиÑ\81и %s Ð·Ð°Ð¼ÐµÑ\82ок Ð² %s (за Ð¿Ñ\80еделами refs/notes/)"
 
-#: builtin/notes.c:362 builtin/notes.c:417 builtin/notes.c:493
-#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649
-#: builtin/notes.c:946
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:652
+#: builtin/notes.c:802 builtin/notes.c:949 builtin/notes.c:970
 msgid "too many parameters"
 msgstr "передано слишком много параметров"
 
-#: builtin/notes.c:375 builtin/notes.c:662
+#: builtin/notes.c:378 builtin/notes.c:665
 #, c-format
-msgid "No note found for object %s."
-msgstr "Ð\9dе найдена заметка для объекта %s."
+msgid "no note found for object %s."
+msgstr "не найдена заметка для объекта %s."
 
-#: builtin/notes.c:396 builtin/notes.c:559
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "текстовое содержимое заметки"
 
-#: builtin/notes.c:399 builtin/notes.c:562
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "содержимое заметки в файле"
 
-#: builtin/notes.c:402 builtin/notes.c:565
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "использовать и отредактировать указанный объект заметки"
 
-#: builtin/notes.c:405 builtin/notes.c:568
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "использовать указанный объект заметки"
 
-#: builtin/notes.c:408 builtin/notes.c:571
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "разрешить сохранение пустой заметки"
 
-#: builtin/notes.c:409 builtin/notes.c:480
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "заменить существующие заметки"
 
-#: builtin/notes.c:434
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "Не удалось добавить заметку. Найдена существующая заметка у объекта %s. Используйте параметр «-f» для перезаписи существующих заметок."
 
-#: builtin/notes.c:449 builtin/notes.c:528
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Перезапись существующих заметок у объекта %s\n"
 
-#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:886
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Удаление заметки у объекта %s\n"
 
-#: builtin/notes.c:481
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "прочитать объекты из стандартного ввода"
 
-#: builtin/notes.c:483
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "загрузить настройки перезаписи для команды <команда> (включает в себя --stdin)"
 
-#: builtin/notes.c:501
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "передано слишком мало параметров"
 
-#: builtin/notes.c:522
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite"
 " existing notes"
 msgstr "Не удалось скопировать заметку. Найдена существующая заметка у объекта %s. Используйте параметр «-f» для перезаписи существующих заметок."
 
-#: builtin/notes.c:534
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Ð\9dет заметок у исходного объекта %s. Нельзя скопировать."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "нет заметок у исходного объекта %s. Нельзя скопировать."
 
-#: builtin/notes.c:586
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr "Опции -m/-F/-c/-C для подкоманды «edit» устарели.\nИспользуйте вместо них «git notes add -f -m/-F/-c/-C».\n"
 
-#: builtin/notes.c:768
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "не удалось удалить ссылку NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "не удалось удалить ссылку NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "не удалось удалить рабочий каталог «git notes merge»"
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "не удалось прочитать ссылку NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "не удалось найти коммит из NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "не удалось разобрать коммит из NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "не удалось разрешить NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "не удалось завершить слиние заметок"
+
+#: builtin/notes.c:755
+#, c-format
+msgid "unknown notes merge strategy %s"
+msgstr "неизвестная стратегия слияния заметок %s"
+
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Общие опции"
 
-#: builtin/notes.c:770
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Опции слияния"
 
-#: builtin/notes.c:772
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy "
 "(manual/ours/theirs/union/cat_sort_uniq)"
 msgstr "разрешить конфликты заметок с помощью указанной стратегии (manual/ours/theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:774
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "Коммит не слитых заметок"
 
-#: builtin/notes.c:776
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "завершить слияние заметок коммитом не слитых заметок"
 
-#: builtin/notes.c:778
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "Отмена разрешения слияния заметок"
 
-#: builtin/notes.c:780
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "отменить слияние заметок"
 
-#: builtin/notes.c:857
+#: builtin/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "нельзя использовать одновременно --commit, --abort и -s/--strategy"
+
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "вы должны указать ссылку заметки для слияния"
+
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "неизвестный параметр для -s/--strategy: %s"
+
+#: builtin/notes.c:860
+#, c-format
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "слияние заметок в %s уже выполняется на %s"
+
+#: builtin/notes.c:863
+#, c-format
+msgid "failed to store link to current notes ref (%s)"
+msgstr "не удалось сохранить адрес текущей ссылки на заметку (%s)"
+
+#: builtin/notes.c:865
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Слияние заметок в %s уже выполняется на %s"
+msgid ""
+"Automatic notes merge failed. Fix conflicts in %s and commit the result with"
+" 'git notes merge --commit', or abort the merge with 'git notes merge "
+"--abort'.\n"
+msgstr "Не удалось автоматически слить заметки. Исправьте конфликты в %s и закоммитьте результат с помощью «git notes merge --commit», или прервите процесс слияния с помощью «git notes merge --abort».\n"
 
-#: builtin/notes.c:884
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "У объекта %s нет заметки\n"
 
-#: builtin/notes.c:896
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "попытка удаления несуществующей заметки не является ошибкой"
 
-#: builtin/notes.c:899
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "прочитать имена объектов из стандартного ввода"
 
-#: builtin/notes.c:980
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "не удалять, только показать список"
+
+#: builtin/notes.c:941
+msgid "report pruned notes"
+msgstr "вывести список удаленных заметок"
+
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "ссылка-на-заметку"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "использовать заметку из <ссылка-на-заметку>"
 
-#: builtin/notes.c:1016 builtin/remote.c:1628
+#: builtin/notes.c:1019
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Ð\9dеизвестная подкоманда: %s"
+msgid "unknown subcommand: %s"
+msgstr "неизвестная подкоманда: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr "git pack-objects --stdout [<опции>…] [< <список-ссылок> | < <список-объектов>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr "git pack-objects [<опции>…] <имя-базы> [< <список-ссылок> | < <список-объектов>]"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/pack-objects.c:179 builtin/pack-objects.c:182
 #, c-format
 msgid "deflate error (%d)"
 msgstr "ошибка сжатия (%d)"
 
-#: builtin/pack-objects.c:763
+#: builtin/pack-objects.c:768
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr "отключение записи битовых карт, так как карты были разбиты на части из-за pack.packSizeLimit"
 
-#: builtin/pack-objects.c:776
+#: builtin/pack-objects.c:781
 msgid "Writing objects"
 msgstr "Запись объектов"
 
-#: builtin/pack-objects.c:1017
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "отключение записи битовых карт, так как некоторые объекты не были упакованы"
 
-#: builtin/pack-objects.c:2177
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "Сжатие объектов"
 
-#: builtin/pack-objects.c:2563
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "неподдерживаемая версия индекса %s"
 
-#: builtin/pack-objects.c:2567
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "плохая версия индекса «%s»"
 
-#: builtin/pack-objects.c:2597
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "не выводить прогресс выполнения"
 
-#: builtin/pack-objects.c:2599
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "показать прогресс выполнения"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr "показать прогресс выполнения во время записи объектов"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "похоже на --all-progress при включенном прогрессе выполнения"
 
-#: builtin/pack-objects.c:2605
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "версия[,смещение]"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2802
 msgid "write the pack index file in the specified idx format version"
 msgstr "записать файл индекса пакета в указанной версии формата"
 
-#: builtin/pack-objects.c:2609
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "максимальный размер каждого выходного файла пакета"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "игнорировать чужие объекты, взятые из альтернативного хранилища объектов"
 
-#: builtin/pack-objects.c:2613
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "игнорировать упакованные объекты"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "ограничить окно пакета по количеству объектов"
 
-#: builtin/pack-objects.c:2617
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr "дополнительно к количеству объектов ограничить окно пакета по памяти"
 
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2815
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "максимальная разрешенная длина цепочки дельт в результирующем пакете"
 
-#: builtin/pack-objects.c:2621
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "использовать повторно существующие дельты"
 
-#: builtin/pack-objects.c:2623
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "использовать повторно существующие объекты"
 
-#: builtin/pack-objects.c:2625
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "использовать объекты OFS_DELTA"
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "использовать многопоточность при поиске лучших совпадений дельт"
 
-#: builtin/pack-objects.c:2629
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "не создавать пустые выходные пакеты"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "прочитать аргументы редакций из стандартного ввода"
 
-#: builtin/pack-objects.c:2633
+#: builtin/pack-objects.c:2829
 msgid "limit the objects to those that are not yet packed"
 msgstr "ограничиться объектами, которые еще не упакованы"
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "включить объекты, которые достижимы по любой из ссылок"
 
-#: builtin/pack-objects.c:2639
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr "включить объекты, на которые ссылаются записи журнала ссылок"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "включить объекты, на которые ссылается индекс"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "вывести пакет на  стандартный вывод"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr "включить объекты меток, которые ссылаются на упаковываемые объекты"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "сохранять ссылки на недоступные объекты"
 
-#: builtin/pack-objects.c:2650 parse-options.h:142
-msgid "time"
-msgstr "вÑ\80емÑ\8f"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "паковаÑ\82Ñ\8c Ð½ÐµÐ´Ð¾Ñ\81Ñ\82ижимÑ\8bе Ð¾Ð±Ñ\8aекÑ\82Ñ\8b"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "распаковать недоступные объекты, которые новее, чем <время>"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "создавать тонкие пакеты"
 
-#: builtin/pack-objects.c:2656
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "создавать пакеты, подходящие для частичных извлечений"
 
-#: builtin/pack-objects.c:2658
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "игнорировать пакеты, рядом с которыми лежит .keep файл"
 
-#: builtin/pack-objects.c:2660
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "уровень сжатия пакета"
 
-#: builtin/pack-objects.c:2662
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "не скрывать коммиты сращениями"
 
-#: builtin/pack-objects.c:2664
+#: builtin/pack-objects.c:2862
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "по возможности использовать индекс в битовых картах, для ускорения подсчета объектов"
 
-#: builtin/pack-objects.c:2666
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "запись индекса в битовых картах вместе с индексом пакета"
 
-#: builtin/pack-objects.c:2757
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "Подсчет объектов"
 
@@ -8832,15 +9847,11 @@ msgstr "Удаление дублирующихся объектов"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <время>] [--] [<имя-ветки>…]"
 
-#: builtin/prune.c:105 builtin/worktree.c:125
-msgid "do not remove, show only"
-msgstr "не удалять, только показать список"
-
-#: builtin/prune.c:106 builtin/worktree.c:126
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "вывести список удаленных объектов"
 
-#: builtin/prune.c:109 builtin/worktree.c:128
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "удалить объекты старее чем <дата-окончания>"
 
@@ -8848,73 +9859,62 @@ msgstr "удалить объекты старее чем <дата-оконча
 msgid "cannot prune in a precious-objects repo"
 msgstr "нельзя почистить неиспользуемые объекты в precious-objects репозитории"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Неправильное значение %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<опции>] [<репозиторий> [<спецификация-ссылки>…]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Опции, связанные со слиянием"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "забрать изменения с помощью перебазирования, а не слияния"
 
-#: builtin/pull.c:147 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "разрешить перемотку вперед"
 
-#: builtin/pull.c:153
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "проверить, что указанный коммит имеет верную электронную подпись GPG"
-
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "автоматически выполнять stash/stash pop до и после перемещения"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Опции, связанные с извлечением изменений"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "количество подмодулей, которые будут получены парралельно"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Неправильное значение для pull.ff: %s"
 
-#: builtin/pull.c:379
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "Не удалось получить с перемещением: У вас есть непроиндексированные изменения."
-
-#: builtin/pull.c:385
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "К тому же, в вашем индексе есть незакоммиченные изменения."
-
-#: builtin/pull.c:387
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr "Не удалось получить с перемещением: В вашем индексе есть незакоммиченные изменения."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
 msgstr "Нет претендентов для перемещения среди ссылок, которые вы только что получили."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr "Нет претендентов для слияния среди ссылок, которые вы только что получили."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
 msgstr "Обычно это означает, что вы передали спецификацию ссылки с помощью шаблона и этот шаблон ни с чем не совпал на внешнем репозитории."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -8922,57 +9922,69 @@ msgid ""
 "for your current branch, you must specify a branch on the command line."
 msgstr "Вы попросили получить изменения со внешнего репозитория «%s», но не указали ветку. Так как это не репозиторий по умолчанию для  вашей текущей ветки, вы должны указать ветку в командной строке."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Вы сейчас ни на одной из веток."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Пожалуйста, укажите на какую ветку вы хотите переместить изменения."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Пожалуйста, укажите с какой веткой вы хотите слить изменения."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Для дополнительной информации, смотрите git-pull(1)."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<внешний-репозиторий>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<ветка>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "У текущей ветки нет информации об отслеживании."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr "Если вы хотите указать информацию о отслеживаемой ветке, выполните:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
 "from the remote, but no such ref was fetched."
 msgstr "Ваша конфигурация указывает, что нужно слить изменения со ссылкой\n«%s» из внешнего репозитория, но такая ссылка не была получена."
 
-#: builtin/pull.c:864
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "игнорирование --verify-signatures при перемещении"
+
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash можно использовать только вместе с --rebase."
 
-#: builtin/pull.c:872
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "Обновление еще не начавшейся ветки с изменениями, добавленными в индекс."
 
-#: builtin/pull.c:900
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "получение с перемещением"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "сделайте коммит или спрячьте их."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -8980,7 +9992,7 @@ msgid ""
 "commit %s."
 msgstr "извлечение обновило указатель на вашу текущую ветку.\nперемотка вашего рабочего каталога\nс коммита %s."
 
-#: builtin/pull.c:905
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -8991,11 +10003,11 @@ msgid ""
 "to recover."
 msgstr "Не удалось перемотать вперёд изменения в вашем рабочем каталоге.\nПосле того, как вы убедитесь, что вы сохранили всё необходимое из вывода\n$ git diff %s\n, запустите\n$ git reset --hard\nдля восстановления исходного состояния."
 
-#: builtin/pull.c:920
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Нельзя слить несколько веток в пустой указатель на ветку."
 
-#: builtin/pull.c:924
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Невозможно переместить над несколькими ветками."
 
@@ -9115,12 +10127,12 @@ msgstr "Отправка в %s\n"
 msgid "failed to push some refs to '%s'"
 msgstr "не удалось отправить некоторые ссылки в «%s»"
 
-#: builtin/push.c:365
+#: builtin/push.c:366
 #, c-format
 msgid "bad repository '%s'"
 msgstr "плохой репозитория «%s»"
 
-#: builtin/push.c:366
+#: builtin/push.c:367
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote repository using\n"
@@ -9132,103 +10144,115 @@ msgid ""
 "    git push <name>\n"
 msgstr "Не настроена точка назначения для отправки.\nЛибо укажите URL с помощью командной строки, либо настройте внешний репозиторий с помощью\n\n    git remote add <имя> <адрес>\n\nа затем отправьте изменения с помощью имени внешнего репозитория\n\n    git push <имя>\n"
 
-#: builtin/push.c:381
+#: builtin/push.c:385
 msgid "--all and --tags are incompatible"
 msgstr "--all и --tags нельзя использовать одновременно"
 
-#: builtin/push.c:382
+#: builtin/push.c:386
 msgid "--all can't be combined with refspecs"
 msgstr "--all нельзя использовать вместе со спецификациями ссылок"
 
-#: builtin/push.c:387
+#: builtin/push.c:391
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror и --tags нельзя использовать одновременно"
 
-#: builtin/push.c:388
+#: builtin/push.c:392
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror нельзя использовать вместе со спецификациями ссылок"
 
-#: builtin/push.c:393
+#: builtin/push.c:397
 msgid "--all and --mirror are incompatible"
 msgstr "--all и --mirror нельзя использовать одновременно"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "repository"
 msgstr "репозиторий"
 
-#: builtin/push.c:506 builtin/send-pack.c:161
+#: builtin/push.c:516 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "отправить все ссылки"
 
-#: builtin/push.c:507 builtin/send-pack.c:163
+#: builtin/push.c:517 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "сделать зеркало всех ссылок"
 
-#: builtin/push.c:509
+#: builtin/push.c:519
 msgid "delete refs"
 msgstr "удалить ссылки"
 
-#: builtin/push.c:510
+#: builtin/push.c:520
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "отправить метки (нельзя использовать вместе с --all или --mirror)"
 
-#: builtin/push.c:513 builtin/send-pack.c:164
+#: builtin/push.c:523 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "принудительное обновление"
 
-#: builtin/push.c:515 builtin/send-pack.c:175
+#: builtin/push.c:525 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "имя-ссылки>:<ожидается"
 
-#: builtin/push.c:516 builtin/send-pack.c:176
+#: builtin/push.c:526 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "требовать, чтобы старое значение ссылки было ожидаемым"
 
-#: builtin/push.c:519
+#: builtin/push.c:529
 msgid "control recursive pushing of submodules"
 msgstr "управление рекурсивной отправкой подмодулей"
 
-#: builtin/push.c:521 builtin/send-pack.c:169
+#: builtin/push.c:531 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "использовать тонкие пакеты"
 
-#: builtin/push.c:522 builtin/push.c:523 builtin/send-pack.c:158
+#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "путь к программе упаковки на сервере"
 
-#: builtin/push.c:524
+#: builtin/push.c:534
 msgid "set upstream for git pull/status"
 msgstr "установить вышестоящую ветку для git pull/status"
 
-#: builtin/push.c:527
+#: builtin/push.c:537
 msgid "prune locally removed refs"
 msgstr "почистить локально удаленные ссылки"
 
-#: builtin/push.c:529
+#: builtin/push.c:539
 msgid "bypass pre-push hook"
-msgstr "пропустить перехватчик перед-отправкой"
+msgstr "пропустить перехватчик pre-push"
 
-#: builtin/push.c:530
+#: builtin/push.c:540
 msgid "push missing but relevant tags"
 msgstr "отправить пропущенные, но нужные метки"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
+#: builtin/push.c:543 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "подписать отправку с помощью GPG"
 
-#: builtin/push.c:535 builtin/send-pack.c:170
+#: builtin/push.c:545 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "запросить выполнение атомарной транзакции на внешней стороне"
 
-#: builtin/push.c:549
+#: builtin/push.c:546
+msgid "server-specific"
+msgstr "зависит-от-сервера"
+
+#: builtin/push.c:546
+msgid "option to transmit"
+msgstr "передаваемые опции"
+
+#: builtin/push.c:560
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete несовместимо с  --all, --mirror и --tags"
 
-#: builtin/push.c:551
+#: builtin/push.c:562
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete не имеет смысла без указания ссылок"
 
+#: builtin/push.c:579
+msgid "push options must not have new line characters"
+msgstr "опции для отправки не должны содержать символы перевода строк"
+
 #: builtin/read-tree.c:37
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>)"
@@ -9300,15 +10324,44 @@ msgstr "пропустить применение фильтра частичн
 msgid "debug unpack-trees"
 msgstr "отладка unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/receive-pack.c:26
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <каталог-git>"
 
-#: builtin/receive-pack.c:1719
+#: builtin/receive-pack.c:793
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set 'receive.denyCurrentBranch' configuration variable to\n"
+"'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr "По умолчанию, обновлять текущую ветку в репозитории с рабочей\nкопией (не голом) запрещено, так как это сделает состояние индекса\nи рабочего каталога противоречивым, и вам прийдется выполнить\n«git reset --hard», чтобы состояние рабочего каталога снова\nсоответствовало HEAD.\n\nВы можете установить значение опции «receive.denyCurrentBranch»\nв «ignore» или «warn» во внешнем репозитории, чтобы разрешить\nотправку в его текущую ветку; но это не рекомендуется, если только\nвы не намерены обновить его рабочий каталог способом подобным\nвышеописанному.\n\nЧтобы пропустить это сообщение и все равно оставить поведение\nпо умолчанию, установите значение опции «receive.denyCurrentBranch»\nв «refuse»."
+
+#: builtin/receive-pack.c:813
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr "По умолчанию, удаление текущей ветки запрещено, так как последующий\n«git clone» не сможет получить никаких файлов, что приведет к путанице.\n\nВы можете установить значение опции «receive.denyDeleteCurrent»\nв «warn» или «ignore», во внешнем репозитории,  чтобы разрешить\nудаление текущей ветки с или без предупреждающего сообщения.\n\nЧтобы пропустить это сообщение, вы можете установить значение опции\nв «refuse»."
+
+#: builtin/receive-pack.c:1883
 msgid "quiet"
 msgstr "тихий режим"
 
-#: builtin/receive-pack.c:1733
+#: builtin/receive-pack.c:1897
 msgid "You must specify a directory."
 msgstr "Вы должны указать каталог."
 
@@ -9453,12 +10506,12 @@ msgstr "указание мастер ветки не имеет смысла с
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "указание отслеживаемых веток имеет смысл только при зеркальном извлечении"
 
-#: builtin/remote.c:190 builtin/remote.c:633
+#: builtin/remote.c:190 builtin/remote.c:629
 #, c-format
 msgid "remote %s already exists."
 msgstr "внешний репозиторий %s уже существует"
 
-#: builtin/remote.c:194 builtin/remote.c:637
+#: builtin/remote.c:194 builtin/remote.c:633
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "«%s» не является допустимым именем внешнего репозитория."
@@ -9481,17 +10534,17 @@ msgstr "(соответствующая)"
 msgid "(delete)"
 msgstr "(удаленная)"
 
-#: builtin/remote.c:626 builtin/remote.c:761 builtin/remote.c:858
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
 #, c-format
 msgid "No such remote: %s"
 msgstr "Нет такого внешнего репозитория: %s"
 
-#: builtin/remote.c:643
+#: builtin/remote.c:639
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Не удалось переименовать секцию конфигурации с «%s» на «%s»"
 
-#: builtin/remote.c:663
+#: builtin/remote.c:659
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9499,17 +10552,17 @@ msgid ""
 "\tPlease update the configuration manually if necessary."
 msgstr "Не обновляю нестандартную спецификацию ссылки для извлечения\n\t%s\n\tПожалуйста, если требуется, обновите конфигурацию вручную."
 
-#: builtin/remote.c:699
+#: builtin/remote.c:695
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "не удалось удалить «%s»"
 
-#: builtin/remote.c:733
+#: builtin/remote.c:729
 #, c-format
 msgid "creating '%s' failed"
 msgstr "не удалось создать «%s»"
 
-#: builtin/remote.c:796
+#: builtin/remote.c:792
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9521,145 +10574,155 @@ msgstr[1] "Примечание: Некоторые ветки вне иерар
 msgstr[2] "Примечание: Некоторые ветки вне иерархии refs/remotes/ не будут удалены;\nчтобы удалить их, используйте:"
 msgstr[3] "Примечание: Некоторые ветки вне иерархии refs/remotes/ не будут удалены;\nчтобы удалить их, используйте:"
 
-#: builtin/remote.c:810
+#: builtin/remote.c:806
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Не удалось удалить секцию файла конфигурации «%s»"
 
-#: builtin/remote.c:911
+#: builtin/remote.c:907
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " новая (следующее извлечение сохранит ее в remotes/%s)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:910
 msgid " tracked"
 msgstr " отслеживается"
 
-#: builtin/remote.c:916
+#: builtin/remote.c:912
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " недействительна (используйте «git remote prune», чтобы удалить)"
 
-#: builtin/remote.c:918
+#: builtin/remote.c:914
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:959
+#: builtin/remote.c:955
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "неправильный параметр конфигурации branch.%s.merge; невозможно переместить более чем над 1 веткой"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:963
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "перемещается интерактивно над внешней веткой %s"
 
-#: builtin/remote.c:971
+#: builtin/remote.c:964
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "перемещается над внешней веткой %s"
+
+#: builtin/remote.c:967
 #, c-format
 msgid " merges with remote %s"
 msgstr " будет слита с внешней веткой %s"
 
-#: builtin/remote.c:972
-msgid "    and with remote"
-msgstr "    и с внешней веткой"
-
-#: builtin/remote.c:974
+#: builtin/remote.c:970
 #, c-format
 msgid "merges with remote %s"
 msgstr "будет слита с внешней веткой %s"
 
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   и с внешней веткой"
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    и с внешней веткой %s\n"
 
-#: builtin/remote.c:1021
+#: builtin/remote.c:1016
 msgid "create"
 msgstr "создана"
 
-#: builtin/remote.c:1024
+#: builtin/remote.c:1019
 msgid "delete"
 msgstr "удалена"
 
-#: builtin/remote.c:1028
+#: builtin/remote.c:1023
 msgid "up to date"
 msgstr "уже актуальна"
 
-#: builtin/remote.c:1031
+#: builtin/remote.c:1026
 msgid "fast-forwardable"
 msgstr "возможна перемотка вперед"
 
-#: builtin/remote.c:1034
+#: builtin/remote.c:1029
 msgid "local out of date"
 msgstr "локальная ветка устарела"
 
-#: builtin/remote.c:1041
+#: builtin/remote.c:1036
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s будет принудительно отправлена в %-*s (%s)"
 
-#: builtin/remote.c:1044
+#: builtin/remote.c:1039
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s будет отправлена в %-*s (%s)"
 
-#: builtin/remote.c:1048
+#: builtin/remote.c:1043
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s будет принудительно отправлена в %s"
 
-#: builtin/remote.c:1051
+#: builtin/remote.c:1046
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s будет отправлена в %s"
 
-#: builtin/remote.c:1119
+#: builtin/remote.c:1114
 msgid "do not query remotes"
 msgstr "не опрашивать внешние репозитории"
 
-#: builtin/remote.c:1146
+#: builtin/remote.c:1141
 #, c-format
 msgid "* remote %s"
 msgstr "* внешний репозиторий %s"
 
-#: builtin/remote.c:1147
+#: builtin/remote.c:1142
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL для извлечения: %s"
 
-#: builtin/remote.c:1148 builtin/remote.c:1301
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(нет URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1159 builtin/remote.c:1161
+#: builtin/remote.c:1154 builtin/remote.c:1156
 #, c-format
 msgid "  Push  URL: %s"
-msgstr "  URL для отправки: %s"
+msgstr "    URL для отправки: %s"
 
-#: builtin/remote.c:1163 builtin/remote.c:1165 builtin/remote.c:1167
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD ветка: %s"
 
-#: builtin/remote.c:1169
+#: builtin/remote.c:1158
+msgid "(not queried)"
+msgstr "(не запрашивался)"
+
+#: builtin/remote.c:1160
+msgid "(unknown)"
+msgstr "(неизвестно)"
+
+#: builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  HEAD ветка (HEAD внешнего репозитория неоднозначный, может быть одним из):\n"
 
-#: builtin/remote.c:1181
+#: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
-msgstr[0] "    Внешняя ветка:%s"
-msgstr[1] "    Внешние ветки:%s"
-msgstr[2] "    Внешние ветки:%s"
-msgstr[3] "    Внешние ветки:%s"
+msgstr[0] "  Внешняя ветка:%s"
+msgstr[1] "  Внешние ветки:%s"
+msgstr[2] "  Внешние ветки:%s"
+msgstr[3] "  Внешние ветки:%s"
 
-#: builtin/remote.c:1184 builtin/remote.c:1211
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
-msgstr " (Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81 Ð½Ðµ Ð·Ð°Ð¿Ñ\80оÑ\88ен)"
+msgstr " (Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81 Ð½Ðµ Ð·Ð°Ð¿Ñ\80аÑ\88ивалÑ\81Ñ\8f)"
 
-#: builtin/remote.c:1193
+#: builtin/remote.c:1188
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Локальная ветка, настроенная для «git pull»:"
@@ -9667,11 +10730,11 @@ msgstr[1] "  Локальные ветки, настроенные для «git
 msgstr[2] "  Локальные ветки, настроенные для «git pull»:"
 msgstr[3] "  Локальные ветки, настроенные для «git pull»:"
 
-#: builtin/remote.c:1201
+#: builtin/remote.c:1196
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr " Локальные ссылки, зеркалируемые с помощью «git push»"
 
-#: builtin/remote.c:1208
+#: builtin/remote.c:1202
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
@@ -9680,207 +10743,220 @@ msgstr[1] "  Локальные ссылки, настроенные для «gi
 msgstr[2] "  Локальные ссылки, настроенные для «git push»%s:"
 msgstr[3] "  Локальные ссылки, настроенные для «git push»%s:"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "установить refs/remotes/<имя>/HEAD в зависимости от внешнего репозитория"
 
-#: builtin/remote.c:1231
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "удалить refs/remotes/<имя>/HEAD"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "Не удалось определить внешний HEAD"
 
-#: builtin/remote.c:1248
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Несколько внешних HEAD веток. Укажите явно одну из них:"
 
-#: builtin/remote.c:1258
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "Не удалось удалить %s"
 
-#: builtin/remote.c:1266
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
-msgstr "Ð\9dепÑ\80авилÑ\8cная ссылка: %s"
+msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имая ссылка: %s"
 
-#: builtin/remote.c:1268
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "Не удалось настроить %s"
 
-#: builtin/remote.c:1286
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s будет висящей веткой!"
 
-#: builtin/remote.c:1287
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s стала висящей веткой!"
 
-#: builtin/remote.c:1297
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
-msgstr "Удаление %s"
+msgstr "Ð\9eÑ\87иÑ\81Ñ\82ка %s"
 
-#: builtin/remote.c:1298
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [будет удалена] %s"
 
-#: builtin/remote.c:1317
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [удалена] %s"
 
-#: builtin/remote.c:1362
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "почистить внешние репозитории после извлечения"
 
-#: builtin/remote.c:1425 builtin/remote.c:1479 builtin/remote.c:1547
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Нет такого внешнего репозитория «%s»"
 
-#: builtin/remote.c:1441
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "добавить ветку"
 
-#: builtin/remote.c:1448
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "не указан внешний репозиторий"
 
-#: builtin/remote.c:1465
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "запросить URL отправки, вместо URL извлечения"
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "вернуть все URL"
 
-#: builtin/remote.c:1495
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "URL не настроены для внешнего репозитория «%s»"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "управление URL отправки"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "добавить URL"
 
-#: builtin/remote.c:1525
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "удалить URL"
 
-#: builtin/remote.c:1532
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add нельзя использовать одновременно с --delete"
 
-#: builtin/remote.c:1573
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Неправильный шаблон старого URL: %s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Не найдены совпадения URL: %s"
 
-#: builtin/remote.c:1583
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "Нельзя удалить все URL не-отправки"
 
-#: builtin/remote.c:1597
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "быть многословнее; должно стоять перед подкомандой"
 
+#: builtin/remote.c:1622
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Неизвестная подкоманда: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<опции>]"
 
-#: builtin/repack.c:159
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "упаковать всё в один пакет"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "тоже, что и -a, но дополнительно отбросить недостижимые объекты"
 
-#: builtin/repack.c:164
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "удалите лишние пакеты и запустите git-prune-packed"
 
-#: builtin/repack.c:166
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "передать опцию --no-reuse-delta в git-pack-objects"
 
-#: builtin/repack.c:168
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "передать опцию --no-reuse-object в git-pack-objects"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "не запускать git-update-server-info"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "передать опцию --local в git-pack-objects"
 
-#: builtin/repack.c:175
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "запись индекса в битовых картах"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "примерная-дата"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "с опцией -A, не отбрасывать объекты старее, чем указано"
 
-#: builtin/repack.c:179
+#: builtin/repack.c:180
+msgid "with -a, repack unreachable objects"
+msgstr "с параметром -a, перепаковать недоступные объекты"
+
+#: builtin/repack.c:182
 msgid "size of the window used for delta compression"
 msgstr "размер окна, используемый для компрессии дельт"
 
-#: builtin/repack.c:180 builtin/repack.c:184
+#: builtin/repack.c:183 builtin/repack.c:187
 msgid "bytes"
 msgstr "количество-байт"
 
-#: builtin/repack.c:181
+#: builtin/repack.c:184
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "тоже, что и выше, но ограничить размер памяти, а не количество записей"
 
-#: builtin/repack.c:183
+#: builtin/repack.c:186
 msgid "limits the maximum delta depth"
 msgstr "ограничение на максимальную глубину дельт"
 
-#: builtin/repack.c:185
+#: builtin/repack.c:188
 msgid "maximum size of each packfile"
 msgstr "максимальный размер каждого из файлов пакета"
 
-#: builtin/repack.c:187
+#: builtin/repack.c:190
 msgid "repack objects in packs marked with .keep"
 msgstr "переупаковать объекты в пакеты, помеченные файлом .keep"
 
-#: builtin/repack.c:197
+#: builtin/repack.c:200
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "нельзя удалять пакеты в precious-objects репозитории"
 
-#: builtin/repack.c:381
+#: builtin/repack.c:204
+msgid "--keep-unreachable and -A are incompatible"
+msgstr "--keep-unreachable и -A нельзя использовать одновременно"
+
+#: builtin/repack.c:391 builtin/worktree.c:115
 #, c-format
-msgid "removing '%s' failed"
-msgstr "не удалось удалить «%s»"
+msgid "failed to remove '%s'"
+msgstr "сбой удаления «%s»"
 
 #: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
@@ -9980,8 +11056,8 @@ msgid ""
 msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<коммит>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <указатель-дерева> [--] <пути>…"
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<указатель-дерева>] [--] <пути>…"
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -10099,27 +11175,27 @@ msgstr "Не удалось сбросить файл индекса на ред
 msgid "Could not write new index file."
 msgstr "Не удалось записать новый файл индекса."
 
-#: builtin/rev-list.c:350
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list не поддерживает отображение заметок"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<опции>] -- [<аргументы>…]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 msgid "keep the `--` passed as an arg"
 msgstr "передавать далее «--» как аргумент"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:393
 msgid "stop parsing after the first non-option argument"
 msgstr "остановить разбор после первого аргумента не являющегося опцией"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:396
 msgid "output in stuck long form"
 msgstr "выводить аргументы в длинном формате"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:527
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10185,31 +11261,27 @@ msgstr "опция"
 msgid "option for merge strategy"
 msgstr "опция для стратегии слияния"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:100
 msgid "append commit name"
 msgstr "добавить имя коммита"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:102
 msgid "preserve initially empty commits"
 msgstr "сохранить изначально пустые коммиты"
 
-#: builtin/revert.c:107
+#: builtin/revert.c:103
 msgid "allow commits with empty messages"
 msgstr "разрешить коммиты с пустыми сообщениями"
 
-#: builtin/revert.c:108
+#: builtin/revert.c:104
 msgid "keep redundant, empty commits"
 msgstr "оставить избыточные, пустые коммиты"
 
-#: builtin/revert.c:112
-msgid "program error"
-msgstr "ошибка в программе"
-
-#: builtin/revert.c:197
+#: builtin/revert.c:192
 msgid "revert failed"
 msgstr "сбой обращения изменений коммита"
 
-#: builtin/revert.c:212
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "сбой при копировании коммита"
 
@@ -10363,70 +11435,131 @@ msgstr "git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-ord
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<база>]] [--list] [<ссылка>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:375
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "игнорирование %s; невозможно обработать больше %d ссылки"
+msgstr[1] "игнорирование %s; невозможно обработать больше %d ссылок"
+msgstr[2] "игнорирование %s; невозможно обработать больше %d ссылок"
+msgstr[3] "игнорирование %s; невозможно обработать больше %d ссылки"
+
+#: builtin/show-branch.c:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "нет совпадающих записей с %s"
+
+#: builtin/show-branch.c:639
 msgid "show remote-tracking and local branches"
 msgstr "показать список и отслеживаемых внешних и локальных веток"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:641
 msgid "show remote-tracking branches"
 msgstr "показать список отслеживаемых внешних веток"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "окрашивать «*!+-» в соответствии с веткой"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 msgid "show <n> more commits after the common ancestor"
 msgstr "показать <n> коммитов после общего предка"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:647
 msgid "synonym to more=-1"
 msgstr "синоним для more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "не выводить именованные строки"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "включить в вывод текущую ветку"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 msgid "name commits with their object names"
 msgstr "именовать коммиты их именами объектов"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:654
 msgid "show possible merge bases"
 msgstr "вывести возможные базы слияния"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 msgid "show refs unreachable from any other ref"
 msgstr "вывести ссылки, недоступные из любых других ссылок"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:658
 msgid "show commits in topological order"
 msgstr "вывести коммиты в топологическом порядке"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 msgid "show only commits not on the first branch"
 msgstr "вывести только коммиты, отсутствующие в первой ветке"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:663
 msgid "show merges reachable from only one tip"
 msgstr "вывести слияния, достижимые только из одной из верхушек"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:665
 msgid "topologically sort, maintaining date order where possible"
 msgstr "топологическая сортировка, с сохранением порядка дат, если возможно"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<база>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "показать <n> последних записей в журнале ссылок, начиная с базы"
 
+#: builtin/show-branch.c:703
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-"
+"base"
+msgstr "--reflog несовместимо с --all, --remotes, --independent и --merge-base"
+
+#: builtin/show-branch.c:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "не указаны ветки и HEAD не действительный"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "параметр --reflog требует указания имени одной ветки"
+
+#: builtin/show-branch.c:733
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "только %d запись может быть показана одновременно."
+msgstr[1] "только %d записи могут быть показаны одновременно."
+msgstr[2] "только %d записей могут быть показаны одновременно."
+msgstr[3] "только %d записи могут быть показаны одновременно."
+
+#: builtin/show-branch.c:737
+#, c-format
+msgid "no such ref %s"
+msgstr "нет такой ссылки %s"
+
+#: builtin/show-branch.c:829
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "невозможно обработать больше %d редакции."
+msgstr[1] "невозможно обработать больше %d редакций."
+msgstr[2] "невозможно обработать больше %d редакций."
+msgstr[3] "невозможно обработать больше %d редакции."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "«%s» не является допустимой ссылкой на коммит."
+
+#: builtin/show-branch.c:836
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "не удалось найти коммит %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | "
@@ -10485,12 +11618,12 @@ msgstr "пропустить и удалить все строки, начина
 msgid "prepend comment character and space to each line"
 msgstr "добавить перед каждой строкой символ комметария и пробел"
 
-#: builtin/submodule--helper.c:24
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
 #, c-format
 msgid "No such ref: %s"
 msgstr "Нет такой ссылки: %s"
 
-#: builtin/submodule--helper.c:31
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Ожидалось полное имя ссылки, а получено %s"
@@ -10500,160 +11633,200 @@ msgstr "Ожидалось полное имя ссылки, а получено
 msgid "cannot strip one component off url '%s'"
 msgstr "не удалось обрезать один компонент url «%s»"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:405
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "альтернативный символ для относительных путей"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<путь>] [<путь>…]"
 
-#: builtin/submodule--helper.c:326 builtin/submodule--helper.c:340
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "URL для подмодуля по пути «%s» не найден в .gitmodules"
 
-#: builtin/submodule--helper.c:366
+#: builtin/submodule--helper.c:369
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "Сбой регистрации адреса для пути подмодуля «%s»"
 
-#: builtin/submodule--helper.c:370
+#: builtin/submodule--helper.c:373
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Подмодуль «%s» (%s) зарегистрирован по пути «%s»\n"
 
-#: builtin/submodule--helper.c:380
+#: builtin/submodule--helper.c:383
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "внимание: предполагаемый режим обновления для подмодуля «%s»\n"
 
-#: builtin/submodule--helper.c:387
+#: builtin/submodule--helper.c:390
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr "Сбой регистрации режима обновления для пути подмодуля «%s»"
 
-#: builtin/submodule--helper.c:406
+#: builtin/submodule--helper.c:409
 msgid "Suppress output for initializing a submodule"
 msgstr "Не выводить информацию о инициализации подмодуля"
 
-#: builtin/submodule--helper.c:411
+#: builtin/submodule--helper.c:414
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<путь>]"
 
-#: builtin/submodule--helper.c:432
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <путь>"
 
-#: builtin/submodule--helper.c:438
+#: builtin/submodule--helper.c:441
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "не найдено соответствие подмодулей в .gitmodules для пути «%s»"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "подмодулю «%s» не удалось добавить альтернативу: %s"
+
+#: builtin/submodule--helper.c:563
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "Значение «%s» для параметра submodule.alternateErrorStrategy не рапознано"
+
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Значение «%s» для параметра submodule.alternateLocation не рапознано"
+
+#: builtin/submodule--helper.c:593
 msgid "where the new submodule will be cloned to"
 msgstr "куда должен быть склонирован новый подмодуль"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "имя нового подмодуля"
 
-#: builtin/submodule--helper.c:495
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "url откуда должен был склонирован новый подмодуль"
 
-#: builtin/submodule--helper.c:501
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "глубина для частичного клона"
 
-#: builtin/submodule--helper.c:507
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "принудительно выводить прогресс клонирования"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr "git submodule--helper clone [--prefix=<путь>] [--quiet] [--reference <репозиторий>] [--name <имя>] [--depth <глубина>] --url <url> --path <путь>"
 
-#: builtin/submodule--helper.c:532 builtin/submodule--helper.c:538
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "не удалось создать каталог «%s»"
 
-#: builtin/submodule--helper.c:534
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "не удалось клонировать «%s» в подмодуль по пути «%s»"
 
-#: builtin/submodule--helper.c:550
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "не удалось открыть файл «%s»"
 
-#: builtin/submodule--helper.c:555
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "не удалось закрыть файл %s"
 
-#: builtin/submodule--helper.c:562
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "не удалось получить каталог для подмодуля «%s»"
 
-#: builtin/submodule--helper.c:609
+#: builtin/submodule--helper.c:726
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Подмодуль по пути «%s» не инициализирован"
 
-#: builtin/submodule--helper.c:613
+#: builtin/submodule--helper.c:730
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Возможно, вы хотели использовать «update --init»?"
 
-#: builtin/submodule--helper.c:639
+#: builtin/submodule--helper.c:756
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Пропуск не слитого подмодуля %s"
 
-#: builtin/submodule--helper.c:660
+#: builtin/submodule--helper.c:777
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Пропуск подмодуля «%s»"
 
-#: builtin/submodule--helper.c:768
+#: builtin/submodule--helper.c:913
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr "Не удалось клонировать «%s». Запланирована повторная попытка"
+
+#: builtin/submodule--helper.c:924
+#, c-format
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr "Не удалось клонировать «%s» со второй попытки, отмена"
+
+#: builtin/submodule--helper.c:945
 msgid "path into the working tree"
 msgstr "путь в рабочем каталоге"
 
-#: builtin/submodule--helper.c:771
+#: builtin/submodule--helper.c:948
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "путь в рабочем каталоге, в пределах границ подмодуля"
 
-#: builtin/submodule--helper.c:775
+#: builtin/submodule--helper.c:952
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout или none"
 
-#: builtin/submodule--helper.c:779
+#: builtin/submodule--helper.c:956
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "Создать частичный клон, ограниченный указанным количеством редакций"
 
-#: builtin/submodule--helper.c:782
+#: builtin/submodule--helper.c:959
 msgid "parallel jobs"
 msgstr "параллельные задачи"
 
-#: builtin/submodule--helper.c:783
+#: builtin/submodule--helper.c:961
+msgid "whether the initial clone should follow the shallow recommendation"
+msgstr "должен ли изначальный процесс клонирования следовать рекомендации о частичности"
+
+#: builtin/submodule--helper.c:962
 msgid "don't print cloning progress"
 msgstr "вы выводить прогресс клонирования"
 
-#: builtin/submodule--helper.c:788
+#: builtin/submodule--helper.c:969
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<путь>] [<путь>…]"
 
-#: builtin/submodule--helper.c:798
+#: builtin/submodule--helper.c:979
 msgid "bad value for update parameter"
 msgstr "плохое значение для параметра update"
 
-#: builtin/submodule--helper.c:855
+#: builtin/submodule--helper.c:1050
+#, c-format
+msgid ""
+"Submodule (%s) branch configured to inherit branch from superproject, but "
+"the superproject is not on any branch"
+msgstr "Ветка подмодуля (%s) настроена на наследование ветки из родительского проекта, но он не находится ни на одной ветке"
+
+#: builtin/submodule--helper.c:1100
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "подкоманда submodule--helper должна вызываться с указанием подкоманды"
 
-#: builtin/submodule--helper.c:862
+#: builtin/submodule--helper.c:1107
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "«%s» не является подкомандой submodule--helper"
@@ -10875,7 +12048,7 @@ msgstr "метка «%s» уже существует"
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Метка «%s» обновлена (была %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "Распаковка объектов"
 
@@ -10937,139 +12110,143 @@ msgstr "информация статистики каталога не изме
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:564
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<опции>] [--] [<файл>…]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 msgid "continue refresh even when index needs update"
 msgstr "продолжить обновление, даже если индекс требует обновления"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:922
 msgid "refresh: ignore submodules"
 msgstr "обновление: игнорировать подмодули"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "не игнорировать новые файлы"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 msgid "let files replace directories and vice-versa"
 msgstr "разрешить файлам заменять каталоги и наоборот"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:929
 msgid "notice files missing from worktree"
 msgstr "замечать файлы отсутствующие в рабочем каталоге"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:931
 msgid "refresh even if index contains unmerged entries"
 msgstr "обновить, даже если в индексе имеются не слитые записи"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:934
 msgid "refresh stat information"
 msgstr "обновить информацию о статусе файлов"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "как --refresh, но игнорировать настройку assume-unchanged"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:942
 msgid "<mode>,<object>,<path>"
 msgstr "<режим доступа>,<объект>,<путь>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "добавить указанную запись в индекс"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
-
-#: builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "переопределить бит выполнения на указанных файлах"
-
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "пометить файлы как «не измененные»"
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "убрать пометку assumed-unchanged"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "пометить файлы как «только в индексе»"
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "убрать пометку skip-worktree"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:964
 msgid "add to index only; do not add content to object database"
 msgstr "только добавить в индекс; не добавлять содержимое в базу данных объектов"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:966
 msgid "remove named paths even if present in worktree"
 msgstr "удалить указанные пути, даже если они существуют в рабочем каталоге"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:968
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "с опцией --stdin: строки на вводе отделяются НУЛЕВЫМ байтом"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:970
 msgid "read list of paths to be updated from standard input"
 msgstr "прочитать список обновляемых путей из стандартного ввода"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:974
 msgid "add entries from standard input to the index"
 msgstr "добавить записи из стандартного ввода в индекс"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:978
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "заново заполнить индекс #2 и #3 для указанных путей"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:982
 msgid "only update entries that differ from HEAD"
 msgstr "обновить только записи, которые отличаются от HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:986
 msgid "ignore files missing from worktree"
 msgstr "игнорировать файлы, отсутствующие в рабочем каталоге"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:989
 msgid "report actions to standard output"
 msgstr "вывести выполняемые действия на стандартный вывод"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(для машинной обработки) забыть сохраненные неразрешенные конфликты"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:995
 msgid "write index in this format"
 msgstr "записать индекс в указанном формате"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "разрешить или запретить раздельный индекс"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "включить/отключить кэш неотслеживаемых файлов"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 msgid "test if the filesystem supports untracked cache"
 msgstr "проверить, что файловая система поддерживает кэш неотслеживаемых файлов"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1003
 msgid "enable untracked cache without testing the filesystem"
 msgstr "включить кэш неотслеживаемых файлов без проверки файловой системы"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1119
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr "параметр core.untrackedCache установлен true; удалите или измените его, если вы действительно хотите удалить кэш неотслеживаемых файлов"
+
+#: builtin/update-index.c:1123
 msgid "Untracked cache disabled"
 msgstr "Кэш неотслеживаемых файлов отключен"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1131
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want"
+" to enable the untracked cache"
+msgstr "параметр core.untrackedCache установлен false; удалите или измените его, если вы действительно хотите включить кэш неотслеживаемых файлов"
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Кэш неотслеживаемых файлов включен для «%s»"
@@ -11147,82 +12324,109 @@ msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr "git worktree add [<опции>] <путь> [<ветка>]"
 
 #: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<опции>]"
+
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [<опции>] <путь>"
+
+#: builtin/worktree.c:18
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<опции>]"
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
-msgstr "git worktree list [<опции>]"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock <путь>"
 
-#: builtin/worktree.c:40
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Удаление рабочих каталогов/%s: не является каталогом"
 
-#: builtin/worktree.c:46
+#: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Удаление рабочих каталогов/%s: файл gitdir не существует"
 
-#: builtin/worktree.c:51
+#: builtin/worktree.c:53
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Удаление рабочих каталогов/%s: не удалось прочитать файл gitdir (%s)"
 
-#: builtin/worktree.c:62
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Удаление рабочих каталогов/%s: недействительный файл gitdir"
 
-#: builtin/worktree.c:78
+#: builtin/worktree.c:80
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Удаление рабочих каталогов/%s: gitdir указывает на несуществующее расположение"
 
-#: builtin/worktree.c:113
-#, c-format
-msgid "failed to remove '%s'"
-msgstr "сбой удаления «%s»"
-
-#: builtin/worktree.c:202
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "«%s» уже существует"
 
-#: builtin/worktree.c:234
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "не удалось создать каталог «%s»"
 
-#: builtin/worktree.c:270
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Подготовка %s (идентификатор %s)"
 
-#: builtin/worktree.c:322
+#: builtin/worktree.c:323
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "переключиться на <ветка> даже если она уже активна в другом рабочесм каталоге"
 
-#: builtin/worktree.c:324
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "создать новую ветку"
 
-#: builtin/worktree.c:326
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "создать или перейти на ветку"
 
-#: builtin/worktree.c:327
-msgid "detach HEAD at named commit"
-msgstr "отсоединить HEAD на указанном коммите"
-
-#: builtin/worktree.c:328
+#: builtin/worktree.c:329
 msgid "populate the new working tree"
 msgstr "наполнить новый рабочий каталог"
 
-#: builtin/worktree.c:336
+#: builtin/worktree.c:337
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B и --detach нельзя использовать одновременно"
 
+#: builtin/worktree.c:470
+msgid "reason for locking"
+msgstr "причина блокировки"
+
+#: builtin/worktree.c:482 builtin/worktree.c:515
+#, c-format
+msgid "'%s' is not a working tree"
+msgstr "«%s» не является рабочим каталогом"
+
+#: builtin/worktree.c:484 builtin/worktree.c:517
+msgid "The main working tree cannot be locked or unlocked"
+msgstr "Главный рабочий каталог не может быть заблокирован или разблокирован"
+
+#: builtin/worktree.c:489
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr "«%s» уже заблокирован, причина: %s"
+
+#: builtin/worktree.c:491
+#, c-format
+msgid "'%s' is already locked"
+msgstr "«%s» уже заблокирован"
+
+#: builtin/worktree.c:519
+#, c-format
+msgid "'%s' is not locked"
+msgstr "«%s» не заблокирован"
+
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
 msgstr "git write-tree [--missing-ok] [--prefix=<префикс>/]"
@@ -11239,6 +12443,35 @@ msgstr "вывести объект дерева для подкаталога 
 msgid "only useful for debugging"
 msgstr "используется только при отладке"
 
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-pack [<опции>] <каталог>"
+
+#: upload-pack.c:1028
+msgid "quit after a single request/response exchange"
+msgstr "выход после обмена одним запросом/ответом"
+
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
+msgstr "выходить сразу после начального объявления списка ссылок"
+
+#: upload-pack.c:1032
+msgid "do not try <directory>/.git/ if <directory> is no Git directory"
+msgstr "не проверять <каталог>/.git/ если <каталог> не является каталогом Git"
+
+#: upload-pack.c:1034
+msgid "interrupt transfer after <n> seconds of inactivity"
+msgstr "прервать передачу после <кол> секунд простоя"
+
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr "Права доступа к вашему каталогу сокетов слишком свободны; друге пользователи могуи читать ваши закэшированные пароли доступа. Обдумайте запуск команды:\n\n\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "вывод отладочных сообщений на stderr"
@@ -11250,7 +12483,11 @@ msgid ""
 "to read about a specific subcommand or concept."
 msgstr "«git help -а» и «git help -g» выводит список доступных подкоманд и\nнекоторые руководства по темам. Запустите «git help <команда>» или\n«git help <термин>», чтобы прочесть о конкретных подкоманде или теме."
 
-#: http.c:322
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Делегация проверки полномочий не поддерживается с cURL < 7.22.0"
+
+#: http.c:351
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "Public key pinning не поддерживается с cURL < 7.44.0"
 
@@ -11366,15 +12603,15 @@ msgstr "дата-окончания"
 msgid "no-op (backward compatibility)"
 msgstr "ничего не делает (оставлено для обратной совместимости)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "быть многословнее"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "тихий режим"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "использовать <n> цифр для вывода SHA-1"
 
@@ -11382,58 +12619,59 @@ msgstr "использовать <n> цифр для вывода SHA-1"
 msgid "update the index with reused conflict resolution if possible"
 msgstr "обновить индекс с помощью переиспользования разрешения конфликта, если возможно"
 
-#: git-bisect.sh:55
+#: git-bisect.sh:54
 msgid "You need to start by \"git bisect start\""
 msgstr "Вам нужно начать с помощью «git bisect start»"
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
-#: git-bisect.sh:61
+#: git-bisect.sh:60
 msgid "Do you want me to do it for you [Y/n]? "
 msgstr "Вы уверены, что хотите, чтобы я сделал это [Y - да/n - нет]? "
 
-#: git-bisect.sh:122
+#: git-bisect.sh:121
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "неопознанная опция: «$arg»"
 
-#: git-bisect.sh:126
+#: git-bisect.sh:125
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "«$arg» не похоже на действительную редакцию"
 
-#: git-bisect.sh:155
+#: git-bisect.sh:154
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Плохой указатель HEAD — Необходим указатель HEAD"
 
-#: git-bisect.sh:168
+#: git-bisect.sh:167
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr "Сбой перехода на «$start_head». Попробуйте выполнить «git bisect reset <существующая-ветка>»."
 
-#: git-bisect.sh:178
+#: git-bisect.sh:177
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "нельзя выполнить двоичный поиск на дереве после cg-seek"
 
-#: git-bisect.sh:182
+#: git-bisect.sh:181
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Плохой указатель HEAD — странная символьная ссылка"
 
-#: git-bisect.sh:234
+#: git-bisect.sh:233
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Плохой аргумент bisect_write: $state"
 
-#: git-bisect.sh:263
+#: git-bisect.sh:262
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Плохой ввод номера редакции: $arg"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Пожалуйста, вызывайте «bisect_state» как минимум с одним аргументом."
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Плохой ввод номера редакции: $bisected_head"
 
 #: git-bisect.sh:290
 #, sh-format
@@ -11563,61 +12801,99 @@ msgid ""
 "Supported options are: --term-good|--term-old and --term-bad|--term-new."
 msgstr "недопустимый аргумент $arg для «git bisect terms».\nПоддерживаемые параметры: --term-good|--term-old и --term-bad|--term-new."
 
-#: git-rebase.sh:57
+#: git-merge-octopus.sh:46
+msgid ""
+"Error: Your local changes to the following files would be overwritten by "
+"merge"
+msgstr "Ошибка: Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии"
+
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
+msgstr "Не удалось автоматически слить изменения."
+
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
+msgstr "Должно быть octopus не подходит."
+
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "Не удалось найти общий коммит с $pretty_name"
+
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Уже обновлено в соответствии с $pretty_name"
+
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "Перемотка вперед до: $pretty_name"
+
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr "Попытка простого слияния с $pretty_name"
+
+#: git-merge-octopus.sh:102
+msgid "Simple merge did not work, trying automatic merge."
+msgstr "Простое слияние не удалось, попытка автоматического слияния."
+
+#: git-rebase.sh:56
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
 "To check out the original branch and stop rebasing, run \"git rebase --abort\"."
 msgstr "Когда вы разрешите этот конфликт, запустите «git rebase --continue».\nЕсли вы хотите пропустить этот патч, то запустите «git rebase --skip».\nЧтобы перейти на оригинальную ветку и остановить перемещение, запустите «git rebase --abort»."
 
-#: git-rebase.sh:168
+#: git-rebase.sh:156 git-rebase.sh:395
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr "Не удалось перейти назад на $head_name"
+
+#: git-rebase.sh:167
 msgid "Applied autostash."
 msgstr "Применено автоматическое прятанье."
 
-#: git-rebase.sh:171
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Не удалось сохранить $stash_sha1"
 
-#: git-rebase.sh:172
+#: git-rebase.sh:171
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
 "You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
 msgstr "Применение автоматического прятанья вызвало конфликты.\nВаши изменения спрятаны и в безопасности.\nВы можете выполнить «git stash pop» или «git stash drop» в любой момент.\n"
 
-#: git-rebase.sh:211
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
-msgstr "Перехватчик пре-перемещения отказал в перемещении."
+msgstr "Перехватчик pre-rebase отказал в перемещении."
 
-#: git-rebase.sh:216
+#: git-rebase.sh:215
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Похоже, git-am выполняется. Перемещение невозможно."
 
-#: git-rebase.sh:357
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Нет перемещения в процессе?"
 
-#: git-rebase.sh:368
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "Действие --edit-todo может использоваться только при интерактивном перемещении."
 
-#: git-rebase.sh:375
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Не удалось прочитать HEAD"
 
-#: git-rebase.sh:378
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr "Вы должны отредактировать все\nконфликты слияния, а потом пометить\nих как разрешенные с помощью git add"
 
-#: git-rebase.sh:396
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Не удалось перейти назад на $head_name"
-
-#: git-rebase.sh:415
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11630,97 +12906,101 @@ msgid ""
 "valuable there."
 msgstr "Похоже, каталог $state_dir_base уже существует и я предполагаю, что вы в процессе другого перемещения.  Если это так, попробуйте\n\t$cmd_live_rebase\nЕсли нет\n\t$cmd_clear_stale_rebase\nи запустите меня снова.  Я останавливаюсь, чтобы вы не потеряли что-то важное."
 
-#: git-rebase.sh:466
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "недействительная вышестоящая ветка $upstream_name"
 
-#: git-rebase.sh:490
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: имеется больше одной базы слияния"
 
-#: git-rebase.sh:493 git-rebase.sh:497
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: нет базы слияния"
 
-#: git-rebase.sh:502
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Не указывает на действительный коммит: $onto_name"
 
-#: git-rebase.sh:525
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "критическая ошибка: нет такой ветки: $branch_name"
 
-#: git-rebase.sh:558
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Не удалось выполнить автоматическое прятанье"
 
-#: git-rebase.sh:563
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Изменения автоматически спрятаны: $stash_abbrev"
 
-#: git-rebase.sh:567
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Сделайте коммит или спрячьте их."
 
-#: git-rebase.sh:587
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Текущая ветка $branch_name уже свежая."
 
-#: git-rebase.sh:591
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Текущая ветка $branch_name уже свежая, принудительное перемещение."
 
-#: git-rebase.sh:602
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Изменения от $mb до $onto:"
 
-#: git-rebase.sh:611
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "Сначала перематываем указатель текущего коммита, чтобы применить ваши изменения поверх него…"
 
-#: git-rebase.sh:621
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Перемотана вперед $branch_name до $onto_name."
 
-#: git-stash.sh:51
+#: git-stash.sh:50
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash очистка с параметрами не реализована"
 
-#: git-stash.sh:74
+#: git-stash.sh:73
 msgid "You do not have the initial commit yet"
 msgstr "У вас еще нет начального коммита"
 
-#: git-stash.sh:89
+#: git-stash.sh:88
 msgid "Cannot save the current index state"
 msgstr "Не удалось сохранить текущее состояние индекса"
 
-#: git-stash.sh:124 git-stash.sh:137
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Невозможно сохранить неотслеживаемые файлы"
+
+#: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "Не удалось сохранить текущее состояние рабочего каталога"
 
-#: git-stash.sh:141
+#: git-stash.sh:140
 msgid "No changes selected"
 msgstr "Изменения не выбраны"
 
-#: git-stash.sh:144
+#: git-stash.sh:143
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Не удалось удалить временный индекс (не должно случаться)"
 
-#: git-stash.sh:157
+#: git-stash.sh:156
 msgid "Cannot record working tree state"
 msgstr "Не удалось записать состояние рабочего каталога"
 
-#: git-stash.sh:189
+#: git-stash.sh:188
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Не удалось обновить $ref_stash с помощью $w_commit"
@@ -11734,115 +13014,132 @@ msgstr "Не удалось обновить $ref_stash с помощью $w_com
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:239
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
 "       To provide a message, use git stash save -- '$option'"
 msgstr "ошибка: неизвестная опция для «stash save»: $option\n        Для предоставления сообщения, используйте git stash save -- «$option»"
 
-#: git-stash.sh:260
+#: git-stash.sh:251
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "Нельзя использовать --patch и --include-untracked или --all одновременно"
+
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Нет локальных изменений для сохранения"
 
-#: git-stash.sh:264
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Не удалось инициализировать спрятанные изменения"
 
-#: git-stash.sh:268
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Не удалось сохранить текущий статус"
 
-#: git-stash.sh:286
+#: git-stash.sh:268
+#, sh-format
+msgid "Saved working directory and index state $stash_msg"
+msgstr "Рабочий каталог и состояние индекса сохранены $stash_msg"
+
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Не удалось удалить изменения рабочего каталога"
 
-#: git-stash.sh:405
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "неизвестная опция: $opt"
 
-#: git-stash.sh:415
+#: git-stash.sh:416
 msgid "No stash found."
 msgstr "Не найдены спрятанные изменения."
 
-#: git-stash.sh:422
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Передано слишком много редакций: $REV"
 
-#: git-stash.sh:428
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference не является действительной ссылкой"
 
-#: git-stash.sh:456
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "«$args» не похоже на коммит со спрятанными изменениями"
 
-#: git-stash.sh:467
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "«$args» не является ссылкой на спрятанные изменения"
 
-#: git-stash.sh:475
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "не удалось обновить индекс"
 
-#: git-stash.sh:479
+#: git-stash.sh:489
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Нельзя применить спрятанные изменения во время выполнения слияния"
 
-#: git-stash.sh:487
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Конфликты в индексе. Попробуйте без --index."
 
-#: git-stash.sh:489
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "Не удалось сохранить дерево индекса"
 
-#: git-stash.sh:523
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "Невозможно восстановить неотслеживаемые файлы из спятанных файлов"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "Невозможно убрать из индекса измененные файлы"
 
-#: git-stash.sh:538
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "Индекс не был извлечён из спрятанных изменений."
 
-#: git-stash.sh:561
+#: git-stash.sh:562
+msgid "The stash is kept in case you need it again."
+msgstr "Спрятанные изменения сохранены, на случай если они снова вам понадобятся."
+
+#: git-stash.sh:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Отброшено ${REV} ($s)"
 
-#: git-stash.sh:562
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Не удалось отбросить запись из спрятанных изменений"
 
-#: git-stash.sh:570
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Не указано имя ветки"
 
-#: git-stash.sh:642
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Чтобы восстановить их, наберите «git stash apply»)"
 
-#: git-submodule.sh:219
+#: git-submodule.sh:184
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "Относительный путь можно использовать только находясь на вершине рабочего каталога"
 
-#: git-submodule.sh:229
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL репозитория: «$repo» должен быть абсолютным или начинаться с ./|../"
 
-#: git-submodule.sh:246
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "«$sm_path» уже содержится в индексе"
 
-#: git-submodule.sh:250
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11850,212 +13147,208 @@ msgid ""
 "Use -f if you really want to add it."
 msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n$sm_path\nИспользуйте опцию -f, если вы действительно хотите его добавить."
 
-#: git-submodule.sh:268
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Добавляю существующий репозиторий из «$sm_path» в индекс"
 
-#: git-submodule.sh:270
+#: git-submodule.sh:235
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "«$sm_path» уже существует и не является действительным репозиторием git"
 
-#: git-submodule.sh:278
+#: git-submodule.sh:243
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "Каталог git для «$sm_name» найден локально на внешних репозиториях:"
 
-#: git-submodule.sh:280
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr "Если вы хотите переиспользовать локальный каталог git вместо повторного клонирования из"
-
-#: git-submodule.sh:282
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ", то используйте опцию «--force». Если локальный каталог git не является действительным репозиторием"
-
-#: git-submodule.sh:283
+#: git-submodule.sh:245
 #, sh-format
 msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr "или если вы не поняли, что это значит, то просто используйте другое имя с помощью опции «--name»."
+"If you want to reuse this local git directory instead of cloning again from\n"
+"  $realrepo\n"
+"use the '--force' option. If the local git directory is not the correct repo\n"
+"or you are unsure what this means choose another name with the '--name' option."
+msgstr "Если вы хотите повторно использовать локальный каталог git вместо повторного клонирования из\n  $realrepo\nто используйте параметр «--force». Если же локальный каталог git не является нужным репозиторием или если вы не уверены, что это значит, то укажите другое имя для подмодуля с помощью параметра «--name»."
 
-#: git-submodule.sh:285
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Восстановление локального каталога git для подмодуля «$sm_name»."
 
-#: git-submodule.sh:297
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Не удалось переключиться на состояние у подмодуля «$sm_path»"
 
-#: git-submodule.sh:302
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Сбой добавления подмодуля «$sm_path»"
 
-#: git-submodule.sh:311
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Не удалось зарегистрировать подмодуль «$sm_path»"
 
-#: git-submodule.sh:355
+#: git-submodule.sh:324
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "Заходим в «$displaypath»"
 
-#: git-submodule.sh:375
+#: git-submodule.sh:344
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "Останавливаемся на «$displaypath»; сценарий вернул не нулевой код возврата."
 
-#: git-submodule.sh:448
+#: git-submodule.sh:415
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "спецификацию пути и --all нельзя использовать одновременно"
 
-#: git-submodule.sh:453
+#: git-submodule.sh:420
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "Используйте «--all», если вы действительно хотите деинициализировать все подмодули"
 
-#: git-submodule.sh:470
-#, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
-msgstr "Рабочий каталог подмодуля «$displaypath» содержит каталог .git"
-
-#: git-submodule.sh:471
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
+"Submodule work tree '$displaypath' contains a .git directory\n"
 "(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr "(используйте «rm -rf», если вы действительно хотите удалить его, включая всю его историю)"
+msgstr "Рабочий каталог подмодуля «$displaypath» уже содержит каталог .git\n(используйте «rm -rf», если вы действительно хотите удалить его со всей историей изменений)"
 
-#: git-submodule.sh:477
+#: git-submodule.sh:448
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to"
 " discard them"
 msgstr "Рабочий каталог подмодуля «$displaypath» содержит локальные изменения; используйте «-f», чтобы отменить их"
 
-#: git-submodule.sh:480
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Очищен каталог «$displaypath»"
 
-#: git-submodule.sh:481
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Не удалось удалить рабочий каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:484
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Не удалось создать пустой каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:493
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Подмодуль «$name» ($url) был снят с регистрации по пути «$displaypath»"
 
-#: git-submodule.sh:635
+#: git-submodule.sh:617
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Не удалось найти текущую редакцию для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:644
+#: git-submodule.sh:627
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Не удалось выполнить извлечение для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:667
+#: git-submodule.sh:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
+msgstr "Не удалось найти текущую редакцию ${remote_name}/${branch} для подмодуля по пути «$sm_path»"
+
+#: git-submodule.sh:650
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Не удалось выполнить извлечение для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:680
+#: git-submodule.sh:656
+#, sh-format
+msgid ""
+"Fetched in submodule path '$displaypath', but it did not contain $sha1. "
+"Direct fetching of that commit failed."
+msgstr "Получен по пути подмодуля «$displaypath», но не содержит $sha1. Сбой при прямом получении коммита."
+
+#: git-submodule.sh:663
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось переключиться на состояние «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:681
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: забрано состояние «$sha1»"
 
-#: git-submodule.sh:685
+#: git-submodule.sh:668
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось переместить «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:686
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: перемещен над «$sha1»"
 
-#: git-submodule.sh:691
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось выполнить слияние с «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:692
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: слито с «$sha1»"
 
-#: git-submodule.sh:697
+#: git-submodule.sh:680
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr "Сбой выполнения «$command $sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:681
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Подмодуль по пути «$displaypath»: «$command $sha1»"
 
-#: git-submodule.sh:729
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:837
+#: git-submodule.sh:820
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Опцию --cached нельзя использовать одновременно с опцией --files"
 
-#: git-submodule.sh:889
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "неизвестный режим $mod_dst"
 
-#: git-submodule.sh:909
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_src"
 
-#: git-submodule.sh:912
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_dst"
 
-#: git-submodule.sh:915
+#: git-submodule.sh:898
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Предупреждение: $display_name не содержит коммиты $sha1_src и $sha1_dst"
 
-#: git-submodule.sh:940
-msgid "blob"
-msgstr "двоичный объект"
-
-#: git-submodule.sh:1059
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:1123
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Синхронизация url для подмодуля «$displaypath»"
@@ -12064,3 +13357,395 @@ msgstr "Синхронизация url для подмодуля «$displaypath
 #, sh-format
 msgid "See git-${cmd}(1) for details."
 msgstr "Для дополнительной информации, смотрите git-${cmd}(1)."
+
+#: git-rebase--interactive.sh:140
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "Перемещение ($new_count/$total)"
+
+#: git-rebase--interactive.sh:156
+msgid ""
+"\n"
+"Commands:\n"
+" p, pick = use commit\n"
+" r, reword = use commit, but edit the commit message\n"
+" e, edit = use commit, but stop for amending\n"
+" s, squash = use commit, but meld into previous commit\n"
+" f, fixup = like \"squash\", but discard this commit's log message\n"
+" x, exec = run command (the rest of the line) using shell\n"
+" d, drop = remove commit\n"
+"\n"
+"These lines can be re-ordered; they are executed from top to bottom.\n"
+msgstr "\nКоманды:\n p, pick = использовать коммит\n r, reword = использовать коммит, но изменить сообщение коммита\n e, edit = использовать коммит, но остановиться для внесения правок\n s, squash = использовать коммит, но объединить его с предыдущим коммитом\n f, fixup = как «squash», но отбросить сообщение этого коммита\n x, exec = выполнить команду (остаток строки) с помощью командной оболочки\n d, drop = удалить коммит\n\nЭти строки могут быть перемещены; выполняются по очереди сверху вниз.\n"
+
+#: git-rebase--interactive.sh:171
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr "\nНе удаляйте строки. Используйте «drop», чтобы явно удалить коммит.\n"
+
+#: git-rebase--interactive.sh:175
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr "\nЕсли вы удалите строку здесь, то УКАЗАННЫЙ КОММИТ БУДЕТ УТЕРЯН.\n"
+
+#: git-rebase--interactive.sh:211
+#, sh-format
+msgid ""
+"You can amend the commit now, with\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Once you are satisfied with your changes, run\n"
+"\n"
+"\tgit rebase --continue"
+msgstr "Теперь вы можете исправить коммит с помощью\n\n\tgit commit --amend $gpg_sign_opt_quoted\n\nКак только вы будете довольны результатом, запустите\n\n\tgit rebase --continue"
+
+#: git-rebase--interactive.sh:236
+#, sh-format
+msgid "$sha1: not a commit that can be picked"
+msgstr "$sha1: не является коммитом, который можно взять"
+
+#: git-rebase--interactive.sh:275
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "Недопустимое имя коммита: $sha1"
+
+#: git-rebase--interactive.sh:317
+msgid "Cannot write current commit's replacement sha1"
+msgstr "Не удалось записать замену sha1 текущего коммита"
+
+#: git-rebase--interactive.sh:369
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "Перемотка вперед до $sha1"
+
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
+msgstr "Не удалось перемотать вперед до $sha1"
+
+#: git-rebase--interactive.sh:380
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
+msgstr "Не удалось переместить HEAD на $first_parent"
+
+#: git-rebase--interactive.sh:385
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "Нельзя уплотнить слияние: $sha1"
+
+#: git-rebase--interactive.sh:399
+#, sh-format
+msgid "Error redoing merge $sha1"
+msgstr "Ошибка при повторении слияния $sha1"
+
+#: git-rebase--interactive.sh:407
+#, sh-format
+msgid "Could not pick $sha1"
+msgstr "Не удалось взять $sha1"
+
+#: git-rebase--interactive.sh:416
+#, sh-format
+msgid "This is the commit message #${n}:"
+msgstr "Это сообщение коммита номер #${n}:"
+
+#: git-rebase--interactive.sh:421
+#, sh-format
+msgid "The commit message #${n} will be skipped:"
+msgstr "Сообщение коммита номер #${n} будет пропущено:"
+
+#: git-rebase--interactive.sh:432
+#, sh-format
+msgid "This is a combination of $count commit."
+msgid_plural "This is a combination of $count commits."
+msgstr[0] "Это объединение $count коммита"
+msgstr[1] "Это объединение $count коммитов"
+msgstr[2] "Это объединение $count коммитов"
+msgstr[3] "Это объединение $count коммитов"
+
+#: git-rebase--interactive.sh:440
+#, sh-format
+msgid "Cannot write $fixup_msg"
+msgstr "Не удалось записать $fixup_msg"
+
+#: git-rebase--interactive.sh:443
+msgid "This is a combination of 2 commits."
+msgstr "Это объединение 2 коммитов"
+
+#: git-rebase--interactive.sh:444
+msgid "This is the 1st commit message:"
+msgstr "Это 1-е сообщение коммита:"
+
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
+#, sh-format
+msgid "Could not apply $sha1... $rest"
+msgstr "Не удалось применить $sha1… $rest"
+
+#: git-rebase--interactive.sh:558
+#, sh-format
+msgid ""
+"Could not amend commit after successfully picking $sha1... $rest\n"
+"This is most likely due to an empty commit message, or the pre-commit hook\n"
+"failed. If the pre-commit hook failed, you may need to resolve the issue before\n"
+"you are able to reword the commit."
+msgstr "Не удолось исправить коммит после успешного перехода на $sha1… $rest\nЭто произошло, скорее всего, из-за пустого сообщения коммита или из-за перехватчика перед коммитом. Если же это произошло из-за перехватчика перед коммитом, то вам нужно решить с ним проблему и повторить попытку снова."
+
+#: git-rebase--interactive.sh:573
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "Остановлено на $sha1_abbrev… $rest"
+
+#: git-rebase--interactive.sh:588
+#, sh-format
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "Нельзя сделать «$squash_style» без указания предыдущего коммита"
+
+#: git-rebase--interactive.sh:630
+#, sh-format
+msgid "Executing: $rest"
+msgstr "Выполнение: $rest"
+
+#: git-rebase--interactive.sh:638
+#, sh-format
+msgid "Execution failed: $rest"
+msgstr "Не удалось выполнить: $rest"
+
+#: git-rebase--interactive.sh:640
+msgid "and made changes to the index and/or the working tree"
+msgstr "и были сделаны изменения в индексе и/или в рабочем каталоге"
+
+#: git-rebase--interactive.sh:642
+msgid ""
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
+msgstr "Вы можете исправить ошибку, а затем запустить\n\n\tgit rebase --continue"
+
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:655
+#, sh-format
+msgid ""
+"Execution succeeded: $rest\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"\tgit rebase --continue"
+msgstr "Успешное выполнение: $rest\nно остались изменения в индексе и/или в рабочем каталоге\nСделайте коммит или спрячьте ваши изменения, а затем выполните\n\n\tgit rebase --continue"
+
+#: git-rebase--interactive.sh:666
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Неопознанная команда: $command $sha1 $rest"
+
+#: git-rebase--interactive.sh:667
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "Пожалуйста исправьте это с помощью «git rebase --edit-todo»."
+
+#: git-rebase--interactive.sh:702
+#, sh-format
+msgid "Successfully rebased and updated $head_name."
+msgstr "Успешно перебазирован и обновлён $head_name."
+
+#: git-rebase--interactive.sh:749
+msgid "Could not skip unnecessary pick commands"
+msgstr "Не удалось пропустить ненужные команды отбора (pick)"
+
+#: git-rebase--interactive.sh:907
+#, sh-format
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
+msgstr "Внимание: не найден SHA-1 или он не указывает на коммит. На строке:\n - $line"
+
+#: git-rebase--interactive.sh:940
+#, sh-format
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
+msgstr "Внимание: команда не распознана на строке:\n - $line"
+
+#: git-rebase--interactive.sh:979
+msgid "could not detach HEAD"
+msgstr "не удалось отделить HEAD"
+
+#: git-rebase--interactive.sh:1017
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
+msgstr "Внимание: некоторые коммиты могли быть отброшены по ошибке.\nОтброшенные коммиты (от новых к старым):"
+
+#: git-rebase--interactive.sh:1025
+msgid ""
+"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
+"\n"
+"Use 'git config rebase.missingCommitsCheck' to change the level of warnings.\n"
+"The possible behaviours are: ignore, warn, error."
+msgstr "Для избежания этого сообщения, используйте «drop» чтобы явно удалить коммит.\n\nИспользуйте опцию «git config rebase.missingCommitsCheck» для изменения количества предупреждений.\nВозможные значения: ignore, warn, error."
+
+#: git-rebase--interactive.sh:1036
+#, sh-format
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
+msgstr "Нераспознанная настройка $check_level для опции rebase.missingCommitsCheck. Игнорирую."
+
+#: git-rebase--interactive.sh:1053
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase "
+"--continue'."
+msgstr "Вы можете исправить это с помощью «git rebase --edit-todo», а потом запустив «git rebase --continue»."
+
+#: git-rebase--interactive.sh:1054
+msgid "Or you can abort the rebase with 'git rebase --abort'."
+msgstr "Или вы можете отменить процесс перебазирования с помощью «git rebase --abort»."
+
+#: git-rebase--interactive.sh:1078
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "Не удалось удалить CHERRY_PICK_HEAD"
+
+#: git-rebase--interactive.sh:1083
+#, sh-format
+msgid ""
+"You have staged changes in your working tree.\n"
+"If these changes are meant to be\n"
+"squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
+msgstr "У вас имеются проиндексированные изменения в рабочем каталоге.\nЕсли эти изменения должны быть объеденены с предыдущим коммитом, то запустите:\n\n  git commit --amend $gpg_sign_opt_quoted\n\nЕсли же они должны быть помещены в новый коммит, то запустите:\n\n  git commit $gpg_sign_opt_quoted\n\nВ любом случае, после того как вы закончите, продолжить перемещение можно выполнив:\n\n  git rebase --continue\n"
+
+#: git-rebase--interactive.sh:1100
+msgid "Error trying to find the author identity to amend commit"
+msgstr "Произошла ошибка при поиске автора для исправления коммита"
+
+#: git-rebase--interactive.sh:1105
+msgid ""
+"You have uncommitted changes in your working tree. Please commit them\n"
+"first and then run 'git rebase --continue' again."
+msgstr "У вас имеются незакоммиченные изменения в рабочем каталоге. Сделайте коммит, а затем запустите «git rebase --continue» снова."
+
+#: git-rebase--interactive.sh:1110 git-rebase--interactive.sh:1114
+msgid "Could not commit staged changes."
+msgstr "Не удалось закоммитить проиндексированные изменения."
+
+#: git-rebase--interactive.sh:1138
+msgid ""
+"\n"
+"You are editing the todo file of an ongoing interactive rebase.\n"
+"To continue rebase after editing, run:\n"
+"    git rebase --continue\n"
+"\n"
+msgstr "\nВы сейчас редактируете файл со списком дел для интерактивного перемещения.\nДля продолжения перемещения, после редактирования файла запустите:\n    git rebase --continue\n\n"
+
+#: git-rebase--interactive.sh:1146 git-rebase--interactive.sh:1304
+msgid "Could not execute editor"
+msgstr "Не удалось запустить редактор"
+
+#: git-rebase--interactive.sh:1159
+#, sh-format
+msgid "Could not checkout $switch_to"
+msgstr "Не удалось перейти на версию $switch_to"
+
+#: git-rebase--interactive.sh:1164
+msgid "No HEAD?"
+msgstr "Нет указателя HEAD?"
+
+#: git-rebase--interactive.sh:1165
+#, sh-format
+msgid "Could not create temporary $state_dir"
+msgstr "Не удалось создать временный каталог $state_dir"
+
+#: git-rebase--interactive.sh:1167
+msgid "Could not mark as interactive"
+msgstr "Не удалось пометить как интерактивный"
+
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
+msgid "Could not init rewritten commits"
+msgstr "Не удалось инициализировать перезаписанные коммиты"
+
+#: git-rebase--interactive.sh:1282
+#, sh-format
+msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
+msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
+msgstr[0] "Перемещение $shortrevisions над $shortonto ($todocount команда)"
+msgstr[1] "Перемещение $shortrevisions над $shortonto ($todocount команды)"
+msgstr[2] "Перемещение $shortrevisions над $shortonto ($todocount команд)"
+msgstr[3] "Перемещение $shortrevisions над $shortonto ($todocount команд)"
+
+#: git-rebase--interactive.sh:1287
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
+msgstr "\nНо если вы удалите все, то процесс перемещения будет будет прерван.\n\n"
+
+#: git-rebase--interactive.sh:1294
+msgid "Note that empty commits are commented out"
+msgstr "Заметьте, что пустые коммиты закомментированны"
+
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
+#, sh-format
+msgid "usage: $dashless $USAGE"
+msgstr "использование: $dashless $USAGE"
+
+#: git-sh-setup.sh:190
+#, sh-format
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr "Не удалось выполнить chdir в $cdup, вершину рабочего каталога"
+
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
+#, sh-format
+msgid "fatal: $program_name cannot be used without a working tree."
+msgstr "критическая ошибка: $program_name нельзя использовать не имея рабочего каталога."
+
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
+msgstr "Не удалось выполнить перемещение коммитов: У вас есть непроиндексированные изменения."
+
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
+msgstr "Не удалось выполнить перезапись веток: У вас есть непроиндексированные изменения."
+
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "Не удалось получить с перемещением: У вас есть непроиндексированные изменения."
+
+#: git-sh-setup.sh:229
+#, sh-format
+msgid "Cannot $action: You have unstaged changes."
+msgstr "Не удалось выполнить $action: У вас есть непроиндексированные изменения."
+
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
+msgstr "Не удалось выполнить перемещение коммитов: В вашем индексе есть незакоммиченные изменения."
+
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr "Не удалось получить с перемещением: В вашем индексе есть незакоммиченные изменения."
+
+#: git-sh-setup.sh:248
+#, sh-format
+msgid "Cannot $action: Your index contains uncommitted changes."
+msgstr "Не удалось выполнить $action: В вашем индексе есть незакоммиченные изменения."
+
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "К тому же, в вашем индексе есть незакоммиченные изменения."
+
+#: git-sh-setup.sh:372
+msgid "You need to run this command from the toplevel of the working tree."
+msgstr "Вам нужно запускать эту команду находясь на вершине рабочего каталога."
+
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
+msgstr "Не удалось определить абсолютный путь к каталогу git"
index 9928603dd65f6338d5aadc65a80a938dcf1c6b91..0c0f9f9b58cbdd3671ca40f6dcabff5e5037cb80 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,16 +1,16 @@
 # Swedish translations for Git.
-# Copyright (C) 2010-2016 Peter krefting <peter@softwolves.pp.se>
+# Copyright (C) 2010-2017 Peter krefting <peter@softwolves.pp.se>
 # This file is distributed under the same license as the Git package.
-# Peter Krefting <peter@softwolves.pp.se>, 2010, 2011, 2012, 2013, 2014, 2015, 2016.
+# Peter Krefting <peter@softwolves.pp.se>, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git 2.10.0\n"
+"Project-Id-Version: git 2.13.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-08-27 20:41+0100\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
+"PO-Revision-Date: 2017-05-09 08:02+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
-"Language-Team: Svenska <tp-sv@listor.tp-sv.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -70,7 +70,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "Avslutar på grund av olöst konflikgt."
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)."
 
@@ -111,636 +111,1342 @@ msgstr ""
 "  git checkout -b <namn-på-ny-gren>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<flaggor>] <träd-igt> [<sökväg>...]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "okänt alternativ för whitespace: \"%s\""
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "okänt alternativ för ignore-whitespace: \"%s\""
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <arkiv> [--exec <kmd>] [<flaggor>] <träd-igt> "
-"[<sökväg>...]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject och --3way kan inte användas samtidigt"
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached och --3way kan inte användas samtidigt"
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "sökvägsangivelsen \"%s\" motsvarade inte några filer"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way utanför arkiv"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "fmt"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index utanför arkiv"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "arkivformat"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached utanför arkiv"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "prefix"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Kan inte förbereda reguljärt uttryck för tidsstämpeln %s"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "lägg till prefix till varje sökväg i arkivet"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec returnerade %d för indata: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553
-#: builtin/blame.c:2554 builtin/config.c:59 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:722 builtin/hash-object.c:100
-#: builtin/ls-files.c:460 builtin/ls-files.c:463 builtin/notes.c:399
-#: builtin/notes.c:562 builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "fil"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "kan inte hitta filnamn i patchen på rad %d"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "skriv arkivet till filen"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr "git apply: dålig git-diff - förväntade /dev/null, fick %s på rad %d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "läs .gitattributes i arbetskatalogen"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr "git apply: dålig git-diff - motsägande nytt filnamn på rad %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "rapportera arkiverade filer på standard fel"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr "git apply: dålig git-diff - motsägande gammalt filnamn på rad %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "endast spara"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: dålig git-diff - förväntade /dev/null på rad %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "komprimera snabbare"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: förväntade rad: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "komprimera bättre"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "patch-fragment utan huvud på rad %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "visa understödda arkivformat"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"git-diff-huvudet saknar filnamnsinformation när %d ledande sökvägskomponent\n"
+"tas bort (rad %d)"
+msgstr[1] ""
+"git-diff-huvudet saknar filnamnsinformation när %d ledande "
+"sökvägskomponenter\n"
+"tas bort (rad %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "arkiv"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr "git-diff-huvudet saknar filnamnsinformation (rad %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "hämta arkivet från fjärrarkivet <arkiv>"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "ny fil beror på gammalt innehåll"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "kommando"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "borttagen fil har fortfarande innehåll"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "sökväg till kommandot git-upload-archive på fjärren"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "trasig patch på rad %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Oväntad flagga --remote"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "nya filen %s beror på gammalt innehåll"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "Flaggan --exec kan endast användas tillsammans med --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "borttagna filen %s har fortfarande innehåll"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Oväntad flagga --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** varning: filen %s blir tom men har inte tagits bort"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Okänt arkivformat \"%s\""
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "trasig binärpatch på rad %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Argumentet stöd inte för formatet \"%s\": -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "binärpatchen på rad %d känns inte igen"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Negativa mönster ignoreras i git-attribut\n"
-"Använd '\\!' för att inleda med ett utropstecken."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "patch med bara skräp på rad %d"
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "Kunde inte öppna filen \"%s\""
+msgid "unable to read symlink %s"
+msgstr "kunde inte läsa symboliska länken %s"
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "Felaktigt citerat innehåll i filen \"%s\": %s"
+msgid "unable to open or read %s"
+msgstr "kunde inte öppna eller läsa %s"
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "Det finns inte mer att göra \"bisect\" på!\n"
+msgid "invalid start of line: '%c'"
+msgstr "felaktig inledning på rad: \"%c\""
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "Namnet på incheckningen är inte giltigt: %s"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "Stycke %d lyckades på %d (offset %d rad)."
+msgstr[1] "Stycke %d lyckades på %d (offset %d rader)."
 
-#: bisect.c:732
+#: apply.c:3053
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"Sammanslagningsbasen %s är trasig.\n"
-"Det betyder att felet har rättats mellan %s och [%s].\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Sammanhang reducerat till (%ld/%ld) för att tillämpa fragment vid %d"
 
-#: bisect.c:737
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"Sammanslagningsbasen %s är ny.\n"
-"Egenskapen har ändrats mellan %s och [%s].\n"
+"vid sökning efter:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "saknar binära patchdata för \"%s\""
+
+#: apply.c:3089
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"Sammanslagningsbasen %s är %s.\n"
-"Det betyder att den första \"%s\" incheckningen är mellan %s och [%s].\n"
+"kan inte applicera en binärpatch baklänges utan den omvända patchen för \"%s"
+"\""
 
-#: bisect.c:750
+#: apply.c:3135
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"Några %s-revisioner är inte föräldrar till %s-revisionen.\n"
-"git bisect kan inte arbeta korrekt i detta fall.\n"
-"Kanske du skrev fel %s- och %s-revisioner?\n"
+"kan inte applicera binärpatch på \"%s\" utan den fullständiga indexraden"
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"sammanslagningsbasen mellan %s och [%s] måste hoppas över.\n"
-"Vi kan inte vara säkra på att den första %s incheckningen är mellan %s och "
-"%s.\n"
-"Vi fortsätter ändå."
+"patchen appliceras på \"%s\" (%s), som inte motsvarar det nuvarande "
+"innehållet."
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "Bisect: en sammanslagningsbas måste testas\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "patchen appliceras på en tom \"%s\", men den är inte tom"
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
-msgstr "en %s-revision behövs"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "nödvändig efterbild %s för \"%s\" kan inte läsas"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
-msgstr "kunde inte skapa filen \"%s\""
+msgid "binary patch does not apply to '%s'"
+msgstr "binärpatchen kan inte tillämpas på \"%s\""
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
-msgstr "kunde inte läsa filen \"%s\""
-
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "misslyckades läsa bisect-referenser"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr "binärpatchen på \"%s\" ger felaktigt resultat (förväntade %s, fick %s)"
 
-#: bisect.c:967
+#: apply.c:3211
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s var både %s och %s\n"
+msgid "patch failed: %s:%ld"
+msgstr "patch misslyckades: %s:%ld"
 
-#: bisect.c:975
+#: apply.c:3333
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"Ingen testbar incheckning hittades.\n"
-"Kanske du startade med felaktiga sökvägsparametrar?\n"
+msgid "cannot checkout %s"
+msgstr "kan inte checka ut %s"
 
-#: bisect.c:994
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(ungefär %d steg)"
-msgstr[1] "(ungefär %d steg)"
+msgid "failed to read %s"
+msgstr "misslyckades läsa %s"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3389
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "Bisect: %d revision kvar att testa efter denna %s\n"
-msgstr[1] "Bisect: %d revisioner kvar att testa efter denna %s\n"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "läser från \"%s\" som är på andra sidan av en symbolisk länk"
 
-#: branch.c:53
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"När du har rättat felorsaken kan du försöka rätta\n"
-"fjärrspårningsinformationen genom att utföra\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
+msgid "path %s has been renamed/deleted"
+msgstr "sökvägen %s har ändrat namn/tagits bort"
 
-#: branch.c:67
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Ställer inte in grenen %s som sin egen uppströmsgren."
+msgid "%s: does not exist in index"
+msgstr "%s: finns inte i indexet"
 
-#: branch.c:93
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgid "%s: does not match index"
+msgstr "%s: motsvarar inte indexet"
+
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
-"Grenen %s ställdes in att spåra fjärrgrenen %s från %s genom ombasering."
+"arkivet saknar objekt som behövs för att falla tillbaka på 3-"
+"vägssammanslagning."
 
-#: branch.c:94
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Grenen %s ställdes in att spåra fjärrgrenen %s från %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "Faller tillbaka på trevägssammanslagning...\n"
 
-#: branch.c:98
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "Grenen %s ställdes in att spåra den lokala grenen %s genom ombasering."
+msgid "cannot read the current contents of '%s'"
+msgstr "kunde inte läsa aktuellt innehåll i \"%s\""
 
-#: branch.c:99
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Grenen %s ställdes in att spåra den lokala grenen %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Misslyckades falla tillbaka på trevägssammanslagning...\n"
 
-#: branch.c:104
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Grenen %s ställdes in att spåra fjärreferensen %s genom ombasering."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Applicerade patchen på \"%s\" med konflikter.\n"
 
-#: branch.c:105
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Grenen %s ställdes in att spåra fjärreferensen %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Tillämpade patchen på  \"%s\" rent.\n"
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"Grenen %s ställdes in att spåra den lokala referensen %s genom ombasering."
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "patch för borttagning lämnar kvar filinnehåll"
 
-#: branch.c:110
+#: apply.c:3697
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Grenen %s ställdes in att spåra den lokala referensen %s."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Kan inte skriva inställningar för uppströmsgren"
+msgid "%s: wrong type"
+msgstr "%s: fel typ"
 
-#: branch.c:156
+#: apply.c:3699
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Spårar inte: tvetydig information för referensen %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s har typen %o, förväntade %o"
 
-#: branch.c:185
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "\"%s\" är inte ett giltigt grennamn."
+msgid "invalid path '%s'"
+msgstr "ogiltig sökväg: %s"
 
-#: branch.c:190
+#: apply.c:3908
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Det finns redan en gren som heter \"%s\""
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Kan inte tvinga uppdatering av aktuell gren."
+msgid "%s: already exists in index"
+msgstr "%s: finns redan i indexet"
 
-#: branch.c:218
+#: apply.c:3911
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr "Kan inte ställa in spårning; startpunkten \"%s\" är inte en gren."
+msgid "%s: already exists in working directory"
+msgstr "%s: finns redan i arbetskatalogen"
 
-#: branch.c:220
+#: apply.c:3931
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Om du har tänkt basera ditt arbete på en uppströmsgren\n"
-"som redan finns på fjärren kan du behöva köra \"git fetch\"\n"
-"för att hämta den.\n"
-"\n"
-"Om du har tänkt sända in en ny lokal gren som skall\n"
-"spåra dess fjärrmotsvarighet kan du använda \"git push -u\"\n"
-"för att ställa in uppströmskonfigurationen när du sänder in."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o)"
 
-#: branch.c:266
+#: apply.c:3936
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Objektnamnet är inte giltigt: \"%s\"."
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o) för %s"
 
-#: branch.c:286
+#: apply.c:3956
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Objektnamnet är tvetydigt: \"%s\"."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "den berörda filen \"%s\" är på andra sidan av en symbolisk länk"
 
-#: branch.c:291
+#: apply.c:3960
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Avgreningspunkten är inte giltig: \"%s\""
+msgid "%s: patch does not apply"
+msgstr "%s: patchen kan inte tillämpas"
 
-#: branch.c:345
+#: apply.c:3975
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "\"%s\" är redan utcheckad på \"%s\""
+msgid "Checking patch %s..."
+msgstr "Kontrollerar patchen %s..."
 
-#: branch.c:364
+#: apply.c:4066
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "HEAD i arbetskatalogen %s har inte uppdaterats"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "sha1-informationen saknas eller är oanvändbar för undermodulen %s"
 
-#: bundle.c:34
+#: apply.c:4073
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' ser inte ut som en v2-bundle-fil"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "nytt läge för %s, som inte finns i nuvarande HEAD"
 
-#: bundle.c:61
+#: apply.c:4076
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "okänt huvud: %s%s (%d)"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "sha1-informationen saknas eller är oanvändbar (%s)."
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "could not open '%s'"
-msgstr "kunde inte öppna \"%s\""
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "misslyckades skapa revisionstraversering"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry misslyckades för sökvägen \"%s\""
 
-#: bundle.c:185
+#: apply.c:4085
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Paketet (bundlen) innehåller denna referens:"
-msgstr[1] "Paketet (bundlen) innehåller dessa %d referenser:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Paketet (bundlen) beskriver en komplett historik."
+msgid "could not add %s to temporary index"
+msgstr "kunde inte lägga till %s till temporärt index"
 
-#: bundle.c:194
+#: apply.c:4095
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Paketet (bundlen) kräver denna referens:"
-msgstr[1] "Paketet (bundlen) kräver dessa %d referenser:"
-
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Kunde inte starta pack-objects"
+msgid "could not write temporary index to %s"
+msgstr "kunde inte skriva temporärt index till %s"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "pack-objects misslyckades"
-
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list dog"
+#: apply.c:4233
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "kan inte ta bort %s från indexet"
 
-#: bundle.c:353
+#: apply.c:4268
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
+msgid "corrupt patch for submodule %s"
+msgstr "trasig patch för undermodulen %s"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4274
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "okänt argument: %s"
+msgid "unable to stat newly created file '%s'"
+msgstr "kan inte ta status på nyligen skapade filen \"%s\""
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Vägrar skapa ett tomt paket (bundle)."
+#: apply.c:4282
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr "kan inte skapa säkerhetsminne för nyligen skapade filen %s"
 
-#: bundle.c:463
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "cannot create '%s'"
-msgstr "kan inte skapa \"%s\""
+msgid "unable to add cache entry for %s"
+msgstr "kan inte lägga till cachepost för %s"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "index-pack dog"
+#: apply.c:4329
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "misslyckades skriva till \"%s\""
 
-#: color.c:290
+#: apply.c:4333
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "felaktigt färgvärde: %.*s"
+msgid "closing file '%s'"
+msgstr "stänger filen \"%s\""
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4403
 #, c-format
-msgid "could not parse %s"
-msgstr "kunde inte tolka %s"
+msgid "unable to write file '%s' mode %o"
+msgstr "kan inte skriva filen \"%s\" läge %o"
 
-#: commit.c:42
+#: apply.c:4501
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s är inte en incheckning!"
+msgid "Applied patch %s cleanly."
+msgstr "Tillämpade patchen %s rent."
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "minnet slut"
+#: apply.c:4509
+msgid "internal error"
+msgstr "internt fel"
 
-#: config.c:516
+#: apply.c:4512
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "felaktig konfigurationsfil rad %d i blob:en %s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Tillämpade patchen %%s med %d refuserad..."
+msgstr[1] "Tillämpade patchen %%s med %d refuserade..."
 
-#: config.c:520
+#: apply.c:4523
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "felaktig konfigurationsfil rad %d i filen %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "trunkerar .rej-filnamnet till %.*s.rej"
 
-#: config.c:524
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "felaktig konfigurationsfil rad %d i standard in"
+msgid "cannot open %s"
+msgstr "kan inte öppna %s"
 
-#: config.c:528
+#: apply.c:4545
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "felaktig konfigurationsfil rad %d i undermoduls-blob:en %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Stycke %d tillämpades rent."
 
-#: config.c:532
+#: apply.c:4549
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "felaktig konfigurationsfil rad %d i kommandoraden %s"
+msgid "Rejected hunk #%d."
+msgstr "Refuserar stycke %d."
 
-#: config.c:536
+#: apply.c:4659
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "felaktig konfigurationsfil rad %d i %s"
+msgid "Skipped patch '%s'."
+msgstr "Ignorerar patch \"%s\"."
 
-#: config.c:655
-msgid "out of range"
-msgstr "utanför intervallet"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "indata känns inte igen"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "ogiltig enhet"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "kan inte läsa indexfilen"
 
-#: config.c:661
+#: apply.c:4823
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\": %s"
+msgid "can't open patch '%s': %s"
+msgstr "kan inte öppna patchen \"%s\": %s"
 
-#: config.c:666
+#: apply.c:4850
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i blob:en %s: %s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "undertryckte %d fel i blanksteg"
+msgstr[1] "undertryckte %d fel i blanksteg"
 
-#: config.c:669
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i filen %s: %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d rad lägger till fel i blanksteg."
+msgstr[1] "%d rader lägger till fel i blanksteg."
 
-#: config.c:672
+#: apply.c:4864
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i standard in: %s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d rad applicerade efter att ha rättat fel i blanksteg."
+msgstr[1] "%d rader applicerade efter att ha rättat fel i blanksteg."
 
-#: config.c:675
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i undermodul-blob:"
-"en %s: %s"
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "Kunde inte skriva ny indexfil"
 
-#: config.c:678
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "sökväg"
+
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "tillämpa inte ändringar som motsvarar given sökväg"
+
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "tillämpa ändringar som motsvarar given sökväg"
+
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
+msgstr "antal"
+
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "ta bort <antal> inledande snedstreck från traditionella diff-sökvägar"
+
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "ignorera tillägg gjorda av patchen"
+
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "istället för att tillämpa patchen, skriv ut diffstat för indata"
+
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "visa antal tillagda och borttagna rader decimalt"
+
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "istället för att tillämpa patchen, skriv ut en summering av indata"
+
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "istället för att tillämpa patchen, se om patchen kan tillämpas"
+
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr "se till att patchen kan tillämpas på aktuellt index"
+
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "tillämpa en patch utan att röra arbetskatalogen"
+
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr "godta en patch som rör filer utanför arbetskatalogen"
+
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "tillämpa också patchen (använd med --stat/--summary/--check)"
+
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
+
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
+msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
+
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
+msgstr "sökvägar avdelas med NUL-tecken"
+
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr "se till att åtminstone <n> rader sammanhang är lika"
+
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
+msgstr "åtgärd"
+
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "detektera nya eller ändrade rader som har fel i blanktecken"
+
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignorera ändringar i blanktecken för sammanhang"
+
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "tillämpa patchen baklänges"
+
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "förvänta inte minst en rad sammanhang"
+
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "lämna refuserade stycken i motsvarande *.rej-filer"
+
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "tillåt överlappande stycken"
+
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "var pratsam"
+
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut"
+
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "lite inte på antalet linjer i styckehuvuden"
+
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr "rot"
+
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "lägg till <rot> i alla filnamn"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<flaggor>] <träd-igt> [<sökväg>...]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <arkiv> [--exec <kmd>] [<flaggor>] <träd-igt> "
+"[<sökväg>...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
+
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "sökvägsangivelsen \"%s\" motsvarade inte några filer"
+
+#: archive.c:417
+msgid "fmt"
+msgstr "fmt"
+
+#: archive.c:417
+msgid "archive format"
+msgstr "arkivformat"
+
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "prefix"
+
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "lägg till prefix till varje sökväg i arkivet"
+
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "fil"
+
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "skriv arkivet till filen"
+
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr "läs .gitattributes i arbetskatalogen"
+
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "rapportera arkiverade filer på standard fel"
+
+#: archive.c:425
+msgid "store only"
+msgstr "endast spara"
+
+#: archive.c:426
+msgid "compress faster"
+msgstr "komprimera snabbare"
+
+#: archive.c:434
+msgid "compress better"
+msgstr "komprimera bättre"
+
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "visa understödda arkivformat"
+
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "arkiv"
+
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "hämta arkivet från fjärrarkivet <arkiv>"
+
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "kommando"
+
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "sökväg till kommandot git-upload-archive på fjärren"
+
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "Oväntad flagga --remote"
+
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "Flaggan --exec kan endast användas tillsammans med --remote"
+
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "Oväntad flagga --output"
+
+#: archive.c:475
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Okänt arkivformat \"%s\""
+
+#: archive.c:482
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argumentet stöd inte för formatet \"%s\": -%d"
+
+#: attr.c:212
+#, c-format
+msgid "%.*s is not a valid attribute name"
+msgstr "%-*s är inte ett giltigt namn på attribut"
+
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Negativa mönster ignoreras i git-attribut\n"
+"Använd '\\!' för att inleda med ett utropstecken."
+
+#: bisect.c:444
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Kunde inte öppna filen \"%s\""
+
+#: bisect.c:449
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Felaktigt citerat innehåll i filen \"%s\": %s"
+
+#: bisect.c:657
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Det finns inte mer att göra \"bisect\" på!\n"
+
+#: bisect.c:710
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "Namnet på incheckningen är inte giltigt: %s"
+
+#: bisect.c:734
+#, c-format
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"Sammanslagningsbasen %s är trasig.\n"
+"Det betyder att felet har rättats mellan %s och [%s].\n"
+
+#: bisect.c:739
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"Sammanslagningsbasen %s är ny.\n"
+"Egenskapen har ändrats mellan %s och [%s].\n"
+
+#: bisect.c:744
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"Sammanslagningsbasen %s är %s.\n"
+"Det betyder att den första \"%s\" incheckningen är mellan %s och [%s].\n"
+
+#: bisect.c:752
+#, c-format
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Några %s-revisioner är inte föräldrar till %s-revisionen.\n"
+"git bisect kan inte fungera korrekt i detta fall.\n"
+"Kanske du skrev fel %s- och %s-revisioner?\n"
+
+#: bisect.c:765
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"sammanslagningsbasen mellan %s och [%s] måste hoppas över.\n"
+"Vi kan inte vara säkra på att den första %s incheckningen är mellan %s och "
+"%s.\n"
+"Vi fortsätter ändå."
+
+#: bisect.c:800
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bisect: en sammanslagningsbas måste testas\n"
+
+#: bisect.c:851
+#, c-format
+msgid "a %s revision is needed"
+msgstr "en %s-revision behövs"
+
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
+#, c-format
+msgid "could not create file '%s'"
+msgstr "kunde inte skapa filen \"%s\""
+
+#: bisect.c:919
+#, c-format
+msgid "could not read file '%s'"
+msgstr "kunde inte läsa filen \"%s\""
+
+#: bisect.c:949
+msgid "reading bisect refs failed"
+msgstr "misslyckades läsa bisect-referenser"
+
+#: bisect.c:969
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s var både %s och %s\n"
+
+#: bisect.c:977
+#, c-format
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"Ingen testbar incheckning hittades.\n"
+"Kanske du startade med felaktiga sökvägsparametrar?\n"
+
+#: bisect.c:996
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(ungefär %d steg)"
+msgstr[1] "(ungefär %d steg)"
+
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Bisect: %d revision kvar att testa efter denna %s\n"
+msgstr[1] "Bisect: %d revisioner kvar att testa efter denna %s\n"
+
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"När du har rättat felorsaken kan du försöka rätta\n"
+"fjärrspårningsinformationen genom att utföra\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "Ställer inte in grenen %s som sin egen uppströmsgren."
+
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"Grenen %s ställdes in att spåra fjärrgrenen %s från %s genom ombasering."
+
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Grenen %s ställdes in att spåra fjärrgrenen %s från %s."
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "Grenen %s ställdes in att spåra den lokala grenen %s genom ombasering."
+
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "Grenen %s ställdes in att spåra den lokala grenen %s."
+
+#: branch.c:104
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Grenen %s ställdes in att spåra fjärreferensen %s genom ombasering."
+
+#: branch.c:105
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Grenen %s ställdes in att spåra fjärreferensen %s."
+
+#: branch.c:109
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"Grenen %s ställdes in att spåra den lokala referensen %s genom ombasering."
+
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "Grenen %s ställdes in att spåra den lokala referensen %s."
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Kan inte skriva inställningar för uppströmsgren"
+
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Spårar inte: tvetydig information för referensen %s"
+
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "\"%s\" är inte ett giltigt grennamn."
+
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "Det finns redan en gren som heter \"%s\""
+
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Kan inte tvinga uppdatering av aktuell gren."
+
+#: branch.c:218
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr "Kan inte ställa in spårning; startpunkten \"%s\" är inte en gren."
+
+#: branch.c:220
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
+
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Om du har tänkt basera ditt arbete på en uppströmsgren\n"
+"som redan finns på fjärren kan du behöva köra \"git fetch\"\n"
+"för att hämta den.\n"
+"\n"
+"Om du har tänkt sända in en ny lokal gren som skall\n"
+"spåra dess fjärrmotsvarighet kan du använda \"git push -u\"\n"
+"för att ställa in uppströmskonfigurationen när du sänder in."
+
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "Objektnamnet är inte giltigt: \"%s\"."
+
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "Objektnamnet är tvetydigt: \"%s\"."
+
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "Avgreningspunkten är inte giltig: \"%s\""
+
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "\"%s\" är redan utcheckad på \"%s\""
+
+#: branch.c:364
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD i arbetskatalogen %s har inte uppdaterats"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' ser inte ut som en v2-bundle-fil"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "okänt huvud: %s%s (%d)"
+
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
+#, c-format
+msgid "could not open '%s'"
+msgstr "kunde inte öppna \"%s\""
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
+
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "misslyckades skapa revisionstraversering"
+
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "Paketet (bundlen) innehåller denna referens:"
+msgstr[1] "Paketet (bundlen) innehåller dessa %d referenser:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Paketet (bundlen) beskriver en komplett historik."
+
+#: bundle.c:194
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "Paketet (bundlen) kräver denna referens:"
+msgstr[1] "Paketet (bundlen) kräver dessa %d referenser:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Kunde inte starta pack-objects"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "pack-objects misslyckades"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list dog"
+
+#: bundle.c:353
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
+
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "okänt argument: %s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Vägrar skapa ett tomt paket (bundle)."
+
+#: bundle.c:463
+#, c-format
+msgid "cannot create '%s'"
+msgstr "kan inte skapa \"%s\""
+
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "index-pack dog"
+
+#: color.c:300
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "felaktigt färgvärde: %.*s"
+
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
+#, c-format
+msgid "could not parse %s"
+msgstr "kunde inte tolka %s"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s är inte en incheckning!"
+
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"Varning: incheckningsmeddelandet är inte korrekt UTF-8.\n"
+"Uppdatera det efter att ha rättat meddelandet, eller ändra variabeln\n"
+"i18n.commitencoding till den teckenkodning som används i ditt projekt.\n"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "minnet slut"
+
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr "relativa konfigureringsinkluderingsvillkor måste komma från filer"
+
+#: config.c:711
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "felaktig konfigurationsfil rad %d i blob:en %s"
+
+#: config.c:715
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "felaktig konfigurationsfil rad %d i filen %s"
+
+#: config.c:719
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "felaktig konfigurationsfil rad %d i standard in"
+
+#: config.c:723
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "felaktig konfigurationsfil rad %d i undermoduls-blob:en %s"
+
+#: config.c:727
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "felaktig konfigurationsfil rad %d i kommandoraden %s"
+
+#: config.c:731
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "felaktig konfigurationsfil rad %d i %s"
+
+#: config.c:859
+msgid "out of range"
+msgstr "utanför intervallet"
+
+#: config.c:859
+msgid "invalid unit"
+msgstr "ogiltig enhet"
+
+#: config.c:865
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\": %s"
+
+#: config.c:870
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr ""
+"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i blob:en %s: %s"
+
+#: config.c:873
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr ""
+"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i filen %s: %s"
+
+#: config.c:876
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr ""
+"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i standard in: %s"
+
+#: config.c:879
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr ""
+"felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i undermodul-blob:"
+"en %s: %s"
+
+#: config.c:882
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
 msgstr ""
 "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i kommandoraden "
 "%s: %s"
 
-#: config.c:681
+#: config.c:885
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i %s: %s"
 
-#: config.c:768
+#: config.c:980
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "misslyckades expandera användarkatalog i: \"%s\""
 
-#: config.c:849 config.c:860
+#: config.c:1075 config.c:1086
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "felaktigt zlib-komprimeringsgrad %d"
 
-#: config.c:978
+#: config.c:1203
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "felaktigt läge för skapande av objekt: %s"
 
-#: config.c:1312
+#: config.c:1359
+#, c-format
+msgid "bad pack compression level %d"
+msgstr "felaktig paketkomprimeringsgrad %d"
+
+#: config.c:1557
 msgid "unable to parse command-line config"
 msgstr "kan inte tolka kommandoradskonfiguration"
 
-#: config.c:1362
+#: config.c:1611
 msgid "unknown error occurred while reading the configuration files"
 msgstr "okänt fel uppstod vid läsning av konfigurationsfilerna"
 
-#: config.c:1716
+#: config.c:1970
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "Felaktigt %s: \"%s\""
+
+#: config.c:1991
+#, c-format
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr ""
+"okänt värde \"%s\" för core.untrackedCache; använder standardvärdet \"keep\""
+
+#: config.c:2017
+#, c-format
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
+msgstr "värdet \"%d\" för splitIndex.maxPercentage borde vara mellan 0 och 100"
+
+#: config.c:2028
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "kunde inte tolka värdet \"%s\" från kommandoradskonfiguration"
 
-#: config.c:1718
+#: config.c:2030
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "felaktig konfigurationsvariabel \"%s\" i filen \"%s\" på rad %d"
 
-#: config.c:1777
+#: config.c:2089
 #, c-format
 msgid "%s has multiple values"
 msgstr "%s har flera värden"
 
-#: config.c:2311
+#: config.c:2423 config.c:2648
+#, c-format
+msgid "fstat on %s failed"
+msgstr "fstat misslyckades på %s"
+
+#: config.c:2541
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "kunde inte ställa in \"%s\" till \"%s\""
 
-#: config.c:2313
+#: config.c:2543 builtin/remote.c:774
 #, c-format
 msgid "could not unset '%s'"
 msgstr "kunde inte ta bort inställning för \"%s\""
 
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Fjärren lade på vid inledande kontakt"
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"Kunde inte läsa från fjärrarkiv.\n"
+"\n"
+"Se till att du har korrekt åtkomstbehörighet\n"
+"och att arkivet existerar."
+
 # Vague original, not networking-related, but rather related to the actual
 # objects in the database.
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Kontrollerar konnektivitet"
 
-#: connected.c:74
+#: connected.c:75
 msgid "Could not run 'git rev-list'"
 msgstr "Kunde inte köra \"git rev-list\""
 
-#: connected.c:94
+#: connected.c:95
 msgid "failed write to rev-list"
 msgstr "kunde inte skriva till rev-list"
 
-#: connected.c:101
+#: connected.c:102
 msgid "failed to close rev-list's stdin"
 msgstr "kunde inte stänga rev-list:s standard in"
 
+#: convert.c:201
+#, c-format
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"CRLF kommer att ersättas av LF i %s.\n"
+"Filen kommer att ha sina ursprungliga radbrytningar i din arbetskatalog."
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF skulle ersättas av LF i %s."
+
+#: convert.c:211
+#, c-format
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"LF kommer att ersättas av CRLF i %s.\n"
+"Filen kommer att ha sina ursprungliga radbrytningar i din arbetskatalog."
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF skulle ersättas av CRLF i %s."
+
 #: date.c:97
 msgid "in the future"
 msgstr "i framtiden"
@@ -814,26 +1520,31 @@ msgstr[1] "%lu år sedan"
 msgid "failed to read orderfile '%s'"
 msgstr "kunde inte läsa orderfilen \"%s\""
 
-#: diffcore-rename.c:540
+#: diffcore-rename.c:536
 msgid "Performing inexact rename detection"
 msgstr "Utför onöjaktig namnbytesdetektering"
 
-#: diff.c:116
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "flaggan \"%s\" behöver ett värde"
+
+#: diff.c:124
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  Misslyckades tolka dirstat-avskärningsprocentandel \"%s\"\n"
 
-#: diff.c:121
+#: diff.c:129
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Okänd dirstat-parameter \"%s\"\n"
 
-#: diff.c:225
+#: diff.c:281
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Okänt värde för konfigurationsvariabeln \"diff.submodule\": \"%s\""
 
-#: diff.c:277
+#: diff.c:344
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -842,16 +1553,20 @@ msgstr ""
 "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
 "%s"
 
-#: diff.c:3017
+#: diff.c:3102
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "extern diff dog, stannar vid %s"
 
-#: diff.c:3415
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, -check och -s är ömsesidigt uteslutande"
+
+#: diff.c:3518
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow kräver exakt en sökvägsangivelse"
 
-#: diff.c:3578
+#: diff.c:3681
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -860,61 +1575,279 @@ msgstr ""
 "Misslyckades tolka argument till flaggan --dirstat/-X;\n"
 "%s"
 
-#: diff.c:3592
+#: diff.c:3695
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\""
 
-#: dir.c:1823
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
+msgstr ""
+"onöjaktig namnbytesdetektering utfördes inte på grund av för många filer"
+
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
+msgstr "hittade bara kopior från ändrade sökvägar på grund av för många filer."
+
+#: diff.c:4725
+#, c-format
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"du kan sätta variabeln %s till åtminstone %d och försöka kommandot på nytt."
+
+#: dir.c:1899
 msgid "failed to get kernel name and information"
 msgstr "misslyckades hämta kärnans namn och information"
 
-#: dir.c:1942
+#: dir.c:2018
 msgid "Untracked cache is disabled on this system or location."
 msgstr "Ospårad cache är inaktiverad på systemet eller platsen."
 
-#: gpg-interface.c:178
+#: dir.c:2776 dir.c:2781
+#, c-format
+msgid "could not create directories for %s"
+msgstr "kunde inte skapa kataloger för %s"
+
+#: dir.c:2806
+#, c-format
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "kunde inte migrera git-katalog från \"%s\" till \"%s\""
+
+#: entry.c:280
+#, c-format
+msgid "could not stat file '%s'"
+msgstr "kunde inte ta status på filen \"%s\""
+
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: förväntade grund lista"
+
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-patch: förväntade ACK/NAK, fick EOF"
+
+#: fetch-pack.c:280 builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "fjärrfel: %s"
+
+#: fetch-pack.c:281
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: förväntade ACK/NAK, fick \"%s\""
+
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc kräver \"multi ack detailed\""
+
+#: fetch-pack.c:419
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "ogiltig \"shallow\"-rad: %s"
+
+#: fetch-pack.c:425
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "ogiltig \"unshallow\"-rad: %s"
+
+#: fetch-pack.c:427
+#, c-format
+msgid "object not found: %s"
+msgstr "objektet hittades inte: %s"
+
+#: fetch-pack.c:430
+#, c-format
+msgid "error in object: %s"
+msgstr "fel i objekt: %s"
+
+#: fetch-pack.c:432
+#, c-format
+msgid "no shallow found: %s"
+msgstr "ingen \"shallow\" hittades: %s"
+
+#: fetch-pack.c:435
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "förväntade shallow/unshallow, fick %s"
+
+#: fetch-pack.c:474
+#, c-format
+msgid "got %s %d %s"
+msgstr "fick %s %d %s"
+
+#: fetch-pack.c:488
+#, c-format
+msgid "invalid commit %s"
+msgstr "ogiltig incheckning %s"
+
+#: fetch-pack.c:521
+msgid "giving up"
+msgstr "ger upp"
+
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
+msgstr "klart"
+
+#: fetch-pack.c:543
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "fick %s (%d) %s"
+
+#: fetch-pack.c:589
+#, c-format
+msgid "Marking %s as complete"
+msgstr "Markerar %s som komplett"
+
+#: fetch-pack.c:737
+#, c-format
+msgid "already have %s (%s)"
+msgstr "har redan %s (%s)"
+
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-patch: kunde inte grena av sidbandsmultiplexare"
+
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
+msgstr "protokollfel: felaktigt packhuvud"
+
+#: fetch-pack.c:839
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-patch: kunde inte grena av %s"
+
+#: fetch-pack.c:855
+#, c-format
+msgid "%s failed"
+msgstr "%s misslyckades"
+
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
+msgstr "fel i sidbands-avmultiplexare"
+
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
+msgstr "Servern stöder inte klienter med grunda arkiv"
+
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
+msgstr "Servern stöder \"multi_ack_detailed\""
+
+#: fetch-pack.c:891
+msgid "Server supports no-done"
+msgstr "Servern stöder \"no-done\""
+
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
+msgstr "Servern stöder \"multi_ack\""
+
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
+msgstr "Servern stöder \"side-band-64k\""
+
+#: fetch-pack.c:905
+msgid "Server supports side-band"
+msgstr "Servern stöder \"side-band\""
+
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Servern stöder \"allow-tip-sha1-in-want\""
+
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Servern stöder \"allow-reachable-sha1-in-want\""
+
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
+msgstr "Servern stöder \"ofs-delta\""
+
+#: fetch-pack.c:930
+#, c-format
+msgid "Server version is %.*s"
+msgstr "Serverversionen är %.*s"
+
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
+msgstr "Servern stöder inte --shallow-since"
+
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
+msgstr "Servern stöder inte --shallow-exclude"
+
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
+msgstr "Servern stöder inte --deepen"
+
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr "inga gemensamma incheckningar"
+
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-patch: hämtning misslyckades."
+
+#: fetch-pack.c:1127
+msgid "no matching remote head"
+msgstr "inget motsvarande fjärrhuvud"
+
+#: fetch-pack.c:1149
+#, c-format
+msgid "no such remote ref %s"
+msgstr "ingen sådan fjärreferens: %s"
+
+#: fetch-pack.c:1152
+#, c-format
+msgid "Server does not allow request for unadvertised object %s"
+msgstr "Servern tillåter inte förfrågan om ej tillkännagivet objekt %s"
+
+#: gpg-interface.c:185
 msgid "gpg failed to sign the data"
 msgstr "gpg misslyckades signera data"
 
-#: gpg-interface.c:208
+#: gpg-interface.c:215
 msgid "could not create temporary file"
 msgstr "kunde inte skapa temporära fil"
 
-#: gpg-interface.c:210
+#: gpg-interface.c:217
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "misslyckades skriva fristående signatur till \"%s\""
 
-#: grep.c:1792
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "ignorera felaktig färg \"%.*s\" i log.graphColors"
+
+#: grep.c:1796
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "\"%s\" kunde inte läsa %s"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "misslyckades ta status på \"%s\""
 
-#: grep.c:1820
+#: grep.c:1824
 #, c-format
 msgid "'%s': short read"
 msgstr "\"%s\": kort läsning"
 
-#: help.c:205
+#: help.c:218
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "git-kommandon tillgängliga i \"%s\""
 
-#: help.c:212
+#: help.c:225
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "git-kommandon från andra platser i din $PATH"
 
-#: help.c:244
+#: help.c:256
 msgid "These are common Git commands used in various situations:"
 msgstr "Dessa vanliga Git-kommandon används i olika situationer:"
 
-#: help.c:309
+#: help.c:321
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -923,11 +1856,11 @@ msgstr ""
 "\"%s\" verkar vara ett git-kommando, men vi kan inte\n"
 "köra det. Kanske git-%s är trasigt?"
 
-#: help.c:366
+#: help.c:376
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Oj då. Ditt system rapporterar inga Git-kommandon alls."
 
-#: help.c:388
+#: help.c:398
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -936,17 +1869,17 @@ msgstr ""
 "VARNING: Du anropade ett Git-kommando vid namn \"%s\", som inte finns.\n"
 "Fortsätter under förutsättningen att du menade \"%s\""
 
-#: help.c:393
+#: help.c:403
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "automatiskt om %0.1f sekunder..."
 
-#: help.c:400
+#: help.c:410
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: \"%s\" är inte ett git-kommando. Se \"git --help\"."
 
-#: help.c:404 help.c:470
+#: help.c:414 help.c:480
 msgid ""
 "\n"
 "Did you mean this?"
@@ -960,11 +1893,70 @@ msgstr[1] ""
 "\n"
 "Menade du ett av dessa?"
 
-#: help.c:466
+#: help.c:476
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
+#: ident.c:343
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"*** Vänligen berätta vem du är.\n"
+"\n"
+"Kör\n"
+"\n"
+"  git config --global user.email \"du@example.com\"\n"
+"  git config --global user.name \"Ditt Namn\"\n"
+"\n"
+"för att ställa in ditt kontos standardidentitet.\n"
+"Kör utan --global för att endast ändra i aktuellt arkiv.\n"
+"\n"
+
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "ingen e-post angavs och autodetektering är inaktiverad"
+
+#: ident.c:372
+#, c-format
+msgid "unable to auto-detect email address (got '%s')"
+msgstr "kunde inte autodetektera e-postadress (fick \"%s\")"
+
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "inget namn angavs och autodetektering är inaktiverad"
+
+#: ident.c:388
+#, c-format
+msgid "unable to auto-detect name (got '%s')"
+msgstr "kunde inte autodetektera namn (fick \"%s\")"
+
+#: ident.c:396
+#, c-format
+msgid "empty ident name (for <%s>) not allowed"
+msgstr "tomt ident-namn (för <%s>) ej tillåtet"
+
+#: ident.c:402
+#, c-format
+msgid "name consists only of disallowed characters: %s"
+msgstr "namnet består enbart av ej tillåtna tecken: %s"
+
+#: ident.c:417 builtin/commit.c:611
+#, c-format
+msgid "invalid date format: %s"
+msgstr "felaktigt datumformat: %s"
+
 #: lockfile.c:152
 #, c-format
 msgid ""
@@ -994,8 +1986,8 @@ msgstr "kunde inte skapa \"%s.lock\": %s"
 msgid "failed to read the cache"
 msgstr "misslyckades läsa cachen"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
 msgid "unable to write new index file"
 msgstr "kunde inte skriva ny indexfil"
 
@@ -1003,69 +1995,69 @@ msgstr "kunde inte skriva ny indexfil"
 msgid "(bad commit)\n"
 msgstr "(felaktig incheckning)\n"
 
-#: merge-recursive.c:231
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache misslyckades för sökvägen \"%s\""
 
-#: merge-recursive.c:301
+#: merge-recursive.c:303
 msgid "error building trees"
 msgstr "fel vid byggande av träd"
 
-#: merge-recursive.c:720
+#: merge-recursive.c:727
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "misslyckades skapa sökvägen \"%s\"%s"
 
-#: merge-recursive.c:731
+#: merge-recursive.c:738
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Tar bort %s för att göra plats för underkatalog\n"
 
-#: merge-recursive.c:745 merge-recursive.c:764
+#: merge-recursive.c:752 merge-recursive.c:771
 msgid ": perhaps a D/F conflict?"
 msgstr ": kanske en K/F-konflikt?"
 
-#: merge-recursive.c:754
+#: merge-recursive.c:761
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "vägrar förlora ospårad fil vid \"%s\""
 
-#: merge-recursive.c:796
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kan inte läsa objektet %s: \"%s\""
 
-#: merge-recursive.c:798
+#: merge-recursive.c:805
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob förväntades för %s \"%s\""
 
-#: merge-recursive.c:822
+#: merge-recursive.c:829
 #, c-format
 msgid "failed to open '%s': %s"
 msgstr "misslyckades öppna \"%s\": %s"
 
-#: merge-recursive.c:833
+#: merge-recursive.c:840
 #, c-format
 msgid "failed to symlink '%s': %s"
 msgstr "misslyckades skapa symboliska länken \"%s\": %s"
 
-#: merge-recursive.c:838
+#: merge-recursive.c:845
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "vet inte hur %06o %s \"%s\" skall hanteras"
 
-#: merge-recursive.c:978
+#: merge-recursive.c:985
 msgid "Failed to execute internal merge"
 msgstr "Misslyckades exekvera intern sammanslagning"
 
-#: merge-recursive.c:982
+#: merge-recursive.c:989
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Kunde inte lägga till %s till databasen"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1074,7 +2066,16 @@ msgstr ""
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet."
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: merge-recursive.c:1097
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
+msgstr ""
+"KONFLIKT (%s/radera): %s raderad i %s och %s till %s i %s. Versionen %s av "
+"%s lämnad i trädet."
+
+#: merge-recursive.c:1104
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1083,6 +2084,15 @@ msgstr ""
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet vid %s."
 
+#: merge-recursive.c:1109
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
+msgstr ""
+"KONFLIKT (%s/radera): %s raderad i %s och %s till %s i %s. Versionen %s av "
+"%s lämnad i trädet vid %s."
+
 #: merge-recursive.c:1143
 msgid "rename"
 msgstr "namnbyte"
@@ -1120,123 +2130,140 @@ msgstr ""
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Byter namn på %s till %s och %s till %s istället"
 
-#: merge-recursive.c:1531
+#: merge-recursive.c:1528
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "KONFLIKT (namnbyte/tillägg): Namnbyte %s->%s i %s. %s tillagd i %s"
 
-#: merge-recursive.c:1546
+#: merge-recursive.c:1543
 #, c-format
 msgid "Adding merged %s"
 msgstr "Lägger till sammanslagen %s"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Lägger till som %s istället"
 
-#: merge-recursive.c:1610
+#: merge-recursive.c:1607
 #, c-format
 msgid "cannot read object %s"
 msgstr "kan inte läsa objektet %s"
 
-#: merge-recursive.c:1613
+#: merge-recursive.c:1610
 #, c-format
 msgid "object %s is not a blob"
 msgstr "objektet %s är inte en blob"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modify"
 msgstr "ändra"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modified"
 msgstr "ändrad"
 
-#: merge-recursive.c:1676
+#: merge-recursive.c:1689
 msgid "content"
 msgstr "innehåll"
 
-#: merge-recursive.c:1683
+#: merge-recursive.c:1696
 msgid "add/add"
 msgstr "tillägg/tillägg"
 
-#: merge-recursive.c:1718
+#: merge-recursive.c:1732
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
 
-#: merge-recursive.c:1732
+#: merge-recursive.c:1746
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Slår ihop %s automatiskt"
 
-#: merge-recursive.c:1736 git-submodule.sh:919
+#: merge-recursive.c:1750 git-submodule.sh:944
 msgid "submodule"
 msgstr "undermodul"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1751
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
 
-#: merge-recursive.c:1831
+#: merge-recursive.c:1845
 #, c-format
 msgid "Removing %s"
 msgstr "Tar bort %s"
 
-#: merge-recursive.c:1857
+#: merge-recursive.c:1871
 msgid "file/directory"
 msgstr "fil/katalog"
 
-#: merge-recursive.c:1863
+#: merge-recursive.c:1877
 msgid "directory/file"
 msgstr "katalog/fil"
 
-#: merge-recursive.c:1868
+#: merge-recursive.c:1883
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "KONFLIKT (%s): Det finns en katalog med namnet %s i %s. Lägger till %s som %s"
 
-#: merge-recursive.c:1877
+#: merge-recursive.c:1892
 #, c-format
 msgid "Adding %s"
 msgstr "Lägger till %s"
 
-#: merge-recursive.c:1914
+#: merge-recursive.c:1929
 msgid "Already up-to-date!"
 msgstr "Redan à jour!"
 
-#: merge-recursive.c:1923
+#: merge-recursive.c:1938
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "sammanslagning av träden %s och %s misslyckades"
 
-#: merge-recursive.c:2006
+#: merge-recursive.c:2021
 msgid "Merging:"
 msgstr "Slår ihop:"
 
-#: merge-recursive.c:2019
+#: merge-recursive.c:2034
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "hittade %u gemensam förfader:"
 msgstr[1] "hittade %u gemensamma förfäder:"
 
-#: merge-recursive.c:2058
+#: merge-recursive.c:2073
 msgid "merge returned no commit"
 msgstr "sammanslagningen returnerade ingen incheckning"
 
-#: merge-recursive.c:2121
+#: merge-recursive.c:2136
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Kunde inte tolka objektet \"%s\""
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
 msgid "Unable to write index."
 msgstr "Kunde inte skriva indexet."
 
+#: notes-merge.c:273
+#, c-format
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
+msgstr ""
+"Du har inte avslutat föregående antecknings-sammanslagning (%s finns).\n"
+"Använd \"git notes merge --commit\" eller \"git notes merge --abort\" för "
+"att checka in eller avbryta föregående sammanslagning innan du påbörjar en "
+"ny antecknings-sammanslagning."
+
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Du har inte avslutat antecknings-sammanslagningen (%s finns)."
+
 #: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr "Kan inte checka in oinitierat/orefererat anteckningsträd"
@@ -1258,7 +2285,7 @@ msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)"
 msgid "Bad %s value: '%s'"
 msgstr "Felaktigt värde på %s: \"%s\""
 
-#: object.c:242
+#: object.c:240
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "kunde inte tolka objektet: %s"
@@ -1293,17 +2320,34 @@ msgstr "-TAL"
 msgid "malformed object name '%s'"
 msgstr "felformat objektnamn \"%s\""
 
-#: path.c:798
+#: path.c:810
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Kunde inte göra %s skrivbar för gruppen"
 
-#: pathspec.c:133
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
+msgstr "Specialtecknet \"\\\" tillåts inte som sista tecken i attributvärde"
+
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
+msgstr "Endast en \"attr:\"-angivelse tillåten."
+
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "attr-angivelse kan inte vara tom"
+
+#: pathspec.c:189
+#, c-format
+msgid "invalid attribute name %s"
+msgstr "ogiltigt attributnamn %s"
+
+#: pathspec.c:254
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
 "de globala sökvägsinställningarna \"glob\" och \"noglob\" är inkompatibla"
 
-#: pathspec.c:143
+#: pathspec.c:261
 msgid ""
 "global 'literal' pathspec setting is incompatible with all other global "
 "pathspec settings"
@@ -1311,67 +2355,68 @@ msgstr ""
 "den globala sökvägsinställningen \"literal\" är inkompatibel med alla andra "
 "globala sökvägsinställningar"
 
-#: pathspec.c:177
+#: pathspec.c:301
 msgid "invalid parameter for pathspec magic 'prefix'"
 msgstr "ogiltig parameter för sökvägsuttrycket för \"prefix\""
 
-#: pathspec.c:183
+#: pathspec.c:322
 #, c-format
 msgid "Invalid pathspec magic '%.*s' in '%s'"
 msgstr "felaktigt sökvägsuttryck \"%.*s\" i \"%s\""
 
-#: pathspec.c:187
+#: pathspec.c:327
 #, c-format
 msgid "Missing ')' at the end of pathspec magic in '%s'"
 msgstr "\")\" saknas i slutet av sökvägsuttrycket för \"%s\""
 
-#: pathspec.c:205
+#: pathspec.c:365
 #, c-format
 msgid "Unimplemented pathspec magic '%c' in '%s'"
 msgstr "Tecknet \"%c\" i sökvägsuttrycket i \"%s\" har inte implementerats"
 
-#: pathspec.c:230
+#: pathspec.c:421 pathspec.c:443
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Sökvägsangivelsen \"%s\" är i undermodulen \"%.*s\""
+
+#: pathspec.c:483
 #, c-format
 msgid "%s: 'literal' and 'glob' are incompatible"
 msgstr "%s: \"literal\" och \"glob\" är inkompatibla"
 
-#: pathspec.c:241
+#: pathspec.c:496
 #, c-format
 msgid "%s: '%s' is outside repository"
 msgstr "%s: \"%s\" är utanför arkivet"
 
-#: pathspec.c:291
+#: pathspec.c:584
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Sökvägsangivelsen \"%s\" är i undermodulen \"%.*s\""
+msgid "'%s' (mnemonic: '%c')"
+msgstr "\"%s\" (minnesstöd: \"%c\")"
 
-#: pathspec.c:353
+#: pathspec.c:594
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s: sökvägsuttrycket hanteras inte av det här kommandot: %s"
 
-#: pathspec.c:433
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"tomma strängar som sökvägsangivelser kommer bli ogiltiga i en kommande "
+"utgåva. använd istället . om du vill träffa alla sökvägar"
+
+#: pathspec.c:668
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "sökvägsangivelsen \"%s\" är på andra sidan av en symbolisk länk"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-"Ingenting att exkludera från med :(exkludera)-mönster.\n"
-"Glömde du kanske att antingen lägga till \":/\" eller \".\"?"
-
-#: pretty.c:973
+#: pretty.c:982
 msgid "unable to parse --pretty format"
 msgstr "kunde inte tolka format för --pretty"
 
-#: progress.c:235
-msgid "done"
-msgstr "klart"
-
-#: read-cache.c:1281
+#: read-cache.c:1442
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1380,7 +2425,7 @@ msgstr ""
 "index.version satt, men värdet är ogiltigt.\n"
 "Använder version %i"
 
-#: read-cache.c:1291
+#: read-cache.c:1452
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1389,247 +2434,359 @@ msgstr ""
 "GIT_INDEX_VERSION satt, men värdet är ogiltigt.\n"
 "Använder version %i"
 
-#: refs.c:551 builtin/merge.c:840
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
+#, c-format
+msgid "could not stat '%s'"
+msgstr "kunde inte ta status på \"%s\""
+
+#: read-cache.c:2388
+#, c-format
+msgid "unable to open git dir: %s"
+msgstr "kunde inte öppna git-katalog: %s"
+
+#: read-cache.c:2400
+#, c-format
+msgid "unable to unlink: %s"
+msgstr "misslyckades ta bort länken: %s"
+
+#: refs.c:620 builtin/merge.c:844
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: refs/files-backend.c:2534
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
+msgstr "referensuppdateringar förbjudna i karantänmiljö"
+
+#: refs/files-backend.c:1631
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "kunde inte ta bort referensen %s: %s"
 
-#: refs/files-backend.c:2537
+#: refs/files-backend.c:1634
 #, c-format
 msgid "could not delete references: %s"
 msgstr "kunde inte ta bort referenser: %s"
 
-#: refs/files-backend.c:2546
+#: refs/files-backend.c:1643
 #, c-format
 msgid "could not remove reference %s"
 msgstr "kunde inte ta bort referensen %s"
 
-#: ref-filter.c:55
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "försvunnen"
+
+#: ref-filter.c:36
+#, c-format
+msgid "ahead %d"
+msgstr "före %d"
+
+#: ref-filter.c:37
+#, c-format
+msgid "behind %d"
+msgstr "bakom %d"
+
+#: ref-filter.c:38
+#, c-format
+msgid "ahead %d, behind %d"
+msgstr "före %d, bakom %d"
+
+#: ref-filter.c:104
 #, c-format
 msgid "expected format: %%(color:<color>)"
 msgstr "förväntat format: %%(color:<color>)"
 
-#: ref-filter.c:57
+#: ref-filter.c:106
 #, c-format
 msgid "unrecognized color: %%(color:%s)"
 msgstr "okänd färg: %%(color:%s)"
 
-#: ref-filter.c:71
+#: ref-filter.c:120
+#, c-format
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "Heltalsvärde förväntades refname:lstrip=%s"
+
+#: ref-filter.c:124
+#, c-format
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "Heltalsvärde förväntades refname:rstrip=%s"
+
+#: ref-filter.c:126
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "okänt format: %%(%s)"
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "okänt %%(%s)-argument: %s"
 
-#: ref-filter.c:77
+#: ref-filter.c:166
 #, c-format
 msgid "%%(body) does not take arguments"
 msgstr "%%(body) tar inte argument"
 
-#: ref-filter.c:84
+#: ref-filter.c:173
 #, c-format
 msgid "%%(subject) does not take arguments"
 msgstr "%%(subject) tar inte argument"
 
-#: ref-filter.c:101
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) tar inte argument"
+
+#: ref-filter.c:199
 #, c-format
 msgid "positive value expected contents:lines=%s"
 msgstr "positivt värde förväntat contents:lines=%s"
 
-#: ref-filter.c:103
+#: ref-filter.c:201
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
 msgstr "okänt %%(contents)-argument: %s"
 
-#: ref-filter.c:113
+#: ref-filter.c:214
+#, c-format
+msgid "positive value expected objectname:short=%s"
+msgstr "positivt värde förväntat objectname:short=%s"
+
+#: ref-filter.c:218
 #, c-format
 msgid "unrecognized %%(objectname) argument: %s"
 msgstr "okänt %%(objectname)-argument: %s"
 
-#: ref-filter.c:135
+#: ref-filter.c:245
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "förväntat format: %%(align:<bredd>,<position>)"
 
-#: ref-filter.c:147
+#: ref-filter.c:257
 #, c-format
 msgid "unrecognized position:%s"
 msgstr "okänd position:%s"
 
-#: ref-filter.c:151
+#: ref-filter.c:261
 #, c-format
 msgid "unrecognized width:%s"
 msgstr "okänd bredd:%s"
 
-#: ref-filter.c:157
+#: ref-filter.c:267
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
 msgstr "okänt %%(align)-argument: %s"
 
-#: ref-filter.c:161
+#: ref-filter.c:271
 #, c-format
 msgid "positive width expected with the %%(align) atom"
 msgstr "positiv bredd förväntad med atomen %%(align)"
 
-#: ref-filter.c:244
+#: ref-filter.c:286
+#, c-format
+msgid "unrecognized %%(if) argument: %s"
+msgstr "okänt %%(if)-argument: %s"
+
+#: ref-filter.c:371
 #, c-format
 msgid "malformed field name: %.*s"
 msgstr "felformat fältnamn: %.*s"
 
-#: ref-filter.c:270
+#: ref-filter.c:397
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "okänt fältnamn: %.*s"
+
+#: ref-filter.c:501
+#, c-format
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "format: atomen %%(if) använd utan en %%(then)-atom"
+
+#: ref-filter.c:561
+#, c-format
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "format: atomen %%(then) använd utan en %%(if)-atom"
+
+#: ref-filter.c:563
+#, c-format
+msgid "format: %%(then) atom used more than once"
+msgstr "format: atomen %%(then) använd mer än en gång"
+
+#: ref-filter.c:565
+#, c-format
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "format: atomen %%(then) använd efter %%(else)"
+
+#: ref-filter.c:591
+#, c-format
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "format: atomen %%(else) använd utan en %%(if)-atom"
+
+#: ref-filter.c:593
+#, c-format
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "format: atomen %%(else) använd utan en %%(then)-atom"
+
+#: ref-filter.c:595
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "okänt fältnamn: %.*s"
+msgid "format: %%(else) atom used more than once"
+msgstr "format: atomen %%(else) använd mer än en gång"
 
-#: ref-filter.c:372
+#: ref-filter.c:608
 #, c-format
 msgid "format: %%(end) atom used without corresponding atom"
 msgstr "format: atomen %%(end) använd utan motsvarande atom"
 
-#: ref-filter.c:424
+#: ref-filter.c:663
 #, c-format
 msgid "malformed format string %s"
 msgstr "felformad formatsträng %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= kräver ett positivt heltalsargument"
+#: ref-filter.c:1247
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(ingen gren, ombaserar %s)"
+
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(ingen gren, \"bisect\" startad på %s)"
 
-#: ref-filter.c:883
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "referensen \"%s\" har inte %ld komponenter för :strip"
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD frånkopplat vid %s)"
 
-#: ref-filter.c:1046
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "okänt \"%.*s\"-format %s"
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD frånkopplat från %s)"
+
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(ingen gren)"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: ref-filter.c:1420 ref-filter.c:1451
 #, c-format
 msgid "missing object %s for %s"
 msgstr "objektet %s saknas för %s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: ref-filter.c:1423 ref-filter.c:1454
 #, c-format
 msgid "parse_object_buffer failed on %s for %s"
 msgstr "parse_object_buffer misslyckades på %s för %s"
 
-#: ref-filter.c:1311
+#: ref-filter.c:1692
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "felformat objekt vid \"%s\""
 
-#: ref-filter.c:1373
+#: ref-filter.c:1759
 #, c-format
 msgid "ignoring ref with broken name %s"
 msgstr "ignorerar referens med trasigt namn %s"
 
-#: ref-filter.c:1378
+#: ref-filter.c:1764
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "ignorerar trasig referens %s"
 
-#: ref-filter.c:1651
+#: ref-filter.c:2028
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "format: atomen %%(end) saknas"
 
-#: ref-filter.c:1705
+#: ref-filter.c:2109
 #, c-format
 msgid "malformed object name %s"
 msgstr "felformat objektnamn %s"
 
-#: remote.c:746
+#: remote.c:754
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Kan inte hämta både %s och %s till %s"
 
-#: remote.c:750
+#: remote.c:758
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s spårar vanligtvis %s, inte %s"
 
-#: remote.c:754
+#: remote.c:762
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s spårar både %s och %s"
 
-#: remote.c:762
+#: remote.c:770
 msgid "Internal error"
 msgstr "Internt fel"
 
-#: remote.c:1677 remote.c:1720
+#: remote.c:1685 remote.c:1787
 msgid "HEAD does not point to a branch"
 msgstr "HEAD pekar inte på en gren"
 
-#: remote.c:1686
+#: remote.c:1694
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "okänd gren: \"%s\""
 
-#: remote.c:1689
+#: remote.c:1697
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "ingen standarduppström angiven för grenen \"%s\""
 
-#: remote.c:1695
+#: remote.c:1703
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "uppströmsgrenen \"%s\" är inte lagrad som en fjärrspårande gren"
 
-#: remote.c:1710
+#: remote.c:1718
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr "push-målet \"%s\" på fjärren \"%s\" har ingen lokalt spårande gren"
 
-#: remote.c:1725
+#: remote.c:1730
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "grenen \"%s\" har ingen fjärr för \"push\""
 
-#: remote.c:1736
+#: remote.c:1741
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "\"push\"-referensspecifikation för \"%s\" innehåller inte \"%s\""
 
-#: remote.c:1749
+#: remote.c:1754
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "\"push\" har inget mål (push.default är \"ingenting\")"
 
-#: remote.c:1771
+#: remote.c:1776
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "\"enkel push\" motsvarar flera olika mål"
 
-#: remote.c:2073
+#: remote.c:2081
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Din gren är baserad på \"%s\", men den har försvunnit uppströms.\n"
 
-#: remote.c:2077
+#: remote.c:2085
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (använd \"git branch --unset-upstream\" för att rätta)\n"
 
-#: remote.c:2080
+#: remote.c:2088
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Din gren är à jour med \"%s\".\n"
 
-#: remote.c:2084
+#: remote.c:2092
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "Din gren ligger före \"%s\" med %d incheckning.\n"
 msgstr[1] "Din gren ligger före \"%s\" med %d incheckningar.\n"
 
-#: remote.c:2090
+#: remote.c:2098
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (använd \"git push\" för att publicera dina lokala incheckningar)\n"
 
-#: remote.c:2093
+#: remote.c:2101
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1639,11 +2796,11 @@ msgstr[0] ""
 msgstr[1] ""
 "Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n"
 
-#: remote.c:2101
+#: remote.c:2109
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (använd \"git pull\" för att uppdatera din lokala gren)\n"
 
-#: remote.c:2104
+#: remote.c:2112
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1658,2358 +2815,2269 @@ msgstr[1] ""
 "Din gren och \"%s\" har divergerat,\n"
 "och har %d respektive %d olika incheckningar.\n"
 
-#: remote.c:2114
+#: remote.c:2122
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (använd \"git pull\" för att slå ihop fjärrgrenen med din egen)\n"
 
-#: revision.c:2132
+#: revision.c:2158
 msgid "your current branch appears to be broken"
 msgstr "din nuvarande gren verkar vara trasig"
 
-#: revision.c:2135
+#: revision.c:2161
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "din nuvarande gren \"%s\" innehåller ännu inte några incheckningar"
 
-#: revision.c:2329
+#: revision.c:2355
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent är inkompatibelt med --bisect"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "misslyckades öppna /dev/null"
-
-#: run-command.c:94
-#, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) misslyckades"
-
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "misslyckades underteckna push-certifikatet"
-
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "mottagarsidan stöder inte push med --signed"
-
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"sänder inte push-certifikat eftersom mottagarsidan inte stlder push med --"
-"signed"
-
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "mottagarsidan stöder inte push med --atomic"
-
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "mottagarsidan stöder inte push-flaggor"
-
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"efter att ha löst konflikterna, markera de rättade sökvägarna\n"
-"med \"git add <sökvägar>\" eller \"git rm <sökvägar>\""
-
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"efter att ha löst konflikterna, markera de rättade sökvägarna\n"
-"med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"\n"
-"och checka in resultatet med \"git commit\""
-
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
-#, c-format
-msgid "Could not write to %s"
-msgstr "Kunde inte skriva till %s"
-
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
-#, c-format
-msgid "Error wrapping up %s."
-msgstr "Fel vid ombrytning av %s."
-
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Dina lokala ändringar skulle skrivas över av \"cherry-pick\"."
-
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Dina lokala ändringar skulle skrivas över av \"revert\"."
-
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Checka in dina ändringar eller använd \"stash\" för att fortsätta."
-
-#: sequencer.c:228
-#, c-format
-msgid "%s: fast-forward"
-msgstr "%s: snabbspola"
-
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Kunde inte skriva ny indexfil"
-
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "Kunde inte bestämma HEAD:s incheckning\n"
-
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "Kan inte uppdatera cacheträd\n"
-
-#: sequencer.c:393
-#, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Kunde inte tolka incheckningen %s\n"
-
-#: sequencer.c:398
-#, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Kunde inte tolka föräldraincheckningen %s\n"
-
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "Din indexfil har inte slagits ihop."
-
-#: sequencer.c:482
-#, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Incheckning %s är en sammanslagning, men flaggan -m angavs inte."
-
-#: sequencer.c:490
-#, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Incheckning %s har inte förälder %d"
-
-#: sequencer.c:494
-#, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Huvudlinje angavs, men incheckningen %s är inte en sammanslagning"
-
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: kan inte tolka föräldraincheckningen %s"
-
-#: sequencer.c:511
-#, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Kan inte hämta incheckningsmeddelande för %s"
-
-#: sequencer.c:597
-#, c-format
-msgid "could not revert %s... %s"
-msgstr "kunde inte ångra %s... %s"
-
-#: sequencer.c:598
-#, c-format
-msgid "could not apply %s... %s"
-msgstr "kunde inte tillämpa %s... %s"
-
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "den angivna uppsättningen incheckningar är tom"
-
-#: sequencer.c:641
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: misslyckades läsa indexet"
-
-#: sequencer.c:645
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: misslyckades uppdatera indexet"
-
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "Kan inte utföra \"revert\" under en annan \"revert\"."
-
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "Kan inte utföra \"revert\" under en \"cherry-pick\"."
-
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "Kan inte utföra \"cherry-pick\" under en \"revert\"."
-
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "Kan inte utföra \"cherry-pick\" under en annan \"cherry-pick\"."
-
-#: sequencer.c:732
-#, c-format
-msgid "Could not parse line %d."
-msgstr "Kan inte tolka rad %d."
-
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "Inga incheckningar lästes."
-
-#: sequencer.c:749
-#, c-format
-msgid "Could not open %s"
-msgstr "Kunde inte öppna %s"
-
-#: sequencer.c:753
-#, c-format
-msgid "Could not read %s."
-msgstr "kunde inte läsa %s."
-
-#: sequencer.c:760
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Oanvändbart manus: %s"
-
-#: sequencer.c:790
-#, c-format
-msgid "Invalid key: %s"
-msgstr "Felaktig nyckel: %s"
-
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
-#, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Felaktigt värde för %s: %s"
-
-#: sequencer.c:803
-#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Trasigt manus: %s"
-
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
-
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
-
-#: sequencer.c:827
-#, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\""
-
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "ingen \"cherry-pick\" eller \"revert\" pågår"
-
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "kan inte bestämma HEAD"
-
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "kan inte avbryta från en gren som ännu inte är född"
-
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
-#, c-format
-msgid "cannot open %s"
-msgstr "kan inte öppna %s"
-
-#: sequencer.c:888
-#, c-format
-msgid "cannot read %s: %s"
-msgstr "kan inte läsa %s: %s"
-
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "oväntat filslut"
-
-#: sequencer.c:895
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "sparad HEAD-fil från före \"cherry-pick\", \"%s\", är trasig"
-
-#: sequencer.c:921
-#, c-format
-msgid "Could not format %s."
-msgstr "Kunde inte formatera %s."
-
-#: sequencer.c:1066
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: kan inte göra \"cherry-pick\" på typen \"%s\""
-
-#: sequencer.c:1069
-#, c-format
-msgid "%s: bad revision"
-msgstr "%s: felaktig revision"
-
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "Kan inte ångra som första incheckning"
-
-#: setup.c:160
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s: sökvägen finns inte i arbetskatalogen.\n"
-"Använd \"git <kommando> -- <sökväg>..\" för att ange sökvägar som inte finns "
-"lokalt."
-
-#: setup.c:173
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"tvetydigt argument \"%s\": okänd revision eller sökväg inte i "
-"arbetskatalogen.\n"
-"Använd \"--\" för att skilja sökvägar från revisioner, så här:\n"
-"\"git <kommando> [<revision>...] -- [<fil>...]\""
-
-#: setup.c:223
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"tvetydigt argument \"%s\": både revision och filnamn\n"
-"Använd \"--\" för att skilja sökvägar från revisioner, så här:\n"
-"\"git <kommando> [<revision>...] -- [<fil>...]\""
-
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
-#, c-format
-msgid "failed to read %s"
-msgstr "misslyckades läsa %s"
-
-#: setup.c:468
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Förväntade git-arkivversion <= %d, hittade %d"
-
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "okända arkivutökningar hittades:"
-
-#: setup.c:762
-#, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "Inte ett git-arkiv (eller någon av föräldrakatalogerna): %s"
-
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "Kan inte gå tillbaka till arbetskatalogen (cwd)"
-
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "Kan inte läsa aktuell arbetskatalog"
-
-#: setup.c:920
-#, c-format
-msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-"Inte ett git-arkiv (eller någon av föräldrakatalogerna upp till "
-"monteringspunkten %s)\n"
-"Stoppar vid filsystemsgräns (GIT_DISCOVERY_ACROSS_FILESYSTEM är inte satt)."
-
-#: setup.c:927
-#, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "kan inte byta till \"%s/..\""
-
-#: setup.c:989
-#, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-"Problem med filläges-värdet i core.sharedRepository (0%.3o).\n"
-"Ägaren av filerna måste alltid ha läs- och skrivbehörighet."
-
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "offset före slutet av packfilen (trasig .idx?)"
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "misslyckades öppna /dev/null"
 
-#: sha1_file.c:2434
+#: run-command.c:127
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "offset före slutet av packindex för %s (trasigt index?)"
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) misslyckades"
 
-#: sha1_file.c:2438
+#: send-pack.c:150
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "offset borton slutet av packindex för %s (trunkerat index?)"
+msgid "unable to parse remote unpack status: %s"
+msgstr "kunde inte tolka fjärruppackningsstatus: %s"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-"Git skapar normalt aldrig referenser som slutar med 40 hexadecimala\n"
-"tecken, då detta ignoreras när du anger 40-hex enbart. Dessa\n"
-"referenser kan skapas av misstag. Till exempel, för\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"där \"$br\" på något sätt blivit tomt och en 40-hex-referens skapats.\n"
-"Undersök referenserna och ta kanske bort dem. Stäng av meddelandet\n"
-"genom att köra \"git config advice.objectNameWarning false\""
+#: send-pack.c:152
+#, c-format
+msgid "remote unpack failed: %s"
+msgstr "fjärruppackning misslyckades: %s"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
+msgstr "misslyckades underteckna push-certifikatet"
+
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
+msgstr "mottagarsidan stöder inte push med --signed"
+
+#: send-pack.c:430
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"Kan inte ändra .gitmodules-fil som inte slagits ihop, lös "
-"sammanslagningskonflikter först"
+"sänder inte push-certifikat eftersom mottagarsidan inte stlder push med --"
+"signed"
 
-#: submodule.c:68 submodule.c:102
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Hittade inte någon sektion i .gitmodules där sökväg=%s"
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
+msgstr "mottagarsidan stöder inte push med --atomic"
 
-#: submodule.c:76
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Kunde inte uppdatera .gitmodules-posten %s"
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
+msgstr "mottagarsidan stöder inte push-flaggor"
 
-#: submodule.c:109
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Kunde inte ta bort .gitmodules-posten för %s"
+#: sequencer.c:215
+msgid "revert"
+msgstr "revert"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "misslyckades köa uppdaterad .gitmodules"
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "cherry-pick"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "negativa värden är inte tillåtna för submodule.fetchJobs"
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
 
-#: submodule-config.c:358
+#: sequencer.c:221
 #, c-format
-msgid "invalid value for %s"
-msgstr "ogiltigt värde för %s"
+msgid "Unknown action: %d"
+msgstr "Okänd funktion: %d"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "misslyckades utföra \"trailer\"-kommandot \"%s\""
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"efter att ha löst konflikterna, markera de rättade sökvägarna\n"
+"med \"git add <sökvägar>\" eller \"git rm <sökvägar>\""
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "okänt värde \"%s\" för nyckeln \"%s\""
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"efter att ha löst konflikterna, markera de rättade sökvägarna\n"
+"med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"\n"
+"och checka in resultatet med \"git commit\""
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: sequencer.c:294 sequencer.c:1682
 #, c-format
-msgid "more than one %s"
-msgstr "mer än en %s"
+msgid "could not lock '%s'"
+msgstr "kunde inte låsa \"%s\""
 
-#: trailer.c:582
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "tom släpradssymbol i släpraden \"%.*s\""
+msgid "could not write to '%s'"
+msgstr "kunde inte skriva till \"%s\""
 
-#: trailer.c:702
+#: sequencer.c:301
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "kunde inte läsa indatafilen \"%s\""
+msgid "could not write eol to '%s'"
+msgstr "kunde inte skriva radslut till \"%s\""
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "Kunde inte läsa från standard in"
-
-#: trailer.c:857 builtin/am.c:42
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
 #, c-format
-msgid "could not stat %s"
-msgstr "kunde inte ta status på %s"
+msgid "failed to finalize '%s'."
+msgstr "misslyckades färdigställa \"%s\"."
 
-#: trailer.c:859
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "filen %s är inte en normal fil"
+msgid "could not read '%s'"
+msgstr "kunde inte läsa \"%s\""
 
-#: trailer.c:861
+#: sequencer.c:355
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "filen %s är inte skrivbar av användaren"
+msgid "your local changes would be overwritten by %s."
+msgstr "dina lokala ändringar skulle skrivas över av %s."
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "kunde inte öppna temporär file"
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "checka in dina ändringar eller använd \"stash\" för att fortsätta."
 
-#: trailer.c:912
+#: sequencer.c:388
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "kunde inte byta nman på temporära file till %s"
+msgid "%s: fast-forward"
+msgstr "%s: snabbspola"
 
-#: transport.c:62
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Skulle sätta uppströms för \"%s\" till \"%s\" från \"%s\"\n"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Kunde inte skriva ny indexfil"
 
-#: transport.c:151
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "transport: ogiltig flagga för depth: %s"
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "kunde inte bestämma HEAD:s incheckning\n"
 
-#: transport.c:771
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-"Följande undermodulsökvägar innehåller ändringar som\n"
-"inte kan hittas av fjärrarna:\n"
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "kan inte uppdatera cacheträd\n"
 
-#: transport.c:775
+#: sequencer.c:592
 #, c-format
 msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
 "\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"  git commit --amend %s\n"
 "\n"
-"or cd to the path and use\n"
+"If they are meant to go into a new commit, run:\n"
 "\n"
-"\tgit push\n"
+"  git commit %s\n"
 "\n"
-"to push them to a remote.\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
+"  git rebase --continue\n"
 msgstr ""
+"du har köade ändringar i din arbetskatalog.\n"
+"Om ändringarna skall läggas in i föregående incheckning, kör:\n"
 "\n"
-"Testa\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"  git commit --amend %s\n"
 "\n"
-"eller cd till sökvägen och använd\n"
+"Om de skall checkas in i en egen incheckning, kör:\n"
 "\n"
-"\tgit push\n"
+"  git commit %s\n"
 "\n"
-"för att sända dem till fjärren.\n"
+"Oavsett vilket, när du är färdig fortsätter du med:\n"
 "\n"
+"  git rebase --continue\n"
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "Avbryter."
-
-#: transport-helper.c:1041
-#, c-format
-msgid "Could not read ref %s"
-msgstr "Kunde inte läsa referensen %s"
-
-#: unpack-trees.c:64
+#: sequencer.c:694
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"Dina lokala ändringar av följande filer skulle skrivas över av utcheckning:\n"
-"%%sChecka in dina ändringar eller använd \"stash\" innan du byter gren."
+msgid "could not parse commit %s\n"
+msgstr "kunde inte tolka incheckningen %s\n"
 
-#: unpack-trees.c:66
+#: sequencer.c:699
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"Dina lokala ändringar av följande filer skulle skrivas över av utcheckning:\n"
-"%%s"
+msgid "could not parse parent commit %s\n"
+msgstr "kunde inte tolka föräldraincheckningen %s\n"
 
-#: unpack-trees.c:69
+#: sequencer.c:821
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"Dina lokala ändringar av följande filer skulle skrivas över av "
-"sammanslagning:\n"
-"%%sChecka in dina ändringar eller använd \"stash\" innan du byter gren."
+"oväntad första rad i squash-meddelande:\n"
+"\n"
+"\t%.*s"
 
-#: unpack-trees.c:71
+#: sequencer.c:827
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"Dina lokala ändringar av följande filer skulle skrivas över av "
-"sammanslagning:\n"
-"%%s"
+"ogiltig första rad i squash-meddelande:\n"
+"\n"
+"\t%.*s"
 
-#: unpack-trees.c:74
+#: sequencer.c:833 sequencer.c:858
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"Dina lokala ändringar av följande filer skulle skrivas över av \"%s\":\n"
-"%%sChecka in dina ändringar eller använd \"stash\" innan du \"%s\"."
+msgid "This is a combination of %d commits."
+msgstr "Det här är en kombination av %d incheckningar."
 
-#: unpack-trees.c:76
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Dina lokala ändringar av följande filer skulle skrivas över av \"%s\":\n"
-"%%s"
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "behöver en HEAD-incheckning att rätta"
 
-#: unpack-trees.c:81
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"Uppdatering av följande kataloger gör att ospårade filer går förlorade i "
-"dem:\n"
-"%s"
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "kunde inte läsa HEAD"
 
-#: unpack-trees.c:85
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle tas bort av utcheckningen:\n"
-"%%sFlytta eller ta bort dem innan du byter gren."
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
+msgstr "kunde inte läsa HEAD:s incheckningsmeddelande"
 
-#: unpack-trees.c:87
+#: sequencer.c:852
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle tas bort av utcheckningen:\n"
-"%%s"
+msgid "cannot write '%s'"
+msgstr "kan inte skriva \"%s\""
 
-#: unpack-trees.c:90
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle tas bort av "
-"sammanslagningen:\n"
-"%%sFlytta eller ta bort dem innan du slår samman."
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "Det här är 1:a incheckningsmeddelandet:"
 
-#: unpack-trees.c:92
+#: sequencer.c:869
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle tas bort av "
-"sammanslagningen:\n"
-"%%s"
+msgid "could not read commit message of %s"
+msgstr "kunde inte läsa incheckningsmeddelande för %s"
 
-#: unpack-trees.c:95
+#: sequencer.c:876
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle tas bort av \"%s\":\n"
-"%%sFlytta eller ta bort dem innan du \"%s\"."
+msgid "This is the commit message #%d:"
+msgstr "Det här är incheckningsmeddelande %d:"
 
-#: unpack-trees.c:97
+#: sequencer.c:881
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle tas bort av \"%s\":\n"
-"%%s"
+msgid "The commit message #%d will be skipped:"
+msgstr "Incheckningsmeddelande %d kommer hoppas över:"
 
-#: unpack-trees.c:102
+#: sequencer.c:886
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
-"utcheckningen:\n"
-"%%sFlytta eller ta bort dem innan du byter gren."
+msgid "unknown command: %d"
+msgstr "okänt kommando: %d"
 
-#: unpack-trees.c:104
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
-"utcheckningen:\n"
-"%%s"
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "din indexfil har inte slagits ihop."
 
-#: unpack-trees.c:107
+#: sequencer.c:970
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
-"sammanslagningen:\n"
-"%%sFlytta eller ta bort dem innan du byter gren."
+msgid "commit %s is a merge but no -m option was given."
+msgstr "incheckning %s är en sammanslagning, men flaggan -m angavs inte."
 
-#: unpack-trees.c:109
+#: sequencer.c:978
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
-"sammanslagningen:\n"
-"%%s"
+msgid "commit %s does not have parent %d"
+msgstr "incheckning %s har inte förälder %d"
 
-#: unpack-trees.c:112
+#: sequencer.c:982
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle skrivas över av \"%s\":\n"
-"%%sFlytta eller ta bort dem innan du \"%s\"."
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "huvudlinje angavs, men incheckningen %s är inte en sammanslagning"
 
-#: unpack-trees.c:114
+#: sequencer.c:988
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Följande ospårade filer i arbetskatalogen skulle skrivas över av \"%s\":\n"
-"%%s"
+msgid "cannot get commit message for %s"
+msgstr "kan inte hämta incheckningsmeddelande för %s"
 
-#: unpack-trees.c:121
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "Posten \"%s\" överlappar \"%s\". Kan inte binda."
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: kan inte tolka föräldraincheckningen %s"
 
-#: unpack-trees.c:124
+#: sequencer.c:1071 sequencer.c:1827
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"Kan inte uppdatera gles utcheckning: följande poster är inte àjour:\n"
-"%s"
+msgid "could not rename '%s' to '%s'"
+msgstr "kunde inte byta namn på \"%s\" till \"%s\""
 
-#: unpack-trees.c:126
+#: sequencer.c:1122
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Följande filer i arbetskatalogen skulle skrivas över av uppdatering av gles "
-"utcheckning:\n"
-"%s"
+msgid "could not revert %s... %s"
+msgstr "kunde inte ångra %s... %s"
 
-#: unpack-trees.c:128
+#: sequencer.c:1123
 #, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Följande filer i arbetskatalogen skulle tas bort av uppdatering av gles "
-"utcheckning:\n"
-"%s"
+msgid "could not apply %s... %s"
+msgstr "kunde inte tillämpa %s... %s"
+
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "den angivna uppsättningen incheckningar är tom"
 
-#: unpack-trees.c:205
+#: sequencer.c:1175
 #, c-format
-msgid "Aborting\n"
-msgstr "Avbryter\n"
+msgid "git %s: failed to read the index"
+msgstr "git %s: misslyckades läsa indexet"
 
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Checkar ut filer"
+#: sequencer.c:1182
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: misslyckades uppdatera indexet"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "ogiltig URL-schemanamn eller saknat \"://\"-suffix"
+#: sequencer.c:1303
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "ogiltig rad %d: %.*s"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:1311
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "ogiltig %XX-teckensekvens"
+msgid "cannot '%s' without a previous commit"
+msgstr "Kan inte utföra \"%s\" utan en föregående incheckning"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "värd saknas och schemat är inte \"file:\""
+#: sequencer.c:1344
+#, c-format
+msgid "could not read '%s'."
+msgstr "kunde inte läsa \"%s\"."
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "en \"file:\"-URL kan inte innehålla portnummer"
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "rätta det med \"git rebase --edit-todo\"."
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "ogiltiga tecken i värdnamnet"
+#: sequencer.c:1358
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "oanvändbart manus: %s"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "felaktigt portnummer"
+#: sequencer.c:1363
+msgid "no commits parsed."
+msgstr "inga incheckningar lästes."
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "felaktigt \"..\"-sökvägssegment"
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
+msgstr "kan inte utföra \"cherry-pick\" under en \"revert\"."
 
-#: worktree.c:282
-#, c-format
-msgid "failed to read '%s'"
-msgstr "misslyckades läsa \"%s\""
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
+msgstr "kan inte utföra \"revert\" under en \"cherry-pick\"."
 
-#: wrapper.c:222 wrapper.c:392
+#: sequencer.c:1439
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "kunde inte öppna \"%s\" för läsning och skrivning"
+msgid "invalid key: %s"
+msgstr "felaktig nyckel: %s"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: sequencer.c:1442
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "kunde inte öppna \"%s\" för skrivning"
+msgid "invalid value for %s: %s"
+msgstr "felaktigt värde för %s: %s"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: sequencer.c:1499
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "kunde inte öppna \"%s\" för läsning"
+msgid "malformed options sheet: '%s'"
+msgstr "trasigt manus: %s"
 
-#: wrapper.c:605 wrapper.c:626
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
+msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
+
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
+
+#: sequencer.c:1541
 #, c-format
-msgid "unable to access '%s'"
-msgstr "kan inte komma åt \"%s\""
+msgid "could not create sequencer directory '%s'"
+msgstr "kunde inte skapa \"sequencer\"-katalogen \"%s\""
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "kan inte hämta aktuell arbetskatalog"
+#: sequencer.c:1555
+msgid "could not lock HEAD"
+msgstr "kunde inte låsa HEAD"
+
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
+msgstr "ingen \"cherry-pick\" eller \"revert\" pågår"
+
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
+msgstr "kan inte bestämma HEAD"
+
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
+msgstr "kan inte avbryta från en gren som ännu inte är född"
 
-#: wrapper.c:658
+#: sequencer.c:1635 builtin/grep.c:910
 #, c-format
-msgid "could not write to %s"
-msgstr "kunde inte skriva till %s"
+msgid "cannot open '%s'"
+msgstr "kan inte öppna \"%s\""
 
-#: wrapper.c:660
+#: sequencer.c:1637
 #, c-format
-msgid "could not close %s"
-msgstr "kunde inte stänga %s"
+msgid "cannot read '%s': %s"
+msgstr "kan inte läsa \"%s\": %s"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Ej sammanslagna sökvägar:"
+#: sequencer.c:1638
+msgid "unexpected end of file"
+msgstr "oväntat filslut"
 
-#: wt-status.c:177 wt-status.c:204
+#: sequencer.c:1644
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (använd \"git reset %s <fil>...\" för att ta bort från kö)"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "sparad HEAD-fil från före \"cherry-pick\", \"%s\", är trasig"
 
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (använd \"git rm --cached <fil>...\" för att ta bort från kö)"
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr ""
+"Du verkar ha flyttat HEAD.\n"
+"Spolar inte tillbaka, kontrollera HEAD!"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (använd \"git add <fil>...\" för att ange lösning)"
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
+msgstr "kan inte läsa HEAD"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (använd \"git add/rm <fil>...\" som lämpligt för att ange lösning)"
+#: sequencer.c:1832 builtin/difftool.c:616
+#, c-format
+msgid "could not copy '%s' to '%s'"
+msgstr "kunde inte kopiera in \"%s\" till \"%s\""
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (använd \"git rm <fil>...\" för att ange lösning)"
+#: sequencer.c:1848
+msgid "could not read index"
+msgstr "Kunde inte läsa indexet"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "Ändringar att checka in:"
+#: sequencer.c:1853
+#, c-format
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"körningen misslyckades: %s\n"
+"%sDu kan rätta problemet och sedan köra\n"
+"\n"
+"\tgit rebase --continue\n"
+"\n"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Ändringar ej i incheckningskön:"
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "och gjorde ändringar till indexet och/eller arbetskatalogen\n"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
+#: sequencer.c:1865
+#, c-format
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
-"  (använd \"git add <fil>...\" för att uppdatera vad som skall checkas in)"
+"körningen lyckades: %s\n"
+"men lämnade kvar ändringar i indexet och/eller arbetskatalogen\n"
+"Checka in eller utför \"stash\" på ändringarna och kör sedan\n"
+"\n"
+"\tgit rebase --continue\n"
+"\n"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-"  (använd \"git add/rm <fil>...\" för att uppdatera vad som skall checkas in)"
+#: sequencer.c:1920 git-rebase.sh:169
+#, c-format
+msgid "Applied autostash."
+msgstr "Tillämpade autostash."
 
-#: wt-status.c:223
+#: sequencer.c:1932
+#, c-format
+msgid "cannot store %s"
+msgstr "kan inte spara %s"
+
+#: sequencer.c:1934 git-rebase.sh:173
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
 msgstr ""
-"  (använd \"git checkout -- <fil>...\" för att förkasta ändringar i "
-"arbetskatalogen)"
+"Tillämpning av autostash gav konflikter.\n"
+"Dina ändringar är säkra i stashen.\n"
+"Du kan när som helst använda \"git stash pop\" eller \"git stash drop\".\n"
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-"  (checka in eller förkasta ospårat eller ändrat innehåll i undermoduler)"
+#: sequencer.c:2016
+#, c-format
+msgid "Stopped at %s...  %.*s\n"
+msgstr "Stoppade på %s... %.*s\n"
 
-#: wt-status.c:237
+#: sequencer.c:2058
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid "unknown command %d"
+msgstr "okänt kommando %d"
+
+#: sequencer.c:2088
+msgid "could not read orig-head"
+msgstr "Kunde inte läsa orig-head"
+
+#: sequencer.c:2092
+msgid "could not read 'onto'"
+msgstr "kunde inte läsa \"onto\""
+
+#: sequencer.c:2099
+#, c-format
+msgid "could not update %s"
+msgstr "kunde inte uppdatera %s"
+
+#: sequencer.c:2106
+#, c-format
+msgid "could not update HEAD to %s"
+msgstr "kunde inte uppdatera HEAD till %s"
+
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
+msgstr "kan inte ombasera: Du har oköade ändringar."
+
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "kunde inte ta bort CHERRY_PICK_HEAD"
+
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
+msgstr "kan inte lägga till incheckning som inte finns"
+
+#: sequencer.c:2206
+#, c-format
+msgid "invalid file: '%s'"
+msgstr "ogiltig fil: \"%s\""
+
+#: sequencer.c:2208
+#, c-format
+msgid "invalid contents: '%s'"
+msgstr "ogiltigt innehåll: \"%s\""
+
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
-"  (använd \"git %s <fil>...\" för att ta med i det som skall checkas in)"
+"\n"
+"Du har ändringar i arbetskatalogen som inte checkats in. Checka in dem\n"
+"först och kör sedan \"git rebase --continute\" igen."
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "borttaget av bägge:"
+#: sequencer.c:2221
+msgid "could not commit staged changes."
+msgstr "kunde inte checka in köade ändringar."
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "tillagt av oss:"
+#: sequencer.c:2301
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: kan inte göra \"cherry-pick\" på typen \"%s\""
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "borttaget av dem:"
+#: sequencer.c:2305
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: felaktig revision"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "tillagt av dem:"
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
+msgstr "kan inte ångra som första incheckning"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "borttaget av oss:"
+#: setup.c:165
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s: sökvägen finns inte i arbetskatalogen.\n"
+"Använd \"git <kommando> -- <sökväg>..\" för att ange sökvägar som inte finns "
+"lokalt."
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "tillagt av bägge:"
+#: setup.c:178
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"tvetydigt argument \"%s\": okänd revision eller sökväg inte i "
+"arbetskatalogen.\n"
+"Använd \"--\" för att skilja sökvägar från revisioner, så här:\n"
+"\"git <kommando> [<revision>...] -- [<fil>...]\""
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "ändrat av bägge:"
+#: setup.c:228
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"tvetydigt argument \"%s\": både revision och filnamn\n"
+"Använd \"--\" för att skilja sökvägar från revisioner, så här:\n"
+"\"git <kommando> [<revision>...] -- [<fil>...]\""
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "ny fil:"
+#: setup.c:475
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Förväntade git-arkivversion <= %d, hittade %d"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "kopierad:"
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "okända arkivutökningar hittades:"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "borttagen:"
+#: setup.c:776
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Inte ett git-arkiv (eller någon av föräldrakatalogerna): %s"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "ändrad:"
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "Kan inte gå tillbaka till arbetskatalogen (cwd)"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "namnbytt:"
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "Kan inte läsa aktuell arbetskatalog"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "typbyte:"
+#: setup.c:1022 setup.c:1028
+#, c-format
+msgid "Cannot change to '%s'"
+msgstr "Kan inte byta till \"%s\""
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "okänd:"
+#: setup.c:1041
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Inte ett git-arkiv (eller någon av föräldrakatalogerna upp till "
+"monteringspunkten %s)\n"
+"Stoppar vid filsystemsgräns (GIT_DISCOVERY_ACROSS_FILESYSTEM är inte satt)."
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "osammanslagen:"
+#: setup.c:1106
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Problem med filläges-värdet i core.sharedRepository (0%.3o).\n"
+"Ägaren av filerna måste alltid ha läs- och skrivbehörighet."
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "nya incheckningar, "
+#: sha1_file.c:559
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "sökvägen \"%s\" finns inte"
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "ändrat innehåll, "
+#: sha1_file.c:585
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "referensarkivet \"%s\" som en länkad utcheckning stöds inte ännu."
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "ospårat innehåll, "
+#: sha1_file.c:591
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "referensarkivet \"%s\" är inte ett lokalt arkiv."
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Undermoduler ändrade men inte uppdaterade:"
+#: sha1_file.c:597
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "referensarkivet \"%s\" är grunt"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Undermodulers ändringar att checka in:"
+#: sha1_file.c:605
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "referensarkivet \"%s\" är ympat"
 
-#: wt-status.c:839
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr ""
-"Rör inte raden ovan.\n"
-"Allt nedan kommer tas bort."
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "offset före slutet av packfilen (trasig .idx?)"
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Du har ej sammanslagna sökvägar."
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "offset före slutet av packindex för %s (trasigt index?)"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (rätta konflikter och kör \"git commit\")"
+#: sha1_file.c:2725
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "offset borton slutet av packindex för %s (trunkerat index?)"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (använd \"git merge --abort\" för att avbryta sammanslagningen)"
+#: sha1_name.c:409
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "kort SHA1 %s är tvetydig"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Alla konflikter har rättats men du är fortfarande i en sammanslagning."
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "Kandidaterna är:"
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (använd \"git commit\" för att slutföra sammanslagningen)"
+#: sha1_name.c:580
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"Git skapar normalt aldrig referenser som slutar med 40 hexadecimala\n"
+"tecken, då detta ignoreras när du anger 40-hex enbart. Dessa\n"
+"referenser kan skapas av misstag. Till exempel, för\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"där \"$br\" på något sätt blivit tomt och en 40-hex-referens skapats.\n"
+"Undersök referenserna och ta kanske bort dem. Stäng av meddelandet\n"
+"genom att köra \"git config advice.objectNameWarning false\""
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Du är i mitten av en körning av \"git am\"."
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"Kan inte ändra .gitmodules-fil som inte slagits ihop, lös "
+"sammanslagningskonflikter först"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "Aktuell patch är tom."
+#: submodule.c:71 submodule.c:105
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Hittade inte någon sektion i .gitmodules där sökväg=%s"
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git am --continue\")"
+#: submodule.c:79
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Kunde inte uppdatera .gitmodules-posten %s"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (använd \"git am --skip\" för att hoppa över patchen)"
+#: submodule.c:112
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Kunde inte ta bort .gitmodules-posten för %s"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (använd \"git am --abort\" för att återställa ursprungsgrenen)"
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "misslyckades köa uppdaterad .gitmodules"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "Inga kommandon utförda."
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "negativa värden är inte tillåtna för submodule.fetchJobs"
 
-#: wt-status.c:1112
+#: submodule.c:1194
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Sista kommandot utfört (%d kommando utfört):"
-msgstr[1] "Sista kommandot utfört (%d kommandon utfört):"
+msgid "'%s' not recognized as a git repository"
+msgstr "\"%s\" känns inte igen som ett git-arkiv"
 
-#: wt-status.c:1123
+#: submodule.c:1332
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (se fler i filen %s)"
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "kunde inte starta \"git status\" i undermodulen \"%s\""
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "Inga kommandon återstår."
+#: submodule.c:1345
+#, c-format
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "kunde inte köra \"git status\" i undermodulen \"%s\""
 
-#: wt-status.c:1131
+#: submodule.c:1421
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Nästa kommando att utföra (%d kommando återstår):"
-msgstr[1] "Följande kommandon att utföra (%d kommandon återstår):"
+msgid "submodule '%s' has dirty index"
+msgstr "undermodulen \"%s\" har ett smutsigt index"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (använd \"git rebase --edit-todo\" för att visa och redigera)"
+#: submodule.c:1678
+#, c-format
+msgid ""
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr ""
+"relocate_gitdir för undermodulen \"%s\", som har mer än en arbetskatalog, "
+"stöds ej"
 
-#: wt-status.c:1152
+#: submodule.c:1690 submodule.c:1746
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Du håller på att ombasera grenen \"%s\" ovanpå \"%s\"."
+msgid "could not lookup name for submodule '%s'"
+msgstr "kunde inte slå upp namnet för undermodulen \"%s\""
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Du håller på med en ombasering."
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "kunde inte skapa katalogen \"%s\""
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git rebase --continue\")"
+#: submodule.c:1697
+#, c-format
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
+msgstr ""
+"Migrerar git-katalogen för \"%s%s\" från\n"
+"\"%s\" till\n"
+"\"%s\"\n"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (använd \"git rebase --skip\" för att hoppa över patchen)"
+#: submodule.c:1781
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "kunde inte rekursera in i undermodulen \"%s\""
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (använd \"git rebase --abort\" för att checka ut ursprungsgrenen)"
+#: submodule.c:1825
+msgid "could not start ls-files in .."
+msgstr "kunde inte starta ls-files i .."
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (alla konflikter rättade: kör \"git rebase --continue\")"
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "BUG: returnerad sökvägssträng matchar inte cwd?"
 
-#: wt-status.c:1185
+#: submodule.c:1864
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Du håller på att dela upp en incheckning medan du ombaserar grenen \"%s\" "
-"ovanpå \"%s\"."
-
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Du håller på att dela upp en incheckning i en ombasering."
+msgid "ls-tree returned unexpected return code %d"
+msgstr "ls-tree returnerade en oväntad returkod %d"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "  (Så fort din arbetskatalog är ren, kör \"git rebase --continue\")"
+#: submodule-config.c:380
+#, c-format
+msgid "invalid value for %s"
+msgstr "ogiltigt värde för %s"
 
-#: wt-status.c:1197
+#: trailer.c:240
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"Du håller på att redigera en incheckning medan du ombaserar grenen \"%s\" "
-"ovanpå \"%s\"."
+msgid "running trailer command '%s' failed"
+msgstr "misslyckades utföra \"trailer\"-kommandot \"%s\""
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Du håller på att redigera en incheckning under en ombasering."
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "okänt värde \"%s\" för nyckeln \"%s\""
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-"  (använd \"git commit --amend\" för att lägga till på aktuell incheckning)"
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "mer än en %s"
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (använd \"git rebase --continue\" när du är nöjd med dina ändringar)"
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "tom släpradssymbol i släpraden \"%.*s\""
 
-#: wt-status.c:1217
+#: trailer.c:722
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Du håller på med en \"cherry-pick\" av incheckningen %s."
+msgid "could not read input file '%s'"
+msgstr "kunde inte läsa indatafilen \"%s\""
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git cherry-pick --continue\")"
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "Kunde inte läsa från standard in"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr "  (alla konflikter rättade: kör \"git cherry-pick --continue\")"
+#: trailer.c:949 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "kunde inte ta status på %s"
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr ""
-"  (använd \"git cherry-pick --abort\" för att avbryta \"cherry-pick\"-"
-"operationen)"
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "filen %s är inte en normal fil"
 
-#: wt-status.c:1236
+#: trailer.c:953
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Du håller på med att ångra incheckningen %s."
+msgid "file %s is not writable by user"
+msgstr "filen %s är inte skrivbar av användaren"
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git revert --continue\")"
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "kunde inte öppna temporär file"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (alla konflikter rättade: kör \"git revert --continue\")"
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "kunde inte byta namn på temporär fil till %s"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (använd \"git revert --abort\" för att avbryta ångrandet)"
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Skulle sätta uppströms för \"%s\" till \"%s\" från \"%s\"\n"
 
-#: wt-status.c:1257
+#: transport.c:151
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Du håller på med en \"bisect\", startad från grenen \"%s\"."
-
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Du håller på med en \"bisect\"."
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: ogiltig flagga för depth: %s"
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
 msgstr ""
-"  (använd \"git bisect reset\" för att komma tillbaka till ursprungsgrenen)"
-
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "På grenen "
-
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "interaktiv ombasering pågår; ovanpå"
+"Följande undermodulsökvägar innehåller ändringar som\n"
+"inte kan hittas av fjärrarna:\n"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "ombasering pågår; ovanpå"
+#: transport.c:893
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Testa\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"eller cd till sökvägen och använd\n"
+"\n"
+"\tgit push\n"
+"\n"
+"för att sända dem till fjärren.\n"
+"\n"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD frånkopplad vid "
+#: transport.c:901
+msgid "Aborting."
+msgstr "Avbryter."
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD frånkopplad från "
+#: transport-helper.c:1080
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Kunde inte läsa referensen %s"
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Inte på någon gren för närvarande."
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "trädobjekt för kort"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Första incheckning"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "felformat läge i trädpost"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Ospårade filer"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "tomt filnamn i trädpost"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Ignorerade filer"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "trädfil för kort"
 
-#: wt-status.c:1520
+#: unpack-trees.c:104
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
-"Det tog %.2f sekunder att räkna upp ospårade filer. \"status -uno\"\n"
-"kan gå snabbare, men du måste vara försiktig så du inte glömmer\n"
-"lägga till nya filer själv (se \"git help status\")."
+"Dina lokala ändringar av följande filer skulle skrivas över av utcheckning:\n"
+"%%sChecka in dina ändringar eller använd \"stash\" innan du byter gren."
 
-# %s är nästa sträng eller tom.
-#: wt-status.c:1526
+#: unpack-trees.c:106
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Ospårade filer visas ej%s"
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (använd flaggan -u för att visa ospårade filer)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Inga ändringar"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"Dina lokala ändringar av följande filer skulle skrivas över av utcheckning:\n"
+"%%s"
 
-#: wt-status.c:1539
+#: unpack-trees.c:109
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
 msgstr ""
-"inga ändringar att checka in (använd \"git add\" och/eller \"git commit -a"
-"\")\n"
+"Dina lokala ändringar av följande filer skulle skrivas över av "
+"sammanslagning:\n"
+"%%sChecka in dina ändringar eller använd \"stash\" innan du byter gren."
 
-#: wt-status.c:1542
+#: unpack-trees.c:111
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "inga ändringar att checka in\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Dina lokala ändringar av följande filer skulle skrivas över av "
+"sammanslagning:\n"
+"%%s"
 
-#: wt-status.c:1545
+#: unpack-trees.c:114
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
 msgstr ""
-"inget köat för incheckning, men ospårade filer finns (spåra med \"git add"
-"\")\n"
+"Dina lokala ändringar av följande filer skulle skrivas över av \"%s\":\n"
+"%%sChecka in dina ändringar eller använd \"stash\" innan du \"%s\"."
 
-#: wt-status.c:1548
+#: unpack-trees.c:116
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "inget köat för incheckning, men ospårade filer finns\n"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Dina lokala ändringar av följande filer skulle skrivas över av \"%s\":\n"
+"%%s"
 
-#: wt-status.c:1551
+#: unpack-trees.c:121
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr "inget att checka in (skapa/kopiera filer och spåra med \"git add\")\n"
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
+msgstr ""
+"Uppdatering av följande kataloger gör att ospårade filer går förlorade i "
+"dem:\n"
+"%s"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:125
 #, c-format
-msgid "nothing to commit\n"
-msgstr "inget att checka in\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle tas bort av utcheckningen:\n"
+"%%sFlytta eller ta bort dem innan du byter gren."
 
-#: wt-status.c:1557
+#: unpack-trees.c:127
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr "inget att checka in (använd -u för att visa ospårade filer)\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle tas bort av utcheckningen:\n"
+"%%s"
 
-#: wt-status.c:1561
+#: unpack-trees.c:130
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "inget att checka in, arbetskatalogen ren\n"
-
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Första incheckning på "
-
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (ingen gren)"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle tas bort av "
+"sammanslagningen:\n"
+"%%sFlytta eller ta bort dem innan du slår samman."
 
-#: wt-status.c:1701
-msgid "gone"
-msgstr "försvunnen"
+#: unpack-trees.c:132
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle tas bort av "
+"sammanslagningen:\n"
+"%%s"
 
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "efter "
+#: unpack-trees.c:135
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle tas bort av \"%s\":\n"
+"%%sFlytta eller ta bort dem innan du \"%s\"."
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "före "
+#: unpack-trees.c:137
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle tas bort av \"%s\":\n"
+"%%s"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: unpack-trees.c:142
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "misslyckades ta bort länken \"%s\""
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
+"utcheckningen:\n"
+"%%sFlytta eller ta bort dem innan du byter gren."
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<flaggor>] [--] <sökväg>..."
+#: unpack-trees.c:144
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
+"utcheckningen:\n"
+"%%s"
 
-#: builtin/add.c:65
+#: unpack-trees.c:147
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "diff-status %c förväntades inte"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
+"sammanslagningen:\n"
+"%%sFlytta eller ta bort dem innan du byter gren."
 
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "misslyckades uppdatera filer"
+#: unpack-trees.c:149
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
+"sammanslagningen:\n"
+"%%s"
 
-#: builtin/add.c:81
+#: unpack-trees.c:152
 #, c-format
-msgid "remove '%s'\n"
-msgstr "ta bort \"%s\"\n"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle skrivas över av \"%s\":\n"
+"%%sFlytta eller ta bort dem innan du \"%s\"."
 
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Oköade ändringar efter att ha uppdaterat indexet:"
+#: unpack-trees.c:154
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Följande ospårade filer i arbetskatalogen skulle skrivas över av \"%s\":\n"
+"%%s"
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Kunde inte läsa indexet"
+#: unpack-trees.c:161
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Posten \"%s\" överlappar \"%s\". Kan inte binda."
 
-#: builtin/add.c:207
+#: unpack-trees.c:164
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Kunde inte öppna \"%s\" för skrivning"
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"Kan inte uppdatera gles utcheckning: följande poster är inte àjour:\n"
+"%s"
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "Kunde inte skriva patch"
+#: unpack-trees.c:166
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Följande filer i arbetskatalogen skulle skrivas över av uppdatering av gles "
+"utcheckning:\n"
+"%s"
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "redigering av patch misslyckades"
+#: unpack-trees.c:168
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Följande filer i arbetskatalogen skulle tas bort av uppdatering av gles "
+"utcheckning:\n"
+"%s"
 
-#: builtin/add.c:217
+#: unpack-trees.c:170
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Kunde inte ta status på \"%s\""
+msgid ""
+"Cannot update submodule:\n"
+"%s"
+msgstr ""
+"Kan inte uppdatera undermodul:\n"
+"%s"
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "Tom patch. Avbryter."
+#: unpack-trees.c:247
+#, c-format
+msgid "Aborting\n"
+msgstr "Avbryter\n"
 
-#: builtin/add.c:224
+#: unpack-trees.c:272
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Kunde inte tillämpa \"%s\""
+msgid "submodule update strategy not supported for submodule '%s'"
+msgstr "uppdateringsstrategi för undermodul stöds inte för undermodulen \"%s\""
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\n"
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "Checkar ut filer"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "testkörning"
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "ogiltig URL-schemanamn eller saknat \"://\"-suffix"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "var pratsam"
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "ogiltig %XX-teckensekvens"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "plocka interaktivt"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "värd saknas och schemat är inte \"file:\""
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "välj stycken interaktivt"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "en \"file:\"-URL kan inte innehålla portnummer"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "redigera aktuell diff och applicera"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "ogiltiga tecken i värdnamnet"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "tillåt lägga till annars ignorerade filer"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "felaktigt portnummer"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "uppdatera spårade filer"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "felaktigt \"..\"-sökvägssegment"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "registrera endast att sökvägen kommer läggas till senare"
+#: worktree.c:285
+#, c-format
+msgid "failed to read '%s'"
+msgstr "misslyckades läsa \"%s\""
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr "lägg till ändringar från alla spårade och ospårade filer"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "kunde inte öppna \"%s\" för läsning och skrivning"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "ignorera sökvägar borttagna i arbetskatalogen (samma som --no-all)"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "kunde inte öppna \"%s\" för skrivning"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "lägg inte till, uppdatera endast indexet"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "kunde inte öppna \"%s\" för läsning"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "hoppa bara över filer som inte kan läggas till på grund av fel"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
+msgstr "kan inte komma åt \"%s\""
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "se om - även saknade - filer ignoreras i testkörning"
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "kan inte hämta aktuell arbetskatalog"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: wrapper.c:634
+#, c-format
+msgid "could not write to %s"
+msgstr "kunde inte skriva till %s"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "överstyr exekveringsbiten för angivna filer"
+#: wrapper.c:636
+#, c-format
+msgid "could not close %s"
+msgstr "kunde inte stänga %s"
+
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Ej sammanslagna sökvägar:"
 
-#: builtin/add.c:292
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Använd -f om du verkligen vill lägga till dem.\n"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (använd \"git reset %s <fil>...\" för att ta bort från kö)"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "misslyckades lägga till filer"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (använd \"git rm --cached <fil>...\" för att ta bort från kö)"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A och -u är ömsesidigt inkompatibla"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (använd \"git add <fil>...\" för att ange lösning)"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr "  (använd \"git add/rm <fil>...\" som lämpligt för att ange lösning)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "--chmod-parametern \"%s\" måste antingen vara -x eller +x"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (använd \"git rm <fil>...\" för att ange lösning)"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Inget angivet, inget tillagt.\n"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "Ändringar att checka in:"
 
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Kanske menade du att skriva \"git add .\"?\n"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "Ändringar ej i incheckningskön:"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "indexfilen trasig"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr ""
+"  (använd \"git add <fil>...\" för att uppdatera vad som skall checkas in)"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "Kunde inte skriva ny indexfil"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr ""
+"  (använd \"git add/rm <fil>...\" för att uppdatera vad som skall checkas in)"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "kunde inte läsa \"%s\""
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (använd \"git checkout -- <fil>...\" för att förkasta ändringar i "
+"arbetskatalogen)"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "kunde inte tolka författarskript"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (checka in eller förkasta ospårat eller ändrat innehåll i undermoduler)"
 
-#: builtin/am.c:503
+#: wt-status.c:238
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "\"%s\" togs bort av kroken applypatch-msg"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr ""
+"  (använd \"git %s <fil>...\" för att ta med i det som skall checkas in)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Felaktig indatarad: \"%s\"."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "borttaget av bägge:"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "tillagt av oss:"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "\"fseek\" misslyckades"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "borttaget av dem:"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "kunde inte tolka patchen \"%s\""
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "tillagt av dem:"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Endast en StGIT-patchserie kan tillämpas åt gången"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "borttaget av oss:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "ogiltig tidsstämpel"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "tillagt av bägge:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "ogiltig \"Date\"-rad"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "ändrat av bägge:"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "ogiltig tidszons-offset"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "ny fil:"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Misslyckades detektera patchformat."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "kopierad:"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "misslyckades skapa katalogen \"%s\""
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "borttagen:"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Misslyckades dela patchar."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "ändrad:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "kan inte skriva indexfil"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "namnbytt:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "När du har löst problemet, kör \"%s --continue\"."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "typbyte:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "Om du hellre vill hoppa över patchen, kör \"%s --skip\" i stället."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "okänd:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr ""
-"För att återgå till ursprunglig gren och sluta patcha, kör \"%s --abort\"."
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "osammanslagen:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Patchen är tom. Delades den upp felaktigt?"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "nya incheckningar, "
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "ogiltig ident-rad: %s"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "ändrat innehåll, "
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "kunde inte tolka incheckningen %s"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "ospårat innehåll, "
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
-"Arkivet saknar objekt som behövs för att falla tillbaka på 3-"
-"vägssammanslagning."
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "Undermoduler ändrade men inte uppdaterade:"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Använder indexinfo för att återskapa ett basträd..."
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "Undermodulers ändringar att checka in:"
 
-#: builtin/am.c:1623
+#: wt-status.c:914
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
-"Har du handredigerat din patch?\n"
-"Den kan inte tillämpas på blobbar som antecknats i dess index."
+"Rör inte raden ovan.\n"
+"Allt nedan kommer tas bort."
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-"Faller tillbaka på att patcha grundversionen och trevägssammanslagning..."
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "Du har ej sammanslagna sökvägar."
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "Misslyckades slå ihop ändringarna."
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (rätta konflikter och kör \"git commit\")"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree misslyckades skriva ett träd"
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (använd \"git merge --abort\" för att avbryta sammanslagningen)"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "tillämpar på en tom historik"
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "Alla konflikter har rättats men du är fortfarande i en sammanslagning."
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "kunde inte skriva incheckningsobjekt"
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (använd \"git commit\" för att slutföra sammanslagningen)"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "kan inte återuppta: %s finns inte."
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "Du är i mitten av en körning av \"git am\"."
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"kan inte vara interaktiv om standard in inte är ansluten till en terminal."
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "Aktuell patch är tom."
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "Incheckningskroppen är:"
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git am --continue\")"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Tillämpa? Y=ja/N=nej/E=redigera/V=visa patch/A=godta alla: "
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (använd \"git am --skip\" för att hoppa över patchen)"
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Smutsigt index: kan inte tillämpa patchar (smutsiga: %s)"
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (använd \"git am --abort\" för att återställa ursprungsgrenen)"
 
-#: builtin/am.c:1853 builtin/am.c:1925
-#, c-format
-msgid "Applying: %.*s"
-msgstr "Tillämpar: %.*s"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "git-rebase-todo saknas."
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Inga ändringar -- Patchen har redan tillämpats."
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "Inga kommandon utförda."
 
-#: builtin/am.c:1877
+#: wt-status.c:1194
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Patch misslyckades på %s %.*s"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Sista kommandot utfört (%d kommando utfört):"
+msgstr[1] "Sista kommandot utfört (%d kommandon utfört):"
 
-#: builtin/am.c:1883
+#: wt-status.c:1205
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "En kopia av patchen som misslyckades finns i: %s"
-
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Inga ändringar - glömde du använda \"git add\"?\n"
-"Om det inte är något kvar att köa kan det hända att något annat redan\n"
-"introducerat samma ändringar; kanske du bör hoppa över patchen."
+msgid "  (see more in file %s)"
+msgstr "  (se fler i filen %s)"
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr ""
-"Du har fortfarande sökvägar som inte slagits samman i ditt index.\n"
-"Glömde du använda \"git add\"?"
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "Inga kommandon återstår."
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1213
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Kan inte tolka objektet \"%s\""
-
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "misslyckades städa upp indexet"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Nästa kommando att utföra (%d kommando återstår):"
+msgstr[1] "Följande kommandon att utföra (%d kommandon återstår):"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-"Du verkar ha flyttat HEAD sedan \"am\" sist misslyckades.\n"
-"Återställer inte till ORIG_HEAD"
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (använd \"git rebase --edit-todo\" för att visa och redigera)"
 
-#: builtin/am.c:2192
+#: wt-status.c:1234
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Felaktigt värde för --patch-format: %s"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Du håller på att ombasera grenen \"%s\" ovanpå \"%s\"."
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<flaggor>] [(<mbox>|<Maildir>)...]"
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "Du håller på med en ombasering."
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<flaggor>] (--continue | --skip | --abort)"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git rebase --continue\")"
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "kör interaktivt"
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (använd \"git rebase --skip\" för att hoppa över patchen)"
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "historisk flagga -- no-op"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (använd \"git rebase --abort\" för att checka ut ursprungsgrenen)"
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "tillåt falla tillbaka på trevägssammanslagning om nödvändigt"
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (alla konflikter rättade: kör \"git rebase --continue\")"
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "var tyst"
+#: wt-status.c:1267
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Du håller på att dela upp en incheckning medan du ombaserar grenen \"%s\" "
+"ovanpå \"%s\"."
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "lägg till \"Signed-off-by\"-rad i incheckningsmeddelandet"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Du håller på att dela upp en incheckning i en ombasering."
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "koda om till utf8 (standard)"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (Så fort din arbetskatalog är ren, kör \"git rebase --continue\")"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "sänd flaggan -k till git-mailinfo"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Du håller på att redigera en incheckning medan du ombaserar grenen \"%s\" "
+"ovanpå \"%s\"."
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "sänd flaggan -b till git-mailinfo"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr "Du håller på att redigera en incheckning under en ombasering."
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "sänd flaggan -m till git-mailinfo"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr ""
+"  (använd \"git commit --amend\" för att lägga till på aktuell incheckning)"
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "sänd flaggan --keep-cr till git-mailsplit för mbox-formatet"
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (använd \"git rebase --continue\" när du är nöjd med dina ändringar)"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "sänd inte flaggan --keep-cr till git-mailsplit oberoende av am.keepcr"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Du håller på med en \"cherry-pick\" av incheckningen %s."
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "ta bort allting före en saxlinje"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "åtgärd"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr "  (alla konflikter rättade: kör \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "sänd det genom git-apply"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (använd \"git cherry-pick --abort\" för att avbryta \"cherry-pick\"-"
+"operationen)"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "rot"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Du håller på med att ångra incheckningen %s."
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "sökväg"
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git revert --continue\")"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134
-#: builtin/pull.c:193 builtin/repack.c:181 builtin/repack.c:185
-#: builtin/show-branch.c:645 builtin/show-ref.c:175 builtin/tag.c:340
-#: parse-options.h:132 parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (alla konflikter rättade: kör \"git revert --continue\")"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "antal"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (använd \"git revert --abort\" för att avbryta ångrandet)"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "format"
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Du håller på med en \"bisect\", startad från grenen \"%s\"."
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "format för patch(ar)"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "Du håller på med en \"bisect\"."
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "överstyr felmeddelanden när patchfel uppstår"
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr ""
+"  (använd \"git bisect reset\" för att komma tillbaka till ursprungsgrenen)"
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "fortsätt applicera patchar efter att ha löst en konflikt"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "På grenen "
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "synonymer till --continue"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "interaktiv ombasering pågår; ovanpå"
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "hoppa över den aktuella grenen"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "ombasering pågår; ovanpå"
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "återställ originalgrenen och avbryt patchningen."
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "HEAD frånkopplad vid "
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "ljug om incheckningsdatum"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "HEAD frånkopplad från "
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "använd nuvarande tidsstämpel för författardatum"
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "Inte på någon gren för närvarande."
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "nyckel-id"
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "Första incheckning"
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "GPG-signera incheckningar"
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "Ospårade filer"
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(används internt av git-rebase)"
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "Ignorerade filer"
 
-#: builtin/am.c:2326
+#: wt-status.c:1599
+#, c-format
 msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
 msgstr ""
-"Flaggan -b/--binary har varit utan funktion länge, och\n"
-"kommer tas bort. Vi ber dig att inte använda den längre."
-
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "misslyckades läsa indexet"
+"Det tog %.2f sekunder att räkna upp ospårade filer. \"status -uno\"\n"
+"kan gå snabbare, men du måste vara försiktig så du inte glömmer\n"
+"lägga till nya filer själv (se \"git help status\")."
 
-#: builtin/am.c:2348
+# %s är nästa sträng eller tom.
+#: wt-status.c:1605
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "tidigare rebase-katalog %s finns fortfarande, men mbox angavs."
+msgid "Untracked files not listed%s"
+msgstr "Ospårade filer visas ej%s"
 
-#: builtin/am.c:2372
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-"Kvarbliven katalog %s hittades.\n"
-"Använd \"git am --abort\" för att ta bort den."
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr " (använd flaggan -u för att visa ospårade filer)"
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Lösningsoperation pågår inte, vi återupptar inte."
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "Inga ändringar"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<flaggor>] [<patch>...]"
+#: wt-status.c:1618
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"inga ändringar att checka in (använd \"git add\" och/eller \"git commit -a"
+"\")\n"
 
-#: builtin/apply.c:153
+#: wt-status.c:1621
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "okänt alternativ för whitespace: \"%s\""
+msgid "no changes added to commit\n"
+msgstr "inga ändringar att checka in\n"
 
-#: builtin/apply.c:169
+#: wt-status.c:1624
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "okänt alternativ för ignore-whitespace: \"%s\""
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"inget köat för incheckning, men ospårade filer finns (spåra med \"git add"
+"\")\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1627
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Kan inte förbereda reguljärt uttryck för tidsstämpeln %s"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "inget köat för incheckning, men ospårade filer finns\n"
 
-#: builtin/apply.c:863
+#: wt-status.c:1630
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec returnerade %d för indata: %s"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr "inget att checka in (skapa/kopiera filer och spåra med \"git add\")\n"
 
-#: builtin/apply.c:947
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "kan inte hitta filnamn i patchen på rad %d"
+msgid "nothing to commit\n"
+msgstr "inget att checka in\n"
 
-#: builtin/apply.c:984
+#: wt-status.c:1636
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr "git apply: dålig git-diff - förväntade /dev/null, fick %s på rad %d"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "inget att checka in (använd -u för att visa ospårade filer)\n"
 
-#: builtin/apply.c:989
+#: wt-status.c:1640
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply: dålig git-diff - motsägande nytt filnamn på rad %d"
+msgid "nothing to commit, working tree clean\n"
+msgstr "inget att checka in, arbetskatalogen ren\n"
+
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "Första incheckning på "
+
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD (ingen gren)"
+
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "efter "
+
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "före "
 
-#: builtin/apply.c:990
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply: dålig git-diff - motsägande gammalt filnamn på rad %d"
+msgid "cannot %s: You have unstaged changes."
+msgstr "kan inte %s: Du har oköade ändringar."
+
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
+msgstr "dessutom innehåller dit index ändringar som inte har checkats in."
 
-#: builtin/apply.c:995
+#: wt-status.c:2288
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: dålig git-diff - förväntade /dev/null på rad %d"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "kan inte %s: Ditt index innehåller ändringar som inte checkats in."
 
-#: builtin/apply.c:1489
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: förväntade rad: %.*s"
+msgid "failed to unlink '%s'"
+msgstr "misslyckades ta bort länken \"%s\""
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<flaggor>] [--] <sökväg>..."
 
-#: builtin/apply.c:1550
+#: builtin/add.c:80
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "patch-fragment utan huvud på rad %d: %.*s"
+msgid "unexpected diff status %c"
+msgstr "diff-status %c förväntades inte"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "misslyckades uppdatera filer"
 
-#: builtin/apply.c:1567
+#: builtin/add.c:95
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"git-diff-huvudet saknar filnamnsinformation när %d ledande sökvägskomponent\n"
-"tas bort (rad %d)"
-msgstr[1] ""
-"git-diff-huvudet saknar filnamnsinformation när %d ledande "
-"sökvägskomponenter\n"
-"tas bort (rad %d)"
+msgid "remove '%s'\n"
+msgstr "ta bort \"%s\"\n"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "ny fil beror på gammalt innehåll"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Oköade ändringar efter att ha uppdaterat indexet:"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "borttagen fil har fortfarande innehåll"
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "Kunde inte läsa indexet"
 
-#: builtin/apply.c:1774
+#: builtin/add.c:220
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "trasig patch på rad %d"
+msgid "Could not open '%s' for writing."
+msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "nya filen %s beror på gammalt innehåll"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Kunde inte skriva patch"
 
-#: builtin/apply.c:1812
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "borttagna filen %s har fortfarande innehåll"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "redigering av patch misslyckades"
 
-#: builtin/apply.c:1815
+#: builtin/add.c:230
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** varning: filen %s blir tom men har inte tagits bort"
+msgid "Could not stat '%s'"
+msgstr "Kunde inte ta status på \"%s\""
 
-#: builtin/apply.c:1962
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "trasig binärpatch på rad %d: %.*s"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Tom patch. Avbryter."
 
-#: builtin/apply.c:1999
+#: builtin/add.c:237
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "binärpatchen på rad %d känns inte igen"
+msgid "Could not apply '%s'"
+msgstr "Kunde inte tillämpa \"%s\""
 
-#: builtin/apply.c:2154
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "patch med bara skräp på rad %d"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\n"
 
-#: builtin/apply.c:2244
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "kunde inte läsa symboliska länken %s"
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "testkörning"
 
-#: builtin/apply.c:2248
-#, c-format
-msgid "unable to open or read %s"
-msgstr "kunde inte öppna eller läsa %s"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "plocka interaktivt"
 
-#: builtin/apply.c:2901
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "felaktig inledning på rad: \"%c\""
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "välj stycken interaktivt"
 
-#: builtin/apply.c:3020
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "Stycke %d lyckades på %d (offset %d rad)."
-msgstr[1] "Stycke %d lyckades på %d (offset %d rader)."
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "redigera aktuell diff och applicera"
 
-#: builtin/apply.c:3032
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Sammanhang reducerat till (%ld/%ld) för att tillämpa fragment vid %d"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "tillåt lägga till annars ignorerade filer"
+
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "uppdatera spårade filer"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "registrera endast att sökvägen kommer läggas till senare"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "lägg till ändringar från alla spårade och ospårade filer"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "ignorera sökvägar borttagna i arbetskatalogen (samma som --no-all)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "lägg inte till, uppdatera endast indexet"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "hoppa bara över filer som inte kan läggas till på grund av fel"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "se om - även saknade - filer ignoreras i testkörning"
+
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "överstyr exekveringsbiten för angivna filer"
 
-#: builtin/apply.c:3038
+#: builtin/add.c:305
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"vid sökning efter:\n"
-"%.*s"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Använd -f om du verkligen vill lägga till dem.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "misslyckades lägga till filer"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A och -u är ömsesidigt inkompatibla"
 
-#: builtin/apply.c:3060
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "saknar binära patchdata för \"%s\""
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run"
 
-#: builtin/apply.c:3163
+#: builtin/add.c:359
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "binärpatchen kan inte tillämpas på \"%s\""
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod-parametern \"%s\" måste antingen vara -x eller +x"
 
-#: builtin/apply.c:3169
+#: builtin/add.c:374
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "binärpatchen på \"%s\" ger felaktigt resultat (förväntade %s, fick %s)"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Inget angivet, inget tillagt.\n"
 
-#: builtin/apply.c:3190
+#: builtin/add.c:375
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "patch misslyckades: %s:%ld"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Kanske menade du att skriva \"git add .\"?\n"
 
-#: builtin/apply.c:3314
-#, c-format
-msgid "cannot checkout %s"
-msgstr "kan inte checka ut %s"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "indexfilen trasig"
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "läser från \"%s\" som är på andra sidan av en symbolisk länk"
+#: builtin/am.c:412
+msgid "could not parse author script"
+msgstr "kunde inte tolka författarskript"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
+#: builtin/am.c:489
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "sökvägen %s har ändrat namn/tagits bort"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "\"%s\" togs bort av kroken applypatch-msg"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
+#: builtin/am.c:530
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: finns inte i indexet"
+msgid "Malformed input line: '%s'."
+msgstr "Felaktig indatarad: \"%s\"."
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
+#: builtin/am.c:567
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
+
+#: builtin/am.c:593
+msgid "fseek failed"
+msgstr "\"fseek\" misslyckades"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
+#: builtin/am.c:777
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: motsvarar inte indexet"
+msgid "could not parse patch '%s'"
+msgstr "kunde inte tolka patchen \"%s\""
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "patch för borttagning lämnar kvar filinnehåll"
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Endast en StGIT-patchserie kan tillämpas åt gången"
 
-#: builtin/apply.c:3669
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s: fel typ"
+#: builtin/am.c:889
+msgid "invalid timestamp"
+msgstr "ogiltig tidsstämpel"
 
-#: builtin/apply.c:3671
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s har typen %o, förväntade %o"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
+msgstr "ogiltig \"Date\"-rad"
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
-#, c-format
-msgid "invalid path '%s'"
-msgstr "ogiltig sökväg: %s"
+#: builtin/am.c:897
+msgid "invalid timezone offset"
+msgstr "ogiltig tidszons-offset"
 
-#: builtin/apply.c:3879
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s: finns redan i indexet"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
+msgstr "Misslyckades detektera patchformat."
 
-#: builtin/apply.c:3882
+#: builtin/am.c:991 builtin/clone.c:397
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: finns redan i arbetskatalogen"
+msgid "failed to create directory '%s'"
+msgstr "misslyckades skapa katalogen \"%s\""
 
-#: builtin/apply.c:3902
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o)"
+#: builtin/am.c:995
+msgid "Failed to split patches."
+msgstr "Misslyckades dela patchar."
 
-#: builtin/apply.c:3907
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o) för %s"
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "kan inte skriva indexfil"
 
-#: builtin/apply.c:3927
+#: builtin/am.c:1178
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "den berörda filen \"%s\" är på andra sidan av en symbolisk länk"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "När du har löst problemet, kör \"%s --continue\"."
 
-#: builtin/apply.c:3931
+#: builtin/am.c:1179
 #, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: patchen kan inte tillämpas"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Om du hellre vill hoppa över patchen, kör \"%s --skip\" i stället."
 
-#: builtin/apply.c:3945
+#: builtin/am.c:1180
 #, c-format
-msgid "Checking patch %s..."
-msgstr "Kontrollerar patchen %s..."
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"För att återgå till ursprunglig gren och sluta patcha, kör \"%s --abort\"."
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "make_cache_entry misslyckades för sökvägen \"%s\""
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Patchen är tom. Delades den upp felaktigt?"
 
-#: builtin/apply.c:4182
+#: builtin/am.c:1386 builtin/log.c:1557
 #, c-format
-msgid "unable to remove %s from index"
-msgstr "kan inte ta bort %s från indexet"
+msgid "invalid ident line: %s"
+msgstr "ogiltig ident-rad: %s"
 
-#: builtin/apply.c:4215
+#: builtin/am.c:1413
 #, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "trasig patch för undermodulen %s"
+msgid "unable to parse commit %s"
+msgstr "kunde inte tolka incheckningen %s"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "kan inte ta status på nyligen skapade filen \"%s\""
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"Arkivet saknar objekt som behövs för att falla tillbaka på 3-"
+"vägssammanslagning."
 
-#: builtin/apply.c:4224
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "kan inte skapa säkerhetsminne för nyligen skapade filen %s"
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
+msgstr "Använder indexinfo för att återskapa ett basträd..."
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "kan inte lägga till cachepost för %s"
+#: builtin/am.c:1627
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Har du handredigerat din patch?\n"
+"Den kan inte tillämpas på blobbar som antecknats i dess index."
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "stänger filen \"%s\""
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
+msgstr ""
+"Faller tillbaka på att patcha grundversionen och trevägssammanslagning..."
 
-#: builtin/apply.c:4313
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "kan inte skriva filen \"%s\" läge %o"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
+msgstr "Misslyckades slå ihop ändringarna."
+
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree misslyckades skriva ett träd"
+
+#: builtin/am.c:1689
+msgid "applying to an empty history"
+msgstr "tillämpar på en tom historik"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "kunde inte skriva incheckningsobjekt"
+
+#: builtin/am.c:1735 builtin/am.c:1739
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Tillämpade patchen %s rent."
+msgid "cannot resume: %s does not exist."
+msgstr "kan inte återuppta: %s finns inte."
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "internt fel"
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"kan inte vara interaktiv om standard in inte är ansluten till en terminal."
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1760
+msgid "Commit Body is:"
+msgstr "Incheckningskroppen är:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "Tillämpa? Y=ja/N=nej/E=redigera/V=visa patch/A=godta alla: "
+
+#: builtin/am.c:1820
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Tillämpade patchen %%s med %d refuserad..."
-msgstr[1] "Tillämpade patchen %%s med %d refuserade..."
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Smutsigt index: kan inte tillämpa patchar (smutsiga: %s)"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1860 builtin/am.c:1932
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "trunkerar .rej-filnamnet till %.*s.rej"
+msgid "Applying: %.*s"
+msgstr "Tillämpar: %.*s"
 
-#: builtin/apply.c:4432
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
+msgstr "Inga ändringar -- Patchen har redan tillämpats."
+
+#: builtin/am.c:1884
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "kan inte öppna %s: %s"
+msgid "Patch failed at %s %.*s"
+msgstr "Patch misslyckades på %s %.*s"
 
-#: builtin/apply.c:4445
+#: builtin/am.c:1890
 #, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Stycke %d tillämpades rent."
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "En kopia av patchen som misslyckades finns i: %s"
+
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Inga ändringar - glömde du använda \"git add\"?\n"
+"Om det inte är något kvar att köa kan det hända att något annat redan\n"
+"introducerat samma ändringar; kanske du bör hoppa över patchen."
+
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Du har fortfarande sökvägar som inte slagits samman i ditt index.\n"
+"Glömde du använda \"git add\"?"
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Refuserar stycke %d."
+msgid "Could not parse object '%s'."
+msgstr "Kan inte tolka objektet \"%s\""
+
+#: builtin/am.c:2102
+msgid "failed to clean index"
+msgstr "misslyckades städa upp indexet"
+
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Du verkar ha flyttat HEAD sedan \"am\" sist misslyckades.\n"
+"Återställer inte till ORIG_HEAD"
 
-#: builtin/apply.c:4537
+#: builtin/am.c:2199
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "Ignorerar patch \"%s\"."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Felaktigt värde för --patch-format: %s"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "indata känns inte igen"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<flaggor>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "kan inte läsa indexfilen"
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<flaggor>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way utanför arkiv"
+#: builtin/am.c:2239
+msgid "run interactively"
+msgstr "kör interaktivt"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index utanför arkiv"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
+msgstr "historisk flagga -- no-op"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached utanför arkiv"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
+msgstr "tillåt falla tillbaka på trevägssammanslagning om nödvändigt"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "kan inte öppna patchen \"%s\""
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "var tyst"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "undertryckte %d fel i blanksteg"
-msgstr[1] "undertryckte %d fel i blanksteg"
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
+msgstr "lägg till \"Signed-off-by\"-rad i incheckningsmeddelandet"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d rad lägger till fel i blanksteg."
-msgstr[1] "%d rader lägger till fel i blanksteg."
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
+msgstr "koda om till utf8 (standard)"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "tillämpa inte ändringar som motsvarar given sökväg"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
+msgstr "sänd flaggan -k till git-mailinfo"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "tillämpa ändringar som motsvarar given sökväg"
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
+msgstr "sänd flaggan -b till git-mailinfo"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "ta bort <antal> inledande snedstreck från traditionella diff-sökvägar"
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
+msgstr "sänd flaggan -m till git-mailinfo"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "ignorera tillägg gjorda av patchen"
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "sänd flaggan --keep-cr till git-mailsplit för mbox-formatet"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "istället för att tillämpa patchen, skriv ut diffstat för indata"
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr "sänd inte flaggan --keep-cr till git-mailsplit oberoende av am.keepcr"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "visa antal tillagda och borttagna rader decimalt"
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
+msgstr "ta bort allting före en saxlinje"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "istället för att tillämpa patchen, skriv ut en summering av indata"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
+msgstr "sänd det genom git-apply"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "istället för att tillämpa patchen, se om patchen kan tillämpas"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "se till att patchen kan tillämpas på aktuellt index"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "format"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "tillämpa en patch utan att röra arbetskatalogen"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
+msgstr "format för patch(ar)"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "godta en patch som rör filer utanför arbetskatalogen"
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
+msgstr "överstyr felmeddelanden när patchfel uppstår"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "tillämpa också patchen (använd med --stat/--summary/--check)"
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
+msgstr "fortsätt applicera patchar efter att ha löst en konflikt"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
+msgstr "synonymer till --continue"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
+#: builtin/am.c:2303
+msgid "skip the current patch"
+msgstr "hoppa över den aktuella grenen"
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "sökvägar avdelas med NUL-tecken"
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
+msgstr "återställ originalgrenen och avbryt patchningen."
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "se till att åtminstone <n> rader sammanhang är lika"
+#: builtin/am.c:2310
+msgid "lie about committer date"
+msgstr "ljug om incheckningsdatum"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "detektera nya eller ändrade rader som har fel i blanktecken"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
+msgstr "använd nuvarande tidsstämpel för författardatum"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignorera ändringar i blanktecken för sammanhang"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "nyckel-id"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "tillämpa patchen baklänges"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
+msgstr "GPG-signera incheckningar"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "förvänta inte minst en rad sammanhang"
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
+msgstr "(används internt av git-rebase)"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "lämna refuserade stycken i motsvarande *.rej-filer"
+#: builtin/am.c:2333
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"Flaggan -b/--binary har varit utan funktion länge, och\n"
+"kommer tas bort. Vi ber dig att inte använda den längre."
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "tillåt överlappande stycken"
+#: builtin/am.c:2340
+msgid "failed to read the index"
+msgstr "misslyckades läsa indexet"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut"
+#: builtin/am.c:2355
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "tidigare rebase-katalog %s finns fortfarande, men mbox angavs."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "lite inte på antalet linjer i styckehuvuden"
+#: builtin/am.c:2379
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Kvarbliven katalog %s hittades.\n"
+"Använd \"git am --abort\" för att ta bort den."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "lägg till <rot> i alla filnamn"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Lösningsoperation pågår inte, vi återupptar inte."
+
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<flaggor>] [<patch>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4033,11 +5101,6 @@ msgstr "git archive: förväntade ACK/NAK, fick EOF"
 msgid "git archive: NACK %s"
 msgstr "git archive: NACK %s"
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "fjärrfel: %s"
-
 #: builtin/archive.c:64
 msgid "git archive: protocol error"
 msgstr "git archive: protokollfel"
@@ -4066,116 +5129,162 @@ msgstr "git blame [<flaggor>] [<rev-flaggor>] [<rev>] [--] <fil>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-flaggor> dokumenteras i git-rev-list(1)"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1777
 msgid "Blaming lines"
 msgstr "Klandra rader"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2573
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2574
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2575
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2576
 msgid "Show work cost statistics"
 msgstr "Visa statistik över arbetskostnad"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2577
 msgid "Force progress reporting"
 msgstr "Tvinga förloppsrapportering"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2578
 msgid "Show output score for blame entries"
 msgstr "Visa utdatapoäng för klandringsposter"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2579
 msgid "Show original filename (Default: auto)"
 msgstr "Visa originalfilnamn (Standard: auto)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2580
 msgid "Show original linenumber (Default: off)"
 msgstr "Visa ursprungligt radnummer (Standard: av)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2581
 msgid "Show in a format designed for machine consumption"
 msgstr "Visa i ett format avsett för maskinkonsumtion"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2582
 msgid "Show porcelain format with per-line commit information"
 msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2583
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Använd samma utdataläge som git-annotate (Standard: av)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2584
 msgid "Show raw timestamp (Default: off)"
 msgstr "Visa rå tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2585
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2586
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2587
 msgid "Show author email instead of name (Default: off)"
 msgstr "Visa författarens e-post istället för namn (Standard: av)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2588
 msgid "Ignore whitespace differences"
 msgstr "Ignorera ändringar i blanksteg"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "Använd en experimentell algoritm för att förbättra diffar"
+
+#: builtin/blame.c:2597
 msgid "Spend extra cycles to find better match"
 msgstr "Slösa extra cykler med att hitta bättre träff"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2598
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Använd revisioner från <fil> istället för att anropa git-rev-list"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2599
 msgid "Use <file>'s contents as the final image"
 msgstr "Använd <fil>s innehåll som slutgiltig bild"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2600 builtin/blame.c:2601
 msgid "score"
 msgstr "poäng"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2600
 msgid "Find line copies within and across files"
 msgstr "Hitta kopierade rader inuti och mellan filer"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2601
 msgid "Find line movements within and across files"
 msgstr "Hitta flyttade rader inuti och mellan filer"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "Process only line range n,m, counting from 1"
 msgstr "Behandla endast radintervallet n,m, med början på 1"
 
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr "--progress kan inte användas med --incremental eller porslinsformat"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2697
 msgid "4 years, 11 months ago"
 msgstr "4 år, 11 månader sedan"
 
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents och --reverse fungerar inte så bra tillsammans."
+
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr "kan inte använda --contents med namn på slutgiltigt incheckningsobjekt"
+
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse och --first-parent tillsammans kräver att du anger senaste "
+"incheckningen"
+
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse --first-parent tillsammans kräver ett intervall på första-förälder-"
+"kedjan"
+
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
+msgstr "sökvägen %s i %s finns inte"
+
+#: builtin/blame.c:2851
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "kan inte läsa objektet %s för sökvägen %s"
+
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "filen %s har bara %lu rad"
+msgstr[1] "filen %s har bara %lu rader"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<flaggor>] [-r | -a] [--merged | --no-merged]"
@@ -4196,7 +5305,11 @@ msgstr "git branch [<flaggor>] (-m | -M) [<gammal_gren>] <ny_gren>"
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<flaggor>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:143
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [<flaggor>] [-r | -a] [--format]"
+
+#: builtin/branch.c:144
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -4205,7 +5318,7 @@ msgstr ""
 "tar bort grenen \"%s\" som har slagits ihop med\n"
 "         \"%s\", men ännu inte slagits ihop med HEAD."
 
-#: builtin/branch.c:147
+#: builtin/branch.c:148
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -4214,12 +5327,12 @@ msgstr ""
 "tar inte bort grenen \"%s\" som inte har slagits ihop med\n"
 "         \"%s\", trots att den har slagits ihop med HEAD."
 
-#: builtin/branch.c:161
+#: builtin/branch.c:162
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Kunde inte slå upp incheckningsobjekt för \"%s\""
 
-#: builtin/branch.c:165
+#: builtin/branch.c:166
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -4228,164 +5341,92 @@ msgstr ""
 "Grenen \"%s\" har inte slagits samman i sin helhet.\n"
 "Om du är säker på att du vill ta bort den, kör \"git branch -D %s\"."
 
-#: builtin/branch.c:178
+#: builtin/branch.c:179
 msgid "Update of config-file failed"
 msgstr "Misslyckades uppdatera konfigurationsfil"
 
-#: builtin/branch.c:206
+#: builtin/branch.c:210
 msgid "cannot use -a with -d"
 msgstr "kan inte ange -a med -d"
 
-#: builtin/branch.c:212
+#: builtin/branch.c:216
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Kunde inte slå upp incheckningsobjekt för HEAD"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Kan inte ta bort grenen \"%s\" som är utcheckad på \"%s\""
 
-#: builtin/branch.c:241
+#: builtin/branch.c:245
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "fjärrspårande grenen \"%s\" hittades inte."
 
-#: builtin/branch.c:242
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "grenen \"%s\" hittades inte."
 
-#: builtin/branch.c:257
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Fel vid borttagning av fjärrspårande grenen \"%s\""
 
-#: builtin/branch.c:258
+#: builtin/branch.c:262
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Fel vid borttagning av grenen \"%s\""
 
-#: builtin/branch.c:265
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Tog bort fjärrspårande grenen %s (var %s).\n"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:270
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Tog bort grenen %s (var %s).\n"
 
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: försvunnen]"
-
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
-
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: bakom %d] "
-
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
-msgstr "[bakom %d] "
-
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: före %d] "
-
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
-msgstr "[före %d] "
-
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: före %d, bakom %d] "
-
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[före %d, bakom %d] "
-
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
-msgstr " **** ogiltig ref ****"
-
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(ingen gren, ombaserar %s)"
-
-#: builtin/branch.c:378
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(ingen gren, \"bisect\" startad på %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD frånkopplat vid %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD frånkopplat från %s)"
-
-#: builtin/branch.c:393
-msgid "(no branch)"
-msgstr "(ingen gren)"
-
-#: builtin/branch.c:544
+#: builtin/branch.c:441
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Grenen %s ombaseras på %s"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:445
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Grenen %s är i en \"bisect\" på %s"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:460
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "kunde inte byta namn på aktuell gren när du inte befinner dig på någon."
 
-#: builtin/branch.c:573
+#: builtin/branch.c:470
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Felaktigt namn på gren: \"%s\""
 
-#: builtin/branch.c:590
+#: builtin/branch.c:487
 msgid "Branch rename failed"
 msgstr "Misslyckades byta namn på gren"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:490
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Bytte bort namn på en felaktigt namngiven gren \"%s\""
 
-#: builtin/branch.c:597
+#: builtin/branch.c:493
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Grenen namnbytt till %s, men HEAD har inte uppdaterats!"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:502
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:518
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4396,200 +5437,217 @@ msgstr ""
 "  %s\n"
 "Rader som inleds med \"%c\" ignoreras.\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:551
 msgid "Generic options"
 msgstr "Allmänna flaggor"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:553
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "visa hash och ärenderad, ange två gånger för uppströmsgren"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:554
 msgid "suppress informational messages"
 msgstr "undertryck informationsmeddelanden"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:555
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "ställ in spårningsläge (se git-pull(1))"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:557
 msgid "change upstream info"
 msgstr "ändra uppströmsinformation"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "upstream"
 msgstr "uppströms"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "change the upstream info"
 msgstr "ändra uppströmsinformationen"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "ta bort uppströmsinformationen"
+
+#: builtin/branch.c:561
 msgid "use colored output"
 msgstr "använd färgad utdata"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:562
 msgid "act on remote-tracking branches"
 msgstr "arbeta på fjärrspårande grenar"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:564 builtin/branch.c:566
 msgid "print only branches that contain the commit"
 msgstr "visa endast grenar som innehåller incheckningen"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "visa endast grenar som inte innehåller incheckningen"
+
+#: builtin/branch.c:570
 msgid "Specific git-branch actions:"
 msgstr "Specifika git-branch-åtgärder:"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:571
 msgid "list both remote-tracking and local branches"
 msgstr "visa både fjärrspårande och lokala grenar"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:573
 msgid "delete fully merged branch"
 msgstr "ta bort helt sammanslagen gren"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:574
 msgid "delete branch (even if not merged)"
 msgstr "ta bort gren (även om inte helt sammanslagen)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:575
 msgid "move/rename a branch and its reflog"
 msgstr "flytta/ta bort en gren och dess reflogg"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:576
 msgid "move/rename a branch, even if target exists"
 msgstr "flytta/ta bort en gren, även om målet finns"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:577
 msgid "list branch names"
 msgstr "lista namn på grenar"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:578
 msgid "create the branch's reflog"
 msgstr "skapa grenens reflogg"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:580
 msgid "edit the description for the branch"
 msgstr "redigera beskrivning för grenen"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:581
 msgid "force creation, move/rename, deletion"
 msgstr "tvinga skapande, flytt/namnändring, borttagande"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:582
 msgid "print only branches that are merged"
 msgstr "visa endast sammanslagna grenar"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:583
 msgid "print only branches that are not merged"
 msgstr "visa endast ej sammanslagna grenar"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:584
 msgid "list branches in columns"
 msgstr "visa grenar i spalter"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
 msgid "key"
 msgstr "nyckel"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
 msgid "field name to sort on"
 msgstr "fältnamn att sortera på"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
 msgid "object"
 msgstr "objekt"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:589
 msgid "print only branches of the object"
 msgstr "visa endast grenar för objektet"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "sortering och filtrering skiljer gemener och VERSALER"
+
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "format att använda för utdata"
+
+#: builtin/branch.c:611
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Misslyckades slå upp HEAD som giltig referens"
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:615 builtin/clone.c:724
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD hittades inte under refs/heads!"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:638
 msgid "--column and --verbose are incompatible"
 msgstr "--column och --verbose är inkompatibla"
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:649 builtin/branch.c:701
 msgid "branch name required"
 msgstr "grennamn krävs"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:677
 msgid "Cannot give description to detached HEAD"
 msgstr "Kan inte beskriva frånkopplad HEAD"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:682
 msgid "cannot edit description of more than one branch"
 msgstr "kan inte redigera beskrivning för mer än en gren"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:689
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Inga incheckningar på grenen \"%s\" ännu"
 
-#: builtin/branch.c:773
+#: builtin/branch.c:692
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Ingen gren vid namnet \"%s\"."
 
-#: builtin/branch.c:788
+#: builtin/branch.c:707
 msgid "too many branches for a rename operation"
 msgstr "för många grenar för namnbyte"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:712
 msgid "too many branches to set new upstream"
 msgstr "för många grenar för att byta uppström"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:716
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 "kunde inte sätta uppström för HEAD till %s när det inte pekar mot någon gren."
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
 msgid "no such branch '%s'"
 msgstr "okänd gren \"%s\""
 
-#: builtin/branch.c:804
+#: builtin/branch.c:723
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "grenen \"%s\" finns inte"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:735
 msgid "too many branches to unset upstream"
 msgstr "för många grenar för att ta bort uppström"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:739
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "kunde inte ta bort uppström för HEAD när det inte pekar mot någon gren."
 
-#: builtin/branch.c:826
+#: builtin/branch.c:745
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Grenen \"%s\" har ingen uppströmsinformation"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:759
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "kan inte skapa \"HEAD\" manuellt"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:765
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "flaggorna -a och -r på \"git branch\" kan inte anges tillsammans med ett "
 "grennamn"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:768
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4598,7 +5656,7 @@ msgstr ""
 "Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track "
 "eller --set-upstream-to\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:785
 #, c-format
 msgid ""
 "\n"
@@ -4609,77 +5667,93 @@ msgstr ""
 "Om du vill göra så att \"%s\" spårar \"%s\" gör du så här:\n"
 "\n"
 
-#: builtin/bundle.c:51
+#: builtin/bundle.c:45
 #, c-format
 msgid "%s is okay\n"
 msgstr "%s är okej\n"
 
-#: builtin/bundle.c:64
+#: builtin/bundle.c:58
 msgid "Need a repository to create a bundle."
 msgstr "Behöver ett arkiv för att skapa ett paket (bundle)."
 
-#: builtin/bundle.c:68
+#: builtin/bundle.c:62
 msgid "Need a repository to unbundle."
 msgstr "Behöver ett arkiv för att packa upp ett paket (bundle)."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<typ>|--textconv) <objekt>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <typ> | --textconv | --filters) [--path=<sökväg>] <objekt>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<typ> kan vara en av: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "visa objekttyp"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "visa objektstorlek"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "avsluta med noll när det inte uppstått något fel"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "visa objektets innehåll snyggt"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
-msgstr "för blob-objekt, kör textconv på objektets innehåll"
+msgstr "för blob-objekt, kör filter på objektets innehåll"
+
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "för blob-objekt, kör filger på objektets innehåll"
+
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "blob"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "använd specifik sökväg för --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "låter -s och -t att fungera med trasiga/sönderskrivna objekt"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "buffra utdata från --batch"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr "visa information och innehåll för objekt som listas på standard in"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "visa information för objekt som listas på standard in"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 "följ symboliska länkar i trädet (använd med --batch eller --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "visa alla objekt med --batch eller --batch-check"
 
@@ -4699,7 +5773,7 @@ msgstr "visa alla attribut som satts på filen"
 msgid "use .gitattributes only from the index"
 msgstr "använd .gitattributes endast från indexet"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "läs filnamn från standard in"
 
@@ -4707,7 +5781,7 @@ msgstr "läs filnamn från standard in"
 msgid "terminate input and output records by a NUL character"
 msgstr "avsluta in- och utdataposter med NUL-tecken"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
 msgid "suppress progress reporting"
 msgstr "undertryck förloppsrapportering"
 
@@ -4797,9 +5871,9 @@ msgid "write the content to temporary files"
 msgstr "skriv innehåll till temporära filer"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
 msgid "string"
 msgstr "sträng"
 
@@ -4811,113 +5885,113 @@ msgstr "när filer skapas, lägg till <sträng> först"
 msgid "copy out the files from named stage"
 msgstr "kopiera ut filer från namngiven etapp"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:27
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [<flaggor>] <gren>"
 
-#: builtin/checkout.c:26
+#: builtin/checkout.c:28
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<flaggor>] [<gren>] -- <fil>..."
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/checkout.c:153 builtin/checkout.c:186
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "sökvägen \"%s\" har inte vår version"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:155 builtin/checkout.c:188
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "sökvägen \"%s\" har inte deras version"
 
-#: builtin/checkout.c:152
+#: builtin/checkout.c:171
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "sökvägen \"%s\" innehåller inte alla nödvändiga versioner"
 
-#: builtin/checkout.c:196
+#: builtin/checkout.c:215
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "sökvägen \"%s\" innehåller inte nödvändiga versioner"
 
-#: builtin/checkout.c:213
+#: builtin/checkout.c:232
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "sökväg \"%s\": kan inte slå ihop"
 
-#: builtin/checkout.c:230
+#: builtin/checkout.c:249
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\""
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "\"%s\" kan inte användas vid uppdatering av sökvägar"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:281 builtin/checkout.c:284
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "\"%s\" kan inte användas med %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:287
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt."
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "sökvägen \"%s\" har inte slagits ihop"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:513
 msgid "you need to resolve your current index first"
 msgstr "du måste lösa ditt befintliga index först"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:644
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Kan inte skapa referenslogg för \"%s\": %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:685
 msgid "HEAD is now at"
 msgstr "HEAD är nu på"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:689 builtin/clone.c:678
 msgid "unable to update HEAD"
 msgstr "kan inte uppdatera HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:693
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Återställ gren \"%s\"\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:696
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Redan på \"%s\"\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:700
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Växlade till och nollställde grenen \"%s\"\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:702 builtin/checkout.c:1090
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Växlade till en ny gren \"%s\"\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:704
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Växlade till grenen \"%s\"\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:755
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... och %d till.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4940,7 +6014,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:780
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4967,151 +6041,151 @@ msgstr[1] ""
 " git branch <nytt_grennamn> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:816
 msgid "internal error in revision walk"
 msgstr "internt fel vid genomgång av revisioner (revision walk)"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:820
 msgid "Previous HEAD position was"
 msgstr "Tidigare position för HEAD var"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:847 builtin/checkout.c:1085
 msgid "You are on a branch yet to be born"
 msgstr "Du är på en gren som ännu inte är född"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:991
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "endast en referens förväntades, %d gavs."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1031 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "felaktig referens: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1060
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "referensen är inte ett träd: %s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1099
 msgid "paths cannot be used with switching branches"
 msgstr "sökvägar kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "\"%s\" kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "\"%s\" kan inte användas med \"%s\""
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1126
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
 msgid "branch"
 msgstr "gren"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1160
 msgid "create and checkout a new branch"
 msgstr "skapa och checka ut en ny gren"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1162
 msgid "create/reset and checkout a branch"
 msgstr "skapa/nollställ och checka ut en gren"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1163
 msgid "create reflog for new branch"
 msgstr "skapa reflogg för ny gren"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1164 builtin/worktree.c:333
 msgid "detach HEAD at named commit"
 msgstr "koppla från HEAD vid namngiven incheckning"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1165
 msgid "set upstream info for new branch"
 msgstr "sätt uppströmsinformation för ny gren"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new-branch"
 msgstr "ny-gren"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new unparented branch"
 msgstr "ny gren utan förälder"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1168
 msgid "checkout our version for unmerged files"
 msgstr "checka ut vår version för ej sammanslagna filer"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1170
 msgid "checkout their version for unmerged files"
 msgstr "checka ut deras version för ej sammanslagna filer"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1172
 msgid "force checkout (throw away local modifications)"
 msgstr "tvinga utcheckning (kasta bort lokala ändringar)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1173
 msgid "perform a 3-way merge with the new branch"
 msgstr "utför en 3-vägssammanslagning för den nya grenen"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1174 builtin/merge.c:234
 msgid "update ignored files (default)"
 msgstr "uppdatera ignorerade filer (standard)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
 msgid "style"
 msgstr "stil"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1176
 msgid "conflict style (merge or diff3)"
 msgstr "konfliktstil (merge eller diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1179
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "begränsa inte sökvägar till endast glesa poster"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1181
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "förutspå \"git checkout <gren-saknas>\""
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1183
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "kontrollera inte om en annan arbetskatalog håller den angivna referensen"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
 msgid "force progress reporting"
 msgstr "tvinga förloppsrapportering"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1224
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B och --orphan är ömsesidigt uteslutande"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1241
 msgid "--track needs a branch name"
 msgstr "--track behöver ett namn på en gren"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1246
 msgid "Missing branch name; try -b"
 msgstr "Grennamn saknas; försök med -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1282
 msgid "invalid path specification"
 msgstr "felaktig sökvägsangivelse"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1289
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5120,12 +6194,12 @@ msgstr ""
 "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt.\n"
 "Ville du checka ut \"%s\" som inte kan lösas som en utcheckning?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1294
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach tar inte en sökväg som argument \"%s\""
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1298
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5165,19 +6239,21 @@ msgstr "Skulle hoppa över arkivet %s\n"
 msgid "failed to remove %s"
 msgstr "misslyckades ta bort %s"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
 "Kommandohjälp:\n"
 "1          - markera en numrerad post\n"
 "foo        - markera post baserad på unikt prefix\n"
-"           - (tomt) markera ingenting"
+"           - (tomt) markera ingenting\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:301 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5186,7 +6262,7 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
 "Kommandohjälp:\n"
 "1          - markera en ensam post\n"
@@ -5195,38 +6271,40 @@ msgstr ""
 "foo        - markera post baserad på unikt prefix\n"
 "-...       - avmarkera specifika poster\n"
 "*          - välj alla poster\n"
-"           - (tomt) avsluta markering"
+"           - (tomt) avsluta markering\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "Vadå (%s)?"
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "Vadå (%s)?\n"
 
-#: builtin/clean.c:653
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ange ignoreringsmönster>>"
 
-#: builtin/clean.c:690
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "VARNING: Hittar inte poster som motsvarar: %s"
 
-#: builtin/clean.c:711
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Välj poster att ta bort"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/clean.c:758
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Ta bort %s [Y=ja / N=nej]?"
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Hej då."
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "Hej då.\n"
 
-#: builtin/clean.c:785
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -5244,62 +6322,63 @@ msgstr ""
 "help                - denna skärm\n"
 "?                   - hjälp för kommandoval"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:818 git-add--interactive.perl:1736
 msgid "*** Commands ***"
 msgstr "*** Kommandon ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:819 git-add--interactive.perl:1733
 msgid "What now"
 msgstr "Vad nu"
 
-#: builtin/clean.c:821
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Skulle ta bort följande post:"
 msgstr[1] "Skulle ta bort följande poster:"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Inga fler filer att städa, avslutar."
 
-#: builtin/clean.c:869
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "skriv inte ut namn på borttagna filer"
 
-#: builtin/clean.c:871
+#: builtin/clean.c:877
 msgid "force"
 msgstr "tvinga"
 
-#: builtin/clean.c:872
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "städa interaktivt"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "ta bort hela kataloger"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "mönster"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "lägg till <mönster> till ignoreringsregler"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "ta även bort ignorerade filer"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "ta endast bort ignorerade filer"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x och -X kan inte användas samtidigt"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:907
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -5307,7 +6386,7 @@ msgstr ""
 "clean.requireForce satt till true, men varken -i, -n eller -f angavs; vägrar "
 "städa"
 
-#: builtin/clean.c:904
+#: builtin/clean.c:910
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -5319,113 +6398,134 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<flaggor>] [--] <arkiv> [<kat>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:80
 msgid "don't create a checkout"
 msgstr "skapa inte någon utcheckning"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "skapa ett naket (\"bare\") arkiv"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:85
 msgid "create a mirror repository (implies bare)"
 msgstr "skapa ett spegelarkiv (implicerar \"bare\")"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:87
 msgid "to clone from a local repository"
 msgstr "för att klona från ett lokalt arkiv"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:89
 msgid "don't use local hardlinks, always copy"
 msgstr "skapa inte lokala hårda länkar, kopiera alltid"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:91
 msgid "setup as shared repository"
 msgstr "skapa som ett delat arkiv"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "sökvägsangivelse"
+
+#: builtin/clone.c:93 builtin/clone.c:97
 msgid "initialize submodules in the clone"
 msgstr "initiera undermoduler i klonen"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:100
 msgid "number of submodules cloned in parallel"
 msgstr "antal undermoduler som klonas parallellt"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:101 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "mallkatalog"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:102 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "katalog att använda mallar från"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
 msgid "reference repository"
 msgstr "referensarkiv"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:108
 msgid "use --reference only while cloning"
 msgstr "använd --reference endast under kloningen"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
 msgid "name"
 msgstr "namn"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:110
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "använd <namn> istället för \"origin\" för att spåra uppströms"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:112
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "checka ut <gren> istället för fjärrens HEAD"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:114
 msgid "path to git-upload-pack on the remote"
 msgstr "sökväg till git-upload-pack på fjärren"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667
-#: builtin/pull.c:201
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "djup"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:116
 msgid "create a shallow clone of that depth"
 msgstr "skapa en grund klon på detta djup"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "tid"
+
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr "skapa en grund klon från en angiven tidpunkt"
+
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "revision"
+
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr "fördjupa historik för grund klon, exkludera revisionen"
+
+#: builtin/clone.c:122
 msgid "clone only one branch, HEAD or --branch"
 msgstr "klona endast en gren, HEAD eller --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:124
 msgid "any cloned submodules will be shallow"
 msgstr "klonade undermoduler kommer vara grunda"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:125 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitkat"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:126 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "separera gitkatalogen från arbetskatalogen"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:127
 msgid "key=value"
 msgstr "nyckel=värde"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:128
 msgid "set config inside the new repository"
 msgstr "ställ in konfiguration i det nya arkivet"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
 msgid "use IPv4 addresses only"
 msgstr "använd endast IPv4-adresser"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
 msgid "use IPv6 addresses only"
 msgstr "använd endast IPv6-adresser"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:268
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5433,57 +6533,42 @@ msgstr ""
 "Kunde inte gissa katalognamn.\n"
 "Ange en katalog på kommandoraden"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "referensarkivet \"%s\" som en länkad utcheckning stöds inte ännu."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "referensarkivet \"%s\" är inte ett lokalt arkiv."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "referensarkivet \"%s\" är grunt"
-
-#: builtin/clone.c:317
+#: builtin/clone.c:321
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "referensarkivet \"%s\" är ympat"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: Kan inte skapa alternativ för \"%s\": %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:393
 #, c-format
 msgid "failed to open '%s'"
 msgstr "misslyckades öppna \"%s\""
 
-#: builtin/clone.c:384
+#: builtin/clone.c:401
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s finns och är ingen katalog"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:415
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "misslyckades ta status på %s\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:437
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "misslyckades skapa länken \"%s\""
 
-#: builtin/clone.c:424
+#: builtin/clone.c:441
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "misslyckades kopiera filen till \"%s\""
 
-#: builtin/clone.c:449
+#: builtin/clone.c:466
 #, c-format
 msgid "done.\n"
 msgstr "klart.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:478
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5493,122 +6578,138 @@ msgstr ""
 "Du kan inspektera det som checkades ut med \"git status\"\n"
 "och försöka checka ut igen med \"git checkout -f HEAD\"\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:555
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Kunde inte hitta fjärrgrenen %s för att klona."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:650
 msgid "remote did not send all necessary objects"
 msgstr "fjärren sände inte alla nödvändiga objekt"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:666
 #, c-format
 msgid "unable to update %s"
 msgstr "kan inte uppdatera %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:715
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "HEAD hos fjärren pekar på en obefintlig referens, kan inte checka ut.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:746
 msgid "unable to checkout working tree"
 msgstr "kunde inte checka ut arbetskatalogen"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:786
 msgid "unable to write parameters to config file"
 msgstr "kunde inte skriva parametrar till konfigurationsfilen"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:849
 msgid "cannot repack to clean up"
 msgstr "kan inte packa om för att städa upp"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:851
 msgid "cannot unlink temporary alternates file"
 msgstr "kunde inte ta bort temporär \"alternates\"-fil"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
 msgid "Too many arguments."
 msgstr "För många argument."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:888
 msgid "You must specify a repository to clone."
 msgstr "Du måste ange ett arkiv att klona."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:901
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "flaggorna --bare och --origin %s är inkompatibla."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:904
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "flaggorna --bare och --separate-git-dir är inkompatibla."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:917
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "arkivet \"%s\" finns inte"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "djupet %s är inte ett positivt tal"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:933
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "destinationssökvägen \"%s\" finns redan och är inte en tom katalog."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:943
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "arbetsträdet \"%s\" finns redan."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "kunde inte skapa inledande kataloger för \"%s\""
 
-#: builtin/clone.c:938
+#: builtin/clone.c:961
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "kunde inte skapa arbetskatalogen \"%s\""
 
-#: builtin/clone.c:956
+#: builtin/clone.c:973
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klonar till ett naket arkiv \"%s\"...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:975
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klonar till \"%s\"...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"clone --recursive är inte kompatibel med --reference och --reference-if-able"
+
+#: builtin/clone.c:1055
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth ignoreras i lokala kloningar; använd file:// istället"
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since ignoreras i lokala kloningar; använd file:// istället"
+
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude ignoreras i lokala kloningar; använd file:// istället"
+
+#: builtin/clone.c:1062
 msgid "source repository is shallow, ignoring --local"
 msgstr "källarkivet är grunt, ignorerar --local"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1067
 msgid "--local is ignored"
 msgstr "--local ignoreras"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1071
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Vet inte hur man klonar %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1126 builtin/clone.c:1134
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1137
 msgid "You appear to have cloned an empty repository."
 msgstr "Du verkar ha klonat ett tomt arkiv."
 
@@ -5748,66 +6849,61 @@ msgstr ""
 "\"git cherry-pick --continue\" kommer därefter att återuppta\n"
 "cherry-pick för återstående incheckningar.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "misslyckades packa upp HEAD:s trädobjekt"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "kunde inte skapa temporär indexfil"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "interaktiv tilläggning misslyckades"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "kan inte uppdatera temporärt index"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Misslyckades uppdatera huvud-cacheträdet"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "kunde inte skriva filen new_index"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "kan inte utföra en delvis incheckning under en sammanslagning."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "kan inte utföra en delvis incheckning under en cherry-pick."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "kan inte läsa indexet"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "kunde inte skriva temporär indexfil"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "incheckningen \"%s\" saknar författarhuvud"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "incheckningen \"%s\" har felformaterat författarhuvud"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "felformad \"--author\"-flagga"
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
-msgstr "felaktigt datumformat: %s"
-
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5815,38 +6911,38 @@ msgstr ""
 "kunde inte välja ett kommentarstecken som inte använts\n"
 "i det befintliga incheckningsmeddelandet"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "kunde inte slå upp incheckningen %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:294
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(läser loggmeddelande från standard in)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "kunde inte läsa logg från standard in"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "kunde inte läsa loggfilen \"%s\""
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "kunde inte läsa SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "kunde inte läsa MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "kunde inte skriva incheckningsmall"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5861,7 +6957,7 @@ msgstr ""
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5876,7 +6972,7 @@ msgstr ""
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5886,7 +6982,7 @@ msgstr ""
 "med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter "
 "incheckningen.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5897,146 +6993,146 @@ msgstr ""
 "med \"%c\" kommer behållas; du kan själv ta bort dem om du vill.\n"
 "Ett tomt meddelande avbryter incheckningen.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sFörfattare: %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDatum:      %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sIncheckare: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Kan inte läsa indexet"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Fel vid byggande av träd"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Ange meddelandet en av flaggorna -m eller -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' är inte 'Namn <epost>' och matchar ingen befintlig författare"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ogiltigt läge för ospårade filer: \"%s\""
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long och -z är inkompatibla"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Kan inte använda både --reset-author och --author"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Du har inget att utöka."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Du är i mitten av en sammanslagning -- kan inte utöka."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Du är i mitten av en cherry-pick -- kan inte utöka."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Endast en av -c/-C/-F/--fixup kan användas."
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author kan endast användas med -C, -c eller --amend."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Endast en av --include/--only/--all/--interactive/--patch kan användas."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "Du måste ange sökvägar tillsammans med --include/--only."
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "Smart... utöka den senaste med smutsigt index."
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Explicita sökvägar angavs utan -i eller -o; antar --only sökvägar..."
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:551
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Felaktigt städningsläge %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "Kan inte ange sökvägar med -a."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "visa koncis status"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "visa information om gren"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "version"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
 msgid "machine-readable output"
 msgstr "maskinläsbar utdata"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "visa status i långt format (standard)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "terminera poster med NUL"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
 msgid "mode"
 msgstr "läge"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "visa ospårade filer, valfria lägen: alla, normal, no. (Standard: all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "visa ignorerade filer"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "när"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6044,201 +7140,201 @@ msgstr ""
 "ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
 "(Default: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "visa ospårade filer i spalter"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "kunde inte slå upp en precis skapad incheckning"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr "kunde inte tolka en precis skapad incheckning"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "frånkopplad HEAD"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr " (rotincheckning)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "undertryck sammanfattning efter framgångsrik incheckning"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "visa diff i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "Alternativ för incheckningsmeddelande"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:409
 msgid "read message from file"
 msgstr "läs meddelande från fil"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "författare"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "överstyr författare för incheckningen"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:357
 msgid "date"
 msgstr "datum"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "överstyr datum för incheckningen"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
 msgid "message"
 msgstr "meddelande"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "incheckningsmeddelande"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
 msgid "commit"
 msgstr "incheckning"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "återanvänd och redigera meddelande från angiven incheckning"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "återanvänd meddelande från angiven incheckning"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "använd autosquash-formaterat meddelande för att fixa angiven incheckning"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "använd autosquash-formaterat meddelande för att slå ihop med angiven "
 "incheckning"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "jag är nu författare av incheckningen (används med -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
 msgid "add Signed-off-by:"
 msgstr "lägg till Signed-off-by:"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "använd angiven mallfil"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "tvinga redigering av incheckning"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "standard"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:412
 msgid "how to strip spaces and #comments from message"
 msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "inkludera status i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
 msgid "GPG sign commit"
 msgstr "GPG-signera incheckning"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "Alternativ för incheckningens innehåll"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "checka in alla ändrade filer"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "lägg till angivna filer till indexet för incheckning"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "lägg till filer interaktivt"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "lägg till ändringar interaktivt"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "checka endast in angivna filer"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "förbigå pre-commit- och commit-msg-krokar"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "visa vad som skulle checkas in"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "lägg till föregående incheckning"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
 msgstr "förbigå post-rewrite-krok"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "ok att registrera en tom ändring"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "ok att registrera en ändring med tomt meddelande"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "kunde inte tolka HEAD:s incheckning"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Trasig MERGE_HEAD-fil (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "kunde inte läsa MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "kunde inte läsa incheckningsmeddelande: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6253,139 +7349,139 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<flaggor>]"
 
-#: builtin/config.c:55
+#: builtin/config.c:56
 msgid "Config file location"
 msgstr "Konfigurationsfilens plats"
 
-#: builtin/config.c:56
+#: builtin/config.c:57
 msgid "use global config file"
 msgstr "använd global konfigurationsfil"
 
-#: builtin/config.c:57
+#: builtin/config.c:58
 msgid "use system config file"
 msgstr "använd systemets konfigurationsfil"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "use repository config file"
 msgstr "använd arkivets konfigurationsfil"
 
-#: builtin/config.c:59
+#: builtin/config.c:60
 msgid "use given config file"
 msgstr "använd angiven konfigurationsfil"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "read config from given blob object"
 msgstr "läs konfiguration från givet blob-objekt"
 
-#: builtin/config.c:61
+#: builtin/config.c:62
 msgid "Action"
 msgstr "Åtgärd"
 
-#: builtin/config.c:62
+#: builtin/config.c:63
 msgid "get value: name [value-regex]"
 msgstr "hämta värde: namn [värde-reguttr]"
 
-#: builtin/config.c:63
+#: builtin/config.c:64
 msgid "get all values: key [value-regex]"
 msgstr "hämta alla värden: nyckel [värde-reguttr]"
 
-#: builtin/config.c:64
+#: builtin/config.c:65
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "hämta värden för reguttr: namn-reguttr [värde-reguttr]"
 
-#: builtin/config.c:65
+#: builtin/config.c:66
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "hämta värde specifikt URL:en: sektion[.var] URL"
 
-#: builtin/config.c:66
+#: builtin/config.c:67
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "ersätt alla motsvarande variabler: namn värde [värde-reguttr]"
 
-#: builtin/config.c:67
+#: builtin/config.c:68
 msgid "add a new variable: name value"
 msgstr "lägg till en ny variabel: namn värde"
 
-#: builtin/config.c:68
+#: builtin/config.c:69
 msgid "remove a variable: name [value-regex]"
 msgstr "ta bort en variabel: namn [värde-reguttr]"
 
-#: builtin/config.c:69
+#: builtin/config.c:70
 msgid "remove all matches: name [value-regex]"
 msgstr "ta bort alla träffar: namn [värde-reguttr]"
 
-#: builtin/config.c:70
+#: builtin/config.c:71
 msgid "rename section: old-name new-name"
 msgstr "byt namn på sektion: gammalt-namn nytt-namn"
 
-#: builtin/config.c:71
+#: builtin/config.c:72
 msgid "remove a section: name"
 msgstr "ta bort en sektion: namn"
 
-#: builtin/config.c:72
+#: builtin/config.c:73
 msgid "list all"
 msgstr "visa alla"
 
-#: builtin/config.c:73
+#: builtin/config.c:74
 msgid "open an editor"
 msgstr "öppna textredigeringsprogram"
 
-#: builtin/config.c:74
+#: builtin/config.c:75
 msgid "find the color configured: slot [default]"
 msgstr "hitta den inställda färgen: slot [default]"
 
-#: builtin/config.c:75
+#: builtin/config.c:76
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "hitta färginställningen: slot [stdout-is-tty]"
 
-#: builtin/config.c:76
+#: builtin/config.c:77
 msgid "Type"
 msgstr "Typ"
 
-#: builtin/config.c:77
+#: builtin/config.c:78
 msgid "value is \"true\" or \"false\""
 msgstr "värdet är \"true\" eller \"false\""
 
-#: builtin/config.c:78
+#: builtin/config.c:79
 msgid "value is decimal number"
 msgstr "värdet är ett decimalt tal"
 
-#: builtin/config.c:79
+#: builtin/config.c:80
 msgid "value is --bool or --int"
 msgstr "värdet är --bool eller --int"
 
-#: builtin/config.c:80
+#: builtin/config.c:81
 msgid "value is a path (file or directory name)"
 msgstr "värdet är en sökväg (fil- eller katalognamn)"
 
-#: builtin/config.c:81
+#: builtin/config.c:82
 msgid "Other"
 msgstr "Andra"
 
-#: builtin/config.c:82
+#: builtin/config.c:83
 msgid "terminate values with NUL byte"
 msgstr "terminera värden med NUL-byte"
 
-#: builtin/config.c:83
+#: builtin/config.c:84
 msgid "show variable names only"
 msgstr "visa endast variabelnamn"
 
-#: builtin/config.c:84
+#: builtin/config.c:85
 msgid "respect include directives on lookup"
 msgstr "respektera inkluderingsdirektiv vid uppslag"
 
-#: builtin/config.c:85
+#: builtin/config.c:86
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr "visa konfigurationskälla (fil, standard in, blob, kommandorad)"
 
-#: builtin/config.c:327
+#: builtin/config.c:328
 msgid "unable to parse default color value"
 msgstr "kan inte tolka standardfärgvärde"
 
-#: builtin/config.c:471
+#: builtin/config.c:472
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -6400,68 +7496,89 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:613
+#: builtin/config.c:615
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "kan inte skapa konfigurationsfilen \"%s\""
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:627
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"kan inte skriva över flera värden med ett ensamt värde\n"
+"       Använd en regexp, --add eller --replace-all för att ändra %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "skriv storlekar i människoläsbart format"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [<options>] [<commit-ish>...]"
 msgstr "git describe [<flaggor>] [<incheckning-igt>...]"
 
-#: builtin/describe.c:18
+#: builtin/describe.c:19
 msgid "git describe [<options>] --dirty"
 msgstr "git describe [<flaggor>] --dirty"
 
-#: builtin/describe.c:217
+#: builtin/describe.c:53
+msgid "head"
+msgstr "huvud"
+
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "lättviktig"
+
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "annoterad"
+
+#: builtin/describe.c:250
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "den annoterade taggen %s inte tillgänglig"
 
-#: builtin/describe.c:221
+#: builtin/describe.c:254
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "den annoterade taggen %s har inget inbäddat namn"
 
-#: builtin/describe.c:223
+#: builtin/describe.c:256
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "taggen \"%s\" är i verkligheten \"%s\" här"
 
-#: builtin/describe.c:250 builtin/log.c:480
+#: builtin/describe.c:283 builtin/log.c:487
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "Objektnamnet är inte giltigt: %s"
 
-#: builtin/describe.c:253
+#: builtin/describe.c:286
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s är inte ett giltigt \"%s\"-objekt"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:303
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "ingen tagg motsvarar \"%s\" exakt"
 
-#: builtin/describe.c:272
+#: builtin/describe.c:305
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "söker för att beskriva %s\n"
 
-#: builtin/describe.c:319
+#: builtin/describe.c:352
 #, c-format
 msgid "finished search at %s\n"
 msgstr "avslutade sökning på %s\n"
 
-#: builtin/describe.c:346
+#: builtin/describe.c:379
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -6470,7 +7587,7 @@ msgstr ""
 "Inga annoterade taggar kan beskriva \"%s\".\n"
 "Det finns dock oannoterade taggar: testa --tags."
 
-#: builtin/describe.c:350
+#: builtin/describe.c:383
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -6479,12 +7596,12 @@ msgstr ""
 "Inga taggar kan beskriva \"%s\".\n"
 "Testa --always, eller skapa några taggar."
 
-#: builtin/describe.c:371
+#: builtin/describe.c:413
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "traverserade %lu incheckningar\n"
 
-#: builtin/describe.c:374
+#: builtin/describe.c:416
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -6493,95 +7610,210 @@ msgstr ""
 "mer än %i taggar hittades; listar de %i senaste\n"
 "gav upp sökningen vid %s\n"
 
-#: builtin/describe.c:396
+#: builtin/describe.c:438
 msgid "find the tag that comes after the commit"
 msgstr "hitta taggen som kommer efter incheckningen"
 
-#: builtin/describe.c:397
+#: builtin/describe.c:439
 msgid "debug search strategy on stderr"
 msgstr "felsök sökstrategin på standard fel"
 
-#: builtin/describe.c:398
+#: builtin/describe.c:440
 msgid "use any ref"
 msgstr "använd alla referenser"
 
-#: builtin/describe.c:399
+#: builtin/describe.c:441
 msgid "use any tag, even unannotated"
 msgstr "använd alla taggar, även oannoterade"
 
-#: builtin/describe.c:400
+#: builtin/describe.c:442
 msgid "always use long format"
 msgstr "använd alltid långt format"
 
-#: builtin/describe.c:401
+#: builtin/describe.c:443
 msgid "only follow first parent"
 msgstr "följ endast första föräldern"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:446
 msgid "only output exact matches"
 msgstr "skriv endast ut exakta träffar"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:448
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "överväg de <n> nyaste taggarna (standard: 10)"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:450
 msgid "only consider tags matching <pattern>"
 msgstr "överväg endast taggar som motsvarar <mönster>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "överväg inte taggar som motsvarar <mönster>"
+
+#: builtin/describe.c:454 builtin/name-rev.c:357
 msgid "show abbreviated commit object as fallback"
 msgstr "visa förkortade incheckningsobjekt som standard"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:455 builtin/describe.c:458
 msgid "mark"
 msgstr "märke"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:456
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "lägg till <märke> på lortigt arbetsträd (standard: \"-dirty\")"
 
-#: builtin/describe.c:430
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr "lägg till <märke> på trasigt arbetsträd (standard: \"-broken\")"
+
+#: builtin/describe.c:477
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long är inkompatibel med --abbrev=0"
 
-#: builtin/describe.c:456
+#: builtin/describe.c:506
 msgid "No names found, cannot describe anything."
 msgstr "Inga namn hittades, kan inte beskriva något."
 
-#: builtin/describe.c:476
+#: builtin/describe.c:549
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty är inkompatibelt med \"commit-ish\"-värden"
 
-#: builtin/diff.c:86
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "--broken är inkompatibelt med \"commit-ish\"-värden"
+
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "\"%s\": inte en normal fil eller symbolisk länk"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "ogiltig flagga: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Inte ett git-arkiv"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objektet \"%s\" som angavs är felaktigt."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "mer än två blobbar angavs: \"%s\""
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "ej hanterat objekt \"%s\" angavs."
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr ""
+"git difftool [<flaggor>] [<incheckning> [<incheckning>]] [--] [<sökväg>...]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "misslyckades: %d"
+
+#: builtin/difftool.c:283
+#, c-format
+msgid "could not read symlink %s"
+msgstr "kunde inte läsa symboliska länken %s"
+
+#: builtin/difftool.c:285
+#, c-format
+msgid "could not read symlink file %s"
+msgstr "kunde inte läsa symbolisk länk-fil %s"
+
+#: builtin/difftool.c:293
+#, c-format
+msgid "could not read object %s for symlink %s"
+msgstr "kunde inte läsa objektet %s för symboliska länken %s"
+
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"kombinerade diff-format (\"-c\" och \"--cc\") stöds inte i\n"
+"katalogdiffläge (\"-d\" och \"--dir-diff\")."
+
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "bägge filerna ändrade: \"%s\" och \"%s\"."
+
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "filen i arbetskatalogen lämnades kvar."
+
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "temporära filer finns i \"%s\"."
+
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "du kanske vill städa eller rädda dem."
+
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "använd \"diff.guitool\" istället för \"diff.tool\""
+
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "utför diff för hela katalogen"
+
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "fråga inte vid start av diff-verktyg"
+
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "använd symboliska länkar i katalogdiffläge"
+
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "<verktyg>"
+
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "använd angivet diff-verktyg"
+
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr "visa en lista över diff-verktyg som kan användas med \"--tool\""
+
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr ""
+"låt \"git-difftool\" avbryta när ett anropat diff-verktyg ger returvärde "
+"skilt från noll"
+
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "<kommando>"
+
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "ange eget kommando för att visa diffar"
+
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "inget <verktyg> angavs för --tool=<verktyg>"
+
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "inget <kommando> angavs för --extcmd=<kommando>"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-flaggor]"
@@ -6650,161 +7882,165 @@ msgstr "git fetch --multiple [<flaggor>] [(<arkiv> | <grupp>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<flaggor>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "hämta från alla fjärrar"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "lägg till i .git/FETCH_HEAD istället för att skriva över"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "sökväg till upload pack på fjärren"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "tvinga överskrivning av lokal gren"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "hämta från flera fjärrar"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "hämta alla taggar och associerade objekt"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "hämta inte alla taggar (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "antal undermoduler som hämtas parallellt"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "rensa fjärrspårande grenar ej längre på fjärren"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "on-demand"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "styr rekursiv hämtning av undermoduler"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "behåll hämtade paket"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "tillåt uppdatering av HEAD-referens"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "fördjupa historik för grund klon"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "fördjupa historik för grund klon baserad på tid"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "konvertera till komplett arkiv"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1440
 msgid "dir"
 msgstr "kat"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "lägg till i början av undermodulens sökvägsutdata"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "standardläge för rekursion"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "tar emot referenser som uppdaterar .git/shallow"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "referenskarta"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "ange referenskarta för \"fetch\""
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "Kunde inte hitta fjärr-referensen HEAD"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:513
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "konfigurationen för fetch.output innehåller ogiltigt värde %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:606
 #, c-format
 msgid "object %s not found"
 msgstr "objektet %s hittades inte"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:610
 msgid "[up to date]"
 msgstr "[àjour]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:623 builtin/fetch.c:703
 msgid "[rejected]"
 msgstr "[refuserad]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:624
 msgid "can't fetch in current branch"
 msgstr "kan inte hämta i aktuell gren"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:633
 msgid "[tag update]"
 msgstr "[uppdaterad tagg]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
 msgid "unable to update local ref"
 msgstr "kunde inte uppdatera lokal ref"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:653
 msgid "[new tag]"
 msgstr "[ny tagg]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:656
 msgid "[new branch]"
 msgstr "[ny gren]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:659
 msgid "[new ref]"
 msgstr "[ny ref]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:698
 msgid "forced update"
 msgstr "tvingad uppdatering"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:703
 msgid "non-fast-forward"
 msgstr "ej snabbspolad"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:748
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s sände inte alla nödvändiga objekt\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:768
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "avvisa %s då grunda rötter inte kan uppdateras"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
 msgid "From %.*s\n"
 msgstr "Från %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6813,55 +8049,55 @@ msgstr ""
 "vissa lokala referenser kunde inte uppdateras; testa att köra\n"
 " \"git remote prune %s\" för att ta bort gamla grenar som står i konflikt"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:921
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s kommer bli dinglande)"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s har blivit dinglande)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:954
 msgid "[deleted]"
 msgstr "[borttagen]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:955 builtin/remote.c:1022
 msgid "(none)"
 msgstr "(ingen)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:978
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Vägrar hämta till aktuell gren %s i ett icke-naket arkiv"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:997
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1000
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Flaggan \"%s\" ignoreras för %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1076
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Vet inte hur man hämtar från %s"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1236
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Hämtar %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Kunde inte hämta %s"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1256
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6869,32 +8105,40 @@ msgstr ""
 "Inget fjärrarkiv angavs. Ange antingen en URL eller namnet på ett\n"
 "fjärrarkiv som nya incheckningar skall hämtas från."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1279
 msgid "You need to specify a tag name."
 msgstr "Du måste ange namnet på en tagg."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "Negativa djup stöds inte i --deepen"
+
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen och --depth är ömsesidigt uteslutande"
+
+#: builtin/fetch.c:1328
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth och --unshallow kan inte användas samtidigt"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1330
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow kan inte användas på ett komplett arkiv"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1352
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all tar inte namnet på ett arkiv som argument"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1354
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kan inte anges med referensspecifikationer"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1365
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Fjärren eller fjärrgruppen finns inte: %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1373
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Kan inte hämta från grupp och ange referensspecifikationer"
 
@@ -6904,23 +8148,23 @@ msgid ""
 msgstr ""
 "git fmt-merge-msg [-m <meddelande>] [--log[=<n>] | --no-log] [--file <fil>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "fyll i loggen med som mest <n> poster från shortlog"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "alias för --log (avråds)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "text"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "inled meddelande med <text>"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "fil att läsa från"
 
@@ -6933,12 +8177,13 @@ msgid "git for-each-ref [--points-at <object>]"
 msgstr "git for-each-ref [--points-at <objekt>]"
 
 #: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<objekt>]]"
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<incheckning>]]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<objekt>]]"
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr ""
+"git for-each-ref [--contains [<incheckning>]] [--no-contains [<incheckning>]]"
 
 #: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
@@ -6960,10 +8205,6 @@ msgstr "citera platshållare passande för Tcl"
 msgid "show only <n> matched refs"
 msgstr "visa endast <n> träffade refs"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "format att använda för utdata"
-
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
 msgstr "visa endast referenser som pekar på objektet"
@@ -6980,65 +8221,69 @@ msgstr "visa endast referenser som ej slagits samman"
 msgid "print only refs which contain the commit"
 msgstr "visa endast referenser som innehåller incheckningen"
 
-#: builtin/fsck.c:519
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "visa endast referenser som inte innehåller incheckningen"
+
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "Kontrollerar objektkataloger"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<flaggor>] [<objekt>...]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "visa onåbara objekt"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "visa dinglande objekt"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "rapportera taggar"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "rapportera rotnoder"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "gör indexojekt till huvudnoder"
 
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "gör refloggar till huvudnoder (standard)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "ta även hänsyn till paket och alternativa objekt"
 
 # Vague original, not networking-related, but rather related to the actual
 # objects in the database.
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "kontrollera endast konnektivitet"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "aktivera striktare kontroll"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr "skriv dinglande objekt i .git/lost-found"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "visa förlopp"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "visa ordrika namn för nåbara objekt"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "Kontrollerar objekt"
 
@@ -7046,17 +8291,17 @@ msgstr "Kontrollerar objekt"
 msgid "git gc [<options>]"
 msgstr "git gc [<flaggor>]"
 
-#: builtin/gc.c:72
+#: builtin/gc.c:78
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "Felaktigt %s: \"%s\""
+msgid "Failed to fstat %s: %s"
+msgstr "Misslyckades ta status (fstat) på %s: %s"
 
-#: builtin/gc.c:139
+#: builtin/gc.c:310
 #, c-format
-msgid "insanely long object directory %.*s"
-msgstr "tokigt lång objektkatalog %.*s"
+msgid "Can't stat %s"
+msgstr "Kan inte ta status på %s"
 
-#: builtin/gc.c:290
+#: builtin/gc.c:319
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7071,38 +8316,43 @@ msgstr ""
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:358
 msgid "prune unreferenced objects"
 msgstr "rensa ej refererade objekt"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:360
 msgid "be more thorough (increased runtime)"
 msgstr "var mer grundlig (ökar körtiden)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:361
 msgid "enable auto-gc mode"
 msgstr "aktivera auto-gc-läge"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:362
 msgid "force running gc even if there may be another gc running"
 msgstr "tvinga gc-körning även om en annan gc kanske körs"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "Kan inte tolka värdet %s för gc.logexpiry"
+
+#: builtin/gc.c:407
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr "Packar arkivet automatiskt i bakgrunden för optimal prestanda.\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:409
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:410
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Se \"git help gc\" för manuell hushållning.\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:431
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -7110,245 +8360,261 @@ msgstr ""
 "gc körs redan på maskinen \"%s\" pid %<PRIuMAX> (använd --force om så inte "
 "är fallet)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:475
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Det finns för många onåbara lösa objekt; kör \"git prune\" för att ta bort "
 "dem."
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<flaggor>] [-e] <mönster> [<rev>...] [[--] <sökväg>...]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: misslyckades skapa tråd. %s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "felaktigt antal trådar angivet (%d) för %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "kunde inte läsa träd (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:829
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "Kunde inte \"grep\" från objekt av typen %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:893
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "flaggan \"%c\" antar ett numeriskt värde"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "kan inte öppna \"%s\""
-
-#: builtin/grep.c:646
+#: builtin/grep.c:980
 msgid "search in index instead of in the work tree"
 msgstr "sök i indexet istället för i arbetskatalogen"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:982
 msgid "find in contents not managed by git"
 msgstr "sök i innehåll som inte hanteras av git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:984
 msgid "search in both tracked and untracked files"
 msgstr "sök i både spårade och ospårade filer"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:986
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorera filer angivna i \".gitignore\""
 
-#: builtin/grep.c:655
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "sök varje undermodul rekursivt"
+
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "basnamn"
+
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "lägg till föräldraprojektets basnamn i utdata"
+
+#: builtin/grep.c:994
 msgid "show non-matching lines"
 msgstr "visa rader som inte träffas"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:996
 msgid "case insensitive matching"
 msgstr "skiftlägesokänslig sökning"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:998
 msgid "match patterns only at word boundaries"
 msgstr "matcha endast mönster vid ordgränser"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:1000
 msgid "process binary files as text"
 msgstr "hantera binärfiler som text"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:1002
 msgid "don't match patterns in binary files"
 msgstr "träffa inte mönster i binärfiler"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:1005
 msgid "process binary files with textconv filters"
 msgstr "hantera binärfiler med textconv-filter"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1007
 msgid "descend at most <depth> levels"
 msgstr "gå som mest ned <djup> nivåer"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1011
 msgid "use extended POSIX regular expressions"
 msgstr "använd utökade POSIX-reguljära uttryck"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1014
 msgid "use basic POSIX regular expressions (default)"
 msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1017
 msgid "interpret patterns as fixed strings"
 msgstr "tolka mönster som fixerade strängar"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1020
 msgid "use Perl-compatible regular expressions"
 msgstr "använd Perlkompatibla reguljära uttryck"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1023
 msgid "show line numbers"
 msgstr "visa radnummer"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1024
 msgid "don't show filenames"
 msgstr "visa inte filnamn"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1025
 msgid "show filenames"
 msgstr "visa filnamn"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1027
 msgid "show filenames relative to top directory"
 msgstr "visa filnamn relativa till toppkatalogen"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1029
 msgid "show only filenames instead of matching lines"
 msgstr "visa endast filnamn istället för träffade rader"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1031
 msgid "synonym for --files-with-matches"
 msgstr "synonym för --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1034
 msgid "show only the names of files without match"
 msgstr "visa endast namn på filer utan träffar"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1036
 msgid "print NUL after filenames"
 msgstr "skriv NUL efter filnamn"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1038
 msgid "show the number of matches instead of matching lines"
 msgstr "visa antal träffar istället för träffade rader"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1039
 msgid "highlight matches"
 msgstr "ljusmarkera träffar"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1041
 msgid "print empty line between matches from different files"
 msgstr "skriv tomma rader mellan träffar från olika filer"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1043
 msgid "show filename only once above matches from same file"
 msgstr "visa filnamn endast en gång ovanför träffar från samma fil"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1046
 msgid "show <n> context lines before and after matches"
 msgstr "visa <n> rader sammanhang före och efter träffar"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1049
 msgid "show <n> context lines before matches"
 msgstr "visa <n> rader sammanhang före träffar"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1051
 msgid "show <n> context lines after matches"
 msgstr "visa <n> rader sammanhang efter träffar"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1053
 msgid "use <n> worker threads"
 msgstr "använd <n> jobbtrådar"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1054
 msgid "shortcut for -C NUM"
 msgstr "genväg för -C NUM"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1057
 msgid "show a line with the function name before matches"
 msgstr "visa en rad med funktionsnamnet före träffen"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1059
 msgid "show the surrounding function"
 msgstr "visa den omkringliggande funktionen"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1062
 msgid "read patterns from file"
 msgstr "läs mönster från fil"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1064
 msgid "match <pattern>"
 msgstr "träffa <mönster>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1066
 msgid "combine patterns specified with -e"
 msgstr "kombinera mönster som anges med -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1078
 msgid "indicate hit with exit status without output"
 msgstr "ange träff med slutstatuskod utan utdata"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1080
 msgid "show only matches from files that match all patterns"
 msgstr "visa endast träffar från filer som träffar alla mönster"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1082
 msgid "show parse tree for grep expression"
 msgstr "visa analysträd för grep-uttryck"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "pager"
 msgstr "bläddrare"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "show matching files in the pager"
 msgstr "visa träffade filer i filbläddraren"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1089
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1153
 msgid "no pattern given."
 msgstr "inget mönster angavs."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr "--no-index och --untracked kan inte användas med revisioner"
+
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
+msgstr "kan inte slå upp revision: %s"
+
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "felaktigt antal trådar angivet (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1251
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "flaggan stöds inte med --recurse-submodules."
+
+#: builtin/grep.c:1280
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached och --untracked kan inte användas med --no-index."
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr "--no-index och --untracked kan inte användas med revisioner."
-
-#: builtin/grep.c:909
+#: builtin/grep.c:1286
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard kan inte användas för spårat innehåll."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1294
 msgid "both --cached and trees are given."
 msgstr "både --cached och träd angavs."
 
@@ -7364,84 +8630,88 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "typ"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "objekttyp"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "skriv objektet till objektdatabasen"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "läs objektet från standard in"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "spara filen som den är utan filer"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 "hasha slumpmässigt skräp för att skapa korrupta objekt för felsökning av Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "hantera filen som om den kom från sökvägen"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "visa alla tillgängliga kommandon"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "uteslut vägledningar"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "lista användbara vägledningar"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "visa manualsida"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "visa manual i webbläsare"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "visa info-sida"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<kommando>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "okänt hjälpformat: %s"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "Misslyckades starta emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "Kunde inte tolka emacsclient-version."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "emacsclient version \"%d\" för gammal (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "exec misslyckades för \"%s\""
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7450,7 +8720,7 @@ msgstr ""
 "\"%s\": sökväg för man-visare som ej stöds.\n"
 "Använd \"man.<verktyg>.cmd\" istället."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7459,427 +8729,440 @@ msgstr ""
 "\"%s\": kommando för man-visare som stöds.\n"
 "Använd \"man.<verktyg>.path\" istället."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "\"%s\": okänd man-visare."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "ingen man-visare hanterade förfrågan"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "ingen info-visare hanterade förfrågan"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Definierar attribut per sökväg"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Git för dagligt bruk i ungefär 20 kommandon"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "En Git-ordlista"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Ange avsiktligen ospårade filer att ignorera"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Ange egenskaper för undermoduler"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Ange versioner och intervall i Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Introduktion till Git (för version 1.5.1 och senare)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Översikt över rekommenderade arbetsflöden med Git"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "De vanliga Git-vägledningarna är:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "användning: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "\"git %s\" är ett alias för \"%s\""
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "användning: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "kunde inte öppna %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "objekttyp stämmer inte överens vid %s"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "emottog inte det förväntade objektet %s"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "objektet %s: förväntad typ %s, såg %s"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "kan inte fylla %d byte"
 msgstr[1] "kan inte fylla %d byte"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "tidigt filslut"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "indataläsfel"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "använde fler byte än tillgängligt"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "paket för stort för nuvarande definition av off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "paket är större än tillåten maximal storlek"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "kunde inte skapa \"%s\""
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:323
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "kan inte öppna paketfilen \"%s\""
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:337
 msgid "pack signature mismatch"
 msgstr "paketsignatur stämmer inte överens"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:339
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "paketversion %<PRIu32> stöds ej"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:357
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "paketet har felaktigt objekt vid index %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:479
 #, c-format
 msgid "inflate returned %d"
 msgstr "inflate returnerade %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:528
 msgid "offset value overflow for delta base object"
 msgstr "indexvärdespill för deltabasobjekt"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:536
 msgid "delta base offset is out of bound"
 msgstr "deltabasindex utanför gränsen"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:544
 #, c-format
 msgid "unknown object type %d"
 msgstr "okänd objekttyp %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:575
 msgid "cannot pread pack file"
 msgstr "kan inte utföra \"pread\" på paketfil"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:577
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "för tidigt slut på paketfilen, %<PRIuMAX> byte saknas"
 msgstr[1] "för tidigt slut på paketfilen, %<PRIuMAX> byte saknas"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:603
 msgid "serious inflate inconsistency"
 msgstr "allvarlig inflate-inkonsekvens"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1-KOLLISION UPPTÄCKT VID %s !"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
 msgid "unable to read %s"
 msgstr "kunde inte läsa %s"
 
 #: builtin/index-pack.c:814
 #, c-format
+msgid "cannot read existing object info %s"
+msgstr "kan inte läsa information om befintligt objekt %s"
+
+#: builtin/index-pack.c:822
+#, c-format
 msgid "cannot read existing object %s"
 msgstr "kan inte läsa befintligt objekt %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:836
 #, c-format
 msgid "invalid blob object %s"
 msgstr "ogiltigt blob-objekt %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:850
 #, c-format
 msgid "invalid %s"
 msgstr "ogiltigt %s"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:853
 msgid "Error in object"
 msgstr "Fel i objekt"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:855
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Inte alla barnobjekt för %s kan nås"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
 msgid "failed to apply delta"
 msgstr "misslyckades tillämpa delta"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Receiving objects"
 msgstr "Tar emot objekt"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Indexing objects"
 msgstr "Skapar index för objekt"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1160
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "paketet är trasigt (SHA1 stämmer inte)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1165
 msgid "cannot fstat packfile"
 msgstr "kan inte utföra \"fstat\" på paketfil"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1168
 msgid "pack has junk at the end"
 msgstr "paket har skräp i slutet"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1179
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "förvirrad bortom vanvett i parse_pack_objects()"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1202
 msgid "Resolving deltas"
 msgstr "Analyserar delta"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1213
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kunde inte skapa tråd: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1255
 msgid "confusion beyond insanity"
 msgstr "förvirrad bortom vanvett"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1261
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "slutfördes med %d lokalt objekt"
 msgstr[1] "slutfördes med %d lokala objekt"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1273
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Oväntad svanschecksumma för %s (trasig disk?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1277
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "paketet har %d oanalyserat delta"
 msgstr[1] "paketet har %d oanalyserade delta"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1301
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "kunde inte utföra \"deflate\" på tillagt objekt (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1377
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "lokalt objekt %s är trasigt"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1403
 msgid "error while closing pack file"
 msgstr "fel vid stängning av paketfil"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1415
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "kan inte ta skriva \"keep\"-fil \"%s\""
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1423
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "akn inte stänga skriven \"keep\"-fil \"%s\""
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1433
 msgid "cannot store pack file"
 msgstr "kan inte spara paketfil"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "kan inte spara indexfil"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1479
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "felaktig pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "trådstöd saknas, ignorerar %s"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1547
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kan inte öppna befintlig paketfil \"%s\""
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1549
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Kan inte öppna befintlig paket-idx-fil för \"%s\""
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1596
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "icke-delta: %d objekt"
 msgstr[1] "icke-delta: %d objekt"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1603
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "kedjelängd = %d: %lu objekt"
 msgstr[1] "kedjelängd = %d: %lu objekt"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1616
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "paketfilnamnet \"%s\" slutar inte med \".pack\""
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
 msgid "bad %s"
 msgstr "felaktig %s"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1737
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin kan inte användas med --stdin"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "--stdin kräver ett git-arkiv"
+
+#: builtin/index-pack.c:1747
 msgid "--verify with no packfile name given"
 msgstr "--verify angavs utan paketfilnamn"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "kan inte ta status på \"%s\""
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "kan inte ta status på mallen \"%s\""
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "kan inte öppna katalogen (opendir) \"%s\""
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "kan inte läsa länk (readlink) \"%s\""
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "kan inte skapa symbolisk länk \"%s\" \"%s\""
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "kan inte kopiera \"%s\" till \"%s\""
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "ignorerar mallen %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "mallarna hittades inte %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "kopierade inte mallar från \"%s\": %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s finns redan"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "kan inte hantera filtyp %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "kan inte flytta %s till %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s finns redan"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Ominitierade befintligt delat Git-arkiv i %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Ominitierade befintligt Git-arkiv i %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Initierade tomt delat Git-arkiv i %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Initierade tomt Git-arkiv i %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7887,25 +9170,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--"
 "shared[=<behörigheter>]] [<katalog>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "behörigheter"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "ange att git-arkivet skall delas bland flera användare"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kan inte skapa katalogen (mkdir) %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kan inte byta katalog (chdir) till %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7914,7 +9197,7 @@ msgstr ""
 "%s (eller --work-tree=<katalog>) inte tillåtet utan att ange %s (eller --git-"
 "dir=<katalog>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kan inte komma åt arbetskatalogen \"%s\""
@@ -7955,107 +9238,104 @@ msgstr "git log [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]"
 msgid "git show [<options>] <object>..."
 msgstr "git show [<flaggor>] <objekt>..."
 
-#: builtin/log.c:84
+#: builtin/log.c:89
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "ogiltig flagga för --decorate: %s"
 
-#: builtin/log.c:139
+#: builtin/log.c:144
 msgid "suppress diff output"
 msgstr "undertryck diff-utdata"
 
-#: builtin/log.c:140
+#: builtin/log.c:145
 msgid "show source"
 msgstr "visa källkod"
 
-#: builtin/log.c:141
+#: builtin/log.c:146
 msgid "Use mail map file"
 msgstr "Använd e-postmappningsfil"
 
-#: builtin/log.c:142
+#: builtin/log.c:147
 msgid "decorate options"
 msgstr "dekoreringsflaggor"
 
-#: builtin/log.c:145
+#: builtin/log.c:150
 msgid "Process line range n,m in file, counting from 1"
 msgstr "Behandla radintervallet n,m i filen, med början på 1"
 
-#: builtin/log.c:241
+#: builtin/log.c:246
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Slututdata: %d %s\n"
 
-#: builtin/log.c:486
+#: builtin/log.c:493
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: felaktig fil"
 
-#: builtin/log.c:500 builtin/log.c:594
+#: builtin/log.c:507 builtin/log.c:601
 #, c-format
 msgid "Could not read object %s"
 msgstr "Kunde inte läsa objektet %s"
 
-#: builtin/log.c:618
+#: builtin/log.c:625
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Okänd typ: %d"
 
-#: builtin/log.c:739
+#: builtin/log.c:746
 msgid "format.headers without value"
 msgstr "format.headers utan värde"
 
-#: builtin/log.c:839
+#: builtin/log.c:846
 msgid "name of output directory is too long"
 msgstr "namnet på utdatakatalogen är för långt"
 
-#: builtin/log.c:854
+#: builtin/log.c:861
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Kan inte öppna patchfilen %s"
 
-#: builtin/log.c:868
+#: builtin/log.c:875
 msgid "Need exactly one range."
 msgstr "Behöver precis ett intervall."
 
-#: builtin/log.c:878
+#: builtin/log.c:885
 msgid "Not a range."
 msgstr "Inte ett intervall."
 
-#: builtin/log.c:984
+#: builtin/log.c:991
 msgid "Cover letter needs email format"
 msgstr "Omslagsbrevet behöver e-postformat"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1071
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "tokigt in-reply-to: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1098
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<flaggor>] [<sedan> | <revisionsintervall>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1148
 msgid "Two output directories?"
 msgstr "Två utdatakataloger?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Okänd incheckning %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1270
 msgid "Could not find exact merge base."
 msgstr "Kunde inte hitta exakt sammanslagningsbas."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1274
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8066,307 +9346,315 @@ msgstr ""
 "Eller så kan du ange basincheckning med --base=<bas-inchecknings-id> "
 "manuellt."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1294
 msgid "Failed to find exact merge base"
 msgstr "Kunde inte hitta exakt sammanslagningsbas"
 
-#: builtin/log.c:1294
+#: builtin/log.c:1305
 msgid "base commit should be the ancestor of revision list"
 msgstr "basincheckningen bör vara förfader till revisionslistan"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1309
 msgid "base commit shouldn't be in revision list"
 msgstr "basincheckningen bör inte vara i revisionslistan"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1358
 msgid "cannot get patch id"
 msgstr "kan inte hämta patch-id"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1415
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "använd [PATCH n/m] även för en ensam patch"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1418
 msgid "use [PATCH] even with multiple patches"
 msgstr "använd [PATCH] även för flera patchar"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1422
 msgid "print patches to standard out"
 msgstr "skriv patcharna på standard ut"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1424
 msgid "generate a cover letter"
 msgstr "generera ett följebrev"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1426
 msgid "use simple number sequence for output file names"
 msgstr "använd enkel nummersekvens för utdatafilnamn"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1427
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1428
 msgid "use <sfx> instead of '.patch'"
 msgstr "använd <sfx> istället för \".patch\""
 
-#: builtin/log.c:1419
+#: builtin/log.c:1430
 msgid "start numbering patches at <n> instead of 1"
 msgstr "börja numrera patchar på <n> istället för 1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1432
 msgid "mark the series as Nth re-roll"
 msgstr "markera serien som N:te försök"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Använd  [RFC PATCH] istället för [PATCH]"
+
+#: builtin/log.c:1437
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Använd [<prefix>] istället för [PATCH]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1440
 msgid "store resulting files in <dir>"
 msgstr "spara filerna i <katalog>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1443
 msgid "don't strip/add [PATCH]"
 msgstr "ta inte bort eller lägg till [PATCH]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1446
 msgid "don't output binary diffs"
 msgstr "skriv inte binära diffar"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1448
 msgid "output all-zero hash in From header"
 msgstr "använd hashvärde med nollor i From-huvud"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1450
 msgid "don't include a patch matching a commit upstream"
 msgstr "ta inte med patchar som motsvarar en uppströmsincheckning"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1452
 msgid "show patch format instead of default (patch + stat)"
 msgstr "visa patchformat istället för standard (patch + stat)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1454
 msgid "Messaging"
 msgstr "E-post"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1455
 msgid "header"
 msgstr "huvud"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1456
 msgid "add email header"
 msgstr "lägg till e-posthuvud"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1457 builtin/log.c:1459
 msgid "email"
 msgstr "epost"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1457
 msgid "add To: header"
 msgstr "Lägg till mottagarhuvud (\"To:\")"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1459
 msgid "add Cc: header"
 msgstr "Lägg till kopiehuvud (\"Cc:\")"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1461
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1462
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "sätt Från-adress till <ident> (eller incheckare om ident saknas)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1464
 msgid "message-id"
 msgstr "meddelande-id"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1465
 msgid "make first mail a reply to <message-id>"
 msgstr "Gör det första brevet ett svar till <meddelande-id>"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1466 builtin/log.c:1469
 msgid "boundary"
 msgstr "gräns"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1467
 msgid "attach the patch"
 msgstr "bifoga patchen"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1470
 msgid "inline the patch"
 msgstr "gör patchen ett inline-objekt"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1474
 msgid "enable message threading, styles: shallow, deep"
 msgstr "aktivera brevtrådning, typer: shallow, deep"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1476
 msgid "signature"
 msgstr "signatur"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1477
 msgid "add a signature"
 msgstr "lägg till signatur"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1478
 msgid "base-commit"
 msgstr "basincheckning"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1479
 msgid "add prerequisite tree info to the patch series"
 msgstr "lägg till förhandskrävd trädinfo i patchserien"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1481
 msgid "add a signature from a file"
 msgstr "lägg till signatur från fil"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1482
 msgid "don't print the patch filenames"
 msgstr "visa inte filnamn för patchar"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1572
 msgid "-n and -k are mutually exclusive."
 msgstr "-n och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix och -k kan inte användas samtidigt."
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1582
 msgid "--name-only does not make sense"
 msgstr "kan inte använda --name-only"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1584
 msgid "--name-status does not make sense"
 msgstr "kan inte använda --name-status"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1586
 msgid "--check does not make sense"
 msgstr "kan inte använda --check"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1616
 msgid "standard output, or directory, which one?"
 msgstr "standard ut, eller katalog, vilken skall det vara?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1618
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Kunde inte skapa katalogen \"%s\""
 
-#: builtin/log.c:1698
+#: builtin/log.c:1712
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "kunde inte läsa signaturfil \"%s\""
 
-#: builtin/log.c:1769
+#: builtin/log.c:1784
 msgid "Failed to create output files"
 msgstr "Misslyckades skapa utdatafiler"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1833
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1887
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "Kunde inte hitta en spårad fjärrgren, ange <uppström> manuellt.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:468
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<flaggor>] [<fil>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:517
 msgid "identify the file status with tags"
 msgstr "identifiera filstatus med taggar"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:519
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "använd små bokstäver för \"anta oförändrade\"-filer"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:521
 msgid "show cached files in the output (default)"
 msgstr "visa cachade filer i utdata (standard)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:523
 msgid "show deleted files in the output"
 msgstr "visa borttagna filer i utdata"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:525
 msgid "show modified files in the output"
 msgstr "visa modifierade filer i utdata"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:527
 msgid "show other files in the output"
 msgstr "visa andra filer i utdata"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:529
 msgid "show ignored files in the output"
 msgstr "visa ignorerade filer i utdata"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:532
 msgid "show staged contents' object name in the output"
 msgstr "visa köat innehålls objektnamn i utdata"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:534
 msgid "show files on the filesystem that need to be removed"
 msgstr "visa filer i filsystemet som behöver tas bort"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:536
 msgid "show 'other' directories' names only"
 msgstr "visa endast namn för \"andra\" kataloger"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:538
 msgid "show line endings of files"
 msgstr "visa radslut i filer"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:540
 msgid "don't show empty directories"
 msgstr "visa inte tomma kataloger"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:543
 msgid "show unmerged files in the output"
 msgstr "visa ej sammanslagna filer i utdata"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:545
 msgid "show resolve-undo information"
 msgstr "visa \"resolve-undo\"-information"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:547
 msgid "skip files matching pattern"
 msgstr "hoppa över filer som motsvarar mönster"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:550
 msgid "exclude patterns are read from <file>"
 msgstr "exkludera mönster som läses från <fil>"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:553
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "läs ytterligare per-katalog-exkluderingsmönster från <fil>"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:555
 msgid "add the standard git exclusions"
 msgstr "lägg till git:s standardexkluderingar"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:558
 msgid "make the output relative to the project top directory"
 msgstr "gör utdata relativ till projektets toppkatalog"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
+msgstr "rekursera ner i undermoduler"
+
+#: builtin/ls-files.c:563
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "om en <fil> inte är indexet, betrakta det som ett fel"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:564
 msgid "tree-ish"
 msgstr "träd-igt"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:565
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr "låtsas att sökvägar borttagna sedan <träd-igt> fortfarande finns"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:567
 msgid "show debugging data"
 msgstr "visa felsökningsutdata"
 
@@ -8380,39 +9668,39 @@ msgstr ""
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<arkiv> [<referenser>...]]"
 
-#: builtin/ls-remote.c:50
+#: builtin/ls-remote.c:52
 msgid "do not print remote URL"
 msgstr "visa inte fjärr-URL"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
 msgid "exec"
 msgstr "exec"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
 msgid "path of git-upload-pack on the remote host"
 msgstr "sökväg till git-upload-pack på fjärren"
 
-#: builtin/ls-remote.c:56
+#: builtin/ls-remote.c:58
 msgid "limit to tags"
 msgstr "begränsa till taggar"
 
-#: builtin/ls-remote.c:57
+#: builtin/ls-remote.c:59
 msgid "limit to heads"
 msgstr "begränsa till huvuden"
 
-#: builtin/ls-remote.c:58
+#: builtin/ls-remote.c:60
 msgid "do not show peeled tags"
 msgstr "visa inte avskalade taggar"
 
-#: builtin/ls-remote.c:60
+#: builtin/ls-remote.c:62
 msgid "take url.<base>.insteadOf into account"
 msgstr "ta hänsyn till url.<bas>.insteadOf"
 
-#: builtin/ls-remote.c:62
+#: builtin/ls-remote.c:64
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr "avsluta med felkod 2 om motsvarande referenser inte hittas"
 
-#: builtin/ls-remote.c:64
+#: builtin/ls-remote.c:66
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "visa underliggande referens och objektet det pekar på"
 
@@ -8420,35 +9708,35 @@ msgstr "visa underliggande referens och objektet det pekar på"
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<flaggor>] <träd-igt> [<sökväg>...]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "visa endast träd"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
 msgstr "rekursera ner i underträd"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "visa träd medan rekursering"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "terminera poster med NUL-byte"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "inkludera objektstorlek"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "visa endast filnamn"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "använd fullständiga sökvägsnamn"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)"
 
@@ -8457,170 +9745,174 @@ msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<flaggor>] [<incheckning>...]"
 
 #: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<flaggor>] <meddelande> HEAD <incheckning>"
-
-#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
 msgid "switch `m' requires a value"
 msgstr "flaggan \"m\" behöver ett värde"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Kunde inte hitta sammanslagningsstrategin \"%s\".\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:141
 #, c-format
 msgid "Available strategies are:"
 msgstr "Tillgängliga strategier är:"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Tillgängliga skräddarsydda strategier är:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:196 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "visa inte en diffstat när sammanslagningen är färdig"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "visa en diffstat när sammanslagningen är färdig"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:200 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(synonym till --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:202 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "lägg till (som mest <n>) poster från shortlog till incheckningsmeddelandet"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:205 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "skapa en ensam incheckning istället för en sammanslagning"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:207 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "utför en incheckning om sammanslagningen lyckades (standard)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:209 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "redigera meddelande innan incheckning"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:210
 msgid "allow fast-forward (default)"
 msgstr "tillåt snabbspolning (standard)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:212 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "avbryt om snabbspolning inte är möjlig"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:216 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "bekräfta att den namngivna incheckningen har en giltig GPG-signatur"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
 msgid "strategy"
 msgstr "strategi"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:218 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "sammanslagningsstrategi att använda"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:219 builtin/pull.c:162
 msgid "option=value"
 msgstr "alternativ=värde"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:220 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "alternativ för vald sammanslagningsstrategi"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "incheckningsmeddelande för (icke snabbspolande) sammanslagning"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:226
 msgid "abort the current in-progress merge"
 msgstr "avbryt den pågående sammanslagningen"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "fortsätt den pågående sammanslagningen"
+
+#: builtin/merge.c:230 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "tillåt sammanslagning av orelaterade historier"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:258
 msgid "could not run stash."
 msgstr "kunde köra stash."
 
-#: builtin/merge.c:260
+#: builtin/merge.c:263
 msgid "stash failed"
 msgstr "stash misslyckades"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:268
 #, c-format
 msgid "not a valid object: %s"
 msgstr "inte ett giltigt objekt: %s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:287 builtin/merge.c:304
 msgid "read-tree failed"
 msgstr "read-tree misslyckades"
 
-#: builtin/merge.c:331
+#: builtin/merge.c:334
 msgid " (nothing to squash)"
 msgstr " (inget att platta till)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:345
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Tillplattningsincheckning -- uppdaterar inte HEAD\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:395
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Inget sammanslagningsmeddelande -- uppdaterar inte HEAD\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "\"%s\" verkar inte peka på en incheckning"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:536
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Felaktig branch.%s.mergeoptions-sträng: %s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "Hanterar inte något annat än en sammanslagning av två huvuden."
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Felaktig flagga för merge-recursive: -X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "kunde inte skriva %s"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Kunde inte läsa från \"%s\""
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Checkar inte in sammanslagningen; använd \"git commit\" för att slutföra "
 "den.\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8636,67 +9928,74 @@ msgstr ""
 "Rader som inleds med \"%c\" kommer ignoreras, och ett tomt meddelande\n"
 "avbryter incheckningen.\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "Tomt incheckningsmeddelande."
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Underbart.\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Kunde inte slå ihop automatiskt; fixa konflikter och checka in resultatet.\n"
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "\"%s\" är inte en incheckning"
-
-#: builtin/merge.c:904
+#: builtin/merge.c:890
 msgid "No current branch."
 msgstr "Inte på någon gren."
 
-#: builtin/merge.c:906
+#: builtin/merge.c:892
 msgid "No remote for the current branch."
 msgstr "Ingen fjärr för aktuell gren."
 
-#: builtin/merge.c:908
+#: builtin/merge.c:894
 msgid "No default upstream defined for the current branch."
 msgstr "Ingen standarduppström angiven för aktuell gren."
 
-#: builtin/merge.c:913
+#: builtin/merge.c:899
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Ingen fjärrspårande gren för %s från %s"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:946
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Felaktigt värde \"%s\" i miljövariabeln \"%s\""
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1020
 #, c-format
 msgid "could not close '%s'"
 msgstr "kunde inte stänga \"%s\""
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1047
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "inte något vi kan slå ihop med %s: %s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1081
 msgid "not something we can merge"
 msgstr "inte något vi kan slå ihop"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "--abort tar inga argument"
+
+#: builtin/merge.c:1150
 msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
+msgstr "Ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
+
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "--continue tar inga argument"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "Ingen sammanslagning pågår (MERGE_HEAD saknas)."
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1182
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8704,7 +10003,7 @@ msgstr ""
 "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
 "Checka in dina ändringar innan du slår ihop."
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1189
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8712,114 +10011,114 @@ msgstr ""
 "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
 "Checka in dina ändringar innan du slår ihop."
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1192
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns)."
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1201
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Du kan inte kombinera --squash med --no-ff."
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1209
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1226
 msgid "Squash commit into empty head not supported yet"
 msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1228
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Icke-snabbspolad incheckning kan inte användas med ett tomt huvud"
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1233
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - inte något vi kan slå ihop"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1235
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Kan endast slå ihop en enda incheckning i ett tomt huvud."
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Incheckningen %s har en obetrodd GPG-signatur som påstås vara gjord av %s."
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 "Incheckningen %s har en felaktig GPG-signatur som påstås vara gjord av %s."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Incheckning %s har inte någon GPG-signatur."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1278
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Incheckningen %s har en korrekt GPG-signatur av %s\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1340
 msgid "refusing to merge unrelated histories"
 msgstr "vägrar slå samman orelaterad historik"
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1349
 msgid "Already up-to-date."
 msgstr "Redan à jour."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1359
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Uppdaterar %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1400
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1407
 #, c-format
 msgid "Nope.\n"
 msgstr "Nej.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1432
 msgid "Already up-to-date. Yeeah!"
 msgstr "Redan à jour. Toppen!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1438
 msgid "Not possible to fast-forward, aborting."
 msgstr "Kan inte snabbspola, avbryter."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1461 builtin/merge.c:1540
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Återspolar trädet till orört...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1465
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Försöker sammanslagningsstrategin %s...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1531
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1533
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Sammanslagning med strategin %s misslyckades.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1542
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Använder %s för att förbereda lösning för hand.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1554
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8845,23 +10144,23 @@ msgstr "git merge-base --is-ancestor <incheckning> <incheckning>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <ref> <incheckning>"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "skriv ut alla gemensamma anfäder"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "hitta anfader för enkel n-vägssammanslagning"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "visa revisioner som inte kan nås från andra"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "är den första anfader till den andra?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "se var <incheckning> grenades av från referensloggen från <ref>"
 
@@ -8873,38 +10172,69 @@ msgstr ""
 "git merge-file [<alternativ>] [-L <namn1> [-L <orig> [-L <namn2>]]] <fil1> "
 "<origfil> <fil2>"
 
-#: builtin/merge-file.c:33
+#: builtin/merge-file.c:32
 msgid "send results to standard output"
 msgstr "sänd resultat till standard ut"
 
-#: builtin/merge-file.c:34
+#: builtin/merge-file.c:33
 msgid "use a diff3 based merge"
 msgstr "använd diff3-baserad sammanslagning"
 
-#: builtin/merge-file.c:35
+#: builtin/merge-file.c:34
 msgid "for conflicts, use our version"
 msgstr "för konflikter, använd vår version"
 
-#: builtin/merge-file.c:37
+#: builtin/merge-file.c:36
 msgid "for conflicts, use their version"
 msgstr "för konflikter, använd deras version"
 
-#: builtin/merge-file.c:39
+#: builtin/merge-file.c:38
 msgid "for conflicts, use a union version"
 msgstr "för konflikter, använd en förenad version"
 
-#: builtin/merge-file.c:42
+#: builtin/merge-file.c:41
 msgid "for conflicts, use this marker size"
 msgstr "för konflikter, använd denna markörstorlek"
 
-#: builtin/merge-file.c:43
+#: builtin/merge-file.c:42
 msgid "do not warn about conflicts"
 msgstr "varna inte om konflikter"
 
-#: builtin/merge-file.c:45
+#: builtin/merge-file.c:44
 msgid "set labels for file1/orig-file/file2"
 msgstr "sätt etiketter för fil1/origfil/fil2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "okänd flagga %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "kunde inte tolka objektet \"%s\""
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "kan inte hantera mer än %d bas. Ignorerar %s."
+msgstr[1] "kan inte hantera mer än %d baser. Ignorerar %s."
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "hanterar inte något annat än en sammanslagning av två huvuden."
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "kunde inte bestämma referensen %s"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Slår ihop %s med %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -8921,136 +10251,140 @@ msgstr "tillåt saknade objekt"
 msgid "allow creation of more than one tree"
 msgstr "tillåt skapa mer än ett träd"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<flaggor>] <källa>... <mål>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "Katalogen %s är i indexet och inte en undermodul?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "Köa dina ändringar i .gitmodules eller använd \"stash\" för att fortsätta"
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s är i indexet"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "tvinga flytta/ändra namn även om målet finns"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "hoppa över fel vid flytt/namnändring"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "destinationen \"%s\" är ingen katalog"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Kontrollerar namnbyte av \"%s\" till \"%s\"\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "felaktig källa"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "kan inte flytta katalog till sig själv"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "kan inte flytta katalog över fil"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "källkatalogen är tom"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "inte versionshanterad"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "destinationen finns"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "skriver över \"%s\""
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "Kan inte skriva över"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "flera källor för samma mål"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "destinationskatalogen finns inte"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, källa=%s, mål=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Byter namn på %s till %s\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "misslyckades byta namn på \"%s\""
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:289
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<flaggor>] <incheckning>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:290
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<flaggor>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:291
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<flaggor>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:346
 msgid "print only names (no SHA-1)"
 msgstr "skriv endast namn (ingen SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:347
 msgid "only use tags to name the commits"
 msgstr "använd endast taggar för att namnge incheckningar"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:349
 msgid "only use refs matching <pattern>"
 msgstr "använd endast referenser som motsvarar <mönster>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "ignorera referenser som motsvarar <mönster>"
+
+#: builtin/name-rev.c:353
 msgid "list all commits reachable from all refs"
 msgstr "lista alla incheckningar som kan nås alla referenser"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:354
 msgid "read from stdin"
 msgstr "läs från standard in"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:355
 msgid "allow to print `undefined` names (default)"
 msgstr "tillåt att skriva \"odefinierade\" namn (standard)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:361
 msgid "dereference tags in the input (internal use)"
 msgstr "avreferera taggar i indata (används internt)"
 
@@ -9185,8 +10519,8 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "kunde inte avsluta \"show\" för objektet \"%s\""
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
-msgstr "Ange innehåll för anteckningen med antingen -m eller -F"
+msgid "please supply the note contents using either -m or -F option"
+msgstr "ange innehåll för anteckningen med antingen -m eller -F"
 
 #: builtin/notes.c:203
 msgid "unable to write note object"
@@ -9194,65 +10528,89 @@ msgstr "kunde inte skriva anteckningsobjekt"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Anteckningens innehåll har lämnats kvar i %s"
+msgid "the note contents have been left in %s"
+msgstr "anteckningens innehåll har lämnats kvar i %s"
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "kunde inte öppna eller läsa \"%s\""
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "kunde inte slå upp \"%s\" som en giltig referens."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Kunde inte läsa objektet \"%s\"."
+msgid "failed to read object '%s'."
+msgstr "kunde inte läsa objektet \"%s\"."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
+msgid "cannot read note data from non-blob object '%s'."
 msgstr "kan inte läsa anteckningsdata från icke-blob-objektet \"%s\"."
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "felaktig indatarad: \"%s\"."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "misslyckades kopiera anteckningar från \"%s\" till \"%s\""
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "vägrar utföra \"%s\" på anteckningar i %s (utanför refs/notes/)"
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
 msgid "too many parameters"
 msgstr "för många parametrar"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid "No note found for object %s."
-msgstr "Inga anteckningar hittades för objektet %s."
+msgid "no note found for object %s."
+msgstr "inga anteckningar hittades för objektet %s."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "anteckningsinnehåll som sträng"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "anteckningsinnehåll i en fil"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "återanvänd och redigera angivet anteckningsobjekt"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "återanvänd angivet anteckningsobjekt"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "tillåt lagra tom anteckning"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "ersätt befintliga anteckningar"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9261,29 +10619,29 @@ msgstr ""
 "Kan inte lägga till anteckningar. Hittade befintliga anteckningar för "
 "objektet %s. Använd \"-f\" för att skriva över befintliga anteckningar"
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Skriver över befintliga anteckningar för objektet %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Tar bort anteckning för objektet %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "läs objekt från standard in"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "läs omskrivningsinställning för <kommando> (implicerar --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "för få parametrar"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9292,12 +10650,12 @@ msgstr ""
 "Kan inte kopiera anteckningar. Hittade befintliga anteckningar för objektet "
 "%s. Använd \"-f\" för att skriva över befintliga anteckningar"
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Anteckningar på källobjektet %s saknas. Kan inte kopiera."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "anteckningar på källobjektet %s saknas. Kan inte kopiera."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9306,20 +10664,52 @@ msgstr ""
 "Flaggorna -m/-F/-c/-C rekommenderas inte för underkommandot \"edit\".\n"
 "Använd \"git notes add -f -m/-F/-c/-C\" istället.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "misslyckades ta bort referensen NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "misslyckades ta bort referensen NOTES_MERGE_REF"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "misslyckades ta bort arbetskatalogen för \"git notes merge\""
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "misslyckades läsa references NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "kunde inte hitta incheckning från NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "kunde inte tolka incheckning från NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "misslyckades bestämma NOTES_MERGE_REF"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "misslyckades färdigställa sammanslagning av anteckningar"
+
+#: builtin/notes.c:754
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "okänd sammanslagningsstrategi för anteckningar: %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:770
 msgid "General options"
 msgstr "Allmänna flaggor"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:772
 msgid "Merge options"
 msgstr "Flaggor för sammanslagning"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:774
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9327,48 +10717,48 @@ msgstr ""
 "läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:776
 msgid "Committing unmerged notes"
 msgstr "Checkar in ej sammanslagna anteckningar"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:778
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 "färdigställ sammanslagning av anteckningar genom att checka in ej "
 "sammanslagna anteckningar"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:780
 msgid "Aborting notes merge resolution"
 msgstr "Avbryt lösning av sammanslagning av anteckningar"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:782
 msgid "abort notes merge"
 msgstr "avbryt sammanslagning av anteckningar"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:793
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "kan inte blanda --commit, --abort eller -s/--strategy"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
-msgstr "Måste ange en antecknings-referens att slå ihop"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
+msgstr "måste ange en antecknings-referens att slå ihop"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:822
 #, c-format
-msgid "Unknown -s/--strategy: %s"
-msgstr "Okänd -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
+msgstr "okänd -s/--strategy: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:859
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Sammanslagning av anteckningar till %s är redan igångsatt på %s"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "sammanslagning av anteckningar till %s är redan igångsatt på %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:862
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
-msgstr "Kunde inte lagra länk till aktuell anteckningsreferens (%s)"
+msgid "failed to store link to current notes ref (%s)"
+msgstr "misslyckades lagra länk till aktuell anteckningsreferens (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:864
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9379,47 +10769,47 @@ msgstr ""
 "%s och checka in resultatet med \"git notes merge --commit\", eller avbryt "
 "sammanslagningen med \"git notes merge --abort\".\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:886
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objektet %s har ingen anteckning\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:898
 msgid "attempt to remove non-existent note is not an error"
 msgstr "försök att ta bort icke-existerande anteckningar är inte ett fel"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:901
 msgid "read object names from the standard input"
 msgstr "läs objektnamn från standard in"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "ta inte bort, bara visa"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:940
 msgid "report pruned notes"
 msgstr "rapportera borttagna anteckningar"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:982
 msgid "notes-ref"
 msgstr "anteckningar-ref"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:983
 msgid "use notes from <notes-ref>"
 msgstr "använd anteckningar från <anteckningsref>"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1018
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Okänt underkommando: %s"
+msgid "unknown subcommand: %s"
+msgstr "okänt underkommando: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [<flaggor>...] [< <reflista> | < <objektlista>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
@@ -9430,174 +10820,170 @@ msgstr ""
 msgid "deflate error (%d)"
 msgstr "fel i deflate (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:770
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "inaktiverar skrivning av bitkarta, paket delas på grund av pack.packSizeLimit"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:783
 msgid "Writing objects"
 msgstr "Skriver objekt"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1063
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "inaktiverar skrivning av bitkarta då några objekt inte packas"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2426
 msgid "Compressing objects"
 msgstr "Komprimerar objekt"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2829
 #, c-format
 msgid "unsupported index version %s"
 msgstr "indexversionen %s stöds ej"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2833
 #, c-format
 msgid "bad index version '%s'"
 msgstr "felaktig indexversion \"%s\""
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2863
 msgid "do not show progress meter"
 msgstr "visa inte förloppsindikator"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2865
 msgid "show progress meter"
 msgstr "visa förloppsindikator"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2867
 msgid "show progress meter during object writing phase"
 msgstr "visa förloppsindikator under objektskrivningsfasen"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2870
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "som --all-progress när förloppsindikatorn visas"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2871
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2872
 msgid "write the pack index file in the specified idx format version"
 msgstr "skriv paketindexfilen i angiven indexformatversion"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2875
 msgid "maximum size of each output pack file"
 msgstr "maximal storlek på varje utdatapaketfil"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2877
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorera lånade objekt från alternativa objektlager"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2879
 msgid "ignore packed objects"
 msgstr "ignorera packade objekt"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2881
 msgid "limit pack window by objects"
 msgstr "begränsa paketfönster efter objekt"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2883
 msgid "limit pack window by memory in addition to object limit"
 msgstr "begränsa paketfönster efter minne förutom objektgräns"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2885
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "maximal längd på deltakedja tillåten i slutligt paket"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2887
 msgid "reuse existing deltas"
 msgstr "återanvänd befintliga delta"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2889
 msgid "reuse existing objects"
 msgstr "återanvänd befintliga objekt"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2891
 msgid "use OFS_DELTA objects"
 msgstr "använd OFS_DELTA-objekt"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2893
 msgid "use threads when searching for best delta matches"
 msgstr "använd trådar vid sökning efter bästa deltaträffar"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2895
 msgid "do not create an empty pack output"
 msgstr "försök inte skapa tom paketutdata"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2897
 msgid "read revision arguments from standard input"
 msgstr "läs revisionsargument från standard in"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2899
 msgid "limit the objects to those that are not yet packed"
 msgstr "begränsa objekt till de som ännu inte packats"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2902
 msgid "include objects reachable from any reference"
 msgstr "inkludera objekt som kan nås från någon referens"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2905
 msgid "include objects referred by reflog entries"
 msgstr "inkludera objekt som refereras från referensloggposter"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2908
 msgid "include objects referred to by the index"
 msgstr "inkludera objekt som refereras från indexet"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2911
 msgid "output pack to stdout"
 msgstr "skriv paket på standard ut"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2913
 msgid "include tag objects that refer to objects to be packed"
 msgstr "inkludera taggobjekt som refererar objekt som skall packas"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2915
 msgid "keep unreachable objects"
 msgstr "behåll onåbara objekt"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2917
 msgid "pack loose unreachable objects"
 msgstr "packa lösa onåbara objekt"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "tid"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2919
 msgid "unpack unreachable objects newer than <time>"
 msgstr "packa upp onåbara objekt nyare än <tid>"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2922
 msgid "create thin packs"
 msgstr "skapa tunna paket"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2924
 msgid "create packs suitable for shallow fetches"
 msgstr "skapa packfiler lämpade för grunda hämtningar"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2926
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorera paket som har tillhörande .keep-fil"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2928
 msgid "pack compression level"
 msgstr "komprimeringsgrad för paket"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2930
 msgid "do not hide commits by grafts"
 msgstr "göm inte incheckningar med ympningar (\"grafts\")"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2932
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "använd bitkartindex om tillgängligt för att räkna objekt snabbare"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2934
 msgid "write a bitmap index together with the pack index"
 msgstr "använd bitkartindex tillsammans med packindexet"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:3061
 msgid "Counting objects"
 msgstr "Räknar objekt"
 
@@ -9625,11 +11011,11 @@ msgstr "Tar bort duplicerade objekt"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "rapportera borttagna objekt"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
 msgstr "låt tid gå ut för objekt äldre än <tid>"
 
@@ -9637,53 +11023,45 @@ msgstr "låt tid gå ut för objekt äldre än <tid>"
 msgid "cannot prune in a precious-objects repo"
 msgstr "kan inte rensa i ett \"precious-objekt\"-arkiv"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Felaktigt värde för %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<flaggor>] [<arkiv> [<refspec>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Alternativ gällande sammanslagning"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "inlemma ändringar genom ombasering i stället för sammanslagning"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
 msgid "allow fast-forward"
 msgstr "tillåt snabbspolning"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "utför automatiskt stash/stash pop före och efter ombasering"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Alternativ gällande hämtningar"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "antal undermoduler som hämtas parallellt"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Felaktigt värde för pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "Kan inte hämta med ombasering: Du har oköade ändringar."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Dessutom innehåller dit index ändringar som inte har checkats in."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"Kan inte hämta med ombasering: Ditt index innehåller oincheckade ändringar."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9691,14 +11069,14 @@ msgstr ""
 "Det finns ingen kandidat för ombasering bland referenserna du precis har "
 "hämtat."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "Det finns ingen kandidat för sammanslagning bland referenserna du precis har "
 "hämtat."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9706,7 +11084,7 @@ msgstr ""
 "Det betyder vanligtvis att du använt en jokertecken-refspec som inte\n"
 "motsvarade något i fjärränden."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9717,42 +11095,42 @@ msgstr ""
 "gren. Eftersom det inte är den fjärr som är konfigurerad som\n"
 "standard för aktuell gren måste du ange en gren på kommandoraden."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Du är inte på någon gren för närvarande."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Ange vilken gren du vill ombasera mot."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Ange vilken gren du vill slå samman med."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Se git-pull(1) för detaljer."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<fjärr>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<gren>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "Det finns ingen spårningsinformation för aktuell gren."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr "Om du vill ange spårningsinformation för grenen kan du göra det med:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9761,19 +11139,27 @@ msgstr ""
 "Dina inställningar anger sammanslagning med referensen \"%s\"\n"
 "från fjärren, men någon sådan referens togs inte emot."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "ignorera --verify-signatures för ombasering"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash är endast giltig med --rebase."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "Uppdaterar en ofödd gren med ändringar som lagts till i indexet."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "pull med ombasering"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "checka in eller använd \"stash\" på dem."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9784,7 +11170,7 @@ msgstr ""
 "snabbspolar din arbetskatalog från\n"
 "incheckningen %s."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9801,11 +11187,11 @@ msgstr ""
 "$ git reset --hard\n"
 "för att återgå."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Kan inte slå ihop flera grenar i ett tomt huvud."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Kan inte ombasera ovanpå flera grenar."
 
@@ -9899,14 +11285,14 @@ msgstr ""
 "aktuella grenen \"%s\", utan att tala om för mig vad som\n"
 "skall sändas för att uppdatera fjärrgrenen."
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Du angav inga referensspecifikationer att sända, och push.default är "
 "\"nothing\"."
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -9918,7 +11304,7 @@ msgstr ""
 "\"git pull ....\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -9930,7 +11316,7 @@ msgstr ""
 "\"git pull ...\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -9944,11 +11330,11 @@ msgstr ""
 "(t.ex. \"git pull ...\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forwards\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "Uppdateringarna avvisades eftersom taggen redan finns på fjärren."
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -9959,22 +11345,22 @@ msgstr ""
 "pekar på något som inte är en incheckning, utan att använda flaggan\n"
 "\"--force\".\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Sänder till %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "misslyckades sända vissa referenser till \"%s\""
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "felaktigt arkiv \"%s\""
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -9995,118 +11381,118 @@ msgstr ""
 "\n"
 "    git push <namn>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "--all och --tags är inkompatibla"
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "--all kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror och --tags är inkompatibla"
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "--all och --mirror är inkompatibla"
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "arkiv"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:162
 msgid "push all refs"
 msgstr "sänd alla referenser"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:164
 msgid "mirror all refs"
 msgstr "spegla alla referenser"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "ta bort referenser"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "sänd taggar (kan inte användas med --all eller --mirror)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:165
 msgid "force updates"
 msgstr "tvinga uppdateringar"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:179
 msgid "refname>:<expect"
 msgstr "refnamn>:<förvänta"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:180
 msgid "require old value of ref to be at this value"
 msgstr "kräv att ref:s tidigare värde är detta"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "styr rekursiv insändning av undermoduler"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:173
 msgid "use thin pack"
 msgstr "använd tunna paket"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
 msgid "receive pack program"
 msgstr "program för att ta emot paket"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "ställ in uppström för git pull/status"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "ta bort lokalt borttagna referenser"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "förbigå pre-push-krok"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "sänd in saknade men relevanta taggar"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:167
 msgid "GPG sign the push"
 msgstr "GPG-signera insändningen"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:174
 msgid "request atomic transaction on remote side"
 msgstr "begär atomiska transaktioner på fjärrsidan"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:170
 msgid "server-specific"
 msgstr "serverspecifik"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:171
 msgid "option to transmit"
 msgstr ""
 "inget att checka in\n"
 "flagga att sända"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete är inkompatibel med --all, --mirror och --tags"
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete kan inte användas utan referenser"
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr "push-flaggor kan inte innehålla radbrytning"
 
-#: builtin/read-tree.c:37
+#: builtin/read-tree.c:40
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -10116,79 +11502,142 @@ msgstr ""
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<fil>] (--empty | <träd-igt1> [<träd-igt2> [<träd-igt3>]])"
 
-#: builtin/read-tree.c:110
+#: builtin/read-tree.c:130
 msgid "write resulting index to <file>"
 msgstr "skriv resulterande index till <fil>"
 
-#: builtin/read-tree.c:113
+#: builtin/read-tree.c:133
 msgid "only empty the index"
 msgstr "töm bara indexet"
 
-#: builtin/read-tree.c:115
+#: builtin/read-tree.c:135
 msgid "Merging"
 msgstr "Sammanslagning"
 
-#: builtin/read-tree.c:117
+#: builtin/read-tree.c:137
 msgid "perform a merge in addition to a read"
 msgstr "utför en sammanslagning i tillägg till en läsning"
 
-#: builtin/read-tree.c:119
+#: builtin/read-tree.c:139
 msgid "3-way merge if no file level merging required"
 msgstr "3-vägssammanslagning om sammanslagning på filnivå ej krävs"
 
-#: builtin/read-tree.c:121
+#: builtin/read-tree.c:141
 msgid "3-way merge in presence of adds and removes"
 msgstr "3-vägssammanslagning när det finns tillägg och borttagningar"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:143
 msgid "same as -m, but discard unmerged entries"
 msgstr "som -m, men kasta bort ej sammanslagna poster"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:144
 msgid "<subdirectory>/"
 msgstr "<underkatalog>/"
 
-#: builtin/read-tree.c:125
+#: builtin/read-tree.c:145
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "läs in trädet i indexet under <underkatalog>/"
 
-#: builtin/read-tree.c:128
+#: builtin/read-tree.c:148
 msgid "update working tree with merge result"
 msgstr "uppdatera arbetskatalogen med resultatet från sammanslagningen"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:150
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:131
+#: builtin/read-tree.c:151
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "tillåt explicit ignorerade filer att skrivas över"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:154
 msgid "don't check the working tree after merging"
 msgstr "kontrollera inte arbetskatalogen efter sammanslagning"
 
-#: builtin/read-tree.c:135
+#: builtin/read-tree.c:155
 msgid "don't update the index or the work tree"
 msgstr "uppdatera inte indexet eller arbetskatalogen"
 
-#: builtin/read-tree.c:137
+#: builtin/read-tree.c:157
 msgid "skip applying sparse checkout filter"
 msgstr "hoppa över att applicera filter för gles utcheckning"
 
-#: builtin/read-tree.c:139
+#: builtin/read-tree.c:159
 msgid "debug unpack-trees"
 msgstr "felsök unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase--helper [<flaggor>]"
+
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "fortsätt ombasering"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "avbryt ombasering"
+
+#: builtin/receive-pack.c:27
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <git-katalog>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Normalt tillåts inte uppdatering av aktuell gren i ett icke-naket\n"
+"arkiv, då index och arbetskatalog inte kommer stämma med det du\n"
+"sände och \"git reset --hard\" krävs för att få arbetskatalogen och\n"
+"HEAD att stämma överens.\n"
+"\n"
+"Du kan ställa in variabeln \"receive.denyCurrentBranch\" till\n"
+"\"ignore\" eller \"warn\" i fjärrarkivet för att tillåta sändning till\n"
+"dess aktuella gren; detta rekommenderas dock inte såvida du inte\n"
+"sett till att dess arbetskatalog uppdateras till det tu sände in\n"
+"på annat sätt.\n"
+"\n"
+"För att undvika detta meddelande och fortfarande behålla det\n"
+"normala beteendet, sätt \"receive.denyCurrentBranch\" till \"refuse\"."
+
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Normalt tillåts inte radering av aktuell gren, eftersom nästa\n"
+"\"git clone\" inte kommer innebära att några filer checkas ut,\n"
+"vilket är förvirrande.\n"
+"\n"
+"Du kan ställa in variabeln \"receive.denyDeleteCurrent\" till\n"
+"\"warn\" eller \"ignore\" i fjärrarkivet för att tillåta borttagning\n"
+"av aktuell gren, med eller utan varningsmeddelande.\n"
+"\n"
+"För att undvika detta meddelande kan du sätta det till \"refuse\"."
+
+#: builtin/receive-pack.c:1888
 msgid "quiet"
 msgstr "tyst"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1902
 msgid "You must specify a directory."
 msgstr "Du måste ange en katalog."
 
@@ -10366,7 +11815,7 @@ msgstr "(matchande)"
 msgid "(delete)"
 msgstr "(ta bort)"
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
 #, c-format
 msgid "No such remote: %s"
 msgstr "Inget sådant fjärrarkiv: %s"
@@ -10397,7 +11846,7 @@ msgstr "misslyckades ta bort \"%s\""
 msgid "creating '%s' failed"
 msgstr "misslyckades skapa \"%s\""
 
-#: builtin/remote.c:792
+#: builtin/remote.c:794
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -10411,376 +11860,390 @@ msgstr[1] ""
 "Observera: Några grenar utanför hierarkin refs/remotes/ togs inte bort;\n"
 "för att ta bort dem, använd:"
 
-#: builtin/remote.c:806
+#: builtin/remote.c:808
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Kunde inte ta bort konfigurationssektionen \"%s\""
 
-#: builtin/remote.c:907
+#: builtin/remote.c:909
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " ny (nästa hämtning sparar i remotes/%s)"
 
-#: builtin/remote.c:910
+#: builtin/remote.c:912
 msgid " tracked"
 msgstr " spårad"
 
-#: builtin/remote.c:912
+#: builtin/remote.c:914
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " förlegad (använd \"git remote prune\" för att ta bort)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:916
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:955
+#: builtin/remote.c:957
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "ogiltig branch.%s.merge; kan inte ombasera över > 1 gren"
 
-#: builtin/remote.c:963
+#: builtin/remote.c:965
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "ombaseras interaktivt på fjärren %s"
 
-#: builtin/remote.c:964
+#: builtin/remote.c:966
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "ombaseras på fjärren %s"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:969
 #, c-format
 msgid " merges with remote %s"
 msgstr " sammanslås med fjärren %s"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:972
 #, c-format
 msgid "merges with remote %s"
 msgstr "sammanslås med fjärren %s"
 
-#: builtin/remote.c:973
+#: builtin/remote.c:975
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s    och med fjärren %s\n"
 
-#: builtin/remote.c:1016
+#: builtin/remote.c:1018
 msgid "create"
 msgstr "skapa"
 
-#: builtin/remote.c:1019
+#: builtin/remote.c:1021
 msgid "delete"
 msgstr "ta bort"
 
-#: builtin/remote.c:1023
+#: builtin/remote.c:1025
 msgid "up to date"
 msgstr "àjour"
 
-#: builtin/remote.c:1026
+#: builtin/remote.c:1028
 msgid "fast-forwardable"
 msgstr "kan snabbspolas"
 
-#: builtin/remote.c:1029
+#: builtin/remote.c:1031
 msgid "local out of date"
 msgstr "lokal föråldrad"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1038
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s tvingar till %-*s (%s)"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s sänder till %-*s (%s)"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1045
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s tvingar till %s"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s sänder till %s"
 
-#: builtin/remote.c:1114
+#: builtin/remote.c:1116
 msgid "do not query remotes"
 msgstr "fråga inte fjärrar"
 
-#: builtin/remote.c:1141
+#: builtin/remote.c:1143
 #, c-format
 msgid "* remote %s"
 msgstr "* fjärr %s"
 
-#: builtin/remote.c:1142
+#: builtin/remote.c:1144
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Hämt-URL: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
 msgid "(no URL)"
 msgstr "(ingen URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  Sänd-URL: %s"
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD-gren: %s"
 
-#: builtin/remote.c:1158
+#: builtin/remote.c:1160
 msgid "(not queried)"
 msgstr "(inte förfrågad)"
 
-#: builtin/remote.c:1160
+#: builtin/remote.c:1162
 msgid "(unknown)"
 msgstr "(okänd)"
 
-#: builtin/remote.c:1164
+#: builtin/remote.c:1166
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  HEAD-gren (HEAD på fjärr är tvetydig, kan vara en av följande):\n"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1178
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Fjärrgren:%s"
 msgstr[1] "  Fjärrgrenar:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1181 builtin/remote.c:1207
 msgid " (status not queried)"
 msgstr " (status inte förfrågad)"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1190
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Lokal gren konfigurerad för \"git pull\":"
 msgstr[1] "  Lokala grenar konfigurerade för \"git pull\":"
 
-#: builtin/remote.c:1196
+#: builtin/remote.c:1198
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokala referenser speglas av \"git push\""
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1204
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Lokal referens konfigurerad för \"git push\"%s:"
 msgstr[1] "  Lokala referenser konfigurerade för \"git push\"%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1225
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1227
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "ta bort refs/remotes/<namn>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1242
 msgid "Cannot determine remote HEAD"
 msgstr "Kan inte bestämma HEAD på fjärren"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1244
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Flera HEAD-grenar på fjärren. Välj en explicit med:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1254
 #, c-format
 msgid "Could not delete %s"
 msgstr "Kunde inte ta bort %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1262
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Inte en giltig referens: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1264
 #, c-format
 msgid "Could not setup %s"
 msgstr "Kunde inte ställa in %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1282
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s kommer bli dinglande!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1283
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s har blivit dinglande!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1293
 #, c-format
 msgid "Pruning %s"
 msgstr "Rensar %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1294
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1310
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [skulle rensa] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1313
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [rensad] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1358
 msgid "prune remotes after fetching"
 msgstr "rensa fjärrar efter hämtning"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Ingen sådan fjärr \"%s\""
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1437
 msgid "add branch"
 msgstr "lägg till gren"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1444
 msgid "no remote specified"
 msgstr "ingen fjärr angavs"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1461
 msgid "query push URLs rather than fetch URLs"
 msgstr "fråga sänd-URL:er istället för hämta-URL:er"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1463
 msgid "return all URLs"
 msgstr "returnera alla URL:er"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1491
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "ingen URL:er angivna för fjärren \"%s\""
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1517
 msgid "manipulate push URLs"
 msgstr "manipulera URL:ar för sändning"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1519
 msgid "add URL"
 msgstr "lägg till URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1521
 msgid "delete URLs"
 msgstr "ta bort URL:ar"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1528
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete ger ingen mening"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1569
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Felaktig gammalt URL-mönster: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1577
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Ingen sådan URL hittades: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1579
 msgid "Will not delete all non-push URLs"
 msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1593
 msgid "be verbose; must be placed before a subcommand"
 msgstr "var pratsam; måste skrivas före ett underkommando"
 
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Okänt underkommando: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<flaggor>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"Inkrementella ompackningar är inte kompatibla med bitmapp-index.\n"
+"Använd --no-write-bitmap-index eller inaktivera inställningen\n"
+"pack.writebitmaps"
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "packa allt i ett enda paket"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "samma som -a, och gör onåbara objekt lösa"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "ta bort överflödiga paket, och kör git-prune-packed"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "sänd --no-reuse-delta till git-pack-objects"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "sänd --no-reuse-object till git-pack-objects"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "kör inte git-update-server-info"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "sänd --local till git-pack-objects"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "skriv bitkartindex"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "cirkadatum"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr "med -A, lös inte upp objekt äldre än detta"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "med -a, packa om onåbara objekt"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
 msgstr "storlek på fönster använt för deltakomprimering"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "byte"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "samma som ovan, men begränsa minnesstorleken istället för postantal"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
 msgstr "begränsa maximalt deltadjup"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "maximal storlek på varje paketfil"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr "packa om objekt i paket märkta med .keep"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "kan inte ta bort paket i ett \"precious-objects\"-arkiv"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable och -A kan inte användas samtidigt"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "misslyckades ta bort \"%s\""
@@ -10805,22 +12268,22 @@ msgstr "git replace -d <objekt>..."
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<format>] [-l [<mönster>]]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
 #, c-format
 msgid "Not a valid object name: '%s'"
 msgstr "Objektnamnet är inte giltigt: \"%s\""
 
-#: builtin/replace.c:355
+#: builtin/replace.c:360
 #, c-format
 msgid "bad mergetag in commit '%s'"
 msgstr "felaktig sammanslagningstagg i incheckningen \"%s\""
 
-#: builtin/replace.c:357
+#: builtin/replace.c:362
 #, c-format
 msgid "malformed mergetag in commit '%s'"
 msgstr "felformad sammanslagningstagg i incheckningen \"%s\""
 
-#: builtin/replace.c:368
+#: builtin/replace.c:373
 #, c-format
 msgid ""
 "original commit '%s' contains mergetag '%s' that is discarded; use --edit "
@@ -10829,45 +12292,45 @@ msgstr ""
 "den ursprungliga incheckningen \"%s\" innehåller sammanslagningstaggen \"%s"
 "\" som har förkastats; använd --edit istället för --graft"
 
-#: builtin/replace.c:401
+#: builtin/replace.c:406
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
 msgstr "den ursprungliga incheckningen \"%s\" har en gpg-signatur."
 
-#: builtin/replace.c:402
+#: builtin/replace.c:407
 msgid "the signature will be removed in the replacement commit!"
 msgstr "signaturen kommer att tas bort i ersättningsincheckningen!"
 
-#: builtin/replace.c:408
+#: builtin/replace.c:413
 #, c-format
 msgid "could not write replacement commit for: '%s'"
 msgstr "kunde inte skriva ersättningsincheckning för: \"%s\""
 
-#: builtin/replace.c:432
+#: builtin/replace.c:437
 msgid "list replace refs"
 msgstr "visa ersättningsreferenser"
 
-#: builtin/replace.c:433
+#: builtin/replace.c:438
 msgid "delete replace refs"
 msgstr "ta bort ersättningsreferenser"
 
-#: builtin/replace.c:434
+#: builtin/replace.c:439
 msgid "edit existing object"
 msgstr "redigera befintligt objekt"
 
-#: builtin/replace.c:435
+#: builtin/replace.c:440
 msgid "change a commit's parents"
 msgstr "ändra en inchecknings föräldrar"
 
-#: builtin/replace.c:436
+#: builtin/replace.c:441
 msgid "replace the ref if it exists"
 msgstr "ersätt referensen om den finns"
 
-#: builtin/replace.c:437
+#: builtin/replace.c:442
 msgid "do not pretty-print contents for --edit"
 msgstr "använd inte snygg visning av innehåll för --edit"
 
-#: builtin/replace.c:438
+#: builtin/replace.c:443
 msgid "use this format"
 msgstr "använd detta format"
 
@@ -10886,8 +12349,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<incheckning>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <träd-igt> [--] <sökvägar>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<träd-igt>] [--] <sökvägar>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11006,27 +12469,27 @@ msgstr "Kunde inte återställa indexfilen till versionen \"%s\"."
 msgid "Could not write new index file."
 msgstr "Kunde inte skriva ny indexfil."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list stöder inte visning av anteckningar"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:393
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<options>] -- [<argument>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:398
 msgid "keep the `--` passed as an arg"
 msgstr "behåll \"--\" sänt som argument"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:400
 msgid "stop parsing after the first non-option argument"
 msgstr "sluta tolka efter första argument som inte är flagga"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:403
 msgid "output in stuck long form"
 msgstr "utdata fast i lång form"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:534
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11057,68 +12520,72 @@ msgstr "git cherry-pick [<flaggor>] <incheckning-igt>..."
 msgid "git cherry-pick <subcommand>"
 msgstr "git cherry-pick <underkommando>"
 
-#: builtin/revert.c:71
+#: builtin/revert.c:89
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s: %s kan inte användas med %s"
 
-#: builtin/revert.c:80
+#: builtin/revert.c:98
 msgid "end revert or cherry-pick sequence"
 msgstr "avsluta revert- eller cherry-pick-sekvens"
 
-#: builtin/revert.c:81
+#: builtin/revert.c:99
 msgid "resume revert or cherry-pick sequence"
 msgstr "återuppta revert- eller cherry-pick-sekvens"
 
-#: builtin/revert.c:82
+#: builtin/revert.c:100
 msgid "cancel revert or cherry-pick sequence"
 msgstr "avbryt revert- eller cherry-pick-sekvens"
 
-#: builtin/revert.c:83
+#: builtin/revert.c:101
 msgid "don't automatically commit"
 msgstr "checka inte in automatiskt"
 
-#: builtin/revert.c:84
+#: builtin/revert.c:102
 msgid "edit the commit message"
 msgstr "redigera incheckningsmeddelandet"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "nummer på förälder"
+#: builtin/revert.c:105
+msgid "parent-number"
+msgstr "nummer-på-förälder"
 
-#: builtin/revert.c:89
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "välj förälder för huvudlinje"
+
+#: builtin/revert.c:108
 msgid "merge strategy"
 msgstr "sammanslagningsstrategi"
 
-#: builtin/revert.c:90
+#: builtin/revert.c:109
 msgid "option"
 msgstr "alternativ"
 
-#: builtin/revert.c:91
+#: builtin/revert.c:110
 msgid "option for merge strategy"
 msgstr "alternativ för sammanslagningsstrategi"
 
-#: builtin/revert.c:100
+#: builtin/revert.c:119
 msgid "append commit name"
 msgstr "lägg till incheckningsnamn"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:121
 msgid "preserve initially empty commits"
 msgstr "behåll incheckningar som börjar som tomma"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:122
 msgid "allow commits with empty messages"
 msgstr "tillåt incheckningar med tomt meddelande"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:123
 msgid "keep redundant, empty commits"
 msgstr "behåll redundanta, tomma incheckningar"
 
-#: builtin/revert.c:192
+#: builtin/revert.c:211
 msgid "revert failed"
 msgstr "\"revert\" misslyckades"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:224
 msgid "cherry-pick failed"
 msgstr "\"cherry-pick\" misslyckades"
 
@@ -11126,29 +12593,7 @@ msgstr "\"cherry-pick\" misslyckades"
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<flaggor>] [--] <fil>..."
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"följande undermodul (eller en av dess nästlade undermoduler)\n"
-"använder en .git-katalog:"
-msgstr[1] ""
-"följande undermoduler (eller en av deras nästlade undermoduler)\n"
-"använder en .git-katalog:"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11160,7 +12605,7 @@ msgstr[0] ""
 msgstr[1] ""
 "följande filer har köat innehåll som skiljer sig både från filen och HEAD:"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11168,13 +12613,13 @@ msgstr ""
 "\n"
 "(använd -f för att tvinga borttagning)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
 msgstr[0] "följande fil har ändringar köade i indexet:"
 msgstr[1] "följande filer har ändringar köade i indexet:"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11182,42 +12627,47 @@ msgstr ""
 "\n"
 "(använd --cached för att behålla filen eller -f för att tvinga borttagning)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "följande fil har lokala ändringar:"
 msgstr[1] "följande filer har lokala ändringar:"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "lista inte borttagna filer"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "ta bara bort från indexet"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "överstyr àjour-testet"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "tillåt rekursiv borttagning"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "avsluta med nollstatus även om inget träffades"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "tar inte bort \"%s\" rekursivt utan -r"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm: kan inte ta bort %s"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "kunde inte ta bort \"%s\""
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11230,19 +12680,19 @@ msgstr ""
 "[<ref>...]\n"
 "  --all och explicit angiven <ref> är ömsesidigt uteslutande."
 
-#: builtin/send-pack.c:160
+#: builtin/send-pack.c:161
 msgid "remote name"
 msgstr "fjärrnamn"
 
-#: builtin/send-pack.c:171
+#: builtin/send-pack.c:175
 msgid "use stateless RPC protocol"
 msgstr "använd tillståndslöst RPC-protokoll"
 
-#: builtin/send-pack.c:172
+#: builtin/send-pack.c:176
 msgid "read refs from stdin"
 msgstr "läs referenser från standard in"
 
-#: builtin/send-pack.c:173
+#: builtin/send-pack.c:177
 msgid "print status from remote helper"
 msgstr "visa status från fjärrhjälpare"
 
@@ -11250,23 +12700,27 @@ msgstr "visa status från fjärrhjälpare"
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr "Gruppera efter incheckare istället för författare"
+
+#: builtin/shortlog.c:250
 msgid "sort output according to the number of commits per author"
 msgstr "sortera utdata enligt antal incheckningar per författare"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:252
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr "Undertryck beskrivningar, visa bara antal incheckningar"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:254
 msgid "Show the email address of each author"
 msgstr "Visa e-postadress för varje författare"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:255
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:256
 msgid "Linewrap output"
 msgstr "Radbryt utdata"
 
@@ -11286,70 +12740,126 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<bas>]] [--list] [<ref>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "ignorerar %s; kan inte hantera mer än %d referens"
+msgstr[1] "ignorerar %s; kan inte hantera mer än %d referenser"
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr "inga motsvarande referenser med %s"
+
+#: builtin/show-branch.c:632
 msgid "show remote-tracking and local branches"
 msgstr "visa fjärrspårande och lokala grenar"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:634
 msgid "show remote-tracking branches"
 msgstr "visa fjärrspårande grenar"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:636
 msgid "color '*!+-' corresponding to the branch"
 msgstr "färga \"*!+-\" enligt grenen"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:638
 msgid "show <n> more commits after the common ancestor"
 msgstr "visa <n> ytterligare incheckningar efter gemensam anfader"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:640
 msgid "synonym to more=-1"
 msgstr "synonym till more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:641
 msgid "suppress naming strings"
 msgstr "undertyck namnsträngar"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:643
 msgid "include the current branch"
 msgstr "inkludera aktuell gren"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:645
 msgid "name commits with their object names"
 msgstr "namnge incheckningar med deras objektnamn"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:647
 msgid "show possible merge bases"
 msgstr "visa möjliga sammanslagningsbaser"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:649
 msgid "show refs unreachable from any other ref"
 msgstr "visa referenser som inte kan nås från någon annan referens"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:651
 msgid "show commits in topological order"
 msgstr "visa incheckningar i topologisk ordning"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:654
 msgid "show only commits not on the first branch"
 msgstr "visa endast incheckningar inte på den första grenen"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:656
 msgid "show merges reachable from only one tip"
 msgstr "visa sammanslagningar som endast kan nås från en spets"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:658
 msgid "topologically sort, maintaining date order where possible"
 msgstr "sortera topologiskt, behåll datumordning när möjligt"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:661
 msgid "<n>[,<base>]"
 msgstr "<n>[,<bas>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:662
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "visa <n> nyaste refloggposter med början på bas"
 
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog är inkompatibel med --all, --remotes, --independent eller --merge-"
+"base"
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "inga grenar angavs, och HEAD är inte giltigt"
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "--reflog behöver ett namn på en gren"
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "maximalt %d poster kan visas samtidigt."
+msgstr[1] "maximalt %d poster kan visas samtidigt."
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr "ingen sådan referens %s"
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "kan inte hantera mer än %d revision."
+msgstr[1] "kan inte hantera mer än %d revisioner."
+
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "\"%s\" är inte en giltig referens."
+
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "hittar inte incheckning %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11362,35 +12872,35 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<mönster>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "visa endast taggar (kan kombineras med huvuden)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "visa endast huvuden (kan kombineras med taggar)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr "striktare referenskontroll, kräver exakt referenssökväg"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "visa HEAD-refrens, även när den skulle filtreras ut"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
 msgstr "avreferera taggar till objekt-id"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "visa SHA1-hash endast med <n> siffror"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "visa inte resultat på standard ut (användbart med --verify)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr "visa referenser från standard in som inte finns i lokalt arkiv"
 
@@ -11410,12 +12920,12 @@ msgstr "hoppa över och ta bort alla rader som inleds med kommentarstecken"
 msgid "prepend comment character and space to each line"
 msgstr "lägg in kommentarstecken och blanksteg först på varje rad"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
 msgid "No such ref: %s"
 msgstr "Ingen sådan referens: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Förväntade fullt referensnamn, fick %s"
@@ -11425,74 +12935,101 @@ msgstr "Förväntade fullt referensnamn, fick %s"
 msgid "cannot strip one component off url '%s'"
 msgstr "kan inte ta bort en komponent från url:en \"%s\""
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
 msgid "alternative anchor for relative paths"
 msgstr "alternativa ankare för relativa sökvägar"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:310
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<sökväg>] [<sökväg>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "Hittade ingen url för undermodulsökvägen \"%s\" i .gitmodules"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr ""
+"kunde inte slå upp konfigurationen \"%s\". Antar att arkivet är sn eget "
+"officiella uppström."
+
+#: builtin/submodule--helper.c:406
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "Misslyckades registrera url för undermodulsökväg \"%s\""
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:410
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Undermodulen \"%s\" (%s) registrerad för sökvägen \"%s\"\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:420
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "varning: kommandouppdateringsläge föreslogs för undermodulen \"%s\"\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:427
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr "Misslyckades registrera uppdateringsläge för undermodulsökväg \"%s\""
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:443
 msgid "Suppress output for initializing a submodule"
 msgstr "Dölj utdata från initiering av undermodul"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:448
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<sökväg>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:476
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <sökväg>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:482
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "hittade ingen undermodulmappning i .gitmodules för sökvägen \"%s\""
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "undermodulen \"%s\" kan inte lägga till alternativ: %s"
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "Värdet \"%s\" i submodule.alternateErrorStrategy förstås inte"
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Värdet \"%s\" i submodule.alternateLocation förstås inte"
+
+#: builtin/submodule--helper.c:633
 msgid "where the new submodule will be cloned to"
 msgstr "var den nya undermodulen skall klonas till"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:636
 msgid "name of the new submodule"
 msgstr "namn på den nya undermodulen"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:639
 msgid "url where to clone the submodule from"
 msgstr "URL att klona undermodulen från"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:645
 msgid "depth for shallow clones"
 msgstr "djup för grunda kloner"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "tvinga kloningsförlopp"
+
+#: builtin/submodule--helper.c:653
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11500,97 +13037,82 @@ msgstr ""
 "git submodule--helper clone [--prefix=<sökväg>] [--quiet] [--reference "
 "<arkvi>] [--name <namn>] [--depth <djup>] --url <url> --path <sökväg>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "kunde inte skapa katalogen \"%s\""
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:684
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "misslyckades klona \"%s\" till undermodulsökvägen \"%s\""
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "kan inte öppna filen \"%s\""
-
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
-msgstr "kunde inte stänga filen %s"
-
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:699
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "kunde inte få tag i undermodulkatalog för \"%s\""
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:764
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Undermodulsökvägen \"%s\" har inte initierats"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:768
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Kanske menade du att använda \"update --init\"?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Hoppar över ej sammanslagen undermodul %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:814
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Hoppar över undermodulen \"%s\""
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:942
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "Misslyckades klona \"%s\". Nytt försök planlagt"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:953
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "Misslyckades klona \"%s\" för andra gången, avbryter"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
 msgid "path into the working tree"
 msgstr "sökväg inuti arbetskatalogen"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:977
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "sökväg inuti arbetskatalogen, genom nästlade undermodulgränser"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:981
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout eller none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:985
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "Skapa en grund klon trunkerad till angivet antal revisioner"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:988
 msgid "parallel jobs"
 msgstr "parallella jobb"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:990
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "om den första klonen skall följa rekommendation för grund kloning"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:991
 msgid "don't print cloning progress"
 msgstr "skriv inte klonförlopp"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:998
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<sökväg>] [<sökväg>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:1008
 msgid "bad value for update parameter"
 msgstr "felaktigt värde för parametern update"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1079
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11599,11 +13121,24 @@ msgstr ""
 "Undermodulens (%s) gren inställd på att ärva gren från huvudprojektet, men "
 "huvudprojektet är inte på någon gren"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "rekursera ner i undermoduler"
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir [<sökväg>...]"
+
+#: builtin/submodule--helper.c:1226
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "underkommandot submodule--helper måste anropas med ett underkommando"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s stöder inte --super-prefix"
+
+#: builtin/submodule--helper.c:1239
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "\"%s\" är inte ett giltigt underkommando till submodule--helper"
@@ -11651,32 +13186,29 @@ msgstr "git tag -d <taggnamn>..."
 
 #: builtin/tag.c:25
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-n[<antal>]] [--contains <incheckning>] [--points-at <objekt>]\n"
+"git tag -l [-n[<antal>]] [--contains <incheckning>] [--no-contains "
+"<incheckning>] [--points-at <objekt>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<incheckning>]] [<mönster>...]"
 
-#: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <taggnamn>..."
-
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "taggnamnet för långt: %.*s..."
+#: builtin/tag.c:27
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<format>] <taggnamn>..."
 
-#: builtin/tag.c:86
+#: builtin/tag.c:83
 #, c-format
 msgid "tag '%s' not found."
 msgstr "taggen \"%s\" hittades inte."
 
-#: builtin/tag.c:101
+#: builtin/tag.c:99
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tog bort tagg \"%s\" (var %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:128
 #, c-format
 msgid ""
 "\n"
@@ -11689,7 +13221,7 @@ msgstr ""
 "  %s\n"
 "Rader som inleds med \"%c\" ignoreras.\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:132
 #, c-format
 msgid ""
 "\n"
@@ -11704,143 +13236,147 @@ msgstr ""
 "Rader som inleds med \"%c\" kommer behållas; du kan själv ta bort dem om\n"
 "du vill.\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:210
 msgid "unable to sign the tag"
 msgstr "kunde inte signera taggen"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:212
 msgid "unable to write tag file"
 msgstr "kunde inte skriva tagg-filen"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:236
 msgid "bad object type."
 msgstr "felaktig objekttyp"
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "tagghuvud för stort."
-
-#: builtin/tag.c:275
+#: builtin/tag.c:282
 msgid "no tag message?"
 msgstr "inget taggmeddelande?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:289
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Taggmeddelandet har lämnats i %s\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:397
 msgid "list tag names"
 msgstr "lista taggnamn"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:399
 msgid "print <n> lines of each tag message"
 msgstr "visa <n> rader från varje taggmeddelande"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:401
 msgid "delete tags"
 msgstr "ta bort taggar"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:402
 msgid "verify tags"
 msgstr "verifiera taggar"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:404
 msgid "Tag creation options"
 msgstr "Alternativ för att skapa taggar"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:406
 msgid "annotated tag, needs a message"
 msgstr "annoterad tagg, behöver meddelande"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:408
 msgid "tag message"
 msgstr "taggmeddelande"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:410
 msgid "annotated and GPG-signed tag"
 msgstr "annoterad och GPG-signerad tagg"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:414
 msgid "use another key to sign the tag"
 msgstr "använd annan nyckel för att signera taggen"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:415
 msgid "replace the tag if exists"
 msgstr "ersätt taggen om den finns"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:416 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "skapa en reflog"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:418
 msgid "Tag listing options"
 msgstr "Alternativ för listning av taggar"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:419
 msgid "show tag list in columns"
 msgstr "lista taggar i spalter"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:420 builtin/tag.c:422
 msgid "print only tags that contain the commit"
 msgstr "visa endast taggar som innehåller incheckningen"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "visa endast taggar som inte innehåller incheckningen"
+
+#: builtin/tag.c:424
 msgid "print only tags that are merged"
 msgstr "visa endast taggar som slagits samman"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:425
 msgid "print only tags that are not merged"
 msgstr "visa endast taggar som ej slagits samman"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:430
 msgid "print only tags of the object"
 msgstr "visa endast taggar för objektet"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:469
 msgid "--column and -n are incompatible"
 msgstr "--column och -n är inkompatibla"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "Flaggan -n är endast tillåten tillsammans med -l."
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "Flaggan -n är endast tillåten i listläge"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "Flaggan --contains är endast tillåten tillsammans med -l"
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "Flaggan --contains är endast tillåten i listläge"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "Flaggan --points-at är endast tillåten tillsammans med -l."
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "Flaggan --no-contains är endast tillåten i listläge"
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "flaggorna --merged och --no-merged tillåts endast tillsammans med -l"
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "Flaggan --points-at är endast tillåten i listläge"
 
-#: builtin/tag.c:433
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr "Flaggorna --merged och --no-merged är endast tillåtna i listläge"
+
+#: builtin/tag.c:510
 msgid "only one -F or -m option is allowed."
 msgstr "endast en av flaggorna -F eller -m tillåts."
 
-#: builtin/tag.c:452
+#: builtin/tag.c:529
 msgid "too many params"
 msgstr "för många parametrar"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:535
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "\"%s\" är inte ett giltigt taggnamn."
 
-#: builtin/tag.c:463
+#: builtin/tag.c:540
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "taggen \"%s\" finns redan"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:570
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "Packar upp objekt"
 
@@ -11864,172 +13400,204 @@ msgstr "misslyckades skapa filen %s"
 msgid "failed to delete file %s"
 msgstr "misslyckades ta bort filen %s"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/update-index.c:110 builtin/update-index.c:216
 #, c-format
 msgid "failed to delete directory %s"
 msgstr "misslyckades ta bort katalogen %s"
 
-#: builtin/update-index.c:133
+#: builtin/update-index.c:135
 #, c-format
 msgid "Testing mtime in '%s' "
 msgstr "Testar mtime i \"%s\""
 
-#: builtin/update-index.c:145
+#: builtin/update-index.c:149
 msgid "directory stat info does not change after adding a new file"
 msgstr "stat-informationen för en katalog ändras inte när nya filer läggs till"
 
-#: builtin/update-index.c:158
+#: builtin/update-index.c:162
 msgid "directory stat info does not change after adding a new directory"
 msgstr ""
 "stat-informationen för en katalog ändras inte när nya kataloger läggs till"
 
-#: builtin/update-index.c:171
+#: builtin/update-index.c:175
 msgid "directory stat info changes after updating a file"
 msgstr "stat-informationen för en katalog ändras när filer uppdateras"
 
-#: builtin/update-index.c:182
+#: builtin/update-index.c:186
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 "stat-informationen för en katalog ändras när filer läggs till i en "
 "underkatalog"
 
-#: builtin/update-index.c:193
+#: builtin/update-index.c:197
 msgid "directory stat info does not change after deleting a file"
 msgstr "stat-informationen för en katalog ändras inte när en fil tas bort"
 
-#: builtin/update-index.c:206
+#: builtin/update-index.c:210
 msgid "directory stat info does not change after deleting a directory"
 msgstr "stat-informationen för en katalog ändras inte när en katalog tas bort"
 
-#: builtin/update-index.c:213
+#: builtin/update-index.c:217
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:568
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<flaggor>] [--] [<fil>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:923
 msgid "continue refresh even when index needs update"
 msgstr "fortsätt uppdatera även när index inte är àjour"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:926
 msgid "refresh: ignore submodules"
 msgstr "refresh: ignorera undermoduler"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:929
 msgid "do not ignore new files"
 msgstr "ignorera inte nya filer"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:931
 msgid "let files replace directories and vice-versa"
 msgstr "låt filer ersätta kataloger och omvänt"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:933
 msgid "notice files missing from worktree"
 msgstr "lägg märke till filer som saknas i arbetskatalogen"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:935
 msgid "refresh even if index contains unmerged entries"
 msgstr "uppdatera även om indexet innehåller ej sammanslagna poster"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:938
 msgid "refresh stat information"
 msgstr "uppdatera statusinformation"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:942
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "som --refresh, men ignorera assume-unchanged-inställning"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:946
 msgid "<mode>,<object>,<path>"
 msgstr "<läge>,<objekt>,<sökväg>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:947
 msgid "add the specified entry to the index"
 msgstr "lägg till angiven post i indexet"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:956
 msgid "mark files as \"not changing\""
 msgstr "markera filer som \"ändras inte\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:959
 msgid "clear assumed-unchanged bit"
 msgstr "rensa \"assume-unchanged\"-biten"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:962
 msgid "mark files as \"index-only\""
 msgstr "markera filer som \"endast index\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:965
 msgid "clear skip-worktree bit"
 msgstr "töm \"skip-worktree\"-biten"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:968
 msgid "add to index only; do not add content to object database"
 msgstr "lägg endast till indexet; lägg inte till innehållet i objektdatabasen"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:970
 msgid "remove named paths even if present in worktree"
 msgstr "ta bort namngivna sökvägar även om de finns i arbetskatalogen"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:972
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "med --stdin: indatarader termineras med null-byte"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:974
 msgid "read list of paths to be updated from standard input"
 msgstr "läs lista över sökvägar att uppdatera från standard in"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:978
 msgid "add entries from standard input to the index"
 msgstr "lägg poster från standard in till indexet"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:982
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "återfyll etapp 2 och 3 från angivna sökvägar"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:986
 msgid "only update entries that differ from HEAD"
 msgstr "uppdatera endast poster som skiljer sig från HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:990
 msgid "ignore files missing from worktree"
 msgstr "ignorera filer som saknas i arbetskatalogen"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:993
 msgid "report actions to standard output"
 msgstr "rapportera åtgärder på standard ut"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:995
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(för porslin) glöm sparade olösta konflikter"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:999
 msgid "write index in this format"
 msgstr "skriv index i detta format"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:1001
 msgid "enable or disable split index"
 msgstr "aktivera eller inaktivera delat index"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:1003
 msgid "enable/disable untracked cache"
 msgstr "aktivera/inaktivera ospårad cache"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1005
 msgid "test if the filesystem supports untracked cache"
 msgstr "testa om filsystemet stöder ospårad cache"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1007
 msgid "enable untracked cache without testing the filesystem"
 msgstr "aktivera ospårad cache utan att testa filsystemet"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+"core.splitIndex är satt till false; ta bort eller ändra det om du verkligen "
+"vill aktivera delat index"
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"core.splitIndex är satt till true; ta bort eller ändra det om du verkligen "
+"vill inaktivera delat index"
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache är satt till true; ta bort eller ändra det om du "
+"verkligen vill inaktivera den ospårade cachen"
+
+#: builtin/update-index.c:1131
 msgid "Untracked cache disabled"
 msgstr "Ospårad cache är inaktiverad"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache är satt till false; ta bort eller ändra det om du "
+"verkligen vill aktivera den ospårade cachen"
+
+#: builtin/update-index.c:1143
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Ospårad cache är aktiverad för \"%s\""
@@ -12078,7 +13646,7 @@ msgstr "git verify-commit [-v | --verbose] <incheckning>..."
 msgid "print commit contents"
 msgstr "visa innehåll för incheckning"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "visa råa gpg-statusdata"
 
@@ -12094,11 +13662,11 @@ msgstr "pratsam"
 msgid "show statistics only"
 msgstr "visa endast statistik"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <tagg>..."
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<format] <tagg>..."
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "visa innehåll för tag"
 
@@ -12122,91 +13690,103 @@ msgstr "git worktree prune [<flaggor>]"
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock <sökväg>"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:43
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Tar bort worktrees/%s: inte en giltig katalog"
 
-#: builtin/worktree.c:48
+#: builtin/worktree.c:49
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Tar bort worktrees/%s: gitdir-filen existerar inte"
 
-#: builtin/worktree.c:53
+#: builtin/worktree.c:54
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Tar bort worktrees/%s: kan inte läsa gitdir-filen (%s)"
 
-#: builtin/worktree.c:64
+#: builtin/worktree.c:65
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Tar bort worktrees/%s: felaktig gitdir-fil"
 
-#: builtin/worktree.c:80
+#: builtin/worktree.c:81
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Tar bort worktrees/%s: gitdir-filen pekar på en ickeexisterande plats"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "rapportera borttagna arbetskataloger"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "låt tid gå ut för arbetskataloger äldre än <tid>"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "\"%s\" finns redan"
 
-#: builtin/worktree.c:236
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "kunde inte skapa katalogen \"%s\""
 
-#: builtin/worktree.c:272
+#: builtin/worktree.c:274
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Förbereder %s (identifieraren %s)"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:328
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 "checka ut <gren> även om den redan är utcheckad i en annan arbetskatalog"
 
-#: builtin/worktree.c:325
+#: builtin/worktree.c:330
 msgid "create a new branch"
 msgstr "skapa en ny gren"
 
-#: builtin/worktree.c:327
+#: builtin/worktree.c:332
 msgid "create or reset a branch"
 msgstr "skapa eller återställ en gren"
 
-#: builtin/worktree.c:329
+#: builtin/worktree.c:334
 msgid "populate the new working tree"
 msgstr "befolka den nya arbetskatalogen"
 
-#: builtin/worktree.c:337
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr "låt arbetskatalogen förbli låst"
+
+#: builtin/worktree.c:343
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B och --detach är ömsesidigt uteslutande"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:478
 msgid "reason for locking"
 msgstr "orsak till lås"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:490 builtin/worktree.c:523
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "\"%s\" är inte en arbetskatalog"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:492 builtin/worktree.c:525
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "Huvudarbetskatalogen kan inte låsas eller låsas upp"
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:497
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "\"%s\" är redan låst, orsak: %s"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:499
 #, c-format
 msgid "'%s' is already locked"
 msgstr "\"%s\" är redan låst"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:527
 #, c-format
 msgid "'%s' is not locked"
 msgstr "\"%s\" är inte låst"
@@ -12227,26 +13807,39 @@ msgstr "visa trädobjekt för underkatalogen <prefix>"
 msgid "only useful for debugging"
 msgstr "endast användbart vid felsökning"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<flaggor>] <katalog>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1040
 msgid "quit after a single request/response exchange"
 msgstr "avsluta omedelbart efter första anrop/svar-utväxling"
 
-#: upload-pack.c:839
+#: upload-pack.c:1042
 msgid "exit immediately after initial ref advertisement"
 msgstr "avsluta omedelbart efter inledande kungörelse av referenser"
 
-#: upload-pack.c:841
+#: upload-pack.c:1044
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr "testa inte <katalog>/.git/ om <katalog> inte är en Git-katalog"
 
-#: upload-pack.c:843
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "avbryt överföringen efter <n> sekunders inaktivitet"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"Behörigheten på din uttags-katalog (socket) är för lös; andra\n"
+"användare kan läsa dina cachade inloggningsuppgifter. Du bör köra:\n"
+"\n"
+"\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "skriv felsökningsmeddelanden på standard fel"
@@ -12261,10 +13854,35 @@ msgstr ""
 "några konceptvägledningar. Se \"git help <kommando>\" eller \"git help\n"
 "<koncept>\" för att läsa mer om specifika underkommandon och koncept."
 
-#: http.c:323
+#: http.c:336
+#, c-format
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr "http.postbuffer har negativt värde; använder förvalet %d"
+
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Delegerad styrning stöds inte av cURL < 7.22.0"
+
+#: http.c:366
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "Fastnålning av öppen nyckel stöds inte av cURL < 7.44.0"
 
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"kan inte uppdatera urlbas från omdirigerin:\n"
+"        bad om: %s\n"
+"  omdirigering: %s"
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "omdirigerar till %s"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "starta arbetskatalog (se också: git help tutorial)"
@@ -12377,15 +13995,15 @@ msgstr "giltig-till"
 msgid "no-op (backward compatibility)"
 msgstr "ingen funktion (bakåtkompatibilitet)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "var mer pratsam"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "var mer tyst"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "använd <n> siffror för att visa SHA-1:or"
 
@@ -12610,8 +14228,8 @@ msgid "Automated merge did not work."
 msgstr "Automatisk sammanslagning misslyckades."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
-msgstr "Borde inte använda Octopus."
+msgid "Should not be doing an octopus."
+msgstr "Borde inte använda octopus."
 
 #: git-merge-octopus.sh:73
 #, sh-format
@@ -12637,7 +14255,7 @@ msgstr "Försök enkel sammanslagning med $pretty_name"
 msgid "Simple merge did not work, trying automatic merge."
 msgstr "Enkel sammanslagning misslyckades, försöker automatisk sammanslagning."
 
-#: git-rebase.sh:56
+#: git-rebase.sh:58
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12648,51 +14266,37 @@ msgstr ""
 "Om du vill hoppa över patchen kör du istället \"git rebase --skip\".\n"
 "För att återställa originalgrenen och avbryta kör du \"git rebase --abort\"."
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:158 git-rebase.sh:397
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Kunde inte flytta tillbaka till $head_name"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "Tillämpade autostash."
-
-#: git-rebase.sh:170
+#: git-rebase.sh:172
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Kan inte spara $stash_sha1"
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"Tillämpning av autostash gav konflikter.\n"
-"Dina ändringar är säkra i stashen.\n"
-"Du kan när som helst använda \"git stash pop\" eller \"git stash drop\".\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:212
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Kroken pre-rebase vägrade ombaseringen."
 
-#: git-rebase.sh:215
+#: git-rebase.sh:217
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Det verkar som en git-am körs. Kan inte ombasera."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:358
 msgid "No rebase in progress?"
 msgstr "Ingen ombasering pågår?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:369
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "Åtgärden --edit-todo kan endast användas under interaktiv ombasering."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:376
 msgid "Cannot read HEAD"
 msgstr "Kan inte läsa HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:379
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -12700,7 +14304,7 @@ msgstr ""
 "Du måste redigera alla sammanslagningskonflikter och\n"
 "därefter markera dem som lösta med git add"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:419
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12721,98 +14325,102 @@ msgstr ""
 "och kör programmet igen. Jag avslutar ifall du fortfarande har\n"
 "något av värde där."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:470
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ogiltig uppström $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:494
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: mer än en sammanslagningsbas finns"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:497 git-rebase.sh:501
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ingen sammanslagningsbas finns"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:506
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Peka på en giltig incheckning: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:529
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "ödesdigert: ingen sådan gren: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:562
 msgid "Cannot autostash"
 msgstr "Kan inte utföra \"autostash\""
 
-#: git-rebase.sh:562
+#: git-rebase.sh:567
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Skapade autostash: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:571
 msgid "Please commit or stash them."
 msgstr "Checka in eller använd \"stash\" på dem."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:591
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktuell gren $branch_name är à jour."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:595
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:606
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Ändringar från $mb till $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:615
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Först, spolar tillbaka huvudet för att spela av ditt arbete ovanpå det..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:625
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Snabbspolade $branch_name till $onto_name."
 
-#: git-stash.sh:50
+#: git-stash.sh:53
 msgid "git stash clear with parameters is unimplemented"
 msgstr "\"git stash clear\" med parametrar har inte implementerats"
 
-#: git-stash.sh:73
+#: git-stash.sh:94
 msgid "You do not have the initial commit yet"
 msgstr "Du har inte den första incheckningen ännu"
 
-#: git-stash.sh:88
+#: git-stash.sh:109
 msgid "Cannot save the current index state"
 msgstr "Kan inte spara aktuellt tillstånd för indexet"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "Kan inte spara ospårade filer"
+
+#: git-stash.sh:144 git-stash.sh:157
 msgid "Cannot save the current worktree state"
 msgstr "Kan inte spara aktuellt tillstånd för arbetskatalogen"
 
-#: git-stash.sh:140
+#: git-stash.sh:161
 msgid "No changes selected"
 msgstr "Inga ändringar valda"
 
-#: git-stash.sh:143
+#: git-stash.sh:164
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Kan inte ta bort temporärt index (kan inte inträffa)"
 
-#: git-stash.sh:156
+#: git-stash.sh:177
 msgid "Cannot record working tree state"
 msgstr "Kan inte registrera tillstånd för arbetskatalog"
 
-#: git-stash.sh:188
+#: git-stash.sh:209
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Kan inte uppdatera $ref_stash med $w_commit"
@@ -12827,7 +14435,7 @@ msgstr "Kan inte uppdatera $ref_stash med $w_commit"
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
+#: git-stash.sh:265
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -12836,107 +14444,116 @@ msgstr ""
 "fel: felaktig flagga för \"stash save\": $option\n"
 "     För att ange ett meddelande, använd git stash save -- \"$option\""
 
-#: git-stash.sh:259
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr ""
+"Kan inte använda --patch och --include-untracked eller --all samtidigt."
+
+#: git-stash.sh:286
 msgid "No local changes to save"
 msgstr "Inga lokala ändringar att spara"
 
-#: git-stash.sh:263
+#: git-stash.sh:291
 msgid "Cannot initialize stash"
 msgstr "Kan inte initiera \"stash\""
 
-#: git-stash.sh:267
+#: git-stash.sh:295
 msgid "Cannot save the current status"
 msgstr "Kan inte spara aktuell status"
 
-#: git-stash.sh:268
+#: git-stash.sh:296
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
 msgstr "Sparade arbetskatalogen och indexstatus $stash_msg"
 
-#: git-stash.sh:285
+#: git-stash.sh:323
 msgid "Cannot remove worktree changes"
 msgstr "Kan inte ta bort ändringar i arbetskatalogen"
 
-#: git-stash.sh:404
+#: git-stash.sh:471
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "okänd flagga: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:484
 msgid "No stash found."
 msgstr "Ingen \"stash\" hittades."
 
-#: git-stash.sh:421
+#: git-stash.sh:491
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "För många revisioner angivna: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:506
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference är inte en giltig referens"
 
-#: git-stash.sh:455
+#: git-stash.sh:534
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "\"$args\" är inte en \"stash\"-liknande incheckning"
 
-#: git-stash.sh:466
+#: git-stash.sh:545
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "\"$args\" är inte en \"stash\"-referens"
 
-#: git-stash.sh:474
+#: git-stash.sh:553
 msgid "unable to refresh index"
 msgstr "kan inte uppdatera indexet"
 
-#: git-stash.sh:478
+#: git-stash.sh:557
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Kan inte tillämpa en \"stash\" mitt i en sammanslagning"
 
-#: git-stash.sh:486
+#: git-stash.sh:565
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikter i indexet. Testa utan --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:567
 msgid "Could not save index tree"
 msgstr "Kunde inte spara indexträd"
 
-#: git-stash.sh:522
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "Kunde inte återställa ospårade filer från stash"
+
+#: git-stash.sh:601
 msgid "Cannot unstage modified files"
 msgstr "Kan inte ta bort ändrade filer ur kön"
 
-#: git-stash.sh:537
+#: git-stash.sh:616
 msgid "Index was not unstashed."
 msgstr "Indexet har inte tagits ur kön."
 
-#: git-stash.sh:551
+#: git-stash.sh:630
 msgid "The stash is kept in case you need it again."
 msgstr "\"Stash\":en behålls ifall du behöver den igen."
 
-#: git-stash.sh:560
+#: git-stash.sh:639
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Kastade ${REV} ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:640
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Kunde inte kasta \"stash\"-post"
 
-#: git-stash.sh:569
+#: git-stash.sh:648
 msgid "No branch name specified"
 msgstr "Inget grennamn angavs"
 
-#: git-stash.sh:641
+#: git-stash.sh:727
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(För att återställa dem, skriv \"git stash apply\")"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "Relativ sökväg kan endast användas från arbetskatalogens toppnivå"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../"
@@ -12946,7 +14563,12 @@ msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../"
 msgid "'$sm_path' already exists in the index"
 msgstr "\"$sm_path\" finns redan i indexet"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "\"$sm_path\" finns redan i indexet och är inte en undermodul"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12957,22 +14579,22 @@ msgstr ""
 "$sm_path\n"
 "Använd -f om du verkligen vill lägga till den"
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Lägger till befintligt arkiv i \"$sm_path\" i indexet"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "\"$sm_path\" finns redan och är inte ett giltigt git-arkiv"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "En git-katalog för \"$sm_name\" hittades lokalt med fjärr(ar):"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -12990,48 +14612,48 @@ msgstr ""
 "arkiv eller om du är osäker på vad det här betyder, välj ett annat namn med\n"
 "flaggan \"--name\"."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Aktiverar lokal git-katalog för undermodulen \"$sm_name\" på nytt."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kan inte checka ut undermodulen \"$sm_path\""
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Misslyckades registrera undermodulen \"$sm_path\""
 
-#: git-submodule.sh:323
+#: git-submodule.sh:341
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "Går in i \"$displaypath\""
 
-#: git-submodule.sh:343
+#: git-submodule.sh:361
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr ""
 "Stoppar på \"$displaypath\"; skriptet returnerade en status skild från noll."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:432
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "sökvägsangivelse och --all är inkompatibla"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:437
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "Använd \"--all\" om du verkligen vill avinitiera alla undermoduler"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
@@ -13040,7 +14662,7 @@ msgstr ""
 "Undermodulsarbetskatalogen \"$displaypath\" innehåller en .git-katalog\n"
 "(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13049,38 +14671,38 @@ msgstr ""
 "Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" "
 "kastar bort dem"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:468
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Rensade katalogen \"$displaypath\""
 
-#: git-submodule.sh:451
+#: git-submodule.sh:469
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\""
 
-#: git-submodule.sh:454
+#: git-submodule.sh:472
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\""
 
-#: git-submodule.sh:463
+#: git-submodule.sh:481
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\""
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Kan inte hitta aktuell revision i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:622
+#: git-submodule.sh:647
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Kan inte hämta i undermodulsökväg \"$sm_path\""
 
-#: git-submodule.sh:627
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13089,12 +14711,12 @@ msgstr ""
 "Kan inte hitta aktuell revision för ${remote_name}/${branch} i "
 "undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:645
+#: git-submodule.sh:670
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\""
 
-#: git-submodule.sh:651
+#: git-submodule.sh:676
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
@@ -13103,88 +14725,84 @@ msgstr ""
 "Hämtade i undermodulssökvägen \"$displaypath\", men den innehöll inte $sha1. "
 "Direkt hämtning av incheckningen misslyckades."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:683
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:659
+#: git-submodule.sh:684
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
 
-#: git-submodule.sh:663
+#: git-submodule.sh:688
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:664
+#: git-submodule.sh:689
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\""
 
-#: git-submodule.sh:669
+#: git-submodule.sh:694
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte slå ihop \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:670
+#: git-submodule.sh:695
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\""
 
-#: git-submodule.sh:675
+#: git-submodule.sh:700
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "Misslyckades köra \"$command $sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:676
+#: git-submodule.sh:701
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": \"$command $sha1\""
 
-#: git-submodule.sh:707
+#: git-submodule.sh:732
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Flaggan --cached kan inte användas med flaggan --files"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:892
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "oväntat läge $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:915
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:918
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Varning: $display_name innehåller inte incheckningarna $sha1_src och "
 "$sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1064
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1136
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synkroniserar undermodul-url för \"$displaypath\""
@@ -13194,12 +14812,12 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 msgid "See git-${cmd}(1) for details."
 msgstr "Se git-${cmd}(1) för detaljer."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "Ombaserar ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13225,7 +14843,7 @@ msgstr ""
 "\n"
 "Du kan byta ordning på raderna, de utförs uppifrån och ned.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13234,7 +14852,7 @@ msgstr ""
 "Ta inte bort rader. Använd \"drop\" för att specifikt förkasta en "
 "incheckning.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
@@ -13242,7 +14860,7 @@ msgstr ""
 "\n"
 "Om du tar bort en rad KOMMER DEN INCHECKNINGEN ATT FÖRLORAS.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13261,87 +14879,83 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: inte en incheckning som kan väljas"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Felaktigt incheckningsnamn: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "Kan inte skriva ersättnings-sha1 för aktuell incheckning"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Snabbspolade till $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "Kan inte snabbspola till $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "Kan inte flytta HEAD till $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "Vägrar utföra \"squash\" på en sammanslagning: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Fel när sammanslagningen $sha1 skulle göras om"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "Kunde inte välja $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Det här är incheckningsmeddelande ${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "Incheckningsmeddelande ${n} kommer hoppas över:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Det här är en kombination av $count incheckning."
 msgstr[1] "Det här är en kombination av $count incheckningar."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "Kan inte skriva $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "Det här är en kombination av 2 incheckningar."
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
-msgstr "Det här är 1:a incheckningsmeddelandet:"
-
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "kunde inte tillämpa $sha1... $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13355,31 +14969,31 @@ msgstr ""
 "pre-commit-kroken misslyckades. Om pre-commit-kroken misslyckades kanske\n"
 "du måste lösa problemet innan du kan skriva om incheckningsmeddelandet."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "Stoppade på $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "Kan inte utföra \"$squash_style\" utan en föregående incheckning"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "Kör: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "Körning misslyckades: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "och gjorde ändringar till indexet och/eller arbetskatalogen"
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13390,7 +15004,7 @@ msgstr ""
 "\tgit rebase --continue\""
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13405,25 +15019,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Okänt kommando: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Rätta det med \"git rebase --edit-todo\"."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "Lyckades ombasera och uppdatera $head_name."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
 msgstr "Kunde inte hoppa över onödiga \"pick\"-kommandon"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13432,7 +15046,7 @@ msgstr ""
 "Varning: SHA-1 saknas eller inte en incheckning på följande rad:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13441,11 +15055,11 @@ msgstr ""
 "Varning: kommandot kändes inte igen på följande rad:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "kunde inte koppla från HEAD"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13453,7 +15067,7 @@ msgstr ""
 "Varning: vissa incheckningar kan av misstag ha tappats.\n"
 "Tappade incheckningar (nyaste först):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13470,7 +15084,7 @@ msgstr ""
 "Möjliga bettenden är: \"ignore\" (ignorera), \"warn\" (varna), \"error"
 "\" (fel)."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
@@ -13478,19 +15092,23 @@ msgid ""
 msgstr ""
 "Okänt val $check_level för flaggan rebase.missingCommitsCheck. Ignorerar."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Du kan rätta detta med \"git rebase --edit-todo\"."
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Du kan rätta detta med \"git rebase --edit-todo\" följt av \"git rebase --"
+"continue\"."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "Eller så kan du avbryta ombaseringen med \"git rebase --abort\"."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1083
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "Kunde inte ta bort CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1088
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13503,7 +15121,7 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
@@ -13521,11 +15139,11 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1105
 msgid "Error trying to find the author identity to amend commit"
 msgstr "Fel vid försök att hitta författaridentitet för att utöka incheckning"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1110
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
@@ -13533,11 +15151,11 @@ msgstr ""
 "Du har ändringar i arbetskatalogen som inte checkats in. Checka in dem\n"
 "först och kör sedan \"git rebase --continute\" igen."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
 msgid "Could not commit staged changes."
 msgstr "Kunde inte checka in köade ändringar."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1147
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13551,44 +15169,40 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
 msgid "Could not execute editor"
 msgstr "Kunde inte starta textredigerare"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Du måste ställa in din incheckarinformation först"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1168
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "Kunde inte checka ut $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1173
 msgid "No HEAD?"
 msgstr "Inget HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1174
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "Kunde inte skapa temporär $state_dir"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1176
 msgid "Could not mark as interactive"
 msgstr "Kunde inte markera som interaktiv"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
 msgid "Could not init rewritten commits"
 msgstr "Kunde inte initiera omskrivna incheckningar"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1291
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Ombasera $shortrevisions på $shortonto ($todocount incheckning)"
 msgstr[1] "Ombasera $shortrevisions på $shortonto ($todocount incheckningar)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1296
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
@@ -13598,7 +15212,7 @@ msgstr ""
 "Ombaseringen kommer dock att avbrytas om du tar bort allting.\n"
 "\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1303
 msgid "Note that empty commits are commented out"
 msgstr "Observera att tomma incheckningar är utkommenterade"
 
@@ -13625,6 +15239,10 @@ msgstr "Kan inte ombasera: Du har oköade ändringar."
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr "Kan inte skriva om grenar: Du har oköade ändringar."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "Kan inte hämta med ombasering: Du har oköade ändringar."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13635,12 +15253,21 @@ msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr ""
 "Kan inte ombasera: Ditt index innehåller ändringar som inte checkats in."
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr ""
+"Kan inte hämta med ombasering: Ditt index innehåller oincheckade ändringar."
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr ""
 "Kan inte $action: Ditt index innehåller ändringar som inte checkats in."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Dessutom innehåller dit index ändringar som inte har checkats in."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr "Du måste köra kommandot från arbetskatalogens toppnivå."
@@ -13649,6 +15276,1022 @@ msgstr "Du måste köra kommandot från arbetskatalogens toppnivå."
 msgid "Unable to determine absolute path of git directory"
 msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%12s %12s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "köad"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "ej köad"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "binär"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "ingenting"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "oändrad"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "lade till %d sökväg\n"
+msgstr[1] "lade till %d sökvägar\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "uppdaterade %d sökväg\n"
+msgstr[1] "uppdaterade %d sökvägar\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "återställde %d sökväg\n"
+msgstr[1] "återställde %d sökvägar\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "rörde %d sökväg\n"
+msgstr[1] "rörde %d sökvägar\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "Uppdatera"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "Återställ"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "observera: %s spåras inte längre.\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "Lägg till ospårad"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "Inga ospårade filer.\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"Om patchen kan appliceras rent kommer det redigerade stycket att\n"
+"köas omedelbart."
+
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr ""
+"Om patchen kan appliceras rent kommer det redigerade stycket att\n"
+"läggas till i \"stash\" omedelbart."
+
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr ""
+"Om patchen kan appliceras rent kommer det redigerade stycket att\n"
+"tas bort från kön omedelbart."
+
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"Om patchen kan appliceras rent kommer det redigerade stycket att\n"
+"markeras för applicering omedelbart."
+
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr ""
+"Om patchen kan appliceras rent kommer det redigerade stycket att\n"
+"markeras för kasta omedelbart."
+
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr "misslyckades öppna styckeredigeringsfil för skrivning: %s"
+
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr "Manuellt styckeredigeringsläge -- se nederst för snabbguide.\n"
+
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"Ta bort \"%s\" rader genom att göra dem \" \"-rader (sammanhang).\n"
+"Ta bort \"%s\" rader genom att radera dem.\n"
+"Rader som börjar med %s kommer att tas bort.\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"Om patchen inte kan appliceras rent kommer du få en möjlighet att\n"
+"redigera den igen. Om alla rader i ett stycke tas bort avbryts\n"
+"redigeringen och stycket lämnas oförändrat.\n"
+
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr "misslyckades öppna styckesredigeringsfil för läsning: %s"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr ""
+"Ditt redigerade stycke kan inte appliceras. Redigera igen (\"nej\" kastar!) "
+"[y/n]?"
+
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - köa stycket\n"
+"n - köa inte stycket\n"
+"q - avsluta; köa inte stycket eller något av de följande\n"
+"a - köa stycket och alla följande i filen\n"
+"d - köa inte stycket eller något av de följande i filen"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - \"stash\":a stycket\n"
+"n - \"stash\":a inte stycket\n"
+"q - avsluta; \"stash\":a inte stycket eller något av de följande\n"
+"a - \"stash\":a stycket och alla följande i filen\n"
+"d - \"stash\":a inte stycket eller något av de följande i filen"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - ta bort stycket från kön\n"
+"n - ta inte bort stycket från kön\n"
+"q - avsluta; ta inte bort stycket eller något av de följande från kön\n"
+"a - ta bort stycket och alla följande i filen från kön\n"
+"d - ta inte bort stycket eller något av de följande i filen från kön"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - applicera stycket på indexet\n"
+"n - applicera inte stycket på indexet\n"
+"q - avsluta; applicera inte stycket eller något av de följande\n"
+"a - applicera stycket och alla följande i filen\n"
+"d - applicera inte stycket eller något av de följande i filen"
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - förkasta stycket från arbetskatalogen\n"
+"n - förkasta inte stycket från arbetskatalogen\n"
+"q - avsluta; förkasta inte stycket eller något av de följande\n"
+"a - förkasta stycket och alla följande i filen\n"
+"d - förkasta inte stycket eller något av de följande i filen"
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - förkasta stycket från indexet och arbetskatalogen\n"
+"n - förkasta inte stycket från indexet och arbetskatalogen\n"
+"q - avsluta; förkasta inte stycket eller något av de följande\n"
+"a - förkasta stycket och alla följande i filen\n"
+"d - förkasta inte stycket eller något av de följande i filen"
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - applicera stycket på indexet och arbetskatalogen\n"
+"n - applicera inte stycket på indexet och arbetskatalogen\n"
+"q - avsluta; applicera inte stycket eller något av de följande\n"
+"a - applicera stycket och alla följande i filen\n"
+"d - applicera inte stycket eller något av de följande i filen"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g - välj ett stycke att gå till\n"
+"/ - sök efter stycke som motsvarar angivet reguljärt uttryck\n"
+"j - lämna stycket obestämt, se nästa obestämda stycke\n"
+"J - lämna stycket obestämt, se nästa stycke\n"
+"k - lämna stycket obestämt, se föregående obestämda stycke\n"
+"K - lämna stycket obestämt, se föregående stycke\n"
+"s - dela aktuellt stycke i mindre styckens\n"
+"e - redigera aktuellt stycke manuellt\n"
+"? - visa hjälp\n"
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "Markerade stycken kan inte appliceras på indexet!\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "Applicera dem på arbetskatalogen trots det? "
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "Ingenting applicerades.\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "ignorerar ej sammanslagen: %s\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "Endast binära filer ändrade.\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "Inga ändringar.\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "Uppdatera patch"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Köa ändrat läge [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Köa borttagning [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Köa stycket [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Stash:a ändrat läge [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Stash:a borttagning [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Stash:a stycket [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Ta bort ändrat läge från kön [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Ta bort borttagning från kön [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Ta bort stycket från kön [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "Applicera ändrat läge på indexet [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "Applicera borttagning på indexet [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "Applicera stycket på indexet [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Kasta ändrat läge från arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Kasta borttagning från arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Kasta stycket från arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Kasta ändrat läge från indexet och arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Kasta borttagning från indexet och arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Kasta stycket från indexet och arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Applicera ändrat läge på indexet och arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Applicera borttagning på indexet och arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Applicera stycket på indexet och arbetskatalogen [y,n,q,a,d,/%s,?]?"
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "gå till vilket stycke (<ret> för att se fler)?"
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "gå till vilket stycke?"
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "Ogiltigt siffervärde: \"%s\"\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "Beklagar, det finns bara %d stycke.\n"
+msgstr[1] "Beklagar, det finns bara %d stycken.\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "sök efter reguljärt uttryck? "
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "Felaktigt format på reguljärt sökuttryck %s: %s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "Inga stycken motsvarar givet mönster\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "Inget föregående stycke\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "Inget följande stycke\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "Dela i %d stycke.\n"
+msgstr[1] "Dela i %d stycken.\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "Granska diff"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        - visa sökvägar med ändringar\n"
+"update        - lägg arbetskatalogens tillstånd till köade ändringar\n"
+"revert        - återställ köade ändringar till HEAD-versionen\n"
+"patch         - välj och uppdatera valda stycken\n"
+"diff          - visa diff mellan HEAD och index\n"
+"add untracked - lägg till innehåll i ospårade filer till köade ändringar\n"
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "saknad --"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "okänt läge för --patch: %s"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "felaktigt argument %s, förväntar --"
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr "lokal zon skiljer sig från GMT med delar av minuter\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "lokal tidszonförskjutning större än eller lika med 24 timmar\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "textredigeringsprogrammet avslutades med fel, avbryter allting"
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr ""
+"\"%s\" innehåller en mellanliggande version av e-postbrevet du skrev.\n"
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "\"%s.final\" innehåller det skrivna brevet.\n"
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-alias är inkompatibelt med andra flaggor\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "Kan inte köra git format-patch från utanför arkivet\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "Okänt fält i --suppress-cc: \"%s\"\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "Okänd inställning i --confirm: \"%s\"\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr "varning: sendmail-alias med citationstecken stöds inte. %s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "varning: \":include:\" stöds inte: %s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr "varning: omdirigering til \"/fil\" eller \"|rör\" stöds inte: %s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "varning: sendmail-raden känns inte igen: %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+"Filen \"%s\" finns men kan också vara ett incheckningsintervall\n"
+"att skapa patchar för. Gör otvetydigt genom att...\n"
+"\n"
+"    * Säga \"./%s\" om du menar en fil; eller\n"
+"    * Ange flaggan --format-patch om du menar ett intervall.\n"
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "Misslyckades utföra opendir %s: %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"ödesdigert: %s: %s\n"
+"varning: inga patchar har sänts\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"Inga patchfiler angavs!\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "Ingen ärenderad i %s?"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "Kunde inte öppna för skrivning %s: %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+"Rader som börjar med \"GIT:\" kommer tas bort.\n"
+"Överväg att ta med en övergripande diffstatus eller\n"
+"innehållsförteckning för patchen du skriver.\n"
+"\n"
+"Rensa brevkroppen om du inte vill sända någon sammanfattning.\n"
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "Misslyckades öppna %s.final: %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "Misslyckades öppna %s: %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr "Fälten To/Cc/Bcc tolkas inte ännu, de har ignorerats\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "Sammanfattande brev tomt, hoppar över\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "Är du säker på att du vill använda <%s> [Y=ja, N=nej]? "
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr ""
+"Följande filer är åttabitars, men anger inte en Content-Transfer-Encoding.\n"
+
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "Vilken åttabitarsteckenkodning skall jag ange [UTF-8]?"
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+"Vägrar sända eftersom patchen\n"
+"\t%s\n"
+"har mallärendet \"*** SUBJECT HERE ***\". Använd --force om du verkligen "
+"vill sända.\n"
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "Till vem skall breven sändas (om någon)?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "ödesdigert: aliaset \"%s\" expanderar till sig själv\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr ""
+"Message-ID att använda som In-Reply-To för det första brevet (om något)?"
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "fel: kunde inte få fram en giltig adress från: %s\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr "Vad vill du göra med adressen? (q=avsluta, d=kasta, e=redigera):"
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "CA-sökvägen \"%s\" finns inte"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+"    Kopielistan ovan har utökats av ytterligare adresser\n"
+"    funna i patchens incheckningsmeddelande. Send-email\n"
+"    frågar som standard innan sändning när detta sker.\n"
+"    Beteendet styrs av konfigurationsinställningen\n"
+"    sendemail.confirm\n"
+"\n"
+"    För ytterligare information, kör \"git send-email --help\".\n"
+"    För att behålla nuvarande beteende, men dölja detta\n"
+"    meddelande, kör \"git config --global sendemail.confirm auto\".\n"
+"\n"
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "Sända brevet? (y=ja, n=nej, q=avsluta, a=alla): "
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "Svar krävs på frågan \"Sända brevet?\""
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "Nödvändig SMTP-server har inte angivits korrekt."
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "Servern stöder inte SMARTTLS! %s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr ""
+"Kan inte initiera SMTP korrekt. Kontrollera inställningarna och använd --"
+"smtp-debug."
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "Misslyckades sända %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "Test-Sände %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "Sände %s\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "Test-OK. Loggen säger:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "OK. Loggen säger:\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "Resultat: "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "Resultat: OK\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "kan inte öppna filen %s"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) Lägger till cc: %s från raden \"%s\"\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) Lägger till to: %s från raden \"%s\"\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(icke-mbox) Lägger till cc: %s från raden \"%s\"\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(kropp) Lägger till cc: %s från raden \"%s\"\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) Kunde inte köra \"%s\""
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) Lägger till %s: %s från: \"%s\"\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) misslyckades stänga röret till \"%s\""
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "kan inte sända brev som sjubitars"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "ogiltig överföringskondning"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "kunde inte öppna %s: %s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s: patchen innehåller en rad längre än 998 tecken"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr ""
+"Hoppar över %s med filnamnstillägget \"%s\" som används för "
+"säkerhetskopior.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "Vill du verkligen sända %s? [y=ja, n=nej]: "
+
+#~ msgid "could not stat '%s"
+#~ msgstr "kunde inte ta status på \"%s\""
+
+#~ msgid "tag: tagging "
+#~ msgstr "tag: taggar"
+
+#~ msgid "object of unknown type"
+#~ msgstr "objekt av okänd typ"
+
+#~ msgid "commit object"
+#~ msgstr "incheckningsobjekt"
+
+#~ msgid "tree object"
+#~ msgstr "trädobjekt"
+
+#~ msgid "blob object"
+#~ msgstr "blob-objekt"
+
+#~ msgid "other tag object"
+#~ msgstr "annat taggobjekt"
+
+#~ msgid ""
+#~ "There is nothing to exclude from by :(exclude) patterns.\n"
+#~ "Perhaps you forgot to add either ':/' or '.' ?"
+#~ msgstr ""
+#~ "Ingenting att exkludera från med :(exkludera)-mönster.\n"
+#~ "Glömde du kanske att antingen lägga till \":/\" eller \".\"?"
+
+#~ msgid "unrecognized format: %%(%s)"
+#~ msgstr "okänt format: %%(%s)"
+
+#~ msgid ":strip= requires a positive integer argument"
+#~ msgstr ":strip= kräver ett positivt heltalsargument"
+
+#~ msgid "ref '%s' does not have %ld components to :strip"
+#~ msgstr "referensen \"%s\" har inte %ld komponenter för :strip"
+
+#~ msgid "unknown %.*s format %s"
+#~ msgstr "okänt \"%.*s\"-format %s"
+
+#~ msgid "[%s: gone]"
+#~ msgstr "[%s: försvunnen]"
+
+#~ msgid "[%s]"
+#~ msgstr "[%s]"
+
+#~ msgid "[%s: behind %d]"
+#~ msgstr "[%s: bakom %d] "
+
+#~ msgid "[%s: ahead %d]"
+#~ msgstr "[%s: före %d] "
+
+#~ msgid "[%s: ahead %d, behind %d]"
+#~ msgstr "[%s: före %d, bakom %d] "
+
+#~ msgid " **** invalid ref ****"
+#~ msgstr " **** ogiltig ref ****"
+
+#~ msgid "insanely long object directory %.*s"
+#~ msgstr "tokigt lång objektkatalog %.*s"
+
+#~ msgid "git merge [<options>] <msg> HEAD <commit>"
+#~ msgstr "git merge [<flaggor>] <meddelande> HEAD <incheckning>"
+
+#~ msgid "'%s' is not a commit"
+#~ msgstr "\"%s\" är inte en incheckning"
+
+#~ msgid "cannot open file '%s'"
+#~ msgstr "kan inte öppna filen \"%s\""
+
+#~ msgid "could not close file %s"
+#~ msgstr "kunde inte stänga filen %s"
+
+#~ msgid "tag name too long: %.*s..."
+#~ msgstr "taggnamnet för långt: %.*s..."
+
+#~ msgid "tag header too big."
+#~ msgstr "tagghuvud för stort."
+
+#~ msgid ""
+#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "marked for discarding"
+#~ msgstr ""
+#~ "Om patchen kan appliceras rent kommer det redigerade stycket att\n"
+#~ "markeras för kasta omedelbart"
+
+#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
+#~ msgstr ""
+#~ "Använd en experimentell algoritm baserad på tomma rader för att förbättra "
+#~ "diffar"
+
+#~ msgid "Clever... amending the last one with dirty index."
+#~ msgstr "Smart... utöka den senaste med smutsigt index."
+
+#~ msgid ""
+#~ "the following submodule (or one of its nested submodules)\n"
+#~ "uses a .git directory:"
+#~ msgid_plural ""
+#~ "the following submodules (or one of their nested submodules)\n"
+#~ "use a .git directory:"
+#~ msgstr[0] ""
+#~ "följande undermodul (eller en av dess nästlade undermoduler)\n"
+#~ "använder en .git-katalog:"
+#~ msgstr[1] ""
+#~ "följande undermoduler (eller en av deras nästlade undermoduler)\n"
+#~ "använder en .git-katalog:"
+
+#~ msgid ""
+#~ "\n"
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "\n"
+#~ "(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
+
+#~ msgid "Could not write to %s"
+#~ msgstr "Kunde inte skriva till %s"
+
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Fel vid ombrytning av %s."
+
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "Dina lokala ändringar skulle skrivas över av \"cherry-pick\"."
+
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Kan inte utföra \"revert\" under en annan \"revert\"."
+
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr "Kan inte utföra \"cherry-pick\" under en annan \"cherry-pick\"."
+
+#~ msgid "Could not parse line %d."
+#~ msgstr "Kan inte tolka rad %d."
+
+#~ msgid "Could not open %s"
+#~ msgstr "Kunde inte öppna %s"
+
+#~ msgid "Could not read %s."
+#~ msgstr "kunde inte läsa %s."
+
+#~ msgid "Could not format %s."
+#~ msgstr "Kunde inte formatera %s."
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "cannot open %s: %s"
+#~ msgstr "kan inte öppna %s: %s"
+
+#~ msgid "You need to set your committer info first"
+#~ msgstr "Du måste ställa in din incheckarinformation först"
+
 #~ msgid "bad numeric config value '%s' for '%s': invalid unit"
 #~ msgstr ""
 #~ "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\": ogiltig enhet"
@@ -13800,9 +16443,6 @@ msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 #~ msgid "bug: unhandled diff status %c"
 #~ msgstr "programfel: diff-status %c ej hanterad"
 
-#~ msgid "read of %s failed"
-#~ msgstr "misslyckades läsa %s"
-
 #~ msgid "could not write branch description template"
 #~ msgstr "kunde inte skriva grenbeskrivningsmall"
 
@@ -13832,9 +16472,6 @@ msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 #~ msgid "Verify that the named commit has a valid GPG signature"
 #~ msgstr "Bekräfta att den namngivna incheckningen har en giltig GPG-signatur"
 
-#~ msgid "Could not write to '%s'"
-#~ msgstr "Kunde inte skriva till \"%s\""
-
 #~ msgid "Writing SQUASH_MSG"
 #~ msgstr "Skriver SQUASH_MSG"
 
@@ -13890,12 +16527,6 @@ msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 #~ msgid "unable to access '%s': %s"
 #~ msgstr "kan inte komma åt \"%s\": %s"
 
-#~ msgid "could not open '%s' for reading: %s"
-#~ msgstr "kunde inte öppna \"%s\" för läsning: %s"
-
-#~ msgid "could not open '%s' for writing: %s"
-#~ msgstr "Kunde inte öppna \"%s\" för skrivning: %s"
-
 #~ msgid "    git branch -d %s\n"
 #~ msgstr "    git branch -d %s\n"
 
@@ -14170,9 +16801,6 @@ msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 #~ msgid "cannot update HEAD ref"
 #~ msgstr "kunde inte uppdatera HEAD-referens"
 
-#~ msgid "cannot tell cwd"
-#~ msgstr "kan inte läsa aktuell katalog (cwd)"
-
 #~ msgid "%s: cannot lock the ref"
 #~ msgstr "%s: kan inte låsa referensen"
 
@@ -14390,18 +17018,12 @@ msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 #~ msgid "oops"
 #~ msgstr "hoppsan"
 
-#~ msgid "Would not remove %s\n"
-#~ msgstr "Skulle inte ta bort %s\n"
-
 #~ msgid "Not removing %s\n"
 #~ msgstr "Tar inte bort %s\n"
 
 #~ msgid "git remote set-head <name> (-a | -d | <branch>])"
 #~ msgstr "git remote set-head <namn> (-a | -d | <gren>])"
 
-#~ msgid " 0 files changed"
-#~ msgstr " 0 filer ändrade"
-
 #~ msgid " %d file changed"
 #~ msgid_plural " %d files changed"
 #~ msgstr[0] " %d fil ändrad"
@@ -14458,9 +17080,6 @@ msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 #~ msgid "-d option is no longer supported.  Do not use."
 #~ msgstr "Flaggan -d stöds inte lägre. Använd inte."
 
-#~ msgid "cherry-pick"
-#~ msgstr "cherry-pick"
-
 #~ msgid "Could not extract email from committer identity."
 #~ msgstr "Kunde inte extrahera e-postadress från incheckarens identitet."
 
index 0ea7d87f8550b0e5237a7e26ef5a8146de16852f..6b6e9390178d73475c760d5ecbf5359dfbc1c8b6 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -2,14 +2,14 @@
 # Bản dịch tiếng Việt dành cho GIT-CORE.
 # This file is distributed under the same license as the git-core package.
 # Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2012.
-# Trần Ngọc Quân <vnwildman@gmail.com>, 2012, 2013, 2014, 2015, 2016.
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2012, 2013, 2014, 2015, 2016, 2017.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git v2.10.0-rc2\n"
+"Project-Id-Version: git v2.13.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-08-28 07:19+0700\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
+"PO-Revision-Date: 2017-05-05 13:38+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
 "Language: vi\n"
@@ -72,7 +72,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "Thoát ra bởi vì xung đột không thể giải quyết."
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Bạn chưa kết thúc việc hòa trộn (MERGE_HEAD vẫn tồn tại)."
 
@@ -113,626 +113,1331 @@ msgstr ""
 "  git checkout -b <tên-nhánh-mới>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>…]"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "không nhận ra tùy chọn về khoảng trắng “%s”"
 
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "không nhận ra tùy chọn bỏ qua khoảng trắng “%s”"
 
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <kho> [--exec <lệnh>] [<các-tùy-chọn>] <tree-ish> "
-"[<đường-dẫn>…]"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject và --3way không thể dùng cùng nhau."
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached và --3way không thể dùng cùng nhau."
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "đặc tả đường dẫn “%s” không khớp với bất kỳ tập tin nào"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way ở ngoài một kho chứa"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "định_dạng"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index ở ngoài một kho chứa"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "định dạng lưu trữ"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached ở ngoài một kho chứa"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "tiền_tố"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr ""
+"Không thể chuẩn bị biểu thức chính qui dấu vết thời gian (timestamp regexp) "
+"%s"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "nối thêm tiền tố vào từng đường dẫn tập tin trong kho lưu"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "thi hành biểu thức chính quy trả về %d cho đầu vào: %s"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554
-#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460
-#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562
-#: builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "tập_tin"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "không thể tìm thấy tên tập tin trong miếng vá tại dòng %d"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "ghi kho lưu vào tập tin này"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+"git apply: git-diff sai - cần /dev/null, nhưng lại nhận được %s trên dòng %d"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "đọc .gitattributes trong thư mục làm việc"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr "git apply: git-diff sai - tên tập tin mới không nhất quán trên dòng %d"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "liệt kê các tập tin được lưu trữ vào stderr (đầu ra lỗi tiêu chuẩn)"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr "git apply: git-diff sai - tên tập tin cũ không nhất quán trên dòng %d"
 
-#: archive.c:437
-msgid "store only"
-msgstr "chỉ lưu (không nén)"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: git-diff sai - cần “/dev/null” trên dòng %d"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "nén nhanh hơn"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "chi tiết: dòng không cần: %.*s"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "nén nhỏ hơn"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "miếng vá phân mảnh mà không có phần đầu tại dòng %d: %.*s"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "liệt kê các kiểu nén được hỗ trợ"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"phần đầu diff cho git  thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong "
+"thành phần dẫn đầu tên của đường dẫn (dòng %d)"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "kho"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr "phần đầu diff cho git thiếu thông tin tên tập tin (dòng %d)"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "nhận kho nén từ kho chứa <kho> trên máy chủ"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "tập tin mới phụ thuộc vào nội dung cũ"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "lệnh"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "tập tin đã xóa vẫn còn nội dung"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "đường dẫn đến lệnh git-upload-pack trên máy chủ"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "miếng vá hỏng tại dòng %d"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "Gặp tùy chọn --remote không cần"
+#: apply.c:1832
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "tập tin mới %s phụ thuộc vào nội dung cũ"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "Tùy chọn --exec chỉ có thể được dùng cùng với --remote"
+#: apply.c:1834
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "tập tin đã xóa %s vẫn còn nội dung"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "Gặp tùy chọn không cần --output"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** cảnh báo: tập tin %s trở nên trống rỗng nhưng không bị xóa"
 
-#: archive.c:487
+#: apply.c:1984
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "Không hiểu định dạng “%s”"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "miếng vá định dạng nhị phân sai hỏng tại dòng %d: %.*s"
 
-#: archive.c:494
+#: apply.c:2021
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "Tham số không được hỗ trợ cho định dạng “%s”: -%d"
+msgid "unrecognized binary patch at line %d"
+msgstr "miếng vá định dạng nhị phân không được nhận ra tại dòng %d"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"Các mẫu dạng phủ định bị cấm dùng cho các thuộc tính của git\n"
-"Dùng “\\!” cho các chuỗi văn bản có dấu chấm than dẫn đầu."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "vá chỉ với “rác” tại dòng %d"
 
-#: bisect.c:441
+#: apply.c:2265
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "Không thể mở tập tin “%s”"
+msgid "unable to read symlink %s"
+msgstr "không thể đọc liên kết mềm %s"
 
-#: bisect.c:446
+#: apply.c:2269
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "nội dung được trích dẫn sai tập tin “%s”: %s"
+msgid "unable to open or read %s"
+msgstr "không thể mở hay đọc %s"
 
-#: bisect.c:655
+#: apply.c:2922
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "Chúng tôi không bisect thêm nữa!\n"
+msgid "invalid start of line: '%c'"
+msgstr "sai khởi đầu dòng: “%c”"
 
-#: bisect.c:708
+#: apply.c:3041
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "Không phải tên đối tượng commit %s hợp lệ"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)."
 
-#: bisect.c:732
+#: apply.c:3053
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"Hòa trộn trên %s là sai.\n"
-"Điều đó có nghĩa là lỗi đã được sửa chữa giữa %s và [%s].\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Nội dung bị giảm xuống còn (%ld/%ld) để áp dụng mảnh dữ liệu tại %d"
 
-#: bisect.c:737
+#: apply.c:3059
 #, c-format
 msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"Hòa trộn trên %s là mới.\n"
-"Gần như chắc chắn là có thay đổi giữa %s và [%s].\n"
+"trong khi đang tìm kiếm cho:\n"
+"%.*s"
 
-#: bisect.c:742
+#: apply.c:3081
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
+msgid "missing binary patch data for '%s'"
+msgstr "thiếu dữ liệu của miếng vá định dạng nhị phân cho “%s”"
+
+#: apply.c:3089
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"Hòa trộn trên %s là %s.\n"
-"Điều đó có nghĩa là lần chuyển giao “%s” đầu tiên là giữa %s và [%s].\n"
+"không thể reverse-apply một miếng vá nhị phân mà không đảo ngược hunk thành "
+"“%s”"
 
-#: bisect.c:750
+#: apply.c:3135
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
-"Một số điểm xét duyệt %s không phải tổ tiên của %s.\n"
-"git bisect không thể làm việc đúng đắn trong trường hợp này.\n"
-"Liệu có phải bạn nhầm lẫn các điểm %s và %s không?\n"
+"không thể áp dụng miếng vá nhị phân thành “%s” mà không có dòng chỉ mục đầy "
+"đủ"
 
-#: bisect.c:763
+#: apply.c:3145
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"hòa trộn trên cơ sở giữa %s và [%s] phải bị bỏ qua.\n"
-"Do vậy chúng tôi không thể chắc lần chuyển giao đầu tiên %s là giữa %s và "
-"%s.\n"
-"Chúng tôi vẫn cứ tiếp tục."
+"miếng vá áp dụng cho “%s” (%s), cái mà không khớp với các nội dung hiện tại."
 
-#: bisect.c:798
+#: apply.c:3153
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "Bisecting: nền hòa trộn cần phải được kiểm tra\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "miếng vá áp dụng cho một “%s” trống rỗng nhưng nó lại không trống"
 
-#: bisect.c:849
+#: apply.c:3171
 #, c-format
-msgid "a %s revision is needed"
-msgstr "cần một điểm xét duyệt %s"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "không thể đọc postimage %s cần thiết cho “%s”"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3184
 #, c-format
-msgid "could not create file '%s'"
-msgstr "không thể tạo tập tin “%s”"
+msgid "binary patch does not apply to '%s'"
+msgstr "miếng vá định dạng nhị phân không được áp dụng cho “%s”"
 
-#: bisect.c:917
+#: apply.c:3190
 #, c-format
-msgid "could not read file '%s'"
-msgstr "không thể đọc tập tin “%s”"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"vá nhị phân cho “%s” tạo ra kết quả không chính xác (mong chờ %s, lại nhận "
+"%s)"
 
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "việc đọc tham chiếu bisect gặp lỗi"
+#: apply.c:3211
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "gặp lỗi khi vá: %s:%ld"
 
-#: bisect.c:967
+#: apply.c:3333
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s là cả %s và %s\n"
+msgid "cannot checkout %s"
+msgstr "không thể lấy ra %s"
 
-#: bisect.c:975
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"không tìm thấy lần chuyển giao kiểm tra được nào.\n"
-"Có lẽ bạn bắt đầu với các tham số đường dẫn sai?\n"
+msgid "failed to read %s"
+msgstr "gặp lỗi khi đọc %s"
 
-#: bisect.c:994
+#: apply.c:3389
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(ước chừng %d bước)"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "đọc từ “%s” vượt ra ngoài liên kết mềm"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "Bisecting: còn %d điểm xét duyệt để kiểm sau %s này\n"
+msgid "path %s has been renamed/deleted"
+msgstr "đường dẫn %s đã bị xóa hoặc đổi tên"
 
-#: branch.c:53
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"Sau khi sửa nguyên nhân lỗi bạn có lẻ cần thử sửa\n"
-"thông tin theo dõi máy chủ bằng cách gọi lệnh\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
+msgid "%s: does not exist in index"
+msgstr "%s: không tồn tại trong bảng mục lục"
 
-#: branch.c:67
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Chưa cài đặt nhánh %s như là thượng nguồn của nó."
+msgid "%s: does not match index"
+msgstr "%s: không khớp trong mục lục"
 
-#: branch.c:93
-#, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s bằng cách rebase."
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
 
-#: branch.c:94
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s."
+msgid "Falling back to three-way merge...\n"
+msgstr "Đang trở lại hòa trộn “3-đường”…\n"
 
-#: branch.c:98
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s bằng cách rebase."
+msgid "cannot read the current contents of '%s'"
+msgstr "không thể đọc nội dung hiện hành của “%s”"
 
-#: branch.c:99
+#: apply.c:3580
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s."
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Gặp lỗi khi quay trở lại để hòa trộn kiểu “three-way”…\n"
 
-#: branch.c:104
+#: apply.c:3594
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s bằng cách rebase."
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Đã áp dụng miếng vá %s với các xung đột.\n"
 
-#: branch.c:105
+#: apply.c:3599
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Nhánh %s cài đặt để theo dõi tham chiếu máy chủ %s."
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Đã áp dụng miếng vá %s một cách sạch sẽ.\n"
 
-#: branch.c:109
-#, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
-"Nhánh %s cài đặt để theo dõi vết tham chiếu nội bộ %s bằng cách rebase."
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "loại bỏ miếng vá để lại nội dung tập tin"
 
-#: branch.c:110
+#: apply.c:3697
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Nhánh %s cài đặt để theo dõi tham chiếu nội bộ %s."
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Không thể ghi cấu hình nhánh thượng nguồn"
+msgid "%s: wrong type"
+msgstr "%s: sai kiểu"
 
-#: branch.c:156
+#: apply.c:3699
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Không theo dõi: thông tin chưa rõ ràng cho tham chiếu %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s có kiểu %o, cần %o"
 
-#: branch.c:185
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "“%s” không phải là một tên nhánh hợp lệ."
+msgid "invalid path '%s'"
+msgstr "đường dẫn không hợp lệ “%s”"
 
-#: branch.c:190
+#: apply.c:3908
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Đã có nhánh mang tên “%s”."
-
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Không thể ép buộc cập nhật nhánh hiện hành."
+msgid "%s: already exists in index"
+msgstr "%s: đã có từ trước trong bảng mục lục"
 
-#: branch.c:218
+#: apply.c:3911
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"Không thể cài đặt thông tin theo dõi; điểm bắt đầu “%s” không phải là một "
-"nhánh."
+msgid "%s: already exists in working directory"
+msgstr "%s: đã sẵn có trong thư mục đang làm việc"
 
-#: branch.c:220
+#: apply.c:3931
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "nhánh thượng nguồn đã yêu cầu “%s” không tồn tại"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"Nếu bạn có ý định “cải tổ” công việc của bạn trên nhánh thượng nguồn\n"
-"(upstream) cái mà đã sẵn có trên máy chủ, bạn cần chạy\n"
-"lệnh \"git fetch\" để lấy nó về.\n"
-"\n"
-"Nếu bạn có ý định đẩy lên lên một nhánh nội bộ mới cái mà\n"
-"sẽ theo dõi bản đối chiếu máy chủ của nó, bạn cần dùng lệnh\n"
-"\"git push -u\" để đặt cấu hình thượng nguồn bạn muốn push."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o)"
 
-#: branch.c:266
+#: apply.c:3936
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Không phải tên đối tượng hợp lệ: “%s”."
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o) của %s"
 
-#: branch.c:286
+#: apply.c:3956
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Tên đối tượng chưa rõ ràng: “%s”."
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "tập tin chịu tác động “%s” vượt ra ngoài liên kết mềm"
 
-#: branch.c:291
+#: apply.c:3960
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Nhánh không hợp lệ: “%s”."
+msgid "%s: patch does not apply"
+msgstr "%s: miếng vá không được áp dụng"
 
-#: branch.c:345
+#: apply.c:3975
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "“%s” đã được lấy ra tại “%s” rồi"
+msgid "Checking patch %s..."
+msgstr "Đang kiểm tra miếng vá %s…"
 
-#: branch.c:364
+#: apply.c:4066
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "HEAD của cây làm việc %s chưa được cập nhật"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "thông tin sha1 thiếu hoặc không dùng được cho mô-đun %s"
 
-#: bundle.c:34
+#: apply.c:4073
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "“%s” không giống như tập tin v2 bundle (định dạng dump của git)"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "thay đổi chế độ cho %s, cái mà không phải là HEAD hiện tại"
 
-#: bundle.c:61
+#: apply.c:4076
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "phần đầu không được thừa nhận: %s%s (%d)"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "thông tin sha1 còn thiếu hay không dùng được(%s)."
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "could not open '%s'"
-msgstr "không thể mở “%s”"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Kho chứa thiếu những lần chuyển giao tiên quyết này:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "cài đặt việc di chuyển qua các điểm xét duyệt gặp lỗi"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry gặp lỗi đối với đường dẫn “%s”"
 
-#: bundle.c:185
+#: apply.c:4085
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Bó dữ liệu chứa %d tham chiếu:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Lệnh bundle ghi lại toàn bộ lịch sử."
+msgid "could not add %s to temporary index"
+msgstr "không thể thêm %s vào chỉ mục tạm thời"
 
-#: bundle.c:194
+#: apply.c:4095
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Lệnh bundle yêu cầu %d tham chiếu này:"
-
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Không thể sản sinh đối tượng gói"
-
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "đối tượng gói đã chết"
+msgid "could not write temporary index to %s"
+msgstr "không thểghi mục lục tạm vào %s"
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list đã chết"
+#: apply.c:4233
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "không thể gỡ bỏ %s từ mục lục"
 
-#: bundle.c:353
+#: apply.c:4268
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "th.chiếu “%s” bị loại trừ bởi các tùy chọn rev-list"
+msgid "corrupt patch for submodule %s"
+msgstr "miếng vá sai hỏng cho mô-đun-con %s"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4274
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "đối số không được thừa nhận: %s"
+msgid "unable to stat newly created file '%s'"
+msgstr "không thể lấy thống kề về tập tin %s mới hơn đã được tạo"
 
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "Từ chối tạo một bó dữ liệu trống rỗng."
+#: apply.c:4282
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr "không thể tạo “kho lưu đằng sau” cho tập tin được tạo mới hơn %s"
 
-#: bundle.c:463
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "cannot create '%s'"
-msgstr "không thể tạo “%s”"
+msgid "unable to add cache entry for %s"
+msgstr "không thể thêm mục nhớ đệm cho %s"
 
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "mục lục gói đã chết"
+#: apply.c:4329
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "gặp lỗi khi ghi vào “%s”"
 
-#: color.c:290
+#: apply.c:4333
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "giá trị màu không hợp lệ: %.*s"
+msgid "closing file '%s'"
+msgstr "đang đóng tập tin “%s”"
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4403
 #, c-format
-msgid "could not parse %s"
-msgstr "không thể phân tích cú pháp %s"
+msgid "unable to write file '%s' mode %o"
+msgstr "không thể ghi vào tập tin “%s” chế độ %o"
 
-#: commit.c:42
+#: apply.c:4501
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s không phải là một lần chuyển giao!"
+msgid "Applied patch %s cleanly."
+msgstr "Đã áp dụng miếng vá %s một cách sạch sẽ."
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "hết bộ nhớ"
+#: apply.c:4509
+msgid "internal error"
+msgstr "lỗi nội bộ"
 
-#: config.c:516
+#: apply.c:4512
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "tập tin cấu hình sai tại dòng %d trong blob %s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "Đang áp dụng miếng vá %%s với %d lần từ chối…"
 
-#: config.c:520
+#: apply.c:4523
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "cấu hình sai tại dòng %d trong tập tin %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "đang cắt ngắn tên tập tin .rej thành %.*s.rej"
 
-#: config.c:524
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "cấu hình sai tại dòng %d trong đầu vào tiêu chuẩn"
+msgid "cannot open %s"
+msgstr "không mở được “%s”"
 
-#: config.c:528
+#: apply.c:4545
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "cấu hình sai tại dòng %d trong blob-mô-đun-con %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Khối nhớ #%d được áp dụng gọn gàng."
 
-#: config.c:532
+#: apply.c:4549
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "cấu hình sai tại dòng %d trong dòng lệnh %s"
+msgid "Rejected hunk #%d."
+msgstr "đoạn dữ liệu #%d bị từ chối."
 
-#: config.c:536
+#: apply.c:4659
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "cấu hình sai tại dòng %d trong %s"
+msgid "Skipped patch '%s'."
+msgstr "bỏ qua đường dẫn “%s”."
 
-#: config.c:655
-msgid "out of range"
-msgstr "nằm ngoài phạm vi"
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "không thừa nhận đầu vào"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "đơn vị không hợp lệ"
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "không thể đọc tập tin lưu bảng mục lục"
 
-#: config.c:661
+#: apply.c:4823
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s”: %s"
+msgid "can't open patch '%s': %s"
+msgstr "không thể mở miếng vá “%s”: %s"
 
-#: config.c:666
+#: apply.c:4850
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong blob %s: %s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "đã chấm dứt %d lỗi khoảng trắng"
 
-#: config.c:669
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong tập tin %s: %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d dòng thêm khoảng trắng lỗi."
 
-#: config.c:672
+#: apply.c:4864
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-"sai giá trị bằng số của cấu hình “%s” cho “%s” trong đầu vào tiêu chuẩn: %s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "%d dòng được áp dụng sau khi sửa các lỗi khoảng trắng."
 
-#: config.c:675
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-"sai giá trị bằng số của cấu hình “%s” cho “%s” trong submodule-blob %s: %s"
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "Không thể ghi tập tin lưu bảng mục lục mới"
 
-#: config.c:678
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong dòng lệnh %s: %s"
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "đường-dẫn"
 
-#: config.c:681
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "không áp dụng các thay đổi khớp với đường dẫn đã cho"
+
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho"
+
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
+msgstr "số"
+
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "gỡ bỏ <số> dấu gạch chéo dẫn đầu từ đường dẫn diff cổ điển"
+
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "lờ đi phần bổ xung được tạo ra bởi miếng vá"
+
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr ""
+"thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra"
+
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
+msgstr ""
+"hiển thị số lượng các dòng được thêm vào và xóa đi theo ký hiệu thập phân"
+
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả cho đầu vào"
+
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "thay vì áp dụng miếng vá, hãy xem xem miếng vá có thích hợp không"
+
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr "hãy chắc chắn là miếng vá thích hợp với bảng mục lục hiện hành"
+
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "áp dụng một miếng vá mà không động chạm đến cây làm việc"
+
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr "chấp nhận một miếng vá mà không động chạm đến cây làm việc"
+
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr ""
+"đồng thời áp dụng miếng vá (dùng với tùy chọn --stat/--summary/--check)"
+
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "thử hòa trộn kiểu three-way nếu việc vá không thể thực hiện được"
+
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+"xây dựng bảng mục lục tạm thời trên cơ sở thông tin bảng mục lục được nhúng"
+
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
+msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL"
+
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr "đảm bảo rằng có ít nhất <n> dòng nội dung khớp"
+
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
+msgstr "hành động"
+
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "tìm thấy một dòng mới hoặc bị sửa đổi mà nó có lỗi do khoảng trắng"
+
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
+msgstr "lờ đi sự thay đổi do khoảng trắng gây ra khi quét nội dung"
+
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "áp dụng miếng vá theo chiều ngược"
+
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "đừng hy vọng có ít nhất một dòng nội dung"
+
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "để lại khối dữ liệu bị từ chối trong các tập tin *.rej tương ứng"
+
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "cho phép chồng khối nhớ"
+
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "chi tiết"
+
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr ""
+"đã dò tìm thấy dung sai không chính xác thiếu dòng mới tại cuối tập tin"
+
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "không tin số lượng dòng trong phần đầu khối dữ liệu"
+
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr "gốc"
+
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "treo thêm <root> vào tất cả các tên tập tin"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>…]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <kho> [--exec <lệnh>] [<các-tùy-chọn>] <tree-ish> "
+"[<đường-dẫn>…]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
+
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "đặc tả đường dẫn “%s” không khớp với bất kỳ tập tin nào"
+
+#: archive.c:417
+msgid "fmt"
+msgstr "định_dạng"
+
+#: archive.c:417
+msgid "archive format"
+msgstr "định dạng lưu trữ"
+
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "tiền_tố"
+
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "nối thêm tiền tố vào từng đường dẫn tập tin trong kho lưu"
+
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "tập_tin"
+
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "ghi kho lưu vào tập tin này"
+
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr "đọc .gitattributes trong thư mục làm việc"
+
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "liệt kê các tập tin được lưu trữ vào stderr (đầu ra lỗi tiêu chuẩn)"
+
+#: archive.c:425
+msgid "store only"
+msgstr "chỉ lưu (không nén)"
+
+#: archive.c:426
+msgid "compress faster"
+msgstr "nén nhanh hơn"
+
+#: archive.c:434
+msgid "compress better"
+msgstr "nén nhỏ hơn"
+
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "liệt kê các kiểu nén được hỗ trợ"
+
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "kho"
+
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "nhận kho nén từ kho chứa <kho> trên máy chủ"
+
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "lệnh"
+
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "đường dẫn đến lệnh git-upload-pack trên máy chủ"
+
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "Gặp tùy chọn --remote không cần"
+
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "Tùy chọn --exec chỉ có thể được dùng cùng với --remote"
+
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "Gặp tùy chọn không cần --output"
+
+#: archive.c:475
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Không hiểu định dạng “%s”"
+
+#: archive.c:482
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Tham số không được hỗ trợ cho định dạng “%s”: -%d"
+
+#: attr.c:212
+#, c-format
+msgid "%.*s is not a valid attribute name"
+msgstr "%.*s không phải tên thuộc tính hợp lệ"
+
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Các mẫu dạng phủ định bị cấm dùng cho các thuộc tính của git\n"
+"Dùng “\\!” cho các chuỗi văn bản có dấu chấm than dẫn đầu."
+
+#: bisect.c:444
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Không thể mở tập tin “%s”"
+
+#: bisect.c:449
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "nội dung được trích dẫn sai tập tin “%s”: %s"
+
+#: bisect.c:657
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Chúng tôi không bisect thêm nữa!\n"
+
+#: bisect.c:710
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "Không phải tên đối tượng commit %s hợp lệ"
+
+#: bisect.c:734
+#, c-format
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"Hòa trộn trên %s là sai.\n"
+"Điều đó có nghĩa là lỗi đã được sửa chữa giữa %s và [%s].\n"
+
+#: bisect.c:739
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"Hòa trộn trên %s là mới.\n"
+"Gần như chắc chắn là có thay đổi giữa %s và [%s].\n"
+
+#: bisect.c:744
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"Hòa trộn trên %s là %s.\n"
+"Điều đó có nghĩa là lần chuyển giao “%s” đầu tiên là giữa %s và [%s].\n"
+
+#: bisect.c:752
+#, c-format
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"Một số điểm xét duyệt %s không phải tổ tiên của điểm xét duyệt %s.\n"
+"git bisect không thể làm việc đúng đắn trong trường hợp này.\n"
+"Liệu có phải bạn nhầm lẫn các điểm %s và %s không?\n"
+
+#: bisect.c:765
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"hòa trộn trên cơ sở giữa %s và [%s] phải bị bỏ qua.\n"
+"Do vậy chúng tôi không thể chắc lần chuyển giao đầu tiên %s là giữa %s và "
+"%s.\n"
+"Chúng tôi vẫn cứ tiếp tục."
+
+#: bisect.c:800
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bisecting: nền hòa trộn cần phải được kiểm tra\n"
+
+#: bisect.c:851
+#, c-format
+msgid "a %s revision is needed"
+msgstr "cần một điểm xét duyệt %s"
+
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
+#, c-format
+msgid "could not create file '%s'"
+msgstr "không thể tạo tập tin “%s”"
+
+#: bisect.c:919
+#, c-format
+msgid "could not read file '%s'"
+msgstr "không thể đọc tập tin “%s”"
+
+#: bisect.c:949
+msgid "reading bisect refs failed"
+msgstr "việc đọc tham chiếu bisect gặp lỗi"
+
+#: bisect.c:969
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s là cả %s và %s\n"
+
+#: bisect.c:977
+#, c-format
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"không tìm thấy lần chuyển giao kiểm tra được nào.\n"
+"Có lẽ bạn bắt đầu với các tham số đường dẫn sai?\n"
+
+#: bisect.c:996
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(ước chừng %d bước)"
+
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "Bisecting: còn %d điểm xét duyệt để kiểm sau %s này\n"
+
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"Sau khi sửa nguyên nhân lỗi bạn có lẻ cần thử sửa\n"
+"thông tin theo dõi máy chủ bằng cách gọi lệnh\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "Chưa cài đặt nhánh %s như là thượng nguồn của nó."
+
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s bằng cách rebase."
+
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s."
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s bằng cách rebase."
+
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s."
+
+#: branch.c:104
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s bằng cách rebase."
+
+#: branch.c:105
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Nhánh %s cài đặt để theo dõi tham chiếu máy chủ %s."
+
+#: branch.c:109
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"Nhánh %s cài đặt để theo dõi vết tham chiếu nội bộ %s bằng cách rebase."
+
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "Nhánh %s cài đặt để theo dõi tham chiếu nội bộ %s."
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Không thể ghi cấu hình nhánh thượng nguồn"
+
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Không theo dõi: thông tin chưa rõ ràng cho tham chiếu %s"
+
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "“%s” không phải là một tên nhánh hợp lệ."
+
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "Đã có nhánh mang tên “%s”."
+
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Không thể ép buộc cập nhật nhánh hiện hành."
+
+#: branch.c:218
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"Không thể cài đặt thông tin theo dõi; điểm bắt đầu “%s” không phải là một "
+"nhánh."
+
+#: branch.c:220
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "nhánh thượng nguồn đã yêu cầu “%s” không tồn tại"
+
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Nếu bạn có ý định “cải tổ” công việc của bạn trên nhánh thượng nguồn\n"
+"(upstream) cái mà đã sẵn có trên máy chủ, bạn cần chạy\n"
+"lệnh \"git fetch\" để lấy nó về.\n"
+"\n"
+"Nếu bạn có ý định đẩy lên lên một nhánh nội bộ mới cái mà\n"
+"sẽ theo dõi bản đối chiếu máy chủ của nó, bạn cần dùng lệnh\n"
+"\"git push -u\" để đặt cấu hình thượng nguồn bạn muốn push."
+
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "Không phải tên đối tượng hợp lệ: “%s”."
+
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "Tên đối tượng chưa rõ ràng: “%s”."
+
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "Nhánh không hợp lệ: “%s”."
+
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "“%s” đã được lấy ra tại “%s” rồi"
+
+#: branch.c:364
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD của cây làm việc %s chưa được cập nhật"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "“%s” không giống như tập tin v2 bundle (định dạng dump của git)"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "phần đầu không được thừa nhận: %s%s (%d)"
+
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
+#, c-format
+msgid "could not open '%s'"
+msgstr "không thể mở “%s”"
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Kho chứa thiếu những lần chuyển giao tiên quyết này:"
+
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "cài đặt việc di chuyển qua các điểm xét duyệt gặp lỗi"
+
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "Bó dữ liệu chứa %d tham chiếu:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Lệnh bundle ghi lại toàn bộ lịch sử."
+
+#: bundle.c:194
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "Lệnh bundle yêu cầu %d tham chiếu này:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Không thể sản sinh đối tượng gói"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "đối tượng gói đã chết"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list đã chết"
+
+#: bundle.c:353
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "th.chiếu “%s” bị loại trừ bởi các tùy chọn rev-list"
+
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "đối số không được thừa nhận: %s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Từ chối tạo một bó dữ liệu trống rỗng."
+
+#: bundle.c:463
+#, c-format
+msgid "cannot create '%s'"
+msgstr "không thể tạo “%s”"
+
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "mục lục gói đã chết"
+
+#: color.c:300
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "giá trị màu không hợp lệ: %.*s"
+
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
+#, c-format
+msgid "could not parse %s"
+msgstr "không thể phân tích cú pháp %s"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s không phải là một lần chuyển giao!"
+
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"Cảnh báo: ghi chú cho lần chuyển giao không hợp chuẩn UTF-8.\n"
+"Bạn có lẽ muốn tu bổ nó sau khi sửa lời chú thích, hoặc là đặt biến\n"
+"cấu hình i18n.commitencoding thành bảng mã mà dự án của bạn muốn dùng.\n"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "hết bộ nhớ"
+
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr "các điều kiện bao gồm cấu hình liên quan phải đến từ các tập tin"
+
+#: config.c:711
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "tập tin cấu hình sai tại dòng %d trong blob %s"
+
+#: config.c:715
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "cấu hình sai tại dòng %d trong tập tin %s"
+
+#: config.c:719
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "cấu hình sai tại dòng %d trong đầu vào tiêu chuẩn"
+
+#: config.c:723
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "cấu hình sai tại dòng %d trong blob-mô-đun-con %s"
+
+#: config.c:727
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "cấu hình sai tại dòng %d trong dòng lệnh %s"
+
+#: config.c:731
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "cấu hình sai tại dòng %d trong %s"
+
+#: config.c:859
+msgid "out of range"
+msgstr "nằm ngoài phạm vi"
+
+#: config.c:859
+msgid "invalid unit"
+msgstr "đơn vị không hợp lệ"
+
+#: config.c:865
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s”: %s"
+
+#: config.c:870
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong blob %s: %s"
+
+#: config.c:873
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong tập tin %s: %s"
+
+#: config.c:876
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr ""
+"sai giá trị bằng số của cấu hình “%s” cho “%s” trong đầu vào tiêu chuẩn: %s"
+
+#: config.c:879
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr ""
+"sai giá trị bằng số của cấu hình “%s” cho “%s” trong submodule-blob %s: %s"
+
+#: config.c:882
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong dòng lệnh %s: %s"
+
+#: config.c:885
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong %s: %s"
 
-#: config.c:768
+#: config.c:980
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "gặp lỗi mở rộng thư mục người dùng trong: “%s”"
 
-#: config.c:849 config.c:860
+#: config.c:1075 config.c:1086
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "mức nén zlib %d là sai"
 
-#: config.c:978
+#: config.c:1203
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "chế độ không hợp lệ đối với việc tạo đối tượng: %s"
 
-#: config.c:1312
+#: config.c:1359
+#, c-format
+msgid "bad pack compression level %d"
+msgstr "mức nén gói %d không hợp lệ"
+
+#: config.c:1557
 msgid "unable to parse command-line config"
 msgstr "không thể phân tích cấu hình dòng lệnh"
 
-#: config.c:1362
+#: config.c:1611
 msgid "unknown error occurred while reading the configuration files"
 msgstr "đã có lỗi chưa biết xảy ra trong khi đọc các tập tin cấu hình"
 
-#: config.c:1716
+#: config.c:1970
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "%s không hợp lệ: “%s”"
+
+#: config.c:1991
+#, c-format
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr ""
+"không hiểu giá trị core.untrackedCache “%s”; dùng giá trị mặc định “keep”"
+
+#: config.c:2017
+#, c-format
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
+msgstr "giá trị splitIndex.maxPercentChange “%d” phải nằm giữa 0 và 100"
+
+#: config.c:2028
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "không thể phân tích “%s” từ cấu hình dòng lệnh"
 
-#: config.c:1718
+#: config.c:2030
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "sai biến cấu hình “%s” trong tập tin “%s” tại dòng %d"
 
-#: config.c:1777
+#: config.c:2089
 #, c-format
 msgid "%s has multiple values"
 msgstr "%s có đa giá trị"
 
-#: config.c:2311
+#: config.c:2423 config.c:2648
+#, c-format
+msgid "fstat on %s failed"
+msgstr "fstat trên %s gặp lỗi"
+
+#: config.c:2541
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "không thể đặt “%s” thành “%s”"
 
-#: config.c:2313
+#: config.c:2543 builtin/remote.c:774
 #, c-format
 msgid "could not unset '%s'"
 msgstr "không thể thôi đặt “%s”"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Máy chủ bị treo trên lần tiếp xúc đầu tiên"
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"Không thể đọc từ kho trên mạng.\n"
+"\n"
+"Vui lòng chắc chắn là bạn có đủ thẩm quyền truy cập\n"
+"và kho chứa đã sẵn có."
+
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "Đang kiểm tra kết nối"
 
-#: connected.c:74
+#: connected.c:75
 msgid "Could not run 'git rev-list'"
 msgstr "Không thể chạy “git rev-list”"
 
-#: connected.c:94
+#: connected.c:95
 msgid "failed write to rev-list"
 msgstr "gặp lỗi khi ghi vào rev-list"
 
-#: connected.c:101
+#: connected.c:102
 msgid "failed to close rev-list's stdin"
 msgstr "gặp lỗi khi đóng đầu vào chuẩn stdin của rev-list"
 
+#: convert.c:201
+#, c-format
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"CRLF sẽ bị thay thế bằng LF trong %s.\n"
+"Tập tin sẽ có kiểu xuống dòng như bản gốc trong thư mục làm việc của bạn."
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF nên được thay bằng LF trong %s."
+
+#: convert.c:211
+#, c-format
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"LF sẽ bị thay thế bằng CRLF trong %s.\n"
+"Tập tin sẽ có kiểu xuống dòng như bản gốc trong thư mục làm việc của bạn."
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF nên thay bằng CRLF trong %s"
+
 #: date.c:97
 msgid "in the future"
 msgstr "trong tương lai"
@@ -797,26 +1502,31 @@ msgstr[0] "%lu năm trước"
 msgid "failed to read orderfile '%s'"
 msgstr "gặp lỗi khi đọc tập-tin-thứ-tự “%s”"
 
-#: diffcore-rename.c:540
+#: diffcore-rename.c:536
 msgid "Performing inexact rename detection"
 msgstr "Đang thực hiện dò tìm đổi tên không chính xác"
 
-#: diff.c:116
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "tùy chọn “%s” yêu cầu một giá trị"
+
+#: diff.c:124
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  Gặp lỗi khi phân tích dirstat cắt bỏ phần trăm “%s”\n"
 
-#: diff.c:121
+#: diff.c:129
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Không hiểu đối số dirstat “%s”\n"
 
-#: diff.c:225
+#: diff.c:281
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Không hiểu giá trị cho biến cấu hình “diff.submodule”: “%s”"
 
-#: diff.c:277
+#: diff.c:344
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -825,16 +1535,20 @@ msgstr ""
 "Tìm thấy các lỗi trong biến cấu hình “diff.dirstat”:\n"
 "%s"
 
-#: diff.c:3017
+#: diff.c:3102
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "phần mềm diff ở bên ngoài đã chết, dừng tại %s"
 
-#: diff.c:3415
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check và -s loại từ lẫn nhau"
+
+#: diff.c:3518
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow cần chính xác một đặc tả đường dẫn"
 
-#: diff.c:3578
+#: diff.c:3681
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -843,61 +1557,282 @@ msgstr ""
 "Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n"
 "%s"
 
-#: diff.c:3592
+#: diff.c:3695
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Gặp lỗi khi phân tích đối số tùy chọn --submodule: “%s”"
 
-#: dir.c:1823
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
+msgstr ""
+"nhận thấy đổi tên không chính xác đã bị bỏ qua bởi có quá nhiều tập tin."
+
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
+msgstr ""
+"chỉ tìm thấy các bản sao từ đường dẫn đã sửa đổi bởi vì có quá nhiều tập tin."
+
+#: diff.c:4725
+#, c-format
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr ""
+"bạn có lẽ muốn đặt biến %s của bạn thành ít nhất là %d và thử lại lệnh lần "
+"nữa."
+
+#: dir.c:1899
 msgid "failed to get kernel name and information"
 msgstr "gặp lỗi khi lấy tên và thông tin của nhân"
 
-#: dir.c:1942
+#: dir.c:2018
 msgid "Untracked cache is disabled on this system or location."
 msgstr "Bộ nhớ tạm không theo vết bị tắt trên hệ thống hay vị trí này."
 
-#: gpg-interface.c:178
+#: dir.c:2776 dir.c:2781
+#, c-format
+msgid "could not create directories for %s"
+msgstr "không thể tạo thư mục cho %s"
+
+#: dir.c:2806
+#, c-format
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "không thể di cư thư mục git từ “%s” sang “%s”"
+
+#: entry.c:280
+#, c-format
+msgid "could not stat file '%s'"
+msgstr "không thể lấy thống kê tập tin “%s”"
+
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: cần danh sách shallow"
+
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: cần ACK/NAK, nhưng lại nhận được EOF"
+
+#: fetch-pack.c:280 builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "lỗi máy chủ: %s"
+
+#: fetch-pack.c:281
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: cần ACK/NAK, nhưng lại nhận được “%s”"
+
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc cần multi_ack_detailed"
+
+#: fetch-pack.c:419
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "dòng shallow không hợp lệ: %s"
+
+#: fetch-pack.c:425
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "dòng unshallow không hợp lệ: %s"
+
+#: fetch-pack.c:427
+#, c-format
+msgid "object not found: %s"
+msgstr "Không tìm thấy đối tượng: %s"
+
+#: fetch-pack.c:430
+#, c-format
+msgid "error in object: %s"
+msgstr "lỗi trong đối tượng: %s"
+
+#: fetch-pack.c:432
+#, c-format
+msgid "no shallow found: %s"
+msgstr "không tìm shallow nào: %s"
+
+#: fetch-pack.c:435
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "cần shallow/unshallow, nhưng lại nhận được %s"
+
+#: fetch-pack.c:474
+#, c-format
+msgid "got %s %d %s"
+msgstr "nhận %s %d - %s"
+
+#: fetch-pack.c:488
+#, c-format
+msgid "invalid commit %s"
+msgstr "lần chuyển giao %s không hợp lệ"
+
+#: fetch-pack.c:521
+msgid "giving up"
+msgstr "chịu thua"
+
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
+msgstr "xong"
+
+#: fetch-pack.c:543
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "nhận %s (%d) %s"
+
+#: fetch-pack.c:589
+#, c-format
+msgid "Marking %s as complete"
+msgstr "Đánh dấu %s là đã hoàn thành"
+
+#: fetch-pack.c:737
+#, c-format
+msgid "already have %s (%s)"
+msgstr "đã sẵn có %s (%s)"
+
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: không thể rẽ nhánh sideband demultiplexer"
+
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
+msgstr "lỗi giao thức: phần đầu gói bị sai"
+
+#: fetch-pack.c:839
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: không thể rẽ nhánh %s"
+
+#: fetch-pack.c:855
+#, c-format
+msgid "%s failed"
+msgstr "%s gặp lỗi"
+
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
+msgstr "có lỗi trong sideband demultiplexer"
+
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
+msgstr "Máy chủ không hỗ trợ máy khách shallow"
+
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
+msgstr "Máy chủ hỗ trợ multi_ack_detailed"
+
+#: fetch-pack.c:891
+msgid "Server supports no-done"
+msgstr "Máy chủ hỗ trợ no-done"
+
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
+msgstr "Máy chủ hỗ trợ multi_ack"
+
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
+msgstr "Máy chủ hỗ trợ side-band-64k"
+
+#: fetch-pack.c:905
+msgid "Server supports side-band"
+msgstr "Máy chủ hỗ trợ side-band"
+
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Máy chủ hỗ trợ allow-tip-sha1-in-want"
+
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Máy chủ hỗ trợ allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
+msgstr "Máy chủ hỗ trợ ofs-delta"
+
+#: fetch-pack.c:930
+#, c-format
+msgid "Server version is %.*s"
+msgstr "Phiên bản máy chủ là %.*s"
+
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
+msgstr "Máy chủ không hỗ trợ --shallow-since"
+
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
+msgstr "Máy chủ không hỗ trợ --shallow-exclude"
+
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
+msgstr "Máy chủ không hỗ trợ --deepen"
+
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr "không có lần chuyển giao chung nào"
+
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: fetch gặp lỗi."
+
+#: fetch-pack.c:1127
+msgid "no matching remote head"
+msgstr "không khớp phần đầu máy chủ"
+
+#: fetch-pack.c:1149
+#, c-format
+msgid "no such remote ref %s"
+msgstr "Không có máy chủ tham chiếu nào như %s"
+
+#: fetch-pack.c:1152
+#, c-format
+msgid "Server does not allow request for unadvertised object %s"
+msgstr ""
+"Máy phục vụ không cho phép yêu cầu cho đối tượng không được báo trước %s"
+
+#: gpg-interface.c:185
 msgid "gpg failed to sign the data"
 msgstr "gpg gặp lỗi khi ký dữ liệu"
 
-#: gpg-interface.c:208
+#: gpg-interface.c:215
 msgid "could not create temporary file"
 msgstr "không thể tạo tập tin tạm thời"
 
-#: gpg-interface.c:210
+#: gpg-interface.c:217
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "gặp lỗi khi ghi chữ ký đính kèm vào “%s”"
 
-#: grep.c:1792
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "bỏ qua màu không hợp lệ “%.*s” trong log.graphColors"
+
+#: grep.c:1796
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "“%s”: không thể đọc %s"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "gặp lỗi khi lấy thống kê về “%s”"
 
-#: grep.c:1820
+#: grep.c:1824
 #, c-format
 msgid "'%s': short read"
 msgstr "“%s”: đọc ngắn"
 
-#: help.c:205
+#: help.c:218
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "các lệnh git sẵn có trong thư mục “%s”:"
 
-#: help.c:212
+#: help.c:225
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "các lệnh git sẵn có từ một nơi khác trong $PATH của bạn"
 
-#: help.c:244
+#: help.c:256
 msgid "These are common Git commands used in various situations:"
 msgstr "Có các lệnh Git chung được sử dụng trong các tình huống khác nhau:"
 
-#: help.c:309
+#: help.c:321
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -906,11 +1841,11 @@ msgstr ""
 "“%s” trông như là một lệnh git, nhưng chúng tôi không\n"
 "thể thực thi nó. Có lẽ là lệnh git-%s đã bị hỏng?"
 
-#: help.c:366
+#: help.c:376
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Ối chà. Hệ thống của bạn báo rằng chẳng có lệnh Git nào cả."
 
-#: help.c:388
+#: help.c:398
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -919,17 +1854,17 @@ msgstr ""
 "CẢNH BÁO: Bạn đã gọi lệnh Git có tên “%s”, mà nó lại không có sẵn.\n"
 "Tiếp tục và coi rằng ý bạn là “%s”"
 
-#: help.c:393
+#: help.c:403
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "trong %0.1f giây một cách tự động…"
 
-#: help.c:400
+#: help.c:410
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: “%s” không phải là một lệnh của git. Xem “git --help”."
 
-#: help.c:404 help.c:470
+#: help.c:414 help.c:480
 msgid ""
 "\n"
 "Did you mean this?"
@@ -940,11 +1875,70 @@ msgstr[0] ""
 "\n"
 "Có phải ý bạn là một trong số những cái này không?"
 
-#: help.c:466
+#: help.c:476
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
+#: ident.c:343
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"*** Vui lòng cho biết bạn là ai.\n"
+"\n"
+"Chạy\n"
+"\n"
+"  git config --global user.email \"bạn@ví_dụ.com\"\n"
+"  git config --global user.name \"Tên Của Bạn\"\n"
+"\n"
+"để đặt định danh mặc định cho tài khoản của bạn.\n"
+"Bỏ tùy chọn --global nếu chỉ định danh riêng cho kho này.\n"
+"\n"
+
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "không đưa ra địa chỉ thư điện tử và auto-detection bị tắt"
+
+#: ident.c:372
+#, c-format
+msgid "unable to auto-detect email address (got '%s')"
+msgstr "không thể tự dò tìm địa chỉ thư điện tử (nhận “%s”)"
+
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "chưa chỉ ra tên và tự-động-dò-tìm bị tắt"
+
+#: ident.c:388
+#, c-format
+msgid "unable to auto-detect name (got '%s')"
+msgstr "không thể dò-tìm-tự động tên (đã nhận “%s”)"
+
+#: ident.c:396
+#, c-format
+msgid "empty ident name (for <%s>) not allowed"
+msgstr "không cho phép tên định danh là rỗng (cho <%s>)"
+
+#: ident.c:402
+#, c-format
+msgid "name consists only of disallowed characters: %s"
+msgstr "tên chỉ được phép bao gồm các ký tự sau: %s"
+
+#: ident.c:417 builtin/commit.c:611
+#, c-format
+msgid "invalid date format: %s"
+msgstr "ngày tháng không hợp lệ: %s"
+
 #: lockfile.c:152
 #, c-format
 msgid ""
@@ -973,8 +1967,8 @@ msgstr "Không thể tạo “%s.lock”: %s"
 msgid "failed to read the cache"
 msgstr "gặp lỗi khi đọc bộ nhớ đệm"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
 msgid "unable to write new index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục mới"
 
@@ -982,69 +1976,69 @@ msgstr "không thể ghi tập tin lưu bảng mục lục mới"
 msgid "(bad commit)\n"
 msgstr "(commit sai)\n"
 
-#: merge-recursive.c:231
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache gặp lỗi đối với đường dẫn “%s”"
 
-#: merge-recursive.c:301
+#: merge-recursive.c:303
 msgid "error building trees"
 msgstr "gặp lỗi khi xây dựng cây"
 
-#: merge-recursive.c:720
+#: merge-recursive.c:727
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "gặp lỗi khi tạo đường dẫn “%s”%s"
 
-#: merge-recursive.c:731
+#: merge-recursive.c:738
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Gỡ bỏ %s để tạo chỗ (room) cho thư mục con\n"
 
-#: merge-recursive.c:745 merge-recursive.c:764
+#: merge-recursive.c:752 merge-recursive.c:771
 msgid ": perhaps a D/F conflict?"
 msgstr ": có lẽ là một xung đột D/F?"
 
-#: merge-recursive.c:754
+#: merge-recursive.c:761
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "từ chối đóng tập tin không được theo dõi tại “%s”"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "không thể đọc đối tượng %s “%s”"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:805
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "đối tượng blob được mong đợi cho %s “%s”"
 
-#: merge-recursive.c:822
+#: merge-recursive.c:829
 #, c-format
 msgid "failed to open '%s': %s"
 msgstr "gặp lỗi khi mở “%s”: %s"
 
-#: merge-recursive.c:833
+#: merge-recursive.c:840
 #, c-format
 msgid "failed to symlink '%s': %s"
 msgstr "gặp lỗi khi tạo liên kết mềm (symlink) “%s”: %s"
 
-#: merge-recursive.c:838
+#: merge-recursive.c:845
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "không hiểu phải làm gì với %06o %s “%s”"
 
-#: merge-recursive.c:978
+#: merge-recursive.c:985
 msgid "Failed to execute internal merge"
 msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
 
-#: merge-recursive.c:982
+#: merge-recursive.c:989
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Không thể thêm %s vào cơ sở dữ liệu"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1053,7 +2047,16 @@ msgstr ""
 "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
 "còn lại trong cây (tree)."
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: merge-recursive.c:1097
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
+msgstr ""
+"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s đến %s trong %s. Phiên bản %s "
+"của %s còn lại trong cây (tree)."
+
+#: merge-recursive.c:1104
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -1062,6 +2065,15 @@ msgstr ""
 "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
 "còn lại trong cây (tree) tại %s."
 
+#: merge-recursive.c:1109
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
+msgstr ""
+"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s đến %s trong %s. Phiên bản %s "
+"của %s còn lại trong cây (tree) tại %s."
+
 #: merge-recursive.c:1143
 msgid "rename"
 msgstr "đổi tên"
@@ -1099,124 +2111,141 @@ msgstr ""
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Đang đổi tên %s thành %s thay vì %s thành %s"
 
-#: merge-recursive.c:1531
+#: merge-recursive.c:1528
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "XUNG ĐỘT (đổi-tên/thêm): Đổi tên %s->%s trong %s. %s được thêm vào trong %s"
 
-#: merge-recursive.c:1546
+#: merge-recursive.c:1543
 #, c-format
 msgid "Adding merged %s"
 msgstr "Thêm hòa trộn %s"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Thay vào đó thêm vào %s"
 
-#: merge-recursive.c:1610
+#: merge-recursive.c:1607
 #, c-format
 msgid "cannot read object %s"
 msgstr "không thể đọc đối tượng %s"
 
-#: merge-recursive.c:1613
+#: merge-recursive.c:1610
 #, c-format
 msgid "object %s is not a blob"
 msgstr "đối tượng %s không phải là một blob"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modify"
 msgstr "sửa đổi"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modified"
 msgstr "đã sửa"
 
-#: merge-recursive.c:1676
+#: merge-recursive.c:1689
 msgid "content"
 msgstr "nội dung"
 
-#: merge-recursive.c:1683
+#: merge-recursive.c:1696
 msgid "add/add"
 msgstr "thêm/thêm"
 
-#: merge-recursive.c:1718
+#: merge-recursive.c:1732
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Đã bỏ qua %s (đã có sẵn lần hòa trộn này)"
 
-#: merge-recursive.c:1732
+#: merge-recursive.c:1746
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Tự-động-hòa-trộn %s"
 
-#: merge-recursive.c:1736 git-submodule.sh:919
+#: merge-recursive.c:1750 git-submodule.sh:944
 msgid "submodule"
 msgstr "mô-đun-con"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1751
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
 
-#: merge-recursive.c:1831
+#: merge-recursive.c:1845
 #, c-format
 msgid "Removing %s"
 msgstr "Đang xóa %s"
 
-#: merge-recursive.c:1857
+#: merge-recursive.c:1871
 msgid "file/directory"
 msgstr "tập-tin/thư-mục"
 
-#: merge-recursive.c:1863
+#: merge-recursive.c:1877
 msgid "directory/file"
 msgstr "thư-mục/tập-tin"
 
-#: merge-recursive.c:1868
+#: merge-recursive.c:1883
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "XUNG ĐỘT (%s): Ở đây không có thư mục nào có tên %s trong %s. Thêm %s như là "
 "%s"
 
-#: merge-recursive.c:1877
+#: merge-recursive.c:1892
 #, c-format
 msgid "Adding %s"
 msgstr "Thêm \"%s\""
 
-#: merge-recursive.c:1914
+#: merge-recursive.c:1929
 msgid "Already up-to-date!"
 msgstr "Đã cập nhật rồi!"
 
-#: merge-recursive.c:1923
+#: merge-recursive.c:1938
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "hòa trộn các cây %s và %s gặp lỗi"
 
-#: merge-recursive.c:2006
+#: merge-recursive.c:2021
 msgid "Merging:"
 msgstr "Đang trộn:"
 
-#: merge-recursive.c:2019
+#: merge-recursive.c:2034
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "tìm thấy %u tổ tiên chung:"
 
-#: merge-recursive.c:2058
+#: merge-recursive.c:2073
 msgid "merge returned no commit"
 msgstr "hòa trộn không trả về lần chuyển giao nào"
 
-#: merge-recursive.c:2121
+#: merge-recursive.c:2136
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Không thể phân tích đối tượng “%s”"
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
 msgid "Unable to write index."
 msgstr "Không thể ghi bảng mục lục"
 
+#: notes-merge.c:273
+#, c-format
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
+msgstr ""
+"Bạn đã chưa hoàn tất hòa trộn ghi chú trước đây (%s vẫn còn).\n"
+"Vui lòng dùng “git notes merge --commit” hay “git notes merge --abort” để "
+"chuyển giao hay bãi bỏ lần hòa trộn trước đây và bắt đầu một hòa trộn ghi "
+"chú mới."
+
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Bạn chưa kết thúc việc hòa trộn ghi chú (%s vẫn tồn tại)."
+
 #: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
@@ -1240,7 +2269,7 @@ msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
 msgid "Bad %s value: '%s'"
 msgstr "Giá trị %s sai: “%s”"
 
-#: object.c:242
+#: object.c:240
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "không thể phân tích đối tượng: “%s”"
@@ -1275,2767 +2304,2809 @@ msgstr "-SỐ"
 msgid "malformed object name '%s'"
 msgstr "tên đối tượng dị hình “%s”"
 
-#: path.c:798
+#: path.c:810
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Không thể làm %s được ghi bởi nhóm"
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
 msgstr ""
-"các cài đặt đặc tả đường dẫn “glob” và “noglob” toàn cục là xung khắc nhau"
+"Ký tự thoát chuỗi “\\” không được phép là ký tự cuối trong giá trị thuộc tính"
 
 #: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-"cài đặt đặc tả đường dẫn “literal” toàn cục là xung khắc với các cài đặt đặc "
-"tả đường dẫn toàn cục khác"
-
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "tham số không hợp lệ cho “tiền tố” màu nhiệm đặc tả đường đẫn"
-
-#: pathspec.c:183
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "Số màu nhiệm đặc tả đường dẫn không hợp lệ “%.*s” trong “%s”"
-
-#: pathspec.c:187
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "Thiếu “)” tại cuối của số màu nhiệm đặc tả đường dẫn trong “%s”"
-
-#: pathspec.c:205
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Chưa viết mã cho số màu nhiệm đặc tả đường dẫn “%c” trong “%s”"
-
-#: pathspec.c:230
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: “literal” và “glob” xung khắc nhau"
-
-#: pathspec.c:241
-#, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: “%s” ngoài một kho chứa"
-
-#: pathspec.c:291
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Đặc tả đường dẫn “%s” thì ở trong mô-đun-con “%.*s”"
+msgid "Only one 'attr:' specification is allowed."
+msgstr "chỉ có một đặc tả “attr:” là được phép."
 
-#: pathspec.c:353
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr "%s: số mầu nhiệm đặc tả đường dẫn chưa được hỗ trợ bởi lệnh này: %s"
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "đặc tả attr phải không được để trống"
 
-#: pathspec.c:433
+#: pathspec.c:189
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "đặc tả đường dẫn “%s” vượt ra ngoài liên kết mềm"
-
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-"Ở đây không có gì bị loại trừ bởi: các mẫu (loại trừ).\n"
-"Có lẽ bạn đã quên thêm hoặc là “:/” hoặc là “.”?"
-
-#: pretty.c:973
-msgid "unable to parse --pretty format"
-msgstr "không thể phân tích định dạng --pretty"
+msgid "invalid attribute name %s"
+msgstr "tên thuộc tính không hợp lệ %s"
 
-#: progress.c:235
-msgid "done"
-msgstr "xong"
-
-#: read-cache.c:1281
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
+#: pathspec.c:254
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
-"index.version được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
-"Dùng phiên bản %i"
+"các cài đặt đặc tả đường dẫn “glob” và “noglob” toàn cục là xung khắc nhau"
 
-#: read-cache.c:1291
-#, c-format
+#: pathspec.c:261
 msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
-"GIT_INDEX_VERSION được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
-"Dùng phiên bản %i"
-
-#: refs.c:551 builtin/merge.c:840
-#, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Không thể mở “%s” để ghi"
-
-#: refs/files-backend.c:2534
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr "không thể xóa bỏ tham chiếu %s: %s"
-
-#: refs/files-backend.c:2537
-#, c-format
-msgid "could not delete references: %s"
-msgstr "không thể xóa bỏ tham chiếu: %s"
-
-#: refs/files-backend.c:2546
-#, c-format
-msgid "could not remove reference %s"
-msgstr "không thể gỡ bỏ tham chiếu: %s"
-
-#: ref-filter.c:55
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "cần định dạng: %%(color:<color>)"
-
-#: ref-filter.c:57
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "không nhận ra màu: %%(màu:%s)"
-
-#: ref-filter.c:71
-#, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "không nhận ra định dạng: %%(%s)"
-
-#: ref-filter.c:77
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) không nhận các đối số"
-
-#: ref-filter.c:84
-#, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) không nhận các đối số"
-
-#: ref-filter.c:101
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "cần nội dung mang giá trị dương:lines=%s"
-
-#: ref-filter.c:103
-#, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "đối số không được thừa nhận %%(contents): %s"
-
-#: ref-filter.c:113
-#, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "đối số không được thừa nhận %%(objectname): %s"
+"cài đặt đặc tả đường dẫn “literal” toàn cục là xung khắc với các cài đặt đặc "
+"tả đường dẫn toàn cục khác"
 
-#: ref-filter.c:135
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "cần định dạng: %%(align:<width>,<position>)"
+#: pathspec.c:301
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "tham số không hợp lệ cho “tiền tố” màu nhiệm đặc tả đường đẫn"
 
-#: ref-filter.c:147
+#: pathspec.c:322
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "vị trí không được thừa nhận:%s"
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "Số màu nhiệm đặc tả đường dẫn không hợp lệ “%.*s” trong “%s”"
 
-#: ref-filter.c:151
+#: pathspec.c:327
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "chiều rộng không được thừa nhận:%s"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "Thiếu “)” tại cuối của số màu nhiệm đặc tả đường dẫn trong “%s”"
 
-#: ref-filter.c:157
+#: pathspec.c:365
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "đối số không được thừa nhận %%(align): %s"
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Chưa viết mã cho số màu nhiệm đặc tả đường dẫn “%c” trong “%s”"
 
-#: ref-filter.c:161
+#: pathspec.c:421 pathspec.c:443
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "cần giá trị độ rộng dương với nguyên tử %%(align)"
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Đặc tả đường dẫn “%s” thì ở trong mô-đun-con “%.*s”"
 
-#: ref-filter.c:244
+#: pathspec.c:483
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "tên trường dị hình: %.*s"
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: “literal” và “glob” xung khắc nhau"
 
-#: ref-filter.c:270
+#: pathspec.c:496
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "không hiểu tên trường: %.*s"
+msgid "%s: '%s' is outside repository"
+msgstr "%s: “%s” ngoài một kho chứa"
 
-#: ref-filter.c:372
+#: pathspec.c:584
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "định dạng: nguyên tử %%(end) được dùng mà không có nguyên tử tương ứng"
+msgid "'%s' (mnemonic: '%c')"
+msgstr "“%s” (mnemonic: “%c”)"
 
-#: ref-filter.c:424
+#: pathspec.c:594
 #, c-format
-msgid "malformed format string %s"
-msgstr "chuỗi định dạng dị hình %s"
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: số mầu nhiệm đặc tả đường dẫn chưa được hỗ trợ bởi lệnh này: %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= cần một đối số nguyên dương"
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"chuỗi rỗng làm đặc tả đường dẫn không hợp lệ ở lần phát hành kế tiếp. Vui "
+"lòng dùng . để thay thế nếu ý bạn là khớp mọi đường dẫn"
 
-#: ref-filter.c:883
+#: pathspec.c:668
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "tham chiếu “%s” không có %ld thành phần để mà :strip"
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "đặc tả đường dẫn “%s” vượt ra ngoài liên kết mềm"
 
-#: ref-filter.c:1046
-#, c-format
-msgid "unknown %.*s format %s"
-msgstr "Không hiểu định dạng %.*s %s"
+#: pretty.c:982
+msgid "unable to parse --pretty format"
+msgstr "không thể phân tích định dạng --pretty"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: read-cache.c:1442
 #, c-format
-msgid "missing object %s for %s"
-msgstr "thiếu đối tượng %s cho %s"
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
+"Dùng phiên bản %i"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: read-cache.c:1452
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "parse_object_buffer gặp lỗi trên %s cho %s"
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
+"Dùng phiên bản %i"
 
-#: ref-filter.c:1311
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "đối tượng dị hình tại “%s”"
+msgid "could not stat '%s'"
+msgstr "không thể lấy thông tin thống kê về “%s”"
 
-#: ref-filter.c:1373
+#: read-cache.c:2388
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "đang lờ đi tham chiếu với tên hỏng %s"
+msgid "unable to open git dir: %s"
+msgstr "không thể mở thư mục git: %s"
 
-#: ref-filter.c:1378
+#: read-cache.c:2400
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "đang lờ đi tham chiếu hỏng %s"
+msgid "unable to unlink: %s"
+msgstr "không thể bỏ liên kết (unlink): “%s”"
 
-#: ref-filter.c:1651
+#: refs.c:620 builtin/merge.c:844
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "định dạng: thiếu nguyên tử %%(end)"
+msgid "Could not open '%s' for writing"
+msgstr "Không thể mở “%s” để ghi"
 
-#: ref-filter.c:1705
-#, c-format
-msgid "malformed object name %s"
-msgstr "tên đối tượng dị hình %s"
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
+msgstr "cập nhật tham chiếu bị cấm trong môi trường kiểm tra"
 
-#: remote.c:746
+#: refs/files-backend.c:1631
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "Không thể lấy về cả %s và %s cho %s"
+msgid "could not delete reference %s: %s"
+msgstr "không thể xóa bỏ tham chiếu %s: %s"
 
-#: remote.c:750
+#: refs/files-backend.c:1634
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s thường theo dõi %s, không phải %s"
+msgid "could not delete references: %s"
+msgstr "không thể xóa bỏ tham chiếu: %s"
 
-#: remote.c:754
+#: refs/files-backend.c:1643
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s theo dõi cả %s và %s"
-
-#: remote.c:762
-msgid "Internal error"
-msgstr "Lỗi nội bộ"
+msgid "could not remove reference %s"
+msgstr "không thể gỡ bỏ tham chiếu: %s"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD không chỉ đến một nhánh nào cả"
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "đã ra đi"
 
-#: remote.c:1686
+#: ref-filter.c:36
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "không có nhánh nào như thế: “%s”"
+msgid "ahead %d"
+msgstr "phía trước %d"
 
-#: remote.c:1689
+#: ref-filter.c:37
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "không có thượng nguồn được cấu hình cho nhánh “%s”"
+msgid "behind %d"
+msgstr "đằng sau %d"
 
-#: remote.c:1695
+#: ref-filter.c:38
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-"nhánh thượng nguồn “%s” không được lưu lại như là một nhánh theo dõi máy chủ"
+msgid "ahead %d, behind %d"
+msgstr "trước %d, sau %d"
 
-#: remote.c:1710
+#: ref-filter.c:104
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr "đẩy lên đích “%s” trên máy chủ “%s” không có nhánh theo dõi nội bộ"
+msgid "expected format: %%(color:<color>)"
+msgstr "cần định dạng: %%(color:<color>)"
 
-#: remote.c:1725
+#: ref-filter.c:106
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "nhánh “%s” không có máy chủ để đẩy lên"
+msgid "unrecognized color: %%(color:%s)"
+msgstr "không nhận ra màu: %%(màu:%s)"
 
-#: remote.c:1736
+#: ref-filter.c:120
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "đẩy refspecs cho “%s” không bao gồm “%s”"
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "Giá trị nguyên cần tên tham chiếu:lstrip=%s"
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "đẩy lên mà không có đích (push.default là “nothing”)"
-
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "không thể phân giải đẩy “đơn giản” đến một đích đơn"
-
-#: remote.c:2073
+#: ref-filter.c:124
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-"Nhánh của bạn dựa trên cơ sở là “%s”, nhưng trên thượng nguồn không còn.\n"
-
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "   (dùng \" git branch --unset-upstream\" để sửa)\n"
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "Giá trị nguyên cần tên tham chiếu:rstrip=%s"
 
-#: remote.c:2080
+#: ref-filter.c:126
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Nhánh của bạn đã cập nhật với “%s”.\n"
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "đối số không được thừa nhận %%(%s): %s"
 
-#: remote.c:2084
+#: ref-filter.c:166
 #, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Nhánh của bạn đứng trước “%s” %d lần chuyển giao.\n"
-
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (dùng \"git push\" để xuất bản các lần chuyển giao nội bộ của bạn)\n"
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) không nhận các đối số"
 
-#: remote.c:2093
+#: ref-filter.c:173
 #, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-"Nhánh của bạn đứng đằng sau “%s” %d lần chuyển giao, và có thể được chuyển-"
-"tiếp-nhanh.\n"
-
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (dùng \"git pull\" để cập nhật nhánh nội bộ của bạn)\n"
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) không nhận các đối số"
 
-#: remote.c:2104
+#: ref-filter.c:180
 #, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-"Nhánh của bạn và “%s” bị phân kỳ,\n"
-"và có %d và %d lần chuyển giao khác nhau cho từng cái,\n"
-"tương ứng với mỗi lần.\n"
-
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-"  (dùng \"git pull\" để hòa trộn nhánh trên máy chủ vào trong nhánh của "
-"bạn)\n"
-
-#: revision.c:2132
-msgid "your current branch appears to be broken"
-msgstr "nhánh hiện tại của bạn có vẻ như bị hỏng"
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) không nhận các đối số"
 
-#: revision.c:2135
+#: ref-filter.c:199
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "nhánh hiện tại của bạn “%s” không có một lần chuyển giao nào cả"
-
-#: revision.c:2329
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent xung khắc với --bisect"
-
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "gặp lỗi khi mở “/dev/null”"
+msgid "positive value expected contents:lines=%s"
+msgstr "cần nội dung mang giá trị dương:lines=%s"
 
-#: run-command.c:94
+#: ref-filter.c:201
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) gặp lỗi"
-
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "gặp lỗi khi ký chứng thực đẩy"
-
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "kết thúc nhận không hỗ trợ đẩy --signed"
-
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"đừng gửi giấy chứng nhận đẩy trước khi kết thúc nhận không hỗ trợ đẩy --"
-"signed"
-
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "kết thúc nhận không hỗ trợ đẩy --atomic"
-
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "kết thúc nhận không hỗ trợ các tùy chọn của lệnh push"
-
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n"
-"với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”"
-
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n"
-"với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”\n"
-"và chuyển giao kết quả bằng lệnh “git commit”"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "đối số không được thừa nhận %%(contents): %s"
 
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
+#: ref-filter.c:214
 #, c-format
-msgid "Could not write to %s"
-msgstr "Không thể ghi vào %s"
+msgid "positive value expected objectname:short=%s"
+msgstr "cần nội dung mang giá trị dương:shot=%s"
 
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
+#: ref-filter.c:218
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Lỗi bao bọc %s."
-
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh cherry-pick."
-
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh hoàn nguyên."
-
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Chuyển giao các thay đổi của bạn hay tạm cất (stash) chúng để xử lý."
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "đối số không được thừa nhận %%(objectname): %s"
 
-#: sequencer.c:228
+#: ref-filter.c:245
 #, c-format
-msgid "%s: fast-forward"
-msgstr "%s: chuyển-tiếp-nhanh"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "cần định dạng: %%(align:<width>,<position>)"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
+#: ref-filter.c:257
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Không thể ghi tập tin lưu bảng mục lục mới"
-
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "Không thể phân giải lần chuyển giao HEAD\n"
+msgid "unrecognized position:%s"
+msgstr "vị trí không được thừa nhận:%s"
 
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "Không thể cập nhật cây bộ nhớ đệm\n"
+#: ref-filter.c:261
+#, c-format
+msgid "unrecognized width:%s"
+msgstr "chiều rộng không được thừa nhận:%s"
 
-#: sequencer.c:393
+#: ref-filter.c:267
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Không thể phân tích lần chuyển giao %s\n"
+msgid "unrecognized %%(align) argument: %s"
+msgstr "đối số không được thừa nhận %%(align): %s"
 
-#: sequencer.c:398
+#: ref-filter.c:271
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Không thể phân tích lần chuyển giao cha mẹ “%s”\n"
+msgid "positive width expected with the %%(align) atom"
+msgstr "cần giá trị độ rộng dương với nguyên tử %%(align)"
 
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "Tập tin lưu mục lục của bạn không được hòa trộn."
+#: ref-filter.c:286
+#, c-format
+msgid "unrecognized %%(if) argument: %s"
+msgstr "đối số không được thừa nhận %%(if): %s"
 
-#: sequencer.c:482
+#: ref-filter.c:371
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Lần chuyển giao %s là một lần hòa trộn nhưng không đưa ra tùy chọn -m."
+msgid "malformed field name: %.*s"
+msgstr "tên trường dị hình: %.*s"
 
-#: sequencer.c:490
+#: ref-filter.c:397
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Lần chuyển giao %s không có cha mẹ %d"
+msgid "unknown field name: %.*s"
+msgstr "không hiểu tên trường: %.*s"
 
-#: sequencer.c:494
+#: ref-filter.c:501
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr ""
-"Luồng chính đã được chỉ ra nhưng lần chuyển giao %s không phải là một lần "
-"hòa trộn."
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "định dạng: nguyên tử %%(if) được dùng mà không có nguyên tử %%(then)"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
+#: ref-filter.c:561
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: không thể phân tích lần chuyển giao mẹ của %s"
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "định dạng: nguyên tử %%(then) được dùng mà không có nguyên tử %%(if)"
 
-#: sequencer.c:511
+#: ref-filter.c:563
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Không thể lấy ghi chú lần chuyển giao cho %s"
+msgid "format: %%(then) atom used more than once"
+msgstr "định dạng: nguyên tử %%(then) được dùng nhiều hơn một lần"
 
-#: sequencer.c:597
+#: ref-filter.c:565
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "không thể hoàn nguyên %s… %s"
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "định dạng: nguyên tử %%(then) được dùng sau %%(else)"
 
-#: sequencer.c:598
+#: ref-filter.c:591
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "không thể áp dụng miếng vá %s… %s"
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "định dạng: nguyên tử %%(else) được dùng mà không có nguyên tử %%(if)"
 
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
+#: ref-filter.c:593
+#, c-format
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "định dạng: nguyên tử %%(else) được dùng mà không có nguyên tử %%(then)"
 
-#: sequencer.c:641
+#: ref-filter.c:595
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: gặp lỗi đọc bảng mục lục"
+msgid "format: %%(else) atom used more than once"
+msgstr "định dạng: nguyên tử %%(else) được dùng nhiều hơn một lần"
 
-#: sequencer.c:645
+#: ref-filter.c:608
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: gặp lỗi khi làm tươi mới bảng mục lục"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "định dạng: nguyên tử %%(end) được dùng mà không có nguyên tử tương ứng"
 
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "Không thể hoàn nguyên trong khi có hoàn nguyên khác."
+#: ref-filter.c:663
+#, c-format
+msgid "malformed format string %s"
+msgstr "chuỗi định dạng dị hình %s"
 
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "không thể thực hiện việc hoàn nguyên trong khi đang cherry-pick."
+#: ref-filter.c:1247
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(không nhánh, đang cải tổ %s)"
 
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "Không thể cherry-pick trong khi hoàn nguyên."
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(không nhánh, di chuyển nửa bước được bắt đầu tại %s)"
 
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr ""
-"Không thể thực hiện việc cherry-pick trong khi khi đang cherry-pick khác."
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
+#, c-format
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD được tách rời tại %s)"
 
-#: sequencer.c:732
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Không phân tích được dòng %d."
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD được tách rời từ %s)"
 
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "Không có lần chuyển giao nào được phân tích."
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(không nhánh)"
 
-#: sequencer.c:749
+#: ref-filter.c:1420 ref-filter.c:1451
 #, c-format
-msgid "Could not open %s"
-msgstr "Không thể mở %s"
+msgid "missing object %s for %s"
+msgstr "thiếu đối tượng %s cho %s"
 
-#: sequencer.c:753
+#: ref-filter.c:1423 ref-filter.c:1454
 #, c-format
-msgid "Could not read %s."
-msgstr "Không thể đọc %s."
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer gặp lỗi trên %s cho %s"
 
-#: sequencer.c:760
+#: ref-filter.c:1692
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Bảng chỉ thị không thể dùng được: %s"
+msgid "malformed object at '%s'"
+msgstr "đối tượng dị hình tại “%s”"
 
-#: sequencer.c:790
+#: ref-filter.c:1759
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Khóa không đúng: %s"
+msgid "ignoring ref with broken name %s"
+msgstr "đang lờ đi tham chiếu với tên hỏng %s"
 
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
+#: ref-filter.c:1764
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Giá trị không hợp lệ %s: %s"
+msgid "ignoring broken ref %s"
+msgstr "đang lờ đi tham chiếu hỏng %s"
 
-#: sequencer.c:803
+#: ref-filter.c:2028
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Bảng tùy chọn dị hình: %s"
+msgid "format: %%(end) atom missing"
+msgstr "định dạng: thiếu nguyên tử %%(end)"
 
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "có một thao tác “cherry-pick” hoặc “revert” đang được thực hiện"
+#: ref-filter.c:2109
+#, c-format
+msgid "malformed object name %s"
+msgstr "tên đối tượng dị hình %s"
 
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
+#: remote.c:754
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Không thể lấy về cả %s và %s cho %s"
 
-#: sequencer.c:827
+#: remote.c:758
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Không thể tạo thư mục xếp dãy %s"
+msgid "%s usually tracks %s, not %s"
+msgstr "%s thường theo dõi %s, không phải %s"
 
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "không cherry-pick hay hoàn nguyên trong tiến trình"
+#: remote.c:762
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s theo dõi cả %s và %s"
 
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "không thể phân giải HEAD"
+#: remote.c:770
+msgid "Internal error"
+msgstr "Lỗi nội bộ"
 
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "không thể hủy bỏ từ một nhánh mà nó còn chưa được tạo ra"
+#: remote.c:1685 remote.c:1787
+msgid "HEAD does not point to a branch"
+msgstr "HEAD không chỉ đến một nhánh nào cả"
 
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
+#: remote.c:1694
 #, c-format
-msgid "cannot open %s"
-msgstr "không mở được “%s”"
+msgid "no such branch: '%s'"
+msgstr "không có nhánh nào như thế: “%s”"
 
-#: sequencer.c:888
+#: remote.c:1697
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "không thể đọc %s: %s"
-
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "gặp kết thúc tập tin đột xuất"
+msgid "no upstream configured for branch '%s'"
+msgstr "không có thượng nguồn được cấu hình cho nhánh “%s”"
 
-#: sequencer.c:895
+#: remote.c:1703
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "tập tin HEAD “pre-cherry-pick” đã lưu “%s” bị hỏng"
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr ""
+"nhánh thượng nguồn “%s” không được lưu lại như là một nhánh theo dõi máy chủ"
 
-#: sequencer.c:921
+#: remote.c:1718
 #, c-format
-msgid "Could not format %s."
-msgstr "Không thể định dạng “%s”."
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "đẩy lên đích “%s” trên máy chủ “%s” không có nhánh theo dõi nội bộ"
 
-#: sequencer.c:1066
+#: remote.c:1730
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: không thể cherry-pick một %s"
+msgid "branch '%s' has no remote for pushing"
+msgstr "nhánh “%s” không có máy chủ để đẩy lên"
 
-#: sequencer.c:1069
+#: remote.c:1741
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: điểm xét duyệt sai"
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "đẩy refspecs cho “%s” không bao gồm “%s”"
 
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "Không thể hoàn nguyên một lần chuyển giao khởi tạo"
+#: remote.c:1754
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "đẩy lên mà không có đích (push.default là “nothing”)"
 
-#: setup.c:160
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s: không có đường dẫn nào như thế ở trong cây làm việc.\n"
-"Dùng “git <lệnh> -- <đường/dẫn>…” để chỉ định đường dẫn mà nó không tồn tại "
-"một cách nội bộ."
+#: remote.c:1776
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "không thể phân giải đẩy “đơn giản” đến một đích đơn"
 
-#: setup.c:173
+#: remote.c:2081
 #, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
-"tham số chưa rõ ràng “%s”: chưa biết điểm xem xét hay đường dẫn không trong "
-"cây làm việc.\n"
-"Dùng “--” để ngăn cách các đường dẫn khỏi điểm xem xét, như thế này:\n"
-"“git <lệnh> [<điểm xem xét>…] -- [<tập tin>…]”"
+"Nhánh của bạn dựa trên cơ sở là “%s”, nhưng trên thượng nguồn không còn.\n"
 
-#: setup.c:223
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"tham số chưa rõ ràng “%s”: cả điểm xem xét và tên tập tin.\n"
-"Dùng “--” để ngăn cách các đường dẫn khỏi điểm xem xét, như thế này:\n"
-"“git <lệnh> [<điểm xem xét>…] -- [<tập tin>…]”"
+#: remote.c:2085
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "   (dùng \" git branch --unset-upstream\" để sửa)\n"
 
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
+#: remote.c:2088
 #, c-format
-msgid "failed to read %s"
-msgstr "gặp lỗi khi đọc %s"
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Nhánh của bạn đã cập nhật với “%s”.\n"
 
-#: setup.c:468
+#: remote.c:2092
 #, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "Cần phiên bản kho git <= %d, nhưng lại nhận được %d"
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Nhánh của bạn đứng trước “%s” %d lần chuyển giao.\n"
 
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "tìm thấy phần mở rộng kho chưa biết:"
+#: remote.c:2098
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (dùng \"git push\" để xuất bản các lần chuyển giao nội bộ của bạn)\n"
 
-#: setup.c:762
+#: remote.c:2101
 #, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "Không phải là kho git (hoặc bất kỳ thư mục cha mẹ nào): %s"
-
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "Không thể quay lại cwd"
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"Nhánh của bạn đứng đằng sau “%s” %d lần chuyển giao, và có thể được chuyển-"
+"tiếp-nhanh.\n"
 
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "Không thể đọc thư mục làm việc hiện hành"
+#: remote.c:2109
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (dùng \"git pull\" để cập nhật nhánh nội bộ của bạn)\n"
 
-#: setup.c:920
+#: remote.c:2112
 #, c-format
 msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"Nhánh của bạn và “%s” bị phân kỳ,\n"
+"và có %d và %d lần chuyển giao khác nhau cho từng cái,\n"
+"tương ứng với mỗi lần.\n"
+
+#: remote.c:2122
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
-"Không phải là kho git (hay bất kỳ cha mẹ nào đến điểm gắn kết %s)\n"
-"Dừng tại biên của hệ thống tập tin (GIT_DISCOVERY_ACROSS_FILESYSTEM chưa "
-"đặt)."
+"  (dùng \"git pull\" để hòa trộn nhánh trên máy chủ vào trong nhánh của "
+"bạn)\n"
 
-#: setup.c:927
-#, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "Không thể chuyển sang “%s/..”"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "nhánh hiện tại của bạn có vẻ như bị hỏng"
 
-#: setup.c:989
+#: revision.c:2161
 #, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-"Gặp vấn đề với gía trị chế độ tập tin core.sharedRepository (0%.3o).\n"
-"người sở hữu tập tin phải luôn có quyền đọc và ghi."
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "nhánh hiện tại của bạn “%s” không có một lần chuyển giao nào cả"
 
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "vị trí tương đối trước điểm kết thúc của tập tin gói (.idx hỏng à?)"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent xung khắc với --bisect"
 
-#: sha1_file.c:2434
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "gặp lỗi khi mở “/dev/null”"
+
+#: run-command.c:127
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "vị trí tương đối nằm trước chỉ mục gói cho %s (mục lục bị hỏng à?)"
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) gặp lỗi"
 
-#: sha1_file.c:2438
+#: send-pack.c:150
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-"vị trí tương đối vượt quá cuối của chỉ mục gói cho %s (mục lục bị cắt cụt à?)"
+msgid "unable to parse remote unpack status: %s"
+msgstr "không thể phân tích tình trạng unpack máy chủ: %s"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-"Git thường không bao giờ tạo tham chiếu mà nó kết thúc với 40 ký tự hex\n"
-"bởi vì nó sẽ bị bỏ qua khi bạn chỉ định 40-hex. Những tham chiếu này\n"
-"có lẽ được tạo ra bởi một sai sót nào đó. Ví dụ,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse …)\n"
-"\n"
-"với \"$br\" không hiểu lý do vì sao trống rỗng và một tham chiếu 40-hex được "
-"tạo ra.\n"
-"Xin hãy kiểm tra những tham chiếu này và có thể xóa chúng đi. Tắt lời nhắn "
-"này\n"
-"bằng cách chạy lệnh \"git config advice.objectNameWarning false\""
+#: send-pack.c:152
+#, c-format
+msgid "remote unpack failed: %s"
+msgstr "máy chủ gặp lỗi unpack: %s"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
+msgstr "gặp lỗi khi ký chứng thực đẩy"
+
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
+msgstr "kết thúc nhận không hỗ trợ đẩy --signed"
+
+#: send-pack.c:430
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"Không thể thay đổi .gitmodules chưa hòa trộn, hãy giải quyết xung đột trộn "
-"trước"
+"đừng gửi giấy chứng nhận đẩy trước khi kết thúc nhận không hỗ trợ đẩy --"
+"signed"
 
-#: submodule.c:68 submodule.c:102
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Không thể tìm thấy phần trong .gitmodules nơi mà đường_dẫn=%s"
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
+msgstr "kết thúc nhận không hỗ trợ đẩy --atomic"
 
-#: submodule.c:76
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Không thể cập nhật mục .gitmodules %s"
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
+msgstr "kết thúc nhận không hỗ trợ các tùy chọn của lệnh push"
 
-#: submodule.c:109
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Không thể gỡ bỏ mục .gitmodules dành cho %s"
+#: sequencer.c:215
+msgid "revert"
+msgstr "hoàn nguyên"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "cherry-pick"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "không cho phép giá trị âm ở submodule.fetchJobs"
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
 
-#: submodule-config.c:358
+#: sequencer.c:221
 #, c-format
-msgid "invalid value for %s"
-msgstr "giá trị cho %s không hợp lệ"
+msgid "Unknown action: %d"
+msgstr "Không nhận ra thao tác: %d"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "chạy lệnh kéo theo “%s” gặp lỗi"
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n"
+"với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "không hiểu giá trị “%s” cho khóa “%s”"
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n"
+"với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”\n"
+"và chuyển giao kết quả bằng lệnh “git commit”"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: sequencer.c:294 sequencer.c:1682
 #, c-format
-msgid "more than one %s"
-msgstr "nhiều hơn một %s"
+msgid "could not lock '%s'"
+msgstr "không thể khóa “%s”"
 
-#: trailer.c:582
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "thẻ thừa trống rỗng trong phần thừa “%.*s”"
+msgid "could not write to '%s'"
+msgstr "không thể ghi vào “%s”"
 
-#: trailer.c:702
+#: sequencer.c:301
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "không đọc được tập tin đầu vào “%s”"
-
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "không thể đọc từ đầu vào tiêu chuẩn"
+msgid "could not write eol to '%s'"
+msgstr "không thể ghi eol vào “%s”"
 
-#: trailer.c:857 builtin/am.c:42
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
 #, c-format
-msgid "could not stat %s"
-msgstr "không thể lấy thông tin thống kê về %s"
+msgid "failed to finalize '%s'."
+msgstr "gặp lỗi khi finalize “%s”"
 
-#: trailer.c:859
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "\"%s\" không phải là tập tin bình thường"
+msgid "could not read '%s'"
+msgstr "Không thể đọc “%s”."
 
-#: trailer.c:861
+#: sequencer.c:355
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "tập tin %s người dùng không thể ghi được"
+msgid "your local changes would be overwritten by %s."
+msgstr "các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh %s."
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "không thể tạo tập tin tạm thời"
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "chuyển giao các thay đổi của bạn hay tạm cất (stash) chúng để xử lý."
 
-#: trailer.c:912
+#: sequencer.c:388
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "không thể đổi tên tập tin tạm thời thành %s"
+msgid "%s: fast-forward"
+msgstr "%s: chuyển-tiếp-nhanh"
 
-#: transport.c:62
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Không thể đặt thượng nguồn của “%s” thành “%s” của “%s”\n"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Không thể ghi tập tin lưu bảng mục lục mới"
 
-#: transport.c:151
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "vận chuyển: tùy chọn độ sâu “%s” không hợp lệ"
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "không thể phân giải lần chuyển giao HEAD\n"
 
-#: transport.c:771
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-"Các đường dẫn mô-đun-con sau đây có chứa các thay đổi cái mà\n"
-"có thể được tìm thấy trên mọi máy phục vụ:\n"
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "không thể cập nhật cây bộ nhớ đệm\n"
 
-#: transport.c:775
+#: sequencer.c:592
 #, c-format
 msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
 "\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"  git commit --amend %s\n"
 "\n"
-"or cd to the path and use\n"
+"If they are meant to go into a new commit, run:\n"
 "\n"
-"\tgit push\n"
+"  git commit %s\n"
 "\n"
-"to push them to a remote.\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
+"  git rebase --continue\n"
 msgstr ""
+"bạn có các thay đổi so với trong bệ phóng trong thư mục làm việc của bạn.\n"
+"Nếu các thay đổi này là muốn squash vào lần chuyển giao kế trước, chạy:\n"
 "\n"
-"Hãy thử\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"  git commit --amend %s\n"
 "\n"
-"hoặc cd đến đường dẫn và dùng\n"
+"Nếu chúng có ý là đi đến lần chuyển giao mới, thì chạy:\n"
 "\n"
-"\tgit push\n"
+"  git commit %s\n"
 "\n"
-"để đẩy chúng lên máy phục vụ.\n"
+"Trong cả hai trường hợp, một khi bạn làm xong, tiếp tục bằng:\n"
 "\n"
+"  git rebase --continue\n"
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "Bãi bỏ."
-
-#: transport-helper.c:1041
+#: sequencer.c:694
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Không thể đọc tham chiếu %s"
+msgid "could not parse commit %s\n"
+msgstr "không thể phân tích lần chuyển giao %s\n"
 
-#: unpack-trees.c:64
+#: sequencer.c:699
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
-"checkout:\n"
-"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn "
-"chuyển nhánh."
+msgid "could not parse parent commit %s\n"
+msgstr "không thể phân tích lần chuyển giao cha mẹ “%s”\n"
 
-#: unpack-trees.c:66
+#: sequencer.c:821
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
-"checkout:\n"
-"%%s"
+"không cần dòng thứ nhất của ghi chú squash:\n"
+"\n"
+"\t%.*s"
 
-#: unpack-trees.c:69
+#: sequencer.c:827
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
-"hòa trộn:\n"
-"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn hòa "
-"trộn."
+"dòng thứ nhất của ghi chú squash không hợp lệ:\n"
+"\n"
+"\t%.*s"
 
-#: unpack-trees.c:71
+#: sequencer.c:833 sequencer.c:858
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
-"hòa trộn:\n"
-"%%s"
+msgid "This is a combination of %d commits."
+msgstr "Đây là tổ hợp của %d lần chuyển giao."
 
-#: unpack-trees.c:74
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
-"%s:\n"
-"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn %s."
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "cần một HEAD để sửa"
 
-#: unpack-trees.c:76
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
-"%s:\n"
-"%%s"
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "không thể đọc HEAD"
 
-#: unpack-trees.c:81
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"Việc cập nhật các thư mục sau đây có thể làm mất các tập tin theo dõi trong "
-"nó:\n"
-"%s"
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
+msgstr "không thể đọc phần chú thích (message) của HEAD"
 
-#: unpack-trees.c:85
+#: sequencer.c:852
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh "
-"checkout:\n"
-"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn chuyển nhánh."
+msgid "cannot write '%s'"
+msgstr "không thể ghi “%s”"
 
-#: unpack-trees.c:87
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh "
-"checkout:\n"
-"%%s"
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "Đây là chú thích cho lần chuyển giao thứ nhất:"
 
-#: unpack-trees.c:90
+#: sequencer.c:869
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh hòa "
-"trộn:\n"
-"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn hòa trộn."
+msgid "could not read commit message of %s"
+msgstr "không thể đọc phần chú thích (message) của %s"
 
-#: unpack-trees.c:92
+#: sequencer.c:876
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh hòa "
-"trộn:\n"
-"%%s"
+msgid "This is the commit message #%d:"
+msgstr "Đây là chú thích cho lần chuyển giao thứ #%d:"
 
-#: unpack-trees.c:95
+#: sequencer.c:881
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi %s:\n"
-"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn %s."
+msgid "The commit message #%d will be skipped:"
+msgstr "Chú thích cho lần chuyển giao thứ #%d sẽ bị bỏ qua:"
 
-#: unpack-trees.c:97
+#: sequencer.c:886
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi %s:\n"
-"%%s"
+msgid "unknown command: %d"
+msgstr "không hiểu câu lệnh %d"
+
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "tập tin lưu mục lục của bạn không được hòa trộn."
 
-#: unpack-trees.c:102
+#: sequencer.c:970
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
-"checkout:\n"
-"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn chuyển nhánh."
+msgid "commit %s is a merge but no -m option was given."
+msgstr "lần chuyển giao %s là một lần hòa trộn nhưng không đưa ra tùy chọn -m."
 
-#: unpack-trees.c:104
+#: sequencer.c:978
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
-"checkout:\n"
-"%%s"
+msgid "commit %s does not have parent %d"
+msgstr "lần chuyển giao %s không có cha mẹ %d"
 
-#: unpack-trees.c:107
+#: sequencer.c:982
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
+msgid "mainline was specified but commit %s is not a merge."
 msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
-"hòa trộn:\n"
-"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn hòa trộn."
+"luồng chính đã được chỉ ra nhưng lần chuyển giao %s không phải là một lần "
+"hòa trộn."
 
-#: unpack-trees.c:109
+#: sequencer.c:988
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
-"hòa trộn:\n"
-"%%s"
+msgid "cannot get commit message for %s"
+msgstr "không thể lấy ghi chú lần chuyển giao cho %s"
 
-#: unpack-trees.c:112
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
-"%s:\n"
-"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn %s."
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: không thể phân tích lần chuyển giao mẹ của %s"
 
-#: unpack-trees.c:114
+#: sequencer.c:1071 sequencer.c:1827
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
-"%s:\n"
-"%%s"
+msgid "could not rename '%s' to '%s'"
+msgstr "không thể đổi tên “%s” thành “%s”"
 
-#: unpack-trees.c:121
+#: sequencer.c:1122
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "Mục “%s” đè lên “%s”. Không thể buộc."
+msgid "could not revert %s... %s"
+msgstr "không thể hoàn nguyên %s… %s"
 
-#: unpack-trees.c:124
+#: sequencer.c:1123
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"Không thể cập nhật checkout rải rác: các mục tin sau đây chưa cập nhật:\n"
-"%s"
+msgid "could not apply %s... %s"
+msgstr "không thể áp dụng miếng vá %s… %s"
 
-#: unpack-trees.c:126
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
+
+#: sequencer.c:1175
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi cập "
-"nhật checkout rải rác:\n"
-"%s"
+msgid "git %s: failed to read the index"
+msgstr "git %s: gặp lỗi đọc bảng mục lục"
 
-#: unpack-trees.c:128
+#: sequencer.c:1182
 #, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị xóa bỏ bởi cập "
-"nhật checkout rải rác:\n"
-"%s"
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: gặp lỗi khi làm tươi mới bảng mục lục"
 
-#: unpack-trees.c:205
+#: sequencer.c:1303
 #, c-format
-msgid "Aborting\n"
-msgstr "Bãi bỏ\n"
-
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "Đang lấy ra các tập tin"
+msgid "invalid line %d: %.*s"
+msgstr "dòng không hợp lệ %d: %.*s"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "tên lược đồ URL không hợp lệ, hoặc thiếu hậu tố “://”"
+#: sequencer.c:1311
+#, c-format
+msgid "cannot '%s' without a previous commit"
+msgstr "không thể “%s” thể mà không có lần chuyển giao kế trước"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:1344
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "thoát chuỗi %XX không hợp lệ"
+msgid "could not read '%s'."
+msgstr "không thể đọc “%s”."
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "thiếu máy chủ và lược đồ thì không phải là giao thức “file:”"
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "vui lòng sửa lỗi này bằng cách dùng “git rebase --edit-todo”."
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "URL kiểu “file:” không được chứa cổng"
+#: sequencer.c:1358
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "bảng chỉ thị không thể dùng được: %s"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "có các ký tự không hợp lệ trong tên máy"
+#: sequencer.c:1363
+msgid "no commits parsed."
+msgstr "không có lần chuyển giao nào được phân tích."
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "tên cổng không hợp lệ"
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
+msgstr "không thể cherry-pick trong khi hoàn nguyên."
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "đoạn đường dẫn “..” không hợp lệ"
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
+msgstr "không thể thực hiện việc hoàn nguyên trong khi đang cherry-pick."
 
-#: worktree.c:282
+#: sequencer.c:1439
 #, c-format
-msgid "failed to read '%s'"
-msgstr "gặp lỗi khi đọc “%s”"
+msgid "invalid key: %s"
+msgstr "khóa không đúng: %s"
 
-#: wrapper.c:222 wrapper.c:392
+#: sequencer.c:1442
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "không thể mở “%s” để đọc và ghi"
+msgid "invalid value for %s: %s"
+msgstr "giá trị cho %s không hợp lệ: %s"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: sequencer.c:1499
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "không thể mở “%s” để ghi"
+msgid "malformed options sheet: '%s'"
+msgstr "bảng tùy chọn dị hình: “%s”"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "không thể mở “%s” để đọc"
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
+msgstr "có một thao tác “cherry-pick” hoặc “revert” đang được thực hiện"
+
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: wrapper.c:605 wrapper.c:626
+#: sequencer.c:1541
 #, c-format
-msgid "unable to access '%s'"
-msgstr "không thể truy cập “%s”"
+msgid "could not create sequencer directory '%s'"
+msgstr "không thể tạo thư mục xếp dãy “%s”"
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "Không thể lấy thư mục làm việc hiện hành"
+#: sequencer.c:1555
+msgid "could not lock HEAD"
+msgstr "không thể khóa HEAD"
 
-#: wrapper.c:658
-#, c-format
-msgid "could not write to %s"
-msgstr "không thể ghi vào %s"
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
+msgstr "không cherry-pick hay hoàn nguyên trong tiến trình"
 
-#: wrapper.c:660
-#, c-format
-msgid "could not close %s"
-msgstr "không thể đóng %s"
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
+msgstr "không thể phân giải HEAD"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "Những đường dẫn chưa được hòa trộn:"
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
+msgstr "không thể hủy bỏ từ một nhánh mà nó còn chưa được tạo ra"
 
-#: wt-status.c:177 wt-status.c:204
+#: sequencer.c:1635 builtin/grep.c:910
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (dùng \"git reset %s <tập-tin>…\" để bỏ ra khỏi bệ phóng)"
-
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (dùng \"git rm --cached <tập-tin>…\" để bỏ ra khỏi bệ phóng)"
+msgid "cannot open '%s'"
+msgstr "không mở được “%s”"
 
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (dùng \"git add <tập-tin>…\" để đánh dấu là cần giải quyết)"
+#: sequencer.c:1637
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "không thể đọc “%s”: %s"
 
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (dùng \"git add/rm <tập-tin>…\" như là một cách thích hợp để đánh dấu là "
-"cần được giải quyết)"
+#: sequencer.c:1638
+msgid "unexpected end of file"
+msgstr "gặp kết thúc tập tin đột xuất"
 
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (dùng \"git rm <tập-tin>…\" để đánh dấu là cần giải quyết)"
+#: sequencer.c:1644
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "tập tin HEAD “pre-cherry-pick” đã lưu “%s” bị hỏng"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "Những thay đổi sẽ được chuyển giao:"
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr ""
+"Bạn có lẽ đã có HEAD đã bị di chuyển đi, Không thể tua, kiểm tra HEAD của "
+"bạn!"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "Các thay đổi chưa được đặt lên bệ phóng để chuyển giao:"
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
+msgstr "không thể đọc HEAD"
 
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (dùng \"git add <tập-tin>…\" để cập nhật những gì sẽ chuyển giao)"
+#: sequencer.c:1832 builtin/difftool.c:616
+#, c-format
+msgid "could not copy '%s' to '%s'"
+msgstr "không thể chép “%s” sang “%s”"
 
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-"  (dùng \"git add/rm <tập-tin>…\" để cập nhật những gì sẽ được chuyển giao)"
+#: sequencer.c:1848
+msgid "could not read index"
+msgstr "không thể đọc bảng mục lục"
 
-#: wt-status.c:223
+#: sequencer.c:1853
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
-"  (dùng \"git checkout -- <tập-tin>…\" để loại bỏ các thay đổi trong thư mục "
-"làm việc)"
+"thực thi gặp lỗi: %s\n"
+"%sBạn có thể sửa các trục trặc, và sau đó chạy lệnh\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-"  (chuyển giao hoặc là loại bỏ các nội dung chưa được theo dõi hay đã sửa "
-"chữa trong mô-đun-con)"
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "và tạo các thay đổi bảng mục lục và/hay cây làm việc\n"
 
-#: wt-status.c:237
+#: sequencer.c:1865
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 msgstr ""
-"  (dùng \"git %s <tập-tin>…\" để thêm vào những gì cần được chuyển giao)"
+"thực thi thành công: %s\n"
+"nhưng còn các thay đổi trong mục lục và/hoặc cây làm việc\n"
+"Chuyển giao hay tạm cất các thay đổi này đi, rồi chạy\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "bị xóa bởi cả hai:"
+#: sequencer.c:1920 git-rebase.sh:169
+#, c-format
+msgid "Applied autostash."
+msgstr "Đã áp dụng autostash."
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "được thêm vào bởi chúng ta:"
+#: sequencer.c:1932
+#, c-format
+msgid "cannot store %s"
+msgstr "không thử lưu “%s”"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "bị xóa đi bởi họ:"
+#: sequencer.c:1934 git-rebase.sh:173
+#, c-format
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"Áp dụng autostash có hiệu quả trong các xung đột.\n"
+"Các thay đổi của bạn an toàn trong stash (tạm cất đi).\n"
+"Bạn có thể chạy lệnh \"git stash pop\" hay \"git stash drop\" bất kỳ lúc "
+"nào.\n"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "được thêm vào bởi họ:"
+#: sequencer.c:2016
+#, c-format
+msgid "Stopped at %s...  %.*s\n"
+msgstr "Dừng lại ở %s…  %.*s\n"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "bị xóa bởi chúng ta:"
+#: sequencer.c:2058
+#, c-format
+msgid "unknown command %d"
+msgstr "không hiểu câu lệnh %d"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "được thêm vào bởi cả hai:"
+#: sequencer.c:2088
+msgid "could not read orig-head"
+msgstr "không thể đọc orig-head"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "bị sửa bởi cả hai:"
+#: sequencer.c:2092
+msgid "could not read 'onto'"
+msgstr "không thể đọc “onto”."
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "tập tin mới:"
+#: sequencer.c:2099
+#, c-format
+msgid "could not update %s"
+msgstr "không thể cập nhật %s"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "đã chép:"
+#: sequencer.c:2106
+#, c-format
+msgid "could not update HEAD to %s"
+msgstr "không thể cập nhật HEAD thành %s"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "đã xóa:"
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
+msgstr "không thể cải tổ: Bạn có các thay đổi chưa được đưa lên bệ phóng."
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "đã sửa:"
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "không thể xóa bỏ CHERRY_PICK_HEAD"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "đã đổi tên:"
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
+msgstr "không thể tu bỏ một lần chuyển giao không tồn tại"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "đổi-kiểu:"
+#: sequencer.c:2206
+#, c-format
+msgid "invalid file: '%s'"
+msgstr "tập tin không hợp lệ: “%s”"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "không hiểu:"
+#: sequencer.c:2208
+#, c-format
+msgid "invalid contents: '%s'"
+msgstr "nội dung không hợp lệ: “%s”"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "chưa hòa trộn:"
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
+msgstr ""
+"\n"
+"Bạn có các thay đổi chưa chuyển giao trong thư mục làm việc. Vui lòng\n"
+"chuyển giao chúng trước và sau đó chạy lệnh “git rebase --continue” lần nữa."
 
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "lần chuyển giao mới, "
+#: sequencer.c:2221
+msgid "could not commit staged changes."
+msgstr "không thể chuyển giao các thay đổi đã đưa lên bệ phóng."
 
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "nội dung bị sửa đổi, "
+#: sequencer.c:2301
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: không thể cherry-pick một %s"
 
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "nội dung chưa được theo dõi, "
+#: sequencer.c:2305
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: điểm xét duyệt sai"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "Những mô-đun-con đã bị thay đổi nhưng chưa được cập nhật:"
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
+msgstr "không thể hoàn nguyên một lần chuyển giao khởi tạo"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
+#: setup.c:165
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s: không có đường dẫn nào như thế ở trong cây làm việc.\n"
+"Dùng “git <lệnh> -- <đường/dẫn>…” để chỉ định đường dẫn mà nó không tồn tại "
+"một cách nội bộ."
 
-#: wt-status.c:839
+#: setup.c:178
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"Không động đến đường ở trên.\n"
-"Mọi thứ phía dưới sẽ được xóa bỏ."
+"tham số chưa rõ ràng “%s”: chưa biết điểm xem xét hay đường dẫn không trong "
+"cây làm việc.\n"
+"Dùng “--” để ngăn cách các đường dẫn khỏi điểm xem xét, như thế này:\n"
+"“git <lệnh> [<điểm xem xét>…] -- [<tập tin>…]”"
 
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "Bạn có những đường dẫn chưa được hòa trộn."
+#: setup.c:228
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"tham số chưa rõ ràng “%s”: cả điểm xem xét và tên tập tin.\n"
+"Dùng “--” để ngăn cách các đường dẫn khỏi điểm xem xét, như thế này:\n"
+"“git <lệnh> [<điểm xem xét>…] -- [<tập tin>…]”"
 
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (sửa các xung đột rồi chạy \"git commit\")"
+#: setup.c:475
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Cần phiên bản kho git <= %d, nhưng lại nhận được %d"
 
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (dùng \"git merge --abort\" để bãi bỏ việc hòa trộn)"
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "tìm thấy phần mở rộng kho chưa biết:"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "Tất cả các xung đột đã được giải quyết nhưng bạn vẫn đang hòa trộn."
+#: setup.c:776
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "Không phải là kho git (hoặc bất kỳ thư mục cha mẹ nào): %s"
+
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "Không thể quay lại cwd"
+
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "Không thể đọc thư mục làm việc hiện hành"
+
+#: setup.c:1022 setup.c:1028
+#, c-format
+msgid "Cannot change to '%s'"
+msgstr "Không thể chuyển sang “%s”"
+
+#: setup.c:1041
+#, c-format
+msgid ""
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
+msgstr ""
+"Không phải là kho git (hay bất kỳ cha mẹ nào đến điểm gắn kết %s)\n"
+"Dừng tại biên của hệ thống tập tin (GIT_DISCOVERY_ACROSS_FILESYSTEM chưa "
+"đặt)."
+
+#: setup.c:1106
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"Gặp vấn đề với gía trị chế độ tập tin core.sharedRepository (0%.3o).\n"
+"người sở hữu tập tin phải luôn có quyền đọc và ghi."
 
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (dùng \"git commit\" để hoàn tất việc hòa trộn)"
+#: sha1_file.c:559
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "đường dẫn “%s” không tồn tại"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "Bạn đang ở giữa của một phiên “am”."
+#: sha1_file.c:585
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "kho tham chiếu “%s” như là lấy ra liên kết vẫn chưa được hỗ trợ."
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "Miếng vá hiện tại bị trống rỗng."
+#: sha1_file.c:591
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "kho tham chiếu “%s” không phải là một kho nội bộ."
 
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (sửa các xung đột và sau đó chạy lệnh \"git am --continue\")"
+#: sha1_file.c:597
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "kho tham chiếu “%s” là nông"
 
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (dùng \"git am --skip\" để bỏ qua miếng vá này)"
+#: sha1_file.c:605
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "kho tham chiếu “%s” bị cấy ghép"
 
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)"
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "vị trí tương đối trước điểm kết thúc của tập tin gói (.idx hỏng à?)"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "Không thực hiện lệnh nào."
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "vị trí tương đối nằm trước chỉ mục gói cho %s (mục lục bị hỏng à?)"
 
-#: wt-status.c:1112
+#: sha1_file.c:2725
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Lệnh thực hiện cuối (%d lệnh được thực thi):"
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr ""
+"vị trí tương đối vượt quá cuối của chỉ mục gói cho %s (mục lục bị cắt cụt à?)"
 
-#: wt-status.c:1123
+#: sha1_name.c:409
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (xem thêm trong %s)"
+msgid "short SHA1 %s is ambiguous"
+msgstr "tóm lược SHA1 %s chưa rõ ràng"
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "Không có lệnh nào còn lại."
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "Các ứng cử là:"
+
+#: sha1_name.c:580
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"Git thường không bao giờ tạo tham chiếu mà nó kết thúc với 40 ký tự hex\n"
+"bởi vì nó sẽ bị bỏ qua khi bạn chỉ định 40-hex. Những tham chiếu này\n"
+"có lẽ được tạo ra bởi một sai sót nào đó. Ví dụ,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse …)\n"
+"\n"
+"với \"$br\" không hiểu lý do vì sao trống rỗng và một tham chiếu 40-hex được "
+"tạo ra.\n"
+"Xin hãy kiểm tra những tham chiếu này và có thể xóa chúng đi. Tắt lời nhắn "
+"này\n"
+"bằng cách chạy lệnh \"git config advice.objectNameWarning false\""
+
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"Không thể thay đổi .gitmodules chưa hòa trộn, hãy giải quyết xung đột trộn "
+"trước"
 
-#: wt-status.c:1131
+#: submodule.c:71 submodule.c:105
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "Lệnh cần làm kế tiếp (%d lệnh còn lại):"
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Không thể tìm thấy phần trong .gitmodules nơi mà đường_dẫn=%s"
 
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (dùng lệnh \"git rebase --edit-todo\" để xem và sửa)"
+#: submodule.c:79
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Không thể cập nhật mục .gitmodules %s"
 
-#: wt-status.c:1152
+#: submodule.c:112
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Bạn hiện nay đang thực hiện việc “rebase” nhánh “%s” trên “%s”."
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Không thể gỡ bỏ mục .gitmodules dành cho %s"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "Bạn hiện nay đang thực hiện việc “rebase” (“cải tổ”)."
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
 
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-"  (sửa các xung đột và sau đó chạy lệnh “cải tổ” \"git rebase --continue\")"
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "không cho phép giá trị âm ở submodule.fetchJobs"
 
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (dùng lệnh “cải tổ” \"git rebase --skip\" để bỏ qua lần vá này)"
+#: submodule.c:1194
+#, c-format
+msgid "'%s' not recognized as a git repository"
+msgstr "không nhận ra “%s” là một kho git"
 
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-"  (dùng lệnh “cải tổ” \"git rebase --abort\" để check-out nhánh nguyên thủy)"
+#: submodule.c:1332
+#, c-format
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "không thể lấy thống kê “git status” trong mô-đun-con “%s”"
 
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
-"  (khi tất cả các xung đột đã sửa xong: chạy lệnh “cải tổ” \"git rebase --"
-"continue\")"
+#: submodule.c:1345
+#, c-format
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "không thể chạy “git status” trong mô-đun-con “%s”"
 
-#: wt-status.c:1185
+#: submodule.c:1421
+#, c-format
+msgid "submodule '%s' has dirty index"
+msgstr "mô-đun-con “%s” có mục lục còn bẩn"
+
+#: submodule.c:1678
 #, c-format
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
 msgstr ""
-"Bạn hiện nay đang thực hiện việc chia tách một lần chuyển giao trong khi "
-"đang “rebase” nhánh “%s” trên “%s”."
+"relocate_gitdir cho mô-đun-con “%s” với nhiều hơn một cây làm việc là chưa "
+"được hỗ trợ"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-"Bạn hiện tại đang cắt đôi một lần chuyển giao trong khi đang thực hiện việc "
-"rebase."
+#: submodule.c:1690 submodule.c:1746
+#, c-format
+msgid "could not lookup name for submodule '%s'"
+msgstr "không thể tìm kiếm tên cho mô-đun-con “%s”"
 
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-"  (Một khi thư mục làm việc của bạn đã gọn gàng, chạy lệnh “cải tổ” \"git "
-"rebase --continue\")"
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "không thể tạo thư mục “%s”"
 
-#: wt-status.c:1197
+#: submodule.c:1697
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
 msgstr ""
-"Bạn hiện nay đang thực hiện việc sửa chữa một lần chuyển giao trong khi đang "
-"rebase nhánh “%s” trên “%s”."
+"Di cư thư mục git của “%s%s” từ\n"
+"“%s” sang\n"
+"“%s”\n"
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "Bạn hiện đang sửa một lần chuyển giao trong khi bạn thực hiện rebase."
+#: submodule.c:1781
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "không thể đệ quy vào trong mô-đun-con “%s”"
 
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (dùng \"git commit --amend\" để “tu bổ” lần chuyển giao hiện tại)"
+#: submodule.c:1825
+msgid "could not start ls-files in .."
+msgstr "không thể lấy thông tin thống kê về ls-files trong .."
 
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr ""
-"  (chạy lệnh “cải tổ” \"git rebase --continue\" một khi bạn cảm thấy hài "
-"lòng về những thay đổi của mình)"
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "LỖI: trả về chuỗi đường dẫn không khớp cwd?"
 
-#: wt-status.c:1217
+#: submodule.c:1864
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Bạn hiện nay đang thực hiện việc cherry-pick lần chuyển giao %s."
+msgid "ls-tree returned unexpected return code %d"
+msgstr "ls-tree trả về mã không như mong đợi %d"
 
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
-"  (sửa các xung đột và sau đó chạy lệnh \"git cherry-pick --continue\")"
+#: submodule-config.c:380
+#, c-format
+msgid "invalid value for %s"
+msgstr "giá trị cho %s không hợp lệ"
 
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git cherry-pick --"
-"continue\")"
+#: trailer.c:240
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "chạy lệnh kéo theo “%s” gặp lỗi"
 
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (dùng \"git cherry-pick --abort\" để hủy bỏ thao tác cherry-pick)"
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "không hiểu giá trị “%s” cho khóa “%s”"
 
-#: wt-status.c:1236
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Bạn hiện nay đang thực hiện thao tác hoàn nguyên lần chuyển giao “%s”."
+msgid "more than one %s"
+msgstr "nhiều hơn một %s"
 
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (sửa các xung đột và sau đó chạy lệnh \"git revert --continue\")"
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "thẻ thừa trống rỗng trong phần thừa “%.*s”"
 
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-"  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git revert --continue\")"
+#: trailer.c:722
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "không đọc được tập tin đầu vào “%s”"
 
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (dùng \"git revert --abort\" để hủy bỏ thao tác hoàn nguyên)"
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "không thể đọc từ đầu vào tiêu chuẩn"
 
-#: wt-status.c:1257
+#: trailer.c:949 builtin/am.c:44
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
-"Bạn hiện nay đang thực hiện thao tác di chuyển nửa bước (bisect), bắt đầu từ "
-"nhánh “%s”."
+msgid "could not stat %s"
+msgstr "không thể lấy thông tin thống kê về %s"
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "Bạn hiện tại đang thực hiện việc bisect (di chuyển nửa bước)."
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "\"%s\" không phải là tập tin bình thường"
 
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)"
+#: trailer.c:953
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "tập tin %s người dùng không thể ghi được"
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "Trên nhánh "
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "không thể tạo tập tin tạm thời"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "rebase ở chế độ tương tác đang được thực hiện; lên trên "
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "không thể đổi tên tập tin tạm thời thành %s"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "rebase đang được thực hiện: lên trên "
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Không thể đặt thượng nguồn của “%s” thành “%s” của “%s”\n"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "HEAD được tách rời tại "
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "vận chuyển: tùy chọn độ sâu “%s” không hợp lệ"
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "HEAD được tách rời từ "
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Các đường dẫn mô-đun-con sau đây có chứa các thay đổi cái mà\n"
+"có thể được tìm thấy trên mọi máy phục vụ:\n"
+
+#: transport.c:893
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"Hãy thử\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"hoặc cd đến đường dẫn và dùng\n"
+"\n"
+"\tgit push\n"
+"\n"
+"để đẩy chúng lên máy phục vụ.\n"
+"\n"
+
+#: transport.c:901
+msgid "Aborting."
+msgstr "Bãi bỏ."
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "Hiện tại chẳng ở nhánh nào cả."
+#: transport-helper.c:1080
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Không thể đọc tham chiếu %s"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "Lần chuyển giao khởi tạo"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "đối tượng cây quá ngắn"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "Những tập tin chưa được theo dõi"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "chế độ dị hình trong đề mục cây"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "Những tập tin bị lờ đi"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "tên tập tin trống rỗng trong mục tin cây"
+
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "tập tin cây quá ngắn"
 
-#: wt-status.c:1520
+#: unpack-trees.c:104
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
-"Cần %.2f giây để liệt kê tất cả các tập tin chưa được theo dõi. “status -"
-"uno”\n"
-"có lẽ làm nó nhanh hơn, nhưng bạn phải cẩn thận đừng quên mình phải\n"
-"tự thêm các tập tin mới (xem “git help status”.."
+"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
+"checkout:\n"
+"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn "
+"chuyển nhánh."
 
-#: wt-status.c:1526
+#: unpack-trees.c:106
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Những tập tin chưa được theo dõi không được liệt kê ra %s"
-
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr " (dùng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "Không có thay đổi nào"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
+"checkout:\n"
+"%%s"
 
-#: wt-status.c:1539
+#: unpack-trees.c:109
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
 msgstr ""
-"không có thay đổi nào được thêm vào để chuyển giao (dùng \"git add\" và/hoặc "
-"\"git commit -a\")\n"
+"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
+"hòa trộn:\n"
+"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn hòa "
+"trộn."
 
-#: wt-status.c:1542
+#: unpack-trees.c:111
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "không có thay đổi nào được thêm vào để chuyển giao\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
+"hòa trộn:\n"
+"%%s"
 
-#: wt-status.c:1545
+#: unpack-trees.c:114
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
 msgstr ""
-"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
-"theo dõi hiện diện (dùng \"git add\" để đưa vào theo dõi)\n"
+"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
+"%s:\n"
+"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn %s."
 
-#: wt-status.c:1548
+#: unpack-trees.c:116
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
-"theo dõi hiện diện\n"
+"Các thay đổi nội bộ của bạn với các tập tin sau đây sẽ bị ghi đè bởi lệnh "
+"%s:\n"
+"%%s"
 
-#: wt-status.c:1551
+#: unpack-trees.c:121
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
 msgstr ""
-"không có gì để chuyển giao (tạo/sao-chép các tập tin và dùng \"git add\" để "
-"đưa vào theo dõi)\n"
+"Việc cập nhật các thư mục sau đây có thể làm mất các tập tin chưa theo dõi "
+"trong nó:\n"
+"%s"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:125
 #, c-format
-msgid "nothing to commit\n"
-msgstr "không có gì để chuyển giao\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh "
+"checkout:\n"
+"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn chuyển nhánh."
 
-#: wt-status.c:1557
+#: unpack-trees.c:127
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
 msgstr ""
-"không có gì để chuyển giao (dùng -u xem các tập tin chưa được theo dõi)\n"
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh "
+"checkout:\n"
+"%%s"
 
-#: wt-status.c:1561
+#: unpack-trees.c:130
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "không có gì để chuyển giao, thư mục làm việc sạch sẽ\n"
-
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "Lần chuyển giao khởi tạo trên "
-
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD (không nhánh)"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh hòa "
+"trộn:\n"
+"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn hòa trộn."
 
-#: wt-status.c:1701
-msgid "gone"
-msgstr "đã ra đi"
+#: unpack-trees.c:132
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi lệnh hòa "
+"trộn:\n"
+"%%s"
 
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "đằng sau "
+#: unpack-trees.c:135
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi %s:\n"
+"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn %s."
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "phía trước "
+#: unpack-trees.c:137
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi %s:\n"
+"%%s"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: unpack-trees.c:142
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "gặp lỗi khi bỏ liên kết (unlink) “%s”"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
+"checkout:\n"
+"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn chuyển nhánh."
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<các-tùy-chọn>] [--]  <pathspec>…"
+#: unpack-trees.c:144
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
+"checkout:\n"
+"%%s"
 
-#: builtin/add.c:65
+#: unpack-trees.c:147
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "trạng thái lệnh diff không như mong đợi %c"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
+"hòa trộn:\n"
+"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn hòa trộn."
 
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "Cập nhật tập tin gặp lỗi"
+#: unpack-trees.c:149
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
+"hòa trộn:\n"
+"%%s"
 
-#: builtin/add.c:81
+#: unpack-trees.c:152
 #, c-format
-msgid "remove '%s'\n"
-msgstr "gỡ bỏ “%s”\n"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
+"%s:\n"
+"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn %s."
 
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
+#: unpack-trees.c:154
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"Đưa ra khỏi bệ phóng các thay đổi sau khi làm tươi mới lại bảng mục lục:"
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi lệnh "
+"%s:\n"
+"%%s"
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "Không thể đọc bảng mục lục"
+#: unpack-trees.c:161
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Mục “%s” đè lên “%s”. Không thể buộc."
 
-#: builtin/add.c:207
+#: unpack-trees.c:164
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Không thể mở “%s” để ghi."
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"Không thể cập nhật checkout rải rác: các mục tin sau đây chưa cập nhật:\n"
+"%s"
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "Không thể ghi ra miếng vá"
+#: unpack-trees.c:166
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị ghi đè bởi cập "
+"nhật checkout rải rác:\n"
+"%s"
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "gặp lỗi khi sửa miếng vá"
+#: unpack-trees.c:168
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị xóa bỏ bởi cập "
+"nhật checkout rải rác:\n"
+"%s"
 
-#: builtin/add.c:217
+#: unpack-trees.c:170
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "không thể lấy thông tin thống kê về “%s”"
+msgid ""
+"Cannot update submodule:\n"
+"%s"
+msgstr ""
+"Không thể cập nhật mô-đun-con:\n"
+"%s"
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "Miếng vá trống rỗng. Nên bỏ qua."
+#: unpack-trees.c:247
+#, c-format
+msgid "Aborting\n"
+msgstr "Bãi bỏ\n"
 
-#: builtin/add.c:224
+#: unpack-trees.c:272
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Không thể áp dụng miếng vá “%s”"
+msgid "submodule update strategy not supported for submodule '%s'"
+msgstr "chiến lược cập nhật mô-đun-con không được hỗ trợ cho mô-đun-con “%s”"
+
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "Đang lấy ra các tập tin"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
-"Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore "
-"của bạn:\n"
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "tên lược đồ URL không hợp lệ, hoặc thiếu hậu tố “://”"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "chạy thử"
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "thoát chuỗi %XX không hợp lệ"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "chi tiết"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "thiếu máy chủ và lược đồ thì không phải là giao thức “file:”"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "sửa bằng cách tương tác"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "URL kiểu “file:” không được chứa cổng"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "chọn “hunks” theo kiểu tương tác"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "có các ký tự không hợp lệ trong tên máy"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "sửa diff hiện nay và áp dụng nó"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "tên cổng không hợp lệ"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "cho phép thêm các tập tin bị bỏ qua khác"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "đoạn đường dẫn “..” không hợp lệ"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "cập nhật các tập tin được theo dõi"
+#: worktree.c:285
+#, c-format
+msgid "failed to read '%s'"
+msgstr "gặp lỗi khi đọc “%s”"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "chỉ ghi lại sự việc mà đường dẫn sẽ được thêm vào sau"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "không thể mở “%s” để đọc và ghi"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr ""
-"thêm các thay đổi từ tất cả các tập tin có cũng như không được theo dõi dấu "
-"vết"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "không thể mở “%s” để ghi"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr ""
-"lờ đi các đường dẫn bị gỡ bỏ trong cây thư mục làm việc (giống với --no-all)"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "không thể mở “%s” để đọc"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "không thêm, chỉ làm tươi mới bảng mục lục"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
+msgstr "không thể truy cập “%s”"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "chie bỏ qua những tập tin mà nó không thể được thêm vào bởi vì gặp lỗi"
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "Không thể lấy thư mục làm việc hiện hành"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr ""
-"kiểm tra xem - thậm chí thiếu - tập tin bị bỏ qua trong quá trình chạy thử"
+#: wrapper.c:634
+#, c-format
+msgid "could not write to %s"
+msgstr "không thể ghi vào %s"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: wrapper.c:636
+#, c-format
+msgid "could not close %s"
+msgstr "không thể đóng %s"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "ghi đè lên bít thi hành của các tập tin được liệt kê"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Những đường dẫn chưa được hòa trộn:"
 
-#: builtin/add.c:292
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Sử dụng tùy chọn -f nếu bạn thực sự muốn thêm chúng vào.\n"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (dùng \"git reset %s <tập-tin>…\" để bỏ ra khỏi bệ phóng)"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "thêm tập tin gặp lỗi"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (dùng \"git rm --cached <tập-tin>…\" để bỏ ra khỏi bệ phóng)"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A và -u xung khắc nhau"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (dùng \"git add <tập-tin>…\" để đánh dấu là cần giải quyết)"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Tùy chọn --ignore-missing chỉ có thể được dùng cùng với --dry-run"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (dùng \"git add/rm <tập-tin>…\" như là một cách thích hợp để đánh dấu là "
+"cần được giải quyết)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "--chmod tham số “%s” phải hoặc là -x hay +x"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (dùng \"git rm <tập-tin>…\" để đánh dấu là cần giải quyết)"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Không có gì được chỉ ra, không có gì được thêm vào.\n"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "Những thay đổi sẽ được chuyển giao:"
 
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Có lẽ ý bạn là “git add .” phải không?\n"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "Các thay đổi chưa được đặt lên bệ phóng để chuyển giao:"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "tập tin ghi bảng mục lục bị hỏng"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (dùng \"git add <tập-tin>…\" để cập nhật những gì sẽ chuyển giao)"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "Không thể ghi tập tin lưu bảng mục lục mới"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr ""
+"  (dùng \"git add/rm <tập-tin>…\" để cập nhật những gì sẽ được chuyển giao)"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "Không thể đọc “%s”."
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (dùng \"git checkout -- <tập-tin>…\" để loại bỏ các thay đổi trong thư mục "
+"làm việc)"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "không thể phân tích cú pháp văn lệnh tác giả"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (chuyển giao hoặc là loại bỏ các nội dung chưa được theo dõi hay đã sửa "
+"chữa trong mô-đun-con)"
 
-#: builtin/am.c:503
+#: wt-status.c:238
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "“%s” bị xóa bởi móc applypatch-msg"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr ""
+"  (dùng \"git %s <tập-tin>…\" để thêm vào những gì cần được chuyển giao)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Dòng đầu vào dị hình: “%s”."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "bị xóa bởi cả hai:"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Gặp lỗi khi sao chép ghi chú (note) từ “%s” tới “%s”"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "được thêm vào bởi chúng ta:"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "fseek gặp lỗi"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "bị xóa đi bởi họ:"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "không thể phân tích cú pháp “%s”"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "được thêm vào bởi họ:"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Chỉ có một sê-ri miếng vá StGIT được áp dụng một lúc"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "bị xóa bởi chúng ta:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "dấu thời gian không hợp lệ"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "được thêm vào bởi cả hai:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "dòng Ngày tháng không hợp lệ"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "bị sửa bởi cả hai:"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "độ lệch múi giờ không hợp lệ"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "tập tin mới:"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Dò tìm định dạng miếng vá gặp lỗi."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "đã chép:"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "tạo thư mục \"%s\" gặp lỗi"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "đã xóa:"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Gặp lỗi khi chia nhỏ các miếng vá."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "đã sửa:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "không thể ghi tập tin lưu mục lục"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "đã đổi tên:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Khi bạn đã phân giải xong trục trặc này, hãy chạy \"%s --continue\"."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "đổi-kiểu:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-"Nếu bạn muốn bỏ qua miếng vá này, hãy chạy lệnh \"%s --skip\" để thay thế."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "không hiểu:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr "Để phục hồi lại nhánh gốc và dừng vá, hãy chạy \"%s --abort\"."
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "chưa hòa trộn:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Miếng vá trống rỗng. Quá trình chia nhỏ miếng vá có lỗi?"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "lần chuyển giao mới, "
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "dòng thụt lề không hợp lệ: %s"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "nội dung bị sửa đổi, "
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "không thể phân tích lần chuyển giao “%s”"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "nội dung chưa được theo dõi, "
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "Những mô-đun-con đã bị thay đổi nhưng chưa được cập nhật:"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-"Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở…"
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
 
-#: builtin/am.c:1623
+#: wt-status.c:914
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
-"Bạn đã sửa miếng vá của mình bằng cách thủ công à?\n"
-"Nó không thể áp dụng các blob đã được ghi lại trong bảng mục lục của nó."
+"Không động đến đường ở trên.\n"
+"Mọi thứ phía dưới sẽ được xóa bỏ."
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Đang trở lại để vá cơ sở và “hòa trộn 3-đường”…"
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "Bạn có những đường dẫn chưa được hòa trộn."
+
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (sửa các xung đột rồi chạy \"git commit\")"
+
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (dùng \"git merge --abort\" để bãi bỏ việc hòa trộn)"
+
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "Tất cả các xung đột đã được giải quyết nhưng bạn vẫn đang hòa trộn."
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "Gặp lỗi khi trộn vào các thay đổi."
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (dùng \"git commit\" để hoàn tất việc hòa trộn)"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "lệnh git write-tree gặp lỗi khi ghi một cây"
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "Bạn đang ở giữa của một phiên “am”."
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "áp dụng vào một lịch sử trống rỗng"
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "Miếng vá hiện tại bị trống rỗng."
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (sửa các xung đột và sau đó chạy lệnh \"git am --continue\")"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "không thể phục hồi: %s không tồn tại."
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (dùng \"git am --skip\" để bỏ qua miếng vá này)"
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)"
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "Thân của lần chuyển giao là:"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "thiếu git-rebase-todo"
 
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr ""
-"Áp dụng? đồng ý [y]/khô[n]g/chỉnh sửa [e]/hiển thị miếng [v]á/chấp nhận tất "
-"cả [a]: "
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "Không thực hiện lệnh nào."
 
-#: builtin/am.c:1816
+#: wt-status.c:1194
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Bảng mục lục bẩn: không thể áp dụng các miếng vá (bẩn: %s)"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "Lệnh thực hiện cuối (%d lệnh được thực thi):"
 
-#: builtin/am.c:1853 builtin/am.c:1925
+#: wt-status.c:1205
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Áp dụng: %.*s"
+msgid "  (see more in file %s)"
+msgstr "  (xem thêm trong %s)"
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "Không có lệnh nào còn lại."
 
-#: builtin/am.c:1877
+#: wt-status.c:1213
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Gặp lỗi khi vá tại %s %.*s"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "Lệnh cần làm kế tiếp (%d lệnh còn lại):"
+
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (dùng lệnh \"git rebase --edit-todo\" để xem và sửa)"
 
-#: builtin/am.c:1883
+#: wt-status.c:1234
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "Bản sao chép của miếng vá mà nó gặp lá»\97i thì Ä\91ược tìm thấy trong: %s"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Bạn hiá»\87n nay Ä\91ang thá»±c hiá»\87n viá»\87c â\80\9crebaseâ\80\9d nhánh â\80\9c%sâ\80\9d trên â\80\9c%sâ\80\9d."
 
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"Không có thay đổi nào - bạn đã quên sử dụng lệnh “git add” à?\n"
-"Nếu ở đây không có gì còn lại stage, tình cờ là có một số thứ khác\n"
-"đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng "
-"vá này."
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "Bạn hiện nay đang thực hiện việc “rebase” (“cải tổ”)."
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
-"Bạn vẫn có những đường dẫn chưa được hòa trộn trong bảng mục lục của mình.\n"
-"Bạn đã quên sử dụng lệnh “git add” à?"
+"  (sửa các xung đột và sau đó chạy lệnh “cải tổ” \"git rebase --continue\")"
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr "không thể phân tích đối tượng “%s”."
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (dùng lệnh “cải tổ” \"git rebase --skip\" để bỏ qua lần vá này)"
 
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "gặp lỗi khi dọn bảng mục lục"
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr ""
+"  (dùng lệnh “cải tổ” \"git rebase --abort\" để check-out nhánh nguyên thủy)"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr ""
-"Bạn có lẽ đã có HEAD đã bị di chuyển đi kể từ lần “am” thất bại cuối cùng.\n"
-"Không thể chuyển tới ORIG_HEAD"
+"  (khi tất cả các xung đột đã sửa xong: chạy lệnh “cải tổ” \"git rebase --"
+"continue\")"
 
-#: builtin/am.c:2192
+#: wt-status.c:1267
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Giá trị không hợp lệ cho --patch-format: %s"
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Bạn hiện nay đang thực hiện việc chia tách một lần chuyển giao trong khi "
+"đang “rebase” nhánh “%s” trên “%s”."
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<các-tùy-chọn>] [(<mbox>|<Maildir>)…]"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
+msgstr ""
+"Bạn hiện tại đang cắt đôi một lần chuyển giao trong khi đang thực hiện việc "
+"rebase."
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<các-tùy-chọn>] (--continue | --skip | --abort)"
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Một khi thư mục làm việc của bạn đã gọn gàng, chạy lệnh “cải tổ” \"git "
+"rebase --continue\")"
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "chạy kiểu tương tác"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Bạn hiện nay đang thực hiện việc sửa chữa một lần chuyển giao trong khi đang "
+"rebase nhánh “%s” trên “%s”."
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "tùy chọn lịch sử -- không-toán-tử"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr "Bạn hiện đang sửa một lần chuyển giao trong khi bạn thực hiện rebase."
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "cho phép quay trở lại để hòa trộn kiểu “3way” nếu cần"
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (dùng \"git commit --amend\" để “tu bổ” lần chuyển giao hiện tại)"
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "im lặng"
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (chạy lệnh “cải tổ” \"git rebase --continue\" một khi bạn cảm thấy hài "
+"lòng về những thay đổi của mình)"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "Thêm dòng Signed-off-by cho ghi chú của lần chuyển giao"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Bạn hiện nay đang thực hiện việc cherry-pick lần chuyển giao %s."
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "chuyển mã thành utf8 (mặc định)"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr ""
+"  (sửa các xung đột và sau đó chạy lệnh \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "chuyển cờ -k cho git-mailinfo"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git cherry-pick --"
+"continue\")"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "chuyển cờ -b cho git-mailinfo"
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (dùng \"git cherry-pick --abort\" để hủy bỏ thao tác cherry-pick)"
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "chuyển cờ -m cho git-mailinfo"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Bạn hiện nay đang thực hiện thao tác hoàn nguyên lần chuyển giao “%s”."
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "chuyển cờ --keep-cr cho git-mailsplit với định dạng mbox"
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (sửa các xung đột và sau đó chạy lệnh \"git revert --continue\")"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
-"đừng chuyển cờ --keep-cr cho git-mailsplit không phụ thuộc vào am.keepcr"
-
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "cắt mọi thứ trước dòng scissors"
-
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "hành động"
+"  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git revert --continue\")"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "chuyển nó qua git-apply"
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (dùng \"git revert --abort\" để hủy bỏ thao tác hoàn nguyên)"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "gốc"
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr ""
+"Bạn hiện nay đang thực hiện thao tác di chuyển nửa bước (bisect), bắt đầu từ "
+"nhánh “%s”."
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "đường-dẫn"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "Bạn hiện tại đang thực hiện việc bisect (di chuyển nửa bước)."
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193
-#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645
-#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
-#: parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "số"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "Trên nhánh "
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "định dạng"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "rebase ở chế độ tương tác đang được thực hiện; lên trên "
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "định dạng (các) miếng vá theo"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "rebase đang được thực hiện: lên trên "
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "đè lên các lời nhắn lỗi khi xảy ra lỗi vá nghiêm trọng"
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "HEAD được tách rời tại "
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "tiếp tục áp dụng các miếng vá sau khi giải quyết xung đột"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "HEAD được tách rời từ "
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "đồng nghĩa với --continue"
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "Hiện tại chẳng ở nhánh nào cả."
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "bỏ qua miếng vá hiện hành"
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "Lần chuyển giao khởi tạo"
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "phục hồi lại nhánh gốc và loại bỏ thao tác vá."
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "Những tập tin chưa được theo dõi"
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "nói dối về ngày chuyển giao"
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "Những tập tin bị lờ đi"
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "dùng dấu thời gian hiện tại cho ngày tác giả"
+#: wt-status.c:1599
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+"Cần %.2f giây để liệt kê tất cả các tập tin chưa được theo dõi. “status -"
+"uno”\n"
+"có lẽ làm nó nhanh hơn, nhưng bạn phải cẩn thận đừng quên mình phải\n"
+"tự thêm các tập tin mới (xem “git help status”.."
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "mã-số-khóa"
+#: wt-status.c:1605
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Những tập tin chưa được theo dõi không được liệt kê ra %s"
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "lần chuyển giao ký-GPG"
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr " (dùng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(dùng nội bộ cho git-rebase)"
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "Không có thay đổi nào"
 
-#: builtin/am.c:2326
-msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+#: wt-status.c:1618
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
-"Tùy chọn -b/--binary đã không dùng từ lâu rồi, và\n"
-"nó sẽ được bỏ đi. Xin đừng sử dụng nó thêm nữa."
-
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "gặp lỗi đọc bảng mục lục"
+"không có thay đổi nào được thêm vào để chuyển giao (dùng \"git add\" và/hoặc "
+"\"git commit -a\")\n"
 
-#: builtin/am.c:2348
+#: wt-status.c:1621
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "thư mục rebase trước %s không sẵn có nhưng mbox lại đưa ra."
+msgid "no changes added to commit\n"
+msgstr "không có thay đổi nào được thêm vào để chuyển giao\n"
 
-#: builtin/am.c:2372
+#: wt-status.c:1624
 #, c-format
 msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
-"Tìm thấy thư mục lạc %s.\n"
-"Dùng \"git am --abort\" để loại bỏ nó đi."
-
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Thao tác phân giải không được tiến hành, chúng ta không phục hồi lại."
+"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
+"theo dõi hiện diện (dùng \"git add\" để đưa vào theo dõi)\n"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<các-tùy-chọn>] [<miếng-vá>…]"
+#: wt-status.c:1627
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr ""
+"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
+"theo dõi hiện diện\n"
 
-#: builtin/apply.c:153
+#: wt-status.c:1630
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "không nhận ra tùy chọn về khoảng trắng “%s”"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"không có gì để chuyển giao (tạo/sao-chép các tập tin và dùng \"git add\" để "
+"đưa vào theo dõi)\n"
 
-#: builtin/apply.c:169
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "không nhận ra tùy chọn bỏ qua khoảng trắng “%s”"
+msgid "nothing to commit\n"
+msgstr "không có gì để chuyển giao\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1636
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
+msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
-"Không thể chuẩn bị biểu thức chính qui dấu vết thời gian (timestamp regexp) "
-"%s"
+"không có gì để chuyển giao (dùng -u xem các tập tin chưa được theo dõi)\n"
 
-#: builtin/apply.c:863
+#: wt-status.c:1640
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "thi hành biểu thức chính quy trả về %d cho đầu vào: %s"
+msgid "nothing to commit, working tree clean\n"
+msgstr "không có gì để chuyển giao, thư mục làm việc sạch sẽ\n"
 
-#: builtin/apply.c:947
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "không thể tìm thấy tên tập tin trong miếng vá tại dòng %d"
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "Lần chuyển giao khởi tạo trên "
+
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD (không nhánh)"
+
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "đằng sau "
+
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "phía trước "
 
-#: builtin/apply.c:984
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgid "cannot %s: You have unstaged changes."
+msgstr "không thể %s: Bạn có các thay đổi chưa được đưa lên bệ phóng."
+
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
 msgstr ""
-"git apply: git-diff sai - cần /dev/null, nhưng lại nhận được %s trên dòng %d"
+"thêm vào đó, bảng mục lục của bạn có chứa các thay đổi chưa được chuyển giao."
 
-#: builtin/apply.c:989
+#: wt-status.c:2288
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply: git-diff sai - tên tập tin mới không nhất quán trên dòng %d"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr ""
+"không thể %s: Mục lục của bạn có chứa các thay đổi chưa được chuyển giao."
 
-#: builtin/apply.c:990
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply: git-diff sai - tên tập tin cũ không nhất quán trên dòng %d"
+msgid "failed to unlink '%s'"
+msgstr "gặp lỗi khi bỏ liên kết (unlink) “%s”"
 
-#: builtin/apply.c:995
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: git-diff sai - cần “/dev/null” trên dòng %d"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<các-tùy-chọn>] [--]  <pathspec>…"
 
-#: builtin/apply.c:1489
+#: builtin/add.c:80
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "chi tiết: dòng không cần: %.*s"
+msgid "unexpected diff status %c"
+msgstr "trạng thái lệnh diff không như mong đợi %c"
 
-#: builtin/apply.c:1550
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "miếng vá phân mảnh mà không có phần đầu tại dòng %d: %.*s"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "Cập nhật tập tin gặp lỗi"
 
-#: builtin/apply.c:1567
+#: builtin/add.c:95
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-"phần đầu diff cho git  thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong "
-"thành phần dẫn đầu tên của đường dẫn (dòng %d)"
+msgid "remove '%s'\n"
+msgstr "gỡ bỏ “%s”\n"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "tập tin mới phụ thuộc vào nội dung cũ"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr ""
+"Đưa ra khỏi bệ phóng các thay đổi sau khi làm tươi mới lại bảng mục lục:"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "tập tin đã xóa vẫn còn nội dung"
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "Không thể đọc bảng mục lục"
 
-#: builtin/apply.c:1774
+#: builtin/add.c:220
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "miếng vá hỏng tại dòng %d"
+msgid "Could not open '%s' for writing."
+msgstr "Không thể mở “%s” để ghi."
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "tập tin mới %s phụ thuộc vào nội dung cũ"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Không thể ghi ra miếng vá"
 
-#: builtin/apply.c:1812
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "tập tin đã xóa %s vẫn còn nội dung"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "gặp lỗi khi sửa miếng vá"
 
-#: builtin/apply.c:1815
+#: builtin/add.c:230
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** cảnh báo: tập tin %s trở nên trống rỗng nhưng không bị xóa"
+msgid "Could not stat '%s'"
+msgstr "Không thể lấy thông tin thống kê về “%s”"
 
-#: builtin/apply.c:1962
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "miếng vá định dạng nhị phân sai hỏng tại dòng %d: %.*s"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Miếng vá trống rỗng. Nên bỏ qua."
 
-#: builtin/apply.c:1999
+#: builtin/add.c:237
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "miếng vá định dạng nhị phân không được nhận ra tại dòng %d"
+msgid "Could not apply '%s'"
+msgstr "Không thể áp dụng miếng vá “%s”"
 
-#: builtin/apply.c:2154
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "vá chỉ với “rác” tại dòng %d"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr ""
+"Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore "
+"của bạn:\n"
 
-#: builtin/apply.c:2244
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "không thể đọc liên kết mềm %s"
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "chạy thử"
 
-#: builtin/apply.c:2248
-#, c-format
-msgid "unable to open or read %s"
-msgstr "không thể mở hay đọc %s"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "sửa bằng cách tương tác"
 
-#: builtin/apply.c:2901
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "sai khởi đầu dòng: “%c”"
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "chọn “hunks” theo kiểu tương tác"
 
-#: builtin/apply.c:3020
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)."
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "sửa diff hiện nay và áp dụng nó"
 
-#: builtin/apply.c:3032
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Nội dung bị giảm xuống còn (%ld/%ld) để áp dụng mảnh dữ liệu tại %d"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "cho phép thêm các tập tin bị bỏ qua khác"
 
-#: builtin/apply.c:3038
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "cập nhật các tập tin được theo dõi"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "chỉ ghi lại sự việc mà đường dẫn sẽ được thêm vào sau"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
 msgstr ""
-"trong khi đang tìm kiếm cho:\n"
-"%.*s"
+"thêm các thay đổi từ tất cả các tập tin có cũng như không được theo dõi dấu "
+"vết"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr ""
+"lờ đi các đường dẫn bị gỡ bỏ trong cây thư mục làm việc (giống với --no-all)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "không thêm, chỉ làm tươi mới bảng mục lục"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "chie bỏ qua những tập tin mà nó không thể được thêm vào bởi vì gặp lỗi"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+"kiểm tra xem - thậm chí thiếu - tập tin bị bỏ qua trong quá trình chạy thử"
+
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:3060
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "ghi đè lên bít thi hành của các tập tin được liệt kê"
+
+#: builtin/add.c:305
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "thiếu dữ liệu của miếng vá định dạng nhị phân cho “%s”"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Sử dụng tùy chọn -f nếu bạn thực sự muốn thêm chúng vào.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "thêm tập tin gặp lỗi"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A và -u xung khắc nhau"
+
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "Tùy chọn --ignore-missing chỉ có thể được dùng cùng với --dry-run"
 
-#: builtin/apply.c:3163
+#: builtin/add.c:359
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "miếng vá định dạng nhị phân không được áp dụng cho “%s”"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod tham số “%s” phải hoặc là -x hay +x"
 
-#: builtin/apply.c:3169
+#: builtin/add.c:374
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-"vá nhị phân cho “%s” tạo ra kết quả không chính xác (mong chờ %s, lại nhận "
-"%s)"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Không có gì được chỉ ra, không có gì được thêm vào.\n"
+
+#: builtin/add.c:375
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Có lẽ ý bạn là “git add .” phải không?\n"
+
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "tập tin ghi bảng mục lục bị hỏng"
+
+#: builtin/am.c:412
+msgid "could not parse author script"
+msgstr "không thể phân tích cú pháp văn lệnh tác giả"
 
-#: builtin/apply.c:3190
+#: builtin/am.c:489
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "gặp lỗi khi vá: %s:%ld"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "“%s” bị xóa bởi móc applypatch-msg"
 
-#: builtin/apply.c:3314
+#: builtin/am.c:530
 #, c-format
-msgid "cannot checkout %s"
-msgstr "không thể lấy ra %s"
+msgid "Malformed input line: '%s'."
+msgstr "Dòng đầu vào dị hình: “%s”."
 
-#: builtin/apply.c:3370
+#: builtin/am.c:567
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "đọc từ “%s” vượt ra ngoài liên kết mềm"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Gặp lỗi khi sao chép ghi chú (note) từ “%s” tới “%s”"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "đường dẫn %s đã bị xóa hoặc đổi tên"
+#: builtin/am.c:593
+msgid "fseek failed"
+msgstr "fseek gặp lỗi"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
+#: builtin/am.c:777
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: không tồn tại trong bảng mục lục"
+msgid "could not parse patch '%s'"
+msgstr "không thể phân tích cú pháp “%s”"
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Chỉ có một sê-ri miếng vá StGIT được áp dụng một lúc"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
-#, c-format
-msgid "%s: does not match index"
-msgstr "%s: không khớp trong mục lục"
+#: builtin/am.c:889
+msgid "invalid timestamp"
+msgstr "dấu thời gian không hợp lệ"
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "loại bỏ miếng vá để lại nội dung tập tin"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
+msgstr "dòng Ngày tháng không hợp lệ"
 
-#: builtin/apply.c:3669
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s: sai kiểu"
+#: builtin/am.c:897
+msgid "invalid timezone offset"
+msgstr "độ lệch múi giờ không hợp lệ"
 
-#: builtin/apply.c:3671
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s có kiểu %o, cần %o"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
+msgstr "Dò tìm định dạng miếng vá gặp lỗi."
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: builtin/am.c:991 builtin/clone.c:397
 #, c-format
-msgid "invalid path '%s'"
-msgstr "đường dẫn không hợp lệ “%s”"
+msgid "failed to create directory '%s'"
+msgstr "tạo thư mục \"%s\" gặp lỗi"
 
-#: builtin/apply.c:3879
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s: đã có từ trước trong bảng mục lục"
+#: builtin/am.c:995
+msgid "Failed to split patches."
+msgstr "Gặp lỗi khi chia nhỏ các miếng vá."
 
-#: builtin/apply.c:3882
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: đã sẵn có trong thư mục đang làm việc"
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "không thể ghi tập tin lưu mục lục"
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1178
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o)"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Khi bạn đã phân giải xong trục trặc này, hãy chạy \"%s --continue\"."
 
-#: builtin/apply.c:3907
+#: builtin/am.c:1179
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o) của %s"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr ""
+"Nếu bạn muốn bỏ qua miếng vá này, hãy chạy lệnh \"%s --skip\" để thay thế."
 
-#: builtin/apply.c:3927
+#: builtin/am.c:1180
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "tập tin chịu tác động “%s” vượt ra ngoài liên kết mềm"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr "Để phục hồi lại nhánh gốc và dừng vá, hãy chạy \"%s --abort\"."
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: miếng vá không được áp dụng"
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Miếng vá trống rỗng. Quá trình chia nhỏ miếng vá có lỗi?"
 
-#: builtin/apply.c:3945
+#: builtin/am.c:1386 builtin/log.c:1557
 #, c-format
-msgid "Checking patch %s..."
-msgstr "Đang kiểm tra miếng vá %s…"
+msgid "invalid ident line: %s"
+msgstr "dòng thụt lề không hợp lệ: %s"
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
+#: builtin/am.c:1413
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "make_cache_entry gặp lỗi đối với đường dẫn “%s”"
+msgid "unable to parse commit %s"
+msgstr "không thể phân tích lần chuyển giao “%s”"
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "không thể gỡ bỏ %s từ mục lục"
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "miếng vá sai hỏng cho mô-đun-con %s"
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
+msgstr ""
+"Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở…"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "không thể lấy thống kề về tập tin %s mới hơn đã được tạo"
+#: builtin/am.c:1627
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Bạn đã sửa miếng vá của mình bằng cách thủ công à?\n"
+"Nó không thể áp dụng các blob đã được ghi lại trong bảng mục lục của nó."
 
-#: builtin/apply.c:4224
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "không thể tạo “kho lưu đằng sau” cho tập tin được tạo mới hơn %s"
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Đang trở lại để vá cơ sở và “hòa trộn 3-đường”…"
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "không thể thêm mục nhớ đệm cho %s"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
+msgstr "Gặp lỗi khi trộn vào các thay đổi."
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "đang đóng tập tin “%s”"
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "lệnh git write-tree gặp lỗi khi ghi một cây"
 
-#: builtin/apply.c:4313
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "không thể ghi vào tập tin “%s” chế độ %o"
+#: builtin/am.c:1689
+msgid "applying to an empty history"
+msgstr "áp dụng vào một lịch sử trống rỗng"
+
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1735 builtin/am.c:1739
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Đã áp dụng miếng vá %s một cách sạch sẽ."
+msgid "cannot resume: %s does not exist."
+msgstr "không thể phục hồi: %s không tồn tại."
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "lỗi nội bộ"
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
+
+#: builtin/am.c:1760
+msgid "Commit Body is:"
+msgstr "Thân của lần chuyển giao là:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr ""
+"Áp dụng? đồng ý [y]/khô[n]g/chỉnh sửa [e]/hiển thị miếng [v]á/chấp nhận tất "
+"cả [a]: "
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1820
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Đang áp dụng miếng vá %%s với %d lần từ chối…"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Bảng mục lục bẩn: không thể áp dụng các miếng vá (bẩn: %s)"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1860 builtin/am.c:1932
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "đang cắt ngắn tên tập tin .rej thành %.*s.rej"
+msgid "Applying: %.*s"
+msgstr "Áp dụng: %.*s"
 
-#: builtin/apply.c:4432
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
+msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
+
+#: builtin/am.c:1884
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "không thể mở %s: %s"
+msgid "Patch failed at %s %.*s"
+msgstr "Gặp lỗi khi vá tại %s %.*s"
 
-#: builtin/apply.c:4445
+#: builtin/am.c:1890
 #, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Khối nhớ #%d được áp dụng gọn gàng."
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "Bản sao chép của miếng vá mà nó gặp lỗi thì được tìm thấy trong: %s"
+
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Không có thay đổi nào - bạn đã quên sử dụng lệnh “git add” à?\n"
+"Nếu ở đây không có gì còn lại stage, tình cờ là có một số thứ khác\n"
+"đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng "
+"vá này."
 
-#: builtin/apply.c:4448
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Bạn vẫn có những đường dẫn chưa được hòa trộn trong bảng mục lục của mình.\n"
+"Bạn đã quên sử dụng lệnh “git add” à?"
+
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "đoạn dữ liệu #%d bị từ chối."
+msgid "Could not parse object '%s'."
+msgstr "không thể phân tích đối tượng “%s”."
+
+#: builtin/am.c:2102
+msgid "failed to clean index"
+msgstr "gặp lỗi khi dọn bảng mục lục"
+
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Bạn có lẽ đã có HEAD đã bị di chuyển đi kể từ lần “am” thất bại cuối cùng.\n"
+"Không thể chuyển tới ORIG_HEAD"
 
-#: builtin/apply.c:4537
+#: builtin/am.c:2199
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "bỏ qua đường dẫn “%s”."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Giá trị không hợp lệ cho --patch-format: %s"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "không thừa nhận đầu vào"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<các-tùy-chọn>] [(<mbox>|<Maildir>)…]"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "không thể đọc tập tin lưu bảng mục lục"
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<các-tùy-chọn>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way ở ngoài một kho chứa"
+#: builtin/am.c:2239
+msgid "run interactively"
+msgstr "chạy kiểu tương tác"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index ở ngoài một kho chứa"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
+msgstr "tùy chọn lịch sử -- không-toán-tử"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached ở ngoài một kho chứa"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
+msgstr "cho phép quay trở lại để hòa trộn kiểu “3way” nếu cần"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "không thể mở miếng vá “%s”"
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "im lặng"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "đã chấm dứt %d lỗi khoảng trắng"
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
+msgstr "Thêm dòng Signed-off-by cho ghi chú của lần chuyển giao"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d dòng thêm khoảng trắng lỗi."
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
+msgstr "chuyển mã thành utf8 (mặc định)"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "không áp dụng các thay đổi khớp với đường dẫn đã cho"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
+msgstr "chuyển cờ -k cho git-mailinfo"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho"
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
+msgstr "chuyển cờ -b cho git-mailinfo"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "gỡ bỏ <số> dấu gạch chéo dẫn đầu từ đường dẫn diff cổ điển"
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
+msgstr "chuyển cờ -m cho git-mailinfo"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "lờ đi phần bổ xung được tạo ra bởi miếng vá"
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "chuyển cờ --keep-cr cho git-mailsplit với định dạng mbox"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
-"thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra"
+"đừng chuyển cờ --keep-cr cho git-mailsplit không phụ thuộc vào am.keepcr"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-"hiển thị số lượng các dòng được thêm vào và xóa đi theo ký hiệu thập phân"
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
+msgstr "cắt mọi thứ trước dòng scissors"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả cho đầu vào"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
+msgstr "chuyển nó qua git-apply"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "thay vì áp dụng miếng vá, hãy xem xem miếng vá có thích hợp không"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "hãy chắc chắn là miếng vá thích hợp với bảng mục lục hiện hành"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "định dạng"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "áp dụng một miếng vá mà không động chạm đến cây làm việc"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
+msgstr "định dạng (các) miếng vá theo"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "chấp nhận một miếng vá mà không động chạm đến cây làm việc"
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
+msgstr "đè lên các lời nhắn lỗi khi xảy ra lỗi vá nghiêm trọng"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-"đồng thời áp dụng miếng vá (dùng với tùy chọn --stat/--summary/--check)"
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
+msgstr "tiếp tục áp dụng các miếng vá sau khi giải quyết xung đột"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "thử hòa trộn kiểu three-way nếu việc vá không thể thực hiện được"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
+msgstr "đồng nghĩa với --continue"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-"xây dựng bảng mục lục tạm thời trên cơ sở thông tin bảng mục lục được nhúng"
+#: builtin/am.c:2303
+msgid "skip the current patch"
+msgstr "bỏ qua miếng vá hiện hành"
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL"
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
+msgstr "phục hồi lại nhánh gốc và loại bỏ thao tác vá."
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "đảm bảo rằng có ít nhất <n> dòng nội dung khớp"
+#: builtin/am.c:2310
+msgid "lie about committer date"
+msgstr "nói dối về ngày chuyển giao"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "tìm thấy một dòng mới hoặc bị sửa đổi mà nó có lỗi do khoảng trắng"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
+msgstr "dùng dấu thời gian hiện tại cho ngày tác giả"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "lờ đi sự thay đổi do khoảng trắng gây ra khi quét nội dung"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "mã-số-khóa"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "áp dụng miếng vá theo chiều ngược"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
+msgstr "lần chuyển giao ký-GPG"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "đừng hy vọng có ít nhất một dòng nội dung"
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
+msgstr "(dùng nội bộ cho git-rebase)"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "để lại khối dữ liệu bị từ chối trong các tập tin *.rej tương ứng"
+#: builtin/am.c:2333
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"Tùy chọn -b/--binary đã không dùng từ lâu rồi, và\n"
+"nó sẽ được bỏ đi. Xin đừng sử dụng nó thêm nữa."
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "cho phép chồng khối nhớ"
+#: builtin/am.c:2340
+msgid "failed to read the index"
+msgstr "gặp lỗi đọc bảng mục lục"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
+#: builtin/am.c:2355
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "thư mục rebase trước %s không sẵn có nhưng mbox lại đưa ra."
+
+#: builtin/am.c:2379
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
 msgstr ""
-"đã dò tìm thấy dung sai không chính xác thiếu dòng mới tại cuối tập tin"
+"Tìm thấy thư mục lạc %s.\n"
+"Dùng \"git am --abort\" để loại bỏ nó đi."
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "không tin số lượng dòng trong phần đầu khối dữ liệu"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Thao tác phân giải không được tiến hành, chúng ta không phục hồi lại."
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "treo thêm <root> vào tất cả các tên tập tin"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<các-tùy-chọn>] [<miếng-vá>…]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4059,11 +5130,6 @@ msgstr "git archive: cần ACK/NAK, nhưng lại nhận được EOF"
 msgid "git archive: NACK %s"
 msgstr "git archive: NACK %s"
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "lỗi máy chủ: %s"
-
 #: builtin/archive.c:64
 msgid "git archive: protocol error"
 msgstr "git archive: lỗi giao thức"
@@ -4093,118 +5159,163 @@ msgstr "git blame [<các-tùy-chọn>] [<rev-opts>] [<rev>] [--] <tập-tin>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<rev-opts> được mô tả trong tài liệu git-rev-list(1)"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1777
 msgid "Blaming lines"
 msgstr "Các dòng blame"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2573
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Hiển thị các mục “blame” như là chúng ta thấy chúng, tăng dần"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2574
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Hiển thị SHA-1 trắng cho những lần chuyển giao biên giới (Mặc định: off)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2575
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Không coi các lần chuyển giao gốc là giới hạn (Mặc định: off)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2576
 msgid "Show work cost statistics"
 msgstr "Hiển thị thống kê công sức làm việc"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2577
 msgid "Force progress reporting"
 msgstr "Ép buộc báo cáo tiến triển công việc"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2578
 msgid "Show output score for blame entries"
 msgstr "Hiển thị kết xuất điểm số có các mục tin “blame”"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2579
 msgid "Show original filename (Default: auto)"
 msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2580
 msgid "Show original linenumber (Default: off)"
 msgstr "Hiển thị số dòng gốc (Mặc định: off)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2581
 msgid "Show in a format designed for machine consumption"
 msgstr "Hiển thị ở định dạng đã thiết kế cho sự tiêu dùng bằng máy"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2582
 msgid "Show porcelain format with per-line commit information"
 msgstr "Hiển thị định dạng “porcelain” với thông tin chuyển giao mỗi dòng"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2583
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Dùng cùng chế độ xuất ra với git-annotate (Mặc định: off)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2584
 msgid "Show raw timestamp (Default: off)"
 msgstr "Hiển thị dấu vết thời gian dạng thô (Mặc định: off)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2585
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Hiển thị SHA1 của lần chuyển giao dạng dài (Mặc định: off)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2586
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Không hiển thị tên tác giả và dấu vết thời gian (Mặc định: off)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2587
 msgid "Show author email instead of name (Default: off)"
 msgstr "Hiển thị thư điện tử của tác giả thay vì tên (Mặc định: off)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2588
 msgid "Ignore whitespace differences"
 msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "Dùng một phỏng đoán thử nghiệm để tăng cường các diff"
+
+#: builtin/blame.c:2597
 msgid "Spend extra cycles to find better match"
 msgstr "Tiêu thụ thêm năng tài nguyên máy móc để tìm kiếm tốt hơn nữa"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2598
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 "Sử dụng điểm xét duyệt (revision) từ <tập tin> thay vì gọi “git-rev-list”"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2599
 msgid "Use <file>'s contents as the final image"
 msgstr "Sử dụng nội dung của <tập tin> như là ảnh cuối cùng"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2600 builtin/blame.c:2601
 msgid "score"
 msgstr "điểm số"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2600
 msgid "Find line copies within and across files"
 msgstr "Tìm các bản sao chép dòng trong và ngang qua tập tin"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2601
 msgid "Find line movements within and across files"
 msgstr "Tìm các di chuyển dòng trong và ngang qua tập tin"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "Process only line range n,m, counting from 1"
 msgstr "Xử lý chỉ dòng vùng n,m, tính từ 1"
 
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr ""
+"--progress không được dùng cùng với --incremental hay các định dạng porcelain"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2697
 msgid "4 years, 11 months ago"
 msgstr "4 năm, 11 tháng trước"
 
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "tùy chọn--contents và --reverse không được trộn vào nhau."
+
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr "không thể dùng --contents với tên đối tượng chuyển giao cuối cùng"
+
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse và --first-parent cùng nhau cần chỉ định lần chuyển giao cuối"
+
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr ""
+"--reverse --first-parent cùng nhau yêu cầu vùng cùng với chuỗi cha-mẹ-đầu-"
+"tiên"
+
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
+msgstr "không có đường dẫn %s trong “%s”"
+
+#: builtin/blame.c:2851
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "không thể đọc blob %s cho đường dẫn “%s”"
+
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "tập tin %s chỉ có %lu dòng"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--merged | --no-merged]"
@@ -4225,7 +5336,11 @@ msgstr "git branch [<các-tùy-chọn>] (-m | -M) [<nhánh-cũ>] <nhánh-mới>"
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:143
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--format]"
+
+#: builtin/branch.c:144
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -4234,7 +5349,7 @@ msgstr ""
 "đang xóa nhánh “%s” mà nó lại đã được hòa trộn vào\n"
 "         “%s”, nhưng vẫn chưa được hòa trộn vào HEAD."
 
-#: builtin/branch.c:147
+#: builtin/branch.c:148
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -4243,12 +5358,12 @@ msgstr ""
 "không xóa nhánh “%s” cái mà chưa được hòa trộn vào\n"
 "         “%s”, cho dù là nó đã được hòa trộn vào HEAD."
 
-#: builtin/branch.c:161
+#: builtin/branch.c:162
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Không thể tìm kiếm đối tượng chuyển giao cho “%s”"
 
-#: builtin/branch.c:165
+#: builtin/branch.c:166
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -4257,163 +5372,91 @@ msgstr ""
 "Nhánh “%s” không được trộn một cách đầy đủ.\n"
 "Nếu bạn thực sự muốn xóa nó, thì chạy lệnh “git branch -D %s”."
 
-#: builtin/branch.c:178
+#: builtin/branch.c:179
 msgid "Update of config-file failed"
 msgstr "Cập nhật tập tin cấu hình gặp lỗi"
 
-#: builtin/branch.c:206
+#: builtin/branch.c:210
 msgid "cannot use -a with -d"
 msgstr "không thể dùng tùy chọn -a với -d"
 
-#: builtin/branch.c:212
+#: builtin/branch.c:216
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Không thể tìm kiếm đối tượng chuyển giao cho HEAD"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "Không thể xóa nhánh “%s” đã được lấy ra tại “%s”"
 
-#: builtin/branch.c:241
+#: builtin/branch.c:245
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "không tìm thấy nhánh theo dõi máy chủ “%s”."
 
-#: builtin/branch.c:242
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "không tìm thấy nhánh “%s”."
 
-#: builtin/branch.c:257
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Gặp lỗi khi đang xóa nhánh theo dõi máy chủ “%s”"
 
-#: builtin/branch.c:258
+#: builtin/branch.c:262
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Gặp lỗi khi xóa bỏ nhánh “%s”"
 
-#: builtin/branch.c:265
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Đã xóa nhánh theo dõi máy chủ \"%s\" (từng là %s).\n"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:270
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Nhánh “%s” đã bị xóa (từng là %s)\n"
 
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: đã ra đi]"
-
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
-
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: đứng sau %d]"
-
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
-msgstr "[đằng sau %d]"
-
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: phía trước %d]"
-
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
-msgstr "[phía trước %d]"
-
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: trước %d, sau %d]"
-
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[trước %d, sau %d]"
-
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
-msgstr " **** tham chiếu không hợp lệ ****"
-
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(không nhánh, đang cải tổ %s)"
-
-#: builtin/branch.c:378
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(không nhánh, di chuyển nửa bước được bắt đầu tại %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD được tách rời tại %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD được tách rời từ %s)"
-
-#: builtin/branch.c:393
-msgid "(no branch)"
-msgstr "(không nhánh)"
-
-#: builtin/branch.c:544
+#: builtin/branch.c:441
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "Nhánh %s đang được cải tổ lại tại %s"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:445
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "Nhánh %s đang được di chuyển phân đôi (bisect) tại %s"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:460
 msgid "cannot rename the current branch while not on any."
 msgstr "không thể đổi tên nhánh hiện hành trong khi nó chẳng ở đâu cả."
 
-#: builtin/branch.c:573
+#: builtin/branch.c:470
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Tên nhánh không hợp lệ: “%s”"
 
-#: builtin/branch.c:590
+#: builtin/branch.c:487
 msgid "Branch rename failed"
 msgstr "Gặp lỗi khi đổi tên nhánh"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:490
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Đã đổi tên nhánh khuyết danh “%s” đi"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:493
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Nhánh bị đổi tên thành %s, nhưng HEAD lại không được cập nhật!"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:502
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Nhánh bị đổi tên, nhưng cập nhật tập tin cấu hình gặp lỗi"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:518
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4424,159 +5467,176 @@ msgstr ""
 "  %s\n"
 "Những dòng được bắt đầu bằng “%c” sẽ được cắt bỏ.\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:551
 msgid "Generic options"
 msgstr "Tùy chọn chung"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:553
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "hiển thị mã băm và chủ đề, đưa ra hai lần cho nhánh thượng nguồn"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:554
 msgid "suppress informational messages"
 msgstr "không xuất các thông tin"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:555
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "cài đặt chế độ theo dõi (xem git-pull(1))"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:557
 msgid "change upstream info"
 msgstr "thay đổi thông tin thượng nguồn"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "upstream"
 msgstr "thượng nguồn"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "change the upstream info"
 msgstr "thay đổi thông tin thượng nguồn"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "Bỏ đặt thông tin thượng nguồn"
+
+#: builtin/branch.c:561
 msgid "use colored output"
 msgstr "tô màu kết xuất"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:562
 msgid "act on remote-tracking branches"
 msgstr "thao tác trên nhánh “remote-tracking”"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:564 builtin/branch.c:566
 msgid "print only branches that contain the commit"
 msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "chỉ hiển thị những nhánh mà nó không chứa lần chuyển giao"
+
+#: builtin/branch.c:570
 msgid "Specific git-branch actions:"
 msgstr "Hành động git-branch:"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:571
 msgid "list both remote-tracking and local branches"
 msgstr "liệt kê cả nhánh “remote-tracking” và nội bộ"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:573
 msgid "delete fully merged branch"
 msgstr "xóa một toàn bộ nhánh đã hòa trộn"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:574
 msgid "delete branch (even if not merged)"
 msgstr "xóa nhánh (cho dù là chưa được hòa trộn)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:575
 msgid "move/rename a branch and its reflog"
 msgstr "di chuyển hay đổi tên một nhánh và reflog của nó"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:576
 msgid "move/rename a branch, even if target exists"
 msgstr "di chuyển hoặc đổi tên một nhánh ngay cả khi đích đã có sẵn"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:577
 msgid "list branch names"
 msgstr "liệt kê các tên nhánh"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:578
 msgid "create the branch's reflog"
 msgstr "tạo reflog của nhánh"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:580
 msgid "edit the description for the branch"
 msgstr "sửa mô tả cho nhánh"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:581
 msgid "force creation, move/rename, deletion"
 msgstr "buộc tạo, di chuyển/đổi tên, xóa"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:582
 msgid "print only branches that are merged"
 msgstr "chỉ hiển thị những nhánh mà nó được hòa trộn"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:583
 msgid "print only branches that are not merged"
 msgstr "chỉ hiển thị những nhánh mà nó không được hòa trộn"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:584
 msgid "list branches in columns"
 msgstr "liệt kê các nhánh trong các cột"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
 msgid "key"
 msgstr "khóa"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
 msgid "field name to sort on"
 msgstr "tên trường cần sắp xếp"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
 msgid "object"
 msgstr "đối tượng"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:589
 msgid "print only branches of the object"
 msgstr "chỉ hiển thị các nhánh của đối tượng"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "sắp xếp và lọc là phân biệt HOA thường"
+
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "định dạng sẽ dùng cho đầu ra"
+
+#: builtin/branch.c:611
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Gặp lỗi khi phân giải HEAD như là một tham chiếu hợp lệ."
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:615 builtin/clone.c:724
 msgid "HEAD not found below refs/heads!"
 msgstr "không tìm thấy HEAD ở dưới refs/heads!"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:638
 msgid "--column and --verbose are incompatible"
 msgstr "tùy chọn --column và --verbose xung khắc nhau"
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:649 builtin/branch.c:701
 msgid "branch name required"
 msgstr "cần chỉ ra tên nhánh"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:677
 msgid "Cannot give description to detached HEAD"
 msgstr "Không thể đưa ra mô tả HEAD đã tách rời"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:682
 msgid "cannot edit description of more than one branch"
 msgstr "không thể sửa mô tả cho nhiều hơn một nhánh"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:689
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Vẫn chưa chuyển giao trên nhánh “%s”."
 
-#: builtin/branch.c:773
+#: builtin/branch.c:692
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Không có nhánh nào có tên “%s”."
 
-#: builtin/branch.c:788
+#: builtin/branch.c:707
 msgid "too many branches for a rename operation"
 msgstr "quá nhiều nhánh dành cho thao tác đổi tên"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:712
 msgid "too many branches to set new upstream"
 msgstr "quá nhiều nhánh được đặt cho thượng nguồn mới"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:716
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -4584,40 +5644,40 @@ msgstr ""
 "không thể đặt thượng nguồn của HEAD thành %s khi mà nó chẳng chỉ đến nhánh "
 "nào cả."
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
 msgid "no such branch '%s'"
 msgstr "không có nhánh nào như thế “%s”"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:723
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "chưa có nhánh “%s”"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:735
 msgid "too many branches to unset upstream"
 msgstr "quá nhiều nhánh để bỏ đặt thượng nguồn"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:739
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "không thể bỏ đặt thượng nguồn của HEAD không chỉ đến một nhánh nào cả."
 
-#: builtin/branch.c:826
+#: builtin/branch.c:745
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Nhánh “%s” không có thông tin thượng nguồn"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:759
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "không hợp lý khi tạo “HEAD” thủ công"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:765
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "hai tùy chọn -a và -r áp dụng cho lệnh “git branch” không hợp lý đối với tên "
 "nhánh"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:768
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4626,7 +5686,7 @@ msgstr ""
 "Cờ --set-upstream đã lạc hậu và sẽ bị xóa bỏ. Nên dùng --track hoặc --set-"
 "upstream-to\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:785
 #, c-format
 msgid ""
 "\n"
@@ -4637,77 +5697,93 @@ msgstr ""
 "Nếu bạn muốn “%s” theo dõi “%s”, thực hiện lệnh sau:\n"
 "\n"
 
-#: builtin/bundle.c:51
+#: builtin/bundle.c:45
 #, c-format
 msgid "%s is okay\n"
 msgstr "“%s” tốt\n"
 
-#: builtin/bundle.c:64
+#: builtin/bundle.c:58
 msgid "Need a repository to create a bundle."
 msgstr "Cần một kho chứa để có thể tạo một bundle."
 
-#: builtin/bundle.c:68
+#: builtin/bundle.c:62
 msgid "Need a repository to unbundle."
 msgstr "Cần một kho chứa để có thể giải nén một bundle."
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<kiểu>|--textconv) <đối_tượng>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <kiểu> | --textconv) | --filters) [--path=<đường/dẫn>] <đối_tượng>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<kiểu> là một trong số: blob, tree, commit hoặc tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "hiển thị kiểu đối tượng"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "hiển thị kích thước đối tượng"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "thoát với 0 khi không có lỗi"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "in nội dung đối tượng dạng dễ đọc"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
 msgstr "với đối tượng blob, chạy lệnh textconv trên nội dung của đối tượng"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "với đối tượng blob, chạy lệnh filters trên nội dung của đối tượng"
+
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "blob"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "dùng một đường dẫn rõ ràng cho --textconv/--filters"
+
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "cho phép -s và -t để làm việc với các đối tượng sai/hỏng"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "đệm kết xuất --batch"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "hiển thị thông tin và nội dung của các đối tượng lấy từ đầu vào tiêu chuẩn"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "hiển thị các thông tin về đối tượng fed  từ đầu vào tiêu chuẩn"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr "theo liên kết mềm trong-cây (được dùng với --batch hay --batch-check)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "hiển thị mọi đối tượng với --batch hay --batch-check"
 
@@ -4727,7 +5803,7 @@ msgstr "báo cáo tất cả các thuộc tính đặt trên tập tin"
 msgid "use .gitattributes only from the index"
 msgstr "chỉ dùng .gitattributes từ bảng mục lục"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "đọc tên tập tin từ đầu vào tiêu chuẩn"
 
@@ -4735,7 +5811,7 @@ msgstr "đọc tên tập tin từ đầu vào tiêu chuẩn"
 msgid "terminate input and output records by a NUL character"
 msgstr "chấm dứt các bản ghi vào và ra bằng ký tự NULL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
 msgid "suppress progress reporting"
 msgstr "chặn các báo cáo tiến trình hoạt động"
 
@@ -4826,9 +5902,9 @@ msgid "write the content to temporary files"
 msgstr "ghi nội dung vào tập tin tạm"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
 msgid "string"
 msgstr "chuỗi"
 
@@ -4840,114 +5916,114 @@ msgstr "khi tạo các tập tin, nối thêm <chuỗi>"
 msgid "copy out the files from named stage"
 msgstr "sao chép ra các tập tin từ bệ phóng có tên"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:27
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [<các-tùy-chọn>] <nhánh>"
 
-#: builtin/checkout.c:26
+#: builtin/checkout.c:28
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<các-tùy-chọn>] [<nhánh>] -- <tập-tin>…"
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/checkout.c:153 builtin/checkout.c:186
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "đường dẫn “%s” không có các phiên bản của chúng ta"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:155 builtin/checkout.c:188
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "đường dẫn “%s” không có các phiên bản của chúng"
 
-#: builtin/checkout.c:152
+#: builtin/checkout.c:171
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "đường dẫn “%s” không có tất cả các phiên bản cần thiết"
 
-#: builtin/checkout.c:196
+#: builtin/checkout.c:215
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "đường dẫn “%s” không có các phiên bản cần thiết"
 
-#: builtin/checkout.c:213
+#: builtin/checkout.c:232
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "đường dẫn “%s”: không thể hòa trộn"
 
-#: builtin/checkout.c:230
+#: builtin/checkout.c:249
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Không thể thêm kết quả hòa trộn cho “%s”"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "không được dùng “%s” với các đường dẫn cập nhật"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:281 builtin/checkout.c:284
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "không được dùng “%s” với %s"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:287
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Không thể cập nhật các đường dẫn và chuyển đến nhánh “%s” cùng một lúc."
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "đường dẫn “%s” không được hòa trộn"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:513
 msgid "you need to resolve your current index first"
 msgstr "bạn cần phải giải quyết bảng mục lục hiện tại của bạn trước đã"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:644
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Không thể thực hiện reflog cho “%s”: %s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:685
 msgid "HEAD is now at"
 msgstr "HEAD hiện giờ tại"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:689 builtin/clone.c:678
 msgid "unable to update HEAD"
 msgstr "không thể cập nhật HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:693
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Đặt lại nhánh “%s”\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:696
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Đã sẵn sàng trên “%s”\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:700
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Đã chuyển tới và đặt lại nhánh “%s”\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:702 builtin/checkout.c:1090
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Đã chuyển đến nhánh mới “%s”\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:704
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Đã chuyển đến nhánh “%s”\n"
 
-#: builtin/checkout.c:734
+#: builtin/checkout.c:755
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " … và nhiều hơn %d.\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4966,7 +6042,7 @@ msgstr[0] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:780
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -4987,152 +6063,152 @@ msgstr[0] ""
 " git branch <tên_nhánh_mới> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:816
 msgid "internal error in revision walk"
 msgstr "lỗi nội bộ trong khi di chuyển qua các điểm xét duyệt"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:820
 msgid "Previous HEAD position was"
 msgstr "Vị trí trước kia của HEAD là"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:847 builtin/checkout.c:1085
 msgid "You are on a branch yet to be born"
 msgstr "Bạn tại nhánh mà nó chưa hề được sinh ra"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:991
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "chỉ cần một tham chiếu, nhưng lại đưa ra %d."
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1031 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "tham chiếu không hợp lệ: %s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1060
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "tham chiếu không phải là một cây:%s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1099
 msgid "paths cannot be used with switching branches"
 msgstr "các đường dẫn không thể dùng cùng với các nhánh chuyển"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "“%s” không thể được sử dụng với các nhánh chuyển"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "“%s” không thể được dùng với “%s”"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1126
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Không thể chuyển nhánh đến một thứ không phải là lần chuyển giao “%s”"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
 msgid "branch"
 msgstr "nhánh"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1160
 msgid "create and checkout a new branch"
 msgstr "tạo và checkout một nhánh mới"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1162
 msgid "create/reset and checkout a branch"
 msgstr "tạo/đặt_lại và checkout một nhánh"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1163
 msgid "create reflog for new branch"
 msgstr "tạo reflog cho nhánh mới"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1164 builtin/worktree.c:333
 msgid "detach HEAD at named commit"
 msgstr "rời bỏ HEAD tại lần chuyển giao theo tên"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1165
 msgid "set upstream info for new branch"
 msgstr "đặt thông tin thượng nguồn cho nhánh mới"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new-branch"
 msgstr "nhánh-mới"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new unparented branch"
 msgstr "nhánh không cha mới"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1168
 msgid "checkout our version for unmerged files"
 msgstr ""
 "lấy ra (checkout) phiên bản của chúng ta cho các tập tin chưa được hòa trộn"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1170
 msgid "checkout their version for unmerged files"
 msgstr ""
 "lấy ra (checkout) phiên bản của chúng họ cho các tập tin chưa được hòa trộn"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1172
 msgid "force checkout (throw away local modifications)"
 msgstr "ép buộc lấy ra (bỏ đi những thay đổi nội bộ)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1173
 msgid "perform a 3-way merge with the new branch"
 msgstr "thực hiện hòa trộn kiểu 3-way với nhánh mới"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1174 builtin/merge.c:234
 msgid "update ignored files (default)"
 msgstr "cập nhật các tập tin bị bỏ qua (mặc định)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
 msgid "style"
 msgstr "kiểu"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1176
 msgid "conflict style (merge or diff3)"
 msgstr "xung đột kiểu (hòa trộn hoặc diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1179
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "không giới hạn đặc tả đường dẫn thành chỉ các mục thưa thớt"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1181
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "gợi ý thứ hai \"git checkout <không-nhánh-nào-như-vậy>\""
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1183
 msgid "do not check if another worktree is holding the given ref"
 msgstr "không kiểm tra nếu cây làm việc khác đang giữ tham chiếu đã cho"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
 msgid "force progress reporting"
 msgstr "ép buộc báo cáo tiến triển công việc"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1224
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Các tùy chọn -b, -B và --orphan loại từ lẫn nhau"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1241
 msgid "--track needs a branch name"
 msgstr "--track cần tên một nhánh"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1246
 msgid "Missing branch name; try -b"
 msgstr "Thiếu tên nhánh; hãy thử -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1282
 msgid "invalid path specification"
 msgstr "đường dẫn đã cho không hợp lệ"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1289
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5142,12 +6218,12 @@ msgstr ""
 "Bạn đã có ý định checkout “%s” cái mà không thể được phân giải như là lần "
 "chuyển giao?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1294
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach không nhận một đối số đường dẫn “%s”"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1298
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5186,19 +6262,21 @@ msgstr "Nên bỏ qua kho chứa %s\n"
 msgid "failed to remove %s"
 msgstr "gặp lỗi khi gỡ bỏ %s"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
 "Trợ giúp về nhắc:\n"
 "1          - chọn một mục được đánh số\n"
 "foo        - chọn mục trên cơ sở tiền tố duy nhất\n"
-"           - (để trống) không chọn gì cả"
+"           - (để trống) không chọn gì cả\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:301 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5207,47 +6285,49 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
 "Trợ giúp về nhắc:\n"
 "1          - chọn một mục đơn\n"
 "3-5        - chọn một vùng\n"
 "2-3,6-9    - chọn nhiều vùng\n"
 "foo        - chọn mục dựa trên tiền tố duy nhất\n"
-"-…       - không chọn các mục đã chỉ ra\n"
+"-…         - không chọn các mục đã chỉ ra\n"
 "*          - chọn tất\n"
-"           - (để trống) kết thúc việc chọn"
+"           - (để trống) kết thúc việc chọn\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "Hả (%s)?"
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "Hả (%s)?\n"
 
-#: builtin/clean.c:653
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Mẫu để lọc các tập tin đầu vào cần lờ đi>> "
 
-#: builtin/clean.c:690
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "CẢNH BÁO: Không tìm thấy các mục được khớp bởi: %s"
 
-#: builtin/clean.c:711
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Chọn mục muốn xóa"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/clean.c:758
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Xóa bỏ “%s” [y/N]? "
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Tạm biệt."
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "Tạm biệt.\n"
 
-#: builtin/clean.c:785
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -5265,61 +6345,62 @@ msgstr ""
 "help                - hiển thị chính trợ giúp này\n"
 "?                   - trợ giúp dành cho chọn bằng cách nhắc"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:818 git-add--interactive.perl:1736
 msgid "*** Commands ***"
 msgstr "*** Lệnh ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:819 git-add--interactive.perl:1733
 msgid "What now"
 msgstr "Giờ thì sao"
 
-#: builtin/clean.c:821
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Có muốn gỡ bỏ (các) mục sau đây không:"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Không còn tập-tin nào để dọn dẹp, đang thoát ra."
 
-#: builtin/clean.c:869
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "không hiển thị tên của các tập tin đã gỡ bỏ"
 
-#: builtin/clean.c:871
+#: builtin/clean.c:877
 msgid "force"
 msgstr "ép buộc"
 
-#: builtin/clean.c:872
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "dọn bằng kiểu tương tác"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "gỡ bỏ toàn bộ thư mục"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "mẫu"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "thêm <mẫu> vào trong qui tắc bỏ qua"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "đồng thời gỡ bỏ cả các tập tin bị bỏ qua"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "chỉ gỡ bỏ những tập tin bị bỏ qua"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x và -X không thể dùng cùng nhau"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:907
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -5327,7 +6408,7 @@ msgstr ""
 "clean.requireForce được đặt thành true và không đưa ra tùy chọn -i, -n mà "
 "cũng không -f; từ chối lệnh dọn dẹp (clean)"
 
-#: builtin/clean.c:904
+#: builtin/clean.c:910
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -5339,112 +6420,134 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<các-tùy-chọn>] [--] <kho> [<t.mục>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:80
 msgid "don't create a checkout"
 msgstr "không tạo một checkout"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "tạo kho thuần"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:85
 msgid "create a mirror repository (implies bare)"
 msgstr "tạo kho bản sao (ý là kho thuần)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:87
 msgid "to clone from a local repository"
 msgstr "để nhân bản từ kho nội bộ"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:89
 msgid "don't use local hardlinks, always copy"
 msgstr "không sử dụng liên kết cứng nội bộ, luôn sao chép"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:91
 msgid "setup as shared repository"
 msgstr "cài đặt đây là kho chia sẻ"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "đặc-tả-đường-dẫn"
+
+#: builtin/clone.c:93 builtin/clone.c:97
 msgid "initialize submodules in the clone"
 msgstr "khởi tạo mô-đun-con trong bản sao"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:100
 msgid "number of submodules cloned in parallel"
 msgstr "số lượng mô-đun-con được nhân bản đồng thời"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:101 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "thư-mục-mẫu"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:102 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "thư mục mà tại đó các mẫu sẽ được dùng"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
 msgid "reference repository"
 msgstr "kho tham chiếu"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:108
 msgid "use --reference only while cloning"
 msgstr "chỉ dùng --reference khi nhân bản"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
 msgid "name"
 msgstr "tên"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:110
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "dùng <tên> thay cho “origin” để theo dõi thượng nguồn"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:112
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "lấy ra <nhánh> thay cho HEAD của máy chủ"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:114
 msgid "path to git-upload-pack on the remote"
 msgstr "đường dẫn đến git-upload-pack trên máy chủ"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "độ-sâu"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:116
 msgid "create a shallow clone of that depth"
 msgstr "tạo bản sao không đầy đủ cho mức sâu đã cho"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "thời-gian"
+
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr "tạo bản sao không đầy đủ từ thời điểm đã cho"
+
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "điểm xét duyệt"
+
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr "làm sâu hơn lịch sử của bản sao shallow, bằng điểm xét duyệt loại trừ"
+
+#: builtin/clone.c:122
 msgid "clone only one branch, HEAD or --branch"
 msgstr "chỉ nhân bản một nhánh, HEAD hoặc --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:124
 msgid "any cloned submodules will be shallow"
 msgstr "mọi mô-đun-con nhân bản sẽ là shallow (nông)"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:125 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:126 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "không dùng chung thư mục dành riêng cho git và thư mục làm việc"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:127
 msgid "key=value"
 msgstr "khóa=giá_trị"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:128
 msgid "set config inside the new repository"
 msgstr "đặt cấu hình bên trong một kho chứa mới"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
 msgid "use IPv4 addresses only"
 msgstr "chỉ dùng địa chỉ IPv4"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
 msgid "use IPv6 addresses only"
 msgstr "chỉ dùng địa chỉ IPv6"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:268
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5452,57 +6555,42 @@ msgstr ""
 "Không đoán được thư mục tên là gì.\n"
 "Vui lòng chỉ định tên một thư mục trên dòng lệnh"
 
-#: builtin/clone.c:307
+#: builtin/clone.c:321
 #, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "kho tham chiếu “%s” như là lấy ra liên kết vẫn chưa được hỗ trợ."
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "kho tham chiếu “%s” không phải là một kho nội bộ."
-
-#: builtin/clone.c:314
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "kho tham chiếu “%s” là nông"
-
-#: builtin/clone.c:317
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "kho tham chiếu “%s” bị cấy ghép"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "thông tin: không thể thêm thay thế cho “%s”: %s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:393
 #, c-format
 msgid "failed to open '%s'"
 msgstr "gặp lỗi khi mở “%s”"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:401
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s có tồn tại nhưng lại không phải là một thư mục"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:415
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "gặp lỗi khi lấy thông tin thống kê về %s\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:437
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "gặp lỗi khi tạo được liên kết mềm %s"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:441
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "gặp lỗi khi sao chép tập tin và “%s”"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:466
 #, c-format
 msgid "done.\n"
 msgstr "hoàn tất.\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:478
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5512,121 +6600,141 @@ msgstr ""
 "Bạn kiểm tra kỹ xem cái gì được lấy ra bằng lệnh “git status”\n"
 "và thử lấy ra với lệnh “git checkout -f HEAD”\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:555
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Không tìm thấy nhánh máy chủ %s để nhân bản (clone)."
 
-#: builtin/clone.c:633
+#: builtin/clone.c:650
 msgid "remote did not send all necessary objects"
 msgstr "máy chủ đã không gửi tất cả các đối tượng cần thiết"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:666
 #, c-format
 msgid "unable to update %s"
 msgstr "không thể cập nhật %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:715
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "refers HEAD máy chủ  chỉ đến ref không tồn tại, không thể lấy ra.\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:746
 msgid "unable to checkout working tree"
 msgstr "không thể lấy ra (checkout) cây làm việc"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:786
 msgid "unable to write parameters to config file"
 msgstr "không thể ghi các tham số vào tập tin cấu hình"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:849
 msgid "cannot repack to clean up"
 msgstr "không thể đóng gói để dọn dẹp"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:851
 msgid "cannot unlink temporary alternates file"
 msgstr "không thể bỏ liên kết tập tin thay thế tạm thời"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
 msgid "Too many arguments."
 msgstr "Có quá nhiều đối số."
 
-#: builtin/clone.c:867
+#: builtin/clone.c:888
 msgid "You must specify a repository to clone."
 msgstr "Bạn phải chỉ định một kho để mà nhân bản (clone)."
 
-#: builtin/clone.c:878
+#: builtin/clone.c:901
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "tùy chọn --bare và --origin %s xung khắc nhau."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:904
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "tùy chọn --bare và --separate-git-dir xung khắc nhau."
 
-#: builtin/clone.c:894
+#: builtin/clone.c:917
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "kho chứa “%s” chưa tồn tại"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "độ sâu %s không phải là một số nguyên dương"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:933
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "đường dẫn đích “%s” đã có từ trước và không phải là một thư mục rỗng."
 
-#: builtin/clone.c:920
+#: builtin/clone.c:943
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "cây làm việc “%s” đã sẵn tồn tại rồi."
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "không thể tạo các thư mục dẫn đầu của “%s”"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:961
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "không thể tạo cây thư mục làm việc dir “%s”"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:973
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Đang nhân bản thành kho chứa bare “%s”…\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:975
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Đang nhân bản thành “%s”…\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr ""
+"nhân bản --recursive không tương thích với cả hai --reference và --reference-"
+"if-able"
+
+#: builtin/clone.c:1055
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth bị lờ đi khi nhân bản nội bộ; hãy sử dụng file:// để thay thế."
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-since bị lờ đi khi nhân bản nội bộ; hãy sử dụng file:// để thay "
+"thế."
+
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude bị lờ đi khi nhân bản nội bộ; hãy sử dụng file:// để thay "
+"thế."
+
+#: builtin/clone.c:1062
 msgid "source repository is shallow, ignoring --local"
 msgstr "kho nguồn là nông, nên bỏ qua --local"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1067
 msgid "--local is ignored"
 msgstr "--local bị lờ đi"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1071
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Không biết làm cách nào để nhân bản (clone) %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1126 builtin/clone.c:1134
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Nhánh máy chủ %s không tìm thấy trong thượng nguồn %s"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1137
 msgid "You appear to have cloned an empty repository."
 msgstr "Bạn hình như là đã nhân bản một kho trống rỗng."
 
@@ -5777,68 +6885,63 @@ msgstr ""
 "Thế thì \"git cherry-pick --continue\" sẽ phục hồi lại việc cherry-pick\n"
 "những lần chuyển giao còn lại.\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "gặp lỗi khi tháo dỡ HEAD đối tượng cây"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "không thể tạo bảng mục lục tạm thời"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "gặp lỗi khi thêm bằng cách tương"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "không thể cập nhật bảng mục lục tạm thời"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Gặp lỗi khi cập nhật cây bộ nhớ đệm"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục mới (new_index)"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr ""
 "không thể thực hiện việc chuyển giao cục bộ trong khi đang được hòa trộn."
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 "không thể thực hiện việc chuyển giao bộ phận trong khi đang cherry-pick."
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "không đọc được bảng mục lục"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục tạm thời"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "lần chuyển giao “%s” thiếu phần tác giả ở đầu"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "lần chuyển giao “%s” có phần tác giả ở đầu dị dạng"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "đối số cho --author bị dị hình"
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
-msgstr "ngày tháng không hợp lệ: %s"
-
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5846,38 +6949,38 @@ msgstr ""
 "không thể chọn một ký tự ghi chú cái mà không được dùng\n"
 "trong phần ghi chú hiện tại"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "không thể tìm kiếm commit (lần chuyển giao) %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:294
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(đang đọc thông điệp nhật ký từ đầu vào tiêu chuẩn)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "không thể đọc nhật ký từ đầu vào tiêu chuẩn"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "không đọc được tệp nhật ký “%s”"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "không thể đọc SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "không thể đọc MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "không thể ghi mẫu chuyển giao"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5892,7 +6995,7 @@ msgstr ""
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5907,7 +7010,7 @@ msgstr ""
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5918,7 +7021,7 @@ msgstr ""
 "bắt đầu bằng “%c” sẽ được bỏ qua, nếu phần chú thích rỗng sẽ hủy bỏ lần "
 "chuyển giao.\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5930,157 +7033,157 @@ msgstr ""
 "bắt đầu bằng “%c” sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn thế.\n"
 "Phần chú thích này nếu trống rỗng sẽ hủy bỏ lần chuyển giao.\n"
 
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sTác giả:           %.*s <%.*s>"
 
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sNgày tháng:        %s"
 
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sNgười chuyển giao: %.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Không đọc được bảng mục lục"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Gặp lỗi khi xây dựng cây"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Xin hãy cung cấp lời chú giải hoặc là dùng tùy chọn -m hoặc là -F.\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author “%s” không phải là “Họ và tên <thư điện tửl>” và không khớp bất kỳ "
 "tác giả nào sẵn có"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Chế độ cho các tập tin chưa được theo dõi không hợp lệ “%s”"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "hai tùy chọn -long và -z không tương thích với nhau"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Sử dụng cả hai tùy chọn --reset-author và --author không hợp lý"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Không có gì để mà “tu bổ” cả."
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr ""
 "Bạn đang ở giữa của quá trình hòa trộn -- không thể thực hiện việc “tu bổ”."
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr ""
 "Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện việc “tu "
 "bổ”."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Các tùy chọn --squash và --fixup không thể sử dụng cùng với nhau"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
 "Chỉ được dùng một trong số tùy chọn trong số các tùy chọn -c/-C/-F/--fixup"
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Tùy chọn -m không thể được tổ hợp cùng với -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 "--reset-author chỉ có thể được sử dụng với tùy chọn -C, -c hay --amend."
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Chỉ một trong các tùy chọn --include/--only/--all/--interactive/--patch được "
 "sử dụng."
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "Không đường dẫn với các tùy chọn --include/--only không hợp lý."
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "Giỏi…  “tu bổ” cái cuối với bảng mục lục bẩn."
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "Những đường dẫn rõ ràng được chỉ ra không có tùy chọn -i cũng không -o; coi "
 "là --only những đường dẫn"
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:551
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Chế độ dọn dẹp không hợp lệ %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "Các đường dẫn với tùy chọn -a không hợp lý."
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "hiển thị trạng thái ở dạng súc tích"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "hiển thị thông tin nhánh"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "phiên bản"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
 msgid "machine-readable output"
 msgstr "kết xuất dạng máy-có-thể-đọc"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "hiển thị trạng thái ở định dạng dài (mặc định)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "chấm dứt các mục bằng NUL"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
 msgid "mode"
 msgstr "chế độ"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "hiển thị các tập tin chưa được theo dõi  dấu vết, các chế độ tùy chọn:  all, "
 "normal, no. (Mặc định: all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "hiển thị các tập tin ẩn"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "khi"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -6088,205 +7191,205 @@ msgstr ""
 "bỏ qua các thay đổi trong mô-đun-con, tùy chọn khi: all, dirty, untracked. "
 "(Mặc định: all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "hiển thị danh sách các tập-tin chưa được theo dõi trong các cột"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "không thể tìm thấy lần chuyển giao mới hơn đã được tạo"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr ""
 "không thể phân tích cú pháp của đối tượng chuyển giao mới hơn đã được tạo"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "đã rời khỏi HEAD"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr " (root-commit)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "không hiển thị tổng kết sau khi chuyển giao thành công"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "hiển thị sự khác biệt trong mẫu tin nhắn chuyển giao"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "Các tùy chọn ghi chú commit"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:409
 msgid "read message from file"
 msgstr "đọc chú thích từ tập tin"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "tác giả"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "ghi đè tác giả cho commit"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:357
 msgid "date"
 msgstr "ngày tháng"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "ghi đè ngày tháng cho lần chuyển giao"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
 msgid "message"
 msgstr "chú thích"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "chú thích của lần chuyển giao"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
 msgid "commit"
 msgstr "lần_chuyển_giao"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho nhưng có cho sửa chữa"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "dùng ghi chú có định dạng autosquash để sửa chữa lần chuyển giao đã chỉ ra"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "dùng lời nhắn có định dạng tự động nén để nén lại các lần chuyển giao đã chỉ "
 "ra"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 "lần chuyển giao nhận tôi là tác giả (được dùng với tùy chọn -C/-c/--amend)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
 msgid "add Signed-off-by:"
 msgstr "(nên dùng) thêm dòng Signed-off-by:"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "sử dụng tập tin mẫu đã cho"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "ép buộc sửa lần commit"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "mặc định"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:412
 msgid "how to strip spaces and #comments from message"
 msgstr "làm thế nào để cắt bỏ khoảng trắng và #ghichú từ mẩu tin nhắn"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "bao gồm các trạng thái trong mẫu ghi chú chuyển giao"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
 msgid "GPG sign commit"
 msgstr "ký lần chuyển giao dùng GPG"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "Các tùy nội dung ghi chú commit"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "chuyển giao tất cả các tập tin có thay đổi"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục để chuyển giao"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "thêm các tập-tin bằng tương tác"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "thêm các thay đổi bằng tương tác"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "vòng qua móc (hook) pre-commit và commit-msg"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "hiển thị xem cái gì có thể được chuyển giao"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "“tu bổ” (amend) lần commit trước"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
 msgstr "vòng qua móc (hook) post-rewrite"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "ok để ghi lại một thay đổi trống rỗng"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "ok để ghi các thay đổi với lời nhắn trống rỗng"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Tập tin MERGE_HEAD sai hỏng (%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "không thể đọc MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
-msgstr "không thể đọc phần chú thích (message) của llần chuyển giao: %s"
+msgstr "không thể đọc phần chú thích (message) của lần chuyển giao: %s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 "Đang bỏ qua việc chuyển giao; bạn đã không biên soạn phần chú thích "
 "(message).\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Bãi bỏ việc chuyển giao bởi vì phần chú thích của nó trống rỗng.\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6301,141 +7404,141 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<các-tùy-chọn>]"
 
-#: builtin/config.c:55
+#: builtin/config.c:56
 msgid "Config file location"
 msgstr "Vị trí tập tin cấu hình"
 
-#: builtin/config.c:56
+#: builtin/config.c:57
 msgid "use global config file"
 msgstr "dùng tập tin cấu hình toàn cục"
 
-#: builtin/config.c:57
+#: builtin/config.c:58
 msgid "use system config file"
 msgstr "sử dụng tập tin cấu hình hệ thống"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "use repository config file"
 msgstr "dùng tập tin cấu hình của kho"
 
-#: builtin/config.c:59
+#: builtin/config.c:60
 msgid "use given config file"
 msgstr "sử dụng tập tin cấu hình đã cho"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "read config from given blob object"
 msgstr "đọc cấu hình từ đối tượng blob đã cho"
 
-#: builtin/config.c:61
+#: builtin/config.c:62
 msgid "Action"
 msgstr "Hành động"
 
-#: builtin/config.c:62
+#: builtin/config.c:63
 msgid "get value: name [value-regex]"
 msgstr "lấy giá-trị: tên [value-regex]"
 
-#: builtin/config.c:63
+#: builtin/config.c:64
 msgid "get all values: key [value-regex]"
 msgstr "lấy tất cả giá-trị: khóa [value-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:65
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "lấy giá trị cho regexp: name-regex [value-regex]"
 
-#: builtin/config.c:65
+#: builtin/config.c:66
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "lấy đặc tả giá trị cho URL: phần[.biến] URL"
 
-#: builtin/config.c:66
+#: builtin/config.c:67
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "thay thế tất cả các biến khớp mẫu: tên giá-trị [value_regex]"
 
-#: builtin/config.c:67
+#: builtin/config.c:68
 msgid "add a new variable: name value"
 msgstr "thêm biến mới: tên giá-trị"
 
-#: builtin/config.c:68
+#: builtin/config.c:69
 msgid "remove a variable: name [value-regex]"
 msgstr "gỡ bỏ biến: tên [value-regex]"
 
-#: builtin/config.c:69
+#: builtin/config.c:70
 msgid "remove all matches: name [value-regex]"
 msgstr "gỡ bỏ mọi cái khớp: tên [value-regex]"
 
-#: builtin/config.c:70
+#: builtin/config.c:71
 msgid "rename section: old-name new-name"
 msgstr "đổi tên phần: tên-cũ tên-mới"
 
-#: builtin/config.c:71
+#: builtin/config.c:72
 msgid "remove a section: name"
 msgstr "gỡ bỏ phần: tên"
 
-#: builtin/config.c:72
+#: builtin/config.c:73
 msgid "list all"
 msgstr "liệt kê tất"
 
-#: builtin/config.c:73
+#: builtin/config.c:74
 msgid "open an editor"
 msgstr "mở một trình biên soạn"
 
-#: builtin/config.c:74
+#: builtin/config.c:75
 msgid "find the color configured: slot [default]"
 msgstr "tìm cấu hình màu sắc: slot [mặc định]"
 
-#: builtin/config.c:75
+#: builtin/config.c:76
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "tìm các cài đặt về màu sắc: slot [stdout-là-tty]"
 
-#: builtin/config.c:76
+#: builtin/config.c:77
 msgid "Type"
 msgstr "Kiểu"
 
-#: builtin/config.c:77
+#: builtin/config.c:78
 msgid "value is \"true\" or \"false\""
 msgstr "giá trị là \"true\" hoặc \"false\""
 
-#: builtin/config.c:78
+#: builtin/config.c:79
 msgid "value is decimal number"
 msgstr "giá trị ở dạng số thập phân"
 
-#: builtin/config.c:79
+#: builtin/config.c:80
 msgid "value is --bool or --int"
 msgstr "giá trị là --bool hoặc --int"
 
-#: builtin/config.c:80
+#: builtin/config.c:81
 msgid "value is a path (file or directory name)"
 msgstr "giá trị là đường dẫn (tên tập tin hay thư mục)"
 
-#: builtin/config.c:81
+#: builtin/config.c:82
 msgid "Other"
 msgstr "Khác"
 
-#: builtin/config.c:82
+#: builtin/config.c:83
 msgid "terminate values with NUL byte"
 msgstr "chấm dứt giá trị với byte NUL"
 
-#: builtin/config.c:83
+#: builtin/config.c:84
 msgid "show variable names only"
 msgstr "chỉ hiển thị các tên biến"
 
-#: builtin/config.c:84
+#: builtin/config.c:85
 msgid "respect include directives on lookup"
 msgstr "tôn trọng kể cà các hướng trong tìm kiếm"
 
-#: builtin/config.c:85
+#: builtin/config.c:86
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
 "hiển thị nguyên gốc của cấu hình (tập tin, đầu vào tiêu chuẩn, blob, dòng "
 "lệnh)"
 
-#: builtin/config.c:327
+#: builtin/config.c:328
 msgid "unable to parse default color value"
 msgstr "không thể phân tích giá trị màu mặc định"
 
-#: builtin/config.c:471
+#: builtin/config.c:472
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -6450,68 +7553,89 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:613
+#: builtin/config.c:615
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "không thể tạo tập tin cấu hình “%s”"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:627
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"không thể ghi đè nhiều giá trị với một giá trị đơn\n"
+"      Dùng một biểu thức chính quy, --add hay --replace-all để thay đổi %s."
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "hiển thị kích cỡ theo định dạng dành cho người đọc"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [<options>] [<commit-ish>...]"
 msgstr "git describe [<các-tùy-chọn>] <commit-ish>*"
 
-#: builtin/describe.c:18
+#: builtin/describe.c:19
 msgid "git describe [<options>] --dirty"
 msgstr "git describe [<các-tùy-chọn>] --dirty"
 
-#: builtin/describe.c:217
+#: builtin/describe.c:53
+msgid "head"
+msgstr "phía trước "
+
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "hạng nhẹ"
+
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "có diễn giải"
+
+#: builtin/describe.c:250
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "thẻ đã được ghi chú %s không sẵn để dùng"
 
-#: builtin/describe.c:221
+#: builtin/describe.c:254
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "thẻ được chú giải %s không có tên nhúng"
 
-#: builtin/describe.c:223
+#: builtin/describe.c:256
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "thẻ “%s” đã thực sự ở đây “%s” rồi"
 
-#: builtin/describe.c:250 builtin/log.c:480
+#: builtin/describe.c:283 builtin/log.c:487
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "Không phải tên đối tượng %s hợp lệ"
 
-#: builtin/describe.c:253
+#: builtin/describe.c:286
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s không phải là một đối tượng “%s” hợp lệ"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:303
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "không có thẻ nào khớp chính xác với “%s”"
 
-#: builtin/describe.c:272
+#: builtin/describe.c:305
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "Đang tìm kiếm để mô tả %s\n"
 
-#: builtin/describe.c:319
+#: builtin/describe.c:352
 #, c-format
 msgid "finished search at %s\n"
 msgstr "việc tìm kiếm đã kết thúc tại %s\n"
 
-#: builtin/describe.c:346
+#: builtin/describe.c:379
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -6520,7 +7644,7 @@ msgstr ""
 "Không có thẻ được chú giải nào được mô tả là “%s”.\n"
 "Tuy nhiên, ở đây có những thẻ không được chú giải: hãy thử --tags."
 
-#: builtin/describe.c:350
+#: builtin/describe.c:383
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -6529,12 +7653,12 @@ msgstr ""
 "Không có thẻ có thể mô tả “%s”.\n"
 "Hãy thử --always, hoặc tạo một số thẻ."
 
-#: builtin/describe.c:371
+#: builtin/describe.c:413
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "đã xuyên %lu qua lần chuyển giao\n"
 
-#: builtin/describe.c:374
+#: builtin/describe.c:416
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -6543,95 +7667,211 @@ msgstr ""
 "tìm thấy nhiều hơn %i thẻ; đã liệt kê %i cái gần\n"
 "đây nhất bỏ đi tìm kiếm tại %s\n"
 
-#: builtin/describe.c:396
+#: builtin/describe.c:438
 msgid "find the tag that comes after the commit"
 msgstr "tìm các thẻ mà nó đến trước lần chuyển giao"
 
-#: builtin/describe.c:397
+#: builtin/describe.c:439
 msgid "debug search strategy on stderr"
 msgstr "chiến lược tìm kiếm gỡ lỗi trên đầu ra lỗi chuẩn stderr"
 
-#: builtin/describe.c:398
+#: builtin/describe.c:440
 msgid "use any ref"
 msgstr "dùng ref bất kỳ"
 
-#: builtin/describe.c:399
+#: builtin/describe.c:441
 msgid "use any tag, even unannotated"
 msgstr "dùng thẻ bất kỳ, cả khi “unannotated”"
 
-#: builtin/describe.c:400
+#: builtin/describe.c:442
 msgid "always use long format"
 msgstr "luôn dùng định dạng dài"
 
-#: builtin/describe.c:401
+#: builtin/describe.c:443
 msgid "only follow first parent"
 msgstr "chỉ theo cha mẹ đầu tiên"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:446
 msgid "only output exact matches"
 msgstr "chỉ xuất những gì khớp chính xác"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:448
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "coi như <n> thẻ gần đây nhất (mặc định: 10)"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:450
 msgid "only consider tags matching <pattern>"
 msgstr "chỉ cân nhắc đến những thẻ khớp với <mẫu>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "không coi rằng các thẻ khớp với <mẫu>"
+
+#: builtin/describe.c:454 builtin/name-rev.c:357
 msgid "show abbreviated commit object as fallback"
 msgstr "hiển thị đối tượng chuyển giao vắn tắt như là fallback"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:455 builtin/describe.c:458
 msgid "mark"
 msgstr "dấu"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:456
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "thêm <dấu> trên cây thư mục làm việc bẩn (mặc định \"-dirty\")"
 
-#: builtin/describe.c:430
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr "thêm <dấu> trên cây thư mục làm việc bị hỏng (mặc định \"-broken\")"
+
+#: builtin/describe.c:477
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long là xung khắc với tùy chọn --abbrev=0"
 
-#: builtin/describe.c:456
+#: builtin/describe.c:506
 msgid "No names found, cannot describe anything."
 msgstr "Không tìm thấy các tên, không thể mô tả gì cả."
 
-#: builtin/describe.c:476
+#: builtin/describe.c:549
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty là xung khắc với các tùy chọn commit-ish"
 
-#: builtin/diff.c:86
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "--broken là xung khắc với commit-ishes"
+
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "“%s”: không phải tập tin bình thường hay liên kết mềm"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "tùy chọn không hợp lệ: %s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Không phải là kho git"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "đối tượng đã cho “%s” không hợp lệ."
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "đã cho nhiều hơn hai đối tượng blob: “%s”"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "đã cho đối tượng không thể nắm giữ “%s”."
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr ""
+"git difftool [<các-tùy-chọn>] [<lần_chuyển_giao> [<lần_chuyển_giao>]] [--] "
+"<đường-dẫn>…]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "gặp lỗi: %d"
+
+#: builtin/difftool.c:283
+#, c-format
+msgid "could not read symlink %s"
+msgstr "không thể đọc liên kết mềm %s"
+
+#: builtin/difftool.c:285
+#, c-format
+msgid "could not read symlink file %s"
+msgstr "không đọc được tập tin liên kết mềm %s"
+
+#: builtin/difftool.c:293
+#, c-format
+msgid "could not read object %s for symlink %s"
+msgstr "Không thể đọc đối tượng %s cho liên kết mềm %s"
+
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"các định dạng diff tổ hợp(“-c” và “--cc”) chưa được hỗ trợ trong\n"
+"chế độ diff thư mục(“-d” và “--dir-diff”)."
+
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "cả hai tập tin đã bị sửa: “%s” và “%s”."
+
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "cây làm việc ở bên trái."
+
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "các tập tin tạm đã sẵn có trong “%s”."
+
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "bạn có lẽ muốn dọn dẹp hay "
+
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "dùng “diff.guitool“ thay vì dùng “diff.tool“"
+
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "thực hiện một diff toàn thư mục"
+
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "đừng nhắc khi khởi chạy công cụ diff"
+
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "dùng liên kết mềm trong diff-thư-mục"
+
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "<công_cụ>"
+
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "dùng công cụ diff đã cho"
+
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr "in ra danh sách các công cụ dif cái mà có thẻ dùng với “--tool“"
+
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr ""
+"làm cho “git-difftool” thoát khi gọi công cụ diff trả về mã không phải số "
+"không"
+
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "<lệnh>"
+
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "chỉ định một lệnh tùy ý để xem diff"
+
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "chưa đưa ra <công_cụ> cho --tool=<công_cụ>"
+
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "chưa đưa ra <lệnh> cho --extcmd=<lệnh>"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-opts]"
@@ -6700,163 +7940,167 @@ msgstr "git fetch --multiple [<các-tùy-chọn>] [(<kho> | <nhóm>)…]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<các-tùy-chọn>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "lấy về từ tất cả các máy chủ"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "nối thêm vào .git/FETCH_HEAD thay vì ghi đè lên nó"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "đường dẫn đến gói tải lên trên máy chủ cuối"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "ép buộc ghi đè lên nhánh nội bộ"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "lấy từ nhiều máy chủ cùng lúc"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "lấy tất cả các thẻ cùng với các đối tượng liên quan đến nó"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "không lấy tất cả các thẻ (--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "số lượng mô-đun-con được lấy đồng thời"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "cắt cụt (prune) các nhánh “remote-tracking” không còn tồn tại trên máy chủ "
 "nữa"
 
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "khi-cần"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "điều khiển việc lấy về đệ quy trong các mô-đun-con"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "giữ lại gói đã tải về"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "cho phép cập nhật th.chiếu HEAD"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "làm sâu hơn lịch sử của bản sao"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "làm sâu hơn lịch sử của kho bản sao shallow dựa trên thời gian"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "chuyển đổi hoàn toàn sang kho git"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1440
 msgid "dir"
 msgstr "tmục"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "soạn sẵn cái này cho kết xuất đường dẫn mô-đun-con"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "chế độ mặc định cho đệ qui"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "chấp nhận tham chiếu cập nhật .git/shallow"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "refmap"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "chỉ ra refmap cần lấy về"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "Không thể tìm thấy máy chủ cho tham chiếu HEAD"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:513
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "phần cấu hình fetch.output có chứa giá-trị không hợp lệ %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:606
 #, c-format
 msgid "object %s not found"
 msgstr "Không tìm thấy đối tượng %s"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:610
 msgid "[up to date]"
 msgstr "[đã cập nhật]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:623 builtin/fetch.c:703
 msgid "[rejected]"
 msgstr "[Bị từ chối]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:624
 msgid "can't fetch in current branch"
 msgstr "không thể fetch (lấy) về nhánh hiện hành"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:633
 msgid "[tag update]"
 msgstr "[cập nhật thẻ]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
 msgid "unable to update local ref"
 msgstr "không thể cập nhật tham chiếu nội bộ"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:653
 msgid "[new tag]"
 msgstr "[thẻ mới]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:656
 msgid "[new branch]"
 msgstr "[nhánh mới]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:659
 msgid "[new ref]"
 msgstr "[ref (tham chiếu) mới]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:698
 msgid "forced update"
 msgstr "cưỡng bức cập nhật"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:703
 msgid "non-fast-forward"
 msgstr "không-phải-chuyển-tiếp-nhanh"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:748
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s đã không gửi tất cả các đối tượng cần thiết\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:768
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "từ chối %s bởi vì các gốc nông thì không được phép cập nhật"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
 msgid "From %.*s\n"
 msgstr "Từ %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6865,57 +8109,57 @@ msgstr ""
 "một số tham chiếu nội bộ không thể được cập nhật; hãy thử chạy\n"
 " “git remote prune %s” để bỏ đi những nhánh cũ, hay bị xung đột"
 
-#: builtin/fetch.c:904
+#: builtin/fetch.c:921
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s sẽ trở thành không đầu (không được quản lý))"
 
-#: builtin/fetch.c:905
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s đã trở thành không đầu (không được quản lý))"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:954
 msgid "[deleted]"
 msgstr "[đã xóa]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:955 builtin/remote.c:1022
 msgid "(none)"
 msgstr "(không)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:978
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 "Từ chối việc lấy vào trong nhánh hiện tại %s của một kho chứa không phải kho "
 "trần (bare)"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:997
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Tùy chọn \"%s\" có giá trị \"%s\" là không hợp lệ cho %s"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1000
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Tùy chọn \"%s\" bị bỏ qua với %s\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1076
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Không biết làm cách nào để lấy về từ %s"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1236
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Đang lấy “%s” về\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "không thể “%s” về"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1256
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6923,32 +8167,40 @@ msgstr ""
 "Chưa chỉ ra kho chứa máy chủ.  Xin hãy chỉ định hoặc là URL hoặc\n"
 "tên máy chủ từ cái mà những điểm xét duyệt mới có thể được fetch (lấy về)."
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1279
 msgid "You need to specify a tag name."
 msgstr "Bạn phải định rõ tên thẻ."
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "Mức sâu là số âm trong --deepen là không được hỗ trợ"
+
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "Các tùy chọn--deepen và --depth loại từ lẫn nhau"
+
+#: builtin/fetch.c:1328
 msgid "--depth and --unshallow cannot be used together"
 msgstr "tùy chọn --depth và --unshallow không thể sử dụng cùng với nhau"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1330
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow trên kho hoàn chỉnh là không hợp lý"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1352
 msgid "fetch --all does not take a repository argument"
 msgstr "lệnh lấy về \"fetch --all\" không lấy đối số kho chứa"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1354
 msgid "fetch --all does not make sense with refspecs"
 msgstr "lệnh lấy về \"fetch --all\" không hợp lý với refspecs"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1365
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "không có nhóm máy chủ hay máy chủ như thế: %s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1373
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Việc lấy về cả một nhóm và chỉ định refspecs không hợp lý"
 
@@ -6959,23 +8211,23 @@ msgstr ""
 "git fmt-merge-msg [-m <chú_thích>] [--log[=<n>] | --no-log] [--file <tập-"
 "tin>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "gắn nhật ký với ít nhất <n> mục từ lệnh “shortlog”"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "bí danh cho --log (không được dùng)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "văn bản"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "dùng <văn bản thường> để bắt đầu ghi chú"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "tập tin để đọc dữ liệu từ đó"
 
@@ -6988,12 +8240,14 @@ msgid "git for-each-ref [--points-at <object>]"
 msgstr "git for-each-ref [--points-at <đối tượng>]"
 
 #: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git branch ([--merged | --no-merged) [<đối_tượng>]"
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<lần-chuyển-giao>]]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<đối_tượng>]]"
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr ""
+"git for-each-ref [--contains [<lần-chuyển-giao>]] [--no-contains [<lần-"
+"chuyển-giao>]]"
 
 #: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
@@ -7015,10 +8269,6 @@ msgstr "trích dẫn để phù hợp cho Tcl"
 msgid "show only <n> matched refs"
 msgstr "hiển thị chỉ <n> tham chiếu khớp"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "định dạng sẽ dùng cho đầu ra"
-
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
 msgstr "chỉ hiển thị các tham chiếu mà nó chỉ đến đối tượng đã cho"
@@ -7035,63 +8285,67 @@ msgstr "chỉ hiển thị những tham chiếu mà nó không được hòa tr
 msgid "print only refs which contain the commit"
 msgstr "chỉ hiển thị những tham chiếu mà nó chứa lần chuyển giao"
 
-#: builtin/fsck.c:519
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "chỉ hiển thị những tham chiếu mà nó không chứa lần chuyển giao"
+
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "Đang kiểm tra các thư mục đối tượng"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<các-tùy-chọn>] [<đối-tượng>…]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "hiển thị các đối tượng không thể đọc được"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "hiển thị các đối tượng không được quản lý"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "báo cáo các thẻ"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "báo cáo node gốc"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "tạo “index objects head nodes”"
 
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "tạo “reflogs head nodes” (mặc định)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "cũng cân nhắc đến các đối tượng gói và thay thế"
 
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "chỉ kiểm tra kết nối"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "cho phép kiểm tra hạn chế hơn"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr "ghi các đối tượng không được quản lý trong .git/lost-found"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "hiển thị quá trình"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "hiển thị tên chi tiết cho các đối tượng đọc được"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "Đang kiểm tra các đối tượng"
 
@@ -7099,17 +8353,17 @@ msgstr "Đang kiểm tra các đối tượng"
 msgid "git gc [<options>]"
 msgstr "git gc [<các-tùy-chọn>]"
 
-#: builtin/gc.c:72
+#: builtin/gc.c:78
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "%s không hợp lệ: “%s”"
+msgid "Failed to fstat %s: %s"
+msgstr "Gặp lỗi khi lấy thông tin thống kê về tập tin %s: %s"
 
-#: builtin/gc.c:139
+#: builtin/gc.c:310
 #, c-format
-msgid "insanely long object directory %.*s"
-msgstr "thư mục đối tượng dài một cách điên rồ %.*s"
+msgid "Can't stat %s"
+msgstr "không thể lấy thông tin thống kê về “%s”"
 
-#: builtin/gc.c:290
+#: builtin/gc.c:319
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7124,40 +8378,45 @@ msgstr ""
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:358
 msgid "prune unreferenced objects"
 msgstr "xóa bỏ các đối tượng không được tham chiếu"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:360
 msgid "be more thorough (increased runtime)"
 msgstr "cẩn thận hơn nữa (tăng thời gian chạy)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:361
 msgid "enable auto-gc mode"
 msgstr "bật chế độ auto-gc"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:362
 msgid "force running gc even if there may be another gc running"
 msgstr "buộc gc chạy ngay cả khi có tiến trình gc khác đang chạy"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "Gặp lỗi khi phân tích giá trị gc.logexpiry %s"
+
+#: builtin/gc.c:407
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Tự động đóng gói kho chứa trên nền hệ thống để tối ưu hóa hiệu suất làm "
 "việc.\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:409
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:410
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "Xem \"git help gc\" để có hướng dẫn cụ thể về cách dọn dẹp kho git.\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:431
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -7165,248 +8424,262 @@ msgstr ""
 "gc đang được thực hiện trên máy “%s” pid %<PRIuMAX> (dùng --force nếu không "
 "phải thế)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:475
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 "Có quá nhiều đối tượng tự do không được dùng đến; hãy chạy lệnh “git prune” "
 "để xóa bỏ chúng đi."
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<các-tùy-chọn>] [-e] <mẫu> [<rev>…] [[--] <đường-dẫn>…]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: gặp lỗi tạo tuyến (thread): %s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "số tuyến đã cho không hợp lệ (%d) cho %s"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "không thể đọc cây (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:829
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "không thể thực hiện lệnh grep (lọc tìm) từ đối tượng thuộc kiểu %s"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:893
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "chuyển đến “%c” cần một giá trị bằng số"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "không mở được “%s”"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:980
 msgid "search in index instead of in the work tree"
 msgstr "tìm trong bảng mục lục thay vì trong cây làm việc"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:982
 msgid "find in contents not managed by git"
 msgstr "tìm trong nội dung không được quản lý bởi git"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:984
 msgid "search in both tracked and untracked files"
 msgstr "tìm kiếm các tập tin được và chưa được theo dõi dấu vết"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:986
 msgid "ignore files specified via '.gitignore'"
 msgstr "các tập tin bị bỏ qua được chỉ định thông qua “.gitignore”"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "tìm kiếm đệ quy trong từng mô-đun-con"
+
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "tên cơ sở"
+
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "treo vào trước tên cơ sở cha mẹ của đường dẫn vào kết xuất"
+
+#: builtin/grep.c:994
 msgid "show non-matching lines"
 msgstr "hiển thị những dòng không khớp với mẫu"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:996
 msgid "case insensitive matching"
 msgstr "phân biệt HOA/thường"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:998
 msgid "match patterns only at word boundaries"
 msgstr "chỉ khớp mẫu tại đường ranh giới từ"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:1000
 msgid "process binary files as text"
 msgstr "xử lý tập tin nhị phân như là dạng văn bản thường"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:1002
 msgid "don't match patterns in binary files"
 msgstr "không khớp mẫu trong các tập tin nhị phân"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:1005
 msgid "process binary files with textconv filters"
 msgstr "xử lý tập tin nhị phân với các bộ lọc “textconv”"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1007
 msgid "descend at most <depth> levels"
 msgstr "hạ xuống ít nhất là mức <sâu>"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1011
 msgid "use extended POSIX regular expressions"
 msgstr "dùng biểu thức chính qui POSIX có mở rộng"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1014
 msgid "use basic POSIX regular expressions (default)"
 msgstr "sử dụng biểu thức chính quy kiểu POSIX (mặc định)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1017
 msgid "interpret patterns as fixed strings"
 msgstr "diễn dịch các mẫu như là chuỗi cố định"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1020
 msgid "use Perl-compatible regular expressions"
 msgstr "sử dụng biểu thức chính quy tương thích Perl"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1023
 msgid "show line numbers"
 msgstr "hiển thị số của dòng"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1024
 msgid "don't show filenames"
 msgstr "không hiển thị tên tập tin"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1025
 msgid "show filenames"
 msgstr "hiển thị các tên tập tin"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1027
 msgid "show filenames relative to top directory"
 msgstr "hiển thị tên tập tin tương đối với thư mục đỉnh (top)"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1029
 msgid "show only filenames instead of matching lines"
 msgstr "chỉ hiển thị tên tập tin thay vì những dòng khớp với mẫu"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1031
 msgid "synonym for --files-with-matches"
 msgstr "đồng nghĩa với --files-with-matches"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1034
 msgid "show only the names of files without match"
 msgstr "chỉ hiển thị tên cho những tập tin không khớp với mẫu"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1036
 msgid "print NUL after filenames"
 msgstr "thêm NUL vào sau tên tập tin"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1038
 msgid "show the number of matches instead of matching lines"
 msgstr "hiển thị số lượng khớp thay vì những dòng khớp với mẫu"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1039
 msgid "highlight matches"
 msgstr "tô sáng phần khớp mẫu"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1041
 msgid "print empty line between matches from different files"
 msgstr "hiển thị dòng trống giữa các lần khớp từ các tập tin khác biệt"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1043
 msgid "show filename only once above matches from same file"
 msgstr ""
 "hiển thị tên tập tin một lần phía trên các lần khớp từ cùng một tập tin"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1046
 msgid "show <n> context lines before and after matches"
 msgstr "hiển thị <n> dòng nội dung phía trước và sau các lần khớp"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1049
 msgid "show <n> context lines before matches"
 msgstr "hiển thị <n> dòng nội dung trước khớp"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1051
 msgid "show <n> context lines after matches"
 msgstr "hiển thị <n> dòng nội dung sau khớp"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1053
 msgid "use <n> worker threads"
 msgstr "dùng <n> tuyến trình làm việc"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1054
 msgid "shortcut for -C NUM"
 msgstr "dạng viết tắt của -C SỐ"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1057
 msgid "show a line with the function name before matches"
 msgstr "hiển thị dòng vói tên hàm trước các lần khớp"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1059
 msgid "show the surrounding function"
 msgstr "hiển thị hàm bao quanh"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1062
 msgid "read patterns from file"
 msgstr "đọc mẫu từ tập-tin"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1064
 msgid "match <pattern>"
 msgstr "match <mẫu>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1066
 msgid "combine patterns specified with -e"
 msgstr "tổ hợp mẫu được chỉ ra với tùy chọn -e"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1078
 msgid "indicate hit with exit status without output"
 msgstr "đưa ra gợi ý với trạng thái thoát mà không có kết xuất"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1080
 msgid "show only matches from files that match all patterns"
 msgstr "chỉ hiển thị những cái khớp từ tập tin mà nó khớp toàn bộ các mẫu"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1082
 msgid "show parse tree for grep expression"
 msgstr "hiển thị cây phân tích cú pháp cho biểu thức “grep” (tìm kiếm)"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "pager"
 msgstr "dàn trang"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "show matching files in the pager"
 msgstr "hiển thị các tập tin khớp trong trang giấy"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1089
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "cho phép gọi grep(1) (bị bỏ qua bởi lần dịch này)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1153
 msgid "no pattern given."
 msgstr "chưa chỉ ra mẫu."
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr "--no-index hay --untracked không được sử dụng cùng với revs"
+
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
+msgstr "không thể phân giải điểm xét duyệt: %s"
+
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "số tuyến chỉ ra không hợp lệ (%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1251
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager chỉ làm việc trên cây-làm-việc"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "tùy chọn không được hỗ trợ với --recurse-submodules."
+
+#: builtin/grep.c:1280
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached hay --untracked không được sử dụng với --no-index."
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr ""
-"--no-index hay --untracked không được sử dụng cùng với các tùy chọn liên "
-"quan đến revs."
-
-#: builtin/grep.c:909
+#: builtin/grep.c:1286
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard không thể sử dụng cho nội dung lưu dấu vết."
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1294
 msgid "both --cached and trees are given."
 msgstr "cả hai --cached và các cây phải được chỉ ra."
 
@@ -7422,83 +8695,87 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "kiểu"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "kiểu đối tượng"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "ghi đối tượng vào dữ liệu đối tượng"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "đọc đối tượng từ đầu vào tiêu chuẩn stdin"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "lưu các tập tin mà nó không có các bộ lọc"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr "chỉ cần băm rác ngẫu nhiên để tạo một đối tượng hỏng để mà gỡ lỗi Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "xử lý tập tin như là nó đang ở thư mục này"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "hiển thị danh sách các câu lệnh người dùng có thể sử dụng"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "hướng dẫn loại trừ"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "hiển thị danh sách các hướng dẫn hữu dụng"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "hiển thị trang man"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "hiển thị hướng dẫn sử dụng trong trình duyệt web"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "hiện trang info"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<lệnh>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "không nhận ra định dạng trợ giúp “%s”"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "Gặp lỗi khi khởi chạy emacsclient."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "Gặp lỗi khi phân tích phiên bản emacsclient."
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "phiên bản của emacsclient “%d” quá cũ (< 22)."
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "gặp lỗi khi thực thi “%s”"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7507,7 +8784,7 @@ msgstr ""
 "“%s”: đường dẫn không hỗ trợ bộ trình chiếu man.\n"
 "Hãy cân nhắc đến việc sử dụng “man.<tool>.cmd” để thay thế."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7516,421 +8793,434 @@ msgstr ""
 "“%s”: cmd (lệnh) hỗ trợ bộ trình chiếu man.\n"
 "Hãy cân nhắc đến việc sử dụng “man.<tool>.path” để thay thế."
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "“%s”: không rõ chương trình xem man."
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "không có trình xem trợ giúp dạng manpage tiếp hợp với yêu cầu"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "không có trình xem trợ giúp dạng info tiếp hợp với yêu cầu"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Định nghĩa các thuộc tính cho mỗi đường dẫn"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Mỗi ngày học 20 lệnh Git hay hơn"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Thuật ngữ chuyên môn Git"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Chỉ định các tập tin không cần theo dõi"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Định nghĩa thuộc tính mô-đun-con"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Chỉ định điểm xét duyệt và vùng cho Git"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Hướng dẫn cách dùng Git ở mức cơ bản (bản 1.5.1 hay mới hơn)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Tổng quan về luồng công việc khuyến nghị nên dùng với Git."
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Các chỉ dẫn chung về cách dùng Git là:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "cách dùng: %s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "“git %s” được đặt bí danh thành “%s”"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "cách dùng: %s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "không thể mở %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "kiểu đối tượng không khớp tại %s"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
 msgstr "Không thể lấy về đối tượng cần %s"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
 msgstr "đối tượng %s: cần kiểu %s nhưng lại nhận được %s"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "không thể điền thêm vào %d byte"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "gặp kết thúc tập tin EOF quá sớm"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "lỗi đọc ở đầu vào"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "sử dụng nhiều hơn số lượng byte mà nó sẵn có"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "gói quá lớn so với định nghĩa hiện tại của kiểu off_t"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "gói đã vượt quá cỡ tối đa được phép"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "không thể tạo “%s”"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:323
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "không thể mở packfile “%s”"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:337
 msgid "pack signature mismatch"
 msgstr "chữ ký cho gói không khớp"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:339
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "không hỗ trợ phiên bản gói %<PRIu32>"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:357
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "gói có đối tượng sai tại khoảng bù %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:479
 #, c-format
 msgid "inflate returned %d"
 msgstr "xả nén trả về %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:528
 msgid "offset value overflow for delta base object"
 msgstr "tràn giá trị khoảng bù cho đối tượng delta cơ sở"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:536
 msgid "delta base offset is out of bound"
 msgstr "khoảng bù cơ sở cho delta nằm ngoài phạm vi"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:544
 #, c-format
 msgid "unknown object type %d"
 msgstr "không hiểu kiểu đối tượng %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:575
 msgid "cannot pread pack file"
 msgstr "không thể chạy hàm pread cho tập tin gói"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:577
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "tập tin gói bị kết thúc sớm, thiếu %<PRIuMAX> byte"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:603
 msgid "serious inflate inconsistency"
 msgstr "sự mâu thuẫn xả nén nghiêm trọng"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SỰ VA CHẠM SHA1 ĐàXẢY RA VỚI %s!"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
 msgid "unable to read %s"
 msgstr "không thể đọc %s"
 
 #: builtin/index-pack.c:814
 #, c-format
+msgid "cannot read existing object info %s"
+msgstr "không thể đọc thông tin đối tượng sẵn có %s"
+
+#: builtin/index-pack.c:822
+#, c-format
 msgid "cannot read existing object %s"
 msgstr "không thể đọc đối tượng đã tồn tại %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:836
 #, c-format
 msgid "invalid blob object %s"
 msgstr "đối tượng blob không hợp lệ %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:850
 #, c-format
 msgid "invalid %s"
 msgstr "%s không hợp lệ"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:853
 msgid "Error in object"
 msgstr "Lỗi trong đối tượng"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:855
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Không phải tất cả các đối tượng con của %s là có thể với tới được"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
 msgid "failed to apply delta"
 msgstr "gặp lỗi khi áp dụng delta"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Receiving objects"
 msgstr "Đang nhận về các đối tượng"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Indexing objects"
 msgstr "Các đối tượng bảng mục lục"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1160
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "gói bị sai hỏng (SHA1 không khớp)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1165
 msgid "cannot fstat packfile"
 msgstr "không thể lấy thông tin thống kê packfile"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1168
 msgid "pack has junk at the end"
 msgstr "pack có phần thừa ở cuối"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1179
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "lộn xộn hơn cả điên rồ khi chạy hàm parse_pack_objects()"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1202
 msgid "Resolving deltas"
 msgstr "Đang phân giải các delta"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1213
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "không thể tạo tuyến: %s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1255
 msgid "confusion beyond insanity"
 msgstr "lộn xộn hơn cả điên rồ"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1261
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "đầy đủ với %d đối tượng nội bộ"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1273
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Gặp tổng kiểm tra tail không cần cho %s (đĩa hỏng?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1277
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "gói có %d delta chưa được giải quyết"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1301
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "không thể xả nén đối tượng nối thêm (%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1377
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "đối tượng nội bộ %s bị hỏng"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1403
 msgid "error while closing pack file"
 msgstr "gặp lỗi trong khi đóng tập tin gói"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1415
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "không thể ghi tập tin giữ lại “%s”"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1423
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "không thể đóng tập tin giữ lại đã được ghi “%s”"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1433
 msgid "cannot store pack file"
 msgstr "không thể lưu tập tin gói"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "không thể lưu trữ tập tin ghi mục lục"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1479
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "sai pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "không hỗ trợ đa tuyến, bỏ qua %s"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1547
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Không thể mở tập tin gói đã sẵn có “%s”"
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1549
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Không thể mở tập tin idx của gói cho “%s”"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1596
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "không delta: %d đối tượng"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1603
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "chiều dài xích = %d: %lu đối tượng"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1616
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "tên tập tin tập tin gói “%s” không được kết thúc bằng đuôi “.pack”"
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
 msgid "bad %s"
 msgstr "%s sai"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1737
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin không thể được dùng mà không có --stdin"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "--stdin cần một kho git"
+
+#: builtin/index-pack.c:1747
 msgid "--verify with no packfile name given"
 msgstr "dùng tùy chọn --verify mà không đưa ra tên packfile"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
 msgstr "không thể lấy thông tin thống kê về “%s”"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "không thể lấy thông tin thống kê về mẫu “%s”"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "không thể opendir() “%s”"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "không thể readlink “%s”"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "không thể tạo liên kết mềm (symlink) “%s” “%s”"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "không thể sao chép “%s” sang “%s”"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "đang lờ đi mẫu “%s”"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "các mẫu không được tìm thấy %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "không sao chép các mẫu từ “%s”: %s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s đã có từ trước rồi"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "không thể xử lý (handle) tập tin kiểu %d"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "không di chuyển được %s vào %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s đã có từ trước rồi"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Đã khởi tạo lại kho Git chia sẻ sẵn có trong %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Đã khởi tạo lại kho Git sẵn có trong %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Đã khởi tạo lại kho Git chia sẻ trống rỗng sẵn có trong %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Đã khởi tạo lại kho Git trống rỗng sẵn có trong %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7938,25 +9228,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<thư-mục-tạm>] [--shared[=<các-"
 "quyền>]] [thư-mục]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "các quyền"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "chỉ ra cái mà kho git được chia sẻ giữa nhiều người dùng"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "không thể mkdir (tạo thư mục): %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "không thể chdir (chuyển đổi thư mục) sang %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7965,7 +9255,7 @@ msgstr ""
 "%s (hoặc --work-tree=<thư-mục>) không cho phép không chỉ định %s (hoặc --git-"
 "dir=<thư-mục>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "không thể truy cập cây (tree) làm việc “%s”"
@@ -8006,107 +9296,104 @@ msgstr "git log [<các-tùy-chọn>] [<vùng-xem-xét>] [[--] <đường-dẫn>
 msgid "git show [<options>] <object>..."
 msgstr "git show [<các-tùy-chọn>] <đối-tượng>…"
 
-#: builtin/log.c:84
+#: builtin/log.c:89
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "tùy chọn--decorate không hợp lệ: %s"
 
-#: builtin/log.c:139
+#: builtin/log.c:144
 msgid "suppress diff output"
 msgstr "chặn mọi kết xuất từ diff"
 
-#: builtin/log.c:140
+#: builtin/log.c:145
 msgid "show source"
 msgstr "hiển thị mã nguồn"
 
-#: builtin/log.c:141
+#: builtin/log.c:146
 msgid "Use mail map file"
 msgstr "Sử dụng tập tin ánh xạ thư"
 
-#: builtin/log.c:142
+#: builtin/log.c:147
 msgid "decorate options"
 msgstr "các tùy chọn trang trí"
 
-#: builtin/log.c:145
+#: builtin/log.c:150
 msgid "Process line range n,m in file, counting from 1"
 msgstr "Xử lý chỉ dòng vùng n,m trong tập tin, tính từ 1"
 
-#: builtin/log.c:241
+#: builtin/log.c:246
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Kết xuất cuối cùng: %d %s\n"
 
-#: builtin/log.c:486
+#: builtin/log.c:493
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: sai tập tin"
 
-#: builtin/log.c:500 builtin/log.c:594
+#: builtin/log.c:507 builtin/log.c:601
 #, c-format
 msgid "Could not read object %s"
 msgstr "Không thể đọc đối tượng %s"
 
-#: builtin/log.c:618
+#: builtin/log.c:625
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Không nhận ra kiểu: %d"
 
-#: builtin/log.c:739
+#: builtin/log.c:746
 msgid "format.headers without value"
 msgstr "format.headers không có giá trị cụ thể"
 
-#: builtin/log.c:839
+#: builtin/log.c:846
 msgid "name of output directory is too long"
 msgstr "tên của thư mục kết xuất quá dài"
 
-#: builtin/log.c:854
+#: builtin/log.c:861
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Không thể mở tập tin miếng vá: %s"
 
-#: builtin/log.c:868
+#: builtin/log.c:875
 msgid "Need exactly one range."
 msgstr "Cần chính xác một vùng."
 
-#: builtin/log.c:878
+#: builtin/log.c:885
 msgid "Not a range."
 msgstr "Không phải là một vùng."
 
-#: builtin/log.c:984
+#: builtin/log.c:991
 msgid "Cover letter needs email format"
 msgstr "“Cover letter” cần cho định dạng thư"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1071
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to điên rồ: %s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1098
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<các-tùy-chọn>] [<kể-từ> | <vùng-xem-xét>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1148
 msgid "Two output directories?"
 msgstr "Hai thư mục kết xuất?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Không hiểu lần chuyển giao %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Gặp lỗi khi phân giải “%s” như là một tham chiếu hợp lệ."
 
-#: builtin/log.c:1259
+#: builtin/log.c:1270
 msgid "Could not find exact merge base."
 msgstr "Không tìm thấy nền hòa trộn chính xác."
 
-#: builtin/log.c:1263
+#: builtin/log.c:1274
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8117,210 +9404,214 @@ msgstr ""
 "nhánh máy chủ. Hoặc là bạn có thể chỉ định lần chuyển giao nền bằng\n"
 "\"--base=<base-commit-id>\" một cách thủ công."
 
-#: builtin/log.c:1283
+#: builtin/log.c:1294
 msgid "Failed to find exact merge base"
 msgstr "Gặp lỗi khi tìm nền hòa trộn chính xác."
 
-#: builtin/log.c:1294
+#: builtin/log.c:1305
 msgid "base commit should be the ancestor of revision list"
 msgstr "lần chuyển giao nền không là tổ tiên của danh sách điểm xét duyệt"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1309
 msgid "base commit shouldn't be in revision list"
 msgstr "lần chuyển giao nền không được trong danh sách điểm xét duyệt"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1358
 msgid "cannot get patch id"
 msgstr "không thể lấy mã miếng vá"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1415
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "dùng [PATCH n/m] ngay cả với miếng vá đơn"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1418
 msgid "use [PATCH] even with multiple patches"
 msgstr "dùng [VÁ] ngay cả với các miếng vá phức tạp"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1422
 msgid "print patches to standard out"
 msgstr "hiển thị miếng vá ra đầu ra chuẩn"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1424
 msgid "generate a cover letter"
 msgstr "tạo bì thư"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1426
 msgid "use simple number sequence for output file names"
 msgstr "sử dụng chỗi dãy số dạng đơn giản cho tên tập-tin xuất ra"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1427
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1428
 msgid "use <sfx> instead of '.patch'"
 msgstr "sử dụng <sfx> thay cho “.patch”"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1430
 msgid "start numbering patches at <n> instead of 1"
 msgstr "bắt đầu đánh số miếng vá từ <n> thay vì 1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1432
 msgid "mark the series as Nth re-roll"
 msgstr "đánh dấu chuỗi nối tiếp dạng thứ-N re-roll"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Dùng [RFC VÁ] thay cho [VÁ]"
+
+#: builtin/log.c:1437
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Dùng [<tiền-tố>] thay cho [VÁ]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1440
 msgid "store resulting files in <dir>"
 msgstr "lưu các tập tin kết quả trong <t.mục>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1443
 msgid "don't strip/add [PATCH]"
 msgstr "không strip/add [VÁ]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1446
 msgid "don't output binary diffs"
 msgstr "không kết xuất diff (những khác biệt) nhị phân"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1448
 msgid "output all-zero hash in From header"
 msgstr "xuất mọi mã băm all-zero trong phần đầu From"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1450
 msgid "don't include a patch matching a commit upstream"
 msgstr "không bao gồm miếng vá khớp với một lần chuyển giao thượng nguồn"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1452
 msgid "show patch format instead of default (patch + stat)"
 msgstr "hiển thị định dạng miếng vá thay vì mặc định (miếng vá + thống kê)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1454
 msgid "Messaging"
 msgstr "Lời nhắn"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1455
 msgid "header"
 msgstr "đầu đề thư"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1456
 msgid "add email header"
 msgstr "thêm đầu đề thư"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1457 builtin/log.c:1459
 msgid "email"
 msgstr "thư điện tử"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1457
 msgid "add To: header"
 msgstr "thêm To: đầu đề thư"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1459
 msgid "add Cc: header"
 msgstr "thêm Cc: đầu đề thư"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1461
 msgid "ident"
 msgstr "thụt lề"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1462
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "đặt “Địa chỉ gửi” thành <thụ lề> (hoặc thụt lề người commit nếu bỏ quên)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1464
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1465
 msgid "make first mail a reply to <message-id>"
 msgstr "dùng thư đầu tiên để trả lời <message-id>"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1466 builtin/log.c:1469
 msgid "boundary"
 msgstr "ranh giới"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1467
 msgid "attach the patch"
 msgstr "đính kèm miếng vá"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1470
 msgid "inline the patch"
 msgstr "dùng miếng vá làm nội dung"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1474
 msgid "enable message threading, styles: shallow, deep"
 msgstr "cho phép luồng lời nhắn, kiểu: “shallow”, “deep”"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1476
 msgid "signature"
 msgstr "chữ ký"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1477
 msgid "add a signature"
 msgstr "thêm chữ ký"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1478
 msgid "base-commit"
 msgstr "lần_chuyển_giao_nền"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1479
 msgid "add prerequisite tree info to the patch series"
 msgstr "add trước hết đòi hỏi thông tin cây tới sê-ri miếng vá"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1481
 msgid "add a signature from a file"
 msgstr "thêm chữ ký từ một tập tin"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1482
 msgid "don't print the patch filenames"
 msgstr "không hiển thị các tên tập tin của miếng vá"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1572
 msgid "-n and -k are mutually exclusive."
 msgstr "-n và  -k loại từ lẫn nhau."
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix và -k xung khắc nhau."
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc và -k xung khắc nhau."
 
-#: builtin/log.c:1568
+#: builtin/log.c:1582
 msgid "--name-only does not make sense"
 msgstr "--name-only không hợp lý"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1584
 msgid "--name-status does not make sense"
 msgstr "--name-status không hợp lý"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1586
 msgid "--check does not make sense"
 msgstr "--check không hợp lý"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1616
 msgid "standard output, or directory, which one?"
 msgstr "đầu ra chuẩn, hay thư mục, chọn cái nào?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1618
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Không thể tạo thư mục “%s”"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1712
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "không thể đọc tập tin chữ ký “%s”"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1784
 msgid "Failed to create output files"
 msgstr "Gặp lỗi khi tạo các tập tin kết xuất"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1833
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<thượng-nguồn> [<đầu> [<giới-hạn>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1887
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -8328,102 +9619,106 @@ msgstr ""
 "Không tìm thấy nhánh mạng được theo dõi, hãy chỉ định <thượng-nguồn> một "
 "cách thủ công.\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:468
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<các-tùy-chọn>] [<tập-tin>…]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:517
 msgid "identify the file status with tags"
 msgstr "nhận dạng các trạng thái tập tin với thẻ"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:519
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "dùng chữ cái viết thường cho các tập tin “assume unchanged” (giả định không "
 "thay đổi)"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:521
 msgid "show cached files in the output (default)"
 msgstr "hiển thị các tập tin được nhớ tạm vào đầu ra (mặc định)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:523
 msgid "show deleted files in the output"
 msgstr "hiển thị các tập tin đã xóa trong kết xuất"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:525
 msgid "show modified files in the output"
 msgstr "hiển thị các tập tin đã bị sửa đổi ra kết xuất"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:527
 msgid "show other files in the output"
 msgstr "hiển thị các tập tin khác trong kết xuất"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:529
 msgid "show ignored files in the output"
 msgstr "hiển thị các tập tin bị bỏ qua trong kết xuất"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:532
 msgid "show staged contents' object name in the output"
 msgstr "hiển thị tên đối tượng của nội dung được đặt lên bệ phóng ra kết xuất"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:534
 msgid "show files on the filesystem that need to be removed"
 msgstr "hiển thị các tập tin trên hệ thống tập tin mà nó cần được gỡ bỏ"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:536
 msgid "show 'other' directories' names only"
 msgstr "chỉ hiển thị tên của các thư mục “khác”"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:538
 msgid "show line endings of files"
 msgstr "hiển thị kết thúc dòng của các tập tin"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:540
 msgid "don't show empty directories"
 msgstr "không hiển thị thư mục rỗng"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:543
 msgid "show unmerged files in the output"
 msgstr "hiển thị các tập tin chưa hòa trộn trong kết xuất"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:545
 msgid "show resolve-undo information"
 msgstr "hiển thị thông tin resolve-undo"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:547
 msgid "skip files matching pattern"
 msgstr "bỏ qua những tập tin khớp với một mẫu"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:550
 msgid "exclude patterns are read from <file>"
 msgstr "mẫu loại trừ được đọc từ <tập tin>"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:553
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "đọc thêm các mẫu ngoại trừ mỗi thư mục trong <tập tin>"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:555
 msgid "add the standard git exclusions"
 msgstr "thêm loại trừ tiêu chuẩn kiểu git"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:558
 msgid "make the output relative to the project top directory"
 msgstr "làm cho kết xuất liên quan đến thư mục ở mức cao nhất (gốc) của dự án"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
+msgstr "đệ quy xuyên qua mô-đun con"
+
+#: builtin/ls-files.c:563
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "nếu <tập tin> bất kỳ không ở trong bảng mục lục, xử lý nó như một lỗi"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:564
 msgid "tree-ish"
 msgstr "tree-ish"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:565
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "giả định rằng các đường dẫn đã bị gỡ bỏ kể từ <tree-ish> nay vẫn hiện diện"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:567
 msgid "show debugging data"
 msgstr "hiển thị dữ liệu gỡ lỗi"
 
@@ -8437,39 +9732,39 @@ msgstr ""
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<kho> [<các tham chiếu>…]]"
 
-#: builtin/ls-remote.c:50
+#: builtin/ls-remote.c:52
 msgid "do not print remote URL"
 msgstr "không hiển thị URL máy chủ"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
 msgid "exec"
 msgstr "thực thi"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
 msgid "path of git-upload-pack on the remote host"
 msgstr "đường dẫn của git-upload-pack trên máy chủ"
 
-#: builtin/ls-remote.c:56
+#: builtin/ls-remote.c:58
 msgid "limit to tags"
 msgstr "giới hạn tới các thẻ"
 
-#: builtin/ls-remote.c:57
+#: builtin/ls-remote.c:59
 msgid "limit to heads"
 msgstr "giới hạn cho các đầu"
 
-#: builtin/ls-remote.c:58
+#: builtin/ls-remote.c:60
 msgid "do not show peeled tags"
 msgstr "không hiển thị thẻ bị peel (gọt bỏ)"
 
-#: builtin/ls-remote.c:60
+#: builtin/ls-remote.c:62
 msgid "take url.<base>.insteadOf into account"
 msgstr "lấy url.<base>.insteadOf vào trong tài khoản"
 
-#: builtin/ls-remote.c:62
+#: builtin/ls-remote.c:64
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr "thoát với mã là 2 nếu không tìm thấy tham chiếu nào khớp"
 
-#: builtin/ls-remote.c:64
+#: builtin/ls-remote.c:66
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "hiển thị tham chiếu nằm dưới để thêm vào đối tượng được chỉ bởi nó"
 
@@ -8477,35 +9772,35 @@ msgstr "hiển thị tham chiếu nằm dưới để thêm vào đối tượng
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>…]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "chỉ hiển thị các tree"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
 msgstr "đệ quy vào các thư mục con"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "hiển thị cây khi đệ quy"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "chấm dứt mục tin với byte NUL"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "gồm cả kích thước đối tượng"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "chỉ liệt kê tên tập tin"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "dùng tên đường dẫn đầy đủ"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "liệt kê cây mục tin; không chỉ thư mục hiện hành (ngụ ý --full-name)"
 
@@ -8513,172 +9808,176 @@ msgstr "liệt kê cây mục tin; không chỉ thư mục hiện hành (ngụ 
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<các-tùy-chọn>] [<commit>…]"
 
-#: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<các-tùy-chọn>] <tin-nhắn> HEAD <commit>"
-
-#: builtin/merge.c:48
+#: builtin/merge.c:47
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
 msgid "switch `m' requires a value"
 msgstr "switch “m” yêu cầu một giá trị"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Không tìm thấy chiến lược hòa trộn “%s”.\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:141
 #, c-format
 msgid "Available strategies are:"
 msgstr "Các chiến lược sẵn sàng là:"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Các chiến lược tùy chỉnh sẵn sàng là:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:196 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "không hiển thị thống kê khác biệt tại cuối của lần hòa trộn"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "hiển thị thống kê khác biệt tại cuối của hòa trộn"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:200 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(đồng nghĩa với --stat)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:202 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "thêm (ít nhất <n>) mục từ shortlog cho ghi chú chuyển giao hòa trộn"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:205 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "tạo một lần chuyển giao đưon thay vì thực hiện việc hòa trộn"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:207 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "thực hiện chuyển giao nếu hòa trộn thành công (mặc định)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:209 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "sửa chú thích trước khi chuyển giao"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:210
 msgid "allow fast-forward (default)"
 msgstr "cho phép chuyển-tiếp-nhanh (mặc định)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:212 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "bỏ qua nếu chuyển-tiếp-nhanh không thể được"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:216 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "thẩm tra xem lần chuyển giao có tên đó có chữ ký GPG hợp lệ hay không"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
 msgid "strategy"
 msgstr "chiến lược"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:218 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "chiến lược hòa trộn sẽ dùng"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:219 builtin/pull.c:162
 msgid "option=value"
 msgstr "tùy_chọn=giá_trị"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:220 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "tùy chọn cho chiến lược hòa trộn đã chọn"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 "hòa trộn ghi chú của lần chuyển giao (dành cho hòa trộn không-chuyển-tiếp-"
 "nhanh)"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:226
 msgid "abort the current in-progress merge"
 msgstr "bãi bỏ quá trình hòa trộn hiện tại đang thực hiện"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "tiếp tục quá trình hòa trộn hiện tại đang thực hiện"
+
+#: builtin/merge.c:230 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "cho phép hòa trộn lịch sử không liên quan"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:258
 msgid "could not run stash."
 msgstr "không thể chạy stash."
 
-#: builtin/merge.c:260
+#: builtin/merge.c:263
 msgid "stash failed"
 msgstr "lệnh tạm cất gặp lỗi"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:268
 #, c-format
 msgid "not a valid object: %s"
 msgstr "không phải là một đối tượng hợp lệ: %s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:287 builtin/merge.c:304
 msgid "read-tree failed"
 msgstr "read-tree gặp lỗi"
 
-#: builtin/merge.c:331
+#: builtin/merge.c:334
 msgid " (nothing to squash)"
 msgstr " (không có gì để squash)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:345
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Squash commit -- không cập nhật HEAD\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:395
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Không có lời chú thích hòa trộn -- nên không cập nhật HEAD\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "“%s” không chỉ đến một lần chuyển giao nào cả"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:536
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Chuỗi branch.%s.mergeoptions sai: %s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
 msgstr "Không cầm nắm gì ngoài hai head hòa trộn"
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Không hiểu tùy chọn cho merge-recursive: -X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "không thể ghi %s"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Không thể đọc từ “%s”"
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Vẫn chưa hòa trộn các lần chuyển giao; sử dụng lệnh “git commit” để hoàn tất "
 "việc hòa trộn.\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8696,69 +9995,76 @@ msgstr ""
 "rỗng\n"
 "sẽ hủy bỏ lần chuyển giao.\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng."
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Tuyệt vời.\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Việc tự động hòa trộn gặp lỗi; hãy sửa các xung đột sau đó chuyển giao kết "
 "quả.\n"
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "%s không phải là một lần commit (chuyển giao)"
-
-#: builtin/merge.c:904
+#: builtin/merge.c:890
 msgid "No current branch."
 msgstr "không phải nhánh hiện hành"
 
-#: builtin/merge.c:906
+#: builtin/merge.c:892
 msgid "No remote for the current branch."
 msgstr "Không có máy chủ cho nhánh hiện hành."
 
-#: builtin/merge.c:908
+#: builtin/merge.c:894
 msgid "No default upstream defined for the current branch."
 msgstr "Không có thượng nguồn mặc định được định nghĩa cho nhánh hiện hành."
 
-#: builtin/merge.c:913
+#: builtin/merge.c:899
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Không nhánh mạng theo dõi cho %s từ %s"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:946
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "Giá trị sai “%s” trong biến môi trường “%s”"
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1020
 #, c-format
 msgid "could not close '%s'"
 msgstr "không thể đóng “%s”"
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1047
 #, c-format
 msgid "not something we can merge in %s: %s"
-msgstr "không phải là một số thứ chúng tôi có thể hòa trộn trong %s: %s"
+msgstr "không phải là một thứ gì đó mà chúng tôi có thể hòa trộn trong %s: %s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1081
 msgid "not something we can merge"
-msgstr "không phải là một số thứ chúng tôi có thể hòa trộn"
+msgstr "không phải là thứ gì đó mà chúng tôi có thể hòa trộn"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "--abort không nhận các đối số"
+
+#: builtin/merge.c:1150
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 "Ở đây không có lần hòa trộn nào được hủy bỏ giữa chừng cả (thiếu MERGE_HEAD)."
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "--continue không nhận đối số"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "Ở đây không có lần hòa trộn nào đang được xử lý cả (thiếu MERGE_HEAD)."
+
+#: builtin/merge.c:1182
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8766,7 +10072,7 @@ msgstr ""
 "Bạn chưa kết thúc việc hòa trộn (MERGE_HEAD vẫn tồn tại).\n"
 "Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1189
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8774,115 +10080,115 @@ msgstr ""
 "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại).\n"
 "Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1192
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại)."
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1201
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Bạn không thể kết hợp --squash với --no-ff."
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1209
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Không chỉ ra lần chuyển giao và merge.defaultToUpstream chưa được đặt."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1226
 msgid "Squash commit into empty head not supported yet"
 msgstr "Squash commit vào một head trống rỗng vẫn chưa được hỗ trợ"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1228
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Chuyển giao không-chuyển-tiếp-nhanh không hợp lý ở trong một head trống rỗng"
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1233
 #, c-format
 msgid "%s - not something we can merge"
-msgstr "%s - không phải là một số thứ chúng tôi có thể hòa trộn"
+msgstr "%s - không phải là thứ gì đó mà chúng tôi có thể hòa trộn"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1235
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 "Không thể hòa trộn một cách đúng đắn một lần chuyển giao vào một head rỗng"
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Lần chuyển giao %s có một chữ ký GPG không đáng tin, được cho là bởi %s."
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Lần chuyển giao %s có một chữ ký GPG sai, được cho là bởi %s."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Lần chuyển giao %s không có chữ ký GPG."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1278
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Lần chuyển giao %s có một chữ ký GPG tốt bởi %s\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1340
 msgid "refusing to merge unrelated histories"
 msgstr "từ chối hòa trộn lịch sử không liên quan"
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1349
 msgid "Already up-to-date."
 msgstr "Đã cập nhật rồi."
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1359
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Đang cập nhật %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1400
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Đang thử hòa trộn kiểu “trivial in-index”…\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1407
 #, c-format
 msgid "Nope.\n"
 msgstr "Không.\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1432
 msgid "Already up-to-date. Yeeah!"
 msgstr "Đã cập nhật rồi. Yeeah!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1438
 msgid "Not possible to fast-forward, aborting."
 msgstr "Thực hiện lệnh chuyển-tiếp-nhanh là không thể được, đang bỏ qua."
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1461 builtin/merge.c:1540
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Đang tua lại cây thành thời xa xưa…\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1465
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Đang thử chiến lược hòa trộn %s…\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1531
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Không có chiến lược hòa trộn nào được nắm giữ (handle) sự hòa trộn.\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1533
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Hòa trộn với chiến lược %s gặp lỗi.\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1542
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Sử dụng %s để chuẩn bị giải quyết bằng tay.\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1554
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8909,23 +10215,23 @@ msgstr "git merge-base --is-ancestor <commit> <lần_chuyển_giao>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <tham-chiếu> [<lần_chuyển_giao>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "xuất ra tất cả các ông bà, tổ tiên chung"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "tìm tổ tiên của hòa trộn n-way đơn"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "liệt kê các “rev” mà nó không thể đọc được từ cái khác"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "là cha mẹ đầu tiên của cái khác?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "tìm xem <commit> được rẽ nhánh ở đâu từ reflog của <th.chiếu>"
 
@@ -8937,38 +10243,68 @@ msgstr ""
 "git merge-file [<các-tùy-chọn>] [-L <tên1> [-L <gốc> [-L <tên2>]]] <tập-"
 "tin1> <tập-tin-gốc> <tập-tin2>"
 
-#: builtin/merge-file.c:33
+#: builtin/merge-file.c:32
 msgid "send results to standard output"
 msgstr "gửi kết quả vào đầu ra tiêu chuẩn"
 
-#: builtin/merge-file.c:34
+#: builtin/merge-file.c:33
 msgid "use a diff3 based merge"
 msgstr "dùng kiểu hòa dựa trên diff3"
 
-#: builtin/merge-file.c:35
+#: builtin/merge-file.c:34
 msgid "for conflicts, use our version"
 msgstr "để tránh xung đột, sử dụng phiên bản của chúng ta"
 
-#: builtin/merge-file.c:37
+#: builtin/merge-file.c:36
 msgid "for conflicts, use their version"
 msgstr "để tránh xung đột, sử dụng phiên bản của họ"
 
-#: builtin/merge-file.c:39
+#: builtin/merge-file.c:38
 msgid "for conflicts, use a union version"
 msgstr "để tránh xung đột, sử dụng phiên bản kết hợp"
 
-#: builtin/merge-file.c:42
+#: builtin/merge-file.c:41
 msgid "for conflicts, use this marker size"
 msgstr "để tránh xung đột, hãy sử dụng kích thước bộ tạo này"
 
-#: builtin/merge-file.c:43
+#: builtin/merge-file.c:42
 msgid "do not warn about conflicts"
 msgstr "không cảnh báo về các xung đột xảy ra"
 
-#: builtin/merge-file.c:45
+#: builtin/merge-file.c:44
 msgid "set labels for file1/orig-file/file2"
 msgstr "đặt nhãn cho tập-tin-1/tập-tin-gốc/tập-tin-2"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "không hiểu tùy chọn %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "không thể phân tích đối tượng “%s”"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "không thể xử lý nhiều hơn %d nền. Bỏ qua %s"
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "không cầm nắm gì ngoài hai head hòa trộn"
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "không thể phân giải tham chiếu %s"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "Đang hòa trộn %s với %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -8985,137 +10321,141 @@ msgstr "cho phép thiếu đối tượng"
 msgid "allow creation of more than one tree"
 msgstr "cho phép tạo nhiều hơn một cây"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<các-tùy-chọn>] <nguồn>… <đích>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "Thư mục “%s” có ở trong chỉ mục mà không có mô-đun con?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "Hãy đưa các thay đổi của bạn vào .gitmodules hay tạm cất chúng đi để xử lý"
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s trong bảng mục lục"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "ép buộc di chuyển hay đổi tên thậm chí cả khi đích đã tồn tại"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "bỏ qua các lỗi liên quan đến di chuyển, đổi tên"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "có đích “%s” nhưng đây không phải là một thư mục"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Đang kiểm tra việc đổi tên của “%s” thành “%s”\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "nguồn sai"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "không thể di chuyển một thư mục vào trong chính nó được"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "không di chuyển được thư mục thông qua tập tin"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "thư mục nguồn là trống rỗng"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "không nằm dưới sự quản lý mã nguồn"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "đích đã tồn tại sẵn rồi"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "đang ghi đè lên “%s”"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "Không thể ghi đè"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "Nhiều nguồn cho cùng một đích"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "thư mục đích không tồn tại"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, nguồn=%s, đích=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Đổi tên %s thành %s\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "gặp lỗi khi đổi tên “%s”"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:289
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<các-tùy-chọn>] <commit>…"
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:290
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<các-tùy-chọn>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:291
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<các-tùy-chọn>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:346
 msgid "print only names (no SHA-1)"
 msgstr "chỉ hiển thị tên (không SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:347
 msgid "only use tags to name the commits"
 msgstr "chỉ dùng các thẻ để đặt tên cho các lần chuyển giao"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:349
 msgid "only use refs matching <pattern>"
 msgstr "chỉ sử dụng các tham chiếu khớp với <mẫu>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "bỏ qua các tham chiếu khớp với <mẫu>"
+
+#: builtin/name-rev.c:353
 msgid "list all commits reachable from all refs"
 msgstr ""
 "liệt kê tất cả các lần chuyển giao có thể đọc được từ tất cả các tham chiếu"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:354
 msgid "read from stdin"
 msgstr "đọc từ đầu vào tiêu chuẩn"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:355
 msgid "allow to print `undefined` names (default)"
 msgstr "cho phép in các tên “chưa định nghĩa” (mặc định)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:361
 msgid "dereference tags in the input (internal use)"
 msgstr "bãi bỏ tham chiếu các thẻ trong đầu vào (dùng nội bộ)"
 
@@ -9248,9 +10588,9 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "gặp lỗi khi hoàn thành “show” cho đối tượng “%s”"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
+msgid "please supply the note contents using either -m or -F option"
 msgstr ""
-"Xin hãy áp dụng nội dung của ghi chú sử dụng hoặc là tùy chọn -m hoặc là -F"
+"xin hãy áp dụng nội dung của ghi chú sử dụng hoặc là tùy chọn -m hoặc là -F"
 
 #: builtin/notes.c:203
 msgid "unable to write note object"
@@ -9258,65 +10598,89 @@ msgstr "không thể ghi đối tượng ghi chú (note)"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
-msgstr "Nội dung ghi chú còn lại %s"
+msgid "the note contents have been left in %s"
+msgstr "nội dung ghi chú còn lại %s"
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
 msgid "cannot read '%s'"
 msgstr "không thể đọc “%s”"
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "không thể mở hay đọc “%s”"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "gặp lỗi khi phân giải “%s” như là một tham chiếu hợp lệ."
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Gặp lỗi khi đọc đối tượng “%s”."
+msgid "failed to read object '%s'."
+msgstr "gặp lỗi khi đọc đối tượng “%s”."
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
+msgid "cannot read note data from non-blob object '%s'."
 msgstr "không thể đọc dữ liệu ghi chú từ đối tượng không-blob “%s”."
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "dòng đầu vào dị hình: “%s”."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "gặp lỗi khi sao chép ghi chú (note) từ “%s” sang “%s”"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "từ chối %s ghi chú trong %s (nằm ngoài refs/notes/)"
+
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
 msgid "too many parameters"
 msgstr "quá nhiều đối số"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid "No note found for object %s."
+msgid "no note found for object %s."
 msgstr "không tìm thấy ghi chú cho đối tượng %s."
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "nội dung ghi chú (note) nằm trong một chuỗi"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "nội dung ghi chú (note) nằm trong một tập tin"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "dùng lại nhưng có sửa chữa đối tượng note đã chỉ ra"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "cho lưu trữ ghi chú trống rỗng"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "thay thế ghi chú trước"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9325,29 +10689,29 @@ msgstr ""
 "Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối tượng "
 "%s. Sử dụng tùy chọn “-f” để ghi đè lên các ghi chú cũ"
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Đang ghi đè lên ghi chú cũ cho đối tượng %s\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "đọc các đối tượng từ đầu vào tiêu chuẩn"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "tải cấu hình chép lại cho <lệnh> (ngầm định là --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "quá ít đối số"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -9356,12 +10720,12 @@ msgstr ""
 "Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối "
 "tượng %s. Sử dụng tùy chọn “-f” để ghi đè lên các ghi chú cũ"
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Thiếu ghi chú trên đối tượng nguồn %s. Không thể sao chép."
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "thiếu ghi chú trên đối tượng nguồn %s. Không thể sao chép."
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9370,20 +10734,52 @@ msgstr ""
 "Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con “edit”.\n"
 "Xin hãy sử dụng lệnh sau để thay thế: “git notes add -f -m/-F/-c/-C”.\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "gặp lỗi khi xóa tham chiếu NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "gặp lỗi khi xóa tham chiếu NOTES_MERGE_REF"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "gặp lỗi khi gỡ bỏ cây làm việc “git notes merge”"
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "gặp lỗi khi đọc tham chiếu NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "không thể tìm thấy lần chuyển giao từ NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "không thể phân tích cú pháp lần chuyển giao từ NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "gặp lỗi khi phân giải NOTES_MERGE_REF"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "gặp lỗi khi hoàn thành hòa trộn ghi chú"
+
+#: builtin/notes.c:754
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "không hiểu chiến lược hòa trộn ghi chú %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:770
 msgid "General options"
 msgstr "Tùy chọn chung"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:772
 msgid "Merge options"
 msgstr "Tùy chọn về hòa trộn"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:774
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -9391,48 +10787,48 @@ msgstr ""
 "phân giải các xung đột “notes” sử dụng chiến lược đã đưa ra (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:776
 msgid "Committing unmerged notes"
 msgstr "Chuyển giao các note chưa được hòa trộn"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:778
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 "các note cuối cùng được hòa trộn bởi các note chưa hòa trộn của lần chuyển "
 "giao"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:780
 msgid "Aborting notes merge resolution"
 msgstr "Hủy bỏ phân giải ghi chú (note) hòa trộn"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:782
 msgid "abort notes merge"
 msgstr "bỏ qua hòa trộn các ghi chú (note)"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:793
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "không thể trộn lẫn --commit, --abort hay -s/--strategy"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
-msgstr "Bạn phải chỉ định tham chiếu ghi chú để hòa trộn"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
+msgstr "bạn phải chỉ định tham chiếu ghi chú để hòa trộn"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:822
 #, c-format
-msgid "Unknown -s/--strategy: %s"
-msgstr "Không hiểu -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
+msgstr "không hiểu -s/--strategy: %s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:859
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Các ghi chú hòa trộn vào %s đã sẵn trong quá trình xử lý tại %s"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "một ghi chú hòa trộn vào %s đã sẵn trong quá trình xử lý tại %s"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:862
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
-msgstr "Gặp lỗi khi lưu liên kết đến tham chiếu ghi chú hiện tại (%s)"
+msgid "failed to store link to current notes ref (%s)"
+msgstr "gặp lỗi khi lưu liên kết đến tham chiếu ghi chú hiện tại (%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:864
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
@@ -9443,48 +10839,48 @@ msgstr ""
 "chuyển giao kết quả bằng “git notes merge --commit”, hoặc bãi bỏ việc hòa "
 "trộn bằng “git notes merge --abort”.\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:886
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Đối tượng %s không có ghi chú (note)\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:898
 msgid "attempt to remove non-existent note is not an error"
 msgstr "cố gắng gỡ bỏ một note chưa từng tồn tại không phải là một lỗi"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:901
 msgid "read object names from the standard input"
 msgstr "đọc tên đối tượng từ thiết bị nhập chuẩn"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "không gỡ bỏ, chỉ hiển thị"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:940
 msgid "report pruned notes"
 msgstr "báo cáo các đối tượng đã prune"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:982
 msgid "notes-ref"
 msgstr "notes-ref"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:983
 msgid "use notes from <notes-ref>"
 msgstr "dùng “notes” từ <notes-ref>"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1018
 #, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Không hiểu câu lệnh con: %s"
+msgid "unknown subcommand: %s"
+msgstr "không hiểu câu lệnh con: %s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 "git pack-objects --stdout [các-tùy-chọn…] [< <danh-sách-tham-chiếu> | < "
 "<danh-sách-đối-tượng>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
@@ -9496,174 +10892,170 @@ msgstr ""
 msgid "deflate error (%d)"
 msgstr "lỗi giải nén (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:770
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr "tắt ghi bitmap, các gói bị chia nhỏ bởi vì pack.packSizeLimit"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:783
 msgid "Writing objects"
 msgstr "Đang ghi lại các đối tượng"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1063
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "tắt ghi bitmap, như vậy một số đối tượng sẽ không được đóng gói"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2426
 msgid "Compressing objects"
 msgstr "Đang nén các đối tượng"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2829
 #, c-format
 msgid "unsupported index version %s"
 msgstr "phiên bản mục lục không được hỗ trợ %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2833
 #, c-format
 msgid "bad index version '%s'"
 msgstr "phiên bản mục lục sai “%s”"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2863
 msgid "do not show progress meter"
 msgstr "không hiển thị bộ đo tiến trình"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2865
 msgid "show progress meter"
 msgstr "hiển thị bộ đo tiến trình"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2867
 msgid "show progress meter during object writing phase"
 msgstr "hiển thị bộ đo tiến triển trong suốt pha ghi đối tượng"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2870
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "tương tự --all-progress khi bộ đo tiến trình được xuất hiện"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2871
 msgid "version[,offset]"
 msgstr "phiên bản[,offset]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2872
 msgid "write the pack index file in the specified idx format version"
 msgstr "ghi tập tin bảng mục lục gói (pack) ở phiên bản định dạng idx đã cho"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2875
 msgid "maximum size of each output pack file"
 msgstr "kcíh thước tối đa cho tập tin gói được tạo"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2877
 msgid "ignore borrowed objects from alternate object store"
 msgstr "bỏ qua các đối tượng vay mượn từ kho đối tượng thay thế"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2879
 msgid "ignore packed objects"
 msgstr "bỏ qua các đối tượng đóng gói"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2881
 msgid "limit pack window by objects"
 msgstr "giới hạn cửa sổ đóng gói theo đối tượng"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2883
 msgid "limit pack window by memory in addition to object limit"
 msgstr "giới hạn cửa sổ đóng gói theo bộ nhớ cộng thêm với giới hạn đối tượng"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2885
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "độ dài tối đa của chuỗi móc xích “delta” được phép trong gói kết quả"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2887
 msgid "reuse existing deltas"
 msgstr "dùng lại các delta sẵn có"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2889
 msgid "reuse existing objects"
 msgstr "dùng lại các đối tượng sẵn có"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2891
 msgid "use OFS_DELTA objects"
 msgstr "dùng các đối tượng OFS_DELTA"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2893
 msgid "use threads when searching for best delta matches"
 msgstr "sử dụng các tuyến trình khi tìm kiếm cho các mẫu khớp delta tốt nhất"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2895
 msgid "do not create an empty pack output"
 msgstr "không thể tạo kết xuất gói trống rỗng"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2897
 msgid "read revision arguments from standard input"
 msgstr " đọc tham số “revision” từ thiết bị nhập chuẩn"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2899
 msgid "limit the objects to those that are not yet packed"
 msgstr "giới hạn các đối tượng thành những cái mà chúng vẫn chưa được đóng gói"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2902
 msgid "include objects reachable from any reference"
 msgstr "bao gồm các đối tượng có thể đọc được từ bất kỳ tham chiếu nào"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2905
 msgid "include objects referred by reflog entries"
 msgstr "bao gồm các đối tượng được tham chiếu bởi các mục reflog"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2908
 msgid "include objects referred to by the index"
 msgstr "bao gồm các đối tượng được tham chiếu bởi mục lục"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2911
 msgid "output pack to stdout"
 msgstr "xuất gói ra đầu ra tiêu chuẩn"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2913
 msgid "include tag objects that refer to objects to be packed"
 msgstr "bao gồm các đối tượng tham chiếu đến các đối tượng được đóng gói"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2915
 msgid "keep unreachable objects"
 msgstr "giữ lại các đối tượng không thể đọc được"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2917
 msgid "pack loose unreachable objects"
 msgstr "pack mất các đối tượng không thể đọc được"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "thời-gian"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2919
 msgid "unpack unreachable objects newer than <time>"
 msgstr ""
 "xả nén (gỡ khỏi gói) các đối tượng không thể đọc được mới hơn <thời-gian>"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2922
 msgid "create thin packs"
 msgstr "tạo gói nhẹ"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2924
 msgid "create packs suitable for shallow fetches"
 msgstr "tạo gói để phù hợp cho lấy về nông (shallow)"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2926
 msgid "ignore packs that have companion .keep file"
 msgstr "bỏ qua các gói mà nó có tập tin .keep đi kèm"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2928
 msgid "pack compression level"
 msgstr "mức nén gói"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2930
 msgid "do not hide commits by grafts"
 msgstr "không ẩn các lần chuyển giao bởi “grafts”"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2932
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "dùng mục lục ánh xạ nếu có thể được để nâng cao tốc độ đếm đối tượng"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2934
 msgid "write a bitmap index together with the pack index"
 msgstr "ghi một mục lục ánh xạ cùng với mục lục gói"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:3061
 msgid "Counting objects"
 msgstr "Đang đếm các đối tượng"
 
@@ -9691,11 +11083,11 @@ msgstr "Đang gỡ các đối tượng trùng lặp"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <thời-gian>] [--] [<head>…]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "báo cáo các đối tượng đã prune"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
 msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>"
 
@@ -9703,54 +11095,45 @@ msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>"
 msgid "cannot prune in a precious-objects repo"
 msgstr "không thể tỉa bớt trong một kho đối_tượng_vĩ_đại"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Giá trị không hợp lệ %s: %s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Các tùy chọn liên quan đến hòa trộn"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "các thay đổi hợp nhất bằng cải tổ thay vì hòa trộn"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
 msgid "allow fast-forward"
 msgstr "cho phép chuyển-tiếp-nhanh"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "tự động stash/stash pop tước và sau tu bổ (rebase)"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Các tùy chọn liên quan đến lệnh lấy về"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "số lượng mô-đun-con được đẩy lên đồng thời"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Giá trị không hợp lệ cho pull.ff: %s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-"Không thể pull với cải tổ: Bạn có các thay đổi chưa được đưa lên bệ phóng."
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr ""
-"Thêm vào đó, bảng mục lục của bạn có chứa các thay đổi chưa được chuyển giao."
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr "Không thể pull với cải tổ: Bạn có các thay đổi chưa được chuyển giao."
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9758,14 +11141,14 @@ msgstr ""
 "Ở đây không có ứng cử nào để cải tổ lại trong số các tham chiếu mà bạn vừa "
 "lấy về."
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "Ở đây không có ứng cử nào để hòa trộn trong số các tham chiếu mà bạn vừa lấy "
 "về."
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9774,7 +11157,7 @@ msgstr ""
 "tự\n"
 "đại diện mà nó lại không khớp trên điểm cuối máy phục vụ."
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9786,43 +11169,43 @@ msgstr ""
 "theo mặc định cho nhánh hiện tại của bạn, bạn phải chỉ định\n"
 "một nhánh trên dòng lệnh."
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Hiện tại bạn chẳng ở nhánh nào cả."
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Vui lòng chỉ định nhánh nào bạn muốn cải tổ lại."
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Vui lòng chỉ định nhánh nào bạn muốn hòa trộn vào."
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Xem git-pull(1) để biết thêm chi tiết."
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<máy chủ>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<nhánh>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "Ở đây không có thông tin theo dõi cho nhánh hiện hành."
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
 "Nếu bạn muốn theo dõi thông tin cho nhánh này bạn có thể thực hiện bằng lệnh:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9831,21 +11214,29 @@ msgstr ""
 "Các đặc tả cấu hình của bạn để hòa trộn với tham chiếu “%s”\n"
 "từ máy dịch vụ, nhưng không có nhánh nào như thế được lấy về."
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "bỏ qua --verify-signatures khi rebase"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "tùy chọn --[no-]autostash chỉ hợp lệ khi dùng với --rebase."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "Đang cập nhật một nhánh chưa được sinh ra với các thay đổi được thêm vào "
 "bảng mục lục."
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "pull với rebase"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "xin hãy chuyển giao hoặc tạm cất (stash) chúng."
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9856,7 +11247,7 @@ msgstr ""
 "đang chuyển-tiếp-nhanh cây làm việc của bạn từ\n"
 "lần chuyển giaot %s."
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9874,11 +11265,11 @@ msgstr ""
 "$ git reset --hard\n"
 "để khôi phục lại."
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Không thể hòa trộn nhiều nhánh vào trong một head trống rỗng."
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Không thể thực hiện lệnh rebase (cải tổ) trên nhiều nhánh."
 
@@ -9974,14 +11365,14 @@ msgstr ""
 "nhánh hiện tại “%s” của bạn, mà không báo cho tôi biết là cái gì được push\n"
 "để cập nhật nhánh máy chủ nào."
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Bạn đã không chỉ ra một refspecs nào để đẩy lên, và push.default là \"không "
 "là gì cả\"."
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -9994,7 +11385,7 @@ msgstr ""
 "Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -10008,7 +11399,7 @@ msgstr ""
 "Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -10023,11 +11414,11 @@ msgstr ""
 "Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "Việc cập nhật bị từ chối bởi vì thẻ đã sẵn có từ trước trên máy chủ."
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -10039,22 +11430,22 @@ msgstr ""
 "đối tượng\n"
 "không phải chuyển giao, mà không sử dụng tùy chọn “--force”.\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Đang đẩy lên %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "gặp lỗi khi đẩy tới một số tham chiếu đến “%s”"
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "repository (kho) sai “%s”"
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -10075,116 +11466,116 @@ msgstr ""
 "\n"
 "    git push <tên>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "--all và --tags xung khắc nhau"
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "--all không thể được tổ hợp cùng với đặc tả đường dẫn"
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror và --tags xung khắc nhau"
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror không thể được tổ hợp cùng với đặc tả đường dẫn"
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "--all và --mirror xung khắc nhau"
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "kho"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:162
 msgid "push all refs"
 msgstr "đẩy tất cả các tham chiếu"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:164
 msgid "mirror all refs"
 msgstr "mirror tất cả các tham chiếu"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "xóa các tham chiếu"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "đẩy các thẻ (không dùng cùng với --all hay --mirror)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:165
 msgid "force updates"
 msgstr "ép buộc cập nhật"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:179
 msgid "refname>:<expect"
 msgstr "tên-tham-chiếu>:<cần"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:180
 msgid "require old value of ref to be at this value"
 msgstr "yêu cầu giá-trị cũ của tham chiếu thì là giá-trị này"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "điều khiển việc đẩy lên (push) đệ qui của mô-đun-con"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:173
 msgid "use thin pack"
 msgstr "tạo gói nhẹ"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
 msgid "receive pack program"
 msgstr "chương trình nhận gói"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "đặt thượng nguồn cho git pull/status"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "xén tỉa những tham chiếu bị gỡ bỏ"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "vòng qua móc tiền-đẩy (pre-push)"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "push phần bị thiếu nhưng các thẻ lại thích hợp"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:167
 msgid "GPG sign the push"
 msgstr "ký lần đẩy dùng GPG"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:174
 msgid "request atomic transaction on remote side"
 msgstr "yêu cầu giao dịch hạt nhân bên phía máy chủ"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:170
 msgid "server-specific"
 msgstr "đặc-tả-máy-phục-vụ"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:171
 msgid "option to transmit"
 msgstr "tùy chọn để chuyển giao"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete là xung khắc với các tùy chọn --all, --mirror và --tags"
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete không hợp lý nếu không có bất kỳ tham chiếu nào"
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr "các tùy chọn push phải không có ký tự dòng mới"
 
-#: builtin/read-tree.c:37
+#: builtin/read-tree.c:40
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -10195,80 +11586,143 @@ msgstr ""
 "[--index-output=<tập-tin>] (--empty | <tree-ish1> [<tree-ish2> [<tree-"
 "ish3>]])"
 
-#: builtin/read-tree.c:110
+#: builtin/read-tree.c:130
 msgid "write resulting index to <file>"
 msgstr "ghi mục lục kết quả vào <tập-tin>"
 
-#: builtin/read-tree.c:113
+#: builtin/read-tree.c:133
 msgid "only empty the index"
 msgstr "chỉ với bảng mục lục trống rỗng"
 
-#: builtin/read-tree.c:115
+#: builtin/read-tree.c:135
 msgid "Merging"
 msgstr "Hòa trộn"
 
-#: builtin/read-tree.c:117
+#: builtin/read-tree.c:137
 msgid "perform a merge in addition to a read"
 msgstr "thực hiện một hòa trộn thêm vào việc đọc"
 
-#: builtin/read-tree.c:119
+#: builtin/read-tree.c:139
 msgid "3-way merge if no file level merging required"
 msgstr ""
 "hòa trộn kiểu “3-way” nếu không có tập tin mức hòa trộn nào được yêu cầu "
 
-#: builtin/read-tree.c:121
+#: builtin/read-tree.c:141
 msgid "3-way merge in presence of adds and removes"
 msgstr "hòa trộn 3-way trong sự hiện diện của “adds” và “removes”"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:143
 msgid "same as -m, but discard unmerged entries"
 msgstr "giống với -m, nhưng bỏ qua các mục chưa được hòa trộn"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:144
 msgid "<subdirectory>/"
 msgstr "<thư-mục-con>/"
 
-#: builtin/read-tree.c:125
+#: builtin/read-tree.c:145
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "đọc cây vào trong bảng mục lục dưới <thư_mục_con>/"
 
-#: builtin/read-tree.c:128
+#: builtin/read-tree.c:148
 msgid "update working tree with merge result"
 msgstr "cập nhật cây làm việc với kết quả hòa trộn"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:150
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:131
+#: builtin/read-tree.c:151
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "cho phép các tập tin rõ ràng bị lờ đi được ghi đè"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:154
 msgid "don't check the working tree after merging"
 msgstr "không kiểm tra cây làm việc sau hòa trộn"
 
-#: builtin/read-tree.c:135
+#: builtin/read-tree.c:155
 msgid "don't update the index or the work tree"
 msgstr "không cập nhật bảng mục lục hay cây làm việc"
 
-#: builtin/read-tree.c:137
+#: builtin/read-tree.c:157
 msgid "skip applying sparse checkout filter"
 msgstr "bỏ qua áp dụng bộ lọc lấy ra (checkout) thưa thớt"
 
-#: builtin/read-tree.c:139
+#: builtin/read-tree.c:159
 msgid "debug unpack-trees"
 msgstr "gỡ lỗi “unpack-trees”"
 
-#: builtin/receive-pack.c:25
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase--helper [<các-tùy-chọn>]"
+
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "tiếp tục cải tổ"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "bãi bỏ việc cải tổ"
+
+#: builtin/receive-pack.c:27
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <thư-mục-git>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"Theo mặc định, việc cập nhật nhánh hiện tại trong một kho không-thuần\n"
+"bị từ chối, bởi vì nó sẽ làm cho chỉ mục và cây làm việc mâu thuẫn với\n"
+"cái mà bạn đẩy lên, và sẽ yêu cầu lệnh “git reset --hard” để mà làm\n"
+"cho cây làm việc khớp với HEAD.\n"
+"\n"
+"Bạn có thể đặt biến cấu hình “receive.denyCurrentBranch” thành\n"
+"“ignore” hay “warn” trong kho máy chủ để cho phép đẩy lên nhánh\n"
+"hiện tại của nó; tuy nhiên, không nên làm như thế trừ phi bạn\n"
+"sắp đặt để cập nhật cây làm việc của nó tương ứng với cái mà bạn đẩy\n"
+"lên theo cách nào đó.\n"
+"\n"
+"Để chấm dứt lời nhắn này và vẫn giữ cách ứng xử mặc định, hãy đặt\n"
+"biến cấu hình “receive.denyCurrentBranch” thành “refuse”."
+
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"Theo mặc định, việc cập xóa nhánh hiện tại bị từ chối, bởi vì\n"
+"lệnh “git clone” tiếp theo sẽ không có tác dụng trong việc lấy\n"
+"ra bất kỳ tập tin nào, dẫn đến hỗn loạn\n"
+"\n"
+"Bạn có thể đặt biến cấu hình “receive.denyDeleteCurrent” thành\n"
+"“warn” hay “ignore” trong kho máy chủ để cho phép đẩy xóa nhánh\n"
+"hiện tại của nó có hoặc không cảnh báo.\n"
+"\n"
+"Để chấm dứt lời nhắn này, bạn hãy đặt nó thành “refuse”."
+
+#: builtin/receive-pack.c:1888
 msgid "quiet"
 msgstr "im lặng"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1902
 msgid "You must specify a directory."
 msgstr "Bạn phải chỉ định thư mục."
 
@@ -10446,7 +11900,7 @@ msgstr "(khớp)"
 msgid "(delete)"
 msgstr "(xóa)"
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
 #, c-format
 msgid "No such remote: %s"
 msgstr "Không có máy chủ nào như thế: %s"
@@ -10477,7 +11931,7 @@ msgstr "gặp lỗi khi xóa “%s”"
 msgid "creating '%s' failed"
 msgstr "gặp lỗi khi tạo “%s”"
 
-#: builtin/remote.c:792
+#: builtin/remote.c:794
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -10489,373 +11943,386 @@ msgstr[0] ""
 "đi;\n"
 "để xóa đi, sử dụng:"
 
-#: builtin/remote.c:806
+#: builtin/remote.c:808
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Không thể gỡ bỏ phần cấu hình “%s”"
 
-#: builtin/remote.c:907
+#: builtin/remote.c:909
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " mới (lần lấy về tiếp theo sẽ lưu trong remotes/%s)"
 
-#: builtin/remote.c:910
+#: builtin/remote.c:912
 msgid " tracked"
 msgstr " được theo dõi"
 
-#: builtin/remote.c:912
+#: builtin/remote.c:914
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " cũ rích (dùng “git remote prune” để gỡ bỏ)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:916
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:955
+#: builtin/remote.c:957
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "branch.%s.merge không hợp lệ; không thể cải tổ về phía > 1 nhánh"
 
-#: builtin/remote.c:963
+#: builtin/remote.c:965
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "thực hiện rebase một cách tương tác trên máy chủ %s"
 
-#: builtin/remote.c:964
+#: builtin/remote.c:966
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "thực hiện rebase trên máy chủ %s"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:969
 #, c-format
 msgid " merges with remote %s"
 msgstr " hòa trộn với máy chủ %s"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:972
 #, c-format
 msgid "merges with remote %s"
 msgstr "hòa trộn với máy chủ %s"
 
-#: builtin/remote.c:973
+#: builtin/remote.c:975
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s    và với máy chủ %s\n"
 
-#: builtin/remote.c:1016
+#: builtin/remote.c:1018
 msgid "create"
 msgstr "tạo"
 
-#: builtin/remote.c:1019
+#: builtin/remote.c:1021
 msgid "delete"
 msgstr "xóa"
 
-#: builtin/remote.c:1023
+#: builtin/remote.c:1025
 msgid "up to date"
 msgstr "đã cập nhật"
 
-#: builtin/remote.c:1026
+#: builtin/remote.c:1028
 msgid "fast-forwardable"
 msgstr "có-thể-chuyển-tiếp-nhanh"
 
-#: builtin/remote.c:1029
+#: builtin/remote.c:1031
 msgid "local out of date"
 msgstr "dữ liệu nội bộ đã cũ"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1038
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s ép buộc thành %-*s (%s)"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s đẩy lên thành %-*s (%s)"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1045
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s ép buộc thành %s"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s đẩy lên thành %s"
 
-#: builtin/remote.c:1114
+#: builtin/remote.c:1116
 msgid "do not query remotes"
 msgstr "không truy vấn các máy chủ"
 
-#: builtin/remote.c:1141
+#: builtin/remote.c:1143
 #, c-format
 msgid "* remote %s"
 msgstr "* máy chủ %s"
 
-#: builtin/remote.c:1142
+#: builtin/remote.c:1144
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL để lấy về: %s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
 msgid "(no URL)"
 msgstr "(không có URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL để đẩy lên: %s"
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Nhánh HEAD: %s"
 
-#: builtin/remote.c:1158
+#: builtin/remote.c:1160
 msgid "(not queried)"
 msgstr "(không yêu cầu)"
 
-#: builtin/remote.c:1160
+#: builtin/remote.c:1162
 msgid "(unknown)"
 msgstr "(không hiểu)"
 
-#: builtin/remote.c:1164
+#: builtin/remote.c:1166
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  nhánh HEAD (HEAD máy chủ chưa rõ ràng, có lẽ là một trong số sau):\n"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1178
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Những nhánh trên máy chủ:%s"
 
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1181 builtin/remote.c:1207
 msgid " (status not queried)"
 msgstr " (trạng thái không được yêu cầu)"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1190
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Những nhánh nội bộ đã được cấu hình cho lệnh “git pull”:"
 
-#: builtin/remote.c:1196
+#: builtin/remote.c:1198
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  refs nội bộ sẽ được phản chiếu bởi lệnh “git push”"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1204
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Những tham chiếu nội bộ được cấu hình cho lệnh “git push”%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1225
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "đặt refs/remotes/<tên>/HEAD cho phù hợp với máy chủ"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1227
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "xóa refs/remotes/<tên>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1242
 msgid "Cannot determine remote HEAD"
 msgstr "Không thể xác định được HEAD máy chủ"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1244
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Nhiều nhánh HEAD máy chủ. Hãy chọn rõ ràng một:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1254
 #, c-format
 msgid "Could not delete %s"
 msgstr "Không thể xóa bỏ %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1262
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Không phải là tham chiếu hợp lệ: %s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1264
 #, c-format
 msgid "Could not setup %s"
 msgstr "Không thể cài đặt %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1282
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s sẽ trở thành không đầu (không được quản lý)!"
 
-#: builtin/remote.c:1282
+#: builtin/remote.c:1283
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s đã trở thành không đầu (không được quản lý)!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1293
 #, c-format
 msgid "Pruning %s"
 msgstr "Đang xén bớt %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1294
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1310
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [nên xén bớt] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1313
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [đã bị xén] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1358
 msgid "prune remotes after fetching"
 msgstr "cắt máy chủ sau khi lấy về"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Không có máy chủ nào có tên “%s”"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1437
 msgid "add branch"
 msgstr "thêm nhánh"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1444
 msgid "no remote specified"
 msgstr "chưa chỉ ra máy chủ nào"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1461
 msgid "query push URLs rather than fetch URLs"
 msgstr "truy vấn đẩy URL thay vì lấy"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1463
 msgid "return all URLs"
 msgstr "trả về mọi URL"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1491
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "không có URL nào được cấu hình cho nhánh “%s”"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1517
 msgid "manipulate push URLs"
 msgstr "đẩy các “URL” bằng tay"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1519
 msgid "add URL"
 msgstr "thêm URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1521
 msgid "delete URLs"
 msgstr "xóa URLs"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1528
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete không hợp lý"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1569
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Kiểu mẫu URL cũ không hợp lệ: %s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1577
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Không tìm thấy URL như vậy: %s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1579
 msgid "Will not delete all non-push URLs"
 msgstr "Sẽ không xóa những địa chỉ URL không-push"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1593
 msgid "be verbose; must be placed before a subcommand"
 msgstr "chi tiết; phải được đặt trước một lệnh-con"
 
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Không hiểu câu lệnh con: %s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<các-tùy-chọn>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"Gia tăng repack là không tương thích với chỉ mục bitmap. Dùng\n"
+"--no-write-bitmap-index hay tắt cấu hình pack.writebitmaps."
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "đóng gói mọi thứ trong một gói đơn"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "giống với -a, và chỉnh sửa các đối tượng không đọc được thiếu sót"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "xóa bỏ các gói dư thừa, và chạy git-prune-packed"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "chuyển --no-reuse-delta cho git-pack-objects"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "chuyển --no-reuse-object cho git-pack-objects"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "không chạy git-update-server-info"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "chuyển --local cho git-pack-objects"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "ghi mục lục ánh xạ"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "ngày ước tính"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr "với -A, các đối tượng cũ hơn khoảng thời gian này thì không bị mất"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "với -a, đóng gói lại các đối tượng không thể đọc được"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
 msgstr "kích thước cửa sổ được dùng cho nén “delta”"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "byte"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "giống như trên, nhưng giới hạn kích thước bộ nhớ hay vì số lượng"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
 msgstr "giới hạn độ sâu tối đa của “delta”"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "kích thước tối đa cho từng tập tin gói"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr "đóng gói lại các đối tượng trong các gói đã đánh dấu bằng .keep"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "không thể xóa các gói trong một kho đối_tượng_vĩ_đại"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable và -A xung khắc nhau"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "gặp lỗi khi gỡ bỏ “%s”"
@@ -10880,22 +12347,22 @@ msgstr "git replace -d <đối tượng>…"
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<định_dạng>] [-l [<mẫu>]]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
 #, c-format
 msgid "Not a valid object name: '%s'"
 msgstr "Không phải là tên đối tượng hợp lệ: “%s”"
 
-#: builtin/replace.c:355
+#: builtin/replace.c:360
 #, c-format
 msgid "bad mergetag in commit '%s'"
 msgstr "thẻ hòa trộn sai trong lần chuyển giao “%s”"
 
-#: builtin/replace.c:357
+#: builtin/replace.c:362
 #, c-format
 msgid "malformed mergetag in commit '%s'"
 msgstr "thẻ hòa trộn không đúng dạng ở lần chuyển giao “%s”"
 
-#: builtin/replace.c:368
+#: builtin/replace.c:373
 #, c-format
 msgid ""
 "original commit '%s' contains mergetag '%s' that is discarded; use --edit "
@@ -10904,45 +12371,45 @@ msgstr ""
 "lần chuyển giao gốc “%s” có chứa thẻ hòa trộn “%s” cái mà bị loại bỏ; dùng "
 "tùy chọn --edit thay cho --graft"
 
-#: builtin/replace.c:401
+#: builtin/replace.c:406
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
 msgstr "lần chuyển giao gốc “%s” có chữ ký GPG."
 
-#: builtin/replace.c:402
+#: builtin/replace.c:407
 msgid "the signature will be removed in the replacement commit!"
 msgstr "chữ ký sẽ được bỏ đi trong lần chuyển giao thay thế!"
 
-#: builtin/replace.c:408
+#: builtin/replace.c:413
 #, c-format
 msgid "could not write replacement commit for: '%s'"
 msgstr "không thể ghi lần chuyển giao thay thế cho: “%s”"
 
-#: builtin/replace.c:432
+#: builtin/replace.c:437
 msgid "list replace refs"
 msgstr "liệt kê các refs thay thế"
 
-#: builtin/replace.c:433
+#: builtin/replace.c:438
 msgid "delete replace refs"
 msgstr "xóa tham chiếu thay thế"
 
-#: builtin/replace.c:434
+#: builtin/replace.c:439
 msgid "edit existing object"
 msgstr "sửa đối tượng sẵn có"
 
-#: builtin/replace.c:435
+#: builtin/replace.c:440
 msgid "change a commit's parents"
 msgstr "thay đổi cha mẹ của lần chuyển giao"
 
-#: builtin/replace.c:436
+#: builtin/replace.c:441
 msgid "replace the ref if it exists"
 msgstr "thay thế tham chiếu nếu nó đã sẵn có"
 
-#: builtin/replace.c:437
+#: builtin/replace.c:442
 msgid "do not pretty-print contents for --edit"
 msgstr "đừng in đẹp các nội dung cho --edit"
 
-#: builtin/replace.c:438
+#: builtin/replace.c:443
 msgid "use this format"
 msgstr "dùng định dạng này"
 
@@ -10962,8 +12429,8 @@ msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <tree-ish> [--] <đường-dẫn>…"
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<tree-ish>] [--] <đường-dẫn>…"
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11083,27 +12550,27 @@ msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét
 msgid "Could not write new index file."
 msgstr "Không thể ghi tập tin lưu bảng mục lục mới."
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list không hỗ trợ hiển thị các ghi chú"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:393
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<các-tùy-chọn>] -- [<các tham số>…]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:398
 msgid "keep the `--` passed as an arg"
 msgstr "giữ lại “--” chuyển sang làm tham số"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:400
 msgid "stop parsing after the first non-option argument"
 msgstr "dừng phân tích sau đối số đầu tiên không có tùy chọn"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:403
 msgid "output in stuck long form"
 msgstr "kết xuất trong định dạng gậy dài"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:534
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11133,68 +12600,72 @@ msgstr "git cherry-pick [<các-tùy-chọn>] <commit-ish>…"
 msgid "git cherry-pick <subcommand>"
 msgstr "git cherry-pick <lệnh-con>"
 
-#: builtin/revert.c:71
+#: builtin/revert.c:89
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s: %s không thể được sử dụng với %s"
 
-#: builtin/revert.c:80
+#: builtin/revert.c:98
 msgid "end revert or cherry-pick sequence"
 msgstr "kết thúc cherry-pick hay hoàn nguyên liên tiếp nhau"
 
-#: builtin/revert.c:81
+#: builtin/revert.c:99
 msgid "resume revert or cherry-pick sequence"
 msgstr "phục hồi lại cherry-pick hay hoàn nguyên liên tiếp nhau"
 
-#: builtin/revert.c:82
+#: builtin/revert.c:100
 msgid "cancel revert or cherry-pick sequence"
 msgstr "không cherry-pick hay hoàn nguyên liên tiếp nhau"
 
-#: builtin/revert.c:83
+#: builtin/revert.c:101
 msgid "don't automatically commit"
 msgstr "không chuyển giao một cách tự động."
 
-#: builtin/revert.c:84
+#: builtin/revert.c:102
 msgid "edit the commit message"
 msgstr "sửa lại chú thích cho lần chuyển giao"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "số của cha mẹ"
+#: builtin/revert.c:105
+msgid "parent-number"
+msgstr "số-cha-mẹ"
 
-#: builtin/revert.c:89
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "chọn cha mẹ luồng chính"
+
+#: builtin/revert.c:108
 msgid "merge strategy"
 msgstr "chiến lược hòa trộn"
 
-#: builtin/revert.c:90
+#: builtin/revert.c:109
 msgid "option"
 msgstr "tùy chọn"
 
-#: builtin/revert.c:91
+#: builtin/revert.c:110
 msgid "option for merge strategy"
 msgstr "tùy chọn cho chiến lược hòa trộn"
 
-#: builtin/revert.c:100
+#: builtin/revert.c:119
 msgid "append commit name"
 msgstr "nối thêm tên lần chuyển giao"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:121
 msgid "preserve initially empty commits"
 msgstr "cấm khởi tạo lần chuyển giao trống rỗng"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:122
 msgid "allow commits with empty messages"
 msgstr "chấp nhận chuyển giao mà không ghi chú gì"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:123
 msgid "keep redundant, empty commits"
 msgstr "giữ lại các lần chuyển giao dư thừa, rỗng"
 
-#: builtin/revert.c:192
+#: builtin/revert.c:211
 msgid "revert failed"
 msgstr "hoàn nguyên gặp lỗi"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:224
 msgid "cherry-pick failed"
 msgstr "cherry-pick gặp lỗi"
 
@@ -11202,27 +12673,7 @@ msgstr "cherry-pick gặp lỗi"
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<các-tùy-chọn>] [--] <tập-tin>…"
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] ""
-"các mô-đun-con sau đây (hay một trong số mô-đun-con bên trong của nó)\n"
-"dùng một thư mục .git:"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(dùng /\"rm -rf/\" nếu bạn thực sự muốn gỡ bỏ nó cùng với tất cả lịch sử của "
-"chúng)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11233,7 +12684,7 @@ msgstr[0] ""
 "các tập tin sau đây có khác biệt nội dung đã đưa lên bệ phóng\n"
 "từ cả tập tin và cả HEAD:"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11241,12 +12692,12 @@ msgstr ""
 "\n"
 "(dùng -f để buộc gỡ bỏ)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
 msgstr[0] "các tập tin sau đây có thay đổi trạng thái trong bảng mục lục:"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11254,41 +12705,46 @@ msgstr ""
 "\n"
 "(dùng tùy chọn --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "những tập tin sau đây có những thay đổi nội bộ:"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "không liệt kê các tập tin đã gỡ bỏ"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "chỉ gỡ bỏ từ mục lục"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "ghi đè lên kiểm tra cập nhật"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "cho phép gỡ bỏ đệ qui"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "thoát ra với trạng thái khác không thậm chí nếu không có gì khớp"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "không thể gỡ bỏ “%s” một cách đệ qui mà không có tùy chọn -r"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm: không thể gỡ bỏ %s"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "không thể gỡ bỏ “%s”"
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11301,19 +12757,19 @@ msgstr ""
 "chiếu>…]\n"
 "  --all và đặc tả <ref> rõ ràng là loại trừ lẫn nhau."
 
-#: builtin/send-pack.c:160
+#: builtin/send-pack.c:161
 msgid "remote name"
 msgstr "tên máy dịch vụ"
 
-#: builtin/send-pack.c:171
+#: builtin/send-pack.c:175
 msgid "use stateless RPC protocol"
 msgstr "dùng giao thức RPC không ổn định"
 
-#: builtin/send-pack.c:172
+#: builtin/send-pack.c:176
 msgid "read refs from stdin"
 msgstr "đọc tham chiếu từ đầu vào tiêu chuẩn"
 
-#: builtin/send-pack.c:173
+#: builtin/send-pack.c:177
 msgid "print status from remote helper"
 msgstr "in các trạng thái từ phần hướng dẫn trên máy dịch vụ"
 
@@ -11321,23 +12777,27 @@ msgstr "in các trạng thái từ phần hướng dẫn trên máy dịch vụ"
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [<các-tùy-chọn>] [<vùng-xét-duyệt>] [[--] [<đường-dẫn>…]]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr "Nhóm theo người chuyển giao thay vì tác giả"
+
+#: builtin/shortlog.c:250
 msgid "sort output according to the number of commits per author"
 msgstr "sắp xếp kết xuất tuân theo số lượng chuyển giao trên mỗi tác giả"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:252
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr "Chặn mọi mô tả lần chuyển giao, chỉ đưa ra số lượng lần chuyển giao"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:254
 msgid "Show the email address of each author"
 msgstr "Hiển thị thư điện tử cho từng tác giả"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:255
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:256
 msgid "Linewrap output"
 msgstr "Ngắt dòng khi quá dài"
 
@@ -11357,70 +12817,123 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<nền>]] [--list] [<ref>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "đang bỏ qua %s; không thể xử lý nhiều hơn %d tham chiếu"
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr "không tham chiếu nào khớp với %s"
+
+#: builtin/show-branch.c:632
 msgid "show remote-tracking and local branches"
 msgstr "hiển thị các nhánh remote-tracking và nội bộ"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:634
 msgid "show remote-tracking branches"
 msgstr "hiển thị các nhánh remote-tracking"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:636
 msgid "color '*!+-' corresponding to the branch"
 msgstr "màu “*!+-” tương ứng với nhánh"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:638
 msgid "show <n> more commits after the common ancestor"
 msgstr "hiển thị thêm <n> lần chuyển giao sau cha mẹ chung"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:640
 msgid "synonym to more=-1"
 msgstr "đồng nghĩa với more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:641
 msgid "suppress naming strings"
 msgstr "chặn các chuỗi đặt tên"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:643
 msgid "include the current branch"
 msgstr "bao gồm nhánh hiện hành"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:645
 msgid "name commits with their object names"
 msgstr "đặt tên các lần chuyển giao bằng các tên của đối tượng của chúng"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:647
 msgid "show possible merge bases"
 msgstr "hiển thị mọi cơ sở có thể dùng để hòa trộn"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:649
 msgid "show refs unreachable from any other ref"
 msgstr "hiển thị các tham chiếu không thể được đọc bởi bất kỳ tham chiếu khác"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:651
 msgid "show commits in topological order"
 msgstr "hiển thị các lần chuyển giao theo thứ tự tôpô"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:654
 msgid "show only commits not on the first branch"
 msgstr "chỉ hiển thị các lần chuyển giao không nằm trên nhánh đầu tiên"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:656
 msgid "show merges reachable from only one tip"
 msgstr "hiển thị các lần hòa trộn có thể đọc được chỉ từ một đầu mút"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:658
 msgid "topologically sort, maintaining date order where possible"
 msgstr "sắp xếp hình thái học, bảo trì thứ tự ngày nếu có thể"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:661
 msgid "<n>[,<base>]"
 msgstr "<n>[,<cơ_sở>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:662
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "hiển thị <n> các mục “ref-log” gần nhất kể từ nền (base)"
 
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog là không tương thích với các tùy chọn --all, --remotes, --"
+"independent hay --merge-base"
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "chưa đưa ra nhánh, và HEAD không hợp lệ"
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "--reflog cần tên một nhánh"
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "chỉ có thể hiển thị cùng lúc %d hạng mục."
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr "không có tham chiếu nào như thế %s"
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "không thể xử lý nhiều hơn %d điểm xét duyệt."
+
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "“%s” không phải tham chiếu hợp lệ."
+
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "không thể tìm thấy lần chuyển giao %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11433,37 +12946,37 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<mẫu>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "chỉ hiển thị thẻ (có thể tổ hợp cùng với đầu)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "chỉ hiển thị đầu (có thể tổ hợp cùng với thẻ)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr ""
 "việc kiểm tra tham chiếu chính xác, đòi hỏi chính xác đường dẫn tham chiếu"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "hiển thị tham chiếu HEAD, ngay cả khi nó đã được lọc ra"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
 msgstr "bãi bỏ tham chiếu các thẻ thành ra các ID đối tượng"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "chỉ hiển thị mã băm SHA1 sử dụng <n> chữ số"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
 "không hiển thị kết quả ra đầu ra chuẩn (stdout) (chỉ hữu dụng với --verify)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
 "hiển thị các tham chiếu từ đầu vào tiêu chuẩn (stdin) cái mà không ở kho nội "
@@ -11485,12 +12998,12 @@ msgstr "giữ và xóa bỏ mọi dòng bắt đầu bằng ký tự ghi chú"
 msgid "prepend comment character and space to each line"
 msgstr "treo trước ký tự ghi chú và ký tự khoảng trắng cho từng dòng"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
 msgid "No such ref: %s"
 msgstr "Không có tham chiếu nào như thế: %s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "Cần tên tham chiếu dạng đầy đủ, nhưng lại nhận được %s"
@@ -11500,76 +13013,103 @@ msgstr "Cần tên tham chiếu dạng đầy đủ, nhưng lại nhận đượ
 msgid "cannot strip one component off url '%s'"
 msgstr "không thể cắt bỏ một thành phần ra khỏi “%s” url"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
 msgid "alternative anchor for relative paths"
 msgstr "điểm neo thay thế cho các đường dẫn tương đối"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:310
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=</đường/dẫn>] [</đường/dẫn>…]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "Không tìm thấy url cho đường dẫn mô-đun-con “%s” trong .gitmodules"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr ""
+"không thể tìm thấy cấu hình “%s”. Coi rằng kho này là thượng nguồn có quyền "
+"sở hữu chính nó."
+
+#: builtin/submodule--helper.c:406
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "Gặp lỗi khi đăng ký url cho đường dẫn mô-đun-con “%s”"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:410
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "Mô-đun-con “%s” (%s) được đăng ký cho đường dẫn “%s”\n"
 
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:420
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "cảnh báo: chế độ lệnh cập nhật được gợi ý cho mô-đun-con “%s”\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:427
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr "Gặp lỗi khi đăng ký chế độ cập nhật cho đường dẫn mô-đun-con “%s”"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:443
 msgid "Suppress output for initializing a submodule"
 msgstr "Chặn kết xuất cho khởi tạo một mô-đun-con"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:448
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [</đường/dẫn>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:476
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name </đường/dẫn>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:482
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr ""
 "Không tìm thấy ánh xạ (mapping) mô-đun-con trong .gitmodules cho đường dẫn "
 "“%s”"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "mô-đun-con “%s” không thể thêm thay thế: %s"
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "Giá trị “%s” cho submodule.alternateErrorStrategy không được thừa nhận"
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Giá trị “%s” cho submodule.alternateLocation không được thừa nhận"
+
+#: builtin/submodule--helper.c:633
 msgid "where the new submodule will be cloned to"
 msgstr "nhân bản mô-đun-con mới vào chỗ nào"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:636
 msgid "name of the new submodule"
 msgstr "tên của mô-đun-con mới"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:639
 msgid "url where to clone the submodule from"
 msgstr "url nơi mà nhân bản mô-đun-con từ đó"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:645
 msgid "depth for shallow clones"
 msgstr "chiều sâu lịch sử khi tạo bản sao"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "ép buộc tiến trình nhân bản"
+
+#: builtin/submodule--helper.c:653
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11577,99 +13117,84 @@ msgstr ""
 "git submodule--helper clone [--prefix=</đường/dẫn>] [--quiet] [--reference "
 "<kho>] [--name <tên>] [--depth <sâu>] [--url <url>] [</đường/dẫn>…]"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "không thể tạo thư mục “%s”"
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:684
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "Nhân bản “%s” vào đường dẫn mô-đun-con “%s” gặp lỗi"
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "không thể mở tập tin “%s”"
-
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
-msgstr "không thể đóng tập tin %s"
-
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:699
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "không thể lấy thư mục mô-đun-con cho “%s”"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:764
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "Đường dẫn mô-đun-con “%s” chưa được khởi tạo"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:768
 msgid "Maybe you want to use 'update --init'?"
 msgstr "Có lẽ bạn là bạn muốn dùng \"update --init\" phải không?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Bỏ qua các mô-đun-con chưa được hòa trộn %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:814
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Bỏ qua mô-đun-con “%s”"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:942
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "Gặp lỗi khi nhân bản “%s”. Thử lại lịch trình"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:953
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "Gặp lỗi khi nhân bản “%s” lần thứ hai nên bãi bỏ"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
 msgid "path into the working tree"
 msgstr "đường dẫn đến cây làm việc"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:977
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "đường dẫn đến cây làm việc, chéo biên giới mô-đun-con lồng nhau"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:981
 msgid "rebase, merge, checkout or none"
 msgstr "rebase, merge, checkout hoặc không làm gì cả"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:985
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr ""
 "Tạo một bản sao nông được cắt ngắn thành số lượng điểm xét duyệt đã cho"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:988
 msgid "parallel jobs"
 msgstr "công việc đồng thời"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:990
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "nhân bản lần đầu có nên theo khuyến nghị là nông hay không"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:991
 msgid "don't print cloning progress"
 msgstr "đừng in tiến trình nhân bản"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:998
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr ""
 "git submodule--helper update_clone [--prefix=</đường/dẫn>] [</đường/dẫn>…]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:1008
 msgid "bad value for update parameter"
 msgstr "giá trị cho  tham số cập nhật bị sai"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1079
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
@@ -11678,11 +13203,24 @@ msgstr ""
 "Nhánh mô-đun-con (%s) được cấu hình kế thừa nhánh từ siêu dự án, nhưng siêu "
 "dự án lại không trên bất kỳ nhánh nào"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "đệ quy vào trong mô-đun-con"
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir [</đường/dẫn>…]"
+
+#: builtin/submodule--helper.c:1226
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "lệnh con submodule--helper phải được gọi với một lệnh con"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s không hỗ trợ --super-prefix"
+
+#: builtin/submodule--helper.c:1239
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "“%s” không phải là lệnh con submodule--helper hợp lệ"
@@ -11729,33 +13267,29 @@ msgstr "git tag -d <tên-thẻ>…"
 
 #: builtin/tag.c:25
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-n[<số>]] [--contains <lần_chuyển_giao>] [--points-at <đối-"
-"tượng>]\n"
-"\t\t[--format=<định dạng>] [--[no-]merged [<lần_chuyển_giao>]] [<mẫu>…]"
+"git tag -l [-n[<số>]] [--contains <lần_chuyển_giao>] [--no-contains "
+"<lần_chuyển_giao>] [--points-at <đối-tượng>]\n"
+"\t\t[--format=<định_dạng>] [--[no-]merged [<lần_chuyển_giao>]] [<mẫu>…]"
 
 #: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <tên-thẻ>…"
-
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "tên thẻ quá dài: %.*s…"
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<định_dạng>]  <tên-thẻ>…"
 
-#: builtin/tag.c:86
+#: builtin/tag.c:83
 #, c-format
 msgid "tag '%s' not found."
 msgstr "không tìm thấy tìm thấy thẻ “%s”."
 
-#: builtin/tag.c:101
+#: builtin/tag.c:99
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Thẻ đã bị xóa “%s” (từng là %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:128
 #, c-format
 msgid ""
 "\n"
@@ -11768,7 +13302,7 @@ msgstr ""
 "  %s\n"
 "Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua.\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:132
 #, c-format
 msgid ""
 "\n"
@@ -11783,143 +13317,148 @@ msgstr ""
 "Những dòng được bắt đầu bằng “%c” sẽ được giữ lại; bạn có thể xóa chúng đi "
 "nếu muốn.\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:210
 msgid "unable to sign the tag"
 msgstr "không thể ký thẻ"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:212
 msgid "unable to write tag file"
 msgstr "không thể ghi vào tập tin lưu thẻ"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:236
 msgid "bad object type."
 msgstr "kiểu đối tượng sai."
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "phần đầu thẻ quá lớn."
-
-#: builtin/tag.c:275
+#: builtin/tag.c:282
 msgid "no tag message?"
 msgstr "không có chú thích gì cho cho thẻ à?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:289
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Nội dung ghi chú còn lại %s\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:397
 msgid "list tag names"
 msgstr "chỉ liệt kê tên các thẻ"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:399
 msgid "print <n> lines of each tag message"
 msgstr "hiển thị <n> dòng cho mỗi ghi chú"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:401
 msgid "delete tags"
 msgstr "xóa thẻ"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:402
 msgid "verify tags"
 msgstr "thẩm tra thẻ"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:404
 msgid "Tag creation options"
 msgstr "Tùy chọn tạo thẻ"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:406
 msgid "annotated tag, needs a message"
 msgstr "để chú giải cho thẻ, cần một lời ghi chú"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:408
 msgid "tag message"
 msgstr "phần chú thích cho thẻ"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:410
 msgid "annotated and GPG-signed tag"
 msgstr "thẻ chú giải và ký kiểu GPG"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:414
 msgid "use another key to sign the tag"
 msgstr "dùng kháo khác để ký thẻ"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:415
 msgid "replace the tag if exists"
 msgstr "thay thế nếu thẻ đó đã có trước"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:416 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "tạo một reflog"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:418
 msgid "Tag listing options"
 msgstr "Các tùy chọn liệt kê thẻ"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:419
 msgid "show tag list in columns"
 msgstr "hiển thị danh sách thẻ trong các cột"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:420 builtin/tag.c:422
 msgid "print only tags that contain the commit"
 msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "chỉ hiển thị những thẻ mà nó không chứa lần chuyển giao"
+
+#: builtin/tag.c:424
 msgid "print only tags that are merged"
 msgstr "chỉ hiển thị những thẻ mà nó được hòa trộn"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:425
 msgid "print only tags that are not merged"
 msgstr "chỉ hiển thị những thẻ mà nó không được hòa trộn"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:430
 msgid "print only tags of the object"
 msgstr "chỉ hiển thị các thẻ của đối tượng"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:469
 msgid "--column and -n are incompatible"
 msgstr "--column và -n xung khắc nhau"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "tùy chọn -n chỉ cho phép dùng với -l."
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "tùy chọn -n chỉ cho phép dùng trong chế độ liệt kê"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "tùy chọn --contains chỉ cho phép dùng với -l."
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "tùy chọn --contains chỉ cho phép dùng trong chế độ liệt kê"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "tùy chọn --points-at chỉ cho phép dùng với -l."
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "tùy chọn --no-contains chỉ cho phép dùng trong chế độ liệt kê"
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "tùy chọn --merged và --no-merged chỉ cho phép dùng với -l."
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "tùy chọn --points-at chỉ cho phép dùng trong chế độ liệt kê"
+
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr ""
+"tùy chọn --merged và --no-merged chỉ cho phép dùng trong chế độ liệt kê"
 
-#: builtin/tag.c:433
+#: builtin/tag.c:510
 msgid "only one -F or -m option is allowed."
 msgstr "chỉ có một tùy chọn -F hoặc -m là được phép."
 
-#: builtin/tag.c:452
+#: builtin/tag.c:529
 msgid "too many params"
 msgstr "quá nhiều đối số"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:535
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "“%s” không phải thẻ hợp lệ."
 
-#: builtin/tag.c:463
+#: builtin/tag.c:540
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Thẻ “%s” đã tồn tại rồi"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:570
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Đã cập nhật thẻ “%s” (trước là %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "Đang giải nén các đối tượng"
 
@@ -11943,175 +13482,207 @@ msgstr "gặp lỗi khi tạo tập tin %s"
 msgid "failed to delete file %s"
 msgstr "gặp lỗi khi xóa tập tin %s"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/update-index.c:110 builtin/update-index.c:216
 #, c-format
 msgid "failed to delete directory %s"
 msgstr "gặp lỗi khi xóa thư mục %s"
 
-#: builtin/update-index.c:133
+#: builtin/update-index.c:135
 #, c-format
 msgid "Testing mtime in '%s' "
 msgstr "Đang kiểm thử mtime trong “%s”"
 
-#: builtin/update-index.c:145
+#: builtin/update-index.c:149
 msgid "directory stat info does not change after adding a new file"
 msgstr "thông tin thống kê thư mục không thay đổi sau khi thêm tập tin mới"
 
-#: builtin/update-index.c:158
+#: builtin/update-index.c:162
 msgid "directory stat info does not change after adding a new directory"
 msgstr "thông tin thống kê thư mục không thay đổi sau khi thêm thư mục mới"
 
-#: builtin/update-index.c:171
+#: builtin/update-index.c:175
 msgid "directory stat info changes after updating a file"
 msgstr "thông tin thống kê thư mục thay đổi sau khi cập nhật tập tin"
 
-#: builtin/update-index.c:182
+#: builtin/update-index.c:186
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 "thông tin thống kê thư mục thay đổi sau khi thêm tập tin mới vào trong thư "
 "mục con"
 
-#: builtin/update-index.c:193
+#: builtin/update-index.c:197
 msgid "directory stat info does not change after deleting a file"
 msgstr "thông tin thống kê thư mục không thay đổi sau khi xóa tập tin"
 
-#: builtin/update-index.c:206
+#: builtin/update-index.c:210
 msgid "directory stat info does not change after deleting a directory"
 msgstr "thông tin thống kê thư mục không thay đổi sau khi xóa thư mục"
 
-#: builtin/update-index.c:213
+#: builtin/update-index.c:217
 msgid " OK"
 msgstr " Đồng ý"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:568
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<các-tùy-chọn>] [--] [<tập-tin>…]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:923
 msgid "continue refresh even when index needs update"
 msgstr "tiếp tục làm mới ngay cả khi bảng mục lục cần được cập nhật"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:926
 msgid "refresh: ignore submodules"
 msgstr "refresh: lờ đi mô-đun-con"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:929
 msgid "do not ignore new files"
 msgstr "không bỏ qua các tập tin mới tạo"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:931
 msgid "let files replace directories and vice-versa"
 msgstr "để các tập tin thay thế các thư mục và “vice-versa”"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:933
 msgid "notice files missing from worktree"
 msgstr "thông báo các tập-tin thiếu trong thư-mục làm việc"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:935
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 "làm tươi mới thậm chí khi bảng mục lục chứa các mục tin chưa được hòa trộn"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:938
 msgid "refresh stat information"
 msgstr "lấy lại thông tin thống kê"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:942
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "giống --refresh, nhưng bỏ qua các cài đặt “assume-unchanged”"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:946
 msgid "<mode>,<object>,<path>"
 msgstr "<chế_độ>,<đối_tượng>,<đường_dẫn>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:947
 msgid "add the specified entry to the index"
 msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:956
 msgid "mark files as \"not changing\""
 msgstr "Đánh dấu các tập tin là \"không thay đổi\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:959
 msgid "clear assumed-unchanged bit"
 msgstr "xóa bít assumed-unchanged (giả định là không thay đổi)"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:962
 msgid "mark files as \"index-only\""
 msgstr "đánh dấu các tập tin là “chỉ-đọc”"
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:965
 msgid "clear skip-worktree bit"
 msgstr "xóa bít skip-worktree"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:968
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "chỉ thêm vào bảng mục lục; không thêm nội dung vào cơ sở dữ liệu đối tượng"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:970
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "gỡ bỏ các đường dẫn được đặt tên thậm chí cả khi nó hiện diện trong thư mục "
 "làm việc"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:972
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "với tùy chọn --stdin: các dòng đầu vào được chấm dứt bởi ký tự null"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:974
 msgid "read list of paths to be updated from standard input"
 msgstr "đọc danh sách đường dẫn cần cập nhật từ đầu vào tiêu chuẩn"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:978
 msgid "add entries from standard input to the index"
 msgstr "không thể đọc các mục từ đầu vào tiêu chuẩn vào bảng mục lục"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:982
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "phục hồi các trạng thái #2 và #3 cho các đường dẫn được liệt kê"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:986
 msgid "only update entries that differ from HEAD"
 msgstr "chỉ cập nhật các mục tin mà nó khác biệt so với HEAD"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:990
 msgid "ignore files missing from worktree"
 msgstr "bỏ qua các tập-tin thiếu trong thư-mục làm việc"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:993
 msgid "report actions to standard output"
 msgstr "báo cáo các thao tác ra thiết bị xuất chuẩn"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:995
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(cho “porcelains”) quên các xung đột chưa được giải quyết đã ghi"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:999
 msgid "write index in this format"
 msgstr "ghi mục lục ở định dạng này"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:1001
 msgid "enable or disable split index"
 msgstr "bật/tắt chia cắt bảng mục lục"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:1003
 msgid "enable/disable untracked cache"
 msgstr "bật/tắt bộ đệm không theo vết"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1005
 msgid "test if the filesystem supports untracked cache"
 msgstr "kiểm tra xem hệ thống tập tin có hỗ trợ đệm không theo dõi hay không"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1007
 msgid "enable untracked cache without testing the filesystem"
 msgstr "bật bộ đệm không theo vết mà không kiểm tra hệ thống tập tin"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+"core.splitIndex được đặt là sai; xóa bỏ hay thay đổi nó, nếu bạn thực sự "
+"muốn bật chia tách mục lục"
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"core.splitIndex được đặt là đúng; xóa bỏ hay thay đổi nó, nếu bạn thực sự "
+"muốn tắt chia tách mục lục"
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache được đặt là đúng; xóa bỏ hay thay đổi nó, nếu bạn thực "
+"sự muốn tắt bộ đệm chưa theo dõi"
+
+#: builtin/update-index.c:1131
 msgid "Untracked cache disabled"
 msgstr "Nhớ đệm không theo vết bị tắt"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache được đặt là sai; xóa bỏ hay thay đổi nó, nếu bạn thực sự "
+"muốn bật bộ đệm chưa theo dõi"
+
+#: builtin/update-index.c:1143
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Nhớ đệm không theo vết được bật cho “%s”"
@@ -12160,7 +13731,7 @@ msgstr "git verify-commit [-v | --verbose] <lần_chuyển_giao>…"
 msgid "print commit contents"
 msgstr "hiển thị nội dung của lần chuyển giao"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "in kết xuất trạng thái gpg dạng thô"
 
@@ -12176,11 +13747,11 @@ msgstr "chi tiết"
 msgid "show statistics only"
 msgstr "chỉ hiển thị thống kê"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <thẻ>…"
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<định_dạng>] <thẻ>…"
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "hiển thị nội dung của thẻ"
 
@@ -12204,90 +13775,102 @@ msgstr "git worktree prune [<các-tùy-chọn>]"
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock </đường/dẫn>"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:43
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Gỡ bỏ cây làm việc/%s: không phải là thư mục hợp lệ"
 
-#: builtin/worktree.c:48
+#: builtin/worktree.c:49
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Gỡ bỏ cây làm việc/%s: không có tập tin gitdir"
 
-#: builtin/worktree.c:53
+#: builtin/worktree.c:54
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Gỡ bỏ cây làm việc/%s: không thể đọc tập tin gitdir (%s)"
 
-#: builtin/worktree.c:64
+#: builtin/worktree.c:65
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Gỡ bỏ cây làm việc/%s: tập tin gitdir không hợp lệ"
 
-#: builtin/worktree.c:80
+#: builtin/worktree.c:81
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Gỡ bỏ cây làm việc/%s: tập tin gitdir chỉ đến vị trí không tồn tại"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "báo cáo các cây làm việc đã prune"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "các cây làm việc hết hạn cũ hơn khoảng <thời gian>"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "“%s” đã có từ trước rồi"
 
-#: builtin/worktree.c:236
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "không thể tạo thư mục của “%s”"
 
-#: builtin/worktree.c:272
+#: builtin/worktree.c:274
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Đang chuẩn bị %s (định danh %s)"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:328
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "lấy ra <nhánh> ngay cả khi nó đã được lấy ra ở cây làm việc khác"
 
-#: builtin/worktree.c:325
+#: builtin/worktree.c:330
 msgid "create a new branch"
 msgstr "tạo nhánh mới"
 
-#: builtin/worktree.c:327
+#: builtin/worktree.c:332
 msgid "create or reset a branch"
 msgstr "tạo hay đặt lại một nhánh"
 
-#: builtin/worktree.c:329
+#: builtin/worktree.c:334
 msgid "populate the new working tree"
 msgstr "di chuyển cây làm việc mới"
 
-#: builtin/worktree.c:337
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr "giữ cây làm việc mới bị khóa"
+
+#: builtin/worktree.c:343
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "Các tùy chọn -b, -B, và --detach loại từ lẫn nhau"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:478
 msgid "reason for locking"
 msgstr "lý do khóa"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:490 builtin/worktree.c:523
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "%s không phải là cây làm việc"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:492 builtin/worktree.c:525
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "Cây thư mục làm việc chính không thể khóa hay bỏ khóa được"
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:497
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "“%s” đã được khóa rồi, lý do: %s"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:499
 #, c-format
 msgid "'%s' is already locked"
 msgstr "“%s” đã được khóa rồi"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:527
 #, c-format
 msgid "'%s' is not locked"
 msgstr "“%s” chưa bị khóa"
@@ -12308,26 +13891,39 @@ msgstr "ghi đối tượng cây (tree) cho <tiền tố> thư mục con"
 msgid "only useful for debugging"
 msgstr "chỉ hữu ích khi cần gỡ lỗi"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<các-tùy-chọn>] </đường/dẫn>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1040
 msgid "quit after a single request/response exchange"
 msgstr "thoát sau khi một trao đổi yêu cầu hay trả lời đơn"
 
-#: upload-pack.c:839
+#: upload-pack.c:1042
 msgid "exit immediately after initial ref advertisement"
 msgstr "thoát ngay sau khi khởi tạo quảng cáo tham chiếu"
 
-#: upload-pack.c:841
+#: upload-pack.c:1044
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr "đừng thử <thư_mục>/.git/ nếu <thư_mục> không phải là thư mục Git"
 
-#: upload-pack.c:843
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "ngắt truyền thông sau <n> giây không hoạt động"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"Quyền hạn trên thư mục gói mạng của bạn không chính xác; người dùng\n"
+"khác có lẽ có thể đọc được chứng thư được lưu đệm của bạn. Cân nhắc chạy:\n"
+"\n"
+"\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "in thông tin gỡ lỗi ra đầu ra lỗi tiêu chuẩn"
@@ -12342,10 +13938,35 @@ msgstr ""
 "hướng dẫn về khái niệm. Xem “git help <lệnh>” hay “git help <khái-niệm>”\n"
 "để xem các đặc tả cho lệnh hay khái niệm cụ thể."
 
-#: http.c:323
+#: http.c:336
+#, c-format
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr "giá trị âm cho http.postbuffer; mặc định là %d"
+
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Điều khiển giao quyền không được hỗ trợ với cURL < 7.22.0"
+
+#: http.c:366
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "Chốt khóa công không được hỗ trợ với cURL < 7.44.0"
 
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"không thể cập nhật dựa trên cơ sở url từ chuyển hướng:\n"
+"      hỏi cho: %s\n"
+" chuyển hướng: %s"
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "chuyển hướng đến %s"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "bắt đầu một vùng làm việc (xem thêm: git help tutorial)"
@@ -12460,15 +14081,15 @@ msgstr "ngày hết hạn"
 msgid "no-op (backward compatibility)"
 msgstr "no-op (tương thích ngược)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "chi tiết hơn nữa"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "im lặng hơn nữa"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
 
@@ -12689,8 +14310,8 @@ msgid "Automated merge did not work."
 msgstr "Hòa trộn một cách tự động không làm việc."
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
-msgstr "Không thể thực hiện một Octopus."
+msgid "Should not be doing an octopus."
+msgstr "Không thể thực hiện một octopus."
 
 #: git-merge-octopus.sh:73
 #, sh-format
@@ -12716,7 +14337,7 @@ msgstr "Đang thử hòa trộn đơn giản với $pretty_name"
 msgid "Simple merge did not work, trying automatic merge."
 msgstr "Hòa trộn đơn giản không làm việc, thử hòa trộn tự động."
 
-#: git-rebase.sh:56
+#: git-rebase.sh:58
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12729,56 +14350,41 @@ msgstr ""
 "Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"git "
 "rebase --abort\"."
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:158 git-rebase.sh:397
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Không thể quay trở lại $head_name"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "Đã áp dụng autostash."
-
-#: git-rebase.sh:170
+#: git-rebase.sh:172
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Không thể lưu $stash_sha1"
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"Áp dụng autostash có hiệu quả trong các xung đột.\n"
-"Các thay đổi của bạn an toàn trong stash (tạm cất đi).\n"
-"Bạn có thể chạy lệnh \"git stash pop\" hay \"git stash drop\" bất kỳ lúc "
-"nào.\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:212
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Móc (hook) pre-rebase từ chối rebase."
 
-#: git-rebase.sh:215
+#: git-rebase.sh:217
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 "Hình như đang trong quá trình thực hiện lệnh git-am. Không thể chạy lệnh "
 "rebase."
 
-#: git-rebase.sh:356
+#: git-rebase.sh:358
 msgid "No rebase in progress?"
 msgstr "Không có tiến trình rebase nào phải không?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:369
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Hành động “--edit-todo” chỉ có thể dùng trong quá trình “rebase” (sửa lịch "
 "sử) tương tác."
 
-#: git-rebase.sh:374
+#: git-rebase.sh:376
 msgid "Cannot read HEAD"
 msgstr "Không thể đọc HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:379
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -12786,7 +14392,7 @@ msgstr ""
 "Bạn phải sửa tất cả các lần hòa trộn xung đột và sau\n"
 "đó đánh dấu chúng là cần xử lý sử dụng lệnh git add"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:419
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12807,98 +14413,102 @@ msgstr ""
 "và chạy TÔI lần nữa. TÔI  dừng lại trong trường hợp bạn vẫn\n"
 "có một số thứ quý giá ở đây."
 
-#: git-rebase.sh:465
+#: git-rebase.sh:470
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "thượng nguồn không hợp lệ $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:494
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: ở đây có nhiều hơn một nền móng hòa trộn"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:497 git-rebase.sh:501
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ở đây không có nền móng hòa trộn nào"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:506
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Không chỉ đến một lần chuyển giao không hợp lệ: $onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:529
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "nghiêm trọng: không có nhánh như thế: $branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:562
 msgid "Cannot autostash"
 msgstr "Không thể autostash"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:567
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Đã tạo autostash: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:571
 msgid "Please commit or stash them."
 msgstr "Xin hãy chuyển giao hoặc tạm cất (stash) chúng."
 
-#: git-rebase.sh:586
+#: git-rebase.sh:591
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi."
 
-#: git-rebase.sh:590
+#: git-rebase.sh:595
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi, lệnh rebase ép buộc."
 
-#: git-rebase.sh:601
+#: git-rebase.sh:606
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Thay đổi từ $mb thành $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:615
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó…"
 
-#: git-rebase.sh:620
+#: git-rebase.sh:625
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Chuyển-tiếp-nhanh $branch_name thành $onto_name."
 
-#: git-stash.sh:50
+#: git-stash.sh:53
 msgid "git stash clear with parameters is unimplemented"
 msgstr ""
 "git stash clear với các tham số là chưa được thực hiện (không nhận đối số)"
 
-#: git-stash.sh:73
+#: git-stash.sh:94
 msgid "You do not have the initial commit yet"
 msgstr "Bạn chưa còn có lần chuyển giao khởi tạo"
 
-#: git-stash.sh:88
+#: git-stash.sh:109
 msgid "Cannot save the current index state"
 msgstr "Không thể ghi lại trạng thái bảng mục lục hiện hành"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "Không thể ghi lại các tập tin chưa theo dõi"
+
+#: git-stash.sh:144 git-stash.sh:157
 msgid "Cannot save the current worktree state"
 msgstr "Không thể ghi lại trạng thái cây-làm-việc hiện hành"
 
-#: git-stash.sh:140
+#: git-stash.sh:161
 msgid "No changes selected"
 msgstr "Chưa có thay đổi nào được chọn"
 
-#: git-stash.sh:143
+#: git-stash.sh:164
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Không thể gỡ bỏ bảng mục lục tạm thời (không thể xảy ra)"
 
-#: git-stash.sh:156
+#: git-stash.sh:177
 msgid "Cannot record working tree state"
 msgstr "Không thể ghi lại trạng thái cây làm việc hiện hành"
 
-#: git-stash.sh:188
+#: git-stash.sh:209
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Không thể cập nhật $ref_stash với $w_commit"
@@ -12913,7 +14523,7 @@ msgstr "Không thể cập nhật $ref_stash với $w_commit"
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
+#: git-stash.sh:265
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -12923,109 +14533,117 @@ msgstr ""
 "     Để có thể dùng lời chú thích có chứa -- ở đầu,\n"
 "     dùng git stash save -- \"$option\""
 
-#: git-stash.sh:259
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "Không thể dùng --patch và --include-untracked hay --all cùng một lúc."
+
+#: git-stash.sh:286
 msgid "No local changes to save"
 msgstr "Không có thay đổi nội bộ nào được ghi lại"
 
-#: git-stash.sh:263
+#: git-stash.sh:291
 msgid "Cannot initialize stash"
 msgstr "Không thể khởi tạo stash"
 
-#: git-stash.sh:267
+#: git-stash.sh:295
 msgid "Cannot save the current status"
 msgstr "Không thể ghi lại trạng thái hiện hành"
 
-#: git-stash.sh:268
+#: git-stash.sh:296
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
 msgstr "Đã ghi lại thư mục làm việc và trạng thái mục lục $stash_msg"
 
-#: git-stash.sh:285
+#: git-stash.sh:323
 msgid "Cannot remove worktree changes"
 msgstr "Không thể gỡ bỏ các thay đổi cây-làm-việc"
 
-#: git-stash.sh:404
+#: git-stash.sh:471
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "không hiểu tùy chọn: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:484
 msgid "No stash found."
 msgstr "Không tìm thấy lần chuyển giao cất đi (stash) nào."
 
-#: git-stash.sh:421
+#: git-stash.sh:491
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Chỉ ra quá nhiều điểm xét duyệt: $REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:506
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference không phải là tham chiếu hợp lệ"
 
-#: git-stash.sh:455
+#: git-stash.sh:534
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "“$args” không phải là lần chuyển giao kiểu-stash (cất đi)"
 
-#: git-stash.sh:466
+#: git-stash.sh:545
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "”$args” không phải tham chiếu đến stash"
 
-#: git-stash.sh:474
+#: git-stash.sh:553
 msgid "unable to refresh index"
 msgstr "không thể làm tươi mới bảng mục lục"
 
-#: git-stash.sh:478
+#: git-stash.sh:557
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Không thể áp dụng một stash ở giữa của quá trình hòa trộn"
 
-#: git-stash.sh:486
+#: git-stash.sh:565
 msgid "Conflicts in index. Try without --index."
 msgstr "Xung đột trong bảng mục lục. Hãy thử mà không dùng tùy chọn --index."
 
-#: git-stash.sh:488
+#: git-stash.sh:567
 msgid "Could not save index tree"
 msgstr "Không thể ghi lại cây chỉ mục"
 
-#: git-stash.sh:522
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "Không thể phục hồi các tập tin chưa theo dõi từ stash"
+
+#: git-stash.sh:601
 msgid "Cannot unstage modified files"
 msgstr "Không thể bỏ ra khỏi bệ phóng các tập tin đã được sửa chữa"
 
-#: git-stash.sh:537
+#: git-stash.sh:616
 msgid "Index was not unstashed."
 msgstr "Bảng mục lục đã không được bỏ stash."
 
-#: git-stash.sh:551
+#: git-stash.sh:630
 msgid "The stash is kept in case you need it again."
 msgstr "stash được giữ trong trường hợp bạn lại cần nó."
 
-#: git-stash.sh:560
+#: git-stash.sh:639
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Đã xóa ${REV} ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:640
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Không thể xóa bỏ mục stash"
 
-#: git-stash.sh:569
+#: git-stash.sh:648
 msgid "No branch name specified"
 msgstr "Chưa chỉ ra tên của nhánh"
 
-#: git-stash.sh:641
+#: git-stash.sh:727
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Đường dẫn tương đối chỉ có thể dùng từ thư mục ở mức cao nhất của cây làm "
 "việc"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
@@ -13036,7 +14654,14 @@ msgstr ""
 msgid "'$sm_path' already exists in the index"
 msgstr "”$sm_path” thực sự đã tồn tại ở bảng mục lục rồi"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr ""
+"”$sm_path” thực sự đã tồn tại ở bảng mục lục rồi và không phải là một mô-đun-"
+"con"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -13048,23 +14673,23 @@ msgstr ""
 "$sm_path\n"
 "Sử dụng -f nếu bạn thực sự muốn thêm nó vào."
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Đang thêm repo có sẵn tại “$sm_path” vào bảng mục lục"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "”$sm_path” đã tồn tại từ trước và không phải là một kho git hợp lệ"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Thư mục git cho “$sm_name” được tìm thấy một cách cục bộ với các máy chủ:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -13080,48 +14705,48 @@ msgstr ""
 "hoặc là bạn không chắc chắn điều đó nghĩa là gì thì chọn tên khác với tùy "
 "chọn “--name”."
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 "Phục hồi sự hoạt động của thư mục git nội bộ cho mô-đun-con “$sm_name”."
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Không thể lấy ra mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Gặp lỗi khi thêm mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Gặp lỗi khi đăng ký với hệ thống mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:341
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "Đang vào “$displaypath”"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:361
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "Dừng lại tại “$displaypath”; script trả về trạng thái khác không."
 
-#: git-submodule.sh:414
+#: git-submodule.sh:432
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "đặc tả đường dẫn và --all xung khắc nhau"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:437
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "Dùng “--all” nếu bạn thực sự muốn hủy khởi tạo mọi mô-đun-con"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
@@ -13131,7 +14756,7 @@ msgstr ""
 "(dùng “rm -rf” nếu bạn thực sự muốn gỡ bỏ nó cùng với tất cả lịch sử của "
 "chúng)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -13140,39 +14765,39 @@ msgstr ""
 "Cây làm việc mô-đun-con “$displaypath” chứa các thay đổi nội bộ; hãy dùng “-"
 "f” để loại bỏ chúng đi"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:468
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Đã tạo thư mục “$displaypath”"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:469
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Không thể gỡ bỏ cây làm việc mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:472
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Không thể tạo thư mục mô-đun-con rỗng “$displaypath”"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:481
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Mô-đun-con “$name” ($url) được bỏ đăng ký cho đường dẫn “$displaypath”"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 "Không tìm thấy điểm xét duyệt hiện hành trong đường dẫn mô-đun-con "
 "“$displaypath”"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:647
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Không thể lấy về trong đường dẫn mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
@@ -13181,12 +14806,12 @@ msgstr ""
 "Không thể tìm thấy điểm xét duyệt hiện hành ${remote_name}/${branch} trong "
 "đường dẫn mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:670
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Không thể lấy về trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:676
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
@@ -13195,90 +14820,86 @@ msgstr ""
 "Đã lấy về từ đường dẫn mô-đun con “$displaypath”, nhưng nó không chứa $sha1. "
 "Lấy về theo định hướng của lần chuyển giao đó gặp lỗi."
 
-#: git-submodule.sh:658
+#: git-submodule.sh:683
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Không thể lấy ra “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:684
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: đã checkout “$sha1”"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:688
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Không thể cải tổ “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:689
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: được rebase vào trong “$sha1”"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:694
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Không thể hòa trộn (merge) “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:695
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: được hòa trộn vào “$sha1”"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:700
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "Thực hiện không thành công lệnh “$command $sha1” trong đường dẫn mô-đun-con "
 "“$displaypath”"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:701
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: “$command $sha1”"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:732
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Gặp lỗi khi đệ quy vào trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Tùy chọn --cached không thể dùng cùng với tùy chọn --files"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:892
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "chế độ không như mong chờ $mod_dst"
 
-#: git-submodule.sh:887
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Cảnh báo: $display_name không chứa lần chuyển giao $sha1_src"
 
-#: git-submodule.sh:890
+#: git-submodule.sh:915
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Cảnh báo: $display_name không chứa lần chuyển giao $sha1_dst"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:918
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Cảnh báo: $display_name không chứa những lần chuyển giao $sha1_src và "
 "$sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "blob"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1064
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Gặp lỗi khi đệ quy vào trong đường dẫn mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1136
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
@@ -13288,12 +14909,12 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 msgid "See git-${cmd}(1) for details."
 msgstr "Xem git-${cmd}(1) để biết thêm chi tiết."
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "Đang rebase ($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13321,7 +14942,7 @@ msgstr ""
 "Những dòng này có thể đảo ngược thứ tự; chúng chạy từ trên đỉnh xuống dưới "
 "đáy.\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
@@ -13330,7 +14951,7 @@ msgstr ""
 "Đừng xóa bất kỳ dòng nào. Dùng “drop” một cách rõ ràng để xóa bỏ một lần "
 "chuyển giao.\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
@@ -13338,7 +14959,7 @@ msgstr ""
 "\n"
 "Nếu bạn xóa bỏ một dòng ở đây thì LẦN CHUYỂN GIAO ĐÓ SẼ MẤT.\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13357,86 +14978,82 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1: không phải là lần chuyển giao mà có thể lấy ra được"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "Tên lần chuyển giao không hợp lệ: $sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "Không thể ghi lại sha1 thay thế của lần chuyển giao"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "Chuyển-tiếp-nhanh đến $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "Không thể chuyển-tiếp-nhanh đến $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "Không thể di chuyển HEAD đến $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "Từ chối squash lần hòa trộn: $sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "Gặp lỗi khi hoàn lại bước hòa trộn $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "Không thể lấy ra $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "Đây là chú thích cho lần chuyển giao thứ #${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "Chú thích cho lần chuyển giao thứ #${n} sẽ bị bỏ qua:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "Đây là tổ hợp của $count lần chuyển giao."
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "Không thể $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "Đây là tổ hợp của 2 lần chuyển giao."
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
-msgstr "Đây là chú thích cho lần chuyển giao thứ nhất:"
-
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "Không thể áp dụng $sha1… $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13452,31 +15069,31 @@ msgstr ""
 "này\n"
 "trước khi bạn có thể làm việc lại với lần chuyển giao."
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "Bị dừng tại $sha1_abbrev… $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "Không “$squash_style” thể mà không có lần chuyển giao kế trước"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "Thực thi: $rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "Thực thi gặp lỗi: $rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "và tạo các thay đổi bảng mục lục và/hay cây làm việc"
 
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13487,7 +15104,7 @@ msgstr ""
 "\tgit rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13502,25 +15119,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "Lệnh chưa biết: $command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "Vui lòng sửa lỗi này bằng cách dùng “git rebase --edit-todo”."
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "Cài tổ và cập nhật $head_name một cách thành công."
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
 msgstr "Không thể bỏ qua các lệnh cậy (pick) không cần thiết"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13530,7 +15147,7 @@ msgstr ""
 "sau đây:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13539,11 +15156,11 @@ msgstr ""
 "Cảnh báo: lệnh không nhận ra trong dòng sau đây:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "không thể tách rời HEAD"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
@@ -13551,7 +15168,7 @@ msgstr ""
 "Cảnh báo: một số lần chuyển giao có lẽ đã bị xóa một cách tình cờ.\n"
 "Các lần chuyển giao bị xóa (từ mới đến cũ):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13566,7 +15183,7 @@ msgstr ""
 "báo.\n"
 "Cánh ứng xử có thể là: ignore, warn, error."
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
@@ -13575,19 +15192,23 @@ msgstr ""
 "Không thừa nhận cài đặt $check_level for option rebase.missingCommitsCheck. "
 "Nên bỏ qua."
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "Bạn có thể sửa nó bằng “git rebase --edit-todo”."
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"Bạn có thể sửa nó bằng “git rebase --edit-todo” và sau đó chạy “git rebase --"
+"continue”."
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "Hoặc là bạn có thể bãi bỏ lần cải tổ với lệnh “git rebase --abort”."
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1083
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "Không thể xóa bỏ CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1088
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13600,12 +15221,12 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
-"Bạn có các thay đổi so với trong bệ phóng trong thư mục làm việc của bạn.\n"
-"Nếu các thay đổi này là muốn\n"
+"Bạn có các thay đổi so với trong bệ phóng trong\n"
+"thư mục làm việc của bạn. Nếu các thay đổi này là muốn\n"
 "squash vào lần chuyển giao kế trước, chạy:\n"
 "\n"
 "  git commit --amend $gpg_sign_opt_quoted\n"
@@ -13618,11 +15239,11 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1105
 msgid "Error trying to find the author identity to amend commit"
 msgstr "Lỗi khi cố tìm định danh của tác giả để tu bổ lần chuyển giao"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1110
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
@@ -13631,11 +15252,11 @@ msgstr ""
 "Vui lòng chuyển giao chúng và sau đó chạy lệnh “git rebase --continue” lần "
 "nữa."
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
 msgid "Could not commit staged changes."
 msgstr "Không thể chuyển giao các thay đổi đã đưa lên bệ phóng."
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1147
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13649,43 +15270,39 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
 msgid "Could not execute editor"
 msgstr "Không thể thực thi trình biên soạn"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "Bạn cần đặt thông tin về người chuyển giao mã nguồn trước đã"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1168
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "Không thể checkout $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1173
 msgid "No HEAD?"
 msgstr "Không HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1174
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "Không thể tạo thư mục tạm thời $state_dir"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1176
 msgid "Could not mark as interactive"
 msgstr "Không thể đánh dấu là tương tác"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
 msgid "Could not init rewritten commits"
 msgstr "Không thể khởi tạo các lần chuyển giao ghi lại"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1291
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "Cải tổ $shortrevisions vào $shortonto (các lệnh $todocount)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1296
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
@@ -13694,7 +15311,7 @@ msgstr ""
 "\n"
 "Tuy nhiên, nếu bạn xóa bỏ mọi thứ, việc cải tổ sẽ bị bãi bỏ.\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1303
 msgid "Note that empty commits are commented out"
 msgstr "Chú ý rằng lần chuyển giao trống rỗng là ghi chú"
 
@@ -13725,6 +15342,11 @@ msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
 "Không thể ghi lại các nhánh: Bạn có các thay đổi chưa được đưa lên bệ phóng."
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr ""
+"Không thể pull với cải tổ: Bạn có các thay đổi chưa được đưa lên bệ phóng."
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13735,6 +15357,10 @@ msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr ""
 "Không thể cải tổ: Mục lục của bạn có chứa các thay đổi chưa được chuyển giao."
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr "Không thể pull với cải tổ: Bạn có các thay đổi chưa được chuyển giao."
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
@@ -13742,6 +15368,11 @@ msgstr ""
 "Không thể $action: Mục lục của bạn có chứa các thay đổi chưa được chuyển "
 "giao."
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr ""
+"Thêm vào đó, bảng mục lục của bạn có chứa các thay đổi chưa được chuyển giao."
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr "Bạn cần chạy lệnh này từ thư mục ở mức cao nhất của cây làm việc."
@@ -13750,6 +15381,1013 @@ msgstr "Bạn cần chạy lệnh này từ thư mục ở mức cao nhất củ
 msgid "Unable to determine absolute path of git directory"
 msgstr "Không thể dò tìm đường dẫn tuyệt đối của thư mục git"
 
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%12s %12s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "đã đưa lên bệ phóng"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "chưa đưa lên bệ phóng"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "nhị phân"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "không có gì"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "không thay đổi"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "đã thêm %d đường dẫn\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "đã cập nhật %d đường dẫn\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "đã hoàn nguyên %d đường dẫn\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "%d đường dẫn đã touch (chạm)\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "Cập nhật"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "Hoàn nguyên"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "chú ý: %s giờ đã bỏ theo dõi.\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "Thêm các cái chưa được theo dõi"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "Không có tập tin nào chưa được theo dõi.\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr ""
+"Nếu miếng vá được áp dụng sạch sẽ, hunk đã sửa sẽ ngay lập tức\n"
+"được đánh dấu để chuyển lên bệ phóng."
+
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr ""
+"Nếu miếng vá được áp dụng sạch sẽ, hunk đã sửa sẽ ngay lập tức\n"
+"được đánh dấu để tạm cất."
+
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr ""
+"Nếu miếng vá được áp dụng sạch sẽ, hunk đã sửa sẽ ngay lập tức\n"
+"được đánh dấu để bỏ chuyển lên bệ phóng."
+
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr ""
+"Nếu miếng vá được áp dụng sạch sẽ, hunk đã sửa sẽ ngay lập tức\n"
+"được đánh dấu để áp dụng."
+
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr ""
+"Nếu miếng vá được áp dụng sạch sẽ, hunk đã sửa sẽ ngay lập tức\n"
+"được đánh dấu để loại bỏ."
+
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr "gặp lỗi khi tập tin sửa hunk để ghi: %s"
+
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr "Chế độ sửa hunk bằng tay -- xem ở đáy để có hướng dẫn sử dụng nhanh.\n"
+
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"Để gỡ bỏ các dòng “%s”, làm chúng thành những dòng “ “ (nội dung).\n"
+"Để xóa bỏ dòng “%s”, xóa chúng đi.\n"
+"Những dòng bắt đầu bằng %s sẽ bị loại bỏ.\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"Nếu miếng vá không được áp dụng sạch sẽ, bạn sẽ có một cơ hội\n"
+"để sửa lần nữa. Nếu mọi dòng của hunk bị xóa bỏ, thế thì những\n"
+"sửa dổi sẽ bị loại bỏ, và hunk vẫn giữ nguyên.\n"
+
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr "gặp lỗi khi mở tập tin hunk để đọc: %s"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr ""
+"Hunk đã sửa của bạn không được áp dụng. Sửa lại lần nữa (nói \"n\" để loại "
+"bỏ!) [y/n]? "
+
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - đưa lên bệ phóng hunk này\n"
+"n - đừng đưa lên bệ phóng hunk này\n"
+"q - thoát; đừng đưa lên bệ phóng hunk này cũng như bất kỳ cái nào còn lại\n"
+"a - đưa lên bệ phóng hunk này và tất cả các hunk sau này trong tập tin\n"
+"d - đừng đưa lên bệ phóng hunk này cũng như bất kỳ cái nào còn lại trong tập "
+"tin"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - tạm cất hunk này\n"
+"n - đừng tạm cất hunk này\n"
+"q - thoát; đừng tạm cất hunk này cũng như bất kỳ cái nào còn lại\n"
+"a - tạm cất hunk này và tất cả các hunk sau này trong tập tin\n"
+"d - đừng tạm cất hunk này cũng như bất kỳ cái nào còn lại trong tập tin"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - đưa ra khỏi bệ phóng hunk này\n"
+"n - đừng đưa ra khỏi bệ phóng hunk này\n"
+"q - thoát; đừng đưa ra khỏi bệ phóng hunk này cũng như bất kỳ cái nào còn "
+"lại\n"
+"a - đưa ra khỏi bệ phóng hunk này và tất cả các hunk sau này trong tập tin\n"
+"d - đừng đưa ra khỏi bệ phóng hunk này cũng như bất kỳ cái nào còn lại trong "
+"tập tin"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - áp dụng hunk này vào mục lục\n"
+"n - đừng áp dụng hunk này vào mục lục\n"
+"q - thoát; đừng áp dụng hunk này cũng như bất kỳ cái nào còn lại\n"
+"a - áp dụng hunk này và tất cả các hunk sau này trong tập tin\n"
+"d - đừng áp dụng hunk này cũng như bất kỳ cái nào sau này trong tập tin"
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - loại bỏ hunk này khỏi cây làm việc\n"
+"n - đừng loại bỏ hunk khỏi cây làm việc\n"
+"q - thoát; đừng loại bỏ hunk này cũng như bất kỳ cái nào còn lại\n"
+"a - loại bỏ hunk này và tất cả các hunk sau này trong tập tin\n"
+"d - đừng loại bỏ hunk này cũng như bất kỳ cái nào sau này trong tập tin"
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - loại bỏ hunk này khỏi mục lục và cây làm việc\n"
+"n - đừng loại bỏ hunk khỏi mục lục và cây làm việc\n"
+"q - thoát; đừng loại bỏ hunk này cũng như bất kỳ cái nào còn lại\n"
+"a - loại bỏ hunk này và tất cả các hunk sau này trong tập tin\n"
+"d - đừng loại bỏ hunk này cũng như bất kỳ cái nào sau này trong tập tin"
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - áp dụng hunk này vào mục lục và cây làm việc\n"
+"n - đừng áp dụng hunk vào mục lục và cây làm việc\n"
+"q - thoát; đừng áp dụng hunk này cũng như bất kỳ cái nào còn lại\n"
+"a - áp dụng hunk này và tất cả các hunk sau này trong tập tin\n"
+"d - đừng áp dụng hunk này cũng như bất kỳ cái nào sau này trong tập tin"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g - chọn một hunk muốn tới\n"
+"/ - tìm một hunk khớp với biểu thức chính quy đưa ra\n"
+"j - để lại hunk này là chưa quyết định, xem hunk chưa quyết định kế\n"
+"J - để lại hunk này là chưa quyết định, xem hunk kế\n"
+"k - để lại hunk này là chưa quyết định, xem hunk chưa quyết định kế trước\n"
+"K - để lại hunk này là chưa quyết định, xem hunk kế trước\n"
+"s - chia hunk hiện tại thành các hunk nhỏ hơn\n"
+"e - sửa bằng tay hunk hiện hành\n"
+"? - in trợ giúp\n"
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "Các hunk đã chọn không được áp dụng vào bảng mục lục!\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "Vẫn áp dụng chúng cho cây làm việc? "
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "Đã không áp dụng gì cả.\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "bỏ qua những thứ chưa hòa trộn: %s\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "Chỉ có các tập tin nhị phân là thay đổi.\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "Không có thay đổi nào.\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "Cập nhật miếng vá"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Thay đổi chế độ bệ phóng [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Xóa khỏi bệ phóng [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Đưa lên bệ phóng hunk này [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Thay đổi chế độ tạm cất đi [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Xóa tạm cất [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Tạm cất hunk này [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "Thay đổi chế độ bỏ ra khỏi bệ phóng [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "Xóa bỏ việc bỏ ra khỏi bệ phóng [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "Bỏ ra khỏi bệ phóng hunk này [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "Áp dụng thay đổi chế độ cho mục lục [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "Áp dụng việc xóa vào mục lục [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "Áo dụng hunk này vào mục lục [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Loại bỏ các thay đổi chế độ từ cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Loại bỏ việc xóa khỏi cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Loại bỏ hunk này khỏi cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Loại bỏ thay đổi chế độ từ mục lục và cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Loại bỏ việc xóa khỏi mục lục và cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Loại bỏ hunk này khỏi mục lục và cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr ""
+"Áp dụng thay đổi chế độ cho mục lục và cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Áp dụng việc xóa vào mục lục và cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "Áp dụng hunk này vào mục lục và cây làm việc [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "nhảy đến hunk nào (<ret> để xem thêm)? "
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "nhảy đến hunk nào?"
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "Số không hợp lệ: “%s”\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "Rất tiếc, chỉ có sẵn %d hunk..\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "tìm kiếm cho regex? "
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "Định dạng tìm kiếm của biểu thức chính quy không đúng %s: %s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "Không thấy hunk nào khớp mẫu đã cho\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "Không có hunk kế trước\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "Không có hunk kế tiếp\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "Chi nhỏ thành %d hunks.\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "Xem xét lại diff"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        - hiển thị các đường dẫn với các thay đổi\n"
+"update        - đặt trạng thái cây làm việc thành tập hợp các thay đổi đã "
+"đặt lên bệ phóng\n"
+"revert        - hoàn nguyên tập hợp các thay đổi đã đặt lên bệ phóng trở lại "
+"phiên bản HEAD\n"
+"patch         - cậy các hunk và cập nhật có lựa chọn\n"
+"diff\t      - xem khác biệt giữa HEAD và mục lục\n"
+"add untracked - thêm nội dung các các tập tin chưa theo dõi và tập hợp các "
+"thay đổi đã đặt lên bệ phóng\n"
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "thiếu --"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "không hiểu chế độ --patch: %s"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "đối số không hợp lệ %s, cần --"
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr "múi giờ nội bộ khác biệt với GMT bởi khoảng thời gian không-phút\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "khoảng bù thời gian nội bộ lớn hơn hoặc bằng 24 giờ\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "trình soạn thảo thoát không sạch sẽ, bãi bỏ mọi thứ"
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr "“%s” có chưa một phiên bản trung gian của thư bạn đã soạn.\n"
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "“%s.final” chứa thư điện tử đã soạn thảo.\n"
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-aliases xung khắc với các tùy chọn khác\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "Không thể chạy git format-patch ở ngoài một kho chứa\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "Không hiểu trường --suppress-cc: “%s”\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "Không hiểu cài đặt --confirm: “%s”\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr "cảnh báo: bí danh sendmail với dấu trích dẫn không được hỗ trợ: %s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "cảnh báo: “:include:“ không được hỗ trợ: %s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr "cảnh báo: chuyển hướng “/file“ hay “|pipe“ không được hỗ trợ: %s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "cảnh báo: dòng sendmail không nhận ra được: %s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+"Tập tin “%s” đã có sẵn nhưng nó có lẽ cũng là chuẩn bị của\n"
+"các miếng vá tạo lần chuyển giao. Vui lòng làm rõ ý bằng…\n"
+"\n"
+"    * Nói \"./%s\" nếu ý bạn là một tập tin; hoặc\n"
+"    * Đưa ra tùy chọn --format-patch nếu ý bạn là chuẩn bị.\n"
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "Gặp lỗi khi mở thư mục “%s”: %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"nghiêm trọng: %s: %s\n"
+"cảnh báo: không có miếng vá nào được gửi đi\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"Chưa chỉ định các tập tin miếng vá!\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "Không có dòng chủ đề trong %s?"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "Gặp lỗi khi mở “%s” để ghi: %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+"Các dòng bắt đầu bằng \"GIT:\" sẽ bị xóa bỏ.\n"
+"Cân nhắc bao gồm một thống kê diff toàn thể hay bảng nội dung\n"
+"cho miếng vá mà bạn đang viết.\n"
+"\n"
+"Xóa nội dung phần thân nếu bạn không muốn gửi tóm tắt.\n"
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "Gặp lỗi khi mở %s.final: %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "Gặp lỗi khi mở “%s”: %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr "Các trường To/Cc/Bcc không được phiên dịch, chúng bị bỏ qua\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "Thư tổng thể là trống rỗng, nên bỏ qua nó\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "Bạn có chắc muốn dùng <%s> [y/N]? "
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr ""
+"Các trường sau đây là 8bit, nhưng không khai báo một Content-Transfer-"
+"Encoding.\n"
+
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "Bảng mã 8bit nào tôi nên khai báo [UTF-8]? "
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+"Từ chối gửi bởi vì miếng vá\n"
+"\t%s\n"
+"có chủ đề ở dạng mẫu “*** SUBJECT HERE ***”. Dùng --force nếu bạn thực sự "
+"muốn gửi.\n"
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "Tới người mà thư được gửi (nếu có)?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "nghiêm trọng: bí danh “%s” được khai triển thành chính nó\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr "Message-ID được dùng như là In-Reply-To cho thư đầu tiên (nếu có)? "
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "lỗi: không thể rút trích một địa chỉ hợp lệ từ: %s\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr "Làm gì với địa chỉ này? (thoát[q]|xóa[d]|sửa[e]): "
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "đường dẫn CA “%s” không tồn tại"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+"    Danh sách Cc ở trên được diễn giải bằng các địa chỉ phụ\n"
+"    thêm tìm thấy trong lời ghi chú lần chuyển giao của miếng vá.\n"
+"    Theo mặc định send-email sẽ nhắc trước khi gửi bất cứ khi\n"
+"    nào điều này xảy ra. Cách hành xử này được điều khiển bởi cài\n"
+"    đặt cấu hình sendemail.confirm.\n"
+"\n"
+"    Để biết thêm chi tiết, hãy chạy lệnh “git send-email --help”.\n"
+"    Để giữ lại cách hành xử hiện nay, làm hết lời nhắn này,\n"
+"    chạy “git config --global sendemail.confirm auto”.\n"
+"\n"
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "Gửi thư này chứ? ([y]có|[n]không|[q]thoát|[a]tất): "
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "Gửi thư này trả lời yêu cầu"
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "Máy phục vụ SMTP chưa được định nghĩa một cách thích hợp."
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "Máy chủ không hỗ trợ STARTTLS! %s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr ""
+"Không thể khởi tạo SMTP một cách đúng đắn. Kiểm tra cấu hình và dùng --smtp-"
+"debug."
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "Gặp lỗi khi gửi %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "Thử gửi %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "Gửi %s\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "Dry-OK. Nhật ký nói rằng:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "OK. Nhật ký nói rằng:\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "Kết quả: "
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "Kết quả: Tốt\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "không thể mở tập tin “%s”"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) Thêm cc: %s từ dòng “%s”\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) Đang thêm to: %s từ dòng “%s”\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(non-mbox) Thêm cc: %s từ dòng “%s”\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(body) Thêm cc: %s từ dòng “%s”\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) Không thể thực thi “%s”"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) Đang thêm %s: %s từ: “%s”\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) gặp lỗi khi đóng đường ống đến “%s”"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "không thể lấy gửi thư dạng 7 bít"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "bảng mã truyền không hợp lệ"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "không thể mở %s: %s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s: miếng vá có chứa dòng dài hơn 998 ký tự"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "Bỏ qua %s với hậu tố sao lưu dự phòng “%s”.\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "Bạn có thực sự muốn gửi %s? [y|N]: "
+
+#~ msgid "tag: tagging "
+#~ msgstr "thẻ: đang đánh thẻ"
+
+#~ msgid "object of unknown type"
+#~ msgstr "đối tượng của kiểu chưa biết"
+
+#~ msgid "commit object"
+#~ msgstr "đối tượng lần chuyển giao"
+
+#~ msgid "tree object"
+#~ msgstr "đối tượng cây"
+
+#~ msgid "blob object"
+#~ msgstr "đối tượng blob"
+
+#~ msgid "other tag object"
+#~ msgstr "đối tượng thẻ khác"
+
+#~ msgid ""
+#~ "There is nothing to exclude from by :(exclude) patterns.\n"
+#~ "Perhaps you forgot to add either ':/' or '.' ?"
+#~ msgstr ""
+#~ "Ở đây không có gì bị loại trừ bởi: các mẫu (loại trừ).\n"
+#~ "Có lẽ bạn đã quên thêm hoặc là “:/” hoặc là “.”?"
+
+#~ msgid "unrecognized format: %%(%s)"
+#~ msgstr "không nhận ra định dạng: %%(%s)"
+
+#~ msgid ":strip= requires a positive integer argument"
+#~ msgstr ":strip= cần một đối số nguyên dương"
+
+#~ msgid "ref '%s' does not have %ld components to :strip"
+#~ msgstr "tham chiếu “%s” không có %ld thành phần để mà :strip"
+
+#~ msgid "unknown %.*s format %s"
+#~ msgstr "Không hiểu định dạng %.*s %s"
+
+#~ msgid "[%s: gone]"
+#~ msgstr "[%s: đã ra đi]"
+
+#~ msgid "[%s]"
+#~ msgstr "[%s]"
+
+#~ msgid "[%s: behind %d]"
+#~ msgstr "[%s: đứng sau %d]"
+
+#~ msgid "[%s: ahead %d]"
+#~ msgstr "[%s: phía trước %d]"
+
+#~ msgid "[%s: ahead %d, behind %d]"
+#~ msgstr "[%s: trước %d, sau %d]"
+
+#~ msgid " **** invalid ref ****"
+#~ msgstr " **** tham chiếu không hợp lệ ****"
+
+#~ msgid "insanely long object directory %.*s"
+#~ msgstr "thư mục đối tượng dài một cách điên rồ %.*s"
+
+#~ msgid "git merge [<options>] <msg> HEAD <commit>"
+#~ msgstr "git merge [<các-tùy-chọn>] <tin-nhắn> HEAD <commit>"
+
+#~ msgid "'%s' is not a commit"
+#~ msgstr "%s không phải là một lần commit (chuyển giao)"
+
+#~ msgid "cannot open file '%s'"
+#~ msgstr "không thể mở tập tin “%s”"
+
+#~ msgid "could not close file %s"
+#~ msgstr "không thể đóng tập tin %s"
+
+#~ msgid "tag name too long: %.*s..."
+#~ msgstr "tên thẻ quá dài: %.*s…"
+
+#~ msgid "tag header too big."
+#~ msgstr "phần đầu thẻ quá lớn."
+
+#~ msgid ""
+#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "marked for discarding"
+#~ msgstr ""
+#~ "Nếu miếng vá được áp dụng sạch sẽ, hunk đã sửa sẽ ngay lập tức\n"
+#~ "được đánh dấu để loại bỏ"
+
+#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
+#~ msgstr ""
+#~ "Dùng một phỏng đoán dựa trên dòng trắng thử nghiệm để tăng cường các diff"
+
+#~ msgid "Clever... amending the last one with dirty index."
+#~ msgstr "Giỏi…  “tu bổ” cái cuối với bảng mục lục bẩn."
+
+#~ msgid ""
+#~ "the following submodule (or one of its nested submodules)\n"
+#~ "uses a .git directory:"
+#~ msgid_plural ""
+#~ "the following submodules (or one of their nested submodules)\n"
+#~ "use a .git directory:"
+#~ msgstr[0] ""
+#~ "các mô-đun-con sau đây (hay một trong số mô-đun-con bên trong của nó)\n"
+#~ "dùng một thư mục .git:"
+
+#~ msgid ""
+#~ "\n"
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "\n"
+#~ "(dùng /\"rm -rf/\" nếu bạn thực sự muốn gỡ bỏ nó cùng với tất cả lịch sử "
+#~ "của chúng)"
+
+#~ msgid "Could not write to %s"
+#~ msgstr "Không thể ghi vào %s"
+
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Lỗi bao bọc %s."
+
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh cherry-pick."
+
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Không thể hoàn nguyên trong khi có hoàn nguyên khác."
+
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr ""
+#~ "Không thể thực hiện việc cherry-pick trong khi khi đang cherry-pick khác."
+
+#~ msgid "Could not parse line %d."
+#~ msgstr "Không phân tích được dòng %d."
+
+#~ msgid "Could not open %s"
+#~ msgstr "Không thể mở %s"
+
+#~ msgid "Could not read %s."
+#~ msgstr "Không thể đọc %s."
+
+#~ msgid "Could not format %s."
+#~ msgstr "Không thể định dạng “%s”."
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "cannot open %s: %s"
+#~ msgstr "không thể mở %s: %s"
+
+#~ msgid "You need to set your committer info first"
+#~ msgstr "Bạn cần đặt thông tin về người chuyển giao mã nguồn trước đã"
+
 #~ msgid "bad numeric config value '%s' for '%s': invalid unit"
 #~ msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s”: đơn vị sai"
 
@@ -13899,9 +16537,6 @@ msgstr "Không thể dò tìm đường dẫn tuyệt đối của thư mục gi
 #~ msgid "bug: unhandled diff status %c"
 #~ msgstr "lỗi: không thể tiếp nhận trạng thái lệnh diff %c"
 
-#~ msgid "read of %s failed"
-#~ msgstr "đọc %s gặp lỗi"
-
 #~ msgid "could not write branch description template"
 #~ msgstr "không thể ghi mẫu mô tả nhánh"
 
@@ -13930,9 +16565,6 @@ msgstr "Không thể dò tìm đường dẫn tuyệt đối của thư mục gi
 #~ msgstr ""
 #~ "Thẩm tra xem lần chuyển giao có tên đó có chữ ký GPG hợp lệ hay không"
 
-#~ msgid "Could not write to '%s'"
-#~ msgstr "Không thể ghi vào “%s”"
-
 #~ msgid "Writing SQUASH_MSG"
 #~ msgstr "Đang ghi SQUASH_MSG"
 
@@ -13986,12 +16618,6 @@ msgstr "Không thể dò tìm đường dẫn tuyệt đối của thư mục gi
 #~ msgid "unable to access '%s': %s"
 #~ msgstr "không thể truy cập “%s”: %s"
 
-#~ msgid "could not open '%s' for reading: %s"
-#~ msgstr "không thể mở “%s” để đọc: %s"
-
-#~ msgid "could not open '%s' for writing: %s"
-#~ msgstr "Không thể mở “%s” để ghi: %s"
-
 #~ msgid "    git branch -d %s\n"
 #~ msgstr "    git branch -d %s\n"
 
@@ -14275,9 +16901,6 @@ msgstr "Không thể dò tìm đường dẫn tuyệt đối của thư mục gi
 #~ msgid "Failed to chdir: %s"
 #~ msgstr "Gặp lỗi với lệnh chdir: %s"
 
-#~ msgid "cannot tell cwd"
-#~ msgstr "không nói chuyện được với lệnh cwd"
-
 #~ msgid "%s: cannot lock the ref"
 #~ msgstr "%s: không thể khóa ref (tham chiếu)"
 
@@ -14497,18 +17120,12 @@ msgstr "Không thể dò tìm đường dẫn tuyệt đối của thư mục gi
 #~ msgid "oops"
 #~ msgstr "ôi?"
 
-#~ msgid "Would not remove %s\n"
-#~ msgstr "Không thể gỡ bỏ %s\n"
-
 #~ msgid "Not removing %s\n"
 #~ msgstr "Không xóa %s\n"
 
 #~ msgid "git remote set-head <name> (-a | -d | <branch>])"
 #~ msgstr "git remote set-head <tên> (-a | -d | <nhánh>])"
 
-#~ msgid " 0 files changed"
-#~ msgstr " 0 có tập tin nào thay đổi cả"
-
 #~ msgid " %d file changed"
 #~ msgid_plural " %d files changed"
 #~ msgstr[0] " %d tập tin thay đổi"
@@ -14569,6 +17186,3 @@ msgstr "Không thể dò tìm đường dẫn tuyệt đối của thư mục gi
 #~ msgid "Could not extract email from committer identity."
 #~ msgstr ""
 #~ "Không thể rút trích địa chỉ thư điện tử từ định danh người chuyển giao"
-
-#~ msgid "could not parse commit %s\n"
-#~ msgstr "không thể phân tích commit (lần chuyển giao) %s\n"
index dc312227e051e2ad919437f474f0b3de69f419e2..22d99619482845f27d9f1d57be0c4d101200acf1 100644 (file)
@@ -135,8 +135,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-08-27 23:21+0800\n"
-"PO-Revision-Date: 2016-09-05 23:36+0800\n"
+"POT-Creation-Date: 2017-05-05 09:35+0800\n"
+"PO-Revision-Date: 2017-05-09 21:54+0800\n"
 "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n"
 "Language-Team: GitHub <https://github.com/jiangxin/git/>\n"
 "Language: zh_CN\n"
@@ -187,7 +187,7 @@ msgstr ""
 msgid "Exiting because of an unresolved conflict."
 msgstr "因为存在未解决的冲突而退出。"
 
-#: advice.c:114 builtin/merge.c:1181
+#: advice.c:114 builtin/merge.c:1185
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "您尚未结束您的合并(存在 MERGE_HEAD)。"
 
@@ -216,7 +216,8 @@ msgid ""
 msgstr ""
 "注意:正在检出 '%s'。\n"
 "\n"
-"您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以通过另外\n"
+"您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以通过另"
+"外\n"
 "的检出分支操作丢弃在这个状态下所做的任何提交。\n"
 "\n"
 "如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在检出命令添加\n"
@@ -225,620 +226,1312 @@ msgstr ""
 "  git checkout -b <new-branch-name>\n"
 "\n"
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<选项>] <树或提交> [<路径>...]"
-
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
-
-#: archive.c:14
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-"git archive --remote <仓库> [--exec <命令>] [<选项>] <树或提交> [<路径>...]"
-
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <仓库> [--exec <命令>] --list"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "未能识别的空白字符选项 '%s'"
 
-#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327
+#: apply.c:73
 #, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "路径规格 '%s' 未匹配任何文件"
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "未能识别的空白字符忽略选项 '%s'"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "格式"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject 和 --3say 不能同时使用。"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "归档格式"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached 和 --3way 不能同时使用。"
 
-#: archive.c:430 builtin/log.c:1422
-msgid "prefix"
-msgstr "前缀"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way 在一个仓库之外"
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "为归档中每个路径名加上前缀"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index 在一个仓库之外"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553
-#: builtin/blame.c:2554 builtin/config.c:59 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:722 builtin/hash-object.c:100
-#: builtin/ls-files.c:460 builtin/ls-files.c:463 builtin/notes.c:399
-#: builtin/notes.c:562 builtin/read-tree.c:109 parse-options.h:153
-msgid "file"
-msgstr "文件"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached 在一个仓库之外"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "归档写入此文件"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "无法准备时间戳正则表达式 %s"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "读取工作区中的 .gitattributes"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec 返回 %d,输入为:%s"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "在标准错误上报告归档文件"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "不能在补丁的第 %d 行找到文件名"
 
-#: archive.c:437
-msgid "store only"
-msgstr "只存储"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr "git apply:错误的 git-diff - 应为 /dev/null,但在第 %2$d 行得到 %1$s"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "压缩速度更快"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr "git apply:错误的 git-diff - 第 %d 行上新文件名不一致"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "压缩效果更好"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件名不一致"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "列出支持的归档格式"
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply:错误的 git-diff - 第 %d 行处应为 /dev/null"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
-#: builtin/submodule--helper.c:832
-msgid "repo"
-msgstr "仓库"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount:意外的行:%.*s"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "从远程仓库(<仓库>)提取归档文件"
+#: apply.c:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "第 %d 行的补丁片段没有头信息:%.*s"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
-msgid "command"
-msgstr "命令"
+#: apply.c:1577
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
+msgstr[1] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "远程 git-upload-archive 命令的路径"
+#: apply.c:1589
+#, c-format
+msgid "git diff header lacks filename information (line %d)"
+msgstr "git diff 的头信息中缺乏文件名信息(第 %d 行)"
 
-#: archive.c:461
-msgid "Unexpected option --remote"
-msgstr "æ\9cªç\9f¥å\8f\82æ\95° --remote"
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "æ\96°æ\96\87件ä¾\9dèµ\96æ\97§å\86\85容"
 
-#: archive.c:463
-msgid "Option --exec can only be used together with --remote"
-msgstr "选项 --exec 只能和 --remote 同时使用"
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "删除的文件仍有内容"
 
-#: archive.c:465
-msgid "Unexpected option --output"
-msgstr "未知参数 --output"
+#: apply.c:1795
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "补丁在第 %d 行损坏"
 
-#: archive.c:487
+#: apply.c:1832
 #, c-format
-msgid "Unknown archive format '%s'"
-msgstr "æ\9cªç\9f¥å½\92档格å¼\8f '%s'"
+msgid "new file %s depends on old contents"
+msgstr "æ\96°æ\96\87件 %s ä¾\9dèµ\96æ\97§å\86\85容"
 
-#: archive.c:494
+#: apply.c:1834
 #, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr "å\8f\82æ\95°ä¸\8dæ\94¯æ\8c\81此格å¼\8f '%s'ï¼\9a-%d"
+msgid "deleted file %s still has contents"
+msgstr "å\88 é\99¤ç\9a\84æ\96\87件 %s ä»\8dæ\9c\89å\86\85容"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"负值模版在 git attributes 中被忽略\n"
-"当字符串确实要以感叹号开始时,使用 '\\!'。"
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** 警告:文件 %s 成为空文件但并未删除"
 
-#: bisect.c:441
+#: apply.c:1984
 #, c-format
-msgid "Could not open file '%s'"
-msgstr "ä¸\8dè\83½æ\89\93å¼\80æ\96\87件 '%s'"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "äº\8cè¿\9bå\88¶è¡¥ä¸\81å\9c¨ç¬¬ %d è¡\8cæ\8d\9få\9d\8fï¼\9a%.*s"
 
-#: bisect.c:446
+#: apply.c:2021
 #, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr "æ\96\87件 '%s' å\8c\85å\90«é\94\99误ç\9a\84å¼\95ç\94¨æ ¼å¼\8fï¼\9a%s"
+msgid "unrecognized binary patch at line %d"
+msgstr "æ\9cªè\83½è¯\86å\88«ç\9a\84äº\8cè¿\9bå\88¶è¡¥ä¸\81ä½\8däº\8e第 %d è¡\8c"
 
-#: bisect.c:655
+#: apply.c:2182
 #, c-format
-msgid "We cannot bisect more!\n"
-msgstr "我们无法进行更多的二分查找!\n"
+msgid "patch with only garbage at line %d"
+msgstr "补丁文件的第 %d 行只有垃圾数据"
 
-#: bisect.c:708
+#: apply.c:2265
 #, c-format
-msgid "Not a valid commit name %s"
-msgstr "不是一个有效的提交名 %s"
+msgid "unable to read symlink %s"
+msgstr "无法读取符号链接 %s"
 
-#: bisect.c:732
+#: apply.c:2269
 #, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-"合并基线 %s 是坏的。\n"
-"这意味着介于 %s 和 [%s] 之间的 bug 已经被修复。\n"
+msgid "unable to open or read %s"
+msgstr "不能打开或读取 %s"
 
-#: bisect.c:737
+#: apply.c:2922
 #, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-"合并基线 %s 是新的。\n"
-"介于 %s 和 [%s] 之间的属性已经被修改。\n"
+msgid "invalid start of line: '%c'"
+msgstr "无效的行首字符:'%c'"
 
-#: bisect.c:742
+#: apply.c:3041
 #, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-"合并基线 %s 是 %s。\n"
-"这意味着第一个 '%s' 提交位于 %s 和 [%s] 之间。\n"
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "块 #%d 成功应用于 %d(偏移 %d 行)"
+msgstr[1] "块 #%d 成功应用于 %d(偏移 %d 行)"
 
-#: bisect.c:750
+#: apply.c:3053
 #, c-format
-msgid ""
-"Some %s revs are not ancestor of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-"一些 %s 版本不是 %s 版本的祖先。\n"
-"这种情况下 git 二分查找无法正常工作。\n"
-"您可能弄错了 %s 和 %s 版本?\n"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段"
 
-#: bisect.c:763
+#: apply.c:3059
 #, c-format
 msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"介于 %s 和 [%s] 的合并基线一定被忽略了。\n"
-"所以我们无法确认第一个 %s 提交是否介于 %s 和 %s 之间。\n"
-"我们仍旧继续。"
+"当查询:\n"
+"%.*s"
 
-#: bisect.c:798
+#: apply.c:3081
 #, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr "二分查找中:合并基线必须是经过测试的\n"
+msgid "missing binary patch data for '%s'"
+msgstr "缺失 '%s' 的二进制补丁数据"
 
-#: bisect.c:849
+#: apply.c:3089
 #, c-format
-msgid "a %s revision is needed"
-msgstr "需要一个 %s 版本"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr "不能反向应用一个缺少到 '%s' 的反向数据块的二进制补丁"
 
-#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#: apply.c:3135
 #, c-format
-msgid "could not create file '%s'"
-msgstr "ä¸\8dè\83½å\88\9b建æ\96\87件 '%s'"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "ä¸\8dè\83½å\9c¨ '%s' ä¸\8aåº\94ç\94¨æ²¡æ\9c\89å®\8cæ\95´ç´¢å¼\95è¡\8cç\9a\84äº\8cè¿\9bå\88¶è¡¥ä¸\81"
 
-#: bisect.c:917
+#: apply.c:3145
 #, c-format
-msgid "could not read file '%s'"
-msgstr "不能读取文件 '%s'"
-
-#: bisect.c:947
-msgid "reading bisect refs failed"
-msgstr "读取二分查找引用失败"
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "补丁应用到 '%s'(%s),但是和当前内容不匹配。"
 
-#: bisect.c:967
+#: apply.c:3153
 #, c-format
-msgid "%s was both %s and %s\n"
-msgstr "%s 同时为 %s 和 %s\n"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "补丁应用到空文件 '%s',但其并非空文件"
 
-#: bisect.c:975
+#: apply.c:3171
 #, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path parameters?\n"
-msgstr ""
-"没有发现可测试的提交。\n"
-"可能您在运行时使用了错误的路径参数?\n"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "无法读取 '%2$s' 必须的目标文件 %1$s"
 
-#: bisect.c:994
+#: apply.c:3184
 #, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] "(大概 %d 步)"
-msgstr[1] "(大概 %d 步)"
+msgid "binary patch does not apply to '%s'"
+msgstr "二进制补丁未应用到 '%s'"
 
-#. TRANSLATORS: the last %s will be replaced with
-#. "(roughly %d steps)" translation
-#: bisect.c:998
+#: apply.c:3190
 #, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] "二分查找中:在此之后,还剩 %d 个版本待测试 %s\n"
-msgstr[1] "二分查找中:在此之后,还剩 %d 个版本待测试 %s\n"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr "到 '%s' 的二进制补丁产生了不正确的结果(应为 %s,却为 %s)"
 
-#: branch.c:53
+#: apply.c:3211
 #, c-format
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
-msgstr ""
-"\n"
-"在修复错误后,您可以尝试修改远程跟踪分支,通过执行命令\n"
-"\"git branch --set-upstream-to=%s%s%s\" 。"
+msgid "patch failed: %s:%ld"
+msgstr "打补丁失败:%s:%ld"
 
-#: branch.c:67
+#: apply.c:3333
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "未设置分支 %s 作为它自己的上游。"
+msgid "cannot checkout %s"
+msgstr "不能检出 %s"
 
-#: branch.c:93
+#: apply.c:3381 apply.c:3392 apply.c:3438 setup.c:253
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr "分支 %1$s 设置为使用变基来跟踪来自 %3$s 的远程分支 %2$s。"
+msgid "failed to read %s"
+msgstr "无法读取 %s"
 
-#: branch.c:94
+#: apply.c:3389
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "分支 %1$s 设置为跟踪来自 %3$s 的远程分支 %2$s。"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "读取位于符号链接中的 '%s'"
 
-#: branch.c:98
+#: apply.c:3418 apply.c:3658
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr "分支 %s 设置为使用变基来跟踪本地分支 %s。"
+msgid "path %s has been renamed/deleted"
+msgstr "路径 %s 已经被重命名/删除"
 
-#: branch.c:99
+#: apply.c:3501 apply.c:3672
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "分支 %s 设置为跟踪本地分支 %s。"
+msgid "%s: does not exist in index"
+msgstr "%s:不存在于索引中"
 
-#: branch.c:104
+#: apply.c:3510 apply.c:3680
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "分支 %s 设置为使用变基来跟踪远程引用 %s。"
+msgid "%s: does not match index"
+msgstr "%s:和索引不匹配"
 
-#: branch.c:105
-#, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "分支 %s 设置为跟踪远程引用 %s。"
+#: apply.c:3545
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "仓库缺乏必要的数据对象以进行三方合并。"
 
-#: branch.c:109
+#: apply.c:3548
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr "å\88\86æ\94¯ %s è®¾ç½®ä¸ºä½¿ç\94¨å\8f\98å\9fºæ\9d¥è·\9f踪æ\9c¬å\9c°å¼\95ç\94¨ %sã\80\82"
+msgid "Falling back to three-way merge...\n"
+msgstr "å\9b\9eè\90½å\88°ä¸\89æ\96¹å\90\88并...\n"
 
-#: branch.c:110
+#: apply.c:3564 apply.c:3568
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "分支 %s 设置为跟踪本地引用 %s。"
-
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "无法写入上游分支配置"
+msgid "cannot read the current contents of '%s'"
+msgstr "无法读取 '%s' 的当前内容"
 
-#: branch.c:156
+#: apply.c:3580
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "æ\9cªè·\9f踪ï¼\9aå¼\95ç\94¨ %s æ\9c\89æ­§ä¹\89"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "æ\97 æ³\95å\9b\9eè\90½å\88°ä¸\89æ\96¹å\90\88并...\n"
 
-#: branch.c:185
+#: apply.c:3594
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' 不是一个有效的分支名称。"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "应用补丁到 '%s' 存在冲突。\n"
 
-#: branch.c:190
+#: apply.c:3599
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "一个分支名 '%s' 已经存在。"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "成功应用补丁到 '%s'。\n"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "无法强制更新当前分支。"
+#: apply.c:3625
+msgid "removal patch leaves file contents"
+msgstr "移除补丁仍留下了文件内容"
 
-#: branch.c:218
+#: apply.c:3697
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr "无法设置跟踪信息;起始点 '%s' 不是一个分支。"
+msgid "%s: wrong type"
+msgstr "%s:错误类型"
 
-#: branch.c:220
+#: apply.c:3699
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "请求的上游分支 '%s' 不存在"
-
-#: branch.c:222
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-"\n"
-"如果您正计划基于远程一个现存的上游分支开始你的工作,\n"
-"您可能需要执行 \"git fetch\" 来获取分支。\n"
-"\n"
-"如果您正计划推送一个能与对应远程分支建立跟踪的新的本地分支,\n"
-"您可能需要使用 \"git push -u\" 推送分支并配置和上游的关联。"
+msgid "%s has type %o, expected %o"
+msgstr "%s 的类型是 %o,应为 %o"
 
-#: branch.c:266
+#: apply.c:3850 apply.c:3852
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "不是一个有效的对象名:'%s'。"
+msgid "invalid path '%s'"
+msgstr "无效路径 '%s'"
 
-#: branch.c:286
+#: apply.c:3908
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "歧义的对象名:'%s'。"
+msgid "%s: already exists in index"
+msgstr "%s:已经存在于索引中"
 
-#: branch.c:291
+#: apply.c:3911
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "无效的分支点:'%s'。"
+msgid "%s: already exists in working directory"
+msgstr "%s:已经存在于工作区中"
 
-#: branch.c:345
+#: apply.c:3931
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' 已经检出到 '%s'"
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)不匹配"
 
-#: branch.c:364
+#: apply.c:3936
 #, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr "工作区 %s 的 HEAD 指向没有被更新"
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "%2$s 的新模式(%1$o)和 %4$s 的旧模式(%3$o)不匹配"
 
-#: bundle.c:34
+#: apply.c:3956
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' 不像是一个 v2 版本的包文件"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "受影响的文件 '%s' 位于符号链接中"
 
-#: bundle.c:61
+#: apply.c:3960
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "未能识别的包头:%s%s (%d)"
+msgid "%s: patch does not apply"
+msgstr "%s:补丁未应用"
 
-#: bundle.c:87 builtin/commit.c:778
+#: apply.c:3975
 #, c-format
-msgid "could not open '%s'"
-msgstr "不能打开 '%s'"
-
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "仓库中缺少这些必备的提交:"
-
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085
-#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348
-#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901
-#: builtin/merge.c:356 builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "版本遍历设置失败"
+msgid "Checking patch %s..."
+msgstr "检查补丁 %s..."
 
-#: bundle.c:185
+#: apply.c:4066
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "这个包中含有这个引用:"
-msgstr[1] "这个包中含有 %d 个引用:"
-
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "这个包记录一个完整历史。"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "子模组 %s 的 sha1 信息缺失或无效"
 
-#: bundle.c:194
+#: apply.c:4073
 #, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "这个包需要这个引用:"
-msgstr[1] "这个包需要 %d 个引用:"
-
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "不能生成 pack-objects 进程"
-
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "pack-objects 终止"
-
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list 终止"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "%s 的模式被改变,但它不在当前 HEAD 中"
 
-#: bundle.c:353
+#: apply.c:4076
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "引用 '%s' 被 rev-list 选项排除"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "sha1 信息缺失或无效(%s)。"
 
-#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273
+#: apply.c:4081 builtin/checkout.c:252 builtin/reset.c:135
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "未能识别的参数:%s"
-
-#: bundle.c:451
-msgid "Refusing to create empty bundle."
-msgstr "不能创建空包。"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "对路径 '%s' 的 make_cache_entry 操作失败"
 
-#: bundle.c:463
+#: apply.c:4085
 #, c-format
-msgid "cannot create '%s'"
-msgstr "不能创建 '%s'"
-
-#: bundle.c:491
-msgid "index-pack died"
-msgstr "index-pack 终止"
+msgid "could not add %s to temporary index"
+msgstr "不能在临时索引中添加 %s"
 
-#: color.c:290
+#: apply.c:4095
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "无效的颜色值:%.*s"
+msgid "could not write temporary index to %s"
+msgstr "不能把临时索引写入到 %s"
 
-#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505
-#: builtin/am.c:2119
+#: apply.c:4233
 #, c-format
-msgid "could not parse %s"
-msgstr "不能解析 %s"
+msgid "unable to remove %s from index"
+msgstr "不能从索引中移除 %s"
 
-#: commit.c:42
+#: apply.c:4268
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s 不是一个提交!"
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "内存耗尽"
+msgid "corrupt patch for submodule %s"
+msgstr "子模组 %s 损坏的补丁"
 
-#: config.c:516
+#: apply.c:4274
 #, c-format
-msgid "bad config line %d in blob %s"
-msgstr "数据对象 %2$s 中错误的配置行 %1$d"
+msgid "unable to stat newly created file '%s'"
+msgstr "不能对新建文件 '%s' 调用 stat"
 
-#: config.c:520
+#: apply.c:4282
 #, c-format
-msgid "bad config line %d in file %s"
-msgstr "文件 %2$s 中错误的配置行 %1$d"
+msgid "unable to create backing store for newly created file %s"
+msgstr "不能为新建文件 %s 创建后端存储"
 
-#: config.c:524
+#: apply.c:4288 apply.c:4432
 #, c-format
-msgid "bad config line %d in standard input"
-msgstr "æ \87å\87\86è¾\93å\85¥ä¸­é\94\99误ç\9a\84é\85\8dç½®è¡\8c %d"
+msgid "unable to add cache entry for %s"
+msgstr "æ\97 æ³\95为 %s æ·»å\8a ç¼\93å­\98æ\9d¡ç\9b®"
 
-#: config.c:528
+#: apply.c:4329
 #, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr "子模组数据对象 %2$s 中错误的配置行 %1$d"
+msgid "failed to write to '%s'"
+msgstr "无法写入 '%s'"
 
-#: config.c:532
+#: apply.c:4333
 #, c-format
-msgid "bad config line %d in command line %s"
-msgstr "å\91½ä»¤è¡\8c %2$s ä¸­é\94\99误ç\9a\84é\85\8dç½®è¡\8c %1$d"
+msgid "closing file '%s'"
+msgstr "å\85³é\97­æ\96\87件 '%s'"
 
-#: config.c:536
+#: apply.c:4403
 #, c-format
-msgid "bad config line %d in %s"
-msgstr "在 %2$s 中错误的配置行 %1$d"
+msgid "unable to write file '%s' mode %o"
+msgstr "不能写文件 '%s' 权限 %o"
 
-#: config.c:655
-msgid "out of range"
-msgstr "超出范围"
+#: apply.c:4501
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "成功应用补丁 %s。"
 
-#: config.c:655
-msgid "invalid unit"
-msgstr "无效的单位"
+#: apply.c:4509
+msgid "internal error"
+msgstr "内部错误"
 
-#: config.c:661
+#: apply.c:4512
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "配置变量 '%2$s' 的数字取值 '%1$s' 设置错误:%3$s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "应用 %%s 个补丁,其中 %d 个被拒绝..."
+msgstr[1] "应用 %%s 个补丁,其中 %d 个被拒绝..."
 
-#: config.c:666
+#: apply.c:4523
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "æ\95°æ\8d®å¯¹è±¡ %3$s ä¸­é\85\8dç½®å\8f\98é\87\8f '%2$s' é\94\99误ç\9a\84å\8f\96å\80¼ '%1$s'ï¼\9a%4$s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "æ\88ªç\9f­ .rej æ\96\87件å\90\8d为 %.*s.rej"
 
-#: config.c:669
+#: apply.c:4531 builtin/fetch.c:739 builtin/fetch.c:988
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "文件 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+msgid "cannot open %s"
+msgstr "不能打开 %s"
 
-#: config.c:672
+#: apply.c:4545
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr "标准输入中配置变量 '%2$s' 错误的取值 '%1$s':%3$s"
+msgid "Hunk #%d applied cleanly."
+msgstr "第 #%d 个片段成功应用。"
 
-#: config.c:675
+#: apply.c:4549
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr "子模组数据 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+msgid "Rejected hunk #%d."
+msgstr "拒绝第 #%d 个片段。"
 
-#: config.c:678
+#: apply.c:4659
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr "命令行 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+msgid "Skipped patch '%s'."
+msgstr "略过补丁 '%s'。"
+
+#: apply.c:4667
+msgid "unrecognized input"
+msgstr "未能识别的输入"
+
+#: apply.c:4686
+msgid "unable to read index file"
+msgstr "无法读取索引文件"
 
-#: config.c:681
+#: apply.c:4823
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr "在 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+msgid "can't open patch '%s': %s"
+msgstr "不能打开补丁 '%s':%s"
 
-#: config.c:768
+#: apply.c:4850
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "无法扩展 '%s' 中的用户目录"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "抑制下仍有 %d 个空白字符误用"
+msgstr[1] "抑制下仍有 %d 个空白字符误用"
 
-#: config.c:849 config.c:860
+#: apply.c:4856 apply.c:4871
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "错误的 zlib 压缩级别 %d"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d 行有空白字符误用。"
+msgstr[1] "%d 行有空白字符误用。"
 
-#: config.c:978
+#: apply.c:4864
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "无效的对象创建模式:%s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "修复空白错误后,应用了 %d 行。"
+msgstr[1] "修复空白错误后,应用了 %d 行。"
 
-#: config.c:1312
-msgid "unable to parse command-line config"
-msgstr "无法解析命令行中的配置"
+#: apply.c:4880 builtin/add.c:463 builtin/mv.c:298 builtin/rm.c:391
+msgid "Unable to write new index file"
+msgstr "无法写入新索引文件"
 
-#: config.c:1362
-msgid "unknown error occurred while reading the configuration files"
-msgstr "在读取配置文件时遇到未知错误"
+#: apply.c:4911 apply.c:4914 builtin/am.c:2276 builtin/am.c:2279
+#: builtin/clone.c:113 builtin/fetch.c:98 builtin/pull.c:180
+#: builtin/submodule--helper.c:304 builtin/submodule--helper.c:629
+#: builtin/submodule--helper.c:632 builtin/submodule--helper.c:973
+#: builtin/submodule--helper.c:976 builtin/submodule--helper.c:1161
+#: git-add--interactive.perl:239
+msgid "path"
+msgstr "路径"
+
+#: apply.c:4912
+msgid "don't apply changes matching the given path"
+msgstr "不要应用与给出路径向匹配的变更"
+
+#: apply.c:4915
+msgid "apply changes matching the given path"
+msgstr "应用与给出路径向匹配的变更"
+
+#: apply.c:4917 builtin/am.c:2285
+msgid "num"
+msgstr "数字"
+
+#: apply.c:4918
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "从传统的 diff 路径中移除指定数量的前导斜线"
+
+#: apply.c:4921
+msgid "ignore additions made by the patch"
+msgstr "忽略补丁中的添加的文件"
+
+#: apply.c:4923
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "不应用补丁,而是显示输入的差异统计(diffstat)"
+
+#: apply.c:4927
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "以十进制数显示添加和删除的行数"
+
+#: apply.c:4929
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "不应用补丁,而是显示输入的概要"
+
+#: apply.c:4931
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "不应用补丁,而是查看补丁是否可应用"
+
+#: apply.c:4933
+msgid "make sure the patch is applicable to the current index"
+msgstr "确认补丁可以应用到当前索引"
+
+#: apply.c:4935
+msgid "apply a patch without touching the working tree"
+msgstr "应用补丁而不修改工作区"
+
+#: apply.c:4937
+msgid "accept a patch that touches outside the working area"
+msgstr "接受修改工作区之外文件的补丁"
+
+#: apply.c:4939
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "还应用此补丁(与 --stat/--summary/--check 选项同时使用)"
+
+#: apply.c:4941
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "如果一个补丁不能应用则尝试三方合并"
+
+#: apply.c:4943
+msgid "build a temporary index based on embedded index information"
+msgstr "创建一个临时索引基于嵌入的索引信息"
+
+#: apply.c:4946 builtin/checkout-index.c:169 builtin/ls-files.c:515
+msgid "paths are separated with NUL character"
+msgstr "路径以 NUL 字符分隔"
+
+#: apply.c:4948
+msgid "ensure at least <n> lines of context match"
+msgstr "确保至少匹配 <n> 行上下文"
+
+#: apply.c:4949 builtin/am.c:2264
+msgid "action"
+msgstr "动作"
+
+#: apply.c:4950
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "检查新增和修改的行中间的空白字符滥用"
+
+#: apply.c:4953 apply.c:4956
+msgid "ignore changes in whitespace when finding context"
+msgstr "查找上下文时忽略空白字符的变更"
+
+#: apply.c:4959
+msgid "apply the patch in reverse"
+msgstr "反向应用补丁"
+
+#: apply.c:4961
+msgid "don't expect at least one line of context"
+msgstr "无需至少一行上下文"
+
+#: apply.c:4963
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中"
+
+#: apply.c:4965
+msgid "allow overlapping hunks"
+msgstr "允许重叠的补丁片段"
+
+#: apply.c:4966 builtin/add.c:267 builtin/check-ignore.c:19
+#: builtin/commit.c:1337 builtin/count-objects.c:94 builtin/fsck.c:651
+#: builtin/log.c:1867 builtin/mv.c:122 builtin/read-tree.c:134
+msgid "be verbose"
+msgstr "冗长输出"
+
+#: apply.c:4968
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "允许不正确的文件末尾换行符"
+
+#: apply.c:4971
+msgid "do not trust the line counts in the hunk headers"
+msgstr "不信任补丁片段的头信息中的行号"
+
+#: apply.c:4973 builtin/am.c:2273
+msgid "root"
+msgstr "根目录"
+
+#: apply.c:4974
+msgid "prepend <root> to all filenames"
+msgstr "为所有文件名前添加 <根目录>"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<选项>] <树或提交> [<路径>...]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <仓库> [--exec <命令>] [<选项>] <树或提交> [<路径>...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <仓库> [--exec <命令>] --list"
+
+#: archive.c:332 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:300
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "路径规格 '%s' 未匹配任何文件"
+
+#: archive.c:417
+msgid "fmt"
+msgstr "格式"
+
+#: archive.c:417
+msgid "archive format"
+msgstr "归档格式"
+
+#: archive.c:418 builtin/log.c:1436
+msgid "prefix"
+msgstr "前缀"
+
+#: archive.c:419
+msgid "prepend prefix to each pathname in the archive"
+msgstr "为归档中每个路径名加上前缀"
+
+#: archive.c:420 builtin/blame.c:2598 builtin/blame.c:2599 builtin/config.c:60
+#: builtin/fast-export.c:987 builtin/fast-export.c:989 builtin/grep.c:1061
+#: builtin/hash-object.c:101 builtin/ls-files.c:549 builtin/ls-files.c:552
+#: builtin/notes.c:401 builtin/notes.c:564 builtin/read-tree.c:129
+#: parse-options.h:153
+msgid "file"
+msgstr "文件"
+
+#: archive.c:421 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "归档写入此文件"
+
+#: archive.c:423
+msgid "read .gitattributes in working directory"
+msgstr "读取工作区中的 .gitattributes"
+
+#: archive.c:424
+msgid "report archived files on stderr"
+msgstr "在标准错误上报告归档文件"
+
+#: archive.c:425
+msgid "store only"
+msgstr "只存储"
+
+#: archive.c:426
+msgid "compress faster"
+msgstr "压缩速度更快"
+
+#: archive.c:434
+msgid "compress better"
+msgstr "压缩效果更好"
+
+#: archive.c:437
+msgid "list supported archive formats"
+msgstr "列出支持的归档格式"
+
+#: archive.c:439 builtin/archive.c:90 builtin/clone.c:103 builtin/clone.c:106
+#: builtin/submodule--helper.c:641 builtin/submodule--helper.c:982
+msgid "repo"
+msgstr "仓库"
+
+#: archive.c:440 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "从远程仓库(<仓库>)提取归档文件"
+
+#: archive.c:441 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "命令"
+
+#: archive.c:442 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "远程 git-upload-archive 命令的路径"
+
+#: archive.c:449
+msgid "Unexpected option --remote"
+msgstr "未知参数 --remote"
+
+#: archive.c:451
+msgid "Option --exec can only be used together with --remote"
+msgstr "选项 --exec 只能和 --remote 同时使用"
+
+#: archive.c:453
+msgid "Unexpected option --output"
+msgstr "未知参数 --output"
+
+#: archive.c:475
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "未知归档格式 '%s'"
+
+#: archive.c:482
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "参数不支持此格式 '%s':-%d"
+
+#: attr.c:212
+#, c-format
+msgid "%.*s is not a valid attribute name"
+msgstr "%.*s 不是一个有效的属性名"
+
+#: attr.c:408
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"负值模版在 git attributes 中被忽略\n"
+"当字符串确实要以感叹号开始时,使用 '\\!'。"
+
+#: bisect.c:444
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "不能打开文件 '%s'"
+
+#: bisect.c:449
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "文件 '%s' 包含错误的引用格式:%s"
+
+#: bisect.c:657
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "我们无法进行更多的二分查找!\n"
+
+#: bisect.c:710
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "不是一个有效的提交名 %s"
+
+#: bisect.c:734
+#, c-format
+msgid ""
+"The merge base %s is bad.\n"
+"This means the bug has been fixed between %s and [%s].\n"
+msgstr ""
+"合并基线 %s 是坏的。\n"
+"这意味着介于 %s 和 [%s] 之间的 bug 已经被修复。\n"
+
+#: bisect.c:739
+#, c-format
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"合并基线 %s 是新的。\n"
+"介于 %s 和 [%s] 之间的属性已经被修改。\n"
+
+#: bisect.c:744
+#, c-format
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"合并基线 %s 是 %s。\n"
+"这意味着第一个 '%s' 提交位于 %s 和 [%s] 之间。\n"
+
+#: bisect.c:752
+#, c-format
+msgid ""
+"Some %s revs are not ancestors of the %s rev.\n"
+"git bisect cannot work properly in this case.\n"
+"Maybe you mistook %s and %s revs?\n"
+msgstr ""
+"一些 %s 版本不是 %s 版本的祖先。\n"
+"这种情况下 git 二分查找无法正常工作。\n"
+"您可能弄错了 %s 和 %s 版本?\n"
+
+#: bisect.c:765
+#, c-format
+msgid ""
+"the merge base between %s and [%s] must be skipped.\n"
+"So we cannot be sure the first %s commit is between %s and %s.\n"
+"We continue anyway."
+msgstr ""
+"介于 %s 和 [%s] 的合并基线一定被忽略了。\n"
+"所以我们无法确认第一个 %s 提交是否介于 %s 和 %s 之间。\n"
+"我们仍旧继续。"
+
+#: bisect.c:800
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "二分查找中:合并基线必须是经过测试的\n"
+
+#: bisect.c:851
+#, c-format
+msgid "a %s revision is needed"
+msgstr "需要一个 %s 版本"
+
+#: bisect.c:868 builtin/notes.c:174 builtin/tag.c:255
+#, c-format
+msgid "could not create file '%s'"
+msgstr "不能创建文件 '%s'"
+
+#: bisect.c:919
+#, c-format
+msgid "could not read file '%s'"
+msgstr "不能读取文件 '%s'"
+
+#: bisect.c:949
+msgid "reading bisect refs failed"
+msgstr "读取二分查找引用失败"
+
+#: bisect.c:969
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s 同时为 %s 和 %s\n"
+
+#: bisect.c:977
+#, c-format
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
+msgstr ""
+"没有发现可测试的提交。\n"
+"可能您在运行时使用了错误的路径参数?\n"
+
+#: bisect.c:996
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(大概 %d 步)"
+msgstr[1] "(大概 %d 步)"
+
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:1000
+#, c-format
+msgid "Bisecting: %d revision left to test after this %s\n"
+msgid_plural "Bisecting: %d revisions left to test after this %s\n"
+msgstr[0] "二分查找中:在此之后,还剩 %d 个版本待测试 %s\n"
+msgstr[1] "二分查找中:在此之后,还剩 %d 个版本待测试 %s\n"
+
+#: branch.c:53
+#, c-format
+msgid ""
+"\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\"."
+msgstr ""
+"\n"
+"在修复错误后,您可以尝试修改远程跟踪分支,通过执行命令\n"
+"\"git branch --set-upstream-to=%s%s%s\" 。"
+
+#: branch.c:67
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "未设置分支 %s 作为它自己的上游。"
+
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr "分支 %1$s 设置为使用变基来跟踪来自 %3$s 的远程分支 %2$s。"
+
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "分支 %1$s 设置为跟踪来自 %3$s 的远程分支 %2$s。"
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "分支 %s 设置为使用变基来跟踪本地分支 %s。"
+
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "分支 %s 设置为跟踪本地分支 %s。"
+
+#: branch.c:104
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "分支 %s 设置为使用变基来跟踪远程引用 %s。"
+
+#: branch.c:105
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "分支 %s 设置为跟踪远程引用 %s。"
+
+#: branch.c:109
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr "分支 %s 设置为使用变基来跟踪本地引用 %s。"
+
+#: branch.c:110
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "分支 %s 设置为跟踪本地引用 %s。"
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "无法写入上游分支配置"
+
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "未跟踪:引用 %s 有歧义"
+
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' 不是一个有效的分支名称。"
+
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "一个分支名 '%s' 已经存在。"
+
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "无法强制更新当前分支。"
+
+#: branch.c:218
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr "无法设置跟踪信息;起始点 '%s' 不是一个分支。"
+
+#: branch.c:220
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "请求的上游分支 '%s' 不存在"
+
+#: branch.c:222
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"如果您正计划基于远程一个现存的上游分支开始你的工作,\n"
+"您可能需要执行 \"git fetch\" 来获取分支。\n"
+"\n"
+"如果您正计划推送一个能与对应远程分支建立跟踪的新的本地分支,\n"
+"您可能需要使用 \"git push -u\" 推送分支并配置和上游的关联。"
+
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "不是一个有效的对象名:'%s'。"
+
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "歧义的对象名:'%s'。"
+
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "无效的分支点:'%s'。"
+
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' 已经检出到 '%s'"
+
+#: branch.c:364
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "工作区 %s 的 HEAD 指向没有被更新"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' 不像是一个 v2 版本的包文件"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "未能识别的包头:%s%s (%d)"
+
+#: bundle.c:87 sequencer.c:1341 sequencer.c:1767 builtin/commit.c:777
+#, c-format
+msgid "could not open '%s'"
+msgstr "不能打开 '%s'"
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "仓库中缺少这些必备的提交:"
+
+#: bundle.c:163 ref-filter.c:1852 sequencer.c:1162 sequencer.c:2321
+#: builtin/blame.c:2811 builtin/commit.c:1061 builtin/log.c:353
+#: builtin/log.c:897 builtin/log.c:1347 builtin/log.c:1673 builtin/log.c:1916
+#: builtin/merge.c:359 builtin/shortlog.c:176
+msgid "revision walk setup failed"
+msgstr "版本遍历设置失败"
+
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "这个包中含有这个引用:"
+msgstr[1] "这个包中含有 %d 个引用:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "这个包记录一个完整历史。"
+
+#: bundle.c:194
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "这个包需要这个引用:"
+msgstr[1] "这个包需要 %d 个引用:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "不能生成 pack-objects 进程"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "pack-objects 终止"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list 终止"
+
+#: bundle.c:353
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "引用 '%s' 被 rev-list 选项排除"
+
+#: bundle.c:443 builtin/log.c:170 builtin/log.c:1579 builtin/shortlog.c:281
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "未能识别的参数:%s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "不能创建空包。"
+
+#: bundle.c:463
+#, c-format
+msgid "cannot create '%s'"
+msgstr "不能创建 '%s'"
+
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "index-pack 终止"
+
+#: color.c:300
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "无效的颜色值:%.*s"
+
+#: commit.c:40 sequencer.c:1579 builtin/am.c:419 builtin/am.c:455
+#: builtin/am.c:1489 builtin/am.c:2126
+#, c-format
+msgid "could not parse %s"
+msgstr "不能解析 %s"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s 不是一个提交!"
+
+#: commit.c:1511
+msgid ""
+"Warning: commit message did not conform to UTF-8.\n"
+"You may want to amend it after fixing the message, or set the config\n"
+"variable i18n.commitencoding to the encoding your project uses.\n"
+msgstr ""
+"警告:提交说明不符合 UTF-8 字符编码。\n"
+"您可以通过修补提交来改正提交说明,或者将配置变量 i18n.commitencoding\n"
+"设置为您项目所用的字符编码。\n"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "内存耗尽"
+
+#: config.c:191
+msgid "relative config include conditionals must come from files"
+msgstr "包含相对路径的条件引用必须来自于文件"
+
+#: config.c:711
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "数据对象 %2$s 中错误的配置行 %1$d"
+
+#: config.c:715
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "文件 %2$s 中错误的配置行 %1$d"
+
+#: config.c:719
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "标准输入中错误的配置行 %d"
+
+#: config.c:723
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "子模组数据对象 %2$s 中错误的配置行 %1$d"
+
+#: config.c:727
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "命令行 %2$s 中错误的配置行 %1$d"
+
+#: config.c:731
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "在 %2$s 中错误的配置行 %1$d"
+
+#: config.c:859
+msgid "out of range"
+msgstr "超出范围"
+
+#: config.c:859
+msgid "invalid unit"
+msgstr "无效的单位"
+
+#: config.c:865
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "配置变量 '%2$s' 的数字取值 '%1$s' 设置错误:%3$s"
+
+#: config.c:870
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "数据对象 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+
+#: config.c:873
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "文件 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+
+#: config.c:876
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "标准输入中配置变量 '%2$s' 错误的取值 '%1$s':%3$s"
+
+#: config.c:879
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "子模组数据 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+
+#: config.c:882
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "命令行 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+
+#: config.c:885
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "在 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
+
+#: config.c:980
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "无法扩展 '%s' 中的用户目录"
+
+#: config.c:1075 config.c:1086
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "错误的 zlib 压缩级别 %d"
+
+#: config.c:1203
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "无效的对象创建模式:%s"
+
+#: config.c:1359
+#, c-format
+msgid "bad pack compression level %d"
+msgstr "错误的打包压缩级别 %d"
+
+#: config.c:1557
+msgid "unable to parse command-line config"
+msgstr "无法解析命令行中的配置"
 
-#: config.c:1716
+#: config.c:1611
+msgid "unknown error occurred while reading the configuration files"
+msgstr "在读取配置文件时遇到未知错误"
+
+#: config.c:1970
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "无效 %s:'%s'"
+
+#: config.c:1991
+#, c-format
+msgid "unknown core.untrackedCache value '%s'; using 'keep' default value"
+msgstr "未知的 core.untrackedCache 取值 '%s',使用默认值 'keep'"
+
+#: config.c:2017
+#, c-format
+msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
+msgstr "splitIndex.maxPercentChange 的取值 '%d' 应该介于 0 和 100 之间"
+
+#: config.c:2028
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "无法解析命令行配置中的 '%s'"
 
-#: config.c:1718
+#: config.c:2030
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "在文件 '%2$s' 的第 %3$d 行发现错误的配置变量 '%1$s'"
 
-#: config.c:1777
+#: config.c:2089
 #, c-format
 msgid "%s has multiple values"
 msgstr "%s 有多个取值"
 
-#: config.c:2311
+#: config.c:2423 config.c:2648
+#, c-format
+msgid "fstat on %s failed"
+msgstr "对 %s 调用 fstat 失败"
+
+#: config.c:2541
 #, c-format
 msgid "could not set '%s' to '%s'"
 msgstr "不能设置 '%s' 为 '%s'"
 
-#: config.c:2313
+#: config.c:2543 builtin/remote.c:774
 #, c-format
 msgid "could not unset '%s'"
 msgstr "不能取消设置 '%s'"
 
-#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "远端在连接发起时即挂断"
+
+#: connect.c:51
+msgid ""
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
+msgstr ""
+"无法读取远程仓库。\n"
+"\n"
+"请确认您有正确的访问权限并且仓库存在。"
+
+#: connected.c:63 builtin/fsck.c:190 builtin/prune.c:140
 msgid "Checking connectivity"
 msgstr "检查连接中"
 
-#: connected.c:74
+#: connected.c:75
 msgid "Could not run 'git rev-list'"
 msgstr "不能执行 'git rev-list'"
 
-#: connected.c:94
+#: connected.c:95
 msgid "failed write to rev-list"
 msgstr "无法写入 rev-list"
 
-#: connected.c:101
+#: connected.c:102
 msgid "failed to close rev-list's stdin"
 msgstr "无法关闭 rev-list 的标准输入"
 
+#: convert.c:201
+#, c-format
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"文件 %s 中的 CRLF 将被 LF 替换。\n"
+"在工作区中该文件仍保持原有的换行符。"
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "文件 %s 中的 CRLF 将被 LF 替换。"
+
+#: convert.c:211
+#, c-format
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
+msgstr ""
+"文件 %s 中的 LF 将被 CRLF 替换。\n"
+"在工作区中该文件仍保持原有的换行符。"
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "文件 %s 中的 LF 将被 CRLF 替换"
+
 #: date.c:97
 msgid "in the future"
 msgstr "在将来"
@@ -912,28 +1605,33 @@ msgstr[1] "%lu 年前"
 msgid "failed to read orderfile '%s'"
 msgstr "无法读取排序文件 '%s'"
 
-#: diffcore-rename.c:540
+#: diffcore-rename.c:536
 msgid "Performing inexact rename detection"
-msgstr "正在进行非精确的重命名检测"
+msgstr "正在进行非精确的重命名探测"
+
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "选项 '%s'  需要一个值"
 
 #  译者:注意保持前导空格
-#: diff.c:116
+#: diff.c:124
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  无法解析 dirstat 截止(cut-off)百分比 '%s'\n"
 
 #  译者:注意保持前导空格
-#: diff.c:121
+#: diff.c:129
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  未知的 dirstat 参数 '%s'\n"
 
-#: diff.c:225
+#: diff.c:281
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "配置变量 'diff.submodule' 未知的取值:'%s'"
 
-#: diff.c:277
+#: diff.c:344
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -942,16 +1640,20 @@ msgstr ""
 "发现配置变量 'diff.dirstat' 中的错误:\n"
 "%s"
 
-#: diff.c:3017
+#: diff.c:3102
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "外部 diff 退出,停止在 %s"
 
-#: diff.c:3415
+#: diff.c:3428
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only、--name-status、--check 和 -s 是互斥的"
+
+#: diff.c:3518
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow 明确要求只跟一个路径规格"
 
-#: diff.c:3578
+#: diff.c:3681
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -960,61 +1662,277 @@ msgstr ""
 "无法解析 --dirstat/-X 选项的参数:\n"
 "%s"
 
-#: diff.c:3592
+#: diff.c:3695
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "无法解析 --submodule 选项的参数:'%s'"
 
-#: dir.c:1823
+#: diff.c:4719
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "因为文件太多,略过不严格的重命名检查。"
+
+#: diff.c:4722
+msgid "only found copies from modified paths due to too many files."
+msgstr "因为文件太多,只在修改的路径中查找拷贝。"
+
+#: diff.c:4725
+#, c-format
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr "您可能想要将变量 %s 设置为至少 %d 并再次执行此命令。"
+
+#: dir.c:1899
 msgid "failed to get kernel name and information"
 msgstr "无法获得内核名称和信息"
 
-#: dir.c:1942
+#: dir.c:2018
 msgid "Untracked cache is disabled on this system or location."
 msgstr "缓存未跟踪文件在本系统或位置中被禁用。"
 
-#: gpg-interface.c:178
+#: dir.c:2776 dir.c:2781
+#, c-format
+msgid "could not create directories for %s"
+msgstr "不能为 %s 创建目录"
+
+#: dir.c:2806
+#, c-format
+msgid "could not migrate git directory from '%s' to '%s'"
+msgstr "不能从 '%s' 迁移 git 目录到 '%s'"
+
+#: entry.c:280
+#, c-format
+msgid "could not stat file '%s'"
+msgstr "不能对文件 '%s' 调用 stat"
+
+#: fetch-pack.c:249
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack:应为 shallow 列表"
+
+#: fetch-pack.c:261
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack:应为 ACK/NAK,却得到 EOF"
+
+#: fetch-pack.c:280 builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "远程错误:%s"
+
+#: fetch-pack.c:281
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack:应为 ACK/NAK,却得到 '%s'"
+
+#: fetch-pack.c:333
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc 需要 multi_ack_detailed"
+
+#: fetch-pack.c:419
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "无效的 shallow 信息:%s"
+
+#: fetch-pack.c:425
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "无效的 unshallow 信息:%s"
+
+#: fetch-pack.c:427
+#, c-format
+msgid "object not found: %s"
+msgstr "对象未找到:%s"
+
+#: fetch-pack.c:430
+#, c-format
+msgid "error in object: %s"
+msgstr "对象中出错:%s"
+
+#: fetch-pack.c:432
+#, c-format
+msgid "no shallow found: %s"
+msgstr "未发现 shallow:%s"
+
+#: fetch-pack.c:435
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "应为 shallow/unshallow,却得到 %s"
+
+#: fetch-pack.c:474
+#, c-format
+msgid "got %s %d %s"
+msgstr "得到 %s %d %s"
+
+#: fetch-pack.c:488
+#, c-format
+msgid "invalid commit %s"
+msgstr "无效提交 %s"
+
+#: fetch-pack.c:521
+msgid "giving up"
+msgstr "放弃"
+
+#: fetch-pack.c:531 progress.c:235
+msgid "done"
+msgstr "完成"
+
+#: fetch-pack.c:543
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "得到 %s (%d) %s"
+
+#: fetch-pack.c:589
+#, c-format
+msgid "Marking %s as complete"
+msgstr "标记 %s 为完成"
+
+#: fetch-pack.c:737
+#, c-format
+msgid "already have %s (%s)"
+msgstr "已经有 %s(%s)"
+
+#: fetch-pack.c:775
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack:无法派生 sideband 多路输出"
+
+#: fetch-pack.c:783
+msgid "protocol error: bad pack header"
+msgstr "协议错误:坏的包头"
+
+#: fetch-pack.c:839
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack:无法派生进程 %s"
+
+#: fetch-pack.c:855
+#, c-format
+msgid "%s failed"
+msgstr "%s 失败"
+
+#: fetch-pack.c:857
+msgid "error in sideband demultiplexer"
+msgstr "sideband 多路输出出错"
+
+#: fetch-pack.c:884
+msgid "Server does not support shallow clients"
+msgstr "服务器不支持 shalllow 客户端"
+
+#: fetch-pack.c:888
+msgid "Server supports multi_ack_detailed"
+msgstr "服务器支持 multi_ack_detailed"
+
+#: fetch-pack.c:891
+msgid "Server supports no-done"
+msgstr "服务器支持 no-done"
+
+#: fetch-pack.c:897
+msgid "Server supports multi_ack"
+msgstr "服务器支持 multi_ack"
+
+#: fetch-pack.c:901
+msgid "Server supports side-band-64k"
+msgstr "服务器支持 side-band-64k"
+
+#: fetch-pack.c:905
+msgid "Server supports side-band"
+msgstr "服务器支持 side-band"
+
+#: fetch-pack.c:909
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "服务器支持 allow-tip-sha1-in-want"
+
+#: fetch-pack.c:913
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "服务器支持 allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:923
+msgid "Server supports ofs-delta"
+msgstr "服务器支持 ofs-delta"
+
+#: fetch-pack.c:930
+#, c-format
+msgid "Server version is %.*s"
+msgstr "服务器版本 %.*s"
+
+#: fetch-pack.c:936
+msgid "Server does not support --shallow-since"
+msgstr "服务器不支持 --shallow-since"
+
+#: fetch-pack.c:940
+msgid "Server does not support --shallow-exclude"
+msgstr "服务器不支持 --shallow-exclude"
+
+#: fetch-pack.c:942
+msgid "Server does not support --deepen"
+msgstr "服务器不支持 --deepen"
+
+#: fetch-pack.c:953
+msgid "no common commits"
+msgstr "没有共同的提交"
+
+#: fetch-pack.c:965
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack:获取失败。"
+
+#: fetch-pack.c:1127
+msgid "no matching remote head"
+msgstr "没有匹配的远程分支"
+
+#: fetch-pack.c:1149
+#, c-format
+msgid "no such remote ref %s"
+msgstr "没有这样的远程引用 %s"
+
+#: fetch-pack.c:1152
+#, c-format
+msgid "Server does not allow request for unadvertised object %s"
+msgstr "服务器不允许请求未公开的对象 %s"
+
+#: gpg-interface.c:185
 msgid "gpg failed to sign the data"
 msgstr "gpg 无法为数据签名"
 
-#: gpg-interface.c:208
+#: gpg-interface.c:215
 msgid "could not create temporary file"
 msgstr "不能创建临时文件"
 
-#: gpg-interface.c:210
+#: gpg-interface.c:217
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "无法将分离式签名写入 '%s'"
 
-#: grep.c:1792
+#: graph.c:96
+#, c-format
+msgid "ignore invalid color '%.*s' in log.graphColors"
+msgstr "忽略 log.graphColors 中无效的颜色 '%.*s'"
+
+#: grep.c:1796
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s':无法读取 %s"
 
-#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
+#: grep.c:1813 builtin/clone.c:399 builtin/diff.c:81 builtin/rm.c:133
 #, c-format
 msgid "failed to stat '%s'"
-msgstr "无法枚举 '%s' 状态"
+msgstr "对 '%s' 调用 stat 失败"
 
-#: grep.c:1820
+#: grep.c:1824
 #, c-format
 msgid "'%s': short read"
 msgstr "'%s':读取不完整"
 
-#: help.c:205
+#: help.c:218
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "在 '%s' 下可用的 git 命令"
 
-#: help.c:212
+#: help.c:225
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "在 $PATH 路径中的其他地方可用的 git 命令"
 
-#: help.c:244
+#: help.c:256
 msgid "These are common Git commands used in various situations:"
 msgstr "这些是各种场合常见的 Git 命令:"
 
-#: help.c:309
+#: help.c:321
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -1023,11 +1941,11 @@ msgstr ""
 "'%s' 像是一个 git 命令,但却无法运行。\n"
 "可能是 git-%s 受损?"
 
-#: help.c:366
+#: help.c:376
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "唉呀,您的系统中未发现 Git 命令。"
 
-#: help.c:388
+#: help.c:398
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -1036,17 +1954,17 @@ msgstr ""
 "警告:您运行一个不存在的 Git 命令 '%s'。继续执行假定您要运行的\n"
 "是 '%s'"
 
-#: help.c:393
+#: help.c:403
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "在 %0.1f 秒钟后自动运行..."
 
-#: help.c:400
+#: help.c:410
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git:'%s' 不是一个 git 命令。参见 'git --help'。"
 
-#: help.c:404 help.c:470
+#: help.c:414 help.c:480
 msgid ""
 "\n"
 "Did you mean this?"
@@ -1060,11 +1978,69 @@ msgstr[1] ""
 "\n"
 "您指的是这其中的某一个么?"
 
-#: help.c:466
+#: help.c:476
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s:%s - %s"
 
+#: ident.c:343
+msgid ""
+"\n"
+"*** Please tell me who you are.\n"
+"\n"
+"Run\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"to set your account's default identity.\n"
+"Omit --global to set the identity only in this repository.\n"
+"\n"
+msgstr ""
+"\n"
+"*** 请告诉我你是谁。\n"
+"\n"
+"运行\n"
+"\n"
+"  git config --global user.email \"you@example.com\"\n"
+"  git config --global user.name \"Your Name\"\n"
+"\n"
+"来设置您账号的缺省身份标识。\n"
+"如果仅在本仓库设置身份标识,则省略 --global 参数。\n"
+
+#: ident.c:367
+msgid "no email was given and auto-detection is disabled"
+msgstr "未提供邮件地址且自动探测被禁用"
+
+#: ident.c:372
+#, c-format
+msgid "unable to auto-detect email address (got '%s')"
+msgstr "无法自动探测邮件地址(得到 '%s')"
+
+#: ident.c:382
+msgid "no name was given and auto-detection is disabled"
+msgstr "未提供姓名且自动探测被禁用"
+
+#: ident.c:388
+#, c-format
+msgid "unable to auto-detect name (got '%s')"
+msgstr "无法自动探测姓名(得到 '%s')"
+
+#: ident.c:396
+#, c-format
+msgid "empty ident name (for <%s>) not allowed"
+msgstr "不允许空的姓名(对于 <%s>)"
+
+#: ident.c:402
+#, c-format
+msgid "name consists only of disallowed characters: %s"
+msgstr "姓名中仅包含禁用字符:%s"
+
+#: ident.c:417 builtin/commit.c:611
+#, c-format
+msgid "invalid date format: %s"
+msgstr "无效的日期格式:%s"
+
 #: lockfile.c:152
 #, c-format
 msgid ""
@@ -1092,8 +2068,8 @@ msgstr "不能创建 '%s.lock':%s"
 msgid "failed to read the cache"
 msgstr "无法读取缓存"
 
-#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375
-#: builtin/checkout.c:589 builtin/clone.c:732
+#: merge.c:96 builtin/am.c:1999 builtin/am.c:2034 builtin/checkout.c:393
+#: builtin/checkout.c:607 builtin/clone.c:749
 msgid "unable to write new index file"
 msgstr "无法写新的索引文件"
 
@@ -1101,85 +2077,103 @@ msgstr "无法写新的索引文件"
 msgid "(bad commit)\n"
 msgstr "(坏提交)\n"
 
-#: merge-recursive.c:231
+#: merge-recursive.c:231 merge-recursive.c:239
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "为路径 '%s' addinfo_cache 失败"
 
-#: merge-recursive.c:301
+#: merge-recursive.c:303
 msgid "error building trees"
 msgstr "无法创建树"
 
-#: merge-recursive.c:720
+#: merge-recursive.c:727
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "无法创建路径 '%s'%s"
 
-#: merge-recursive.c:731
+#: merge-recursive.c:738
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "删除 %s 以便为子目录留出空间\n"
 
-#: merge-recursive.c:745 merge-recursive.c:764
+#: merge-recursive.c:752 merge-recursive.c:771
 msgid ": perhaps a D/F conflict?"
 msgstr ":可能是一个目录/文件冲突?"
 
-#: merge-recursive.c:754
+#: merge-recursive.c:761
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "拒绝丢弃 '%s' 中的未跟踪文件"
 
-#: merge-recursive.c:796
+#: merge-recursive.c:803 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "不能读取对象 %s '%s'"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:805
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "%s '%s' 应为数据对象"
 
-#: merge-recursive.c:822
+#: merge-recursive.c:829
 #, c-format
 msgid "failed to open '%s': %s"
 msgstr "无法打开 '%s':%s"
 
-#: merge-recursive.c:833
+#: merge-recursive.c:840
 #, c-format
 msgid "failed to symlink '%s': %s"
 msgstr "无法创建符号链接 '%s':%s"
 
-#: merge-recursive.c:838
+#: merge-recursive.c:845
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "不知道如何处理 %06o %s '%s'"
 
-#: merge-recursive.c:978
+#: merge-recursive.c:985
 msgid "Failed to execute internal merge"
 msgstr "无法执行内部合并"
 
-#: merge-recursive.c:982
+#: merge-recursive.c:989
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "不能添加 %s 至对象库"
 
-#: merge-recursive.c:1081 merge-recursive.c:1095
+#: merge-recursive.c:1092
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree."
 msgstr ""
-"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
-"的版本被保留。"
+"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 的 %6$s 版"
+"本被保留。"
 
-#: merge-recursive.c:1087 merge-recursive.c:1100
+#: merge-recursive.c:1097
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree."
+msgstr ""
+"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %6$s 中的 %5$s 被 %4$s。%8$s 的 "
+"%7$s 版本被保留。"
+
+#: merge-recursive.c:1104
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree at %s."
 msgstr ""
-"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
-"的版本保留于 %8$s 中。"
+"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 的 %6$s 版"
+"本保留在 %8$s 中。"
+
+#: merge-recursive.c:1109
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
+"left in tree at %s."
+msgstr ""
+"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %6$s 中的 %5$s 被 %4$s。%8$s 的 "
+"%7$s 版本保留在 %9$s 中。"
 
 #: merge-recursive.c:1143
 msgid "rename"
@@ -1219,122 +2213,138 @@ msgstr ""
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "而是重命名 %s 至 %s,以及 %s 至 %s"
 
-#: merge-recursive.c:1531
+#: merge-recursive.c:1528
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "冲突(重命名/添加):在 %3$s 中重命名 %1$s->%2$s。在 %5$s 中添加 %4$s"
 
-#: merge-recursive.c:1546
+#: merge-recursive.c:1543
 #, c-format
 msgid "Adding merged %s"
 msgstr "添加合并后的 %s"
 
-#: merge-recursive.c:1553 merge-recursive.c:1766
+#: merge-recursive.c:1550 merge-recursive.c:1780
 #, c-format
 msgid "Adding as %s instead"
 msgstr "而是以 %s 为名添加"
 
-#: merge-recursive.c:1610
+#: merge-recursive.c:1607
 #, c-format
 msgid "cannot read object %s"
 msgstr "不能读取对象 %s"
 
-#: merge-recursive.c:1613
+#: merge-recursive.c:1610
 #, c-format
 msgid "object %s is not a blob"
 msgstr "对象 %s 不是一个数据对象"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modify"
 msgstr "修改"
 
-#: merge-recursive.c:1666
+#: merge-recursive.c:1679
 msgid "modified"
 msgstr "修改"
 
-#: merge-recursive.c:1676
+#: merge-recursive.c:1689
 msgid "content"
 msgstr "内容"
 
-#: merge-recursive.c:1683
+#: merge-recursive.c:1696
 msgid "add/add"
 msgstr "添加/添加"
 
-#: merge-recursive.c:1718
+#: merge-recursive.c:1732
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "略过 %s(已经做过相同合并)"
 
-#: merge-recursive.c:1732
+#: merge-recursive.c:1746
 #, c-format
 msgid "Auto-merging %s"
 msgstr "自动合并 %s"
 
-#: merge-recursive.c:1736 git-submodule.sh:919
+#: merge-recursive.c:1750 git-submodule.sh:944
 msgid "submodule"
 msgstr "子模组"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1751
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "冲突(%s):合并冲突于 %s"
 
-#: merge-recursive.c:1831
+#: merge-recursive.c:1845
 #, c-format
 msgid "Removing %s"
 msgstr "删除 %s"
 
-#: merge-recursive.c:1857
+#: merge-recursive.c:1871
 msgid "file/directory"
 msgstr "文件/目录"
 
-#: merge-recursive.c:1863
+#: merge-recursive.c:1877
 msgid "directory/file"
 msgstr "目录/文件"
 
-#: merge-recursive.c:1868
+#: merge-recursive.c:1883
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr "冲突(%1$s):在 %3$s 中有一个名为 %2$s 的目录。以 %5$s 为名添加 %4$s"
 
-#: merge-recursive.c:1877
+#: merge-recursive.c:1892
 #, c-format
 msgid "Adding %s"
 msgstr "添加 %s"
 
-#: merge-recursive.c:1914
+#: merge-recursive.c:1929
 msgid "Already up-to-date!"
 msgstr "已经是最新的!"
 
-#: merge-recursive.c:1923
+#: merge-recursive.c:1938
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "无法合并树 %s 和 %s"
 
-#: merge-recursive.c:2006
+#: merge-recursive.c:2021
 msgid "Merging:"
 msgstr "合并:"
 
-#: merge-recursive.c:2019
+#: merge-recursive.c:2034
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "发现 %u 个共同祖先:"
 msgstr[1] "发现 %u 个共同祖先:"
 
-#: merge-recursive.c:2058
+#: merge-recursive.c:2073
 msgid "merge returned no commit"
 msgstr "合并未返回提交"
 
-#: merge-recursive.c:2121
+#: merge-recursive.c:2136
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "不能解析对象 '%s'"
 
-#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+#: merge-recursive.c:2150 builtin/merge.c:645 builtin/merge.c:792
 msgid "Unable to write index."
 msgstr "不能写入索引。"
 
+#: notes-merge.c:273
+#, c-format
+msgid ""
+"You have not concluded your previous notes merge (%s exists).\n"
+"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
+"commit/abort the previous merge before you start a new notes merge."
+msgstr ""
+"您的前一次注释合并尚未结束(存在 %s)。\n"
+"在开始一个新的注释合并之前,请使用 'git notes merge --commit' 或者 'git "
+"notes merge --abort' 来提交/终止前一次合并。"
+
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "您尚未结束注释合并(存在 %s)。"
+
 #: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr "不能提交未初始化/未引用的注解树"
@@ -1356,7 +2366,7 @@ msgstr "拒绝向 %s(在 refs/notes/ 之外)写入注解"
 msgid "Bad %s value: '%s'"
 msgstr "坏的 %s 值:'%s'"
 
-#: object.c:242
+#: object.c:240
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "不能解析对象:%s"
@@ -1392,82 +2402,100 @@ msgstr "-数字"
 msgid "malformed object name '%s'"
 msgstr "非法的对象名 '%s'"
 
-#: path.c:798
+#: path.c:810
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "不能设置 %s 为组可写"
 
-#: pathspec.c:133
+#: pathspec.c:125
+msgid "Escape character '\\' not allowed as last character in attr value"
+msgstr "转义字符 '\\' 不能作为属性值的最后一个字符"
+
+#: pathspec.c:143
+msgid "Only one 'attr:' specification is allowed."
+msgstr "只允许一个 'attr:' 规格。"
+
+#: pathspec.c:146
+msgid "attr spec must not be empty"
+msgstr "属性规格不能为空"
+
+#: pathspec.c:189
+#, c-format
+msgid "invalid attribute name %s"
+msgstr "无效的属性名 %s"
+
+#: pathspec.c:254
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr "全局的 'glob' 和 'noglob' 路径规格设置不兼容"
 
-#: pathspec.c:143
+#: pathspec.c:261
 msgid ""
 "global 'literal' pathspec setting is incompatible with all other global "
 "pathspec settings"
 msgstr "全局的 'literal' 路径规格设置和其它的全局路径规格设置不兼容"
 
-#: pathspec.c:177
+#: pathspec.c:301
 msgid "invalid parameter for pathspec magic 'prefix'"
 msgstr "路径规格包含无效的神奇前缀"
 
-#: pathspec.c:183
+#: pathspec.c:322
 #, c-format
 msgid "Invalid pathspec magic '%.*s' in '%s'"
 msgstr "在路径规格 '%3$s' 中无效的神奇前缀 '%2$.*1$s'"
 
-#: pathspec.c:187
+#: pathspec.c:327
 #, c-format
 msgid "Missing ')' at the end of pathspec magic in '%s'"
 msgstr "路径规格 '%s' 的神奇前缀结尾少了一个 ')'"
 
-#: pathspec.c:205
+#: pathspec.c:365
 #, c-format
 msgid "Unimplemented pathspec magic '%c' in '%s'"
 msgstr "路径规格 '%2$s' 中包含未实现的神奇前缀 '%1$c'"
 
-#: pathspec.c:230
+#: pathspec.c:421 pathspec.c:443
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "路径规格 '%s' 在子模组 '%.*s' 中"
+
+#: pathspec.c:483
 #, c-format
 msgid "%s: 'literal' and 'glob' are incompatible"
 msgstr "%s:'literal' 和 'glob' 不兼容"
 
-#: pathspec.c:241
+#: pathspec.c:496
 #, c-format
 msgid "%s: '%s' is outside repository"
 msgstr "%s:'%s' 在仓库之外"
 
-#: pathspec.c:291
+#: pathspec.c:584
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "路径规格 '%s' 在子模组 '%.*s' 中"
+msgid "'%s' (mnemonic: '%c')"
+msgstr "'%s'(助记符:'%c')"
 
-#: pathspec.c:353
+#: pathspec.c:594
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s:路径规格神奇前缀不被此命令支持:%s"
 
-#: pathspec.c:433
+#: pathspec.c:644
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"在下一个版本中,使用空字符串作为路径规格将被视作非法。如果要匹配所有路径,\n"
+"请代之以 ."
+
+#: pathspec.c:668
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "路径规格 '%s' 位于符号链接中"
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
-msgstr ""
-"没有为 :(exclude) 模式提供要忽略的内容。也许您忘记了\n"
-"添加 ':/' 或 '.' ?"
-
-#: pretty.c:973
+#: pretty.c:982
 msgid "unable to parse --pretty format"
 msgstr "不能解析 --pretty 格式"
 
-#: progress.c:235
-msgid "done"
-msgstr "完成"
-
-#: read-cache.c:1281
+#: read-cache.c:1442
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1476,7 +2504,7 @@ msgstr ""
 "设置了 index.version,但是取值无效。\n"
 "使用版本 %i"
 
-#: read-cache.c:1291
+#: read-cache.c:1452
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1485,247 +2513,359 @@ msgstr ""
 "设置了 GIT_INDEX_VERSION,但是取值无效。\n"
 "使用版本 %i"
 
-#: refs.c:551 builtin/merge.c:840
+#: read-cache.c:2375 sequencer.c:1350 sequencer.c:2048
+#, c-format
+msgid "could not stat '%s'"
+msgstr "不能对 '%s' 调用 stat"
+
+#: read-cache.c:2388
+#, c-format
+msgid "unable to open git dir: %s"
+msgstr "不能打开 git 目录:%s"
+
+#: read-cache.c:2400
+#, c-format
+msgid "unable to unlink: %s"
+msgstr "无法删除:%s"
+
+#: refs.c:620 builtin/merge.c:844
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "无法打开 '%s' 进行写入"
 
-#: refs/files-backend.c:2534
+#: refs.c:1667
+msgid "ref updates forbidden inside quarantine environment"
+msgstr "在隔离环境中禁止更新引用"
+
+#: refs/files-backend.c:1631
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "无法删除引用 %s:%s"
 
-#: refs/files-backend.c:2537
+#: refs/files-backend.c:1634
 #, c-format
 msgid "could not delete references: %s"
 msgstr "无法删除引用:%s"
 
-#: refs/files-backend.c:2546
+#: refs/files-backend.c:1643
 #, c-format
 msgid "could not remove reference %s"
 msgstr "无法删除引用 %s"
 
-#: ref-filter.c:55
+#: ref-filter.c:35 wt-status.c:1780
+msgid "gone"
+msgstr "丢失"
+
+#: ref-filter.c:36
+#, c-format
+msgid "ahead %d"
+msgstr "领先 %d"
+
+#: ref-filter.c:37
+#, c-format
+msgid "behind %d"
+msgstr "落后 %d"
+
+#: ref-filter.c:38
+#, c-format
+msgid "ahead %d, behind %d"
+msgstr "领先 %d,落后 %d"
+
+#: ref-filter.c:104
 #, c-format
 msgid "expected format: %%(color:<color>)"
 msgstr "期望的格式:%%(color:<color>)"
 
-#: ref-filter.c:57
+#: ref-filter.c:106
 #, c-format
 msgid "unrecognized color: %%(color:%s)"
 msgstr "未能识别的颜色:%%(color:%s)"
 
-#: ref-filter.c:71
+#: ref-filter.c:120
+#, c-format
+msgid "Integer value expected refname:lstrip=%s"
+msgstr "期望整数值 refname:lstrip=%s"
+
+#: ref-filter.c:124
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "æ\9cªè\83½è¯\86å\88«ç\9a\84æ ¼å¼\8fï¼\9a%%(%s)"
+msgid "Integer value expected refname:rstrip=%s"
+msgstr "æ\9c\9fæ\9c\9bæ\95´æ\95°å\80¼ refname:rstrip=%s"
 
-#: ref-filter.c:77
+#: ref-filter.c:126
+#, c-format
+msgid "unrecognized %%(%s) argument: %s"
+msgstr "未能识别的 %%(%s) 参数:%s"
+
+#: ref-filter.c:166
 #, c-format
 msgid "%%(body) does not take arguments"
 msgstr "%%(body) 不带参数"
 
-#: ref-filter.c:84
+#: ref-filter.c:173
 #, c-format
 msgid "%%(subject) does not take arguments"
 msgstr "%%(subject) 不带参数"
 
-#: ref-filter.c:101
+#: ref-filter.c:180
+#, c-format
+msgid "%%(trailers) does not take arguments"
+msgstr "%%(trailers) 不带参数"
+
+#: ref-filter.c:199
 #, c-format
 msgid "positive value expected contents:lines=%s"
-msgstr "要为 contents:lines=%s 提供一个正数"
+msgstr "期望一个正数 contents:lines=%s"
 
-#: ref-filter.c:103
+#: ref-filter.c:201
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
 msgstr "未能识别的 %%(contents) 参数:%s"
 
-#: ref-filter.c:113
+#: ref-filter.c:214
+#, c-format
+msgid "positive value expected objectname:short=%s"
+msgstr "期望一个正数 objectname:short=%s"
+
+#: ref-filter.c:218
 #, c-format
 msgid "unrecognized %%(objectname) argument: %s"
 msgstr "未能识别的 %%(objectname) 参数:%s"
 
-#: ref-filter.c:135
+#: ref-filter.c:245
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "期望的格式:%%(align:<width>,<position>)"
 
-#: ref-filter.c:147
+#: ref-filter.c:257
 #, c-format
 msgid "unrecognized position:%s"
 msgstr "未能识别的位置:%s"
 
-#: ref-filter.c:151
+#: ref-filter.c:261
 #, c-format
 msgid "unrecognized width:%s"
 msgstr "未能识别的宽度:%s"
 
-#: ref-filter.c:157
+#: ref-filter.c:267
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
 msgstr "未能识别的 %%(align) 参数:%s"
 
-#: ref-filter.c:161
+#: ref-filter.c:271
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "元素 %%(align) 需要一个正数的宽度"
+
+#: ref-filter.c:286
+#, c-format
+msgid "unrecognized %%(if) argument: %s"
+msgstr "未能识别的 %%(if) 参数:%s"
+
+#: ref-filter.c:371
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "非法的字段名:%.*s"
+
+#: ref-filter.c:397
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "未知的字段名:%.*s"
+
+#: ref-filter.c:501
+#, c-format
+msgid "format: %%(if) atom used without a %%(then) atom"
+msgstr "格式:使用了 %%(if) 元素而没有 %%(then) 元素"
+
+#: ref-filter.c:561
+#, c-format
+msgid "format: %%(then) atom used without an %%(if) atom"
+msgstr "格式:使用了 %%(then) 元素而没有 %%(if) 元素"
+
+#: ref-filter.c:563
+#, c-format
+msgid "format: %%(then) atom used more than once"
+msgstr "格式:%%(then) 元素用了多次"
+
+#: ref-filter.c:565
+#, c-format
+msgid "format: %%(then) atom used after %%(else)"
+msgstr "格式:%%(then) 元素用在了 %%(else) 之后"
+
+#: ref-filter.c:591
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "元素 %%(align) 需要一个正数的宽度"
+msgid "format: %%(else) atom used without an %%(if) atom"
+msgstr "格式:使用了 %%(else) 元素而没有 %%(if) 元素"
 
-#: ref-filter.c:244
+#: ref-filter.c:593
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "非法的字段名:%.*s"
+msgid "format: %%(else) atom used without a %%(then) atom"
+msgstr "格式:使用了 %%(else) 元素而没有 %%(then) 元素"
 
-#: ref-filter.c:270
+#: ref-filter.c:595
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "æ\9cªç\9f¥ç\9a\84å­\97段å\90\8dï¼\9a%.*s"
+msgid "format: %%(else) atom used more than once"
+msgstr "æ ¼å¼\8fï¼\9a%%(else) å\85\83ç´ ç\94¨äº\86å¤\9a次"
 
-#: ref-filter.c:372
+#: ref-filter.c:608
 #, c-format
 msgid "format: %%(end) atom used without corresponding atom"
 msgstr "格式:使用了 %%(end) 元素却没有它的对应元素"
 
-#: ref-filter.c:424
+#: ref-filter.c:663
 #, c-format
 msgid "malformed format string %s"
 msgstr "非法的格式化字符串 %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= 需要一个正整型参数"
+#: ref-filter.c:1247
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(非分支,正变基 %s)"
+
+#: ref-filter.c:1250
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(非分支,二分查找开始于 %s)"
 
-#: ref-filter.c:883
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: ref-filter.c:1256
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "引用 '%s' 未提供用于 :strip 的 %ld 个组件"
+msgid "(HEAD detached at %s)"
+msgstr "(头指针分离于 %s)"
 
-#: ref-filter.c:1046
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: ref-filter.c:1261
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "未知的 %.*s 格式 %s"
+msgid "(HEAD detached from %s)"
+msgstr "(头指针分离自 %s)"
+
+#: ref-filter.c:1265
+msgid "(no branch)"
+msgstr "(非分支)"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: ref-filter.c:1420 ref-filter.c:1451
 #, c-format
 msgid "missing object %s for %s"
 msgstr "缺失 %2$s 的对象 %1$s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: ref-filter.c:1423 ref-filter.c:1454
 #, c-format
 msgid "parse_object_buffer failed on %s for %s"
 msgstr "parse_object_buffer 失败于 %2$s 的 %1$s"
 
-#: ref-filter.c:1311
+#: ref-filter.c:1692
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "非法的对象于 '%s'"
 
-#: ref-filter.c:1373
+#: ref-filter.c:1759
 #, c-format
 msgid "ignoring ref with broken name %s"
 msgstr "忽略带有错误名称 %s 的引用"
 
-#: ref-filter.c:1378
+#: ref-filter.c:1764
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "忽略损坏的引用 %s"
 
-#: ref-filter.c:1651
+#: ref-filter.c:2028
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "格式:缺少 %%(end) 元素"
 
-#: ref-filter.c:1705
+#: ref-filter.c:2109
 #, c-format
 msgid "malformed object name %s"
 msgstr "非法的对象名 %s"
 
-#: remote.c:746
+#: remote.c:754
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "不能同时获取 %s 和 %s 至 %s"
 
-#: remote.c:750
+#: remote.c:758
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s 通常跟踪 %s,而非 %s"
 
-#: remote.c:754
+#: remote.c:762
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s 同时跟踪 %s 和 %s"
 
-#: remote.c:762
+#: remote.c:770
 msgid "Internal error"
 msgstr "内部错误"
 
-#: remote.c:1677 remote.c:1720
+#: remote.c:1685 remote.c:1787
 msgid "HEAD does not point to a branch"
 msgstr "HEAD 没有指向一个分支"
 
-#: remote.c:1686
+#: remote.c:1694
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "没有此分支:'%s'"
 
-#: remote.c:1689
+#: remote.c:1697
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "尚未给分支 '%s' 设置上游"
 
-#: remote.c:1695
+#: remote.c:1703
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
 
-#: remote.c:1710
+#: remote.c:1718
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr "推送目标 '%s' 至远程 '%s' 没有本地跟踪分支"
 
-#: remote.c:1725
+#: remote.c:1730
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "分支 '%s' 没有设置要推送的远程服务器"
 
-#: remote.c:1736
+#: remote.c:1741
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "向 '%s' 推送引用规格未包含 '%s'"
 
-#: remote.c:1749
+#: remote.c:1754
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "推送无目标(push.default 是 'nothing')"
 
-#: remote.c:1771
+#: remote.c:1776
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "无法解析 'simple' 推送至一个单独的目标"
 
-#: remote.c:2073
+#: remote.c:2081
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "您的分支基于 '%s',但此上游分支已经不存在。\n"
 
-#: remote.c:2077
+#: remote.c:2085
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (使用 \"git branch --unset-upstream\" 来修复)\n"
 
-#: remote.c:2080
+#: remote.c:2088
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "您的分支与上游分支 '%s' 一致。\n"
 
-#: remote.c:2084
+#: remote.c:2092
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
 msgstr[0] "您的分支领先 '%s' 共 %d 个提交。\n"
 msgstr[1] "您的分支领先 '%s' 共 %d 个提交。\n"
 
-#: remote.c:2090
+#: remote.c:2098
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (使用 \"git push\" 来发布您的本地提交)\n"
 
-#: remote.c:2093
+#: remote.c:2101
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1734,11 +2874,11 @@ msgstr[0] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n"
 msgstr[1] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:2101
+#: remote.c:2109
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (使用 \"git pull\" 来更新您的本地分支)\n"
 
-#: remote.c:2104
+#: remote.c:2112
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1754,2345 +2894,2257 @@ msgstr[1] ""
 "并且分别有 %d 和 %d 处不同的提交。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:2114
+#: remote.c:2122
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (使用 \"git pull\" 来合并远程分支)\n"
 
-#: revision.c:2132
+#: revision.c:2158
 msgid "your current branch appears to be broken"
 msgstr "您的当前分支好像被损坏"
 
-#: revision.c:2135
+#: revision.c:2161
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "您的当前分支 '%s' 尚无任何提交"
 
-#: revision.c:2329
+#: revision.c:2355
 msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent 与 --bisect 不兼容"
-
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "不能打开 /dev/null"
-
-#: run-command.c:94
-#, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "不能调用 dup2(%d,%d)"
-
-#: send-pack.c:298
-msgid "failed to sign the push certificate"
-msgstr "无法为推送证书签名"
-
-#: send-pack.c:411
-msgid "the receiving end does not support --signed push"
-msgstr "接收端不支持签名推送"
-
-#: send-pack.c:413
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr "未发送推送证书,因为接收端不支持签名推送"
-
-#: send-pack.c:425
-msgid "the receiving end does not support --atomic push"
-msgstr "接收端不支持原子推送"
-
-#: send-pack.c:430
-msgid "the receiving end does not support push options"
-msgstr "接收端不支持推送选项"
-
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"冲突解决完毕后,用 'git add <路径>' 或 'git rm <路径>'\n"
-"命令标记修正后的文件"
-
-#: sequencer.c:177
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'\n"
-"and commit the result with 'git commit'"
-msgstr ""
-"冲突解决完毕后,用 'git add <路径>' 或 'git rm <路径>'\n"
-"对修正后的文件做标记,然后用 'git commit' 提交"
-
-#: sequencer.c:190 sequencer.c:841 sequencer.c:924
-#, c-format
-msgid "Could not write to %s"
-msgstr "不能写入 %s"
-
-#: sequencer.c:193 sequencer.c:843 sequencer.c:928
-#, c-format
-msgid "Error wrapping up %s."
-msgstr "错误收尾 %s。"
-
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "您的本地修改将被拣选操作覆盖。"
-
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "您的本地修改将被还原操作覆盖。"
-
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "提交您的修改或保存进度后再继续。"
-
-#: sequencer.c:228
-#, c-format
-msgid "%s: fast-forward"
-msgstr "%s:快进"
-
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:303
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s:无法写入新索引文件"
-
-#: sequencer.c:321
-msgid "Could not resolve HEAD commit\n"
-msgstr "不能解析 HEAD 提交\n"
-
-#: sequencer.c:341
-msgid "Unable to update cache tree\n"
-msgstr "不能更新缓存\n"
-
-#: sequencer.c:393
-#, c-format
-msgid "Could not parse commit %s\n"
-msgstr "不能解析提交 %s\n"
-
-#: sequencer.c:398
-#, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "不能解析父提交 %s\n"
-
-#: sequencer.c:463
-msgid "Your index file is unmerged."
-msgstr "您的索引文件未完成合并。"
-
-#: sequencer.c:482
-#, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "提交 %s 是一个合并提交但未提供 -m 选项。"
-
-#: sequencer.c:490
-#, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "提交 %s 没有父提交 %d"
-
-#: sequencer.c:494
-#, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "指定了主线但提交 %s 不是一个合并。"
-
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:507
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s:不能解析父提交 %s"
-
-#: sequencer.c:511
-#, c-format
-msgid "Cannot get commit message for %s"
-msgstr "不能得到 %s 的提交说明"
-
-#: sequencer.c:597
-#, c-format
-msgid "could not revert %s... %s"
-msgstr "不能还原 %s... %s"
-
-#: sequencer.c:598
-#, c-format
-msgid "could not apply %s... %s"
-msgstr "不能应用 %s... %s"
-
-#: sequencer.c:633
-msgid "empty commit set passed"
-msgstr "提供了空的提交集"
-
-#: sequencer.c:641
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s:无法读取索引"
-
-#: sequencer.c:645
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s:无法刷新索引"
-
-#: sequencer.c:705
-msgid "Cannot revert during another revert."
-msgstr "不能在回退中执行另一回退。"
-
-#: sequencer.c:706
-msgid "Cannot revert during a cherry-pick."
-msgstr "不能在拣选中执行回退。"
-
-#: sequencer.c:709
-msgid "Cannot cherry-pick during a revert."
-msgstr "不能在回退中执行拣选。"
-
-#: sequencer.c:710
-msgid "Cannot cherry-pick during another cherry-pick."
-msgstr "不能在拣选过程中执行另一拣选。"
-
-#: sequencer.c:732
-#, c-format
-msgid "Could not parse line %d."
-msgstr "不能解析第 %d 行。"
-
-#: sequencer.c:737
-msgid "No commits parsed."
-msgstr "没有提交被解析。"
-
-#: sequencer.c:749
-#, c-format
-msgid "Could not open %s"
-msgstr "不能打开 %s"
-
-#: sequencer.c:753
-#, c-format
-msgid "Could not read %s."
-msgstr "不能读取 %s。"
-
-#: sequencer.c:760
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "无用的指令表单:%s"
-
-#: sequencer.c:790
-#, c-format
-msgid "Invalid key: %s"
-msgstr "无效键名:%s"
-
-#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52
-#, c-format
-msgid "Invalid value for %s: %s"
-msgstr "%s 的值无效:%s"
-
-#: sequencer.c:803
-#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "非法的选项表单:%s"
-
-#: sequencer.c:822
-msgid "a cherry-pick or revert is already in progress"
-msgstr "一个拣选或还原操作已在进行"
-
-#: sequencer.c:823
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "尝试 \"git cherry-pick (--continue | --quit | --abort)\""
-
-#: sequencer.c:827
-#, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "不能创建序列目录 %s"
-
-#: sequencer.c:862 sequencer.c:998
-msgid "no cherry-pick or revert in progress"
-msgstr "拣选或还原操作并未进行"
-
-#: sequencer.c:864
-msgid "cannot resolve HEAD"
-msgstr "不能解析 HEAD"
-
-#: sequencer.c:866 sequencer.c:900
-msgid "cannot abort from a branch yet to be born"
-msgstr "不能从尚未建立的分支终止"
-
-#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970
-#, c-format
-msgid "cannot open %s"
-msgstr "不能打开 %s"
-
-#: sequencer.c:888
-#, c-format
-msgid "cannot read %s: %s"
-msgstr "不能读取 %s:%s"
-
-#: sequencer.c:889
-msgid "unexpected end of file"
-msgstr "意外的文件结束"
-
-#: sequencer.c:895
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏"
-
-#: sequencer.c:921
-#, c-format
-msgid "Could not format %s."
-msgstr "不能格式化 %s。"
-
-#: sequencer.c:1066
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s:不能拣选一个%s"
-
-#: sequencer.c:1069
-#, c-format
-msgid "%s: bad revision"
-msgstr "%s:错误的版本"
-
-#: sequencer.c:1102
-msgid "Can't revert as initial commit"
-msgstr "不能作为初始提交还原"
-
-#: setup.c:160
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-"%s:工作区中无此路径。\n"
-"使用命令 'git <command> -- <path>...' 来指定本地不存在的路径。"
-
-#: setup.c:173
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"有歧义的参数 '%s':未知的版本或路径不存在于工作区中。\n"
-"使用 '--' 来分隔版本和路径,例如:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-
-#: setup.c:223
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-"有歧义的参数 '%s':可同时是版本和文件\n"
-"使用 '--' 来分隔版本和路径,例如:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-
-#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
-#, c-format
-msgid "failed to read %s"
-msgstr "无法读取 %s"
-
-#: setup.c:468
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr "期望 git 仓库版本 <= %d,却得到 %d"
-
-#: setup.c:476
-msgid "unknown repository extensions found:"
-msgstr "发现未知的仓库扩展:"
-
-#: setup.c:762
-#, c-format
-msgid "Not a git repository (or any of the parent directories): %s"
-msgstr "不是一个 git 仓库(或者任何父目录):%s"
-
-#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
-msgid "Cannot come back to cwd"
-msgstr "无法返回当前工作目录"
-
-#: setup.c:845
-msgid "Unable to read current working directory"
-msgstr "不能读取当前工作目录"
-
-#: setup.c:920
-#, c-format
-msgid ""
-"Not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-"不是一个 git 仓库(或者向上递归至挂载点 %s 的任何祖先目录)\n"
-"停止在文件系统边界(未设置 GIT_DISCOVERY_ACROSS_FILESYSTEM)。"
+msgstr "--first-parent 与 --bisect 不兼容"
 
-#: setup.c:927
-#, c-format
-msgid "Cannot change to '%s/..'"
-msgstr "不能切换到 '%s/..'"
+#: run-command.c:125
+msgid "open /dev/null failed"
+msgstr "不能打开 /dev/null"
 
-#: setup.c:989
+#: run-command.c:127
 #, c-format
-msgid ""
-"Problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-"参数 core.sharedRepository 的文件权限值有错(0%.3o)。\n"
-"文件属主必须始终拥有读写权限。"
-
-#: sha1_file.c:1046
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "偏移量在包文件结束之前(损坏的 .idx?)"
+msgid "dup2(%d,%d) failed"
+msgstr "不能调用 dup2(%d,%d)"
 
-#: sha1_file.c:2434
+#: send-pack.c:150
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "偏移量在 %s 的包索引开始之前(损坏的索引?)"
+msgid "unable to parse remote unpack status: %s"
+msgstr "不能解析远程解包状态:%s"
 
-#: sha1_file.c:2438
+#: send-pack.c:152
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "偏移量越过了 %s 的包索引的结尾(被截断的索引?)"
+msgid "remote unpack failed: %s"
+msgstr "远程解包失败:%s"
 
-#: sha1_name.c:462
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-"Git 通常不会创建一个以40位十六进制字符命名的引用,因为当你提供40位\n"
-"十六进制字符时将被忽略。不过这些引用也可能被错误地创建。例如:\n"
-"\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
-"\n"
-"当 \"$br\" 空白时一个40位十六进制的引用将被创建。请检查这些引用,\n"
-"可能需要删除它们。用 \"git config advice.objectNameWarning false\"\n"
-"命令关闭本消息通知。"
+#: send-pack.c:315
+msgid "failed to sign the push certificate"
+msgstr "无法为推送证书签名"
 
-#: submodule.c:64 submodule.c:98
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr "æ\97 æ³\95ä¿®æ\94¹æ\9cªå\90\88并ç\9a\84 .gitmodulesï¼\8cå\85\88解å\86³å\90\88并å\86²çª\81"
+#: send-pack.c:428
+msgid "the receiving end does not support --signed push"
+msgstr "æ\8e¥æ\94¶ç«¯ä¸\8dæ\94¯æ\8c\81ç­¾å\90\8dæ\8e¨é\80\81"
 
-#: submodule.c:68 submodule.c:102
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "无法在 .gitmodules 中找到 path=%s 的小节"
+#: send-pack.c:430
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr "未发送推送证书,因为接收端不支持签名推送"
 
-#: submodule.c:76
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "不能更新 .gitmodules 条目 %s"
+#: send-pack.c:442
+msgid "the receiving end does not support --atomic push"
+msgstr "接收端不支持原子推送"
 
-#: submodule.c:109
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "无法移除 %s 的 .gitmodules 条目"
+#: send-pack.c:447
+msgid "the receiving end does not support push options"
+msgstr "接收端不支持推送选项"
 
-#: submodule.c:120
-msgid "staging updated .gitmodules failed"
-msgstr "将更新后 .gitmodules 添加暂存区失败"
+#: sequencer.c:215
+msgid "revert"
+msgstr "还原"
 
-#: submodule.c:177
-msgid "negative values not allowed for submodule.fetchJobs"
-msgstr "submodule.fetchJobs 不允许为负值"
+#: sequencer.c:217
+msgid "cherry-pick"
+msgstr "拣选"
 
-#: submodule-config.c:358
-#, c-format
-msgid "invalid value for %s"
-msgstr "%s 的值无效"
+#: sequencer.c:219
+msgid "rebase -i"
+msgstr "rebase -i"
 
-#: trailer.c:237
+#: sequencer.c:221
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "æ\89§è¡\8c trailer å\91½ä»¤ '%s' å¤±è´¥"
+msgid "Unknown action: %d"
+msgstr "æ\9cªç\9f¥å\8a¨ä½\9cï¼\9a%d"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "键 '%2$s' 的未知取值 '%1$s'"
+#: sequencer.c:278
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"冲突解决完毕后,用 'git add <路径>' 或 'git rm <路径>'\n"
+"命令标记修正后的文件"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "多于一个 %s"
+#: sequencer.c:281
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"冲突解决完毕后,用 'git add <路径>' 或 'git rm <路径>'\n"
+"对修正后的文件做标记,然后用 'git commit' 提交"
 
-#: trailer.c:582
+#: sequencer.c:294 sequencer.c:1682
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "签名 '%.*s' 的键为空"
+msgid "could not lock '%s'"
+msgstr "不能锁定 '%s'"
 
-#: trailer.c:702
+#: sequencer.c:297 sequencer.c:1560 sequencer.c:1687 sequencer.c:1701
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "不能读取输入文件 '%s'"
+msgid "could not write to '%s'"
+msgstr "不能写入 '%s'"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "不能自标准输入读取"
+#: sequencer.c:301
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "不能将换行符写入 '%s'"
 
-#: trailer.c:857 builtin/am.c:42
+#: sequencer.c:305 sequencer.c:1565 sequencer.c:1689
 #, c-format
-msgid "could not stat %s"
-msgstr "不能获取 %s 的文件状态"
+msgid "failed to finalize '%s'."
+msgstr "无法完成 '%s'。"
 
-#: trailer.c:859
+#: sequencer.c:329 sequencer.c:814 sequencer.c:1586 builtin/am.c:257
+#: builtin/commit.c:749 builtin/merge.c:1018
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "文件 %s 不是一个正规文件"
+msgid "could not read '%s'"
+msgstr "不能读取 '%s'"
 
-#: trailer.c:861
+#: sequencer.c:355
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "æ\96\87件 %s ç\94¨æ\88·ä¸\8då\8f¯å\86\99"
+msgid "your local changes would be overwritten by %s."
+msgstr "æ\82¨ç\9a\84æ\9c¬å\9c°ä¿®æ\94¹å°\86被%sè¦\86ç\9b\96ã\80\82"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "不能打开临时文件"
+#: sequencer.c:359
+msgid "commit your changes or stash them to proceed."
+msgstr "提交您的修改或保存进度后再继续。"
 
-#: trailer.c:912
+#: sequencer.c:388
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "不能重命名临时文件为 %s"
+msgid "%s: fast-forward"
+msgstr "%s:快进"
 
-#: transport.c:62
+#. TRANSLATORS: %s will be "revert", "cherry-pick" or
+#. * "rebase -i".
+#.
+#: sequencer.c:470
 #, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "将要设置 '%1$s' 的上游为 '%3$s' 的 '%2$s'\n"
+msgid "%s: Unable to write new index file"
+msgstr "%s:无法写入新索引文件"
 
-#: transport.c:151
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr "传输:无效的深度选项 '%s'"
+#: sequencer.c:489
+msgid "could not resolve HEAD commit\n"
+msgstr "不能解析 HEAD 提交\n"
 
-#: transport.c:771
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr "下列子模组路径所包含的修改在任何远程源中都找不到:\n"
+#: sequencer.c:509
+msgid "unable to update cache tree\n"
+msgstr "不能更新缓存树\n"
 
-#: transport.c:775
+#: sequencer.c:592
 #, c-format
 msgid ""
+"you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
 "\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"  git commit --amend %s\n"
 "\n"
-"or cd to the path and use\n"
+"If they are meant to go into a new commit, run:\n"
 "\n"
-"\tgit push\n"
+"  git commit %s\n"
 "\n"
-"to push them to a remote.\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
+"  git rebase --continue\n"
 msgstr ""
+"您的工作区中存在已暂存的修改\n"
+"如果这些修改需要被并入前一个提交,执行:\n"
 "\n"
-"请尝试\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
+"  git commit --amend %s\n"
 "\n"
-"或者进入到子目录执行\n"
+"如果这些修改要形成一个新提交,执行:\n"
 "\n"
-"\tgit push\n"
+"  git commit %s\n"
 "\n"
-"以推送至远程。\n"
+"无论哪种情况,当您完成提交,继续执行:\n"
 "\n"
+"  git rebase --continue\n"
 
-#: transport.c:783
-msgid "Aborting."
-msgstr "正在终止。"
-
-#: transport-helper.c:1041
-#, c-format
-msgid "Could not read ref %s"
-msgstr "不能读取引用 %s"
-
-#: unpack-trees.c:64
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-"您对下列文件的本地修改将被检出操作覆盖:\n"
-"%%s请在切换分支前提交您的修改或者保存进度。"
-
-#: unpack-trees.c:66
+#: sequencer.c:694
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-"您对下列文件的本地修改将被检出操作覆盖:\n"
-"%%s"
+msgid "could not parse commit %s\n"
+msgstr "不能解析提交 %s\n"
 
-#: unpack-trees.c:69
+#: sequencer.c:699
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-"您对下列文件的本地修改将被合并操作覆盖:\n"
-"%%s请在合并前提交您的修改或者保存进度。"
+msgid "could not parse parent commit %s\n"
+msgstr "不能解析父提交 %s\n"
 
-#: unpack-trees.c:71
+#: sequencer.c:821
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
+"unexpected 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"您对下列文件的本地修改将被合并操作覆盖:\n"
-"%%s"
+"意外的压缩提交首行提交信息:\n"
+"\n"
+"\t%.*s"
 
-#: unpack-trees.c:74
+#: sequencer.c:827
 #, c-format
 msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
+"invalid 1st line of squash message:\n"
+"\n"
+"\t%.*s"
 msgstr ""
-"您对下列文件的本地修改将被 %s 覆盖:\n"
-"%%s请在 %s 之前提交您的修改或者保存进度。"
+"压缩提交的首行提交信息无效:\n"
+"\n"
+"\t%.*s"
 
-#: unpack-trees.c:76
+#: sequencer.c:833 sequencer.c:858
 #, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"您对下列文件的本地修改将被 %s 覆盖:\n"
-"%%s"
+msgid "This is a combination of %d commits."
+msgstr "这是一个 %d 个提交的组合。"
 
-#: unpack-trees.c:81
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in it:\n"
-"%s"
-msgstr ""
-"更新如下目录将会丢失其中未跟踪的文件:\n"
-"%s"
+#: sequencer.c:842
+msgid "need a HEAD to fixup"
+msgstr "需要一个 HEAD 来修复"
 
-#: unpack-trees.c:85
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"工作区中下列未跟踪的文件将会因为检出操作而被删除:\n"
-"%%s请在切换分支之前移动或删除。"
+#: sequencer.c:844
+msgid "could not read HEAD"
+msgstr "不能读取 HEAD"
 
-#: unpack-trees.c:87
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-"工作区中下列未跟踪的文件将会因为检出操作而被删除:\n"
-"%%s"
+#: sequencer.c:846
+msgid "could not read HEAD's commit message"
+msgstr "不能读取 HEAD 的提交说明"
 
-#: unpack-trees.c:90
+#: sequencer.c:852
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"工作区中下列未跟踪的文件将会因为合并操作而被删除:\n"
-"%%s请在合并前移动或删除。"
+msgid "cannot write '%s'"
+msgstr "不能写 '%s'"
 
-#: unpack-trees.c:92
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-"工作区中下列未跟踪的文件将会因为合并操作而被删除:\n"
-"%%s"
+#: sequencer.c:861 git-rebase--interactive.sh:445
+msgid "This is the 1st commit message:"
+msgstr "这是第一个提交说明:"
 
-#: unpack-trees.c:95
+#: sequencer.c:869
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"工作区中下列未跟踪的文件将会因为 %s 操作而被删除:\n"
-"%%s请在 %s 前移动或删除。"
+msgid "could not read commit message of %s"
+msgstr "不能读取 %s 的提交说明"
 
-#: unpack-trees.c:97
+#: sequencer.c:876
 #, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-"工作区中下列未跟踪的文件将会因为 %s 操作而被删除:\n"
-"%%s"
+msgid "This is the commit message #%d:"
+msgstr "这是提交说明 #%d:"
 
-#: unpack-trees.c:102
+#: sequencer.c:881
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-"工作区中下列未跟踪的文件将会因为检出操作而被覆盖:\n"
-"%%s请在切换分支前移动或删除。"
+msgid "The commit message #%d will be skipped:"
+msgstr "提交说明 #%d 将被跳过:"
 
-#: unpack-trees.c:104
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-"工作区中下列未跟踪的文件将会因为检出操作而被覆盖:\n"
-"%%s"
+#: sequencer.c:886
+#, c-format
+msgid "unknown command: %d"
+msgstr "未知命令:%d"
+
+#: sequencer.c:952
+msgid "your index file is unmerged."
+msgstr "您的索引文件未完成合并。"
 
-#: unpack-trees.c:107
+#: sequencer.c:970
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-"工作区中下列未跟踪的文件将会因为合并操作而被覆盖:\n"
-"%%s请在合并前移动或删除。"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "提交 %s 是一个合并提交但未提供 -m 选项。"
 
-#: unpack-trees.c:109
+#: sequencer.c:978
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-"工作区中下列未跟踪的文件将会因为合并操作而被覆盖:\n"
-"%%s"
+msgid "commit %s does not have parent %d"
+msgstr "提交 %s 没有第 %d 个父提交"
 
-#: unpack-trees.c:112
+#: sequencer.c:982
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-"工作区中下列未跟踪的文件将会因为 %s 操作而被覆盖:\n"
-"%%s请在 %s 前移动或删除。"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "指定了主线,但是提交 %s 不是一个合并提交。"
 
-#: unpack-trees.c:114
+#: sequencer.c:988
 #, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-"工作区中下列未跟踪的文件将会因为 %s 操作而被覆盖:\n"
-"%%s"
+msgid "cannot get commit message for %s"
+msgstr "不能得到 %s 的提交说明"
 
-#: unpack-trees.c:121
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:1009
 #, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr "条目 '%s' 和 '%s' 重叠。无法合并。"
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s:不能解析父提交 %s"
 
-#: unpack-trees.c:124
+#: sequencer.c:1071 sequencer.c:1827
 #, c-format
-msgid ""
-"Cannot update sparse checkout: the following entries are not up-to-date:\n"
-"%s"
-msgstr ""
-"无法更新稀疏检出:如下条目不是最新:\n"
-"%s"
+msgid "could not rename '%s' to '%s'"
+msgstr "不能将 '%s' 重命名为 '%s'"
 
-#: unpack-trees.c:126
+#: sequencer.c:1122
 #, c-format
-msgid ""
-"The following Working tree files would be overwritten by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"工作区中下列文件将会因为稀疏检出而被覆盖:\n"
-"%s"
+msgid "could not revert %s... %s"
+msgstr "不能还原 %s... %s"
 
-#: unpack-trees.c:128
+#: sequencer.c:1123
 #, c-format
-msgid ""
-"The following Working tree files would be removed by sparse checkout "
-"update:\n"
-"%s"
-msgstr ""
-"工作区中下列文件将会因为稀疏检出而被删除:\n"
-"%s"
+msgid "could not apply %s... %s"
+msgstr "不能应用 %s... %s"
 
-#: unpack-trees.c:205
+#: sequencer.c:1165
+msgid "empty commit set passed"
+msgstr "提供了空的提交集"
+
+#: sequencer.c:1175
 #, c-format
-msgid "Aborting\n"
-msgstr "终止中\n"
+msgid "git %s: failed to read the index"
+msgstr "git %s:无法读取索引"
 
-#: unpack-trees.c:237
-msgid "Checking out files"
-msgstr "正在检出文件"
+#: sequencer.c:1182
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s:无法刷新索引"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "无效的 URL 方案名称或丢失 '://' 后缀"
+#: sequencer.c:1303
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "无效行 %d:%.*s"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:1311
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "æ\97 æ\95\88ç\9a\84 %XX è½¬ä¹\89åº\8få\88\97"
+msgid "cannot '%s' without a previous commit"
+msgstr "没æ\9c\89ç\88¶æ\8f\90交ç\9a\84æ\83\85å\86µä¸\8bä¸\8dè\83½ '%s'"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "缺失主机名且 URL 方案不是 'file:'"
+#: sequencer.c:1344
+#, c-format
+msgid "could not read '%s'."
+msgstr "不能读取 '%s'。"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "一个 'file:' URL 不应该包含端口号"
+#: sequencer.c:1356
+msgid "please fix this using 'git rebase --edit-todo'."
+msgstr "请用 'git rebase --edit-todo' 来修改。"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "主机名中包含无效的字符"
+#: sequencer.c:1358
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "不可用的指令清单:'%s'"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "æ\97 æ\95\88ç\9a\84端å\8f£å\8f·"
+#: sequencer.c:1363
+msgid "no commits parsed."
+msgstr "没æ\9c\89解æ\9e\90æ\8f\90交ã\80\82"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "无效的 '..' 路径片段"
+#: sequencer.c:1374
+msgid "cannot cherry-pick during a revert."
+msgstr "不能在回退中执行拣选。"
 
-#: worktree.c:282
-#, c-format
-msgid "failed to read '%s'"
-msgstr "无法读取 '%s'"
+#: sequencer.c:1376
+msgid "cannot revert during a cherry-pick."
+msgstr "不能在拣选中执行回退。"
 
-#: wrapper.c:222 wrapper.c:392
+#: sequencer.c:1439
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "æ\97 æ³\95æ\89\93å¼\80 '%s' è¿\9bè¡\8c读å\86\99"
+msgid "invalid key: %s"
+msgstr "æ\97 æ\95\88é\94®å\90\8dï¼\9a%s"
 
-#: wrapper.c:224 wrapper.c:394 builtin/am.c:778
+#: sequencer.c:1442
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "无法打开 '%s' 进行写入"
+msgid "invalid value for %s: %s"
+msgstr "%s 的值无效:%s"
 
-#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
-#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029
-#: builtin/pull.c:407
+#: sequencer.c:1499
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "无法打开 '%s' 进行读取"
+msgid "malformed options sheet: '%s'"
+msgstr "非法的选项清单:'%s'"
+
+#: sequencer.c:1537
+msgid "a cherry-pick or revert is already in progress"
+msgstr "一个拣选或还原操作已在进行"
+
+#: sequencer.c:1538
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "尝试 \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: wrapper.c:605 wrapper.c:626
+#: sequencer.c:1541
 #, c-format
-msgid "unable to access '%s'"
-msgstr "不能访问 '%s'"
+msgid "could not create sequencer directory '%s'"
+msgstr "不能创建序列目录 '%s'"
 
-#: wrapper.c:634
-msgid "unable to get current working directory"
-msgstr "不能获取当前工作目录"
+#: sequencer.c:1555
+msgid "could not lock HEAD"
+msgstr "不能锁定 HEAD"
+
+#: sequencer.c:1611 sequencer.c:2181
+msgid "no cherry-pick or revert in progress"
+msgstr "拣选或还原操作并未进行"
+
+#: sequencer.c:1613
+msgid "cannot resolve HEAD"
+msgstr "不能解析 HEAD"
 
-#: wrapper.c:658
+#: sequencer.c:1615 sequencer.c:1649
+msgid "cannot abort from a branch yet to be born"
+msgstr "不能从尚未建立的分支终止"
+
+#: sequencer.c:1635 builtin/grep.c:910
 #, c-format
-msgid "could not write to %s"
-msgstr "不能写入 %s"
+msgid "cannot open '%s'"
+msgstr "不能打开 '%s'"
 
-#: wrapper.c:660
+#: sequencer.c:1637
 #, c-format
-msgid "could not close %s"
-msgstr "不能关闭 %s"
+msgid "cannot read '%s': %s"
+msgstr "不能读取 '%s':%s"
 
-#: wt-status.c:150
-msgid "Unmerged paths:"
-msgstr "æ\9cªå\90\88并ç\9a\84è·¯å¾\84ï¼\9a"
+#: sequencer.c:1638
+msgid "unexpected end of file"
+msgstr "æ\84\8få¤\96ç\9a\84æ\96\87件ç»\93æ\9d\9f"
 
-#  译者:注意保持前导空格
-#: wt-status.c:177 wt-status.c:204
+#: sequencer.c:1644
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (使用 \"git reset %s <文件>...\" 以取消暂存)"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏"
 
-#  译者:注意保持前导空格
-#: wt-status.c:179 wt-status.c:206
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (使用 \"git rm --cached <文件>...\" 以取消暂存)"
+#: sequencer.c:1655
+msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
+msgstr "您好像移动了 HEAD。未能回退,检查您的 HEAD!"
 
-#  译者:注意保持前导空格
-#: wt-status.c:183
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (使用 \"git add <文件>...\" 标记解决方案)"
+#: sequencer.c:1792 sequencer.c:2080
+msgid "cannot read HEAD"
+msgstr "不能读取 HEAD"
 
-#  译者:注意保持前导空格
-#: wt-status.c:185 wt-status.c:189
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (酌情使用 \"git add/rm <文件>...\" 标记解决方案)"
+#: sequencer.c:1832 builtin/difftool.c:616
+#, c-format
+msgid "could not copy '%s' to '%s'"
+msgstr "不能拷贝 '%s' 至 '%s'"
+
+#: sequencer.c:1848
+msgid "could not read index"
+msgstr "不能读取索引"
 
 #  译者:注意保持前导空格
-#: wt-status.c:187
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (使用 \"git rm <文件>...\" 标记解决方案)"
+#: sequencer.c:1853
+#, c-format
+msgid ""
+"execution failed: %s\n"
+"%sYou can fix the problem, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"执行失败:%s\n"
+"%s您可以改正该问题,然后运行\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#: wt-status.c:198 wt-status.c:882
-msgid "Changes to be committed:"
-msgstr "要提交的变更:"
+#: sequencer.c:1859
+msgid "and made changes to the index and/or the working tree\n"
+msgstr "并且修改索引和/或工作区\n"
 
-#: wt-status.c:216 wt-status.c:891
-msgid "Changes not staged for commit:"
-msgstr "尚未暂存以备提交的变更:"
+#: sequencer.c:1865
+#, c-format
+msgid ""
+"execution succeeded: %s\n"
+"but left changes to the index and/or the working tree\n"
+"Commit or stash your changes, and then run\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
+msgstr ""
+"执行成功:%s\n"
+"但是在索引和/或工作区中存在变更\n"
+"提交或暂存修改,然后运行\n"
+"\n"
+"  git rebase --continue\n"
+"\n"
 
-#  译者:注意保持前导空格
-#: wt-status.c:220
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (使用 \"git add <文件>...\" 更新要提交的内容)"
+#: sequencer.c:1920 git-rebase.sh:169
+#, c-format
+msgid "Applied autostash."
+msgstr "成功应用 autostash。"
 
-#  译者:注意保持前导空格
-#: wt-status.c:222
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (使用 \"git add/rm <文件>...\" 更新要提交的内容)"
+#: sequencer.c:1932
+#, c-format
+msgid "cannot store %s"
+msgstr "不能存储 %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:223
+#: sequencer.c:1934 git-rebase.sh:173
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
-msgstr "  (使用 \"git checkout -- <文件>...\" 丢弃工作区的改动)"
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"应用 autostash 导致冲突。\n"
+"您的修改安全地保存在 stash 中。\n"
+"您可以在任何时候运行 \"git stash pop\" 或 \"git stash drop\"。\n"
 
-#  译者:注意保持前导空格
-#: wt-status.c:225
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr "  (提交或丢弃子模组中未跟踪或修改的内容)"
+#: sequencer.c:2016
+#, c-format
+msgid "Stopped at %s...  %.*s\n"
+msgstr "停止在 %s... %.*s\n"
 
-#  译者:注意保持前导空格
-#: wt-status.c:237
+#: sequencer.c:2058
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (使用 \"git %s <文件>...\" 以包含要提交的内容)"
+msgid "unknown command %d"
+msgstr "未知命令 %d"
 
-#: wt-status.c:252
-msgid "both deleted:"
-msgstr "双方删除:"
+#: sequencer.c:2088
+msgid "could not read orig-head"
+msgstr "不能读取 orig-head"
 
-#: wt-status.c:254
-msgid "added by us:"
-msgstr "由我们添加:"
+#: sequencer.c:2092
+msgid "could not read 'onto'"
+msgstr "不能读取 'onto'"
 
-#: wt-status.c:256
-msgid "deleted by them:"
-msgstr "由他们删除:"
+#: sequencer.c:2099
+#, c-format
+msgid "could not update %s"
+msgstr "不能更新 %s"
 
-#: wt-status.c:258
-msgid "added by them:"
-msgstr "由他们添加:"
+#: sequencer.c:2106
+#, c-format
+msgid "could not update HEAD to %s"
+msgstr "不能更新 HEAD 为 %s"
 
-#: wt-status.c:260
-msgid "deleted by us:"
-msgstr "由我们删除:"
+#: sequencer.c:2190
+msgid "cannot rebase: You have unstaged changes."
+msgstr "不能变基:您有未暂存的变更。"
 
-#: wt-status.c:262
-msgid "both added:"
-msgstr "双方添加:"
+#: sequencer.c:2195
+msgid "could not remove CHERRY_PICK_HEAD"
+msgstr "不能删除 CHERRY_PICK_HEAD"
 
-#: wt-status.c:264
-msgid "both modified:"
-msgstr "双方修改:"
+#: sequencer.c:2204
+msgid "cannot amend non-existing commit"
+msgstr "不能修补不存在的提交"
 
-#: wt-status.c:274
-msgid "new file:"
-msgstr "新文件:"
+#: sequencer.c:2206
+#, c-format
+msgid "invalid file: '%s'"
+msgstr "无效文件:'%s'"
 
-#: wt-status.c:276
-msgid "copied:"
-msgstr "拷贝:"
+#: sequencer.c:2208
+#, c-format
+msgid "invalid contents: '%s'"
+msgstr "无效内容:'%s'"
 
-#: wt-status.c:278
-msgid "deleted:"
-msgstr "删除:"
+#: sequencer.c:2211
+msgid ""
+"\n"
+"You have uncommitted changes in your working tree. Please, commit them\n"
+"first and then run 'git rebase --continue' again."
+msgstr ""
+"\n"
+"您的工作区中有未提交的变更。请先提交然后再次运行 'git rebase --continue'。"
 
-#: wt-status.c:280
-msgid "modified:"
-msgstr "ä¿®æ\94¹ï¼\9a"
+#: sequencer.c:2221
+msgid "could not commit staged changes."
+msgstr "ä¸\8dè\83½æ\8f\90交æ\9a\82å­\98ç\9a\84ä¿®æ\94¹ã\80\82"
 
-#: wt-status.c:282
-msgid "renamed:"
-msgstr "重命名:"
+#: sequencer.c:2301
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s:不能拣选一个%s"
+
+#: sequencer.c:2305
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s:错误的版本"
+
+#: sequencer.c:2338
+msgid "can't revert as initial commit"
+msgstr "不能作为初始提交回退"
+
+#: setup.c:165
+#, c-format
+msgid ""
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
+msgstr ""
+"%s:工作区中无此路径。\n"
+"使用命令 'git <command> -- <path>...' 来指定本地不存在的路径。"
 
-#: wt-status.c:284
-msgid "typechange:"
-msgstr "类型变更:"
+#: setup.c:178
+#, c-format
+msgid ""
+"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"有歧义的参数 '%s':未知的版本或路径不存在于工作区中。\n"
+"使用 '--' 来分隔版本和路径,例如:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 
-#: wt-status.c:286
-msgid "unknown:"
-msgstr "未知:"
+#: setup.c:228
+#, c-format
+msgid ""
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
+msgstr ""
+"有歧义的参数 '%s':可同时是版本和文件\n"
+"使用 '--' 来分隔版本和路径,例如:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 
-#: wt-status.c:288
-msgid "unmerged:"
-msgstr "未合并:"
+#: setup.c:475
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "期望 git 仓库版本 <= %d,却得到 %d"
 
-#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:370
-msgid "new commits, "
-msgstr "新提交, "
+#: setup.c:483
+msgid "unknown repository extensions found:"
+msgstr "发现未知的仓库扩展:"
 
-#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:372
-msgid "modified content, "
-msgstr "ä¿®æ\94¹ç\9a\84å\86\85容, "
+#: setup.c:776
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "ä¸\8dæ\98¯ä¸\80个 git ä»\93åº\93ï¼\88æ\88\96è\80\85ä»»ä½\95ç\88¶ç\9b®å½\95ï¼\89ï¼\9a%s"
 
-#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:374
-msgid "untracked content, "
-msgstr "未跟踪的内容, "
+#: setup.c:778 builtin/index-pack.c:1646
+msgid "Cannot come back to cwd"
+msgstr "无法返回当前工作目录"
 
-#: wt-status.c:756
-msgid "Submodules changed but not updated:"
-msgstr "子模组已修改但尚未更新:"
+#: setup.c:1010
+msgid "Unable to read current working directory"
+msgstr "不能读取当前工作目录"
 
-#: wt-status.c:758
-msgid "Submodule changes to be committed:"
-msgstr "要提交的子模组变更:"
+#: setup.c:1022 setup.c:1028
+#, c-format
+msgid "Cannot change to '%s'"
+msgstr "不能切换到 '%s'"
 
-#: wt-status.c:839
+#: setup.c:1041
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
 msgstr ""
-"不要改动上面的一行。\n"
-"下面的所有内容均将被删除。"
-
-#: wt-status.c:950
-msgid "You have unmerged paths."
-msgstr "您有尚未合并的路径。"
-
-#  译者:注意保持前导空格
-#: wt-status.c:953
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (解决冲突并运行 \"git commit\")"
-
-#  译者:注意保持前导空格
-#: wt-status.c:955
-msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (使用 \"git merge --abort\" 终止合并)"
+"不是一个 git 仓库(或者向上递归至挂载点 %s 的任何祖先目录)\n"
+"停止在文件系统边界(未设置 GIT_DISCOVERY_ACROSS_FILESYSTEM)。"
 
-#: wt-status.c:960
-msgid "All conflicts fixed but you are still merging."
-msgstr "所有冲突已解决但您仍处于合并中。"
+#: setup.c:1106
+#, c-format
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
+msgstr ""
+"参数 core.sharedRepository 的文件权限值有错(0%.3o)。\n"
+"文件属主必须始终拥有读写权限。"
 
-#  译者:注意保持前导空格
-#: wt-status.c:963
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (使用 \"git commit\" 结束合并)"
+#: sha1_file.c:559
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "路径 '%s' 不存在"
 
-#: wt-status.c:973
-msgid "You are in the middle of an am session."
-msgstr "您正处于 am 操作过程中。"
+#: sha1_file.c:585
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "尚不支持将参考仓库 '%s' 作为一个链接检出。"
 
-#: wt-status.c:976
-msgid "The current patch is empty."
-msgstr "当前的补丁为空。"
+#: sha1_file.c:591
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "参考仓库 '%s' 不是一个本地仓库。"
 
-#  译者:注意保持前导空格
-#: wt-status.c:980
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (解决冲突,然后运行 \"git am --continue\")"
+#: sha1_file.c:597
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "参考仓库 '%s' 是一个浅克隆"
 
-#  译者:注意保持前导空格
-#: wt-status.c:982
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (使用 \"git am --skip\" 跳过此补丁)"
+#: sha1_file.c:605
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "参考仓库 '%s' 已被嫁接"
 
-#  译者:注意保持前导空格
-#: wt-status.c:984
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (使用 \"git am --abort\" 恢复原有分支)"
+#: sha1_file.c:1245
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "偏移量在包文件结束之前(损坏的 .idx?)"
 
-#: wt-status.c:1109
-msgid "No commands done."
-msgstr "没有命令被执行。"
+#: sha1_file.c:2721
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "偏移量在 %s 的包索引开始之前(损坏的索引?)"
 
-#: wt-status.c:1112
+#: sha1_file.c:2725
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "最后一条命令已完成(%d 条命令被执行):"
-msgstr[1] "最后的命令已完成(%d 条命令被执行):"
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "偏移量越过了 %s 的包索引的结尾(被截断的索引?)"
 
-#: wt-status.c:1123
+#: sha1_name.c:409
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  ï¼\88æ\9b´å¤\9aå\8f\82è§\81æ\96\87件 %sï¼\89"
+msgid "short SHA1 %s is ambiguous"
+msgstr "ç\9f­ SHA1 %s å­\98å\9c¨æ­§ä¹\89"
 
-#: wt-status.c:1128
-msgid "No commands remaining."
-msgstr "未剩下任何命令。"
+#: sha1_name.c:420
+msgid "The candidates are:"
+msgstr "候选者有:"
+
+#: sha1_name.c:580
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"Git 通常不会创建一个以40位十六进制字符命名的引用,因为当你提供40位\n"
+"十六进制字符时将被忽略。不过这些引用也可能被错误地创建。例如:\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"当 \"$br\" 空白时一个40位十六进制的引用将被创建。请检查这些引用,\n"
+"可能需要删除它们。用 \"git config advice.objectNameWarning false\"\n"
+"命令关闭本消息通知。"
+
+#: submodule.c:67 submodule.c:101
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr "无法修改未合并的 .gitmodules,先解决合并冲突"
 
-#: wt-status.c:1131
+#: submodule.c:71 submodule.c:105
 #, c-format
-msgid "Next command to do (%d remaining command):"
-msgid_plural "Next commands to do (%d remaining commands):"
-msgstr[0] "接下来要执行的命令(剩余 %d 条命令):"
-msgstr[1] "接下来要执行的命令(剩余 %d 条命令):"
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "无法在 .gitmodules 中找到 path=%s 的小节"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1139
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (使用 \"git rebase --edit-todo\" 来查看和编辑)"
+#: submodule.c:79
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "不能更新 .gitmodules 条目 %s"
 
-#: wt-status.c:1152
+#: submodule.c:112
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "æ\82¨å\9c¨æ\89§è¡\8cå°\86å\88\86æ\94¯ '%s' å\8f\98å\9fºå\88° '%s' ç\9a\84æ\93\8dä½\9cã\80\82"
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "æ\97 æ³\95移é\99¤ %s ç\9a\84 .gitmodules æ\9d¡ç\9b®"
 
-#: wt-status.c:1157
-msgid "You are currently rebasing."
-msgstr "您在执行变基操作。"
+#: submodule.c:123
+msgid "staging updated .gitmodules failed"
+msgstr "将更新后 .gitmodules 添加暂存区失败"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1171
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (解决冲突,然后运行 \"git rebase --continue\")"
+#: submodule.c:161
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "submodule.fetchJobs 不允许为负值"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1173
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (使用 \"git rebase --skip\" 跳过此补丁)"
+#: submodule.c:1194
+#, c-format
+msgid "'%s' not recognized as a git repository"
+msgstr "无法将 '%s' 识别为一个 git 仓库"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1175
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (使用 \"git rebase --abort\" 以检出原有分支)"
+#: submodule.c:1332
+#, c-format
+msgid "could not start 'git status' in submodule '%s'"
+msgstr "无法在子模组 '%s' 中启动 'git status'"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1181
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (所有冲突已解决:运行 \"git rebase --continue\")"
+#: submodule.c:1345
+#, c-format
+msgid "could not run 'git status' in submodule '%s'"
+msgstr "无法在子模组 '%s' 中执行 'git status'"
+
+#: submodule.c:1421
+#, c-format
+msgid "submodule '%s' has dirty index"
+msgstr "子模组 '%s' 中有脏索引"
 
-#: wt-status.c:1185
+#: submodule.c:1678
 #, c-format
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时拆分提交。"
+"relocate_gitdir for submodule '%s' with more than one worktree not supported"
+msgstr "不支持对有多个工作区的子模组 '%s' 执行 relocate_gitdir"
 
-#: wt-status.c:1190
-msgid "You are currently splitting a commit during a rebase."
-msgstr "您在执行变基操作时拆分提交。"
+#: submodule.c:1690 submodule.c:1746
+#, c-format
+msgid "could not lookup name for submodule '%s'"
+msgstr "不能查询子模组 '%s' 的名称"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1193
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "  (一旦您工作目录提交干净后,运行 \"git rebase --continue\")"
+#: submodule.c:1694 builtin/submodule--helper.c:678
+#: builtin/submodule--helper.c:688
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "不能创建目录 '%s'"
 
-#: wt-status.c:1197
+#: submodule.c:1697
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时编辑提交。"
+msgid ""
+"Migrating git directory of '%s%s' from\n"
+"'%s' to\n"
+"'%s'\n"
+msgstr ""
+"将 '%s%s' 的 git 目录从\n"
+"'%s' 迁移至\n"
+"'%s'\n"
 
-#: wt-status.c:1202
-msgid "You are currently editing a commit during a rebase."
-msgstr "您在执行变基操作时编辑提交。"
+#: submodule.c:1781
+#, c-format
+msgid "could not recurse into submodule '%s'"
+msgstr "无法递归进子模组路径 '%s'"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1205
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (使用 \"git commit --amend\" 修补当前提交)"
+#: submodule.c:1825
+msgid "could not start ls-files in .."
+msgstr "无法在 .. 中启动 ls-files"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1207
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (当您对您的修改满意后执行 \"git rebase --continue\")"
+#: submodule.c:1845
+msgid "BUG: returned path string doesn't match cwd?"
+msgstr "BUG:返回的路径和当前路径不匹配?"
 
-#: wt-status.c:1217
+#: submodule.c:1864
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "您在执行拣选提交 %s 的操作。"
+msgid "ls-tree returned unexpected return code %d"
+msgstr "ls-tree 返回未知返回值 %d"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1222
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (解决冲突并运行 \"git cherry-pick --continue\")"
+#: submodule-config.c:380
+#, c-format
+msgid "invalid value for %s"
+msgstr "%s 的值无效"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1225
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr "  (所有冲突已解决:运行 \"git cherry-pick --continue\")"
+#: trailer.c:240
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "执行 trailer 命令 '%s' 失败"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1227
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (使用 \"git cherry-pick --abort\" 以取消拣选操作)"
+#: trailer.c:473 trailer.c:477 trailer.c:481 trailer.c:535 trailer.c:539
+#: trailer.c:543
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "键 '%2$s' 的未知取值 '%1$s'"
 
-#: wt-status.c:1236
+#: trailer.c:525 trailer.c:530 builtin/remote.c:289
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "您在执行反转提交 %s 的操作。"
+msgid "more than one %s"
+msgstr "多于一个 %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1241
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (解决冲突并运行 \"git revert --continue\")"
+#: trailer.c:702
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "签名 '%.*s' 的键为空"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1244
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (所有冲突已解决:运行 \"git revert --continue\")"
+#: trailer.c:722
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "不能读取输入文件 '%s'"
+
+#: trailer.c:725
+msgid "could not read from stdin"
+msgstr "不能自标准输入读取"
+
+#: trailer.c:949 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "不能对 %s 调用 stat"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1246
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (使用 \"git revert --abort\" 以取消反转提交操作)"
+#: trailer.c:951
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "文件 %s 不是一个正规文件"
 
-#: wt-status.c:1257
+#: trailer.c:953
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "æ\82¨å\9c¨æ\89§è¡\8cä»\8eå\88\86æ\94¯ '%s' å¼\80å§\8bç\9a\84äº\8cå\88\86æ\9f¥æ\89¾æ\93\8dä½\9cã\80\82"
+msgid "file %s is not writable by user"
+msgstr "æ\96\87件 %s ç\94¨æ\88·ä¸\8då\8f¯å\86\99"
 
-#: wt-status.c:1261
-msgid "You are currently bisecting."
-msgstr "您在执行二分查找操作。"
+#: trailer.c:965
+msgid "could not open temporary file"
+msgstr "不能打开临时文件"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1264
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (使用 \"git bisect reset\" 以回到原有分支)"
+#: trailer.c:1001
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "不能重命名临时文件为 %s"
 
-#: wt-status.c:1464
-msgid "On branch "
-msgstr "位于分支 "
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "将要设置 '%1$s' 的上游为 '%3$s' 的 '%2$s'\n"
 
-#: wt-status.c:1470
-msgid "interactive rebase in progress; onto "
-msgstr "交互式变基操作正在进行中;至 "
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "传输:无效的深度选项 '%s'"
 
-#: wt-status.c:1472
-msgid "rebase in progress; onto "
-msgstr "变基操作正在进行中;至 "
+#: transport.c:889
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr "下列子模组路径所包含的修改在任何远程源中都找不到:\n"
 
-#: wt-status.c:1477
-msgid "HEAD detached at "
-msgstr "头指针分离于 "
+#: transport.c:893
+#, c-format
+msgid ""
+"\n"
+"Please try\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"or cd to the path and use\n"
+"\n"
+"\tgit push\n"
+"\n"
+"to push them to a remote.\n"
+"\n"
+msgstr ""
+"\n"
+"请尝试\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"或者进入到子目录执行\n"
+"\n"
+"\tgit push\n"
+"\n"
+"以推送至远程。\n"
+"\n"
 
-#: wt-status.c:1479
-msgid "HEAD detached from "
-msgstr "头指针分离自 "
+#: transport.c:901
+msgid "Aborting."
+msgstr "正在终止。"
 
-#: wt-status.c:1482
-msgid "Not currently on any branch."
-msgstr "当前不在任何分支上。"
+#: transport-helper.c:1080
+#, c-format
+msgid "Could not read ref %s"
+msgstr "不能读取引用 %s"
 
-#: wt-status.c:1500
-msgid "Initial commit"
-msgstr "å\88\9då§\8bæ\8f\90交"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "太ç\9f­ç\9a\84æ \91对象"
 
-#: wt-status.c:1514
-msgid "Untracked files"
-msgstr "æ\9cªè·\9f踪ç\9a\84æ\96\87件"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "æ \91对象中ç\9a\84æ\9d¡ç\9b®æ¨¡å¼\8fé\94\99误"
 
-#: wt-status.c:1516
-msgid "Ignored files"
-msgstr "忽略的文件"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "树对象条目中空的文件名"
 
-#: wt-status.c:1520
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "太短的树文件"
+
+#: unpack-trees.c:104
 #, c-format
 msgid ""
-"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
-"may speed it up, but you have to be careful not to forget to add\n"
-"new files yourself (see 'git help status')."
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
-"耗费了 %.2f 秒以枚举未跟踪的文件。'status -uno' 也许能提高速度,\n"
-"但您需要小心不要忘了添加新文件(参见 'git help status')。"
+"您对下列文件的本地修改将被检出操作覆盖:\n"
+"%%s请在切换分支前提交您的修改或者保存进度。"
 
-#: wt-status.c:1526
+#: unpack-trees.c:106
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "未跟踪的文件没有列出%s"
-
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1528
-msgid " (use -u option to show untracked files)"
-msgstr "(使用 -u 参数显示未跟踪的文件)"
-
-#: wt-status.c:1534
-msgid "No changes"
-msgstr "没有修改"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"您对下列文件的本地修改将被检出操作覆盖:\n"
+"%%s"
 
-#: wt-status.c:1539
+#: unpack-trees.c:109
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr "修改尚未加入提交(使用 \"git add\" 和/或 \"git commit -a\")\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr ""
+"您对下列文件的本地修改将被合并操作覆盖:\n"
+"%%s请在合并前提交您的修改或者保存进度。"
 
-#: wt-status.c:1542
+#: unpack-trees.c:111
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "修改尚未加入提交\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"您对下列文件的本地修改将被合并操作覆盖:\n"
+"%%s"
 
-#: wt-status.c:1545
+#: unpack-trees.c:114
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr "提交为空,但是存在尚未跟踪的文件(使用 \"git add\" 建立跟踪)\n"
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%sPlease commit your changes or stash them before you %s."
+msgstr ""
+"您对下列文件的本地修改将被 %s 覆盖:\n"
+"%%s请在 %s 之前提交您的修改或者保存进度。"
 
-#: wt-status.c:1548
+#: unpack-trees.c:116
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "提交为空,但是存在尚未跟踪的文件\n"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"您对下列文件的本地修改将被 %s 覆盖:\n"
+"%%s"
 
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1551
+#: unpack-trees.c:121
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr "无文件要提交(创建/拷贝文件并使用 \"git add\" 建立跟踪)\n"
+msgid ""
+"Updating the following directories would lose untracked files in them:\n"
+"%s"
+msgstr ""
+"更新如下目录将会丢失其中未跟踪的文件:\n"
+"%s"
 
-#: wt-status.c:1554 wt-status.c:1559
+#: unpack-trees.c:125
 #, c-format
-msgid "nothing to commit\n"
-msgstr "无文件要提交\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"工作区中下列未跟踪的文件将会因为检出操作而被删除:\n"
+"%%s请在切换分支之前移动或删除。"
 
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1557
+#: unpack-trees.c:127
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr "无文件要提交(使用 -u 显示未跟踪的文件)\n"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为检出操作而被删除:\n"
+"%%s"
 
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1561
+#: unpack-trees.c:130
 #, c-format
-msgid "nothing to commit, working tree clean\n"
-msgstr "无文件要提交,干净的工作区\n"
-
-#  译者:注意保持句尾空格
-#: wt-status.c:1668
-msgid "Initial commit on "
-msgstr "初始提交于 "
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"工作区中下列未跟踪的文件将会因为合并操作而被删除:\n"
+"%%s请在合并前移动或删除。"
 
-#: wt-status.c:1672
-msgid "HEAD (no branch)"
-msgstr "HEAD(非分支)"
+#: unpack-trees.c:132
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为合并操作而被删除:\n"
+"%%s"
 
-#: wt-status.c:1701
-msgid "gone"
-msgstr "丢失"
+#: unpack-trees.c:135
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"工作区中下列未跟踪的文件将会因为 %s 操作而被删除:\n"
+"%%s请在 %s 前移动或删除。"
 
-#  译者:注意保持句尾空格
-#: wt-status.c:1703 wt-status.c:1711
-msgid "behind "
-msgstr "落后 "
+#: unpack-trees.c:137
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为 %s 操作而被删除:\n"
+"%%s"
 
-#: wt-status.c:1706 wt-status.c:1709
-msgid "ahead "
-msgstr "领先 "
+#: unpack-trees.c:142
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
+msgstr ""
+"工作区中下列未跟踪的文件将会因为检出操作而被覆盖:\n"
+"%%s请在切换分支前移动或删除。"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:415
+#: unpack-trees.c:144
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "无法删除 '%s'"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为检出操作而被覆盖:\n"
+"%%s"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<选项>] [--] <路径规格>..."
+#: unpack-trees.c:147
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%sPlease move or remove them before you merge."
+msgstr ""
+"工作区中下列未跟踪的文件将会因为合并操作而被覆盖:\n"
+"%%s请在合并前移动或删除。"
 
-#: builtin/add.c:65
+#: unpack-trees.c:149
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "意外的差异状态 %c"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为合并操作而被覆盖:\n"
+"%%s"
 
-#: builtin/add.c:71 builtin/commit.c:281
-msgid "updating files failed"
-msgstr "更新文件失败"
+#: unpack-trees.c:152
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
+msgstr ""
+"工作区中下列未跟踪的文件将会因为 %s 操作而被覆盖:\n"
+"%%s请在 %s 前移动或删除。"
 
-#: builtin/add.c:81
+#: unpack-trees.c:154
 #, c-format
-msgid "remove '%s'\n"
-msgstr "删除 '%s'\n"
-
-#: builtin/add.c:136
-msgid "Unstaged changes after refreshing the index:"
-msgstr "刷新索引之后尚未被暂存的变更:"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为 %s 操作而被覆盖:\n"
+"%%s"
 
-#: builtin/add.c:196 builtin/rev-parse.c:811
-msgid "Could not read the index"
-msgstr "不能读取索引"
+#: unpack-trees.c:161
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "条目 '%s' 和 '%s' 重叠。无法合并。"
 
-#: builtin/add.c:207
+#: unpack-trees.c:164
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "无法打开 '%s' 进行写入。"
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"无法更新稀疏检出:如下条目不是最新:\n"
+"%s"
 
-#: builtin/add.c:211
-msgid "Could not write patch"
-msgstr "不能生成补丁"
+#: unpack-trees.c:166
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"工作区中下列文件将被稀疏检出更新所覆盖:\n"
+"%s"
 
-#: builtin/add.c:214
-msgid "editing patch failed"
-msgstr "编辑补丁失败"
+#: unpack-trees.c:168
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"工作区中下列文件将被稀疏检出更新所删除:\n"
+"%s"
 
-#: builtin/add.c:217
+#: unpack-trees.c:170
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "不能查看文件状态 '%s'"
+msgid ""
+"Cannot update submodule:\n"
+"%s"
+msgstr ""
+"无法更新子模组:\n"
+"%s"
 
-#: builtin/add.c:219
-msgid "Empty patch. Aborted."
-msgstr "空补丁。异常终止。"
+#: unpack-trees.c:247
+#, c-format
+msgid "Aborting\n"
+msgstr "终止中\n"
 
-#: builtin/add.c:224
+#: unpack-trees.c:272
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "不能应用 '%s'"
+msgid "submodule update strategy not supported for submodule '%s'"
+msgstr "子模组 %s 不支持子模组更新策略"
 
-#: builtin/add.c:234
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "下列路径根据您的一个 .gitignore 文件而被忽略:\n"
+#: unpack-trees.c:340
+msgid "Checking out files"
+msgstr "正在检出文件"
 
-#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521
-#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "演习"
+#: urlmatch.c:163
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "无效的 URL 方案名称或丢失 '://' 后缀"
 
-#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19
-#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593
-#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "冗长输出"
+#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "无效的 %XX 转义序列"
 
-#: builtin/add.c:256
-msgid "interactive picking"
-msgstr "交互式拣选"
+#: urlmatch.c:215
+msgid "missing host and scheme is not 'file:'"
+msgstr "缺失主机名且 URL 方案不是 'file:'"
 
-#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "交äº\92å¼\8fæ\8c\91é\80\89æ\95°æ\8d®å\9d\97"
+#: urlmatch.c:232
+msgid "a 'file:' URL may not have a port number"
+msgstr "ä¸\80个 'file:' URL ä¸\8dåº\94该å\8c\85å\90«ç«¯å\8f£å\8f·"
 
-#: builtin/add.c:258
-msgid "edit current diff and apply"
-msgstr "编辑当前差异并应用"
+#: urlmatch.c:247
+msgid "invalid characters in host name"
+msgstr "主机名中包含无效的字符"
 
-#: builtin/add.c:259
-msgid "allow adding otherwise ignored files"
-msgstr "允许添加忽略的文件"
+#: urlmatch.c:292 urlmatch.c:303
+msgid "invalid port number"
+msgstr "无效的端口号"
 
-#: builtin/add.c:260
-msgid "update tracked files"
-msgstr "æ\9b´æ\96°å·²è·\9f踪ç\9a\84æ\96\87件"
+#: urlmatch.c:371
+msgid "invalid '..' path segment"
+msgstr "æ\97 æ\95\88ç\9a\84 '..' è·¯å¾\84ç\89\87段"
 
-#: builtin/add.c:261
-msgid "record only the fact that the path will be added later"
-msgstr "只记录,该路径稍后再添加"
+#: worktree.c:285
+#, c-format
+msgid "failed to read '%s'"
+msgstr "无法读取 '%s'"
 
-#: builtin/add.c:262
-msgid "add changes from all tracked and untracked files"
-msgstr "添加所有改变的已跟踪文件和未跟踪文件"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "无法打开 '%s' 进行读写"
 
-#: builtin/add.c:265
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "忽略工作区中移除的路径(和 --no-all 相同)"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "无法打开 '%s' 进行写入"
 
-#: builtin/add.c:267
-msgid "don't add, only refresh the index"
-msgstr "不添加,只刷新索引"
+#: wrapper.c:226 wrapper.c:396 builtin/am.c:318 builtin/am.c:757
+#: builtin/am.c:849 builtin/commit.c:1700 builtin/merge.c:1015
+#: builtin/pull.c:341
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "无法打开 '%s' 进行读取"
 
-#: builtin/add.c:268
-msgid "just skip files which cannot be added because of errors"
-msgstr "跳过因出错不能添加的文件"
+#: wrapper.c:581 wrapper.c:602
+#, c-format
+msgid "unable to access '%s'"
+msgstr "不能访问 '%s'"
 
-#: builtin/add.c:269
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "检查在演习模式下文件(即使不存在)是否被忽略"
+#: wrapper.c:610
+msgid "unable to get current working directory"
+msgstr "不能获取当前工作目录"
 
-#: builtin/add.c:270 builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: wrapper.c:634
+#, c-format
+msgid "could not write to %s"
+msgstr "不能写入 %s"
 
-#: builtin/add.c:270 builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "覆盖列表里文件的可执行位"
+#: wrapper.c:636
+#, c-format
+msgid "could not close %s"
+msgstr "不能关闭 %s"
+
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "未合并的路径:"
 
-#: builtin/add.c:292
+#  译者:注意保持前导空格
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "使用 -f 参数如果您确实要添加它们。\n"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (使用 \"git reset %s <文件>...\" 以取消暂存)"
 
-#: builtin/add.c:300
-msgid "adding files failed"
-msgstr "添加文件失败"
+#  译者:注意保持前导空格
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (使用 \"git rm --cached <文件>...\" 以取消暂存)"
 
-#: builtin/add.c:336
-msgid "-A and -u are mutually incompatible"
-msgstr "-A 和 -u 选项互斥"
+#  译者:注意保持前导空格
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (使用 \"git add <文件>...\" 标记解决方案)"
 
-#: builtin/add.c:343
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "选项 --ignore-missing 只能和 --dry-run 同时使用"
+#  译者:注意保持前导空格
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr "  (酌情使用 \"git add/rm <文件>...\" 标记解决方案)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "--chmod param '%s' must be either -x or +x"
-msgstr "参数 --chmod 取值 '%s' 必须是 -x 或 +x"
+#  译者:注意保持前导空格
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (使用 \"git rm <文件>...\" 标记解决方案)"
 
-#: builtin/add.c:367
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "没有指定文件,也没有文件被添加。\n"
+#: wt-status.c:199 wt-status.c:958
+msgid "Changes to be committed:"
+msgstr "要提交的变更:"
 
-#: builtin/add.c:368
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "也许您想要执行 'git add .'?\n"
+#: wt-status.c:217 wt-status.c:967
+msgid "Changes not staged for commit:"
+msgstr "尚未暂存以备提交的变更:"
 
-#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
-#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340
-#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:240
-msgid "index file corrupt"
-msgstr "索引文件损坏"
+#  译者:注意保持前导空格
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (使用 \"git add <文件>...\" 更新要提交的内容)"
 
-#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431
-msgid "Unable to write new index file"
-msgstr "无法写入新索引文件"
+#  译者:注意保持前导空格
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (使用 \"git add/rm <文件>...\" 更新要提交的内容)"
 
-#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032
-#, c-format
-msgid "could not read '%s'"
-msgstr "不能读取 '%s'"
+#  译者:注意保持前导空格
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr "  (使用 \"git checkout -- <文件>...\" 丢弃工作区的改动)"
 
-#: builtin/am.c:426
-msgid "could not parse author script"
-msgstr "不能解析作者脚本"
+#  译者:注意保持前导空格
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr "  (提交或丢弃子模组中未跟踪或修改的内容)"
 
-#: builtin/am.c:503
+#  译者:注意保持前导空格
+#: wt-status.c:238
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' 被 applypatch-msg 钩子删除"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (使用 \"git %s <文件>...\" 以包含要提交的内容)"
 
-#: builtin/am.c:544 builtin/notes.c:301
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "非法的输入行:'%s'。"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "双方删除:"
 
-#: builtin/am.c:581 builtin/notes.c:316
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "从 '%s' 拷贝注解到 '%s' 时失败"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "由我们添加:"
 
-#: builtin/am.c:607
-msgid "fseek failed"
-msgstr "fseek 失败"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "由他们删除:"
 
-#: builtin/am.c:787
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "无法解析补丁 '%s'"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "由他们添加:"
 
-#: builtin/am.c:852
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "一次只能有一个 StGIT 补丁队列被应用"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "由我们删除:"
 
-#: builtin/am.c:899
-msgid "invalid timestamp"
-msgstr "无效的时间戳"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "双方添加:"
 
-#: builtin/am.c:902 builtin/am.c:910
-msgid "invalid Date line"
-msgstr "无效的日期行"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "双方修改:"
 
-#: builtin/am.c:907
-msgid "invalid timezone offset"
-msgstr "æ\97 æ\95\88ç\9a\84æ\97¶å\8cºå\81\8f移å\80¼"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "æ\96°æ\96\87件ï¼\9a"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "补丁格式检测失败。"
+#: wt-status.c:277
+msgid "copied:"
+msgstr "拷贝:"
 
-#: builtin/am.c:1001 builtin/clone.c:380
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "无法创建目录 '%s'"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "删除:"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "无法拆分补丁。"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "修改:"
 
-#: builtin/am.c:1137 builtin/commit.c:366
-msgid "unable to write index file"
-msgstr "无法写入索引文件"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "重命名:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "当您解决这一问题,执行 \"%s --continue\"。"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "类型变更:"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "如果您想要跳过这一补丁,则执行 \"%s --skip\"。"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "未知:"
 
-#: builtin/am.c:1190
-#, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr "若要复原至原始分支并停止补丁操作,执行 \"%s --abort\"。"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "未合并:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "补丁为空。是不是切分错误?"
+#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "新提交, "
 
-#: builtin/am.c:1402 builtin/log.c:1543
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "包含无效的身份标识:%s"
+#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "修改的内容, "
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "不能解析提交 %s"
+#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "未跟踪的内容, "
 
-#: builtin/am.c:1602
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "仓库缺乏必要的数据对象以进行三方合并。"
+#: wt-status.c:831
+msgid "Submodules changed but not updated:"
+msgstr "子模组已修改但尚未更新:"
 
-#: builtin/am.c:1604
-msgid "Using index info to reconstruct a base tree..."
-msgstr "使用索引来重建一个(三方合并的)基础目录树..."
+#: wt-status.c:833
+msgid "Submodule changes to be committed:"
+msgstr "要提交的子模组变更:"
 
-#: builtin/am.c:1623
+#: wt-status.c:914
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
-"您是否曾手动编辑过您的补丁?\n"
-"无法应用补丁到索引中的数据对象上。"
+"不要改动上面的一行。\n"
+"下面的所有内容均将被删除。"
 
-#: builtin/am.c:1629
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "回落到基础版本上打补丁及进行三方合并..."
+#: wt-status.c:1026
+msgid "You have unmerged paths."
+msgstr "您有尚未合并的路径。"
 
-#: builtin/am.c:1654
-msgid "Failed to merge in the changes."
-msgstr "无法合并变更。"
+#  译者:注意保持前导空格
+#: wt-status.c:1029
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (解决冲突并运行 \"git commit\")"
 
-#: builtin/am.c:1679 builtin/merge.c:628
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree 无法写入一树对象"
+#  译者:注意保持前导空格
+#: wt-status.c:1031
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (使用 \"git merge --abort\" 终止合并)"
 
-#: builtin/am.c:1686
-msgid "applying to an empty history"
-msgstr "æ­£åº\94ç\94¨å\88°ä¸\80个空å\8e\86å\8f²ä¸\8a"
+#: wt-status.c:1036
+msgid "All conflicts fixed but you are still merging."
+msgstr "æ\89\80æ\9c\89å\86²çª\81已解å\86³ä½\86æ\82¨ä»\8då¤\84äº\8eå\90\88并中ã\80\82"
 
-#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798
-#: builtin/merge.c:823
-msgid "failed to write commit object"
-msgstr "无法写提交对象"
+#  译者:注意保持前导空格
+#: wt-status.c:1039
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (使用 \"git commit\" 结束合并)"
 
-#: builtin/am.c:1731 builtin/am.c:1735
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "无法继续:%s 不存在。"
+#: wt-status.c:1049
+msgid "You are in the middle of an am session."
+msgstr "您正处于 am 操作过程中。"
 
-#: builtin/am.c:1751
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr "标准输入没有和终端关联,不能进行交互式操作。"
+#: wt-status.c:1052
+msgid "The current patch is empty."
+msgstr "当前的补丁为空。"
 
-#: builtin/am.c:1756
-msgid "Commit Body is:"
-msgstr "提交内容为:"
+#  译者:注意保持前导空格
+#: wt-status.c:1056
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (解决冲突,然后运行 \"git am --continue\")"
 
-#  译者:注意保持句尾空格
-#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
-#. in your translation. The program will only accept English
-#. input at this point.
-#.
-#: builtin/am.c:1766
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "应用?是[y]/否[n]/编辑[e]/查看补丁[v]/应用所有[a]:"
+#  译者:注意保持前导空格
+#: wt-status.c:1058
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (使用 \"git am --skip\" 跳过此补丁)"
 
-#: builtin/am.c:1816
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "脏索引:不能应用补丁(脏文件:%s)"
+#  译者:注意保持前导空格
+#: wt-status.c:1060
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (使用 \"git am --abort\" 恢复原有分支)"
 
-#: builtin/am.c:1853 builtin/am.c:1925
-#, c-format
-msgid "Applying: %.*s"
-msgstr "应用:%.*s"
+#: wt-status.c:1189
+msgid "git-rebase-todo is missing."
+msgstr "git-rebase-todo 丢失。"
 
-#: builtin/am.c:1869
-msgid "No changes -- Patch already applied."
-msgstr "没æ\9c\89å\8f\98æ\9b´ â\80\94â\80\94 è¡¥ä¸\81å·²ç»\8fåº\94ç\94¨è¿\87。"
+#: wt-status.c:1191
+msgid "No commands done."
+msgstr "没æ\9c\89å\91½ä»¤è¢«æ\89§è¡\8c。"
 
-#: builtin/am.c:1877
+#: wt-status.c:1194
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "打补丁失败于 %s %.*s"
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "最后一条命令已完成(%d 条命令被执行):"
+msgstr[1] "最后的命令已完成(%d 条命令被执行):"
 
-#: builtin/am.c:1883
+#: wt-status.c:1205
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "失败的补丁文件副本位于:%s"
-
-#: builtin/am.c:1928
-msgid ""
-"No changes - did you forget to use 'git add'?\n"
-"If there is nothing left to stage, chances are that something else\n"
-"already introduced the same changes; you might want to skip this patch."
-msgstr ""
-"没有变更 —— 您是不是忘了执行 'git add'?\n"
-"如果没有什么要添加到暂存区的,则很可能是其它提交已经引入了相同的变更。\n"
-"您也许想要跳过这个补丁。"
+msgid "  (see more in file %s)"
+msgstr "  (更多参见文件 %s)"
 
-#: builtin/am.c:1935
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr ""
-"您的索引中仍有未合并的路径。\n"
-"您是否忘了执行 'git add'?"
+#: wt-status.c:1210
+msgid "No commands remaining."
+msgstr "未剩下任何命令。"
 
-#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1213
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "不能解析对象 '%s'。"
-
-#: builtin/am.c:2095
-msgid "failed to clean index"
-msgstr "无法清空索引"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "接下来要执行的命令(剩余 %d 条命令):"
+msgstr[1] "接下来要执行的命令(剩余 %d 条命令):"
 
-#: builtin/am.c:2129
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr "您好像在上一次 'am' 失败后移动了 HEAD。未回退至 ORIG_HEAD"
+#  译者:注意保持前导空格
+#: wt-status.c:1221
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (使用 \"git rebase --edit-todo\" 来查看和编辑)"
 
-#: builtin/am.c:2192
+#: wt-status.c:1234
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "æ\97 æ\95\88ç\9a\84 --patch-format å\80¼ï¼\9a%s"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "æ\82¨å\9c¨æ\89§è¡\8cå°\86å\88\86æ\94¯ '%s' å\8f\98å\9fºå\88° '%s' ç\9a\84æ\93\8dä½\9cã\80\82"
 
-#: builtin/am.c:2225
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<选项>] [(<mbox>|<Maildir>)...]"
+#: wt-status.c:1239
+msgid "You are currently rebasing."
+msgstr "您在执行变基操作。"
 
-#: builtin/am.c:2226
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<选项>] (--continue | --skip | --abort)"
+#  译者:注意保持前导空格
+#: wt-status.c:1253
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (解决冲突,然后运行 \"git rebase --continue\")"
 
-#: builtin/am.c:2232
-msgid "run interactively"
-msgstr "以交互式方式运行"
+#  译者:注意保持前导空格
+#: wt-status.c:1255
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (使用 \"git rebase --skip\" 跳过此补丁)"
 
-#: builtin/am.c:2234
-msgid "historical option -- no-op"
-msgstr "老的参数 —— 无作用"
+#  译者:注意保持前导空格
+#: wt-status.c:1257
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (使用 \"git rebase --abort\" 以检出原有分支)"
 
-#: builtin/am.c:2236
-msgid "allow fall back on 3way merging if needed"
-msgstr "如果必要,允许使用三方合并。"
+#  译者:注意保持前导空格
+#: wt-status.c:1263
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (所有冲突已解决:运行 \"git rebase --continue\")"
 
-#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57
-#: builtin/repack.c:172
-msgid "be quiet"
-msgstr "静默模式"
+#: wt-status.c:1267
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时拆分提交。"
 
-#: builtin/am.c:2239
-msgid "add a Signed-off-by line to the commit message"
-msgstr "在提交说明中添加一个 Signed-off-by 签名"
+#: wt-status.c:1272
+msgid "You are currently splitting a commit during a rebase."
+msgstr "您在执行变基操作时拆分提交。"
 
-#: builtin/am.c:2242
-msgid "recode into utf8 (default)"
-msgstr "使用 utf8 字符集(默认)"
+#  译者:注意保持前导空格
+#: wt-status.c:1275
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (一旦您工作目录提交干净后,运行 \"git rebase --continue\")"
 
-#: builtin/am.c:2244
-msgid "pass -k flag to git-mailinfo"
-msgstr "向 git-mailinfo 传递 -k 参数"
+#: wt-status.c:1279
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时编辑提交。"
 
-#: builtin/am.c:2246
-msgid "pass -b flag to git-mailinfo"
-msgstr "向 git-mailinfo 传递 -b 参数"
+#: wt-status.c:1284
+msgid "You are currently editing a commit during a rebase."
+msgstr "您在执行变基操作时编辑提交。"
 
-#: builtin/am.c:2248
-msgid "pass -m flag to git-mailinfo"
-msgstr "向 git-mailinfo 传递 -m 参数"
+#  译者:注意保持前导空格
+#: wt-status.c:1287
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (使用 \"git commit --amend\" 修补当前提交)"
 
-#: builtin/am.c:2250
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "针对 mbox 格式,向 git-mailsplit 传递 --keep-cr 参数"
+#  译者:注意保持前导空格
+#: wt-status.c:1289
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (当您对您的修改满意后执行 \"git rebase --continue\")"
 
-#: builtin/am.c:2253
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "不向 git-mailsplit 传递 --keep-cr 参数,覆盖 am.keepcr 的设置"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "您在执行拣选提交 %s 的操作。"
 
-#: builtin/am.c:2256
-msgid "strip everything before a scissors line"
-msgstr "丢弃裁切线前的所有内容"
+#  译者:注意保持前导空格
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (解决冲突并运行 \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2257 builtin/apply.c:4837
-msgid "action"
-msgstr "动作"
+#  译者:注意保持前导空格
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr "  (所有冲突已解决:运行 \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267
-#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279
-#: builtin/am.c:2285
-msgid "pass it through git-apply"
-msgstr "传递给 git-apply"
+#  译者:注意保持前导空格
+#: wt-status.c:1309
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (使用 \"git cherry-pick --abort\" 以取消拣选操作)"
 
-#: builtin/am.c:2266 builtin/apply.c:4861
-msgid "root"
-msgstr "根目录"
+#: wt-status.c:1318
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "您在执行反转提交 %s 的操作。"
 
-#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799
-#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96
-#: builtin/pull.c:179 builtin/submodule--helper.c:277
-#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482
-#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823
-#: builtin/submodule--helper.c:826
-msgid "path"
-msgstr "路径"
+#  译者:注意保持前导空格
+#: wt-status.c:1323
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (解决冲突并运行 \"git revert --continue\")"
 
-#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134
-#: builtin/pull.c:193 builtin/repack.c:181 builtin/repack.c:185
-#: builtin/show-branch.c:645 builtin/show-ref.c:175 builtin/tag.c:340
-#: parse-options.h:132 parse-options.h:134 parse-options.h:244
-msgid "n"
-msgstr "n"
+#  译者:注意保持前导空格
+#: wt-status.c:1326
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (所有冲突已解决:运行 \"git revert --continue\")"
 
-#: builtin/am.c:2278 builtin/apply.c:4805
-msgid "num"
-msgstr "数字"
+#  译者:注意保持前导空格
+#: wt-status.c:1328
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (使用 \"git revert --abort\" 以取消反转提交操作)"
 
-#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "æ ¼å¼\8f"
+#: wt-status.c:1339
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "æ\82¨å\9c¨æ\89§è¡\8cä»\8eå\88\86æ\94¯ '%s' å¼\80å§\8bç\9a\84äº\8cå\88\86æ\9f¥æ\89¾æ\93\8dä½\9cã\80\82"
 
-#: builtin/am.c:2282
-msgid "format the patch(es) are in"
-msgstr "补丁的格式"
+#: wt-status.c:1343
+msgid "You are currently bisecting."
+msgstr "您在执行二分查找操作。"
 
-#: builtin/am.c:2288
-msgid "override error message when patch failure occurs"
-msgstr "打补丁失败时显示的错误信息"
+#  译者:注意保持前导空格
+#: wt-status.c:1346
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (使用 \"git bisect reset\" 以回到原有分支)"
 
-#: builtin/am.c:2290
-msgid "continue applying patches after resolving a conflict"
-msgstr "冲突解决后继续应用补丁"
+#: wt-status.c:1543
+msgid "On branch "
+msgstr "位于分支 "
 
-#: builtin/am.c:2293
-msgid "synonyms for --continue"
-msgstr "和 --continue 同义"
+#: wt-status.c:1549
+msgid "interactive rebase in progress; onto "
+msgstr "交互式变基操作正在进行中;至 "
 
-#: builtin/am.c:2296
-msgid "skip the current patch"
-msgstr "跳过当前补丁"
+#: wt-status.c:1551
+msgid "rebase in progress; onto "
+msgstr "变基操作正在进行中;至 "
 
-#: builtin/am.c:2299
-msgid "restore the original branch and abort the patching operation."
-msgstr "恢复原始分支并终止打补丁操作。"
+#: wt-status.c:1556
+msgid "HEAD detached at "
+msgstr "头指针分离于 "
 
-#: builtin/am.c:2303
-msgid "lie about committer date"
-msgstr "å°\86ä½\9cè\80\85æ\97¥æ\9c\9fä½\9c为æ\8f\90交æ\97¥æ\9c\9f"
+#: wt-status.c:1558
+msgid "HEAD detached from "
+msgstr "头æ\8c\87é\92\88å\88\86离è\87ª "
 
-#: builtin/am.c:2305
-msgid "use current timestamp for author date"
-msgstr "用当前时间作为作者日期"
+#: wt-status.c:1561
+msgid "Not currently on any branch."
+msgstr "当前不在任何分支上。"
 
-#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229
-#: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "key-id"
+#: wt-status.c:1579
+msgid "Initial commit"
+msgstr "初始提交"
 
-#: builtin/am.c:2308
-msgid "GPG-sign commits"
-msgstr "使用 GPG 签名提交"
+#: wt-status.c:1593
+msgid "Untracked files"
+msgstr "未跟踪的文件"
 
-#: builtin/am.c:2311
-msgid "(internal use for git-rebase)"
-msgstr "(内部使用,用于 git-rebase)"
+#: wt-status.c:1595
+msgid "Ignored files"
+msgstr "忽略的文件"
 
-#: builtin/am.c:2326
+#: wt-status.c:1599
+#, c-format
 msgid ""
-"The -b/--binary option has been a no-op for long time, and\n"
-"it will be removed. Please do not use it anymore."
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
 msgstr ""
-"参数 -b/--binary 已经很长时间不做任何实质操作了,并且将被移除。\n"
-"请不要再使用它了。"
-
-#: builtin/am.c:2333
-msgid "failed to read the index"
-msgstr "无法读取索引"
+"耗费了 %.2f 秒以枚举未跟踪的文件。'status -uno' 也许能提高速度,\n"
+"但您需要小心不要忘了添加新文件(参见 'git help status')。"
 
-#: builtin/am.c:2348
+#: wt-status.c:1605
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "之前的变基目录 %s 仍然存在,但却提供了 mbox。"
+msgid "Untracked files not listed%s"
+msgstr "未跟踪的文件没有列出%s"
 
-#: builtin/am.c:2372
-#, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-"发现了错误的 %s 目录。\n"
-"使用 \"git am --abort\" 删除它。"
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1607
+msgid " (use -u option to show untracked files)"
+msgstr "(使用 -u 参数显示未跟踪的文件)"
 
-#: builtin/am.c:2378
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "解决操作未进行,我们不会继续。"
+#: wt-status.c:1613
+msgid "No changes"
+msgstr "没有修改"
 
-#: builtin/apply.c:122
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<选项>] [<补丁>...]"
+#: wt-status.c:1618
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr "修改尚未加入提交(使用 \"git add\" 和/或 \"git commit -a\")\n"
 
-#: builtin/apply.c:153
+#: wt-status.c:1621
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "未能识别的空白字符选项 '%s'"
+msgid "no changes added to commit\n"
+msgstr "修改尚未加入提交\n"
 
-#: builtin/apply.c:169
+#: wt-status.c:1624
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "未能识别的空白字符忽略选项 '%s'"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr "提交为空,但是存在尚未跟踪的文件(使用 \"git add\" 建立跟踪)\n"
 
-#: builtin/apply.c:854
+#: wt-status.c:1627
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "æ\97 æ³\95å\87\86å¤\87æ\97¶é\97´æ\88³æ­£å\88\99表达å¼\8f %s"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "æ\8f\90交为空ï¼\8cä½\86æ\98¯å­\98å\9c¨å°\9aæ\9cªè·\9f踪ç\9a\84æ\96\87件\n"
 
-#: builtin/apply.c:863
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1630
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec 返回 %d,输入为:%s"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr "无文件要提交(创建/拷贝文件并使用 \"git add\" 建立跟踪)\n"
 
-#: builtin/apply.c:947
+#: wt-status.c:1633 wt-status.c:1638
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "不能在补丁的第 %d 行找到文件名"
+msgid "nothing to commit\n"
+msgstr "无文件要提交\n"
 
-#: builtin/apply.c:984
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1636
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr "git apply:错误的 git-diff - 应为 /dev/null,但在第 %2$d 行得到 %1$s"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "无文件要提交(使用 -u 显示未跟踪的文件)\n"
 
-#: builtin/apply.c:989
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1640
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply:错误的 git-diff - 第 %d 行上新文件名不一致"
+msgid "nothing to commit, working tree clean\n"
+msgstr "无文件要提交,干净的工作区\n"
+
+#  译者:注意保持句尾空格
+#: wt-status.c:1749
+msgid "Initial commit on "
+msgstr "初始提交于 "
+
+#: wt-status.c:1753
+msgid "HEAD (no branch)"
+msgstr "HEAD(非分支)"
+
+#  译者:注意保持句尾空格
+#: wt-status.c:1782 wt-status.c:1790
+msgid "behind "
+msgstr "落后 "
+
+#: wt-status.c:1785 wt-status.c:1788
+msgid "ahead "
+msgstr "领先 "
 
-#: builtin/apply.c:990
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2280
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件名不一致"
+msgid "cannot %s: You have unstaged changes."
+msgstr "不能%s:您有未暂存的变更。"
 
-#: builtin/apply.c:995
+#: wt-status.c:2286
+msgid "additionally, your index contains uncommitted changes."
+msgstr "另外,您的索引中包含未提交的变更。"
+
+#: wt-status.c:2288
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply:错误的 git-diff - 第 %d 行处应为 /dev/null"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "不能%s:您的索引中包含未提交的变更。"
 
-#: builtin/apply.c:1489
+#: compat/precompose_utf8.c:57 builtin/clone.c:432
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount:意外的行:%.*s"
+msgid "failed to unlink '%s'"
+msgstr "无法删除 '%s'"
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<选项>] [--] <路径规格>..."
 
-#: builtin/apply.c:1550
+#: builtin/add.c:80
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "第 %d 行的补丁片段没有头信息:%.*s"
+msgid "unexpected diff status %c"
+msgstr "意外的差异状态 %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "更新文件失败"
 
-#: builtin/apply.c:1567
+#: builtin/add.c:95
 #, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
-msgstr[1] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
+msgid "remove '%s'\n"
+msgstr "删除 '%s'\n"
 
-#: builtin/apply.c:1743
-msgid "new file depends on old contents"
-msgstr "新文件依赖旧内容"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "刷新索引之后尚未被暂存的变更:"
 
-#: builtin/apply.c:1745
-msgid "deleted file still has contents"
-msgstr "删除的文件仍有内容"
+#: builtin/add.c:209 builtin/rev-parse.c:872
+msgid "Could not read the index"
+msgstr "不能读取索引"
 
-#: builtin/apply.c:1774
+#: builtin/add.c:220
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "补丁在第 %d 行损坏"
+msgid "Could not open '%s' for writing."
+msgstr "无法打开 '%s' 进行写入。"
 
-#: builtin/apply.c:1810
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "新文件 %s 依赖旧内容"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "不能生成补丁"
 
-#: builtin/apply.c:1812
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "删除的文件 %s 仍有内容"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "编辑补丁失败"
 
-#: builtin/apply.c:1815
+#: builtin/add.c:230
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** 警告:文件 %s 成为空文件但并未删除"
+msgid "Could not stat '%s'"
+msgstr "不能对 '%s' 调用 stat"
 
-#: builtin/apply.c:1962
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "二进制补丁在第 %d 行损坏:%.*s"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "空补丁。异常终止。"
 
-#: builtin/apply.c:1999
+#: builtin/add.c:237
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "未能识别的二进制补丁位于第 %d 行"
+msgid "Could not apply '%s'"
+msgstr "不能应用 '%s'"
+
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "下列路径根据您的一个 .gitignore 文件而被忽略:\n"
+
+#: builtin/add.c:266 builtin/clean.c:876 builtin/fetch.c:115 builtin/mv.c:123
+#: builtin/prune-packed.c:55 builtin/pull.c:198 builtin/push.c:524
+#: builtin/remote.c:1328 builtin/rm.c:241 builtin/send-pack.c:163
+msgid "dry run"
+msgstr "演习"
+
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "交互式拣选"
+
+#: builtin/add.c:270 builtin/checkout.c:1177 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "交互式挑选数据块"
+
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "编辑当前差异并应用"
+
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "允许添加忽略的文件"
+
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "更新已跟踪的文件"
+
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
+msgstr "只记录,该路径稍后再添加"
+
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
+msgstr "添加所有改变的已跟踪文件和未跟踪文件"
+
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "忽略工作区中移除的路径(和 --no-all 相同)"
+
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "不添加,只刷新索引"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
+msgstr "跳过因出错不能添加的文件"
+
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "检查在演习模式下文件(即使不存在)是否被忽略"
+
+#: builtin/add.c:283 builtin/update-index.c:951
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:2154
+#: builtin/add.c:283 builtin/update-index.c:952
+msgid "override the executable bit of the listed files"
+msgstr "覆盖列表里文件的可执行位"
+
+#: builtin/add.c:305
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "补丁文件的第 %d 行只有垃圾数据"
+msgid "Use -f if you really want to add them.\n"
+msgstr "使用 -f 参数如果您确实要添加它们。\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "添加文件失败"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A 和 -u 选项互斥"
+
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "选项 --ignore-missing 只能和 --dry-run 同时使用"
 
-#: builtin/apply.c:2244
+#: builtin/add.c:359
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "无法读取符号链接 %s"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "参数 --chmod 取值 '%s' 必须是 -x 或 +x"
 
-#: builtin/apply.c:2248
+#: builtin/add.c:374
 #, c-format
-msgid "unable to open or read %s"
-msgstr "不能打开或读取 %s"
+msgid "Nothing specified, nothing added.\n"
+msgstr "没有指定文件,也没有文件被添加。\n"
 
-#: builtin/apply.c:2901
+#: builtin/add.c:375
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "无效的行首字符:'%c'"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "也许您想要执行 'git add .'?\n"
 
-#: builtin/apply.c:3020
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "块 #%d 成功应用于 %d(偏移 %d 行)"
-msgstr[1] "块 #%d 成功应用于 %d(偏移 %d 行)"
+#: builtin/add.c:380 builtin/check-ignore.c:172 builtin/checkout.c:298
+#: builtin/checkout.c:491 builtin/clean.c:920 builtin/commit.c:350
+#: builtin/mv.c:143 builtin/reset.c:235 builtin/rm.c:271
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "索引文件损坏"
 
-#: builtin/apply.c:3032
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段"
+#: builtin/am.c:412
+msgid "could not parse author script"
+msgstr "不能解析作者脚本"
 
-#: builtin/apply.c:3038
+#: builtin/am.c:489
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"当查询:\n"
-"%.*s"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' 被 applypatch-msg 钩子删除"
 
-#: builtin/apply.c:3060
+#: builtin/am.c:530
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "缺失 '%s' 的二进制补丁数据"
+msgid "Malformed input line: '%s'."
+msgstr "非法的输入行:'%s'。"
 
-#: builtin/apply.c:3163
+#: builtin/am.c:567
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "äº\8cè¿\9bå\88¶è¡¥ä¸\81æ\9cªåº\94ç\94¨å\88° '%s'"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "ä»\8e '%s' æ\8b·è´\9d注解å\88° '%s' æ\97¶å¤±è´¥"
 
-#: builtin/apply.c:3169
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "到 '%s' 的二进制补丁产生了不正确的结果(应为 %s,却为 %s)"
+#: builtin/am.c:593
+msgid "fseek failed"
+msgstr "fseek 失败"
 
-#: builtin/apply.c:3190
+#: builtin/am.c:777
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "æ\89\93è¡¥ä¸\81失败ï¼\9a%s:%ld"
+msgid "could not parse patch '%s'"
+msgstr "æ\97 æ³\95解æ\9e\90è¡¥ä¸\81 '%s'"
 
-#: builtin/apply.c:3314
-#, c-format
-msgid "cannot checkout %s"
-msgstr "不能检出 %s"
+#: builtin/am.c:842
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "一次只能有一个 StGIT 补丁队列被应用"
 
-#: builtin/apply.c:3370
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "读取位于符号链接中的 '%s'"
+#: builtin/am.c:889
+msgid "invalid timestamp"
+msgstr "无效的时间戳"
 
-#: builtin/apply.c:3399 builtin/apply.c:3630
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "路径 %s 已经被重命名/删除"
+#: builtin/am.c:892 builtin/am.c:900
+msgid "invalid Date line"
+msgstr "无效的日期行"
 
-#: builtin/apply.c:3482 builtin/apply.c:3644
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "%s:不存在于索引中"
+#: builtin/am.c:897
+msgid "invalid timezone offset"
+msgstr "无效的时区偏移值"
 
-#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658
-#, c-format
-msgid "%s: %s"
-msgstr "%s:%s"
+#: builtin/am.c:986
+msgid "Patch format detection failed."
+msgstr "补丁格式探测失败。"
 
-#: builtin/apply.c:3491 builtin/apply.c:3652
+#: builtin/am.c:991 builtin/clone.c:397
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s:和索引不匹配"
+msgid "failed to create directory '%s'"
+msgstr "无法创建目录 '%s'"
 
-#: builtin/apply.c:3597
-msgid "removal patch leaves file contents"
-msgstr "移除补丁仍留下了文件内容"
+#: builtin/am.c:995
+msgid "Failed to split patches."
+msgstr "无法拆分补丁。"
 
-#: builtin/apply.c:3669
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s:错误类型"
+#: builtin/am.c:1127 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "无法写入索引文件"
 
-#: builtin/apply.c:3671
+#: builtin/am.c:1178
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s 的类型是 %o,应为 %o"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "当您解决这一问题,执行 \"%s --continue\"。"
 
-#: builtin/apply.c:3822 builtin/apply.c:3824
+#: builtin/am.c:1179
 #, c-format
-msgid "invalid path '%s'"
-msgstr "无效路径 '%s'"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "如果您想要跳过这一补丁,则执行 \"%s --skip\"。"
 
-#: builtin/apply.c:3879
+#: builtin/am.c:1180
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s:已经存在于索引中"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr "若要复原至原始分支并停止补丁操作,执行 \"%s --abort\"。"
 
-#: builtin/apply.c:3882
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s:已经存在于工作区中"
+#: builtin/am.c:1315
+msgid "Patch is empty. Was it split wrong?"
+msgstr "补丁为空。是不是切分错误?"
 
-#: builtin/apply.c:3902
+#: builtin/am.c:1386 builtin/log.c:1557
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)不匹配"
+msgid "invalid ident line: %s"
+msgstr "包含无效的身份标识:%s"
 
-#: builtin/apply.c:3907
+#: builtin/am.c:1413
 #, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "%2$s 的新模式(%1$o)和 %4$s 的旧模式(%3$o)不匹配"
+msgid "unable to parse commit %s"
+msgstr "不能解析提交 %s"
 
-#: builtin/apply.c:3927
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "受影响的文件 '%s' 位于符号链接中"
+#: builtin/am.c:1606
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "仓库缺乏必要的数据对象以进行三方合并。"
 
-#: builtin/apply.c:3931
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s:补丁未应用"
+#: builtin/am.c:1608
+msgid "Using index info to reconstruct a base tree..."
+msgstr "使用索引来重建一个(三方合并的)基础目录树..."
 
-#: builtin/apply.c:3945
-#, c-format
-msgid "Checking patch %s..."
-msgstr "检查补丁 %s..."
+#: builtin/am.c:1627
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"您是否曾手动编辑过您的补丁?\n"
+"无法应用补丁到索引中的数据对象上。"
 
-#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "对路径 '%s' 的 make_cache_entry 操作失败"
+#: builtin/am.c:1633
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "回落到基础版本上打补丁及进行三方合并..."
 
-#: builtin/apply.c:4182
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "不能从索引中移除 %s"
+#: builtin/am.c:1658
+msgid "Failed to merge in the changes."
+msgstr "无法合并变更。"
 
-#: builtin/apply.c:4215
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "子模组 %s 损坏的补丁"
+#: builtin/am.c:1682 builtin/merge.c:631
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree 无法写入一树对象"
 
-#: builtin/apply.c:4219
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "不能枚举新建文件 '%s' 的状态"
+#: builtin/am.c:1689
+msgid "applying to an empty history"
+msgstr "正应用到一个空历史上"
 
-#: builtin/apply.c:4224
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "不能为新建文件 %s 创建后端存储"
+#: builtin/am.c:1702 builtin/commit.c:1764 builtin/merge.c:802
+#: builtin/merge.c:827
+msgid "failed to write commit object"
+msgstr "无法写提交对象"
 
-#: builtin/apply.c:4227 builtin/apply.c:4340
+#: builtin/am.c:1735 builtin/am.c:1739
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "无法为 %s 添加缓存条目"
+msgid "cannot resume: %s does not exist."
+msgstr "无法继续:%s 不存在。"
 
-#: builtin/apply.c:4260
-#, c-format
-msgid "closing file '%s'"
-msgstr "关闭文件 '%s'"
+#: builtin/am.c:1755
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr "标准输入没有和终端关联,不能进行交互式操作。"
+
+#: builtin/am.c:1760
+msgid "Commit Body is:"
+msgstr "提交内容为:"
+
+#  译者:注意保持句尾空格
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1770
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "应用?是[y]/否[n]/编辑[e]/查看补丁[v]/应用所有[a]:"
 
-#: builtin/apply.c:4313
+#: builtin/am.c:1820
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "不能写文件 '%s' 权限 %o"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "脏索引:不能应用补丁(脏文件:%s)"
 
-#: builtin/apply.c:4403
+#: builtin/am.c:1860 builtin/am.c:1932
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "成功应用补丁 %s。"
+msgid "Applying: %.*s"
+msgstr "应用:%.*s"
 
-#: builtin/apply.c:4411
-msgid "internal error"
-msgstr "内部错误"
+#: builtin/am.c:1876
+msgid "No changes -- Patch already applied."
+msgstr "没有变更 —— 补丁已经应用过。"
 
-#: builtin/apply.c:4414
+#: builtin/am.c:1884
 #, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "应用 %%s 个补丁,其中 %d 个被拒绝..."
-msgstr[1] "应用 %%s 个补丁,其中 %d 个被拒绝..."
+msgid "Patch failed at %s %.*s"
+msgstr "打补丁失败于 %s %.*s"
 
-#: builtin/apply.c:4424
+#: builtin/am.c:1890
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "截短 .rej 文件名为 %.*s.rej"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "失败的补丁文件副本位于:%s"
 
-#: builtin/apply.c:4432
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "不能打开 %s:%s"
+#: builtin/am.c:1935
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"没有变更 —— 您是不是忘了执行 'git add'?\n"
+"如果没有什么要添加到暂存区的,则很可能是其它提交已经引入了相同的变更。\n"
+"您也许想要跳过这个补丁。"
 
-#: builtin/apply.c:4445
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "第 #%d 个片段成功应用。"
+#: builtin/am.c:1942
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"您的索引中仍有未合并的路径。\n"
+"您是否忘了执行 'git add'?"
 
-#: builtin/apply.c:4448
+#: builtin/am.c:2050 builtin/am.c:2054 builtin/am.c:2066 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "拒绝第 #%d 个片段。"
+msgid "Could not parse object '%s'."
+msgstr "不能解析对象 '%s'。"
+
+#: builtin/am.c:2102
+msgid "failed to clean index"
+msgstr "无法清空索引"
+
+#: builtin/am.c:2136
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr "您好像在上一次 'am' 失败后移动了 HEAD。未回退至 ORIG_HEAD"
 
-#: builtin/apply.c:4537
+#: builtin/am.c:2199
 #, c-format
-msgid "Skipped patch '%s'."
-msgstr "略过补丁 '%s'。"
+msgid "Invalid value for --patch-format: %s"
+msgstr "无效的 --patch-format 值:%s"
 
-#: builtin/apply.c:4545
-msgid "unrecognized input"
-msgstr "未能识别的输入"
+#: builtin/am.c:2232
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<选项>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4556
-msgid "unable to read index file"
-msgstr "无法读取索引文件"
+#: builtin/am.c:2233
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<选项>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4701
-msgid "--3way outside a repository"
-msgstr "--3way 在一个仓库之外"
+#: builtin/am.c:2239
+msgid "run interactively"
+msgstr "以交互式方式运行"
 
-#: builtin/apply.c:4709
-msgid "--index outside a repository"
-msgstr "--index 在一个仓库之外"
+#: builtin/am.c:2241
+msgid "historical option -- no-op"
+msgstr "老的参数 —— 无作用"
 
-#: builtin/apply.c:4712
-msgid "--cached outside a repository"
-msgstr "--cached 在一个仓库之外"
+#: builtin/am.c:2243
+msgid "allow fall back on 3way merging if needed"
+msgstr "如果必要,允许使用三方合并。"
 
-#: builtin/apply.c:4745
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "不能打开补丁 '%s'"
+#: builtin/am.c:2244 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:178
+msgid "be quiet"
+msgstr "静默模式"
+
+#: builtin/am.c:2246
+msgid "add a Signed-off-by line to the commit message"
+msgstr "在提交说明中添加一个 Signed-off-by 签名"
 
-#: builtin/apply.c:4760
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "抑制下仍有 %d 个空白字符误用"
-msgstr[1] "抑制下仍有 %d 个空白字符误用"
+#: builtin/am.c:2249
+msgid "recode into utf8 (default)"
+msgstr "使用 utf8 字符集(默认)"
 
-#: builtin/apply.c:4766 builtin/apply.c:4776
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d 行有空白字符误用。"
-msgstr[1] "%d 行有空白字符误用。"
+#: builtin/am.c:2251
+msgid "pass -k flag to git-mailinfo"
+msgstr "向 git-mailinfo 传递 -k 参数"
 
-#: builtin/apply.c:4800
-msgid "don't apply changes matching the given path"
-msgstr "不要应用与给出路径向匹配的变更"
+#: builtin/am.c:2253
+msgid "pass -b flag to git-mailinfo"
+msgstr "向 git-mailinfo 传递 -b 参数"
 
-#: builtin/apply.c:4803
-msgid "apply changes matching the given path"
-msgstr "åº\94ç\94¨ä¸\8eç»\99å\87ºè·¯å¾\84å\90\91å\8c¹é\85\8dç\9a\84å\8f\98æ\9b´"
+#: builtin/am.c:2255
+msgid "pass -m flag to git-mailinfo"
+msgstr "å\90\91 git-mailinfo ä¼ é\80\92 -m å\8f\82æ\95°"
 
-#: builtin/apply.c:4806
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "从传统的 diff 路径中移除指定数量的前导斜线"
+#: builtin/am.c:2257
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "针对 mbox 格式,向 git-mailsplit 传递 --keep-cr 参数"
 
-#: builtin/apply.c:4809
-msgid "ignore additions made by the patch"
-msgstr "忽略补丁中的添加的文件"
+#: builtin/am.c:2260
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr "不向 git-mailsplit 传递 --keep-cr 参数,覆盖 am.keepcr 的设置"
 
-#: builtin/apply.c:4811
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "ä¸\8dåº\94ç\94¨è¡¥ä¸\81ï¼\8cè\80\8cæ\98¯æ\98¾ç¤ºè¾\93å\85¥ç\9a\84å·®å¼\82ç»\9f计ï¼\88diffstatï¼\89"
+#: builtin/am.c:2263
+msgid "strip everything before a scissors line"
+msgstr "丢å¼\83è£\81å\88\87线å\89\8dç\9a\84æ\89\80æ\9c\89å\86\85容"
 
-#: builtin/apply.c:4815
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "以十进制数显示添加和删除的行数"
+#: builtin/am.c:2265 builtin/am.c:2268 builtin/am.c:2271 builtin/am.c:2274
+#: builtin/am.c:2277 builtin/am.c:2280 builtin/am.c:2283 builtin/am.c:2286
+#: builtin/am.c:2292
+msgid "pass it through git-apply"
+msgstr "传递给 git-apply"
 
-#: builtin/apply.c:4817
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "不应用补丁,而是显示输入的概要"
+#: builtin/am.c:2282 builtin/fmt-merge-msg.c:662 builtin/fmt-merge-msg.c:665
+#: builtin/grep.c:1045 builtin/merge.c:201 builtin/pull.c:135
+#: builtin/pull.c:194 builtin/repack.c:187 builtin/repack.c:191
+#: builtin/show-branch.c:637 builtin/show-ref.c:169 builtin/tag.c:398
+#: parse-options.h:132 parse-options.h:134 parse-options.h:245
+msgid "n"
+msgstr "n"
 
-#: builtin/apply.c:4819
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "不应用补丁,而是查看补丁是否可应用"
+#: builtin/am.c:2288 builtin/branch.c:592 builtin/for-each-ref.c:37
+#: builtin/replace.c:443 builtin/tag.c:433 builtin/verify-tag.c:38
+msgid "format"
+msgstr "格式"
 
-#: builtin/apply.c:4821
-msgid "make sure the patch is applicable to the current index"
-msgstr "确认补丁可以应用到当前索引"
+#: builtin/am.c:2289
+msgid "format the patch(es) are in"
+msgstr "补丁的格式"
 
-#: builtin/apply.c:4823
-msgid "apply a patch without touching the working tree"
-msgstr "应用补丁而不修改工作区"
+#: builtin/am.c:2295
+msgid "override error message when patch failure occurs"
+msgstr "打补丁失败时显示的错误信息"
 
-#: builtin/apply.c:4825
-msgid "accept a patch that touches outside the working area"
-msgstr "接受修改工作区之外文件的补丁"
+#: builtin/am.c:2297
+msgid "continue applying patches after resolving a conflict"
+msgstr "冲突解决后继续应用补丁"
 
-#: builtin/apply.c:4827
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "è¿\98åº\94ç\94¨æ­¤è¡¥ä¸\81ï¼\88ä¸\8e --stat/--summary/--check é\80\89项å\90\8cæ\97¶ä½¿ç\94¨ï¼\89"
+#: builtin/am.c:2300
+msgid "synonyms for --continue"
+msgstr "å\92\8c --continue å\90\8cä¹\89"
 
-#: builtin/apply.c:4829
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "如果一个补丁不能应用则尝试三方合并"
+#: builtin/am.c:2303
+msgid "skip the current patch"
+msgstr "跳过当前补丁"
 
-#: builtin/apply.c:4831
-msgid "build a temporary index based on embedded index information"
-msgstr "创建一个临时索引基于嵌入的索引信息"
+#: builtin/am.c:2306
+msgid "restore the original branch and abort the patching operation."
+msgstr "恢复原始分支并终止打补丁操作。"
 
-#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426
-msgid "paths are separated with NUL character"
-msgstr "路径以 NUL 字符分隔"
+#: builtin/am.c:2310
+msgid "lie about committer date"
+msgstr "将作者日期作为提交日期"
 
-#: builtin/apply.c:4836
-msgid "ensure at least <n> lines of context match"
-msgstr "ç¡®ä¿\9dè\87³å°\91å\8c¹é\85\8d <n> è¡\8cä¸\8aä¸\8bæ\96\87"
+#: builtin/am.c:2312
+msgid "use current timestamp for author date"
+msgstr "ç\94¨å½\93å\89\8dæ\97¶é\97´ä½\9c为ä½\9cè\80\85æ\97¥æ\9c\9f"
 
-#: builtin/apply.c:4838
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "检查新增和修改的行中间的空白字符滥用"
+#: builtin/am.c:2314 builtin/commit.c:1600 builtin/merge.c:232
+#: builtin/pull.c:165 builtin/revert.c:111 builtin/tag.c:413
+msgid "key-id"
+msgstr "key-id"
 
-#: builtin/apply.c:4841 builtin/apply.c:4844
-msgid "ignore changes in whitespace when finding context"
-msgstr "查找上下文时忽略空白字符的变更"
+#: builtin/am.c:2315
+msgid "GPG-sign commits"
+msgstr "使用 GPG 签名提交"
 
-#: builtin/apply.c:4847
-msgid "apply the patch in reverse"
-msgstr "反向应用补丁"
+#: builtin/am.c:2318
+msgid "(internal use for git-rebase)"
+msgstr "(内部使用,用于 git-rebase)"
 
-#: builtin/apply.c:4849
-msgid "don't expect at least one line of context"
-msgstr "无需至少一行上下文"
+#: builtin/am.c:2333
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"参数 -b/--binary 已经很长时间不做任何实质操作了,并且将被移除。\n"
+"请不要再使用它了。"
 
-#: builtin/apply.c:4851
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中"
+#: builtin/am.c:2340
+msgid "failed to read the index"
+msgstr "无法读取索引"
 
-#: builtin/apply.c:4853
-msgid "allow overlapping hunks"
-msgstr "允许重叠的补丁片段"
+#: builtin/am.c:2355
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "之前的变基目录 %s 仍然存在,但却提供了 mbox。"
 
-#: builtin/apply.c:4856
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "允许不正确的文件末尾换行符"
+#: builtin/am.c:2379
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"发现了错误的 %s 目录。\n"
+"使用 \"git am --abort\" 删除它。"
 
-#: builtin/apply.c:4859
-msgid "do not trust the line counts in the hunk headers"
-msgstr "不信任补丁片段的头信息中的行号"
+#: builtin/am.c:2385
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "解决操作未进行,我们不会继续。"
 
-#: builtin/apply.c:4862
-msgid "prepend <root> to all filenames"
-msgstr "为所有文件名前添加 <根目录>"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<选项>] [<补丁>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -4116,18 +5168,13 @@ msgstr "git archive:应为 ACK/NACK,却得到 EOF"
 msgid "git archive: NACK %s"
 msgstr "git archive:NACK %s"
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "远程错误:%s"
-
 #: builtin/archive.c:64
 msgid "git archive: protocol error"
 msgstr "git archive:协议错误"
 
 #: builtin/archive.c:68
 msgid "git archive: expected a flush"
-msgstr "git archive:应刷新"
+msgstr "git archive:应有一个 flush 刷新"
 
 #: builtin/bisect--helper.c:7
 msgid "git bisect--helper --next-all [--no-checkout]"
@@ -4149,116 +5196,158 @@ msgstr "git blame [<选项>] [<版本选项>] [<版本>] [--] <文件>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<版本选项> 的文档记录在 git-rev-list(1) 中"
 
-#: builtin/blame.c:1781
+#: builtin/blame.c:1777
 msgid "Blaming lines"
 msgstr "追踪代码行"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2573
 msgid "Show blame entries as we find them, incrementally"
 msgstr "增量式地显示发现的 blame 条目"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2574
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "边界提交显示空的 SHA-1(默认:关闭)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2575
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "不把根提交作为边界(默认:关闭)"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2576
 msgid "Show work cost statistics"
 msgstr "显示命令消耗统计"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2577
 msgid "Force progress reporting"
 msgstr "强制进度显示"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2578
 msgid "Show output score for blame entries"
 msgstr "显示判断 blame 条目位移的得分诊断信息"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2579
 msgid "Show original filename (Default: auto)"
 msgstr "显示原始文件名(默认:自动)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2580
 msgid "Show original linenumber (Default: off)"
 msgstr "显示原始的行号(默认:关闭)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2581
 msgid "Show in a format designed for machine consumption"
 msgstr "显示为一个适合机器读取的格式"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2582
 msgid "Show porcelain format with per-line commit information"
 msgstr "为每一行显示机器适用的提交信息"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2583
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "使用和 git-annotate 相同的输出模式(默认:关闭)"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2584
 msgid "Show raw timestamp (Default: off)"
 msgstr "显示原始时间戳(默认:关闭)"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2585
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "显示长的 SHA1 提交号(默认:关闭)"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2586
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "隐藏作者名字和时间戳(默认:关闭)"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2587
 msgid "Show author email instead of name (Default: off)"
 msgstr "显示作者的邮箱而不是名字(默认:关闭)"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2588
 msgid "Ignore whitespace differences"
 msgstr "忽略空白差异"
 
-#: builtin/blame.c:2552
+#: builtin/blame.c:2595
+msgid "Use an experimental heuristic to improve diffs"
+msgstr "使用一个试验性的启发式算法改进差异显示"
+
+#: builtin/blame.c:2597
 msgid "Spend extra cycles to find better match"
 msgstr "花费额外的循环来找到更好的匹配"
 
-#: builtin/blame.c:2553
+#: builtin/blame.c:2598
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "使用来自 <文件> 的修订集而不是调用 git-rev-list"
 
-#: builtin/blame.c:2554
+#: builtin/blame.c:2599
 msgid "Use <file>'s contents as the final image"
 msgstr "使用 <文件> 的内容作为最终的图片"
 
-#: builtin/blame.c:2555 builtin/blame.c:2556
+#: builtin/blame.c:2600 builtin/blame.c:2601
 msgid "score"
 msgstr "得分"
 
-#: builtin/blame.c:2555
+#: builtin/blame.c:2600
 msgid "Find line copies within and across files"
 msgstr "找到文件内及跨文件的行拷贝"
 
-#: builtin/blame.c:2556
+#: builtin/blame.c:2601
 msgid "Find line movements within and across files"
 msgstr "找到文件内及跨文件的行移动"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2557
+#: builtin/blame.c:2602
 msgid "Process only line range n,m, counting from 1"
 msgstr "只处理行范围在 n 和 m 之间的,从 1 开始"
 
+#: builtin/blame.c:2649
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr "--progress 不能和 --incremental 或 --porcelain 同时使用"
+
 #. TRANSLATORS: This string is used to tell us the maximum
 #. display width for a relative timestamp in "git blame"
 #. output.  For C locale, "4 years, 11 months ago", which
 #. takes 22 places, is the longest among various forms of
 #. relative timestamps, but your language may need more or
 #. fewer display columns.
-#: builtin/blame.c:2649
+#: builtin/blame.c:2697
 msgid "4 years, 11 months ago"
 msgstr "4 年 11 个月前"
 
+#: builtin/blame.c:2777
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents 和 --reverse 不能混用。"
+
+#: builtin/blame.c:2797
+msgid "cannot use --contents with final commit object name"
+msgstr "不能将 --contents 和最终的提交对象名共用"
+
+#: builtin/blame.c:2802
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr "--reverse 和 --first-parent 共用,需要指定最新的提交"
+
+#: builtin/blame.c:2829
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
+msgstr "--reverse 和 --first-parent 共用,需要第一祖先链上的提交范围"
+
+#: builtin/blame.c:2840
+#, c-format
+msgid "no such path %s in %s"
+msgstr "在 %2$s 中无此路径 %1$s"
+
+#: builtin/blame.c:2851
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "不能为路径 %2$s 读取数据对象 %1$s"
+
+#: builtin/blame.c:2870
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] "文件 %s 只有 %lu 行"
+msgstr[1] "文件 %s 只有 %lu 行"
+
 #: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<选项>] [-r | -a] [--merged | --no-merged]"
@@ -4279,8 +5368,12 @@ msgstr "git branch [<选项>] (-m | -M) [<旧分支>] <新分支>"
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<选项>] [-r | -a] [--points-at]"
 
+#: builtin/branch.c:31
+msgid "git branch [<options>] [-r | -a] [--format]"
+msgstr "git branch [<选项>] [-r | -a] [--format]"
+
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:143
+#: builtin/branch.c:144
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -4290,7 +5383,7 @@ msgstr ""
 "         '%s',但未合并到 HEAD。"
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:147
+#: builtin/branch.c:148
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -4299,12 +5392,12 @@ msgstr ""
 "并未删除分支 '%s', 虽然它已经合并到 HEAD,\n"
 "         然而却尚未被合并到分支 '%s' 。"
 
-#: builtin/branch.c:161
+#: builtin/branch.c:162
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "无法查询 '%s' 指向的提交对象"
 
-#: builtin/branch.c:165
+#: builtin/branch.c:166
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -4313,163 +5406,91 @@ msgstr ""
 "分支 '%s' 没有完全合并。\n"
 "如果您确认要删除它,执行 'git branch -D %s'。"
 
-#: builtin/branch.c:178
+#: builtin/branch.c:179
 msgid "Update of config-file failed"
 msgstr "无法更新 config 文件"
 
-#: builtin/branch.c:206
+#: builtin/branch.c:210
 msgid "cannot use -a with -d"
 msgstr "不能将 -a 和 -d 同时使用"
 
-#: builtin/branch.c:212
+#: builtin/branch.c:216
 msgid "Couldn't look up commit object for HEAD"
 msgstr "无法查询 HEAD 指向的提交对象"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:230
 #, c-format
 msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr "无法删除检出于 '%2$s' 的分支 '%1$s'。"
 
-#: builtin/branch.c:241
+#: builtin/branch.c:245
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "未能找到远程跟踪分支 '%s'。"
 
-#: builtin/branch.c:242
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "分支 '%s' 未发现。"
 
-#: builtin/branch.c:257
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "无法删除远程跟踪分支 '%s'"
 
-#: builtin/branch.c:258
+#: builtin/branch.c:262
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "无法删除分支 '%s'"
 
-#: builtin/branch.c:265
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "已删除远程跟踪分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:266
+#: builtin/branch.c:270
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "已删除分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:312
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: 丢失]"
-
-#: builtin/branch.c:317
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
-
-#: builtin/branch.c:322
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s:落后 %d]"
-
-#: builtin/branch.c:324
-#, c-format
-msgid "[behind %d]"
-msgstr "[落后 %d]"
-
-#: builtin/branch.c:328
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s:领先 %d]"
-
-#: builtin/branch.c:330
-#, c-format
-msgid "[ahead %d]"
-msgstr "[领先 %d]"
-
-#: builtin/branch.c:333
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s:领先 %d,落后 %d]"
-
-#: builtin/branch.c:336
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[领先 %d,落后 %d]"
-
-#: builtin/branch.c:349
-msgid " **** invalid ref ****"
-msgstr " **** 无效引用 ****"
-
-#: builtin/branch.c:375
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(非分支,正变基 %s)"
-
-#: builtin/branch.c:378
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(非分支,二分查找开始于 %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached at " in wt-status.c
-#: builtin/branch.c:384
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(头指针分离于 %s)"
-
-#. TRANSLATORS: make sure this matches
-#. "HEAD detached from " in wt-status.c
-#: builtin/branch.c:389
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(头指针分离自 %s)"
-
-#: builtin/branch.c:393
-msgid "(no branch)"
-msgstr "(非分支)"
-
-#: builtin/branch.c:544
+#: builtin/branch.c:441
 #, c-format
 msgid "Branch %s is being rebased at %s"
 msgstr "分支 %s 正被变基到 %s"
 
-#: builtin/branch.c:548
+#: builtin/branch.c:445
 #, c-format
 msgid "Branch %s is being bisected at %s"
 msgstr "分支 %s 正被二分查找于 %s"
 
-#: builtin/branch.c:563
+#: builtin/branch.c:460
 msgid "cannot rename the current branch while not on any."
 msgstr "无法重命名当前分支因为不处于任何分支上。"
 
-#: builtin/branch.c:573
+#: builtin/branch.c:470
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "无效的分支名:'%s'"
 
-#: builtin/branch.c:590
+#: builtin/branch.c:487
 msgid "Branch rename failed"
 msgstr "分支重命名失败"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:490
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "重命名掉一个错误命名的旧分支 '%s'"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:493
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "分支重命名为 %s,但 HEAD 没有更新!"
 
-#: builtin/branch.c:604
+#: builtin/branch.c:502
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "分支被重命名,但更新 config 文件失败"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:518
 #, c-format
 msgid ""
 "Please edit the description for the branch\n"
@@ -4480,196 +5501,213 @@ msgstr ""
 "  %s\n"
 "以 '%c' 开头的行将被过滤。\n"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:551
 msgid "Generic options"
 msgstr "通用选项"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:553
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "显示哈希值和主题,若参数出现两次则显示上游分支"
 
-#: builtin/branch.c:654
+#: builtin/branch.c:554
 msgid "suppress informational messages"
 msgstr "不显示信息"
 
-#: builtin/branch.c:655
+#: builtin/branch.c:555
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "设置跟踪模式(参见 git-pull(1))"
 
-#: builtin/branch.c:657
+#: builtin/branch.c:557
 msgid "change upstream info"
 msgstr "改变上游信息"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "upstream"
 msgstr "上游"
 
-#: builtin/branch.c:659
+#: builtin/branch.c:559
 msgid "change the upstream info"
 msgstr "改变上游信息"
 
-#: builtin/branch.c:661
+#: builtin/branch.c:560
+msgid "Unset the upstream info"
+msgstr "取消上游信息的设置"
+
+#: builtin/branch.c:561
 msgid "use colored output"
 msgstr "使用彩色输出"
 
-#: builtin/branch.c:662
+#: builtin/branch.c:562
 msgid "act on remote-tracking branches"
 msgstr "作用于远程跟踪分支"
 
-#: builtin/branch.c:664 builtin/branch.c:665
+#: builtin/branch.c:564 builtin/branch.c:566
 msgid "print only branches that contain the commit"
 msgstr "只打印包含该提交的分支"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:565 builtin/branch.c:567
+msgid "print only branches that don't contain the commit"
+msgstr "只打印不包含该提交的分支"
+
+#: builtin/branch.c:570
 msgid "Specific git-branch actions:"
 msgstr "具体的 git-branch 动作:"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:571
 msgid "list both remote-tracking and local branches"
 msgstr "列出远程跟踪及本地分支"
 
-#: builtin/branch.c:671
+#: builtin/branch.c:573
 msgid "delete fully merged branch"
 msgstr "删除完全合并的分支"
 
-#: builtin/branch.c:672
+#: builtin/branch.c:574
 msgid "delete branch (even if not merged)"
 msgstr "删除分支(即使没有合并)"
 
-#: builtin/branch.c:673
+#: builtin/branch.c:575
 msgid "move/rename a branch and its reflog"
 msgstr "移动/重命名一个分支,以及它的引用日志"
 
-#: builtin/branch.c:674
+#: builtin/branch.c:576
 msgid "move/rename a branch, even if target exists"
 msgstr "移动/重命名一个分支,即使目标已存在"
 
-#: builtin/branch.c:675
+#: builtin/branch.c:577
 msgid "list branch names"
 msgstr "列出分支名"
 
-#: builtin/branch.c:676
+#: builtin/branch.c:578
 msgid "create the branch's reflog"
 msgstr "创建分支的引用日志"
 
-#: builtin/branch.c:678
+#: builtin/branch.c:580
 msgid "edit the description for the branch"
 msgstr "标记分支的描述"
 
-#: builtin/branch.c:679
+#: builtin/branch.c:581
 msgid "force creation, move/rename, deletion"
 msgstr "强制创建、移动/重命名、删除"
 
-#: builtin/branch.c:680
+#: builtin/branch.c:582
 msgid "print only branches that are merged"
 msgstr "只打印已经合并的分支"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:583
 msgid "print only branches that are not merged"
 msgstr "只打印尚未合并的分支"
 
-#: builtin/branch.c:682
+#: builtin/branch.c:584
 msgid "list branches in columns"
 msgstr "以列的方式显示分支"
 
-#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:585 builtin/for-each-ref.c:38 builtin/tag.c:426
 msgid "key"
 msgstr "key"
 
-#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:586 builtin/for-each-ref.c:39 builtin/tag.c:427
 msgid "field name to sort on"
 msgstr "排序的字段名"
 
-#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402
-#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568
-#: builtin/tag.c:369
+#: builtin/branch.c:588 builtin/for-each-ref.c:41 builtin/notes.c:404
+#: builtin/notes.c:407 builtin/notes.c:567 builtin/notes.c:570
+#: builtin/tag.c:429
 msgid "object"
 msgstr "对象"
 
-#: builtin/branch.c:687
+#: builtin/branch.c:589
 msgid "print only branches of the object"
 msgstr "只打印指向该对象的分支"
 
-#: builtin/branch.c:705
+#: builtin/branch.c:591 builtin/for-each-ref.c:47 builtin/tag.c:434
+msgid "sorting and filtering are case insensitive"
+msgstr "排序和过滤属于大小写不敏感"
+
+#: builtin/branch.c:592 builtin/for-each-ref.c:37 builtin/tag.c:433
+#: builtin/verify-tag.c:38
+msgid "format to use for the output"
+msgstr "输出格式"
+
+#: builtin/branch.c:611
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "无法将 HEAD 解析为有效引用。"
 
-#: builtin/branch.c:709 builtin/clone.c:707
+#: builtin/branch.c:615 builtin/clone.c:724
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD 没有位于 /refs/heads 之下!"
 
-#: builtin/branch.c:729
+#: builtin/branch.c:638
 msgid "--column and --verbose are incompatible"
 msgstr "--column 和 --verbose 不兼容"
 
-#: builtin/branch.c:740 builtin/branch.c:782
+#: builtin/branch.c:649 builtin/branch.c:701
 msgid "branch name required"
 msgstr "必须提供分支名"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:677
 msgid "Cannot give description to detached HEAD"
 msgstr "不能向分离头指针提供描述"
 
-#: builtin/branch.c:763
+#: builtin/branch.c:682
 msgid "cannot edit description of more than one branch"
 msgstr "不能为一个以上的分支编辑描述"
 
-#: builtin/branch.c:770
+#: builtin/branch.c:689
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "分支 '%s' 尚无提交。"
 
-#: builtin/branch.c:773
+#: builtin/branch.c:692
 #, c-format
 msgid "No branch named '%s'."
 msgstr "没有分支 '%s'。"
 
-#: builtin/branch.c:788
+#: builtin/branch.c:707
 msgid "too many branches for a rename operation"
 msgstr "为重命名操作提供了太多的分支名"
 
-#: builtin/branch.c:793
+#: builtin/branch.c:712
 msgid "too many branches to set new upstream"
 msgstr "为设置新上游提供了太多的分支名"
 
-#: builtin/branch.c:797
+#: builtin/branch.c:716
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr "无法设置 HEAD 的上游为 %s,因为 HEAD 没有指向任何分支。"
 
-#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#: builtin/branch.c:719 builtin/branch.c:741 builtin/branch.c:762
 #, c-format
 msgid "no such branch '%s'"
 msgstr "没有此分支 '%s'"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:723
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "分支 '%s' 不存在"
 
-#: builtin/branch.c:816
+#: builtin/branch.c:735
 msgid "too many branches to unset upstream"
 msgstr "为取消上游设置操作提供了太多的分支名"
 
-#: builtin/branch.c:820
+#: builtin/branch.c:739
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "无法取消 HEAD 的上游设置因为它没有指向一个分支"
 
-#: builtin/branch.c:826
+#: builtin/branch.c:745
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "分支 '%s' 没有上游信息"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:759
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "手工创建 'HEAD' 没有意义"
 
-#: builtin/branch.c:846
+#: builtin/branch.c:765
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "'git branch' 的 -a 和 -r 选项带一个分支名参数没有意义"
 
-#: builtin/branch.c:849
+#: builtin/branch.c:768
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4677,7 +5715,7 @@ msgid ""
 msgstr ""
 "选项 --set-upstream 已弃用并将被移除。考虑使用 --track 或 --set-upstream-to\n"
 
-#: builtin/branch.c:866
+#: builtin/branch.c:785
 #, c-format
 msgid ""
 "\n"
@@ -4688,76 +5726,92 @@ msgstr ""
 "如果你想用 '%s' 跟踪 '%s', 这么做:\n"
 "\n"
 
-#: builtin/bundle.c:51
+#: builtin/bundle.c:45
 #, c-format
 msgid "%s is okay\n"
 msgstr "%s 可以\n"
 
-#: builtin/bundle.c:64
+#: builtin/bundle.c:58
 msgid "Need a repository to create a bundle."
 msgstr "需要一个仓库来创建包。"
 
-#: builtin/bundle.c:68
+#: builtin/bundle.c:62
 msgid "Need a repository to unbundle."
 msgstr "需要一个仓库来解包。"
 
-#: builtin/cat-file.c:443
+#: builtin/cat-file.c:513
 msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<类型"
-">|--textconv) <对象>"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <类型> | --textconv | --filters) [--path=<路径>] <对象>"
 
-#: builtin/cat-file.c:444
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
+msgstr ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/cat-file.c:481
+#: builtin/cat-file.c:551
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<类型> 可以是其中之一:blob、tree、commit、tag"
 
-#: builtin/cat-file.c:482
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "显示对象类型"
 
-#: builtin/cat-file.c:483
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "显示对象大小"
 
-#: builtin/cat-file.c:485
+#: builtin/cat-file.c:555
 msgid "exit with zero when there's no error"
 msgstr "当没有错误时退出并返回零"
 
-#: builtin/cat-file.c:486
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "美观地打印对象的内容"
 
-#: builtin/cat-file.c:488
+#: builtin/cat-file.c:558
 msgid "for blob objects, run textconv on object's content"
-msgstr "对于数据对象,对其内容执行 textconv"
+msgstr "对于数据对象,对其内容做文本转换"
+
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
+msgstr "对于数据对象,对其内容做过滤"
+
+#: builtin/cat-file.c:561 git-submodule.sh:943
+msgid "blob"
+msgstr "数据对象"
+
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
+msgstr "对于 --textconv/--filters 使用一个特定的路径"
 
-#: builtin/cat-file.c:490
+#: builtin/cat-file.c:564
 msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr "允许 -s 和 -t 对损坏的对象生效"
 
-#: builtin/cat-file.c:491
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "缓冲 --batch 的输出"
 
-#: builtin/cat-file.c:493
+#: builtin/cat-file.c:567
 msgid "show info and content of objects fed from the standard input"
 msgstr "显示从标准输入提供的对象的信息和内容"
 
-#: builtin/cat-file.c:496
+#: builtin/cat-file.c:570
 msgid "show info about objects fed from the standard input"
 msgstr "显示从标准输入提供的对象的信息"
 
-#: builtin/cat-file.c:499
+#: builtin/cat-file.c:573
 msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr "跟随树内符号链接(和 --batch 或 --batch-check 共用)"
 
-#: builtin/cat-file.c:501
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "使用 --batch 或 --batch-check 参数显示所有对象"
 
@@ -4777,7 +5831,7 @@ msgstr "报告设置在文件上的所有属性"
 msgid "use .gitattributes only from the index"
 msgstr "只使用索引中的 .gitattributes"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "从标准输入读出文件名"
 
@@ -4785,7 +5839,7 @@ msgstr "从标准输入读出文件名"
 msgid "terminate input and output records by a NUL character"
 msgstr "输入和输出的记录使用 NUL 字符终结"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1158 builtin/gc.c:356
 msgid "suppress progress reporting"
 msgstr "不显示进度报告"
 
@@ -4875,9 +5929,9 @@ msgid "write the content to temporary files"
 msgstr "将内容写入临时文件"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491
-#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497
-#: builtin/submodule--helper.c:830 builtin/worktree.c:469
+#: builtin/submodule--helper.c:635 builtin/submodule--helper.c:638
+#: builtin/submodule--helper.c:644 builtin/submodule--helper.c:980
+#: builtin/worktree.c:477
 msgid "string"
 msgstr "字符串"
 
@@ -4889,114 +5943,114 @@ msgstr "在创建文件时,在前面加上 <字符串>"
 msgid "copy out the files from named stage"
 msgstr "从指定暂存区中拷出文件"
 
-#: builtin/checkout.c:25
+#: builtin/checkout.c:27
 msgid "git checkout [<options>] <branch>"
 msgstr "git checkout [<选项>] <分支>"
 
-#: builtin/checkout.c:26
+#: builtin/checkout.c:28
 msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr "git checkout [<选项>] [<分支>] -- <文件>..."
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
+#: builtin/checkout.c:153 builtin/checkout.c:186
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "路径 '%s' 没有我们的版本"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/checkout.c:155 builtin/checkout.c:188
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "路径 '%s' 没有他们的版本"
 
-#: builtin/checkout.c:152
+#: builtin/checkout.c:171
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "路径 '%s' 没有全部必须的版本"
 
-#: builtin/checkout.c:196
+#: builtin/checkout.c:215
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "路径 '%s' 没有必须的版本"
 
-#: builtin/checkout.c:213
+#: builtin/checkout.c:232
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "path '%s':无法合并"
 
-#: builtin/checkout.c:230
+#: builtin/checkout.c:249
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "无法为 '%s' 添加合并结果"
 
-#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
-#: builtin/checkout.c:259
+#: builtin/checkout.c:269 builtin/checkout.c:272 builtin/checkout.c:275
+#: builtin/checkout.c:278
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' 不能在更新路径时使用"
 
-#: builtin/checkout.c:262 builtin/checkout.c:265
+#: builtin/checkout.c:281 builtin/checkout.c:284
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' 不能和 %s 同时使用"
 
-#: builtin/checkout.c:268
+#: builtin/checkout.c:287
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "不能同时更新路径并切换到分支'%s'。"
 
-#: builtin/checkout.c:339 builtin/checkout.c:346
+#: builtin/checkout.c:358 builtin/checkout.c:365
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "路径 '%s' 未合并"
 
-#: builtin/checkout.c:495
+#: builtin/checkout.c:513
 msgid "you need to resolve your current index first"
 msgstr "您需要先解决当前索引的冲突"
 
-#: builtin/checkout.c:625
+#: builtin/checkout.c:644
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "不能对 '%s' 执行 reflog 操作:%s\n"
 
-#: builtin/checkout.c:664
+#: builtin/checkout.c:685
 msgid "HEAD is now at"
 msgstr "HEAD 目前位于"
 
-#: builtin/checkout.c:668 builtin/clone.c:661
+#: builtin/checkout.c:689 builtin/clone.c:678
 msgid "unable to update HEAD"
 msgstr "不能更新 HEAD"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:693
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "重置分支 '%s'\n"
 
-#: builtin/checkout.c:675
+#: builtin/checkout.c:696
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "已经位于 '%s'\n"
 
-#: builtin/checkout.c:679
+#: builtin/checkout.c:700
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "切换并重置分支 '%s'\n"
 
-#: builtin/checkout.c:681 builtin/checkout.c:1070
+#: builtin/checkout.c:702 builtin/checkout.c:1090
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "切换到一个新分支 '%s'\n"
 
-#: builtin/checkout.c:683
+#: builtin/checkout.c:704
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "切换到分支 '%s'\n"
 
 #  译者:注意保持前导空格
-#: builtin/checkout.c:734
+#: builtin/checkout.c:755
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... 及其它 %d 个。\n"
 
-#: builtin/checkout.c:740
+#: builtin/checkout.c:761
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -5017,7 +6071,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:780
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -5044,150 +6098,150 @@ msgstr[1] ""
 " git branch <新分支名> %s\n"
 "\n"
 
-#: builtin/checkout.c:795
+#: builtin/checkout.c:816
 msgid "internal error in revision walk"
 msgstr "在版本遍历时遇到内部错误"
 
-#: builtin/checkout.c:799
+#: builtin/checkout.c:820
 msgid "Previous HEAD position was"
 msgstr "之前的 HEAD 位置是"
 
-#: builtin/checkout.c:826 builtin/checkout.c:1065
+#: builtin/checkout.c:847 builtin/checkout.c:1085
 msgid "You are on a branch yet to be born"
 msgstr "您位于一个尚未初始化的分支"
 
-#: builtin/checkout.c:971
+#: builtin/checkout.c:991
 #, c-format
 msgid "only one reference expected, %d given."
-msgstr "å\8fªè¦\81一个引用,却给出了 %d 个"
+msgstr "åº\94å\8fªæ\9c\89一个引用,却给出了 %d 个"
 
-#: builtin/checkout.c:1011 builtin/worktree.c:214
+#: builtin/checkout.c:1031 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "无效引用:%s"
 
-#: builtin/checkout.c:1040
+#: builtin/checkout.c:1060
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "引用不是一个树:%s"
 
-#: builtin/checkout.c:1079
+#: builtin/checkout.c:1099
 msgid "paths cannot be used with switching branches"
 msgstr "路径不能和切换分支同时使用"
 
-#: builtin/checkout.c:1082 builtin/checkout.c:1086
+#: builtin/checkout.c:1102 builtin/checkout.c:1106
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' 不能和切换分支同时使用"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1110 builtin/checkout.c:1113 builtin/checkout.c:1118
+#: builtin/checkout.c:1121
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' 不能和 '%s' 同时使用"
 
-#: builtin/checkout.c:1106
+#: builtin/checkout.c:1126
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "不能切换分支到一个非提交 '%s'"
 
-#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324
-#: builtin/worktree.c:326
+#: builtin/checkout.c:1159 builtin/checkout.c:1161 builtin/clone.c:111
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:329
+#: builtin/worktree.c:331
 msgid "branch"
 msgstr "分支"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1160
 msgid "create and checkout a new branch"
 msgstr "创建并检出一个新的分支"
 
-#: builtin/checkout.c:1142
+#: builtin/checkout.c:1162
 msgid "create/reset and checkout a branch"
 msgstr "创建/重置并检出一个分支"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1163
 msgid "create reflog for new branch"
 msgstr "为新的分支创建引用日志"
 
-#: builtin/checkout.c:1144 builtin/worktree.c:328
+#: builtin/checkout.c:1164 builtin/worktree.c:333
 msgid "detach HEAD at named commit"
 msgstr "HEAD 从指定的提交分离"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1165
 msgid "set upstream info for new branch"
 msgstr "为新的分支设置上游信息"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new-branch"
 msgstr "新分支"
 
-#: builtin/checkout.c:1147
+#: builtin/checkout.c:1167
 msgid "new unparented branch"
 msgstr "新的没有父提交的分支"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1168
 msgid "checkout our version for unmerged files"
 msgstr "对尚未合并的文件检出我们的版本"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1170
 msgid "checkout their version for unmerged files"
 msgstr "对尚未合并的文件检出他们的版本"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1172
 msgid "force checkout (throw away local modifications)"
 msgstr "强制检出(丢弃本地修改)"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1173
 msgid "perform a 3-way merge with the new branch"
 msgstr "和新的分支执行三方合并"
 
-#: builtin/checkout.c:1154 builtin/merge.c:231
+#: builtin/checkout.c:1174 builtin/merge.c:234
 msgid "update ignored files (default)"
 msgstr "更新忽略的文件(默认)"
 
-#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250
+#: builtin/checkout.c:1175 builtin/log.c:1473 parse-options.h:251
 msgid "style"
 msgstr "风格"
 
-#: builtin/checkout.c:1156
+#: builtin/checkout.c:1176
 msgid "conflict style (merge or diff3)"
 msgstr "冲突输出风格(merge 或 diff3)"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1179
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "对路径不做稀疏检出的限制"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1181
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "二次猜测'git checkout <无此分支>'"
 
-#: builtin/checkout.c:1163
+#: builtin/checkout.c:1183
 msgid "do not check if another worktree is holding the given ref"
 msgstr "不检查指定的引用是否被其他工作区所占用"
 
-#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117
-#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536
-#: builtin/send-pack.c:168
+#: builtin/checkout.c:1187 builtin/clone.c:78 builtin/fetch.c:119
+#: builtin/merge.c:231 builtin/pull.c:117 builtin/push.c:539
+#: builtin/send-pack.c:172
 msgid "force progress reporting"
 msgstr "强制显示进度报告"
 
-#: builtin/checkout.c:1195
+#: builtin/checkout.c:1224
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b、-B 和 --orphan 是互斥的"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1241
 msgid "--track needs a branch name"
 msgstr "--track 需要一个分支名"
 
-#: builtin/checkout.c:1217
+#: builtin/checkout.c:1246
 msgid "Missing branch name; try -b"
 msgstr "缺少分支名;尝试 -b"
 
-#: builtin/checkout.c:1253
+#: builtin/checkout.c:1282
 msgid "invalid path specification"
 msgstr "无效的路径规格"
 
-#: builtin/checkout.c:1260
+#: builtin/checkout.c:1289
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -5196,12 +6250,12 @@ msgstr ""
 "不能同时更新路径并切换到分支'%s'。\n"
 "您是想要检出 '%s' 但其未能解析为提交么?"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1294
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout:--detach 不能接收路径参数 '%s'"
 
-#: builtin/checkout.c:1269
+#: builtin/checkout.c:1298
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -5239,19 +6293,21 @@ msgstr "将忽略仓库 %s\n"
 msgid "failed to remove %s"
 msgstr "无法删除 %s"
 
-#: builtin/clean.c:291
+#: builtin/clean.c:297 git-add--interactive.perl:614
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
 "foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+"           - (empty) select nothing\n"
 msgstr ""
 "帮助:\n"
 "1          - 通过编号选择一个选项\n"
-"foo        - 通过标题选择一个选项\n"
-"           - (空)什么也不选择"
+"foo        - 通过唯一前缀选择一个选项\n"
+"           - (空)什么也不选择\n"
 
-#: builtin/clean.c:295
+#: builtin/clean.c:301 git-add--interactive.perl:623
+#, c-format
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -5260,47 +6316,49 @@ msgid ""
 "foo        - select item based on unique prefix\n"
 "-...       - unselect specified items\n"
 "*          - choose all items\n"
-"           - (empty) finish selecting"
+"           - (empty) finish selecting\n"
 msgstr ""
 "帮助:\n"
 "1          - 选择一个选项\n"
 "3-5        - 选择一个范围内的所有选项\n"
 "2-3,6-9    - 选择多个范围内的所有选项\n"
-"foo        - 通过标题选择一个选项\n"
+"foo        - 通过唯一前缀选择一个选项\n"
 "-...       - 反选特定的选项\n"
 "*          - 选择所有选项\n"
-"           - (空)结束选择"
+"           - (空)结束选择\n"
 
-#: builtin/clean.c:511
-#, c-format
-msgid "Huh (%s)?"
-msgstr "嗯(%s)?"
+#: builtin/clean.c:517 git-add--interactive.perl:589
+#: git-add--interactive.perl:594
+#, c-format, perl-format
+msgid "Huh (%s)?\n"
+msgstr "嗯(%s)?\n"
 
-#: builtin/clean.c:653
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "输入模版以排除条目>> "
 
-#: builtin/clean.c:690
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "警告:无法找到和 %s 匹配的条目"
 
-#: builtin/clean.c:711
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "选择要删除的条目"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/clean.c:758
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "删除 %s [y/N]?"
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "再见。"
+#: builtin/clean.c:783 git-add--interactive.perl:1660
+#, c-format
+msgid "Bye.\n"
+msgstr "再见。\n"
 
-#: builtin/clean.c:785
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -5318,69 +6376,70 @@ msgstr ""
 "help                - 显示本帮助\n"
 "?                   - 显示如何在提示符下选择的帮助"
 
-#: builtin/clean.c:812
+#: builtin/clean.c:818 git-add--interactive.perl:1736
 msgid "*** Commands ***"
 msgstr "*** 命令 ***"
 
-#: builtin/clean.c:813
+#: builtin/clean.c:819 git-add--interactive.perl:1733
 msgid "What now"
 msgstr "请选择"
 
-#: builtin/clean.c:821
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "将删除如下条目:"
 msgstr[1] "将删除如下条目:"
 
-#: builtin/clean.c:838
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "没有要清理的文件,退出。"
 
-#: builtin/clean.c:869
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "不打印删除文件的名称"
 
-#: builtin/clean.c:871
+#: builtin/clean.c:877
 msgid "force"
 msgstr "强制"
 
-#: builtin/clean.c:872
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "交互式清除"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "删除整个目录"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724
-#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182
+#: builtin/clean.c:881 builtin/describe.c:449 builtin/describe.c:451
+#: builtin/grep.c:1063 builtin/ls-files.c:546 builtin/name-rev.c:348
+#: builtin/name-rev.c:350 builtin/show-ref.c:176
 msgid "pattern"
 msgstr "模式"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "添加 <模式> 到忽略规则"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "也删除忽略的文件"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "只删除忽略的文件"
 
-#: builtin/clean.c:897
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x 和 -X 不能同时使用"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:907
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 "clean.requireForce 设置为 true 且未提供 -i、-n 或 -f 选项,拒绝执行清理动作"
 
-#: builtin/clean.c:904
+#: builtin/clean.c:910
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -5391,113 +6450,134 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<选项>] [--] <仓库> [<路径>]"
 
-#: builtin/clone.c:62
+#: builtin/clone.c:80
 msgid "don't create a checkout"
 msgstr "不创建一个检出"
 
-#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476
+#: builtin/clone.c:81 builtin/clone.c:83 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "创建一个纯仓库"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:85
 msgid "create a mirror repository (implies bare)"
 msgstr "创建一个镜像仓库(也是纯仓库)"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:87
 msgid "to clone from a local repository"
 msgstr "从本地仓库克隆"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:89
 msgid "don't use local hardlinks, always copy"
 msgstr "不使用本地硬链接,始终复制"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:91
 msgid "setup as shared repository"
 msgstr "设置为共享仓库"
 
-#: builtin/clone.c:75 builtin/clone.c:77
+#: builtin/clone.c:93 builtin/clone.c:97
+msgid "pathspec"
+msgstr "路径规格"
+
+#: builtin/clone.c:93 builtin/clone.c:97
 msgid "initialize submodules in the clone"
 msgstr "在克隆时初始化子模组"
 
-#: builtin/clone.c:79
+#: builtin/clone.c:100
 msgid "number of submodules cloned in parallel"
 msgstr "并发克隆的子模组的数量"
 
-#: builtin/clone.c:80 builtin/init-db.c:473
+#: builtin/clone.c:101 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "模板目录"
 
-#: builtin/clone.c:81 builtin/init-db.c:474
+#: builtin/clone.c:102 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "模板目录将被使用"
 
-#: builtin/clone.c:83 builtin/submodule--helper.c:495
-#: builtin/submodule--helper.c:833
+#: builtin/clone.c:104 builtin/clone.c:106 builtin/submodule--helper.c:642
+#: builtin/submodule--helper.c:983
 msgid "reference repository"
 msgstr "参考仓库"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:108
 msgid "use --reference only while cloning"
 msgstr "仅在克隆时参考 --reference 指向的本地仓库"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:109 builtin/column.c:26 builtin/merge-file.c:43
 msgid "name"
 msgstr "名称"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:110
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "使用 <名称> 而不是 'origin' 去跟踪上游"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:112
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "检出 <分支> 而不是远程 HEAD"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:114
 msgid "path to git-upload-pack on the remote"
 msgstr "远程 git-upload-pack 路径"
 
-#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667
-#: builtin/pull.c:201
+#: builtin/clone.c:115 builtin/fetch.c:120 builtin/grep.c:1006
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "深度"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:116
 msgid "create a shallow clone of that depth"
 msgstr "创建一个指定深度的浅克隆"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:117 builtin/fetch.c:122 builtin/pack-objects.c:2918
+#: parse-options.h:142
+msgid "time"
+msgstr "时间"
+
+#: builtin/clone.c:118
+msgid "create a shallow clone since a specific time"
+msgstr "从一个特定时间创建一个浅克隆"
+
+#: builtin/clone.c:119 builtin/fetch.c:124
+msgid "revision"
+msgstr "版本"
+
+#: builtin/clone.c:120 builtin/fetch.c:125
+msgid "deepen history of shallow clone, excluding rev"
+msgstr "深化浅克隆的历史,除了特定版本"
+
+#: builtin/clone.c:122
 msgid "clone only one branch, HEAD or --branch"
 msgstr "只克隆一个分支、HEAD 或 --branch"
 
-#: builtin/clone.c:97
+#: builtin/clone.c:124
 msgid "any cloned submodules will be shallow"
 msgstr "子模组将以浅下载模式克隆"
 
-#: builtin/clone.c:98 builtin/init-db.c:482
+#: builtin/clone.c:125 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "git目录"
 
-#: builtin/clone.c:99 builtin/init-db.c:483
+#: builtin/clone.c:126 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "git目录和工作区分离"
 
-#: builtin/clone.c:100
+#: builtin/clone.c:127
 msgid "key=value"
 msgstr "key=value"
 
-#: builtin/clone.c:101
+#: builtin/clone.c:128
 msgid "set config inside the new repository"
 msgstr "在新仓库中设置配置信息"
 
-#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547
+#: builtin/clone.c:129 builtin/fetch.c:140 builtin/push.c:550
 msgid "use IPv4 addresses only"
 msgstr "只使用 IPv4 地址"
 
-#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549
+#: builtin/clone.c:131 builtin/fetch.c:142 builtin/push.c:552
 msgid "use IPv6 addresses only"
 msgstr "只使用 IPv6 地址"
 
-#: builtin/clone.c:241
+#: builtin/clone.c:268
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -5505,57 +6585,42 @@ msgstr ""
 "无法猜到目录名。\n"
 "请在命令行指定一个目录"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "尚不支持将参考仓库 '%s' 作为一个链接检出。"
-
-#: builtin/clone.c:309
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "参考仓库 '%s' 不是一个本地仓库。"
-
-#: builtin/clone.c:314
+#: builtin/clone.c:321
 #, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "参考仓库 '%s' 是一个浅克隆"
-
-#: builtin/clone.c:317
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "参考仓库 '%s' 已被嫁接"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: 不能为 '%s' 添加一个备用:%s\n"
 
-#: builtin/clone.c:376
+#: builtin/clone.c:393
 #, c-format
 msgid "failed to open '%s'"
 msgstr "无法打开 '%s'"
 
-#: builtin/clone.c:384
+#: builtin/clone.c:401
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s 存在且不是一个目录"
 
-#: builtin/clone.c:398
+#: builtin/clone.c:415
 #, c-format
 msgid "failed to stat %s\n"
-msgstr "无法枚举 %s 状态\n"
+msgstr "对 %s 调用 stat 失败\n"
 
-#: builtin/clone.c:420
+#: builtin/clone.c:437
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "无法创建链接 '%s'"
 
-#: builtin/clone.c:424
+#: builtin/clone.c:441
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "无法拷贝文件至 '%s'"
 
-#: builtin/clone.c:449
+#: builtin/clone.c:466
 #, c-format
 msgid "done.\n"
 msgstr "完成。\n"
 
-#: builtin/clone.c:461
+#: builtin/clone.c:478
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -5565,121 +6630,135 @@ msgstr ""
 "您可以通过 'git status' 检查哪些已被检出,然后使用命令\n"
 "'git checkout -f HEAD' 重试\n"
 
-#: builtin/clone.c:538
+#: builtin/clone.c:555
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "不能发现要克隆的远程分支 %s。"
 
-#: builtin/clone.c:633
+#: builtin/clone.c:650
 msgid "remote did not send all necessary objects"
 msgstr "远程没有发送所有必须的对象"
 
-#: builtin/clone.c:649
+#: builtin/clone.c:666
 #, c-format
 msgid "unable to update %s"
 msgstr "不能更新 %s"
 
-#: builtin/clone.c:698
+#: builtin/clone.c:715
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "远程 HEAD 指向一个不存在的引用,无法检出。\n"
 
-#: builtin/clone.c:729
+#: builtin/clone.c:746
 msgid "unable to checkout working tree"
 msgstr "不能检出工作区"
 
-#: builtin/clone.c:766
+#: builtin/clone.c:786
 msgid "unable to write parameters to config file"
 msgstr "无法将参数写入配置文件"
 
-#: builtin/clone.c:829
+#: builtin/clone.c:849
 msgid "cannot repack to clean up"
 msgstr "无法执行 repack 来清理"
 
-#: builtin/clone.c:831
+#: builtin/clone.c:851
 msgid "cannot unlink temporary alternates file"
 msgstr "无法删除临时的 alternates 文件"
 
-#: builtin/clone.c:863 builtin/receive-pack.c:1855
+#: builtin/clone.c:884 builtin/receive-pack.c:1900
 msgid "Too many arguments."
 msgstr "太多参数。"
 
-#: builtin/clone.c:867
+#: builtin/clone.c:888
 msgid "You must specify a repository to clone."
 msgstr "您必须指定一个仓库来克隆。"
 
-#: builtin/clone.c:878
+#: builtin/clone.c:901
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare 和 --origin %s 选项不兼容。"
 
-#: builtin/clone.c:881
+#: builtin/clone.c:904
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare 和 --separate-git-dir 选项不兼容。"
 
-#: builtin/clone.c:894
+#: builtin/clone.c:917
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "仓库 '%s' 不存在"
 
-#: builtin/clone.c:900 builtin/fetch.c:1293
+#: builtin/clone.c:923 builtin/fetch.c:1337
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "深度 %s 不是一个正数"
 
-#: builtin/clone.c:910
+#: builtin/clone.c:933
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "目标路径 '%s' 已经存在,并且不是一个空目录。"
 
-#: builtin/clone.c:920
+#: builtin/clone.c:943
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "工作区 '%s' 已经存在。"
 
-#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544
-#: builtin/worktree.c:222 builtin/worktree.c:249
+#: builtin/clone.c:958 builtin/clone.c:969 builtin/difftool.c:252
+#: builtin/worktree.c:221 builtin/worktree.c:251
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "不能为 '%s' 创建先导目录"
 
-#: builtin/clone.c:938
+#: builtin/clone.c:961
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "不能创建工作区目录 '%s'"
 
-#: builtin/clone.c:956
+#: builtin/clone.c:973
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "克隆到纯仓库 '%s'...\n"
 
-#: builtin/clone.c:958
+#: builtin/clone.c:975
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "正克隆到 '%s'...\n"
 
-#: builtin/clone.c:997
+#: builtin/clone.c:999
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
+msgstr "clone --recursive 和 --reference 以及 --reference-if-able 不兼容"
+
+#: builtin/clone.c:1055
 msgid "--depth is ignored in local clones; use file:// instead."
-msgstr "--depth 在本地克隆被忽略,改为 file:// 协议试试。"
+msgstr "--depth 在本地克隆时被忽略,请改用 file:// 协议。"
 
-#: builtin/clone.c:1000
+#: builtin/clone.c:1057
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since 在本地克隆时被忽略,请改用 file:// 协议。"
+
+#: builtin/clone.c:1059
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr "--shallow-exclude 在本地克隆时被忽略,请改用 file:// 协议。"
+
+#: builtin/clone.c:1062
 msgid "source repository is shallow, ignoring --local"
 msgstr "源仓库是浅克隆,忽略 --local"
 
-#: builtin/clone.c:1005
+#: builtin/clone.c:1067
 msgid "--local is ignored"
 msgstr "--local 被忽略"
 
-#: builtin/clone.c:1009
+#: builtin/clone.c:1071
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "不知道如何克隆 %s"
 
-#: builtin/clone.c:1058 builtin/clone.c:1066
+#: builtin/clone.c:1126 builtin/clone.c:1134
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "远程分支 %s 在上游 %s 未发现"
 
-#: builtin/clone.c:1069
+#: builtin/clone.c:1137
 msgid "You appear to have cloned an empty repository."
 msgstr "您似乎克隆了一个空仓库。"
 
@@ -5813,103 +6892,98 @@ msgstr ""
 "然后执行 \"git cherry-pick --continue\" 继续对其余提交执行拣选\n"
 "操作。\n"
 
-#: builtin/commit.c:308
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "无法解包 HEAD 树对象"
 
-#: builtin/commit.c:349
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "不能创建临时索引"
 
-#: builtin/commit.c:355
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "交互式添加失败"
 
-#: builtin/commit.c:368
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "无法更新临时索引"
 
-#: builtin/commit.c:370
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "不能更新树的主缓存"
 
-#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
 msgid "unable to write new_index file"
 msgstr "无法写 new_index 文件"
 
-#: builtin/commit.c:448
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "在合并过程中不能做部分提交。"
 
-#: builtin/commit.c:450
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "在拣选过程中不能做部分提交。"
 
-#: builtin/commit.c:459
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:478
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "无法写临时索引文件"
 
-#: builtin/commit.c:583
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "提交 '%s' 缺少作者信息"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "提交 '%s' 有非法的作者信息"
 
-#: builtin/commit.c:604
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "非法的 --author 参数"
 
-#: builtin/commit.c:612
-#, c-format
-msgid "invalid date format: %s"
-msgstr "无效的日期格式:%s"
-
-#: builtin/commit.c:656
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
 msgstr "无法选择一个未被当前提交说明使用的注释字符"
 
-#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "不能查询提交 %s"
 
-#: builtin/commit.c:705 builtin/shortlog.c:286
+#: builtin/commit.c:704 builtin/shortlog.c:294
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(正从标准输入中读取日志信息)\n"
 
-#: builtin/commit.c:707
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "不能从标准输入中读取日志信息"
 
-#: builtin/commit.c:711
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "不能读取日志文件 '%s'"
 
-#: builtin/commit.c:738 builtin/commit.c:746
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "不能读取 SQUASH_MSG"
 
-#: builtin/commit.c:743
+#: builtin/commit.c:742
 msgid "could not read MERGE_MSG"
 msgstr "不能读取 MERGE_MSG"
 
-#: builtin/commit.c:797
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "不能写提交模版"
 
-#: builtin/commit.c:815
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5923,7 +6997,7 @@ msgstr ""
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:820
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5937,7 +7011,7 @@ msgstr ""
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5946,7 +7020,7 @@ msgstr ""
 "请为您的变更输入提交说明。以 '%c' 开始的行将被忽略,而一个空的提交\n"
 "说明将会终止提交。\n"
 
-#: builtin/commit.c:840
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5957,346 +7031,346 @@ msgstr ""
 "也可以删除它们。一个空的提交说明将会终止提交。\n"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:860
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%s作者:  %.*s <%.*s>"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:868
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%s日期:  %s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:875
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%s提交者:%.*s <%.*s>"
 
-#: builtin/commit.c:893
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:950
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "无法创建树对象"
 
-#: builtin/commit.c:965 builtin/tag.c:266
+#: builtin/commit.c:968 builtin/tag.c:273
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "请使用 -m 或 -F 选项提供提交说明。\n"
 
-#: builtin/commit.c:1067
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr "--author '%s' 不是 'Name <email>' 格式,且未能在现有作者中找到匹配"
 
-#: builtin/commit.c:1082 builtin/commit.c:1322
+#: builtin/commit.c:1086 builtin/commit.c:1325
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "无效的未追踪文件参数 '%s'"
 
-#: builtin/commit.c:1119
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long 和 -z 选项不兼容"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "同时使用 --reset-author 和 --author 没有意义"
 
-#: builtin/commit.c:1158
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "您没有可修补的提交。"
 
-#: builtin/commit.c:1161
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "您正处于一个合并过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1163
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "您正处于一个拣选过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "选项 --squash 和 --fixup 不能同时使用"
 
-#: builtin/commit.c:1176
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "只能用一个 -c/-C/-F/--fixup 选项。"
 
-#: builtin/commit.c:1178
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "选项 -m 不能和 -c/-C/-F/--fixup 同时使用。"
 
-#: builtin/commit.c:1186
+#: builtin/commit.c:1191
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author 只能和 -C、-c 或 --amend 同时使用。"
 
-#: builtin/commit.c:1203
+#: builtin/commit.c:1208
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "只能用一个 --include/--only/--all/--interactive/--patch 选项。"
 
-#: builtin/commit.c:1205
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "参数 --include/--only 不跟路径没有意义。"
 
-#: builtin/commit.c:1207
-msgid "Clever... amending the last one with dirty index."
-msgstr "聪明... 用脏索引修补最后一个提交。"
-
-#: builtin/commit.c:1209
+#: builtin/commit.c:1212
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "指定了明确的路径而没有使用 -i 或 -o 选项,认为是 --only paths..."
 
-#: builtin/commit.c:1221 builtin/tag.c:474
+#: builtin/commit.c:1224 builtin/tag.c:551
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "无效的清理模式 %s"
 
-#: builtin/commit.c:1226
+#: builtin/commit.c:1229
 msgid "Paths with -a does not make sense."
 msgstr "路径和 -a 选项同时使用没有意义。"
 
-#: builtin/commit.c:1336 builtin/commit.c:1622
+#: builtin/commit.c:1339 builtin/commit.c:1612
 msgid "show status concisely"
 msgstr "以简洁的格式显示状态"
 
-#: builtin/commit.c:1338 builtin/commit.c:1624
+#: builtin/commit.c:1341 builtin/commit.c:1614
 msgid "show branch information"
 msgstr "显示分支信息"
 
-#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522
-#: builtin/worktree.c:440
+#: builtin/commit.c:1343
+msgid "version"
+msgstr "版本"
+
+#: builtin/commit.c:1343 builtin/commit.c:1616 builtin/push.c:525
+#: builtin/worktree.c:448
 msgid "machine-readable output"
 msgstr "机器可读的输出"
 
-#: builtin/commit.c:1343 builtin/commit.c:1628
+#: builtin/commit.c:1346 builtin/commit.c:1618
 msgid "show status in long format (default)"
 msgstr "以长格式显示状态(默认)"
 
-#: builtin/commit.c:1346 builtin/commit.c:1631
+#: builtin/commit.c:1349 builtin/commit.c:1621
 msgid "terminate entries with NUL"
 msgstr "条目以 NUL 字符结尾"
 
-#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
+#: builtin/commit.c:1351 builtin/commit.c:1624 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:411
 msgid "mode"
 msgstr "模式"
 
-#: builtin/commit.c:1349 builtin/commit.c:1634
+#: builtin/commit.c:1352 builtin/commit.c:1624
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "显示未跟踪的文件,“模式”的可选参数:all、normal、no。(默认:all)"
 
-#: builtin/commit.c:1352
+#: builtin/commit.c:1355
 msgid "show ignored files"
 msgstr "显示忽略的文件"
 
-#: builtin/commit.c:1353 parse-options.h:155
+#: builtin/commit.c:1356 parse-options.h:155
 msgid "when"
 msgstr "何时"
 
-#: builtin/commit.c:1354
+#: builtin/commit.c:1357
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 "忽略子模组的更改,“何时”的可选参数:all、dirty、untracked。(默认:all)"
 
-#: builtin/commit.c:1356
+#: builtin/commit.c:1359
 msgid "list untracked files in columns"
 msgstr "以列的方式显示未跟踪的文件"
 
-#: builtin/commit.c:1442
+#: builtin/commit.c:1435
 msgid "couldn't look up newly created commit"
 msgstr "无法找到新创建的提交"
 
-#: builtin/commit.c:1444
+#: builtin/commit.c:1437
 msgid "could not parse newly created commit"
 msgstr "不能解析新创建的提交"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1482
 msgid "detached HEAD"
 msgstr "分离头指针"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/commit.c:1492
+#: builtin/commit.c:1485
 msgid " (root-commit)"
 msgstr "(根提交)"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1582
 msgid "suppress summary after successful commit"
 msgstr "提交成功后不显示概述信息"
 
-#: builtin/commit.c:1593
+#: builtin/commit.c:1583
 msgid "show diff in commit message template"
 msgstr "在提交说明模板里显示差异"
 
-#: builtin/commit.c:1595
+#: builtin/commit.c:1585
 msgid "Commit message options"
 msgstr "提交说明选项"
 
-#: builtin/commit.c:1596 builtin/tag.c:351
+#: builtin/commit.c:1586 builtin/tag.c:409
 msgid "read message from file"
 msgstr "从文件中读取提交说明"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "author"
 msgstr "作者"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1587
 msgid "override author for commit"
 msgstr "提交时覆盖作者"
 
-#: builtin/commit.c:1598 builtin/gc.c:326
+#: builtin/commit.c:1588 builtin/gc.c:357
 msgid "date"
 msgstr "日期"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1588
 msgid "override date for commit"
 msgstr "提交时覆盖日期"
 
-#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396
-#: builtin/notes.c:559 builtin/tag.c:349
+#: builtin/commit.c:1589 builtin/merge.c:221 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:407
 msgid "message"
 msgstr "说明"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1589
 msgid "commit message"
 msgstr "提交说明"
 
-#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602
-#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79
+#: builtin/commit.c:1590 builtin/commit.c:1591 builtin/commit.c:1592
+#: builtin/commit.c:1593 parse-options.h:257 ref-filter.h:77
 msgid "commit"
 msgstr "提交"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1590
 msgid "reuse and edit message from specified commit"
 msgstr "重用并编辑指定提交的提交说明"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1591
 msgid "reuse message from specified commit"
 msgstr "重用指定提交的提交说明"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1592
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "使用 autosquash 格式的提交说明用以修正指定的提交"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1593
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "使用 autosquash 格式的提交说明用以压缩至指定的提交"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1594
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "现在将该提交的作者改为我(和 -C/-c/--amend 参数共用)"
 
-#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86
+#: builtin/commit.c:1595 builtin/log.c:1420 builtin/revert.c:104
 msgid "add Signed-off-by:"
 msgstr "添加 Signed-off-by: 签名"
 
-#: builtin/commit.c:1606
+#: builtin/commit.c:1596
 msgid "use specified template file"
 msgstr "使用指定的模板文件"
 
-#: builtin/commit.c:1607
+#: builtin/commit.c:1597
 msgid "force edit of commit"
 msgstr "强制编辑提交"
 
 #  译者:可选值,不能翻译(或是原文中笔误,应为 mode)
-#: builtin/commit.c:1608
+#: builtin/commit.c:1598
 msgid "default"
 msgstr "default"
 
-#: builtin/commit.c:1608 builtin/tag.c:354
+#: builtin/commit.c:1598 builtin/tag.c:412
 msgid "how to strip spaces and #comments from message"
 msgstr "设置如何删除提交说明里的空格和#注释"
 
-#: builtin/commit.c:1609
+#: builtin/commit.c:1599
 msgid "include status in commit message template"
 msgstr "在提交说明模板里包含状态信息"
 
-#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165
-#: builtin/revert.c:93
+#: builtin/commit.c:1601 builtin/merge.c:233 builtin/pull.c:166
+#: builtin/revert.c:112
 msgid "GPG sign commit"
 msgstr "GPG 提交签名"
 
-#: builtin/commit.c:1614
+#: builtin/commit.c:1604
 msgid "Commit contents options"
 msgstr "提交内容选项"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1605
 msgid "commit all changed files"
 msgstr "提交所有改动的文件"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1606
 msgid "add specified files to index for commit"
 msgstr "添加指定的文件到索引区等待提交"
 
-#: builtin/commit.c:1617
+#: builtin/commit.c:1607
 msgid "interactively add files"
 msgstr "交互式添加文件"
 
-#: builtin/commit.c:1618
+#: builtin/commit.c:1608
 msgid "interactively add changes"
 msgstr "交互式添加变更"
 
-#: builtin/commit.c:1619
+#: builtin/commit.c:1609
 msgid "commit only specified files"
 msgstr "只提交指定的文件"
 
-#: builtin/commit.c:1620
+#: builtin/commit.c:1610
 msgid "bypass pre-commit and commit-msg hooks"
 msgstr "绕过 pre-commit 和 commit-msg 钩子"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1611
 msgid "show what would be committed"
 msgstr "显示将要提交的内容"
 
-#: builtin/commit.c:1632
+#: builtin/commit.c:1622
 msgid "amend previous commit"
 msgstr "修改先前的提交"
 
-#: builtin/commit.c:1633
+#: builtin/commit.c:1623
 msgid "bypass post-rewrite hook"
 msgstr "绕过 post-rewrite 钩子"
 
-#: builtin/commit.c:1638
+#: builtin/commit.c:1628
 msgid "ok to record an empty change"
 msgstr "允许一个空提交"
 
-#: builtin/commit.c:1640
+#: builtin/commit.c:1630
 msgid "ok to record a change with an empty message"
 msgstr "允许空的提交说明"
 
-#: builtin/commit.c:1669
+#: builtin/commit.c:1659
 msgid "could not parse HEAD commit"
 msgstr "不能解析 HEAD 提交"
 
-#: builtin/commit.c:1719
+#: builtin/commit.c:1707
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "损坏的 MERGE_HEAD 文件(%s)"
 
-#: builtin/commit.c:1726
+#: builtin/commit.c:1714
 msgid "could not read MERGE_MODE"
 msgstr "不能读取 MERGE_MODE"
 
-#: builtin/commit.c:1745
+#: builtin/commit.c:1733
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "不能读取提交说明:%s"
 
-#: builtin/commit.c:1756
+#: builtin/commit.c:1744
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "终止提交;您未更改来自模版的提交说明。\n"
 
-#: builtin/commit.c:1761
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "终止提交因为提交说明为空。\n"
 
-#: builtin/commit.c:1809
+#: builtin/commit.c:1797
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full and quota is\n"
@@ -6309,139 +7383,139 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<选项>]"
 
-#: builtin/config.c:55
+#: builtin/config.c:56
 msgid "Config file location"
 msgstr "配置文件位置"
 
-#: builtin/config.c:56
+#: builtin/config.c:57
 msgid "use global config file"
 msgstr "使用全局配置文件"
 
-#: builtin/config.c:57
+#: builtin/config.c:58
 msgid "use system config file"
 msgstr "使用系统级配置文件"
 
-#: builtin/config.c:58
+#: builtin/config.c:59
 msgid "use repository config file"
 msgstr "使用仓库级配置文件"
 
-#: builtin/config.c:59
+#: builtin/config.c:60
 msgid "use given config file"
 msgstr "使用指定的配置文件"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "blob-id"
 msgstr "数据对象 ID"
 
-#: builtin/config.c:60
+#: builtin/config.c:61
 msgid "read config from given blob object"
 msgstr "从给定的数据对象读取配置"
 
-#: builtin/config.c:61
+#: builtin/config.c:62
 msgid "Action"
 msgstr "操作"
 
-#: builtin/config.c:62
+#: builtin/config.c:63
 msgid "get value: name [value-regex]"
 msgstr "获取值:name [value-regex]"
 
-#: builtin/config.c:63
+#: builtin/config.c:64
 msgid "get all values: key [value-regex]"
 msgstr "获得所有的值:key [value-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:65
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "根据正则表达式获得值:name-regex [value-regex]"
 
-#: builtin/config.c:65
+#: builtin/config.c:66
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "获得 URL 取值:section[.var] URL"
 
-#: builtin/config.c:66
+#: builtin/config.c:67
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "替换所有匹配的变量:name value [value_regex]"
 
-#: builtin/config.c:67
+#: builtin/config.c:68
 msgid "add a new variable: name value"
 msgstr "添加一个新的变量:name value"
 
-#: builtin/config.c:68
+#: builtin/config.c:69
 msgid "remove a variable: name [value-regex]"
 msgstr "删除一个变量:name [value-regex]"
 
-#: builtin/config.c:69
+#: builtin/config.c:70
 msgid "remove all matches: name [value-regex]"
 msgstr "删除所有匹配项:name [value-regex]"
 
-#: builtin/config.c:70
+#: builtin/config.c:71
 msgid "rename section: old-name new-name"
 msgstr "重命名小节:old-name new-name"
 
-#: builtin/config.c:71
+#: builtin/config.c:72
 msgid "remove a section: name"
 msgstr "删除一个小节:name"
 
-#: builtin/config.c:72
+#: builtin/config.c:73
 msgid "list all"
 msgstr "列出所有"
 
-#: builtin/config.c:73
+#: builtin/config.c:74
 msgid "open an editor"
 msgstr "打开一个编辑器"
 
-#: builtin/config.c:74
+#: builtin/config.c:75
 msgid "find the color configured: slot [default]"
 msgstr "获得配置的颜色:配置 [默认]"
 
-#: builtin/config.c:75
+#: builtin/config.c:76
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "获得颜色设置:配置 [stdout-is-tty]"
 
-#: builtin/config.c:76
+#: builtin/config.c:77
 msgid "Type"
 msgstr "类型"
 
-#: builtin/config.c:77
+#: builtin/config.c:78
 msgid "value is \"true\" or \"false\""
 msgstr "值是 \"true\" 或 \"false\""
 
-#: builtin/config.c:78
+#: builtin/config.c:79
 msgid "value is decimal number"
 msgstr "值是十进制数"
 
-#: builtin/config.c:79
+#: builtin/config.c:80
 msgid "value is --bool or --int"
 msgstr "值是 --bool or --int"
 
-#: builtin/config.c:80
+#: builtin/config.c:81
 msgid "value is a path (file or directory name)"
 msgstr "值是一个路径(文件或目录名)"
 
-#: builtin/config.c:81
+#: builtin/config.c:82
 msgid "Other"
 msgstr "其它"
 
-#: builtin/config.c:82
+#: builtin/config.c:83
 msgid "terminate values with NUL byte"
 msgstr "终止值是 NUL 字节"
 
-#: builtin/config.c:83
+#: builtin/config.c:84
 msgid "show variable names only"
 msgstr "只显示变量名"
 
-#: builtin/config.c:84
+#: builtin/config.c:85
 msgid "respect include directives on lookup"
 msgstr "查询时参照 include 指令递归查找"
 
-#: builtin/config.c:85
+#: builtin/config.c:86
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr "显示配置的来源(文件、标准输入、数据对象,或命令行)"
 
-#: builtin/config.c:327
+#: builtin/config.c:328
 msgid "unable to parse default color value"
 msgstr "不能解析默认颜色值"
 
-#: builtin/config.c:471
+#: builtin/config.c:472
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -6456,68 +7530,89 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:613
+#: builtin/config.c:615
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "不能创建配置文件 %s"
 
-#: builtin/count-objects.c:77
+#: builtin/config.c:627
+#, c-format
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
+msgstr ""
+"无法用一个值覆盖多个值\n"
+"       使用一个正则表达式、--add 或 --replace-all 来修改 %s。"
+
+#: builtin/count-objects.c:86
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:87
+#: builtin/count-objects.c:96
 msgid "print sizes in human readable format"
 msgstr "以用户可读的格式显示大小"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [<options>] [<commit-ish>...]"
 msgstr "git describe [<选项>] [<提交号>...]"
 
-#: builtin/describe.c:18
+#: builtin/describe.c:19
 msgid "git describe [<options>] --dirty"
 msgstr "git describe [<选项>] --dirty"
 
-#: builtin/describe.c:217
+#: builtin/describe.c:53
+msgid "head"
+msgstr "头"
+
+#: builtin/describe.c:53
+msgid "lightweight"
+msgstr "轻量级的"
+
+#: builtin/describe.c:53
+msgid "annotated"
+msgstr "附注的"
+
+#: builtin/describe.c:250
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "附注标签 %s 无效"
 
-#: builtin/describe.c:221
+#: builtin/describe.c:254
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "附注标签 %s 没有嵌入名称"
 
-#: builtin/describe.c:223
+#: builtin/describe.c:256
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "标签 '%s' 的确是在 '%s'"
 
-#: builtin/describe.c:250 builtin/log.c:480
+#: builtin/describe.c:283 builtin/log.c:487
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "不是一个有效的对象名 %s"
 
-#: builtin/describe.c:253
+#: builtin/describe.c:286
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s 不是一个有效的 '%s' 对象"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:303
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "没有标签准确匹配 '%s'"
 
-#: builtin/describe.c:272
+#: builtin/describe.c:305
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "搜索描述 %s\n"
 
-#: builtin/describe.c:319
+#: builtin/describe.c:352
 #, c-format
 msgid "finished search at %s\n"
 msgstr "完成搜索 %s\n"
 
-#: builtin/describe.c:346
+#: builtin/describe.c:379
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -6526,7 +7621,7 @@ msgstr ""
 "没有附注标签能描述 '%s'。\n"
 "然而,存在未附注标签:尝试 --tags。"
 
-#: builtin/describe.c:350
+#: builtin/describe.c:383
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -6535,12 +7630,12 @@ msgstr ""
 "没有标签能描述 '%s'。\n"
 "尝试 --always,或者创建一些标签。"
 
-#: builtin/describe.c:371
+#: builtin/describe.c:413
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "已遍历 %lu 个提交\n"
 
-#: builtin/describe.c:374
+#: builtin/describe.c:416
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -6549,95 +7644,207 @@ msgstr ""
 "发现多于 %i 个标签,列出最近的 %i 个\n"
 "在 %s 放弃搜索\n"
 
-#: builtin/describe.c:396
+#: builtin/describe.c:438
 msgid "find the tag that comes after the commit"
 msgstr "寻找该提交之后的标签"
 
-#: builtin/describe.c:397
+#: builtin/describe.c:439
 msgid "debug search strategy on stderr"
 msgstr "在标准错误上调试搜索策略"
 
-#: builtin/describe.c:398
+#: builtin/describe.c:440
 msgid "use any ref"
 msgstr "使用任意引用"
 
-#: builtin/describe.c:399
+#: builtin/describe.c:441
 msgid "use any tag, even unannotated"
 msgstr "使用任意标签,即使未附带注释"
 
-#: builtin/describe.c:400
+#: builtin/describe.c:442
 msgid "always use long format"
 msgstr "始终使用长提交号格式"
 
-#: builtin/describe.c:401
+#: builtin/describe.c:443
 msgid "only follow first parent"
 msgstr "只跟随第一个父提交"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:446
 msgid "only output exact matches"
 msgstr "只输出精确匹配"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:448
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "考虑最近 <n> 个标签(默认:10)"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:450
 msgid "only consider tags matching <pattern>"
 msgstr "只考虑匹配 <模式> 的标签"
 
-#: builtin/describe.c:410 builtin/name-rev.c:321
+#: builtin/describe.c:452
+msgid "do not consider tags matching <pattern>"
+msgstr "不考虑匹配 <模式> 的标签"
+
+#: builtin/describe.c:454 builtin/name-rev.c:357
 msgid "show abbreviated commit object as fallback"
 msgstr "显示简写的提交号作为后备"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:455 builtin/describe.c:458
 msgid "mark"
 msgstr "标记"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:456
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "对于脏工作区,追加 <标记>(默认:\"-dirty\")"
 
-#: builtin/describe.c:430
+#: builtin/describe.c:459
+msgid "append <mark> on broken working tree (default: \"-broken\")"
+msgstr "对于损坏的工作区,追加 <标记>(默认:\"-broken\")"
+
+#: builtin/describe.c:477
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long 与 --abbrev=0 不兼容"
 
-#: builtin/describe.c:456
+#: builtin/describe.c:506
 msgid "No names found, cannot describe anything."
 msgstr "没有发现名称,无法描述任何东西。"
 
-#: builtin/describe.c:476
+#: builtin/describe.c:549
 msgid "--dirty is incompatible with commit-ishes"
-msgstr "--dirty ä¸\8dè\83½ä¸\8eæ\8f\90交å\90\8cæ\97¶ä½¿ç\94¨"
+msgstr "--dirty ä¸\8eæ\8f\90交å\8f·ä¸\8då\85¼å®¹"
 
-#: builtin/diff.c:86
+#: builtin/describe.c:551
+msgid "--broken is incompatible with commit-ishes"
+msgstr "--broken 与提交号不兼容"
+
+#: builtin/diff.c:83
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s':不是一个正规文件或符号链接"
 
-#: builtin/diff.c:237
+#: builtin/diff.c:234
 #, c-format
 msgid "invalid option: %s"
 msgstr "无效选项:%s"
 
-#: builtin/diff.c:360
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "不是一个 git 仓库"
 
-#: builtin/diff.c:403
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "提供了无效对象 '%s'。"
 
-#: builtin/diff.c:412
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "提供了超过两个数据对象:'%s'"
 
-#: builtin/diff.c:419
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "无法处理的对象 '%s'。"
 
+#: builtin/difftool.c:28
+msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
+msgstr "git difftool [<选项>] [<提交> [<提交>]] [--] [<路径>...]"
+
+#: builtin/difftool.c:241
+#, c-format
+msgid "failed: %d"
+msgstr "失败:%d"
+
+#: builtin/difftool.c:283
+#, c-format
+msgid "could not read symlink %s"
+msgstr "无法读取符号链接 %s"
+
+#: builtin/difftool.c:285
+#, c-format
+msgid "could not read symlink file %s"
+msgstr "无法读取符号链接文件 %s"
+
+#: builtin/difftool.c:293
+#, c-format
+msgid "could not read object %s for symlink %s"
+msgstr "无法读取符号链接 %2$s 指向的对象 %1$s"
+
+#: builtin/difftool.c:395
+msgid ""
+"combined diff formats('-c' and '--cc') are not supported in\n"
+"directory diff mode('-d' and '--dir-diff')."
+msgstr ""
+"不支持在目录比较模式('-d' 和 '--dir-diff')中采用组合差异格式('-c' 和 '--"
+"cc')。"
+
+#: builtin/difftool.c:609
+#, c-format
+msgid "both files modified: '%s' and '%s'."
+msgstr "两个文件都被修改:'%s' 和 '%s'。"
+
+#: builtin/difftool.c:611
+msgid "working tree file has been left."
+msgstr "工作区文件被留了下来。"
+
+#: builtin/difftool.c:622
+#, c-format
+msgid "temporary files exist in '%s'."
+msgstr "临时文件存在于 '%s'。"
+
+#: builtin/difftool.c:623
+msgid "you may want to cleanup or recover these."
+msgstr "您可能想要清理或者恢复它们。"
+
+#: builtin/difftool.c:669
+msgid "use `diff.guitool` instead of `diff.tool`"
+msgstr "使用 `diff.guitool` 代替 `diff.tool`"
+
+#: builtin/difftool.c:671
+msgid "perform a full-directory diff"
+msgstr "执行一个全目录差异比较"
+
+#: builtin/difftool.c:673
+msgid "do not prompt before launching a diff tool"
+msgstr "启动差异比较工具之前不提示"
+
+#: builtin/difftool.c:679
+msgid "use symlinks in dir-diff mode"
+msgstr "在 dir-diff 模式中使用符号链接"
+
+#: builtin/difftool.c:680
+msgid "<tool>"
+msgstr "<工具>"
+
+#: builtin/difftool.c:681
+msgid "use the specified diff tool"
+msgstr "使用指定的差异比较工具"
+
+#: builtin/difftool.c:683
+msgid "print a list of diff tools that may be used with `--tool`"
+msgstr "显示可以用在 `--tool` 参数后的差异工具列表"
+
+#: builtin/difftool.c:686
+msgid ""
+"make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
+"code"
+msgstr "当执行 diff 工具返回非零退出码时,使 'git-difftool' 退出"
+
+#: builtin/difftool.c:688
+msgid "<command>"
+msgstr "<命令>"
+
+#: builtin/difftool.c:689
+msgid "specify a custom command for viewing diffs"
+msgstr "指定一个用于查看差异的自定义命令"
+
+#: builtin/difftool.c:713
+msgid "no <tool> given for --tool=<tool>"
+msgstr "没有为 --tool=<工具> 参数提供 <工具>"
+
+#: builtin/difftool.c:720
+msgid "no <cmd> given for --extcmd=<cmd>"
+msgstr "没有为 --extcmd=<命令> 参数提供 <命令>"
+
 #: builtin/fast-export.c:25
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-opts]"
@@ -6706,162 +7913,166 @@ msgstr "git fetch --multiple [<选项>] [(<仓库> | <组>)...]"
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<选项>]"
 
-#: builtin/fetch.c:93 builtin/pull.c:174
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "从所有的远程抓取"
 
-#: builtin/fetch.c:95 builtin/pull.c:177
+#: builtin/fetch.c:97 builtin/pull.c:178
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "追加到 .git/FETCH_HEAD 而不是覆盖它"
 
-#: builtin/fetch.c:97 builtin/pull.c:180
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "上传包到远程的路径"
 
-#: builtin/fetch.c:98 builtin/pull.c:182
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "强制覆盖本地分支"
 
-#: builtin/fetch.c:100
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "从多个远程抓取"
 
-#: builtin/fetch.c:102 builtin/pull.c:184
+#: builtin/fetch.c:104 builtin/pull.c:185
 msgid "fetch all tags and associated objects"
 msgstr "抓取所有的标签和关联对象"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "不抓取任何标签(--no-tags)"
 
-#: builtin/fetch.c:106
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "子模组获取的并发数"
 
-#: builtin/fetch.c:108 builtin/pull.c:187
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "清除远程已经不存在的分支的跟踪分支"
 
 #  译者:可选值,不能翻译
-#: builtin/fetch.c:109 builtin/pull.c:190
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "on-demand"
 
-#: builtin/fetch.c:110 builtin/pull.c:191
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "控制子模组的递归抓取"
 
-#: builtin/fetch.c:114 builtin/pull.c:199
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "保持下载包"
 
-#: builtin/fetch.c:116
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "允许更新 HEAD 引用"
 
-#: builtin/fetch.c:119 builtin/pull.c:202
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "深化浅克隆的历史"
 
-#: builtin/fetch.c:121 builtin/pull.c:205
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
+msgstr "基于时间来深化浅克隆的历史"
+
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "转换为一个完整的仓库"
 
-#: builtin/fetch.c:123 builtin/log.c:1426
+#: builtin/fetch.c:131 builtin/log.c:1440
 msgid "dir"
 msgstr "目录"
 
-#: builtin/fetch.c:124
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "在子模组路径输出的前面加上此目录"
 
-#: builtin/fetch.c:127
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "递归的默认模式"
 
-#: builtin/fetch.c:129 builtin/pull.c:208
+#: builtin/fetch.c:137 builtin/pull.c:209
 msgid "accept refs that update .git/shallow"
 msgstr "接受更新 .git/shallow 的引用"
 
-#: builtin/fetch.c:130 builtin/pull.c:210
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "引用映射"
 
-#: builtin/fetch.c:131 builtin/pull.c:211
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "指定获取操作的引用映射"
 
-#: builtin/fetch.c:387
+#: builtin/fetch.c:395
 msgid "Couldn't find remote ref HEAD"
 msgstr "无法发现远程 HEAD 引用"
 
-#: builtin/fetch.c:503
+#: builtin/fetch.c:513
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
 msgstr "配置变量 fetch.output 包含无效值 %s"
 
-#: builtin/fetch.c:592
+#: builtin/fetch.c:606
 #, c-format
 msgid "object %s not found"
 msgstr "对象 %s 未发现"
 
-#: builtin/fetch.c:596
+#: builtin/fetch.c:610
 msgid "[up to date]"
 msgstr "[最新]"
 
-#: builtin/fetch.c:609 builtin/fetch.c:689
+#: builtin/fetch.c:623 builtin/fetch.c:703
 msgid "[rejected]"
 msgstr "[已拒绝]"
 
-#: builtin/fetch.c:610
+#: builtin/fetch.c:624
 msgid "can't fetch in current branch"
 msgstr "当前分支下不能执行获取操作"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:633
 msgid "[tag update]"
 msgstr "[标签更新]"
 
-#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
-#: builtin/fetch.c:684
+#: builtin/fetch.c:634 builtin/fetch.c:667 builtin/fetch.c:683
+#: builtin/fetch.c:698
 msgid "unable to update local ref"
 msgstr "不能更新本地引用"
 
-#: builtin/fetch.c:639
+#: builtin/fetch.c:653
 msgid "[new tag]"
 msgstr "[新标签]"
 
-#: builtin/fetch.c:642
+#: builtin/fetch.c:656
 msgid "[new branch]"
 msgstr "[新分支]"
 
-#: builtin/fetch.c:645
+#: builtin/fetch.c:659
 msgid "[new ref]"
 msgstr "[新引用]"
 
-#: builtin/fetch.c:684
+#: builtin/fetch.c:698
 msgid "forced update"
 msgstr "强制更新"
 
-#: builtin/fetch.c:689
+#: builtin/fetch.c:703
 msgid "non-fast-forward"
 msgstr "非快进"
 
-#: builtin/fetch.c:733
+#: builtin/fetch.c:748
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s 未发送所有必须的对象\n"
 
-#: builtin/fetch.c:753
+#: builtin/fetch.c:768
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "拒绝 %s 因为浅克隆不允许被更新"
 
-#: builtin/fetch.c:839 builtin/fetch.c:934
+#: builtin/fetch.c:855 builtin/fetch.c:951
 #, c-format
 msgid "From %.*s\n"
 msgstr "来自 %.*s\n"
 
-#: builtin/fetch.c:850
+#: builtin/fetch.c:866
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6871,87 +8082,95 @@ msgstr ""
 " 'git remote prune %s' 来删除旧的、有冲突的分支"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:904
+#: builtin/fetch.c:921
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s 将成为摇摆状态)"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:905
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s 已成为摇摆状态)"
 
-#: builtin/fetch.c:937
+#: builtin/fetch.c:954
 msgid "[deleted]"
 msgstr "[已删除]"
 
-#: builtin/fetch.c:938 builtin/remote.c:1020
+#: builtin/fetch.c:955 builtin/remote.c:1022
 msgid "(none)"
 msgstr "(无)"
 
-#: builtin/fetch.c:960
+#: builtin/fetch.c:978
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "拒绝获取到非纯仓库的当前分支 %s"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:997
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "选项 \"%s\" 的值 \"%s\" 对于 %s 是无效的"
 
-#: builtin/fetch.c:982
+#: builtin/fetch.c:1000
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "选项 \"%s\" 为 %s 所忽略\n"
 
-#: builtin/fetch.c:1039
+#: builtin/fetch.c:1076
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "不知道如何从 %s 获取"
 
-#: builtin/fetch.c:1199
+#: builtin/fetch.c:1236
 #, c-format
 msgid "Fetching %s\n"
 msgstr "正在获取 %s\n"
 
-#: builtin/fetch.c:1201 builtin/remote.c:96
+#: builtin/fetch.c:1238 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "不能获取 %s"
 
-#: builtin/fetch.c:1219
+#: builtin/fetch.c:1256
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr "未指定远程仓库。请通过一个 URL 或远程仓库名指定,用以获取新提交。"
 
-#: builtin/fetch.c:1242
+#: builtin/fetch.c:1279
 msgid "You need to specify a tag name."
 msgstr "您需要指定一个标签名称。"
 
-#: builtin/fetch.c:1284
+#: builtin/fetch.c:1321
+msgid "Negative depth in --deepen is not supported"
+msgstr "--deepen 不支持负数深度"
+
+#: builtin/fetch.c:1323
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen 和 --depth 是互斥的"
+
+#: builtin/fetch.c:1328
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth 和 --unshallow 不能同时使用"
 
-#: builtin/fetch.c:1286
+#: builtin/fetch.c:1330
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "对于一个完整的仓库,参数 --unshallow 没有意义"
 
-#: builtin/fetch.c:1306
+#: builtin/fetch.c:1352
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all 不能带一个仓库参数"
 
-#: builtin/fetch.c:1308
+#: builtin/fetch.c:1354
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all 带引用规格没有任何意义"
 
-#: builtin/fetch.c:1319
+#: builtin/fetch.c:1365
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "没有这样的远程或远程组:%s"
 
-#: builtin/fetch.c:1327
+#: builtin/fetch.c:1373
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "获取组并指定引用规格没有意义"
 
@@ -6960,23 +8179,23 @@ msgid ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr "git fmt-merge-msg [-m <说明>] [--log[=<n>] | --no-log] [--file <文件>]"
 
-#: builtin/fmt-merge-msg.c:667
+#: builtin/fmt-merge-msg.c:663
 msgid "populate log with at most <n> entries from shortlog"
 msgstr "向提交说明中最多复制指定条目(合并而来的提交)的简短说明"
 
-#: builtin/fmt-merge-msg.c:670
+#: builtin/fmt-merge-msg.c:666
 msgid "alias for --log (deprecated)"
 msgstr "参数 --log 的别名(已弃用)"
 
-#: builtin/fmt-merge-msg.c:673
+#: builtin/fmt-merge-msg.c:669
 msgid "text"
 msgstr "文本"
 
-#: builtin/fmt-merge-msg.c:674
+#: builtin/fmt-merge-msg.c:670
 msgid "use <text> as start of message"
 msgstr "使用 <文本> 作为提交说明的开始"
 
-#: builtin/fmt-merge-msg.c:675
+#: builtin/fmt-merge-msg.c:671
 msgid "file to read from"
 msgstr "从文件中读取"
 
@@ -6989,12 +8208,12 @@ msgid "git for-each-ref [--points-at <object>]"
 msgstr "git for-each-ref [--points-at <对象>]"
 
 #: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<对象>]]"
+msgid "git for-each-ref [(--merged | --no-merged) [<commit>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<提交>]]"
 
 #: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<对象>]]"
+msgid "git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"
+msgstr "git for-each-ref [--contains [<提交>]] [--no-contains [<提交>]]"
 
 #: builtin/for-each-ref.c:27
 msgid "quote placeholders suitably for shells"
@@ -7016,10 +8235,6 @@ msgstr "引用占位符适用于 Tcl"
 msgid "show only <n> matched refs"
 msgstr "只显示 <n> 个匹配的引用"
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
-msgstr "输出格式"
-
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
 msgstr "只打印指向给定对象的引用"
@@ -7036,63 +8251,67 @@ msgstr "只打印没有合并的引用"
 msgid "print only refs which contain the commit"
 msgstr "只打印包含该提交的引用"
 
-#: builtin/fsck.c:519
+#: builtin/for-each-ref.c:46
+msgid "print only refs which don't contain the commit"
+msgstr "只打印不包含该提交的引用"
+
+#: builtin/fsck.c:554
 msgid "Checking object directories"
 msgstr "检查对象目录中"
 
-#: builtin/fsck.c:588
+#: builtin/fsck.c:646
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<选项>] [<对象>...]"
 
-#: builtin/fsck.c:594
+#: builtin/fsck.c:652
 msgid "show unreachable objects"
 msgstr "显示不可达的对象"
 
-#: builtin/fsck.c:595
+#: builtin/fsck.c:653
 msgid "show dangling objects"
 msgstr "显示摇摆的对象"
 
-#: builtin/fsck.c:596
+#: builtin/fsck.c:654
 msgid "report tags"
 msgstr "报告标签"
 
-#: builtin/fsck.c:597
+#: builtin/fsck.c:655
 msgid "report root nodes"
 msgstr "报告根节点"
 
-#: builtin/fsck.c:598
+#: builtin/fsck.c:656
 msgid "make index objects head nodes"
 msgstr "将索引亦作为检查的头节点"
 
-#: builtin/fsck.c:599
+#: builtin/fsck.c:657
 msgid "make reflogs head nodes (default)"
 msgstr "将引用日志作为检查的头节点(默认)"
 
-#: builtin/fsck.c:600
+#: builtin/fsck.c:658
 msgid "also consider packs and alternate objects"
 msgstr "也考虑包和备用对象"
 
-#: builtin/fsck.c:601
+#: builtin/fsck.c:659
 msgid "check only connectivity"
 msgstr "仅检查连通性"
 
-#: builtin/fsck.c:602
+#: builtin/fsck.c:660
 msgid "enable more strict checking"
 msgstr "启用更严格的检查"
 
-#: builtin/fsck.c:604
+#: builtin/fsck.c:662
 msgid "write dangling objects in .git/lost-found"
 msgstr "将摇摆对象写入 .git/lost-found 中"
 
-#: builtin/fsck.c:605 builtin/prune.c:107
+#: builtin/fsck.c:663 builtin/prune.c:107
 msgid "show progress"
 msgstr "显示进度"
 
-#: builtin/fsck.c:606
+#: builtin/fsck.c:664
 msgid "show verbose names for reachable objects"
 msgstr "显示可达对象的详细名称"
 
-#: builtin/fsck.c:671
+#: builtin/fsck.c:725
 msgid "Checking objects"
 msgstr "检查对象中"
 
@@ -7100,17 +8319,17 @@ msgstr "检查对象中"
 msgid "git gc [<options>]"
 msgstr "git gc [<选项>]"
 
-#: builtin/gc.c:72
+#: builtin/gc.c:78
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "无效 %s:'%s'"
+msgid "Failed to fstat %s: %s"
+msgstr "对 %s 调用 fstat 失败:%s"
 
-#: builtin/gc.c:139
+#: builtin/gc.c:310
 #, c-format
-msgid "insanely long object directory %.*s"
-msgstr "不正常的长对象目录 %.*s"
+msgid "Can't stat %s"
+msgstr "不能对 %s 调用 stat"
 
-#: builtin/gc.c:290
+#: builtin/gc.c:319
 #, c-format
 msgid ""
 "The last gc run reported the following. Please correct the root cause\n"
@@ -7124,282 +8343,303 @@ msgstr ""
 "\n"
 "%s"
 
-#: builtin/gc.c:327
+#: builtin/gc.c:358
 msgid "prune unreferenced objects"
 msgstr "清除未引用的对象"
 
-#: builtin/gc.c:329
+#: builtin/gc.c:360
 msgid "be more thorough (increased runtime)"
 msgstr "更彻底(增加运行时间)"
 
-#: builtin/gc.c:330
+#: builtin/gc.c:361
 msgid "enable auto-gc mode"
 msgstr "启用自动垃圾回收模式"
 
-#: builtin/gc.c:331
+#: builtin/gc.c:362
 msgid "force running gc even if there may be another gc running"
 msgstr "强制执行 gc 即使另外一个 gc 正在执行"
 
-#: builtin/gc.c:373
+#: builtin/gc.c:379
+#, c-format
+msgid "Failed to parse gc.logexpiry value %s"
+msgstr "无法解析 gc.logexpiry 的值 %s"
+
+#: builtin/gc.c:407
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr "自动在后台执行仓库打包以求最佳性能。\n"
 
-#: builtin/gc.c:375
+#: builtin/gc.c:409
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "自动打包仓库以求最佳性能。\n"
 
-#: builtin/gc.c:376
+#: builtin/gc.c:410
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "手工维护参见 \"git help gc\"。\n"
 
-#: builtin/gc.c:397
+#: builtin/gc.c:431
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
-"已经有一个 gc 正运行在机器 '%s' pid %<PRIuMAX> (如果不是,使用 --force)"
+"已经有一个 gc 正运行在机器 '%s' pid %<PRIuMAX>(如果不是,使用 --force)"
 
-#: builtin/gc.c:441
+#: builtin/gc.c:475
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr "有太多不可达的松散对象,运行 'git prune' 删除它们。"
 
-#: builtin/grep.c:23
+#: builtin/grep.c:25
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [<选项>] [-e] <模式> [<版本>...] [[--] <路径>...]"
 
-#: builtin/grep.c:219
+#: builtin/grep.c:232
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep:无法创建线程:%s"
 
-#: builtin/grep.c:277
+#: builtin/grep.c:290
 #, c-format
 msgid "invalid number of threads specified (%d) for %s"
 msgstr "为 %2$s 设定的线程数 (%1$d) 无效"
 
-#: builtin/grep.c:452 builtin/grep.c:487
+#: builtin/grep.c:769 builtin/grep.c:810
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "无法读取树(%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:829
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "无法抓取来自于 %s 类型的对象"
 
-#: builtin/grep.c:560
+#: builtin/grep.c:893
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "开关 `%c' 期望一个数字值"
 
-#: builtin/grep.c:577
-#, c-format
-msgid "cannot open '%s'"
-msgstr "不能打开 '%s'"
-
-#: builtin/grep.c:646
+#: builtin/grep.c:980
 msgid "search in index instead of in the work tree"
 msgstr "在索引区搜索而不是在工作区"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:982
 msgid "find in contents not managed by git"
 msgstr "在未被 git 管理的内容中查找"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/grep.c:650
+#: builtin/grep.c:984
 msgid "search in both tracked and untracked files"
 msgstr "在跟踪和未跟踪的文件中搜索"
 
-#: builtin/grep.c:652
+#: builtin/grep.c:986
 msgid "ignore files specified via '.gitignore'"
 msgstr "忽略 '.gitignore' 包含的文件"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:988
+msgid "recursively search in each submodule"
+msgstr "在每一个子模组中递归搜索"
+
+#: builtin/grep.c:990
+msgid "basename"
+msgstr "基本名"
+
+#: builtin/grep.c:991
+msgid "prepend parent project's basename to output"
+msgstr "在输出中以父项目的基本名为前缀"
+
+#: builtin/grep.c:994
 msgid "show non-matching lines"
 msgstr "显示未匹配的行"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:996
 msgid "case insensitive matching"
 msgstr "不区分大小写匹配"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:998
 msgid "match patterns only at word boundaries"
 msgstr "只在单词边界匹配模式"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:1000
 msgid "process binary files as text"
 msgstr "把二进制文件当做文本处理"
 
-#: builtin/grep.c:663
+#: builtin/grep.c:1002
 msgid "don't match patterns in binary files"
 msgstr "不在二进制文件中匹配模式"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:1005
 msgid "process binary files with textconv filters"
 msgstr "用 textconv 过滤器处理二进制文件"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:1007
 msgid "descend at most <depth> levels"
 msgstr "最多以指定的深度向下寻找"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:1011
 msgid "use extended POSIX regular expressions"
 msgstr "使用扩展的 POSIX 正则表达式"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:1014
 msgid "use basic POSIX regular expressions (default)"
 msgstr "使用基本的 POSIX 正则表达式(默认)"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:1017
 msgid "interpret patterns as fixed strings"
 msgstr "把模式解析为固定的字符串"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:1020
 msgid "use Perl-compatible regular expressions"
 msgstr "使用 Perl 兼容的正则表达式"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:1023
 msgid "show line numbers"
 msgstr "显示行号"
 
-#: builtin/grep.c:685
+#: builtin/grep.c:1024
 msgid "don't show filenames"
 msgstr "不显示文件名"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:1025
 msgid "show filenames"
 msgstr "显示文件名"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:1027
 msgid "show filenames relative to top directory"
 msgstr "显示相对于顶级目录的文件名"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:1029
 msgid "show only filenames instead of matching lines"
 msgstr "只显示文件名而不显示匹配的行"
 
-#: builtin/grep.c:692
+#: builtin/grep.c:1031
 msgid "synonym for --files-with-matches"
 msgstr "和 --files-with-matches 同义"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:1034
 msgid "show only the names of files without match"
 msgstr "只显示未匹配的文件名"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:1036
 msgid "print NUL after filenames"
 msgstr "在文件名后输出 NUL 字符"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:1038
 msgid "show the number of matches instead of matching lines"
 msgstr "显示总匹配行数,而不显示匹配的行"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:1039
 msgid "highlight matches"
 msgstr "高亮显示匹配项"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:1041
 msgid "print empty line between matches from different files"
 msgstr "在不同文件的匹配项之间打印空行"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:1043
 msgid "show filename only once above matches from same file"
 msgstr "只在同一文件的匹配项的上面显示一次文件名"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:1046
 msgid "show <n> context lines before and after matches"
 msgstr "显示匹配项前后的 <n> 行上下文"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:1049
 msgid "show <n> context lines before matches"
 msgstr "显示匹配项前 <n> 行上下文"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:1051
 msgid "show <n> context lines after matches"
 msgstr "显示匹配项后 <n> 行上下文"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:1053
 msgid "use <n> worker threads"
 msgstr "使用 <n> 个工作线程"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:1054
 msgid "shortcut for -C NUM"
 msgstr "快捷键 -C 数字"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:1057
 msgid "show a line with the function name before matches"
 msgstr "在匹配的前面显示一行函数名"
 
-#: builtin/grep.c:720
+#: builtin/grep.c:1059
 msgid "show the surrounding function"
 msgstr "显示所在函数的前后内容"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:1062
 msgid "read patterns from file"
 msgstr "从文件读取模式"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:1064
 msgid "match <pattern>"
 msgstr "匹配 <模式>"
 
-#: builtin/grep.c:727
+#: builtin/grep.c:1066
 msgid "combine patterns specified with -e"
 msgstr "组合用 -e 参数设定的模式"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:1078
 msgid "indicate hit with exit status without output"
 msgstr "不输出,而用退出码标识命中状态"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:1080
 msgid "show only matches from files that match all patterns"
 msgstr "只显示匹配所有模式的文件中的匹配"
 
-#: builtin/grep.c:743
+#: builtin/grep.c:1082
 msgid "show parse tree for grep expression"
 msgstr "显示 grep 表达式的解析树"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "pager"
 msgstr "分页"
 
-#: builtin/grep.c:747
+#: builtin/grep.c:1086
 msgid "show matching files in the pager"
 msgstr "分页显示匹配的文件"
 
-#: builtin/grep.c:750
+#: builtin/grep.c:1089
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "允许调用 grep(1)(本次构建忽略)"
 
-#: builtin/grep.c:813
+#: builtin/grep.c:1153
 msgid "no pattern given."
 msgstr "未提供模式匹配。"
 
-#: builtin/grep.c:845 builtin/index-pack.c:1479
+#: builtin/grep.c:1189
+msgid "--no-index or --untracked cannot be used with revs"
+msgstr "--no-index 或 --untracked 不能和版本同时使用"
+
+#: builtin/grep.c:1195
+#, c-format
+msgid "unable to resolve revision: %s"
+msgstr "不能解析版本:%s"
+
+#: builtin/grep.c:1228 builtin/index-pack.c:1485
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "指定的线程数无效(%d)"
 
-#: builtin/grep.c:875
+#: builtin/grep.c:1251
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 仅用于工作区"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:1274
+msgid "option not supported with --recurse-submodules."
+msgstr "选项不支持和 --recurse-submodules 共用。"
+
+#: builtin/grep.c:1280
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached 或 --untracked 不能与 --no-index 同时使用。"
 
-#: builtin/grep.c:906
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr "--no-index 或 --untracked 不能和版本同时使用。"
-
-#: builtin/grep.c:909
+#: builtin/grep.c:1286
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 不能用于已跟踪内容。"
 
-#: builtin/grep.c:917
+#: builtin/grep.c:1294
 msgid "both --cached and trees are given."
 msgstr "同时给出了 --cached 和树对象。"
 
@@ -7415,83 +8655,87 @@ msgstr ""
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object  --stdin-paths"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "type"
 msgstr "类型"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "对象类型"
 
-#: builtin/hash-object.c:94
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "将对象写入对象数据库"
 
-#: builtin/hash-object.c:96
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "从标准输入读取对象"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "原样存储文件不使用过滤器"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr "允许对任意随机垃圾数据做散列来创建损坏的对象以便调试 Git"
 
-#: builtin/hash-object.c:100
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "处理文件并假设其来自于此路径"
 
-#: builtin/help.c:41
+#: builtin/help.c:42
 msgid "print all available commands"
 msgstr "打印所有可用的命令"
 
-#: builtin/help.c:42
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "排除向导"
+
+#: builtin/help.c:44
 msgid "print list of useful guides"
 msgstr "显示有用的指南列表"
 
-#: builtin/help.c:43
+#: builtin/help.c:45
 msgid "show man page"
 msgstr "显示 man 手册"
 
-#: builtin/help.c:44
+#: builtin/help.c:46
 msgid "show manual in web browser"
 msgstr "在 web 浏览器中显示手册"
 
-#: builtin/help.c:46
+#: builtin/help.c:48
 msgid "show info page"
 msgstr "显示 info 手册"
 
-#: builtin/help.c:52
+#: builtin/help.c:54
 msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr "git help [--all] [--guides] [--man | --web | --info] [<命令>]"
 
-#: builtin/help.c:64
+#: builtin/help.c:66
 #, c-format
 msgid "unrecognized help format '%s'"
 msgstr "未能识别的帮助格式 '%s'"
 
-#: builtin/help.c:91
+#: builtin/help.c:93
 msgid "Failed to start emacsclient."
 msgstr "无法启动 emacsclient。"
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "无法解析 emacsclient 版本。"
 
-#: builtin/help.c:112
+#: builtin/help.c:114
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "emacsclient 版本 '%d' 太老(< 22)。"
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
 msgid "failed to exec '%s'"
 msgstr "无法执行 '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -7500,7 +8744,7 @@ msgstr ""
 "'%s':不支持的 man 手册查看器的路径。\n"
 "请使用 'man.<工具>.cmd'。"
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -7509,427 +8753,440 @@ msgstr ""
 "'%s': 支持的 man 手册查看器命令。\n"
 "请使用 'man.<工具>.path'。"
 
-#: builtin/help.c:334
+#: builtin/help.c:336
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s':未知的 man 查看器。"
 
-#: builtin/help.c:351
+#: builtin/help.c:353
 msgid "no man viewer handled the request"
 msgstr "没有 man 查看器处理此请求"
 
-#: builtin/help.c:359
+#: builtin/help.c:361
 msgid "no info viewer handled the request"
 msgstr "没有 info 查看器处理此请求"
 
-#: builtin/help.c:401
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "定义路径的属性"
 
-#: builtin/help.c:402
+#: builtin/help.c:404
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "每一天 Git 常用的约 20 条命令"
 
-#: builtin/help.c:403
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Git 词汇表"
 
-#: builtin/help.c:404
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "忽略指定的未跟踪文件"
 
-#: builtin/help.c:405
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "定义子模组属性"
 
-#: builtin/help.c:406
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "指定 Git 的版本和版本范围"
 
-#: builtin/help.c:407
+#: builtin/help.c:409
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "一个 Git 教程(针对 1.5.1 或更新版本)"
 
-#: builtin/help.c:408
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Git 推荐的工作流概览"
 
-#: builtin/help.c:420
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "最常用的 Git 向导有:\n"
 
-#: builtin/help.c:441 builtin/help.c:458
-#, c-format
-msgid "usage: %s%s"
-msgstr "用法:%s%s"
-
-#: builtin/help.c:474
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s' 是 `%s' 的别名"
 
-#: builtin/index-pack.c:153
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
+msgstr "用法:%s%s"
+
+#: builtin/index-pack.c:154
 #, c-format
 msgid "unable to open %s"
 msgstr "不能打开 %s"
 
-#: builtin/index-pack.c:203
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "%s 的对象类型不匹配"
 
-#: builtin/index-pack.c:223
+#: builtin/index-pack.c:224
 #, c-format
 msgid "did not receive expected object %s"
-msgstr "未能获取期望的对象 %s"
+msgstr "未能获取预期的对象 %s"
 
-#: builtin/index-pack.c:226
+#: builtin/index-pack.c:227
 #, c-format
 msgid "object %s: expected type %s, found %s"
-msgstr "对象 %s:期待类型 %s,却是 %s"
+msgstr "对象 %s:应为类型 %s,却是 %s"
 
-#: builtin/index-pack.c:268
+#: builtin/index-pack.c:269
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "无法填充 %d 字节"
 msgstr[1] "无法填充 %d 字节"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "过早的文件结束符(EOF)"
 
-#: builtin/index-pack.c:279
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "输入上的读错误"
 
-#: builtin/index-pack.c:291
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "用掉了超过可用的字节"
 
-#: builtin/index-pack.c:298
+#: builtin/index-pack.c:299
 msgid "pack too large for current definition of off_t"
 msgstr "包太大超过了当前 off_t 的定义"
 
-#: builtin/index-pack.c:314
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "包超过了最大允许值"
+
+#: builtin/index-pack.c:317
 #, c-format
 msgid "unable to create '%s'"
 msgstr "不能创建 '%s'"
 
-#: builtin/index-pack.c:319
+#: builtin/index-pack.c:323
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "无法打开包文件 '%s'"
 
-#: builtin/index-pack.c:333
+#: builtin/index-pack.c:337
 msgid "pack signature mismatch"
 msgstr "包签名不匹配"
 
-#: builtin/index-pack.c:335
+#: builtin/index-pack.c:339
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "不支持包版本 %<PRIu32>"
 
-#: builtin/index-pack.c:353
+#: builtin/index-pack.c:357
 #, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr "包中有错误的对象位于偏移量 %<PRIuMAX>:%s"
 
-#: builtin/index-pack.c:475
+#: builtin/index-pack.c:479
 #, c-format
 msgid "inflate returned %d"
 msgstr "解压缩返回 %d"
 
-#: builtin/index-pack.c:524
+#: builtin/index-pack.c:528
 msgid "offset value overflow for delta base object"
 msgstr "偏移值覆盖了 delta 基准对象"
 
-#: builtin/index-pack.c:532
+#: builtin/index-pack.c:536
 msgid "delta base offset is out of bound"
 msgstr "delta 基准偏移越界"
 
-#: builtin/index-pack.c:540
+#: builtin/index-pack.c:544
 #, c-format
 msgid "unknown object type %d"
 msgstr "未知对象类型 %d"
 
-#: builtin/index-pack.c:571
+#: builtin/index-pack.c:575
 msgid "cannot pread pack file"
 msgstr "无法读取包文件"
 
-#: builtin/index-pack.c:573
+#: builtin/index-pack.c:577
 #, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
 msgstr[0] "包文件过早结束,缺少 %<PRIuMAX> 字节"
 msgstr[1] "包文件过早结束,缺少 %<PRIuMAX> 字节"
 
-#: builtin/index-pack.c:599
+#: builtin/index-pack.c:603
 msgid "serious inflate inconsistency"
 msgstr "解压缩严重的不一致"
 
-#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
-#: builtin/index-pack.c:808 builtin/index-pack.c:817
+#: builtin/index-pack.c:749 builtin/index-pack.c:755 builtin/index-pack.c:778
+#: builtin/index-pack.c:816 builtin/index-pack.c:825
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "发现 %s 出现 SHA1 冲突!"
 
-#: builtin/index-pack.c:748 builtin/pack-objects.c:164
-#: builtin/pack-objects.c:256
+#: builtin/index-pack.c:752 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:257
 #, c-format
 msgid "unable to read %s"
 msgstr "不能读 %s"
 
 #: builtin/index-pack.c:814
 #, c-format
+msgid "cannot read existing object info %s"
+msgstr "不能读取现存对象信息 %s"
+
+#: builtin/index-pack.c:822
+#, c-format
 msgid "cannot read existing object %s"
 msgstr "不能读取现存对象 %s"
 
-#: builtin/index-pack.c:828
+#: builtin/index-pack.c:836
 #, c-format
 msgid "invalid blob object %s"
 msgstr "无效的数据对象 %s"
 
-#: builtin/index-pack.c:842
+#: builtin/index-pack.c:850
 #, c-format
 msgid "invalid %s"
 msgstr "无效的 %s"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:853
 msgid "Error in object"
 msgstr "对象中出错"
 
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:855
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "%s 的所有子对象并非都可达"
 
-#: builtin/index-pack.c:919 builtin/index-pack.c:950
+#: builtin/index-pack.c:927 builtin/index-pack.c:958
 msgid "failed to apply delta"
 msgstr "无法应用 delta"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Receiving objects"
 msgstr "接收对象中"
 
-#: builtin/index-pack.c:1120
+#: builtin/index-pack.c:1128
 msgid "Indexing objects"
 msgstr "索引对象中"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1160
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "包冲突(SHA1 不匹配)"
 
-#: builtin/index-pack.c:1157
+#: builtin/index-pack.c:1165
 msgid "cannot fstat packfile"
-msgstr "不能枚举包文件状态"
+msgstr "不能对包文件调用 fstat"
 
-#: builtin/index-pack.c:1160
+#: builtin/index-pack.c:1168
 msgid "pack has junk at the end"
 msgstr "包的结尾有垃圾数据"
 
-#: builtin/index-pack.c:1171
+#: builtin/index-pack.c:1179
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "parse_pack_objects() 中遇到不可理喻的问题"
 
-#: builtin/index-pack.c:1196
+#: builtin/index-pack.c:1202
 msgid "Resolving deltas"
 msgstr "处理 delta 中"
 
-#: builtin/index-pack.c:1207
+#: builtin/index-pack.c:1213
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "不能创建线程:%s"
 
-#: builtin/index-pack.c:1249
+#: builtin/index-pack.c:1255
 msgid "confusion beyond insanity"
 msgstr "不可理喻"
 
-#: builtin/index-pack.c:1255
+#: builtin/index-pack.c:1261
 #, c-format
 msgid "completed with %d local object"
 msgid_plural "completed with %d local objects"
 msgstr[0] "完成 %d 个本地对象"
 msgstr[1] "完成 %d 个本地对象"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1273
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "对 %s 的尾部校验出现意外(磁盘损坏?)"
 
-#: builtin/index-pack.c:1271
+#: builtin/index-pack.c:1277
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "包有 %d 个未解决的 delta"
 msgstr[1] "包有 %d 个未解决的 delta"
 
-#: builtin/index-pack.c:1295
+#: builtin/index-pack.c:1301
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "不能压缩附加对象(%d)"
 
-#: builtin/index-pack.c:1371
+#: builtin/index-pack.c:1377
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "本地对象 %s 已损坏"
 
-#: builtin/index-pack.c:1395
+#: builtin/index-pack.c:1403
 msgid "error while closing pack file"
 msgstr "关闭包文件时出错"
 
-#: builtin/index-pack.c:1408
+#: builtin/index-pack.c:1415
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "无法写保留文件 '%s'"
 
-#: builtin/index-pack.c:1416
+#: builtin/index-pack.c:1423
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "无法关闭保留文件 '%s'"
 
-#: builtin/index-pack.c:1429
+#: builtin/index-pack.c:1433
 msgid "cannot store pack file"
 msgstr "无法存储包文件"
 
-#: builtin/index-pack.c:1440
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "无法存储索引文件"
 
-#: builtin/index-pack.c:1473
+#: builtin/index-pack.c:1479
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "坏的 pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1483 builtin/index-pack.c:1681
+#: builtin/index-pack.c:1489 builtin/index-pack.c:1686
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "没有线程支持,忽略 %s"
 
-#: builtin/index-pack.c:1542
+#: builtin/index-pack.c:1547
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "无法打开现存包文件 '%s'"
 
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1549
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "无法为 %s 打开包索引文件"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1596
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "非 delta:%d 个对象"
 msgstr[1] "非 delta:%d 个对象"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1603
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "链长 = %d: %lu 对象"
 msgstr[1] "链长 = %d: %lu 对象"
 
-#: builtin/index-pack.c:1611
+#: builtin/index-pack.c:1616
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "包文件名 '%s' 没有以 '.pack' 结尾"
 
-#: builtin/index-pack.c:1693 builtin/index-pack.c:1696
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1716
+#: builtin/index-pack.c:1698 builtin/index-pack.c:1701
+#: builtin/index-pack.c:1717 builtin/index-pack.c:1721
 #, c-format
 msgid "bad %s"
 msgstr "错误选项 %s"
 
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1737
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin 不能和 --stdin 同时使用"
 
-#: builtin/index-pack.c:1738
+#: builtin/index-pack.c:1739
+msgid "--stdin requires a git repository"
+msgstr "--stdin 需要一个 git 仓库"
+
+#: builtin/index-pack.c:1747
 msgid "--verify with no packfile name given"
 msgstr "--verify 没有提供包文件名参数"
 
-#: builtin/init-db.c:55
+#: builtin/init-db.c:54
 #, c-format
 msgid "cannot stat '%s'"
-msgstr "不能枚举 '%s' 状态"
+msgstr "不能对 '%s' 调用 stat"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
-msgstr "不能枚举模版 '%s' 状态"
+msgstr "不能对模版 '%s' 调用 stat"
 
-#: builtin/init-db.c:66
+#: builtin/init-db.c:65
 #, c-format
 msgid "cannot opendir '%s'"
 msgstr "不能打开目录 '%s'"
 
-#: builtin/init-db.c:77
+#: builtin/init-db.c:76
 #, c-format
 msgid "cannot readlink '%s'"
 msgstr "不能读取链接 '%s'"
 
-#: builtin/init-db.c:79
+#: builtin/init-db.c:78
 #, c-format
 msgid "cannot symlink '%s' '%s'"
 msgstr "不能自 '%s' 到 '%s' 创建符号链接"
 
-#: builtin/init-db.c:85
+#: builtin/init-db.c:84
 #, c-format
 msgid "cannot copy '%s' to '%s'"
 msgstr "不能拷贝 '%s' 至 '%s'"
 
-#: builtin/init-db.c:89
+#: builtin/init-db.c:88
 #, c-format
 msgid "ignoring template %s"
 msgstr "忽略模版 %s"
 
-#: builtin/init-db.c:120
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "模版未找到 %s"
 
-#: builtin/init-db.c:135
+#: builtin/init-db.c:134
 #, c-format
 msgid "not copying templates from '%s': %s"
 msgstr "没有从 '%s' 复制模版:%s"
 
-#: builtin/init-db.c:312 builtin/init-db.c:315
-#, c-format
-msgid "%s already exists"
-msgstr "%s 已经存在"
-
-#: builtin/init-db.c:344
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "不能处理 %d 类型的文件"
 
-#: builtin/init-db.c:347
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "不能移动 %s 至 %s"
 
-#: builtin/init-db.c:402
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
+msgstr "%s 已经存在"
+
+#: builtin/init-db.c:403
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "重新初始化已存在的共享 Git 仓库于 %s%s\n"
 
-#: builtin/init-db.c:403
+#: builtin/init-db.c:404
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "重新初始化已存在的 Git 仓库于 %s%s\n"
 
-#: builtin/init-db.c:407
+#: builtin/init-db.c:408
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "已初始化空的共享 Git 仓库于 %s%s\n"
 
-#: builtin/init-db.c:408
+#: builtin/init-db.c:409
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "已初始化空的 Git 仓库于 %s%s\n"
 
-#: builtin/init-db.c:455
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7937,32 +9194,32 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<模板目录>] [--shared[=<权限>]] "
 "[<目录>]"
 
-#: builtin/init-db.c:478
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "权限"
 
-#: builtin/init-db.c:479
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "指定 git 仓库是多个用户之间共享的"
 
-#: builtin/init-db.c:513 builtin/init-db.c:518
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "不能创建目录 %s"
 
-#: builtin/init-db.c:522
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "不能切换目录到 %s"
 
-#: builtin/init-db.c:543
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr "不允许 %s(或 --work-tree=<目录>)而没有指定 %s(或 --git-dir=<目录>)"
 
-#: builtin/init-db.c:571
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "不能访问工作区 '%s'"
@@ -8003,107 +9260,104 @@ msgstr "git log [<选项>] [<版本范围>] [[--] <路径>...]"
 msgid "git show [<options>] <object>..."
 msgstr "git show [<选项>] <对象>..."
 
-#: builtin/log.c:84
+#: builtin/log.c:89
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "无效的 --decorate 选项:%s"
 
-#: builtin/log.c:139
+#: builtin/log.c:144
 msgid "suppress diff output"
 msgstr "不显示差异输出"
 
-#: builtin/log.c:140
+#: builtin/log.c:145
 msgid "show source"
 msgstr "显示源"
 
-#: builtin/log.c:141
+#: builtin/log.c:146
 msgid "Use mail map file"
 msgstr "使用邮件映射文件"
 
-#: builtin/log.c:142
+#: builtin/log.c:147
 msgid "decorate options"
 msgstr "修饰选项"
 
-#: builtin/log.c:145
+#: builtin/log.c:150
 msgid "Process line range n,m in file, counting from 1"
 msgstr "处理文件中第 n 到 m 之间的行,从 1 开始"
 
-#: builtin/log.c:241
+#: builtin/log.c:246
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "最终输出:%d %s\n"
 
-#: builtin/log.c:486
+#: builtin/log.c:493
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: 损坏的文件"
 
-#: builtin/log.c:500 builtin/log.c:594
+#: builtin/log.c:507 builtin/log.c:601
 #, c-format
 msgid "Could not read object %s"
 msgstr "不能读取对象 %s"
 
-#: builtin/log.c:618
+#: builtin/log.c:625
 #, c-format
 msgid "Unknown type: %d"
 msgstr "未知类型:%d"
 
-#: builtin/log.c:739
+#: builtin/log.c:746
 msgid "format.headers without value"
 msgstr "format.headers 没有值"
 
-#: builtin/log.c:839
+#: builtin/log.c:846
 msgid "name of output directory is too long"
 msgstr "输出目录名太长"
 
-#: builtin/log.c:854
+#: builtin/log.c:861
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "无法打开补丁文件 %s"
 
-#: builtin/log.c:868
+#: builtin/log.c:875
 msgid "Need exactly one range."
 msgstr "只需要一个范围。"
 
-#: builtin/log.c:878
+#: builtin/log.c:885
 msgid "Not a range."
 msgstr "不是一个范围。"
 
-#: builtin/log.c:984
+#: builtin/log.c:991
 msgid "Cover letter needs email format"
 msgstr "信封需要邮件地址格式"
 
-#: builtin/log.c:1064
+#: builtin/log.c:1071
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "不正常的 in-reply-to:%s"
 
-#: builtin/log.c:1092
+#: builtin/log.c:1098
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<选项>] [<从> | <版本范围>]"
 
-#: builtin/log.c:1137
+#: builtin/log.c:1148
 msgid "Two output directories?"
 msgstr "两个输出目录?"
 
-#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897
+#: builtin/log.c:1255 builtin/log.c:1898 builtin/log.c:1900 builtin/log.c:1912
 #, c-format
 msgid "Unknown commit %s"
 msgstr "未知提交 %s"
 
-#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305
-#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425
-#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594
-#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455
+#: builtin/log.c:1265 builtin/notes.c:883 builtin/tag.c:532
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "无法解析 '%s' 为一个有效引用。"
 
-#: builtin/log.c:1259
+#: builtin/log.c:1270
 msgid "Could not find exact merge base."
 msgstr "不能找到准确的合并基线。"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1274
 msgid ""
 "Failed to get upstream, if you want to record base commit automatically,\n"
 "please use git branch --set-upstream-to to track a remote branch.\n"
@@ -8113,307 +9367,315 @@ msgstr ""
 "git branch --set-upstream-to 来跟踪一个远程分支。或者你可以通过\n"
 "参数 --base=<base-commit-id> 手动指定一个基线提交。"
 
-#: builtin/log.c:1283
+#: builtin/log.c:1294
 msgid "Failed to find exact merge base"
 msgstr "无法找到准确的合并基线"
 
-#: builtin/log.c:1294
+#: builtin/log.c:1305
 msgid "base commit should be the ancestor of revision list"
 msgstr "基线提交应该是版本列表的祖先"
 
-#: builtin/log.c:1298
+#: builtin/log.c:1309
 msgid "base commit shouldn't be in revision list"
 msgstr "基线提交不应该出现在版本列表中"
 
-#: builtin/log.c:1347
+#: builtin/log.c:1358
 msgid "cannot get patch id"
 msgstr "无法得到补丁 id"
 
-#: builtin/log.c:1404
+#: builtin/log.c:1415
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "使用 [PATCH n/m],即使只有一个补丁"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1418
 msgid "use [PATCH] even with multiple patches"
 msgstr "使用 [PATCH],即使有多个补丁"
 
-#: builtin/log.c:1411
+#: builtin/log.c:1422
 msgid "print patches to standard out"
 msgstr "打印补丁到标准输出"
 
-#: builtin/log.c:1413
+#: builtin/log.c:1424
 msgid "generate a cover letter"
 msgstr "生成一封附信"
 
-#: builtin/log.c:1415
+#: builtin/log.c:1426
 msgid "use simple number sequence for output file names"
 msgstr "使用简单的数字序列作为输出文件名"
 
-#: builtin/log.c:1416
+#: builtin/log.c:1427
 msgid "sfx"
 msgstr "后缀"
 
-#: builtin/log.c:1417
+#: builtin/log.c:1428
 msgid "use <sfx> instead of '.patch'"
 msgstr "使用 <后缀> 代替 '.patch'"
 
-#: builtin/log.c:1419
+#: builtin/log.c:1430
 msgid "start numbering patches at <n> instead of 1"
 msgstr "补丁以 <n> 开始编号,而不是1"
 
-#: builtin/log.c:1421
+#: builtin/log.c:1432
 msgid "mark the series as Nth re-roll"
 msgstr "标记补丁系列是第几次重制"
 
-#: builtin/log.c:1423
+#: builtin/log.c:1434
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "使用 [RFC PATCH] 代替 [PATCH]"
+
+#: builtin/log.c:1437
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "使用 [<前缀>] 代替 [PATCH]"
 
-#: builtin/log.c:1426
+#: builtin/log.c:1440
 msgid "store resulting files in <dir>"
 msgstr "把结果文件存储在 <目录>"
 
-#: builtin/log.c:1429
+#: builtin/log.c:1443
 msgid "don't strip/add [PATCH]"
 msgstr "不删除/添加 [PATCH]"
 
-#: builtin/log.c:1432
+#: builtin/log.c:1446
 msgid "don't output binary diffs"
 msgstr "不输出二进制差异"
 
-#: builtin/log.c:1434
+#: builtin/log.c:1448
 msgid "output all-zero hash in From header"
 msgstr "在 From 头信息中输出全为零的哈希值"
 
-#: builtin/log.c:1436
+#: builtin/log.c:1450
 msgid "don't include a patch matching a commit upstream"
 msgstr "不包含已在上游提交中的补丁"
 
-#: builtin/log.c:1438
+#: builtin/log.c:1452
 msgid "show patch format instead of default (patch + stat)"
 msgstr "显示纯补丁格式而非默认的(补丁+状态)"
 
-#: builtin/log.c:1440
+#: builtin/log.c:1454
 msgid "Messaging"
 msgstr "邮件发送"
 
-#: builtin/log.c:1441
+#: builtin/log.c:1455
 msgid "header"
 msgstr "header"
 
-#: builtin/log.c:1442
+#: builtin/log.c:1456
 msgid "add email header"
 msgstr "添加邮件头"
 
-#: builtin/log.c:1443 builtin/log.c:1445
+#: builtin/log.c:1457 builtin/log.c:1459
 msgid "email"
 msgstr "邮件地址"
 
-#: builtin/log.c:1443
+#: builtin/log.c:1457
 msgid "add To: header"
 msgstr "添加收件人"
 
-#: builtin/log.c:1445
+#: builtin/log.c:1459
 msgid "add Cc: header"
 msgstr "添加抄送"
 
-#: builtin/log.c:1447
+#: builtin/log.c:1461
 msgid "ident"
 msgstr "标识"
 
-#: builtin/log.c:1448
+#: builtin/log.c:1462
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "将 From 地址设置为 <标识>(如若不提供,则用提交者 ID 做为地址)"
 
-#: builtin/log.c:1450
+#: builtin/log.c:1464
 msgid "message-id"
 msgstr "邮件标识"
 
-#: builtin/log.c:1451
+#: builtin/log.c:1465
 msgid "make first mail a reply to <message-id>"
 msgstr "使第一封邮件作为对 <邮件标识> 的回复"
 
-#: builtin/log.c:1452 builtin/log.c:1455
+#: builtin/log.c:1466 builtin/log.c:1469
 msgid "boundary"
 msgstr "边界"
 
-#: builtin/log.c:1453
+#: builtin/log.c:1467
 msgid "attach the patch"
 msgstr "附件方式添加补丁"
 
-#: builtin/log.c:1456
+#: builtin/log.c:1470
 msgid "inline the patch"
 msgstr "内联显示补丁"
 
-#: builtin/log.c:1460
+#: builtin/log.c:1474
 msgid "enable message threading, styles: shallow, deep"
 msgstr "启用邮件线索,风格:浅,深"
 
-#: builtin/log.c:1462
+#: builtin/log.c:1476
 msgid "signature"
 msgstr "签名"
 
-#: builtin/log.c:1463
+#: builtin/log.c:1477
 msgid "add a signature"
 msgstr "添加一个签名"
 
-#: builtin/log.c:1464
+#: builtin/log.c:1478
 msgid "base-commit"
 msgstr "基线提交"
 
-#: builtin/log.c:1465
+#: builtin/log.c:1479
 msgid "add prerequisite tree info to the patch series"
 msgstr "为补丁列表添加前置树信息"
 
-#: builtin/log.c:1467
+#: builtin/log.c:1481
 msgid "add a signature from a file"
 msgstr "从文件添加一个签名"
 
-#: builtin/log.c:1468
+#: builtin/log.c:1482
 msgid "don't print the patch filenames"
 msgstr "不要打印补丁文件名"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1572
 msgid "-n and -k are mutually exclusive."
 msgstr "-n 和 -k 互斥。"
 
-#: builtin/log.c:1560
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix 和 -k 互斥。"
+#: builtin/log.c:1574
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc 和 -k 互斥。"
 
-#: builtin/log.c:1568
+#: builtin/log.c:1582
 msgid "--name-only does not make sense"
 msgstr "--name-only 无意义"
 
-#: builtin/log.c:1570
+#: builtin/log.c:1584
 msgid "--name-status does not make sense"
 msgstr "--name-status 无意义"
 
-#: builtin/log.c:1572
+#: builtin/log.c:1586
 msgid "--check does not make sense"
 msgstr "--check 无意义"
 
-#: builtin/log.c:1602
+#: builtin/log.c:1616
 msgid "standard output, or directory, which one?"
 msgstr "标准输出或目录,哪一个?"
 
-#: builtin/log.c:1604
+#: builtin/log.c:1618
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/log.c:1698
+#: builtin/log.c:1712
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "无法读取签名文件 '%s'"
 
-#: builtin/log.c:1769
+#: builtin/log.c:1784
 msgid "Failed to create output files"
 msgstr "无法创建输出文件"
 
-#: builtin/log.c:1818
+#: builtin/log.c:1833
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<上游> [<头> [<限制>]]]"
 
-#: builtin/log.c:1872
+#: builtin/log.c:1887
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "不能找到跟踪的远程分支,请手工指定 <上游>。\n"
 
-#: builtin/ls-files.c:379
+#: builtin/ls-files.c:468
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<选项>] [<文件>...]"
 
-#: builtin/ls-files.c:428
+#: builtin/ls-files.c:517
 msgid "identify the file status with tags"
 msgstr "用标签标识文件的状态"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:519
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "使用小写字母表示 '假设未改变的' 文件"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:521
 msgid "show cached files in the output (default)"
 msgstr "显示缓存的文件(默认)"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:523
 msgid "show deleted files in the output"
 msgstr "显示已删除的文件"
 
-#: builtin/ls-files.c:436
+#: builtin/ls-files.c:525
 msgid "show modified files in the output"
 msgstr "显示已修改的文件"
 
-#: builtin/ls-files.c:438
+#: builtin/ls-files.c:527
 msgid "show other files in the output"
 msgstr "显示其它文件"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:529
 msgid "show ignored files in the output"
 msgstr "显示忽略的文件"
 
-#: builtin/ls-files.c:443
+#: builtin/ls-files.c:532
 msgid "show staged contents' object name in the output"
 msgstr "显示暂存区内容的对象名称"
 
-#: builtin/ls-files.c:445
+#: builtin/ls-files.c:534
 msgid "show files on the filesystem that need to be removed"
 msgstr "显示文件系统需要删除的文件"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:536
 msgid "show 'other' directories' names only"
 msgstr "只显示“其他”目录的名称"
 
-#: builtin/ls-files.c:449
+#: builtin/ls-files.c:538
 msgid "show line endings of files"
 msgstr "显示文件换行符格式"
 
-#: builtin/ls-files.c:451
+#: builtin/ls-files.c:540
 msgid "don't show empty directories"
 msgstr "不显示空目录"
 
-#: builtin/ls-files.c:454
+#: builtin/ls-files.c:543
 msgid "show unmerged files in the output"
 msgstr "显示未合并的文件"
 
-#: builtin/ls-files.c:456
+#: builtin/ls-files.c:545
 msgid "show resolve-undo information"
 msgstr "显示 resolve-undo 信息"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:547
 msgid "skip files matching pattern"
 msgstr "匹配排除文件的模式"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:550
 msgid "exclude patterns are read from <file>"
 msgstr "从 <文件> 中读取排除模式"
 
-#: builtin/ls-files.c:464
+#: builtin/ls-files.c:553
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "从 <文件> 读取额外的每个目录的排除模式"
 
-#: builtin/ls-files.c:466
+#: builtin/ls-files.c:555
 msgid "add the standard git exclusions"
 msgstr "添加标准的 git 排除"
 
-#: builtin/ls-files.c:469
+#: builtin/ls-files.c:558
 msgid "make the output relative to the project top directory"
 msgstr "显示相对于顶级目录的文件名"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:561
+msgid "recurse through submodules"
+msgstr "在子模组中递归"
+
+#: builtin/ls-files.c:563
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "如果任何 <文件> 都不在索引区,视为错误"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:564
 msgid "tree-ish"
 msgstr "树或提交"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:565
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr "假装自从 <树或提交> 之后删除的路径仍然存在"
 
-#: builtin/ls-files.c:476
+#: builtin/ls-files.c:567
 msgid "show debugging data"
 msgstr "显示调试数据"
 
@@ -8427,39 +9689,39 @@ msgstr ""
 "                     [-q | --quiet] [--exit-code] [--get-url]\n"
 "                     [--symref] [<仓库> [<引用>...]]"
 
-#: builtin/ls-remote.c:50
+#: builtin/ls-remote.c:52
 msgid "do not print remote URL"
 msgstr "不打印远程 URL"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+#: builtin/ls-remote.c:53 builtin/ls-remote.c:55
 msgid "exec"
 msgstr "exec"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+#: builtin/ls-remote.c:54 builtin/ls-remote.c:56
 msgid "path of git-upload-pack on the remote host"
 msgstr "远程主机上的 git-upload-pack 路径"
 
-#: builtin/ls-remote.c:56
+#: builtin/ls-remote.c:58
 msgid "limit to tags"
 msgstr "仅限于标签"
 
-#: builtin/ls-remote.c:57
+#: builtin/ls-remote.c:59
 msgid "limit to heads"
 msgstr "仅限于分支"
 
-#: builtin/ls-remote.c:58
+#: builtin/ls-remote.c:60
 msgid "do not show peeled tags"
 msgstr "不显示已解析的标签"
 
-#: builtin/ls-remote.c:60
+#: builtin/ls-remote.c:62
 msgid "take url.<base>.insteadOf into account"
 msgstr "参考 url.<base>.insteadOf 设置"
 
-#: builtin/ls-remote.c:62
+#: builtin/ls-remote.c:64
 msgid "exit with exit code 2 if no matching refs are found"
 msgstr "若未找到匹配的引用则以退出码2退出"
 
-#: builtin/ls-remote.c:64
+#: builtin/ls-remote.c:66
 msgid "show underlying ref in addition to the object pointed by it"
 msgstr "除了显示指向的对象外,显示指向的引用名"
 
@@ -8467,35 +9729,35 @@ msgstr "除了显示指向的对象外,显示指向的引用名"
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr "git ls-tree [<选项>] <树或提交> [<路径>...]"
 
-#: builtin/ls-tree.c:128
+#: builtin/ls-tree.c:126
 msgid "only show trees"
 msgstr "只显示树"
 
-#: builtin/ls-tree.c:130
+#: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
 msgstr "递归到子树"
 
-#: builtin/ls-tree.c:132
+#: builtin/ls-tree.c:130
 msgid "show trees when recursing"
 msgstr "当递归时显示树"
 
-#: builtin/ls-tree.c:135
+#: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
 msgstr "条目以 NUL 字符终止"
 
-#: builtin/ls-tree.c:136
+#: builtin/ls-tree.c:134
 msgid "include object size"
 msgstr "包括对象大小"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
 msgstr "只列出文件名"
 
-#: builtin/ls-tree.c:143
+#: builtin/ls-tree.c:141
 msgid "use full path names"
 msgstr "使用文件的全路径"
 
-#: builtin/ls-tree.c:145
+#: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "列出整个树;不仅仅当前目录(隐含 --full-name)"
 
@@ -8504,168 +9766,172 @@ msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<选项>] [<提交>...]"
 
 #: builtin/merge.c:47
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<选项>] <说明> HEAD <提交>"
-
-#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:102
+#: builtin/merge.c:48
+msgid "git merge --continue"
+msgstr "git merge --continue"
+
+#: builtin/merge.c:103
 msgid "switch `m' requires a value"
 msgstr "开关 `m' 需要一个值"
 
-#: builtin/merge.c:139
+#: builtin/merge.c:140
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "不能找到合并策略 '%s'。\n"
 
-#: builtin/merge.c:140
+#: builtin/merge.c:141
 #, c-format
 msgid "Available strategies are:"
 msgstr "可用的策略有:"
 
-#: builtin/merge.c:145
+#: builtin/merge.c:146
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "可用的自定义策略有:"
 
-#: builtin/merge.c:195 builtin/pull.c:126
+#: builtin/merge.c:196 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "在合并的最后不显示差异统计"
 
-#: builtin/merge.c:198 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "在合并的最后显示差异统计"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:200 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(和 --stat 同义)"
 
-#: builtin/merge.c:201 builtin/pull.c:135
+#: builtin/merge.c:202 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "在合并提交信息中添加(最多 <n> 条)精简提交记录"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:205 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "创建一个单独的提交而不是做一次合并"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:207 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "如果合并成功,执行一次提交(默认)"
 
-#: builtin/merge.c:208 builtin/pull.c:144
+#: builtin/merge.c:209 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "在提交前编辑提交说明"
 
-#: builtin/merge.c:209
+#: builtin/merge.c:210
 msgid "allow fast-forward (default)"
 msgstr "允许快进(默认)"
 
-#: builtin/merge.c:211 builtin/pull.c:150
+#: builtin/merge.c:212 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "如果不能快进就放弃合并"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:216 builtin/pull.c:154
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "验证指定的提交是否包含一个有效的 GPG 签名"
 
-#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157
-#: builtin/revert.c:89
+#: builtin/merge.c:217 builtin/notes.c:773 builtin/pull.c:158
+#: builtin/revert.c:108
 msgid "strategy"
 msgstr "策略"
 
-#: builtin/merge.c:217 builtin/pull.c:158
+#: builtin/merge.c:218 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "要使用的合并策略"
 
-#: builtin/merge.c:218 builtin/pull.c:161
+#: builtin/merge.c:219 builtin/pull.c:162
 msgid "option=value"
 msgstr "option=value"
 
-#: builtin/merge.c:219 builtin/pull.c:162
+#: builtin/merge.c:220 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "所选的合并策略的选项"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "合并的提交说明(针对非快进式合并)"
 
-#: builtin/merge.c:225
+#: builtin/merge.c:226
 msgid "abort the current in-progress merge"
 msgstr "放弃当前正在进行的合并"
 
-#: builtin/merge.c:227 builtin/pull.c:169
+#: builtin/merge.c:228
+msgid "continue the current in-progress merge"
+msgstr "继续当前正在进行的合并"
+
+#: builtin/merge.c:230 builtin/pull.c:170
 msgid "allow merging unrelated histories"
 msgstr "允许合并不相关的历史"
 
-#: builtin/merge.c:255
+#: builtin/merge.c:258
 msgid "could not run stash."
 msgstr "不能进行进度保存。"
 
-#: builtin/merge.c:260
+#: builtin/merge.c:263
 msgid "stash failed"
 msgstr "进度保存失败"
 
-#: builtin/merge.c:265
+#: builtin/merge.c:268
 #, c-format
 msgid "not a valid object: %s"
 msgstr "不是一个有效对象:%s"
 
-#: builtin/merge.c:284 builtin/merge.c:301
+#: builtin/merge.c:287 builtin/merge.c:304
 msgid "read-tree failed"
 msgstr "读取树失败"
 
 #  译者:注意保持前导空格
-#: builtin/merge.c:331
+#: builtin/merge.c:334
 msgid " (nothing to squash)"
 msgstr " (无可压缩)"
 
-#: builtin/merge.c:342
+#: builtin/merge.c:345
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "压缩提交 -- 未更新 HEAD\n"
 
-#: builtin/merge.c:392
+#: builtin/merge.c:395
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "无合并信息 -- 未更新 HEAD\n"
 
-#: builtin/merge.c:443
+#: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' 没有指向一个提交"
 
-#: builtin/merge.c:533
+#: builtin/merge.c:536
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "坏的 branch.%s.mergeoptions 字符串:%s"
 
-#: builtin/merge.c:652
+#: builtin/merge.c:656
 msgid "Not handling anything other than two heads merge."
-msgstr "不能处理两个头合并之外的任何操作。"
+msgstr "处理两个头合并之外的任何操作。"
 
-#: builtin/merge.c:666
+#: builtin/merge.c:670
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "merge-recursive 的未知选项:-X%s"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:685
 #, c-format
 msgid "unable to write %s"
 msgstr "不能写 %s"
 
-#: builtin/merge.c:733
+#: builtin/merge.c:737
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "不能从 '%s' 读取"
 
-#: builtin/merge.c:742
+#: builtin/merge.c:746
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr "未提交合并,使用 'git commit' 完成此次合并。\n"
 
-#: builtin/merge.c:748
+#: builtin/merge.c:752
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8679,66 +9945,73 @@ msgstr ""
 "\n"
 "以 '%c' 开头的行将被忽略,而且空提交说明将会终止提交。\n"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 msgid "Empty commit message."
 msgstr "空提交信息。"
 
-#: builtin/merge.c:792
+#: builtin/merge.c:796
 #, c-format
 msgid "Wonderful.\n"
 msgstr "太棒了。\n"
 
-#: builtin/merge.c:847
+#: builtin/merge.c:851
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "自动合并失败,修正冲突然后提交修正的结果。\n"
 
-#: builtin/merge.c:863
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "'%s' 不是一个提交"
-
-#: builtin/merge.c:904
+#: builtin/merge.c:890
 msgid "No current branch."
 msgstr "没有当前分支。"
 
-#: builtin/merge.c:906
+#: builtin/merge.c:892
 msgid "No remote for the current branch."
 msgstr "当前分支没有对应的远程仓库。"
 
-#: builtin/merge.c:908
+#: builtin/merge.c:894
 msgid "No default upstream defined for the current branch."
 msgstr "当前分支没有定义默认的上游分支。"
 
-#: builtin/merge.c:913
+#: builtin/merge.c:899
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "对于 %s 没有来自 %s 的远程跟踪分支"
 
-#: builtin/merge.c:960
+#: builtin/merge.c:946
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
 msgstr "环境 '%2$s' 中存在坏的取值 '%1$s'"
 
-#: builtin/merge.c:1034
+#: builtin/merge.c:1020
 #, c-format
 msgid "could not close '%s'"
 msgstr "不能关闭 '%s'"
 
-#: builtin/merge.c:1061
+#: builtin/merge.c:1047
 #, c-format
 msgid "not something we can merge in %s: %s"
 msgstr "不能在 %s 中合并:%s"
 
-#: builtin/merge.c:1095
+#: builtin/merge.c:1081
 msgid "not something we can merge"
 msgstr "不能合并"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1146
+msgid "--abort expects no arguments"
+msgstr "--abort 不带参数"
+
+#: builtin/merge.c:1150
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "没有要终止的合并(MERGE_HEAD 丢失)。"
 
-#: builtin/merge.c:1178
+#: builtin/merge.c:1162
+msgid "--continue expects no arguments"
+msgstr "--continue 不带参数"
+
+#: builtin/merge.c:1166
+msgid "There is no merge in progress (MERGE_HEAD missing)."
+msgstr "没有进行中的合并(MERGE_HEAD 丢失)。"
+
+#: builtin/merge.c:1182
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8746,7 +10019,7 @@ msgstr ""
 "您尚未结束您的合并(存在 MERGE_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1185
+#: builtin/merge.c:1189
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8754,112 +10027,112 @@ msgstr ""
 "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1188
+#: builtin/merge.c:1192
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。"
 
-#: builtin/merge.c:1197
+#: builtin/merge.c:1201
 msgid "You cannot combine --squash with --no-ff."
 msgstr "您不能将 --squash 与 --no-ff 同时使用。"
 
-#: builtin/merge.c:1205
+#: builtin/merge.c:1209
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "未指定提交并且 merge.defaultToUpstream 未设置。"
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1226
 msgid "Squash commit into empty head not supported yet"
 msgstr "尚不支持到空分支的压缩提交"
 
-#: builtin/merge.c:1224
+#: builtin/merge.c:1228
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "到空分支的非快进式提交没有意义"
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1233
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 不能被合并"
 
-#: builtin/merge.c:1231
+#: builtin/merge.c:1235
 msgid "Can merge only exactly one commit into empty head"
 msgstr "只能将一个提交合并到空分支上"
 
-#: builtin/merge.c:1287
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "提交 %s 有一个非可信的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1290
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "提交 %s 有一个错误的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "提交 %s 没有一个 GPG 签名。"
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1278
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "提交 %s 有一个来自 %s 的好的 GPG 签名。\n"
 
-#: builtin/merge.c:1358
+#: builtin/merge.c:1340
 msgid "refusing to merge unrelated histories"
 msgstr "拒绝合并无关的历史"
 
-#: builtin/merge.c:1367
+#: builtin/merge.c:1349
 msgid "Already up-to-date."
 msgstr "已经是最新的。"
 
-#: builtin/merge.c:1382
+#: builtin/merge.c:1359
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "更新 %s..%s\n"
 
-#: builtin/merge.c:1419
+#: builtin/merge.c:1400
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "尝试非常小的索引内合并...\n"
 
-#: builtin/merge.c:1426
+#: builtin/merge.c:1407
 #, c-format
 msgid "Nope.\n"
 msgstr "无。\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1432
 msgid "Already up-to-date. Yeeah!"
 msgstr "已经是最新的。耶!"
 
-#: builtin/merge.c:1457
+#: builtin/merge.c:1438
 msgid "Not possible to fast-forward, aborting."
 msgstr "无法快进,终止。"
 
-#: builtin/merge.c:1480 builtin/merge.c:1559
+#: builtin/merge.c:1461 builtin/merge.c:1540
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "将树回滚至原始状态...\n"
 
-#: builtin/merge.c:1484
+#: builtin/merge.c:1465
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "尝试合并策略 %s...\n"
 
-#: builtin/merge.c:1550
+#: builtin/merge.c:1531
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "没有合并策略处理此合并。\n"
 
-#: builtin/merge.c:1552
+#: builtin/merge.c:1533
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "使用策略 %s 合并失败。\n"
 
-#: builtin/merge.c:1561
+#: builtin/merge.c:1542
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "使用 %s 以准备手工解决。\n"
 
-#: builtin/merge.c:1573
+#: builtin/merge.c:1554
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "自动合并进展顺利,按要求在提交前停止\n"
@@ -8884,23 +10157,23 @@ msgstr "git merge-base --is-ancestor <提交> <提交>"
 msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr "git merge-base --fork-point <引用> [<提交>]"
 
-#: builtin/merge-base.c:214
+#: builtin/merge-base.c:217
 msgid "output all common ancestors"
 msgstr "输出所有共同的祖先"
 
-#: builtin/merge-base.c:216
+#: builtin/merge-base.c:219
 msgid "find ancestors for a single n-way merge"
 msgstr "查找一个多路合并的祖先提交"
 
-#: builtin/merge-base.c:218
+#: builtin/merge-base.c:221
 msgid "list revs not reachable from others"
 msgstr "显示不能被其他访问到的版本"
 
-#: builtin/merge-base.c:220
+#: builtin/merge-base.c:223
 msgid "is the first one ancestor of the other?"
 msgstr "第一个是其他的祖先提交么?"
 
-#: builtin/merge-base.c:222
+#: builtin/merge-base.c:225
 msgid "find where <commit> forked from reflog of <ref>"
 msgstr "根据 <引用> 的引用日志查找 <提交> 的派生处"
 
@@ -8912,38 +10185,69 @@ msgstr ""
 "git merge-file [<选项>] [-L <文件1> [-L <初始> [-L <名字2>]]] <文件1> <初始文"
 "件> <文件2>"
 
-#: builtin/merge-file.c:33
+#: builtin/merge-file.c:32
 msgid "send results to standard output"
 msgstr "将结果发送到标准输出"
 
-#: builtin/merge-file.c:34
+#: builtin/merge-file.c:33
 msgid "use a diff3 based merge"
 msgstr "使用基于 diff3 的合并"
 
-#: builtin/merge-file.c:35
+#: builtin/merge-file.c:34
 msgid "for conflicts, use our version"
 msgstr "如果冲突,使用我们的版本"
 
-#: builtin/merge-file.c:37
+#: builtin/merge-file.c:36
 msgid "for conflicts, use their version"
 msgstr "如果冲突,使用他们的版本"
 
-#: builtin/merge-file.c:39
+#: builtin/merge-file.c:38
 msgid "for conflicts, use a union version"
 msgstr "如果冲突,使用联合版本"
 
-#: builtin/merge-file.c:42
+#: builtin/merge-file.c:41
 msgid "for conflicts, use this marker size"
 msgstr "如果冲突,使用指定长度的标记"
 
-#: builtin/merge-file.c:43
+#: builtin/merge-file.c:42
 msgid "do not warn about conflicts"
 msgstr "不要警告冲突"
 
-#: builtin/merge-file.c:45
+#: builtin/merge-file.c:44
 msgid "set labels for file1/orig-file/file2"
 msgstr "为 文件1/初始文件/文件2 设置标签"
 
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
+msgstr "未知选项 %s"
+
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
+msgstr "不能解析对象 '%s'"
+
+#: builtin/merge-recursive.c:55
+#, c-format
+msgid "cannot handle more than %d base. Ignoring %s."
+msgid_plural "cannot handle more than %d bases. Ignoring %s."
+msgstr[0] "无法处理 %d 条以上的基线。忽略 %s。"
+msgstr[1] "无法处理 %d 条以上的基线。忽略 %s。"
+
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
+msgstr "不能处理两个头合并之外的任何操作。"
+
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
+msgstr "无法解析引用 '%s'"
+
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
+msgstr "合并 %s 和 %s\n"
+
 #: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
@@ -8960,135 +10264,139 @@ msgstr "允许丢失的对象"
 msgid "allow creation of more than one tree"
 msgstr "允许创建一个以上的树"
 
-#: builtin/mv.c:15
+#: builtin/mv.c:16
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<选项>] <源>... <目标>"
 
-#: builtin/mv.c:70
+#: builtin/mv.c:82
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "目录 %s 在索引中并且不是子模组?"
 
-#: builtin/mv.c:72 builtin/rm.c:317
+#: builtin/mv.c:84 builtin/rm.c:290
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr "请将您的修改暂存到 .gitmodules 中或保存进度后再继续"
 
-#: builtin/mv.c:90
+#: builtin/mv.c:102
 #, c-format
 msgid "%.*s is in index"
 msgstr "%.*s 在索引中"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:124
 msgid "force move/rename even if target exists"
 msgstr "强制移动/重命令,即使目标存在"
 
-#: builtin/mv.c:113
+#: builtin/mv.c:125
 msgid "skip move/rename errors"
 msgstr "跳过移动/重命名错误"
 
-#: builtin/mv.c:155
+#: builtin/mv.c:167
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "目标 '%s' 不是一个目录"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:178
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "检查 '%s' 到 '%s' 的重命名\n"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:182
 msgid "bad source"
 msgstr "坏的源"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:185
 msgid "can not move directory into itself"
 msgstr "不能将目录移动到自身"
 
-#: builtin/mv.c:176
+#: builtin/mv.c:188
 msgid "cannot move directory over file"
 msgstr "不能将目录移动到文件"
 
-#: builtin/mv.c:185
+#: builtin/mv.c:197
 msgid "source directory is empty"
 msgstr "源目录为空"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:222
 msgid "not under version control"
 msgstr "不在版本控制之下"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:225
 msgid "destination exists"
 msgstr "目标已存在"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:233
 #, c-format
 msgid "overwriting '%s'"
 msgstr "覆盖 '%s'"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:236
 msgid "Cannot overwrite"
 msgstr "不能覆盖"
 
-#: builtin/mv.c:227
+#: builtin/mv.c:239
 msgid "multiple sources for the same target"
 msgstr "同一目标具有多个源"
 
-#: builtin/mv.c:229
+#: builtin/mv.c:241
 msgid "destination directory does not exist"
 msgstr "目标目录不存在"
 
-#: builtin/mv.c:236
+#: builtin/mv.c:248
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s,源=%s,目标=%s"
 
-#: builtin/mv.c:257
+#: builtin/mv.c:269
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "重命名 %s 至 %s\n"
 
-#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
+#: builtin/mv.c:275 builtin/remote.c:710 builtin/repack.c:384
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "重命名 '%s' 失败"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:289
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<选项>] <提交>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:290
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<选项>] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:291
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<选项>] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:346
 msgid "print only names (no SHA-1)"
 msgstr "只打印名称(无 SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:347
 msgid "only use tags to name the commits"
 msgstr "只使用标签来命名提交"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:349
 msgid "only use refs matching <pattern>"
 msgstr "只使用和 <模式> 相匹配的引用"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:351
+msgid "ignore refs matching <pattern>"
+msgstr "忽略和 <模式> 相匹配的引用"
+
+#: builtin/name-rev.c:353
 msgid "list all commits reachable from all refs"
 msgstr "列出可以从所有引用访问的提交"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:354
 msgid "read from stdin"
 msgstr "从标准输入读取"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:355
 msgid "allow to print `undefined` names (default)"
 msgstr "允许打印 `未定义` 的名称(默认)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:361
 msgid "dereference tags in the input (internal use)"
 msgstr "反向解析输入中的标签(内部使用)"
 
@@ -9220,7 +10528,7 @@ msgid "failed to finish 'show' for object '%s'"
 msgstr "无法为对象 '%s' 完成 'show'"
 
 #: builtin/notes.c:194
-msgid "Please supply the note contents using either -m or -F option"
+msgid "please supply the note contents using either -m or -F option"
 msgstr "请通过 -m 或 -F 选项为注解提供内容"
 
 #: builtin/notes.c:203
@@ -9229,106 +10537,130 @@ msgstr "不能写注解对象"
 
 #: builtin/notes.c:205
 #, c-format
-msgid "The note contents have been left in %s"
+msgid "the note contents have been left in %s"
 msgstr "注解内容被留在 %s 中"
 
-#: builtin/notes.c:233 builtin/tag.c:439
+#: builtin/notes.c:233 builtin/tag.c:516
 #, c-format
 msgid "cannot read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/notes.c:235 builtin/tag.c:442
+#: builtin/notes.c:235 builtin/tag.c:519
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "不能打开或读取 '%s'"
 
+#: builtin/notes.c:254 builtin/notes.c:305 builtin/notes.c:307
+#: builtin/notes.c:372 builtin/notes.c:427 builtin/notes.c:513
+#: builtin/notes.c:518 builtin/notes.c:596 builtin/notes.c:658
+#, c-format
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "无法解析 '%s' 为一个有效引用。"
+
 #: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
+msgid "failed to read object '%s'."
 msgstr "无法读取对象 '%s'。"
 
 #: builtin/notes.c:261
 #, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "不能从非数据对象 '%s' 中读取注解数据"
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "不能从非数据对象 '%s' 中读取注解数据。"
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "非法的输入行:'%s'。"
+
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "从 '%s' 拷贝注解到 '%s' 时失败"
+
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
+#, c-format
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "拒绝向 %2$s(在 refs/notes/ 之外)%1$s注解"
 
-#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494
-#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650
-#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968
+#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:496
+#: builtin/notes.c:508 builtin/notes.c:584 builtin/notes.c:651
+#: builtin/notes.c:801 builtin/notes.c:948 builtin/notes.c:969
 msgid "too many parameters"
 msgstr "参数太多"
 
-#: builtin/notes.c:376 builtin/notes.c:663
+#: builtin/notes.c:378 builtin/notes.c:664
 #, c-format
-msgid "No note found for object %s."
+msgid "no note found for object %s."
 msgstr "未发现对象 %s 的注解。"
 
-#: builtin/notes.c:397 builtin/notes.c:560
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "注解内容作为一个字符串"
 
-#: builtin/notes.c:400 builtin/notes.c:563
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "注解内容到一个文件中"
 
-#: builtin/notes.c:403 builtin/notes.c:566
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse and edit specified note object"
 msgstr "重用和编辑指定的注解对象"
 
-#: builtin/notes.c:406 builtin/notes.c:569
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "重用指定的注解对象"
 
-#: builtin/notes.c:409 builtin/notes.c:572
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "允许保存空白注释"
 
-#: builtin/notes.c:410 builtin/notes.c:481
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "替换已存在的注解"
 
-#: builtin/notes.c:435
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "不能添加注解。发现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
 
-#: builtin/notes.c:450 builtin/notes.c:529
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "覆盖对象 %s 现存注解\n"
 
-#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887
+#: builtin/notes.c:463 builtin/notes.c:623 builtin/notes.c:888
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "删除对象 %s 的注解\n"
 
-#: builtin/notes.c:482
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "从标准输入读取对象"
 
-#: builtin/notes.c:484
+#: builtin/notes.c:486
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "重新加载 <命令> 的配置(隐含 --stdin)"
 
-#: builtin/notes.c:502
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "参数太少"
 
-#: builtin/notes.c:523
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "不能拷贝注解。发现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
 
-#: builtin/notes.c:535
+#: builtin/notes.c:537
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
+msgid "missing notes on source object %s. Cannot copy."
 msgstr "源对象 %s 缺少注解。不能拷贝。"
 
-#: builtin/notes.c:587
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -9337,112 +10669,146 @@ msgstr ""
 "子命令 'edit' 的选项 -m/-F/-c/-C 已弃用。\n"
 "请换用 'git notes add -f -m/-F/-c/-C'。\n"
 
-#: builtin/notes.c:753
+#: builtin/notes.c:684
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "无法删除引用 NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:686
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "无法删除引用 NOTES_MERGE_REF"
+
+#: builtin/notes.c:688
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "无法删除 'git notes merge' 工作区"
+
+#: builtin/notes.c:708
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "无法读取引用 NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:710
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "无法从 NOTES_MERGE_PARTIAL 中找到提交。"
+
+#: builtin/notes.c:712
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "无法从 NOTES_MERGE_PARTIAL 中解析提交。"
+
+#: builtin/notes.c:725
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "无法解析 NOTES_MERGE_REF"
+
+#: builtin/notes.c:728
+msgid "failed to finalize notes merge"
+msgstr "无法完成注解合并"
+
+#: builtin/notes.c:754
 #, c-format
 msgid "unknown notes merge strategy %s"
 msgstr "未知的注解合并策略 %s"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:770
 msgid "General options"
 msgstr "通用选项"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:772
 msgid "Merge options"
 msgstr "合并选项"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:774
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 msgstr "使用指定的策略解决注解冲突 (manual/ours/theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:776
 msgid "Committing unmerged notes"
 msgstr "提交未合并的注解"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:778
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "通过提交未合并的注解来完成注解合并"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:780
 msgid "Aborting notes merge resolution"
 msgstr "中止注解合并的方案"
 
-#: builtin/notes.c:781
+#: builtin/notes.c:782
 msgid "abort notes merge"
 msgstr "中止注解合并"
 
-#: builtin/notes.c:792
+#: builtin/notes.c:793
 msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr "不能混用 --commit、--abort 或 -s/--strategy"
 
-#: builtin/notes.c:797
-msgid "Must specify a notes ref to merge"
+#: builtin/notes.c:798
+msgid "must specify a notes ref to merge"
 msgstr "必须指定一个注解引用来合并"
 
-#: builtin/notes.c:821
+#: builtin/notes.c:822
 #, c-format
-msgid "Unknown -s/--strategy: %s"
+msgid "unknown -s/--strategy: %s"
 msgstr "未知的 -s/--strategy:%s"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:859
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "ä¸\80个å\88° %s ç\9a\84注解å\90\88并已ç»\8få\9c¨ %s 执行中"
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "ä½\8däº\8e %2$s ç\9a\84ä¸\80个å\88° %1$s ä¸­ç\9a\84注解å\90\88并正å\9c¨执行中"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:862
 #, c-format
-msgid "Failed to store link to current notes ref (%s)"
-msgstr "无法存储链接到当前注解的引用(%s)"
+msgid "failed to store link to current notes ref (%s)"
+msgstr "无法存储链接到当前的注解引用(%s)"
 
-#: builtin/notes.c:863
+#: builtin/notes.c:864
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
 "'git notes merge --commit', or abort the merge with 'git notes merge --"
 "abort'.\n"
-msgstr "自动合并说明失败。修改 %s 中的冲突并且使用命令 'git notes merge --commit' 提交结果,或者使用命令 'git notes merge --abort' 终止合并。\n"
+msgstr ""
+"自动合并说明失败。修改 %s 中的冲突并且使用命令 'git notes merge --commit' 提"
+"交结果,或者使用命令 'git notes merge --abort' 终止合并。\n"
 
-#: builtin/notes.c:885
+#: builtin/notes.c:886
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "对象 %s 没有注解\n"
 
-#: builtin/notes.c:897
+#: builtin/notes.c:898
 msgid "attempt to remove non-existent note is not an error"
 msgstr "尝试删除不存在的注解不是一个错误"
 
-#: builtin/notes.c:900
+#: builtin/notes.c:901
 msgid "read object names from the standard input"
 msgstr "从标准输入读取对象名称"
 
-#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
+#: builtin/notes.c:939 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "不删除,只显示"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:940
 msgid "report pruned notes"
 msgstr "报告清除的注解"
 
-#: builtin/notes.c:981
+#: builtin/notes.c:982
 msgid "notes-ref"
 msgstr "注解引用"
 
-#: builtin/notes.c:982
+#: builtin/notes.c:983
 msgid "use notes from <notes-ref>"
 msgstr "从 <注解引用> 使用注解"
 
-#: builtin/notes.c:1017 builtin/remote.c:1623
+#: builtin/notes.c:1018
 #, c-format
-msgid "Unknown subcommand: %s"
+msgid "unknown subcommand: %s"
 msgstr "未知子命令:%s"
 
-#: builtin/pack-objects.c:28
+#: builtin/pack-objects.c:29
 msgid ""
 "git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr "git pack-objects --stdout [<选项>...] [< <引用列表> | < <对象列表>]"
 
-#: builtin/pack-objects.c:29
+#: builtin/pack-objects.c:30
 msgid ""
 "git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr "git pack-objects [<选项>...] <base-name> [< <引用列表> | < <对象列表>]"
@@ -9452,173 +10818,169 @@ msgstr "git pack-objects [<选项>...] <base-name> [< <引用列表> | < <对象
 msgid "deflate error (%d)"
 msgstr "压缩错误 (%d)"
 
-#: builtin/pack-objects.c:766
+#: builtin/pack-objects.c:770
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr "禁用 bitmap 写入,因为 pack.packSizeLimit 设置使得包被切分为多个"
 
-#: builtin/pack-objects.c:779
+#: builtin/pack-objects.c:783
 msgid "Writing objects"
 msgstr "写入对象中"
 
-#: builtin/pack-objects.c:1037
+#: builtin/pack-objects.c:1063
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "禁用 bitmap 写入,因为一些对象将不会被打包"
 
-#: builtin/pack-objects.c:2197
+#: builtin/pack-objects.c:2426
 msgid "Compressing objects"
 msgstr "压缩对象中"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2829
 #, c-format
 msgid "unsupported index version %s"
 msgstr "不支持的索引版本 %s"
 
-#: builtin/pack-objects.c:2615
+#: builtin/pack-objects.c:2833
 #, c-format
 msgid "bad index version '%s'"
 msgstr "坏的索引版本 '%s'"
 
-#: builtin/pack-objects.c:2645
+#: builtin/pack-objects.c:2863
 msgid "do not show progress meter"
 msgstr "不显示进度表"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2865
 msgid "show progress meter"
 msgstr "显示进度表"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2867
 msgid "show progress meter during object writing phase"
 msgstr "在对象写入阶段显示进度表"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2870
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "当进度表显示时类似于 --all-progress"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2871
 msgid "version[,offset]"
 msgstr "版本[,偏移]"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2872
 msgid "write the pack index file in the specified idx format version"
 msgstr "用指定的 idx 格式版本来写包索引文件"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2875
 msgid "maximum size of each output pack file"
 msgstr "每个输出包的最大尺寸"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2877
 msgid "ignore borrowed objects from alternate object store"
 msgstr "忽略从备用对象存储里借用对象"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2879
 msgid "ignore packed objects"
 msgstr "忽略包对象"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2881
 msgid "limit pack window by objects"
 msgstr "限制打包窗口的对象数"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2883
 msgid "limit pack window by memory in addition to object limit"
 msgstr "除对象数量限制外设置打包窗口的内存限制"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2885
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "打包允许的 delta 链的最大长度"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2887
 msgid "reuse existing deltas"
 msgstr "重用已存在的 deltas"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2889
 msgid "reuse existing objects"
 msgstr "重用已存在的对象"
 
-#: builtin/pack-objects.c:2673
+#: builtin/pack-objects.c:2891
 msgid "use OFS_DELTA objects"
 msgstr "使用 OFS_DELTA 对象"
 
-#: builtin/pack-objects.c:2675
+#: builtin/pack-objects.c:2893
 msgid "use threads when searching for best delta matches"
 msgstr "使用线程查询最佳 delta 匹配"
 
-#: builtin/pack-objects.c:2677
+#: builtin/pack-objects.c:2895
 msgid "do not create an empty pack output"
 msgstr "不创建空的包输出"
 
-#: builtin/pack-objects.c:2679
+#: builtin/pack-objects.c:2897
 msgid "read revision arguments from standard input"
 msgstr "从标准输入读取版本号参数"
 
-#: builtin/pack-objects.c:2681
+#: builtin/pack-objects.c:2899
 msgid "limit the objects to those that are not yet packed"
 msgstr "限制那些尚未打包的对象"
 
-#: builtin/pack-objects.c:2684
+#: builtin/pack-objects.c:2902
 msgid "include objects reachable from any reference"
 msgstr "包括可以从任何引用访问到的对象"
 
-#: builtin/pack-objects.c:2687
+#: builtin/pack-objects.c:2905
 msgid "include objects referred by reflog entries"
 msgstr "包括被引用日志引用到的对象"
 
-#: builtin/pack-objects.c:2690
+#: builtin/pack-objects.c:2908
 msgid "include objects referred to by the index"
 msgstr "包括被索引引用到的对象"
 
-#: builtin/pack-objects.c:2693
+#: builtin/pack-objects.c:2911
 msgid "output pack to stdout"
 msgstr "输出包到标准输出"
 
-#: builtin/pack-objects.c:2695
+#: builtin/pack-objects.c:2913
 msgid "include tag objects that refer to objects to be packed"
 msgstr "包括那些引用了待打包对象的标签对象"
 
-#: builtin/pack-objects.c:2697
+#: builtin/pack-objects.c:2915
 msgid "keep unreachable objects"
 msgstr "维持不可达的对象"
 
-#: builtin/pack-objects.c:2699
+#: builtin/pack-objects.c:2917
 msgid "pack loose unreachable objects"
 msgstr "打包松散的不可达对象"
 
-#: builtin/pack-objects.c:2700 parse-options.h:142
-msgid "time"
-msgstr "时间"
-
-#: builtin/pack-objects.c:2701
+#: builtin/pack-objects.c:2919
 msgid "unpack unreachable objects newer than <time>"
 msgstr "将比给定 <时间> 新的无法访问的对象解包"
 
-#: builtin/pack-objects.c:2704
+#: builtin/pack-objects.c:2922
 msgid "create thin packs"
 msgstr "创建精简包"
 
-#: builtin/pack-objects.c:2706
+#: builtin/pack-objects.c:2924
 msgid "create packs suitable for shallow fetches"
 msgstr "创建适合浅克隆仓库获取的包"
 
-#: builtin/pack-objects.c:2708
+#: builtin/pack-objects.c:2926
 msgid "ignore packs that have companion .keep file"
 msgstr "忽略配有 .keep 文件的包"
 
-#: builtin/pack-objects.c:2710
+#: builtin/pack-objects.c:2928
 msgid "pack compression level"
 msgstr "打包压缩级别"
 
-#: builtin/pack-objects.c:2712
+#: builtin/pack-objects.c:2930
 msgid "do not hide commits by grafts"
 msgstr "显示被嫁接隐藏的提交"
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2932
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "使用 bitmap 索引(如果有的话)以提高对象计数时的速度"
 
-#: builtin/pack-objects.c:2716
+#: builtin/pack-objects.c:2934
 msgid "write a bitmap index together with the pack index"
 msgstr "在建立包索引的同时创建 bitmap 索引"
 
-#: builtin/pack-objects.c:2829
+#: builtin/pack-objects.c:3061
 msgid "Counting objects"
 msgstr "对象计数中"
 
@@ -9646,11 +11008,11 @@ msgstr "正在删除重复对象"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <时间>] [--] [<头>...]"
 
-#: builtin/prune.c:106 builtin/worktree.c:128
+#: builtin/prune.c:106
 msgid "report pruned objects"
 msgstr "报告清除的对象"
 
-#: builtin/prune.c:109 builtin/worktree.c:130
+#: builtin/prune.c:109
 msgid "expire objects older than <time>"
 msgstr "使早于给定时间的对象过期"
 
@@ -9658,69 +11020,62 @@ msgstr "使早于给定时间的对象过期"
 msgid "cannot prune in a precious-objects repo"
 msgstr "不能在珍品仓库中执行清理操作"
 
-#: builtin/pull.c:72
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "%s 的值无效:%s"
+
+#: builtin/pull.c:73
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git pull [<选项>] [<仓库> [<引用规格>...]]"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "和合并相关的选项"
 
-#: builtin/pull.c:123
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "使用变基操作取代合并操作以合入修改"
 
-#: builtin/pull.c:147 builtin/revert.c:101
+#: builtin/pull.c:148 builtin/rebase--helper.c:18 builtin/revert.c:120
 msgid "allow fast-forward"
 msgstr "允许快进式"
 
-#: builtin/pull.c:156
+#: builtin/pull.c:157
 msgid "automatically stash/stash pop before and after rebase"
 msgstr "自动在变基操作前后执行 stash/stash pop"
 
-#: builtin/pull.c:172
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "和获取相关的参数"
 
-#: builtin/pull.c:194
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "并发拉取的子模组的数量"
 
-#: builtin/pull.c:283
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "pull.ff 的取值无效:%s"
 
-#: builtin/pull.c:379 git-sh-setup.sh:226
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "无法通过变基方式拉取:您有未暂存的变更。"
-
-#: builtin/pull.c:385 git-sh-setup.sh:252
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "而且您的索引中包含未提交的变更。"
-
-#: builtin/pull.c:387 git-sh-setup.sh:245
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr "无法通过变基方式拉取:您的索引中包含未提交的变更。"
-
-#: builtin/pull.c:463
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
 msgstr "在您刚刚获取到的引用中没有变基操作的候选。"
 
-#: builtin/pull.c:465
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr "在您刚刚获取到的引用中没有合并操作的候选。"
 
-#: builtin/pull.c:466
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
 msgstr "通常这意味着您提供了一个通配符引用规格但未能和远端匹配。"
 
-#: builtin/pull.c:469
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9730,42 +11085,42 @@ msgstr ""
 "您要求从远程 '%s' 拉取,但是未指定一个分支。因为这不是当前\n"
 "分支默认的远程仓库,您必须在命令行中指定一个分支名。"
 
-#: builtin/pull.c:474 git-parse-remote.sh:73
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "您当前不在一个分支上。"
 
-#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
+#: builtin/pull.c:410 builtin/pull.c:425 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "请指定您要变基到哪一个分支。"
 
-#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
+#: builtin/pull.c:412 builtin/pull.c:427 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "请指定您要合并哪一个分支。"
 
-#: builtin/pull.c:479 builtin/pull.c:494
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "详见 git-pull(1)。"
 
-#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
 #: git-parse-remote.sh:64
 msgid "<remote>"
 msgstr "<远程>"
 
-#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:456
 #: git-parse-remote.sh:65
 msgid "<branch>"
 msgstr "<分支>"
 
-#: builtin/pull.c:489 git-parse-remote.sh:75
+#: builtin/pull.c:423 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "当前分支没有跟踪信息。"
 
-#: builtin/pull.c:498 git-parse-remote.sh:95
+#: builtin/pull.c:432 git-parse-remote.sh:95
 msgid ""
 "If you wish to set tracking information for this branch you can do so with:"
 msgstr "如果您想要为此分支创建跟踪信息,您可以执行:"
 
-#: builtin/pull.c:503
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9774,19 +11129,27 @@ msgstr ""
 "您的配置中指定要合并远程的引用 '%s',\n"
 "但是没有获取到这个引用。"
 
-#: builtin/pull.c:820
+#: builtin/pull.c:754
 msgid "ignoring --verify-signatures for rebase"
 msgstr "为变基操作忽略 --verify-signatures"
 
-#: builtin/pull.c:867
+#: builtin/pull.c:801
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash 选项只在使用 --rebase 时有效。"
 
-#: builtin/pull.c:875
+#: builtin/pull.c:809
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "更新尚未诞生的分支,变更添加至索引。"
 
-#: builtin/pull.c:903
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "变基式拉取"
+
+#: builtin/pull.c:813
+msgid "please commit or stash them."
+msgstr "请提交或为它们保存进度。"
+
+#: builtin/pull.c:838
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9796,7 +11159,7 @@ msgstr ""
 "fetch 更新了当前的分支。快进您的工作区\n"
 "至提交 %s。"
 
-#: builtin/pull.c:908
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9813,11 +11176,11 @@ msgstr ""
 "$ git reset --hard\n"
 "恢复之前的状态。"
 
-#: builtin/pull.c:923
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "无法将多个分支合并到空分支。"
 
-#: builtin/pull.c:927
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "无法变基到多个分支。"
 
@@ -9907,12 +11270,12 @@ msgstr ""
 "您正推送至远程 '%s'(其并非当前分支 '%s' 的上游),\n"
 "而没有告诉我要推送什么、更新哪个远程分支。"
 
-#: builtin/push.c:242
+#: builtin/push.c:245
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr "您没有为推送指定任何引用规格,并且 push.default 为 \"nothing\"。"
 
-#: builtin/push.c:249
+#: builtin/push.c:252
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -9923,7 +11286,7 @@ msgstr ""
 "再次推送前,先与远程变更合并(如 'git pull ...')。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:255
+#: builtin/push.c:258
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
@@ -9934,7 +11297,7 @@ msgstr ""
 "检出该分支并整合远程变更(如 'git pull ...'),然后再推送。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:261
+#: builtin/push.c:264
 msgid ""
 "Updates were rejected because the remote contains work that you do\n"
 "not have locally. This is usually caused by another repository pushing\n"
@@ -9947,11 +11310,11 @@ msgstr ""
 "(如 'git pull ...')。\n"
 "详见 'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:268
+#: builtin/push.c:271
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "更新被拒绝,因为该标签在远程已经存在。"
 
-#: builtin/push.c:271
+#: builtin/push.c:274
 msgid ""
 "You cannot update a remote ref that points at a non-commit object,\n"
 "or update a remote ref to make it point at a non-commit object,\n"
@@ -9960,22 +11323,22 @@ msgstr ""
 "如果不使用 '--force' 参数,您不能更新一个指向非提交对象的远程引用,\n"
 "也不能更新远程引用让其指向一个非提交对象。\n"
 
-#: builtin/push.c:331
+#: builtin/push.c:334
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "推送到 %s\n"
 
-#: builtin/push.c:335
+#: builtin/push.c:338
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "无法推送一些引用到 '%s'"
 
-#: builtin/push.c:366
+#: builtin/push.c:369
 #, c-format
 msgid "bad repository '%s'"
 msgstr "坏的仓库 '%s'"
 
-#: builtin/push.c:367
+#: builtin/push.c:370
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -9996,116 +11359,116 @@ msgstr ""
 "\n"
 "    git push <名称>\n"
 
-#: builtin/push.c:385
+#: builtin/push.c:388
 msgid "--all and --tags are incompatible"
 msgstr "--all 和 --tags 不兼容"
 
-#: builtin/push.c:386
+#: builtin/push.c:389
 msgid "--all can't be combined with refspecs"
 msgstr "--all 不能和引用规格同时使用"
 
-#: builtin/push.c:391
+#: builtin/push.c:394
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror 和 --tags 不兼容"
 
-#: builtin/push.c:392
+#: builtin/push.c:395
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror 不能和引用规格同时使用"
 
-#: builtin/push.c:397
+#: builtin/push.c:400
 msgid "--all and --mirror are incompatible"
 msgstr "--all 和 --mirror 不兼容"
 
-#: builtin/push.c:515
+#: builtin/push.c:518
 msgid "repository"
 msgstr "仓库"
 
-#: builtin/push.c:516 builtin/send-pack.c:161
+#: builtin/push.c:519 builtin/send-pack.c:162
 msgid "push all refs"
 msgstr "推送所有引用"
 
-#: builtin/push.c:517 builtin/send-pack.c:163
+#: builtin/push.c:520 builtin/send-pack.c:164
 msgid "mirror all refs"
 msgstr "镜像所有引用"
 
-#: builtin/push.c:519
+#: builtin/push.c:522
 msgid "delete refs"
 msgstr "删除引用"
 
-#: builtin/push.c:520
+#: builtin/push.c:523
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "推送标签(不能使用 --all or --mirror)"
 
-#: builtin/push.c:523 builtin/send-pack.c:164
+#: builtin/push.c:526 builtin/send-pack.c:165
 msgid "force updates"
 msgstr "强制更新"
 
-#: builtin/push.c:525 builtin/send-pack.c:175
+#: builtin/push.c:528 builtin/send-pack.c:179
 msgid "refname>:<expect"
 msgstr "引用名>:<期望值"
 
-#: builtin/push.c:526 builtin/send-pack.c:176
+#: builtin/push.c:529 builtin/send-pack.c:180
 msgid "require old value of ref to be at this value"
 msgstr "要求引用旧的取值为设定值"
 
-#: builtin/push.c:529
+#: builtin/push.c:532
 msgid "control recursive pushing of submodules"
 msgstr "控制子模组的递归推送"
 
-#: builtin/push.c:531 builtin/send-pack.c:169
+#: builtin/push.c:534 builtin/send-pack.c:173
 msgid "use thin pack"
 msgstr "使用精简打包"
 
-#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
+#: builtin/push.c:535 builtin/push.c:536 builtin/send-pack.c:159
+#: builtin/send-pack.c:160
 msgid "receive pack program"
 msgstr "接收包程序"
 
-#: builtin/push.c:534
+#: builtin/push.c:537
 msgid "set upstream for git pull/status"
 msgstr "设置 git pull/status 的上游"
 
-#: builtin/push.c:537
+#: builtin/push.c:540
 msgid "prune locally removed refs"
 msgstr "清除本地删除的引用"
 
-#: builtin/push.c:539
+#: builtin/push.c:542
 msgid "bypass pre-push hook"
 msgstr "绕过 pre-push 钩子"
 
-#: builtin/push.c:540
+#: builtin/push.c:543
 msgid "push missing but relevant tags"
 msgstr "推送缺失但有关的标签"
 
-#: builtin/push.c:543 builtin/send-pack.c:166
+#: builtin/push.c:546 builtin/send-pack.c:167
 msgid "GPG sign the push"
 msgstr "用 GPG 为推送签名"
 
-#: builtin/push.c:545 builtin/send-pack.c:170
+#: builtin/push.c:548 builtin/send-pack.c:174
 msgid "request atomic transaction on remote side"
 msgstr "需要远端支持原子事务"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:170
 msgid "server-specific"
 msgstr "server-specific"
 
-#: builtin/push.c:546
+#: builtin/push.c:549 builtin/send-pack.c:171
 msgid "option to transmit"
 msgstr "传输选项"
 
-#: builtin/push.c:560
+#: builtin/push.c:563
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete 与 --all、--mirror 及 --tags 不兼容"
 
-#: builtin/push.c:562
+#: builtin/push.c:565
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete 未接任何引用没有意义"
 
-#: builtin/push.c:579
+#: builtin/push.c:584
 msgid "push options must not have new line characters"
 msgstr "推送选项不能有换行符"
 
-#: builtin/read-tree.c:37
+#: builtin/read-tree.c:40
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -10115,79 +11478,136 @@ msgstr ""
 "u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<文件>] (--empty | <树对象1> [<树对象2> [<树对象3>]])"
 
-#: builtin/read-tree.c:110
+#: builtin/read-tree.c:130
 msgid "write resulting index to <file>"
 msgstr "将索引结果写入 <文件>"
 
-#: builtin/read-tree.c:113
+#: builtin/read-tree.c:133
 msgid "only empty the index"
 msgstr "只是清空索引"
 
-#: builtin/read-tree.c:115
+#: builtin/read-tree.c:135
 msgid "Merging"
 msgstr "合并"
 
-#: builtin/read-tree.c:117
+#: builtin/read-tree.c:137
 msgid "perform a merge in addition to a read"
 msgstr "读取之余再执行一个合并"
 
-#: builtin/read-tree.c:119
+#: builtin/read-tree.c:139
 msgid "3-way merge if no file level merging required"
 msgstr "如果没有文件级合并需要,执行三方合并"
 
-#: builtin/read-tree.c:121
+#: builtin/read-tree.c:141
 msgid "3-way merge in presence of adds and removes"
 msgstr "存在添加和删除时,也执行三方合并"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:143
 msgid "same as -m, but discard unmerged entries"
 msgstr "类似于 -m,但丢弃未合并的条目"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:144
 msgid "<subdirectory>/"
 msgstr "<子目录>/"
 
-#: builtin/read-tree.c:125
+#: builtin/read-tree.c:145
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "读取树对象到索引的 <子目录>/ 下"
 
-#: builtin/read-tree.c:128
+#: builtin/read-tree.c:148
 msgid "update working tree with merge result"
 msgstr "用合并的结果更新工作区"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:150
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:131
+#: builtin/read-tree.c:151
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "允许忽略文件中设定的文件可以被覆盖"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:154
 msgid "don't check the working tree after merging"
 msgstr "合并后不检查工作区"
 
-#: builtin/read-tree.c:135
+#: builtin/read-tree.c:155
 msgid "don't update the index or the work tree"
 msgstr "不更新索引区和工作区"
 
-#: builtin/read-tree.c:137
+#: builtin/read-tree.c:157
 msgid "skip applying sparse checkout filter"
 msgstr "跳过应用稀疏检出过滤器"
 
-#: builtin/read-tree.c:139
+#: builtin/read-tree.c:159
 msgid "debug unpack-trees"
 msgstr "调试 unpack-trees"
 
-#: builtin/receive-pack.c:25
+#: builtin/rebase--helper.c:7
+msgid "git rebase--helper [<options>]"
+msgstr "git rebase--helper [<选项>]"
+
+#: builtin/rebase--helper.c:19
+msgid "continue rebase"
+msgstr "继续变基"
+
+#: builtin/rebase--helper.c:21
+msgid "abort rebase"
+msgstr "中止变基"
+
+#: builtin/receive-pack.c:27
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <git-dir>"
 
-#: builtin/receive-pack.c:1843
+#: builtin/receive-pack.c:795
+msgid ""
+"By default, updating the current branch in a non-bare repository\n"
+"is denied, because it will make the index and work tree inconsistent\n"
+"with what you pushed, and will require 'git reset --hard' to match\n"
+"the work tree to HEAD.\n"
+"\n"
+"You can set the 'receive.denyCurrentBranch' configuration variable\n"
+"to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
+"its current branch; however, this is not recommended unless you\n"
+"arranged to update its work tree to match what you pushed in some\n"
+"other way.\n"
+"\n"
+"To squelch this message and still keep the default behaviour, set\n"
+"'receive.denyCurrentBranch' configuration variable to 'refuse'."
+msgstr ""
+"默认禁止更新非纯仓库的当前分支,因为您推送的内容将导致索引和工作区\n"
+"不一致,并且将需要执行 'git reset --hard' 将工作区匹配到 HEAD。\n"
+"\n"
+"您可以在远程仓库中设置 'receive.denyCurrentBranch' 配置变量为\n"
+"'ignore' 或 'warn' 以允许推送到当前分支。然而不推荐这么做,除非您\n"
+"用某种方式将其工作区更新至您推送的状态。\n"
+"\n"
+"若要屏蔽此信息且保持默认行为,设置 'receive.denyCurrentBranch'\n"
+"配置变量为 'refuse'。"
+
+#: builtin/receive-pack.c:815
+msgid ""
+"By default, deleting the current branch is denied, because the next\n"
+"'git clone' won't result in any file checked out, causing confusion.\n"
+"\n"
+"You can set 'receive.denyDeleteCurrent' configuration variable to\n"
+"'warn' or 'ignore' in the remote repository to allow deleting the\n"
+"current branch, with or without a warning message.\n"
+"\n"
+"To squelch this message, you can set it to 'refuse'."
+msgstr ""
+"默认禁止删除当前分支,因为下一次 'git clone' 将不会检出任何文件,\n"
+"导致困惑。\n"
+"\n"
+"您可以在远程仓库中设置 'receive.denyDeleteCurrent' 配置变量为\n"
+"'warn'(显示警告信息)或 'ignore'(忽略警告信息)以允许删除当前分支。\n"
+"\n"
+"若要屏蔽此信息,您可以设置它为 'refuse'。"
+
+#: builtin/receive-pack.c:1888
 msgid "quiet"
 msgstr "静默模式"
 
-#: builtin/receive-pack.c:1857
+#: builtin/receive-pack.c:1902
 msgid "You must specify a directory."
 msgstr "您必须指定一个目录。"
 
@@ -10364,7 +11784,7 @@ msgstr "(匹配)"
 msgid "(delete)"
 msgstr "(删除)"
 
-#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:856
 #, c-format
 msgid "No such remote: %s"
 msgstr "没有这样的远程:%s"
@@ -10395,7 +11815,7 @@ msgstr "删除 '%s' 失败"
 msgid "creating '%s' failed"
 msgstr "创建 '%s' 失败"
 
-#: builtin/remote.c:792
+#: builtin/remote.c:794
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -10405,144 +11825,144 @@ msgid_plural ""
 msgstr[0] "注意:ref/remotes 层级之外的一个分支未被移除。要删除它,使用:"
 msgstr[1] "注意:ref/remotes 层级之外的一些分支未被移除。要删除它们,使用:"
 
-#: builtin/remote.c:806
+#: builtin/remote.c:808
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "不能移除配置小节 '%s'"
 
-#: builtin/remote.c:907
+#: builtin/remote.c:909
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " 新的(下一次获取将存储于 remotes/%s)"
 
-#: builtin/remote.c:910
+#: builtin/remote.c:912
 msgid " tracked"
 msgstr " 已跟踪"
 
-#: builtin/remote.c:912
+#: builtin/remote.c:914
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " 过时(使用 'git remote prune' 来移除)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:916
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:955
+#: builtin/remote.c:957
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "无效的 branch.%s.merge,不能变基到一个以上的分支"
 
-#: builtin/remote.c:963
+#: builtin/remote.c:965
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "交互式变基到远程 %s"
 
-#: builtin/remote.c:964
+#: builtin/remote.c:966
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "变基到远程 %s"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:969
 #, c-format
 msgid " merges with remote %s"
 msgstr " 与远程 %s 合并"
 
-#: builtin/remote.c:970
+#: builtin/remote.c:972
 #, c-format
 msgid "merges with remote %s"
 msgstr "与远程 %s 合并"
 
-#: builtin/remote.c:973
+#: builtin/remote.c:975
 #, c-format
 msgid "%-*s    and with remote %s\n"
 msgstr "%-*s    以及和远程 %s\n"
 
-#: builtin/remote.c:1016
+#: builtin/remote.c:1018
 msgid "create"
 msgstr "创建"
 
-#: builtin/remote.c:1019
+#: builtin/remote.c:1021
 msgid "delete"
 msgstr "删除"
 
-#: builtin/remote.c:1023
+#: builtin/remote.c:1025
 msgid "up to date"
 msgstr "最新"
 
-#: builtin/remote.c:1026
+#: builtin/remote.c:1028
 msgid "fast-forwardable"
 msgstr "可快进"
 
-#: builtin/remote.c:1029
+#: builtin/remote.c:1031
 msgid "local out of date"
 msgstr "本地已过时"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1038
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s 强制推送至 %-*s (%s)"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s 推送至 %-*s (%s)"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1045
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s 强制推送至 %s"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s 推送至 %s"
 
-#: builtin/remote.c:1114
+#: builtin/remote.c:1116
 msgid "do not query remotes"
 msgstr "不查询远程"
 
-#: builtin/remote.c:1141
+#: builtin/remote.c:1143
 #, c-format
 msgid "* remote %s"
 msgstr "* 远程 %s"
 
-#: builtin/remote.c:1142
+#: builtin/remote.c:1144
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  获取地址:%s"
 
-#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296
+#: builtin/remote.c:1145 builtin/remote.c:1158 builtin/remote.c:1297
 msgid "(no URL)"
 msgstr "(无 URL)"
 
 #. TRANSLATORS: the colon ':' should align with
 #. the one in "  Fetch URL: %s" translation
-#: builtin/remote.c:1154 builtin/remote.c:1156
+#: builtin/remote.c:1156 builtin/remote.c:1158
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  推送地址:%s"
 
-#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#: builtin/remote.c:1160 builtin/remote.c:1162 builtin/remote.c:1164
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD 分支:%s"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/remote.c:1158
+#: builtin/remote.c:1160
 msgid "(not queried)"
 msgstr "(未查询)"
 
-#: builtin/remote.c:1160
+#: builtin/remote.c:1162
 msgid "(unknown)"
 msgstr "(未知)"
 
-#: builtin/remote.c:1164
+#: builtin/remote.c:1166
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  HEAD 分支(远程 HEAD 模糊,可能是下列中的一个):\n"
 
-#: builtin/remote.c:1176
+#: builtin/remote.c:1178
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
@@ -10550,235 +11970,248 @@ msgstr[0] "  远程分支:%s"
 msgstr[1] "  远程分支:%s"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/remote.c:1179 builtin/remote.c:1206
+#: builtin/remote.c:1181 builtin/remote.c:1207
 msgid " (status not queried)"
 msgstr "(状态未查询)"
 
-#: builtin/remote.c:1188
+#: builtin/remote.c:1190
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  为 'git pull' 配置的本地分支:"
 msgstr[1] "  为 'git pull' 配置的本地分支:"
 
-#: builtin/remote.c:1196
+#: builtin/remote.c:1198
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  本地引用将在 'git push' 时被镜像"
 
-#: builtin/remote.c:1203
+#: builtin/remote.c:1204
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  为 'git push' 配置的本地引用%s:"
 msgstr[1] "  为 'git push' 配置的本地引用%s:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1225
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "根据远程设置 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1226
+#: builtin/remote.c:1227
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "删除 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1241
+#: builtin/remote.c:1242
 msgid "Cannot determine remote HEAD"
 msgstr "无法确定远程 HEAD"
 
-#: builtin/remote.c:1243
+#: builtin/remote.c:1244
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "多个远程 HEAD 分支。请明确地选择一个用命令:"
 
-#: builtin/remote.c:1253
+#: builtin/remote.c:1254
 #, c-format
 msgid "Could not delete %s"
 msgstr "无法删除 %s"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1262
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "不是一个有效引用:%s"
 
-#: builtin/remote.c:1263
+#: builtin/remote.c:1264
 #, c-format
 msgid "Could not setup %s"
 msgstr "不能设置 %s"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1281
+#: builtin/remote.c:1282
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s 将成为摇摆状态!"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1282
+#: builtin/remote.c:1283
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s 已成为摇摆状态!"
 
-#: builtin/remote.c:1292
+#: builtin/remote.c:1293
 #, c-format
 msgid "Pruning %s"
 msgstr "修剪 %s"
 
-#: builtin/remote.c:1293
+#: builtin/remote.c:1294
 #, c-format
 msgid "URL: %s"
 msgstr "URL:%s"
 
-#: builtin/remote.c:1309
+#: builtin/remote.c:1310
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [将删除] %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1313
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [已删除] %s"
 
-#: builtin/remote.c:1357
+#: builtin/remote.c:1358
 msgid "prune remotes after fetching"
 msgstr "抓取后清除远程"
 
-#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542
+#: builtin/remote.c:1421 builtin/remote.c:1475 builtin/remote.c:1543
 #, c-format
 msgid "No such remote '%s'"
 msgstr "没有此远程 '%s'"
 
-#: builtin/remote.c:1436
+#: builtin/remote.c:1437
 msgid "add branch"
 msgstr "添加分支"
 
-#: builtin/remote.c:1443
+#: builtin/remote.c:1444
 msgid "no remote specified"
 msgstr "未指定远程"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1461
 msgid "query push URLs rather than fetch URLs"
 msgstr "查询推送 URL 地址,而非获取 URL 地址"
 
-#: builtin/remote.c:1462
+#: builtin/remote.c:1463
 msgid "return all URLs"
 msgstr "返回所有 URL 地址"
 
-#: builtin/remote.c:1490
+#: builtin/remote.c:1491
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "没有给远程仓库 '%s' 设定 URL"
 
-#: builtin/remote.c:1516
+#: builtin/remote.c:1517
 msgid "manipulate push URLs"
 msgstr "操作推送 URLS"
 
-#: builtin/remote.c:1518
+#: builtin/remote.c:1519
 msgid "add URL"
 msgstr "添加 URL"
 
-#: builtin/remote.c:1520
+#: builtin/remote.c:1521
 msgid "delete URLs"
 msgstr "删除 URLS"
 
-#: builtin/remote.c:1527
+#: builtin/remote.c:1528
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete 无意义"
 
-#: builtin/remote.c:1568
+#: builtin/remote.c:1569
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "无效的旧 URL 匹配模版:%s"
 
-#: builtin/remote.c:1576
+#: builtin/remote.c:1577
 #, c-format
 msgid "No such URL found: %s"
 msgstr "未找到此 URL:%s"
 
-#: builtin/remote.c:1578
+#: builtin/remote.c:1579
 msgid "Will not delete all non-push URLs"
 msgstr "将不会删除所有非推送 URL 地址"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1593
 msgid "be verbose; must be placed before a subcommand"
 msgstr "冗长输出;必须置于子命令之前"
 
+#: builtin/remote.c:1624
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "未知子命令:%s"
+
 #: builtin/repack.c:17
 msgid "git repack [<options>]"
 msgstr "git repack [<选项>]"
 
-#: builtin/repack.c:160
+#: builtin/repack.c:22
+msgid ""
+"Incremental repacks are incompatible with bitmap indexes.  Use\n"
+"--no-write-bitmap-index or disable the pack.writebitmaps configuration."
+msgstr ""
+"增量 repack 和 bitmap 索引不兼容。  使用 --no-write-bitmap-index\n"
+"或禁用 pack.writebitmaps 配置。"
+
+#: builtin/repack.c:166
 msgid "pack everything in a single pack"
 msgstr "所有内容打包到一个包文件中"
 
-#: builtin/repack.c:162
+#: builtin/repack.c:168
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "和 -a 相同,并将不可达的对象设为松散对象"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:171
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "删除多余的包,运行 git-prune-packed"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:173
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --no-reuse-delta"
 
-#: builtin/repack.c:169
+#: builtin/repack.c:175
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --no-reuse-object"
 
-#: builtin/repack.c:171
+#: builtin/repack.c:177
 msgid "do not run git-update-server-info"
 msgstr "不运行 git-update-server-info"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:180
 msgid "pass --local to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --local"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:182
 msgid "write bitmap index"
 msgstr "写 bitmap 索引"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:183
 msgid "approxidate"
 msgstr "近似日期"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:184
 msgid "with -A, do not loosen objects older than this"
 msgstr "使用 -A,不要将早于给定时间的对象过期"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:186
 msgid "with -a, repack unreachable objects"
 msgstr "使用 -a ,重新对不可达对象打包"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:188
 msgid "size of the window used for delta compression"
 msgstr "用于增量压缩的窗口值"
 
-#: builtin/repack.c:183 builtin/repack.c:187
+#: builtin/repack.c:189 builtin/repack.c:193
 msgid "bytes"
 msgstr "字节"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:190
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "和上面的相似,但限制内存大小而非条目数"
 
-#: builtin/repack.c:186
+#: builtin/repack.c:192
 msgid "limits the maximum delta depth"
 msgstr "限制最大增量深度"
 
-#: builtin/repack.c:188
+#: builtin/repack.c:194
 msgid "maximum size of each packfile"
 msgstr "每个包文件的最大尺寸"
 
-#: builtin/repack.c:190
+#: builtin/repack.c:196
 msgid "repack objects in packs marked with .keep"
 msgstr "对标记为 .keep 的包中的对象重新打包"
 
-#: builtin/repack.c:200
+#: builtin/repack.c:206
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "不能删除珍品仓库中的打包文件"
 
-#: builtin/repack.c:204
+#: builtin/repack.c:210
 msgid "--keep-unreachable and -A are incompatible"
 msgstr "--keep-unreachable 和 -A 不兼容"
 
-#: builtin/repack.c:391 builtin/worktree.c:115
+#: builtin/repack.c:400 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "无法删除 '%s'"
@@ -10803,67 +12236,67 @@ msgstr "git replace -d <对象>..."
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<格式>] [-l [<模式>]]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/replace.c:330 builtin/replace.c:368 builtin/replace.c:396
 #, c-format
 msgid "Not a valid object name: '%s'"
 msgstr "不是一个有效的对象名:'%s'"
 
-#: builtin/replace.c:355
+#: builtin/replace.c:360
 #, c-format
 msgid "bad mergetag in commit '%s'"
 msgstr "提交 '%s' 中含有损坏的合并标签"
 
-#: builtin/replace.c:357
+#: builtin/replace.c:362
 #, c-format
 msgid "malformed mergetag in commit '%s'"
 msgstr "提交 '%s' 中含有非法的合并标签"
 
-#: builtin/replace.c:368
+#: builtin/replace.c:373
 #, c-format
 msgid ""
 "original commit '%s' contains mergetag '%s' that is discarded; use --edit "
 "instead of --graft"
 msgstr "原始提交 '%s' 包含已经丢弃的合并标签 '%s',使用 --edit 代替 --graft"
 
-#: builtin/replace.c:401
+#: builtin/replace.c:406
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
 msgstr "原始提交 '%s' 中包含一个 GPG 签名"
 
-#: builtin/replace.c:402
+#: builtin/replace.c:407
 msgid "the signature will be removed in the replacement commit!"
 msgstr "在替换的提交中签名将被移除!"
 
-#: builtin/replace.c:408
+#: builtin/replace.c:413
 #, c-format
 msgid "could not write replacement commit for: '%s'"
 msgstr "不能为 '%s' 写替换提交"
 
-#: builtin/replace.c:432
+#: builtin/replace.c:437
 msgid "list replace refs"
 msgstr "列出替换的引用"
 
-#: builtin/replace.c:433
+#: builtin/replace.c:438
 msgid "delete replace refs"
 msgstr "删除替换的引用"
 
-#: builtin/replace.c:434
+#: builtin/replace.c:439
 msgid "edit existing object"
 msgstr "编辑现存的对象"
 
-#: builtin/replace.c:435
+#: builtin/replace.c:440
 msgid "change a commit's parents"
 msgstr "修改一个提交的父提交"
 
-#: builtin/replace.c:436
+#: builtin/replace.c:441
 msgid "replace the ref if it exists"
 msgstr "如果存在则替换引用"
 
-#: builtin/replace.c:437
+#: builtin/replace.c:442
 msgid "do not pretty-print contents for --edit"
 msgstr "不要为 --edit 操作美观显示内容"
 
-#: builtin/replace.c:438
+#: builtin/replace.c:443
 msgid "use this format"
 msgstr "使用此格式"
 
@@ -10881,8 +12314,8 @@ msgid ""
 msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<提交>]"
 
 #: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <树或提交> [--] <路径>..."
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<树或提交>] [--] <路径>..."
 
 #: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
@@ -11003,27 +12436,27 @@ msgstr "不能重置索引文件至版本 '%s'。"
 msgid "Could not write new index file."
 msgstr "不能写入新的索引文件。"
 
-#: builtin/rev-list.c:362
+#: builtin/rev-list.c:354
 msgid "rev-list does not support display of notes"
 msgstr "rev-list 不支持显示注解"
 
-#: builtin/rev-parse.c:358
+#: builtin/rev-parse.c:393
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<选项>] -- [<参数>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:398
 msgid "keep the `--` passed as an arg"
 msgstr "保持 `--` 作为一个参数传递"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:400
 msgid "stop parsing after the first non-option argument"
 msgstr "遇到第一个非选项参数后停止解析"
 
-#: builtin/rev-parse.c:368
+#: builtin/rev-parse.c:403
 msgid "output in stuck long form"
 msgstr "以固定长格式输出"
 
-#: builtin/rev-parse.c:499
+#: builtin/rev-parse.c:534
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -11053,68 +12486,72 @@ msgstr "git cherry-pick [<选项>] <提交号>..."
 msgid "git cherry-pick <subcommand>"
 msgstr "git cherry-pick <子命令>"
 
-#: builtin/revert.c:71
+#: builtin/revert.c:89
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s:%s 不能和 %s 同时使用"
 
-#: builtin/revert.c:80
+#: builtin/revert.c:98
 msgid "end revert or cherry-pick sequence"
 msgstr "终止反转或拣选操作"
 
-#: builtin/revert.c:81
+#: builtin/revert.c:99
 msgid "resume revert or cherry-pick sequence"
 msgstr "继续反转或拣选操作"
 
-#: builtin/revert.c:82
+#: builtin/revert.c:100
 msgid "cancel revert or cherry-pick sequence"
 msgstr "取消反转或拣选操作"
 
-#: builtin/revert.c:83
+#: builtin/revert.c:101
 msgid "don't automatically commit"
 msgstr "不要自动提交"
 
-#: builtin/revert.c:84
+#: builtin/revert.c:102
 msgid "edit the commit message"
 msgstr "编辑提交说明"
 
-#: builtin/revert.c:87
-msgid "parent number"
+#: builtin/revert.c:105
+msgid "parent-number"
 msgstr "父编号"
 
-#: builtin/revert.c:89
+#: builtin/revert.c:106
+msgid "select mainline parent"
+msgstr "选择主干父提交编号"
+
+#: builtin/revert.c:108
 msgid "merge strategy"
 msgstr "合并策略"
 
-#: builtin/revert.c:90
+#: builtin/revert.c:109
 msgid "option"
 msgstr "选项"
 
-#: builtin/revert.c:91
+#: builtin/revert.c:110
 msgid "option for merge strategy"
 msgstr "合并策略的选项"
 
-#: builtin/revert.c:100
+#: builtin/revert.c:119
 msgid "append commit name"
 msgstr "追加提交名称"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:121
 msgid "preserve initially empty commits"
 msgstr "保留初始化的空提交"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:122
 msgid "allow commits with empty messages"
 msgstr "允许提交说明为空"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:123
 msgid "keep redundant, empty commits"
 msgstr "保持多余的、空的提交"
 
-#: builtin/revert.c:192
+#: builtin/revert.c:211
 msgid "revert failed"
 msgstr "还原失败"
 
-#: builtin/revert.c:207
+#: builtin/revert.c:224
 msgid "cherry-pick failed"
 msgstr "拣选失败"
 
@@ -11122,25 +12559,7 @@ msgstr "拣选失败"
 msgid "git rm [<options>] [--] <file>..."
 msgstr "git rm [<选项>] [--] <文件>..."
 
-#: builtin/rm.c:65
-msgid ""
-"the following submodule (or one of its nested submodules)\n"
-"uses a .git directory:"
-msgid_plural ""
-"the following submodules (or one of their nested submodules)\n"
-"use a .git directory:"
-msgstr[0] "以下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
-msgstr[1] "以下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
-
-#: builtin/rm.c:71
-msgid ""
-"\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"\n"
-"(使用 'rm -rf' 命令如果您真的想删除它及其全部历史)"
-
-#: builtin/rm.c:230
+#: builtin/rm.c:205
 msgid ""
 "the following file has staged content different from both the\n"
 "file and the HEAD:"
@@ -11150,7 +12569,7 @@ msgid_plural ""
 msgstr[0] "如下文件其暂存的内容和工作区及 HEAD 中的都不一样:"
 msgstr[1] "如下文件其暂存的内容和工作区及 HEAD 中的都不一样:"
 
-#: builtin/rm.c:235
+#: builtin/rm.c:210
 msgid ""
 "\n"
 "(use -f to force removal)"
@@ -11158,13 +12577,13 @@ msgstr ""
 "\n"
 "(使用 -f 强制删除)"
 
-#: builtin/rm.c:239
+#: builtin/rm.c:214
 msgid "the following file has changes staged in the index:"
 msgid_plural "the following files have changes staged in the index:"
 msgstr[0] "下列文件索引中有变更"
 msgstr[1] "下列文件索引中有变更"
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: builtin/rm.c:218 builtin/rm.c:227
 msgid ""
 "\n"
 "(use --cached to keep the file, or -f to force removal)"
@@ -11172,42 +12591,47 @@ msgstr ""
 "\n"
 "(使用 --cached 保留本地文件,或用 -f 强制删除)"
 
-#: builtin/rm.c:251
+#: builtin/rm.c:224
 msgid "the following file has local modifications:"
 msgid_plural "the following files have local modifications:"
 msgstr[0] "如下文件有本地修改:"
 msgstr[1] "如下文件有本地修改:"
 
-#: builtin/rm.c:269
+#: builtin/rm.c:242
 msgid "do not list removed files"
 msgstr "不列出删除的文件"
 
-#: builtin/rm.c:270
+#: builtin/rm.c:243
 msgid "only remove from the index"
 msgstr "只从索引区删除"
 
-#: builtin/rm.c:271
+#: builtin/rm.c:244
 msgid "override the up-to-date check"
 msgstr "忽略文件更新状态检查"
 
-#: builtin/rm.c:272
+#: builtin/rm.c:245
 msgid "allow recursive removal"
 msgstr "允许递归删除"
 
-#: builtin/rm.c:274
+#: builtin/rm.c:247
 msgid "exit with a zero status even if nothing matched"
 msgstr "即使没有匹配,也以零状态退出"
 
-#: builtin/rm.c:335
+#: builtin/rm.c:308
 #, c-format
 msgid "not removing '%s' recursively without -r"
 msgstr "未提供 -r 选项不会递归删除 '%s'"
 
-#: builtin/rm.c:374
+#: builtin/rm.c:347
 #, c-format
 msgid "git rm: unable to remove %s"
 msgstr "git rm:不能删除 %s"
 
+#: builtin/rm.c:370
+#, c-format
+msgid "could not remove '%s'"
+msgstr "无法删除 '%s'"
+
 #: builtin/send-pack.c:18
 msgid ""
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
@@ -11219,19 +12643,19 @@ msgstr ""
 "receive-pack>] [--verbose] [--thin] [--atomic] [<主机>:]<目录> [<引用>...]\n"
 "  --all 和明确的 <引用> 互斥。"
 
-#: builtin/send-pack.c:160
+#: builtin/send-pack.c:161
 msgid "remote name"
 msgstr "远程名称"
 
-#: builtin/send-pack.c:171
+#: builtin/send-pack.c:175
 msgid "use stateless RPC protocol"
 msgstr "使用无状态的 RPC 协议"
 
-#: builtin/send-pack.c:172
+#: builtin/send-pack.c:176
 msgid "read refs from stdin"
 msgstr "从标准输入读取引用"
 
-#: builtin/send-pack.c:173
+#: builtin/send-pack.c:177
 msgid "print status from remote helper"
 msgstr "打印来自远程 helper 的状态"
 
@@ -11239,23 +12663,27 @@ msgstr "打印来自远程 helper 的状态"
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [<选项>] [<版本范围>] [[--] [<路径>...]]"
 
-#: builtin/shortlog.c:242
+#: builtin/shortlog.c:248
+msgid "Group by committer rather than author"
+msgstr "按照提交者分组而不是作者"
+
+#: builtin/shortlog.c:250
 msgid "sort output according to the number of commits per author"
 msgstr "根据每个作者的提交数量排序"
 
-#: builtin/shortlog.c:244
+#: builtin/shortlog.c:252
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr "隐藏提交说明,只提供提交数量"
 
-#: builtin/shortlog.c:246
+#: builtin/shortlog.c:254
 msgid "Show the email address of each author"
 msgstr "显示每个作者的电子邮件地址"
 
-#: builtin/shortlog.c:247
+#: builtin/shortlog.c:255
 msgid "w[,i1[,i2]]"
 msgstr "w[,i1[,i2]]"
 
-#: builtin/shortlog.c:248
+#: builtin/shortlog.c:256
 msgid "Linewrap output"
 msgstr "折行输出"
 
@@ -11275,70 +12703,124 @@ msgstr ""
 msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
 msgstr "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<引用>]"
 
-#: builtin/show-branch.c:640
+#: builtin/show-branch.c:374
+#, c-format
+msgid "ignoring %s; cannot handle more than %d ref"
+msgid_plural "ignoring %s; cannot handle more than %d refs"
+msgstr[0] "忽略 %s,无法处理 %d 个以上的引用"
+msgstr[1] "忽略 %s,无法处理 %d 个以上的引用"
+
+#: builtin/show-branch.c:536
+#, c-format
+msgid "no matching refs with %s"
+msgstr "没有和 %s 匹配的引用"
+
+#: builtin/show-branch.c:632
 msgid "show remote-tracking and local branches"
 msgstr "显示远程跟踪的和本地的分支"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:634
 msgid "show remote-tracking branches"
 msgstr "显示远程跟踪的分支"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:636
 msgid "color '*!+-' corresponding to the branch"
 msgstr "着色 '*!+-' 到相应的分支"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:638
 msgid "show <n> more commits after the common ancestor"
 msgstr "显示共同祖先后的 <n> 个提交"
 
-#: builtin/show-branch.c:648
+#: builtin/show-branch.c:640
 msgid "synonym to more=-1"
 msgstr "和 more=-1 同义"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:641
 msgid "suppress naming strings"
 msgstr "不显示字符串命名"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:643
 msgid "include the current branch"
 msgstr "包括当前分支"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:645
 msgid "name commits with their object names"
 msgstr "以对象名字命名提交"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:647
 msgid "show possible merge bases"
 msgstr "显示可能合并的基线"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:649
 msgid "show refs unreachable from any other ref"
 msgstr "显示没有任何引用的的引用"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:651
 msgid "show commits in topological order"
 msgstr "以拓扑顺序显示提交"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:654
 msgid "show only commits not on the first branch"
 msgstr "只显示不在第一个分支上的提交"
 
-#: builtin/show-branch.c:664
+#: builtin/show-branch.c:656
 msgid "show merges reachable from only one tip"
 msgstr "显示仅一个分支可访问的合并提交"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:658
 msgid "topologically sort, maintaining date order where possible"
 msgstr "拓扑方式排序,并尽可能地保持日期顺序"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:661
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:662
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "显示从 base 开始的 <n> 条最近的引用日志记录"
 
+#: builtin/show-branch.c:696
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr "--reflog 和 --all、--remotes、--independent 或 --merge-base 不兼容"
+
+#: builtin/show-branch.c:720
+msgid "no branches given, and HEAD is not valid"
+msgstr "未提供分支,且 HEAD 无效"
+
+#: builtin/show-branch.c:723
+msgid "--reflog option needs one branch name"
+msgstr "选项 --reflog 需要一个分支名"
+
+#: builtin/show-branch.c:726
+#, c-format
+msgid "only %d entry can be shown at one time."
+msgid_plural "only %d entries can be shown at one time."
+msgstr[0] "一次只能显示 %d 个条目。"
+msgstr[1] "一次只能显示 %d 个条目。"
+
+#: builtin/show-branch.c:730
+#, c-format
+msgid "no such ref %s"
+msgstr "无此引用 %s"
+
+#: builtin/show-branch.c:814
+#, c-format
+msgid "cannot handle more than %d rev."
+msgid_plural "cannot handle more than %d revs."
+msgstr[0] "不能处理 %d 个以上的版本。"
+msgstr[1] "不能处理 %d 个以上的版本。"
+
+#: builtin/show-branch.c:818
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' 不是一个有效的引用。"
+
+#: builtin/show-branch.c:821
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "不能找到提交 %s(%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -11351,35 +12833,35 @@ msgstr ""
 msgid "git show-ref --exclude-existing[=<pattern>]"
 msgstr "git show-ref --exclude-existing[=<模式>]"
 
-#: builtin/show-ref.c:165
+#: builtin/show-ref.c:159
 msgid "only show tags (can be combined with heads)"
 msgstr "只显示标签(可以和头共用)"
 
-#: builtin/show-ref.c:166
+#: builtin/show-ref.c:160
 msgid "only show heads (can be combined with tags)"
 msgstr "只显示头(可以和标签共用)"
 
-#: builtin/show-ref.c:167
+#: builtin/show-ref.c:161
 msgid "stricter reference checking, requires exact ref path"
 msgstr "更严格的引用检测,需要精确的引用路径"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
+#: builtin/show-ref.c:164 builtin/show-ref.c:166
 msgid "show the HEAD reference, even if it would be filtered out"
 msgstr "显示 HEAD 引用,即使被过滤掉"
 
-#: builtin/show-ref.c:174
+#: builtin/show-ref.c:168
 msgid "dereference tags into object IDs"
 msgstr "转换标签到对象 ID"
 
-#: builtin/show-ref.c:176
+#: builtin/show-ref.c:170
 msgid "only show SHA1 hash using <n> digits"
 msgstr "只显示使用 <n> 个数字的 SHA1 哈希"
 
-#: builtin/show-ref.c:180
+#: builtin/show-ref.c:174
 msgid "do not print results to stdout (useful with --verify)"
 msgstr "不打印结果到标准输出(例如与 --verify 参数共用)"
 
-#: builtin/show-ref.c:182
+#: builtin/show-ref.c:176
 msgid "show refs from stdin that aren't in local repository"
 msgstr "显示从标准输入中读入的不在本地仓库中的引用"
 
@@ -11399,12 +12881,12 @@ msgstr "跳过和移除所有的注释行"
 msgid "prepend comment character and space to each line"
 msgstr "为每一行的行首添加注释符和空格"
 
-#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1075
 #, c-format
 msgid "No such ref: %s"
 msgstr "没有这样的引用:%s"
 
-#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1084
 #, c-format
 msgid "Expecting a full ref name, got %s"
 msgstr "期望一个完整的引用名称,却得到 %s"
@@ -11414,75 +12896,100 @@ msgstr "期望一个完整的引用名称,却得到 %s"
 msgid "cannot strip one component off url '%s'"
 msgstr "无法从 url '%s' 剥离一个组件"
 
-#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403
-#: builtin/submodule--helper.c:483
+#: builtin/submodule--helper.c:305 builtin/submodule--helper.c:630
 msgid "alternative anchor for relative paths"
 msgstr "相对路径的替代锚记(anchor)"
 
-#: builtin/submodule--helper.c:283
+#: builtin/submodule--helper.c:310
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<路径>] [<路径>...]"
 
-#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338
+#: builtin/submodule--helper.c:356 builtin/submodule--helper.c:380
 #, c-format
 msgid "No url found for submodule path '%s' in .gitmodules"
 msgstr "在 .gitmodules 中未找到子模组 '%s' 的 url"
 
-#: builtin/submodule--helper.c:364
+#: builtin/submodule--helper.c:395
+#, c-format
+msgid ""
+"could not lookup configuration '%s'. Assuming this repository is its own "
+"authoritative upstream."
+msgstr "无法找到配置 '%s'。假定这个仓库是其自身的官方上游。"
+
+#: builtin/submodule--helper.c:406
 #, c-format
 msgid "Failed to register url for submodule path '%s'"
 msgstr "无法为子模组 '%s' 注册 url"
 
-#: builtin/submodule--helper.c:368
+#: builtin/submodule--helper.c:410
 #, c-format
 msgid "Submodule '%s' (%s) registered for path '%s'\n"
 msgstr "子模组 '%s'(%s)未对路径 '%s' 注册\n"
 
 #
-#: builtin/submodule--helper.c:378
+#: builtin/submodule--helper.c:420
 #, c-format
 msgid "warning: command update mode suggested for submodule '%s'\n"
 msgstr "警告:建议子模组 '%s' 使用命令更新模式\n"
 
-#: builtin/submodule--helper.c:385
+#: builtin/submodule--helper.c:427
 #, c-format
 msgid "Failed to register update mode for submodule path '%s'"
 msgstr "无法为子模组 '%s' 注册更新模式"
 
-#: builtin/submodule--helper.c:404
+#: builtin/submodule--helper.c:443
 msgid "Suppress output for initializing a submodule"
 msgstr "初始化子模组时抑制输出"
 
-#: builtin/submodule--helper.c:409
+#: builtin/submodule--helper.c:448
 msgid "git submodule--helper init [<path>]"
 msgstr "git submodule--helper init [<路径>]"
 
-#: builtin/submodule--helper.c:430
+#: builtin/submodule--helper.c:476
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <路径>"
 
-#: builtin/submodule--helper.c:436
+#: builtin/submodule--helper.c:482
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "在 .gitmodules 中没有发现路径 '%s' 的子模组映射"
 
-#: builtin/submodule--helper.c:486
+#: builtin/submodule--helper.c:565 builtin/submodule--helper.c:568
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "子模组 '%s' 不能添加仓库备选:%s"
+
+#: builtin/submodule--helper.c:604
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "不能识别 submodule.alternateErrorStrategy 的取值 '%s'"
+
+#: builtin/submodule--helper.c:611
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "不能识别 submodule.alternateLocaion 的取值 '%s'"
+
+#: builtin/submodule--helper.c:633
 msgid "where the new submodule will be cloned to"
 msgstr "新的子模组将要克隆的路径"
 
-#: builtin/submodule--helper.c:489
+#: builtin/submodule--helper.c:636
 msgid "name of the new submodule"
 msgstr "新子模组的名称"
 
-#: builtin/submodule--helper.c:492
+#: builtin/submodule--helper.c:639
 msgid "url where to clone the submodule from"
 msgstr "克隆子模组的 url 地址"
 
-#: builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:645
 msgid "depth for shallow clones"
 msgstr "浅克隆的深度"
 
-#: builtin/submodule--helper.c:504
+#: builtin/submodule--helper.c:648 builtin/submodule--helper.c:993
+msgid "force cloning progress"
+msgstr "强制显示克隆进度"
+
+#: builtin/submodule--helper.c:653
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
 "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
@@ -11490,108 +12997,106 @@ msgstr ""
 "git submodule--helper clone [--prefix=<路径>] [--quiet] [--reference <仓库>] "
 "[--name <名字>] [--depth <深度>] --url <url> --path <路径>"
 
-#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "不能创建目录 '%s'"
-
-#: builtin/submodule--helper.c:531
+#: builtin/submodule--helper.c:684
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "无法克隆 '%s' 到子模组路径 '%s'"
 
-#: builtin/submodule--helper.c:547
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "无法打开文件 '%s'"
-
-#: builtin/submodule--helper.c:552
-#, c-format
-msgid "could not close file %s"
-msgstr "无法关闭文件 %s"
-
-#: builtin/submodule--helper.c:559
+#: builtin/submodule--helper.c:699
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "无法得到 '%s' 的子模组目录"
 
-#: builtin/submodule--helper.c:611
+#: builtin/submodule--helper.c:764
 #, c-format
 msgid "Submodule path '%s' not initialized"
 msgstr "子模组 '%s' 尚未初始化"
 
-#: builtin/submodule--helper.c:615
+#: builtin/submodule--helper.c:768
 msgid "Maybe you want to use 'update --init'?"
 msgstr "也许您想要执行 'update --init'?"
 
-#: builtin/submodule--helper.c:641
+#: builtin/submodule--helper.c:793
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "略过未合并的子模组 %s"
 
-#: builtin/submodule--helper.c:662
+#: builtin/submodule--helper.c:814
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "略过子模组 '%s'"
 
-#: builtin/submodule--helper.c:792
+#: builtin/submodule--helper.c:942
 #, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
 msgstr "克隆 '%s' 失败。按计划重试"
 
-#: builtin/submodule--helper.c:803
+#: builtin/submodule--helper.c:953
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
 msgstr "第二次尝试克隆 '%s' 失败,退出"
 
-#: builtin/submodule--helper.c:824
+#: builtin/submodule--helper.c:974 builtin/submodule--helper.c:1162
 msgid "path into the working tree"
 msgstr "到工作区的路径"
 
-#: builtin/submodule--helper.c:827
+#: builtin/submodule--helper.c:977
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr "工作区中的路径,递归嵌套子模组"
 
-#: builtin/submodule--helper.c:831
+#: builtin/submodule--helper.c:981
 msgid "rebase, merge, checkout or none"
 msgstr "rebase、merge、checkout 或 none"
 
-#: builtin/submodule--helper.c:835
+#: builtin/submodule--helper.c:985
 msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr "创建一个指定深度的浅克隆"
 
-#: builtin/submodule--helper.c:838
+#: builtin/submodule--helper.c:988
 msgid "parallel jobs"
 msgstr "并发任务"
 
-#: builtin/submodule--helper.c:840
+#: builtin/submodule--helper.c:990
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr "初始克隆是否应该遵守推荐的浅克隆选项"
 
-#: builtin/submodule--helper.c:841
+#: builtin/submodule--helper.c:991
 msgid "don't print cloning progress"
 msgstr "不要输出克隆进度"
 
-#: builtin/submodule--helper.c:846
+#: builtin/submodule--helper.c:998
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<路径>] [<路径>...]"
 
-#: builtin/submodule--helper.c:856
+#: builtin/submodule--helper.c:1008
 msgid "bad value for update parameter"
 msgstr "update 参数取值错误"
 
-#: builtin/submodule--helper.c:927
+#: builtin/submodule--helper.c:1079
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
 "the superproject is not on any branch"
 msgstr "子模组(%s)的分支配置为继承上级项目的分支,但是上级项目不在任何分支上"
 
-#: builtin/submodule--helper.c:977
+#: builtin/submodule--helper.c:1163
+msgid "recurse into submodules"
+msgstr "在子模组中递归"
+
+#: builtin/submodule--helper.c:1169
+msgid "git submodule--helper embed-git-dir [<path>...]"
+msgstr "git submodule--helper embed-git-dir [<路径>...]"
+
+#: builtin/submodule--helper.c:1226
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "submodule-helper 子命令必须由另外的子命令调用"
 
-#: builtin/submodule--helper.c:984
+#: builtin/submodule--helper.c:1233
+#, c-format
+msgid "%s doesn't support --super-prefix"
+msgstr "%s 不支持 --super-prefix"
+
+#: builtin/submodule--helper.c:1239
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' 不是一个有效的 submodule--helper 子命令"
@@ -11637,32 +13142,29 @@ msgstr "git tag -d <标签名>..."
 
 #: builtin/tag.c:25
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--"
+"points-at <object>]\n"
 "\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
 msgstr ""
-"git tag -l [-n[<数字>]] [--contains <提交>] [--points-at <对象>]\n"
+"git tag -l [-n[<数字>]] [--contains <提交>] [--no-contains <提交>] [--points-"
+"at <对象>]\n"
 "\t\t[--format=<格式>] [--[no-]merged [<提交>]] [<模式>...]"
 
 #: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <标签名>..."
+msgid "git tag -v [--format=<format>] <tagname>..."
+msgstr "git tag -v [--format=<格式>] <标签名>..."
 
-#: builtin/tag.c:81
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "标签名称太长:%.*s..."
-
-#: builtin/tag.c:86
+#: builtin/tag.c:83
 #, c-format
 msgid "tag '%s' not found."
 msgstr "未发现标签 '%s'。"
 
-#: builtin/tag.c:101
+#: builtin/tag.c:99
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "已删除标签 '%s'(曾为 %s)\n"
 
-#: builtin/tag.c:117
+#: builtin/tag.c:128
 #, c-format
 msgid ""
 "\n"
@@ -11675,7 +13177,7 @@ msgstr ""
 "  %s\n"
 "以 '%c' 开头的行将被忽略。\n"
 
-#: builtin/tag.c:121
+#: builtin/tag.c:132
 #, c-format
 msgid ""
 "\n"
@@ -11689,143 +13191,147 @@ msgstr ""
 "  %s\n"
 "以 '%c' 开头的行将被保留,如果您愿意也可以删除它们。\n"
 
-#: builtin/tag.c:199
+#: builtin/tag.c:210
 msgid "unable to sign the tag"
 msgstr "无法签署标签"
 
-#: builtin/tag.c:201
+#: builtin/tag.c:212
 msgid "unable to write tag file"
 msgstr "无法写标签文件"
 
-#: builtin/tag.c:226
+#: builtin/tag.c:236
 msgid "bad object type."
 msgstr "坏的对象类型。"
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "标签头信息太大。"
-
-#: builtin/tag.c:275
+#: builtin/tag.c:282
 msgid "no tag message?"
 msgstr "无标签说明?"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:289
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "标签说明被保留在 %s\n"
 
-#: builtin/tag.c:339
+#: builtin/tag.c:397
 msgid "list tag names"
 msgstr "列出标签名称"
 
-#: builtin/tag.c:341
+#: builtin/tag.c:399
 msgid "print <n> lines of each tag message"
 msgstr "每个标签信息打印 <n> 行"
 
-#: builtin/tag.c:343
+#: builtin/tag.c:401
 msgid "delete tags"
 msgstr "删除标签"
 
-#: builtin/tag.c:344
+#: builtin/tag.c:402
 msgid "verify tags"
 msgstr "验证标签"
 
-#: builtin/tag.c:346
+#: builtin/tag.c:404
 msgid "Tag creation options"
 msgstr "标签创建选项"
 
-#: builtin/tag.c:348
+#: builtin/tag.c:406
 msgid "annotated tag, needs a message"
 msgstr "附注标签,需要一个说明"
 
-#: builtin/tag.c:350
+#: builtin/tag.c:408
 msgid "tag message"
 msgstr "标签说明"
 
-#: builtin/tag.c:352
+#: builtin/tag.c:410
 msgid "annotated and GPG-signed tag"
 msgstr "附注并附加 GPG 签名的标签"
 
-#: builtin/tag.c:356
+#: builtin/tag.c:414
 msgid "use another key to sign the tag"
 msgstr "使用另外的私钥签名该标签"
 
-#: builtin/tag.c:357
+#: builtin/tag.c:415
 msgid "replace the tag if exists"
 msgstr "如果存在,替换现有的标签"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
+#: builtin/tag.c:416 builtin/update-ref.c:368
 msgid "create a reflog"
 msgstr "创建引用日志"
 
-#: builtin/tag.c:360
+#: builtin/tag.c:418
 msgid "Tag listing options"
 msgstr "标签列表选项"
 
-#: builtin/tag.c:361
+#: builtin/tag.c:419
 msgid "show tag list in columns"
 msgstr "以列的方式显示标签列表"
 
-#: builtin/tag.c:362 builtin/tag.c:363
+#: builtin/tag.c:420 builtin/tag.c:422
 msgid "print only tags that contain the commit"
-msgstr "只打印包含提交的标签"
+msgstr "只打印包含该提交的标签"
+
+#: builtin/tag.c:421 builtin/tag.c:423
+msgid "print only tags that don't contain the commit"
+msgstr "只打印不包含该提交的标签"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:424
 msgid "print only tags that are merged"
 msgstr "只打印已经合并的标签"
 
-#: builtin/tag.c:365
+#: builtin/tag.c:425
 msgid "print only tags that are not merged"
 msgstr "只打印尚未合并的标签"
 
-#: builtin/tag.c:370
+#: builtin/tag.c:430
 msgid "print only tags of the object"
-msgstr "只打印对象的标签"
+msgstr "只打印指向该对象的标签"
 
-#: builtin/tag.c:399
+#: builtin/tag.c:469
 msgid "--column and -n are incompatible"
 msgstr "--column 和 -n 不兼容"
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "-n 选项只允许和 -l 同时使用。"
+#: builtin/tag.c:491
+msgid "-n option is only allowed in list mode"
+msgstr "-n 选项只允许用在列表显示模式"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "--contains 选项只允许和 -l 同时使用。"
+#: builtin/tag.c:493
+msgid "--contains option is only allowed in list mode"
+msgstr "--contains 选项只允许用在列表显示模式"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "--points-at 选项只允许和 -l 同时使用。"
+#: builtin/tag.c:495
+msgid "--no-contains option is only allowed in list mode"
+msgstr "--no-contains 选项只允许用在列表显示模式"
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "选项 --merged 和 --no-merged 只能和 -l 共用"
+#: builtin/tag.c:497
+msgid "--points-at option is only allowed in list mode"
+msgstr "--points-at 选项只允许用在列表显示模式"
+
+#: builtin/tag.c:499
+msgid "--merged and --no-merged options are only allowed in list mode"
+msgstr "--merged 和 --no-merged 选项只允许用在列表显示模式"
 
-#: builtin/tag.c:433
+#: builtin/tag.c:510
 msgid "only one -F or -m option is allowed."
 msgstr "只允许一个 -F 或 -m 选项。"
 
-#: builtin/tag.c:452
+#: builtin/tag.c:529
 msgid "too many params"
 msgstr "太多参数"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:535
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' 不是一个有效的标签名称。"
 
-#: builtin/tag.c:463
+#: builtin/tag.c:540
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "标签 '%s' 已存在"
 
-#: builtin/tag.c:491
+#: builtin/tag.c:570
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "已更新标签 '%s'(曾为 %s)\n"
 
-#: builtin/unpack-objects.c:490
+#: builtin/unpack-objects.c:493
 msgid "Unpacking objects"
 msgstr "展开对象中"
 
@@ -11837,7 +13343,7 @@ msgstr "无法创建目录 %s"
 #: builtin/update-index.c:85
 #, c-format
 msgid "failed to stat %s"
-msgstr "无法枚举 %s 状态"
+msgstr "对 %s 调用 stat 失败"
 
 #: builtin/update-index.c:95
 #, c-format
@@ -11849,169 +13355,199 @@ msgstr "无法创建文件 %s"
 msgid "failed to delete file %s"
 msgstr "无法删除文件 %s"
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
+#: builtin/update-index.c:110 builtin/update-index.c:216
 #, c-format
 msgid "failed to delete directory %s"
 msgstr "无法删除目录 %s"
 
-#: builtin/update-index.c:133
+#: builtin/update-index.c:135
 #, c-format
 msgid "Testing mtime in '%s' "
 msgstr "在 '%s' 中测试 mtime "
 
-#: builtin/update-index.c:145
+#: builtin/update-index.c:149
 msgid "directory stat info does not change after adding a new file"
 msgstr "添加一个新文件后,目录的状态信息未改变"
 
-#: builtin/update-index.c:158
+#: builtin/update-index.c:162
 msgid "directory stat info does not change after adding a new directory"
 msgstr "添加一个新目录后,目录的状态信息未改变"
 
-#: builtin/update-index.c:171
+#: builtin/update-index.c:175
 msgid "directory stat info changes after updating a file"
 msgstr "更新一个文件后,目录的状态信息被修改"
 
-#: builtin/update-index.c:182
+#: builtin/update-index.c:186
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr "在子目录中添加文件后,目录的状态信息被修改"
 
-#: builtin/update-index.c:193
+#: builtin/update-index.c:197
 msgid "directory stat info does not change after deleting a file"
 msgstr "删除一个文件后,目录的状态信息未改变"
 
-#: builtin/update-index.c:206
+#: builtin/update-index.c:210
 msgid "directory stat info does not change after deleting a directory"
 msgstr "删除一个目录后,目录的状态信息未改变"
 
-#: builtin/update-index.c:213
+#: builtin/update-index.c:217
 msgid " OK"
 msgstr " OK"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:568
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<选项>] [--] [<文件>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:923
 msgid "continue refresh even when index needs update"
 msgstr "当索引需要更新时继续刷新"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:926
 msgid "refresh: ignore submodules"
 msgstr "刷新:忽略子模组"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:929
 msgid "do not ignore new files"
 msgstr "不忽略新的文件"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:931
 msgid "let files replace directories and vice-versa"
 msgstr "让文件替换目录(反之亦然)"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:933
 msgid "notice files missing from worktree"
 msgstr "通知文件从工作区丢失"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:935
 msgid "refresh even if index contains unmerged entries"
 msgstr "即使索引区包含未合并的条目也执行刷新"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:938
 msgid "refresh stat information"
 msgstr "刷新统计信息"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:942
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "类似于 --refresh,但是忽略 assume-unchanged 设置"
 
-#: builtin/update-index.c:953
+#: builtin/update-index.c:946
 msgid "<mode>,<object>,<path>"
 msgstr "<存取模式>,<对象>,<路径>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:947
 msgid "add the specified entry to the index"
 msgstr "添加指定的条目到索引区"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:956
 msgid "mark files as \"not changing\""
 msgstr "把文件标记为 \"没有变更\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:959
 msgid "clear assumed-unchanged bit"
 msgstr "清除 assumed-unchanged 位"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:962
 msgid "mark files as \"index-only\""
 msgstr "把文件标记为 \"仅索引\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:965
 msgid "clear skip-worktree bit"
 msgstr "清除 skip-worktree 位"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:968
 msgid "add to index only; do not add content to object database"
 msgstr "只添加到索引区;不添加对象到对象库"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:970
 msgid "remove named paths even if present in worktree"
 msgstr "即使存在工作区里,也删除路径"
 
-#: builtin/update-index.c:979
+#: builtin/update-index.c:972
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "携带 --stdin:输入的行以 null 字符终止"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:974
 msgid "read list of paths to be updated from standard input"
 msgstr "从标准输入中读取需要更新的路径列表"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:978
 msgid "add entries from standard input to the index"
 msgstr "从标准输入添加条目到索引区"
 
-#: builtin/update-index.c:989
+#: builtin/update-index.c:982
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "为指定文件重新生成第2和第3暂存区"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:986
 msgid "only update entries that differ from HEAD"
 msgstr "只更新与 HEAD 不同的条目"
 
-#: builtin/update-index.c:997
+#: builtin/update-index.c:990
 msgid "ignore files missing from worktree"
 msgstr "忽略工作区丢失的文件"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:993
 msgid "report actions to standard output"
 msgstr "在标准输出显示操作"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:995
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(for porcelains) 忘记保存的未解决的冲突"
 
-#: builtin/update-index.c:1006
+#: builtin/update-index.c:999
 msgid "write index in this format"
 msgstr "以这种格式写入索引区"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:1001
 msgid "enable or disable split index"
 msgstr "启用或禁用索引拆分"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:1003
 msgid "enable/disable untracked cache"
 msgstr "启用/禁用对未跟踪文件的缓存"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1005
 msgid "test if the filesystem supports untracked cache"
 msgstr "测试文件系统是否支持未跟踪文件缓存"
 
-#: builtin/update-index.c:1014
+#: builtin/update-index.c:1007
 msgid "enable untracked cache without testing the filesystem"
 msgstr "无需检测文件系统,启用对未跟踪文件的缓存"
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1107
+msgid ""
+"core.splitIndex is set to false; remove or change it, if you really want to "
+"enable split index"
+msgstr ""
+"core.splitIndex 被设置为 false。如果您确实要启用索引拆分,请删除或修改它。"
+
+#: builtin/update-index.c:1116
+msgid ""
+"core.splitIndex is set to true; remove or change it, if you really want to "
+"disable split index"
+msgstr ""
+"core.splitIndex 被设置为 true。如果您确实要禁用索引拆分,请删除或修改它。"
+
+#: builtin/update-index.c:1127
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache 被设置为 true。如果您确实要禁用未跟踪文件缓存,请删除或修"
+"改它。"
+
+#: builtin/update-index.c:1131
 msgid "Untracked cache disabled"
 msgstr "缓存未跟踪文件被禁用"
 
-#: builtin/update-index.c:1146
+#: builtin/update-index.c:1139
+msgid ""
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
+msgstr ""
+"core.untrackedCache 被设置为 false。如果您确实要启用未跟踪文件缓存,请删除或"
+"修改它。"
+
+#: builtin/update-index.c:1143
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "缓存未跟踪文件在 '%s' 启用"
@@ -12060,7 +13596,7 @@ msgstr "git verify-commit [-v | --verbose] <提交>..."
 msgid "print commit contents"
 msgstr "打印提交内容"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:37
 msgid "print raw gpg status output"
 msgstr "打印原始 gpg 状态输出"
 
@@ -12076,11 +13612,11 @@ msgstr "冗长输出"
 msgid "show statistics only"
 msgstr "只显示统计"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <标签>..."
+#: builtin/verify-tag.c:18
+msgid "git verify-tag [-v | --verbose] [--format=<format>] <tag>..."
+msgstr "git verify-tag [-v | --verbose] [--format=<格式>] <标签>..."
 
-#: builtin/verify-tag.c:34
+#: builtin/verify-tag.c:36
 msgid "print tag contents"
 msgstr "打印标签内容"
 
@@ -12104,90 +13640,102 @@ msgstr "git worktree prune [<选项>]"
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock <路径>"
 
-#: builtin/worktree.c:42
+#: builtin/worktree.c:43
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "删除工作区/%s:不是一个有效的目录"
 
-#: builtin/worktree.c:48
+#: builtin/worktree.c:49
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "删除 worktrees/%s:gitdir 文件不存在"
 
-#: builtin/worktree.c:53
+#: builtin/worktree.c:54
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "删除 worktrees/%s:无法读取 gitdir 文件 (%s)"
 
-#: builtin/worktree.c:64
+#: builtin/worktree.c:65
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "删除 worktrees/%s:无效的 gitdir 文件"
 
-#: builtin/worktree.c:80
+#: builtin/worktree.c:81
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "删除 worktrees/%s:gitdir 文件的指向不存在"
 
+#: builtin/worktree.c:128
+msgid "report pruned working trees"
+msgstr "报告清除的工作区"
+
+#: builtin/worktree.c:130
+msgid "expire working trees older than <time>"
+msgstr "将早于 <time> 的工作区过期"
+
 #: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' 已经存在"
 
-#: builtin/worktree.c:236
+#: builtin/worktree.c:235
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/worktree.c:272
+#: builtin/worktree.c:274
 #, c-format
 msgid "Preparing %s (identifier %s)"
-msgstr "准备 %s (标识符 %s)"
+msgstr "准备 %s(标识符 %s)"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:328
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "检出分支 <branch> 即使已经被检出到其它工作区"
 
-#: builtin/worktree.c:325
+#: builtin/worktree.c:330
 msgid "create a new branch"
 msgstr "创建一个新分支"
 
-#: builtin/worktree.c:327
+#: builtin/worktree.c:332
 msgid "create or reset a branch"
 msgstr "创建或重置一个分支"
 
-#: builtin/worktree.c:329
+#: builtin/worktree.c:334
 msgid "populate the new working tree"
 msgstr "生成新的工作区"
 
-#: builtin/worktree.c:337
+#: builtin/worktree.c:335
+msgid "keep the new working tree locked"
+msgstr "锁定新工作区"
+
+#: builtin/worktree.c:343
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b、-B 和 --detach 是互斥的"
 
-#: builtin/worktree.c:470
+#: builtin/worktree.c:478
 msgid "reason for locking"
 msgstr "锁定原因"
 
-#: builtin/worktree.c:482 builtin/worktree.c:515
+#: builtin/worktree.c:490 builtin/worktree.c:523
 #, c-format
 msgid "'%s' is not a working tree"
 msgstr "'%s' 不是一个工作区"
 
-#: builtin/worktree.c:484 builtin/worktree.c:517
+#: builtin/worktree.c:492 builtin/worktree.c:525
 msgid "The main working tree cannot be locked or unlocked"
 msgstr "主工作区无法被加锁或解锁"
 
-#: builtin/worktree.c:489
+#: builtin/worktree.c:497
 #, c-format
 msgid "'%s' is already locked, reason: %s"
 msgstr "'%s' 已被锁定,原因:%s"
 
-#: builtin/worktree.c:491
+#: builtin/worktree.c:499
 #, c-format
 msgid "'%s' is already locked"
 msgstr "'%s' 已被锁定"
 
-#: builtin/worktree.c:519
+#: builtin/worktree.c:527
 #, c-format
 msgid "'%s' is not locked"
 msgstr "'%s' 未被锁定"
@@ -12208,26 +13756,39 @@ msgstr "将 <前缀> 子目录内容写到一个树对象"
 msgid "only useful for debugging"
 msgstr "只对调试有用"
 
-#: upload-pack.c:20
+#: upload-pack.c:22
 msgid "git upload-pack [<options>] <dir>"
 msgstr "git upload-pack [<选项>] <目录>"
 
-#: upload-pack.c:837
+#: upload-pack.c:1040
 msgid "quit after a single request/response exchange"
 msgstr "在一次单独的请求/响应(request/response)交换后退出"
 
-#: upload-pack.c:839
+#: upload-pack.c:1042
 msgid "exit immediately after initial ref advertisement"
 msgstr "在初始的引用广告后立即退出"
 
-#: upload-pack.c:841
+#: upload-pack.c:1044
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr "不要尝试 <directory>/.git/ 如果 <directory> 不是一个 Git 目录"
 
-#: upload-pack.c:843
+#: upload-pack.c:1046
 msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr "不活动 <n> 秒钟后终止传输"
 
+#: credential-cache--daemon.c:223
+#, c-format
+msgid ""
+"The permissions on your socket directory are too loose; other\n"
+"users may be able to read your cached credentials. Consider running:\n"
+"\n"
+"\tchmod 0700 %s"
+msgstr ""
+"您的 socket 目录权限过于宽松,其他用户可能会读取您缓存的认证信息。考虑执"
+"行:\n"
+"\n"
+"\tchmod 0700 %s"
+
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "调试信息输出到标准错误"
@@ -12242,10 +13803,35 @@ msgstr ""
 "查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的\n"
 "帮助。"
 
-#: http.c:323
+#: http.c:336
+#, c-format
+msgid "negative value for http.postbuffer; defaulting to %d"
+msgstr "http.postbuffer 为负值,默认为 %d"
+
+#: http.c:357
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "当 cURL < 7.22.0 时,不支持委托控制"
+
+#: http.c:366
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "不支持公钥文件锁定,因为 cURL < 7.44.0"
 
+#: http.c:1766
+#, c-format
+msgid ""
+"unable to update url base from redirection:\n"
+"  asked for: %s\n"
+"   redirect: %s"
+msgstr ""
+"不能更新重定向的 url base:\n"
+"     请求:%s\n"
+"   重定向:%s"
+
+#: remote-curl.c:323
+#, c-format
+msgid "redirecting to %s"
+msgstr "重定向到 %s"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "开始一个工作区(参见:git help tutorial)"
@@ -12358,15 +13944,15 @@ msgstr "到期时间"
 msgid "no-op (backward compatibility)"
 msgstr "空操作(向后兼容)"
 
-#: parse-options.h:237
+#: parse-options.h:238
 msgid "be more verbose"
 msgstr "更加详细"
 
-#: parse-options.h:239
+#: parse-options.h:240
 msgid "be more quiet"
 msgstr "更加安静"
 
-#: parse-options.h:245
+#: parse-options.h:246
 msgid "use <n> digits to display SHA-1s"
 msgstr "用 <n> 位数字显示 SHA-1 哈希值"
 
@@ -12582,7 +14168,7 @@ msgid "Automated merge did not work."
 msgstr "自动合并未生效。"
 
 #: git-merge-octopus.sh:62
-msgid "Should not be doing an Octopus."
+msgid "Should not be doing an octopus."
 msgstr "不应该执行章鱼式合并。"
 
 #: git-merge-octopus.sh:73
@@ -12609,7 +14195,7 @@ msgstr "尝试和 $pretty_name 的简单合并"
 msgid "Simple merge did not work, trying automatic merge."
 msgstr "简单合并未生效,尝试自动合并。"
 
-#: git-rebase.sh:56
+#: git-rebase.sh:58
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -12620,51 +14206,37 @@ msgstr ""
 "如果您想跳过此补丁,则执行 \"git rebase --skip\"。\n"
 "要恢复原分支并停止变基,执行 \"git rebase --abort\"。"
 
-#: git-rebase.sh:156 git-rebase.sh:395
+#: git-rebase.sh:158 git-rebase.sh:397
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "无法移回 $head_name"
 
-#: git-rebase.sh:167
-msgid "Applied autostash."
-msgstr "成功应用 autostash。"
-
-#: git-rebase.sh:170
+#: git-rebase.sh:172
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "无法保存 $stash_sha1"
 
-#: git-rebase.sh:171
-msgid ""
-"Applying autostash resulted in conflicts.\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-"应用 autostash 导致冲突。\n"
-"您的修改安全地保存在 stash 中。\n"
-"您可以在任何时候运行 \"git stash pop\" 或 \"git stash drop\"。\n"
-
-#: git-rebase.sh:210
+#: git-rebase.sh:212
 msgid "The pre-rebase hook refused to rebase."
 msgstr "钩子 pre-rebase 拒绝变基操作。"
 
-#: git-rebase.sh:215
+#: git-rebase.sh:217
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "似乎正处于在 git-am 的执行过程中。无法变基。"
 
-#: git-rebase.sh:356
+#: git-rebase.sh:358
 msgid "No rebase in progress?"
 msgstr "没有正在进行的变基?"
 
-#: git-rebase.sh:367
+#: git-rebase.sh:369
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "动作 --edit-todo 只能用在交互式变基过程中。"
 
-#: git-rebase.sh:374
+#: git-rebase.sh:376
 msgid "Cannot read HEAD"
 msgstr "不能读取 HEAD"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:379
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -12672,7 +14244,7 @@ msgstr ""
 "您必须编辑所有的合并冲突,然后通过 git add\n"
 "命令将它们标记为已解决"
 
-#: git-rebase.sh:414
+#: git-rebase.sh:419
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12691,97 +14263,101 @@ msgstr ""
 "\t$cmd_clear_stale_rebase\n"
 "然后再重新执行变基操作。 为避免丢失重要数据,我已经停止当前操作。"
 
-#: git-rebase.sh:465
+#: git-rebase.sh:470
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "无效的上游 $upstream_name"
 
-#: git-rebase.sh:489
+#: git-rebase.sh:494
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: 有一个以上的合并基准"
 
-#: git-rebase.sh:492 git-rebase.sh:496
+#: git-rebase.sh:497 git-rebase.sh:501
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: 没有合并基准"
 
-#: git-rebase.sh:501
+#: git-rebase.sh:506
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "没有指向一个有效的提交:$onto_name"
 
-#: git-rebase.sh:524
+#: git-rebase.sh:529
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "严重错误:无此分支:$branch_name"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:562
 msgid "Cannot autostash"
 msgstr "无法 autostash"
 
-#: git-rebase.sh:562
+#: git-rebase.sh:567
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "创建了 autostash: $stash_abbrev"
 
-#: git-rebase.sh:566
+#: git-rebase.sh:571
 msgid "Please commit or stash them."
 msgstr "请提交或为它们保存进度。"
 
-#: git-rebase.sh:586
+#: git-rebase.sh:591
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "当前分支 $branch_name 是最新的。"
 
-#: git-rebase.sh:590
+#: git-rebase.sh:595
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "当前分支 $branch_name 是最新的,强制变基。"
 
-#: git-rebase.sh:601
+#: git-rebase.sh:606
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "变更从 $mb 到 $onto:"
 
-#: git-rebase.sh:610
+#: git-rebase.sh:615
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "首先,回退分支以便在上面重放您的工作..."
 
-#: git-rebase.sh:620
+#: git-rebase.sh:625
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "快进 $branch_name 至 $onto_name。"
 
-#: git-stash.sh:50
+#: git-stash.sh:53
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash clear 不支持参数"
 
-#: git-stash.sh:73
+#: git-stash.sh:94
 msgid "You do not have the initial commit yet"
 msgstr "您尚未建立初始提交"
 
-#: git-stash.sh:88
+#: git-stash.sh:109
 msgid "Cannot save the current index state"
 msgstr "无法保存当前索引状态"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124
+msgid "Cannot save the untracked files"
+msgstr "无法保存未跟踪文件"
+
+#: git-stash.sh:144 git-stash.sh:157
 msgid "Cannot save the current worktree state"
 msgstr "无法保存当前工作区状态"
 
-#: git-stash.sh:140
+#: git-stash.sh:161
 msgid "No changes selected"
 msgstr "没有选择变更"
 
-#: git-stash.sh:143
+#: git-stash.sh:164
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "无法删除临时索引(不应发生)"
 
-#: git-stash.sh:156
+#: git-stash.sh:177
 msgid "Cannot record working tree state"
 msgstr "不能记录工作区状态"
 
-#: git-stash.sh:188
+#: git-stash.sh:209
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "无法用 $w_commit 更新 $ref_stash"
@@ -12796,7 +14372,7 @@ msgstr "无法用 $w_commit 更新 $ref_stash"
 #. $ git stash save --blah-blah 2>&1 | head -n 2
 #. error: unknown option for 'stash save': --blah-blah
 #. To provide a message, use git stash save -- '--blah-blah'
-#: git-stash.sh:238
+#: git-stash.sh:265
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -12805,107 +14381,115 @@ msgstr ""
 "错误:'stash save' 的未知选项:$option\n"
 "      要提供一个描述信息,使用 git stash save -- '$option'"
 
-#: git-stash.sh:259
+#: git-stash.sh:278
+msgid "Can't use --patch and --include-untracked or --all at the same time"
+msgstr "不能同时使用参数 --patch 和 --include-untracked 或 --all"
+
+#: git-stash.sh:286
 msgid "No local changes to save"
 msgstr "没有要保存的本地修改"
 
-#: git-stash.sh:263
+#: git-stash.sh:291
 msgid "Cannot initialize stash"
 msgstr "无法初始化 stash"
 
-#: git-stash.sh:267
+#: git-stash.sh:295
 msgid "Cannot save the current status"
 msgstr "无法保存当前状态"
 
-#: git-stash.sh:268
+#: git-stash.sh:296
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
 msgstr "保存工作目录和索引状态 $stash_msg"
 
-#: git-stash.sh:285
+#: git-stash.sh:323
 msgid "Cannot remove worktree changes"
 msgstr "无法删除工作区变更"
 
-#: git-stash.sh:404
+#: git-stash.sh:471
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "未知选项: $opt"
 
-#: git-stash.sh:414
+#: git-stash.sh:484
 msgid "No stash found."
 msgstr "未发现 stash。"
 
-#: git-stash.sh:421
+#: git-stash.sh:491
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "指定了太多的版本:$REV"
 
-#: git-stash.sh:427
+#: git-stash.sh:506
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference 不是一个有效的引用"
 
-#: git-stash.sh:455
+#: git-stash.sh:534
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' 不是 stash 样提交"
 
-#: git-stash.sh:466
+#: git-stash.sh:545
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' 不是一个 stash 引用"
 
-#: git-stash.sh:474
+#: git-stash.sh:553
 msgid "unable to refresh index"
 msgstr "无法刷新索引"
 
-#: git-stash.sh:478
+#: git-stash.sh:557
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "无法在合并过程中恢复进度"
 
-#: git-stash.sh:486
+#: git-stash.sh:565
 msgid "Conflicts in index. Try without --index."
 msgstr "索引中有冲突。尝试不使用 --index。"
 
-#: git-stash.sh:488
+#: git-stash.sh:567
 msgid "Could not save index tree"
 msgstr "不能保存索引树"
 
-#: git-stash.sh:522
+#: git-stash.sh:576
+msgid "Could not restore untracked files from stash"
+msgstr "无法从进度保存中恢复未跟踪文件"
+
+#: git-stash.sh:601
 msgid "Cannot unstage modified files"
 msgstr "无法将修改的文件取消暂存"
 
-#: git-stash.sh:537
+#: git-stash.sh:616
 msgid "Index was not unstashed."
 msgstr "索引的进度没有被恢复。"
 
-#: git-stash.sh:551
+#: git-stash.sh:630
 msgid "The stash is kept in case you need it again."
 msgstr "暂存被保留以备您再次需要。"
 
-#: git-stash.sh:560
+#: git-stash.sh:639
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "丢弃了 ${REV} ($s)"
 
-#: git-stash.sh:561
+#: git-stash.sh:640
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}:不能丢弃进度条目"
 
-#: git-stash.sh:569
+#: git-stash.sh:648
 msgid "No branch name specified"
 msgstr "未指定分支名"
 
-#: git-stash.sh:641
+#: git-stash.sh:727
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(为恢复数据输入 \"git stash apply\")"
 
-#: git-submodule.sh:183
+#: git-submodule.sh:181
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "只能在工作区的顶级目录中使用相对路径"
 
-#: git-submodule.sh:193
+#: git-submodule.sh:191
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "仓库 URL:'$repo' 必须是绝对路径或以 ./|../ 起始"
@@ -12915,7 +14499,12 @@ msgstr "仓库 URL:'$repo' 必须是绝对路径或以 ./|../ 起始"
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' 已经存在于索引中"
 
-#: git-submodule.sh:214
+#: git-submodule.sh:213
+#, sh-format
+msgid "'$sm_path' already exists in the index and is not a submodule"
+msgstr "'$sm_path' 已经存在于索引中且不是一个子模组"
+
+#: git-submodule.sh:218
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12926,22 +14515,22 @@ msgstr ""
 "$sm_path\n"
 "如果您确实想添加它,使用 -f 参数。"
 
-#: git-submodule.sh:232
+#: git-submodule.sh:236
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "添加位于 '$sm_path' 的现存仓库到索引"
 
-#: git-submodule.sh:234
+#: git-submodule.sh:238
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' 已存在且不是一个有效的 git 仓库"
 
-#: git-submodule.sh:242
+#: git-submodule.sh:246
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "本地发现 '$sm_name' 的一个 git 目录,与其对应的远程仓库:"
 
-#: git-submodule.sh:244
+#: git-submodule.sh:248
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
@@ -12956,47 +14545,47 @@ msgstr ""
 "使用 '--force' 选项。如果本地 git 目录不是正确的仓库\n"
 "或者您不确定这里的含义,使用 '--name' 选项选择另外的名称。"
 
-#: git-submodule.sh:250
+#: git-submodule.sh:254
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "激活本地 git 目录到子模组 '$sm_name'。"
 
-#: git-submodule.sh:262
+#: git-submodule.sh:266
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "不能检出子模组 '$sm_path'"
 
-#: git-submodule.sh:267
+#: git-submodule.sh:271
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "无法添加子模组 '$sm_path'"
 
-#: git-submodule.sh:276
+#: git-submodule.sh:280
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "无法注册子模组 '$sm_path'"
 
-#: git-submodule.sh:323
+#: git-submodule.sh:341
 #, sh-format
 msgid "Entering '$displaypath'"
 msgstr "正在进入 '$displaypath'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:361
 #, sh-format
 msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr "停止于 '$displaypath';脚本返回非零值。"
 
-#: git-submodule.sh:414
+#: git-submodule.sh:432
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "pathspec 和 --all 不兼容"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:437
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr "如果您确实想要对所有子模组执行取消初始化,请使用 '--all'"
 
-#: git-submodule.sh:439
+#: git-submodule.sh:457
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
@@ -13005,144 +14594,141 @@ msgstr ""
 "子模组工作区 '$displaypath' 包含一个 .git 目录\n"
 "(如果您真的想删除它及其全部历史,使用 'rm -rf' 命令)"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:465
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr "子模组工作区 '$displaypath' 包含本地修改;使用 '-f' 丢弃它们"
 
-#: git-submodule.sh:450
+#: git-submodule.sh:468
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "已清除目录 '$displaypath'"
 
-#: git-submodule.sh:451
+#: git-submodule.sh:469
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "无法移除子模组工作区 '$displaypath'"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:472
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "不能创建空的子模组目录 '$displaypath'"
 
-#: git-submodule.sh:463
+#: git-submodule.sh:481
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中找到当前版本"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:647
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中获取"
 
-#: git-submodule.sh:627
+#: git-submodule.sh:652
 #, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
 "'$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中找到当前版本 ${remote_name}/${branch}"
 
-#: git-submodule.sh:645
+#: git-submodule.sh:670
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中获取"
 
-#: git-submodule.sh:651
+#: git-submodule.sh:676
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
 "Direct fetching of that commit failed."
-msgstr "获取了子模组路径 '$displaypath',但是它没有包含 $sha1。直接获取该提交失败。"
+msgstr ""
+"获取了子模组路径 '$displaypath',但是它没有包含 $sha1。直接获取该提交失败。"
 
-#: git-submodule.sh:658
+#: git-submodule.sh:683
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中检出 '$sha1'"
 
-#: git-submodule.sh:659
+#: git-submodule.sh:684
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "子模组路径 '$displaypath':检出 '$sha1'"
 
-#: git-submodule.sh:663
+#: git-submodule.sh:688
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中变基 '$sha1'"
 
-#: git-submodule.sh:664
+#: git-submodule.sh:689
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "子模组路径 '$displaypath':变基至 '$sha1'"
 
-#: git-submodule.sh:669
+#: git-submodule.sh:694
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "无法合并 '$sha1' 到子模组路径 '$displaypath' 中"
 
-#: git-submodule.sh:670
+#: git-submodule.sh:695
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "子模组路径 '$displaypath':已合并入 '$sha1'"
 
-#: git-submodule.sh:675
+#: git-submodule.sh:700
 #, sh-format
 msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr "在子模组 '$displaypath' 中执行 '$command $sha1' 失败"
 
-#: git-submodule.sh:676
+#: git-submodule.sh:701
 #, sh-format
 msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr "子模组 '$displaypath':'$command $sha1'"
 
-#: git-submodule.sh:707
+#: git-submodule.sh:732
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "无法递归进子模组路径 '$displaypath'"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 msgid "The --cached option cannot be used with the --files option"
 msgstr "选项 --cached 不能和选项 --files 同时使用"
 
-#: git-submodule.sh:867
+#: git-submodule.sh:892
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "意外的模式 $mod_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:887
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  警告:$display_name 未包含提交 $sha1_src"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:890
+#: git-submodule.sh:915
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  警告:$display_name 未包含提交 $sha1_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:893
+#: git-submodule.sh:918
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  警告:$display_name 未包含提交 $sha1_src 和 $sha1_dst"
 
-#: git-submodule.sh:918
-msgid "blob"
-msgstr "数据对象"
-
-#: git-submodule.sh:1040
+#: git-submodule.sh:1064
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "无法递归进子模组路径 '$sm_path'"
 
-#: git-submodule.sh:1107
+#: git-submodule.sh:1136
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "为 '$displaypath' 同步子模组 url"
@@ -13152,12 +14738,12 @@ msgstr "为 '$displaypath' 同步子模组 url"
 msgid "See git-${cmd}(1) for details."
 msgstr "详见 git-${cmd}(1)。"
 
-#: git-rebase--interactive.sh:131
+#: git-rebase--interactive.sh:140
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
 msgstr "变基中($new_count/$total)"
 
-#: git-rebase--interactive.sh:147
+#: git-rebase--interactive.sh:156
 msgid ""
 "\n"
 "Commands:\n"
@@ -13184,19 +14770,23 @@ msgstr ""
 "这些行可以被重新排序;它们会被从上至下地执行。\n"
 "\n"
 
-#: git-rebase--interactive.sh:162
+#: git-rebase--interactive.sh:171
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr "\n不要删除任意一行。使用 'drop' 显式地删除一个提交。\n"
+msgstr ""
+"\n"
+"不要删除任意一行。使用 'drop' 显式地删除一个提交。\n"
 
-#: git-rebase--interactive.sh:166
+#: git-rebase--interactive.sh:175
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr "\n如果您在这里删除一行,对应的提交将会丢失。\n"
+msgstr ""
+"\n"
+"如果您在这里删除一行,对应的提交将会丢失。\n"
 
-#: git-rebase--interactive.sh:202
+#: git-rebase--interactive.sh:211
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
@@ -13215,87 +14805,83 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:227
+#: git-rebase--interactive.sh:236
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
 msgstr "$sha1:不是一个可以被拣选的提交"
 
-#: git-rebase--interactive.sh:266
+#: git-rebase--interactive.sh:275
 #, sh-format
 msgid "Invalid commit name: $sha1"
 msgstr "无效的提交名:$sha1"
 
-#: git-rebase--interactive.sh:308
+#: git-rebase--interactive.sh:317
 msgid "Cannot write current commit's replacement sha1"
 msgstr "不能写入当前提交的替代 sha1"
 
-#: git-rebase--interactive.sh:360
+#: git-rebase--interactive.sh:369
 #, sh-format
 msgid "Fast-forward to $sha1"
 msgstr "快进到 $sha1"
 
-#: git-rebase--interactive.sh:362
+#: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot fast-forward to $sha1"
 msgstr "不能快进到 $sha1"
 
-#: git-rebase--interactive.sh:371
+#: git-rebase--interactive.sh:380
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
 msgstr "不能移动 HEAD 到 $first_parent"
 
-#: git-rebase--interactive.sh:376
+#: git-rebase--interactive.sh:385
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
 msgstr "拒绝压缩一个合并:$sha1"
 
-#: git-rebase--interactive.sh:390
+#: git-rebase--interactive.sh:399
 #, sh-format
 msgid "Error redoing merge $sha1"
 msgstr "无法重做合并 $sha1"
 
-#: git-rebase--interactive.sh:398
+#: git-rebase--interactive.sh:407
 #, sh-format
 msgid "Could not pick $sha1"
 msgstr "不能拣选 $sha1"
 
-#: git-rebase--interactive.sh:407
+#: git-rebase--interactive.sh:416
 #, sh-format
 msgid "This is the commit message #${n}:"
 msgstr "这是提交说明 #${n}:"
 
-#: git-rebase--interactive.sh:412
+#: git-rebase--interactive.sh:421
 #, sh-format
 msgid "The commit message #${n} will be skipped:"
 msgstr "提交说明 #${n} 将被跳过:"
 
-#: git-rebase--interactive.sh:423
+#: git-rebase--interactive.sh:432
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
 msgstr[0] "这是一个 $count 个提交的组合。"
 msgstr[1] "这是一个 $count 个提交的组合。"
 
-#: git-rebase--interactive.sh:431
+#: git-rebase--interactive.sh:441
 #, sh-format
 msgid "Cannot write $fixup_msg"
 msgstr "不能写入 $fixup_msg"
 
-#: git-rebase--interactive.sh:434
+#: git-rebase--interactive.sh:444
 msgid "This is a combination of 2 commits."
 msgstr "这是一个 2 个提交的组合。"
 
-#: git-rebase--interactive.sh:435
-msgid "This is the 1st commit message:"
-msgstr "这是第一个提交说明:"
-
-#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
-#: git-rebase--interactive.sh:521
+#: git-rebase--interactive.sh:485 git-rebase--interactive.sh:528
+#: git-rebase--interactive.sh:531
 #, sh-format
 msgid "Could not apply $sha1... $rest"
 msgstr "不能应用 $sha1... $rest"
 
-#: git-rebase--interactive.sh:549
+#: git-rebase--interactive.sh:559
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
@@ -13308,32 +14894,32 @@ msgstr ""
 "这通常是因为空的提交说明,或者 pre-commit 钩子执行失败。如果是 pre-commit\n"
 "钩子执行失败,你可能需要在重写提交说明前解决这个问题。"
 
-#: git-rebase--interactive.sh:564
+#: git-rebase--interactive.sh:574
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
 msgstr "停止在 $sha1_abbrev... $rest"
 
-#: git-rebase--interactive.sh:579
+#: git-rebase--interactive.sh:589
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
 msgstr "没有父提交的情况下不能 '$squash_style'"
 
-#: git-rebase--interactive.sh:621
+#: git-rebase--interactive.sh:631
 #, sh-format
 msgid "Executing: $rest"
 msgstr "执行:$rest"
 
-#: git-rebase--interactive.sh:629
+#: git-rebase--interactive.sh:639
 #, sh-format
 msgid "Execution failed: $rest"
 msgstr "执行失败:$rest"
 
-#: git-rebase--interactive.sh:631
+#: git-rebase--interactive.sh:641
 msgid "and made changes to the index and/or the working tree"
 msgstr "并且修改索引和/或工作区"
 
 #  译者:注意保持前导空格
-#: git-rebase--interactive.sh:633
+#: git-rebase--interactive.sh:643
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
@@ -13344,7 +14930,7 @@ msgstr ""
 "\tgit rebase --continue"
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
-#: git-rebase--interactive.sh:646
+#: git-rebase--interactive.sh:656
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
@@ -13358,25 +14944,25 @@ msgstr ""
 "\n"
 "\tgit rebase --continue"
 
-#: git-rebase--interactive.sh:657
+#: git-rebase--interactive.sh:667
 #, sh-format
 msgid "Unknown command: $command $sha1 $rest"
 msgstr "未知命令:$command $sha1 $rest"
 
-#: git-rebase--interactive.sh:658
+#: git-rebase--interactive.sh:668
 msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr "要修改请使用命令 'git rebase --edit-todo'。"
 
-#: git-rebase--interactive.sh:693
+#: git-rebase--interactive.sh:703
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
 msgstr "成功变基并更新 $head_name。"
 
-#: git-rebase--interactive.sh:740
+#: git-rebase--interactive.sh:750
 msgid "Could not skip unnecessary pick commands"
 msgstr "不能跳过不必要的拣选命令"
 
-#: git-rebase--interactive.sh:898
+#: git-rebase--interactive.sh:908
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
@@ -13385,7 +14971,7 @@ msgstr ""
 "警告:缺失 SHA-1 或者在下面一行中不是一个提交:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:931
+#: git-rebase--interactive.sh:941
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
@@ -13394,17 +14980,17 @@ msgstr ""
 "警告:下面一行中的命令未能被识别:\n"
 " - $line"
 
-#: git-rebase--interactive.sh:970
+#: git-rebase--interactive.sh:980
 msgid "could not detach HEAD"
 msgstr "不能检出为分离头指针"
 
-#: git-rebase--interactive.sh:1008
+#: git-rebase--interactive.sh:1018
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
 msgstr "警告:一些提交可能被意外丢弃。丢弃的提交(从新到旧):"
 
-#: git-rebase--interactive.sh:1016
+#: git-rebase--interactive.sh:1026
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
@@ -13417,26 +15003,29 @@ msgstr ""
 "使用 'git config rebase.missingCommitsCheck' 来修改警告级别。\n"
 "可选值有:ignore、warn、error。"
 
-#: git-rebase--interactive.sh:1027
+#: git-rebase--interactive.sh:1037
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
 "Ignoring."
 msgstr "选项 rebase.missingCommitsCheck 的值 $check_level 无法被识别。已忽略。"
 
-#: git-rebase--interactive.sh:1044
-msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr "您可以使用 'git rebase --edit-todo' 命令修改。"
+#: git-rebase--interactive.sh:1054
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"您可以用 'git rebase --edit-todo' 修正问题然后执行 'git rebase --continue'。"
 
-#: git-rebase--interactive.sh:1045
+#: git-rebase--interactive.sh:1055
 msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr "或者您可以使用 'git rebase --abort' 命令终止变基操作。"
 
-#: git-rebase--interactive.sh:1069
+#: git-rebase--interactive.sh:1083
 msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr "不能删除 CHERRY_PICK_HEAD"
 
-#: git-rebase--interactive.sh:1074
+#: git-rebase--interactive.sh:1088
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
@@ -13449,7 +15038,7 @@ msgid ""
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
-"In both case, once you're done, continue with:\n"
+"In both cases, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
@@ -13465,21 +15054,22 @@ msgstr ""
 "\n"
 "  git rebase --continue\n"
 
-#: git-rebase--interactive.sh:1091
+#: git-rebase--interactive.sh:1105
 msgid "Error trying to find the author identity to amend commit"
 msgstr "在修补提交中查找作者信息时遇到错误"
 
-#: git-rebase--interactive.sh:1096
+#: git-rebase--interactive.sh:1110
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
-msgstr "您的工作区中有未提交的变更。请先提交然后再次运行 'git rebase --continue'。"
+msgstr ""
+"您的工作区中有未提交的变更。请先提交然后再次运行 'git rebase --continue'。"
 
-#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+#: git-rebase--interactive.sh:1115 git-rebase--interactive.sh:1119
 msgid "Could not commit staged changes."
 msgstr "不能提交暂存的修改。"
 
-#: git-rebase--interactive.sh:1129
+#: git-rebase--interactive.sh:1147
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
@@ -13493,51 +15083,50 @@ msgstr ""
 "    git rebase --continue\n"
 "\n"
 
-#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
+#: git-rebase--interactive.sh:1155 git-rebase--interactive.sh:1313
 msgid "Could not execute editor"
 msgstr "无法运行编辑器"
 
-#: git-rebase--interactive.sh:1145
-msgid "You need to set your committer info first"
-msgstr "您需要先设置您的提交者信息"
-
-#: git-rebase--interactive.sh:1153
+#: git-rebase--interactive.sh:1168
 #, sh-format
 msgid "Could not checkout $switch_to"
 msgstr "不能检出 $switch_to"
 
-#: git-rebase--interactive.sh:1158
+#: git-rebase--interactive.sh:1173
 msgid "No HEAD?"
 msgstr "没有 HEAD?"
 
-#: git-rebase--interactive.sh:1159
+#: git-rebase--interactive.sh:1174
 #, sh-format
 msgid "Could not create temporary $state_dir"
 msgstr "不能创建临时 $state_dir"
 
-#: git-rebase--interactive.sh:1161
+#: git-rebase--interactive.sh:1176
 msgid "Could not mark as interactive"
 msgstr "不能标记为交互式"
 
-#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
+#: git-rebase--interactive.sh:1186 git-rebase--interactive.sh:1191
 msgid "Could not init rewritten commits"
 msgstr "不能对重写提交进行初始化"
 
-#: git-rebase--interactive.sh:1276
+#: git-rebase--interactive.sh:1291
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
 msgstr[0] "变基 $shortrevisions 到 $shortonto($todocount 个提交)"
 msgstr[1] "变基 $shortrevisions 到 $shortonto($todocount 个提交)"
 
-#: git-rebase--interactive.sh:1281
+#: git-rebase--interactive.sh:1296
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
 "\n"
-msgstr "\n然而,如果您删除全部内容,变基操作将会终止。\n\n"
+msgstr ""
+"\n"
+"然而,如果您删除全部内容,变基操作将会终止。\n"
+"\n"
 
-#: git-rebase--interactive.sh:1288
+#: git-rebase--interactive.sh:1303
 msgid "Note that empty commits are commented out"
 msgstr "注意空提交已被注释掉"
 
@@ -13564,6 +15153,10 @@ msgstr "不能变基:您有未暂存的变更。"
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr "不能重写分支:您有未暂存的变更。"
 
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "无法通过变基方式拉取:您有未暂存的变更。"
+
 #: git-sh-setup.sh:229
 #, sh-format
 msgid "Cannot $action: You have unstaged changes."
@@ -13573,11 +15166,19 @@ msgstr "不能 $action:您有未暂存的变更。"
 msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr "不能变基:您的索引中包含未提交的变更。"
 
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr "无法通过变基方式拉取:您的索引中包含未提交的变更。"
+
 #: git-sh-setup.sh:248
 #, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr "不能 $action:您的索引中包含未提交的变更。"
 
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "而且您的索引中包含未提交的变更。"
+
 #: git-sh-setup.sh:372
 msgid "You need to run this command from the toplevel of the working tree."
 msgstr "您需要在工作区的顶级目录中运行这个命令。"
@@ -13585,3 +15186,982 @@ msgstr "您需要在工作区的顶级目录中运行这个命令。"
 #: git-sh-setup.sh:377
 msgid "Unable to determine absolute path of git directory"
 msgstr "不能确定 git 目录的绝对路径"
+
+#. TRANSLATORS: you can adjust this to align "git add -i" status menu
+#: git-add--interactive.perl:238
+#, perl-format
+msgid "%12s %12s %s"
+msgstr "%12s %12s %s"
+
+#: git-add--interactive.perl:239
+msgid "staged"
+msgstr "缓存"
+
+#: git-add--interactive.perl:239
+msgid "unstaged"
+msgstr "未缓存"
+
+#: git-add--interactive.perl:288 git-add--interactive.perl:313
+msgid "binary"
+msgstr "二进制"
+
+#: git-add--interactive.perl:297 git-add--interactive.perl:351
+msgid "nothing"
+msgstr "无"
+
+#: git-add--interactive.perl:333 git-add--interactive.perl:348
+msgid "unchanged"
+msgstr "没有修改"
+
+#: git-add--interactive.perl:644
+#, perl-format
+msgid "added %d path\n"
+msgid_plural "added %d paths\n"
+msgstr[0] "增加了 %d 个路径\n"
+msgstr[1] "增加了 %d 个路径\n"
+
+#: git-add--interactive.perl:647
+#, perl-format
+msgid "updated %d path\n"
+msgid_plural "updated %d paths\n"
+msgstr[0] "更新了 %d 个路径\n"
+msgstr[1] "更新了 %d 个路径\n"
+
+#: git-add--interactive.perl:650
+#, perl-format
+msgid "reverted %d path\n"
+msgid_plural "reverted %d paths\n"
+msgstr[0] "还原了 %d 个路径\n"
+msgstr[1] "还原了 %d 个路径\n"
+
+#: git-add--interactive.perl:653
+#, perl-format
+msgid "touched %d path\n"
+msgid_plural "touched %d paths\n"
+msgstr[0] "触碰了 %d 个路径\n"
+msgstr[1] "触碰了 %d 个路径\n"
+
+#: git-add--interactive.perl:662
+msgid "Update"
+msgstr "更新"
+
+#: git-add--interactive.perl:674
+msgid "Revert"
+msgstr "还原"
+
+#: git-add--interactive.perl:697
+#, perl-format
+msgid "note: %s is untracked now.\n"
+msgstr "说明:%s 现已成为未跟踪的。\n"
+
+#: git-add--interactive.perl:708
+msgid "Add untracked"
+msgstr "添加未跟踪的"
+
+#: git-add--interactive.perl:714
+msgid "No untracked files.\n"
+msgstr "没有未跟踪的文件。\n"
+
+#: git-add--interactive.perl:1030
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for staging."
+msgstr "如果补丁能干净地应用,编辑块将立即标记为暂存。"
+
+#: git-add--interactive.perl:1033
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for stashing."
+msgstr "如果补丁能干净地应用,编辑块将立即标记为保存进度。"
+
+#: git-add--interactive.perl:1036
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for unstaging."
+msgstr "如果补丁能干净地应用,编辑块将立即标记为未暂存。"
+
+#: git-add--interactive.perl:1039 git-add--interactive.perl:1048
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for applying."
+msgstr "如果补丁能干净地应用,编辑块将立即标记为应用。"
+
+#: git-add--interactive.perl:1042 git-add--interactive.perl:1045
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"marked for discarding."
+msgstr "如果补丁能干净地应用,编辑块将立即标记为丢弃。"
+
+#: git-add--interactive.perl:1058
+#, perl-format
+msgid "failed to open hunk edit file for writing: %s"
+msgstr "无法写入块编辑文件:%s"
+
+#: git-add--interactive.perl:1059
+msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
+msgstr "手动块编辑模式 -- 查看底部的快速指南。\n"
+
+#: git-add--interactive.perl:1065
+#, perl-format
+msgid ""
+"---\n"
+"To remove '%s' lines, make them ' ' lines (context).\n"
+"To remove '%s' lines, delete them.\n"
+"Lines starting with %s will be removed.\n"
+msgstr ""
+"---\n"
+"要删除 '%s' 开始的行,使其成为 ' ' 开始的行(上下文)。\n"
+"要删除 '%s' 开始的行,删除它们。\n"
+"以 %s 开始的行将被删除。\n"
+
+#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
+#: git-add--interactive.perl:1073
+msgid ""
+"If it does not apply cleanly, you will be given an opportunity to\n"
+"edit again.  If all lines of the hunk are removed, then the edit is\n"
+"aborted and the hunk is left unchanged.\n"
+msgstr ""
+"如果不能干净地应用,您将有机会重新编辑。如果该块的全部内容删除,则\n"
+"此次编辑被终止,该块不会被修改。\n"
+
+#: git-add--interactive.perl:1087
+#, perl-format
+msgid "failed to open hunk edit file for reading: %s"
+msgstr "无法读取块编辑文件:%s"
+
+#. TRANSLATORS: do not translate [y/n]
+#. The program will only accept that input
+#. at this point.
+#. Consider translating (saying "no" discards!) as
+#. (saying "n" for "no" discards!) if the translation
+#. of the word "no" does not start with n.
+#: git-add--interactive.perl:1178
+msgid ""
+"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
+msgstr "您的编辑块不能被应用。重新编辑(选择 \"no\" 丢弃!) [y/n]? "
+
+#: git-add--interactive.perl:1187
+msgid ""
+"y - stage this hunk\n"
+"n - do not stage this hunk\n"
+"q - quit; do not stage this hunk or any of the remaining ones\n"
+"a - stage this hunk and all later hunks in the file\n"
+"d - do not stage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 暂存该块\n"
+"n - 不要暂存该块\n"
+"q - 退出。不暂存该块及后面的全部块\n"
+"a - 暂存该块和本文件中后面的全部块\n"
+"d - 不暂存该块和本文件中后面的全部块"
+
+#: git-add--interactive.perl:1193
+msgid ""
+"y - stash this hunk\n"
+"n - do not stash this hunk\n"
+"q - quit; do not stash this hunk or any of the remaining ones\n"
+"a - stash this hunk and all later hunks in the file\n"
+"d - do not stash this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 贮藏该块\n"
+"n - 不要贮藏该块\n"
+"q - 退出。不贮藏该块及后面的全部块\n"
+"a - 贮藏该块和本文件中后面的全部块\n"
+"d - 不贮藏该块和本文件中后面的全部块"
+
+#: git-add--interactive.perl:1199
+msgid ""
+"y - unstage this hunk\n"
+"n - do not unstage this hunk\n"
+"q - quit; do not unstage this hunk or any of the remaining ones\n"
+"a - unstage this hunk and all later hunks in the file\n"
+"d - do not unstage this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 不暂存该块\n"
+"n - 不要不暂存该块\n"
+"q - 退出。不要不暂存该块及后面的全部块\n"
+"a - 不暂存该块和本文件中后面的全部块\n"
+"d - 不要不暂存该块和本文件中后面的全部块"
+
+#: git-add--interactive.perl:1205
+msgid ""
+"y - apply this hunk to index\n"
+"n - do not apply this hunk to index\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 在索引中应用该块\n"
+"n - 不要在索引中应用该块\n"
+"q - 退出。不要应用该块及后面的全部块\n"
+"a - 应用该块和本文件中后面的全部块\n"
+"d - 不要应用该块和本文件中后面的全部块"
+
+#: git-add--interactive.perl:1211
+msgid ""
+"y - discard this hunk from worktree\n"
+"n - do not discard this hunk from worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 在工作区中丢弃该块\n"
+"n - 不要在工作区中丢弃该块\n"
+"q - 退出。不要丢弃该块及后面的全部块\n"
+"a - 丢弃该块和本文件中后面的全部块\n"
+"d - 不要丢弃该块和本文件中后面的全部块"
+
+#: git-add--interactive.perl:1217
+msgid ""
+"y - discard this hunk from index and worktree\n"
+"n - do not discard this hunk from index and worktree\n"
+"q - quit; do not discard this hunk or any of the remaining ones\n"
+"a - discard this hunk and all later hunks in the file\n"
+"d - do not discard this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 在索引和工作区中丢弃该块\n"
+"n - 不要在索引和工作区中丢弃该块\n"
+"q - 退出。不要丢弃该块及后面的全部块\n"
+"a - 丢弃该块和本文件中后面的全部块\n"
+"d - 不要丢弃该块和本文件中后面的全部块"
+
+#: git-add--interactive.perl:1223
+msgid ""
+"y - apply this hunk to index and worktree\n"
+"n - do not apply this hunk to index and worktree\n"
+"q - quit; do not apply this hunk or any of the remaining ones\n"
+"a - apply this hunk and all later hunks in the file\n"
+"d - do not apply this hunk or any of the later hunks in the file"
+msgstr ""
+"y - 在索引和工作区中应用该块\n"
+"n - 不要在索引和工作区中应用该块\n"
+"q - 退出。不要应用该块及后面的全部块\n"
+"a - 应用该块和本文件中后面的全部块\n"
+"d - 不要应用该块和本文件中后面的全部块"
+
+#: git-add--interactive.perl:1232
+msgid ""
+"g - select a hunk to go to\n"
+"/ - search for a hunk matching the given regex\n"
+"j - leave this hunk undecided, see next undecided hunk\n"
+"J - leave this hunk undecided, see next hunk\n"
+"k - leave this hunk undecided, see previous undecided hunk\n"
+"K - leave this hunk undecided, see previous hunk\n"
+"s - split the current hunk into smaller hunks\n"
+"e - manually edit the current hunk\n"
+"? - print help\n"
+msgstr ""
+"g - 选择跳转到一个块\n"
+"/ - 查找和给定正则表达式匹配的块\n"
+"j - 维持该块未决状态,查看下一个未决块\n"
+"J - 维持该块未决状态,查看下一个块\n"
+"k - 维持该块未决状态,查看上一个未决块\n"
+"K - 维持该块未决状态,查看上一个块\n"
+"s - 拆分当前块为更小的块\n"
+"e - 手动编辑当前块\n"
+"? - 显示帮助\n"
+
+#: git-add--interactive.perl:1263
+msgid "The selected hunks do not apply to the index!\n"
+msgstr "选中的块不能应用到索引!\n"
+
+#: git-add--interactive.perl:1264
+msgid "Apply them to the worktree anyway? "
+msgstr "无论如何都要应用到工作区么?"
+
+#: git-add--interactive.perl:1267
+msgid "Nothing was applied.\n"
+msgstr "未应用。\n"
+
+#: git-add--interactive.perl:1278
+#, perl-format
+msgid "ignoring unmerged: %s\n"
+msgstr "忽略未合入的:%s\n"
+
+#: git-add--interactive.perl:1287
+msgid "Only binary files changed.\n"
+msgstr "只有二进制文件被修改。\n"
+
+#: git-add--interactive.perl:1289
+msgid "No changes.\n"
+msgstr "没有修改。\n"
+
+#: git-add--interactive.perl:1297
+msgid "Patch update"
+msgstr "补丁更新"
+
+#: git-add--interactive.perl:1349
+#, perl-format
+msgid "Stage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "暂存状态修改 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1350
+#, perl-format
+msgid "Stage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "暂存状态删除 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1351
+#, perl-format
+msgid "Stage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "暂存该块 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1354
+#, perl-format
+msgid "Stash mode change [y,n,q,a,d,/%s,?]? "
+msgstr "贮藏状态修改 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1355
+#, perl-format
+msgid "Stash deletion [y,n,q,a,d,/%s,?]? "
+msgstr "贮藏状态删除 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1356
+#, perl-format
+msgid "Stash this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "贮藏该块 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1359
+#, perl-format
+msgid "Unstage mode change [y,n,q,a,d,/%s,?]? "
+msgstr "未暂存状态修改 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1360
+#, perl-format
+msgid "Unstage deletion [y,n,q,a,d,/%s,?]? "
+msgstr "未暂存状态删除 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1361
+#, perl-format
+msgid "Unstage this hunk [y,n,q,a,d,/%s,?]? "
+msgstr "不暂存该块 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1364
+#, perl-format
+msgid "Apply mode change to index [y,n,q,a,d,/%s,?]? "
+msgstr "修改索引中的应用状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1365
+#, perl-format
+msgid "Apply deletion to index [y,n,q,a,d,/%s,?]? "
+msgstr "从索引中删除应用状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1366
+#, perl-format
+msgid "Apply this hunk to index [y,n,q,a,d,/%s,?]? "
+msgstr "将此块应用到索引 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1369
+#, perl-format
+msgid "Discard mode change from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "修改工作区中的丢弃状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1370
+#, perl-format
+msgid "Discard deletion from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "从工作区中删除丢弃状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1371
+#, perl-format
+msgid "Discard this hunk from worktree [y,n,q,a,d,/%s,?]? "
+msgstr "从工作区中丢弃该块 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1374
+#, perl-format
+msgid "Discard mode change from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "修改索引和工作区中的丢弃状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1375
+#, perl-format
+msgid "Discard deletion from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "从索引和工作区中删除丢弃状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1376
+#, perl-format
+msgid "Discard this hunk from index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "从索引和工作区中丢弃该块 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1379
+#, perl-format
+msgid "Apply mode change to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "修改索引和工作区中的应用状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1380
+#, perl-format
+msgid "Apply deletion to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "从索引和工作区中删除应用状态 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1381
+#, perl-format
+msgid "Apply this hunk to index and worktree [y,n,q,a,d,/%s,?]? "
+msgstr "在索引和工作区中应用该块 [y,n,q,a,d,/%s,?]? "
+
+#: git-add--interactive.perl:1484
+msgid "go to which hunk (<ret> to see more)? "
+msgstr "跳转到哪个块(<回车> 查看更多)? "
+
+#: git-add--interactive.perl:1486
+msgid "go to which hunk? "
+msgstr "跳转到哪个块?"
+
+#: git-add--interactive.perl:1495
+#, perl-format
+msgid "Invalid number: '%s'\n"
+msgstr "无效数字:'%s'\n"
+
+#: git-add--interactive.perl:1500
+#, perl-format
+msgid "Sorry, only %d hunk available.\n"
+msgid_plural "Sorry, only %d hunks available.\n"
+msgstr[0] "对不起,只有 %d 个可用块。\n"
+msgstr[1] "对不起,只有 %d 个可用块。\n"
+
+#: git-add--interactive.perl:1526
+msgid "search for regex? "
+msgstr "使用正则表达式搜索?"
+
+#: git-add--interactive.perl:1539
+#, perl-format
+msgid "Malformed search regexp %s: %s\n"
+msgstr "错误的正则表达式 %s:%s\n"
+
+#: git-add--interactive.perl:1549
+msgid "No hunk matches the given pattern\n"
+msgstr "没有和给定模式相匹配的快\n"
+
+#: git-add--interactive.perl:1561 git-add--interactive.perl:1583
+msgid "No previous hunk\n"
+msgstr "没有前一个块\n"
+
+#: git-add--interactive.perl:1570 git-add--interactive.perl:1589
+msgid "No next hunk\n"
+msgstr "没有下一个块\n"
+
+#: git-add--interactive.perl:1597
+#, perl-format
+msgid "Split into %d hunk.\n"
+msgid_plural "Split into %d hunks.\n"
+msgstr[0] "拆分为 %d 块。\n"
+msgstr[1] "拆分为 %d 块。\n"
+
+#: git-add--interactive.perl:1649
+msgid "Review diff"
+msgstr "检视 diff"
+
+#. TRANSLATORS: please do not translate the command names
+#. 'status', 'update', 'revert', etc.
+#: git-add--interactive.perl:1668
+msgid ""
+"status        - show paths with changes\n"
+"update        - add working tree state to the staged set of changes\n"
+"revert        - revert staged set of changes back to the HEAD version\n"
+"patch         - pick hunks and update selectively\n"
+"diff          - view diff between HEAD and index\n"
+"add untracked - add contents of untracked files to the staged set of "
+"changes\n"
+msgstr ""
+"status        - 显示含变更的路径\n"
+"update        - 添加工作区状态至暂存列表\n"
+"revert        - 还原修改的暂存集至 HEAD 版本\n"
+"patch         - 挑选块并且有选择地更新\n"
+"diff          - 显示 HEAD 和索引间差异\n"
+"add untracked - 添加未跟踪文件的内容至暂存列表\n"
+
+#: git-add--interactive.perl:1685 git-add--interactive.perl:1690
+#: git-add--interactive.perl:1693 git-add--interactive.perl:1700
+#: git-add--interactive.perl:1704 git-add--interactive.perl:1710
+msgid "missing --"
+msgstr "缺失 --"
+
+#: git-add--interactive.perl:1706
+#, perl-format
+msgid "unknown --patch mode: %s"
+msgstr "未知的 --patch 模式:%s"
+
+#: git-add--interactive.perl:1712 git-add--interactive.perl:1718
+#, perl-format
+msgid "invalid argument %s, expecting --"
+msgstr "无效的参数 %s,期望是 --"
+
+#: git-send-email.perl:121
+msgid "local zone differs from GMT by a non-minute interval\n"
+msgstr "本地时间和 GMT 有不到一分钟间隔\n"
+
+#: git-send-email.perl:128 git-send-email.perl:134
+msgid "local time offset greater than or equal to 24 hours\n"
+msgstr "本地时间偏移量大于等于 24 小时\n"
+
+#: git-send-email.perl:202 git-send-email.perl:208
+msgid "the editor exited uncleanly, aborting everything"
+msgstr "编辑器非正常退出,终止所有操作"
+
+#: git-send-email.perl:282
+#, perl-format
+msgid ""
+"'%s' contains an intermediate version of the email you were composing.\n"
+msgstr "'%s' 包含您正在编写的一个中间版本的邮件。\n"
+
+#: git-send-email.perl:287
+#, perl-format
+msgid "'%s.final' contains the composed email.\n"
+msgstr "'%s.final' 包含编辑的邮件。\n"
+
+#: git-send-email.perl:305
+msgid "--dump-aliases incompatible with other options\n"
+msgstr "--dump-aliases 和其它选项不兼容\n"
+
+#: git-send-email.perl:368 git-send-email.perl:623
+msgid "Cannot run git format-patch from outside a repository\n"
+msgstr "不能在仓库之外运行 git format-patch\n"
+
+#: git-send-email.perl:437
+#, perl-format
+msgid "Unknown --suppress-cc field: '%s'\n"
+msgstr "未知的 --suppress-cc 字段:'%s'\n"
+
+#: git-send-email.perl:466
+#, perl-format
+msgid "Unknown --confirm setting: '%s'\n"
+msgstr "未知的 --confirm 设置:'%s'\n"
+
+#: git-send-email.perl:498
+#, perl-format
+msgid "warning: sendmail alias with quotes is not supported: %s\n"
+msgstr "警告:不支持带引号的 sendmail 别名:%s\n"
+
+#: git-send-email.perl:500
+#, perl-format
+msgid "warning: `:include:` not supported: %s\n"
+msgstr "警告:不支持 `:include:`:%s\n"
+
+#: git-send-email.perl:502
+#, perl-format
+msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
+msgstr "警告:不支持 `/file` 或 `|pipe` 重定向:%s\n"
+
+#: git-send-email.perl:507
+#, perl-format
+msgid "warning: sendmail line is not recognized: %s\n"
+msgstr "警告:不能识别的 sendmail 行:%s\n"
+
+#: git-send-email.perl:589
+#, perl-format
+msgid ""
+"File '%s' exists but it could also be the range of commits\n"
+"to produce patches for.  Please disambiguate by...\n"
+"\n"
+"    * Saying \"./%s\" if you mean a file; or\n"
+"    * Giving --format-patch option if you mean a range.\n"
+msgstr ""
+"存在文件 '%s' 但是它也可能是一个用于产生补丁列表的提交范围。请用如下方法消除"
+"歧义:\n"
+"\n"
+"    * 如果含义为一个文件,使用 \"./%s\",或者\n"
+"    * 如果含义为一个范围,使用 --format-patch 选项。\n"
+
+#: git-send-email.perl:610
+#, perl-format
+msgid "Failed to opendir %s: %s"
+msgstr "无法打开目录 %s: %s"
+
+#: git-send-email.perl:634
+#, perl-format
+msgid ""
+"fatal: %s: %s\n"
+"warning: no patches were sent\n"
+msgstr ""
+"严重:%s:%s\n"
+"警告:补丁未能发送\n"
+
+#: git-send-email.perl:645
+msgid ""
+"\n"
+"No patch files specified!\n"
+"\n"
+msgstr ""
+"\n"
+"未指定补丁文件!\n"
+"\n"
+
+#: git-send-email.perl:658
+#, perl-format
+msgid "No subject line in %s?"
+msgstr "在 %s 中没有标题行?"
+
+#: git-send-email.perl:668
+#, perl-format
+msgid "Failed to open for writing %s: %s"
+msgstr "无法写入 %s: %s"
+
+#: git-send-email.perl:678
+msgid ""
+"Lines beginning in \"GIT:\" will be removed.\n"
+"Consider including an overall diffstat or table of contents\n"
+"for the patch you are writing.\n"
+"\n"
+"Clear the body content if you don't wish to send a summary.\n"
+msgstr ""
+"以 \"GIT:\" 开头的行将被删除。\n"
+"考虑包含一个整体的 diffstat 或者您正在写的补丁的目录。\n"
+"\n"
+"如果您不想发送摘要,清除内容。\n"
+
+#: git-send-email.perl:701
+#, perl-format
+msgid "Failed to open %s.final: %s"
+msgstr "无法打开 %s.final: %s"
+
+#: git-send-email.perl:704
+#, perl-format
+msgid "Failed to open %s: %s"
+msgstr "无法打开 %s: %s"
+
+#: git-send-email.perl:739
+msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
+msgstr "To/Cc/Bcc 字段不解析,它们被忽略\n"
+
+#: git-send-email.perl:748
+msgid "Summary email is empty, skipping it\n"
+msgstr "摘要邮件为空,跳过\n"
+
+#. TRANSLATORS: please keep [y/N] as is.
+#: git-send-email.perl:780
+#, perl-format
+msgid "Are you sure you want to use <%s> [y/N]? "
+msgstr "您确认要使用 <%s> [y/N]?"
+
+#: git-send-email.perl:809
+msgid ""
+"The following files are 8bit, but do not declare a Content-Transfer-"
+"Encoding.\n"
+msgstr "如下文件含 8bit 内容,但没有声明一个 Content-Transfer-Encoding。\n"
+
+#: git-send-email.perl:814
+msgid "Which 8bit encoding should I declare [UTF-8]? "
+msgstr "要声明 8bit 为什么样的编码格式 [UTF-8]?"
+
+#: git-send-email.perl:822
+#, perl-format
+msgid ""
+"Refusing to send because the patch\n"
+"\t%s\n"
+"has the template subject '*** SUBJECT HERE ***'. Pass --force if you really "
+"want to send.\n"
+msgstr ""
+"拒绝发送,因为补丁\n"
+"\t%s\n"
+"包含模版标题 '*** SUBJECT HERE ***'。如果确实想要发送,使用参数 --force。\n"
+
+#: git-send-email.perl:841
+msgid "To whom should the emails be sent (if anyone)?"
+msgstr "邮件将要发送给谁?"
+
+#: git-send-email.perl:859
+#, perl-format
+msgid "fatal: alias '%s' expands to itself\n"
+msgstr "严重:别名 '%s' 扩展为它自己\n"
+
+#: git-send-email.perl:871
+msgid "Message-ID to be used as In-Reply-To for the first email (if any)? "
+msgstr "Message-ID 被用作第一封邮件的 In-Reply-To ?"
+
+#: git-send-email.perl:921 git-send-email.perl:929
+#, perl-format
+msgid "error: unable to extract a valid address from: %s\n"
+msgstr "错误:不能从 %s 中提取一个有效的邮件地址\n"
+
+#. TRANSLATORS: Make sure to include [q] [d] [e] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:933
+msgid "What to do with this address? ([q]uit|[d]rop|[e]dit): "
+msgstr "如何处理这个地址?([q]uit|[d]rop|[e]dit):"
+
+#: git-send-email.perl:1234
+#, perl-format
+msgid "CA path \"%s\" does not exist"
+msgstr "CA 路径 \"%s\" 不存在"
+
+#: git-send-email.perl:1309
+msgid ""
+"    The Cc list above has been expanded by additional\n"
+"    addresses found in the patch commit message. By default\n"
+"    send-email prompts before sending whenever this occurs.\n"
+"    This behavior is controlled by the sendemail.confirm\n"
+"    configuration setting.\n"
+"\n"
+"    For additional information, run 'git send-email --help'.\n"
+"    To retain the current behavior, but squelch this message,\n"
+"    run 'git config --global sendemail.confirm auto'.\n"
+"\n"
+msgstr ""
+"    以上的抄送列表(Cc)已经用补丁提交信息中发现的地址进行\n"
+"    了扩展。缺省 send-email 会给出提示。这个行为可以通过\n"
+"    sendemail.confirm 配置设置。\n"
+"\n"
+"    更多信息,执行 'git send-email --help'。\n"
+"    要保持当前行为,但不显示此信息,运行 'git config --global\n"
+"    sendemail.confirm auto'。\n"
+"\n"
+
+#. TRANSLATORS: Make sure to include [y] [n] [q] [a] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-send-email.perl:1324
+msgid "Send this email? ([y]es|[n]o|[q]uit|[a]ll): "
+msgstr "发送邮件?([y]es|[n]o|[q]uit|[a]ll):"
+
+#: git-send-email.perl:1327
+msgid "Send this email reply required"
+msgstr "发送要求的邮件回复"
+
+#: git-send-email.perl:1353
+msgid "The required SMTP server is not properly defined."
+msgstr "要求的 SMTP 服务器未被正确定义。"
+
+#: git-send-email.perl:1397
+#, perl-format
+msgid "Server does not support STARTTLS! %s"
+msgstr "服务器不支持 STARTTLS!%s"
+
+#: git-send-email.perl:1403
+msgid "Unable to initialize SMTP properly. Check config and use --smtp-debug."
+msgstr "无法正确地初始化 SMTP。检查配置并使用 --smtp-debug。"
+
+#: git-send-email.perl:1421
+#, perl-format
+msgid "Failed to send %s\n"
+msgstr "无法发送 %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Dry-Sent %s\n"
+msgstr "演习发送 %s\n"
+
+#: git-send-email.perl:1424
+#, perl-format
+msgid "Sent %s\n"
+msgstr "正发送 %s\n"
+
+#: git-send-email.perl:1426
+msgid "Dry-OK. Log says:\n"
+msgstr "演习成功。日志说:\n"
+
+#: git-send-email.perl:1426
+msgid "OK. Log says:\n"
+msgstr "OK。日志说:\n"
+
+#: git-send-email.perl:1438
+msgid "Result: "
+msgstr "结果:"
+
+#: git-send-email.perl:1441
+msgid "Result: OK\n"
+msgstr "结果:OK\n"
+
+#: git-send-email.perl:1454
+#, perl-format
+msgid "can't open file %s"
+msgstr "无法打开文件 %s"
+
+#: git-send-email.perl:1501 git-send-email.perl:1521
+#, perl-format
+msgid "(mbox) Adding cc: %s from line '%s'\n"
+msgstr "(mbox) 添加 cc:%s 自行 '%s'\n"
+
+#: git-send-email.perl:1507
+#, perl-format
+msgid "(mbox) Adding to: %s from line '%s'\n"
+msgstr "(mbox) 添加 to:%s 自行 '%s'\n"
+
+#: git-send-email.perl:1555
+#, perl-format
+msgid "(non-mbox) Adding cc: %s from line '%s'\n"
+msgstr "(non-mbox) 添加 cc:%s 自行 '%s'\n"
+
+#: git-send-email.perl:1578
+#, perl-format
+msgid "(body) Adding cc: %s from line '%s'\n"
+msgstr "(body) 添加 cc: %s 自行 '%s'\n"
+
+#: git-send-email.perl:1676
+#, perl-format
+msgid "(%s) Could not execute '%s'"
+msgstr "(%s) 不能执行 '%s'"
+
+#: git-send-email.perl:1683
+#, perl-format
+msgid "(%s) Adding %s: %s from: '%s'\n"
+msgstr "(%s) 添加 %s: %s 自:'%s'\n"
+
+#: git-send-email.perl:1687
+#, perl-format
+msgid "(%s) failed to close pipe to '%s'"
+msgstr "(%s) 无法关闭管道至 '%s'"
+
+#: git-send-email.perl:1714
+msgid "cannot send message as 7bit"
+msgstr "不能以 7bit 形式发送信息"
+
+#: git-send-email.perl:1722
+msgid "invalid transfer encoding"
+msgstr "无效的传送编码"
+
+#: git-send-email.perl:1741 git-send-email.perl:1792 git-send-email.perl:1802
+#, perl-format
+msgid "unable to open %s: %s\n"
+msgstr "不能打开 %s:%s\n"
+
+#: git-send-email.perl:1744
+#, perl-format
+msgid "%s: patch contains a line longer than 998 characters"
+msgstr "%s:补丁包含一个超过 998 字符的行"
+
+#: git-send-email.perl:1760
+#, perl-format
+msgid "Skipping %s with backup suffix '%s'.\n"
+msgstr "略过 %s 含备份后缀 '%s'。\n"
+
+#. TRANSLATORS: please keep "[y|N]" as is.
+#: git-send-email.perl:1764
+#, perl-format
+msgid "Do you really want to send %s? [y|N]: "
+msgstr "您真的要发送 %s?[y|N]:"
+
+#~ msgid "tag: tagging "
+#~ msgstr "tag: tagging "
+
+#~ msgid "object of unknown type"
+#~ msgstr "未知类型的对象"
+
+#~ msgid "commit object"
+#~ msgstr "提交对象"
+
+#~ msgid "tree object"
+#~ msgstr "树对象"
+
+#~ msgid "blob object"
+#~ msgstr "数据对象"
+
+#~ msgid "other tag object"
+#~ msgstr "其它标签对象"
+
+#~ msgid ""
+#~ "There is nothing to exclude from by :(exclude) patterns.\n"
+#~ "Perhaps you forgot to add either ':/' or '.' ?"
+#~ msgstr ""
+#~ "没有为 :(exclude) 模式提供要忽略的内容。也许您忘记了\n"
+#~ "添加 ':/' 或 '.' ?"
+
+#~ msgid "unrecognized format: %%(%s)"
+#~ msgstr "未能识别的格式:%%(%s)"
+
+#~ msgid ":strip= requires a positive integer argument"
+#~ msgstr ":strip= 需要一个正整型参数"
+
+#~ msgid "ref '%s' does not have %ld components to :strip"
+#~ msgstr "引用 '%s' 未提供用于 :strip 的 %ld 个组件"
+
+#~ msgid "unknown %.*s format %s"
+#~ msgstr "未知的 %.*s 格式 %s"
+
+#~ msgid "[%s: gone]"
+#~ msgstr "[%s: 丢失]"
+
+#~ msgid "[%s]"
+#~ msgstr "[%s]"
+
+#~ msgid "[%s: behind %d]"
+#~ msgstr "[%s:落后 %d]"
+
+#~ msgid "[%s: ahead %d]"
+#~ msgstr "[%s:领先 %d]"
+
+#~ msgid "[%s: ahead %d, behind %d]"
+#~ msgstr "[%s:领先 %d,落后 %d]"
+
+#~ msgid " **** invalid ref ****"
+#~ msgstr " **** 无效引用 ****"
+
+#~ msgid "insanely long object directory %.*s"
+#~ msgstr "不正常的长对象目录 %.*s"
+
+#~ msgid "git merge [<options>] <msg> HEAD <commit>"
+#~ msgstr "git merge [<选项>] <说明> HEAD <提交>"
+
+#~ msgid "'%s' is not a commit"
+#~ msgstr "'%s' 不是一个提交"
+
+#~ msgid "cannot open file '%s'"
+#~ msgstr "无法打开文件 '%s'"
+
+#~ msgid "could not close file %s"
+#~ msgstr "无法关闭文件 %s"
+
+#~ msgid "tag name too long: %.*s..."
+#~ msgstr "标签名称太长:%.*s..."
+
+#~ msgid "tag header too big."
+#~ msgstr "标签头信息太大。"
+
+#~ msgid ""
+#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "marked for discarding"
+#~ msgstr "如果补丁能干净地应用,编辑块将立即标记为丢弃"
+
+#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
+#~ msgstr "使用一个试验性的基于空行的启发式算法改进差异显示"
+
+#~ msgid "Clever... amending the last one with dirty index."
+#~ msgstr "聪明... 用脏索引修补最后一个提交。"
+
+#~ msgid ""
+#~ "the following submodule (or one of its nested submodules)\n"
+#~ "uses a .git directory:"
+#~ msgid_plural ""
+#~ "the following submodules (or one of their nested submodules)\n"
+#~ "use a .git directory:"
+#~ msgstr[0] "以下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
+#~ msgstr[1] "以下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
+
+#~ msgid ""
+#~ "\n"
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "\n"
+#~ "(使用 'rm -rf' 命令如果您真的想删除它及其全部历史)"
+
+#~ msgid "Could not write to %s"
+#~ msgstr "不能写入 %s"
+
+#~ msgid "Error wrapping up %s."
+#~ msgstr "错误收尾 %s。"
+
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "您的本地修改将被拣选操作覆盖。"
+
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "不能在回退中执行另一回退。"
+
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr "不能在拣选过程中执行另一拣选。"
+
+#~ msgid "Could not parse line %d."
+#~ msgstr "不能解析第 %d 行。"
+
+#~ msgid "Could not open %s"
+#~ msgstr "不能打开 %s"
+
+#~ msgid "Could not read %s."
+#~ msgstr "不能读取 %s。"
+
+#~ msgid "Could not format %s."
+#~ msgstr "不能格式化 %s。"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s:%s"
+
+#~ msgid "cannot open %s: %s"
+#~ msgstr "不能打开 %s:%s"
+
+#~ msgid "You need to set your committer info first"
+#~ msgstr "您需要先设置您的提交者信息"
index c1fe3a3ef9cba0c155d02475e24315784bd27ae4..70a4c808783bab92b4b6319e3dbd8e16641b1918 100644 (file)
@@ -53,6 +53,8 @@ static void *preload_thread(void *_data)
                        continue;
                if (ce_uptodate(ce))
                        continue;
+               if (ce_skip_worktree(ce))
+                       continue;
                if (!ce_path_match(ce, &p->pathspec, NULL))
                        continue;
                if (threaded_has_symlink_leading_path(&cache, ce->name, ce_namelen(ce)))
index 0c3149524059bd46c3c6d70bd774df0aaa65f976..6cc812c2c72c2281299c44fd81376441bb16a0ec 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -10,6 +10,7 @@
 #include "color.h"
 #include "reflog-walk.h"
 #include "gpg-interface.h"
+#include "trailer.h"
 
 static char *user_format;
 static struct cmt_fmt_map {
@@ -782,29 +783,9 @@ struct format_commit_context {
        size_t body_off;
 
        /* The following ones are relative to the result struct strbuf. */
-       struct chunk abbrev_commit_hash;
-       struct chunk abbrev_tree_hash;
-       struct chunk abbrev_parent_hashes;
        size_t wrap_start;
 };
 
-static int add_again(struct strbuf *sb, struct chunk *chunk)
-{
-       if (chunk->len) {
-               strbuf_adddup(sb, chunk->off, chunk->len);
-               return 1;
-       }
-
-       /*
-        * We haven't seen this chunk before.  Our caller is surely
-        * going to add it the hard way now.  Remember the most likely
-        * start of the to-be-added chunk: the current end of the
-        * struct strbuf.
-        */
-       chunk->off = sb->len;
-       return 0;
-}
-
 static void parse_commit_header(struct format_commit_context *context)
 {
        const char *msg = context->message;
@@ -889,6 +870,16 @@ const char *format_subject(struct strbuf *sb, const char *msg,
        return msg;
 }
 
+static void format_trailers(struct strbuf *sb, const char *msg)
+{
+       struct trailer_info info;
+
+       trailer_info_get(&info, msg);
+       strbuf_add(sb, info.trailer_start,
+                  info.trailer_end - info.trailer_start);
+       trailer_info_release(&info);
+}
+
 static void parse_commit_message(struct format_commit_context *c)
 {
        const char *msg = c->message + c->message_off;
@@ -1136,24 +1127,16 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                return 1;
        case 'h':               /* abbreviated commit hash */
                strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_COMMIT));
-               if (add_again(sb, &c->abbrev_commit_hash)) {
-                       strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
-                       return 1;
-               }
                strbuf_add_unique_abbrev(sb, commit->object.oid.hash,
                                         c->pretty_ctx->abbrev);
                strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
-               c->abbrev_commit_hash.len = sb->len - c->abbrev_commit_hash.off;
                return 1;
        case 'T':               /* tree hash */
                strbuf_addstr(sb, oid_to_hex(&commit->tree->object.oid));
                return 1;
        case 't':               /* abbreviated tree hash */
-               if (add_again(sb, &c->abbrev_tree_hash))
-                       return 1;
                strbuf_add_unique_abbrev(sb, commit->tree->object.oid.hash,
                                         c->pretty_ctx->abbrev);
-               c->abbrev_tree_hash.len = sb->len - c->abbrev_tree_hash.off;
                return 1;
        case 'P':               /* parent hashes */
                for (p = commit->parents; p; p = p->next) {
@@ -1163,16 +1146,12 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                }
                return 1;
        case 'p':               /* abbreviated parent hashes */
-               if (add_again(sb, &c->abbrev_parent_hashes))
-                       return 1;
                for (p = commit->parents; p; p = p->next) {
                        if (p != commit->parents)
                                strbuf_addch(sb, ' ');
                        strbuf_add_unique_abbrev(sb, p->item->object.oid.hash,
                                                 c->pretty_ctx->abbrev);
                }
-               c->abbrev_parent_hashes.len = sb->len -
-                                             c->abbrev_parent_hashes.off;
                return 1;
        case 'm':               /* left/right/bottom */
                strbuf_addstr(sb, get_revision_mark(NULL, commit));
@@ -1230,8 +1209,12 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                        switch (c->signature_check.result) {
                        case 'G':
                        case 'B':
+                       case 'E':
                        case 'U':
                        case 'N':
+                       case 'X':
+                       case 'Y':
+                       case 'R':
                                strbuf_addch(sb, c->signature_check.result);
                        }
                        break;
@@ -1288,6 +1271,12 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                strbuf_addstr(sb, msg + c->body_off);
                return 1;
        }
+
+       if (starts_with(placeholder, "(trailers)")) {
+               format_trailers(sb, msg + c->subject_off);
+               return strlen("(trailers)");
+       }
+
        return 0;       /* unknown placeholder */
 }
 
@@ -1586,8 +1575,9 @@ void pp_title_line(struct pretty_print_context *pp,
                                pp->preserve_subject ? "\n" : " ");
 
        strbuf_grow(sb, title.len + 1024);
-       if (pp->subject) {
-               strbuf_addstr(sb, pp->subject);
+       if (pp->print_email_subject) {
+               if (pp->rev)
+                       fmt_output_email_subject(sb, pp->rev);
                if (needs_rfc2047_encoding(title.buf, title.len, RFC2047_SUBJECT))
                        add_rfc2047(sb, title.buf, title.len,
                                                encoding, RFC2047_SUBJECT);
@@ -1797,7 +1787,7 @@ void pretty_print_commit(struct pretty_print_context *pp,
        }
 
        pp_header(pp, encoding, commit, &msg, sb);
-       if (pp->fmt != CMIT_FMT_ONELINE && !pp->subject) {
+       if (pp->fmt != CMIT_FMT_ONELINE && !pp->print_email_subject) {
                strbuf_addch(sb, '\n');
        }
 
index e4365b00d6c3366e6753fc6da3fe1a165ab1222d..fc3860fdcb9fc50d4d883e1a8638cca474cfb8d0 100644 (file)
@@ -12,9 +12,7 @@ static inline int compare(struct prio_queue *queue, int i, int j)
 
 static inline void swap(struct prio_queue *queue, int i, int j)
 {
-       struct prio_queue_entry tmp = queue->array[i];
-       queue->array[i] = queue->array[j];
-       queue->array[j] = tmp;
+       SWAP(queue->array[i], queue->array[j]);
 }
 
 void prio_queue_reverse(struct prio_queue *queue)
@@ -23,7 +21,7 @@ void prio_queue_reverse(struct prio_queue *queue)
 
        if (queue->compare != NULL)
                die("BUG: prio_queue_reverse() on non-LIFO queue");
-       for (i = 0; i <= (j = (queue->nr - 1) - i); i++)
+       for (i = 0; i < (j = (queue->nr - 1) - i); i++)
                swap(queue, i, j);
 }
 
index 76a88c573f7895bbf388ab4335faa1b86c3975d3..29378caa05336efe15cdf2a9473ca6cbe2bcfa14 100644 (file)
@@ -243,21 +243,18 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
        *p_progress = NULL;
        if (progress->last_value != -1) {
                /* Force the last update */
-               char buf[128], *bufp;
-               size_t len = strlen(msg) + 5;
+               char *buf;
                struct throughput *tp = progress->throughput;
 
-               bufp = (len < sizeof(buf)) ? buf : xmallocz(len);
                if (tp) {
                        unsigned int rate = !tp->avg_misecs ? 0 :
                                        tp->avg_bytes / tp->avg_misecs;
                        throughput_string(&tp->display, tp->curr_total, rate);
                }
                progress_update = 1;
-               xsnprintf(bufp, len + 1, ", %s.\n", msg);
-               display(progress, progress->last_value, bufp);
-               if (buf != bufp)
-                       free(bufp);
+               buf = xstrfmt(", %s.\n", msg);
+               display(progress, progress->last_value, buf);
+               free(buf);
        }
        clear_progress_signal();
        if (progress->throughput)
index d0199cace4aa0ab22a46fdb5ac2777c4e7e6153b..a8a979bd4fcbac6732d26dda3f826a1eec3d3a6b 100644 (file)
@@ -58,7 +58,7 @@ struct recent_data {
        unsigned long timestamp;
 };
 
-static void add_recent_object(const unsigned char *sha1,
+static void add_recent_object(const struct object_id *oid,
                              unsigned long mtime,
                              struct recent_data *data)
 {
@@ -75,37 +75,37 @@ static void add_recent_object(const unsigned char *sha1,
         * later processing, and the revision machinery expects
         * commits and tags to have been parsed.
         */
-       type = sha1_object_info(sha1, NULL);
+       type = sha1_object_info(oid->hash, NULL);
        if (type < 0)
-               die("unable to get object info for %s", sha1_to_hex(sha1));
+               die("unable to get object info for %s", oid_to_hex(oid));
 
        switch (type) {
        case OBJ_TAG:
        case OBJ_COMMIT:
-               obj = parse_object_or_die(sha1, NULL);
+               obj = parse_object_or_die(oid->hash, NULL);
                break;
        case OBJ_TREE:
-               obj = (struct object *)lookup_tree(sha1);
+               obj = (struct object *)lookup_tree(oid->hash);
                break;
        case OBJ_BLOB:
-               obj = (struct object *)lookup_blob(sha1);
+               obj = (struct object *)lookup_blob(oid->hash);
                break;
        default:
                die("unknown object type for %s: %s",
-                   sha1_to_hex(sha1), typename(type));
+                   oid_to_hex(oid), typename(type));
        }
 
        if (!obj)
-               die("unable to lookup %s", sha1_to_hex(sha1));
+               die("unable to lookup %s", oid_to_hex(oid));
 
        add_pending_object(data->revs, obj, "");
 }
 
-static int add_recent_loose(const unsigned char *sha1,
+static int add_recent_loose(const struct object_id *oid,
                            const char *path, void *data)
 {
        struct stat st;
-       struct object *obj = lookup_object(sha1);
+       struct object *obj = lookup_object(oid->hash);
 
        if (obj && obj->flags & SEEN)
                return 0;
@@ -119,22 +119,22 @@ static int add_recent_loose(const unsigned char *sha1,
                 */
                if (errno == ENOENT)
                        return 0;
-               return error_errno("unable to stat %s", sha1_to_hex(sha1));
+               return error_errno("unable to stat %s", oid_to_hex(oid));
        }
 
-       add_recent_object(sha1, st.st_mtime, data);
+       add_recent_object(oid, st.st_mtime, data);
        return 0;
 }
 
-static int add_recent_packed(const unsigned char *sha1,
+static int add_recent_packed(const struct object_id *oid,
                             struct packed_git *p, uint32_t pos,
                             void *data)
 {
-       struct object *obj = lookup_object(sha1);
+       struct object *obj = lookup_object(oid->hash);
 
        if (obj && obj->flags & SEEN)
                return 0;
-       add_recent_object(sha1, p->mtime, data);
+       add_recent_object(oid, p->mtime, data);
        return 0;
 }
 
index 248432af430d7e5b147898b2ac61f2ebbb468070..f12da0dbb8b95fe234b07fcd536d794a1c6b5390 100644 (file)
@@ -156,12 +156,12 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st)
 static int ce_compare_data(const struct cache_entry *ce, struct stat *st)
 {
        int match = -1;
-       int fd = open(ce->name, O_RDONLY);
+       int fd = git_open_cloexec(ce->name, O_RDONLY);
 
        if (fd >= 0) {
                unsigned char sha1[20];
                if (!index_fd(sha1, fd, st, OBJ_BLOB, ce->name, 0))
-                       match = hashcmp(sha1, ce->sha1);
+                       match = hashcmp(sha1, ce->oid.hash);
                /* index_fd() closed the file descriptor already */
        }
        return match;
@@ -178,7 +178,7 @@ static int ce_compare_link(const struct cache_entry *ce, size_t expected_size)
        if (strbuf_readlink(&sb, ce->name, expected_size))
                return -1;
 
-       buffer = read_sha1_file(ce->sha1, &type, &size);
+       buffer = read_sha1_file(ce->oid.hash, &type, &size);
        if (buffer) {
                if (size == sb.len)
                        match = memcmp(buffer, sb.buf, size);
@@ -202,7 +202,7 @@ static int ce_compare_gitlink(const struct cache_entry *ce)
         */
        if (resolve_gitlink_ref(ce->name, "HEAD", sha1) < 0)
                return 0;
-       return hashcmp(sha1, ce->sha1);
+       return hashcmp(sha1, ce->oid.hash);
 }
 
 static int ce_modified_check_fs(const struct cache_entry *ce, struct stat *st)
@@ -262,7 +262,7 @@ static int ce_match_stat_basic(const struct cache_entry *ce, struct stat *st)
 
        /* Racily smudged entry? */
        if (!ce->ce_stat_data.sd_size) {
-               if (!is_empty_blob_sha1(ce->sha1))
+               if (!is_empty_blob_sha1(ce->oid.hash))
                        changed |= DATA_CHANGED;
        }
 
@@ -503,7 +503,6 @@ int index_name_pos(const struct index_state *istate, const char *name, int namel
        return index_name_stage_pos(istate, name, namelen, 0);
 }
 
-/* Remove entry, return true if there are more entries to go.. */
 int remove_index_entry_at(struct index_state *istate, int pos)
 {
        struct cache_entry *ce = istate->cache[pos];
@@ -624,7 +623,7 @@ void set_object_name_for_intent_to_add_entry(struct cache_entry *ce)
        unsigned char sha1[20];
        if (write_sha1_file("", 0, blob_type, sha1))
                die("cannot create an empty blob in the object database");
-       hashcpy(ce->sha1, sha1);
+       hashcpy(ce->oid.hash, sha1);
 }
 
 int add_to_index(struct index_state *istate, const char *path, struct stat *st, int flags)
@@ -690,7 +689,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
                return 0;
        }
        if (!intent_only) {
-               if (index_path(ce->sha1, path, st, HASH_WRITE_OBJECT)) {
+               if (index_path(ce->oid.hash, path, st, HASH_WRITE_OBJECT)) {
                        free(ce);
                        return error("unable to index file %s", path);
                }
@@ -704,7 +703,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
        /* It was suspected to be racily clean, but it turns out to be Ok */
        was_same = (alias &&
                    !ce_stage(alias) &&
-                   !hashcmp(alias->sha1, ce->sha1) &&
+                   !oidcmp(&alias->oid, &ce->oid) &&
                    ce->ce_mode == alias->ce_mode);
 
        if (pretend)
@@ -742,7 +741,7 @@ struct cache_entry *make_cache_entry(unsigned int mode,
        size = cache_entry_size(len);
        ce = xcalloc(1, size);
 
-       hashcpy(ce->sha1, sha1);
+       hashcpy(ce->oid.hash, sha1);
        memcpy(ce->name, path, len);
        ce->ce_flags = create_ce_flags(stage);
        ce->ce_namelen = len;
@@ -888,9 +887,32 @@ static int has_file_name(struct index_state *istate,
        return retval;
 }
 
+
+/*
+ * Like strcmp(), but also return the offset of the first change.
+ * If strings are equal, return the length.
+ */
+int strcmp_offset(const char *s1, const char *s2, size_t *first_change)
+{
+       size_t k;
+
+       if (!first_change)
+               return strcmp(s1, s2);
+
+       for (k = 0; s1[k] == s2[k]; k++)
+               if (s1[k] == '\0')
+                       break;
+
+       *first_change = k;
+       return (unsigned char)s1[k] - (unsigned char)s2[k];
+}
+
 /*
  * Do we have another file with a pathname that is a proper
  * subset of the name we're trying to add?
+ *
+ * That is, is there another file in the index with a path
+ * that matches a sub-directory in the given entry?
  */
 static int has_dir_name(struct index_state *istate,
                        const struct cache_entry *ce, int pos, int ok_to_replace)
@@ -899,9 +921,51 @@ static int has_dir_name(struct index_state *istate,
        int stage = ce_stage(ce);
        const char *name = ce->name;
        const char *slash = name + ce_namelen(ce);
+       size_t len_eq_last;
+       int cmp_last = 0;
+
+       /*
+        * We are frequently called during an iteration on a sorted
+        * list of pathnames and while building a new index.  Therefore,
+        * there is a high probability that this entry will eventually
+        * be appended to the index, rather than inserted in the middle.
+        * If we can confirm that, we can avoid binary searches on the
+        * components of the pathname.
+        *
+        * Compare the entry's full path with the last path in the index.
+        */
+       if (istate->cache_nr > 0) {
+               cmp_last = strcmp_offset(name,
+                       istate->cache[istate->cache_nr - 1]->name,
+                       &len_eq_last);
+               if (cmp_last > 0) {
+                       if (len_eq_last == 0) {
+                               /*
+                                * The entry sorts AFTER the last one in the
+                                * index and their paths have no common prefix,
+                                * so there cannot be a F/D conflict.
+                                */
+                               return retval;
+                       } else {
+                               /*
+                                * The entry sorts AFTER the last one in the
+                                * index, but has a common prefix.  Fall through
+                                * to the loop below to disect the entry's path
+                                * and see where the difference is.
+                                */
+                       }
+               } else if (cmp_last == 0) {
+                       /*
+                        * The entry exactly matches the last one in the
+                        * index, but because of multiple stage and CE_REMOVE
+                        * items, we fall through and let the regular search
+                        * code handle it.
+                        */
+               }
+       }
 
        for (;;) {
-               int len;
+               size_t len;
 
                for (;;) {
                        if (*--slash == '/')
@@ -911,6 +975,67 @@ static int has_dir_name(struct index_state *istate,
                }
                len = slash - name;
 
+               if (cmp_last > 0) {
+                       /*
+                        * (len + 1) is a directory boundary (including
+                        * the trailing slash).  And since the loop is
+                        * decrementing "slash", the first iteration is
+                        * the longest directory prefix; subsequent
+                        * iterations consider parent directories.
+                        */
+
+                       if (len + 1 <= len_eq_last) {
+                               /*
+                                * The directory prefix (including the trailing
+                                * slash) also appears as a prefix in the last
+                                * entry, so the remainder cannot collide (because
+                                * strcmp said the whole path was greater).
+                                *
+                                * EQ: last: xxx/A
+                                *     this: xxx/B
+                                *
+                                * LT: last: xxx/file_A
+                                *     this: xxx/file_B
+                                */
+                               return retval;
+                       }
+
+                       if (len > len_eq_last) {
+                               /*
+                                * This part of the directory prefix (excluding
+                                * the trailing slash) is longer than the known
+                                * equal portions, so this sub-directory cannot
+                                * collide with a file.
+                                *
+                                * GT: last: xxxA
+                                *     this: xxxB/file
+                                */
+                               return retval;
+                       }
+
+                       if (istate->cache_nr > 0 &&
+                               ce_namelen(istate->cache[istate->cache_nr - 1]) > len) {
+                               /*
+                                * The directory prefix lines up with part of
+                                * a longer file or directory name, but sorts
+                                * after it, so this sub-directory cannot
+                                * collide with a file.
+                                *
+                                * last: xxx/yy-file (because '-' sorts before '/')
+                                * this: xxx/yy/abc
+                                */
+                               return retval;
+                       }
+
+                       /*
+                        * This is a possible collision. Fall through and
+                        * let the regular search code handle it.
+                        *
+                        * last: xxx
+                        * this: xxx/file
+                        */
+               }
+
                pos = index_name_stage_pos(istate, name, len, stage);
                if (pos >= 0) {
                        /*
@@ -1002,7 +1127,16 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
 
        if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
                cache_tree_invalidate_path(istate, ce->name);
-       pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce));
+
+       /*
+        * If this entry's path sorts after the last entry in the index,
+        * we can avoid searching for it.
+        */
+       if (istate->cache_nr > 0 &&
+               strcmp(ce->name, istate->cache[istate->cache_nr - 1]->name) > 0)
+               pos = -istate->cache_nr - 1;
+       else
+               pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce));
 
        /* existing match? Just replace it. */
        if (pos >= 0) {
@@ -1372,6 +1506,9 @@ struct ondisk_cache_entry_extended {
                            ondisk_cache_entry_extended_size(ce_namelen(ce)) : \
                            ondisk_cache_entry_size(ce_namelen(ce)))
 
+/* Allow fsck to force verification of the index checksum. */
+int verify_index_checksum;
+
 static int verify_hdr(struct cache_header *hdr, unsigned long size)
 {
        git_SHA_CTX c;
@@ -1383,6 +1520,10 @@ static int verify_hdr(struct cache_header *hdr, unsigned long size)
        hdr_version = ntohl(hdr->hdr_version);
        if (hdr_version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < hdr_version)
                return error("bad index version %d", hdr_version);
+
+       if (!verify_index_checksum)
+               return 0;
+
        git_SHA1_Init(&c);
        git_SHA1_Update(&c, hdr, size - 20);
        git_SHA1_Final(sha1, &c);
@@ -1418,12 +1559,9 @@ static int read_index_extension(struct index_state *istate,
        return 0;
 }
 
-int hold_locked_index(struct lock_file *lk, int die_on_error)
+int hold_locked_index(struct lock_file *lk, int lock_flags)
 {
-       return hold_lock_file_for_update(lk, get_index_file(),
-                                        die_on_error
-                                        ? LOCK_DIE_ON_ERROR
-                                        : 0);
+       return hold_lock_file_for_update(lk, get_index_file(), lock_flags);
 }
 
 int read_index(struct index_state *istate)
@@ -1451,7 +1589,7 @@ static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *on
        ce->ce_flags = flags & ~CE_NAMEMASK;
        ce->ce_namelen = len;
        ce->index = 0;
-       hashcpy(ce->sha1, ondisk->sha1);
+       hashcpy(ce->oid.hash, ondisk->sha1);
        memcpy(ce->name, name, len);
        ce->name[len] = '\0';
        return ce;
@@ -1562,10 +1700,27 @@ static void tweak_untracked_cache(struct index_state *istate)
        }
 }
 
+static void tweak_split_index(struct index_state *istate)
+{
+       switch (git_config_get_split_index()) {
+       case -1: /* unset: do nothing */
+               break;
+       case 0: /* false */
+               remove_split_index(istate);
+               break;
+       case 1: /* true */
+               add_split_index(istate);
+               break;
+       default: /* unknown value: do nothing */
+               break;
+       }
+}
+
 static void post_read_index_from(struct index_state *istate)
 {
        check_ce_order(istate);
        tweak_untracked_cache(istate);
+       tweak_split_index(istate);
 }
 
 /* remember to discard_cache() before reading a different cache! */
@@ -1661,10 +1816,26 @@ unmap:
        die("index file corrupt");
 }
 
+/*
+ * Signal that the shared index is used by updating its mtime.
+ *
+ * This way, shared index can be removed if they have not been used
+ * for some time.
+ */
+static void freshen_shared_index(char *base_sha1_hex, int warn)
+{
+       char *shared_index = git_pathdup("sharedindex.%s", base_sha1_hex);
+       if (!check_and_freshen_file(shared_index, 1) && warn)
+               warning("could not freshen shared index '%s'", shared_index);
+       free(shared_index);
+}
+
 int read_index_from(struct index_state *istate, const char *path)
 {
        struct split_index *split_index;
        int ret;
+       char *base_sha1_hex;
+       const char *base_path;
 
        /* istate->initialized covers both .git/index and .git/sharedindex.xxx */
        if (istate->initialized)
@@ -1682,15 +1853,16 @@ int read_index_from(struct index_state *istate, const char *path)
                discard_index(split_index->base);
        else
                split_index->base = xcalloc(1, sizeof(*split_index->base));
-       ret = do_read_index(split_index->base,
-                           git_path("sharedindex.%s",
-                                    sha1_to_hex(split_index->base_sha1)), 1);
+
+       base_sha1_hex = sha1_to_hex(split_index->base_sha1);
+       base_path = git_path("sharedindex.%s", base_sha1_hex);
+       ret = do_read_index(split_index->base, base_path, 1);
        if (hashcmp(split_index->base_sha1, split_index->base->sha1))
                die("broken index, expect %s in %s, got %s",
-                   sha1_to_hex(split_index->base_sha1),
-                   git_path("sharedindex.%s",
-                            sha1_to_hex(split_index->base_sha1)),
+                   base_sha1_hex, base_path,
                    sha1_to_hex(split_index->base->sha1));
+
+       freshen_shared_index(base_sha1_hex, 0);
        merge_base_index(istate);
        post_read_index_from(istate);
        return ret;
@@ -1876,7 +2048,7 @@ static char *copy_cache_entry_to_ondisk(struct ondisk_cache_entry *ondisk,
        ondisk->uid  = htonl(ce->ce_stat_data.sd_uid);
        ondisk->gid  = htonl(ce->ce_stat_data.sd_gid);
        ondisk->size = htonl(ce->ce_stat_data.sd_size);
-       hashcpy(ondisk->sha1, ce->sha1);
+       hashcpy(ondisk->sha1, ce->oid.hash);
 
        flags = ce->ce_flags & ~CE_NAMEMASK;
        flags |= (ce_namelen(ce) >= CE_NAMEMASK ? CE_NAMEMASK : ce_namelen(ce));
@@ -2015,9 +2187,10 @@ void update_index_if_able(struct index_state *istate, struct lock_file *lockfile
                rollback_lock_file(lockfile);
 }
 
-static int do_write_index(struct index_state *istate, int newfd,
+static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
                          int strip_extensions)
 {
+       int newfd = tempfile->fd;
        git_SHA_CTX c;
        struct cache_header hdr;
        int i, err, removed, extended, hdr_version;
@@ -2065,7 +2238,7 @@ static int do_write_index(struct index_state *istate, int newfd,
                        continue;
                if (!ce_uptodate(ce) && is_racy_timestamp(istate, ce))
                        ce_smudge_racily_clean_entry(ce);
-               if (is_null_sha1(ce->sha1)) {
+               if (is_null_oid(&ce->oid)) {
                        static const char msg[] = "cache entry has null sha1: %s";
                        static int allow = -1;
 
@@ -2126,7 +2299,11 @@ static int do_write_index(struct index_state *istate, int newfd,
                        return -1;
        }
 
-       if (ce_flush(&c, newfd, istate->sha1) || fstat(newfd, &st))
+       if (ce_flush(&c, newfd, istate->sha1))
+               return -1;
+       if (close_tempfile(tempfile))
+               return error(_("could not close '%s'"), tempfile->filename.buf);
+       if (stat(tempfile->filename.buf, &st))
                return -1;
        istate->timestamp.sec = (unsigned int)st.st_mtime;
        istate->timestamp.nsec = ST_MTIME_NSEC(st);
@@ -2149,7 +2326,7 @@ static int commit_locked_index(struct lock_file *lk)
 static int do_write_locked_index(struct index_state *istate, struct lock_file *lock,
                                 unsigned flags)
 {
-       int ret = do_write_index(istate, get_lock_file_fd(lock), 0);
+       int ret = do_write_index(istate, &lock->tempfile, 0);
        if (ret)
                return ret;
        assert((flags & (COMMIT_LOCK | CLOSE_LOCK)) !=
@@ -2173,6 +2350,65 @@ static int write_split_index(struct index_state *istate,
        return ret;
 }
 
+static const char *shared_index_expire = "2.weeks.ago";
+
+static unsigned long get_shared_index_expire_date(void)
+{
+       static unsigned long shared_index_expire_date;
+       static int shared_index_expire_date_prepared;
+
+       if (!shared_index_expire_date_prepared) {
+               git_config_get_expiry("splitindex.sharedindexexpire",
+                                     &shared_index_expire);
+               shared_index_expire_date = approxidate(shared_index_expire);
+               shared_index_expire_date_prepared = 1;
+       }
+
+       return shared_index_expire_date;
+}
+
+static int should_delete_shared_index(const char *shared_index_path)
+{
+       struct stat st;
+       unsigned long expiration;
+
+       /* Check timestamp */
+       expiration = get_shared_index_expire_date();
+       if (!expiration)
+               return 0;
+       if (stat(shared_index_path, &st))
+               return error_errno(_("could not stat '%s'"), shared_index_path);
+       if (st.st_mtime > expiration)
+               return 0;
+
+       return 1;
+}
+
+static int clean_shared_index_files(const char *current_hex)
+{
+       struct dirent *de;
+       DIR *dir = opendir(get_git_dir());
+
+       if (!dir)
+               return error_errno(_("unable to open git dir: %s"), get_git_dir());
+
+       while ((de = readdir(dir)) != NULL) {
+               const char *sha1_hex;
+               const char *shared_index_path;
+               if (!skip_prefix(de->d_name, "sharedindex.", &sha1_hex))
+                       continue;
+               if (!strcmp(sha1_hex, current_hex))
+                       continue;
+               shared_index_path = git_path("%s", de->d_name);
+               if (should_delete_shared_index(shared_index_path) > 0 &&
+                   unlink(shared_index_path))
+                       warning_errno(_("unable to unlink: %s"), shared_index_path);
+       }
+       closedir(dir);
+
+       return 0;
+}
+
 static struct tempfile temporary_sharedindex;
 
 static int write_shared_index(struct index_state *istate,
@@ -2187,21 +2423,55 @@ static int write_shared_index(struct index_state *istate,
                return do_write_locked_index(istate, lock, flags);
        }
        move_cache_to_base_index(istate);
-       ret = do_write_index(si->base, fd, 1);
+       ret = do_write_index(si->base, &temporary_sharedindex, 1);
        if (ret) {
                delete_tempfile(&temporary_sharedindex);
                return ret;
        }
        ret = rename_tempfile(&temporary_sharedindex,
                              git_path("sharedindex.%s", sha1_to_hex(si->base->sha1)));
-       if (!ret)
+       if (!ret) {
                hashcpy(si->base_sha1, si->base->sha1);
+               clean_shared_index_files(sha1_to_hex(si->base->sha1));
+       }
+
        return ret;
 }
 
+static const int default_max_percent_split_change = 20;
+
+static int too_many_not_shared_entries(struct index_state *istate)
+{
+       int i, not_shared = 0;
+       int max_split = git_config_get_max_percent_split_change();
+
+       switch (max_split) {
+       case -1:
+               /* not or badly configured: use the default value */
+               max_split = default_max_percent_split_change;
+               break;
+       case 0:
+               return 1; /* 0% means always write a new shared index */
+       case 100:
+               return 0; /* 100% means never write a new shared index */
+       default:
+               break; /* just use the configured value */
+       }
+
+       /* Count not shared entries */
+       for (i = 0; i < istate->cache_nr; i++) {
+               struct cache_entry *ce = istate->cache[i];
+               if (!ce->index)
+                       not_shared++;
+       }
+
+       return (int64_t)istate->cache_nr * max_split < (int64_t)not_shared * 100;
+}
+
 int write_locked_index(struct index_state *istate, struct lock_file *lock,
                       unsigned flags)
 {
+       int new_shared_index, ret;
        struct split_index *si = istate->split_index;
 
        if (!si || alternate_index_output ||
@@ -2216,13 +2486,24 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
                if ((v & 15) < 6)
                        istate->cache_changed |= SPLIT_INDEX_ORDERED;
        }
-       if (istate->cache_changed & SPLIT_INDEX_ORDERED) {
-               int ret = write_shared_index(istate, lock, flags);
+       if (too_many_not_shared_entries(istate))
+               istate->cache_changed |= SPLIT_INDEX_ORDERED;
+
+       new_shared_index = istate->cache_changed & SPLIT_INDEX_ORDERED;
+
+       if (new_shared_index) {
+               ret = write_shared_index(istate, lock, flags);
                if (ret)
                        return ret;
        }
 
-       return write_split_index(istate, lock, flags);
+       ret = write_split_index(istate, lock, flags);
+
+       /* Freshen the shared index only if the split-index was written */
+       if (!ret && !new_shared_index)
+               freshen_shared_index(sha1_to_hex(si->base_sha1), 1);
+
+       return ret;
 }
 
 /*
@@ -2288,7 +2569,8 @@ int index_name_is_other(const struct index_state *istate, const char *name,
        return 1;
 }
 
-void *read_blob_data_from_index(struct index_state *istate, const char *path, unsigned long *size)
+void *read_blob_data_from_index(const struct index_state *istate,
+                               const char *path, unsigned long *size)
 {
        int pos, len;
        unsigned long sz;
@@ -2312,7 +2594,7 @@ void *read_blob_data_from_index(struct index_state *istate, const char *path, un
        }
        if (pos < 0)
                return NULL;
-       data = read_sha1_file(istate->cache[pos]->sha1, &type, &sz);
+       data = read_sha1_file(istate->cache[pos]->oid.hash, &type, &sz);
        if (!data || type != OBJ_BLOB) {
                free(data);
                return NULL;
index 9a8f55e45a160717caed50f1ea86ff108c42d6d5..2cc7b01277ca8565302eb1648c065ecbb1a25f47 100644 (file)
 #include "utf8.h"
 #include "git-compat-util.h"
 #include "version.h"
+#include "trailer.h"
+#include "wt-status.h"
+#include "commit-slab.h"
+
+static struct ref_msg {
+       const char *gone;
+       const char *ahead;
+       const char *behind;
+       const char *ahead_behind;
+} msgs = {
+        /* Untranslated plumbing messages: */
+       "gone",
+       "ahead %d",
+       "behind %d",
+       "ahead %d, behind %d"
+};
+
+void setup_ref_filter_porcelain_msg(void)
+{
+       msgs.gone = _("gone");
+       msgs.ahead = _("ahead %d");
+       msgs.behind = _("behind %d");
+       msgs.ahead_behind = _("ahead %d, behind %d");
+}
 
 typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
+typedef enum { COMPARE_EQUAL, COMPARE_UNEQUAL, COMPARE_NONE } cmp_status;
 
 struct align {
        align_type position;
        unsigned int width;
 };
 
+struct if_then_else {
+       cmp_status cmp_status;
+       const char *str;
+       unsigned int then_atom_seen : 1,
+               else_atom_seen : 1,
+               condition_satisfied : 1;
+};
+
+struct refname_atom {
+       enum { R_NORMAL, R_SHORT, R_LSTRIP, R_RSTRIP } option;
+       int lstrip, rstrip;
+};
+
 /*
  * An atom is a valid field atom listed below, possibly prefixed with
  * a "*" to denote deref_tag().
@@ -37,13 +75,25 @@ static struct used_atom {
        union {
                char color[COLOR_MAXLEN];
                struct align align;
-               enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT }
-                       remote_ref;
                struct {
-                       enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB } option;
+                       enum { RR_REF, RR_TRACK, RR_TRACKSHORT } option;
+                       struct refname_atom refname;
+                       unsigned int nobracket : 1;
+               } remote_ref;
+               struct {
+                       enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB, C_TRAILERS } option;
                        unsigned int nlines;
                } contents;
-               enum { O_FULL, O_SHORT } objectname;
+               struct {
+                       cmp_status cmp_status;
+                       const char *str;
+               } if_then_else;
+               struct {
+                       enum { O_FULL, O_LENGTH, O_SHORT } option;
+                       unsigned int length;
+               } objectname;
+               struct refname_atom refname;
+               char *head;
        } u;
 } *used_atom;
 static int used_atom_cnt, need_tagged, need_symref;
@@ -57,18 +107,58 @@ static void color_atom_parser(struct used_atom *atom, const char *color_value)
                die(_("unrecognized color: %%(color:%s)"), color_value);
 }
 
-static void remote_ref_atom_parser(struct used_atom *atom, const char *arg)
+static void refname_atom_parser_internal(struct refname_atom *atom,
+                                        const char *arg, const char *name)
 {
        if (!arg)
-               atom->u.remote_ref = RR_NORMAL;
+               atom->option = R_NORMAL;
        else if (!strcmp(arg, "short"))
-               atom->u.remote_ref = RR_SHORTEN;
-       else if (!strcmp(arg, "track"))
-               atom->u.remote_ref = RR_TRACK;
-       else if (!strcmp(arg, "trackshort"))
-               atom->u.remote_ref = RR_TRACKSHORT;
-       else
-               die(_("unrecognized format: %%(%s)"), atom->name);
+               atom->option = R_SHORT;
+       else if (skip_prefix(arg, "lstrip=", &arg) ||
+                skip_prefix(arg, "strip=", &arg)) {
+               atom->option = R_LSTRIP;
+               if (strtol_i(arg, 10, &atom->lstrip))
+                       die(_("Integer value expected refname:lstrip=%s"), arg);
+       } else if (skip_prefix(arg, "rstrip=", &arg)) {
+               atom->option = R_RSTRIP;
+               if (strtol_i(arg, 10, &atom->rstrip))
+                       die(_("Integer value expected refname:rstrip=%s"), arg);
+       } else
+               die(_("unrecognized %%(%s) argument: %s"), name, arg);
+}
+
+static void remote_ref_atom_parser(struct used_atom *atom, const char *arg)
+{
+       struct string_list params = STRING_LIST_INIT_DUP;
+       int i;
+
+       if (!arg) {
+               atom->u.remote_ref.option = RR_REF;
+               refname_atom_parser_internal(&atom->u.remote_ref.refname,
+                                            arg, atom->name);
+               return;
+       }
+
+       atom->u.remote_ref.nobracket = 0;
+       string_list_split(&params, arg, ',', -1);
+
+       for (i = 0; i < params.nr; i++) {
+               const char *s = params.items[i].string;
+
+               if (!strcmp(s, "track"))
+                       atom->u.remote_ref.option = RR_TRACK;
+               else if (!strcmp(s, "trackshort"))
+                       atom->u.remote_ref.option = RR_TRACKSHORT;
+               else if (!strcmp(s, "nobracket"))
+                       atom->u.remote_ref.nobracket = 1;
+               else {
+                       atom->u.remote_ref.option = RR_REF;
+                       refname_atom_parser_internal(&atom->u.remote_ref.refname,
+                                                    arg, atom->name);
+               }
+       }
+
+       string_list_clear(&params, 0);
 }
 
 static void body_atom_parser(struct used_atom *atom, const char *arg)
@@ -85,6 +175,13 @@ static void subject_atom_parser(struct used_atom *atom, const char *arg)
        atom->u.contents.option = C_SUB;
 }
 
+static void trailers_atom_parser(struct used_atom *atom, const char *arg)
+{
+       if (arg)
+               die(_("%%(trailers) does not take arguments"));
+       atom->u.contents.option = C_TRAILERS;
+}
+
 static void contents_atom_parser(struct used_atom *atom, const char *arg)
 {
        if (!arg)
@@ -95,6 +192,8 @@ static void contents_atom_parser(struct used_atom *atom, const char *arg)
                atom->u.contents.option = C_SIG;
        else if (!strcmp(arg, "subject"))
                atom->u.contents.option = C_SUB;
+       else if (!strcmp(arg, "trailers"))
+               atom->u.contents.option = C_TRAILERS;
        else if (skip_prefix(arg, "lines=", &arg)) {
                atom->u.contents.option = C_LINES;
                if (strtoul_ui(arg, 10, &atom->u.contents.nlines))
@@ -106,13 +205,25 @@ static void contents_atom_parser(struct used_atom *atom, const char *arg)
 static void objectname_atom_parser(struct used_atom *atom, const char *arg)
 {
        if (!arg)
-               atom->u.objectname = O_FULL;
+               atom->u.objectname.option = O_FULL;
        else if (!strcmp(arg, "short"))
-               atom->u.objectname = O_SHORT;
-       else
+               atom->u.objectname.option = O_SHORT;
+       else if (skip_prefix(arg, "short=", &arg)) {
+               atom->u.objectname.option = O_LENGTH;
+               if (strtoul_ui(arg, 10, &atom->u.objectname.length) ||
+                   atom->u.objectname.length == 0)
+                       die(_("positive value expected objectname:short=%s"), arg);
+               if (atom->u.objectname.length < MINIMUM_ABBREV)
+                       atom->u.objectname.length = MINIMUM_ABBREV;
+       } else
                die(_("unrecognized %%(objectname) argument: %s"), arg);
 }
 
+static void refname_atom_parser(struct used_atom *atom, const char *arg)
+{
+       return refname_atom_parser_internal(&atom->u.refname, arg, atom->name);
+}
+
 static align_type parse_align_position(const char *s)
 {
        if (!strcmp(s, "right"))
@@ -163,12 +274,33 @@ static void align_atom_parser(struct used_atom *atom, const char *arg)
        string_list_clear(&params, 0);
 }
 
+static void if_atom_parser(struct used_atom *atom, const char *arg)
+{
+       if (!arg) {
+               atom->u.if_then_else.cmp_status = COMPARE_NONE;
+               return;
+       } else if (skip_prefix(arg, "equals=", &atom->u.if_then_else.str)) {
+               atom->u.if_then_else.cmp_status = COMPARE_EQUAL;
+       } else if (skip_prefix(arg, "notequals=", &atom->u.if_then_else.str)) {
+               atom->u.if_then_else.cmp_status = COMPARE_UNEQUAL;
+       } else {
+               die(_("unrecognized %%(if) argument: %s"), arg);
+       }
+}
+
+static void head_atom_parser(struct used_atom *atom, const char *arg)
+{
+       unsigned char unused[GIT_SHA1_RAWSZ];
+
+       atom->u.head = resolve_refdup("HEAD", RESOLVE_REF_READING, unused, NULL);
+}
+
 static struct {
        const char *name;
        cmp_type cmp_type;
        void (*parser)(struct used_atom *atom, const char *arg);
 } valid_atom[] = {
-       { "refname" },
+       { "refname" , FIELD_STR, refname_atom_parser },
        { "objecttype" },
        { "objectsize", FIELD_ULONG },
        { "objectname", FIELD_STR, objectname_atom_parser },
@@ -194,15 +326,19 @@ static struct {
        { "creatordate", FIELD_TIME },
        { "subject", FIELD_STR, subject_atom_parser },
        { "body", FIELD_STR, body_atom_parser },
+       { "trailers", FIELD_STR, trailers_atom_parser },
        { "contents", FIELD_STR, contents_atom_parser },
        { "upstream", FIELD_STR, remote_ref_atom_parser },
        { "push", FIELD_STR, remote_ref_atom_parser },
-       { "symref" },
+       { "symref", FIELD_STR, refname_atom_parser },
        { "flag" },
-       { "HEAD" },
+       { "HEAD", FIELD_STR, head_atom_parser },
        { "color", FIELD_STR, color_atom_parser },
        { "align", FIELD_STR, align_atom_parser },
        { "end" },
+       { "if", FIELD_STR, if_atom_parser },
+       { "then" },
+       { "else" },
 };
 
 #define REF_FORMATTING_STATE_INIT  { 0, NULL }
@@ -210,7 +346,7 @@ static struct {
 struct ref_formatting_stack {
        struct ref_formatting_stack *prev;
        struct strbuf output;
-       void (*at_end)(struct ref_formatting_stack *stack);
+       void (*at_end)(struct ref_formatting_stack **stack);
        void *at_end_data;
 };
 
@@ -221,11 +357,9 @@ struct ref_formatting_state {
 
 struct atom_value {
        const char *s;
-       union {
-               struct align align;
-       } u;
        void (*handler)(struct atom_value *atomv, struct ref_formatting_state *state);
        unsigned long ul; /* used for sorting when not FIELD_STR */
+       struct used_atom *atom;
 };
 
 /*
@@ -282,7 +416,7 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
                valid_atom[i].parser(&used_atom[at], arg);
        if (*atom == '*')
                need_tagged = 1;
-       if (!strcmp(used_atom[at].name, "symref"))
+       if (!strcmp(valid_atom[i].name, "symref"))
                need_symref = 1;
        return at;
 }
@@ -343,13 +477,14 @@ static void pop_stack_element(struct ref_formatting_stack **stack)
        *stack = prev;
 }
 
-static void end_align_handler(struct ref_formatting_stack *stack)
+static void end_align_handler(struct ref_formatting_stack **stack)
 {
-       struct align *align = (struct align *)stack->at_end_data;
+       struct ref_formatting_stack *cur = *stack;
+       struct align *align = (struct align *)cur->at_end_data;
        struct strbuf s = STRBUF_INIT;
 
-       strbuf_utf8_align(&s, align->position, align->width, stack->output.buf);
-       strbuf_swap(&stack->output, &s);
+       strbuf_utf8_align(&s, align->position, align->width, cur->output.buf);
+       strbuf_swap(&cur->output, &s);
        strbuf_release(&s);
 }
 
@@ -360,7 +495,115 @@ static void align_atom_handler(struct atom_value *atomv, struct ref_formatting_s
        push_stack_element(&state->stack);
        new = state->stack;
        new->at_end = end_align_handler;
-       new->at_end_data = &atomv->u.align;
+       new->at_end_data = &atomv->atom->u.align;
+}
+
+static void if_then_else_handler(struct ref_formatting_stack **stack)
+{
+       struct ref_formatting_stack *cur = *stack;
+       struct ref_formatting_stack *prev = cur->prev;
+       struct if_then_else *if_then_else = (struct if_then_else *)cur->at_end_data;
+
+       if (!if_then_else->then_atom_seen)
+               die(_("format: %%(if) atom used without a %%(then) atom"));
+
+       if (if_then_else->else_atom_seen) {
+               /*
+                * There is an %(else) atom: we need to drop one state from the
+                * stack, either the %(else) branch if the condition is satisfied, or
+                * the %(then) branch if it isn't.
+                */
+               if (if_then_else->condition_satisfied) {
+                       strbuf_reset(&cur->output);
+                       pop_stack_element(&cur);
+               } else {
+                       strbuf_swap(&cur->output, &prev->output);
+                       strbuf_reset(&cur->output);
+                       pop_stack_element(&cur);
+               }
+       } else if (!if_then_else->condition_satisfied) {
+               /*
+                * No %(else) atom: just drop the %(then) branch if the
+                * condition is not satisfied.
+                */
+               strbuf_reset(&cur->output);
+       }
+
+       *stack = cur;
+       free(if_then_else);
+}
+
+static void if_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state)
+{
+       struct ref_formatting_stack *new;
+       struct if_then_else *if_then_else = xcalloc(sizeof(struct if_then_else), 1);
+
+       if_then_else->str = atomv->atom->u.if_then_else.str;
+       if_then_else->cmp_status = atomv->atom->u.if_then_else.cmp_status;
+
+       push_stack_element(&state->stack);
+       new = state->stack;
+       new->at_end = if_then_else_handler;
+       new->at_end_data = if_then_else;
+}
+
+static int is_empty(const char *s)
+{
+       while (*s != '\0') {
+               if (!isspace(*s))
+                       return 0;
+               s++;
+       }
+       return 1;
+}
+
+static void then_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state)
+{
+       struct ref_formatting_stack *cur = state->stack;
+       struct if_then_else *if_then_else = NULL;
+
+       if (cur->at_end == if_then_else_handler)
+               if_then_else = (struct if_then_else *)cur->at_end_data;
+       if (!if_then_else)
+               die(_("format: %%(then) atom used without an %%(if) atom"));
+       if (if_then_else->then_atom_seen)
+               die(_("format: %%(then) atom used more than once"));
+       if (if_then_else->else_atom_seen)
+               die(_("format: %%(then) atom used after %%(else)"));
+       if_then_else->then_atom_seen = 1;
+       /*
+        * If the 'equals' or 'notequals' attribute is used then
+        * perform the required comparison. If not, only non-empty
+        * strings satisfy the 'if' condition.
+        */
+       if (if_then_else->cmp_status == COMPARE_EQUAL) {
+               if (!strcmp(if_then_else->str, cur->output.buf))
+                       if_then_else->condition_satisfied = 1;
+       } else if (if_then_else->cmp_status == COMPARE_UNEQUAL) {
+               if (strcmp(if_then_else->str, cur->output.buf))
+                       if_then_else->condition_satisfied = 1;
+       } else if (cur->output.len && !is_empty(cur->output.buf))
+               if_then_else->condition_satisfied = 1;
+       strbuf_reset(&cur->output);
+}
+
+static void else_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state)
+{
+       struct ref_formatting_stack *prev = state->stack;
+       struct if_then_else *if_then_else = NULL;
+
+       if (prev->at_end == if_then_else_handler)
+               if_then_else = (struct if_then_else *)prev->at_end_data;
+       if (!if_then_else)
+               die(_("format: %%(else) atom used without an %%(if) atom"));
+       if (!if_then_else->then_atom_seen)
+               die(_("format: %%(else) atom used without a %%(then) atom"));
+       if (if_then_else->else_atom_seen)
+               die(_("format: %%(else) atom used more than once"));
+       if_then_else->else_atom_seen = 1;
+       push_stack_element(&state->stack);
+       state->stack->at_end_data = prev->at_end_data;
+       state->stack->at_end = prev->at_end;
 }
 
 static void end_atom_handler(struct atom_value *atomv, struct ref_formatting_state *state)
@@ -370,14 +613,17 @@ static void end_atom_handler(struct atom_value *atomv, struct ref_formatting_sta
 
        if (!current->at_end)
                die(_("format: %%(end) atom used without corresponding atom"));
-       current->at_end(current);
+       current->at_end(&state->stack);
+
+       /*  Stack may have been popped within at_end(), hence reset the current pointer */
+       current = state->stack;
 
        /*
         * Perform quote formatting when the stack element is that of
         * a supporting atom. If nested then perform quote formatting
         * only on the topmost supporting atom.
         */
-       if (!state->stack->prev->prev) {
+       if (!current->prev->prev) {
                quote_formatting(&s, current->output.buf, state->quote_style);
                strbuf_swap(&current->output, &s);
        }
@@ -454,12 +700,15 @@ static int grab_objectname(const char *name, const unsigned char *sha1,
                           struct atom_value *v, struct used_atom *atom)
 {
        if (starts_with(name, "objectname")) {
-               if (atom->u.objectname == O_SHORT) {
+               if (atom->u.objectname.option == O_SHORT) {
                        v->s = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV));
                        return 1;
-               } else if (atom->u.objectname == O_FULL) {
+               } else if (atom->u.objectname.option == O_FULL) {
                        v->s = xstrdup(sha1_to_hex(sha1));
                        return 1;
+               } else if (atom->u.objectname.option == O_LENGTH) {
+                       v->s = xstrdup(find_unique_abbrev(sha1, atom->u.objectname.length));
+                       return 1;
                } else
                        die("BUG: unknown %%(objectname) option");
        }
@@ -785,6 +1034,7 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct obj
                        name++;
                if (strcmp(name, "subject") &&
                    strcmp(name, "body") &&
+                   strcmp(name, "trailers") &&
                    !starts_with(name, "contents"))
                        continue;
                if (!subpos)
@@ -808,6 +1058,14 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct obj
                        /*  Size is the length of the message after removing the signature */
                        append_lines(&s, subpos, contents_end - subpos, atom->u.contents.nlines);
                        v->s = strbuf_detach(&s, NULL);
+               } else if (atom->u.contents.option == C_TRAILERS) {
+                       struct trailer_info info;
+
+                       /* Search for trailer info */
+                       trailer_info_get(&info, subpos);
+                       v->s = xmemdupz(info.trailer_start,
+                                       info.trailer_end - info.trailer_start);
+                       trailer_info_release(&info);
                } else if (atom->u.contents.option == C_BARE)
                        v->s = xstrdup(subpos);
        }
@@ -867,50 +1125,108 @@ static inline char *copy_advance(char *dst, const char *src)
        return dst;
 }
 
-static const char *strip_ref_components(const char *refname, const char *nr_arg)
+static const char *lstrip_ref_components(const char *refname, int len)
 {
-       char *end;
-       long nr = strtol(nr_arg, &end, 10);
-       long remaining = nr;
+       long remaining = len;
        const char *start = refname;
 
-       if (nr < 1 || *end != '\0')
-               die(_(":strip= requires a positive integer argument"));
+       if (len < 0) {
+               int i;
+               const char *p = refname;
+
+               /* Find total no of '/' separated path-components */
+               for (i = 0; p[i]; p[i] == '/' ? i++ : *p++)
+                       ;
+               /*
+                * The number of components we need to strip is now
+                * the total minus the components to be left (Plus one
+                * because we count the number of '/', but the number
+                * of components is one more than the no of '/').
+                */
+               remaining = i + len + 1;
+       }
 
-       while (remaining) {
+       while (remaining > 0) {
                switch (*start++) {
                case '\0':
-                       die(_("ref '%s' does not have %ld components to :strip"),
-                           refname, nr);
+                       return "";
                case '/':
                        remaining--;
                        break;
                }
        }
+
        return start;
 }
 
+static const char *rstrip_ref_components(const char *refname, int len)
+{
+       long remaining = len;
+       char *start = xstrdup(refname);
+
+       if (len < 0) {
+               int i;
+               const char *p = refname;
+
+               /* Find total no of '/' separated path-components */
+               for (i = 0; p[i]; p[i] == '/' ? i++ : *p++)
+                       ;
+               /*
+                * The number of components we need to strip is now
+                * the total minus the components to be left (Plus one
+                * because we count the number of '/', but the number
+                * of components is one more than the no of '/').
+                */
+               remaining = i + len + 1;
+       }
+
+       while (remaining-- > 0) {
+               char *p = strrchr(start, '/');
+               if (p == NULL)
+                       return "";
+               else
+                       p[0] = '\0';
+       }
+       return start;
+}
+
+static const char *show_ref(struct refname_atom *atom, const char *refname)
+{
+       if (atom->option == R_SHORT)
+               return shorten_unambiguous_ref(refname, warn_ambiguous_refs);
+       else if (atom->option == R_LSTRIP)
+               return lstrip_ref_components(refname, atom->lstrip);
+       else if (atom->option == R_RSTRIP)
+               return rstrip_ref_components(refname, atom->rstrip);
+       else
+               return refname;
+}
+
 static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
                                    struct branch *branch, const char **s)
 {
        int num_ours, num_theirs;
-       if (atom->u.remote_ref == RR_SHORTEN)
-               *s = shorten_unambiguous_ref(refname, warn_ambiguous_refs);
-       else if (atom->u.remote_ref == RR_TRACK) {
+       if (atom->u.remote_ref.option == RR_REF)
+               *s = show_ref(&atom->u.remote_ref.refname, refname);
+       else if (atom->u.remote_ref.option == RR_TRACK) {
                if (stat_tracking_info(branch, &num_ours,
-                                      &num_theirs, NULL))
-                       return;
-
-               if (!num_ours && !num_theirs)
+                                      &num_theirs, NULL)) {
+                       *s = xstrdup(msgs.gone);
+               } else if (!num_ours && !num_theirs)
                        *s = "";
                else if (!num_ours)
-                       *s = xstrfmt("[behind %d]", num_theirs);
+                       *s = xstrfmt(msgs.behind, num_theirs);
                else if (!num_theirs)
-                       *s = xstrfmt("[ahead %d]", num_ours);
+                       *s = xstrfmt(msgs.ahead, num_ours);
                else
-                       *s = xstrfmt("[ahead %d, behind %d]",
+                       *s = xstrfmt(msgs.ahead_behind,
                                     num_ours, num_theirs);
-       } else if (atom->u.remote_ref == RR_TRACKSHORT) {
+               if (!atom->u.remote_ref.nobracket && *s[0]) {
+                       const char *to_free = *s;
+                       *s = xstrfmt("[%s]", *s);
+                       free((void *)to_free);
+               }
+       } else if (atom->u.remote_ref.option == RR_TRACKSHORT) {
                if (stat_tracking_info(branch, &num_ours,
                                       &num_theirs, NULL))
                        return;
@@ -923,8 +1239,60 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
                        *s = ">";
                else
                        *s = "<>";
-       } else /* RR_NORMAL */
-               *s = refname;
+       } else
+               die("BUG: unhandled RR_* enum");
+}
+
+char *get_head_description(void)
+{
+       struct strbuf desc = STRBUF_INIT;
+       struct wt_status_state state;
+       memset(&state, 0, sizeof(state));
+       wt_status_get_state(&state, 1);
+       if (state.rebase_in_progress ||
+           state.rebase_interactive_in_progress)
+               strbuf_addf(&desc, _("(no branch, rebasing %s)"),
+                           state.branch);
+       else if (state.bisect_in_progress)
+               strbuf_addf(&desc, _("(no branch, bisect started on %s)"),
+                           state.branch);
+       else if (state.detached_from) {
+               if (state.detached_at)
+                       /*
+                        * TRANSLATORS: make sure this matches "HEAD
+                        * detached at " in wt-status.c
+                        */
+                       strbuf_addf(&desc, _("(HEAD detached at %s)"),
+                               state.detached_from);
+               else
+                       /*
+                        * TRANSLATORS: make sure this matches "HEAD
+                        * detached from " in wt-status.c
+                        */
+                       strbuf_addf(&desc, _("(HEAD detached from %s)"),
+                               state.detached_from);
+       }
+       else
+               strbuf_addstr(&desc, _("(no branch)"));
+       free(state.branch);
+       free(state.onto);
+       free(state.detached_from);
+       return strbuf_detach(&desc, NULL);
+}
+
+static const char *get_symref(struct used_atom *atom, struct ref_array_item *ref)
+{
+       if (!ref->symref)
+               return "";
+       else
+               return show_ref(&atom->u.refname, ref->symref);
+}
+
+static const char *get_refname(struct used_atom *atom, struct ref_array_item *ref)
+{
+       if (ref->kind & FILTER_REFS_DETACHED_HEAD)
+               return get_head_description();
+       return show_ref(&atom->u.refname, ref->refname);
 }
 
 /*
@@ -941,9 +1309,9 @@ static void populate_value(struct ref_array_item *ref)
        ref->value = xcalloc(used_atom_cnt, sizeof(struct atom_value));
 
        if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
-               unsigned char unused1[20];
+               struct object_id unused1;
                ref->symref = resolve_refdup(ref->refname, RESOLVE_REF_READING,
-                                            unused1, NULL);
+                                            unused1.hash, NULL);
                if (!ref->symref)
                        ref->symref = "";
        }
@@ -955,10 +1323,10 @@ static void populate_value(struct ref_array_item *ref)
                struct atom_value *v = &ref->value[i];
                int deref = 0;
                const char *refname;
-               const char *formatp;
                struct branch *branch = NULL;
 
                v->handler = append_atom;
+               v->atom = atom;
 
                if (*name == '*') {
                        deref = 1;
@@ -966,9 +1334,9 @@ static void populate_value(struct ref_array_item *ref)
                }
 
                if (starts_with(name, "refname"))
-                       refname = ref->refname;
+                       refname = get_refname(atom, ref);
                else if (starts_with(name, "symref"))
-                       refname = ref->symref ? ref->symref : "";
+                       refname = get_symref(atom, ref);
                else if (starts_with(name, "upstream")) {
                        const char *branch_name;
                        /* only local branches may have an upstream */
@@ -1012,41 +1380,33 @@ static void populate_value(struct ref_array_item *ref)
                } else if (!deref && grab_objectname(name, ref->objectname, v, atom)) {
                        continue;
                } else if (!strcmp(name, "HEAD")) {
-                       const char *head;
-                       unsigned char sha1[20];
-
-                       head = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
-                                                 sha1, NULL);
-                       if (!strcmp(ref->refname, head))
+                       if (atom->u.head && !strcmp(ref->refname, atom->u.head))
                                v->s = "*";
                        else
                                v->s = " ";
                        continue;
                } else if (starts_with(name, "align")) {
-                       v->u.align = atom->u.align;
                        v->handler = align_atom_handler;
                        continue;
                } else if (!strcmp(name, "end")) {
                        v->handler = end_atom_handler;
                        continue;
+               } else if (starts_with(name, "if")) {
+                       const char *s;
+
+                       if (skip_prefix(name, "if:", &s))
+                               v->s = xstrdup(s);
+                       v->handler = if_atom_handler;
+                       continue;
+               } else if (!strcmp(name, "then")) {
+                       v->handler = then_atom_handler;
+                       continue;
+               } else if (!strcmp(name, "else")) {
+                       v->handler = else_atom_handler;
+                       continue;
                } else
                        continue;
 
-               formatp = strchr(name, ':');
-               if (formatp) {
-                       const char *arg;
-
-                       formatp++;
-                       if (!strcmp(formatp, "short"))
-                               refname = shorten_unambiguous_ref(refname,
-                                                     warn_ambiguous_refs);
-                       else if (skip_prefix(formatp, "strip=", &arg))
-                               refname = strip_ref_components(refname, arg);
-                       else
-                               die(_("unknown %.*s format %s"),
-                                   (int)(formatp - name), name, formatp);
-               }
-
                if (!deref)
                        v->s = refname;
                else
@@ -1117,10 +1477,23 @@ static void get_ref_atom_value(struct ref_array_item *ref, int atom, struct atom
        *v = &ref->value[atom];
 }
 
+/*
+ * Unknown has to be "0" here, because that's the default value for
+ * contains_cache slab entries that have not yet been assigned.
+ */
 enum contains_result {
-       CONTAINS_UNKNOWN = -1,
-       CONTAINS_NO = 0,
-       CONTAINS_YES = 1
+       CONTAINS_UNKNOWN = 0,
+       CONTAINS_NO,
+       CONTAINS_YES
+};
+
+define_commit_slab(contains_cache, enum contains_result);
+
+struct ref_filter_cbdata {
+       struct ref_array *array;
+       struct ref_filter *filter;
+       struct contains_cache contains_cache;
+       struct contains_cache no_contains_cache;
 };
 
 /*
@@ -1151,24 +1524,24 @@ static int in_commit_list(const struct commit_list *want, struct commit *c)
  * Do not recurse to find out, though, but return -1 if inconclusive.
  */
 static enum contains_result contains_test(struct commit *candidate,
-                           const struct commit_list *want)
+                                         const struct commit_list *want,
+                                         struct contains_cache *cache)
 {
-       /* was it previously marked as containing a want commit? */
-       if (candidate->object.flags & TMP_MARK)
-               return 1;
-       /* or marked as not possibly containing a want commit? */
-       if (candidate->object.flags & UNINTERESTING)
-               return 0;
+       enum contains_result *cached = contains_cache_at(cache, candidate);
+
+       /* If we already have the answer cached, return that. */
+       if (*cached)
+               return *cached;
+
        /* or are we it? */
        if (in_commit_list(want, candidate)) {
-               candidate->object.flags |= TMP_MARK;
-               return 1;
+               *cached = CONTAINS_YES;
+               return CONTAINS_YES;
        }
 
-       if (parse_commit(candidate) < 0)
-               return 0;
-
-       return -1;
+       /* Otherwise, we don't know; prepare to recurse */
+       parse_commit_or_die(candidate);
+       return CONTAINS_UNKNOWN;
 }
 
 static void push_to_contains_stack(struct commit *candidate, struct contains_stack *contains_stack)
@@ -1179,10 +1552,11 @@ static void push_to_contains_stack(struct commit *candidate, struct contains_sta
 }
 
 static enum contains_result contains_tag_algo(struct commit *candidate,
-               const struct commit_list *want)
+                                             const struct commit_list *want,
+                                             struct contains_cache *cache)
 {
        struct contains_stack contains_stack = { 0, 0, NULL };
-       int result = contains_test(candidate, want);
+       enum contains_result result = contains_test(candidate, want, cache);
 
        if (result != CONTAINS_UNKNOWN)
                return result;
@@ -1194,16 +1568,16 @@ static enum contains_result contains_tag_algo(struct commit *candidate,
                struct commit_list *parents = entry->parents;
 
                if (!parents) {
-                       commit->object.flags |= UNINTERESTING;
+                       *contains_cache_at(cache, commit) = CONTAINS_NO;
                        contains_stack.nr--;
                }
                /*
                 * If we just popped the stack, parents->item has been marked,
-                * therefore contains_test will return a meaningful 0 or 1.
+                * therefore contains_test will return a meaningful yes/no.
                 */
-               else switch (contains_test(parents->item, want)) {
+               else switch (contains_test(parents->item, want, cache)) {
                case CONTAINS_YES:
-                       commit->object.flags |= TMP_MARK;
+                       *contains_cache_at(cache, commit) = CONTAINS_YES;
                        contains_stack.nr--;
                        break;
                case CONTAINS_NO:
@@ -1215,14 +1589,15 @@ static enum contains_result contains_tag_algo(struct commit *candidate,
                }
        }
        free(contains_stack.contains_stack);
-       return contains_test(candidate, want);
+       return contains_test(candidate, want, cache);
 }
 
-static int commit_contains(struct ref_filter *filter, struct commit *commit)
+static int commit_contains(struct ref_filter *filter, struct commit *commit,
+                          struct commit_list *list, struct contains_cache *cache)
 {
        if (filter->with_commit_tag_algo)
-               return contains_tag_algo(commit, filter->with_commit);
-       return is_descendant_of(commit, filter->with_commit);
+               return contains_tag_algo(commit, list, cache) == CONTAINS_YES;
+       return is_descendant_of(commit, list);
 }
 
 /*
@@ -1231,8 +1606,14 @@ static int commit_contains(struct ref_filter *filter, struct commit *commit)
  * matches a pattern "refs/heads/mas") or a wildcard (e.g. the same ref
  * matches "refs/heads/mas*", too).
  */
-static int match_pattern(const char **patterns, const char *refname)
+static int match_pattern(const struct ref_filter *filter, const char *refname)
 {
+       const char **patterns = filter->name_patterns;
+       unsigned flags = 0;
+
+       if (filter->ignore_case)
+               flags |= WM_CASEFOLD;
+
        /*
         * When no '--format' option is given we need to skip the prefix
         * for matching refs of tags and branches.
@@ -1243,7 +1624,7 @@ static int match_pattern(const char **patterns, const char *refname)
               skip_prefix(refname, "refs/", &refname));
 
        for (; *patterns; patterns++) {
-               if (!wildmatch(*patterns, refname, 0, NULL))
+               if (!wildmatch(*patterns, refname, flags, NULL))
                        return 1;
        }
        return 0;
@@ -1255,9 +1636,15 @@ static int match_pattern(const char **patterns, const char *refname)
  * matches a pattern "refs/heads/" but not "refs/heads/m") or a
  * wildcard (e.g. the same ref matches "refs/heads/m*", too).
  */
-static int match_name_as_path(const char **pattern, const char *refname)
+static int match_name_as_path(const struct ref_filter *filter, const char *refname)
 {
+       const char **pattern = filter->name_patterns;
        int namelen = strlen(refname);
+       unsigned flags = WM_PATHNAME;
+
+       if (filter->ignore_case)
+               flags |= WM_CASEFOLD;
+
        for (; *pattern; pattern++) {
                const char *p = *pattern;
                int plen = strlen(p);
@@ -1280,8 +1667,8 @@ static int filter_pattern_match(struct ref_filter *filter, const char *refname)
        if (!*filter->name_patterns)
                return 1; /* No pattern always matches */
        if (filter->match_as_path)
-               return match_name_as_path(filter->name_patterns, refname);
-       return match_pattern(filter->name_patterns, refname);
+               return match_name_as_path(filter, refname);
+       return match_pattern(filter, refname);
 }
 
 /*
@@ -1297,22 +1684,22 @@ static int filter_pattern_match(struct ref_filter *filter, const char *refname)
  * the need to parse the object via parse_object(). peel_ref() might be a
  * more efficient alternative to obtain the pointee.
  */
-static const unsigned char *match_points_at(struct sha1_array *points_at,
-                                           const unsigned char *sha1,
-                                           const char *refname)
+static const struct object_id *match_points_at(struct oid_array *points_at,
+                                              const struct object_id *oid,
+                                              const char *refname)
 {
-       const unsigned char *tagged_sha1 = NULL;
+       const struct object_id *tagged_oid = NULL;
        struct object *obj;
 
-       if (sha1_array_lookup(points_at, sha1) >= 0)
-               return sha1;
-       obj = parse_object(sha1);
+       if (oid_array_lookup(points_at, oid) >= 0)
+               return oid;
+       obj = parse_object(oid->hash);
        if (!obj)
                die(_("malformed object at '%s'"), refname);
        if (obj->type == OBJ_TAG)
-               tagged_sha1 = ((struct tag *)obj)->tagged->oid.hash;
-       if (tagged_sha1 && sha1_array_lookup(points_at, tagged_sha1) >= 0)
-               return tagged_sha1;
+               tagged_oid = &((struct tag *)obj)->tagged->oid;
+       if (tagged_oid && oid_array_lookup(points_at, tagged_oid) >= 0)
+               return tagged_oid;
        return NULL;
 }
 
@@ -1329,7 +1716,7 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
        return ref;
 }
 
-static int filter_ref_kind(struct ref_filter *filter, const char *refname)
+static int ref_kind_from_refname(const char *refname)
 {
        unsigned int i;
 
@@ -1342,11 +1729,7 @@ static int filter_ref_kind(struct ref_filter *filter, const char *refname)
                { "refs/tags/", FILTER_REFS_TAGS}
        };
 
-       if (filter->kind == FILTER_REFS_BRANCHES ||
-           filter->kind == FILTER_REFS_REMOTES ||
-           filter->kind == FILTER_REFS_TAGS)
-               return filter->kind;
-       else if (!strcmp(refname, "HEAD"))
+       if (!strcmp(refname, "HEAD"))
                return FILTER_REFS_DETACHED_HEAD;
 
        for (i = 0; i < ARRAY_SIZE(ref_kind); i++) {
@@ -1357,6 +1740,15 @@ static int filter_ref_kind(struct ref_filter *filter, const char *refname)
        return FILTER_REFS_OTHERS;
 }
 
+static int filter_ref_kind(struct ref_filter *filter, const char *refname)
+{
+       if (filter->kind == FILTER_REFS_BRANCHES ||
+           filter->kind == FILTER_REFS_REMOTES ||
+           filter->kind == FILTER_REFS_TAGS)
+               return filter->kind;
+       return ref_kind_from_refname(refname);
+}
+
 /*
  * A call-back given to for_each_ref().  Filter refs and keep them for
  * later object processing.
@@ -1387,7 +1779,7 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
        if (!filter_pattern_match(filter, refname))
                return 0;
 
-       if (filter->points_at.nr && !match_points_at(&filter->points_at, oid->hash, refname))
+       if (filter->points_at.nr && !match_points_at(&filter->points_at, oid, refname))
                return 0;
 
        /*
@@ -1395,13 +1787,17 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
         * obtain the commit using the 'oid' available and discard all
         * non-commits early. The actual filtering is done later.
         */
-       if (filter->merge_commit || filter->with_commit || filter->verbose) {
+       if (filter->merge_commit || filter->with_commit || filter->no_commit || filter->verbose) {
                commit = lookup_commit_reference_gently(oid->hash, 1);
                if (!commit)
                        return 0;
-               /* We perform the filtering for the '--contains' option */
+               /* We perform the filtering for the '--contains' option... */
                if (filter->with_commit &&
-                   !commit_contains(filter, commit))
+                   !commit_contains(filter, commit, filter->with_commit, &ref_cbdata->contains_cache))
+                       return 0;
+               /* ...or for the `--no-contains' option */
+               if (filter->no_commit &&
+                   commit_contains(filter, commit, filter->no_commit, &ref_cbdata->no_contains_cache))
                        return 0;
        }
 
@@ -1501,6 +1897,9 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int
                broken = 1;
        filter->kind = type & FILTER_REFS_KIND_MASK;
 
+       init_contains_cache(&ref_cbdata.contains_cache);
+       init_contains_cache(&ref_cbdata.no_contains_cache);
+
        /*  Simple per-ref filtering */
        if (!filter->kind)
                die("filter_refs: invalid type");
@@ -1523,6 +1922,8 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int
                        head_ref(ref_filter_handler, &ref_cbdata);
        }
 
+       clear_contains_cache(&ref_cbdata.contains_cache);
+       clear_contains_cache(&ref_cbdata.no_contains_cache);
 
        /*  Filters that need revision walking */
        if (filter->merge_commit)
@@ -1536,18 +1937,20 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
        struct atom_value *va, *vb;
        int cmp;
        cmp_type cmp_type = used_atom[s->atom].type;
+       int (*cmp_fn)(const char *, const char *);
 
        get_ref_atom_value(a, s->atom, &va);
        get_ref_atom_value(b, s->atom, &vb);
+       cmp_fn = s->ignore_case ? strcasecmp : strcmp;
        if (s->version)
                cmp = versioncmp(va->s, vb->s);
        else if (cmp_type == FIELD_STR)
-               cmp = strcmp(va->s, vb->s);
+               cmp = cmp_fn(va->s, vb->s);
        else {
                if (va->ul < vb->ul)
                        cmp = -1;
                else if (va->ul == vb->ul)
-                       cmp = strcmp(a->refname, b->refname);
+                       cmp = cmp_fn(a->refname, b->refname);
                else
                        cmp = 1;
        }
@@ -1555,8 +1958,7 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
        return (s->reverse) ? -cmp : cmp;
 }
 
-static struct ref_sorting *ref_sorting;
-static int compare_refs(const void *a_, const void *b_)
+static int compare_refs(const void *a_, const void *b_, void *ref_sorting)
 {
        struct ref_array_item *a = *((struct ref_array_item **)a_);
        struct ref_array_item *b = *((struct ref_array_item **)b_);
@@ -1572,8 +1974,7 @@ static int compare_refs(const void *a_, const void *b_)
 
 void ref_array_sort(struct ref_sorting *sorting, struct ref_array *array)
 {
-       ref_sorting = sorting;
-       qsort(array->items, array->nr, sizeof(struct ref_array_item *), compare_refs);
+       QSORT_S(array->items, array->nr, compare_refs, sorting);
 }
 
 static void append_literal(const char *cp, const char *ep, struct ref_formatting_state *state)
@@ -1598,10 +1999,10 @@ static void append_literal(const char *cp, const char *ep, struct ref_formatting
        }
 }
 
-void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style)
+void format_ref_array_item(struct ref_array_item *info, const char *format,
+                          int quote_style, struct strbuf *final_buf)
 {
        const char *cp, *sp, *ep;
-       struct strbuf *final_buf;
        struct ref_formatting_state state = REF_FORMATTING_STATE_INIT;
 
        state.quote_style = quote_style;
@@ -1631,12 +2032,30 @@ void show_ref_array_item(struct ref_array_item *info, const char *format, int qu
        }
        if (state.stack->prev)
                die(_("format: %%(end) atom missing"));
-       final_buf = &state.stack->output;
-       fwrite(final_buf->buf, 1, final_buf->len, stdout);
+       strbuf_addbuf(final_buf, &state.stack->output);
        pop_stack_element(&state.stack);
+}
+
+void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style)
+{
+       struct strbuf final_buf = STRBUF_INIT;
+
+       format_ref_array_item(info, format, quote_style, &final_buf);
+       fwrite(final_buf.buf, 1, final_buf.len, stdout);
+       strbuf_release(&final_buf);
        putchar('\n');
 }
 
+void pretty_print_ref(const char *name, const unsigned char *sha1,
+               const char *format)
+{
+       struct ref_array_item *ref_item;
+       ref_item = new_ref_array_item(name, sha1, 0);
+       ref_item->kind = ref_kind_from_refname(name);
+       show_ref_array_item(ref_item, format, 0);
+       free_array_item(ref_item);
+}
+
 /*  If no sorting option is given, use refname to sort as default */
 struct ref_sorting *ref_default_sorting(void)
 {
@@ -1678,8 +2097,17 @@ int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset)
 {
        struct ref_filter *rf = opt->value;
        unsigned char sha1[20];
+       int no_merged = starts_with(opt->long_name, "no");
+
+       if (rf->merge) {
+               if (no_merged) {
+                       return opterror(opt, "is incompatible with --merged", 0);
+               } else {
+                       return opterror(opt, "is incompatible with --no-merged", 0);
+               }
+       }
 
-       rf->merge = starts_with(opt->long_name, "no")
+       rf->merge = no_merged
                ? REF_FILTER_MERGED_OMIT
                : REF_FILTER_MERGED_INCLUDE;
 
index 14d435e2ccf0204312d1f72555f1c2c36fabd215..c20167aa3c785f0060147204d963537f58617570 100644 (file)
@@ -29,6 +29,7 @@ struct ref_sorting {
        struct ref_sorting *next;
        int atom; /* index into used_atom array (internal) */
        unsigned reverse : 1,
+               ignore_case : 1,
                version : 1;
 };
 
@@ -50,8 +51,9 @@ struct ref_array {
 
 struct ref_filter {
        const char **name_patterns;
-       struct sha1_array points_at;
+       struct oid_array points_at;
        struct commit_list *with_commit;
+       struct commit_list *no_commit;
 
        enum {
                REF_FILTER_MERGED_NONE = 0,
@@ -62,6 +64,7 @@ struct ref_filter {
 
        unsigned int with_commit_tag_algo : 1,
                match_as_path : 1,
+               ignore_case : 1,
                detached : 1;
        unsigned int kind,
                lines;
@@ -69,11 +72,6 @@ struct ref_filter {
                verbose;
 };
 
-struct ref_filter_cbdata {
-       struct ref_array *array;
-       struct ref_filter *filter;
-};
-
 /*  Macros for checking --merged and --no-merged options */
 #define _OPT_MERGED_NO_MERGED(option, filter, h) \
        { OPTION_CALLBACK, 0, option, (filter), N_("commit"), (h), \
@@ -98,6 +96,9 @@ int parse_ref_filter_atom(const char *atom, const char *ep);
 int verify_ref_format(const char *format);
 /*  Sort the given ref_array as per the ref_sorting provided */
 void ref_array_sort(struct ref_sorting *sort, struct ref_array *array);
+/*  Based on the given format and quote_style, fill the strbuf */
+void format_ref_array_item(struct ref_array_item *info, const char *format,
+                          int quote_style, struct strbuf *final_buf);
 /*  Print the ref using the given format and quote_style */
 void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style);
 /*  Callback function for parsing the sort option */
@@ -106,5 +107,16 @@ int parse_opt_ref_sorting(const struct option *opt, const char *arg, int unset);
 struct ref_sorting *ref_default_sorting(void);
 /*  Function to parse --merged and --no-merged options */
 int parse_opt_merge_filter(const struct option *opt, const char *arg, int unset);
+/*  Get the current HEAD's description */
+char *get_head_description(void);
+/*  Set up translated strings in the output. */
+void setup_ref_filter_porcelain_msg(void);
+
+/*
+ * Print a single ref, outside of any ref-filter. Note that the
+ * name must be a fully qualified refname.
+ */
+void pretty_print_ref(const char *name, const unsigned char *sha1,
+               const char *format);
 
 #endif /*  REF_FILTER_H  */
index a246af27678a76d37c87bb56959ac050dff1f97f..c63eb1a3fd7fa1d6bdca8bacc1781bbf65f41593 100644 (file)
@@ -10,7 +10,7 @@ struct complete_reflogs {
        char *ref;
        const char *short_ref;
        struct reflog_info {
-               unsigned char osha1[20], nsha1[20];
+               struct object_id ooid, noid;
                char *email;
                unsigned long timestamp;
                int tz;
@@ -19,7 +19,7 @@ struct complete_reflogs {
        int nr, alloc;
 };
 
-static int read_one_reflog(unsigned char *osha1, unsigned char *nsha1,
+static int read_one_reflog(struct object_id *ooid, struct object_id *noid,
                const char *email, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
@@ -28,8 +28,8 @@ static int read_one_reflog(unsigned char *osha1, unsigned char *nsha1,
 
        ALLOC_GROW(array->items, array->nr + 1, array->alloc);
        item = array->items + array->nr;
-       hashcpy(item->osha1, osha1);
-       hashcpy(item->nsha1, nsha1);
+       oidcpy(&item->ooid, ooid);
+       oidcpy(&item->noid, noid);
        item->email = xstrdup(email);
        item->timestamp = timestamp;
        item->tz = tz;
@@ -45,11 +45,11 @@ static struct complete_reflogs *read_complete_reflog(const char *ref)
        reflogs->ref = xstrdup(ref);
        for_each_reflog_ent(ref, read_one_reflog, reflogs);
        if (reflogs->nr == 0) {
-               unsigned char sha1[20];
+               struct object_id oid;
                const char *name;
                void *name_to_free;
                name = name_to_free = resolve_refdup(ref, RESOLVE_REF_READING,
-                                                    sha1, NULL);
+                                                    oid.hash, NULL);
                if (name) {
                        for_each_reflog_ent(name, read_one_reflog, reflogs);
                        free(name_to_free);
@@ -172,18 +172,22 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
                reflogs = item->util;
        else {
                if (*branch == '\0') {
-                       unsigned char sha1[20];
+                       struct object_id oid;
                        free(branch);
-                       branch = resolve_refdup("HEAD", 0, sha1, NULL);
+                       branch = resolve_refdup("HEAD", 0, oid.hash, NULL);
                        if (!branch)
                                die ("No current branch");
 
                }
                reflogs = read_complete_reflog(branch);
                if (!reflogs || reflogs->nr == 0) {
-                       unsigned char sha1[20];
+                       struct object_id oid;
                        char *b;
-                       if (dwim_log(branch, strlen(branch), sha1, &b) == 1) {
+                       int ret = dwim_log(branch, strlen(branch),
+                                          oid.hash, &b);
+                       if (ret > 1)
+                               free(b);
+                       else if (ret == 1) {
                                if (reflogs) {
                                        free(reflogs->ref);
                                        free(reflogs);
@@ -193,17 +197,27 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
                                reflogs = read_complete_reflog(branch);
                        }
                }
-               if (!reflogs || reflogs->nr == 0)
+               if (!reflogs || reflogs->nr == 0) {
+                       if (reflogs) {
+                               free(reflogs->ref);
+                               free(reflogs);
+                       }
+                       free(branch);
                        return -1;
+               }
                string_list_insert(&info->complete_reflogs, branch)->util
                        = reflogs;
        }
+       free(branch);
 
        commit_reflog = xcalloc(1, sizeof(struct commit_reflog));
        if (recno < 0) {
                commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp);
                if (commit_reflog->recno < 0) {
-                       free(branch);
+                       if (reflogs) {
+                               free(reflogs->ref);
+                               free(reflogs);
+                       }
                        free(commit_reflog);
                        return -1;
                }
@@ -238,13 +252,13 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
        do {
                reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
                commit_reflog->recno--;
-               logobj = parse_object(reflog->osha1);
+               logobj = parse_object(reflog->ooid.hash);
        } while (commit_reflog->recno && (logobj && logobj->type != OBJ_COMMIT));
 
-       if (!logobj && commit_reflog->recno >= 0 && is_null_sha1(reflog->osha1)) {
+       if (!logobj && commit_reflog->recno >= 0 && is_null_sha1(reflog->ooid.hash)) {
                /* a root commit, but there are still more entries to show */
                reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
-               logobj = parse_object(reflog->nsha1);
+               logobj = parse_object(reflog->noid.hash);
        }
 
        if (!logobj || logobj->type != OBJ_COMMIT) {
diff --git a/refs.c b/refs.c
index 62055ab09103acd8301ce8c70e7d903da3fc9439..df75f8e0d695fc235c1a2497069a9b916a4a04e8 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -3,11 +3,33 @@
  */
 
 #include "cache.h"
+#include "hashmap.h"
 #include "lockfile.h"
+#include "iterator.h"
 #include "refs.h"
 #include "refs/refs-internal.h"
 #include "object.h"
 #include "tag.h"
+#include "submodule.h"
+
+/*
+ * List of all available backends
+ */
+static struct ref_storage_be *refs_backends = &refs_be_files;
+
+static struct ref_storage_be *find_ref_storage_backend(const char *name)
+{
+       struct ref_storage_be *be;
+       for (be = refs_backends; be; be = be->next)
+               if (!strcmp(be->name, name))
+                       return be;
+       return NULL;
+}
+
+int ref_storage_backend_exists(const char *name)
+{
+       return find_ref_storage_backend(name) != NULL;
+}
 
 /*
  * How to handle various characters in refnames:
@@ -150,11 +172,23 @@ int refname_is_safe(const char *refname)
        return 1;
 }
 
+char *refs_resolve_refdup(struct ref_store *refs,
+                         const char *refname, int resolve_flags,
+                         unsigned char *sha1, int *flags)
+{
+       const char *result;
+
+       result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
+                                        sha1, flags);
+       return xstrdup_or_null(result);
+}
+
 char *resolve_refdup(const char *refname, int resolve_flags,
                     unsigned char *sha1, int *flags)
 {
-       return xstrdup_or_null(resolve_ref_unsafe(refname, resolve_flags,
-                                                 sha1, flags));
+       return refs_resolve_refdup(get_main_ref_store(),
+                                  refname, resolve_flags,
+                                  sha1, flags);
 }
 
 /* The argument to filter_refs */
@@ -164,13 +198,20 @@ struct ref_filter {
        void *cb_data;
 };
 
-int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
+int refs_read_ref_full(struct ref_store *refs, const char *refname,
+                      int resolve_flags, unsigned char *sha1, int *flags)
 {
-       if (resolve_ref_unsafe(refname, resolve_flags, sha1, flags))
+       if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, sha1, flags))
                return 0;
        return -1;
 }
 
+int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
+{
+       return refs_read_ref_full(get_main_ref_store(), refname,
+                                 resolve_flags, sha1, flags);
+}
+
 int read_ref(const char *refname, unsigned char *sha1)
 {
        return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
@@ -265,34 +306,52 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_li
        for_each_rawref(warn_if_dangling_symref, &data);
 }
 
+int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+{
+       return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
+}
+
 int for_each_tag_ref(each_ref_fn fn, void *cb_data)
 {
-       return for_each_ref_in("refs/tags/", fn, cb_data);
+       return refs_for_each_tag_ref(get_main_ref_store(), fn, cb_data);
 }
 
 int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 {
-       return for_each_ref_in_submodule(submodule, "refs/tags/", fn, cb_data);
+       return refs_for_each_tag_ref(get_submodule_ref_store(submodule),
+                                    fn, cb_data);
+}
+
+int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+{
+       return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
 }
 
 int for_each_branch_ref(each_ref_fn fn, void *cb_data)
 {
-       return for_each_ref_in("refs/heads/", fn, cb_data);
+       return refs_for_each_branch_ref(get_main_ref_store(), fn, cb_data);
 }
 
 int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 {
-       return for_each_ref_in_submodule(submodule, "refs/heads/", fn, cb_data);
+       return refs_for_each_branch_ref(get_submodule_ref_store(submodule),
+                                       fn, cb_data);
+}
+
+int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+{
+       return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
 }
 
 int for_each_remote_ref(each_ref_fn fn, void *cb_data)
 {
-       return for_each_ref_in("refs/remotes/", fn, cb_data);
+       return refs_for_each_remote_ref(get_main_ref_store(), fn, cb_data);
 }
 
 int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 {
-       return for_each_ref_in_submodule(submodule, "refs/remotes/", fn, cb_data);
+       return refs_for_each_remote_ref(get_submodule_ref_store(submodule),
+                                       fn, cb_data);
 }
 
 int head_ref_namespaced(each_ref_fn fn, void *cb_data)
@@ -346,11 +405,11 @@ int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
 
 const char *prettify_refname(const char *name)
 {
-       return name + (
-               starts_with(name, "refs/heads/") ? 11 :
-               starts_with(name, "refs/tags/") ? 10 :
-               starts_with(name, "refs/remotes/") ? 13 :
-               0);
+       if (skip_prefix(name, "refs/heads/", &name) ||
+           skip_prefix(name, "refs/tags/", &name) ||
+           skip_prefix(name, "refs/remotes/", &name))
+               ; /* nothing */
+       return name;
 }
 
 static const char *ref_rev_parse_rules[] = {
@@ -385,7 +444,7 @@ int refname_match(const char *abbrev_name, const char *full_name)
 static char *substitute_branch_name(const char **string, int *len)
 {
        struct strbuf buf = STRBUF_INIT;
-       int ret = interpret_branch_name(*string, *len, &buf);
+       int ret = interpret_branch_name(*string, *len, &buf, 0);
 
        if (ret == *len) {
                size_t size;
@@ -400,32 +459,40 @@ static char *substitute_branch_name(const char **string, int *len)
 int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
 {
        char *last_branch = substitute_branch_name(&str, &len);
+       int   refs_found  = expand_ref(str, len, sha1, ref);
+       free(last_branch);
+       return refs_found;
+}
+
+int expand_ref(const char *str, int len, unsigned char *sha1, char **ref)
+{
        const char **p, *r;
        int refs_found = 0;
+       struct strbuf fullref = STRBUF_INIT;
 
        *ref = NULL;
        for (p = ref_rev_parse_rules; *p; p++) {
-               char fullref[PATH_MAX];
                unsigned char sha1_from_ref[20];
                unsigned char *this_result;
                int flag;
 
                this_result = refs_found ? sha1_from_ref : sha1;
-               mksnpath(fullref, sizeof(fullref), *p, len, str);
-               r = resolve_ref_unsafe(fullref, RESOLVE_REF_READING,
+               strbuf_reset(&fullref);
+               strbuf_addf(&fullref, *p, len, str);
+               r = resolve_ref_unsafe(fullref.buf, RESOLVE_REF_READING,
                                       this_result, &flag);
                if (r) {
                        if (!refs_found++)
                                *ref = xstrdup(r);
                        if (!warn_ambiguous_refs)
                                break;
-               } else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD")) {
-                       warning("ignoring dangling symref %s.", fullref);
-               } else if ((flag & REF_ISBROKEN) && strchr(fullref, '/')) {
-                       warning("ignoring broken ref %s.", fullref);
+               } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
+                       warning("ignoring dangling symref %s.", fullref.buf);
+               } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
+                       warning("ignoring broken ref %s.", fullref.buf);
                }
        }
-       free(last_branch);
+       strbuf_release(&fullref);
        return refs_found;
 }
 
@@ -434,21 +501,22 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
        char *last_branch = substitute_branch_name(&str, &len);
        const char **p;
        int logs_found = 0;
+       struct strbuf path = STRBUF_INIT;
 
        *log = NULL;
        for (p = ref_rev_parse_rules; *p; p++) {
                unsigned char hash[20];
-               char path[PATH_MAX];
                const char *ref, *it;
 
-               mksnpath(path, sizeof(path), *p, len, str);
-               ref = resolve_ref_unsafe(path, RESOLVE_REF_READING,
+               strbuf_reset(&path);
+               strbuf_addf(&path, *p, len, str);
+               ref = resolve_ref_unsafe(path.buf, RESOLVE_REF_READING,
                                         hash, NULL);
                if (!ref)
                        continue;
-               if (reflog_exists(path))
-                       it = path;
-               else if (strcmp(ref, path) && reflog_exists(ref))
+               if (reflog_exists(path.buf))
+                       it = path.buf;
+               else if (strcmp(ref, path.buf) && reflog_exists(ref))
                        it = ref;
                else
                        continue;
@@ -459,6 +527,7 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
                if (!warn_ambiguous_refs)
                        break;
        }
+       strbuf_release(&path);
        free(last_branch);
        return logs_found;
 }
@@ -566,19 +635,23 @@ static int delete_pseudoref(const char *pseudoref, const unsigned char *old_sha1
        return 0;
 }
 
-int delete_ref(const char *refname, const unsigned char *old_sha1,
-              unsigned int flags)
+int refs_delete_ref(struct ref_store *refs, const char *msg,
+                   const char *refname,
+                   const unsigned char *old_sha1,
+                   unsigned int flags)
 {
        struct ref_transaction *transaction;
        struct strbuf err = STRBUF_INIT;
 
-       if (ref_type(refname) == REF_TYPE_PSEUDOREF)
+       if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
+               assert(refs == get_main_ref_store());
                return delete_pseudoref(refname, old_sha1);
+       }
 
-       transaction = ref_transaction_begin(&err);
+       transaction = ref_store_transaction_begin(refs, &err);
        if (!transaction ||
            ref_transaction_delete(transaction, refname, old_sha1,
-                                  flags, NULL, &err) ||
+                                  flags, msg, &err) ||
            ref_transaction_commit(transaction, &err)) {
                error("%s", err.buf);
                ref_transaction_free(transaction);
@@ -590,6 +663,13 @@ int delete_ref(const char *refname, const unsigned char *old_sha1,
        return 0;
 }
 
+int delete_ref(const char *msg, const char *refname,
+              const unsigned char *old_sha1, unsigned int flags)
+{
+       return refs_delete_ref(get_main_ref_store(), msg, refname,
+                              old_sha1, flags);
+}
+
 int copy_reflog_msg(char *buf, const char *msg)
 {
        char *cp = buf;
@@ -613,12 +693,17 @@ int copy_reflog_msg(char *buf, const char *msg)
 
 int should_autocreate_reflog(const char *refname)
 {
-       if (!log_all_ref_updates)
+       switch (log_all_ref_updates) {
+       case LOG_REFS_ALWAYS:
+               return 1;
+       case LOG_REFS_NORMAL:
+               return starts_with(refname, "refs/heads/") ||
+                       starts_with(refname, "refs/remotes/") ||
+                       starts_with(refname, "refs/notes/") ||
+                       !strcmp(refname, "HEAD");
+       default:
                return 0;
-       return starts_with(refname, "refs/heads/") ||
-               starts_with(refname, "refs/remotes/") ||
-               starts_with(refname, "refs/notes/") ||
-               !strcmp(refname, "HEAD");
+       }
 }
 
 int is_branch(const char *refname)
@@ -644,7 +729,7 @@ struct read_ref_at_cb {
        int *cutoff_cnt;
 };
 
-static int read_ref_at_ent(unsigned char *osha1, unsigned char *nsha1,
+static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
                const char *email, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
@@ -668,30 +753,30 @@ static int read_ref_at_ent(unsigned char *osha1, unsigned char *nsha1,
                 * hold the values for the previous record.
                 */
                if (!is_null_sha1(cb->osha1)) {
-                       hashcpy(cb->sha1, nsha1);
-                       if (hashcmp(cb->osha1, nsha1))
+                       hashcpy(cb->sha1, noid->hash);
+                       if (hashcmp(cb->osha1, noid->hash))
                                warning("Log for ref %s has gap after %s.",
                                        cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
                }
                else if (cb->date == cb->at_time)
-                       hashcpy(cb->sha1, nsha1);
-               else if (hashcmp(nsha1, cb->sha1))
+                       hashcpy(cb->sha1, noid->hash);
+               else if (hashcmp(noid->hash, cb->sha1))
                        warning("Log for ref %s unexpectedly ended on %s.",
                                cb->refname, show_date(cb->date, cb->tz,
                                                       DATE_MODE(RFC2822)));
-               hashcpy(cb->osha1, osha1);
-               hashcpy(cb->nsha1, nsha1);
+               hashcpy(cb->osha1, ooid->hash);
+               hashcpy(cb->nsha1, noid->hash);
                cb->found_it = 1;
                return 1;
        }
-       hashcpy(cb->osha1, osha1);
-       hashcpy(cb->nsha1, nsha1);
+       hashcpy(cb->osha1, ooid->hash);
+       hashcpy(cb->nsha1, noid->hash);
        if (cb->cnt > 0)
                cb->cnt--;
        return 0;
 }
 
-static int read_ref_at_ent_oldest(unsigned char *osha1, unsigned char *nsha1,
+static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
                                  const char *email, unsigned long timestamp,
                                  int tz, const char *message, void *cb_data)
 {
@@ -705,9 +790,9 @@ static int read_ref_at_ent_oldest(unsigned char *osha1, unsigned char *nsha1,
                *cb->cutoff_tz = tz;
        if (cb->cutoff_cnt)
                *cb->cutoff_cnt = cb->reccnt;
-       hashcpy(cb->sha1, osha1);
+       hashcpy(cb->sha1, ooid->hash);
        if (is_null_sha1(cb->sha1))
-               hashcpy(cb->sha1, nsha1);
+               hashcpy(cb->sha1, noid->hash);
        /* We just want the first entry */
        return 1;
 }
@@ -744,11 +829,20 @@ int read_ref_at(const char *refname, unsigned int flags, unsigned long at_time,
        return 1;
 }
 
-struct ref_transaction *ref_transaction_begin(struct strbuf *err)
+struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
+                                                   struct strbuf *err)
 {
+       struct ref_transaction *tr;
        assert(err);
 
-       return xcalloc(1, sizeof(struct ref_transaction));
+       tr = xcalloc(1, sizeof(struct ref_transaction));
+       tr->ref_store = refs;
+       return tr;
+}
+
+struct ref_transaction *ref_transaction_begin(struct strbuf *err)
+{
+       return ref_store_transaction_begin(get_main_ref_store(), err);
 }
 
 void ref_transaction_free(struct ref_transaction *transaction)
@@ -857,18 +951,28 @@ int ref_transaction_verify(struct ref_transaction *transaction,
                                      flags, NULL, err);
 }
 
-int update_ref(const char *msg, const char *refname,
-              const unsigned char *new_sha1, const unsigned char *old_sha1,
+int update_ref_oid(const char *msg, const char *refname,
+              const struct object_id *new_oid, const struct object_id *old_oid,
               unsigned int flags, enum action_on_err onerr)
+{
+       return update_ref(msg, refname, new_oid ? new_oid->hash : NULL,
+               old_oid ? old_oid->hash : NULL, flags, onerr);
+}
+
+int refs_update_ref(struct ref_store *refs, const char *msg,
+                   const char *refname, const unsigned char *new_sha1,
+                   const unsigned char *old_sha1, unsigned int flags,
+                   enum action_on_err onerr)
 {
        struct ref_transaction *t = NULL;
        struct strbuf err = STRBUF_INIT;
        int ret = 0;
 
        if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
+               assert(refs == get_main_ref_store());
                ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
        } else {
-               t = ref_transaction_begin(&err);
+               t = ref_store_transaction_begin(refs, &err);
                if (!t ||
                    ref_transaction_update(t, refname, new_sha1, old_sha1,
                                           flags, msg, &err) ||
@@ -899,12 +1003,22 @@ int update_ref(const char *msg, const char *refname,
        return 0;
 }
 
+int update_ref(const char *msg, const char *refname,
+              const unsigned char *new_sha1,
+              const unsigned char *old_sha1,
+              unsigned int flags, enum action_on_err onerr)
+{
+       return refs_update_ref(get_main_ref_store(), msg, refname, new_sha1,
+                              old_sha1, flags, onerr);
+}
+
 char *shorten_unambiguous_ref(const char *refname, int strict)
 {
        int i;
        static char **scanf_fmts;
        static int nr_rules;
        char *short_name;
+       struct strbuf resolved_buf = STRBUF_INIT;
 
        if (!nr_rules) {
                /*
@@ -963,7 +1077,6 @@ char *shorten_unambiguous_ref(const char *refname, int strict)
                 */
                for (j = 0; j < rules_to_fail; j++) {
                        const char *rule = ref_rev_parse_rules[j];
-                       char refname[PATH_MAX];
 
                        /* skip matched rule */
                        if (i == j)
@@ -974,9 +1087,10 @@ char *shorten_unambiguous_ref(const char *refname, int strict)
                         * (with this previous rule) to a valid ref
                         * read_ref() returns 0 on success
                         */
-                       mksnpath(refname, sizeof(refname),
-                                rule, short_name_len, short_name);
-                       if (ref_exists(refname))
+                       strbuf_reset(&resolved_buf);
+                       strbuf_addf(&resolved_buf, rule,
+                                   short_name_len, short_name);
+                       if (ref_exists(resolved_buf.buf))
                                break;
                }
 
@@ -984,10 +1098,13 @@ char *shorten_unambiguous_ref(const char *refname, int strict)
                 * short name is non-ambiguous if all previous rules
                 * haven't resolved to a valid ref
                 */
-               if (j == rules_to_fail)
+               if (j == rules_to_fail) {
+                       strbuf_release(&resolved_buf);
                        return short_name;
+               }
        }
 
+       strbuf_release(&resolved_buf);
        free(short_name);
        return xstrdup(refname);
 }
@@ -996,10 +1113,10 @@ static struct string_list *hide_refs;
 
 int parse_hide_refs_config(const char *var, const char *value, const char *section)
 {
+       const char *key;
        if (!strcmp("transfer.hiderefs", var) ||
-           /* NEEDSWORK: use parse_config_key() once both are merged */
-           (starts_with(var, section) && var[strlen(section)] == '.' &&
-            !strcmp(var + strlen(section), ".hiderefs"))) {
+           (!parse_config_key(var, section, NULL, NULL, &key) &&
+            !strcmp(key, "hiderefs"))) {
                char *ref;
                int len;
 
@@ -1080,20 +1197,23 @@ const char *find_descendant_ref(const char *dirname,
        return NULL;
 }
 
-int rename_ref_available(const char *oldname, const char *newname)
+int refs_rename_ref_available(struct ref_store *refs,
+                             const char *old_refname,
+                             const char *new_refname)
 {
        struct string_list skip = STRING_LIST_INIT_NODUP;
        struct strbuf err = STRBUF_INIT;
-       int ret;
+       int ok;
 
-       string_list_insert(&skip, oldname);
-       ret = !verify_refname_available(newname, NULL, &skip, &err);
-       if (!ret)
+       string_list_insert(&skip, old_refname);
+       ok = !refs_verify_refname_available(refs, new_refname,
+                                           NULL, &skip, &err);
+       if (!ok)
                error("%s", err.buf);
 
        string_list_clear(&skip, 0);
        strbuf_release(&err);
-       return ret;
+       return ok;
 }
 
 int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
@@ -1119,6 +1239,18 @@ int head_ref(each_ref_fn fn, void *cb_data)
        return head_ref_submodule(NULL, fn, cb_data);
 }
 
+struct ref_iterator *refs_ref_iterator_begin(
+               struct ref_store *refs,
+               const char *prefix, int trim, int flags)
+{
+       struct ref_iterator *iter;
+
+       iter = refs->be->iterator_begin(refs, prefix, flags);
+       iter = prefix_ref_iterator_begin(iter, prefix, trim);
+
+       return iter;
+}
+
 /*
  * Call fn for each reference in the specified submodule for which the
  * refname begins with prefix. If trim is non-zero, then trim that
@@ -1128,30 +1260,43 @@ int head_ref(each_ref_fn fn, void *cb_data)
  * non-zero value, stop the iteration and return that value;
  * otherwise, return 0.
  */
-static int do_for_each_ref(const char *submodule, const char *prefix,
+static int do_for_each_ref(struct ref_store *refs, const char *prefix,
                           each_ref_fn fn, int trim, int flags, void *cb_data)
 {
        struct ref_iterator *iter;
 
-       iter = files_ref_iterator_begin(submodule, prefix, flags);
-       iter = prefix_ref_iterator_begin(iter, prefix, trim);
+       if (!refs)
+               return 0;
+
+       iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
 
        return do_for_each_ref_iterator(iter, fn, cb_data);
 }
 
+int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+{
+       return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
+}
+
 int for_each_ref(each_ref_fn fn, void *cb_data)
 {
-       return do_for_each_ref(NULL, "", fn, 0, 0, cb_data);
+       return refs_for_each_ref(get_main_ref_store(), fn, cb_data);
 }
 
 int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 {
-       return do_for_each_ref(submodule, "", fn, 0, 0, cb_data);
+       return refs_for_each_ref(get_submodule_ref_store(submodule), fn, cb_data);
+}
+
+int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
+                        each_ref_fn fn, void *cb_data)
+{
+       return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
 }
 
 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
 {
-       return do_for_each_ref(NULL, prefix, fn, strlen(prefix), 0, cb_data);
+       return refs_for_each_ref_in(get_main_ref_store(), prefix, fn, cb_data);
 }
 
 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
@@ -1160,19 +1305,23 @@ int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsig
 
        if (broken)
                flag = DO_FOR_EACH_INCLUDE_BROKEN;
-       return do_for_each_ref(NULL, prefix, fn, 0, flag, cb_data);
+       return do_for_each_ref(get_main_ref_store(),
+                              prefix, fn, 0, flag, cb_data);
 }
 
 int for_each_ref_in_submodule(const char *submodule, const char *prefix,
-               each_ref_fn fn, void *cb_data)
+                             each_ref_fn fn, void *cb_data)
 {
-       return do_for_each_ref(submodule, prefix, fn, strlen(prefix), 0, cb_data);
+       return refs_for_each_ref_in(get_submodule_ref_store(submodule),
+                                   prefix, fn, cb_data);
 }
 
 int for_each_replace_ref(each_ref_fn fn, void *cb_data)
 {
-       return do_for_each_ref(NULL, git_replace_ref_base, fn,
-                              strlen(git_replace_ref_base), 0, cb_data);
+       return do_for_each_ref(get_main_ref_store(),
+                              git_replace_ref_base, fn,
+                              strlen(git_replace_ref_base),
+                              0, cb_data);
 }
 
 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
@@ -1180,20 +1329,35 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
        struct strbuf buf = STRBUF_INIT;
        int ret;
        strbuf_addf(&buf, "%srefs/", get_git_namespace());
-       ret = do_for_each_ref(NULL, buf.buf, fn, 0, 0, cb_data);
+       ret = do_for_each_ref(get_main_ref_store(),
+                             buf.buf, fn, 0, 0, cb_data);
        strbuf_release(&buf);
        return ret;
 }
 
-int for_each_rawref(each_ref_fn fn, void *cb_data)
+int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
 {
-       return do_for_each_ref(NULL, "", fn, 0,
+       return do_for_each_ref(refs, "", fn, 0,
                               DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
 }
 
+int for_each_rawref(each_ref_fn fn, void *cb_data)
+{
+       return refs_for_each_rawref(get_main_ref_store(), fn, cb_data);
+}
+
+int refs_read_raw_ref(struct ref_store *ref_store,
+                     const char *refname, unsigned char *sha1,
+                     struct strbuf *referent, unsigned int *type)
+{
+       return ref_store->be->read_raw_ref(ref_store, refname, sha1, referent, type);
+}
+
 /* This function needs to return a meaningful errno on failure */
-const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
-                              unsigned char *sha1, int *flags)
+const char *refs_resolve_ref_unsafe(struct ref_store *refs,
+                                   const char *refname,
+                                   int resolve_flags,
+                                   unsigned char *sha1, int *flags)
 {
        static struct strbuf sb_refname = STRBUF_INIT;
        int unused_flags;
@@ -1225,7 +1389,8 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
        for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
                unsigned int read_flags = 0;
 
-               if (read_raw_ref(refname, sha1, &sb_refname, &read_flags)) {
+               if (refs_read_raw_ref(refs, refname,
+                                     sha1, &sb_refname, &read_flags)) {
                        *flags |= read_flags;
                        if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
                                return NULL;
@@ -1264,3 +1429,465 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
        errno = ELOOP;
        return NULL;
 }
+
+/* backend functions */
+int refs_init_db(struct strbuf *err)
+{
+       struct ref_store *refs = get_main_ref_store();
+
+       return refs->be->init_db(refs, err);
+}
+
+const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
+                              unsigned char *sha1, int *flags)
+{
+       return refs_resolve_ref_unsafe(get_main_ref_store(), refname,
+                                      resolve_flags, sha1, flags);
+}
+
+int resolve_gitlink_ref(const char *submodule, const char *refname,
+                       unsigned char *sha1)
+{
+       size_t len = strlen(submodule);
+       struct ref_store *refs;
+       int flags;
+
+       while (len && submodule[len - 1] == '/')
+               len--;
+
+       if (!len)
+               return -1;
+
+       if (submodule[len]) {
+               /* We need to strip off one or more trailing slashes */
+               char *stripped = xmemdupz(submodule, len);
+
+               refs = get_submodule_ref_store(stripped);
+               free(stripped);
+       } else {
+               refs = get_submodule_ref_store(submodule);
+       }
+
+       if (!refs)
+               return -1;
+
+       if (!refs_resolve_ref_unsafe(refs, refname, 0, sha1, &flags) ||
+           is_null_sha1(sha1))
+               return -1;
+       return 0;
+}
+
+struct submodule_hash_entry
+{
+       struct hashmap_entry ent; /* must be the first member! */
+
+       struct ref_store *refs;
+
+       /* NUL-terminated name of submodule: */
+       char submodule[FLEX_ARRAY];
+};
+
+static int submodule_hash_cmp(const void *entry, const void *entry_or_key,
+                             const void *keydata)
+{
+       const struct submodule_hash_entry *e1 = entry, *e2 = entry_or_key;
+       const char *submodule = keydata ? keydata : e2->submodule;
+
+       return strcmp(e1->submodule, submodule);
+}
+
+static struct submodule_hash_entry *alloc_submodule_hash_entry(
+               const char *submodule, struct ref_store *refs)
+{
+       struct submodule_hash_entry *entry;
+
+       FLEX_ALLOC_STR(entry, submodule, submodule);
+       hashmap_entry_init(entry, strhash(submodule));
+       entry->refs = refs;
+       return entry;
+}
+
+/* A pointer to the ref_store for the main repository: */
+static struct ref_store *main_ref_store;
+
+/* A hashmap of ref_stores, stored by submodule name: */
+static struct hashmap submodule_ref_stores;
+
+/*
+ * Return the ref_store instance for the specified submodule. If that
+ * ref_store hasn't been initialized yet, return NULL.
+ */
+static struct ref_store *lookup_submodule_ref_store(const char *submodule)
+{
+       struct submodule_hash_entry *entry;
+
+       if (!submodule_ref_stores.tablesize)
+               /* It's initialized on demand in register_ref_store(). */
+               return NULL;
+
+       entry = hashmap_get_from_hash(&submodule_ref_stores,
+                                     strhash(submodule), submodule);
+       return entry ? entry->refs : NULL;
+}
+
+/*
+ * Create, record, and return a ref_store instance for the specified
+ * gitdir.
+ */
+static struct ref_store *ref_store_init(const char *gitdir,
+                                       unsigned int flags)
+{
+       const char *be_name = "files";
+       struct ref_storage_be *be = find_ref_storage_backend(be_name);
+       struct ref_store *refs;
+
+       if (!be)
+               die("BUG: reference backend %s is unknown", be_name);
+
+       refs = be->init(gitdir, flags);
+       return refs;
+}
+
+struct ref_store *get_main_ref_store(void)
+{
+       if (main_ref_store)
+               return main_ref_store;
+
+       main_ref_store = ref_store_init(get_git_dir(),
+                                       (REF_STORE_READ |
+                                        REF_STORE_WRITE |
+                                        REF_STORE_ODB |
+                                        REF_STORE_MAIN));
+       return main_ref_store;
+}
+
+/*
+ * Register the specified ref_store to be the one that should be used
+ * for submodule. It is a fatal error to call this function twice for
+ * the same submodule.
+ */
+static void register_submodule_ref_store(struct ref_store *refs,
+                                        const char *submodule)
+{
+       if (!submodule_ref_stores.tablesize)
+               hashmap_init(&submodule_ref_stores, submodule_hash_cmp, 0);
+
+       if (hashmap_put(&submodule_ref_stores,
+                       alloc_submodule_hash_entry(submodule, refs)))
+               die("BUG: ref_store for submodule '%s' initialized twice",
+                   submodule);
+}
+
+struct ref_store *get_submodule_ref_store(const char *submodule)
+{
+       struct strbuf submodule_sb = STRBUF_INIT;
+       struct ref_store *refs;
+       int ret;
+
+       if (!submodule || !*submodule) {
+               /*
+                * FIXME: This case is ideally not allowed. But that
+                * can't happen until we clean up all the callers.
+                */
+               return get_main_ref_store();
+       }
+
+       refs = lookup_submodule_ref_store(submodule);
+       if (refs)
+               return refs;
+
+       strbuf_addstr(&submodule_sb, submodule);
+       ret = is_nonbare_repository_dir(&submodule_sb);
+       strbuf_release(&submodule_sb);
+       if (!ret)
+               return NULL;
+
+       ret = submodule_to_gitdir(&submodule_sb, submodule);
+       if (ret) {
+               strbuf_release(&submodule_sb);
+               return NULL;
+       }
+
+       /* assume that add_submodule_odb() has been called */
+       refs = ref_store_init(submodule_sb.buf,
+                             REF_STORE_READ | REF_STORE_ODB);
+       register_submodule_ref_store(refs, submodule);
+
+       strbuf_release(&submodule_sb);
+       return refs;
+}
+
+void base_ref_store_init(struct ref_store *refs,
+                        const struct ref_storage_be *be)
+{
+       refs->be = be;
+}
+
+/* backend functions */
+int refs_pack_refs(struct ref_store *refs, unsigned int flags)
+{
+       return refs->be->pack_refs(refs, flags);
+}
+
+int refs_peel_ref(struct ref_store *refs, const char *refname,
+                 unsigned char *sha1)
+{
+       return refs->be->peel_ref(refs, refname, sha1);
+}
+
+int peel_ref(const char *refname, unsigned char *sha1)
+{
+       return refs_peel_ref(get_main_ref_store(), refname, sha1);
+}
+
+int refs_create_symref(struct ref_store *refs,
+                      const char *ref_target,
+                      const char *refs_heads_master,
+                      const char *logmsg)
+{
+       return refs->be->create_symref(refs, ref_target,
+                                      refs_heads_master,
+                                      logmsg);
+}
+
+int create_symref(const char *ref_target, const char *refs_heads_master,
+                 const char *logmsg)
+{
+       return refs_create_symref(get_main_ref_store(), ref_target,
+                                 refs_heads_master, logmsg);
+}
+
+int ref_transaction_commit(struct ref_transaction *transaction,
+                          struct strbuf *err)
+{
+       struct ref_store *refs = transaction->ref_store;
+
+       if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
+               strbuf_addstr(err,
+                             _("ref updates forbidden inside quarantine environment"));
+               return -1;
+       }
+
+       return refs->be->transaction_commit(refs, transaction, err);
+}
+
+int refs_verify_refname_available(struct ref_store *refs,
+                                 const char *refname,
+                                 const struct string_list *extras,
+                                 const struct string_list *skip,
+                                 struct strbuf *err)
+{
+       const char *slash;
+       const char *extra_refname;
+       struct strbuf dirname = STRBUF_INIT;
+       struct strbuf referent = STRBUF_INIT;
+       struct object_id oid;
+       unsigned int type;
+       struct ref_iterator *iter;
+       int ok;
+       int ret = -1;
+
+       /*
+        * For the sake of comments in this function, suppose that
+        * refname is "refs/foo/bar".
+        */
+
+       assert(err);
+
+       strbuf_grow(&dirname, strlen(refname) + 1);
+       for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
+               /* Expand dirname to the new prefix, not including the trailing slash: */
+               strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
+
+               /*
+                * We are still at a leading dir of the refname (e.g.,
+                * "refs/foo"; if there is a reference with that name,
+                * it is a conflict, *unless* it is in skip.
+                */
+               if (skip && string_list_has_string(skip, dirname.buf))
+                       continue;
+
+               if (!refs_read_raw_ref(refs, dirname.buf, oid.hash, &referent, &type)) {
+                       strbuf_addf(err, "'%s' exists; cannot create '%s'",
+                                   dirname.buf, refname);
+                       goto cleanup;
+               }
+
+               if (extras && string_list_has_string(extras, dirname.buf)) {
+                       strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
+                                   refname, dirname.buf);
+                       goto cleanup;
+               }
+       }
+
+       /*
+        * We are at the leaf of our refname (e.g., "refs/foo/bar").
+        * There is no point in searching for a reference with that
+        * name, because a refname isn't considered to conflict with
+        * itself. But we still need to check for references whose
+        * names are in the "refs/foo/bar/" namespace, because they
+        * *do* conflict.
+        */
+       strbuf_addstr(&dirname, refname + dirname.len);
+       strbuf_addch(&dirname, '/');
+
+       iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
+                                      DO_FOR_EACH_INCLUDE_BROKEN);
+       while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
+               if (skip &&
+                   string_list_has_string(skip, iter->refname))
+                       continue;
+
+               strbuf_addf(err, "'%s' exists; cannot create '%s'",
+                           iter->refname, refname);
+               ref_iterator_abort(iter);
+               goto cleanup;
+       }
+
+       if (ok != ITER_DONE)
+               die("BUG: error while iterating over references");
+
+       extra_refname = find_descendant_ref(dirname.buf, extras, skip);
+       if (extra_refname)
+               strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
+                           refname, extra_refname);
+       else
+               ret = 0;
+
+cleanup:
+       strbuf_release(&referent);
+       strbuf_release(&dirname);
+       return ret;
+}
+
+int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+{
+       struct ref_iterator *iter;
+
+       iter = refs->be->reflog_iterator_begin(refs);
+
+       return do_for_each_ref_iterator(iter, fn, cb_data);
+}
+
+int for_each_reflog(each_ref_fn fn, void *cb_data)
+{
+       return refs_for_each_reflog(get_main_ref_store(), fn, cb_data);
+}
+
+int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
+                                    const char *refname,
+                                    each_reflog_ent_fn fn,
+                                    void *cb_data)
+{
+       return refs->be->for_each_reflog_ent_reverse(refs, refname,
+                                                    fn, cb_data);
+}
+
+int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
+                               void *cb_data)
+{
+       return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
+                                               refname, fn, cb_data);
+}
+
+int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
+                            each_reflog_ent_fn fn, void *cb_data)
+{
+       return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
+}
+
+int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
+                       void *cb_data)
+{
+       return refs_for_each_reflog_ent(get_main_ref_store(), refname,
+                                       fn, cb_data);
+}
+
+int refs_reflog_exists(struct ref_store *refs, const char *refname)
+{
+       return refs->be->reflog_exists(refs, refname);
+}
+
+int reflog_exists(const char *refname)
+{
+       return refs_reflog_exists(get_main_ref_store(), refname);
+}
+
+int refs_create_reflog(struct ref_store *refs, const char *refname,
+                      int force_create, struct strbuf *err)
+{
+       return refs->be->create_reflog(refs, refname, force_create, err);
+}
+
+int safe_create_reflog(const char *refname, int force_create,
+                      struct strbuf *err)
+{
+       return refs_create_reflog(get_main_ref_store(), refname,
+                                 force_create, err);
+}
+
+int refs_delete_reflog(struct ref_store *refs, const char *refname)
+{
+       return refs->be->delete_reflog(refs, refname);
+}
+
+int delete_reflog(const char *refname)
+{
+       return refs_delete_reflog(get_main_ref_store(), refname);
+}
+
+int refs_reflog_expire(struct ref_store *refs,
+                      const char *refname, const unsigned char *sha1,
+                      unsigned int flags,
+                      reflog_expiry_prepare_fn prepare_fn,
+                      reflog_expiry_should_prune_fn should_prune_fn,
+                      reflog_expiry_cleanup_fn cleanup_fn,
+                      void *policy_cb_data)
+{
+       return refs->be->reflog_expire(refs, refname, sha1, flags,
+                                      prepare_fn, should_prune_fn,
+                                      cleanup_fn, policy_cb_data);
+}
+
+int reflog_expire(const char *refname, const unsigned char *sha1,
+                 unsigned int flags,
+                 reflog_expiry_prepare_fn prepare_fn,
+                 reflog_expiry_should_prune_fn should_prune_fn,
+                 reflog_expiry_cleanup_fn cleanup_fn,
+                 void *policy_cb_data)
+{
+       return refs_reflog_expire(get_main_ref_store(),
+                                 refname, sha1, flags,
+                                 prepare_fn, should_prune_fn,
+                                 cleanup_fn, policy_cb_data);
+}
+
+int initial_ref_transaction_commit(struct ref_transaction *transaction,
+                                  struct strbuf *err)
+{
+       struct ref_store *refs = transaction->ref_store;
+
+       return refs->be->initial_transaction_commit(refs, transaction, err);
+}
+
+int refs_delete_refs(struct ref_store *refs, struct string_list *refnames,
+                    unsigned int flags)
+{
+       return refs->be->delete_refs(refs, refnames, flags);
+}
+
+int delete_refs(struct string_list *refnames, unsigned int flags)
+{
+       return refs_delete_refs(get_main_ref_store(), refnames, flags);
+}
+
+int refs_rename_ref(struct ref_store *refs, const char *oldref,
+                   const char *newref, const char *logmsg)
+{
+       return refs->be->rename_ref(refs, oldref, newref, logmsg);
+}
+
+int rename_ref(const char *oldref, const char *newref, const char *logmsg)
+{
+       return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
+}
diff --git a/refs.h b/refs.h
index 1b020437586d4480377080c95adb446f28d03a46..07cf4cd41b15ee5dafdb5c99983b136db84aaa81 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -1,6 +1,11 @@
 #ifndef REFS_H
 #define REFS_H
 
+struct object_id;
+struct ref_store;
+struct strbuf;
+struct string_list;
+
 /*
  * Resolve a reference, recursively following symbolic refererences.
  *
 #define RESOLVE_REF_NO_RECURSE 0x02
 #define RESOLVE_REF_ALLOW_BAD_NAME 0x04
 
+const char *refs_resolve_ref_unsafe(struct ref_store *refs,
+                                   const char *refname,
+                                   int resolve_flags,
+                                   unsigned char *sha1,
+                                   int *flags);
 const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
                               unsigned char *sha1, int *flags);
 
+char *refs_resolve_refdup(struct ref_store *refs,
+                         const char *refname, int resolve_flags,
+                         unsigned char *sha1, int *flags);
 char *resolve_refdup(const char *refname, int resolve_flags,
                     unsigned char *sha1, int *flags);
 
+int refs_read_ref_full(struct ref_store *refs, const char *refname,
+                      int resolve_flags, unsigned char *sha1, int *flags);
 int read_ref_full(const char *refname, int resolve_flags,
                  unsigned char *sha1, int *flags);
 int read_ref(const char *refname, unsigned char *sha1);
 
+/*
+ * Return 0 if a reference named refname could be created without
+ * conflicting with the name of an existing reference. Otherwise,
+ * return a negative value and write an explanation to err. If extras
+ * is non-NULL, it is a list of additional refnames with which refname
+ * is not allowed to conflict. If skip is non-NULL, ignore potential
+ * conflicts with refs in skip (e.g., because they are scheduled for
+ * deletion in the same operation). Behavior is undefined if the same
+ * name is listed in both extras and skip.
+ *
+ * Two reference names conflict if one of them exactly matches the
+ * leading components of the other; e.g., "foo/bar" conflicts with
+ * both "foo" and with "foo/bar/baz" but not with "foo/bar" or
+ * "foo/barbados".
+ *
+ * extras and skip must be sorted.
+ */
+
+int refs_verify_refname_available(struct ref_store *refs,
+                                 const char *refname,
+                                 const struct string_list *extras,
+                                 const struct string_list *skip,
+                                 struct strbuf *err);
+
 int ref_exists(const char *refname);
 
+int should_autocreate_reflog(const char *refname);
+
 int is_branch(const char *refname);
 
+extern int refs_init_db(struct strbuf *err);
+
 /*
  * If refname is a non-symbolic reference that refers to a tag object,
  * and the tag can be (recursively) dereferenced to a non-tag object,
@@ -74,14 +117,17 @@ int is_branch(const char *refname);
  * Symbolic references are considered unpeelable, even if they
  * ultimately resolve to a peelable tag.
  */
+int refs_peel_ref(struct ref_store *refs, const char *refname,
+                 unsigned char *sha1);
 int peel_ref(const char *refname, unsigned char *sha1);
 
 /**
- * Resolve refname in the nested "gitlink" repository that is located
- * at path.  If the resolution is successful, return 0 and set sha1 to
- * the name of the object; otherwise, return a non-zero value.
+ * Resolve refname in the nested "gitlink" repository in the specified
+ * submodule (which must be non-NULL). If the resolution is
+ * successful, return 0 and set sha1 to the name of the object;
+ * otherwise, return a non-zero value.
  */
-int resolve_gitlink_ref(const char *path, const char *refname,
+int resolve_gitlink_ref(const char *submodule, const char *refname,
                        unsigned char *sha1);
 
 /*
@@ -91,6 +137,7 @@ int resolve_gitlink_ref(const char *path, const char *refname,
  */
 int refname_match(const char *abbrev_name, const char *full_name);
 
+int expand_ref(const char *str, int len, unsigned char *sha1, char **ref);
 int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref);
 int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
 
@@ -183,8 +230,19 @@ typedef int each_ref_fn(const char *refname,
  * it is not safe to modify references while an iteration is in
  * progress, unless the same callback function invocation that
  * modifies the reference also returns a nonzero value to immediately
- * stop the iteration.
+ * stop the iteration. Returned references are sorted.
  */
+int refs_for_each_ref(struct ref_store *refs,
+                     each_ref_fn fn, void *cb_data);
+int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
+                        each_ref_fn fn, void *cb_data);
+int refs_for_each_tag_ref(struct ref_store *refs,
+                         each_ref_fn fn, void *cb_data);
+int refs_for_each_branch_ref(struct ref_store *refs,
+                            each_ref_fn fn, void *cb_data);
+int refs_for_each_remote_ref(struct ref_store *refs,
+                            each_ref_fn fn, void *cb_data);
+
 int head_ref(each_ref_fn fn, void *cb_data);
 int for_each_ref(each_ref_fn fn, void *cb_data);
 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data);
@@ -214,6 +272,7 @@ int head_ref_namespaced(each_ref_fn fn, void *cb_data);
 int for_each_namespaced_ref(each_ref_fn fn, void *cb_data);
 
 /* can be used to learn about broken ref and symref */
+int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data);
 int for_each_rawref(each_ref_fn fn, void *cb_data);
 
 static inline const char *has_glob_specials(const char *pattern)
@@ -237,7 +296,7 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt,
  * Write a packed-refs file for the current repository.
  * flags: Combination of the above PACK_REFS_* flags.
  */
-int pack_refs(unsigned int flags);
+int refs_pack_refs(struct ref_store *refs, unsigned int flags);
 
 /*
  * Flags controlling ref_transaction_update(), ref_transaction_create(), etc.
@@ -252,6 +311,8 @@ int pack_refs(unsigned int flags);
 /*
  * Setup reflog before using. Fill in err and return -1 on failure.
  */
+int refs_create_reflog(struct ref_store *refs, const char *refname,
+                      int force_create, struct strbuf *err);
 int safe_create_reflog(const char *refname, int force_create, struct strbuf *err);
 
 /** Reads log for the value of ref during at_time. **/
@@ -261,6 +322,7 @@ int read_ref_at(const char *refname, unsigned int flags,
                unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
 
 /** Check if a particular reflog exists */
+int refs_reflog_exists(struct ref_store *refs, const char *refname);
 int reflog_exists(const char *refname);
 
 /*
@@ -270,8 +332,12 @@ int reflog_exists(const char *refname);
  * exists, regardless of its old value. It is an error for old_sha1 to
  * be NULL_SHA1. flags is passed through to ref_transaction_delete().
  */
-int delete_ref(const char *refname, const unsigned char *old_sha1,
-              unsigned int flags);
+int refs_delete_ref(struct ref_store *refs, const char *msg,
+                   const char *refname,
+                   const unsigned char *old_sha1,
+                   unsigned int flags);
+int delete_ref(const char *msg, const char *refname,
+              const unsigned char *old_sha1, unsigned int flags);
 
 /*
  * Delete the specified references. If there are any problems, emit
@@ -279,24 +345,34 @@ int delete_ref(const char *refname, const unsigned char *old_sha1,
  * an all-or-nothing transaction). flags is passed through to
  * ref_transaction_delete().
  */
+int refs_delete_refs(struct ref_store *refs, struct string_list *refnames,
+                    unsigned int flags);
 int delete_refs(struct string_list *refnames, unsigned int flags);
 
 /** Delete a reflog */
+int refs_delete_reflog(struct ref_store *refs, const char *refname);
 int delete_reflog(const char *refname);
 
 /* iterate over reflog entries */
 typedef int each_reflog_ent_fn(
-               unsigned char *old_sha1, unsigned char *new_sha1,
+               struct object_id *old_oid, struct object_id *new_oid,
                const char *committer, unsigned long timestamp,
                int tz, const char *msg, void *cb_data);
 
+int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
+                            each_reflog_ent_fn fn, void *cb_data);
+int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
+                                    const char *refname,
+                                    each_reflog_ent_fn fn,
+                                    void *cb_data);
 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data);
 int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data);
 
 /*
  * Calls the specified function for each reflog file until it returns nonzero,
- * and returns the value
+ * and returns the value. Reflog file order is unspecified.
  */
+int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data);
 int for_each_reflog(each_ref_fn fn, void *cb_data);
 
 #define REFNAME_ALLOW_ONELEVEL 1
@@ -317,8 +393,12 @@ const char *prettify_refname(const char *refname);
 char *shorten_unambiguous_ref(const char *refname, int strict);
 
 /** rename ref, return 0 on success **/
+int refs_rename_ref(struct ref_store *refs, const char *oldref,
+                   const char *newref, const char *logmsg);
 int rename_ref(const char *oldref, const char *newref, const char *logmsg);
 
+int refs_create_symref(struct ref_store *refs, const char *refname,
+                      const char *target, const char *logmsg);
 int create_symref(const char *refname, const char *target, const char *logmsg);
 
 /*
@@ -328,7 +408,8 @@ int create_symref(const char *refname, const char *target, const char *logmsg);
  * $GIT_DIR points to.
  * Return 0 if successful, non-zero otherwise.
  * */
-int set_worktree_head_symref(const char *gitdir, const char *target);
+int set_worktree_head_symref(const char *gitdir, const char *target,
+                            const char *logmsg);
 
 enum action_on_err {
        UPDATE_REFS_MSG_ON_ERR,
@@ -340,6 +421,8 @@ enum action_on_err {
  * Begin a reference transaction.  The reference transaction must
  * be freed by calling ref_transaction_free().
  */
+struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
+                                                   struct strbuf *err);
 struct ref_transaction *ref_transaction_begin(struct strbuf *err);
 
 /*
@@ -474,9 +557,15 @@ void ref_transaction_free(struct ref_transaction *transaction);
  * ref_transaction_update(). Handle errors as requested by the `onerr`
  * argument.
  */
+int refs_update_ref(struct ref_store *refs, const char *msg, const char *refname,
+                   const unsigned char *new_sha1, const unsigned char *old_sha1,
+                   unsigned int flags, enum action_on_err onerr);
 int update_ref(const char *msg, const char *refname,
               const unsigned char *new_sha1, const unsigned char *old_sha1,
               unsigned int flags, enum action_on_err onerr);
+int update_ref_oid(const char *msg, const char *refname,
+              const struct object_id *new_oid, const struct object_id *old_oid,
+              unsigned int flags, enum action_on_err onerr);
 
 int parse_hide_refs_config(const char *var, const char *value, const char *);
 
@@ -537,6 +626,14 @@ typedef void reflog_expiry_cleanup_fn(void *cb_data);
  * enum expire_reflog_flags. The three function pointers are described
  * above. On success, return zero.
  */
+int refs_reflog_expire(struct ref_store *refs,
+                      const char *refname,
+                      const unsigned char *sha1,
+                      unsigned int flags,
+                      reflog_expiry_prepare_fn prepare_fn,
+                      reflog_expiry_should_prune_fn should_prune_fn,
+                      reflog_expiry_cleanup_fn cleanup_fn,
+                      void *policy_cb_data);
 int reflog_expire(const char *refname, const unsigned char *sha1,
                  unsigned int flags,
                  reflog_expiry_prepare_fn prepare_fn,
@@ -544,4 +641,19 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
                  reflog_expiry_cleanup_fn cleanup_fn,
                  void *policy_cb_data);
 
+int ref_storage_backend_exists(const char *name);
+
+struct ref_store *get_main_ref_store(void);
+/*
+ * Return the ref_store instance for the specified submodule. For the
+ * main repository, use submodule==NULL; such a call cannot fail. For
+ * a submodule, the submodule must exist and be a nonbare repository,
+ * otherwise return NULL. If the requested reference store has not yet
+ * been initialized, initialize it first.
+ *
+ * For backwards compatibility, submodule=="" is treated the same as
+ * submodule==NULL.
+ */
+struct ref_store *get_submodule_ref_store(const char *submodule);
+
 #endif /* REFS_H */
index 2455564352e1dafd5a95cd25b7279ead69b24660..83ea080e013f90e95d1897258dd80b44ac9b5db6 100644 (file)
@@ -1,6 +1,7 @@
 #include "../cache.h"
 #include "../refs.h"
 #include "refs-internal.h"
+#include "ref-cache.h"
 #include "../iterator.h"
 #include "../dir-iterator.h"
 #include "../lockfile.h"
@@ -13,507 +14,6 @@ struct ref_lock {
        struct object_id old_oid;
 };
 
-struct ref_entry;
-
-/*
- * Information used (along with the information in ref_entry) to
- * describe a single cached reference.  This data structure only
- * occurs embedded in a union in struct ref_entry, and only when
- * (ref_entry->flag & REF_DIR) is zero.
- */
-struct ref_value {
-       /*
-        * The name of the object to which this reference resolves
-        * (which may be a tag object).  If REF_ISBROKEN, this is
-        * null.  If REF_ISSYMREF, then this is the name of the object
-        * referred to by the last reference in the symlink chain.
-        */
-       struct object_id oid;
-
-       /*
-        * If REF_KNOWS_PEELED, then this field holds the peeled value
-        * of this reference, or null if the reference is known not to
-        * be peelable.  See the documentation for peel_ref() for an
-        * exact definition of "peelable".
-        */
-       struct object_id peeled;
-};
-
-struct ref_cache;
-
-/*
- * Information used (along with the information in ref_entry) to
- * describe a level in the hierarchy of references.  This data
- * structure only occurs embedded in a union in struct ref_entry, and
- * only when (ref_entry.flag & REF_DIR) is set.  In that case,
- * (ref_entry.flag & REF_INCOMPLETE) determines whether the references
- * in the directory have already been read:
- *
- *     (ref_entry.flag & REF_INCOMPLETE) unset -- a directory of loose
- *         or packed references, already read.
- *
- *     (ref_entry.flag & REF_INCOMPLETE) set -- a directory of loose
- *         references that hasn't been read yet (nor has any of its
- *         subdirectories).
- *
- * Entries within a directory are stored within a growable array of
- * pointers to ref_entries (entries, nr, alloc).  Entries 0 <= i <
- * sorted are sorted by their component name in strcmp() order and the
- * remaining entries are unsorted.
- *
- * Loose references are read lazily, one directory at a time.  When a
- * directory of loose references is read, then all of the references
- * in that directory are stored, and REF_INCOMPLETE stubs are created
- * for any subdirectories, but the subdirectories themselves are not
- * read.  The reading is triggered by get_ref_dir().
- */
-struct ref_dir {
-       int nr, alloc;
-
-       /*
-        * Entries with index 0 <= i < sorted are sorted by name.  New
-        * entries are appended to the list unsorted, and are sorted
-        * only when required; thus we avoid the need to sort the list
-        * after the addition of every reference.
-        */
-       int sorted;
-
-       /* A pointer to the ref_cache that contains this ref_dir. */
-       struct ref_cache *ref_cache;
-
-       struct ref_entry **entries;
-};
-
-/*
- * Bit values for ref_entry::flag.  REF_ISSYMREF=0x01,
- * REF_ISPACKED=0x02, REF_ISBROKEN=0x04 and REF_BAD_NAME=0x08 are
- * public values; see refs.h.
- */
-
-/*
- * The field ref_entry->u.value.peeled of this value entry contains
- * the correct peeled value for the reference, which might be
- * null_sha1 if the reference is not a tag or if it is broken.
- */
-#define REF_KNOWS_PEELED 0x10
-
-/* ref_entry represents a directory of references */
-#define REF_DIR 0x20
-
-/*
- * Entry has not yet been read from disk (used only for REF_DIR
- * entries representing loose references)
- */
-#define REF_INCOMPLETE 0x40
-
-/*
- * A ref_entry represents either a reference or a "subdirectory" of
- * references.
- *
- * Each directory in the reference namespace is represented by a
- * ref_entry with (flags & REF_DIR) set and containing a subdir member
- * that holds the entries in that directory that have been read so
- * far.  If (flags & REF_INCOMPLETE) is set, then the directory and
- * its subdirectories haven't been read yet.  REF_INCOMPLETE is only
- * used for loose reference directories.
- *
- * References are represented by a ref_entry with (flags & REF_DIR)
- * unset and a value member that describes the reference's value.  The
- * flag member is at the ref_entry level, but it is also needed to
- * interpret the contents of the value field (in other words, a
- * ref_value object is not very much use without the enclosing
- * ref_entry).
- *
- * Reference names cannot end with slash and directories' names are
- * always stored with a trailing slash (except for the top-level
- * directory, which is always denoted by "").  This has two nice
- * consequences: (1) when the entries in each subdir are sorted
- * lexicographically by name (as they usually are), the references in
- * a whole tree can be generated in lexicographic order by traversing
- * the tree in left-to-right, depth-first order; (2) the names of
- * references and subdirectories cannot conflict, and therefore the
- * presence of an empty subdirectory does not block the creation of a
- * similarly-named reference.  (The fact that reference names with the
- * same leading components can conflict *with each other* is a
- * separate issue that is regulated by verify_refname_available().)
- *
- * Please note that the name field contains the fully-qualified
- * reference (or subdirectory) name.  Space could be saved by only
- * storing the relative names.  But that would require the full names
- * to be generated on the fly when iterating in do_for_each_ref(), and
- * would break callback functions, who have always been able to assume
- * that the name strings that they are passed will not be freed during
- * the iteration.
- */
-struct ref_entry {
-       unsigned char flag; /* ISSYMREF? ISPACKED? */
-       union {
-               struct ref_value value; /* if not (flags&REF_DIR) */
-               struct ref_dir subdir; /* if (flags&REF_DIR) */
-       } u;
-       /*
-        * The full name of the reference (e.g., "refs/heads/master")
-        * or the full name of the directory with a trailing slash
-        * (e.g., "refs/heads/"):
-        */
-       char name[FLEX_ARRAY];
-};
-
-static void read_loose_refs(const char *dirname, struct ref_dir *dir);
-static int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len);
-static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache,
-                                         const char *dirname, size_t len,
-                                         int incomplete);
-static void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry);
-
-static struct ref_dir *get_ref_dir(struct ref_entry *entry)
-{
-       struct ref_dir *dir;
-       assert(entry->flag & REF_DIR);
-       dir = &entry->u.subdir;
-       if (entry->flag & REF_INCOMPLETE) {
-               read_loose_refs(entry->name, dir);
-
-               /*
-                * Manually add refs/bisect, which, being
-                * per-worktree, might not appear in the directory
-                * listing for refs/ in the main repo.
-                */
-               if (!strcmp(entry->name, "refs/")) {
-                       int pos = search_ref_dir(dir, "refs/bisect/", 12);
-                       if (pos < 0) {
-                               struct ref_entry *child_entry;
-                               child_entry = create_dir_entry(dir->ref_cache,
-                                                              "refs/bisect/",
-                                                              12, 1);
-                               add_entry_to_dir(dir, child_entry);
-                               read_loose_refs("refs/bisect",
-                                               &child_entry->u.subdir);
-                       }
-               }
-               entry->flag &= ~REF_INCOMPLETE;
-       }
-       return dir;
-}
-
-static struct ref_entry *create_ref_entry(const char *refname,
-                                         const unsigned char *sha1, int flag,
-                                         int check_name)
-{
-       struct ref_entry *ref;
-
-       if (check_name &&
-           check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
-               die("Reference has invalid format: '%s'", refname);
-       FLEX_ALLOC_STR(ref, name, refname);
-       hashcpy(ref->u.value.oid.hash, sha1);
-       oidclr(&ref->u.value.peeled);
-       ref->flag = flag;
-       return ref;
-}
-
-static void clear_ref_dir(struct ref_dir *dir);
-
-static void free_ref_entry(struct ref_entry *entry)
-{
-       if (entry->flag & REF_DIR) {
-               /*
-                * Do not use get_ref_dir() here, as that might
-                * trigger the reading of loose refs.
-                */
-               clear_ref_dir(&entry->u.subdir);
-       }
-       free(entry);
-}
-
-/*
- * Add a ref_entry to the end of dir (unsorted).  Entry is always
- * stored directly in dir; no recursion into subdirectories is
- * done.
- */
-static void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry)
-{
-       ALLOC_GROW(dir->entries, dir->nr + 1, dir->alloc);
-       dir->entries[dir->nr++] = entry;
-       /* optimize for the case that entries are added in order */
-       if (dir->nr == 1 ||
-           (dir->nr == dir->sorted + 1 &&
-            strcmp(dir->entries[dir->nr - 2]->name,
-                   dir->entries[dir->nr - 1]->name) < 0))
-               dir->sorted = dir->nr;
-}
-
-/*
- * Clear and free all entries in dir, recursively.
- */
-static void clear_ref_dir(struct ref_dir *dir)
-{
-       int i;
-       for (i = 0; i < dir->nr; i++)
-               free_ref_entry(dir->entries[i]);
-       free(dir->entries);
-       dir->sorted = dir->nr = dir->alloc = 0;
-       dir->entries = NULL;
-}
-
-/*
- * Create a struct ref_entry object for the specified dirname.
- * dirname is the name of the directory with a trailing slash (e.g.,
- * "refs/heads/") or "" for the top-level directory.
- */
-static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache,
-                                         const char *dirname, size_t len,
-                                         int incomplete)
-{
-       struct ref_entry *direntry;
-       FLEX_ALLOC_MEM(direntry, name, dirname, len);
-       direntry->u.subdir.ref_cache = ref_cache;
-       direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE : 0);
-       return direntry;
-}
-
-static int ref_entry_cmp(const void *a, const void *b)
-{
-       struct ref_entry *one = *(struct ref_entry **)a;
-       struct ref_entry *two = *(struct ref_entry **)b;
-       return strcmp(one->name, two->name);
-}
-
-static void sort_ref_dir(struct ref_dir *dir);
-
-struct string_slice {
-       size_t len;
-       const char *str;
-};
-
-static int ref_entry_cmp_sslice(const void *key_, const void *ent_)
-{
-       const struct string_slice *key = key_;
-       const struct ref_entry *ent = *(const struct ref_entry * const *)ent_;
-       int cmp = strncmp(key->str, ent->name, key->len);
-       if (cmp)
-               return cmp;
-       return '\0' - (unsigned char)ent->name[key->len];
-}
-
-/*
- * Return the index of the entry with the given refname from the
- * ref_dir (non-recursively), sorting dir if necessary.  Return -1 if
- * no such entry is found.  dir must already be complete.
- */
-static int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len)
-{
-       struct ref_entry **r;
-       struct string_slice key;
-
-       if (refname == NULL || !dir->nr)
-               return -1;
-
-       sort_ref_dir(dir);
-       key.len = len;
-       key.str = refname;
-       r = bsearch(&key, dir->entries, dir->nr, sizeof(*dir->entries),
-                   ref_entry_cmp_sslice);
-
-       if (r == NULL)
-               return -1;
-
-       return r - dir->entries;
-}
-
-/*
- * Search for a directory entry directly within dir (without
- * recursing).  Sort dir if necessary.  subdirname must be a directory
- * name (i.e., end in '/').  If mkdir is set, then create the
- * directory if it is missing; otherwise, return NULL if the desired
- * directory cannot be found.  dir must already be complete.
- */
-static struct ref_dir *search_for_subdir(struct ref_dir *dir,
-                                        const char *subdirname, size_t len,
-                                        int mkdir)
-{
-       int entry_index = search_ref_dir(dir, subdirname, len);
-       struct ref_entry *entry;
-       if (entry_index == -1) {
-               if (!mkdir)
-                       return NULL;
-               /*
-                * Since dir is complete, the absence of a subdir
-                * means that the subdir really doesn't exist;
-                * therefore, create an empty record for it but mark
-                * the record complete.
-                */
-               entry = create_dir_entry(dir->ref_cache, subdirname, len, 0);
-               add_entry_to_dir(dir, entry);
-       } else {
-               entry = dir->entries[entry_index];
-       }
-       return get_ref_dir(entry);
-}
-
-/*
- * If refname is a reference name, find the ref_dir within the dir
- * tree that should hold refname.  If refname is a directory name
- * (i.e., ends in '/'), then return that ref_dir itself.  dir must
- * represent the top-level directory and must already be complete.
- * Sort ref_dirs and recurse into subdirectories as necessary.  If
- * mkdir is set, then create any missing directories; otherwise,
- * return NULL if the desired directory cannot be found.
- */
-static struct ref_dir *find_containing_dir(struct ref_dir *dir,
-                                          const char *refname, int mkdir)
-{
-       const char *slash;
-       for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
-               size_t dirnamelen = slash - refname + 1;
-               struct ref_dir *subdir;
-               subdir = search_for_subdir(dir, refname, dirnamelen, mkdir);
-               if (!subdir) {
-                       dir = NULL;
-                       break;
-               }
-               dir = subdir;
-       }
-
-       return dir;
-}
-
-/*
- * Find the value entry with the given name in dir, sorting ref_dirs
- * and recursing into subdirectories as necessary.  If the name is not
- * found or it corresponds to a directory entry, return NULL.
- */
-static struct ref_entry *find_ref(struct ref_dir *dir, const char *refname)
-{
-       int entry_index;
-       struct ref_entry *entry;
-       dir = find_containing_dir(dir, refname, 0);
-       if (!dir)
-               return NULL;
-       entry_index = search_ref_dir(dir, refname, strlen(refname));
-       if (entry_index == -1)
-               return NULL;
-       entry = dir->entries[entry_index];
-       return (entry->flag & REF_DIR) ? NULL : entry;
-}
-
-/*
- * Remove the entry with the given name from dir, recursing into
- * subdirectories as necessary.  If refname is the name of a directory
- * (i.e., ends with '/'), then remove the directory and its contents.
- * If the removal was successful, return the number of entries
- * remaining in the directory entry that contained the deleted entry.
- * If the name was not found, return -1.  Please note that this
- * function only deletes the entry from the cache; it does not delete
- * it from the filesystem or ensure that other cache entries (which
- * might be symbolic references to the removed entry) are updated.
- * Nor does it remove any containing dir entries that might be made
- * empty by the removal.  dir must represent the top-level directory
- * and must already be complete.
- */
-static int remove_entry(struct ref_dir *dir, const char *refname)
-{
-       int refname_len = strlen(refname);
-       int entry_index;
-       struct ref_entry *entry;
-       int is_dir = refname[refname_len - 1] == '/';
-       if (is_dir) {
-               /*
-                * refname represents a reference directory.  Remove
-                * the trailing slash; otherwise we will get the
-                * directory *representing* refname rather than the
-                * one *containing* it.
-                */
-               char *dirname = xmemdupz(refname, refname_len - 1);
-               dir = find_containing_dir(dir, dirname, 0);
-               free(dirname);
-       } else {
-               dir = find_containing_dir(dir, refname, 0);
-       }
-       if (!dir)
-               return -1;
-       entry_index = search_ref_dir(dir, refname, refname_len);
-       if (entry_index == -1)
-               return -1;
-       entry = dir->entries[entry_index];
-
-       memmove(&dir->entries[entry_index],
-               &dir->entries[entry_index + 1],
-               (dir->nr - entry_index - 1) * sizeof(*dir->entries)
-               );
-       dir->nr--;
-       if (dir->sorted > entry_index)
-               dir->sorted--;
-       free_ref_entry(entry);
-       return dir->nr;
-}
-
-/*
- * Add a ref_entry to the ref_dir (unsorted), recursing into
- * subdirectories as necessary.  dir must represent the top-level
- * directory.  Return 0 on success.
- */
-static int add_ref(struct ref_dir *dir, struct ref_entry *ref)
-{
-       dir = find_containing_dir(dir, ref->name, 1);
-       if (!dir)
-               return -1;
-       add_entry_to_dir(dir, ref);
-       return 0;
-}
-
-/*
- * Emit a warning and return true iff ref1 and ref2 have the same name
- * and the same sha1.  Die if they have the same name but different
- * sha1s.
- */
-static int is_dup_ref(const struct ref_entry *ref1, const struct ref_entry *ref2)
-{
-       if (strcmp(ref1->name, ref2->name))
-               return 0;
-
-       /* Duplicate name; make sure that they don't conflict: */
-
-       if ((ref1->flag & REF_DIR) || (ref2->flag & REF_DIR))
-               /* This is impossible by construction */
-               die("Reference directory conflict: %s", ref1->name);
-
-       if (oidcmp(&ref1->u.value.oid, &ref2->u.value.oid))
-               die("Duplicated ref, and SHA1s don't match: %s", ref1->name);
-
-       warning("Duplicated ref: %s", ref1->name);
-       return 1;
-}
-
-/*
- * Sort the entries in dir non-recursively (if they are not already
- * sorted) and remove any duplicate entries.
- */
-static void sort_ref_dir(struct ref_dir *dir)
-{
-       int i, j;
-       struct ref_entry *last = NULL;
-
-       /*
-        * This check also prevents passing a zero-length array to qsort(),
-        * which is a problem on some platforms.
-        */
-       if (dir->sorted == dir->nr)
-               return;
-
-       qsort(dir->entries, dir->nr, sizeof(*dir->entries), ref_entry_cmp);
-
-       /* Remove any duplicates: */
-       for (i = 0, j = 0; j < dir->nr; j++) {
-               struct ref_entry *entry = dir->entries[j];
-               if (last && is_dup_ref(last, entry))
-                       free_ref_entry(entry);
-               else
-                       last = dir->entries[i++] = entry;
-       }
-       dir->sorted = dir->nr = i;
-}
-
 /*
  * Return true if refname, which has the specified oid and flags, can
  * be resolved to an object in the database. If the referred-to object
@@ -532,364 +32,14 @@ static int ref_resolves_to_object(const char *refname,
        return 1;
 }
 
-/*
- * Return true if the reference described by entry can be resolved to
- * an object in the database; otherwise, emit a warning and return
- * false.
- */
-static int entry_resolves_to_object(struct ref_entry *entry)
-{
-       return ref_resolves_to_object(entry->name,
-                                     &entry->u.value.oid, entry->flag);
-}
-
-typedef int each_ref_entry_fn(struct ref_entry *entry, void *cb_data);
-
-/*
- * Call fn for each reference in dir that has index in the range
- * offset <= index < dir->nr.  Recurse into subdirectories that are in
- * that index range, sorting them before iterating.  This function
- * does not sort dir itself; it should be sorted beforehand.  fn is
- * called for all references, including broken ones.
- */
-static int do_for_each_entry_in_dir(struct ref_dir *dir, int offset,
-                                   each_ref_entry_fn fn, void *cb_data)
-{
-       int i;
-       assert(dir->sorted == dir->nr);
-       for (i = offset; i < dir->nr; i++) {
-               struct ref_entry *entry = dir->entries[i];
-               int retval;
-               if (entry->flag & REF_DIR) {
-                       struct ref_dir *subdir = get_ref_dir(entry);
-                       sort_ref_dir(subdir);
-                       retval = do_for_each_entry_in_dir(subdir, 0, fn, cb_data);
-               } else {
-                       retval = fn(entry, cb_data);
-               }
-               if (retval)
-                       return retval;
-       }
-       return 0;
-}
-
-/*
- * Load all of the refs from the dir into our in-memory cache. The hard work
- * of loading loose refs is done by get_ref_dir(), so we just need to recurse
- * through all of the sub-directories. We do not even need to care about
- * sorting, as traversal order does not matter to us.
- */
-static void prime_ref_dir(struct ref_dir *dir)
-{
-       int i;
-       for (i = 0; i < dir->nr; i++) {
-               struct ref_entry *entry = dir->entries[i];
-               if (entry->flag & REF_DIR)
-                       prime_ref_dir(get_ref_dir(entry));
-       }
-}
-
-/*
- * A level in the reference hierarchy that is currently being iterated
- * through.
- */
-struct cache_ref_iterator_level {
-       /*
-        * The ref_dir being iterated over at this level. The ref_dir
-        * is sorted before being stored here.
-        */
-       struct ref_dir *dir;
-
-       /*
-        * The index of the current entry within dir (which might
-        * itself be a directory). If index == -1, then the iteration
-        * hasn't yet begun. If index == dir->nr, then the iteration
-        * through this level is over.
-        */
-       int index;
-};
-
-/*
- * Represent an iteration through a ref_dir in the memory cache. The
- * iteration recurses through subdirectories.
- */
-struct cache_ref_iterator {
-       struct ref_iterator base;
-
-       /*
-        * The number of levels currently on the stack. This is always
-        * at least 1, because when it becomes zero the iteration is
-        * ended and this struct is freed.
-        */
-       size_t levels_nr;
-
-       /* The number of levels that have been allocated on the stack */
-       size_t levels_alloc;
-
-       /*
-        * A stack of levels. levels[0] is the uppermost level that is
-        * being iterated over in this iteration. (This is not
-        * necessary the top level in the references hierarchy. If we
-        * are iterating through a subtree, then levels[0] will hold
-        * the ref_dir for that subtree, and subsequent levels will go
-        * on from there.)
-        */
-       struct cache_ref_iterator_level *levels;
-};
-
-static int cache_ref_iterator_advance(struct ref_iterator *ref_iterator)
-{
-       struct cache_ref_iterator *iter =
-               (struct cache_ref_iterator *)ref_iterator;
-
-       while (1) {
-               struct cache_ref_iterator_level *level =
-                       &iter->levels[iter->levels_nr - 1];
-               struct ref_dir *dir = level->dir;
-               struct ref_entry *entry;
-
-               if (level->index == -1)
-                       sort_ref_dir(dir);
-
-               if (++level->index == level->dir->nr) {
-                       /* This level is exhausted; pop up a level */
-                       if (--iter->levels_nr == 0)
-                               return ref_iterator_abort(ref_iterator);
-
-                       continue;
-               }
-
-               entry = dir->entries[level->index];
-
-               if (entry->flag & REF_DIR) {
-                       /* push down a level */
-                       ALLOC_GROW(iter->levels, iter->levels_nr + 1,
-                                  iter->levels_alloc);
-
-                       level = &iter->levels[iter->levels_nr++];
-                       level->dir = get_ref_dir(entry);
-                       level->index = -1;
-               } else {
-                       iter->base.refname = entry->name;
-                       iter->base.oid = &entry->u.value.oid;
-                       iter->base.flags = entry->flag;
-                       return ITER_OK;
-               }
-       }
-}
-
-static enum peel_status peel_entry(struct ref_entry *entry, int repeel);
-
-static int cache_ref_iterator_peel(struct ref_iterator *ref_iterator,
-                                  struct object_id *peeled)
-{
-       struct cache_ref_iterator *iter =
-               (struct cache_ref_iterator *)ref_iterator;
-       struct cache_ref_iterator_level *level;
-       struct ref_entry *entry;
-
-       level = &iter->levels[iter->levels_nr - 1];
-
-       if (level->index == -1)
-               die("BUG: peel called before advance for cache iterator");
-
-       entry = level->dir->entries[level->index];
-
-       if (peel_entry(entry, 0))
-               return -1;
-       hashcpy(peeled->hash, entry->u.value.peeled.hash);
-       return 0;
-}
-
-static int cache_ref_iterator_abort(struct ref_iterator *ref_iterator)
-{
-       struct cache_ref_iterator *iter =
-               (struct cache_ref_iterator *)ref_iterator;
-
-       free(iter->levels);
-       base_ref_iterator_free(ref_iterator);
-       return ITER_DONE;
-}
-
-static struct ref_iterator_vtable cache_ref_iterator_vtable = {
-       cache_ref_iterator_advance,
-       cache_ref_iterator_peel,
-       cache_ref_iterator_abort
-};
-
-static struct ref_iterator *cache_ref_iterator_begin(struct ref_dir *dir)
-{
-       struct cache_ref_iterator *iter;
-       struct ref_iterator *ref_iterator;
-       struct cache_ref_iterator_level *level;
-
-       iter = xcalloc(1, sizeof(*iter));
-       ref_iterator = &iter->base;
-       base_ref_iterator_init(ref_iterator, &cache_ref_iterator_vtable);
-       ALLOC_GROW(iter->levels, 10, iter->levels_alloc);
-
-       iter->levels_nr = 1;
-       level = &iter->levels[0];
-       level->index = -1;
-       level->dir = dir;
-
-       return ref_iterator;
-}
-
-struct nonmatching_ref_data {
-       const struct string_list *skip;
-       const char *conflicting_refname;
-};
-
-static int nonmatching_ref_fn(struct ref_entry *entry, void *vdata)
-{
-       struct nonmatching_ref_data *data = vdata;
-
-       if (data->skip && string_list_has_string(data->skip, entry->name))
-               return 0;
-
-       data->conflicting_refname = entry->name;
-       return 1;
-}
-
-/*
- * Return 0 if a reference named refname could be created without
- * conflicting with the name of an existing reference in dir.
- * See verify_refname_available for more information.
- */
-static int verify_refname_available_dir(const char *refname,
-                                       const struct string_list *extras,
-                                       const struct string_list *skip,
-                                       struct ref_dir *dir,
-                                       struct strbuf *err)
-{
-       const char *slash;
-       const char *extra_refname;
-       int pos;
-       struct strbuf dirname = STRBUF_INIT;
-       int ret = -1;
-
-       /*
-        * For the sake of comments in this function, suppose that
-        * refname is "refs/foo/bar".
-        */
-
-       assert(err);
-
-       strbuf_grow(&dirname, strlen(refname) + 1);
-       for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
-               /* Expand dirname to the new prefix, not including the trailing slash: */
-               strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
-
-               /*
-                * We are still at a leading dir of the refname (e.g.,
-                * "refs/foo"; if there is a reference with that name,
-                * it is a conflict, *unless* it is in skip.
-                */
-               if (dir) {
-                       pos = search_ref_dir(dir, dirname.buf, dirname.len);
-                       if (pos >= 0 &&
-                           (!skip || !string_list_has_string(skip, dirname.buf))) {
-                               /*
-                                * We found a reference whose name is
-                                * a proper prefix of refname; e.g.,
-                                * "refs/foo", and is not in skip.
-                                */
-                               strbuf_addf(err, "'%s' exists; cannot create '%s'",
-                                           dirname.buf, refname);
-                               goto cleanup;
-                       }
-               }
-
-               if (extras && string_list_has_string(extras, dirname.buf) &&
-                   (!skip || !string_list_has_string(skip, dirname.buf))) {
-                       strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
-                                   refname, dirname.buf);
-                       goto cleanup;
-               }
-
-               /*
-                * Otherwise, we can try to continue our search with
-                * the next component. So try to look up the
-                * directory, e.g., "refs/foo/". If we come up empty,
-                * we know there is nothing under this whole prefix,
-                * but even in that case we still have to continue the
-                * search for conflicts with extras.
-                */
-               strbuf_addch(&dirname, '/');
-               if (dir) {
-                       pos = search_ref_dir(dir, dirname.buf, dirname.len);
-                       if (pos < 0) {
-                               /*
-                                * There was no directory "refs/foo/",
-                                * so there is nothing under this
-                                * whole prefix. So there is no need
-                                * to continue looking for conflicting
-                                * references. But we need to continue
-                                * looking for conflicting extras.
-                                */
-                               dir = NULL;
-                       } else {
-                               dir = get_ref_dir(dir->entries[pos]);
-                       }
-               }
-       }
-
-       /*
-        * We are at the leaf of our refname (e.g., "refs/foo/bar").
-        * There is no point in searching for a reference with that
-        * name, because a refname isn't considered to conflict with
-        * itself. But we still need to check for references whose
-        * names are in the "refs/foo/bar/" namespace, because they
-        * *do* conflict.
-        */
-       strbuf_addstr(&dirname, refname + dirname.len);
-       strbuf_addch(&dirname, '/');
-
-       if (dir) {
-               pos = search_ref_dir(dir, dirname.buf, dirname.len);
-
-               if (pos >= 0) {
-                       /*
-                        * We found a directory named "$refname/"
-                        * (e.g., "refs/foo/bar/"). It is a problem
-                        * iff it contains any ref that is not in
-                        * "skip".
-                        */
-                       struct nonmatching_ref_data data;
-
-                       data.skip = skip;
-                       data.conflicting_refname = NULL;
-                       dir = get_ref_dir(dir->entries[pos]);
-                       sort_ref_dir(dir);
-                       if (do_for_each_entry_in_dir(dir, 0, nonmatching_ref_fn, &data)) {
-                               strbuf_addf(err, "'%s' exists; cannot create '%s'",
-                                           data.conflicting_refname, refname);
-                               goto cleanup;
-                       }
-               }
-       }
-
-       extra_refname = find_descendant_ref(dirname.buf, extras, skip);
-       if (extra_refname)
-               strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
-                           refname, extra_refname);
-       else
-               ret = 0;
-
-cleanup:
-       strbuf_release(&dirname);
-       return ret;
-}
-
 struct packed_ref_cache {
-       struct ref_entry *root;
+       struct ref_cache *cache;
 
        /*
         * Count of references to the data structure in this instance,
-        * including the pointer from ref_cache::packed if any.  The
-        * data will not be freed as long as the reference count is
-        * nonzero.
+        * including the pointer from files_ref_store::packed if any.
+        * The data will not be freed as long as the reference count
+        * is nonzero.
         */
        unsigned int referrers;
 
@@ -910,17 +60,17 @@ struct packed_ref_cache {
  * Future: need to be in "struct repository"
  * when doing a full libification.
  */
-static struct ref_cache {
-       struct ref_cache *next;
-       struct ref_entry *loose;
+struct files_ref_store {
+       struct ref_store base;
+       unsigned int store_flags;
+
+       char *gitdir;
+       char *gitcommondir;
+       char *packed_refs_path;
+
+       struct ref_cache *loose;
        struct packed_ref_cache *packed;
-       /*
-        * The submodule name, or "" for the main repo.  We allocate
-        * length 1 rather than FLEX_ARRAY so that the main ref_cache
-        * is initialized correctly.
-        */
-       char name[1];
-} ref_cache, *submodule_ref_caches;
+};
 
 /* Lock used for the main packed-refs file: */
 static struct lock_file packlock;
@@ -940,7 +90,7 @@ static void acquire_packed_ref_cache(struct packed_ref_cache *packed_refs)
 static int release_packed_ref_cache(struct packed_ref_cache *packed_refs)
 {
        if (!--packed_refs->referrers) {
-               free_ref_entry(packed_refs->root);
+               free_ref_cache(packed_refs->cache);
                stat_validity_clear(&packed_refs->validity);
                free(packed_refs);
                return 1;
@@ -949,7 +99,7 @@ static int release_packed_ref_cache(struct packed_ref_cache *packed_refs)
        }
 }
 
-static void clear_packed_ref_cache(struct ref_cache *refs)
+static void clear_packed_ref_cache(struct files_ref_store *refs)
 {
        if (refs->packed) {
                struct packed_ref_cache *packed_refs = refs->packed;
@@ -961,10 +111,10 @@ static void clear_packed_ref_cache(struct ref_cache *refs)
        }
 }
 
-static void clear_loose_ref_cache(struct ref_cache *refs)
+static void clear_loose_ref_cache(struct files_ref_store *refs)
 {
        if (refs->loose) {
-               free_ref_entry(refs->loose);
+               free_ref_cache(refs->loose);
                refs->loose = NULL;
        }
 }
@@ -973,51 +123,59 @@ static void clear_loose_ref_cache(struct ref_cache *refs)
  * Create a new submodule ref cache and add it to the internal
  * set of caches.
  */
-static struct ref_cache *create_ref_cache(const char *submodule)
-{
-       struct ref_cache *refs;
-       if (!submodule)
-               submodule = "";
-       FLEX_ALLOC_STR(refs, name, submodule);
-       refs->next = submodule_ref_caches;
-       submodule_ref_caches = refs;
-       return refs;
+static struct ref_store *files_ref_store_create(const char *gitdir,
+                                               unsigned int flags)
+{
+       struct files_ref_store *refs = xcalloc(1, sizeof(*refs));
+       struct ref_store *ref_store = (struct ref_store *)refs;
+       struct strbuf sb = STRBUF_INIT;
+
+       base_ref_store_init(ref_store, &refs_be_files);
+       refs->store_flags = flags;
+
+       refs->gitdir = xstrdup(gitdir);
+       get_common_dir_noenv(&sb, gitdir);
+       refs->gitcommondir = strbuf_detach(&sb, NULL);
+       strbuf_addf(&sb, "%s/packed-refs", refs->gitcommondir);
+       refs->packed_refs_path = strbuf_detach(&sb, NULL);
+
+       return ref_store;
 }
 
-static struct ref_cache *lookup_ref_cache(const char *submodule)
+/*
+ * Die if refs is not the main ref store. caller is used in any
+ * necessary error messages.
+ */
+static void files_assert_main_repository(struct files_ref_store *refs,
+                                        const char *caller)
 {
-       struct ref_cache *refs;
-
-       if (!submodule || !*submodule)
-               return &ref_cache;
+       if (refs->store_flags & REF_STORE_MAIN)
+               return;
 
-       for (refs = submodule_ref_caches; refs; refs = refs->next)
-               if (!strcmp(submodule, refs->name))
-                       return refs;
-       return NULL;
+       die("BUG: operation %s only allowed for main ref store", caller);
 }
 
 /*
- * Return a pointer to a ref_cache for the specified submodule. For
- * the main repository, use submodule==NULL; such a call cannot fail.
- * For a submodule, the submodule must exist and be a nonbare
- * repository, otherwise return NULL.
- *
- * The returned structure will be allocated and initialized but not
- * necessarily populated; it should not be freed.
+ * Downcast ref_store to files_ref_store. Die if ref_store is not a
+ * files_ref_store. required_flags is compared with ref_store's
+ * store_flags to ensure the ref_store has all required capabilities.
+ * "caller" is used in any necessary error messages.
  */
-static struct ref_cache *get_ref_cache(const char *submodule)
+static struct files_ref_store *files_downcast(struct ref_store *ref_store,
+                                             unsigned int required_flags,
+                                             const char *caller)
 {
-       struct ref_cache *refs = lookup_ref_cache(submodule);
+       struct files_ref_store *refs;
 
-       if (!refs) {
-               struct strbuf submodule_sb = STRBUF_INIT;
+       if (ref_store->be != &refs_be_files)
+               die("BUG: ref_store is type \"%s\" not \"files\" in %s",
+                   ref_store->be->name, caller);
 
-               strbuf_addstr(&submodule_sb, submodule);
-               if (is_nonbare_repository_dir(&submodule_sb))
-                       refs = create_ref_cache(submodule);
-               strbuf_release(&submodule_sb);
-       }
+       refs = (struct files_ref_store *)ref_store;
+
+       if ((refs->store_flags & required_flags) != required_flags)
+               die("BUG: operation %s requires abilities 0x%x, but only have 0x%x",
+                   caller, required_flags, refs->store_flags);
 
        return refs;
 }
@@ -1129,7 +287,7 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir)
                        if (peeled == PEELED_FULLY ||
                            (peeled == PEELED_TAGS && starts_with(refname, "refs/tags/")))
                                last->flag |= REF_KNOWS_PEELED;
-                       add_ref(dir, last);
+                       add_ref_entry(dir, last);
                        continue;
                }
                if (last &&
@@ -1150,18 +308,63 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir)
        strbuf_release(&line);
 }
 
+static const char *files_packed_refs_path(struct files_ref_store *refs)
+{
+       return refs->packed_refs_path;
+}
+
+static void files_reflog_path(struct files_ref_store *refs,
+                             struct strbuf *sb,
+                             const char *refname)
+{
+       if (!refname) {
+               /*
+                * FIXME: of course this is wrong in multi worktree
+                * setting. To be fixed real soon.
+                */
+               strbuf_addf(sb, "%s/logs", refs->gitcommondir);
+               return;
+       }
+
+       switch (ref_type(refname)) {
+       case REF_TYPE_PER_WORKTREE:
+       case REF_TYPE_PSEUDOREF:
+               strbuf_addf(sb, "%s/logs/%s", refs->gitdir, refname);
+               break;
+       case REF_TYPE_NORMAL:
+               strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, refname);
+               break;
+       default:
+               die("BUG: unknown ref type %d of ref %s",
+                   ref_type(refname), refname);
+       }
+}
+
+static void files_ref_path(struct files_ref_store *refs,
+                          struct strbuf *sb,
+                          const char *refname)
+{
+       switch (ref_type(refname)) {
+       case REF_TYPE_PER_WORKTREE:
+       case REF_TYPE_PSEUDOREF:
+               strbuf_addf(sb, "%s/%s", refs->gitdir, refname);
+               break;
+       case REF_TYPE_NORMAL:
+               strbuf_addf(sb, "%s/%s", refs->gitcommondir, refname);
+               break;
+       default:
+               die("BUG: unknown ref type %d of ref %s",
+                   ref_type(refname), refname);
+       }
+}
+
 /*
- * Get the packed_ref_cache for the specified ref_cache, creating it
- * if necessary.
+ * Get the packed_ref_cache for the specified files_ref_store,
+ * creating it if necessary.
  */
-static struct packed_ref_cache *get_packed_ref_cache(struct ref_cache *refs)
+static struct packed_ref_cache *get_packed_ref_cache(struct files_ref_store *refs)
 {
-       char *packed_refs_file;
-
-       if (*refs->name)
-               packed_refs_file = git_pathdup_submodule(refs->name, "packed-refs");
-       else
-               packed_refs_file = git_pathdup("packed-refs");
+       const char *packed_refs_file = files_packed_refs_path(refs);
 
        if (refs->packed &&
            !stat_validity_check(&refs->packed->validity, packed_refs_file))
@@ -1172,24 +375,24 @@ static struct packed_ref_cache *get_packed_ref_cache(struct ref_cache *refs)
 
                refs->packed = xcalloc(1, sizeof(*refs->packed));
                acquire_packed_ref_cache(refs->packed);
-               refs->packed->root = create_dir_entry(refs, "", 0, 0);
+               refs->packed->cache = create_ref_cache(&refs->base, NULL);
+               refs->packed->cache->root->flag &= ~REF_INCOMPLETE;
                f = fopen(packed_refs_file, "r");
                if (f) {
                        stat_validity_update(&refs->packed->validity, fileno(f));
-                       read_packed_refs(f, get_ref_dir(refs->packed->root));
+                       read_packed_refs(f, get_ref_dir(refs->packed->cache->root));
                        fclose(f);
                }
        }
-       free(packed_refs_file);
        return refs->packed;
 }
 
 static struct ref_dir *get_packed_ref_dir(struct packed_ref_cache *packed_ref_cache)
 {
-       return get_ref_dir(packed_ref_cache->root);
+       return get_ref_dir(packed_ref_cache->cache->root);
 }
 
-static struct ref_dir *get_packed_refs(struct ref_cache *refs)
+static struct ref_dir *get_packed_refs(struct files_ref_store *refs)
 {
        return get_packed_ref_dir(get_packed_ref_cache(refs));
 }
@@ -1200,15 +403,15 @@ static struct ref_dir *get_packed_refs(struct ref_cache *refs)
  * lock_packed_refs()).  To actually write the packed-refs file, call
  * commit_packed_refs().
  */
-static void add_packed_ref(const char *refname, const unsigned char *sha1)
+static void add_packed_ref(struct files_ref_store *refs,
+                          const char *refname, const unsigned char *sha1)
 {
-       struct packed_ref_cache *packed_ref_cache =
-               get_packed_ref_cache(&ref_cache);
+       struct packed_ref_cache *packed_ref_cache = get_packed_ref_cache(refs);
 
        if (!packed_ref_cache->lock)
                die("internal error: packed refs not locked");
-       add_ref(get_packed_ref_dir(packed_ref_cache),
-               create_ref_entry(refname, sha1, REF_ISPACKED, 1));
+       add_ref_entry(get_packed_ref_dir(packed_ref_cache),
+                     create_ref_entry(refname, sha1, REF_ISPACKED, 1));
 }
 
 /*
@@ -1216,9 +419,11 @@ static void add_packed_ref(const char *refname, const unsigned char *sha1)
  * (without recursing).  dirname must end with '/'.  dir must be the
  * directory entry corresponding to dirname.
  */
-static void read_loose_refs(const char *dirname, struct ref_dir *dir)
+static void loose_fill_ref_dir(struct ref_store *ref_store,
+                              struct ref_dir *dir, const char *dirname)
 {
-       struct ref_cache *refs = dir->ref_cache;
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_READ, "fill_ref_dir");
        DIR *d;
        struct dirent *de;
        int dirnamelen = strlen(dirname);
@@ -1226,10 +431,7 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
        struct strbuf path = STRBUF_INIT;
        size_t path_baselen;
 
-       if (*refs->name)
-               strbuf_git_path_submodule(&path, refs->name, "%s", dirname);
-       else
-               strbuf_git_path(&path, "%s", dirname);
+       files_ref_path(refs, &path, dirname);
        path_baselen = path.len;
 
        d = opendir(path.buf);
@@ -1257,23 +459,13 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
                } else if (S_ISDIR(st.st_mode)) {
                        strbuf_addch(&refname, '/');
                        add_entry_to_dir(dir,
-                                        create_dir_entry(refs, refname.buf,
+                                        create_dir_entry(dir->cache, refname.buf,
                                                          refname.len, 1));
                } else {
-                       int read_ok;
-
-                       if (*refs->name) {
-                               hashclr(sha1);
-                               flag = 0;
-                               read_ok = !resolve_gitlink_ref(refs->name,
-                                                              refname.buf, sha1);
-                       } else {
-                               read_ok = !read_ref_full(refname.buf,
-                                                        RESOLVE_REF_READING,
-                                                        sha1, &flag);
-                       }
-
-                       if (!read_ok) {
+                       if (!refs_resolve_ref_unsafe(&refs->base,
+                                                    refname.buf,
+                                                    RESOLVE_REF_READING,
+                                                    sha1, &flag)) {
                                hashclr(sha1);
                                flag |= REF_ISBROKEN;
                        } else if (is_null_sha1(sha1)) {
@@ -1304,9 +496,24 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
        strbuf_release(&refname);
        strbuf_release(&path);
        closedir(d);
+
+       /*
+        * Manually add refs/bisect, which, being per-worktree, might
+        * not appear in the directory listing for refs/ in the main
+        * repo.
+        */
+       if (!strcmp(dirname, "refs/")) {
+               int pos = search_ref_dir(dir, "refs/bisect/", 12);
+
+               if (pos < 0) {
+                       struct ref_entry *child_entry = create_dir_entry(
+                                       dir->cache, "refs/bisect/", 12, 1);
+                       add_entry_to_dir(dir, child_entry);
+               }
+       }
 }
 
-static struct ref_dir *get_loose_refs(struct ref_cache *refs)
+static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs)
 {
        if (!refs->loose) {
                /*
@@ -1314,115 +521,37 @@ static struct ref_dir *get_loose_refs(struct ref_cache *refs)
                 * are about to read the only subdirectory that can
                 * hold references:
                 */
-               refs->loose = create_dir_entry(refs, "", 0, 0);
-               /*
-                * Create an incomplete entry for "refs/":
-                */
-               add_entry_to_dir(get_ref_dir(refs->loose),
-                                create_dir_entry(refs, "refs/", 5, 1));
-       }
-       return get_ref_dir(refs->loose);
-}
-
-#define MAXREFLEN (1024)
+               refs->loose = create_ref_cache(&refs->base, loose_fill_ref_dir);
 
-/*
- * Called by resolve_gitlink_ref_recursive() after it failed to read
- * from the loose refs in ref_cache refs. Find <refname> in the
- * packed-refs file for the submodule.
- */
-static int resolve_gitlink_packed_ref(struct ref_cache *refs,
-                                     const char *refname, unsigned char *sha1)
-{
-       struct ref_entry *ref;
-       struct ref_dir *dir = get_packed_refs(refs);
-
-       ref = find_ref(dir, refname);
-       if (ref == NULL)
-               return -1;
+               /* We're going to fill the top level ourselves: */
+               refs->loose->root->flag &= ~REF_INCOMPLETE;
 
-       hashcpy(sha1, ref->u.value.oid.hash);
-       return 0;
-}
-
-static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
-                                        const char *refname, unsigned char *sha1,
-                                        int recursion)
-{
-       int fd, len;
-       char buffer[128], *p;
-       char *path;
-
-       if (recursion > SYMREF_MAXDEPTH || strlen(refname) > MAXREFLEN)
-               return -1;
-       path = *refs->name
-               ? git_pathdup_submodule(refs->name, "%s", refname)
-               : git_pathdup("%s", refname);
-       fd = open(path, O_RDONLY);
-       free(path);
-       if (fd < 0)
-               return resolve_gitlink_packed_ref(refs, refname, sha1);
-
-       len = read(fd, buffer, sizeof(buffer)-1);
-       close(fd);
-       if (len < 0)
-               return -1;
-       while (len && isspace(buffer[len-1]))
-               len--;
-       buffer[len] = 0;
-
-       /* Was it a detached head or an old-fashioned symlink? */
-       if (!get_sha1_hex(buffer, sha1))
-               return 0;
-
-       /* Symref? */
-       if (strncmp(buffer, "ref:", 4))
-               return -1;
-       p = buffer + 4;
-       while (isspace(*p))
-               p++;
-
-       return resolve_gitlink_ref_recursive(refs, p, sha1, recursion+1);
-}
-
-int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
-{
-       int len = strlen(path), retval;
-       struct strbuf submodule = STRBUF_INIT;
-       struct ref_cache *refs;
-
-       while (len && path[len-1] == '/')
-               len--;
-       if (!len)
-               return -1;
-
-       strbuf_add(&submodule, path, len);
-       refs = get_ref_cache(submodule.buf);
-       if (!refs) {
-               strbuf_release(&submodule);
-               return -1;
+               /*
+                * Add an incomplete entry for "refs/" (to be filled
+                * lazily):
+                */
+               add_entry_to_dir(get_ref_dir(refs->loose->root),
+                                create_dir_entry(refs->loose, "refs/", 5, 1));
        }
-       strbuf_release(&submodule);
-
-       retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0);
-       return retval;
+       return refs->loose;
 }
 
 /*
  * Return the ref_entry for the given refname from the packed
  * references.  If it does not exist, return NULL.
  */
-static struct ref_entry *get_packed_ref(const char *refname)
+static struct ref_entry *get_packed_ref(struct files_ref_store *refs,
+                                       const char *refname)
 {
-       return find_ref(get_packed_refs(&ref_cache), refname);
+       return find_ref_entry(get_packed_refs(refs), refname);
 }
 
 /*
  * A loose ref file doesn't exist; check for a packed ref.
  */
-static int resolve_missing_loose_ref(const char *refname,
-                                    unsigned char *sha1,
-                                    unsigned int *flags)
+static int resolve_packed_ref(struct files_ref_store *refs,
+                             const char *refname,
+                             unsigned char *sha1, unsigned int *flags)
 {
        struct ref_entry *entry;
 
@@ -1430,7 +559,7 @@ static int resolve_missing_loose_ref(const char *refname,
         * The loose reference file does not exist; check for a packed
         * reference.
         */
-       entry = get_packed_ref(refname);
+       entry = get_packed_ref(refs, refname);
        if (entry) {
                hashcpy(sha1, entry->u.value.oid.hash);
                *flags |= REF_ISPACKED;
@@ -1440,9 +569,12 @@ static int resolve_missing_loose_ref(const char *refname,
        return -1;
 }
 
-int read_raw_ref(const char *refname, unsigned char *sha1,
-                struct strbuf *referent, unsigned int *type)
+static int files_read_raw_ref(struct ref_store *ref_store,
+                             const char *refname, unsigned char *sha1,
+                             struct strbuf *referent, unsigned int *type)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_READ, "read_raw_ref");
        struct strbuf sb_contents = STRBUF_INIT;
        struct strbuf sb_path = STRBUF_INIT;
        const char *path;
@@ -1455,7 +587,9 @@ int read_raw_ref(const char *refname, unsigned char *sha1,
 
        *type = 0;
        strbuf_reset(&sb_path);
-       strbuf_git_path(&sb_path, "%s", refname);
+
+       files_ref_path(refs, &sb_path, refname);
+
        path = sb_path.buf;
 
 stat_ref:
@@ -1478,7 +612,7 @@ stat_ref:
        if (lstat(path, &st) < 0) {
                if (errno != ENOENT)
                        goto out;
-               if (resolve_missing_loose_ref(refname, sha1, type)) {
+               if (resolve_packed_ref(refs, refname, sha1, type)) {
                        errno = ENOENT;
                        goto out;
                }
@@ -1517,7 +651,7 @@ stat_ref:
                 * ref is supposed to be, there could still be a
                 * packed ref:
                 */
-               if (resolve_missing_loose_ref(refname, sha1, type)) {
+               if (resolve_packed_ref(refs, refname, sha1, type)) {
                        errno = EISDIR;
                        goto out;
                }
@@ -1599,7 +733,7 @@ static void unlock_ref(struct ref_lock *lock)
  *
  * If the reference doesn't already exist, verify that refname doesn't
  * have a D/F conflict with any existing references. extras and skip
- * are passed to verify_refname_available_dir() for this check.
+ * are passed to refs_verify_refname_available() for this check.
  *
  * If mustexist is not set and the reference is not found or is
  * broken, lock the reference anyway but clear sha1.
@@ -1614,11 +748,12 @@ static void unlock_ref(struct ref_lock *lock)
  *
  * but it includes a lot more code to
  * - Deal with possible races with other processes
- * - Avoid calling verify_refname_available_dir() when it can be
+ * - Avoid calling refs_verify_refname_available() when it can be
  *   avoided, namely if we were successfully able to read the ref
  * - Generate informative error messages in the case of failure
  */
-static int lock_raw_ref(const char *refname, int mustexist,
+static int lock_raw_ref(struct files_ref_store *refs,
+                       const char *refname, int mustexist,
                        const struct string_list *extras,
                        const struct string_list *skip,
                        struct ref_lock **lock_p,
@@ -1632,6 +767,8 @@ static int lock_raw_ref(const char *refname, int mustexist,
        int ret = TRANSACTION_GENERIC_ERROR;
 
        assert(err);
+       files_assert_main_repository(refs, "lock_raw_ref");
+
        *type = 0;
 
        /* First lock the file so it can't change out from under us. */
@@ -1639,7 +776,7 @@ static int lock_raw_ref(const char *refname, int mustexist,
        *lock_p = lock = xcalloc(1, sizeof(*lock));
 
        lock->ref_name = xstrdup(refname);
-       strbuf_git_path(&ref_file, "%s", refname);
+       files_ref_path(refs, &ref_file, refname);
 
 retry:
        switch (safe_create_leading_directories(ref_file.buf)) {
@@ -1654,7 +791,8 @@ retry:
                 * another reference such as "refs/foo". There is no
                 * reason to expect this error to be transitory.
                 */
-               if (verify_refname_available(refname, extras, skip, err)) {
+               if (refs_verify_refname_available(&refs->base, refname,
+                                                 extras, skip, err)) {
                        if (mustexist) {
                                /*
                                 * To the user the relevant error is
@@ -1667,7 +805,8 @@ retry:
                        } else {
                                /*
                                 * The error message set by
-                                * verify_refname_available_dir() is OK.
+                                * refs_verify_refname_available() is
+                                * OK.
                                 */
                                ret = TRANSACTION_NAME_CONFLICT;
                        }
@@ -1715,7 +854,8 @@ retry:
         * fear that its value will change.
         */
 
-       if (read_raw_ref(refname, lock->old_oid.hash, referent, type)) {
+       if (files_read_raw_ref(&refs->base, refname,
+                              lock->old_oid.hash, referent, type)) {
                if (errno == ENOENT) {
                        if (mustexist) {
                                /* Garden variety missing reference. */
@@ -1756,10 +896,9 @@ retry:
                                goto error_return;
                        } else if (remove_dir_recursively(&ref_file,
                                                          REMOVE_DIR_EMPTY_ONLY)) {
-                               if (verify_refname_available_dir(
-                                                   refname, extras, skip,
-                                                   get_loose_refs(&ref_cache),
-                                                   err)) {
+                               if (refs_verify_refname_available(
+                                                   &refs->base, refname,
+                                                   extras, skip, err)) {
                                        /*
                                         * The error message set by
                                         * verify_refname_available() is OK.
@@ -1791,16 +930,13 @@ retry:
 
                /*
                 * If the ref did not exist and we are creating it,
-                * make sure there is no existing packed ref whose
-                * name begins with our refname, nor a packed ref
-                * whose name is a proper prefix of our refname.
+                * make sure there is no existing ref that conflicts
+                * with refname:
                 */
-               if (verify_refname_available_dir(
-                                   refname, extras, skip,
-                                   get_packed_refs(&ref_cache),
-                                   err)) {
+               if (refs_verify_refname_available(
+                                   &refs->base, refname,
+                                   extras, skip, err))
                        goto error_return;
-               }
        }
 
        ret = 0;
@@ -1815,43 +951,12 @@ out:
        return ret;
 }
 
-/*
- * Peel the entry (if possible) and return its new peel_status.  If
- * repeel is true, re-peel the entry even if there is an old peeled
- * value that is already stored in it.
- *
- * It is OK to call this function with a packed reference entry that
- * might be stale and might even refer to an object that has since
- * been garbage-collected.  In such a case, if the entry has
- * REF_KNOWS_PEELED then leave the status unchanged and return
- * PEEL_PEELED or PEEL_NON_TAG; otherwise, return PEEL_INVALID.
- */
-static enum peel_status peel_entry(struct ref_entry *entry, int repeel)
-{
-       enum peel_status status;
-
-       if (entry->flag & REF_KNOWS_PEELED) {
-               if (repeel) {
-                       entry->flag &= ~REF_KNOWS_PEELED;
-                       oidclr(&entry->u.value.peeled);
-               } else {
-                       return is_null_oid(&entry->u.value.peeled) ?
-                               PEEL_NON_TAG : PEEL_PEELED;
-               }
-       }
-       if (entry->flag & REF_ISBROKEN)
-               return PEEL_BROKEN;
-       if (entry->flag & REF_ISSYMREF)
-               return PEEL_IS_SYMREF;
-
-       status = peel_object(entry->u.value.oid.hash, entry->u.value.peeled.hash);
-       if (status == PEEL_PEELED || status == PEEL_NON_TAG)
-               entry->flag |= REF_KNOWS_PEELED;
-       return status;
-}
-
-int peel_ref(const char *refname, unsigned char *sha1)
+static int files_peel_ref(struct ref_store *ref_store,
+                         const char *refname, unsigned char *sha1)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_READ | REF_STORE_ODB,
+                              "peel_ref");
        int flag;
        unsigned char base[20];
 
@@ -1864,7 +969,8 @@ int peel_ref(const char *refname, unsigned char *sha1)
                return 0;
        }
 
-       if (read_ref_full(refname, RESOLVE_REF_READING, base, &flag))
+       if (refs_read_ref_full(ref_store, refname,
+                              RESOLVE_REF_READING, base, &flag))
                return -1;
 
        /*
@@ -1876,7 +982,7 @@ int peel_ref(const char *refname, unsigned char *sha1)
         * have REF_KNOWS_PEELED.
         */
        if (flag & REF_ISPACKED) {
-               struct ref_entry *r = get_packed_ref(refname);
+               struct ref_entry *r = get_packed_ref(refs, refname);
                if (r) {
                        if (peel_entry(r, 0))
                                return -1;
@@ -1903,6 +1009,10 @@ static int files_ref_iterator_advance(struct ref_iterator *ref_iterator)
        int ok;
 
        while ((ok = ref_iterator_advance(iter->iter0)) == ITER_OK) {
+               if (iter->flags & DO_FOR_EACH_PER_WORKTREE_ONLY &&
+                   ref_type(iter->iter0->refname) != REF_TYPE_PER_WORKTREE)
+                       continue;
+
                if (!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&
                    !ref_resolves_to_object(iter->iter0->refname,
                                            iter->iter0->oid,
@@ -1951,24 +1061,24 @@ static struct ref_iterator_vtable files_ref_iterator_vtable = {
        files_ref_iterator_abort
 };
 
-struct ref_iterator *files_ref_iterator_begin(
-               const char *submodule,
+static struct ref_iterator *files_ref_iterator_begin(
+               struct ref_store *ref_store,
                const char *prefix, unsigned int flags)
 {
-       struct ref_cache *refs = get_ref_cache(submodule);
-       struct ref_dir *loose_dir, *packed_dir;
+       struct files_ref_store *refs;
        struct ref_iterator *loose_iter, *packed_iter;
        struct files_ref_iterator *iter;
        struct ref_iterator *ref_iterator;
 
-       if (!refs)
-               return empty_ref_iterator_begin();
-
        if (ref_paranoia < 0)
                ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
        if (ref_paranoia)
                flags |= DO_FOR_EACH_INCLUDE_BROKEN;
 
+       refs = files_downcast(ref_store,
+                             REF_STORE_READ | (ref_paranoia ? 0 : REF_STORE_ODB),
+                             "ref_iterator_begin");
+
        iter = xcalloc(1, sizeof(*iter));
        ref_iterator = &iter->base;
        base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable);
@@ -1979,41 +1089,24 @@ struct ref_iterator *files_ref_iterator_begin(
         * condition if loose refs are migrated to the packed-refs
         * file by a simultaneous process, but our in-memory view is
         * from before the migration. We ensure this as follows:
-        * First, we call prime_ref_dir(), which pre-reads the loose
-        * references for the subtree into the cache. (If they've
-        * already been read, that's OK; we only need to guarantee
-        * that they're read before the packed refs, not *how much*
-        * before.) After that, we call get_packed_ref_cache(), which
-        * internally checks whether the packed-ref cache is up to
-        * date with what is on disk, and re-reads it if not.
+        * First, we call start the loose refs iteration with its
+        * `prime_ref` argument set to true. This causes the loose
+        * references in the subtree to be pre-read into the cache.
+        * (If they've already been read, that's OK; we only need to
+        * guarantee that they're read before the packed refs, not
+        * *how much* before.) After that, we call
+        * get_packed_ref_cache(), which internally checks whether the
+        * packed-ref cache is up to date with what is on disk, and
+        * re-reads it if not.
         */
 
-       loose_dir = get_loose_refs(refs);
-
-       if (prefix && *prefix)
-               loose_dir = find_containing_dir(loose_dir, prefix, 0);
-
-       if (loose_dir) {
-               prime_ref_dir(loose_dir);
-               loose_iter = cache_ref_iterator_begin(loose_dir);
-       } else {
-               /* There's nothing to iterate over. */
-               loose_iter = empty_ref_iterator_begin();
-       }
+       loose_iter = cache_ref_iterator_begin(get_loose_ref_cache(refs),
+                                             prefix, 1);
 
        iter->packed_ref_cache = get_packed_ref_cache(refs);
        acquire_packed_ref_cache(iter->packed_ref_cache);
-       packed_dir = get_packed_ref_dir(iter->packed_ref_cache);
-
-       if (prefix && *prefix)
-               packed_dir = find_containing_dir(packed_dir, prefix, 0);
-
-       if (packed_dir) {
-               packed_iter = cache_ref_iterator_begin(packed_dir);
-       } else {
-               /* There's nothing to iterate over. */
-               packed_iter = empty_ref_iterator_begin();
-       }
+       packed_iter = cache_ref_iterator_begin(iter->packed_ref_cache->cache,
+                                              prefix, 0);
 
        iter->iter0 = overlay_ref_iterator_begin(loose_iter, packed_iter);
        iter->flags = flags;
@@ -2027,15 +1120,15 @@ struct ref_iterator *files_ref_iterator_begin(
  * on success. On error, write an error message to err, set errno, and
  * return a negative value.
  */
-static int verify_lock(struct ref_lock *lock,
+static int verify_lock(struct ref_store *ref_store, struct ref_lock *lock,
                       const unsigned char *old_sha1, int mustexist,
                       struct strbuf *err)
 {
        assert(err);
 
-       if (read_ref_full(lock->ref_name,
-                         mustexist ? RESOLVE_REF_READING : 0,
-                         lock->old_oid.hash, NULL)) {
+       if (refs_read_ref_full(ref_store, lock->ref_name,
+                              mustexist ? RESOLVE_REF_READING : 0,
+                              lock->old_oid.hash, NULL)) {
                if (old_sha1) {
                        int save_errno = errno;
                        strbuf_addf(err, "can't verify ref '%s'", lock->ref_name);
@@ -2067,11 +1160,19 @@ static int remove_empty_directories(struct strbuf *path)
        return remove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY);
 }
 
+static int create_reflock(const char *path, void *cb)
+{
+       struct lock_file *lk = cb;
+
+       return hold_lock_file_for_update(lk, path, LOCK_NO_DEREF) < 0 ? -1 : 0;
+}
+
 /*
  * Locks a ref returning the lock on success and NULL on failure.
  * On failure errno is set to something meaningful.
  */
-static struct ref_lock *lock_ref_sha1_basic(const char *refname,
+static struct ref_lock *lock_ref_sha1_basic(struct files_ref_store *refs,
+                                           const char *refname,
                                            const unsigned char *old_sha1,
                                            const struct string_list *extras,
                                            const struct string_list *skip,
@@ -2081,12 +1182,11 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
        struct strbuf ref_file = STRBUF_INIT;
        struct ref_lock *lock;
        int last_errno = 0;
-       int lflags = LOCK_NO_DEREF;
        int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
        int resolve_flags = RESOLVE_REF_NO_RECURSE;
-       int attempts_remaining = 3;
        int resolved;
 
+       files_assert_main_repository(refs, "lock_ref_sha1_basic");
        assert(err);
 
        lock = xcalloc(1, sizeof(struct ref_lock));
@@ -2096,9 +1196,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
        if (flags & REF_DELETING)
                resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
 
-       strbuf_git_path(&ref_file, "%s", refname);
-       resolved = !!resolve_ref_unsafe(refname, resolve_flags,
-                                       lock->old_oid.hash, type);
+       files_ref_path(refs, &ref_file, refname);
+       resolved = !!refs_resolve_ref_unsafe(&refs->base,
+                                            refname, resolve_flags,
+                                            lock->old_oid.hash, type);
        if (!resolved && errno == EISDIR) {
                /*
                 * we are trying to lock foo but we used to
@@ -2108,20 +1209,22 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
                 */
                if (remove_empty_directories(&ref_file)) {
                        last_errno = errno;
-                       if (!verify_refname_available_dir(refname, extras, skip,
-                                                         get_loose_refs(&ref_cache), err))
+                       if (!refs_verify_refname_available(
+                                           &refs->base,
+                                           refname, extras, skip, err))
                                strbuf_addf(err, "there are still refs under '%s'",
                                            refname);
                        goto error_return;
                }
-               resolved = !!resolve_ref_unsafe(refname, resolve_flags,
-                                               lock->old_oid.hash, type);
+               resolved = !!refs_resolve_ref_unsafe(&refs->base,
+                                                    refname, resolve_flags,
+                                                    lock->old_oid.hash, type);
        }
        if (!resolved) {
                last_errno = errno;
                if (last_errno != ENOTDIR ||
-                   !verify_refname_available_dir(refname, extras, skip,
-                                                 get_loose_refs(&ref_cache), err))
+                   !refs_verify_refname_available(&refs->base, refname,
+                                                  extras, skip, err))
                        strbuf_addf(err, "unable to resolve reference '%s': %s",
                                    refname, strerror(last_errno));
 
@@ -2135,46 +1238,23 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
         * our refname.
         */
        if (is_null_oid(&lock->old_oid) &&
-           verify_refname_available_dir(refname, extras, skip,
-                                        get_packed_refs(&ref_cache), err)) {
+           refs_verify_refname_available(&refs->base, refname,
+                                         extras, skip, err)) {
                last_errno = ENOTDIR;
-               goto error_return;
-       }
-
-       lock->lk = xcalloc(1, sizeof(struct lock_file));
-
-       lock->ref_name = xstrdup(refname);
-
- retry:
-       switch (safe_create_leading_directories_const(ref_file.buf)) {
-       case SCLD_OK:
-               break; /* success */
-       case SCLD_VANISHED:
-               if (--attempts_remaining > 0)
-                       goto retry;
-               /* fall through */
-       default:
-               last_errno = errno;
-               strbuf_addf(err, "unable to create directory for '%s'",
-                           ref_file.buf);
-               goto error_return;
-       }
-
-       if (hold_lock_file_for_update(lock->lk, ref_file.buf, lflags) < 0) {
-               last_errno = errno;
-               if (errno == ENOENT && --attempts_remaining > 0)
-                       /*
-                        * Maybe somebody just deleted one of the
-                        * directories leading to ref_file.  Try
-                        * again:
-                        */
-                       goto retry;
-               else {
-                       unable_to_lock_message(ref_file.buf, errno, err);
-                       goto error_return;
-               }
+               goto error_return;
+       }
+
+       lock->lk = xcalloc(1, sizeof(struct lock_file));
+
+       lock->ref_name = xstrdup(refname);
+
+       if (raceproof_create_file(ref_file.buf, create_reflock, lock->lk)) {
+               last_errno = errno;
+               unable_to_lock_message(ref_file.buf, errno, err);
+               goto error_return;
        }
-       if (verify_lock(lock, old_sha1, mustexist, err)) {
+
+       if (verify_lock(&refs->base, lock, old_sha1, mustexist, err)) {
                last_errno = errno;
                goto error_return;
        }
@@ -2194,49 +1274,35 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
  * Write an entry to the packed-refs file for the specified refname.
  * If peeled is non-NULL, write it as the entry's peeled value.
  */
-static void write_packed_entry(FILE *fh, char *refname, unsigned char *sha1,
-                              unsigned char *peeled)
+static void write_packed_entry(FILE *fh, const char *refname,
+                              const unsigned char *sha1,
+                              const unsigned char *peeled)
 {
        fprintf_or_die(fh, "%s %s\n", sha1_to_hex(sha1), refname);
        if (peeled)
                fprintf_or_die(fh, "^%s\n", sha1_to_hex(peeled));
 }
 
-/*
- * An each_ref_entry_fn that writes the entry to a packed-refs file.
- */
-static int write_packed_entry_fn(struct ref_entry *entry, void *cb_data)
-{
-       enum peel_status peel_status = peel_entry(entry, 0);
-
-       if (peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)
-               error("internal error: %s is not a valid packed reference!",
-                     entry->name);
-       write_packed_entry(cb_data, entry->name, entry->u.value.oid.hash,
-                          peel_status == PEEL_PEELED ?
-                          entry->u.value.peeled.hash : NULL);
-       return 0;
-}
-
 /*
  * Lock the packed-refs file for writing. Flags is passed to
  * hold_lock_file_for_update(). Return 0 on success. On errors, set
  * errno appropriately and return a nonzero value.
  */
-static int lock_packed_refs(int flags)
+static int lock_packed_refs(struct files_ref_store *refs, int flags)
 {
        static int timeout_configured = 0;
        static int timeout_value = 1000;
-
        struct packed_ref_cache *packed_ref_cache;
 
+       files_assert_main_repository(refs, "lock_packed_refs");
+
        if (!timeout_configured) {
                git_config_get_int("core.packedrefstimeout", &timeout_value);
                timeout_configured = 1;
        }
 
        if (hold_lock_file_for_update_timeout(
-                           &packlock, git_path("packed-refs"),
+                           &packlock, files_packed_refs_path(refs),
                            flags, timeout_value) < 0)
                return -1;
        /*
@@ -2245,7 +1311,7 @@ static int lock_packed_refs(int flags)
         * this will automatically invalidate the cache and re-read
         * the packed-refs file.
         */
-       packed_ref_cache = get_packed_ref_cache(&ref_cache);
+       packed_ref_cache = get_packed_ref_cache(refs);
        packed_ref_cache->lock = &packlock;
        /* Increment the reference count to prevent it from being freed: */
        acquire_packed_ref_cache(packed_ref_cache);
@@ -2258,13 +1324,16 @@ static int lock_packed_refs(int flags)
  * lock_packed_refs()). Return zero on success. On errors, set errno
  * and return a nonzero value
  */
-static int commit_packed_refs(void)
+static int commit_packed_refs(struct files_ref_store *refs)
 {
        struct packed_ref_cache *packed_ref_cache =
-               get_packed_ref_cache(&ref_cache);
-       int error = 0;
+               get_packed_ref_cache(refs);
+       int ok, error = 0;
        int save_errno = 0;
        FILE *out;
+       struct ref_iterator *iter;
+
+       files_assert_main_repository(refs, "commit_packed_refs");
 
        if (!packed_ref_cache->lock)
                die("internal error: packed-refs not locked");
@@ -2274,8 +1343,18 @@ static int commit_packed_refs(void)
                die_errno("unable to fdopen packed-refs descriptor");
 
        fprintf_or_die(out, "%s", PACKED_REFS_HEADER);
-       do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),
-                                0, write_packed_entry_fn, out);
+
+       iter = cache_ref_iterator_begin(packed_ref_cache->cache, NULL, 0);
+       while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
+               struct object_id peeled;
+               int peel_error = ref_iterator_peel(iter, &peeled);
+
+               write_packed_entry(out, iter->refname, iter->oid->hash,
+                                  peel_error ? NULL : peeled.hash);
+       }
+
+       if (ok != ITER_DONE)
+               die("error while iterating over references");
 
        if (commit_lock_file(packed_ref_cache->lock)) {
                save_errno = errno;
@@ -2292,17 +1371,19 @@ static int commit_packed_refs(void)
  * in-memory packed reference cache.  (The packed-refs file will be
  * read anew if it is needed again after this function is called.)
  */
-static void rollback_packed_refs(void)
+static void rollback_packed_refs(struct files_ref_store *refs)
 {
        struct packed_ref_cache *packed_ref_cache =
-               get_packed_ref_cache(&ref_cache);
+               get_packed_ref_cache(refs);
+
+       files_assert_main_repository(refs, "rollback_packed_refs");
 
        if (!packed_ref_cache->lock)
                die("internal error: packed-refs not locked");
        rollback_lock_file(packed_ref_cache->lock);
        packed_ref_cache->lock = NULL;
        release_packed_ref_cache(packed_ref_cache);
-       clear_packed_ref_cache(&ref_cache);
+       clear_packed_ref_cache(refs);
 }
 
 struct ref_to_prune {
@@ -2311,74 +1392,28 @@ struct ref_to_prune {
        char name[FLEX_ARRAY];
 };
 
-struct pack_refs_cb_data {
-       unsigned int flags;
-       struct ref_dir *packed_refs;
-       struct ref_to_prune *ref_to_prune;
+enum {
+       REMOVE_EMPTY_PARENTS_REF = 0x01,
+       REMOVE_EMPTY_PARENTS_REFLOG = 0x02
 };
 
 /*
- * An each_ref_entry_fn that is run over loose references only.  If
- * the loose reference can be packed, add an entry in the packed ref
- * cache.  If the reference should be pruned, also add it to
- * ref_to_prune in the pack_refs_cb_data.
- */
-static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
-{
-       struct pack_refs_cb_data *cb = cb_data;
-       enum peel_status peel_status;
-       struct ref_entry *packed_entry;
-       int is_tag_ref = starts_with(entry->name, "refs/tags/");
-
-       /* Do not pack per-worktree refs: */
-       if (ref_type(entry->name) != REF_TYPE_NORMAL)
-               return 0;
-
-       /* ALWAYS pack tags */
-       if (!(cb->flags & PACK_REFS_ALL) && !is_tag_ref)
-               return 0;
-
-       /* Do not pack symbolic or broken refs: */
-       if ((entry->flag & REF_ISSYMREF) || !entry_resolves_to_object(entry))
-               return 0;
-
-       /* Add a packed ref cache entry equivalent to the loose entry. */
-       peel_status = peel_entry(entry, 1);
-       if (peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)
-               die("internal error peeling reference %s (%s)",
-                   entry->name, oid_to_hex(&entry->u.value.oid));
-       packed_entry = find_ref(cb->packed_refs, entry->name);
-       if (packed_entry) {
-               /* Overwrite existing packed entry with info from loose entry */
-               packed_entry->flag = REF_ISPACKED | REF_KNOWS_PEELED;
-               oidcpy(&packed_entry->u.value.oid, &entry->u.value.oid);
-       } else {
-               packed_entry = create_ref_entry(entry->name, entry->u.value.oid.hash,
-                                               REF_ISPACKED | REF_KNOWS_PEELED, 0);
-               add_ref(cb->packed_refs, packed_entry);
-       }
-       oidcpy(&packed_entry->u.value.peeled, &entry->u.value.peeled);
-
-       /* Schedule the loose reference for pruning if requested. */
-       if ((cb->flags & PACK_REFS_PRUNE)) {
-               struct ref_to_prune *n;
-               FLEX_ALLOC_STR(n, name, entry->name);
-               hashcpy(n->sha1, entry->u.value.oid.hash);
-               n->next = cb->ref_to_prune;
-               cb->ref_to_prune = n;
-       }
-       return 0;
-}
-
-/*
- * Remove empty parents, but spare refs/ and immediate subdirs.
- * Note: munges *name.
+ * Remove empty parent directories associated with the specified
+ * reference and/or its reflog, but spare [logs/]refs/ and immediate
+ * subdirs. flags is a combination of REMOVE_EMPTY_PARENTS_REF and/or
+ * REMOVE_EMPTY_PARENTS_REFLOG.
  */
-static void try_remove_empty_parents(char *name)
+static void try_remove_empty_parents(struct files_ref_store *refs,
+                                    const char *refname,
+                                    unsigned int flags)
 {
+       struct strbuf buf = STRBUF_INIT;
+       struct strbuf sb = STRBUF_INIT;
        char *p, *q;
        int i;
-       p = name;
+
+       strbuf_addstr(&buf, refname);
+       p = buf.buf;
        for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
                while (*p && *p != '/')
                        p++;
@@ -2386,23 +1421,32 @@ static void try_remove_empty_parents(char *name)
                while (*p == '/')
                        p++;
        }
-       for (q = p; *q; q++)
-               ;
-       while (1) {
+       q = buf.buf + buf.len;
+       while (flags & (REMOVE_EMPTY_PARENTS_REF | REMOVE_EMPTY_PARENTS_REFLOG)) {
                while (q > p && *q != '/')
                        q--;
                while (q > p && *(q-1) == '/')
                        q--;
                if (q == p)
                        break;
-               *q = '\0';
-               if (rmdir(git_path("%s", name)))
-                       break;
+               strbuf_setlen(&buf, q - buf.buf);
+
+               strbuf_reset(&sb);
+               files_ref_path(refs, &sb, buf.buf);
+               if ((flags & REMOVE_EMPTY_PARENTS_REF) && rmdir(sb.buf))
+                       flags &= ~REMOVE_EMPTY_PARENTS_REF;
+
+               strbuf_reset(&sb);
+               files_reflog_path(refs, &sb, buf.buf);
+               if ((flags & REMOVE_EMPTY_PARENTS_REFLOG) && rmdir(sb.buf))
+                       flags &= ~REMOVE_EMPTY_PARENTS_REFLOG;
        }
+       strbuf_release(&buf);
+       strbuf_release(&sb);
 }
 
 /* make sure nobody touched the ref, and unlink */
-static void prune_ref(struct ref_to_prune *r)
+static void prune_ref(struct files_ref_store *refs, struct ref_to_prune *r)
 {
        struct ref_transaction *transaction;
        struct strbuf err = STRBUF_INIT;
@@ -2410,7 +1454,7 @@ static void prune_ref(struct ref_to_prune *r)
        if (check_refname_format(r->name, 0))
                return;
 
-       transaction = ref_transaction_begin(&err);
+       transaction = ref_store_transaction_begin(&refs->base, &err);
        if (!transaction ||
            ref_transaction_delete(transaction, r->name, r->sha1,
                                   REF_ISPRUNING | REF_NODEREF, NULL, &err) ||
@@ -2422,34 +1466,88 @@ static void prune_ref(struct ref_to_prune *r)
        }
        ref_transaction_free(transaction);
        strbuf_release(&err);
-       try_remove_empty_parents(r->name);
 }
 
-static void prune_refs(struct ref_to_prune *r)
+static void prune_refs(struct files_ref_store *refs, struct ref_to_prune *r)
 {
        while (r) {
-               prune_ref(r);
+               prune_ref(refs, r);
                r = r->next;
        }
 }
 
-int pack_refs(unsigned int flags)
+static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
 {
-       struct pack_refs_cb_data cbdata;
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE | REF_STORE_ODB,
+                              "pack_refs");
+       struct ref_iterator *iter;
+       struct ref_dir *packed_refs;
+       int ok;
+       struct ref_to_prune *refs_to_prune = NULL;
+
+       lock_packed_refs(refs, LOCK_DIE_ON_ERROR);
+       packed_refs = get_packed_refs(refs);
+
+       iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL, 0);
+       while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
+               /*
+                * If the loose reference can be packed, add an entry
+                * in the packed ref cache. If the reference should be
+                * pruned, also add it to refs_to_prune.
+                */
+               struct ref_entry *packed_entry;
+               int is_tag_ref = starts_with(iter->refname, "refs/tags/");
+
+               /* Do not pack per-worktree refs: */
+               if (ref_type(iter->refname) != REF_TYPE_NORMAL)
+                       continue;
+
+               /* ALWAYS pack tags */
+               if (!(flags & PACK_REFS_ALL) && !is_tag_ref)
+                       continue;
 
-       memset(&cbdata, 0, sizeof(cbdata));
-       cbdata.flags = flags;
+               /* Do not pack symbolic or broken refs: */
+               if (iter->flags & REF_ISSYMREF)
+                       continue;
 
-       lock_packed_refs(LOCK_DIE_ON_ERROR);
-       cbdata.packed_refs = get_packed_refs(&ref_cache);
+               if (!ref_resolves_to_object(iter->refname, iter->oid, iter->flags))
+                       continue;
 
-       do_for_each_entry_in_dir(get_loose_refs(&ref_cache), 0,
-                                pack_if_possible_fn, &cbdata);
+               /*
+                * Create an entry in the packed-refs cache equivalent
+                * to the one from the loose ref cache, except that
+                * we don't copy the peeled status, because we want it
+                * to be re-peeled.
+                */
+               packed_entry = find_ref_entry(packed_refs, iter->refname);
+               if (packed_entry) {
+                       /* Overwrite existing packed entry with info from loose entry */
+                       packed_entry->flag = REF_ISPACKED;
+                       oidcpy(&packed_entry->u.value.oid, iter->oid);
+               } else {
+                       packed_entry = create_ref_entry(iter->refname, iter->oid->hash,
+                                                       REF_ISPACKED, 0);
+                       add_ref_entry(packed_refs, packed_entry);
+               }
+               oidclr(&packed_entry->u.value.peeled);
+
+               /* Schedule the loose reference for pruning if requested. */
+               if ((flags & PACK_REFS_PRUNE)) {
+                       struct ref_to_prune *n;
+                       FLEX_ALLOC_STR(n, name, iter->refname);
+                       hashcpy(n->sha1, iter->oid->hash);
+                       n->next = refs_to_prune;
+                       refs_to_prune = n;
+               }
+       }
+       if (ok != ITER_DONE)
+               die("error while iterating over references");
 
-       if (commit_packed_refs())
+       if (commit_packed_refs(refs))
                die_errno("unable to overwrite old ref-pack file");
 
-       prune_refs(cbdata.ref_to_prune);
+       prune_refs(refs, refs_to_prune);
        return 0;
 }
 
@@ -2460,17 +1558,19 @@ int pack_refs(unsigned int flags)
  *
  * The refs in 'refnames' needn't be sorted. `err` must not be NULL.
  */
-static int repack_without_refs(struct string_list *refnames, struct strbuf *err)
+static int repack_without_refs(struct files_ref_store *refs,
+                              struct string_list *refnames, struct strbuf *err)
 {
        struct ref_dir *packed;
        struct string_list_item *refname;
        int ret, needs_repacking = 0, removed = 0;
 
+       files_assert_main_repository(refs, "repack_without_refs");
        assert(err);
 
        /* Look for a packed ref */
        for_each_string_list_item(refname, refnames) {
-               if (get_packed_ref(refname->string)) {
+               if (get_packed_ref(refs, refname->string)) {
                        needs_repacking = 1;
                        break;
                }
@@ -2480,60 +1580,45 @@ static int repack_without_refs(struct string_list *refnames, struct strbuf *err)
        if (!needs_repacking)
                return 0; /* no refname exists in packed refs */
 
-       if (lock_packed_refs(0)) {
-               unable_to_lock_message(git_path("packed-refs"), errno, err);
+       if (lock_packed_refs(refs, 0)) {
+               unable_to_lock_message(files_packed_refs_path(refs), errno, err);
                return -1;
        }
-       packed = get_packed_refs(&ref_cache);
+       packed = get_packed_refs(refs);
 
        /* Remove refnames from the cache */
        for_each_string_list_item(refname, refnames)
-               if (remove_entry(packed, refname->string) != -1)
+               if (remove_entry_from_dir(packed, refname->string) != -1)
                        removed = 1;
        if (!removed) {
                /*
                 * All packed entries disappeared while we were
                 * acquiring the lock.
                 */
-               rollback_packed_refs();
+               rollback_packed_refs(refs);
                return 0;
        }
 
        /* Write what remains */
-       ret = commit_packed_refs();
+       ret = commit_packed_refs(refs);
        if (ret)
                strbuf_addf(err, "unable to overwrite old ref-pack file: %s",
                            strerror(errno));
        return ret;
 }
 
-static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err)
-{
-       assert(err);
-
-       if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
-               /*
-                * loose.  The loose file name is the same as the
-                * lockfile name, minus ".lock":
-                */
-               char *loose_filename = get_locked_file_path(lock->lk);
-               int res = unlink_or_msg(loose_filename, err);
-               free(loose_filename);
-               if (res)
-                       return 1;
-       }
-       return 0;
-}
-
-int delete_refs(struct string_list *refnames, unsigned int flags)
+static int files_delete_refs(struct ref_store *ref_store,
+                            struct string_list *refnames, unsigned int flags)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE, "delete_refs");
        struct strbuf err = STRBUF_INIT;
        int i, result = 0;
 
        if (!refnames->nr)
                return 0;
 
-       result = repack_without_refs(refnames, &err);
+       result = repack_without_refs(refs, refnames, &err);
        if (result) {
                /*
                 * If we failed to rewrite the packed-refs file, then
@@ -2554,7 +1639,7 @@ int delete_refs(struct string_list *refnames, unsigned int flags)
        for (i = 0; i < refnames->nr; i++) {
                const char *refname = refnames->items[i].string;
 
-               if (delete_ref(refname, NULL, flags))
+               if (refs_delete_ref(&refs->base, NULL, refname, NULL, flags))
                        result |= error(_("could not remove reference %s"), refname);
        }
 
@@ -2570,110 +1655,117 @@ out:
  * IOW, to avoid cross device rename errors, the temporary renamed log must
  * live into logs/refs.
  */
-#define TMP_RENAMED_LOG  "logs/refs/.tmp-renamed-log"
+#define TMP_RENAMED_LOG  "refs/.tmp-renamed-log"
 
-static int rename_tmp_log(const char *newrefname)
-{
-       int attempts_remaining = 4;
-       struct strbuf path = STRBUF_INIT;
-       int ret = -1;
+struct rename_cb {
+       const char *tmp_renamed_log;
+       int true_errno;
+};
 
- retry:
-       strbuf_reset(&path);
-       strbuf_git_path(&path, "logs/%s", newrefname);
-       switch (safe_create_leading_directories_const(path.buf)) {
-       case SCLD_OK:
-               break; /* success */
-       case SCLD_VANISHED:
-               if (--attempts_remaining > 0)
-                       goto retry;
-               /* fall through */
-       default:
-               error("unable to create directory for %s", newrefname);
-               goto out;
-       }
+static int rename_tmp_log_callback(const char *path, void *cb_data)
+{
+       struct rename_cb *cb = cb_data;
 
-       if (rename(git_path(TMP_RENAMED_LOG), path.buf)) {
-               if ((errno==EISDIR || errno==ENOTDIR) && --attempts_remaining > 0) {
-                       /*
-                        * rename(a, b) when b is an existing
-                        * directory ought to result in ISDIR, but
-                        * Solaris 5.8 gives ENOTDIR.  Sheesh.
-                        */
-                       if (remove_empty_directories(&path)) {
-                               error("Directory not empty: logs/%s", newrefname);
-                               goto out;
-                       }
-                       goto retry;
-               } else if (errno == ENOENT && --attempts_remaining > 0) {
-                       /*
-                        * Maybe another process just deleted one of
-                        * the directories in the path to newrefname.
-                        * Try again from the beginning.
-                        */
-                       goto retry;
-               } else {
-                       error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s",
-                               newrefname, strerror(errno));
-                       goto out;
-               }
+       if (rename(cb->tmp_renamed_log, path)) {
+               /*
+                * rename(a, b) when b is an existing directory ought
+                * to result in ISDIR, but Solaris 5.8 gives ENOTDIR.
+                * Sheesh. Record the true errno for error reporting,
+                * but report EISDIR to raceproof_create_file() so
+                * that it knows to retry.
+                */
+               cb->true_errno = errno;
+               if (errno == ENOTDIR)
+                       errno = EISDIR;
+               return -1;
+       } else {
+               return 0;
        }
-       ret = 0;
-out:
-       strbuf_release(&path);
-       return ret;
 }
 
-int verify_refname_available(const char *newname,
-                            const struct string_list *extras,
-                            const struct string_list *skip,
-                            struct strbuf *err)
+static int rename_tmp_log(struct files_ref_store *refs, const char *newrefname)
 {
-       struct ref_dir *packed_refs = get_packed_refs(&ref_cache);
-       struct ref_dir *loose_refs = get_loose_refs(&ref_cache);
+       struct strbuf path = STRBUF_INIT;
+       struct strbuf tmp = STRBUF_INIT;
+       struct rename_cb cb;
+       int ret;
 
-       if (verify_refname_available_dir(newname, extras, skip,
-                                        packed_refs, err) ||
-           verify_refname_available_dir(newname, extras, skip,
-                                        loose_refs, err))
-               return -1;
+       files_reflog_path(refs, &path, newrefname);
+       files_reflog_path(refs, &tmp, TMP_RENAMED_LOG);
+       cb.tmp_renamed_log = tmp.buf;
+       ret = raceproof_create_file(path.buf, rename_tmp_log_callback, &cb);
+       if (ret) {
+               if (errno == EISDIR)
+                       error("directory not empty: %s", path.buf);
+               else
+                       error("unable to move logfile %s to %s: %s",
+                             tmp.buf, path.buf,
+                             strerror(cb.true_errno));
+       }
 
-       return 0;
+       strbuf_release(&path);
+       strbuf_release(&tmp);
+       return ret;
 }
 
 static int write_ref_to_lockfile(struct ref_lock *lock,
                                 const unsigned char *sha1, struct strbuf *err);
-static int commit_ref_update(struct ref_lock *lock,
+static int commit_ref_update(struct files_ref_store *refs,
+                            struct ref_lock *lock,
                             const unsigned char *sha1, const char *logmsg,
                             struct strbuf *err);
 
-int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg)
+static int files_rename_ref(struct ref_store *ref_store,
+                           const char *oldrefname, const char *newrefname,
+                           const char *logmsg)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE, "rename_ref");
        unsigned char sha1[20], orig_sha1[20];
        int flag = 0, logmoved = 0;
        struct ref_lock *lock;
        struct stat loginfo;
-       int log = !lstat(git_path("logs/%s", oldrefname), &loginfo);
+       struct strbuf sb_oldref = STRBUF_INIT;
+       struct strbuf sb_newref = STRBUF_INIT;
+       struct strbuf tmp_renamed_log = STRBUF_INIT;
+       int log, ret;
        struct strbuf err = STRBUF_INIT;
 
-       if (log && S_ISLNK(loginfo.st_mode))
-               return error("reflog for %s is a symlink", oldrefname);
+       files_reflog_path(refs, &sb_oldref, oldrefname);
+       files_reflog_path(refs, &sb_newref, newrefname);
+       files_reflog_path(refs, &tmp_renamed_log, TMP_RENAMED_LOG);
 
-       if (!resolve_ref_unsafe(oldrefname, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
-                               orig_sha1, &flag))
-               return error("refname %s not found", oldrefname);
+       log = !lstat(sb_oldref.buf, &loginfo);
+       if (log && S_ISLNK(loginfo.st_mode)) {
+               ret = error("reflog for %s is a symlink", oldrefname);
+               goto out;
+       }
 
-       if (flag & REF_ISSYMREF)
-               return error("refname %s is a symbolic ref, renaming it is not supported",
-                       oldrefname);
-       if (!rename_ref_available(oldrefname, newrefname))
-               return 1;
+       if (!refs_resolve_ref_unsafe(&refs->base, oldrefname,
+                                    RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
+                               orig_sha1, &flag)) {
+               ret = error("refname %s not found", oldrefname);
+               goto out;
+       }
 
-       if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG)))
-               return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s",
-                       oldrefname, strerror(errno));
+       if (flag & REF_ISSYMREF) {
+               ret = error("refname %s is a symbolic ref, renaming it is not supported",
+                           oldrefname);
+               goto out;
+       }
+       if (!refs_rename_ref_available(&refs->base, oldrefname, newrefname)) {
+               ret = 1;
+               goto out;
+       }
+
+       if (log && rename(sb_oldref.buf, tmp_renamed_log.buf)) {
+               ret = error("unable to move logfile logs/%s to logs/"TMP_RENAMED_LOG": %s",
+                           oldrefname, strerror(errno));
+               goto out;
+       }
 
-       if (delete_ref(oldrefname, orig_sha1, REF_NODEREF)) {
+       if (refs_delete_ref(&refs->base, logmsg, oldrefname,
+                           orig_sha1, REF_NODEREF)) {
                error("unable to delete old %s", oldrefname);
                goto rollback;
        }
@@ -2685,14 +1777,16 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
         * the safety anyway; we want to delete the reference whatever
         * its current value.
         */
-       if (!read_ref_full(newrefname, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
-                          sha1, NULL) &&
-           delete_ref(newrefname, NULL, REF_NODEREF)) {
-               if (errno==EISDIR) {
+       if (!refs_read_ref_full(&refs->base, newrefname,
+                               RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
+                               sha1, NULL) &&
+           refs_delete_ref(&refs->base, NULL, newrefname,
+                           NULL, REF_NODEREF)) {
+               if (errno == EISDIR) {
                        struct strbuf path = STRBUF_INIT;
                        int result;
 
-                       strbuf_git_path(&path, "%s", newrefname);
+                       files_ref_path(refs, &path, newrefname);
                        result = remove_empty_directories(&path);
                        strbuf_release(&path);
 
@@ -2706,13 +1800,13 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
                }
        }
 
-       if (log && rename_tmp_log(newrefname))
+       if (log && rename_tmp_log(refs, newrefname))
                goto rollback;
 
        logmoved = log;
 
-       lock = lock_ref_sha1_basic(newrefname, NULL, NULL, NULL, REF_NODEREF,
-                                  NULL, &err);
+       lock = lock_ref_sha1_basic(refs, newrefname, NULL, NULL, NULL,
+                                  REF_NODEREF, NULL, &err);
        if (!lock) {
                error("unable to rename '%s' to '%s': %s", oldrefname, newrefname, err.buf);
                strbuf_release(&err);
@@ -2721,17 +1815,18 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
        hashcpy(lock->old_oid.hash, orig_sha1);
 
        if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
-           commit_ref_update(lock, orig_sha1, logmsg, &err)) {
+           commit_ref_update(refs, lock, orig_sha1, logmsg, &err)) {
                error("unable to write current sha1 into %s: %s", newrefname, err.buf);
                strbuf_release(&err);
                goto rollback;
        }
 
-       return 0;
+       ret = 0;
+       goto out;
 
  rollback:
-       lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, NULL, REF_NODEREF,
-                                  NULL, &err);
+       lock = lock_ref_sha1_basic(refs, oldrefname, NULL, NULL, NULL,
+                                  REF_NODEREF, NULL, &err);
        if (!lock) {
                error("unable to lock %s for rollback: %s", oldrefname, err.buf);
                strbuf_release(&err);
@@ -2739,24 +1834,29 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
        }
 
        flag = log_all_ref_updates;
-       log_all_ref_updates = 0;
+       log_all_ref_updates = LOG_REFS_NONE;
        if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
-           commit_ref_update(lock, orig_sha1, NULL, &err)) {
+           commit_ref_update(refs, lock, orig_sha1, NULL, &err)) {
                error("unable to write current sha1 into %s: %s", oldrefname, err.buf);
                strbuf_release(&err);
        }
        log_all_ref_updates = flag;
 
  rollbacklog:
-       if (logmoved && rename(git_path("logs/%s", newrefname), git_path("logs/%s", oldrefname)))
+       if (logmoved && rename(sb_newref.buf, sb_oldref.buf))
                error("unable to restore logfile %s from %s: %s",
                        oldrefname, newrefname, strerror(errno));
        if (!logmoved && log &&
-           rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", oldrefname)))
-               error("unable to restore logfile %s from "TMP_RENAMED_LOG": %s",
+           rename(tmp_renamed_log.buf, sb_oldref.buf))
+               error("unable to restore logfile %s from logs/"TMP_RENAMED_LOG": %s",
                        oldrefname, strerror(errno));
+       ret = 1;
+ out:
+       strbuf_release(&sb_newref);
+       strbuf_release(&sb_oldref);
+       strbuf_release(&tmp_renamed_log);
 
-       return 1;
+       return ret;
 }
 
 static int close_ref(struct ref_lock *lock)
@@ -2797,61 +1897,93 @@ static int commit_ref(struct ref_lock *lock)
        return 0;
 }
 
+static int open_or_create_logfile(const char *path, void *cb)
+{
+       int *fd = cb;
+
+       *fd = open(path, O_APPEND | O_WRONLY | O_CREAT, 0666);
+       return (*fd < 0) ? -1 : 0;
+}
+
 /*
- * Create a reflog for a ref.  If force_create = 0, the reflog will
- * only be created for certain refs (those for which
- * should_autocreate_reflog returns non-zero.  Otherwise, create it
- * regardless of the ref name.  Fill in *err and return -1 on failure.
+ * Create a reflog for a ref. If force_create = 0, only create the
+ * reflog for certain refs (those for which should_autocreate_reflog
+ * returns non-zero). Otherwise, create it regardless of the reference
+ * name. If the logfile already existed or was created, return 0 and
+ * set *logfd to the file descriptor opened for appending to the file.
+ * If no logfile exists and we decided not to create one, return 0 and
+ * set *logfd to -1. On failure, fill in *err, set *logfd to -1, and
+ * return -1.
  */
-static int log_ref_setup(const char *refname, struct strbuf *logfile, struct strbuf *err, int force_create)
+static int log_ref_setup(struct files_ref_store *refs,
+                        const char *refname, int force_create,
+                        int *logfd, struct strbuf *err)
 {
-       int logfd, oflags = O_APPEND | O_WRONLY;
+       struct strbuf logfile_sb = STRBUF_INIT;
+       char *logfile;
 
-       strbuf_git_path(logfile, "logs/%s", refname);
-       if (force_create || should_autocreate_reflog(refname)) {
-               if (safe_create_leading_directories(logfile->buf) < 0) {
-                       strbuf_addf(err, "unable to create directory for '%s': "
-                                   "%s", logfile->buf, strerror(errno));
-                       return -1;
-               }
-               oflags |= O_CREAT;
-       }
+       files_reflog_path(refs, &logfile_sb, refname);
+       logfile = strbuf_detach(&logfile_sb, NULL);
 
-       logfd = open(logfile->buf, oflags, 0666);
-       if (logfd < 0) {
-               if (!(oflags & O_CREAT) && (errno == ENOENT || errno == EISDIR))
-                       return 0;
+       if (force_create || should_autocreate_reflog(refname)) {
+               if (raceproof_create_file(logfile, open_or_create_logfile, logfd)) {
+                       if (errno == ENOENT)
+                               strbuf_addf(err, "unable to create directory for '%s': "
+                                           "%s", logfile, strerror(errno));
+                       else if (errno == EISDIR)
+                               strbuf_addf(err, "there are still logs under '%s'",
+                                           logfile);
+                       else
+                               strbuf_addf(err, "unable to append to '%s': %s",
+                                           logfile, strerror(errno));
 
-               if (errno == EISDIR) {
-                       if (remove_empty_directories(logfile)) {
-                               strbuf_addf(err, "there are still logs under "
-                                           "'%s'", logfile->buf);
-                               return -1;
-                       }
-                       logfd = open(logfile->buf, oflags, 0666);
+                       goto error;
                }
-
-               if (logfd < 0) {
-                       strbuf_addf(err, "unable to append to '%s': %s",
-                                   logfile->buf, strerror(errno));
-                       return -1;
+       } else {
+               *logfd = open(logfile, O_APPEND | O_WRONLY, 0666);
+               if (*logfd < 0) {
+                       if (errno == ENOENT || errno == EISDIR) {
+                               /*
+                                * The logfile doesn't already exist,
+                                * but that is not an error; it only
+                                * means that we won't write log
+                                * entries to it.
+                                */
+                               ;
+                       } else {
+                               strbuf_addf(err, "unable to append to '%s': %s",
+                                           logfile, strerror(errno));
+                               goto error;
+                       }
                }
        }
 
-       adjust_shared_perm(logfile->buf);
-       close(logfd);
+       if (*logfd >= 0)
+               adjust_shared_perm(logfile);
+
+       free(logfile);
        return 0;
-}
 
+error:
+       free(logfile);
+       return -1;
+}
 
-int safe_create_reflog(const char *refname, int force_create, struct strbuf *err)
+static int files_create_reflog(struct ref_store *ref_store,
+                              const char *refname, int force_create,
+                              struct strbuf *err)
 {
-       int ret;
-       struct strbuf sb = STRBUF_INIT;
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE, "create_reflog");
+       int fd;
 
-       ret = log_ref_setup(refname, &sb, err, force_create);
-       strbuf_release(&sb);
-       return ret;
+       if (log_ref_setup(refs, refname, force_create, &fd, err))
+               return -1;
+
+       if (fd >= 0)
+               close(fd);
+
+       return 0;
 }
 
 static int log_ref_write_fd(int fd, const unsigned char *old_sha1,
@@ -2880,59 +2012,51 @@ static int log_ref_write_fd(int fd, const unsigned char *old_sha1,
        return 0;
 }
 
-static int log_ref_write_1(const char *refname, const unsigned char *old_sha1,
-                          const unsigned char *new_sha1, const char *msg,
-                          struct strbuf *logfile, int flags,
-                          struct strbuf *err)
+static int files_log_ref_write(struct files_ref_store *refs,
+                              const char *refname, const unsigned char *old_sha1,
+                              const unsigned char *new_sha1, const char *msg,
+                              int flags, struct strbuf *err)
 {
-       int logfd, result, oflags = O_APPEND | O_WRONLY;
+       int logfd, result;
 
-       if (log_all_ref_updates < 0)
-               log_all_ref_updates = !is_bare_repository();
+       if (log_all_ref_updates == LOG_REFS_UNSET)
+               log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
 
-       result = log_ref_setup(refname, logfile, err, flags & REF_FORCE_CREATE_REFLOG);
+       result = log_ref_setup(refs, refname,
+                              flags & REF_FORCE_CREATE_REFLOG,
+                              &logfd, err);
 
        if (result)
                return result;
 
-       logfd = open(logfile->buf, oflags);
        if (logfd < 0)
                return 0;
        result = log_ref_write_fd(logfd, old_sha1, new_sha1,
                                  git_committer_info(0), msg);
        if (result) {
-               strbuf_addf(err, "unable to append to '%s': %s", logfile->buf,
-                           strerror(errno));
+               struct strbuf sb = STRBUF_INIT;
+               int save_errno = errno;
+
+               files_reflog_path(refs, &sb, refname);
+               strbuf_addf(err, "unable to append to '%s': %s",
+                           sb.buf, strerror(save_errno));
+               strbuf_release(&sb);
                close(logfd);
                return -1;
        }
        if (close(logfd)) {
-               strbuf_addf(err, "unable to append to '%s': %s", logfile->buf,
-                           strerror(errno));
+               struct strbuf sb = STRBUF_INIT;
+               int save_errno = errno;
+
+               files_reflog_path(refs, &sb, refname);
+               strbuf_addf(err, "unable to append to '%s': %s",
+                           sb.buf, strerror(save_errno));
+               strbuf_release(&sb);
                return -1;
        }
        return 0;
 }
 
-static int log_ref_write(const char *refname, const unsigned char *old_sha1,
-                        const unsigned char *new_sha1, const char *msg,
-                        int flags, struct strbuf *err)
-{
-       return files_log_ref_write(refname, old_sha1, new_sha1, msg, flags,
-                                  err);
-}
-
-int files_log_ref_write(const char *refname, const unsigned char *old_sha1,
-                       const unsigned char *new_sha1, const char *msg,
-                       int flags, struct strbuf *err)
-{
-       struct strbuf sb = STRBUF_INIT;
-       int ret = log_ref_write_1(refname, old_sha1, new_sha1, msg, &sb, flags,
-                                 err);
-       strbuf_release(&sb);
-       return ret;
-}
-
 /*
  * Write sha1 into the open lockfile, then close the lockfile. On
  * errors, rollback the lockfile, fill in *err and
@@ -2977,12 +2101,17 @@ static int write_ref_to_lockfile(struct ref_lock *lock,
  * to the loose reference lockfile. Also update the reflogs if
  * necessary, using the specified lockmsg (which can be NULL).
  */
-static int commit_ref_update(struct ref_lock *lock,
+static int commit_ref_update(struct files_ref_store *refs,
+                            struct ref_lock *lock,
                             const unsigned char *sha1, const char *logmsg,
                             struct strbuf *err)
 {
-       clear_loose_ref_cache(&ref_cache);
-       if (log_ref_write(lock->ref_name, lock->old_oid.hash, sha1, logmsg, 0, err)) {
+       files_assert_main_repository(refs, "commit_ref_update");
+
+       clear_loose_ref_cache(refs);
+       if (files_log_ref_write(refs, lock->ref_name,
+                               lock->old_oid.hash, sha1,
+                               logmsg, 0, err)) {
                char *old_msg = strbuf_detach(err, NULL);
                strbuf_addf(err, "cannot update the ref '%s': %s",
                            lock->ref_name, old_msg);
@@ -3008,13 +2137,15 @@ static int commit_ref_update(struct ref_lock *lock,
                int head_flag;
                const char *head_ref;
 
-               head_ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
-                                             head_sha1, &head_flag);
+               head_ref = refs_resolve_ref_unsafe(&refs->base, "HEAD",
+                                                  RESOLVE_REF_READING,
+                                                  head_sha1, &head_flag);
                if (head_ref && (head_flag & REF_ISSYMREF) &&
                    !strcmp(head_ref, lock->ref_name)) {
                        struct strbuf log_err = STRBUF_INIT;
-                       if (log_ref_write("HEAD", lock->old_oid.hash, sha1,
-                                         logmsg, 0, &log_err)) {
+                       if (files_log_ref_write(refs, "HEAD",
+                                               lock->old_oid.hash, sha1,
+                                               logmsg, 0, &log_err)) {
                                error("%s", log_err.buf);
                                strbuf_release(&log_err);
                        }
@@ -3046,23 +2177,28 @@ static int create_ref_symlink(struct ref_lock *lock, const char *target)
        return ret;
 }
 
-static void update_symref_reflog(struct ref_lock *lock, const char *refname,
+static void update_symref_reflog(struct files_ref_store *refs,
+                                struct ref_lock *lock, const char *refname,
                                 const char *target, const char *logmsg)
 {
        struct strbuf err = STRBUF_INIT;
        unsigned char new_sha1[20];
-       if (logmsg && !read_ref(target, new_sha1) &&
-           log_ref_write(refname, lock->old_oid.hash, new_sha1, logmsg, 0, &err)) {
+       if (logmsg &&
+           !refs_read_ref_full(&refs->base, target,
+                               RESOLVE_REF_READING, new_sha1, NULL) &&
+           files_log_ref_write(refs, refname, lock->old_oid.hash,
+                               new_sha1, logmsg, 0, &err)) {
                error("%s", err.buf);
                strbuf_release(&err);
        }
 }
 
-static int create_symref_locked(struct ref_lock *lock, const char *refname,
+static int create_symref_locked(struct files_ref_store *refs,
+                               struct ref_lock *lock, const char *refname,
                                const char *target, const char *logmsg)
 {
        if (prefer_symlink_refs && !create_ref_symlink(lock, target)) {
-               update_symref_reflog(lock, refname, target, logmsg);
+               update_symref_reflog(refs, lock, refname, target, logmsg);
                return 0;
        }
 
@@ -3070,7 +2206,7 @@ static int create_symref_locked(struct ref_lock *lock, const char *refname,
                return error("unable to fdopen %s: %s",
                             lock->lk->tempfile.filename.buf, strerror(errno));
 
-       update_symref_reflog(lock, refname, target, logmsg);
+       update_symref_reflog(refs, lock, refname, target, logmsg);
 
        /* no error check; commit_ref will check ferror */
        fprintf(lock->lk->tempfile.fp, "ref: %s\n", target);
@@ -3080,13 +2216,18 @@ static int create_symref_locked(struct ref_lock *lock, const char *refname,
        return 0;
 }
 
-int create_symref(const char *refname, const char *target, const char *logmsg)
+static int files_create_symref(struct ref_store *ref_store,
+                              const char *refname, const char *target,
+                              const char *logmsg)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE, "create_symref");
        struct strbuf err = STRBUF_INIT;
        struct ref_lock *lock;
        int ret;
 
-       lock = lock_ref_sha1_basic(refname, NULL, NULL, NULL, REF_NODEREF, NULL,
+       lock = lock_ref_sha1_basic(refs, refname, NULL,
+                                  NULL, NULL, REF_NODEREF, NULL,
                                   &err);
        if (!lock) {
                error("%s", err.buf);
@@ -3094,13 +2235,22 @@ int create_symref(const char *refname, const char *target, const char *logmsg)
                return -1;
        }
 
-       ret = create_symref_locked(lock, refname, target, logmsg);
+       ret = create_symref_locked(refs, lock, refname, target, logmsg);
        unlock_ref(lock);
        return ret;
 }
 
-int set_worktree_head_symref(const char *gitdir, const char *target)
+int set_worktree_head_symref(const char *gitdir, const char *target, const char *logmsg)
 {
+       /*
+        * FIXME: this obviously will not work well for future refs
+        * backends. This function needs to die.
+        */
+       struct files_ref_store *refs =
+               files_downcast(get_main_ref_store(),
+                              REF_STORE_WRITE,
+                              "set_head_symref");
+
        static struct lock_file head_lock;
        struct ref_lock *lock;
        struct strbuf head_path = STRBUF_INIT;
@@ -3127,38 +2277,55 @@ int set_worktree_head_symref(const char *gitdir, const char *target)
        lock->lk = &head_lock;
        lock->ref_name = xstrdup(head_rel);
 
-       ret = create_symref_locked(lock, head_rel, target, NULL);
+       ret = create_symref_locked(refs, lock, head_rel, target, logmsg);
 
        unlock_ref(lock); /* will free lock */
        strbuf_release(&head_path);
        return ret;
 }
 
-int reflog_exists(const char *refname)
+static int files_reflog_exists(struct ref_store *ref_store,
+                              const char *refname)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_READ, "reflog_exists");
+       struct strbuf sb = STRBUF_INIT;
        struct stat st;
+       int ret;
 
-       return !lstat(git_path("logs/%s", refname), &st) &&
-               S_ISREG(st.st_mode);
+       files_reflog_path(refs, &sb, refname);
+       ret = !lstat(sb.buf, &st) && S_ISREG(st.st_mode);
+       strbuf_release(&sb);
+       return ret;
 }
 
-int delete_reflog(const char *refname)
+static int files_delete_reflog(struct ref_store *ref_store,
+                              const char *refname)
 {
-       return remove_path(git_path("logs/%s", refname));
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE, "delete_reflog");
+       struct strbuf sb = STRBUF_INIT;
+       int ret;
+
+       files_reflog_path(refs, &sb, refname);
+       ret = remove_path(sb.buf);
+       strbuf_release(&sb);
+       return ret;
 }
 
 static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)
 {
-       unsigned char osha1[20], nsha1[20];
+       struct object_id ooid, noid;
        char *email_end, *message;
        unsigned long timestamp;
        int tz;
+       const char *p = sb->buf;
 
        /* old SP new SP name <email> SP time TAB msg LF */
-       if (sb->len < 83 || sb->buf[sb->len - 1] != '\n' ||
-           get_sha1_hex(sb->buf, osha1) || sb->buf[40] != ' ' ||
-           get_sha1_hex(sb->buf + 41, nsha1) || sb->buf[81] != ' ' ||
-           !(email_end = strchr(sb->buf + 82, '>')) ||
+       if (!sb->len || sb->buf[sb->len - 1] != '\n' ||
+           parse_oid_hex(p, &ooid, &p) || *p++ != ' ' ||
+           parse_oid_hex(p, &noid, &p) || *p++ != ' ' ||
+           !(email_end = strchr(p, '>')) ||
            email_end[1] != ' ' ||
            !(timestamp = strtoul(email_end + 2, &message, 10)) ||
            !message || message[0] != ' ' ||
@@ -3172,7 +2339,7 @@ static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *c
                message += 6;
        else
                message += 7;
-       return fn(osha1, nsha1, sb->buf + 82, timestamp, tz, message, cb_data);
+       return fn(&ooid, &noid, p, timestamp, tz, message, cb_data);
 }
 
 static char *find_beginning_of_line(char *bob, char *scan)
@@ -3186,21 +2353,29 @@ static char *find_beginning_of_line(char *bob, char *scan)
        return scan;
 }
 
-int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void *cb_data)
+static int files_for_each_reflog_ent_reverse(struct ref_store *ref_store,
+                                            const char *refname,
+                                            each_reflog_ent_fn fn,
+                                            void *cb_data)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_READ,
+                              "for_each_reflog_ent_reverse");
        struct strbuf sb = STRBUF_INIT;
        FILE *logfp;
        long pos;
        int ret = 0, at_tail = 1;
 
-       logfp = fopen(git_path("logs/%s", refname), "r");
+       files_reflog_path(refs, &sb, refname);
+       logfp = fopen(sb.buf, "r");
+       strbuf_release(&sb);
        if (!logfp)
                return -1;
 
        /* Jump to the end */
        if (fseek(logfp, 0, SEEK_END) < 0)
-               return error("cannot seek back reflog for %s: %s",
-                            refname, strerror(errno));
+               ret = error("cannot seek back reflog for %s: %s",
+                           refname, strerror(errno));
        pos = ftell(logfp);
        while (!ret && 0 < pos) {
                int cnt;
@@ -3210,13 +2385,17 @@ int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void
 
                /* Fill next block from the end */
                cnt = (sizeof(buf) < pos) ? sizeof(buf) : pos;
-               if (fseek(logfp, pos - cnt, SEEK_SET))
-                       return error("cannot seek back reflog for %s: %s",
-                                    refname, strerror(errno));
+               if (fseek(logfp, pos - cnt, SEEK_SET)) {
+                       ret = error("cannot seek back reflog for %s: %s",
+                                   refname, strerror(errno));
+                       break;
+               }
                nread = fread(buf, cnt, 1, logfp);
-               if (nread != 1)
-                       return error("cannot read %d bytes from reflog for %s: %s",
-                                    cnt, refname, strerror(errno));
+               if (nread != 1) {
+                       ret = error("cannot read %d bytes from reflog for %s: %s",
+                                   cnt, refname, strerror(errno));
+                       break;
+               }
                pos -= cnt;
 
                scanp = endp = buf + cnt;
@@ -3288,13 +2467,20 @@ int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void
        return ret;
 }
 
-int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data)
+static int files_for_each_reflog_ent(struct ref_store *ref_store,
+                                    const char *refname,
+                                    each_reflog_ent_fn fn, void *cb_data)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_READ,
+                              "for_each_reflog_ent");
        FILE *logfp;
        struct strbuf sb = STRBUF_INIT;
        int ret = 0;
 
-       logfp = fopen(git_path("logs/%s", refname), "r");
+       files_reflog_path(refs, &sb, refname);
+       logfp = fopen(sb.buf, "r");
+       strbuf_release(&sb);
        if (!logfp)
                return -1;
 
@@ -3308,6 +2494,7 @@ int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_dat
 struct files_reflog_iterator {
        struct ref_iterator base;
 
+       struct ref_store *ref_store;
        struct dir_iterator *dir_iterator;
        struct object_id oid;
 };
@@ -3329,8 +2516,9 @@ static int files_reflog_iterator_advance(struct ref_iterator *ref_iterator)
                if (ends_with(diter->basename, ".lock"))
                        continue;
 
-               if (read_ref_full(diter->relative_path, 0,
-                                 iter->oid.hash, &flags)) {
+               if (refs_read_ref_full(iter->ref_store,
+                                      diter->relative_path, 0,
+                                      iter->oid.hash, &flags)) {
                        error("bad ref for %s", diter->path.buf);
                        continue;
                }
@@ -3372,22 +2560,23 @@ static struct ref_iterator_vtable files_reflog_iterator_vtable = {
        files_reflog_iterator_abort
 };
 
-struct ref_iterator *files_reflog_iterator_begin(void)
+static struct ref_iterator *files_reflog_iterator_begin(struct ref_store *ref_store)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_READ,
+                              "reflog_iterator_begin");
        struct files_reflog_iterator *iter = xcalloc(1, sizeof(*iter));
        struct ref_iterator *ref_iterator = &iter->base;
+       struct strbuf sb = STRBUF_INIT;
 
        base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable);
-       iter->dir_iterator = dir_iterator_begin(git_path("logs"));
+       files_reflog_path(refs, &sb, NULL);
+       iter->dir_iterator = dir_iterator_begin(sb.buf);
+       iter->ref_store = ref_store;
+       strbuf_release(&sb);
        return ref_iterator;
 }
 
-int for_each_reflog(each_ref_fn fn, void *cb_data)
-{
-       return do_for_each_ref_iterator(files_reflog_iterator_begin(),
-                                       fn, cb_data);
-}
-
 static int ref_update_reject_duplicates(struct string_list *refnames,
                                        struct strbuf *err)
 {
@@ -3460,7 +2649,8 @@ static int split_head_update(struct ref_update *update,
  * Note that the new update will itself be subject to splitting when
  * the iteration gets to it.
  */
-static int split_symref_update(struct ref_update *update,
+static int split_symref_update(struct files_ref_store *refs,
+                              struct ref_update *update,
                               const char *referent,
                               struct ref_transaction *transaction,
                               struct string_list *affected_refnames,
@@ -3574,7 +2764,8 @@ static int check_old_oid(struct ref_update *update, struct object_id *oid,
  * - If it is an update of head_ref, add a corresponding REF_LOG_ONLY
  *   update of HEAD.
  */
-static int lock_ref_for_update(struct ref_update *update,
+static int lock_ref_for_update(struct files_ref_store *refs,
+                              struct ref_update *update,
                               struct ref_transaction *transaction,
                               const char *head_ref,
                               struct string_list *affected_refnames,
@@ -3586,6 +2777,8 @@ static int lock_ref_for_update(struct ref_update *update,
        int ret;
        struct ref_lock *lock;
 
+       files_assert_main_repository(refs, "lock_ref_for_update");
+
        if ((update->flags & REF_HAVE_NEW) && is_null_sha1(update->new_sha1))
                update->flags |= REF_DELETING;
 
@@ -3596,11 +2789,10 @@ static int lock_ref_for_update(struct ref_update *update,
                        return ret;
        }
 
-       ret = lock_raw_ref(update->refname, mustexist,
+       ret = lock_raw_ref(refs, update->refname, mustexist,
                           affected_refnames, NULL,
-                          &update->lock, &referent,
+                          &lock, &referent,
                           &update->type, err);
-
        if (ret) {
                char *reason;
 
@@ -3611,7 +2803,7 @@ static int lock_ref_for_update(struct ref_update *update,
                return ret;
        }
 
-       lock = update->lock;
+       update->backend_data = lock;
 
        if (update->type & REF_ISSYMREF) {
                if (update->flags & REF_NODEREF) {
@@ -3620,8 +2812,9 @@ static int lock_ref_for_update(struct ref_update *update,
                         * the transaction, so we have to read it here
                         * to record and possibly check old_sha1:
                         */
-                       if (read_ref_full(referent.buf, 0,
-                                         lock->old_oid.hash, NULL)) {
+                       if (refs_read_ref_full(&refs->base,
+                                              referent.buf, 0,
+                                              lock->old_oid.hash, NULL)) {
                                if (update->flags & REF_HAVE_OLD) {
                                        strbuf_addf(err, "cannot lock ref '%s': "
                                                    "error reading reference",
@@ -3639,7 +2832,8 @@ static int lock_ref_for_update(struct ref_update *update,
                         * of processing the split-off update, so we
                         * don't have to do it here.
                         */
-                       ret = split_symref_update(update, referent.buf, transaction,
+                       ret = split_symref_update(refs, update,
+                                                 referent.buf, transaction,
                                                  affected_refnames, err);
                        if (ret)
                                return ret;
@@ -3658,7 +2852,8 @@ static int lock_ref_for_update(struct ref_update *update,
                for (parent_update = update->parent_update;
                     parent_update;
                     parent_update = parent_update->parent_update) {
-                       oidcpy(&parent_update->lock->old_oid, &lock->old_oid);
+                       struct ref_lock *parent_lock = parent_update->backend_data;
+                       oidcpy(&parent_lock->old_oid, &lock->old_oid);
                }
        }
 
@@ -3679,7 +2874,7 @@ static int lock_ref_for_update(struct ref_update *update,
                         * The lock was freed upon failure of
                         * write_ref_to_lockfile():
                         */
-                       update->lock = NULL;
+                       update->backend_data = NULL;
                        strbuf_addf(err,
                                    "cannot update ref '%s': %s",
                                    update->refname, write_err);
@@ -3704,9 +2899,13 @@ static int lock_ref_for_update(struct ref_update *update,
        return 0;
 }
 
-int ref_transaction_commit(struct ref_transaction *transaction,
-                          struct strbuf *err)
+static int files_transaction_commit(struct ref_store *ref_store,
+                                   struct ref_transaction *transaction,
+                                   struct strbuf *err)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE,
+                              "ref_transaction_commit");
        int ret = 0, i;
        struct string_list refs_to_delete = STRING_LIST_INIT_NODUP;
        struct string_list_item *ref_to_delete;
@@ -3714,6 +2913,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
        char *head_ref = NULL;
        int head_type;
        struct object_id head_oid;
+       struct strbuf sb = STRBUF_INIT;
 
        assert(err);
 
@@ -3768,8 +2968,9 @@ int ref_transaction_commit(struct ref_transaction *transaction,
         * head_ref within the transaction, then split_head_update()
         * arranges for the reflog of HEAD to be updated, too.
         */
-       head_ref = resolve_refdup("HEAD", RESOLVE_REF_NO_RECURSE,
-                                 head_oid.hash, &head_type);
+       head_ref = refs_resolve_refdup(ref_store, "HEAD",
+                                      RESOLVE_REF_NO_RECURSE,
+                                      head_oid.hash, &head_type);
 
        if (head_ref && !(head_type & REF_ISSYMREF)) {
                free(head_ref);
@@ -3785,8 +2986,8 @@ int ref_transaction_commit(struct ref_transaction *transaction,
        for (i = 0; i < transaction->nr; i++) {
                struct ref_update *update = transaction->updates[i];
 
-               ret = lock_ref_for_update(update, transaction, head_ref,
-                                         &affected_refnames, err);
+               ret = lock_ref_for_update(refs, update, transaction,
+                                         head_ref, &affected_refnames, err);
                if (ret)
                        goto cleanup;
        }
@@ -3794,30 +2995,33 @@ int ref_transaction_commit(struct ref_transaction *transaction,
        /* Perform updates first so live commits remain referenced */
        for (i = 0; i < transaction->nr; i++) {
                struct ref_update *update = transaction->updates[i];
-               struct ref_lock *lock = update->lock;
+               struct ref_lock *lock = update->backend_data;
 
                if (update->flags & REF_NEEDS_COMMIT ||
                    update->flags & REF_LOG_ONLY) {
-                       if (log_ref_write(lock->ref_name, lock->old_oid.hash,
-                                         update->new_sha1,
-                                         update->msg, update->flags, err)) {
+                       if (files_log_ref_write(refs,
+                                               lock->ref_name,
+                                               lock->old_oid.hash,
+                                               update->new_sha1,
+                                               update->msg, update->flags,
+                                               err)) {
                                char *old_msg = strbuf_detach(err, NULL);
 
                                strbuf_addf(err, "cannot update the ref '%s': %s",
                                            lock->ref_name, old_msg);
                                free(old_msg);
                                unlock_ref(lock);
-                               update->lock = NULL;
+                               update->backend_data = NULL;
                                ret = TRANSACTION_GENERIC_ERROR;
                                goto cleanup;
                        }
                }
                if (update->flags & REF_NEEDS_COMMIT) {
-                       clear_loose_ref_cache(&ref_cache);
+                       clear_loose_ref_cache(refs);
                        if (commit_ref(lock)) {
                                strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
                                unlock_ref(lock);
-                               update->lock = NULL;
+                               update->backend_data = NULL;
                                ret = TRANSACTION_GENERIC_ERROR;
                                goto cleanup;
                        }
@@ -3826,34 +3030,67 @@ int ref_transaction_commit(struct ref_transaction *transaction,
        /* Perform deletes now that updates are safely completed */
        for (i = 0; i < transaction->nr; i++) {
                struct ref_update *update = transaction->updates[i];
+               struct ref_lock *lock = update->backend_data;
 
                if (update->flags & REF_DELETING &&
                    !(update->flags & REF_LOG_ONLY)) {
-                       if (delete_ref_loose(update->lock, update->type, err)) {
-                               ret = TRANSACTION_GENERIC_ERROR;
-                               goto cleanup;
+                       if (!(update->type & REF_ISPACKED) ||
+                           update->type & REF_ISSYMREF) {
+                               /* It is a loose reference. */
+                               strbuf_reset(&sb);
+                               files_ref_path(refs, &sb, lock->ref_name);
+                               if (unlink_or_msg(sb.buf, err)) {
+                                       ret = TRANSACTION_GENERIC_ERROR;
+                                       goto cleanup;
+                               }
+                               update->flags |= REF_DELETED_LOOSE;
                        }
 
                        if (!(update->flags & REF_ISPRUNING))
                                string_list_append(&refs_to_delete,
-                                                  update->lock->ref_name);
+                                                  lock->ref_name);
                }
        }
 
-       if (repack_without_refs(&refs_to_delete, err)) {
+       if (repack_without_refs(refs, &refs_to_delete, err)) {
                ret = TRANSACTION_GENERIC_ERROR;
                goto cleanup;
        }
-       for_each_string_list_item(ref_to_delete, &refs_to_delete)
-               unlink_or_warn(git_path("logs/%s", ref_to_delete->string));
-       clear_loose_ref_cache(&ref_cache);
+
+       /* Delete the reflogs of any references that were deleted: */
+       for_each_string_list_item(ref_to_delete, &refs_to_delete) {
+               strbuf_reset(&sb);
+               files_reflog_path(refs, &sb, ref_to_delete->string);
+               if (!unlink_or_warn(sb.buf))
+                       try_remove_empty_parents(refs, ref_to_delete->string,
+                                                REMOVE_EMPTY_PARENTS_REFLOG);
+       }
+
+       clear_loose_ref_cache(refs);
 
 cleanup:
+       strbuf_release(&sb);
        transaction->state = REF_TRANSACTION_CLOSED;
 
-       for (i = 0; i < transaction->nr; i++)
-               if (transaction->updates[i]->lock)
-                       unlock_ref(transaction->updates[i]->lock);
+       for (i = 0; i < transaction->nr; i++) {
+               struct ref_update *update = transaction->updates[i];
+               struct ref_lock *lock = update->backend_data;
+
+               if (lock)
+                       unlock_ref(lock);
+
+               if (update->flags & REF_DELETED_LOOSE) {
+                       /*
+                        * The loose reference was deleted. Delete any
+                        * empty parent directories. (Note that this
+                        * can only work because we have already
+                        * removed the lockfile.)
+                        */
+                       try_remove_empty_parents(refs, update->refname,
+                                                REMOVE_EMPTY_PARENTS_REF);
+               }
+       }
+
        string_list_clear(&refs_to_delete, 0);
        free(head_ref);
        string_list_clear(&affected_refnames, 0);
@@ -3869,9 +3106,13 @@ static int ref_present(const char *refname,
        return string_list_has_string(affected_refnames, refname);
 }
 
-int initial_ref_transaction_commit(struct ref_transaction *transaction,
-                                  struct strbuf *err)
+static int files_initial_transaction_commit(struct ref_store *ref_store,
+                                           struct ref_transaction *transaction,
+                                           struct strbuf *err)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE,
+                              "initial_ref_transaction_commit");
        int ret = 0, i;
        struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
 
@@ -3902,7 +3143,8 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
         * so here we really only check that none of the references
         * that we are creating already exists.
         */
-       if (for_each_rawref(ref_present, &affected_refnames))
+       if (refs_for_each_rawref(&refs->base, ref_present,
+                                &affected_refnames))
                die("BUG: initial ref transaction called with existing refs");
 
        for (i = 0; i < transaction->nr; i++) {
@@ -3911,15 +3153,15 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
                if ((update->flags & REF_HAVE_OLD) &&
                    !is_null_sha1(update->old_sha1))
                        die("BUG: initial ref transaction with old_sha1 set");
-               if (verify_refname_available(update->refname,
-                                            &affected_refnames, NULL,
-                                            err)) {
+               if (refs_verify_refname_available(&refs->base, update->refname,
+                                                 &affected_refnames, NULL,
+                                                 err)) {
                        ret = TRANSACTION_NAME_CONFLICT;
                        goto cleanup;
                }
        }
 
-       if (lock_packed_refs(0)) {
+       if (lock_packed_refs(refs, 0)) {
                strbuf_addf(err, "unable to lock packed-refs file: %s",
                            strerror(errno));
                ret = TRANSACTION_GENERIC_ERROR;
@@ -3931,10 +3173,10 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
 
                if ((update->flags & REF_HAVE_NEW) &&
                    !is_null_sha1(update->new_sha1))
-                       add_packed_ref(update->refname, update->new_sha1);
+                       add_packed_ref(refs, update->refname, update->new_sha1);
        }
 
-       if (commit_packed_refs()) {
+       if (commit_packed_refs(refs)) {
                strbuf_addf(err, "unable to commit packed-refs file: %s",
                            strerror(errno));
                ret = TRANSACTION_GENERIC_ERROR;
@@ -3952,10 +3194,10 @@ struct expire_reflog_cb {
        reflog_expiry_should_prune_fn *should_prune_fn;
        void *policy_cb;
        FILE *newlog;
-       unsigned char last_kept_sha1[20];
+       struct object_id last_kept_oid;
 };
 
-static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+static int expire_reflog_ent(struct object_id *ooid, struct object_id *noid,
                             const char *email, unsigned long timestamp, int tz,
                             const char *message, void *cb_data)
 {
@@ -3963,9 +3205,9 @@ static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
        struct expire_reflog_policy_cb *policy_cb = cb->policy_cb;
 
        if (cb->flags & EXPIRE_REFLOGS_REWRITE)
-               osha1 = cb->last_kept_sha1;
+               ooid = &cb->last_kept_oid;
 
-       if ((*cb->should_prune_fn)(osha1, nsha1, email, timestamp, tz,
+       if ((*cb->should_prune_fn)(ooid->hash, noid->hash, email, timestamp, tz,
                                   message, policy_cb)) {
                if (!cb->newlog)
                        printf("would prune %s", message);
@@ -3974,9 +3216,9 @@ static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
        } else {
                if (cb->newlog) {
                        fprintf(cb->newlog, "%s %s %s %lu %+05d\t%s",
-                               sha1_to_hex(osha1), sha1_to_hex(nsha1),
+                               oid_to_hex(ooid), oid_to_hex(noid),
                                email, timestamp, tz, message);
-                       hashcpy(cb->last_kept_sha1, nsha1);
+                       oidcpy(&cb->last_kept_oid, noid);
                }
                if (cb->flags & EXPIRE_REFLOGS_VERBOSE)
                        printf("keep %s", message);
@@ -3984,16 +3226,20 @@ static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
        return 0;
 }
 
-int reflog_expire(const char *refname, const unsigned char *sha1,
-                unsigned int flags,
-                reflog_expiry_prepare_fn prepare_fn,
-                reflog_expiry_should_prune_fn should_prune_fn,
-                reflog_expiry_cleanup_fn cleanup_fn,
-                void *policy_cb_data)
+static int files_reflog_expire(struct ref_store *ref_store,
+                              const char *refname, const unsigned char *sha1,
+                              unsigned int flags,
+                              reflog_expiry_prepare_fn prepare_fn,
+                              reflog_expiry_should_prune_fn should_prune_fn,
+                              reflog_expiry_cleanup_fn cleanup_fn,
+                              void *policy_cb_data)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE, "reflog_expire");
        static struct lock_file reflog_lock;
        struct expire_reflog_cb cb;
        struct ref_lock *lock;
+       struct strbuf log_file_sb = STRBUF_INIT;
        char *log_file;
        int status = 0;
        int type;
@@ -4009,19 +3255,21 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
         * reference itself, plus we might need to update the
         * reference if --updateref was specified:
         */
-       lock = lock_ref_sha1_basic(refname, sha1, NULL, NULL, REF_NODEREF,
+       lock = lock_ref_sha1_basic(refs, refname, sha1,
+                                  NULL, NULL, REF_NODEREF,
                                   &type, &err);
        if (!lock) {
                error("cannot lock ref '%s': %s", refname, err.buf);
                strbuf_release(&err);
                return -1;
        }
-       if (!reflog_exists(refname)) {
+       if (!refs_reflog_exists(ref_store, refname)) {
                unlock_ref(lock);
                return 0;
        }
 
-       log_file = git_pathdup("logs/%s", refname);
+       files_reflog_path(refs, &log_file_sb, refname);
+       log_file = strbuf_detach(&log_file_sb, NULL);
        if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
                /*
                 * Even though holding $GIT_DIR/logs/$reflog.lock has
@@ -4046,7 +3294,7 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
        }
 
        (*prepare_fn)(refname, sha1, cb.policy_cb);
-       for_each_reflog_ent(refname, expire_reflog_ent, &cb);
+       refs_for_each_reflog_ent(ref_store, refname, expire_reflog_ent, &cb);
        (*cleanup_fn)(cb.policy_cb);
 
        if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
@@ -4059,14 +3307,14 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
                 */
                int update = (flags & EXPIRE_REFLOGS_UPDATE_REF) &&
                        !(type & REF_ISSYMREF) &&
-                       !is_null_sha1(cb.last_kept_sha1);
+                       !is_null_oid(&cb.last_kept_oid);
 
                if (close_lock_file(&reflog_lock)) {
                        status |= error("couldn't write %s: %s", log_file,
                                        strerror(errno));
                } else if (update &&
                           (write_in_full(get_lock_file_fd(lock->lk),
-                               sha1_to_hex(cb.last_kept_sha1), 40) != 40 ||
+                               oid_to_hex(&cb.last_kept_oid), GIT_SHA1_HEXSZ) != GIT_SHA1_HEXSZ ||
                            write_str_in_full(get_lock_file_fd(lock->lk), "\n") != 1 ||
                            close_ref(lock) < 0)) {
                        status |= error("couldn't write %s",
@@ -4089,3 +3337,49 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
        unlock_ref(lock);
        return -1;
 }
+
+static int files_init_db(struct ref_store *ref_store, struct strbuf *err)
+{
+       struct files_ref_store *refs =
+               files_downcast(ref_store, REF_STORE_WRITE, "init_db");
+       struct strbuf sb = STRBUF_INIT;
+
+       /*
+        * Create .git/refs/{heads,tags}
+        */
+       files_ref_path(refs, &sb, "refs/heads");
+       safe_create_dir(sb.buf, 1);
+
+       strbuf_reset(&sb);
+       files_ref_path(refs, &sb, "refs/tags");
+       safe_create_dir(sb.buf, 1);
+
+       strbuf_release(&sb);
+       return 0;
+}
+
+struct ref_storage_be refs_be_files = {
+       NULL,
+       "files",
+       files_ref_store_create,
+       files_init_db,
+       files_transaction_commit,
+       files_initial_transaction_commit,
+
+       files_pack_refs,
+       files_peel_ref,
+       files_create_symref,
+       files_delete_refs,
+       files_rename_ref,
+
+       files_ref_iterator_begin,
+       files_read_raw_ref,
+
+       files_reflog_iterator_begin,
+       files_for_each_reflog_ent,
+       files_for_each_reflog_ent_reverse,
+       files_reflog_exists,
+       files_create_reflog,
+       files_delete_reflog,
+       files_reflog_expire
+};
diff --git a/refs/ref-cache.c b/refs/ref-cache.c
new file mode 100644 (file)
index 0000000..6059362
--- /dev/null
@@ -0,0 +1,523 @@
+#include "../cache.h"
+#include "../refs.h"
+#include "refs-internal.h"
+#include "ref-cache.h"
+#include "../iterator.h"
+
+void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry)
+{
+       ALLOC_GROW(dir->entries, dir->nr + 1, dir->alloc);
+       dir->entries[dir->nr++] = entry;
+       /* optimize for the case that entries are added in order */
+       if (dir->nr == 1 ||
+           (dir->nr == dir->sorted + 1 &&
+            strcmp(dir->entries[dir->nr - 2]->name,
+                   dir->entries[dir->nr - 1]->name) < 0))
+               dir->sorted = dir->nr;
+}
+
+struct ref_dir *get_ref_dir(struct ref_entry *entry)
+{
+       struct ref_dir *dir;
+       assert(entry->flag & REF_DIR);
+       dir = &entry->u.subdir;
+       if (entry->flag & REF_INCOMPLETE) {
+               if (!dir->cache->fill_ref_dir)
+                       die("BUG: incomplete ref_store without fill_ref_dir function");
+
+               dir->cache->fill_ref_dir(dir->cache->ref_store, dir, entry->name);
+               entry->flag &= ~REF_INCOMPLETE;
+       }
+       return dir;
+}
+
+struct ref_entry *create_ref_entry(const char *refname,
+                                  const unsigned char *sha1, int flag,
+                                  int check_name)
+{
+       struct ref_entry *ref;
+
+       if (check_name &&
+           check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
+               die("Reference has invalid format: '%s'", refname);
+       FLEX_ALLOC_STR(ref, name, refname);
+       hashcpy(ref->u.value.oid.hash, sha1);
+       oidclr(&ref->u.value.peeled);
+       ref->flag = flag;
+       return ref;
+}
+
+struct ref_cache *create_ref_cache(struct ref_store *refs,
+                                  fill_ref_dir_fn *fill_ref_dir)
+{
+       struct ref_cache *ret = xcalloc(1, sizeof(*ret));
+
+       ret->ref_store = refs;
+       ret->fill_ref_dir = fill_ref_dir;
+       ret->root = create_dir_entry(ret, "", 0, 1);
+       return ret;
+}
+
+static void clear_ref_dir(struct ref_dir *dir);
+
+static void free_ref_entry(struct ref_entry *entry)
+{
+       if (entry->flag & REF_DIR) {
+               /*
+                * Do not use get_ref_dir() here, as that might
+                * trigger the reading of loose refs.
+                */
+               clear_ref_dir(&entry->u.subdir);
+       }
+       free(entry);
+}
+
+void free_ref_cache(struct ref_cache *cache)
+{
+       free_ref_entry(cache->root);
+       free(cache);
+}
+
+/*
+ * Clear and free all entries in dir, recursively.
+ */
+static void clear_ref_dir(struct ref_dir *dir)
+{
+       int i;
+       for (i = 0; i < dir->nr; i++)
+               free_ref_entry(dir->entries[i]);
+       free(dir->entries);
+       dir->sorted = dir->nr = dir->alloc = 0;
+       dir->entries = NULL;
+}
+
+struct ref_entry *create_dir_entry(struct ref_cache *cache,
+                                  const char *dirname, size_t len,
+                                  int incomplete)
+{
+       struct ref_entry *direntry;
+
+       FLEX_ALLOC_MEM(direntry, name, dirname, len);
+       direntry->u.subdir.cache = cache;
+       direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE : 0);
+       return direntry;
+}
+
+static int ref_entry_cmp(const void *a, const void *b)
+{
+       struct ref_entry *one = *(struct ref_entry **)a;
+       struct ref_entry *two = *(struct ref_entry **)b;
+       return strcmp(one->name, two->name);
+}
+
+static void sort_ref_dir(struct ref_dir *dir);
+
+struct string_slice {
+       size_t len;
+       const char *str;
+};
+
+static int ref_entry_cmp_sslice(const void *key_, const void *ent_)
+{
+       const struct string_slice *key = key_;
+       const struct ref_entry *ent = *(const struct ref_entry * const *)ent_;
+       int cmp = strncmp(key->str, ent->name, key->len);
+       if (cmp)
+               return cmp;
+       return '\0' - (unsigned char)ent->name[key->len];
+}
+
+int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len)
+{
+       struct ref_entry **r;
+       struct string_slice key;
+
+       if (refname == NULL || !dir->nr)
+               return -1;
+
+       sort_ref_dir(dir);
+       key.len = len;
+       key.str = refname;
+       r = bsearch(&key, dir->entries, dir->nr, sizeof(*dir->entries),
+                   ref_entry_cmp_sslice);
+
+       if (r == NULL)
+               return -1;
+
+       return r - dir->entries;
+}
+
+/*
+ * Search for a directory entry directly within dir (without
+ * recursing).  Sort dir if necessary.  subdirname must be a directory
+ * name (i.e., end in '/').  If mkdir is set, then create the
+ * directory if it is missing; otherwise, return NULL if the desired
+ * directory cannot be found.  dir must already be complete.
+ */
+static struct ref_dir *search_for_subdir(struct ref_dir *dir,
+                                        const char *subdirname, size_t len,
+                                        int mkdir)
+{
+       int entry_index = search_ref_dir(dir, subdirname, len);
+       struct ref_entry *entry;
+       if (entry_index == -1) {
+               if (!mkdir)
+                       return NULL;
+               /*
+                * Since dir is complete, the absence of a subdir
+                * means that the subdir really doesn't exist;
+                * therefore, create an empty record for it but mark
+                * the record complete.
+                */
+               entry = create_dir_entry(dir->cache, subdirname, len, 0);
+               add_entry_to_dir(dir, entry);
+       } else {
+               entry = dir->entries[entry_index];
+       }
+       return get_ref_dir(entry);
+}
+
+/*
+ * If refname is a reference name, find the ref_dir within the dir
+ * tree that should hold refname. If refname is a directory name
+ * (i.e., it ends in '/'), then return that ref_dir itself. dir must
+ * represent the top-level directory and must already be complete.
+ * Sort ref_dirs and recurse into subdirectories as necessary. If
+ * mkdir is set, then create any missing directories; otherwise,
+ * return NULL if the desired directory cannot be found.
+ */
+static struct ref_dir *find_containing_dir(struct ref_dir *dir,
+                                          const char *refname, int mkdir)
+{
+       const char *slash;
+       for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
+               size_t dirnamelen = slash - refname + 1;
+               struct ref_dir *subdir;
+               subdir = search_for_subdir(dir, refname, dirnamelen, mkdir);
+               if (!subdir) {
+                       dir = NULL;
+                       break;
+               }
+               dir = subdir;
+       }
+
+       return dir;
+}
+
+struct ref_entry *find_ref_entry(struct ref_dir *dir, const char *refname)
+{
+       int entry_index;
+       struct ref_entry *entry;
+       dir = find_containing_dir(dir, refname, 0);
+       if (!dir)
+               return NULL;
+       entry_index = search_ref_dir(dir, refname, strlen(refname));
+       if (entry_index == -1)
+               return NULL;
+       entry = dir->entries[entry_index];
+       return (entry->flag & REF_DIR) ? NULL : entry;
+}
+
+int remove_entry_from_dir(struct ref_dir *dir, const char *refname)
+{
+       int refname_len = strlen(refname);
+       int entry_index;
+       struct ref_entry *entry;
+       int is_dir = refname[refname_len - 1] == '/';
+       if (is_dir) {
+               /*
+                * refname represents a reference directory.  Remove
+                * the trailing slash; otherwise we will get the
+                * directory *representing* refname rather than the
+                * one *containing* it.
+                */
+               char *dirname = xmemdupz(refname, refname_len - 1);
+               dir = find_containing_dir(dir, dirname, 0);
+               free(dirname);
+       } else {
+               dir = find_containing_dir(dir, refname, 0);
+       }
+       if (!dir)
+               return -1;
+       entry_index = search_ref_dir(dir, refname, refname_len);
+       if (entry_index == -1)
+               return -1;
+       entry = dir->entries[entry_index];
+
+       memmove(&dir->entries[entry_index],
+               &dir->entries[entry_index + 1],
+               (dir->nr - entry_index - 1) * sizeof(*dir->entries)
+               );
+       dir->nr--;
+       if (dir->sorted > entry_index)
+               dir->sorted--;
+       free_ref_entry(entry);
+       return dir->nr;
+}
+
+int add_ref_entry(struct ref_dir *dir, struct ref_entry *ref)
+{
+       dir = find_containing_dir(dir, ref->name, 1);
+       if (!dir)
+               return -1;
+       add_entry_to_dir(dir, ref);
+       return 0;
+}
+
+/*
+ * Emit a warning and return true iff ref1 and ref2 have the same name
+ * and the same sha1.  Die if they have the same name but different
+ * sha1s.
+ */
+static int is_dup_ref(const struct ref_entry *ref1, const struct ref_entry *ref2)
+{
+       if (strcmp(ref1->name, ref2->name))
+               return 0;
+
+       /* Duplicate name; make sure that they don't conflict: */
+
+       if ((ref1->flag & REF_DIR) || (ref2->flag & REF_DIR))
+               /* This is impossible by construction */
+               die("Reference directory conflict: %s", ref1->name);
+
+       if (oidcmp(&ref1->u.value.oid, &ref2->u.value.oid))
+               die("Duplicated ref, and SHA1s don't match: %s", ref1->name);
+
+       warning("Duplicated ref: %s", ref1->name);
+       return 1;
+}
+
+/*
+ * Sort the entries in dir non-recursively (if they are not already
+ * sorted) and remove any duplicate entries.
+ */
+static void sort_ref_dir(struct ref_dir *dir)
+{
+       int i, j;
+       struct ref_entry *last = NULL;
+
+       /*
+        * This check also prevents passing a zero-length array to qsort(),
+        * which is a problem on some platforms.
+        */
+       if (dir->sorted == dir->nr)
+               return;
+
+       QSORT(dir->entries, dir->nr, ref_entry_cmp);
+
+       /* Remove any duplicates: */
+       for (i = 0, j = 0; j < dir->nr; j++) {
+               struct ref_entry *entry = dir->entries[j];
+               if (last && is_dup_ref(last, entry))
+                       free_ref_entry(entry);
+               else
+                       last = dir->entries[i++] = entry;
+       }
+       dir->sorted = dir->nr = i;
+}
+
+/*
+ * Load all of the refs from `dir` (recursively) into our in-memory
+ * cache.
+ */
+static void prime_ref_dir(struct ref_dir *dir)
+{
+       /*
+        * The hard work of loading loose refs is done by get_ref_dir(), so we
+        * just need to recurse through all of the sub-directories. We do not
+        * even need to care about sorting, as traversal order does not matter
+        * to us.
+        */
+       int i;
+       for (i = 0; i < dir->nr; i++) {
+               struct ref_entry *entry = dir->entries[i];
+               if (entry->flag & REF_DIR)
+                       prime_ref_dir(get_ref_dir(entry));
+       }
+}
+
+/*
+ * A level in the reference hierarchy that is currently being iterated
+ * through.
+ */
+struct cache_ref_iterator_level {
+       /*
+        * The ref_dir being iterated over at this level. The ref_dir
+        * is sorted before being stored here.
+        */
+       struct ref_dir *dir;
+
+       /*
+        * The index of the current entry within dir (which might
+        * itself be a directory). If index == -1, then the iteration
+        * hasn't yet begun. If index == dir->nr, then the iteration
+        * through this level is over.
+        */
+       int index;
+};
+
+/*
+ * Represent an iteration through a ref_dir in the memory cache. The
+ * iteration recurses through subdirectories.
+ */
+struct cache_ref_iterator {
+       struct ref_iterator base;
+
+       /*
+        * The number of levels currently on the stack. This is always
+        * at least 1, because when it becomes zero the iteration is
+        * ended and this struct is freed.
+        */
+       size_t levels_nr;
+
+       /* The number of levels that have been allocated on the stack */
+       size_t levels_alloc;
+
+       /*
+        * A stack of levels. levels[0] is the uppermost level that is
+        * being iterated over in this iteration. (This is not
+        * necessary the top level in the references hierarchy. If we
+        * are iterating through a subtree, then levels[0] will hold
+        * the ref_dir for that subtree, and subsequent levels will go
+        * on from there.)
+        */
+       struct cache_ref_iterator_level *levels;
+};
+
+static int cache_ref_iterator_advance(struct ref_iterator *ref_iterator)
+{
+       struct cache_ref_iterator *iter =
+               (struct cache_ref_iterator *)ref_iterator;
+
+       while (1) {
+               struct cache_ref_iterator_level *level =
+                       &iter->levels[iter->levels_nr - 1];
+               struct ref_dir *dir = level->dir;
+               struct ref_entry *entry;
+
+               if (level->index == -1)
+                       sort_ref_dir(dir);
+
+               if (++level->index == level->dir->nr) {
+                       /* This level is exhausted; pop up a level */
+                       if (--iter->levels_nr == 0)
+                               return ref_iterator_abort(ref_iterator);
+
+                       continue;
+               }
+
+               entry = dir->entries[level->index];
+
+               if (entry->flag & REF_DIR) {
+                       /* push down a level */
+                       ALLOC_GROW(iter->levels, iter->levels_nr + 1,
+                                  iter->levels_alloc);
+
+                       level = &iter->levels[iter->levels_nr++];
+                       level->dir = get_ref_dir(entry);
+                       level->index = -1;
+               } else {
+                       iter->base.refname = entry->name;
+                       iter->base.oid = &entry->u.value.oid;
+                       iter->base.flags = entry->flag;
+                       return ITER_OK;
+               }
+       }
+}
+
+enum peel_status peel_entry(struct ref_entry *entry, int repeel)
+{
+       enum peel_status status;
+
+       if (entry->flag & REF_KNOWS_PEELED) {
+               if (repeel) {
+                       entry->flag &= ~REF_KNOWS_PEELED;
+                       oidclr(&entry->u.value.peeled);
+               } else {
+                       return is_null_oid(&entry->u.value.peeled) ?
+                               PEEL_NON_TAG : PEEL_PEELED;
+               }
+       }
+       if (entry->flag & REF_ISBROKEN)
+               return PEEL_BROKEN;
+       if (entry->flag & REF_ISSYMREF)
+               return PEEL_IS_SYMREF;
+
+       status = peel_object(entry->u.value.oid.hash, entry->u.value.peeled.hash);
+       if (status == PEEL_PEELED || status == PEEL_NON_TAG)
+               entry->flag |= REF_KNOWS_PEELED;
+       return status;
+}
+
+static int cache_ref_iterator_peel(struct ref_iterator *ref_iterator,
+                                  struct object_id *peeled)
+{
+       struct cache_ref_iterator *iter =
+               (struct cache_ref_iterator *)ref_iterator;
+       struct cache_ref_iterator_level *level;
+       struct ref_entry *entry;
+
+       level = &iter->levels[iter->levels_nr - 1];
+
+       if (level->index == -1)
+               die("BUG: peel called before advance for cache iterator");
+
+       entry = level->dir->entries[level->index];
+
+       if (peel_entry(entry, 0))
+               return -1;
+       oidcpy(peeled, &entry->u.value.peeled);
+       return 0;
+}
+
+static int cache_ref_iterator_abort(struct ref_iterator *ref_iterator)
+{
+       struct cache_ref_iterator *iter =
+               (struct cache_ref_iterator *)ref_iterator;
+
+       free(iter->levels);
+       base_ref_iterator_free(ref_iterator);
+       return ITER_DONE;
+}
+
+static struct ref_iterator_vtable cache_ref_iterator_vtable = {
+       cache_ref_iterator_advance,
+       cache_ref_iterator_peel,
+       cache_ref_iterator_abort
+};
+
+struct ref_iterator *cache_ref_iterator_begin(struct ref_cache *cache,
+                                             const char *prefix,
+                                             int prime_dir)
+{
+       struct ref_dir *dir;
+       struct cache_ref_iterator *iter;
+       struct ref_iterator *ref_iterator;
+       struct cache_ref_iterator_level *level;
+
+       dir = get_ref_dir(cache->root);
+       if (prefix && *prefix)
+               dir = find_containing_dir(dir, prefix, 0);
+       if (!dir)
+               /* There's nothing to iterate over. */
+               return  empty_ref_iterator_begin();
+
+       if (prime_dir)
+               prime_ref_dir(dir);
+
+       iter = xcalloc(1, sizeof(*iter));
+       ref_iterator = &iter->base;
+       base_ref_iterator_init(ref_iterator, &cache_ref_iterator_vtable);
+       ALLOC_GROW(iter->levels, 10, iter->levels_alloc);
+
+       iter->levels_nr = 1;
+       level = &iter->levels[0];
+       level->index = -1;
+       level->dir = dir;
+
+       if (prefix && *prefix)
+               ref_iterator = prefix_ref_iterator_begin(ref_iterator,
+                                                        prefix, 0);
+
+       return ref_iterator;
+}
diff --git a/refs/ref-cache.h b/refs/ref-cache.h
new file mode 100644 (file)
index 0000000..ffdc54f
--- /dev/null
@@ -0,0 +1,267 @@
+#ifndef REFS_REF_CACHE_H
+#define REFS_REF_CACHE_H
+
+struct ref_dir;
+
+/*
+ * If this ref_cache is filled lazily, this function is used to load
+ * information into the specified ref_dir (shallow or deep, at the
+ * option of the ref_store). dirname includes a trailing slash.
+ */
+typedef void fill_ref_dir_fn(struct ref_store *ref_store,
+                            struct ref_dir *dir, const char *dirname);
+
+struct ref_cache {
+       struct ref_entry *root;
+
+       /* A pointer to the ref_store whose cache this is: */
+       struct ref_store *ref_store;
+
+       /*
+        * Function used (if necessary) to lazily-fill cache. May be
+        * NULL.
+        */
+       fill_ref_dir_fn *fill_ref_dir;
+};
+
+/*
+ * Information used (along with the information in ref_entry) to
+ * describe a single cached reference.  This data structure only
+ * occurs embedded in a union in struct ref_entry, and only when
+ * (ref_entry->flag & REF_DIR) is zero.
+ */
+struct ref_value {
+       /*
+        * The name of the object to which this reference resolves
+        * (which may be a tag object).  If REF_ISBROKEN, this is
+        * null.  If REF_ISSYMREF, then this is the name of the object
+        * referred to by the last reference in the symlink chain.
+        */
+       struct object_id oid;
+
+       /*
+        * If REF_KNOWS_PEELED, then this field holds the peeled value
+        * of this reference, or null if the reference is known not to
+        * be peelable.  See the documentation for peel_ref() for an
+        * exact definition of "peelable".
+        */
+       struct object_id peeled;
+};
+
+/*
+ * Information used (along with the information in ref_entry) to
+ * describe a level in the hierarchy of references.  This data
+ * structure only occurs embedded in a union in struct ref_entry, and
+ * only when (ref_entry.flag & REF_DIR) is set.  In that case,
+ * (ref_entry.flag & REF_INCOMPLETE) determines whether the references
+ * in the directory have already been read:
+ *
+ *     (ref_entry.flag & REF_INCOMPLETE) unset -- a directory of loose
+ *         or packed references, already read.
+ *
+ *     (ref_entry.flag & REF_INCOMPLETE) set -- a directory of loose
+ *         references that hasn't been read yet (nor has any of its
+ *         subdirectories).
+ *
+ * Entries within a directory are stored within a growable array of
+ * pointers to ref_entries (entries, nr, alloc).  Entries 0 <= i <
+ * sorted are sorted by their component name in strcmp() order and the
+ * remaining entries are unsorted.
+ *
+ * Loose references are read lazily, one directory at a time.  When a
+ * directory of loose references is read, then all of the references
+ * in that directory are stored, and REF_INCOMPLETE stubs are created
+ * for any subdirectories, but the subdirectories themselves are not
+ * read.  The reading is triggered by get_ref_dir().
+ */
+struct ref_dir {
+       int nr, alloc;
+
+       /*
+        * Entries with index 0 <= i < sorted are sorted by name.  New
+        * entries are appended to the list unsorted, and are sorted
+        * only when required; thus we avoid the need to sort the list
+        * after the addition of every reference.
+        */
+       int sorted;
+
+       /* The ref_cache containing this entry: */
+       struct ref_cache *cache;
+
+       struct ref_entry **entries;
+};
+
+/*
+ * Bit values for ref_entry::flag.  REF_ISSYMREF=0x01,
+ * REF_ISPACKED=0x02, REF_ISBROKEN=0x04 and REF_BAD_NAME=0x08 are
+ * public values; see refs.h.
+ */
+
+/*
+ * The field ref_entry->u.value.peeled of this value entry contains
+ * the correct peeled value for the reference, which might be
+ * null_sha1 if the reference is not a tag or if it is broken.
+ */
+#define REF_KNOWS_PEELED 0x10
+
+/* ref_entry represents a directory of references */
+#define REF_DIR 0x20
+
+/*
+ * Entry has not yet been read from disk (used only for REF_DIR
+ * entries representing loose references)
+ */
+#define REF_INCOMPLETE 0x40
+
+/*
+ * A ref_entry represents either a reference or a "subdirectory" of
+ * references.
+ *
+ * Each directory in the reference namespace is represented by a
+ * ref_entry with (flags & REF_DIR) set and containing a subdir member
+ * that holds the entries in that directory that have been read so
+ * far.  If (flags & REF_INCOMPLETE) is set, then the directory and
+ * its subdirectories haven't been read yet.  REF_INCOMPLETE is only
+ * used for loose reference directories.
+ *
+ * References are represented by a ref_entry with (flags & REF_DIR)
+ * unset and a value member that describes the reference's value.  The
+ * flag member is at the ref_entry level, but it is also needed to
+ * interpret the contents of the value field (in other words, a
+ * ref_value object is not very much use without the enclosing
+ * ref_entry).
+ *
+ * Reference names cannot end with slash and directories' names are
+ * always stored with a trailing slash (except for the top-level
+ * directory, which is always denoted by "").  This has two nice
+ * consequences: (1) when the entries in each subdir are sorted
+ * lexicographically by name (as they usually are), the references in
+ * a whole tree can be generated in lexicographic order by traversing
+ * the tree in left-to-right, depth-first order; (2) the names of
+ * references and subdirectories cannot conflict, and therefore the
+ * presence of an empty subdirectory does not block the creation of a
+ * similarly-named reference.  (The fact that reference names with the
+ * same leading components can conflict *with each other* is a
+ * separate issue that is regulated by refs_verify_refname_available().)
+ *
+ * Please note that the name field contains the fully-qualified
+ * reference (or subdirectory) name.  Space could be saved by only
+ * storing the relative names.  But that would require the full names
+ * to be generated on the fly when iterating in do_for_each_ref(), and
+ * would break callback functions, who have always been able to assume
+ * that the name strings that they are passed will not be freed during
+ * the iteration.
+ */
+struct ref_entry {
+       unsigned char flag; /* ISSYMREF? ISPACKED? */
+       union {
+               struct ref_value value; /* if not (flags&REF_DIR) */
+               struct ref_dir subdir; /* if (flags&REF_DIR) */
+       } u;
+       /*
+        * The full name of the reference (e.g., "refs/heads/master")
+        * or the full name of the directory with a trailing slash
+        * (e.g., "refs/heads/"):
+        */
+       char name[FLEX_ARRAY];
+};
+
+/*
+ * Return the index of the entry with the given refname from the
+ * ref_dir (non-recursively), sorting dir if necessary.  Return -1 if
+ * no such entry is found.  dir must already be complete.
+ */
+int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len);
+
+struct ref_dir *get_ref_dir(struct ref_entry *entry);
+
+/*
+ * Create a struct ref_entry object for the specified dirname.
+ * dirname is the name of the directory with a trailing slash (e.g.,
+ * "refs/heads/") or "" for the top-level directory.
+ */
+struct ref_entry *create_dir_entry(struct ref_cache *cache,
+                                  const char *dirname, size_t len,
+                                  int incomplete);
+
+struct ref_entry *create_ref_entry(const char *refname,
+                                  const unsigned char *sha1, int flag,
+                                  int check_name);
+
+/*
+ * Return a pointer to a new `ref_cache`. Its top-level starts out
+ * marked incomplete. If `fill_ref_dir` is non-NULL, it is the
+ * function called to fill in incomplete directories in the
+ * `ref_cache` when they are accessed. If it is NULL, then the whole
+ * `ref_cache` must be filled (including clearing its directories'
+ * `REF_INCOMPLETE` bits) before it is used.
+ */
+struct ref_cache *create_ref_cache(struct ref_store *refs,
+                                  fill_ref_dir_fn *fill_ref_dir);
+
+/*
+ * Free the `ref_cache` and all of its associated data.
+ */
+void free_ref_cache(struct ref_cache *cache);
+
+/*
+ * Add a ref_entry to the end of dir (unsorted).  Entry is always
+ * stored directly in dir; no recursion into subdirectories is
+ * done.
+ */
+void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry);
+
+/*
+ * Remove the entry with the given name from dir, recursing into
+ * subdirectories as necessary.  If refname is the name of a directory
+ * (i.e., ends with '/'), then remove the directory and its contents.
+ * If the removal was successful, return the number of entries
+ * remaining in the directory entry that contained the deleted entry.
+ * If the name was not found, return -1.  Please note that this
+ * function only deletes the entry from the cache; it does not delete
+ * it from the filesystem or ensure that other cache entries (which
+ * might be symbolic references to the removed entry) are updated.
+ * Nor does it remove any containing dir entries that might be made
+ * empty by the removal.  dir must represent the top-level directory
+ * and must already be complete.
+ */
+int remove_entry_from_dir(struct ref_dir *dir, const char *refname);
+
+/*
+ * Add a ref_entry to the ref_dir (unsorted), recursing into
+ * subdirectories as necessary.  dir must represent the top-level
+ * directory.  Return 0 on success.
+ */
+int add_ref_entry(struct ref_dir *dir, struct ref_entry *ref);
+
+/*
+ * Find the value entry with the given name in dir, sorting ref_dirs
+ * and recursing into subdirectories as necessary.  If the name is not
+ * found or it corresponds to a directory entry, return NULL.
+ */
+struct ref_entry *find_ref_entry(struct ref_dir *dir, const char *refname);
+
+/*
+ * Start iterating over references in `cache`. If `prefix` is
+ * specified, only include references whose names start with that
+ * prefix. If `prime_dir` is true, then fill any incomplete
+ * directories before beginning the iteration.
+ */
+struct ref_iterator *cache_ref_iterator_begin(struct ref_cache *cache,
+                                             const char *prefix,
+                                             int prime_dir);
+
+/*
+ * Peel the entry (if possible) and return its new peel_status.  If
+ * repeel is true, re-peel the entry even if there is an old peeled
+ * value that is already stored in it.
+ *
+ * It is OK to call this function with a packed reference entry that
+ * might be stale and might even refer to an object that has since
+ * been garbage-collected.  In such a case, if the entry has
+ * REF_KNOWS_PEELED then leave the status unchanged and return
+ * PEEL_PEELED or PEEL_NON_TAG; otherwise, return PEEL_INVALID.
+ */
+enum peel_status peel_entry(struct ref_entry *entry, int repeel);
+
+#endif /* REFS_REF_CACHE_H */
index efe584701b7c324a25ab7b20df98b5cbbadbd795..3d46131efbcc0a76cc3054a97a669bc5bdd036e7 100644 (file)
  */
 #define REF_UPDATE_VIA_HEAD 0x100
 
+/*
+ * Used as a flag in ref_update::flags when the loose reference has
+ * been deleted.
+ */
+#define REF_DELETED_LOOSE 0x200
+
 /*
  * Return true iff refname is minimally safe. "Safe" here means that
  * deleting a loose reference by this name will not do any damage, for
  * This function does not check that the reference name is legal; for
  * that, use check_refname_format().
  *
- * We consider a refname that starts with "refs/" to be safe as long
- * as any ".." components that it might contain do not escape "refs/".
- * Names that do not start with "refs/" are considered safe iff they
- * consist entirely of upper case characters and '_' (like "HEAD" and
- * "MERGE_HEAD" but not "config" or "FOO/BAR").
+ * A refname that starts with "refs/" is considered safe iff it
+ * doesn't contain any "." or ".." components or consecutive '/'
+ * characters, end with '/', or (on Windows) contain any '\'
+ * characters. Names that do not start with "refs/" are considered
+ * safe iff they consist entirely of upper case characters and '_'
+ * (like "HEAD" and "MERGE_HEAD" but not "config" or "FOO/BAR").
  */
 int refname_is_safe(const char *refname);
 
@@ -104,28 +111,6 @@ enum peel_status {
  */
 enum peel_status peel_object(const unsigned char *name, unsigned char *sha1);
 
-/*
- * Return 0 if a reference named refname could be created without
- * conflicting with the name of an existing reference. Otherwise,
- * return a negative value and write an explanation to err. If extras
- * is non-NULL, it is a list of additional refnames with which refname
- * is not allowed to conflict. If skip is non-NULL, ignore potential
- * conflicts with refs in skip (e.g., because they are scheduled for
- * deletion in the same operation). Behavior is undefined if the same
- * name is listed in both extras and skip.
- *
- * Two reference names conflict if one of them exactly matches the
- * leading components of the other; e.g., "foo/bar" conflicts with
- * both "foo" and with "foo/bar/baz" but not with "foo/bar" or
- * "foo/barbados".
- *
- * extras and skip must be sorted.
- */
-int verify_refname_available(const char *newname,
-                            const struct string_list *extras,
-                            const struct string_list *skip,
-                            struct strbuf *err);
-
 /*
  * Copy the reflog message msg to buf, which has been allocated sufficiently
  * large, while cleaning up the whitespaces.  Especially, convert LF to space,
@@ -133,8 +118,6 @@ int verify_refname_available(const char *newname,
  */
 int copy_reflog_msg(char *buf, const char *msg);
 
-int should_autocreate_reflog(const char *refname);
-
 /**
  * Information needed for a single ref update. Set new_sha1 to the new
  * value or to null_sha1 to delete the ref. To check the old value
@@ -157,12 +140,13 @@ struct ref_update {
 
        /*
         * One or more of REF_HAVE_NEW, REF_HAVE_OLD, REF_NODEREF,
-        * REF_DELETING, REF_ISPRUNING, REF_LOG_ONLY, and
-        * REF_UPDATE_VIA_HEAD:
+        * REF_DELETING, REF_ISPRUNING, REF_LOG_ONLY,
+        * REF_UPDATE_VIA_HEAD, REF_NEEDS_COMMIT, and
+        * REF_DELETED_LOOSE:
         */
        unsigned int flags;
 
-       struct ref_lock *lock;
+       void *backend_data;
        unsigned int type;
        char *msg;
 
@@ -181,6 +165,10 @@ struct ref_update {
        const char refname[FLEX_ARRAY];
 };
 
+int refs_read_raw_ref(struct ref_store *ref_store,
+                     const char *refname, unsigned char *sha1,
+                     struct strbuf *referent, unsigned int *type);
+
 /*
  * Add a ref_update with the specified properties to transaction, and
  * return a pointer to the new object. This function does not verify
@@ -216,16 +204,13 @@ enum ref_transaction_state {
  * as atomically as possible.  This structure is opaque to callers.
  */
 struct ref_transaction {
+       struct ref_store *ref_store;
        struct ref_update **updates;
        size_t alloc;
        size_t nr;
        enum ref_transaction_state state;
 };
 
-int files_log_ref_write(const char *refname, const unsigned char *old_sha1,
-                       const unsigned char *new_sha1, const char *msg,
-                       int flags, struct strbuf *err);
-
 /*
  * Check for entries in extras that are within the specified
  * directory, where dirname is a reference directory name including
@@ -240,7 +225,19 @@ const char *find_descendant_ref(const char *dirname,
                                const struct string_list *extras,
                                const struct string_list *skip);
 
-int rename_ref_available(const char *oldname, const char *newname);
+/*
+ * Check whether an attempt to rename old_refname to new_refname would
+ * cause a D/F conflict with any existing reference (other than
+ * possibly old_refname). If there would be a conflict, emit an error
+ * message and return false; otherwise, return true.
+ *
+ * Note that this function is not safe against all races with other
+ * processes (though rename_ref() catches some races that might get by
+ * this check).
+ */
+int refs_rename_ref_available(struct ref_store *refs,
+                             const char *old_refname,
+                             const char *new_refname);
 
 /* We allow "recursive" symbolic refs. Only within reason, though */
 #define SYMREF_MAXDEPTH 5
@@ -338,6 +335,17 @@ struct ref_iterator *empty_ref_iterator_begin(void);
  */
 int is_empty_ref_iterator(struct ref_iterator *ref_iterator);
 
+/*
+ * Return an iterator that goes over each reference in `refs` for
+ * which the refname begins with prefix. If trim is non-zero, then
+ * trim that many characters off the beginning of each refname. flags
+ * can be DO_FOR_EACH_INCLUDE_BROKEN to include broken references in
+ * the iteration.
+ */
+struct ref_iterator *refs_ref_iterator_begin(
+               struct ref_store *refs,
+               const char *prefix, int trim, int flags);
+
 /*
  * A callback function used to instruct merge_ref_iterator how to
  * interleave the entries from iter0 and iter1. The function should
@@ -394,23 +402,6 @@ struct ref_iterator *prefix_ref_iterator_begin(struct ref_iterator *iter0,
                                               const char *prefix,
                                               int trim);
 
-/*
- * Iterate over the packed and loose references in the specified
- * submodule that are within find_containing_dir(prefix). If prefix is
- * NULL or the empty string, iterate over all references in the
- * submodule.
- */
-struct ref_iterator *files_ref_iterator_begin(const char *submodule,
-                                             const char *prefix,
-                                             unsigned int flags);
-
-/*
- * Iterate over the references in the main ref_store that have a
- * reflog. The paths within a directory are iterated over in arbitrary
- * order.
- */
-struct ref_iterator *files_reflog_iterator_begin(void);
-
 /* Internal implementation of reference iteration: */
 
 /*
@@ -475,8 +466,91 @@ int do_for_each_ref_iterator(struct ref_iterator *iter,
                             each_ref_fn fn, void *cb_data);
 
 /*
- * Read the specified reference from the filesystem or packed refs
- * file, non-recursively. Set type to describe the reference, and:
+ * Only include per-worktree refs in a do_for_each_ref*() iteration.
+ * Normally this will be used with a files ref_store, since that's
+ * where all reference backends will presumably store their
+ * per-worktree refs.
+ */
+#define DO_FOR_EACH_PER_WORKTREE_ONLY 0x02
+
+struct ref_store;
+
+/* refs backends */
+
+/* ref_store_init flags */
+#define REF_STORE_READ         (1 << 0)
+#define REF_STORE_WRITE                (1 << 1) /* can perform update operations */
+#define REF_STORE_ODB          (1 << 2) /* has access to object database */
+#define REF_STORE_MAIN         (1 << 3)
+
+/*
+ * Initialize the ref_store for the specified gitdir. These functions
+ * should call base_ref_store_init() to initialize the shared part of
+ * the ref_store and to record the ref_store for later lookup.
+ */
+typedef struct ref_store *ref_store_init_fn(const char *gitdir,
+                                           unsigned int flags);
+
+typedef int ref_init_db_fn(struct ref_store *refs, struct strbuf *err);
+
+typedef int ref_transaction_commit_fn(struct ref_store *refs,
+                                     struct ref_transaction *transaction,
+                                     struct strbuf *err);
+
+typedef int pack_refs_fn(struct ref_store *ref_store, unsigned int flags);
+typedef int peel_ref_fn(struct ref_store *ref_store,
+                       const char *refname, unsigned char *sha1);
+typedef int create_symref_fn(struct ref_store *ref_store,
+                            const char *ref_target,
+                            const char *refs_heads_master,
+                            const char *logmsg);
+typedef int delete_refs_fn(struct ref_store *ref_store,
+                          struct string_list *refnames, unsigned int flags);
+typedef int rename_ref_fn(struct ref_store *ref_store,
+                         const char *oldref, const char *newref,
+                         const char *logmsg);
+
+/*
+ * Iterate over the references in the specified ref_store that are
+ * within find_containing_dir(prefix). If prefix is NULL or the empty
+ * string, iterate over all references in the submodule.
+ */
+typedef struct ref_iterator *ref_iterator_begin_fn(
+               struct ref_store *ref_store,
+               const char *prefix, unsigned int flags);
+
+/* reflog functions */
+
+/*
+ * Iterate over the references in the specified ref_store that have a
+ * reflog. The refs are iterated over in arbitrary order.
+ */
+typedef struct ref_iterator *reflog_iterator_begin_fn(
+               struct ref_store *ref_store);
+
+typedef int for_each_reflog_ent_fn(struct ref_store *ref_store,
+                                  const char *refname,
+                                  each_reflog_ent_fn fn,
+                                  void *cb_data);
+typedef int for_each_reflog_ent_reverse_fn(struct ref_store *ref_store,
+                                          const char *refname,
+                                          each_reflog_ent_fn fn,
+                                          void *cb_data);
+typedef int reflog_exists_fn(struct ref_store *ref_store, const char *refname);
+typedef int create_reflog_fn(struct ref_store *ref_store, const char *refname,
+                            int force_create, struct strbuf *err);
+typedef int delete_reflog_fn(struct ref_store *ref_store, const char *refname);
+typedef int reflog_expire_fn(struct ref_store *ref_store,
+                            const char *refname, const unsigned char *sha1,
+                            unsigned int flags,
+                            reflog_expiry_prepare_fn prepare_fn,
+                            reflog_expiry_should_prune_fn should_prune_fn,
+                            reflog_expiry_cleanup_fn cleanup_fn,
+                            void *policy_cb_data);
+
+/*
+ * Read a reference from the specified reference store, non-recursively.
+ * Set type to describe the reference, and:
  *
  * - If refname is the name of a normal reference, fill in sha1
  *   (leaving referent unchanged).
@@ -512,7 +586,53 @@ int do_for_each_ref_iterator(struct ref_iterator *iter,
  * - in all other cases, referent will be untouched, and therefore
  *   refname will still be valid and unchanged.
  */
-int read_raw_ref(const char *refname, unsigned char *sha1,
-                struct strbuf *referent, unsigned int *type);
+typedef int read_raw_ref_fn(struct ref_store *ref_store,
+                           const char *refname, unsigned char *sha1,
+                           struct strbuf *referent, unsigned int *type);
+
+struct ref_storage_be {
+       struct ref_storage_be *next;
+       const char *name;
+       ref_store_init_fn *init;
+       ref_init_db_fn *init_db;
+       ref_transaction_commit_fn *transaction_commit;
+       ref_transaction_commit_fn *initial_transaction_commit;
+
+       pack_refs_fn *pack_refs;
+       peel_ref_fn *peel_ref;
+       create_symref_fn *create_symref;
+       delete_refs_fn *delete_refs;
+       rename_ref_fn *rename_ref;
+
+       ref_iterator_begin_fn *iterator_begin;
+       read_raw_ref_fn *read_raw_ref;
+
+       reflog_iterator_begin_fn *reflog_iterator_begin;
+       for_each_reflog_ent_fn *for_each_reflog_ent;
+       for_each_reflog_ent_reverse_fn *for_each_reflog_ent_reverse;
+       reflog_exists_fn *reflog_exists;
+       create_reflog_fn *create_reflog;
+       delete_reflog_fn *delete_reflog;
+       reflog_expire_fn *reflog_expire;
+};
+
+extern struct ref_storage_be refs_be_files;
+
+/*
+ * A representation of the reference store for the main repository or
+ * a submodule. The ref_store instances for submodules are kept in a
+ * linked list.
+ */
+struct ref_store {
+       /* The backend describing this ref_store's storage scheme: */
+       const struct ref_storage_be *be;
+};
+
+/*
+ * Fill in the generic part of refs and add it to our collection of
+ * reference stores.
+ */
+void base_ref_store_init(struct ref_store *refs,
+                        const struct ref_storage_be *be);
 
 #endif /* REFS_REFS_INTERNAL_H */
index 6b83b7783e9c62fcf623acd0ba034dd1c0b9bd10..ece45993dac582ddc6ba19b2362ba1716e075eae 100644 (file)
@@ -20,6 +20,9 @@ static struct strbuf url = STRBUF_INIT;
 struct options {
        int verbosity;
        unsigned long depth;
+       char *deepen_since;
+       struct string_list deepen_not;
+       struct string_list push_options;
        unsigned progress : 1,
                check_self_contained_and_connected : 1,
                cloning : 1,
@@ -28,7 +31,8 @@ struct options {
                dry_run : 1,
                thin : 1,
                /* One of the SEND_PACK_PUSH_CERT_* constants. */
-               push_cert : 2;
+               push_cert : 2,
+               deepen_relative : 1;
 };
 static struct options options;
 static struct string_list cas_options = STRING_LIST_INIT_DUP;
@@ -60,6 +64,23 @@ static int set_option(const char *name, const char *value)
                options.depth = v;
                return 0;
        }
+       else if (!strcmp(name, "deepen-since")) {
+               options.deepen_since = xstrdup(value);
+               return 0;
+       }
+       else if (!strcmp(name, "deepen-not")) {
+               string_list_append(&options.deepen_not, value);
+               return 0;
+       }
+       else if (!strcmp(name, "deepen-relative")) {
+               if (!strcmp(value, "true"))
+                       options.deepen_relative = 1;
+               else if (!strcmp(value, "false"))
+                       options.deepen_relative = 0;
+               else
+                       return -1;
+               return 0;
+       }
        else if (!strcmp(name, "followtags")) {
                if (!strcmp(value, "true"))
                        options.followtags = 1;
@@ -119,6 +140,9 @@ static int set_option(const char *name, const char *value)
                else
                        return -1;
                return 0;
+       } else if (!strcmp(name, "push-option")) {
+               string_list_append(&options.push_options, value);
+               return 0;
 
 #if LIBCURL_VERSION_NUM >= 0x070a08
        } else if (!strcmp(name, "family")) {
@@ -143,7 +167,7 @@ struct discovery {
        char *buf;
        size_t len;
        struct ref *refs;
-       struct sha1_array shallow;
+       struct oid_array shallow;
        unsigned proto_git : 1;
 };
 static struct discovery *last_discovery;
@@ -210,7 +234,7 @@ static void free_discovery(struct discovery *d)
        if (d) {
                if (d == last_discovery)
                        last_discovery = NULL;
-               free(d->shallow.sha1);
+               free(d->shallow.oid);
                free(d->buf_alloc);
                free_refs(d->refs);
                free(d);
@@ -254,7 +278,7 @@ static struct discovery *discover_refs(const char *service, int for_push)
        struct strbuf effective_url = STRBUF_INIT;
        struct discovery *last = last_discovery;
        int http_ret, maybe_smart = 0;
-       struct http_get_options options;
+       struct http_get_options http_options;
 
        if (last && !strcmp(service, last->service))
                return last;
@@ -271,15 +295,16 @@ static struct discovery *discover_refs(const char *service, int for_push)
                strbuf_addf(&refs_url, "service=%s", service);
        }
 
-       memset(&options, 0, sizeof(options));
-       options.content_type = &type;
-       options.charset = &charset;
-       options.effective_url = &effective_url;
-       options.base_url = &url;
-       options.no_cache = 1;
-       options.keep_error = 1;
+       memset(&http_options, 0, sizeof(http_options));
+       http_options.content_type = &type;
+       http_options.charset = &charset;
+       http_options.effective_url = &effective_url;
+       http_options.base_url = &url;
+       http_options.initial_request = 1;
+       http_options.no_cache = 1;
+       http_options.keep_error = 1;
 
-       http_ret = http_get_strbuf(refs_url.buf, &buffer, &options);
+       http_ret = http_get_strbuf(refs_url.buf, &buffer, &http_options);
        switch (http_ret) {
        case HTTP_OK:
                break;
@@ -294,6 +319,9 @@ static struct discovery *discover_refs(const char *service, int for_push)
                die("unable to access '%s': %s", url.buf, curl_errorstr);
        }
 
+       if (options.verbosity && !starts_with(refs_url.buf, url.buf))
+               warning(_("redirecting to %s"), url.buf);
+
        last= xcalloc(1, sizeof(*last_discovery));
        last->service = service;
        last->buf_alloc = strbuf_detach(&buffer, &last->len);
@@ -380,6 +408,7 @@ struct rpc_state {
        size_t pos;
        int in;
        int out;
+       int any_written;
        struct strbuf result;
        unsigned gzip_request : 1;
        unsigned initial_buffer : 1;
@@ -436,6 +465,8 @@ static size_t rpc_in(char *ptr, size_t eltsize,
 {
        size_t size = eltsize * nmemb;
        struct rpc_state *rpc = buffer_;
+       if (size)
+               rpc->any_written = 1;
        write_or_die(rpc->in, ptr, size);
        return size;
 }
@@ -500,6 +531,12 @@ static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
        return err;
 }
 
+static curl_off_t xcurl_off_t(ssize_t len) {
+       if (len > maximum_signed_value_of_type(curl_off_t))
+               die("cannot handle pushes this big");
+       return (curl_off_t) len;
+}
+
 static int post_rpc(struct rpc_state *rpc)
 {
        struct active_request_slot *slot;
@@ -583,7 +620,7 @@ retry:
                 * and we just need to send it.
                 */
                curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, gzip_body);
-               curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, gzip_size);
+               curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE_LARGE, xcurl_off_t(gzip_size));
 
        } else if (use_gzip && 1024 < rpc->len) {
                /* The client backend isn't giving us compressed data so
@@ -614,7 +651,7 @@ retry:
 
                headers = curl_slist_append(headers, "Content-Encoding: gzip");
                curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, gzip_body);
-               curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, gzip_size);
+               curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE_LARGE, xcurl_off_t(gzip_size));
 
                if (options.verbosity > 1) {
                        fprintf(stderr, "POST %s (gzip %lu to %lu bytes)\n",
@@ -627,7 +664,7 @@ retry:
                 * more normal Content-Length approach.
                 */
                curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, rpc->buf);
-               curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, rpc->len);
+               curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE_LARGE, xcurl_off_t(rpc->len));
                if (options.verbosity > 1) {
                        fprintf(stderr, "POST %s (%lu bytes)\n",
                                rpc->service_name, (unsigned long)rpc->len);
@@ -639,6 +676,8 @@ retry:
        curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, rpc_in);
        curl_easy_setopt(slot->curl, CURLOPT_FILE, rpc);
 
+
+       rpc->any_written = 0;
        err = run_slot(slot, NULL);
        if (err == HTTP_REAUTH && !large_request) {
                credential_fill(&http_auth);
@@ -647,6 +686,9 @@ retry:
        if (err != HTTP_OK)
                err = -1;
 
+       if (!rpc->any_written)
+               err = -1;
+
        curl_slist_free_all(headers);
        free(gzip_body);
        return err;
@@ -725,8 +767,8 @@ static int fetch_dumb(int nr_heads, struct ref **to_fetch)
        int ret, i;
 
        ALLOC_ARRAY(targets, nr_heads);
-       if (options.depth)
-               die("dumb http transport does not support --depth");
+       if (options.depth || options.deepen_since)
+               die("dumb http transport does not support shallow capabilities");
        for (i = 0; i < nr_heads; i++)
                targets[i] = xstrdup(oid_to_hex(&to_fetch[i]->old_oid));
 
@@ -751,38 +793,35 @@ static int fetch_git(struct discovery *heads,
 {
        struct rpc_state rpc;
        struct strbuf preamble = STRBUF_INIT;
-       char *depth_arg = NULL;
-       int argc = 0, i, err;
-       const char *argv[17];
-
-       argv[argc++] = "fetch-pack";
-       argv[argc++] = "--stateless-rpc";
-       argv[argc++] = "--stdin";
-       argv[argc++] = "--lock-pack";
+       int i, err;
+       struct argv_array args = ARGV_ARRAY_INIT;
+
+       argv_array_pushl(&args, "fetch-pack", "--stateless-rpc",
+                        "--stdin", "--lock-pack", NULL);
        if (options.followtags)
-               argv[argc++] = "--include-tag";
+               argv_array_push(&args, "--include-tag");
        if (options.thin)
-               argv[argc++] = "--thin";
-       if (options.verbosity >= 3) {
-               argv[argc++] = "-v";
-               argv[argc++] = "-v";
-       }
+               argv_array_push(&args, "--thin");
+       if (options.verbosity >= 3)
+               argv_array_pushl(&args, "-v", "-v", NULL);
        if (options.check_self_contained_and_connected)
-               argv[argc++] = "--check-self-contained-and-connected";
+               argv_array_push(&args, "--check-self-contained-and-connected");
        if (options.cloning)
-               argv[argc++] = "--cloning";
+               argv_array_push(&args, "--cloning");
        if (options.update_shallow)
-               argv[argc++] = "--update-shallow";
+               argv_array_push(&args, "--update-shallow");
        if (!options.progress)
-               argv[argc++] = "--no-progress";
-       if (options.depth) {
-               struct strbuf buf = STRBUF_INIT;
-               strbuf_addf(&buf, "--depth=%lu", options.depth);
-               depth_arg = strbuf_detach(&buf, NULL);
-               argv[argc++] = depth_arg;
-       }
-       argv[argc++] = url.buf;
-       argv[argc++] = NULL;
+               argv_array_push(&args, "--no-progress");
+       if (options.depth)
+               argv_array_pushf(&args, "--depth=%lu", options.depth);
+       if (options.deepen_since)
+               argv_array_pushf(&args, "--shallow-since=%s", options.deepen_since);
+       for (i = 0; i < options.deepen_not.nr; i++)
+               argv_array_pushf(&args, "--shallow-exclude=%s",
+                                options.deepen_not.items[i].string);
+       if (options.deepen_relative && options.depth)
+               argv_array_push(&args, "--deepen-relative");
+       argv_array_push(&args, url.buf);
 
        for (i = 0; i < nr_heads; i++) {
                struct ref *ref = to_fetch[i];
@@ -795,7 +834,7 @@ static int fetch_git(struct discovery *heads,
 
        memset(&rpc, 0, sizeof(rpc));
        rpc.service_name = "git-upload-pack",
-       rpc.argv = argv;
+       rpc.argv = args.argv;
        rpc.stdin_preamble = &preamble;
        rpc.gzip_request = 1;
 
@@ -804,7 +843,7 @@ static int fetch_git(struct discovery *heads,
                write_or_die(1, rpc.result.buf, rpc.result.len);
        strbuf_release(&rpc.result);
        strbuf_release(&preamble);
-       free(depth_arg);
+       argv_array_clear(&args);
        return err;
 }
 
@@ -914,6 +953,9 @@ static int push_git(struct discovery *heads, int nr_spec, char **specs)
                argv_array_push(&args, "--quiet");
        else if (options.verbosity > 1)
                argv_array_push(&args, "--verbose");
+       for (i = 0; i < options.push_options.nr; i++)
+               argv_array_pushf(&args, "--push-option=%s",
+                                options.push_options.items[i].string);
        argv_array_push(&args, options.progress ? "--progress" : "--no-progress");
        for_each_string_list_item(cas_option, &cas_options)
                argv_array_push(&args, cas_option->string);
@@ -998,6 +1040,8 @@ int cmd_main(int argc, const char **argv)
        options.verbosity = 1;
        options.progress = !!isatty(2);
        options.thin = 1;
+       string_list_init(&options.deepen_not, 1);
+       string_list_init(&options.push_options, 1);
 
        remote = remote_get(argv[1]);
 
index ad6c5424edab2ae15ac17bfcf12ac4ee93b5aa3f..16eb39e06e77f081abedab31ba30eae36834c84a 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -255,6 +255,7 @@ static void read_remotes_file(struct remote *remote)
 
        if (!f)
                return;
+       remote->configured_in_repo = 1;
        remote->origin = REMOTE_REMOTES;
        while (strbuf_getline(&buf, f) != EOF) {
                const char *v;
@@ -289,6 +290,7 @@ static void read_branches_file(struct remote *remote)
                return;
        }
 
+       remote->configured_in_repo = 1;
        remote->origin = REMOTE_BRANCHES;
 
        /*
@@ -371,6 +373,8 @@ static int handle_config(const char *key, const char *value, void *cb)
        }
        remote = make_remote(name, namelen);
        remote->origin = REMOTE_CONFIG;
+       if (current_config_scope() == CONFIG_SCOPE_REPO)
+               remote->configured_in_repo = 1;
        if (!strcmp(subkey, "mirror"))
                remote->mirror = git_config_bool(key, value);
        else if (!strcmp(subkey, "skipdefaultupdate"))
@@ -473,26 +477,6 @@ static void read_config(void)
        alias_all_urls();
 }
 
-/*
- * This function frees a refspec array.
- * Warning: code paths should be checked to ensure that the src
- *          and dst pointers are always freeable pointers as well
- *          as the refspec pointer itself.
- */
-static void free_refspecs(struct refspec *refspec, int nr_refspec)
-{
-       int i;
-
-       if (!refspec)
-               return;
-
-       for (i = 0; i < nr_refspec; i++) {
-               free(refspec[i].src);
-               free(refspec[i].dst);
-       }
-       free(refspec);
-}
-
 static struct refspec *parse_refspec_internal(int nr_refspec, const char **refspec, int fetch, int verify)
 {
        int i;
@@ -606,7 +590,7 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp
                 * since it is only possible to reach this point from within
                 * the for loop above.
                 */
-               free_refspecs(rs, i+1);
+               free_refspec(i+1, rs);
                return NULL;
        }
        die("Invalid refspec '%s'", refspec[i]);
@@ -617,7 +601,7 @@ int valid_fetch_refspec(const char *fetch_refspec_str)
        struct refspec *refspec;
 
        refspec = parse_refspec_internal(1, &fetch_refspec_str, 1, 1);
-       free_refspecs(refspec, 1);
+       free_refspec(1, refspec);
        return !!refspec;
 }
 
@@ -626,7 +610,7 @@ struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec)
        return parse_refspec_internal(nr_refspec, refspec, 1, 0);
 }
 
-static struct refspec *parse_push_refspec(int nr_refspec, const char **refspec)
+struct refspec *parse_push_refspec(int nr_refspec, const char **refspec)
 {
        return parse_refspec_internal(nr_refspec, refspec, 0, 0);
 }
@@ -634,6 +618,10 @@ static struct refspec *parse_push_refspec(int nr_refspec, const char **refspec)
 void free_refspec(int nr_refspec, struct refspec *refspec)
 {
        int i;
+
+       if (!refspec)
+               return;
+
        for (i = 0; i < nr_refspec; i++) {
                free(refspec[i].src);
                free(refspec[i].dst);
@@ -645,7 +633,12 @@ static int valid_remote_nick(const char *name)
 {
        if (!name[0] || is_dot_or_dotdot(name))
                return 0;
-       return !strchr(name, '/'); /* no slash */
+
+       /* remote nicknames cannot contain slashes */
+       while (*name)
+               if (is_dir_sep(*name++))
+                       return 0;
+       return 1;
 }
 
 const char *remote_for_branch(struct branch *branch, int *explicit)
@@ -689,7 +682,7 @@ static struct remote *remote_get_1(const char *name,
                name = get_default(current_branch, &name_given);
 
        ret = make_remote(name, 0);
-       if (valid_remote_nick(name)) {
+       if (valid_remote_nick(name) && have_git_dir()) {
                if (!valid_remote(ret))
                        read_remotes_file(ret);
                if (!valid_remote(ret))
@@ -714,9 +707,13 @@ struct remote *pushremote_get(const char *name)
        return remote_get_1(name, pushremote_for_branch);
 }
 
-int remote_is_configured(struct remote *remote)
+int remote_is_configured(struct remote *remote, int in_repo)
 {
-       return remote && remote->origin;
+       if (!remote)
+               return 0;
+       if (in_repo)
+               return remote->configured_in_repo;
+       return !!remote->origin;
 }
 
 int for_each_remote(each_remote_fn fn, void *priv)
@@ -1183,9 +1180,10 @@ static int match_explicit(struct ref *src, struct ref *dst,
                else if (is_null_oid(&matched_src->new_oid))
                        error("unable to delete '%s': remote ref does not exist",
                              dst_value);
-               else if ((dst_guess = guess_ref(dst_value, matched_src)))
+               else if ((dst_guess = guess_ref(dst_value, matched_src))) {
                        matched_dst = make_linked_ref(dst_guess, dst_tail);
-               else
+                       free(dst_guess);
+               } else
                        error("unable to push to unqualified destination: %s\n"
                              "The destination refspec neither matches an "
                              "existing ref on the remote nor\n"
@@ -1716,9 +1714,6 @@ static const char *branch_get_push_1(struct branch *branch, struct strbuf *err)
 {
        struct remote *remote;
 
-       if (!branch)
-               return error_buf(err, _("HEAD does not point to a branch"));
-
        remote = remote_get(pushremote_for_branch(branch, NULL));
        if (!remote)
                return error_buf(err,
@@ -1778,6 +1773,9 @@ static const char *branch_get_push_1(struct branch *branch, struct strbuf *err)
 
 const char *branch_get_push(struct branch *branch, struct strbuf *err)
 {
+       if (!branch)
+               return error_buf(err, _("HEAD does not point to a branch"));
+
        if (!branch->push_tracking_ref)
                branch->push_tracking_ref = branch_get_push_1(branch, err);
        return branch->push_tracking_ref;
@@ -2271,7 +2269,7 @@ static struct push_cas *add_cas_entry(struct push_cas_option *cas,
        return entry;
 }
 
-int parse_push_cas_option(struct push_cas_option *cas, const char *arg, int unset)
+static int parse_push_cas_option(struct push_cas_option *cas, const char *arg, int unset)
 {
        const char *colon;
        struct push_cas *entry;
index 924881169d9f6c5b9b09e2434d964f62e0e28d09..6c28cd3e4bfe2e8be058485d0b963b23622b999f 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -15,7 +15,7 @@ struct remote {
        struct hashmap_entry ent;  /* must be first */
 
        const char *name;
-       int origin;
+       int origin, configured_in_repo;
 
        const char *foreign_vcs;
 
@@ -60,7 +60,7 @@ struct remote {
 
 struct remote *remote_get(const char *name);
 struct remote *pushremote_get(const char *name);
-int remote_is_configured(struct remote *remote);
+int remote_is_configured(struct remote *remote, int in_repo);
 
 typedef int each_remote_fn(struct remote *remote, void *priv);
 int for_each_remote(each_remote_fn fn, void *priv);
@@ -89,8 +89,13 @@ struct ref {
                force:1,
                forced_update:1,
                expect_old_sha1:1,
-               deletion:1,
-               matched:1;
+               deletion:1;
+
+       enum {
+               REF_NOT_MATCHED = 0, /* initial value */
+               REF_MATCHED,
+               REF_UNADVERTISED_NOT_ALLOWED
+       } match_status;
 
        /*
         * Order is important here, as we write to FETCH_HEAD
@@ -144,11 +149,11 @@ int check_ref_type(const struct ref *ref, int flags);
  */
 void free_refs(struct ref *ref);
 
-struct sha1_array;
+struct oid_array;
 extern struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
                                     struct ref **list, unsigned int flags,
-                                    struct sha1_array *extra_have,
-                                    struct sha1_array *shallow);
+                                    struct oid_array *extra_have,
+                                    struct oid_array *shallow);
 
 int resolve_remote_symref(struct ref *ref, struct ref *list);
 int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid);
@@ -164,6 +169,7 @@ struct ref *ref_remove_duplicates(struct ref *ref_map);
 
 int valid_fetch_refspec(const char *refspec);
 struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec);
+extern struct refspec *parse_push_refspec(int nr_refspec, const char **refspec);
 
 void free_refspec(int nr_refspec, struct refspec *refspec);
 
@@ -285,7 +291,6 @@ struct push_cas_option {
 };
 
 extern int parseopt_push_cas_option(const struct option *, const char *arg, int unset);
-extern int parse_push_cas_option(struct push_cas_option *, const char *arg, int unset);
 
 extern int is_empty_cas(const struct push_cas_option *);
 void apply_push_cas(struct push_cas_option *, struct remote *, struct ref *);
index aaadec17d867d521fc0eaab7fcdd2e871bdf1267..3bd55caf3b0961888bcca06d3c54577cb25f5223 100644 (file)
--- a/rerere.c
+++ b/rerere.c
@@ -708,7 +708,7 @@ static void update_paths(struct string_list *update)
 {
        int i;
 
-       hold_locked_index(&index_lock, 1);
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 
        for (i = 0; i < update->nr; i++) {
                struct string_list_item *item = &update->items[i];
@@ -980,7 +980,8 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpu
                        break;
                i = ce_stage(ce) - 1;
                if (!mmfile[i].ptr) {
-                       mmfile[i].ptr = read_sha1_file(ce->sha1, &type, &size);
+                       mmfile[i].ptr = read_sha1_file(ce->oid.hash, &type,
+                                                      &size);
                        mmfile[i].size = size;
                }
        }
index 468a2eb92c6d72c519faf5c8203d3d41d520c12d..b40f3173d3fe5ef5c06c00ff8994060a9078669d 100644 (file)
@@ -24,7 +24,7 @@ void record_resolve_undo(struct index_state *istate, struct cache_entry *ce)
        if (!lost->util)
                lost->util = xcalloc(1, sizeof(*ui));
        ui = lost->util;
-       hashcpy(ui->sha1[stage - 1], ce->sha1);
+       hashcpy(ui->sha1[stage - 1], ce->oid.hash);
        ui->mode[stage - 1] = ce->ce_mode;
 }
 
index 8a29cb03c51be119589a763b170809b8208e1857..5dfb322ccd63276603537b6e43c5c00f9b9e8dd6 100644 (file)
@@ -147,7 +147,7 @@ static void add_pending_object_with_path(struct rev_info *revs,
                revs->no_walk = 0;
        if (revs->reflog_info && obj->type == OBJ_COMMIT) {
                struct strbuf buf = STRBUF_INIT;
-               int len = interpret_branch_name(name, 0, &buf);
+               int len = interpret_branch_name(name, 0, &buf, 0);
                int st;
 
                if (0 < len && name[len] && buf.len)
@@ -230,7 +230,7 @@ static struct commit *handle_commit(struct rev_info *revs,
                        die("bad tag");
                object = parse_object(tag->tagged->oid.hash);
                if (!object) {
-                       if (flags & UNINTERESTING)
+                       if (revs->ignore_missing_links || (flags & UNINTERESTING))
                                return NULL;
                        die("bad object %s", oid_to_hex(&tag->tagged->oid));
                }
@@ -1196,11 +1196,11 @@ static void handle_refs(const char *submodule, struct rev_info *revs, unsigned f
        for_each(submodule, handle_one_ref, &cb);
 }
 
-static void handle_one_reflog_commit(unsigned char *sha1, void *cb_data)
+static void handle_one_reflog_commit(struct object_id *oid, void *cb_data)
 {
        struct all_refs_cb *cb = cb_data;
-       if (!is_null_sha1(sha1)) {
-               struct object *o = parse_object(sha1);
+       if (!is_null_oid(oid)) {
+               struct object *o = parse_object(oid->hash);
                if (o) {
                        o->flags |= cb->all_flags;
                        /* ??? CMDLINEFLAGS ??? */
@@ -1214,12 +1214,12 @@ static void handle_one_reflog_commit(unsigned char *sha1, void *cb_data)
        }
 }
 
-static int handle_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+static int handle_one_reflog_ent(struct object_id *ooid, struct object_id *noid,
                const char *email, unsigned long timestamp, int tz,
                const char *message, void *cb_data)
 {
-       handle_one_reflog_commit(osha1, cb_data);
-       handle_one_reflog_commit(nsha1, cb_data);
+       handle_one_reflog_commit(ooid, cb_data);
+       handle_one_reflog_commit(noid, cb_data);
        return 0;
 }
 
@@ -1275,7 +1275,7 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned flags)
                if (S_ISGITLINK(ce->ce_mode))
                        continue;
 
-               blob = lookup_blob(ce->sha1);
+               blob = lookup_blob(ce->oid.hash);
                if (!blob)
                        die("unable to add index blob to traversal");
                add_pending_object_with_path(revs, &blob->object, "",
@@ -1289,12 +1289,14 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned flags)
        }
 }
 
-static int add_parents_only(struct rev_info *revs, const char *arg_, int flags)
+static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,
+                           int exclude_parent)
 {
        unsigned char sha1[20];
        struct object *it;
        struct commit *commit;
        struct commit_list *parents;
+       int parent_number;
        const char *arg = arg_;
 
        if (*arg == '^') {
@@ -1316,7 +1318,15 @@ static int add_parents_only(struct rev_info *revs, const char *arg_, int flags)
        if (it->type != OBJ_COMMIT)
                return 0;
        commit = (struct commit *)it;
-       for (parents = commit->parents; parents; parents = parents->next) {
+       if (exclude_parent &&
+           exclude_parent > commit_list_count(commit->parents))
+               return 0;
+       for (parents = commit->parents, parent_number = 1;
+            parents;
+            parents = parents->next, parent_number++) {
+               if (exclude_parent && parent_number != exclude_parent)
+                       continue;
+
                it = &parents->item->object;
                it->flags |= flags;
                add_rev_cmdline(revs, it, arg_, REV_CMD_PARENTS_ONLY, flags);
@@ -1419,118 +1429,168 @@ static void prepare_show_merge(struct rev_info *revs)
        revs->limited = 1;
 }
 
+static int dotdot_missing(const char *arg, char *dotdot,
+                         struct rev_info *revs, int symmetric)
+{
+       if (revs->ignore_missing)
+               return 0;
+       /* de-munge so we report the full argument */
+       *dotdot = '.';
+       die(symmetric
+           ? "Invalid symmetric difference expression %s"
+           : "Invalid revision range %s", arg);
+}
+
+static int handle_dotdot_1(const char *arg, char *dotdot,
+                          struct rev_info *revs, int flags,
+                          int cant_be_filename,
+                          struct object_context *a_oc,
+                          struct object_context *b_oc)
+{
+       const char *a_name, *b_name;
+       struct object_id a_oid, b_oid;
+       struct object *a_obj, *b_obj;
+       unsigned int a_flags, b_flags;
+       int symmetric = 0;
+       unsigned int flags_exclude = flags ^ (UNINTERESTING | BOTTOM);
+       unsigned int oc_flags = GET_SHA1_COMMITTISH | GET_SHA1_RECORD_PATH;
+
+       a_name = arg;
+       if (!*a_name)
+               a_name = "HEAD";
+
+       b_name = dotdot + 2;
+       if (*b_name == '.') {
+               symmetric = 1;
+               b_name++;
+       }
+       if (!*b_name)
+               b_name = "HEAD";
+
+       if (get_sha1_with_context(a_name, oc_flags, a_oid.hash, a_oc) ||
+           get_sha1_with_context(b_name, oc_flags, b_oid.hash, b_oc))
+               return -1;
+
+       if (!cant_be_filename) {
+               *dotdot = '.';
+               verify_non_filename(revs->prefix, arg);
+               *dotdot = '\0';
+       }
+
+       a_obj = parse_object(a_oid.hash);
+       b_obj = parse_object(b_oid.hash);
+       if (!a_obj || !b_obj)
+               return dotdot_missing(arg, dotdot, revs, symmetric);
+
+       if (!symmetric) {
+               /* just A..B */
+               b_flags = flags;
+               a_flags = flags_exclude;
+       } else {
+               /* A...B -- find merge bases between the two */
+               struct commit *a, *b;
+               struct commit_list *exclude;
+
+               a = lookup_commit_reference(a_obj->oid.hash);
+               b = lookup_commit_reference(b_obj->oid.hash);
+               if (!a || !b)
+                       return dotdot_missing(arg, dotdot, revs, symmetric);
+
+               exclude = get_merge_bases(a, b);
+               add_rev_cmdline_list(revs, exclude, REV_CMD_MERGE_BASE,
+                                    flags_exclude);
+               add_pending_commit_list(revs, exclude, flags_exclude);
+               free_commit_list(exclude);
+
+               b_flags = flags;
+               a_flags = flags | SYMMETRIC_LEFT;
+       }
+
+       a_obj->flags |= a_flags;
+       b_obj->flags |= b_flags;
+       add_rev_cmdline(revs, a_obj, a_name, REV_CMD_LEFT, a_flags);
+       add_rev_cmdline(revs, b_obj, b_name, REV_CMD_RIGHT, b_flags);
+       add_pending_object_with_path(revs, a_obj, a_name, a_oc->mode, a_oc->path);
+       add_pending_object_with_path(revs, b_obj, b_name, b_oc->mode, b_oc->path);
+       return 0;
+}
+
+static int handle_dotdot(const char *arg,
+                        struct rev_info *revs, int flags,
+                        int cant_be_filename)
+{
+       struct object_context a_oc, b_oc;
+       char *dotdot = strstr(arg, "..");
+       int ret;
+
+       if (!dotdot)
+               return -1;
+
+       memset(&a_oc, 0, sizeof(a_oc));
+       memset(&b_oc, 0, sizeof(b_oc));
+
+       *dotdot = '\0';
+       ret = handle_dotdot_1(arg, dotdot, revs, flags, cant_be_filename,
+                             &a_oc, &b_oc);
+       *dotdot = '.';
+
+       free(a_oc.path);
+       free(b_oc.path);
+
+       return ret;
+}
+
 int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsigned revarg_opt)
 {
        struct object_context oc;
-       char *dotdot;
+       char *mark;
        struct object *object;
        unsigned char sha1[20];
        int local_flags;
        const char *arg = arg_;
        int cant_be_filename = revarg_opt & REVARG_CANNOT_BE_FILENAME;
-       unsigned get_sha1_flags = 0;
+       unsigned get_sha1_flags = GET_SHA1_RECORD_PATH;
 
        flags = flags & UNINTERESTING ? flags | BOTTOM : flags & ~BOTTOM;
 
-       dotdot = strstr(arg, "..");
-       if (dotdot) {
-               unsigned char from_sha1[20];
-               const char *next = dotdot + 2;
-               const char *this = arg;
-               int symmetric = *next == '.';
-               unsigned int flags_exclude = flags ^ (UNINTERESTING | BOTTOM);
-               static const char head_by_default[] = "HEAD";
-               unsigned int a_flags;
-
-               *dotdot = 0;
-               next += symmetric;
-
-               if (!*next)
-                       next = head_by_default;
-               if (dotdot == arg)
-                       this = head_by_default;
-               if (this == head_by_default && next == head_by_default &&
-                   !symmetric) {
-                       /*
-                        * Just ".."?  That is not a range but the
-                        * pathspec for the parent directory.
-                        */
-                       if (!cant_be_filename) {
-                               *dotdot = '.';
-                               return -1;
-                       }
-               }
-               if (!get_sha1_committish(this, from_sha1) &&
-                   !get_sha1_committish(next, sha1)) {
-                       struct object *a_obj, *b_obj;
-
-                       if (!cant_be_filename) {
-                               *dotdot = '.';
-                               verify_non_filename(revs->prefix, arg);
-                       }
-
-                       a_obj = parse_object(from_sha1);
-                       b_obj = parse_object(sha1);
-                       if (!a_obj || !b_obj) {
-                       missing:
-                               if (revs->ignore_missing)
-                                       return 0;
-                               die(symmetric
-                                   ? "Invalid symmetric difference expression %s"
-                                   : "Invalid revision range %s", arg);
-                       }
+       if (!cant_be_filename && !strcmp(arg, "..")) {
+               /*
+                * Just ".."?  That is not a range but the
+                * pathspec for the parent directory.
+                */
+               return -1;
+       }
 
-                       if (!symmetric) {
-                               /* just A..B */
-                               a_flags = flags_exclude;
-                       } else {
-                               /* A...B -- find merge bases between the two */
-                               struct commit *a, *b;
-                               struct commit_list *exclude;
-
-                               a = (a_obj->type == OBJ_COMMIT
-                                    ? (struct commit *)a_obj
-                                    : lookup_commit_reference(a_obj->oid.hash));
-                               b = (b_obj->type == OBJ_COMMIT
-                                    ? (struct commit *)b_obj
-                                    : lookup_commit_reference(b_obj->oid.hash));
-                               if (!a || !b)
-                                       goto missing;
-                               exclude = get_merge_bases(a, b);
-                               add_rev_cmdline_list(revs, exclude,
-                                                    REV_CMD_MERGE_BASE,
-                                                    flags_exclude);
-                               add_pending_commit_list(revs, exclude,
-                                                       flags_exclude);
-                               free_commit_list(exclude);
-
-                               a_flags = flags | SYMMETRIC_LEFT;
-                       }
+       if (!handle_dotdot(arg, revs, flags, revarg_opt))
+               return 0;
 
-                       a_obj->flags |= a_flags;
-                       b_obj->flags |= flags;
-                       add_rev_cmdline(revs, a_obj, this,
-                                       REV_CMD_LEFT, a_flags);
-                       add_rev_cmdline(revs, b_obj, next,
-                                       REV_CMD_RIGHT, flags);
-                       add_pending_object(revs, a_obj, this);
-                       add_pending_object(revs, b_obj, next);
+       mark = strstr(arg, "^@");
+       if (mark && !mark[2]) {
+               *mark = 0;
+               if (add_parents_only(revs, arg, flags, 0))
                        return 0;
+               *mark = '^';
+       }
+       mark = strstr(arg, "^!");
+       if (mark && !mark[2]) {
+               *mark = 0;
+               if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM), 0))
+                       *mark = '^';
+       }
+       mark = strstr(arg, "^-");
+       if (mark) {
+               int exclude_parent = 1;
+
+               if (mark[2]) {
+                       char *end;
+                       exclude_parent = strtoul(mark + 2, &end, 10);
+                       if (*end != '\0' || !exclude_parent)
+                               return -1;
                }
-               *dotdot = '.';
-       }
-       dotdot = strstr(arg, "^@");
-       if (dotdot && !dotdot[2]) {
-               *dotdot = 0;
-               if (add_parents_only(revs, arg, flags))
-                       return 0;
-               *dotdot = '^';
-       }
-       dotdot = strstr(arg, "^!");
-       if (dotdot && !dotdot[2]) {
-               *dotdot = 0;
-               if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM)))
-                       *dotdot = '^';
+
+               *mark = 0;
+               if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM), exclude_parent))
+                       *mark = '^';
        }
 
        local_flags = 0;
@@ -1540,7 +1600,7 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
        }
 
        if (revarg_opt & REVARG_COMMITTISH)
-               get_sha1_flags = GET_SHA1_COMMITTISH;
+               get_sha1_flags |= GET_SHA1_COMMITTISH;
 
        if (get_sha1_with_context(arg, get_sha1_flags, sha1, &oc))
                return revs->ignore_missing ? 0 : -1;
@@ -1548,7 +1608,8 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
                verify_non_filename(revs->prefix, arg);
        object = get_reference(revs, arg, sha1, flags ^ local_flags);
        add_rev_cmdline(revs, object, arg_, REV_CMD_REV, flags ^ local_flags);
-       add_pending_object_with_mode(revs, object, arg, oc.mode);
+       add_pending_object_with_path(revs, object, arg, oc.mode, oc.path);
+       free(oc.path);
        return 0;
 }
 
@@ -1664,8 +1725,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                revs->max_count = atoi(argv[1]);
                revs->no_walk = 0;
                return 2;
-       } else if (starts_with(arg, "-n")) {
-               revs->max_count = atoi(arg + 2);
+       } else if (skip_prefix(arg, "-n", &optarg)) {
+               revs->max_count = atoi(optarg);
                revs->no_walk = 0;
        } else if ((argcount = parse_long_opt("max-age", argv, &optarg))) {
                revs->max_age = atoi(optarg);
@@ -1724,16 +1785,13 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
        } else if (!strcmp(arg, "--author-date-order")) {
                revs->sort_order = REV_SORT_BY_AUTHOR_DATE;
                revs->topo_order = 1;
-       } else if (starts_with(arg, "--early-output")) {
-               int count = 100;
-               switch (arg[14]) {
-               case '=':
-                       count = atoi(arg+15);
-                       /* Fallthrough */
-               case 0:
-                       revs->topo_order = 1;
-                      revs->early_output = count;
-               }
+       } else if (!strcmp(arg, "--early-output")) {
+               revs->early_output = 100;
+               revs->topo_order = 1;
+       } else if (skip_prefix(arg, "--early-output=", &optarg)) {
+               if (strtoul_ui(optarg, 10, &revs->early_output) < 0)
+                       die("'%s': not a non-negative integer", optarg);
+               revs->topo_order = 1;
        } else if (!strcmp(arg, "--parents")) {
                revs->rewrite_parents = 1;
                revs->print_parents = 1;
@@ -1749,13 +1807,13 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                revs->min_parents = 2;
        } else if (!strcmp(arg, "--no-merges")) {
                revs->max_parents = 1;
-       } else if (starts_with(arg, "--min-parents=")) {
-               revs->min_parents = atoi(arg+14);
-       } else if (starts_with(arg, "--no-min-parents")) {
+       } else if (skip_prefix(arg, "--min-parents=", &optarg)) {
+               revs->min_parents = atoi(optarg);
+       } else if (!strcmp(arg, "--no-min-parents")) {
                revs->min_parents = 0;
-       } else if (starts_with(arg, "--max-parents=")) {
-               revs->max_parents = atoi(arg+14);
-       } else if (starts_with(arg, "--no-max-parents")) {
+       } else if (skip_prefix(arg, "--max-parents=", &optarg)) {
+               revs->max_parents = atoi(optarg);
+       } else if (!strcmp(arg, "--no-max-parents")) {
                revs->max_parents = -1;
        } else if (!strcmp(arg, "--boundary")) {
                revs->boundary = 1;
@@ -1836,14 +1894,15 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                revs->verbose_header = 1;
                revs->pretty_given = 1;
                get_commit_format(NULL, revs);
-       } else if (starts_with(arg, "--pretty=") || starts_with(arg, "--format=")) {
+       } else if (skip_prefix(arg, "--pretty=", &optarg) ||
+                  skip_prefix(arg, "--format=", &optarg)) {
                /*
                 * Detached form ("--pretty X" as opposed to "--pretty=X")
                 * not allowed, since the argument is optional.
                 */
                revs->verbose_header = 1;
                revs->pretty_given = 1;
-               get_commit_format(arg+9, revs);
+               get_commit_format(optarg, revs);
        } else if (!strcmp(arg, "--expand-tabs")) {
                revs->expand_tabs_in_log = 8;
        } else if (!strcmp(arg, "--no-expand-tabs")) {
@@ -1861,26 +1920,23 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                revs->show_signature = 1;
        } else if (!strcmp(arg, "--no-show-signature")) {
                revs->show_signature = 0;
-       } else if (!strcmp(arg, "--show-linear-break") ||
-                  starts_with(arg, "--show-linear-break=")) {
-               if (starts_with(arg, "--show-linear-break="))
-                       revs->break_bar = xstrdup(arg + 20);
-               else
-                       revs->break_bar = "                    ..........";
+       } else if (!strcmp(arg, "--show-linear-break")) {
+               revs->break_bar = "                    ..........";
+               revs->track_linear = 1;
+               revs->track_first_time = 1;
+       } else if (skip_prefix(arg, "--show-linear-break=", &optarg)) {
+               revs->break_bar = xstrdup(optarg);
                revs->track_linear = 1;
                revs->track_first_time = 1;
-       } else if (starts_with(arg, "--show-notes=") ||
-                  starts_with(arg, "--notes=")) {
+       } else if (skip_prefix(arg, "--show-notes=", &optarg) ||
+                  skip_prefix(arg, "--notes=", &optarg)) {
                struct strbuf buf = STRBUF_INIT;
                revs->show_notes = 1;
                revs->show_notes_given = 1;
-               if (starts_with(arg, "--show-notes")) {
-                       if (revs->notes_opt.use_default_notes < 0)
-                               revs->notes_opt.use_default_notes = 1;
-                       strbuf_addstr(&buf, arg+13);
-               }
-               else
-                       strbuf_addstr(&buf, arg+8);
+               if (starts_with(arg, "--show-notes=") &&
+                   revs->notes_opt.use_default_notes < 0)
+                       revs->notes_opt.use_default_notes = 1;
+               strbuf_addstr(&buf, optarg);
                expand_notes_ref(&buf);
                string_list_append(&revs->notes_opt.extra_notes_refs,
                                   strbuf_detach(&buf, NULL));
@@ -1917,8 +1973,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                revs->abbrev = 0;
        } else if (!strcmp(arg, "--abbrev")) {
                revs->abbrev = DEFAULT_ABBREV;
-       } else if (starts_with(arg, "--abbrev=")) {
-               revs->abbrev = strtoul(arg + 9, NULL, 10);
+       } else if (skip_prefix(arg, "--abbrev=", &optarg)) {
+               revs->abbrev = strtoul(optarg, NULL, 10);
                if (revs->abbrev < MINIMUM_ABBREV)
                        revs->abbrev = MINIMUM_ABBREV;
                else if (revs->abbrev > 40)
@@ -2078,20 +2134,20 @@ static int handle_revision_pseudo_opt(const char *submodule,
        } else if ((argcount = parse_long_opt("exclude", argv, &optarg))) {
                add_ref_exclusion(&revs->ref_excludes, optarg);
                return argcount;
-       } else if (starts_with(arg, "--branches=")) {
+       } else if (skip_prefix(arg, "--branches=", &optarg)) {
                struct all_refs_cb cb;
                init_all_refs_cb(&cb, revs, *flags);
-               for_each_glob_ref_in(handle_one_ref, arg + 11, "refs/heads/", &cb);
+               for_each_glob_ref_in(handle_one_ref, optarg, "refs/heads/", &cb);
                clear_ref_exclusion(&revs->ref_excludes);
-       } else if (starts_with(arg, "--tags=")) {
+       } else if (skip_prefix(arg, "--tags=", &optarg)) {
                struct all_refs_cb cb;
                init_all_refs_cb(&cb, revs, *flags);
-               for_each_glob_ref_in(handle_one_ref, arg + 7, "refs/tags/", &cb);
+               for_each_glob_ref_in(handle_one_ref, optarg, "refs/tags/", &cb);
                clear_ref_exclusion(&revs->ref_excludes);
-       } else if (starts_with(arg, "--remotes=")) {
+       } else if (skip_prefix(arg, "--remotes=", &optarg)) {
                struct all_refs_cb cb;
                init_all_refs_cb(&cb, revs, *flags);
-               for_each_glob_ref_in(handle_one_ref, arg + 10, "refs/remotes/", &cb);
+               for_each_glob_ref_in(handle_one_ref, optarg, "refs/remotes/", &cb);
                clear_ref_exclusion(&revs->ref_excludes);
        } else if (!strcmp(arg, "--reflog")) {
                add_reflogs_to_pending(revs, *flags);
@@ -2101,14 +2157,14 @@ static int handle_revision_pseudo_opt(const char *submodule,
                *flags ^= UNINTERESTING | BOTTOM;
        } else if (!strcmp(arg, "--no-walk")) {
                revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
-       } else if (starts_with(arg, "--no-walk=")) {
+       } else if (skip_prefix(arg, "--no-walk=", &optarg)) {
                /*
                 * Detached form ("--no-walk X" as opposed to "--no-walk=X")
                 * not allowed, since the argument is optional.
                 */
-               if (!strcmp(arg + 10, "sorted"))
+               if (!strcmp(optarg, "sorted"))
                        revs->no_walk = REVISION_WALK_NO_WALK_SORTED;
-               else if (!strcmp(arg + 10, "unsorted"))
+               else if (!strcmp(optarg, "unsorted"))
                        revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED;
                else
                        return error("invalid argument to --no-walk");
index 9fac1a607de6470ab0c9b7e5079e8d36c8d68c75..3672d39237c7f06783b5f88c184ac418dbb5542b 100644 (file)
@@ -74,8 +74,9 @@ struct rev_info {
        /* topo-sort */
        enum rev_sort_order sort_order;
 
-       unsigned int    early_output:1,
-                       ignore_missing:1,
+       unsigned int early_output;
+
+       unsigned int    ignore_missing:1,
                        ignore_missing_links:1;
 
        /* Traversal flags */
@@ -259,8 +260,6 @@ extern void put_revision_mark(const struct rev_info *revs,
 extern void mark_parents_uninteresting(struct commit *commit);
 extern void mark_tree_uninteresting(struct tree *tree);
 
-char *path_name(struct strbuf *path, const char *name);
-
 extern void show_object_with_name(FILE *, struct object *, const char *);
 
 extern void add_pending_object(struct rev_info *revs,
index 5a4dbb66d7e4d4ed4bd6cf319f132c1b4d870572..9e36151bf97d36945ca3464e719687718ee6d1c7 100644 (file)
@@ -21,6 +21,7 @@ void child_process_clear(struct child_process *child)
 
 struct child_to_clean {
        pid_t pid;
+       struct child_process *process;
        struct child_to_clean *next;
 };
 static struct child_to_clean *children_to_clean;
@@ -28,10 +29,41 @@ static int installed_child_cleanup_handler;
 
 static void cleanup_children(int sig, int in_signal)
 {
+       struct child_to_clean *children_to_wait_for = NULL;
+
        while (children_to_clean) {
                struct child_to_clean *p = children_to_clean;
                children_to_clean = p->next;
+
+               if (p->process && !in_signal) {
+                       struct child_process *process = p->process;
+                       if (process->clean_on_exit_handler) {
+                               trace_printf(
+                                       "trace: run_command: running exit handler for pid %"
+                                       PRIuMAX, (uintmax_t)p->pid
+                               );
+                               process->clean_on_exit_handler(process);
+                       }
+               }
+
                kill(p->pid, sig);
+
+               if (p->process && p->process->wait_after_clean) {
+                       p->next = children_to_wait_for;
+                       children_to_wait_for = p;
+               } else {
+                       if (!in_signal)
+                               free(p);
+               }
+       }
+
+       while (children_to_wait_for) {
+               struct child_to_clean *p = children_to_wait_for;
+               children_to_wait_for = p->next;
+
+               while (waitpid(p->pid, NULL, 0) < 0 && errno == EINTR)
+                       ; /* spin waiting for process exit or error */
+
                if (!in_signal)
                        free(p);
        }
@@ -49,10 +81,11 @@ static void cleanup_children_on_exit(void)
        cleanup_children(SIGTERM, 0);
 }
 
-static void mark_child_for_cleanup(pid_t pid)
+static void mark_child_for_cleanup(pid_t pid, struct child_process *process)
 {
        struct child_to_clean *p = xmalloc(sizeof(*p));
        p->pid = pid;
+       p->process = process;
        p->next = children_to_clean;
        children_to_clean = p;
 
@@ -84,18 +117,65 @@ static inline void close_pair(int fd[2])
        close(fd[1]);
 }
 
-#ifndef GIT_WINDOWS_NATIVE
-static inline void dup_devnull(int to)
+int is_executable(const char *name)
 {
-       int fd = open("/dev/null", O_RDWR);
-       if (fd < 0)
-               die_errno(_("open /dev/null failed"));
-       if (dup2(fd, to) < 0)
-               die_errno(_("dup2(%d,%d) failed"), fd, to);
-       close(fd);
+       struct stat st;
+
+       if (stat(name, &st) || /* stat, not lstat */
+           !S_ISREG(st.st_mode))
+               return 0;
+
+#if defined(GIT_WINDOWS_NATIVE)
+       /*
+        * On Windows there is no executable bit. The file extension
+        * indicates whether it can be run as an executable, and Git
+        * has special-handling to detect scripts and launch them
+        * through the indicated script interpreter. We test for the
+        * file extension first because virus scanners may make
+        * it quite expensive to open many files.
+        */
+       if (ends_with(name, ".exe"))
+               return S_IXUSR;
+
+{
+       /*
+        * Now that we know it does not have an executable extension,
+        * peek into the file instead.
+        */
+       char buf[3] = { 0 };
+       int n;
+       int fd = open(name, O_RDONLY);
+       st.st_mode &= ~S_IXUSR;
+       if (fd >= 0) {
+               n = read(fd, buf, 2);
+               if (n == 2)
+                       /* look for a she-bang */
+                       if (!strcmp(buf, "#!"))
+                               st.st_mode |= S_IXUSR;
+               close(fd);
+       }
 }
 #endif
+       return st.st_mode & S_IXUSR;
+}
 
+/*
+ * Search $PATH for a command.  This emulates the path search that
+ * execvp would perform, without actually executing the command so it
+ * can be used before fork() to prepare to run a command using
+ * execve() or after execvp() to diagnose why it failed.
+ *
+ * The caller should ensure that file contains no directory
+ * separators.
+ *
+ * Returns the path to the command, as found in $PATH or NULL if the
+ * command could not be found.  The caller inherits ownership of the memory
+ * used to store the resultant path.
+ *
+ * This should not be used on Windows, where the $PATH search rules
+ * are more complicated (e.g., a search for "foo" should find
+ * "foo.exe").
+ */
 static char *locate_in_PATH(const char *file)
 {
        const char *p = getenv("PATH");
@@ -116,7 +196,7 @@ static char *locate_in_PATH(const char *file)
                }
                strbuf_addstr(&buf, file);
 
-               if (!access(buf.buf, F_OK))
+               if (is_executable(buf.buf))
                        return strbuf_detach(&buf, NULL);
 
                if (!*end)
@@ -188,30 +268,247 @@ static const char **prepare_shell_cmd(struct argv_array *out, const char **argv)
 }
 
 #ifndef GIT_WINDOWS_NATIVE
-static int execv_shell_cmd(const char **argv)
+static int child_notifier = -1;
+
+enum child_errcode {
+       CHILD_ERR_CHDIR,
+       CHILD_ERR_DUP2,
+       CHILD_ERR_CLOSE,
+       CHILD_ERR_SIGPROCMASK,
+       CHILD_ERR_ENOENT,
+       CHILD_ERR_SILENT,
+       CHILD_ERR_ERRNO
+};
+
+struct child_err {
+       enum child_errcode err;
+       int syserr; /* errno */
+};
+
+static void child_die(enum child_errcode err)
 {
-       struct argv_array nargv = ARGV_ARRAY_INIT;
-       prepare_shell_cmd(&nargv, argv);
-       trace_argv_printf(nargv.argv, "trace: exec:");
-       sane_execvp(nargv.argv[0], (char **)nargv.argv);
-       argv_array_clear(&nargv);
-       return -1;
+       struct child_err buf;
+
+       buf.err = err;
+       buf.syserr = errno;
+
+       /* write(2) on buf smaller than PIPE_BUF (min 512) is atomic: */
+       xwrite(child_notifier, &buf, sizeof(buf));
+       _exit(1);
 }
-#endif
 
-#ifndef GIT_WINDOWS_NATIVE
-static int child_notifier = -1;
+static void child_dup2(int fd, int to)
+{
+       if (dup2(fd, to) < 0)
+               child_die(CHILD_ERR_DUP2);
+}
 
-static void notify_parent(void)
+static void child_close(int fd)
 {
+       if (close(fd))
+               child_die(CHILD_ERR_CLOSE);
+}
+
+static void child_close_pair(int fd[2])
+{
+       child_close(fd[0]);
+       child_close(fd[1]);
+}
+
+/*
+ * parent will make it look like the child spewed a fatal error and died
+ * this is needed to prevent changes to t0061.
+ */
+static void fake_fatal(const char *err, va_list params)
+{
+       vreportf("fatal: ", err, params);
+}
+
+static void child_error_fn(const char *err, va_list params)
+{
+       const char msg[] = "error() should not be called in child\n";
+       xwrite(2, msg, sizeof(msg) - 1);
+}
+
+static void child_warn_fn(const char *err, va_list params)
+{
+       const char msg[] = "warn() should not be called in child\n";
+       xwrite(2, msg, sizeof(msg) - 1);
+}
+
+static void NORETURN child_die_fn(const char *err, va_list params)
+{
+       const char msg[] = "die() should not be called in child\n";
+       xwrite(2, msg, sizeof(msg) - 1);
+       _exit(2);
+}
+
+/* this runs in the parent process */
+static void child_err_spew(struct child_process *cmd, struct child_err *cerr)
+{
+       static void (*old_errfn)(const char *err, va_list params);
+
+       old_errfn = get_error_routine();
+       set_error_routine(fake_fatal);
+       errno = cerr->syserr;
+
+       switch (cerr->err) {
+       case CHILD_ERR_CHDIR:
+               error_errno("exec '%s': cd to '%s' failed",
+                           cmd->argv[0], cmd->dir);
+               break;
+       case CHILD_ERR_DUP2:
+               error_errno("dup2() in child failed");
+               break;
+       case CHILD_ERR_CLOSE:
+               error_errno("close() in child failed");
+               break;
+       case CHILD_ERR_SIGPROCMASK:
+               error_errno("sigprocmask failed restoring signals");
+               break;
+       case CHILD_ERR_ENOENT:
+               error_errno("cannot run %s", cmd->argv[0]);
+               break;
+       case CHILD_ERR_SILENT:
+               break;
+       case CHILD_ERR_ERRNO:
+               error_errno("cannot exec '%s'", cmd->argv[0]);
+               break;
+       }
+       set_error_routine(old_errfn);
+}
+
+static void prepare_cmd(struct argv_array *out, const struct child_process *cmd)
+{
+       if (!cmd->argv[0])
+               die("BUG: command is empty");
+
+       /*
+        * Add SHELL_PATH so in the event exec fails with ENOEXEC we can
+        * attempt to interpret the command with 'sh'.
+        */
+       argv_array_push(out, SHELL_PATH);
+
+       if (cmd->git_cmd) {
+               argv_array_push(out, "git");
+               argv_array_pushv(out, cmd->argv);
+       } else if (cmd->use_shell) {
+               prepare_shell_cmd(out, cmd->argv);
+       } else {
+               argv_array_pushv(out, cmd->argv);
+       }
+
        /*
-        * execvp failed.  If possible, we'd like to let start_command
-        * know, so failures like ENOENT can be handled right away; but
-        * otherwise, finish_command will still report the error.
+        * If there are no '/' characters in the command then perform a path
+        * lookup and use the resolved path as the command to exec.  If there
+        * are no '/' characters or if the command wasn't found in the path,
+        * have exec attempt to invoke the command directly.
         */
-       xwrite(child_notifier, "", 1);
+       if (!strchr(out->argv[1], '/')) {
+               char *program = locate_in_PATH(out->argv[1]);
+               if (program) {
+                       free((char *)out->argv[1]);
+                       out->argv[1] = program;
+               }
+       }
 }
+
+static char **prep_childenv(const char *const *deltaenv)
+{
+       extern char **environ;
+       char **childenv;
+       struct string_list env = STRING_LIST_INIT_DUP;
+       struct strbuf key = STRBUF_INIT;
+       const char *const *p;
+       int i;
+
+       /* Construct a sorted string list consisting of the current environ */
+       for (p = (const char *const *) environ; p && *p; p++) {
+               const char *equals = strchr(*p, '=');
+
+               if (equals) {
+                       strbuf_reset(&key);
+                       strbuf_add(&key, *p, equals - *p);
+                       string_list_append(&env, key.buf)->util = (void *) *p;
+               } else {
+                       string_list_append(&env, *p)->util = (void *) *p;
+               }
+       }
+       string_list_sort(&env);
+
+       /* Merge in 'deltaenv' with the current environ */
+       for (p = deltaenv; p && *p; p++) {
+               const char *equals = strchr(*p, '=');
+
+               if (equals) {
+                       /* ('key=value'), insert or replace entry */
+                       strbuf_reset(&key);
+                       strbuf_add(&key, *p, equals - *p);
+                       string_list_insert(&env, key.buf)->util = (void *) *p;
+               } else {
+                       /* otherwise ('key') remove existing entry */
+                       string_list_remove(&env, *p, 0);
+               }
+       }
+
+       /* Create an array of 'char *' to be used as the childenv */
+       childenv = xmalloc((env.nr + 1) * sizeof(char *));
+       for (i = 0; i < env.nr; i++)
+               childenv[i] = env.items[i].util;
+       childenv[env.nr] = NULL;
+
+       string_list_clear(&env, 0);
+       strbuf_release(&key);
+       return childenv;
+}
+
+struct atfork_state {
+#ifndef NO_PTHREADS
+       int cs;
+#endif
+       sigset_t old;
+};
+
+#ifndef NO_PTHREADS
+static void bug_die(int err, const char *msg)
+{
+       if (err) {
+               errno = err;
+               die_errno("BUG: %s", msg);
+       }
+}
+#endif
+
+static void atfork_prepare(struct atfork_state *as)
+{
+       sigset_t all;
+
+       if (sigfillset(&all))
+               die_errno("sigfillset");
+#ifdef NO_PTHREADS
+       if (sigprocmask(SIG_SETMASK, &all, &as->old))
+               die_errno("sigprocmask");
+#else
+       bug_die(pthread_sigmask(SIG_SETMASK, &all, &as->old),
+               "blocking all signals");
+       bug_die(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &as->cs),
+               "disabling cancellation");
+#endif
+}
+
+static void atfork_parent(struct atfork_state *as)
+{
+#ifdef NO_PTHREADS
+       if (sigprocmask(SIG_SETMASK, &as->old, NULL))
+               die_errno("sigprocmask");
+#else
+       bug_die(pthread_setcancelstate(as->cs, NULL),
+               "re-enabling cancellation");
+       bug_die(pthread_sigmask(SIG_SETMASK, &as->old, NULL),
+               "restoring signal mask");
 #endif
+}
+#endif /* GIT_WINDOWS_NATIVE */
 
 static inline void set_cloexec(int fd)
 {
@@ -248,13 +545,6 @@ static int wait_or_whine(pid_t pid, const char *argv0, int in_signal)
                code += 128;
        } else if (WIFEXITED(status)) {
                code = WEXITSTATUS(status);
-               /*
-                * Convert special exit code when execvp failed.
-                */
-               if (code == 127) {
-                       code = -1;
-                       failed_errno = ENOENT;
-               }
        } else {
                error("waitpid is confused (%s)", argv0);
        }
@@ -339,109 +629,149 @@ fail_pipe:
 #ifndef GIT_WINDOWS_NATIVE
 {
        int notify_pipe[2];
+       int null_fd = -1;
+       char **childenv;
+       struct argv_array argv = ARGV_ARRAY_INIT;
+       struct child_err cerr;
+       struct atfork_state as;
+
        if (pipe(notify_pipe))
                notify_pipe[0] = notify_pipe[1] = -1;
 
+       if (cmd->no_stdin || cmd->no_stdout || cmd->no_stderr) {
+               null_fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+               if (null_fd < 0)
+                       die_errno(_("open /dev/null failed"));
+               set_cloexec(null_fd);
+       }
+
+       prepare_cmd(&argv, cmd);
+       childenv = prep_childenv(cmd->env);
+       atfork_prepare(&as);
+
+       /*
+        * NOTE: In order to prevent deadlocking when using threads special
+        * care should be taken with the function calls made in between the
+        * fork() and exec() calls.  No calls should be made to functions which
+        * require acquiring a lock (e.g. malloc) as the lock could have been
+        * held by another thread at the time of forking, causing the lock to
+        * never be released in the child process.  This means only
+        * Async-Signal-Safe functions are permitted in the child.
+        */
        cmd->pid = fork();
        failed_errno = errno;
        if (!cmd->pid) {
+               int sig;
                /*
-                * Redirect the channel to write syscall error messages to
-                * before redirecting the process's stderr so that all die()
-                * in subsequent call paths use the parent's stderr.
+                * Ensure the default die/error/warn routines do not get
+                * called, they can take stdio locks and malloc.
                 */
-               if (cmd->no_stderr || need_err) {
-                       int child_err = dup(2);
-                       set_cloexec(child_err);
-                       set_error_handle(fdopen(child_err, "w"));
-               }
+               set_die_routine(child_die_fn);
+               set_error_routine(child_error_fn);
+               set_warn_routine(child_warn_fn);
 
                close(notify_pipe[0]);
                set_cloexec(notify_pipe[1]);
                child_notifier = notify_pipe[1];
-               atexit(notify_parent);
 
                if (cmd->no_stdin)
-                       dup_devnull(0);
+                       child_dup2(null_fd, 0);
                else if (need_in) {
-                       dup2(fdin[0], 0);
-                       close_pair(fdin);
+                       child_dup2(fdin[0], 0);
+                       child_close_pair(fdin);
                } else if (cmd->in) {
-                       dup2(cmd->in, 0);
-                       close(cmd->in);
+                       child_dup2(cmd->in, 0);
+                       child_close(cmd->in);
                }
 
                if (cmd->no_stderr)
-                       dup_devnull(2);
+                       child_dup2(null_fd, 2);
                else if (need_err) {
-                       dup2(fderr[1], 2);
-                       close_pair(fderr);
+                       child_dup2(fderr[1], 2);
+                       child_close_pair(fderr);
                } else if (cmd->err > 1) {
-                       dup2(cmd->err, 2);
-                       close(cmd->err);
+                       child_dup2(cmd->err, 2);
+                       child_close(cmd->err);
                }
 
                if (cmd->no_stdout)
-                       dup_devnull(1);
+                       child_dup2(null_fd, 1);
                else if (cmd->stdout_to_stderr)
-                       dup2(2, 1);
+                       child_dup2(2, 1);
                else if (need_out) {
-                       dup2(fdout[1], 1);
-                       close_pair(fdout);
+                       child_dup2(fdout[1], 1);
+                       child_close_pair(fdout);
                } else if (cmd->out > 1) {
-                       dup2(cmd->out, 1);
-                       close(cmd->out);
+                       child_dup2(cmd->out, 1);
+                       child_close(cmd->out);
                }
 
                if (cmd->dir && chdir(cmd->dir))
-                       die_errno("exec '%s': cd to '%s' failed", cmd->argv[0],
-                           cmd->dir);
-               if (cmd->env) {
-                       for (; *cmd->env; cmd->env++) {
-                               if (strchr(*cmd->env, '='))
-                                       putenv((char *)*cmd->env);
-                               else
-                                       unsetenv(*cmd->env);
-                       }
+                       child_die(CHILD_ERR_CHDIR);
+
+               /*
+                * restore default signal handlers here, in case
+                * we catch a signal right before execve below
+                */
+               for (sig = 1; sig < NSIG; sig++) {
+                       /* ignored signals get reset to SIG_DFL on execve */
+                       if (signal(sig, SIG_DFL) == SIG_IGN)
+                               signal(sig, SIG_IGN);
                }
-               if (cmd->git_cmd)
-                       execv_git_cmd(cmd->argv);
-               else if (cmd->use_shell)
-                       execv_shell_cmd(cmd->argv);
-               else
-                       sane_execvp(cmd->argv[0], (char *const*) cmd->argv);
+
+               if (sigprocmask(SIG_SETMASK, &as.old, NULL) != 0)
+                       child_die(CHILD_ERR_SIGPROCMASK);
+
+               /*
+                * Attempt to exec using the command and arguments starting at
+                * argv.argv[1].  argv.argv[0] contains SHELL_PATH which will
+                * be used in the event exec failed with ENOEXEC at which point
+                * we will try to interpret the command using 'sh'.
+                */
+               execve(argv.argv[1], (char *const *) argv.argv + 1,
+                      (char *const *) childenv);
+               if (errno == ENOEXEC)
+                       execve(argv.argv[0], (char *const *) argv.argv,
+                              (char *const *) childenv);
+
                if (errno == ENOENT) {
-                       if (!cmd->silent_exec_failure)
-                               error("cannot run %s: %s", cmd->argv[0],
-                                       strerror(ENOENT));
-                       exit(127);
+                       if (cmd->silent_exec_failure)
+                               child_die(CHILD_ERR_SILENT);
+                       child_die(CHILD_ERR_ENOENT);
                } else {
-                       die_errno("cannot exec '%s'", cmd->argv[0]);
+                       child_die(CHILD_ERR_ERRNO);
                }
        }
+       atfork_parent(&as);
        if (cmd->pid < 0)
                error_errno("cannot fork() for %s", cmd->argv[0]);
        else if (cmd->clean_on_exit)
-               mark_child_for_cleanup(cmd->pid);
+               mark_child_for_cleanup(cmd->pid, cmd);
 
        /*
-        * Wait for child's execvp. If the execvp succeeds (or if fork()
+        * Wait for child's exec. If the exec succeeds (or if fork()
         * failed), EOF is seen immediately by the parent. Otherwise, the
-        * child process sends a single byte.
+        * child process sends a child_err struct.
         * Note that use of this infrastructure is completely advisory,
         * therefore, we keep error checks minimal.
         */
        close(notify_pipe[1]);
-       if (read(notify_pipe[0], &notify_pipe[1], 1) == 1) {
+       if (xread(notify_pipe[0], &cerr, sizeof(cerr)) == sizeof(cerr)) {
                /*
-                * At this point we know that fork() succeeded, but execvp()
+                * At this point we know that fork() succeeded, but exec()
                 * failed. Errors have been reported to our stderr.
                 */
                wait_or_whine(cmd->pid, cmd->argv[0], 0);
+               child_err_spew(cmd, &cerr);
                failed_errno = errno;
                cmd->pid = -1;
        }
        close(notify_pipe[0]);
+
+       if (null_fd >= 0)
+               close(null_fd);
+       argv_array_clear(&argv);
+       free(childenv);
 }
 #else
 {
@@ -483,7 +813,7 @@ fail_pipe:
        if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT))
                error_errno("cannot spawn %s", cmd->argv[0]);
        if (cmd->clean_on_exit && cmd->pid >= 0)
-               mark_child_for_cleanup(cmd->pid);
+               mark_child_for_cleanup(cmd->pid, cmd);
 
        argv_array_clear(&nargv);
        cmd->argv = sargv;
@@ -634,7 +964,7 @@ int in_async(void)
        return !pthread_equal(main_thread, pthread_self());
 }
 
-void NORETURN async_exit(int code)
+static void NORETURN async_exit(int code)
 {
        pthread_exit((void *)(intptr_t)code);
 }
@@ -684,13 +1014,26 @@ int in_async(void)
        return process_is_async;
 }
 
-void NORETURN async_exit(int code)
+static void NORETURN async_exit(int code)
 {
        exit(code);
 }
 
 #endif
 
+void check_pipe(int err)
+{
+       if (err == EPIPE) {
+               if (in_async())
+                       async_exit(141);
+
+               signal(SIGPIPE, SIG_DFL);
+               raise(SIGPIPE);
+               /* Should never happen, but just in case... */
+               exit(141);
+       }
+}
+
 int start_async(struct async *async)
 {
        int need_in, need_out;
@@ -752,7 +1095,7 @@ int start_async(struct async *async)
                exit(!!async->proc(proc_in, proc_out, async->data));
        }
 
-       mark_child_for_cleanup(async->pid);
+       mark_child_for_cleanup(async->pid, NULL);
 
        if (need_in)
                close(fdin[0]);
@@ -825,8 +1168,14 @@ const char *find_hook(const char *name)
 
        strbuf_reset(&path);
        strbuf_git_path(&path, "hooks/%s", name);
-       if (access(path.buf, X_OK) < 0)
+       if (access(path.buf, X_OK) < 0) {
+#ifdef STRIP_EXTENSION
+               strbuf_addstr(&path, STRIP_EXTENSION);
+               if (access(path.buf, X_OK) >= 0)
+                       return path.buf;
+#endif
                return NULL;
+       }
        return path.buf;
 }
 
index 50666497aeca8f4d3d403cfaeb0afeb350216a42..3932420ec8a560479c9697e3626e9da15e952853 100644 (file)
@@ -43,11 +43,15 @@ struct child_process {
        unsigned stdout_to_stderr:1;
        unsigned use_shell:1;
        unsigned clean_on_exit:1;
+       unsigned wait_after_clean:1;
+       void (*clean_on_exit_handler)(struct child_process *process);
+       void *clean_on_exit_handler_cbdata;
 };
 
 #define CHILD_PROCESS_INIT { NULL, ARGV_ARRAY_INIT, ARGV_ARRAY_INIT }
 void child_process_init(struct child_process *);
 void child_process_clear(struct child_process *);
+extern int is_executable(const char *name);
 
 int start_command(struct child_process *);
 int finish_command(struct child_process *);
@@ -139,7 +143,7 @@ struct async {
 int start_async(struct async *async);
 int finish_async(struct async *async);
 int in_async(void);
-void NORETURN async_exit(int code);
+void check_pipe(int err);
 
 /**
  * This callback should initialize the child process and preload the
index 6195b43e9abacf346f52b6bbb758c9ca7b617d4e..78bb34ebec297102c852a5b88ec7b4f10ffbc1d8 100644 (file)
@@ -50,7 +50,7 @@ static void feed_object(const unsigned char *sha1, FILE *fh, int negative)
 /*
  * Make a pack stream and spit it out into file descriptor fd
  */
-static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, struct send_pack_args *args)
+static int pack_objects(int fd, struct ref *refs, struct oid_array *extra, struct send_pack_args *args)
 {
        /*
         * The child becomes pack-objects --revs; we feed
@@ -72,6 +72,7 @@ static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, stru
        struct child_process po = CHILD_PROCESS_INIT;
        FILE *po_in;
        int i;
+       int rc;
 
        i = 4;
        if (args->use_thin_pack)
@@ -97,7 +98,7 @@ static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, stru
         */
        po_in = xfdopen(po.in, "w");
        for (i = 0; i < extra->nr; i++)
-               feed_object(extra->sha1[i], po_in, 1);
+               feed_object(extra->oid[i].hash, po_in, 1);
 
        while (refs) {
                if (!is_null_oid(&refs->old_oid))
@@ -125,27 +126,44 @@ static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, stru
                po.out = -1;
        }
 
-       if (finish_command(&po))
+       rc = finish_command(&po);
+       if (rc) {
+               /*
+                * For a normal non-zero exit, we assume pack-objects wrote
+                * something useful to stderr. For death by signal, though,
+                * we should mention it to the user. The exception is SIGPIPE
+                * (141), because that's a normal occurence if the remote end
+                * hangs up (and we'll report that by trying to read the unpack
+                * status).
+                */
+               if (rc > 128 && rc != 141)
+                       error("pack-objects died of signal %d", rc - 128);
                return -1;
+       }
+       return 0;
+}
+
+static int receive_unpack_status(int in)
+{
+       const char *line = packet_read_line(in, NULL);
+       if (!skip_prefix(line, "unpack ", &line))
+               return error(_("unable to parse remote unpack status: %s"), line);
+       if (strcmp(line, "ok"))
+               return error(_("remote unpack failed: %s"), line);
        return 0;
 }
 
 static int receive_status(int in, struct ref *refs)
 {
        struct ref *hint;
-       int ret = 0;
-       char *line = packet_read_line(in, NULL);
-       if (!starts_with(line, "unpack "))
-               return error("did not receive remote status");
-       if (strcmp(line, "unpack ok")) {
-               error("unpack failed: %s", line + 7);
-               ret = -1;
-       }
+       int ret;
+
        hint = NULL;
+       ret = receive_unpack_status(in);
        while (1) {
                char *refname;
                char *msg;
-               line = packet_read_line(in, NULL);
+               char *line = packet_read_line(in, NULL);
                if (!line)
                        break;
                if (!starts_with(line, "ok ") && !starts_with(line, "ng ")) {
@@ -358,7 +376,7 @@ static void reject_invalid_nonce(const char *nonce, int len)
 int send_pack(struct send_pack_args *args,
              int fd[], struct child_process *conn,
              struct ref *remote_refs,
-             struct sha1_array *extra_have)
+             struct oid_array *extra_have)
 {
        int in = fd[0];
        int out = fd[1];
@@ -514,6 +532,14 @@ int send_pack(struct send_pack_args *args,
                }
        }
 
+       if (use_push_options) {
+               struct string_list_item *item;
+
+               packet_buf_flush(&req_buf);
+               for_each_string_list_item(item, args->push_options)
+                       packet_buf_write(&req_buf, "%s", item->string);
+       }
+
        if (args->stateless_rpc) {
                if (!args->dry_run && (cmds_sent || is_repository_shallow())) {
                        packet_buf_flush(&req_buf);
@@ -526,18 +552,6 @@ int send_pack(struct send_pack_args *args,
        strbuf_release(&req_buf);
        strbuf_release(&cap_buf);
 
-       if (use_push_options) {
-               struct string_list_item *item;
-               struct strbuf sb = STRBUF_INIT;
-
-               for_each_string_list_item(item, args->push_options)
-                       packet_buf_write(&sb, "%s", item->string);
-
-               write_or_die(out, sb.buf, sb.len);
-               packet_flush(out);
-               strbuf_release(&sb);
-       }
-
        if (use_sideband && cmds_sent) {
                memset(&demux, 0, sizeof(demux));
                demux.proc = sideband_demux;
@@ -557,6 +571,14 @@ int send_pack(struct send_pack_args *args,
                                close(out);
                        if (git_connection_is_socket(conn))
                                shutdown(fd[0], SHUT_WR);
+
+                       /*
+                        * Do not even bother with the return value; we know we
+                        * are failing, and just want the error() side effects.
+                        */
+                       if (status_report)
+                               receive_unpack_status(in);
+
                        if (use_sideband) {
                                close(demux.out);
                                finish_async(&demux);
index 67fc40f4ec1a0847fb16535334e07bf196e8028a..6af71f7008127df0acb72cfaf3b679f7ef332a4e 100644 (file)
@@ -32,6 +32,6 @@ int option_parse_push_signed(const struct option *opt,
 
 int send_pack(struct send_pack_args *args,
              int fd[], struct child_process *conn,
-             struct ref *remote_refs, struct sha1_array *extra_have);
+             struct ref *remote_refs, struct oid_array *extra_have);
 
 #endif
index 3804fa931d819f035ad6b3159cb8efa1745693d0..4b24e3bfda4bea9e64a419d6f7ec88a2366cd7f4 100644 (file)
 #include "merge-recursive.h"
 #include "refs.h"
 #include "argv-array.h"
+#include "quote.h"
+#include "trailer.h"
+#include "log-tree.h"
+#include "wt-status.h"
 
 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
 
 const char sign_off_header[] = "Signed-off-by: ";
 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
 
-static GIT_PATH_FUNC(git_path_todo_file, SEQ_TODO_FILE)
-static GIT_PATH_FUNC(git_path_opts_file, SEQ_OPTS_FILE)
-static GIT_PATH_FUNC(git_path_seq_dir, SEQ_DIR)
-static GIT_PATH_FUNC(git_path_head_file, SEQ_HEAD_FILE)
+GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
 
-static int is_rfc2822_line(const char *buf, int len)
-{
-       int i;
+static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
+static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
+static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
+static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
 
-       for (i = 0; i < len; i++) {
-               int ch = buf[i];
-               if (ch == ':')
-                       return 1;
-               if (!isalnum(ch) && ch != '-')
-                       break;
-       }
+static GIT_PATH_FUNC(rebase_path, "rebase-merge")
+/*
+ * The file containing rebase commands, comments, and empty lines.
+ * This file is created by "git rebase -i" then edited by the user. As
+ * the lines are processed, they are removed from the front of this
+ * file and written to the tail of 'done'.
+ */
+static GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
+/*
+ * The rebase command lines that have already been processed. A line
+ * is moved here when it is first handled, before any associated user
+ * actions.
+ */
+static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
+/*
+ * The file to keep track of how many commands were already processed (e.g.
+ * for the prompt).
+ */
+static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum");
+/*
+ * The file to keep track of how many commands are to be processed in total
+ * (e.g. for the prompt).
+ */
+static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end");
+/*
+ * The commit message that is planned to be used for any changes that
+ * need to be committed following a user interaction.
+ */
+static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
+/*
+ * The file into which is accumulated the suggested commit message for
+ * squash/fixup commands. When the first of a series of squash/fixups
+ * is seen, the file is created and the commit message from the
+ * previous commit and from the first squash/fixup commit are written
+ * to it. The commit message for each subsequent squash/fixup commit
+ * is appended to the file as it is processed.
+ *
+ * The first line of the file is of the form
+ *     # This is a combination of $count commits.
+ * where $count is the number of commits whose messages have been
+ * written to the file so far (including the initial "pick" commit).
+ * Each time that a commit message is processed, this line is read and
+ * updated. It is deleted just before the combined commit is made.
+ */
+static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
+/*
+ * If the current series of squash/fixups has not yet included a squash
+ * command, then this file exists and holds the commit message of the
+ * original "pick" commit.  (If the series ends without a "squash"
+ * command, then this can be used as the commit message of the combined
+ * commit without opening the editor.)
+ */
+static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
+/*
+ * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
+ * GIT_AUTHOR_DATE that will be used for the commit that is currently
+ * being rebased.
+ */
+static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
+/*
+ * When an "edit" rebase command is being processed, the SHA1 of the
+ * commit to be edited is recorded in this file.  When "git rebase
+ * --continue" is executed, if there are any staged changes then they
+ * will be amended to the HEAD commit, but only provided the HEAD
+ * commit is still the commit to be edited.  When any other rebase
+ * command is processed, this file is deleted.
+ */
+static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
+/*
+ * When we stop at a given patch via the "edit" command, this file contains
+ * the abbreviated commit name of the corresponding patch.
+ */
+static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
+/*
+ * For the post-rewrite hook, we make a list of rewritten commits and
+ * their new sha1s.  The rewritten-pending list keeps the sha1s of
+ * commits that have been processed, but not committed yet,
+ * e.g. because they are waiting for a 'squash' command.
+ */
+static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
+static GIT_PATH_FUNC(rebase_path_rewritten_pending,
+       "rebase-merge/rewritten-pending")
+/*
+ * The following files are written by git-rebase just after parsing the
+ * command-line (and are only consumed, not modified, by the sequencer).
+ */
+static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
+static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
+static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
+static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
+static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
+static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
+static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
+static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
+
+static inline int is_rebase_i(const struct replay_opts *opts)
+{
+       return opts->action == REPLAY_INTERACTIVE_REBASE;
+}
 
-       return 0;
+static const char *get_dir(const struct replay_opts *opts)
+{
+       if (is_rebase_i(opts))
+               return rebase_path();
+       return git_path_seq_dir();
 }
 
-static int is_cherry_picked_from_line(const char *buf, int len)
+static const char *get_todo_path(const struct replay_opts *opts)
 {
-       /*
-        * We only care that it looks roughly like (cherry picked from ...)
-        */
-       return len > strlen(cherry_picked_prefix) + 1 &&
-               starts_with(buf, cherry_picked_prefix) && buf[len - 1] == ')';
+       if (is_rebase_i(opts))
+               return rebase_path_todo();
+       return git_path_todo_file();
 }
 
 /*
@@ -59,67 +155,70 @@ static int is_cherry_picked_from_line(const char *buf, int len)
 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
        int ignore_footer)
 {
-       char prev;
-       int i, k;
-       int len = sb->len - ignore_footer;
-       const char *buf = sb->buf;
-       int found_sob = 0;
+       struct trailer_info info;
+       int i;
+       int found_sob = 0, found_sob_last = 0;
 
-       /* footer must end with newline */
-       if (!len || buf[len - 1] != '\n')
-               return 0;
+       trailer_info_get(&info, sb->buf);
 
-       prev = '\0';
-       for (i = len - 1; i > 0; i--) {
-               char ch = buf[i];
-               if (prev == '\n' && ch == '\n') /* paragraph break */
-                       break;
-               prev = ch;
-       }
-
-       /* require at least one blank line */
-       if (prev != '\n' || buf[i] != '\n')
+       if (info.trailer_start == info.trailer_end)
                return 0;
 
-       /* advance to start of last paragraph */
-       while (i < len - 1 && buf[i] == '\n')
-               i++;
-
-       for (; i < len; i = k) {
-               int found_rfc2822;
-
-               for (k = i; k < len && buf[k] != '\n'; k++)
-                       ; /* do nothing */
-               k++;
+       for (i = 0; i < info.trailer_nr; i++)
+               if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
+                       found_sob = 1;
+                       if (i == info.trailer_nr - 1)
+                               found_sob_last = 1;
+               }
 
-               found_rfc2822 = is_rfc2822_line(buf + i, k - i - 1);
-               if (found_rfc2822 && sob &&
-                   !strncmp(buf + i, sob->buf, sob->len))
-                       found_sob = k;
+       trailer_info_release(&info);
 
-               if (!(found_rfc2822 ||
-                     is_cherry_picked_from_line(buf + i, k - i - 1)))
-                       return 0;
-       }
-       if (found_sob == i)
+       if (found_sob_last)
                return 3;
        if (found_sob)
                return 2;
        return 1;
 }
 
-static void remove_sequencer_state(void)
+static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
 {
-       struct strbuf seq_dir = STRBUF_INIT;
+       static struct strbuf buf = STRBUF_INIT;
+
+       strbuf_reset(&buf);
+       if (opts->gpg_sign)
+               sq_quotef(&buf, "-S%s", opts->gpg_sign);
+       return buf.buf;
+}
+
+int sequencer_remove_state(struct replay_opts *opts)
+{
+       struct strbuf dir = STRBUF_INIT;
+       int i;
 
-       strbuf_addstr(&seq_dir, git_path(SEQ_DIR));
-       remove_dir_recursively(&seq_dir, 0);
-       strbuf_release(&seq_dir);
+       free(opts->gpg_sign);
+       free(opts->strategy);
+       for (i = 0; i < opts->xopts_nr; i++)
+               free(opts->xopts[i]);
+       free(opts->xopts);
+
+       strbuf_addf(&dir, "%s", get_dir(opts));
+       remove_dir_recursively(&dir, 0);
+       strbuf_release(&dir);
+
+       return 0;
 }
 
 static const char *action_name(const struct replay_opts *opts)
 {
-       return opts->action == REPLAY_REVERT ? "revert" : "cherry-pick";
+       switch (opts->action) {
+       case REPLAY_REVERT:
+               return N_("revert");
+       case REPLAY_PICK:
+               return N_("cherry-pick");
+       case REPLAY_INTERACTIVE_REBASE:
+               return N_("rebase -i");
+       }
+       die(_("Unknown action: %d"), opts->action);
 }
 
 struct commit_message {
@@ -129,13 +228,18 @@ struct commit_message {
        const char *message;
 };
 
+static const char *short_commit_name(struct commit *commit)
+{
+       return find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV);
+}
+
 static int get_message(struct commit *commit, struct commit_message *out)
 {
        const char *abbrev, *subject;
        int subject_len;
 
        out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
-       abbrev = find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV);
+       abbrev = short_commit_name(commit);
 
        subject_len = find_commit_subject(out->message, &subject);
 
@@ -180,17 +284,62 @@ static void print_advice(int show_hint, struct replay_opts *opts)
        }
 }
 
-static void write_message(struct strbuf *msgbuf, const char *filename)
+static int write_message(const void *buf, size_t len, const char *filename,
+                        int append_eol)
 {
        static struct lock_file msg_file;
 
-       int msg_fd = hold_lock_file_for_update(&msg_file, filename,
-                                              LOCK_DIE_ON_ERROR);
-       if (write_in_full(msg_fd, msgbuf->buf, msgbuf->len) < 0)
-               die_errno(_("Could not write to %s"), filename);
-       strbuf_release(msgbuf);
-       if (commit_lock_file(&msg_file) < 0)
-               die(_("Error wrapping up %s."), filename);
+       int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
+       if (msg_fd < 0)
+               return error_errno(_("could not lock '%s'"), filename);
+       if (write_in_full(msg_fd, buf, len) < 0) {
+               rollback_lock_file(&msg_file);
+               return error_errno(_("could not write to '%s'"), filename);
+       }
+       if (append_eol && write(msg_fd, "\n", 1) < 0) {
+               rollback_lock_file(&msg_file);
+               return error_errno(_("could not write eol to '%s'"), filename);
+       }
+       if (commit_lock_file(&msg_file) < 0) {
+               rollback_lock_file(&msg_file);
+               return error(_("failed to finalize '%s'."), filename);
+       }
+
+       return 0;
+}
+
+/*
+ * Reads a file that was presumably written by a shell script, i.e. with an
+ * end-of-line marker that needs to be stripped.
+ *
+ * Note that only the last end-of-line marker is stripped, consistent with the
+ * behavior of "$(cat path)" in a shell script.
+ *
+ * Returns 1 if the file was read, 0 if it could not be read or does not exist.
+ */
+static int read_oneliner(struct strbuf *buf,
+       const char *path, int skip_if_empty)
+{
+       int orig_len = buf->len;
+
+       if (!file_exists(path))
+               return 0;
+
+       if (strbuf_read_file(buf, path, 0) < 0) {
+               warning_errno(_("could not read '%s'"), path);
+               return 0;
+       }
+
+       if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
+               if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
+                       --buf->len;
+               buf->buf[buf->len] = '\0';
+       }
+
+       if (skip_if_empty && buf->len == orig_len)
+               return 0;
+
+       return 1;
 }
 
 static struct tree *empty_tree(void)
@@ -201,19 +350,30 @@ static struct tree *empty_tree(void)
 static int error_dirty_index(struct replay_opts *opts)
 {
        if (read_cache_unmerged())
-               return error_resolve_conflict(action_name(opts));
+               return error_resolve_conflict(_(action_name(opts)));
 
-       /* Different translation strings for cherry-pick and revert */
-       if (opts->action == REPLAY_PICK)
-               error(_("Your local changes would be overwritten by cherry-pick."));
-       else
-               error(_("Your local changes would be overwritten by revert."));
+       error(_("your local changes would be overwritten by %s."),
+               _(action_name(opts)));
 
        if (advice_commit_before_merge)
-               advise(_("Commit your changes or stash them to proceed."));
+               advise(_("commit your changes or stash them to proceed."));
        return -1;
 }
 
+static void update_abort_safety_file(void)
+{
+       struct object_id head;
+
+       /* Do nothing on a single-pick */
+       if (!file_exists(git_path_seq_dir()))
+               return;
+
+       if (!get_oid("HEAD", &head))
+               write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
+       else
+               write_file(git_path_abort_safety_file(), "%s", "");
+}
+
 static int fast_forward_to(const unsigned char *to, const unsigned char *from,
                        int unborn, struct replay_opts *opts)
 {
@@ -223,9 +383,9 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from,
 
        read_cache();
        if (checkout_fast_forward(from, to, 1))
-               exit(128); /* the callee should have complained already */
+               return -1; /* the callee should have complained already */
 
-       strbuf_addf(&sb, _("%s: fast-forward"), action_name(opts));
+       strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
 
        transaction = ref_transaction_begin(&err);
        if (!transaction ||
@@ -243,6 +403,7 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from,
        strbuf_release(&sb);
        strbuf_release(&err);
        ref_transaction_free(transaction);
+       update_abort_safety_file();
        return 0;
 }
 
@@ -271,10 +432,10 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        struct merge_options o;
        struct tree *result, *next_tree, *base_tree, *head_tree;
        int clean;
-       const char **xopt;
+       char **xopt;
        static struct lock_file index_lock;
 
-       hold_locked_index(&index_lock, 1);
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
 
        read_cache();
 
@@ -282,6 +443,8 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        o.ancestor = base ? base_label : "(empty tree)";
        o.branch1 = "HEAD";
        o.branch2 = next ? next_label : "(empty tree)";
+       if (is_rebase_i(opts))
+               o.buffer_output = 2;
 
        head_tree = parse_tree_indirect(head);
        next_tree = next ? next->tree : empty_tree();
@@ -293,14 +456,20 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        clean = merge_trees(&o,
                            head_tree,
                            next_tree, base_tree, &result);
+       if (is_rebase_i(opts) && clean <= 0)
+               fputs(o.obuf.buf, stdout);
        strbuf_release(&o.obuf);
        if (clean < 0)
                return clean;
 
        if (active_cache_changed &&
            write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
-               /* TRANSLATORS: %s will be "revert" or "cherry-pick" */
-               die(_("%s: Unable to write new index file"), action_name(opts));
+               /*
+                * TRANSLATORS: %s will be "revert", "cherry-pick" or
+                * "rebase -i".
+                */
+               return error(_("%s: Unable to write new index file"),
+                       _(action_name(opts)));
        rollback_lock_file(&index_lock);
 
        if (opts->signoff)
@@ -318,7 +487,7 @@ static int is_index_unchanged(void)
        struct commit *head_commit;
 
        if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
-               return error(_("Could not resolve HEAD commit\n"));
+               return error(_("could not resolve HEAD commit\n"));
 
        head_commit = lookup_commit(head_sha1);
 
@@ -338,51 +507,184 @@ static int is_index_unchanged(void)
 
        if (!cache_tree_fully_valid(active_cache_tree))
                if (cache_tree_update(&the_index, 0))
-                       return error(_("Unable to update cache tree\n"));
+                       return error(_("unable to update cache tree\n"));
 
        return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.oid.hash);
 }
 
+static int write_author_script(const char *message)
+{
+       struct strbuf buf = STRBUF_INIT;
+       const char *eol;
+       int res;
+
+       for (;;)
+               if (!*message || starts_with(message, "\n")) {
+missing_author:
+                       /* Missing 'author' line? */
+                       unlink(rebase_path_author_script());
+                       return 0;
+               } else if (skip_prefix(message, "author ", &message))
+                       break;
+               else if ((eol = strchr(message, '\n')))
+                       message = eol + 1;
+               else
+                       goto missing_author;
+
+       strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
+       while (*message && *message != '\n' && *message != '\r')
+               if (skip_prefix(message, " <", &message))
+                       break;
+               else if (*message != '\'')
+                       strbuf_addch(&buf, *(message++));
+               else
+                       strbuf_addf(&buf, "'\\\\%c'", *(message++));
+       strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
+       while (*message && *message != '\n' && *message != '\r')
+               if (skip_prefix(message, "> ", &message))
+                       break;
+               else if (*message != '\'')
+                       strbuf_addch(&buf, *(message++));
+               else
+                       strbuf_addf(&buf, "'\\\\%c'", *(message++));
+       strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
+       while (*message && *message != '\n' && *message != '\r')
+               if (*message != '\'')
+                       strbuf_addch(&buf, *(message++));
+               else
+                       strbuf_addf(&buf, "'\\\\%c'", *(message++));
+       res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
+       strbuf_release(&buf);
+       return res;
+}
+
+/*
+ * Read a list of environment variable assignments (such as the author-script
+ * file) into an environment block. Returns -1 on error, 0 otherwise.
+ */
+static int read_env_script(struct argv_array *env)
+{
+       struct strbuf script = STRBUF_INIT;
+       int i, count = 0;
+       char *p, *p2;
+
+       if (strbuf_read_file(&script, rebase_path_author_script(), 256) <= 0)
+               return -1;
+
+       for (p = script.buf; *p; p++)
+               if (skip_prefix(p, "'\\\\''", (const char **)&p2))
+                       strbuf_splice(&script, p - script.buf, p2 - p, "'", 1);
+               else if (*p == '\'')
+                       strbuf_splice(&script, p-- - script.buf, 1, "", 0);
+               else if (*p == '\n') {
+                       *p = '\0';
+                       count++;
+               }
+
+       for (i = 0, p = script.buf; i < count; i++) {
+               argv_array_push(env, p);
+               p += strlen(p) + 1;
+       }
+
+       return 0;
+}
+
+static const char staged_changes_advice[] =
+N_("you have staged changes in your working tree\n"
+"If these changes are meant to be squashed into the previous commit, run:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"If they are meant to go into a new commit, run:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n");
+
+#define ALLOW_EMPTY (1<<0)
+#define EDIT_MSG    (1<<1)
+#define AMEND_MSG   (1<<2)
+#define CLEANUP_MSG (1<<3)
+#define VERIFY_MSG  (1<<4)
+
 /*
  * If we are cherry-pick, and if the merge did not result in
  * hand-editing, we will hit this commit and inherit the original
  * author date and name.
+ *
  * If we are revert, or if our cherry-pick results in a hand merge,
  * we had better say that the current user is responsible for that.
+ *
+ * An exception is when run_git_commit() is called during an
+ * interactive rebase: in that case, we will want to retain the
+ * author metadata.
  */
 static int run_git_commit(const char *defmsg, struct replay_opts *opts,
-                         int allow_empty)
+                         unsigned int flags)
 {
-       struct argv_array array;
-       int rc;
+       struct child_process cmd = CHILD_PROCESS_INIT;
        const char *value;
 
-       argv_array_init(&array);
-       argv_array_push(&array, "commit");
-       argv_array_push(&array, "-n");
+       cmd.git_cmd = 1;
 
-       if (opts->gpg_sign)
-               argv_array_pushf(&array, "-S%s", opts->gpg_sign);
-       if (opts->signoff)
-               argv_array_push(&array, "-s");
-       if (!opts->edit) {
-               argv_array_push(&array, "-F");
-               argv_array_push(&array, defmsg);
-               if (!opts->signoff &&
-                   !opts->record_origin &&
-                   git_config_get_value("commit.cleanup", &value))
-                       argv_array_push(&array, "--cleanup=verbatim");
+       if (is_rebase_i(opts)) {
+               if (!(flags & EDIT_MSG)) {
+                       cmd.stdout_to_stderr = 1;
+                       cmd.err = -1;
+               }
+
+               if (read_env_script(&cmd.env_array)) {
+                       const char *gpg_opt = gpg_sign_opt_quoted(opts);
+
+                       return error(_(staged_changes_advice),
+                                    gpg_opt, gpg_opt);
+               }
        }
 
-       if (allow_empty)
-               argv_array_push(&array, "--allow-empty");
+       argv_array_push(&cmd.args, "commit");
+
+       if (!(flags & VERIFY_MSG))
+               argv_array_push(&cmd.args, "-n");
+       if ((flags & AMEND_MSG))
+               argv_array_push(&cmd.args, "--amend");
+       if (opts->gpg_sign)
+               argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
+       if (opts->signoff)
+               argv_array_push(&cmd.args, "-s");
+       if (defmsg)
+               argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
+       if ((flags & CLEANUP_MSG))
+               argv_array_push(&cmd.args, "--cleanup=strip");
+       if ((flags & EDIT_MSG))
+               argv_array_push(&cmd.args, "-e");
+       else if (!(flags & CLEANUP_MSG) &&
+                !opts->signoff && !opts->record_origin &&
+                git_config_get_value("commit.cleanup", &value))
+               argv_array_push(&cmd.args, "--cleanup=verbatim");
+
+       if ((flags & ALLOW_EMPTY))
+               argv_array_push(&cmd.args, "--allow-empty");
 
        if (opts->allow_empty_message)
-               argv_array_push(&array, "--allow-empty-message");
+               argv_array_push(&cmd.args, "--allow-empty-message");
 
-       rc = run_command_v_opt(array.argv, RUN_GIT_CMD);
-       argv_array_clear(&array);
-       return rc;
+       if (cmd.err == -1) {
+               /* hide stderr on success */
+               struct strbuf buf = STRBUF_INIT;
+               int rc = pipe_command(&cmd,
+                                     NULL, 0,
+                                     /* stdout is already redirected */
+                                     NULL, 0,
+                                     &buf, 0);
+               if (rc)
+                       fputs(buf.buf, stderr);
+               strbuf_release(&buf);
+               return rc;
+       }
+
+       return run_command(&cmd);
 }
 
 static int is_original_commit_empty(struct commit *commit)
@@ -390,12 +692,12 @@ static int is_original_commit_empty(struct commit *commit)
        const unsigned char *ptree_sha1;
 
        if (parse_commit(commit))
-               return error(_("Could not parse commit %s\n"),
+               return error(_("could not parse commit %s\n"),
                             oid_to_hex(&commit->object.oid));
        if (commit->parents) {
                struct commit *parent = commit->parents->item;
                if (parse_commit(parent))
-                       return error(_("Could not parse parent commit %s\n"),
+                       return error(_("could not parse parent commit %s\n"),
                                oid_to_hex(&parent->object.oid));
                ptree_sha1 = parent->tree->object.oid.hash;
        } else {
@@ -443,8 +745,196 @@ static int allow_empty(struct replay_opts *opts, struct commit *commit)
                return 1;
 }
 
-static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
+/*
+ * Note that ordering matters in this enum. Not only must it match the mapping
+ * below, it is also divided into several sections that matter.  When adding
+ * new commands, make sure you add it in the right section.
+ */
+enum todo_command {
+       /* commands that handle commits */
+       TODO_PICK = 0,
+       TODO_REVERT,
+       TODO_EDIT,
+       TODO_REWORD,
+       TODO_FIXUP,
+       TODO_SQUASH,
+       /* commands that do something else than handling a single commit */
+       TODO_EXEC,
+       /* commands that do nothing but are counted for reporting progress */
+       TODO_NOOP,
+       TODO_DROP,
+       /* comments (not counted for reporting progress) */
+       TODO_COMMENT
+};
+
+static struct {
+       char c;
+       const char *str;
+} todo_command_info[] = {
+       { 'p', "pick" },
+       { 0,   "revert" },
+       { 'e', "edit" },
+       { 'r', "reword" },
+       { 'f', "fixup" },
+       { 's', "squash" },
+       { 'x', "exec" },
+       { 0,   "noop" },
+       { 'd', "drop" },
+       { 0,   NULL }
+};
+
+static const char *command_to_string(const enum todo_command command)
+{
+       if (command < TODO_COMMENT)
+               return todo_command_info[command].str;
+       die("Unknown command: %d", command);
+}
+
+static int is_noop(const enum todo_command command)
+{
+       return TODO_NOOP <= command;
+}
+
+static int is_fixup(enum todo_command command)
+{
+       return command == TODO_FIXUP || command == TODO_SQUASH;
+}
+
+static int update_squash_messages(enum todo_command command,
+               struct commit *commit, struct replay_opts *opts)
+{
+       struct strbuf buf = STRBUF_INIT;
+       int count, res;
+       const char *message, *body;
+
+       if (file_exists(rebase_path_squash_msg())) {
+               struct strbuf header = STRBUF_INIT;
+               char *eol, *p;
+
+               if (strbuf_read_file(&buf, rebase_path_squash_msg(), 2048) <= 0)
+                       return error(_("could not read '%s'"),
+                               rebase_path_squash_msg());
+
+               p = buf.buf + 1;
+               eol = strchrnul(buf.buf, '\n');
+               if (buf.buf[0] != comment_line_char ||
+                   (p += strcspn(p, "0123456789\n")) == eol)
+                       return error(_("unexpected 1st line of squash message:"
+                                      "\n\n\t%.*s"),
+                                    (int)(eol - buf.buf), buf.buf);
+               count = strtol(p, NULL, 10);
+
+               if (count < 1)
+                       return error(_("invalid 1st line of squash message:\n"
+                                      "\n\t%.*s"),
+                                    (int)(eol - buf.buf), buf.buf);
+
+               strbuf_addf(&header, "%c ", comment_line_char);
+               strbuf_addf(&header,
+                           _("This is a combination of %d commits."), ++count);
+               strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
+               strbuf_release(&header);
+       } else {
+               unsigned char head[20];
+               struct commit *head_commit;
+               const char *head_message, *body;
+
+               if (get_sha1("HEAD", head))
+                       return error(_("need a HEAD to fixup"));
+               if (!(head_commit = lookup_commit_reference(head)))
+                       return error(_("could not read HEAD"));
+               if (!(head_message = get_commit_buffer(head_commit, NULL)))
+                       return error(_("could not read HEAD's commit message"));
+
+               find_commit_subject(head_message, &body);
+               if (write_message(body, strlen(body),
+                                 rebase_path_fixup_msg(), 0)) {
+                       unuse_commit_buffer(head_commit, head_message);
+                       return error(_("cannot write '%s'"),
+                                    rebase_path_fixup_msg());
+               }
+
+               count = 2;
+               strbuf_addf(&buf, "%c ", comment_line_char);
+               strbuf_addf(&buf, _("This is a combination of %d commits."),
+                           count);
+               strbuf_addf(&buf, "\n%c ", comment_line_char);
+               strbuf_addstr(&buf, _("This is the 1st commit message:"));
+               strbuf_addstr(&buf, "\n\n");
+               strbuf_addstr(&buf, body);
+
+               unuse_commit_buffer(head_commit, head_message);
+       }
+
+       if (!(message = get_commit_buffer(commit, NULL)))
+               return error(_("could not read commit message of %s"),
+                            oid_to_hex(&commit->object.oid));
+       find_commit_subject(message, &body);
+
+       if (command == TODO_SQUASH) {
+               unlink(rebase_path_fixup_msg());
+               strbuf_addf(&buf, "\n%c ", comment_line_char);
+               strbuf_addf(&buf, _("This is the commit message #%d:"), count);
+               strbuf_addstr(&buf, "\n\n");
+               strbuf_addstr(&buf, body);
+       } else if (command == TODO_FIXUP) {
+               strbuf_addf(&buf, "\n%c ", comment_line_char);
+               strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
+                           count);
+               strbuf_addstr(&buf, "\n\n");
+               strbuf_add_commented_lines(&buf, body, strlen(body));
+       } else
+               return error(_("unknown command: %d"), command);
+       unuse_commit_buffer(commit, message);
+
+       res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
+       strbuf_release(&buf);
+       return res;
+}
+
+static void flush_rewritten_pending(void) {
+       struct strbuf buf = STRBUF_INIT;
+       unsigned char newsha1[20];
+       FILE *out;
+
+       if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), 82) > 0 &&
+                       !get_sha1("HEAD", newsha1) &&
+                       (out = fopen(rebase_path_rewritten_list(), "a"))) {
+               char *bol = buf.buf, *eol;
+
+               while (*bol) {
+                       eol = strchrnul(bol, '\n');
+                       fprintf(out, "%.*s %s\n", (int)(eol - bol),
+                                       bol, sha1_to_hex(newsha1));
+                       if (!*eol)
+                               break;
+                       bol = eol + 1;
+               }
+               fclose(out);
+               unlink(rebase_path_rewritten_pending());
+       }
+       strbuf_release(&buf);
+}
+
+static void record_in_rewritten(struct object_id *oid,
+               enum todo_command next_command) {
+       FILE *out = fopen(rebase_path_rewritten_pending(), "a");
+
+       if (!out)
+               return;
+
+       fprintf(out, "%s\n", oid_to_hex(oid));
+       fclose(out);
+
+       if (!is_fixup(next_command))
+               flush_rewritten_pending();
+}
+
+static int do_pick_commit(enum todo_command command, struct commit *commit,
+               struct replay_opts *opts, int final_fixup)
 {
+       unsigned int flags = opts->edit ? EDIT_MSG : 0;
+       const char *msg_file = opts->edit ? NULL : git_path_merge_msg();
        unsigned char head[20];
        struct commit *base, *next, *parent;
        const char *base_label, *next_label;
@@ -460,26 +950,25 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                 * to work on.
                 */
                if (write_cache_as_tree(head, 0, NULL))
-                       die (_("Your index file is unmerged."));
+                       return error(_("your index file is unmerged."));
        } else {
                unborn = get_sha1("HEAD", head);
                if (unborn)
                        hashcpy(head, EMPTY_TREE_SHA1_BIN);
-               if (index_differs_from(unborn ? EMPTY_TREE_SHA1_HEX : "HEAD", 0))
+               if (index_differs_from(unborn ? EMPTY_TREE_SHA1_HEX : "HEAD", 0, 0))
                        return error_dirty_index(opts);
        }
        discard_cache();
 
-       if (!commit->parents) {
+       if (!commit->parents)
                parent = NULL;
-       }
        else if (commit->parents->next) {
                /* Reverting or cherry-picking a merge commit */
                int cnt;
                struct commit_list *p;
 
                if (!opts->mainline)
-                       return error(_("Commit %s is a merge but no -m option was given."),
+                       return error(_("commit %s is a merge but no -m option was given."),
                                oid_to_hex(&commit->object.oid));
 
                for (cnt = 1, p = commit->parents;
@@ -487,29 +976,40 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                     cnt++)
                        p = p->next;
                if (cnt != opts->mainline || !p)
-                       return error(_("Commit %s does not have parent %d"),
+                       return error(_("commit %s does not have parent %d"),
                                oid_to_hex(&commit->object.oid), opts->mainline);
                parent = p->item;
        } else if (0 < opts->mainline)
-               return error(_("Mainline was specified but commit %s is not a merge."),
+               return error(_("mainline was specified but commit %s is not a merge."),
                        oid_to_hex(&commit->object.oid));
        else
                parent = commit->parents->item;
 
-       if (opts->allow_ff &&
-           ((parent && !hashcmp(parent->object.oid.hash, head)) ||
-            (!parent && unborn)))
-               return fast_forward_to(commit->object.oid.hash, head, unborn, opts);
+       if (get_message(commit, &msg) != 0)
+               return error(_("cannot get commit message for %s"),
+                       oid_to_hex(&commit->object.oid));
 
+       if (opts->allow_ff && !is_fixup(command) &&
+           ((parent && !hashcmp(parent->object.oid.hash, head)) ||
+            (!parent && unborn))) {
+               if (is_rebase_i(opts))
+                       write_author_script(msg.message);
+               res = fast_forward_to(commit->object.oid.hash, head, unborn,
+                       opts);
+               if (res || command != TODO_REWORD)
+                       goto leave;
+               flags |= EDIT_MSG | AMEND_MSG;
+               if (command == TODO_REWORD)
+                       flags |= VERIFY_MSG;
+               msg_file = NULL;
+               goto fast_forward_edit;
+       }
        if (parent && parse_commit(parent) < 0)
-               /* TRANSLATORS: The first %s will be "revert" or
-                  "cherry-pick", the second %s a SHA1 */
+               /* TRANSLATORS: The first %s will be a "todo" command like
+                  "revert" or "pick", the second %s a SHA1. */
                return error(_("%s: cannot parse parent commit %s"),
-                       action_name(opts), oid_to_hex(&parent->object.oid));
-
-       if (get_message(commit, &msg) != 0)
-               return error(_("Cannot get commit message for %s"),
-                       oid_to_hex(&commit->object.oid));
+                       command_to_string(command),
+                       oid_to_hex(&parent->object.oid));
 
        /*
         * "commit" is an existing commit.  We would want to apply
@@ -518,7 +1018,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
         * reverse of it if we are revert.
         */
 
-       if (opts->action == REPLAY_REVERT) {
+       if (command == TODO_REVERT) {
                base = commit;
                base_label = msg.label;
                next = parent;
@@ -541,16 +1041,12 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                next = commit;
                next_label = msg.label;
 
-               /*
-                * Append the commit log message to msgbuf; it starts
-                * after the tree, parent, author, committer
-                * information followed by "\n\n".
-                */
-               p = strstr(msg.message, "\n\n");
-               if (p)
-                       strbuf_addstr(&msgbuf, skip_blank_lines(p + 2));
+               /* Append the commit log message to msgbuf. */
+               if (find_commit_subject(msg.message, &p))
+                       strbuf_addstr(&msgbuf, p);
 
                if (opts->record_origin) {
+                       strbuf_complete_line(&msgbuf);
                        if (!has_conforming_footer(&msgbuf, NULL, 0))
                                strbuf_addch(&msgbuf, '\n');
                        strbuf_addstr(&msgbuf, cherry_picked_prefix);
@@ -559,25 +1055,54 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                }
        }
 
-       if (!opts->strategy || !strcmp(opts->strategy, "recursive") || opts->action == REPLAY_REVERT) {
+       if (command == TODO_REWORD)
+               flags |= EDIT_MSG | VERIFY_MSG;
+       else if (is_fixup(command)) {
+               if (update_squash_messages(command, commit, opts))
+                       return -1;
+               flags |= AMEND_MSG;
+               if (!final_fixup)
+                       msg_file = rebase_path_squash_msg();
+               else if (file_exists(rebase_path_fixup_msg())) {
+                       flags |= CLEANUP_MSG;
+                       msg_file = rebase_path_fixup_msg();
+               } else {
+                       const char *dest = git_path_squash_msg();
+                       unlink(dest);
+                       if (copy_file(dest, rebase_path_squash_msg(), 0666))
+                               return error(_("could not rename '%s' to '%s'"),
+                                            rebase_path_squash_msg(), dest);
+                       unlink(git_path_merge_msg());
+                       msg_file = dest;
+                       flags |= EDIT_MSG;
+               }
+       }
+
+       if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
+               res = -1;
+       else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
                res = do_recursive_merge(base, next, base_label, next_label,
                                         head, &msgbuf, opts);
                if (res < 0)
                        return res;
-               write_message(&msgbuf, git_path_merge_msg());
+               res |= write_message(msgbuf.buf, msgbuf.len,
+                                    git_path_merge_msg(), 0);
        } else {
                struct commit_list *common = NULL;
                struct commit_list *remotes = NULL;
 
-               write_message(&msgbuf, git_path_merge_msg());
+               res = write_message(msgbuf.buf, msgbuf.len,
+                                   git_path_merge_msg(), 0);
 
                commit_list_insert(base, &common);
                commit_list_insert(next, &remotes);
-               res = try_merge_command(opts->strategy, opts->xopts_nr, opts->xopts,
+               res |= try_merge_command(opts->strategy,
+                                        opts->xopts_nr, (const char **)opts->xopts,
                                        common, sha1_to_hex(head), remotes);
                free_commit_list(common);
                free_commit_list(remotes);
        }
+       strbuf_release(&msgbuf);
 
        /*
         * If the merge was clean or if it failed due to conflict, we write
@@ -585,19 +1110,20 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
         * However, if the merge did not even start, then we don't want to
         * write it at all.
         */
-       if (opts->action == REPLAY_PICK && !opts->no_commit && (res == 0 || res == 1))
-               update_ref(NULL, "CHERRY_PICK_HEAD", commit->object.oid.hash, NULL,
-                          REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
-       if (opts->action == REPLAY_REVERT && ((opts->no_commit && res == 0) || res == 1))
-               update_ref(NULL, "REVERT_HEAD", commit->object.oid.hash, NULL,
-                          REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
+       if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
+           update_ref(NULL, "CHERRY_PICK_HEAD", commit->object.oid.hash, NULL,
+                      REF_NODEREF, UPDATE_REFS_MSG_ON_ERR))
+               res = -1;
+       if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
+           update_ref(NULL, "REVERT_HEAD", commit->object.oid.hash, NULL,
+                      REF_NODEREF, UPDATE_REFS_MSG_ON_ERR))
+               res = -1;
 
        if (res) {
-               error(opts->action == REPLAY_REVERT
+               error(command == TODO_REVERT
                      ? _("could not revert %s... %s")
                      : _("could not apply %s... %s"),
-                     find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV),
-                     msg.subject);
+                     short_commit_name(commit), msg.subject);
                print_advice(res == 1, opts);
                rerere(opts->allow_rerere_auto);
                goto leave;
@@ -607,17 +1133,25 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
        if (allow < 0) {
                res = allow;
                goto leave;
-       }
+       } else if (allow)
+               flags |= ALLOW_EMPTY;
        if (!opts->no_commit)
-               res = run_git_commit(git_path_merge_msg(), opts, allow);
+fast_forward_edit:
+               res = run_git_commit(msg_file, opts, flags);
+
+       if (!res && final_fixup) {
+               unlink(rebase_path_fixup_msg());
+               unlink(rebase_path_squash_msg());
+       }
 
 leave:
        free_message(commit, &msg);
+       update_abort_safety_file();
 
        return res;
 }
 
-static void prepare_revs(struct replay_opts *opts)
+static int prepare_revs(struct replay_opts *opts)
 {
        /*
         * picking (but not reverting) ranges (but not individual revisions)
@@ -627,137 +1161,254 @@ static void prepare_revs(struct replay_opts *opts)
                opts->revs->reverse ^= 1;
 
        if (prepare_revision_walk(opts->revs))
-               die(_("revision walk setup failed"));
+               return error(_("revision walk setup failed"));
 
        if (!opts->revs->commits)
-               die(_("empty commit set passed"));
+               return error(_("empty commit set passed"));
+       return 0;
 }
 
-static void read_and_refresh_cache(struct replay_opts *opts)
+static int read_and_refresh_cache(struct replay_opts *opts)
 {
        static struct lock_file index_lock;
        int index_fd = hold_locked_index(&index_lock, 0);
-       if (read_index_preload(&the_index, NULL) < 0)
-               die(_("git %s: failed to read the index"), action_name(opts));
+       if (read_index_preload(&the_index, NULL) < 0) {
+               rollback_lock_file(&index_lock);
+               return error(_("git %s: failed to read the index"),
+                       _(action_name(opts)));
+       }
        refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
        if (the_index.cache_changed && index_fd >= 0) {
-               if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
-                       die(_("git %s: failed to refresh the index"), action_name(opts));
+               if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) {
+                       rollback_lock_file(&index_lock);
+                       return error(_("git %s: failed to refresh the index"),
+                               _(action_name(opts)));
+               }
        }
        rollback_lock_file(&index_lock);
+       return 0;
 }
 
-static int format_todo(struct strbuf *buf, struct commit_list *todo_list,
-               struct replay_opts *opts)
+struct todo_item {
+       enum todo_command command;
+       struct commit *commit;
+       const char *arg;
+       int arg_len;
+       size_t offset_in_buf;
+};
+
+struct todo_list {
+       struct strbuf buf;
+       struct todo_item *items;
+       int nr, alloc, current;
+       int done_nr, total_nr;
+       struct stat_data stat;
+};
+
+#define TODO_LIST_INIT { STRBUF_INIT }
+
+static void todo_list_release(struct todo_list *todo_list)
 {
-       struct commit_list *cur = NULL;
-       const char *sha1_abbrev = NULL;
-       const char *action_str = opts->action == REPLAY_REVERT ? "revert" : "pick";
-       const char *subject;
-       int subject_len;
+       strbuf_release(&todo_list->buf);
+       free(todo_list->items);
+       todo_list->items = NULL;
+       todo_list->nr = todo_list->alloc = 0;
+}
 
-       for (cur = todo_list; cur; cur = cur->next) {
-               const char *commit_buffer = get_commit_buffer(cur->item, NULL);
-               sha1_abbrev = find_unique_abbrev(cur->item->object.oid.hash, DEFAULT_ABBREV);
-               subject_len = find_commit_subject(commit_buffer, &subject);
-               strbuf_addf(buf, "%s %s %.*s\n", action_str, sha1_abbrev,
-                       subject_len, subject);
-               unuse_commit_buffer(cur->item, commit_buffer);
-       }
-       return 0;
+static struct todo_item *append_new_todo(struct todo_list *todo_list)
+{
+       ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
+       return todo_list->items + todo_list->nr++;
 }
 
-static struct commit *parse_insn_line(char *bol, char *eol, struct replay_opts *opts)
+static int parse_insn_line(struct todo_item *item, const char *bol, char *eol)
 {
        unsigned char commit_sha1[20];
-       enum replay_action action;
        char *end_of_object_name;
-       int saved, status, padding;
-
-       if (starts_with(bol, "pick")) {
-               action = REPLAY_PICK;
-               bol += strlen("pick");
-       } else if (starts_with(bol, "revert")) {
-               action = REPLAY_REVERT;
-               bol += strlen("revert");
-       } else
-               return NULL;
+       int i, saved, status, padding;
+
+       /* left-trim */
+       bol += strspn(bol, " \t");
+
+       if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
+               item->command = TODO_COMMENT;
+               item->commit = NULL;
+               item->arg = bol;
+               item->arg_len = eol - bol;
+               return 0;
+       }
+
+       for (i = 0; i < TODO_COMMENT; i++)
+               if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
+                       item->command = i;
+                       break;
+               } else if (bol[1] == ' ' && *bol == todo_command_info[i].c) {
+                       bol++;
+                       item->command = i;
+                       break;
+               }
+       if (i >= TODO_COMMENT)
+               return -1;
+
+       if (item->command == TODO_NOOP) {
+               item->commit = NULL;
+               item->arg = bol;
+               item->arg_len = eol - bol;
+               return 0;
+       }
 
        /* Eat up extra spaces/ tabs before object name */
        padding = strspn(bol, " \t");
        if (!padding)
-               return NULL;
+               return -1;
        bol += padding;
 
-       end_of_object_name = bol + strcspn(bol, " \t\n");
+       if (item->command == TODO_EXEC) {
+               item->arg = bol;
+               item->arg_len = (int)(eol - bol);
+               return 0;
+       }
+
+       end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
        saved = *end_of_object_name;
        *end_of_object_name = '\0';
        status = get_sha1(bol, commit_sha1);
        *end_of_object_name = saved;
 
-       /*
-        * Verify that the action matches up with the one in
-        * opts; we don't support arbitrary instructions
-        */
-       if (action != opts->action) {
-               if (action == REPLAY_REVERT)
-                     error((opts->action == REPLAY_REVERT)
-                           ? _("Cannot revert during another revert.")
-                           : _("Cannot revert during a cherry-pick."));
-               else
-                     error((opts->action == REPLAY_REVERT)
-                           ? _("Cannot cherry-pick during a revert.")
-                           : _("Cannot cherry-pick during another cherry-pick."));
-               return NULL;
-       }
+       item->arg = end_of_object_name + strspn(end_of_object_name, " \t");
+       item->arg_len = (int)(eol - item->arg);
 
        if (status < 0)
-               return NULL;
+               return -1;
 
-       return lookup_commit_reference(commit_sha1);
+       item->commit = lookup_commit_reference(commit_sha1);
+       return !item->commit;
 }
 
-static int parse_insn_buffer(char *buf, struct commit_list **todo_list,
-                       struct replay_opts *opts)
+static int parse_insn_buffer(char *buf, struct todo_list *todo_list)
 {
-       struct commit_list **next = todo_list;
-       struct commit *commit;
-       char *p = buf;
-       int i;
+       struct todo_item *item;
+       char *p = buf, *next_p;
+       int i, res = 0, fixup_okay = file_exists(rebase_path_done());
 
-       for (i = 1; *p; i++) {
+       for (i = 1; *p; i++, p = next_p) {
                char *eol = strchrnul(p, '\n');
-               commit = parse_insn_line(p, eol, opts);
-               if (!commit)
-                       return error(_("Could not parse line %d."), i);
-               next = commit_list_append(commit, next);
-               p = *eol ? eol + 1 : eol;
+
+               next_p = *eol ? eol + 1 /* skip LF */ : eol;
+
+               if (p != eol && eol[-1] == '\r')
+                       eol--; /* strip Carriage Return */
+
+               item = append_new_todo(todo_list);
+               item->offset_in_buf = p - todo_list->buf.buf;
+               if (parse_insn_line(item, p, eol)) {
+                       res = error(_("invalid line %d: %.*s"),
+                               i, (int)(eol - p), p);
+                       item->command = TODO_NOOP;
+               }
+
+               if (fixup_okay)
+                       ; /* do nothing */
+               else if (is_fixup(item->command))
+                       return error(_("cannot '%s' without a previous commit"),
+                               command_to_string(item->command));
+               else if (!is_noop(item->command))
+                       fixup_okay = 1;
        }
-       if (!*todo_list)
-               return error(_("No commits parsed."));
-       return 0;
+
+       return res;
+}
+
+static int count_commands(struct todo_list *todo_list)
+{
+       int count = 0, i;
+
+       for (i = 0; i < todo_list->nr; i++)
+               if (todo_list->items[i].command != TODO_COMMENT)
+                       count++;
+
+       return count;
 }
 
-static void read_populate_todo(struct commit_list **todo_list,
+static int read_populate_todo(struct todo_list *todo_list,
                        struct replay_opts *opts)
 {
-       struct strbuf buf = STRBUF_INIT;
+       struct stat st;
+       const char *todo_file = get_todo_path(opts);
        int fd, res;
 
-       fd = open(git_path_todo_file(), O_RDONLY);
+       strbuf_reset(&todo_list->buf);
+       fd = open(todo_file, O_RDONLY);
        if (fd < 0)
-               die_errno(_("Could not open %s"), git_path_todo_file());
-       if (strbuf_read(&buf, fd, 0) < 0) {
+               return error_errno(_("could not open '%s'"), todo_file);
+       if (strbuf_read(&todo_list->buf, fd, 0) < 0) {
                close(fd);
-               strbuf_release(&buf);
-               die(_("Could not read %s."), git_path_todo_file());
+               return error(_("could not read '%s'."), todo_file);
        }
        close(fd);
 
-       res = parse_insn_buffer(buf.buf, todo_list, opts);
-       strbuf_release(&buf);
+       res = stat(todo_file, &st);
        if (res)
-               die(_("Unusable instruction sheet: %s"), git_path_todo_file());
+               return error(_("could not stat '%s'"), todo_file);
+       fill_stat_data(&todo_list->stat, &st);
+
+       res = parse_insn_buffer(todo_list->buf.buf, todo_list);
+       if (res) {
+               if (is_rebase_i(opts))
+                       return error(_("please fix this using "
+                                      "'git rebase --edit-todo'."));
+               return error(_("unusable instruction sheet: '%s'"), todo_file);
+       }
+
+       if (!todo_list->nr &&
+           (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
+               return error(_("no commits parsed."));
+
+       if (!is_rebase_i(opts)) {
+               enum todo_command valid =
+                       opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
+               int i;
+
+               for (i = 0; i < todo_list->nr; i++)
+                       if (valid == todo_list->items[i].command)
+                               continue;
+                       else if (valid == TODO_PICK)
+                               return error(_("cannot cherry-pick during a revert."));
+                       else
+                               return error(_("cannot revert during a cherry-pick."));
+       }
+
+       if (is_rebase_i(opts)) {
+               struct todo_list done = TODO_LIST_INIT;
+               FILE *f = fopen(rebase_path_msgtotal(), "w");
+
+               if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
+                               !parse_insn_buffer(done.buf.buf, &done))
+                       todo_list->done_nr = count_commands(&done);
+               else
+                       todo_list->done_nr = 0;
+
+               todo_list->total_nr = todo_list->done_nr
+                       + count_commands(todo_list);
+               todo_list_release(&done);
+
+               if (f) {
+                       fprintf(f, "%d\n", todo_list->total_nr);
+                       fclose(f);
+               }
+       }
+
+       return 0;
+}
+
+static int git_config_string_dup(char **dest,
+                                const char *var, const char *value)
+{
+       if (!value)
+               return config_error_nonbool(var);
+       free(*dest);
+       *dest = xstrdup(value);
+       return 0;
 }
 
 static int populate_opts_cb(const char *key, const char *value, void *data)
@@ -780,40 +1431,106 @@ static int populate_opts_cb(const char *key, const char *value, void *data)
        else if (!strcmp(key, "options.mainline"))
                opts->mainline = git_config_int(key, value);
        else if (!strcmp(key, "options.strategy"))
-               git_config_string(&opts->strategy, key, value);
+               git_config_string_dup(&opts->strategy, key, value);
        else if (!strcmp(key, "options.gpg-sign"))
-               git_config_string(&opts->gpg_sign, key, value);
+               git_config_string_dup(&opts->gpg_sign, key, value);
        else if (!strcmp(key, "options.strategy-option")) {
                ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
                opts->xopts[opts->xopts_nr++] = xstrdup(value);
        } else
-               return error(_("Invalid key: %s"), key);
+               return error(_("invalid key: %s"), key);
 
        if (!error_flag)
-               return error(_("Invalid value for %s: %s"), key, value);
+               return error(_("invalid value for %s: %s"), key, value);
 
        return 0;
 }
 
-static void read_populate_opts(struct replay_opts **opts_ptr)
+static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
 {
-       if (!file_exists(git_path_opts_file()))
+       int i;
+
+       strbuf_reset(buf);
+       if (!read_oneliner(buf, rebase_path_strategy(), 0))
+               return;
+       opts->strategy = strbuf_detach(buf, NULL);
+       if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
                return;
-       if (git_config_from_file(populate_opts_cb, git_path_opts_file(), *opts_ptr) < 0)
-               die(_("Malformed options sheet: %s"), git_path_opts_file());
+
+       opts->xopts_nr = split_cmdline(buf->buf, (const char ***)&opts->xopts);
+       for (i = 0; i < opts->xopts_nr; i++) {
+               const char *arg = opts->xopts[i];
+
+               skip_prefix(arg, "--", &arg);
+               opts->xopts[i] = xstrdup(arg);
+       }
+}
+
+static int read_populate_opts(struct replay_opts *opts)
+{
+       if (is_rebase_i(opts)) {
+               struct strbuf buf = STRBUF_INIT;
+
+               if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
+                       if (!starts_with(buf.buf, "-S"))
+                               strbuf_reset(&buf);
+                       else {
+                               free(opts->gpg_sign);
+                               opts->gpg_sign = xstrdup(buf.buf + 2);
+                       }
+               }
+
+               if (file_exists(rebase_path_verbose()))
+                       opts->verbose = 1;
+
+               read_strategy_opts(opts, &buf);
+               strbuf_release(&buf);
+
+               return 0;
+       }
+
+       if (!file_exists(git_path_opts_file()))
+               return 0;
+       /*
+        * The function git_parse_source(), called from git_config_from_file(),
+        * may die() in case of a syntactically incorrect file. We do not care
+        * about this case, though, because we wrote that file ourselves, so we
+        * are pretty certain that it is syntactically correct.
+        */
+       if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
+               return error(_("malformed options sheet: '%s'"),
+                       git_path_opts_file());
+       return 0;
 }
 
-static void walk_revs_populate_todo(struct commit_list **todo_list,
+static int walk_revs_populate_todo(struct todo_list *todo_list,
                                struct replay_opts *opts)
 {
+       enum todo_command command = opts->action == REPLAY_PICK ?
+               TODO_PICK : TODO_REVERT;
+       const char *command_string = todo_command_info[command].str;
        struct commit *commit;
-       struct commit_list **next;
 
-       prepare_revs(opts);
+       if (prepare_revs(opts))
+               return -1;
 
-       next = todo_list;
-       while ((commit = get_revision(opts->revs)))
-               next = commit_list_append(commit, next);
+       while ((commit = get_revision(opts->revs))) {
+               struct todo_item *item = append_new_todo(todo_list);
+               const char *commit_buffer = get_commit_buffer(commit, NULL);
+               const char *subject;
+               int subject_len;
+
+               item->command = command;
+               item->commit = commit;
+               item->arg = NULL;
+               item->arg_len = 0;
+               item->offset_in_buf = todo_list->buf.len;
+               subject_len = find_commit_subject(commit_buffer, &subject);
+               strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
+                       short_commit_name(commit), subject_len, subject);
+               unuse_commit_buffer(commit, commit_buffer);
+       }
+       return 0;
 }
 
 static int create_seq_dir(void)
@@ -822,30 +1539,64 @@ static int create_seq_dir(void)
                error(_("a cherry-pick or revert is already in progress"));
                advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
                return -1;
-       }
-       else if (mkdir(git_path_seq_dir(), 0777) < 0)
-               die_errno(_("Could not create sequencer directory %s"),
-                         git_path_seq_dir());
+       } else if (mkdir(git_path_seq_dir(), 0777) < 0)
+               return error_errno(_("could not create sequencer directory '%s'"),
+                                  git_path_seq_dir());
        return 0;
 }
 
-static void save_head(const char *head)
+static int save_head(const char *head)
 {
        static struct lock_file head_lock;
        struct strbuf buf = STRBUF_INIT;
        int fd;
 
-       fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), LOCK_DIE_ON_ERROR);
+       fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
+       if (fd < 0) {
+               rollback_lock_file(&head_lock);
+               return error_errno(_("could not lock HEAD"));
+       }
        strbuf_addf(&buf, "%s\n", head);
-       if (write_in_full(fd, buf.buf, buf.len) < 0)
-               die_errno(_("Could not write to %s"), git_path_head_file());
-       if (commit_lock_file(&head_lock) < 0)
-               die(_("Error wrapping up %s."), git_path_head_file());
+       if (write_in_full(fd, buf.buf, buf.len) < 0) {
+               rollback_lock_file(&head_lock);
+               return error_errno(_("could not write to '%s'"),
+                                  git_path_head_file());
+       }
+       if (commit_lock_file(&head_lock) < 0) {
+               rollback_lock_file(&head_lock);
+               return error(_("failed to finalize '%s'."), git_path_head_file());
+       }
+       return 0;
+}
+
+static int rollback_is_safe(void)
+{
+       struct strbuf sb = STRBUF_INIT;
+       struct object_id expected_head, actual_head;
+
+       if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
+               strbuf_trim(&sb);
+               if (get_oid_hex(sb.buf, &expected_head)) {
+                       strbuf_release(&sb);
+                       die(_("could not parse %s"), git_path_abort_safety_file());
+               }
+               strbuf_release(&sb);
+       }
+       else if (errno == ENOENT)
+               oidclr(&expected_head);
+       else
+               die_errno(_("could not read '%s'"), git_path_abort_safety_file());
+
+       if (get_oid("HEAD", &actual_head))
+               oidclr(&actual_head);
+
+       return !oidcmp(&actual_head, &expected_head);
 }
 
 static int reset_for_rollback(const unsigned char *sha1)
 {
        const char *argv[4];    /* reset --merge <arg> + NULL */
+
        argv[0] = "reset";
        argv[1] = "--merge";
        argv[2] = sha1_to_hex(sha1);
@@ -867,7 +1618,7 @@ static int rollback_single_pick(void)
        return reset_for_rollback(head_sha1);
 }
 
-static int sequencer_rollback(struct replay_opts *opts)
+int sequencer_rollback(struct replay_opts *opts)
 {
        FILE *f;
        unsigned char sha1[20];
@@ -883,9 +1634,9 @@ static int sequencer_rollback(struct replay_opts *opts)
                return rollback_single_pick();
        }
        if (!f)
-               return error_errno(_("cannot open %s"), git_path_head_file());
+               return error_errno(_("cannot open '%s'"), git_path_head_file());
        if (strbuf_getline_lf(&buf, f)) {
-               error(_("cannot read %s: %s"), git_path_head_file(),
+               error(_("cannot read '%s': %s"), git_path_head_file(),
                      ferror(f) ?  strerror(errno) : _("unexpected end of file"));
                fclose(f);
                goto fail;
@@ -900,93 +1651,531 @@ static int sequencer_rollback(struct replay_opts *opts)
                error(_("cannot abort from a branch yet to be born"));
                goto fail;
        }
+
+       if (!rollback_is_safe()) {
+               /* Do not error, just do not rollback */
+               warning(_("You seem to have moved HEAD. "
+                         "Not rewinding, check your HEAD!"));
+       } else
        if (reset_for_rollback(sha1))
                goto fail;
-       remove_sequencer_state();
        strbuf_release(&buf);
-       return 0;
+       return sequencer_remove_state(opts);
 fail:
        strbuf_release(&buf);
        return -1;
 }
 
-static void save_todo(struct commit_list *todo_list, struct replay_opts *opts)
+static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
 {
        static struct lock_file todo_lock;
-       struct strbuf buf = STRBUF_INIT;
-       int fd;
+       const char *todo_path = get_todo_path(opts);
+       int next = todo_list->current, offset, fd;
 
-       fd = hold_lock_file_for_update(&todo_lock, git_path_todo_file(), LOCK_DIE_ON_ERROR);
-       if (format_todo(&buf, todo_list, opts) < 0)
-               die(_("Could not format %s."), git_path_todo_file());
-       if (write_in_full(fd, buf.buf, buf.len) < 0) {
-               strbuf_release(&buf);
-               die_errno(_("Could not write to %s"), git_path_todo_file());
-       }
-       if (commit_lock_file(&todo_lock) < 0) {
-               strbuf_release(&buf);
-               die(_("Error wrapping up %s."), git_path_todo_file());
+       /*
+        * rebase -i writes "git-rebase-todo" without the currently executing
+        * command, appending it to "done" instead.
+        */
+       if (is_rebase_i(opts))
+               next++;
+
+       fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
+       if (fd < 0)
+               return error_errno(_("could not lock '%s'"), todo_path);
+       offset = next < todo_list->nr ?
+               todo_list->items[next].offset_in_buf : todo_list->buf.len;
+       if (write_in_full(fd, todo_list->buf.buf + offset,
+                       todo_list->buf.len - offset) < 0)
+               return error_errno(_("could not write to '%s'"), todo_path);
+       if (commit_lock_file(&todo_lock) < 0)
+               return error(_("failed to finalize '%s'."), todo_path);
+
+       if (is_rebase_i(opts)) {
+               const char *done_path = rebase_path_done();
+               int fd = open(done_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
+               int prev_offset = !next ? 0 :
+                       todo_list->items[next - 1].offset_in_buf;
+
+               if (fd >= 0 && offset > prev_offset &&
+                   write_in_full(fd, todo_list->buf.buf + prev_offset,
+                                 offset - prev_offset) < 0) {
+                       close(fd);
+                       return error_errno(_("could not write to '%s'"),
+                                          done_path);
+               }
+               if (fd >= 0)
+                       close(fd);
        }
-       strbuf_release(&buf);
+       return 0;
 }
 
-static void save_opts(struct replay_opts *opts)
+static int save_opts(struct replay_opts *opts)
 {
        const char *opts_file = git_path_opts_file();
+       int res = 0;
 
        if (opts->no_commit)
-               git_config_set_in_file(opts_file, "options.no-commit", "true");
+               res |= git_config_set_in_file_gently(opts_file, "options.no-commit", "true");
        if (opts->edit)
-               git_config_set_in_file(opts_file, "options.edit", "true");
+               res |= git_config_set_in_file_gently(opts_file, "options.edit", "true");
        if (opts->signoff)
-               git_config_set_in_file(opts_file, "options.signoff", "true");
+               res |= git_config_set_in_file_gently(opts_file, "options.signoff", "true");
        if (opts->record_origin)
-               git_config_set_in_file(opts_file, "options.record-origin", "true");
+               res |= git_config_set_in_file_gently(opts_file, "options.record-origin", "true");
        if (opts->allow_ff)
-               git_config_set_in_file(opts_file, "options.allow-ff", "true");
+               res |= git_config_set_in_file_gently(opts_file, "options.allow-ff", "true");
        if (opts->mainline) {
                struct strbuf buf = STRBUF_INIT;
                strbuf_addf(&buf, "%d", opts->mainline);
-               git_config_set_in_file(opts_file, "options.mainline", buf.buf);
+               res |= git_config_set_in_file_gently(opts_file, "options.mainline", buf.buf);
                strbuf_release(&buf);
        }
        if (opts->strategy)
-               git_config_set_in_file(opts_file, "options.strategy", opts->strategy);
+               res |= git_config_set_in_file_gently(opts_file, "options.strategy", opts->strategy);
        if (opts->gpg_sign)
-               git_config_set_in_file(opts_file, "options.gpg-sign", opts->gpg_sign);
+               res |= git_config_set_in_file_gently(opts_file, "options.gpg-sign", opts->gpg_sign);
        if (opts->xopts) {
                int i;
                for (i = 0; i < opts->xopts_nr; i++)
-                       git_config_set_multivar_in_file(opts_file,
+                       res |= git_config_set_multivar_in_file_gently(opts_file,
                                                        "options.strategy-option",
                                                        opts->xopts[i], "^$", 0);
        }
+       return res;
 }
 
-static int pick_commits(struct commit_list *todo_list, struct replay_opts *opts)
+static int make_patch(struct commit *commit, struct replay_opts *opts)
 {
-       struct commit_list *cur;
-       int res;
+       struct strbuf buf = STRBUF_INIT;
+       struct rev_info log_tree_opt;
+       const char *subject, *p;
+       int res = 0;
+
+       p = short_commit_name(commit);
+       if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
+               return -1;
+
+       strbuf_addf(&buf, "%s/patch", get_dir(opts));
+       memset(&log_tree_opt, 0, sizeof(log_tree_opt));
+       init_revisions(&log_tree_opt, NULL);
+       log_tree_opt.abbrev = 0;
+       log_tree_opt.diff = 1;
+       log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
+       log_tree_opt.disable_stdin = 1;
+       log_tree_opt.no_commit_id = 1;
+       log_tree_opt.diffopt.file = fopen(buf.buf, "w");
+       log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
+       if (!log_tree_opt.diffopt.file)
+               res |= error_errno(_("could not open '%s'"), buf.buf);
+       else {
+               res |= log_tree_commit(&log_tree_opt, commit);
+               fclose(log_tree_opt.diffopt.file);
+       }
+       strbuf_reset(&buf);
+
+       strbuf_addf(&buf, "%s/message", get_dir(opts));
+       if (!file_exists(buf.buf)) {
+               const char *commit_buffer = get_commit_buffer(commit, NULL);
+               find_commit_subject(commit_buffer, &subject);
+               res |= write_message(subject, strlen(subject), buf.buf, 1);
+               unuse_commit_buffer(commit, commit_buffer);
+       }
+       strbuf_release(&buf);
+
+       return res;
+}
+
+static int intend_to_amend(void)
+{
+       unsigned char head[20];
+       char *p;
+
+       if (get_sha1("HEAD", head))
+               return error(_("cannot read HEAD"));
+
+       p = sha1_to_hex(head);
+       return write_message(p, strlen(p), rebase_path_amend(), 1);
+}
+
+static int error_with_patch(struct commit *commit,
+       const char *subject, int subject_len,
+       struct replay_opts *opts, int exit_code, int to_amend)
+{
+       if (make_patch(commit, opts))
+               return -1;
+
+       if (to_amend) {
+               if (intend_to_amend())
+                       return -1;
+
+               fprintf(stderr, "You can amend the commit now, with\n"
+                       "\n"
+                       "  git commit --amend %s\n"
+                       "\n"
+                       "Once you are satisfied with your changes, run\n"
+                       "\n"
+                       "  git rebase --continue\n", gpg_sign_opt_quoted(opts));
+       } else if (exit_code)
+               fprintf(stderr, "Could not apply %s... %.*s\n",
+                       short_commit_name(commit), subject_len, subject);
+
+       return exit_code;
+}
+
+static int error_failed_squash(struct commit *commit,
+       struct replay_opts *opts, int subject_len, const char *subject)
+{
+       if (rename(rebase_path_squash_msg(), rebase_path_message()))
+               return error(_("could not rename '%s' to '%s'"),
+                       rebase_path_squash_msg(), rebase_path_message());
+       unlink(rebase_path_fixup_msg());
+       unlink(git_path_merge_msg());
+       if (copy_file(git_path_merge_msg(), rebase_path_message(), 0666))
+               return error(_("could not copy '%s' to '%s'"),
+                            rebase_path_message(), git_path_merge_msg());
+       return error_with_patch(commit, subject, subject_len, opts, 1, 0);
+}
+
+static int do_exec(const char *command_line)
+{
+       const char *child_argv[] = { NULL, NULL };
+       int dirty, status;
+
+       fprintf(stderr, "Executing: %s\n", command_line);
+       child_argv[0] = command_line;
+       status = run_command_v_opt(child_argv, RUN_USING_SHELL);
+
+       /* force re-reading of the cache */
+       if (discard_cache() < 0 || read_cache() < 0)
+               return error(_("could not read index"));
+
+       dirty = require_clean_work_tree("rebase", NULL, 1, 1);
+
+       if (status) {
+               warning(_("execution failed: %s\n%s"
+                         "You can fix the problem, and then run\n"
+                         "\n"
+                         "  git rebase --continue\n"
+                         "\n"),
+                       command_line,
+                       dirty ? N_("and made changes to the index and/or the "
+                               "working tree\n") : "");
+               if (status == 127)
+                       /* command not found */
+                       status = 1;
+       } else if (dirty) {
+               warning(_("execution succeeded: %s\nbut "
+                         "left changes to the index and/or the working tree\n"
+                         "Commit or stash your changes, and then run\n"
+                         "\n"
+                         "  git rebase --continue\n"
+                         "\n"), command_line);
+               status = 1;
+       }
+
+       return status;
+}
+
+static int is_final_fixup(struct todo_list *todo_list)
+{
+       int i = todo_list->current;
+
+       if (!is_fixup(todo_list->items[i].command))
+               return 0;
+
+       while (++i < todo_list->nr)
+               if (is_fixup(todo_list->items[i].command))
+                       return 0;
+               else if (!is_noop(todo_list->items[i].command))
+                       break;
+       return 1;
+}
+
+static enum todo_command peek_command(struct todo_list *todo_list, int offset)
+{
+       int i;
+
+       for (i = todo_list->current + offset; i < todo_list->nr; i++)
+               if (!is_noop(todo_list->items[i].command))
+                       return todo_list->items[i].command;
+
+       return -1;
+}
+
+static int apply_autostash(struct replay_opts *opts)
+{
+       struct strbuf stash_sha1 = STRBUF_INIT;
+       struct child_process child = CHILD_PROCESS_INIT;
+       int ret = 0;
+
+       if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
+               strbuf_release(&stash_sha1);
+               return 0;
+       }
+       strbuf_trim(&stash_sha1);
+
+       child.git_cmd = 1;
+       child.no_stdout = 1;
+       child.no_stderr = 1;
+       argv_array_push(&child.args, "stash");
+       argv_array_push(&child.args, "apply");
+       argv_array_push(&child.args, stash_sha1.buf);
+       if (!run_command(&child))
+               fprintf(stderr, _("Applied autostash.\n"));
+       else {
+               struct child_process store = CHILD_PROCESS_INIT;
+
+               store.git_cmd = 1;
+               argv_array_push(&store.args, "stash");
+               argv_array_push(&store.args, "store");
+               argv_array_push(&store.args, "-m");
+               argv_array_push(&store.args, "autostash");
+               argv_array_push(&store.args, "-q");
+               argv_array_push(&store.args, stash_sha1.buf);
+               if (run_command(&store))
+                       ret = error(_("cannot store %s"), stash_sha1.buf);
+               else
+                       fprintf(stderr,
+                               _("Applying autostash resulted in conflicts.\n"
+                                 "Your changes are safe in the stash.\n"
+                                 "You can run \"git stash pop\" or"
+                                 " \"git stash drop\" at any time.\n"));
+       }
+
+       strbuf_release(&stash_sha1);
+       return ret;
+}
+
+static const char *reflog_message(struct replay_opts *opts,
+       const char *sub_action, const char *fmt, ...)
+{
+       va_list ap;
+       static struct strbuf buf = STRBUF_INIT;
+
+       va_start(ap, fmt);
+       strbuf_reset(&buf);
+       strbuf_addstr(&buf, action_name(opts));
+       if (sub_action)
+               strbuf_addf(&buf, " (%s)", sub_action);
+       if (fmt) {
+               strbuf_addstr(&buf, ": ");
+               strbuf_vaddf(&buf, fmt, ap);
+       }
+       va_end(ap);
+
+       return buf.buf;
+}
+
+static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
+{
+       int res = 0;
 
        setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
        if (opts->allow_ff)
                assert(!(opts->signoff || opts->no_commit ||
                                opts->record_origin || opts->edit));
-       read_and_refresh_cache(opts);
+       if (read_and_refresh_cache(opts))
+               return -1;
+
+       while (todo_list->current < todo_list->nr) {
+               struct todo_item *item = todo_list->items + todo_list->current;
+               if (save_todo(todo_list, opts))
+                       return -1;
+               if (is_rebase_i(opts)) {
+                       if (item->command != TODO_COMMENT) {
+                               FILE *f = fopen(rebase_path_msgnum(), "w");
+
+                               todo_list->done_nr++;
+
+                               if (f) {
+                                       fprintf(f, "%d\n", todo_list->done_nr);
+                                       fclose(f);
+                               }
+                               fprintf(stderr, "Rebasing (%d/%d)%s",
+                                       todo_list->done_nr,
+                                       todo_list->total_nr,
+                                       opts->verbose ? "\n" : "\r");
+                       }
+                       unlink(rebase_path_message());
+                       unlink(rebase_path_author_script());
+                       unlink(rebase_path_stopped_sha());
+                       unlink(rebase_path_amend());
+               }
+               if (item->command <= TODO_SQUASH) {
+                       if (is_rebase_i(opts))
+                               setenv("GIT_REFLOG_ACTION", reflog_message(opts,
+                                       command_to_string(item->command), NULL),
+                                       1);
+                       res = do_pick_commit(item->command, item->commit,
+                                       opts, is_final_fixup(todo_list));
+                       if (is_rebase_i(opts) && res < 0) {
+                               /* Reschedule */
+                               todo_list->current--;
+                               if (save_todo(todo_list, opts))
+                                       return -1;
+                       }
+                       if (item->command == TODO_EDIT) {
+                               struct commit *commit = item->commit;
+                               if (!res)
+                                       fprintf(stderr,
+                                               _("Stopped at %s...  %.*s\n"),
+                                               short_commit_name(commit),
+                                               item->arg_len, item->arg);
+                               return error_with_patch(commit,
+                                       item->arg, item->arg_len, opts, res,
+                                       !res);
+                       }
+                       if (is_rebase_i(opts) && !res)
+                               record_in_rewritten(&item->commit->object.oid,
+                                       peek_command(todo_list, 1));
+                       if (res && is_fixup(item->command)) {
+                               if (res == 1)
+                                       intend_to_amend();
+                               return error_failed_squash(item->commit, opts,
+                                       item->arg_len, item->arg);
+                       } else if (res && is_rebase_i(opts))
+                               return res | error_with_patch(item->commit,
+                                       item->arg, item->arg_len, opts, res,
+                                       item->command == TODO_REWORD);
+               } else if (item->command == TODO_EXEC) {
+                       char *end_of_arg = (char *)(item->arg + item->arg_len);
+                       int saved = *end_of_arg;
+                       struct stat st;
+
+                       *end_of_arg = '\0';
+                       res = do_exec(item->arg);
+                       *end_of_arg = saved;
+
+                       /* Reread the todo file if it has changed. */
+                       if (res)
+                               ; /* fall through */
+                       else if (stat(get_todo_path(opts), &st))
+                               res = error_errno(_("could not stat '%s'"),
+                                                 get_todo_path(opts));
+                       else if (match_stat_data(&todo_list->stat, &st)) {
+                               todo_list_release(todo_list);
+                               if (read_populate_todo(todo_list, opts))
+                                       res = -1; /* message was printed */
+                               /* `current` will be incremented below */
+                               todo_list->current = -1;
+                       }
+               } else if (!is_noop(item->command))
+                       return error(_("unknown command %d"), item->command);
 
-       for (cur = todo_list; cur; cur = cur->next) {
-               save_todo(cur, opts);
-               res = do_pick_commit(cur->item, opts);
+               todo_list->current++;
                if (res)
                        return res;
        }
 
+       if (is_rebase_i(opts)) {
+               struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
+               struct stat st;
+
+               /* Stopped in the middle, as planned? */
+               if (todo_list->current < todo_list->nr)
+                       return 0;
+
+               if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
+                               starts_with(head_ref.buf, "refs/")) {
+                       const char *msg;
+                       unsigned char head[20], orig[20];
+                       int res;
+
+                       if (get_sha1("HEAD", head)) {
+                               res = error(_("cannot read HEAD"));
+cleanup_head_ref:
+                               strbuf_release(&head_ref);
+                               strbuf_release(&buf);
+                               return res;
+                       }
+                       if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
+                                       get_sha1_hex(buf.buf, orig)) {
+                               res = error(_("could not read orig-head"));
+                               goto cleanup_head_ref;
+                       }
+                       strbuf_reset(&buf);
+                       if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
+                               res = error(_("could not read 'onto'"));
+                               goto cleanup_head_ref;
+                       }
+                       msg = reflog_message(opts, "finish", "%s onto %s",
+                               head_ref.buf, buf.buf);
+                       if (update_ref(msg, head_ref.buf, head, orig,
+                                       REF_NODEREF, UPDATE_REFS_MSG_ON_ERR)) {
+                               res = error(_("could not update %s"),
+                                       head_ref.buf);
+                               goto cleanup_head_ref;
+                       }
+                       msg = reflog_message(opts, "finish", "returning to %s",
+                               head_ref.buf);
+                       if (create_symref("HEAD", head_ref.buf, msg)) {
+                               res = error(_("could not update HEAD to %s"),
+                                       head_ref.buf);
+                               goto cleanup_head_ref;
+                       }
+                       strbuf_reset(&buf);
+               }
+
+               if (opts->verbose) {
+                       struct rev_info log_tree_opt;
+                       struct object_id orig, head;
+
+                       memset(&log_tree_opt, 0, sizeof(log_tree_opt));
+                       init_revisions(&log_tree_opt, NULL);
+                       log_tree_opt.diff = 1;
+                       log_tree_opt.diffopt.output_format =
+                               DIFF_FORMAT_DIFFSTAT;
+                       log_tree_opt.disable_stdin = 1;
+
+                       if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
+                           !get_sha1(buf.buf, orig.hash) &&
+                           !get_sha1("HEAD", head.hash)) {
+                               diff_tree_sha1(orig.hash, head.hash,
+                                              "", &log_tree_opt.diffopt);
+                               log_tree_diff_flush(&log_tree_opt);
+                       }
+               }
+               flush_rewritten_pending();
+               if (!stat(rebase_path_rewritten_list(), &st) &&
+                               st.st_size > 0) {
+                       struct child_process child = CHILD_PROCESS_INIT;
+                       const char *post_rewrite_hook =
+                               find_hook("post-rewrite");
+
+                       child.in = open(rebase_path_rewritten_list(), O_RDONLY);
+                       child.git_cmd = 1;
+                       argv_array_push(&child.args, "notes");
+                       argv_array_push(&child.args, "copy");
+                       argv_array_push(&child.args, "--for-rewrite=rebase");
+                       /* we don't care if this copying failed */
+                       run_command(&child);
+
+                       if (post_rewrite_hook) {
+                               struct child_process hook = CHILD_PROCESS_INIT;
+
+                               hook.in = open(rebase_path_rewritten_list(),
+                                       O_RDONLY);
+                               hook.stdout_to_stderr = 1;
+                               argv_array_push(&hook.args, post_rewrite_hook);
+                               argv_array_push(&hook.args, "rebase");
+                               /* we don't care if this hook failed */
+                               run_command(&hook);
+                       }
+               }
+               apply_autostash(opts);
+
+               fprintf(stderr, "Successfully rebased and updated %s.\n",
+                       head_ref.buf);
+
+               strbuf_release(&buf);
+               strbuf_release(&head_ref);
+       }
+
        /*
         * Sequence of picks finished successfully; cleanup by
         * removing the .git/sequencer directory
         */
-       remove_sequencer_state();
-       return 0;
+       return sequencer_remove_state(opts);
 }
 
 static int continue_single_pick(void)
@@ -999,58 +2188,110 @@ static int continue_single_pick(void)
        return run_command_v_opt(argv, RUN_GIT_CMD);
 }
 
-static int sequencer_continue(struct replay_opts *opts)
+static int commit_staged_changes(struct replay_opts *opts)
 {
-       struct commit_list *todo_list = NULL;
+       unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
+
+       if (has_unstaged_changes(1))
+               return error(_("cannot rebase: You have unstaged changes."));
+       if (!has_uncommitted_changes(0)) {
+               const char *cherry_pick_head = git_path_cherry_pick_head();
+
+               if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
+                       return error(_("could not remove CHERRY_PICK_HEAD"));
+               return 0;
+       }
+
+       if (file_exists(rebase_path_amend())) {
+               struct strbuf rev = STRBUF_INIT;
+               unsigned char head[20], to_amend[20];
+
+               if (get_sha1("HEAD", head))
+                       return error(_("cannot amend non-existing commit"));
+               if (!read_oneliner(&rev, rebase_path_amend(), 0))
+                       return error(_("invalid file: '%s'"), rebase_path_amend());
+               if (get_sha1_hex(rev.buf, to_amend))
+                       return error(_("invalid contents: '%s'"),
+                               rebase_path_amend());
+               if (hashcmp(head, to_amend))
+                       return error(_("\nYou have uncommitted changes in your "
+                                      "working tree. Please, commit them\n"
+                                      "first and then run 'git rebase "
+                                      "--continue' again."));
+
+               strbuf_release(&rev);
+               flags |= AMEND_MSG;
+       }
+
+       if (run_git_commit(rebase_path_message(), opts, flags))
+               return error(_("could not commit staged changes."));
+       unlink(rebase_path_amend());
+       return 0;
+}
 
-       if (!file_exists(git_path_todo_file()))
+int sequencer_continue(struct replay_opts *opts)
+{
+       struct todo_list todo_list = TODO_LIST_INIT;
+       int res;
+
+       if (read_and_refresh_cache(opts))
+               return -1;
+
+       if (is_rebase_i(opts)) {
+               if (commit_staged_changes(opts))
+                       return -1;
+       } else if (!file_exists(get_todo_path(opts)))
                return continue_single_pick();
-       read_populate_opts(&opts);
-       read_populate_todo(&todo_list, opts);
-
-       /* Verify that the conflict has been resolved */
-       if (file_exists(git_path_cherry_pick_head()) ||
-           file_exists(git_path_revert_head())) {
-               int ret = continue_single_pick();
-               if (ret)
-                       return ret;
+       if (read_populate_opts(opts))
+               return -1;
+       if ((res = read_populate_todo(&todo_list, opts)))
+               goto release_todo_list;
+
+       if (!is_rebase_i(opts)) {
+               /* Verify that the conflict has been resolved */
+               if (file_exists(git_path_cherry_pick_head()) ||
+                   file_exists(git_path_revert_head())) {
+                       res = continue_single_pick();
+                       if (res)
+                               goto release_todo_list;
+               }
+               if (index_differs_from("HEAD", 0, 0)) {
+                       res = error_dirty_index(opts);
+                       goto release_todo_list;
+               }
+               todo_list.current++;
+       } else if (file_exists(rebase_path_stopped_sha())) {
+               struct strbuf buf = STRBUF_INIT;
+               struct object_id oid;
+
+               if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
+                   !get_sha1_committish(buf.buf, oid.hash))
+                       record_in_rewritten(&oid, peek_command(&todo_list, 0));
+               strbuf_release(&buf);
        }
-       if (index_differs_from("HEAD", 0))
-               return error_dirty_index(opts);
-       todo_list = todo_list->next;
-       return pick_commits(todo_list, opts);
+
+       res = pick_commits(&todo_list, opts);
+release_todo_list:
+       todo_list_release(&todo_list);
+       return res;
 }
 
 static int single_pick(struct commit *cmit, struct replay_opts *opts)
 {
        setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
-       return do_pick_commit(cmit, opts);
+       return do_pick_commit(opts->action == REPLAY_PICK ?
+               TODO_PICK : TODO_REVERT, cmit, opts, 0);
 }
 
 int sequencer_pick_revisions(struct replay_opts *opts)
 {
-       struct commit_list *todo_list = NULL;
+       struct todo_list todo_list = TODO_LIST_INIT;
        unsigned char sha1[20];
-       int i;
+       int i, res;
 
-       if (opts->subcommand == REPLAY_NONE)
-               assert(opts->revs);
-
-       read_and_refresh_cache(opts);
-
-       /*
-        * Decide what to do depending on the arguments; a fresh
-        * cherry-pick should be handled differently from an existing
-        * one that is being continued
-        */
-       if (opts->subcommand == REPLAY_REMOVE_STATE) {
-               remove_sequencer_state();
-               return 0;
-       }
-       if (opts->subcommand == REPLAY_ROLLBACK)
-               return sequencer_rollback(opts);
-       if (opts->subcommand == REPLAY_CONTINUE)
-               return sequencer_continue(opts);
+       assert(opts->revs);
+       if (read_and_refresh_cache(opts))
+               return -1;
 
        for (i = 0; i < opts->revs->pending.nr; i++) {
                unsigned char sha1[20];
@@ -1063,10 +2304,11 @@ int sequencer_pick_revisions(struct replay_opts *opts)
                if (!get_sha1(name, sha1)) {
                        if (!lookup_commit_reference_gently(sha1, 1)) {
                                enum object_type type = sha1_object_info(sha1, NULL);
-                               die(_("%s: can't cherry-pick a %s"), name, typename(type));
+                               return error(_("%s: can't cherry-pick a %s"),
+                                       name, typename(type));
                        }
                } else
-                       die(_("%s: bad revision"), name);
+                       return error(_("%s: bad revision"), name);
        }
 
        /*
@@ -1082,10 +2324,10 @@ int sequencer_pick_revisions(struct replay_opts *opts)
            !opts->revs->cmdline.rev->flags) {
                struct commit *cmit;
                if (prepare_revision_walk(opts->revs))
-                       die(_("revision walk setup failed"));
+                       return error(_("revision walk setup failed"));
                cmit = get_revision(opts->revs);
                if (!cmit || get_revision(opts->revs))
-                       die("BUG: expected exactly one commit from walk");
+                       return error("BUG: expected exactly one commit from walk");
                return single_pick(cmit, opts);
        }
 
@@ -1095,14 +2337,19 @@ int sequencer_pick_revisions(struct replay_opts *opts)
         * progress
         */
 
-       walk_revs_populate_todo(&todo_list, opts);
-       if (create_seq_dir() < 0)
+       if (walk_revs_populate_todo(&todo_list, opts) ||
+                       create_seq_dir() < 0)
                return -1;
        if (get_sha1("HEAD", sha1) && (opts->action == REPLAY_REVERT))
-               return error(_("Can't revert as initial commit"));
-       save_head(sha1_to_hex(sha1));
-       save_opts(opts);
-       return pick_commits(todo_list, opts);
+               return error(_("can't revert as initial commit"));
+       if (save_head(sha1_to_hex(sha1)))
+               return -1;
+       if (save_opts(opts))
+               return -1;
+       update_abort_safety_file();
+       res = pick_commits(&todo_list, opts);
+       todo_list_release(&todo_list);
+       return res;
 }
 
 void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag)
@@ -1116,6 +2363,9 @@ void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag)
                                getenv("GIT_COMMITTER_EMAIL")));
        strbuf_addch(&sob, '\n');
 
+       if (!ignore_footer)
+               strbuf_complete_line(msgbuf);
+
        /*
         * If the whole message buffer is equal to the sob, pretend that we
         * found a conforming footer with a matching sob
@@ -1136,13 +2386,6 @@ void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag)
                         * the title and body to be filled in by the user.
                         */
                        append_newlines = "\n\n";
-               } else if (msgbuf->buf[len - 1] != '\n') {
-                       /*
-                        * Incomplete line.  Complete the line and add a
-                        * blank one so that there is an empty line between
-                        * the message body and the sob.
-                        */
-                       append_newlines = "\n\n";
                } else if (len == 1) {
                        /*
                         * Buffer contains a single newline.  Add another
index 5ed5cb1d97ced70a9ebffd1dad524a12e7f7810a..f885b68395f4bff1ded96c0ab84ed87d164f0c7d 100644 (file)
@@ -1,28 +1,18 @@
 #ifndef SEQUENCER_H
 #define SEQUENCER_H
 
-#define SEQ_DIR                "sequencer"
-#define SEQ_HEAD_FILE  "sequencer/head"
-#define SEQ_TODO_FILE  "sequencer/todo"
-#define SEQ_OPTS_FILE  "sequencer/opts"
+const char *git_path_seq_dir(void);
 
 #define APPEND_SIGNOFF_DEDUP (1u << 0)
 
 enum replay_action {
        REPLAY_REVERT,
-       REPLAY_PICK
-};
-
-enum replay_subcommand {
-       REPLAY_NONE,
-       REPLAY_REMOVE_STATE,
-       REPLAY_CONTINUE,
-       REPLAY_ROLLBACK
+       REPLAY_PICK,
+       REPLAY_INTERACTIVE_REBASE
 };
 
 struct replay_opts {
        enum replay_action action;
-       enum replay_subcommand subcommand;
 
        /* Boolean options */
        int edit;
@@ -34,21 +24,26 @@ struct replay_opts {
        int allow_empty;
        int allow_empty_message;
        int keep_redundant_commits;
+       int verbose;
 
        int mainline;
 
-       const char *gpg_sign;
+       char *gpg_sign;
 
        /* Merge strategy */
-       const char *strategy;
-       const char **xopts;
+       char *strategy;
+       char **xopts;
        size_t xopts_nr, xopts_alloc;
 
        /* Only used by REPLAY_NONE */
        struct rev_info *revs;
 };
+#define REPLAY_OPTS_INIT { -1 }
 
 int sequencer_pick_revisions(struct replay_opts *opts);
+int sequencer_continue(struct replay_opts *opts);
+int sequencer_rollback(struct replay_opts *opts);
+int sequencer_remove_state(struct replay_opts *opts);
 
 extern const char sign_off_header[];
 
index 75dd6774136258c677fe4f4bbe2124c83b4cea68..f6c1a3dfb04bff5310a1b930b03478d88c9c2904 100644 (file)
@@ -14,19 +14,21 @@ static int update_info_file(char *path, int (*generate)(FILE *))
        char *tmp = mkpathdup("%s_XXXXXX", path);
        int ret = -1;
        int fd = -1;
-       FILE *fp = NULL;
+       FILE *fp = NULL, *to_close;
 
        safe_create_leading_directories(path);
        fd = git_mkstemp_mode(tmp, 0666);
        if (fd < 0)
                goto out;
-       fp = fdopen(fd, "w");
+       to_close = fp = fdopen(fd, "w");
        if (!fp)
                goto out;
+       fd = -1;
        ret = generate(fp);
        if (ret)
                goto out;
-       if (fclose(fp))
+       fp = NULL;
+       if (fclose(to_close))
                goto out;
        if (adjust_shared_perm(tmp) < 0)
                goto out;
@@ -229,7 +231,7 @@ static void init_pack_info(const char *infofile, int force)
        }
 
        /* renumber them */
-       qsort(info, num_pack, sizeof(info[0]), compare_info);
+       QSORT(info, num_pack, compare_info);
        for (i = 0; i < num_pack; i++)
                info[i]->new_num = i;
 }
diff --git a/setup.c b/setup.c
index fe572b82c355390e6101aea15d2d53ec5b3b1e15..2435186e448a6bf09616b0f1de1225ff2a666e48 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -135,6 +135,7 @@ int path_inside_repo(const char *prefix, const char *path)
 int check_filename(const char *prefix, const char *arg)
 {
        const char *name;
+       char *to_free = NULL;
        struct stat st;
 
        if (starts_with(arg, ":/")) {
@@ -142,13 +143,17 @@ int check_filename(const char *prefix, const char *arg)
                        return 1;
                name = arg + 2;
        } else if (prefix)
-               name = prefix_filename(prefix, strlen(prefix), arg);
+               name = to_free = prefix_filename(prefix, arg);
        else
                name = arg;
-       if (!lstat(name, &st))
+       if (!lstat(name, &st)) {
+               free(to_free);
                return 1; /* file exists */
-       if (errno == ENOENT || errno == ENOTDIR)
+       }
+       if (errno == ENOENT || errno == ENOTDIR) {
+               free(to_free);
                return 0; /* file does not exist */
+       }
        die_errno("failed to stat '%s'", arg);
 }
 
@@ -254,10 +259,12 @@ int get_common_dir_noenv(struct strbuf *sb, const char *gitdir)
                if (!is_absolute_path(data.buf))
                        strbuf_addf(&path, "%s/", gitdir);
                strbuf_addbuf(&path, &data);
-               strbuf_addstr(sb, real_path(path.buf));
+               strbuf_add_real_path(sb, path.buf);
                ret = 1;
-       } else
+       } else {
                strbuf_addstr(sb, gitdir);
+       }
+
        strbuf_release(&data);
        strbuf_release(&path);
        return ret;
@@ -484,6 +491,30 @@ int verify_repository_format(const struct repository_format *format,
        return 0;
 }
 
+void read_gitfile_error_die(int error_code, const char *path, const char *dir)
+{
+       switch (error_code) {
+       case READ_GITFILE_ERR_STAT_FAILED:
+       case READ_GITFILE_ERR_NOT_A_FILE:
+               /* non-fatal; follow return path */
+               break;
+       case READ_GITFILE_ERR_OPEN_FAILED:
+               die_errno("Error opening '%s'", path);
+       case READ_GITFILE_ERR_TOO_LARGE:
+               die("Too large to be a .git file: '%s'", path);
+       case READ_GITFILE_ERR_READ_FAILED:
+               die("Error reading %s", path);
+       case READ_GITFILE_ERR_INVALID_FORMAT:
+               die("Invalid gitfile format: %s", path);
+       case READ_GITFILE_ERR_NO_PATH:
+               die("No path in gitfile: %s", path);
+       case READ_GITFILE_ERR_NOT_A_REPO:
+               die("Not a git repository: %s", dir);
+       default:
+               die("BUG: unknown error code");
+       }
+}
+
 /*
  * Try to read the location of the git directory from the .git file,
  * return path to git directory if found.
@@ -505,6 +536,7 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
        ssize_t len;
 
        if (stat(path, &st)) {
+               /* NEEDSWORK: discern between ENOENT vs other errors */
                error_code = READ_GITFILE_ERR_STAT_FAILED;
                goto cleanup_return;
        }
@@ -557,28 +589,8 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
 cleanup_return:
        if (return_error_code)
                *return_error_code = error_code;
-       else if (error_code) {
-               switch (error_code) {
-               case READ_GITFILE_ERR_STAT_FAILED:
-               case READ_GITFILE_ERR_NOT_A_FILE:
-                       /* non-fatal; follow return path */
-                       break;
-               case READ_GITFILE_ERR_OPEN_FAILED:
-                       die_errno("Error opening '%s'", path);
-               case READ_GITFILE_ERR_TOO_LARGE:
-                       die("Too large to be a .git file: '%s'", path);
-               case READ_GITFILE_ERR_READ_FAILED:
-                       die("Error reading %s", path);
-               case READ_GITFILE_ERR_INVALID_FORMAT:
-                       die("Invalid gitfile format: %s", path);
-               case READ_GITFILE_ERR_NO_PATH:
-                       die("No path in gitfile: %s", path);
-               case READ_GITFILE_ERR_NOT_A_REPO:
-                       die("Not a git repository: %s", dir);
-               default:
-                       assert(0);
-               }
-       }
+       else if (error_code)
+               read_gitfile_error_die(error_code, path, dir);
 
        free(buf);
        return error_code ? NULL : path;
@@ -691,11 +703,16 @@ static const char *setup_discovered_git_dir(const char *gitdir,
 
        /* --work-tree is set without --git-dir; use discovered one */
        if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
+               char *to_free = NULL;
+               const char *ret;
+
                if (offset != cwd->len && !is_absolute_path(gitdir))
-                       gitdir = xstrdup(real_path(gitdir));
+                       gitdir = to_free = real_pathdup(gitdir, 1);
                if (chdir(cwd->buf))
                        die_errno("Could not come back to cwd");
-               return setup_explicit_git_dir(gitdir, cwd, nongit_ok);
+               ret = setup_explicit_git_dir(gitdir, cwd, nongit_ok);
+               free(to_free);
+               return ret;
        }
 
        /* #16.2, #17.2, #20.2, #21.2, #24, #25, #28, #29 (see t1510) */
@@ -715,8 +732,10 @@ static const char *setup_discovered_git_dir(const char *gitdir,
        if (offset == cwd->len)
                return NULL;
 
-       /* Make "offset" point to past the '/', and add a '/' at the end */
-       offset++;
+       /* Make "offset" point past the '/' (already the case for root dirs) */
+       if (offset != offset_1st_component(cwd->buf))
+               offset++;
+       /* Add a '/' at the end */
        strbuf_addch(cwd, '/');
        return cwd->buf + offset;
 }
@@ -734,7 +753,7 @@ static const char *setup_bare_git_dir(struct strbuf *cwd, int offset,
 
        /* --work-tree is set without --git-dir; use discovered one */
        if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
-               const char *gitdir;
+               static const char *gitdir;
 
                gitdir = offset == cwd->len ? "." : xmemdupz(cwd->buf, offset);
                if (chdir(cwd->buf))
@@ -800,59 +819,61 @@ static int canonicalize_ceiling_entry(struct string_list_item *item,
                /* Keep entry but do not canonicalize it */
                return 1;
        } else {
-               const char *real_path = real_path_if_valid(ceil);
-               if (!real_path)
+               char *real_path = real_pathdup(ceil, 0);
+               if (!real_path) {
                        return 0;
+               }
                free(item->string);
-               item->string = xstrdup(real_path);
+               item->string = real_path;
                return 1;
        }
 }
 
+enum discovery_result {
+       GIT_DIR_NONE = 0,
+       GIT_DIR_EXPLICIT,
+       GIT_DIR_DISCOVERED,
+       GIT_DIR_BARE,
+       /* these are errors */
+       GIT_DIR_HIT_CEILING = -1,
+       GIT_DIR_HIT_MOUNT_POINT = -2,
+       GIT_DIR_INVALID_GITFILE = -3
+};
+
 /*
  * We cannot decide in this function whether we are in the work tree or
  * not, since the config can only be read _after_ this function was called.
+ *
+ * Also, we avoid changing any global state (such as the current working
+ * directory) to allow early callers.
+ *
+ * The directory where the search should start needs to be passed in via the
+ * `dir` parameter; upon return, the `dir` buffer will contain the path of
+ * the directory where the search ended, and `gitdir` will contain the path of
+ * the discovered .git/ directory, if any. If `gitdir` is not absolute, it
+ * is relative to `dir` (i.e. *not* necessarily the cwd).
  */
-static const char *setup_git_directory_gently_1(int *nongit_ok)
+static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
+                                                         struct strbuf *gitdir,
+                                                         int die_on_error)
 {
        const char *env_ceiling_dirs = getenv(CEILING_DIRECTORIES_ENVIRONMENT);
        struct string_list ceiling_dirs = STRING_LIST_INIT_DUP;
-       static struct strbuf cwd = STRBUF_INIT;
-       const char *gitdirenv, *ret;
-       char *gitfile;
-       int offset, offset_parent, ceil_offset = -1;
+       const char *gitdirenv;
+       int ceil_offset = -1, min_offset = has_dos_drive_prefix(dir->buf) ? 3 : 1;
        dev_t current_device = 0;
        int one_filesystem = 1;
 
-       /*
-        * We may have read an incomplete configuration before
-        * setting-up the git directory. If so, clear the cache so
-        * that the next queries to the configuration reload complete
-        * configuration (including the per-repo config file that we
-        * ignored previously).
-        */
-       git_config_clear();
-
-       /*
-        * Let's assume that we are in a git repository.
-        * If it turns out later that we are somewhere else, the value will be
-        * updated accordingly.
-        */
-       if (nongit_ok)
-               *nongit_ok = 0;
-
-       if (strbuf_getcwd(&cwd))
-               die_errno(_("Unable to read current working directory"));
-       offset = cwd.len;
-
        /*
         * If GIT_DIR is set explicitly, we're not going
         * to do any discovery, but we still do repository
         * validation.
         */
        gitdirenv = getenv(GIT_DIR_ENVIRONMENT);
-       if (gitdirenv)
-               return setup_explicit_git_dir(gitdirenv, &cwd, nongit_ok);
+       if (gitdirenv) {
+               strbuf_addstr(gitdir, gitdirenv);
+               return GIT_DIR_EXPLICIT;
+       }
 
        if (env_ceiling_dirs) {
                int empty_entry_found = 0;
@@ -860,15 +881,15 @@ static const char *setup_git_directory_gently_1(int *nongit_ok)
                string_list_split(&ceiling_dirs, env_ceiling_dirs, PATH_SEP, -1);
                filter_string_list(&ceiling_dirs, 0,
                                   canonicalize_ceiling_entry, &empty_entry_found);
-               ceil_offset = longest_ancestor_length(cwd.buf, &ceiling_dirs);
+               ceil_offset = longest_ancestor_length(dir->buf, &ceiling_dirs);
                string_list_clear(&ceiling_dirs, 0);
        }
 
-       if (ceil_offset < 0 && has_dos_drive_prefix(cwd.buf))
-               ceil_offset = 1;
+       if (ceil_offset < 0)
+               ceil_offset = min_offset - 2;
 
        /*
-        * Test in the following order (relative to the cwd):
+        * Test in the following order (relative to the dir):
         * - .git (file containing "gitdir: <path>")
         * - .git/
         * - ./ (bare)
@@ -880,61 +901,160 @@ static const char *setup_git_directory_gently_1(int *nongit_ok)
         */
        one_filesystem = !git_env_bool("GIT_DISCOVERY_ACROSS_FILESYSTEM", 0);
        if (one_filesystem)
-               current_device = get_device_or_die(".", NULL, 0);
+               current_device = get_device_or_die(dir->buf, NULL, 0);
        for (;;) {
-               gitfile = (char*)read_gitfile(DEFAULT_GIT_DIR_ENVIRONMENT);
-               if (gitfile)
-                       gitdirenv = gitfile = xstrdup(gitfile);
-               else {
-                       if (is_git_directory(DEFAULT_GIT_DIR_ENVIRONMENT))
-                               gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
+               int offset = dir->len, error_code = 0;
+
+               if (offset > min_offset)
+                       strbuf_addch(dir, '/');
+               strbuf_addstr(dir, DEFAULT_GIT_DIR_ENVIRONMENT);
+               gitdirenv = read_gitfile_gently(dir->buf, die_on_error ?
+                                               NULL : &error_code);
+               if (!gitdirenv) {
+                       if (die_on_error ||
+                           error_code == READ_GITFILE_ERR_NOT_A_FILE) {
+                               /* NEEDSWORK: fail if .git is not file nor dir */
+                               if (is_git_directory(dir->buf))
+                                       gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
+                       } else if (error_code != READ_GITFILE_ERR_STAT_FAILED)
+                               return GIT_DIR_INVALID_GITFILE;
                }
-
+               strbuf_setlen(dir, offset);
                if (gitdirenv) {
-                       ret = setup_discovered_git_dir(gitdirenv,
-                                                      &cwd, offset,
-                                                      nongit_ok);
-                       free(gitfile);
-                       return ret;
+                       strbuf_addstr(gitdir, gitdirenv);
+                       return GIT_DIR_DISCOVERED;
                }
-               free(gitfile);
 
-               if (is_git_directory("."))
-                       return setup_bare_git_dir(&cwd, offset, nongit_ok);
-
-               offset_parent = offset;
-               while (--offset_parent > ceil_offset && cwd.buf[offset_parent] != '/');
-               if (offset_parent <= ceil_offset)
-                       return setup_nongit(cwd.buf, nongit_ok);
-               if (one_filesystem) {
-                       dev_t parent_device = get_device_or_die("..", cwd.buf,
-                                                               offset);
-                       if (parent_device != current_device) {
-                               if (nongit_ok) {
-                                       if (chdir(cwd.buf))
-                                               die_errno(_("Cannot come back to cwd"));
-                                       *nongit_ok = 1;
-                                       return NULL;
-                               }
-                               strbuf_setlen(&cwd, offset);
-                               die(_("Not a git repository (or any parent up to mount point %s)\n"
-                               "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."),
-                                   cwd.buf);
-                       }
+               if (is_git_directory(dir->buf)) {
+                       strbuf_addstr(gitdir, ".");
+                       return GIT_DIR_BARE;
                }
-               if (chdir("..")) {
-                       strbuf_setlen(&cwd, offset);
-                       die_errno(_("Cannot change to '%s/..'"), cwd.buf);
-               }
-               offset = offset_parent;
+
+               if (offset <= min_offset)
+                       return GIT_DIR_HIT_CEILING;
+
+               while (--offset > ceil_offset && !is_dir_sep(dir->buf[offset]))
+                       ; /* continue */
+               if (offset <= ceil_offset)
+                       return GIT_DIR_HIT_CEILING;
+
+               strbuf_setlen(dir, offset > min_offset ?  offset : min_offset);
+               if (one_filesystem &&
+                   current_device != get_device_or_die(dir->buf, NULL, offset))
+                       return GIT_DIR_HIT_MOUNT_POINT;
        }
 }
 
+const char *discover_git_directory(struct strbuf *gitdir)
+{
+       struct strbuf dir = STRBUF_INIT, err = STRBUF_INIT;
+       size_t gitdir_offset = gitdir->len, cwd_len;
+       struct repository_format candidate;
+
+       if (strbuf_getcwd(&dir))
+               return NULL;
+
+       cwd_len = dir.len;
+       if (setup_git_directory_gently_1(&dir, gitdir, 0) <= 0) {
+               strbuf_release(&dir);
+               return NULL;
+       }
+
+       /*
+        * The returned gitdir is relative to dir, and if dir does not reflect
+        * the current working directory, we simply make the gitdir absolute.
+        */
+       if (dir.len < cwd_len && !is_absolute_path(gitdir->buf + gitdir_offset)) {
+               /* Avoid a trailing "/." */
+               if (!strcmp(".", gitdir->buf + gitdir_offset))
+                       strbuf_setlen(gitdir, gitdir_offset);
+               else
+                       strbuf_addch(&dir, '/');
+               strbuf_insert(gitdir, gitdir_offset, dir.buf, dir.len);
+       }
+
+       strbuf_reset(&dir);
+       strbuf_addf(&dir, "%s/config", gitdir->buf + gitdir_offset);
+       read_repository_format(&candidate, dir.buf);
+       strbuf_release(&dir);
+
+       if (verify_repository_format(&candidate, &err) < 0) {
+               warning("ignoring git dir '%s': %s",
+                       gitdir->buf + gitdir_offset, err.buf);
+               strbuf_release(&err);
+               strbuf_setlen(gitdir, gitdir_offset);
+               return NULL;
+       }
+
+       return gitdir->buf + gitdir_offset;
+}
+
 const char *setup_git_directory_gently(int *nongit_ok)
 {
-       const char *prefix;
+       static struct strbuf cwd = STRBUF_INIT;
+       struct strbuf dir = STRBUF_INIT, gitdir = STRBUF_INIT;
+       const char *prefix, *env_prefix;
+
+       /*
+        * We may have read an incomplete configuration before
+        * setting-up the git directory. If so, clear the cache so
+        * that the next queries to the configuration reload complete
+        * configuration (including the per-repo config file that we
+        * ignored previously).
+        */
+       git_config_clear();
+
+       /*
+        * Let's assume that we are in a git repository.
+        * If it turns out later that we are somewhere else, the value will be
+        * updated accordingly.
+        */
+       if (nongit_ok)
+               *nongit_ok = 0;
+
+       if (strbuf_getcwd(&cwd))
+               die_errno(_("Unable to read current working directory"));
+       strbuf_addbuf(&dir, &cwd);
+
+       switch (setup_git_directory_gently_1(&dir, &gitdir, 1)) {
+       case GIT_DIR_NONE:
+               prefix = NULL;
+               break;
+       case GIT_DIR_EXPLICIT:
+               prefix = setup_explicit_git_dir(gitdir.buf, &cwd, nongit_ok);
+               break;
+       case GIT_DIR_DISCOVERED:
+               if (dir.len < cwd.len && chdir(dir.buf))
+                       die(_("Cannot change to '%s'"), dir.buf);
+               prefix = setup_discovered_git_dir(gitdir.buf, &cwd, dir.len,
+                                                 nongit_ok);
+               break;
+       case GIT_DIR_BARE:
+               if (dir.len < cwd.len && chdir(dir.buf))
+                       die(_("Cannot change to '%s'"), dir.buf);
+               prefix = setup_bare_git_dir(&cwd, dir.len, nongit_ok);
+               break;
+       case GIT_DIR_HIT_CEILING:
+               prefix = setup_nongit(cwd.buf, nongit_ok);
+               break;
+       case GIT_DIR_HIT_MOUNT_POINT:
+               if (nongit_ok) {
+                       *nongit_ok = 1;
+                       strbuf_release(&cwd);
+                       strbuf_release(&dir);
+                       return NULL;
+               }
+               die(_("Not a git repository (or any parent up to mount point %s)\n"
+                     "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."),
+                   dir.buf);
+       default:
+               die("BUG: unhandled setup_git_directory_1() result");
+       }
+
+       env_prefix = getenv(GIT_TOPLEVEL_PREFIX_ENVIRONMENT);
+       if (env_prefix)
+               prefix = env_prefix;
 
-       prefix = setup_git_directory_gently_1(nongit_ok);
        if (prefix)
                setenv(GIT_PREFIX_ENVIRONMENT, prefix, 1);
        else
@@ -943,6 +1063,9 @@ const char *setup_git_directory_gently(int *nongit_ok)
        startup_info->have_repository = !nongit_ok || !*nongit_ok;
        startup_info->prefix = prefix;
 
+       strbuf_release(&dir);
+       strbuf_release(&gitdir);
+
        return prefix;
 }
 
@@ -1014,11 +1137,11 @@ const char *setup_git_directory(void)
        return setup_git_directory_gently(NULL);
 }
 
-const char *resolve_gitdir(const char *suspect)
+const char *resolve_gitdir_gently(const char *suspect, int *return_error_code)
 {
        if (is_git_directory(suspect))
                return suspect;
-       return read_gitfile(suspect);
+       return read_gitfile_gently(suspect, return_error_code);
 }
 
 /* if any standard file descriptor is missing open it to /dev/null */
index e06b2c1311f72d1023b34c937ab48cd56ae8e206..c3a2b5ad17c74613811a0ce850586fa1b9e099bd 100644 (file)
@@ -230,8 +230,7 @@ cmp_string (const void *pstr1, const void *pstr2)
 static inline void
 string_list_sort (string_list_ty *slp)
 {
-  if (slp->nitems > 0)
-    qsort (slp->item, slp->nitems, sizeof (slp->item[0]), cmp_string);
+  QSORT(slp->item, slp->nitems, cmp_string);
 }
 
 /* Test whether a sorted string list contains a given string.  */
index 6f4a2246c9a912d06cf1a6995e07bf2008ec749d..7d646ab5b8cf80e47c6c1f339affeaa76a41d2d2 100644 (file)
@@ -2,58 +2,62 @@
 #include "sha1-array.h"
 #include "sha1-lookup.h"
 
-void sha1_array_append(struct sha1_array *array, const unsigned char *sha1)
+void oid_array_append(struct oid_array *array, const struct object_id *oid)
 {
-       ALLOC_GROW(array->sha1, array->nr + 1, array->alloc);
-       hashcpy(array->sha1[array->nr++], sha1);
+       ALLOC_GROW(array->oid, array->nr + 1, array->alloc);
+       oidcpy(&array->oid[array->nr++], oid);
        array->sorted = 0;
 }
 
 static int void_hashcmp(const void *a, const void *b)
 {
-       return hashcmp(a, b);
+       return oidcmp(a, b);
 }
 
-static void sha1_array_sort(struct sha1_array *array)
+static void oid_array_sort(struct oid_array *array)
 {
-       qsort(array->sha1, array->nr, sizeof(*array->sha1), void_hashcmp);
+       QSORT(array->oid, array->nr, void_hashcmp);
        array->sorted = 1;
 }
 
 static const unsigned char *sha1_access(size_t index, void *table)
 {
-       unsigned char (*array)[20] = table;
-       return array[index];
+       struct object_id *array = table;
+       return array[index].hash;
 }
 
-int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1)
+int oid_array_lookup(struct oid_array *array, const struct object_id *oid)
 {
        if (!array->sorted)
-               sha1_array_sort(array);
-       return sha1_pos(sha1, array->sha1, array->nr, sha1_access);
+               oid_array_sort(array);
+       return sha1_pos(oid->hash, array->oid, array->nr, sha1_access);
 }
 
-void sha1_array_clear(struct sha1_array *array)
+void oid_array_clear(struct oid_array *array)
 {
-       free(array->sha1);
-       array->sha1 = NULL;
+       free(array->oid);
+       array->oid = NULL;
        array->nr = 0;
        array->alloc = 0;
        array->sorted = 0;
 }
 
-void sha1_array_for_each_unique(struct sha1_array *array,
-                               for_each_sha1_fn fn,
+int oid_array_for_each_unique(struct oid_array *array,
+                               for_each_oid_fn fn,
                                void *data)
 {
        int i;
 
        if (!array->sorted)
-               sha1_array_sort(array);
+               oid_array_sort(array);
 
        for (i = 0; i < array->nr; i++) {
-               if (i > 0 && !hashcmp(array->sha1[i], array->sha1[i-1]))
+               int ret;
+               if (i > 0 && !oidcmp(array->oid + i, array->oid + i - 1))
                        continue;
-               fn(array->sha1[i], data);
+               ret = fn(array->oid + i, data);
+               if (ret)
+                       return ret;
        }
+       return 0;
 }
index 72bb33bec6c173633c2b5cd04db57b562fa23a9e..04b0756334da7adf1e3eefb3f521f8c95d263046 100644 (file)
@@ -1,23 +1,23 @@
 #ifndef SHA1_ARRAY_H
 #define SHA1_ARRAY_H
 
-struct sha1_array {
-       unsigned char (*sha1)[20];
+struct oid_array {
+       struct object_id *oid;
        int nr;
        int alloc;
        int sorted;
 };
 
-#define SHA1_ARRAY_INIT { NULL, 0, 0, 0 }
+#define OID_ARRAY_INIT { NULL, 0, 0, 0 }
 
-void sha1_array_append(struct sha1_array *array, const unsigned char *sha1);
-int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1);
-void sha1_array_clear(struct sha1_array *array);
+void oid_array_append(struct oid_array *array, const struct object_id *oid);
+int oid_array_lookup(struct oid_array *array, const struct object_id *oid);
+void oid_array_clear(struct oid_array *array);
 
-typedef void (*for_each_sha1_fn)(const unsigned char sha1[20],
-                                void *data);
-void sha1_array_for_each_unique(struct sha1_array *array,
-                               for_each_sha1_fn fn,
-                               void *data);
+typedef int (*for_each_oid_fn)(const struct object_id *oid,
+                              void *data);
+int oid_array_for_each_unique(struct oid_array *array,
+                              for_each_oid_fn fn,
+                              void *data);
 
 #endif /* SHA1_ARRAY_H */
index 727a9769fb7549e365e66f4ecb65f8e665898a96..59a4ed2ed32336b41ab8f3b1d4aca30f045aa084 100644 (file)
 #include "streaming.h"
 #include "dir.h"
 #include "mru.h"
-
-#ifndef O_NOATIME
-#if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
-#define O_NOATIME 01000000
-#else
-#define O_NOATIME 0
-#endif
-#endif
+#include "list.h"
+#include "mergesort.h"
+#include "quote.h"
 
 #define SZ_FMT PRIuMAX
 static inline uintmax_t sz_fmt(size_t s) { return s; }
 
 const unsigned char null_sha1[20];
 const struct object_id null_oid;
+const struct object_id empty_tree_oid = {
+       EMPTY_TREE_SHA1_BIN_LITERAL
+};
+const struct object_id empty_blob_oid = {
+       EMPTY_BLOB_SHA1_BIN_LITERAL
+};
 
 /*
  * This is meant to hold a *small* number of objects that you would
@@ -128,8 +129,10 @@ enum scld_error safe_create_leading_directories(char *path)
                *slash = '\0';
                if (!stat(path, &st)) {
                        /* path exists */
-                       if (!S_ISDIR(st.st_mode))
+                       if (!S_ISDIR(st.st_mode)) {
+                               errno = ENOTDIR;
                                ret = SCLD_EXISTS;
+                       }
                } else if (mkdir(path, 0777)) {
                        if (errno == EEXIST &&
                            !stat(path, &st) && S_ISDIR(st.st_mode))
@@ -157,75 +160,177 @@ enum scld_error safe_create_leading_directories(char *path)
 
 enum scld_error safe_create_leading_directories_const(const char *path)
 {
+       int save_errno;
        /* path points to cache entries, so xstrdup before messing with it */
        char *buf = xstrdup(path);
        enum scld_error result = safe_create_leading_directories(buf);
+
+       save_errno = errno;
        free(buf);
+       errno = save_errno;
        return result;
 }
 
-static void fill_sha1_path(char *pathbuf, const unsigned char *sha1)
+int raceproof_create_file(const char *path, create_file_fn fn, void *cb)
+{
+       /*
+        * The number of times we will try to remove empty directories
+        * in the way of path. This is only 1 because if another
+        * process is racily creating directories that conflict with
+        * us, we don't want to fight against them.
+        */
+       int remove_directories_remaining = 1;
+
+       /*
+        * The number of times that we will try to create the
+        * directories containing path. We are willing to attempt this
+        * more than once, because another process could be trying to
+        * clean up empty directories at the same time as we are
+        * trying to create them.
+        */
+       int create_directories_remaining = 3;
+
+       /* A scratch copy of path, filled lazily if we need it: */
+       struct strbuf path_copy = STRBUF_INIT;
+
+       int ret, save_errno;
+
+       /* Sanity check: */
+       assert(*path);
+
+retry_fn:
+       ret = fn(path, cb);
+       save_errno = errno;
+       if (!ret)
+               goto out;
+
+       if (errno == EISDIR && remove_directories_remaining-- > 0) {
+               /*
+                * A directory is in the way. Maybe it is empty; try
+                * to remove it:
+                */
+               if (!path_copy.len)
+                       strbuf_addstr(&path_copy, path);
+
+               if (!remove_dir_recursively(&path_copy, REMOVE_DIR_EMPTY_ONLY))
+                       goto retry_fn;
+       } else if (errno == ENOENT && create_directories_remaining-- > 0) {
+               /*
+                * Maybe the containing directory didn't exist, or
+                * maybe it was just deleted by a process that is
+                * racing with us to clean up empty directories. Try
+                * to create it:
+                */
+               enum scld_error scld_result;
+
+               if (!path_copy.len)
+                       strbuf_addstr(&path_copy, path);
+
+               do {
+                       scld_result = safe_create_leading_directories(path_copy.buf);
+                       if (scld_result == SCLD_OK)
+                               goto retry_fn;
+               } while (scld_result == SCLD_VANISHED && create_directories_remaining-- > 0);
+       }
+
+out:
+       strbuf_release(&path_copy);
+       errno = save_errno;
+       return ret;
+}
+
+static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1)
 {
        int i;
        for (i = 0; i < 20; i++) {
                static char hex[] = "0123456789abcdef";
                unsigned int val = sha1[i];
-               char *pos = pathbuf + i*2 + (i > 0);
-               *pos++ = hex[val >> 4];
-               *pos = hex[val & 0xf];
+               strbuf_addch(buf, hex[val >> 4]);
+               strbuf_addch(buf, hex[val & 0xf]);
+               if (!i)
+                       strbuf_addch(buf, '/');
        }
 }
 
 const char *sha1_file_name(const unsigned char *sha1)
 {
-       static char buf[PATH_MAX];
-       const char *objdir;
-       int len;
+       static struct strbuf buf = STRBUF_INIT;
 
-       objdir = get_object_directory();
-       len = strlen(objdir);
+       strbuf_reset(&buf);
+       strbuf_addf(&buf, "%s/", get_object_directory());
 
-       /* '/' + sha1(2) + '/' + sha1(38) + '\0' */
-       if (len + 43 > PATH_MAX)
-               die("insanely long object directory %s", objdir);
-       memcpy(buf, objdir, len);
-       buf[len] = '/';
-       buf[len+3] = '/';
-       buf[len+42] = '\0';
-       fill_sha1_path(buf + len + 1, sha1);
-       return buf;
+       fill_sha1_path(&buf, sha1);
+       return buf.buf;
 }
 
-/*
- * Return the name of the pack or index file with the specified sha1
- * in its filename.  *base and *name are scratch space that must be
- * provided by the caller.  which should be "pack" or "idx".
- */
-static char *sha1_get_pack_name(const unsigned char *sha1,
-                               struct strbuf *buf,
-                               const char *which)
+struct strbuf *alt_scratch_buf(struct alternate_object_database *alt)
+{
+       strbuf_setlen(&alt->scratch, alt->base_len);
+       return &alt->scratch;
+}
+
+static const char *alt_sha1_path(struct alternate_object_database *alt,
+                                const unsigned char *sha1)
+{
+       struct strbuf *buf = alt_scratch_buf(alt);
+       fill_sha1_path(buf, sha1);
+       return buf->buf;
+}
+
+ char *odb_pack_name(struct strbuf *buf,
+                    const unsigned char *sha1,
+                    const char *ext)
 {
        strbuf_reset(buf);
        strbuf_addf(buf, "%s/pack/pack-%s.%s", get_object_directory(),
-                   sha1_to_hex(sha1), which);
+                   sha1_to_hex(sha1), ext);
        return buf->buf;
 }
 
 char *sha1_pack_name(const unsigned char *sha1)
 {
        static struct strbuf buf = STRBUF_INIT;
-       return sha1_get_pack_name(sha1, &buf, "pack");
+       return odb_pack_name(&buf, sha1, "pack");
 }
 
 char *sha1_pack_index_name(const unsigned char *sha1)
 {
        static struct strbuf buf = STRBUF_INIT;
-       return sha1_get_pack_name(sha1, &buf, "idx");
+       return odb_pack_name(&buf, sha1, "idx");
 }
 
 struct alternate_object_database *alt_odb_list;
 static struct alternate_object_database **alt_odb_tail;
 
+/*
+ * Return non-zero iff the path is usable as an alternate object database.
+ */
+static int alt_odb_usable(struct strbuf *path, const char *normalized_objdir)
+{
+       struct alternate_object_database *alt;
+
+       /* Detect cases where alternate disappeared */
+       if (!is_directory(path->buf)) {
+               error("object directory %s does not exist; "
+                     "check .git/objects/info/alternates.",
+                     path->buf);
+               return 0;
+       }
+
+       /*
+        * Prevent the common mistake of listing the same
+        * thing twice, or object directory itself.
+        */
+       for (alt = alt_odb_list; alt; alt = alt->next) {
+               if (!fspathcmp(path->buf, alt->path))
+                       return 0;
+       }
+       if (!fspathcmp(path->buf, normalized_objdir))
+               return 0;
+
+       return 1;
+}
+
 /*
  * Prepare alternate object database registry.
  *
@@ -245,59 +350,34 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
        int depth, const char *normalized_objdir)
 {
        struct alternate_object_database *ent;
-       struct alternate_object_database *alt;
-       size_t pfxlen, entlen;
        struct strbuf pathbuf = STRBUF_INIT;
 
        if (!is_absolute_path(entry) && relative_base) {
-               strbuf_addstr(&pathbuf, real_path(relative_base));
+               strbuf_realpath(&pathbuf, relative_base, 1);
                strbuf_addch(&pathbuf, '/');
        }
        strbuf_addstr(&pathbuf, entry);
 
-       normalize_path_copy(pathbuf.buf, pathbuf.buf);
-
-       pfxlen = strlen(pathbuf.buf);
+       if (strbuf_normalize_path(&pathbuf) < 0 && relative_base) {
+               error("unable to normalize alternate object path: %s",
+                     pathbuf.buf);
+               strbuf_release(&pathbuf);
+               return -1;
+       }
 
        /*
         * The trailing slash after the directory name is given by
         * this function at the end. Remove duplicates.
         */
-       while (pfxlen && pathbuf.buf[pfxlen-1] == '/')
-               pfxlen -= 1;
+       while (pathbuf.len && pathbuf.buf[pathbuf.len - 1] == '/')
+               strbuf_setlen(&pathbuf, pathbuf.len - 1);
 
-       entlen = st_add(pfxlen, 43); /* '/' + 2 hex + '/' + 38 hex + NUL */
-       ent = xmalloc(st_add(sizeof(*ent), entlen));
-       memcpy(ent->base, pathbuf.buf, pfxlen);
-       strbuf_release(&pathbuf);
-
-       ent->name = ent->base + pfxlen + 1;
-       ent->base[pfxlen + 3] = '/';
-       ent->base[pfxlen] = ent->base[entlen-1] = 0;
-
-       /* Detect cases where alternate disappeared */
-       if (!is_directory(ent->base)) {
-               error("object directory %s does not exist; "
-                     "check .git/objects/info/alternates.",
-                     ent->base);
-               free(ent);
+       if (!alt_odb_usable(&pathbuf, normalized_objdir)) {
+               strbuf_release(&pathbuf);
                return -1;
        }
 
-       /* Prevent the common mistake of listing the same
-        * thing twice, or object directory itself.
-        */
-       for (alt = alt_odb_list; alt; alt = alt->next) {
-               if (pfxlen == alt->name - alt->base - 1 &&
-                   !memcmp(ent->base, alt->base, pfxlen)) {
-                       free(ent);
-                       return -1;
-               }
-       }
-       if (!fspathcmp(ent->base, normalized_objdir)) {
-               free(ent);
-               return -1;
-       }
+       ent = alloc_alt_odb(pathbuf.buf);
 
        /* add the alternate entry */
        *alt_odb_tail = ent;
@@ -305,20 +385,46 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
        ent->next = NULL;
 
        /* recursively add alternates */
-       read_info_alternates(ent->base, depth + 1);
-
-       ent->base[pfxlen] = '/';
+       read_info_alternates(pathbuf.buf, depth + 1);
 
+       strbuf_release(&pathbuf);
        return 0;
 }
 
+static const char *parse_alt_odb_entry(const char *string,
+                                      int sep,
+                                      struct strbuf *out)
+{
+       const char *end;
+
+       strbuf_reset(out);
+
+       if (*string == '#') {
+               /* comment; consume up to next separator */
+               end = strchrnul(string, sep);
+       } else if (*string == '"' && !unquote_c_style(out, string, &end)) {
+               /*
+                * quoted path; unquote_c_style has copied the
+                * data for us and set "end". Broken quoting (e.g.,
+                * an entry that doesn't end with a quote) falls
+                * back to the unquoted case below.
+                */
+       } else {
+               /* normal, unquoted path */
+               end = strchrnul(string, sep);
+               strbuf_add(out, string, end - string);
+       }
+
+       if (*end)
+               end++;
+       return end;
+}
+
 static void link_alt_odb_entries(const char *alt, int len, int sep,
                                 const char *relative_base, int depth)
 {
-       struct string_list entries = STRING_LIST_INIT_NODUP;
-       char *alt_copy;
-       int i;
        struct strbuf objdirbuf = STRBUF_INIT;
+       struct strbuf entry = STRBUF_INIT;
 
        if (depth > 5) {
                error("%s: ignoring alternate object stores, nesting too deep.",
@@ -327,23 +433,17 @@ static void link_alt_odb_entries(const char *alt, int len, int sep,
        }
 
        strbuf_add_absolute_path(&objdirbuf, get_object_directory());
-       normalize_path_copy(objdirbuf.buf, objdirbuf.buf);
+       if (strbuf_normalize_path(&objdirbuf) < 0)
+               die("unable to normalize object directory: %s",
+                   objdirbuf.buf);
 
-       alt_copy = xmemdupz(alt, len);
-       string_list_split_in_place(&entries, alt_copy, sep, -1);
-       for (i = 0; i < entries.nr; i++) {
-               const char *entry = entries.items[i].string;
-               if (entry[0] == '\0' || entry[0] == '#')
+       while (*alt) {
+               alt = parse_alt_odb_entry(alt, sep, &entry);
+               if (!entry.len)
                        continue;
-               if (!is_absolute_path(entry) && depth) {
-                       error("%s: ignoring relative alternate object store %s",
-                                       relative_base, entry);
-               } else {
-                       link_alt_odb_entry(entry, relative_base, depth, objdirbuf.buf);
-               }
+               link_alt_odb_entry(entry.buf, relative_base, depth, objdirbuf.buf);
        }
-       string_list_clear(&entries, 0);
-       free(alt_copy);
+       strbuf_release(&entry);
        strbuf_release(&objdirbuf);
 }
 
@@ -356,7 +456,7 @@ void read_info_alternates(const char * relative_base, int depth)
        int fd;
 
        path = xstrfmt("%s/info/alternates", relative_base);
-       fd = git_open_noatime(path);
+       fd = git_open(path);
        free(path);
        if (fd < 0)
                return;
@@ -373,6 +473,18 @@ void read_info_alternates(const char * relative_base, int depth)
        munmap(map, mapsz);
 }
 
+struct alternate_object_database *alloc_alt_odb(const char *dir)
+{
+       struct alternate_object_database *ent;
+
+       FLEX_ALLOC_STR(ent, path, dir);
+       strbuf_init(&ent->scratch, 0);
+       strbuf_addf(&ent->scratch, "%s/", dir);
+       ent->base_len = ent->scratch.len;
+
+       return ent;
+}
+
 void add_to_alternates_file(const char *reference)
 {
        struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
@@ -418,6 +530,93 @@ void add_to_alternates_file(const char *reference)
        free(alts);
 }
 
+void add_to_alternates_memory(const char *reference)
+{
+       /*
+        * Make sure alternates are initialized, or else our entry may be
+        * overwritten when they are.
+        */
+       prepare_alt_odb();
+
+       link_alt_odb_entries(reference, strlen(reference), '\n', NULL, 0);
+}
+
+/*
+ * Compute the exact path an alternate is at and returns it. In case of
+ * error NULL is returned and the human readable error is added to `err`
+ * `path` may be relative and should point to $GITDIR.
+ * `err` must not be null.
+ */
+char *compute_alternate_path(const char *path, struct strbuf *err)
+{
+       char *ref_git = NULL;
+       const char *repo, *ref_git_s;
+       int seen_error = 0;
+
+       ref_git_s = real_path_if_valid(path);
+       if (!ref_git_s) {
+               seen_error = 1;
+               strbuf_addf(err, _("path '%s' does not exist"), path);
+               goto out;
+       } else
+               /*
+                * Beware: read_gitfile(), real_path() and mkpath()
+                * return static buffer
+                */
+               ref_git = xstrdup(ref_git_s);
+
+       repo = read_gitfile(ref_git);
+       if (!repo)
+               repo = read_gitfile(mkpath("%s/.git", ref_git));
+       if (repo) {
+               free(ref_git);
+               ref_git = xstrdup(repo);
+       }
+
+       if (!repo && is_directory(mkpath("%s/.git/objects", ref_git))) {
+               char *ref_git_git = mkpathdup("%s/.git", ref_git);
+               free(ref_git);
+               ref_git = ref_git_git;
+       } else if (!is_directory(mkpath("%s/objects", ref_git))) {
+               struct strbuf sb = STRBUF_INIT;
+               seen_error = 1;
+               if (get_common_dir(&sb, ref_git)) {
+                       strbuf_addf(err,
+                                   _("reference repository '%s' as a linked "
+                                     "checkout is not supported yet."),
+                                   path);
+                       goto out;
+               }
+
+               strbuf_addf(err, _("reference repository '%s' is not a "
+                                       "local repository."), path);
+               goto out;
+       }
+
+       if (!access(mkpath("%s/shallow", ref_git), F_OK)) {
+               strbuf_addf(err, _("reference repository '%s' is shallow"),
+                           path);
+               seen_error = 1;
+               goto out;
+       }
+
+       if (!access(mkpath("%s/info/grafts", ref_git), F_OK)) {
+               strbuf_addf(err,
+                           _("reference repository '%s' is grafted"),
+                           path);
+               seen_error = 1;
+               goto out;
+       }
+
+out:
+       if (seen_error) {
+               free(ref_git);
+               ref_git = NULL;
+       }
+
+       return ref_git;
+}
+
 int foreach_alt_odb(alt_odb_fn fn, void *cb)
 {
        struct alternate_object_database *ent;
@@ -463,7 +662,7 @@ static int freshen_file(const char *fn)
  * either does not exist on disk, or has a stale mtime and may be subject to
  * pruning).
  */
-static int check_and_freshen_file(const char *fn, int freshen)
+int check_and_freshen_file(const char *fn, int freshen)
 {
        if (access(fn, F_OK))
                return 0;
@@ -482,8 +681,8 @@ static int check_and_freshen_nonlocal(const unsigned char *sha1, int freshen)
        struct alternate_object_database *alt;
        prepare_alt_odb();
        for (alt = alt_odb_list; alt; alt = alt->next) {
-               fill_sha1_path(alt->name, sha1);
-               if (check_and_freshen_file(alt->base, freshen))
+               const char *path = alt_sha1_path(alt, sha1);
+               if (check_and_freshen_file(path, freshen))
                        return 1;
        }
        return 0;
@@ -550,7 +749,7 @@ static int check_packed_git_idx(const char *path, struct packed_git *p)
        struct pack_idx_header *hdr;
        size_t idx_size;
        uint32_t version, nr, i, *index;
-       int fd = git_open_noatime(path);
+       int fd = git_open(path);
        struct stat st;
 
        if (fd < 0)
@@ -956,7 +1155,7 @@ static int open_packed_git_1(struct packed_git *p)
        while (pack_max_fds <= pack_open_fds && close_one_pack())
                ; /* nothing */
 
-       p->pack_fd = git_open_noatime(p->pack_name);
+       p->pack_fd = git_open(p->pack_name);
        if (p->pack_fd < 0 || fstat(p->pack_fd, &st))
                return -1;
        pack_open_fds++;
@@ -1297,10 +1496,46 @@ static void prepare_packed_git_one(char *objdir, int local)
        strbuf_release(&path);
 }
 
+static int approximate_object_count_valid;
+
+/*
+ * Give a fast, rough count of the number of objects in the repository. This
+ * ignores loose objects completely. If you have a lot of them, then either
+ * you should repack because your performance will be awful, or they are
+ * all unreachable objects about to be pruned, in which case they're not really
+ * interesting as a measure of repo size in the first place.
+ */
+unsigned long approximate_object_count(void)
+{
+       static unsigned long count;
+       if (!approximate_object_count_valid) {
+               struct packed_git *p;
+
+               prepare_packed_git();
+               count = 0;
+               for (p = packed_git; p; p = p->next) {
+                       if (open_pack_index(p))
+                               continue;
+                       count += p->num_objects;
+               }
+       }
+       return count;
+}
+
+static void *get_next_packed_git(const void *p)
+{
+       return ((const struct packed_git *)p)->next;
+}
+
+static void set_next_packed_git(void *p, void *next)
+{
+       ((struct packed_git *)p)->next = next;
+}
+
 static int sort_pack(const void *a_, const void *b_)
 {
-       struct packed_git *a = *((struct packed_git **)a_);
-       struct packed_git *b = *((struct packed_git **)b_);
+       const struct packed_git *a = a_;
+       const struct packed_git *b = b_;
        int st;
 
        /*
@@ -1327,28 +1562,8 @@ static int sort_pack(const void *a_, const void *b_)
 
 static void rearrange_packed_git(void)
 {
-       struct packed_git **ary, *p;
-       int i, n;
-
-       for (n = 0, p = packed_git; p; p = p->next)
-               n++;
-       if (n < 2)
-               return;
-
-       /* prepare an array of packed_git for easier sorting */
-       ary = xcalloc(n, sizeof(struct packed_git *));
-       for (n = 0, p = packed_git; p; p = p->next)
-               ary[n++] = p;
-
-       qsort(ary, n, sizeof(struct packed_git *), sort_pack);
-
-       /* link them back again */
-       for (i = 0; i < n - 1; i++)
-               ary[i]->next = ary[i + 1];
-       ary[n - 1]->next = NULL;
-       packed_git = ary[0];
-
-       free(ary);
+       packed_git = llist_mergesort(packed_git, get_next_packed_git,
+                                    set_next_packed_git, sort_pack);
 }
 
 static void prepare_packed_git_mru(void)
@@ -1369,11 +1584,8 @@ void prepare_packed_git(void)
                return;
        prepare_packed_git_one(get_object_directory(), 1);
        prepare_alt_odb();
-       for (alt = alt_odb_list; alt; alt = alt->next) {
-               alt->name[-1] = 0;
-               prepare_packed_git_one(alt->base, 0);
-               alt->name[-1] = '/';
-       }
+       for (alt = alt_odb_list; alt; alt = alt->next)
+               prepare_packed_git_one(alt->path, 0);
        rearrange_packed_git();
        prepare_packed_git_mru();
        prepare_packed_git_run_once = 1;
@@ -1381,6 +1593,7 @@ void prepare_packed_git(void)
 
 void reprepare_packed_git(void)
 {
+       approximate_object_count_valid = 0;
        prepare_packed_git_run_once = 0;
        prepare_packed_git();
 }
@@ -1393,7 +1606,7 @@ static void mark_bad_packed_object(struct packed_git *p,
                if (!hashcmp(sha1, p->bad_object_sha1 + GIT_SHA1_RAWSZ * i))
                        return;
        p->bad_object_sha1 = xrealloc(p->bad_object_sha1,
-                                     st_mult(GIT_SHA1_RAWSZ,
+                                     st_mult(GIT_MAX_RAWSZ,
                                              st_add(p->num_bad_objects, 1)));
        hashcpy(p->bad_object_sha1 + GIT_SHA1_RAWSZ * p->num_bad_objects, sha1);
        p->num_bad_objects++;
@@ -1459,61 +1672,81 @@ int check_sha1_signature(const unsigned char *sha1, void *map,
        return hashcmp(sha1, real_sha1) ? -1 : 0;
 }
 
-int git_open_noatime(const char *name)
+int git_open_cloexec(const char *name, int flags)
 {
-       static int sha1_file_open_flag = O_NOATIME;
+       int fd;
+       static int o_cloexec = O_CLOEXEC;
 
-       for (;;) {
-               int fd;
+       fd = open(name, flags | o_cloexec);
+       if ((o_cloexec & O_CLOEXEC) && fd < 0 && errno == EINVAL) {
+               /* Try again w/o O_CLOEXEC: the kernel might not support it */
+               o_cloexec &= ~O_CLOEXEC;
+               fd = open(name, flags | o_cloexec);
+       }
 
-               errno = 0;
-               fd = open(name, O_RDONLY | sha1_file_open_flag);
-               if (fd >= 0)
-                       return fd;
+#if defined(F_GETFL) && defined(F_SETFL) && defined(FD_CLOEXEC)
+       {
+               static int fd_cloexec = FD_CLOEXEC;
 
-               /* Might the failure be due to O_NOATIME? */
-               if (errno != ENOENT && sha1_file_open_flag) {
-                       sha1_file_open_flag = 0;
-                       continue;
+               if (!o_cloexec && 0 <= fd && fd_cloexec) {
+                       /* Opened w/o O_CLOEXEC?  try with fcntl(2) to add it */
+                       int flags = fcntl(fd, F_GETFL);
+                       if (fcntl(fd, F_SETFL, flags | fd_cloexec))
+                               fd_cloexec = 0;
                }
-
-               return -1;
        }
+#endif
+       return fd;
 }
 
-static int stat_sha1_file(const unsigned char *sha1, struct stat *st)
+/*
+ * Find "sha1" as a loose object in the local repository or in an alternate.
+ * Returns 0 on success, negative on failure.
+ *
+ * The "path" out-parameter will give the path of the object we found (if any).
+ * Note that it may point to static storage and is only valid until another
+ * call to sha1_file_name(), etc.
+ */
+static int stat_sha1_file(const unsigned char *sha1, struct stat *st,
+                         const char **path)
 {
        struct alternate_object_database *alt;
 
-       if (!lstat(sha1_file_name(sha1), st))
+       *path = sha1_file_name(sha1);
+       if (!lstat(*path, st))
                return 0;
 
        prepare_alt_odb();
        errno = ENOENT;
        for (alt = alt_odb_list; alt; alt = alt->next) {
-               fill_sha1_path(alt->name, sha1);
-               if (!lstat(alt->base, st))
+               *path = alt_sha1_path(alt, sha1);
+               if (!lstat(*path, st))
                        return 0;
        }
 
        return -1;
 }
 
-static int open_sha1_file(const unsigned char *sha1)
+/*
+ * Like stat_sha1_file(), but actually open the object and return the
+ * descriptor. See the caveats on the "path" parameter above.
+ */
+static int open_sha1_file(const unsigned char *sha1, const char **path)
 {
        int fd;
        struct alternate_object_database *alt;
        int most_interesting_errno;
 
-       fd = git_open_noatime(sha1_file_name(sha1));
+       *path = sha1_file_name(sha1);
+       fd = git_open(*path);
        if (fd >= 0)
                return fd;
        most_interesting_errno = errno;
 
        prepare_alt_odb();
        for (alt = alt_odb_list; alt; alt = alt->next) {
-               fill_sha1_path(alt->name, sha1);
-               fd = git_open_noatime(alt->base);
+               *path = alt_sha1_path(alt, sha1);
+               fd = git_open(*path);
                if (fd >= 0)
                        return fd;
                if (most_interesting_errno == ENOENT)
@@ -1523,12 +1756,21 @@ static int open_sha1_file(const unsigned char *sha1)
        return -1;
 }
 
-void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
+/*
+ * Map the loose object at "path" if it is not NULL, or the path found by
+ * searching for a loose object named "sha1".
+ */
+static void *map_sha1_file_1(const char *path,
+                            const unsigned char *sha1,
+                            unsigned long *size)
 {
        void *map;
        int fd;
 
-       fd = open_sha1_file(sha1);
+       if (path)
+               fd = git_open(path);
+       else
+               fd = open_sha1_file(sha1, &path);
        map = NULL;
        if (fd >= 0) {
                struct stat st;
@@ -1537,7 +1779,7 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
                        *size = xsize_t(st.st_size);
                        if (!*size) {
                                /* mmap() is forbidden on empty files */
-                               error("object file %s is empty", sha1_file_name(sha1));
+                               error("object file %s is empty", path);
                                return NULL;
                        }
                        map = xmmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0);
@@ -1547,6 +1789,11 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
        return map;
 }
 
+void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
+{
+       return map_sha1_file_1(NULL, sha1, size);
+}
+
 unsigned long unpack_object_header_buffer(const unsigned char *buf,
                unsigned long len, enum object_type *type, unsigned long *sizep)
 {
@@ -1752,11 +1999,9 @@ static int parse_sha1_header_extended(const char *hdr, struct object_info *oi,
 
 int parse_sha1_header(const char *hdr, unsigned long *sizep)
 {
-       struct object_info oi;
+       struct object_info oi = OBJECT_INFO_INIT;
 
        oi.sizep = sizep;
-       oi.typename = NULL;
-       oi.typep = NULL;
        return parse_sha1_header_extended(hdr, &oi, LOOKUP_REPLACE_OBJECT);
 }
 
@@ -1994,8 +2239,8 @@ unwind:
        goto out;
 }
 
-static int packed_object_info(struct packed_git *p, off_t obj_offset,
-                             struct object_info *oi)
+int packed_object_info(struct packed_git *p, off_t obj_offset,
+                      struct object_info *oi)
 {
        struct pack_window *w_curs = NULL;
        unsigned long size;
@@ -2095,136 +2340,141 @@ static void *unpack_compressed_entry(struct packed_git *p,
        return buffer;
 }
 
-#define MAX_DELTA_CACHE (256)
-
+static struct hashmap delta_base_cache;
 static size_t delta_base_cached;
 
-static struct delta_base_cache_lru_list {
-       struct delta_base_cache_lru_list *prev;
-       struct delta_base_cache_lru_list *next;
-} delta_base_cache_lru = { &delta_base_cache_lru, &delta_base_cache_lru };
+static LIST_HEAD(delta_base_cache_lru);
 
-static struct delta_base_cache_entry {
-       struct delta_base_cache_lru_list lru;
-       void *data;
+struct delta_base_cache_key {
        struct packed_git *p;
        off_t base_offset;
+};
+
+struct delta_base_cache_entry {
+       struct hashmap hash;
+       struct delta_base_cache_key key;
+       struct list_head lru;
+       void *data;
        unsigned long size;
        enum object_type type;
-} delta_base_cache[MAX_DELTA_CACHE];
+};
 
-static unsigned long pack_entry_hash(struct packed_git *p, off_t base_offset)
+static unsigned int pack_entry_hash(struct packed_git *p, off_t base_offset)
 {
-       unsigned long hash;
+       unsigned int hash;
 
-       hash = (unsigned long)(intptr_t)p + (unsigned long)base_offset;
+       hash = (unsigned int)(intptr_t)p + (unsigned int)base_offset;
        hash += (hash >> 8) + (hash >> 16);
-       return hash % MAX_DELTA_CACHE;
+       return hash;
 }
 
 static struct delta_base_cache_entry *
 get_delta_base_cache_entry(struct packed_git *p, off_t base_offset)
 {
-       unsigned long hash = pack_entry_hash(p, base_offset);
-       return delta_base_cache + hash;
+       struct hashmap_entry entry;
+       struct delta_base_cache_key key;
+
+       if (!delta_base_cache.cmpfn)
+               return NULL;
+
+       hashmap_entry_init(&entry, pack_entry_hash(p, base_offset));
+       key.p = p;
+       key.base_offset = base_offset;
+       return hashmap_get(&delta_base_cache, &entry, &key);
+}
+
+static int delta_base_cache_key_eq(const struct delta_base_cache_key *a,
+                                  const struct delta_base_cache_key *b)
+{
+       return a->p == b->p && a->base_offset == b->base_offset;
 }
 
-static int eq_delta_base_cache_entry(struct delta_base_cache_entry *ent,
-                                    struct packed_git *p, off_t base_offset)
+static int delta_base_cache_hash_cmp(const void *va, const void *vb,
+                                    const void *vkey)
 {
-       return (ent->data && ent->p == p && ent->base_offset == base_offset);
+       const struct delta_base_cache_entry *a = va, *b = vb;
+       const struct delta_base_cache_key *key = vkey;
+       if (key)
+               return !delta_base_cache_key_eq(&a->key, key);
+       else
+               return !delta_base_cache_key_eq(&a->key, &b->key);
 }
 
 static int in_delta_base_cache(struct packed_git *p, off_t base_offset)
 {
-       struct delta_base_cache_entry *ent;
-       ent = get_delta_base_cache_entry(p, base_offset);
-       return eq_delta_base_cache_entry(ent, p, base_offset);
+       return !!get_delta_base_cache_entry(p, base_offset);
 }
 
-static void clear_delta_base_cache_entry(struct delta_base_cache_entry *ent)
+/*
+ * Remove the entry from the cache, but do _not_ free the associated
+ * entry data. The caller takes ownership of the "data" buffer, and
+ * should copy out any fields it wants before detaching.
+ */
+static void detach_delta_base_cache_entry(struct delta_base_cache_entry *ent)
 {
-       ent->data = NULL;
-       ent->lru.next->prev = ent->lru.prev;
-       ent->lru.prev->next = ent->lru.next;
+       hashmap_remove(&delta_base_cache, ent, &ent->key);
+       list_del(&ent->lru);
        delta_base_cached -= ent->size;
+       free(ent);
 }
 
 static void *cache_or_unpack_entry(struct packed_git *p, off_t base_offset,
-       unsigned long *base_size, enum object_type *type, int keep_cache)
+       unsigned long *base_size, enum object_type *type)
 {
        struct delta_base_cache_entry *ent;
-       void *ret;
 
        ent = get_delta_base_cache_entry(p, base_offset);
-
-       if (!eq_delta_base_cache_entry(ent, p, base_offset))
+       if (!ent)
                return unpack_entry(p, base_offset, type, base_size);
 
-       ret = ent->data;
-
-       if (!keep_cache)
-               clear_delta_base_cache_entry(ent);
-       else
-               ret = xmemdupz(ent->data, ent->size);
        *type = ent->type;
        *base_size = ent->size;
-       return ret;
+       return xmemdupz(ent->data, ent->size);
 }
 
 static inline void release_delta_base_cache(struct delta_base_cache_entry *ent)
 {
-       if (ent->data) {
-               free(ent->data);
-               ent->data = NULL;
-               ent->lru.next->prev = ent->lru.prev;
-               ent->lru.prev->next = ent->lru.next;
-               delta_base_cached -= ent->size;
-       }
+       free(ent->data);
+       detach_delta_base_cache_entry(ent);
 }
 
 void clear_delta_base_cache(void)
 {
-       unsigned long p;
-       for (p = 0; p < MAX_DELTA_CACHE; p++)
-               release_delta_base_cache(&delta_base_cache[p]);
+       struct list_head *lru, *tmp;
+       list_for_each_safe(lru, tmp, &delta_base_cache_lru) {
+               struct delta_base_cache_entry *entry =
+                       list_entry(lru, struct delta_base_cache_entry, lru);
+               release_delta_base_cache(entry);
+       }
 }
 
 static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
        void *base, unsigned long base_size, enum object_type type)
 {
-       unsigned long hash = pack_entry_hash(p, base_offset);
-       struct delta_base_cache_entry *ent = delta_base_cache + hash;
-       struct delta_base_cache_lru_list *lru;
+       struct delta_base_cache_entry *ent = xmalloc(sizeof(*ent));
+       struct list_head *lru, *tmp;
 
-       release_delta_base_cache(ent);
        delta_base_cached += base_size;
 
-       for (lru = delta_base_cache_lru.next;
-            delta_base_cached > delta_base_cache_limit
-            && lru != &delta_base_cache_lru;
-            lru = lru->next) {
-               struct delta_base_cache_entry *f = (void *)lru;
-               if (f->type == OBJ_BLOB)
-                       release_delta_base_cache(f);
-       }
-       for (lru = delta_base_cache_lru.next;
-            delta_base_cached > delta_base_cache_limit
-            && lru != &delta_base_cache_lru;
-            lru = lru->next) {
-               struct delta_base_cache_entry *f = (void *)lru;
+       list_for_each_safe(lru, tmp, &delta_base_cache_lru) {
+               struct delta_base_cache_entry *f =
+                       list_entry(lru, struct delta_base_cache_entry, lru);
+               if (delta_base_cached <= delta_base_cache_limit)
+                       break;
                release_delta_base_cache(f);
        }
 
-       ent->p = p;
-       ent->base_offset = base_offset;
+       ent->key.p = p;
+       ent->key.base_offset = base_offset;
        ent->type = type;
        ent->data = base;
        ent->size = base_size;
-       ent->lru.next = &delta_base_cache_lru;
-       ent->lru.prev = delta_base_cache_lru.prev;
-       delta_base_cache_lru.prev->next = &ent->lru;
-       delta_base_cache_lru.prev = &ent->lru;
+       list_add_tail(&ent->lru, &delta_base_cache_lru);
+
+       if (!delta_base_cache.cmpfn)
+               hashmap_init(&delta_base_cache, delta_base_cache_hash_cmp, 0);
+       hashmap_entry_init(ent, pack_entry_hash(p, base_offset));
+       hashmap_add(&delta_base_cache, ent);
 }
 
 static void *read_object(const unsigned char *sha1, enum object_type *type,
@@ -2268,11 +2518,11 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
                struct delta_base_cache_entry *ent;
 
                ent = get_delta_base_cache_entry(p, curpos);
-               if (eq_delta_base_cache_entry(ent, p, curpos)) {
+               if (ent) {
                        type = ent->type;
                        data = ent->data;
                        size = ent->size;
-                       clear_delta_base_cache_entry(ent);
+                       detach_delta_base_cache_entry(ent);
                        base_from_cache = 1;
                        break;
                }
@@ -2351,6 +2601,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
        while (delta_stack_nr) {
                void *delta_data;
                void *base = data;
+               void *external_base = NULL;
                unsigned long delta_size, base_size = size;
                int i;
 
@@ -2377,6 +2628,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
                                      p->pack_name);
                                mark_bad_packed_object(p, base_sha1);
                                base = read_object(base_sha1, &type, &base_size);
+                               external_base = base;
                        }
                }
 
@@ -2395,6 +2647,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
                              "at offset %"PRIuMAX" from %s",
                              (uintmax_t)curpos, p->pack_name);
                        data = NULL;
+                       free(external_base);
                        continue;
                }
 
@@ -2414,6 +2667,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
                        error("failed to apply delta");
 
                free(delta_data);
+               free(external_base);
        }
 
        *final_type = type;
@@ -2447,6 +2701,17 @@ const unsigned char *nth_packed_object_sha1(struct packed_git *p,
        }
 }
 
+const struct object_id *nth_packed_object_oid(struct object_id *oid,
+                                             struct packed_git *p,
+                                             uint32_t n)
+{
+       const unsigned char *hash = nth_packed_object_sha1(p, n);
+       if (!hash)
+               return NULL;
+       hashcpy(oid->hash, hash);
+       return oid;
+}
+
 void check_pack_index_ptr(const struct packed_git *p, const void *vptr)
 {
        const unsigned char *ptr = vptr;
@@ -2653,8 +2918,9 @@ static int sha1_loose_object_info(const unsigned char *sha1,
         * object even exists.
         */
        if (!oi->typep && !oi->typename && !oi->sizep) {
+               const char *path;
                struct stat st;
-               if (stat_sha1_file(sha1, &st) < 0)
+               if (stat_sha1_file(sha1, &st, &path) < 0)
                        return -1;
                if (oi->disk_sizep)
                        *oi->disk_sizep = st.st_size;
@@ -2686,7 +2952,7 @@ static int sha1_loose_object_info(const unsigned char *sha1,
        if (status && oi->typep)
                *oi->typep = status;
        strbuf_release(&hdrbuf);
-       return 0;
+       return (status < 0) ? status : 0;
 }
 
 int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags)
@@ -2760,7 +3026,7 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi,
 int sha1_object_info(const unsigned char *sha1, unsigned long *sizep)
 {
        enum object_type type;
-       struct object_info oi = {NULL};
+       struct object_info oi = OBJECT_INFO_INIT;
 
        oi.typep = &type;
        oi.sizep = sizep;
@@ -2777,7 +3043,7 @@ static void *read_packed_sha1(const unsigned char *sha1,
 
        if (!find_pack_entry(sha1, &e))
                return NULL;
-       data = cache_or_unpack_entry(e.p, e.offset, size, type, 1);
+       data = cache_or_unpack_entry(e.p, e.offset, size, type);
        if (!data) {
                /*
                 * We're probably in deep shit, but let's try to fetch
@@ -2850,6 +3116,8 @@ void *read_sha1_file_extended(const unsigned char *sha1,
 {
        void *data;
        const struct packed_git *p;
+       const char *path;
+       struct stat st;
        const unsigned char *repl = lookup_replace_object_extended(sha1, flag);
 
        errno = 0;
@@ -2865,12 +3133,9 @@ void *read_sha1_file_extended(const unsigned char *sha1,
                die("replacement %s not found for %s",
                    sha1_to_hex(repl), sha1_to_hex(sha1));
 
-       if (has_loose_object(repl)) {
-               const char *path = sha1_file_name(sha1);
-
+       if (!stat_sha1_file(repl, &st, &path))
                die("loose object %s (stored in %s) is corrupt",
                    sha1_to_hex(repl), path);
-       }
 
        if ((p = has_packed_and_bad(repl)) != NULL)
                die("packed object %s (stored in %s) is corrupt",
@@ -3216,6 +3481,8 @@ int has_sha1_file_with_flags(const unsigned char *sha1, int flags)
 {
        struct pack_entry e;
 
+       if (!startup_info->have_repository)
+               return 0;
        if (find_pack_entry(sha1, &e))
                return 1;
        if (has_loose_object(sha1))
@@ -3493,15 +3760,15 @@ static int for_each_file_in_obj_subdir(int subdir_nr,
                strbuf_setlen(path, baselen);
                strbuf_addf(path, "/%s", de->d_name);
 
-               if (strlen(de->d_name) == 38)  {
-                       char hex[41];
-                       unsigned char sha1[20];
+               if (strlen(de->d_name) == GIT_SHA1_HEXSZ - 2)  {
+                       char hex[GIT_MAX_HEXSZ+1];
+                       struct object_id oid;
 
-                       snprintf(hex, sizeof(hex), "%02x%s",
-                                subdir_nr, de->d_name);
-                       if (!get_sha1_hex(hex, sha1)) {
+                       xsnprintf(hex, sizeof(hex), "%02x%s",
+                                 subdir_nr, de->d_name);
+                       if (!get_oid_hex(hex, &oid)) {
                                if (obj_cb) {
-                                       r = obj_cb(sha1, path->buf, data);
+                                       r = obj_cb(&oid, path->buf, data);
                                        if (r)
                                                break;
                                }
@@ -3575,8 +3842,7 @@ static int loose_from_alt_odb(struct alternate_object_database *alt,
        struct strbuf buf = STRBUF_INIT;
        int r;
 
-       /* copy base not including trailing '/' */
-       strbuf_add(&buf, alt->base, alt->name - alt->base - 1);
+       strbuf_addstr(&buf, alt->path);
        r = for_each_loose_file_in_objdir_buf(&buf,
                                              data->cb, NULL, NULL,
                                              data->data);
@@ -3608,13 +3874,13 @@ static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn c
        int r = 0;
 
        for (i = 0; i < p->num_objects; i++) {
-               const unsigned char *sha1 = nth_packed_object_sha1(p, i);
+               struct object_id oid;
 
-               if (!sha1)
+               if (!nth_packed_object_oid(&oid, p, i))
                        return error("unable to get sha1 of object %u in %s",
                                     i, p->pack_name);
 
-               r = cb(sha1, p, i, data);
+               r = cb(&oid, p, i, data);
                if (r)
                        break;
        }
@@ -3641,3 +3907,119 @@ int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags)
        }
        return r ? r : pack_errors;
 }
+
+static int check_stream_sha1(git_zstream *stream,
+                            const char *hdr,
+                            unsigned long size,
+                            const char *path,
+                            const unsigned char *expected_sha1)
+{
+       git_SHA_CTX c;
+       unsigned char real_sha1[GIT_MAX_RAWSZ];
+       unsigned char buf[4096];
+       unsigned long total_read;
+       int status = Z_OK;
+
+       git_SHA1_Init(&c);
+       git_SHA1_Update(&c, hdr, stream->total_out);
+
+       /*
+        * We already read some bytes into hdr, but the ones up to the NUL
+        * do not count against the object's content size.
+        */
+       total_read = stream->total_out - strlen(hdr) - 1;
+
+       /*
+        * This size comparison must be "<=" to read the final zlib packets;
+        * see the comment in unpack_sha1_rest for details.
+        */
+       while (total_read <= size &&
+              (status == Z_OK || status == Z_BUF_ERROR)) {
+               stream->next_out = buf;
+               stream->avail_out = sizeof(buf);
+               if (size - total_read < stream->avail_out)
+                       stream->avail_out = size - total_read;
+               status = git_inflate(stream, Z_FINISH);
+               git_SHA1_Update(&c, buf, stream->next_out - buf);
+               total_read += stream->next_out - buf;
+       }
+       git_inflate_end(stream);
+
+       if (status != Z_STREAM_END) {
+               error("corrupt loose object '%s'", sha1_to_hex(expected_sha1));
+               return -1;
+       }
+       if (stream->avail_in) {
+               error("garbage at end of loose object '%s'",
+                     sha1_to_hex(expected_sha1));
+               return -1;
+       }
+
+       git_SHA1_Final(real_sha1, &c);
+       if (hashcmp(expected_sha1, real_sha1)) {
+               error("sha1 mismatch for %s (expected %s)", path,
+                     sha1_to_hex(expected_sha1));
+               return -1;
+       }
+
+       return 0;
+}
+
+int read_loose_object(const char *path,
+                     const unsigned char *expected_sha1,
+                     enum object_type *type,
+                     unsigned long *size,
+                     void **contents)
+{
+       int ret = -1;
+       void *map = NULL;
+       unsigned long mapsize;
+       git_zstream stream;
+       char hdr[32];
+
+       *contents = NULL;
+
+       map = map_sha1_file_1(path, NULL, &mapsize);
+       if (!map) {
+               error_errno("unable to mmap %s", path);
+               goto out;
+       }
+
+       if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0) {
+               error("unable to unpack header of %s", path);
+               goto out;
+       }
+
+       *type = parse_sha1_header(hdr, size);
+       if (*type < 0) {
+               error("unable to parse header of %s", path);
+               git_inflate_end(&stream);
+               goto out;
+       }
+
+       if (*type == OBJ_BLOB) {
+               if (check_stream_sha1(&stream, hdr, *size, path, expected_sha1) < 0)
+                       goto out;
+       } else {
+               *contents = unpack_sha1_rest(&stream, hdr, *size, expected_sha1);
+               if (!*contents) {
+                       error("unable to unpack contents of %s", path);
+                       git_inflate_end(&stream);
+                       goto out;
+               }
+               if (check_sha1_signature(expected_sha1, *contents,
+                                        *size, typename(*type))) {
+                       error("sha1 mismatch for %s (expected %s)", path,
+                             sha1_to_hex(expected_sha1));
+                       free(*contents);
+                       goto out;
+               }
+       }
+
+       ret = 0; /* everything checks out */
+
+out:
+       if (map)
+               munmap(map, mapsize);
+       return ret;
+}
index ca7ddd6f2cf7074a1d74e011c2bd260c2ae6ffe6..5e2ec37b6557f59970ed2b2dd69d4e0b151d1fd0 100644 (file)
@@ -7,15 +7,20 @@
 #include "refs.h"
 #include "remote.h"
 #include "dir.h"
+#include "sha1-array.h"
 
 static int get_sha1_oneline(const char *, unsigned char *, struct commit_list *);
 
-typedef int (*disambiguate_hint_fn)(const unsigned char *, void *);
+typedef int (*disambiguate_hint_fn)(const struct object_id *, void *);
 
 struct disambiguate_state {
+       int len; /* length of prefix in hex chars */
+       char hex_pfx[GIT_MAX_HEXSZ + 1];
+       struct object_id bin_pfx;
+
        disambiguate_hint_fn fn;
        void *cb_data;
-       unsigned char candidate[20];
+       struct object_id candidate;
        unsigned candidate_exists:1;
        unsigned candidate_checked:1;
        unsigned candidate_ok:1;
@@ -24,7 +29,7 @@ struct disambiguate_state {
        unsigned always_call_fn:1;
 };
 
-static void update_candidates(struct disambiguate_state *ds, const unsigned char *current)
+static void update_candidates(struct disambiguate_state *ds, const struct object_id *current)
 {
        if (ds->always_call_fn) {
                ds->ambiguous = ds->fn(current, ds->cb_data) ? 1 : 0;
@@ -32,10 +37,10 @@ static void update_candidates(struct disambiguate_state *ds, const unsigned char
        }
        if (!ds->candidate_exists) {
                /* this is the first candidate */
-               hashcpy(ds->candidate, current);
+               oidcpy(&ds->candidate, current);
                ds->candidate_exists = 1;
                return;
-       } else if (!hashcmp(ds->candidate, current)) {
+       } else if (!oidcmp(&ds->candidate, current)) {
                /* the same as what we already have seen */
                return;
        }
@@ -47,14 +52,14 @@ static void update_candidates(struct disambiguate_state *ds, const unsigned char
        }
 
        if (!ds->candidate_checked) {
-               ds->candidate_ok = ds->fn(ds->candidate, ds->cb_data);
+               ds->candidate_ok = ds->fn(&ds->candidate, ds->cb_data);
                ds->disambiguate_fn_used = 1;
                ds->candidate_checked = 1;
        }
 
        if (!ds->candidate_ok) {
                /* discard the candidate; we know it does not satisfy fn */
-               hashcpy(ds->candidate, current);
+               oidcpy(&ds->candidate, current);
                ds->candidate_checked = 0;
                return;
        }
@@ -72,10 +77,10 @@ static void update_candidates(struct disambiguate_state *ds, const unsigned char
        /* otherwise, current can be discarded and candidate is still good */
 }
 
-static void find_short_object_filename(int len, const char *hex_pfx, struct disambiguate_state *ds)
+static void find_short_object_filename(struct disambiguate_state *ds)
 {
        struct alternate_object_database *alt;
-       char hex[40];
+       char hex[GIT_MAX_HEXSZ];
        static struct alternate_object_database *fakeent;
 
        if (!fakeent) {
@@ -86,38 +91,31 @@ static void find_short_object_filename(int len, const char *hex_pfx, struct disa
                 * alt->name/alt->base while iterating over the
                 * object databases including our own.
                 */
-               const char *objdir = get_object_directory();
-               size_t objdir_len = strlen(objdir);
-               fakeent = xmalloc(st_add3(sizeof(*fakeent), objdir_len, 43));
-               memcpy(fakeent->base, objdir, objdir_len);
-               fakeent->name = fakeent->base + objdir_len + 1;
-               fakeent->name[-1] = '/';
+               fakeent = alloc_alt_odb(get_object_directory());
        }
        fakeent->next = alt_odb_list;
 
-       xsnprintf(hex, sizeof(hex), "%.2s", hex_pfx);
+       xsnprintf(hex, sizeof(hex), "%.2s", ds->hex_pfx);
        for (alt = fakeent; alt && !ds->ambiguous; alt = alt->next) {
+               struct strbuf *buf = alt_scratch_buf(alt);
                struct dirent *de;
                DIR *dir;
-               /*
-                * every alt_odb struct has 42 extra bytes after the base
-                * for exactly this purpose
-                */
-               xsnprintf(alt->name, 42, "%.2s/", hex_pfx);
-               dir = opendir(alt->base);
+
+               strbuf_addf(buf, "%.2s/", ds->hex_pfx);
+               dir = opendir(buf->buf);
                if (!dir)
                        continue;
 
                while (!ds->ambiguous && (de = readdir(dir)) != NULL) {
-                       unsigned char sha1[20];
+                       struct object_id oid;
 
-                       if (strlen(de->d_name) != 38)
+                       if (strlen(de->d_name) != GIT_SHA1_HEXSZ - 2)
                                continue;
-                       if (memcmp(de->d_name, hex_pfx + 2, len - 2))
+                       if (memcmp(de->d_name, ds->hex_pfx + 2, ds->len - 2))
                                continue;
-                       memcpy(hex + 2, de->d_name, 38);
-                       if (!get_sha1_hex(hex, sha1))
-                               update_candidates(ds, sha1);
+                       memcpy(hex + 2, de->d_name, GIT_SHA1_HEXSZ - 2);
+                       if (!get_oid_hex(hex, &oid))
+                               update_candidates(ds, &oid);
                }
                closedir(dir);
        }
@@ -138,13 +136,11 @@ static int match_sha(unsigned len, const unsigned char *a, const unsigned char *
        return 1;
 }
 
-static void unique_in_pack(int len,
-                         const unsigned char *bin_pfx,
-                          struct packed_git *p,
+static void unique_in_pack(struct packed_git *p,
                           struct disambiguate_state *ds)
 {
        uint32_t num, last, i, first = 0;
-       const unsigned char *current = NULL;
+       const struct object_id *current = NULL;
 
        open_pack_index(p);
        num = p->num_objects;
@@ -155,7 +151,7 @@ static void unique_in_pack(int len,
                int cmp;
 
                current = nth_packed_object_sha1(p, mid);
-               cmp = hashcmp(bin_pfx, current);
+               cmp = hashcmp(ds->bin_pfx.hash, current);
                if (!cmp) {
                        first = mid;
                        break;
@@ -173,21 +169,21 @@ static void unique_in_pack(int len,
         * 0, 1 or more objects that actually match(es).
         */
        for (i = first; i < num && !ds->ambiguous; i++) {
-               current = nth_packed_object_sha1(p, i);
-               if (!match_sha(len, bin_pfx, current))
+               struct object_id oid;
+               current = nth_packed_object_oid(&oid, p, i);
+               if (!match_sha(ds->len, ds->bin_pfx.hash, current->hash))
                        break;
                update_candidates(ds, current);
        }
 }
 
-static void find_short_packed_object(int len, const unsigned char *bin_pfx,
-                                    struct disambiguate_state *ds)
+static void find_short_packed_object(struct disambiguate_state *ds)
 {
        struct packed_git *p;
 
        prepare_packed_git();
        for (p = packed_git; p && !ds->ambiguous; p = p->next)
-               unique_in_pack(len, bin_pfx, p, ds);
+               unique_in_pack(p, ds);
 }
 
 #define SHORT_NAME_NOT_FOUND (-1)
@@ -218,77 +214,109 @@ static int finish_object_disambiguation(struct disambiguate_state *ds,
                 * same repository!
                 */
                ds->candidate_ok = (!ds->disambiguate_fn_used ||
-                                   ds->fn(ds->candidate, ds->cb_data));
+                                   ds->fn(&ds->candidate, ds->cb_data));
 
        if (!ds->candidate_ok)
                return SHORT_NAME_AMBIGUOUS;
 
-       hashcpy(sha1, ds->candidate);
+       hashcpy(sha1, ds->candidate.hash);
        return 0;
 }
 
-static int disambiguate_commit_only(const unsigned char *sha1, void *cb_data_unused)
+static int disambiguate_commit_only(const struct object_id *oid, void *cb_data_unused)
 {
-       int kind = sha1_object_info(sha1, NULL);
+       int kind = sha1_object_info(oid->hash, NULL);
        return kind == OBJ_COMMIT;
 }
 
-static int disambiguate_committish_only(const unsigned char *sha1, void *cb_data_unused)
+static int disambiguate_committish_only(const struct object_id *oid, void *cb_data_unused)
 {
        struct object *obj;
        int kind;
 
-       kind = sha1_object_info(sha1, NULL);
+       kind = sha1_object_info(oid->hash, NULL);
        if (kind == OBJ_COMMIT)
                return 1;
        if (kind != OBJ_TAG)
                return 0;
 
        /* We need to do this the hard way... */
-       obj = deref_tag(parse_object(sha1), NULL, 0);
+       obj = deref_tag(parse_object(oid->hash), NULL, 0);
        if (obj && obj->type == OBJ_COMMIT)
                return 1;
        return 0;
 }
 
-static int disambiguate_tree_only(const unsigned char *sha1, void *cb_data_unused)
+static int disambiguate_tree_only(const struct object_id *oid, void *cb_data_unused)
 {
-       int kind = sha1_object_info(sha1, NULL);
+       int kind = sha1_object_info(oid->hash, NULL);
        return kind == OBJ_TREE;
 }
 
-static int disambiguate_treeish_only(const unsigned char *sha1, void *cb_data_unused)
+static int disambiguate_treeish_only(const struct object_id *oid, void *cb_data_unused)
 {
        struct object *obj;
        int kind;
 
-       kind = sha1_object_info(sha1, NULL);
+       kind = sha1_object_info(oid->hash, NULL);
        if (kind == OBJ_TREE || kind == OBJ_COMMIT)
                return 1;
        if (kind != OBJ_TAG)
                return 0;
 
        /* We need to do this the hard way... */
-       obj = deref_tag(lookup_object(sha1), NULL, 0);
+       obj = deref_tag(parse_object(oid->hash), NULL, 0);
        if (obj && (obj->type == OBJ_TREE || obj->type == OBJ_COMMIT))
                return 1;
        return 0;
 }
 
-static int disambiguate_blob_only(const unsigned char *sha1, void *cb_data_unused)
+static int disambiguate_blob_only(const struct object_id *oid, void *cb_data_unused)
 {
-       int kind = sha1_object_info(sha1, NULL);
+       int kind = sha1_object_info(oid->hash, NULL);
        return kind == OBJ_BLOB;
 }
 
-static int prepare_prefixes(const char *name, int len,
-                           unsigned char *bin_pfx,
-                           char *hex_pfx)
+static disambiguate_hint_fn default_disambiguate_hint;
+
+int set_disambiguate_hint_config(const char *var, const char *value)
 {
+       static const struct {
+               const char *name;
+               disambiguate_hint_fn fn;
+       } hints[] = {
+               { "none", NULL },
+               { "commit", disambiguate_commit_only },
+               { "committish", disambiguate_committish_only },
+               { "tree", disambiguate_tree_only },
+               { "treeish", disambiguate_treeish_only },
+               { "blob", disambiguate_blob_only }
+       };
        int i;
 
-       hashclr(bin_pfx);
-       memset(hex_pfx, 'x', 40);
+       if (!value)
+               return config_error_nonbool(var);
+
+       for (i = 0; i < ARRAY_SIZE(hints); i++) {
+               if (!strcasecmp(value, hints[i].name)) {
+                       default_disambiguate_hint = hints[i].fn;
+                       return 0;
+               }
+       }
+
+       return error("unknown hint type for '%s': %s", var, value);
+}
+
+static int init_object_disambiguation(const char *name, int len,
+                                     struct disambiguate_state *ds)
+{
+       int i;
+
+       if (len < MINIMUM_ABBREV || len > GIT_SHA1_HEXSZ)
+               return -1;
+
+       memset(ds, 0, sizeof(*ds));
+
        for (i = 0; i < len ;i++) {
                unsigned char c = name[i];
                unsigned char val;
@@ -302,11 +330,48 @@ static int prepare_prefixes(const char *name, int len,
                }
                else
                        return -1;
-               hex_pfx[i] = c;
+               ds->hex_pfx[i] = c;
                if (!(i & 1))
                        val <<= 4;
-               bin_pfx[i >> 1] |= val;
+               ds->bin_pfx.hash[i >> 1] |= val;
+       }
+
+       ds->len = len;
+       ds->hex_pfx[len] = '\0';
+       prepare_alt_odb();
+       return 0;
+}
+
+static int show_ambiguous_object(const struct object_id *oid, void *data)
+{
+       const struct disambiguate_state *ds = data;
+       struct strbuf desc = STRBUF_INIT;
+       int type;
+
+
+       if (ds->fn && !ds->fn(oid, ds->cb_data))
+               return 0;
+
+       type = sha1_object_info(oid->hash, NULL);
+       if (type == OBJ_COMMIT) {
+               struct commit *commit = lookup_commit(oid->hash);
+               if (commit) {
+                       struct pretty_print_context pp = {0};
+                       pp.date_mode.type = DATE_SHORT;
+                       format_commit_message(commit, " %ad - %s", &desc, &pp);
+               }
+       } else if (type == OBJ_TAG) {
+               struct tag *tag = lookup_tag(oid->hash);
+               if (!parse_tag(tag) && tag->tag)
+                       strbuf_addf(&desc, " %s", tag->tag);
        }
+
+       advise("  %s %s%s",
+              find_unique_abbrev(oid->hash, DEFAULT_ABBREV),
+              typename(type) ? typename(type) : "unknown type",
+              desc.buf);
+
+       strbuf_release(&desc);
        return 0;
 }
 
@@ -314,19 +379,15 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
                          unsigned flags)
 {
        int status;
-       char hex_pfx[40];
-       unsigned char bin_pfx[20];
        struct disambiguate_state ds;
        int quietly = !!(flags & GET_SHA1_QUIETLY);
 
-       if (len < MINIMUM_ABBREV || len > 40)
-               return -1;
-       if (prepare_prefixes(name, len, bin_pfx, hex_pfx) < 0)
+       if (init_object_disambiguation(name, len, &ds) < 0)
                return -1;
 
-       prepare_alt_odb();
+       if (HAS_MULTI_BITS(flags & GET_SHA1_DISAMBIGUATORS))
+               die("BUG: multiple get_short_sha1 disambiguator flags");
 
-       memset(&ds, 0, sizeof(ds));
        if (flags & GET_SHA1_COMMIT)
                ds.fn = disambiguate_commit_only;
        else if (flags & GET_SHA1_COMMITTISH)
@@ -337,44 +398,98 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
                ds.fn = disambiguate_treeish_only;
        else if (flags & GET_SHA1_BLOB)
                ds.fn = disambiguate_blob_only;
+       else
+               ds.fn = default_disambiguate_hint;
 
-       find_short_object_filename(len, hex_pfx, &ds);
-       find_short_packed_object(len, bin_pfx, &ds);
+       find_short_object_filename(&ds);
+       find_short_packed_object(&ds);
        status = finish_object_disambiguation(&ds, sha1);
 
-       if (!quietly && (status == SHORT_NAME_AMBIGUOUS))
-               return error("short SHA1 %.*s is ambiguous.", len, hex_pfx);
+       if (!quietly && (status == SHORT_NAME_AMBIGUOUS)) {
+               error(_("short SHA1 %s is ambiguous"), ds.hex_pfx);
+
+               /*
+                * We may still have ambiguity if we simply saw a series of
+                * candidates that did not satisfy our hint function. In
+                * that case, we still want to show them, so disable the hint
+                * function entirely.
+                */
+               if (!ds.ambiguous)
+                       ds.fn = NULL;
+
+               advise(_("The candidates are:"));
+               for_each_abbrev(ds.hex_pfx, show_ambiguous_object, &ds);
+       }
+
        return status;
 }
 
+static int collect_ambiguous(const struct object_id *oid, void *data)
+{
+       oid_array_append(data, oid);
+       return 0;
+}
+
 int for_each_abbrev(const char *prefix, each_abbrev_fn fn, void *cb_data)
 {
-       char hex_pfx[40];
-       unsigned char bin_pfx[20];
+       struct oid_array collect = OID_ARRAY_INIT;
        struct disambiguate_state ds;
-       int len = strlen(prefix);
+       int ret;
 
-       if (len < MINIMUM_ABBREV || len > 40)
-               return -1;
-       if (prepare_prefixes(prefix, len, bin_pfx, hex_pfx) < 0)
+       if (init_object_disambiguation(prefix, strlen(prefix), &ds) < 0)
                return -1;
 
-       prepare_alt_odb();
-
-       memset(&ds, 0, sizeof(ds));
        ds.always_call_fn = 1;
-       ds.cb_data = cb_data;
-       ds.fn = fn;
+       ds.fn = collect_ambiguous;
+       ds.cb_data = &collect;
+       find_short_object_filename(&ds);
+       find_short_packed_object(&ds);
+
+       ret = oid_array_for_each_unique(&collect, fn, cb_data);
+       oid_array_clear(&collect);
+       return ret;
+}
 
-       find_short_object_filename(len, hex_pfx, &ds);
-       find_short_packed_object(len, bin_pfx, &ds);
-       return ds.ambiguous;
+/*
+ * Return the slot of the most-significant bit set in "val". There are various
+ * ways to do this quickly with fls() or __builtin_clzl(), but speed is
+ * probably not a big deal here.
+ */
+static unsigned msb(unsigned long val)
+{
+       unsigned r = 0;
+       while (val >>= 1)
+               r++;
+       return r;
 }
 
 int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len)
 {
        int status, exists;
 
+       if (len < 0) {
+               unsigned long count = approximate_object_count();
+               /*
+                * Add one because the MSB only tells us the highest bit set,
+                * not including the value of all the _other_ bits (so "15"
+                * is only one off of 2^4, but the MSB is the 3rd bit.
+                */
+               len = msb(count) + 1;
+               /*
+                * We now know we have on the order of 2^len objects, which
+                * expects a collision at 2^(len/2). But we also care about hex
+                * chars, not bits, and there are 4 bits per hex. So all
+                * together we need to divide by 2; but we also want to round
+                * odd numbers up, hence adding one before dividing.
+                */
+               len = (len + 1) / 2;
+               /*
+                * For very small repos, we stick with our regular fallback.
+                */
+               if (len < FALLBACK_DEFAULT_ABBREV)
+                       len = FALLBACK_DEFAULT_ABBREV;
+       }
+
        sha1_to_hex_r(hex, sha1);
        if (len == 40 || !len)
                return 40;
@@ -395,7 +510,10 @@ int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len)
 
 const char *find_unique_abbrev(const unsigned char *sha1, int len)
 {
-       static char hex[GIT_SHA1_HEXSZ + 1];
+       static int bufno;
+       static char hexbuffer[4][GIT_MAX_HEXSZ + 1];
+       char *hex = hexbuffer[bufno];
+       bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer);
        find_unique_abbrev_r(hex, sha1, len);
        return hex;
 }
@@ -433,7 +551,7 @@ static inline int at_mark(const char *string, int len,
        for (i = 0; i < nr; i++) {
                int suffix_len = strlen(suffix[i]);
                if (suffix_len <= len
-                   && !memcmp(string, suffix[i], suffix_len))
+                   && !strncasecmp(string, suffix[i], suffix_len))
                        return suffix_len;
        }
        return 0;
@@ -677,12 +795,12 @@ struct object *peel_to_type(const char *name, int namelen,
        }
 }
 
-static int peel_onion(const char *name, int len, unsigned char *sha1)
+static int peel_onion(const char *name, int len, unsigned char *sha1,
+                     unsigned lookup_flags)
 {
        unsigned char outer[20];
        const char *sp;
        unsigned int expected_type = 0;
-       unsigned lookup_flags = 0;
        struct object *o;
 
        /*
@@ -722,10 +840,11 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
        else
                return -1;
 
+       lookup_flags &= ~GET_SHA1_DISAMBIGUATORS;
        if (expected_type == OBJ_COMMIT)
-               lookup_flags = GET_SHA1_COMMITTISH;
+               lookup_flags |= GET_SHA1_COMMITTISH;
        else if (expected_type == OBJ_TREE)
-               lookup_flags = GET_SHA1_TREEISH;
+               lookup_flags |= GET_SHA1_TREEISH;
 
        if (get_sha1_1(name, sp - name - 2, outer, lookup_flags))
                return -1;
@@ -826,7 +945,7 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned l
                return get_nth_ancestor(name, len1, sha1, num);
        }
 
-       ret = peel_onion(name, len, sha1);
+       ret = peel_onion(name, len, sha1, lookup_flags);
        if (!ret)
                return 0;
 
@@ -934,7 +1053,7 @@ struct grab_nth_branch_switch_cbdata {
        struct strbuf buf;
 };
 
-static int grab_nth_branch_switch(unsigned char *osha1, unsigned char *nsha1,
+static int grab_nth_branch_switch(struct object_id *ooid, struct object_id *noid,
                                  const char *email, unsigned long timestamp, int tz,
                                  const char *message, void *cb_data)
 {
@@ -995,35 +1114,35 @@ static int interpret_nth_prior_checkout(const char *name, int namelen,
        return retval;
 }
 
-int get_sha1_mb(const char *name, unsigned char *sha1)
+int get_oid_mb(const char *name, struct object_id *oid)
 {
        struct commit *one, *two;
        struct commit_list *mbs;
-       unsigned char sha1_tmp[20];
+       struct object_id oid_tmp;
        const char *dots;
        int st;
 
        dots = strstr(name, "...");
        if (!dots)
-               return get_sha1(name, sha1);
+               return get_oid(name, oid);
        if (dots == name)
-               st = get_sha1("HEAD", sha1_tmp);
+               st = get_oid("HEAD", &oid_tmp);
        else {
                struct strbuf sb;
                strbuf_init(&sb, dots - name);
                strbuf_add(&sb, name, dots - name);
-               st = get_sha1_committish(sb.buf, sha1_tmp);
+               st = get_sha1_committish(sb.buf, oid_tmp.hash);
                strbuf_release(&sb);
        }
        if (st)
                return st;
-       one = lookup_commit_reference_gently(sha1_tmp, 0);
+       one = lookup_commit_reference_gently(oid_tmp.hash, 0);
        if (!one)
                return -1;
 
-       if (get_sha1_committish(dots[3] ? (dots + 3) : "HEAD", sha1_tmp))
+       if (get_sha1_committish(dots[3] ? (dots + 3) : "HEAD", oid_tmp.hash))
                return -1;
-       two = lookup_commit_reference_gently(sha1_tmp, 0);
+       two = lookup_commit_reference_gently(oid_tmp.hash, 0);
        if (!two)
                return -1;
        mbs = get_merge_bases(one, two);
@@ -1031,7 +1150,7 @@ int get_sha1_mb(const char *name, unsigned char *sha1)
                st = -1;
        else {
                st = 0;
-               hashcpy(sha1, mbs->item->object.oid.hash);
+               oidcpy(oid, &mbs->item->object.oid);
        }
        free_commit_list(mbs);
        return st;
@@ -1059,7 +1178,8 @@ static int interpret_empty_at(const char *name, int namelen, int len, struct str
        return 1;
 }
 
-static int reinterpret(const char *name, int namelen, int len, struct strbuf *buf)
+static int reinterpret(const char *name, int namelen, int len,
+                      struct strbuf *buf, unsigned allowed)
 {
        /* we have extra data, which might need further processing */
        struct strbuf tmp = STRBUF_INIT;
@@ -1067,7 +1187,7 @@ static int reinterpret(const char *name, int namelen, int len, struct strbuf *bu
        int ret;
 
        strbuf_add(buf, name + len, namelen - len);
-       ret = interpret_branch_name(buf->buf, buf->len, &tmp);
+       ret = interpret_branch_name(buf->buf, buf->len, &tmp, allowed);
        /* that data was not interpreted, remove our cruft */
        if (ret < 0) {
                strbuf_setlen(buf, used);
@@ -1088,11 +1208,27 @@ static void set_shortened_ref(struct strbuf *buf, const char *ref)
        free(s);
 }
 
+static int branch_interpret_allowed(const char *refname, unsigned allowed)
+{
+       if (!allowed)
+               return 1;
+
+       if ((allowed & INTERPRET_BRANCH_LOCAL) &&
+           starts_with(refname, "refs/heads/"))
+               return 1;
+       if ((allowed & INTERPRET_BRANCH_REMOTE) &&
+           starts_with(refname, "refs/remotes/"))
+               return 1;
+
+       return 0;
+}
+
 static int interpret_branch_mark(const char *name, int namelen,
                                 int at, struct strbuf *buf,
                                 int (*get_mark)(const char *, int),
                                 const char *(*get_data)(struct branch *,
-                                                        struct strbuf *))
+                                                        struct strbuf *),
+                                unsigned allowed)
 {
        int len;
        struct branch *branch;
@@ -1117,64 +1253,55 @@ static int interpret_branch_mark(const char *name, int namelen,
        if (!value)
                die("%s", err.buf);
 
+       if (!branch_interpret_allowed(value, allowed))
+               return -1;
+
        set_shortened_ref(buf, value);
        return len + at;
 }
 
-/*
- * This reads short-hand syntax that not only evaluates to a commit
- * object name, but also can act as if the end user spelled the name
- * of the branch from the command line.
- *
- * - "@{-N}" finds the name of the Nth previous branch we were on, and
- *   places the name of the branch in the given buf and returns the
- *   number of characters parsed if successful.
- *
- * - "<branch>@{upstream}" finds the name of the other ref that
- *   <branch> is configured to merge with (missing <branch> defaults
- *   to the current branch), and places the name of the branch in the
- *   given buf and returns the number of characters parsed if
- *   successful.
- *
- * If the input is not of the accepted format, it returns a negative
- * number to signal an error.
- *
- * If the input was ok but there are not N branch switches in the
- * reflog, it returns 0.
- */
-int interpret_branch_name(const char *name, int namelen, struct strbuf *buf)
+int interpret_branch_name(const char *name, int namelen, struct strbuf *buf,
+                         unsigned allowed)
 {
        char *at;
        const char *start;
-       int len = interpret_nth_prior_checkout(name, namelen, buf);
+       int len;
 
        if (!namelen)
                namelen = strlen(name);
 
-       if (!len) {
-               return len; /* syntax Ok, not enough switches */
-       } else if (len > 0) {
-               if (len == namelen)
-                       return len; /* consumed all */
-               else
-                       return reinterpret(name, namelen, len, buf);
+       if (!allowed || (allowed & INTERPRET_BRANCH_LOCAL)) {
+               len = interpret_nth_prior_checkout(name, namelen, buf);
+               if (!len) {
+                       return len; /* syntax Ok, not enough switches */
+               } else if (len > 0) {
+                       if (len == namelen)
+                               return len; /* consumed all */
+                       else
+                               return reinterpret(name, namelen, len, buf, allowed);
+               }
        }
 
        for (start = name;
             (at = memchr(start, '@', namelen - (start - name)));
             start = at + 1) {
 
-               len = interpret_empty_at(name, namelen, at - name, buf);
-               if (len > 0)
-                       return reinterpret(name, namelen, len, buf);
+               if (!allowed || (allowed & INTERPRET_BRANCH_HEAD)) {
+                       len = interpret_empty_at(name, namelen, at - name, buf);
+                       if (len > 0)
+                               return reinterpret(name, namelen, len, buf,
+                                                  allowed);
+               }
 
                len = interpret_branch_mark(name, namelen, at - name, buf,
-                                           upstream_mark, branch_get_upstream);
+                                           upstream_mark, branch_get_upstream,
+                                           allowed);
                if (len > 0)
                        return len;
 
                len = interpret_branch_mark(name, namelen, at - name, buf,
-                                           push_mark, branch_get_push);
+                                           push_mark, branch_get_push,
+                                           allowed);
                if (len > 0)
                        return len;
        }
@@ -1182,22 +1309,19 @@ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf)
        return -1;
 }
 
-int strbuf_branchname(struct strbuf *sb, const char *name)
+void strbuf_branchname(struct strbuf *sb, const char *name, unsigned allowed)
 {
        int len = strlen(name);
-       int used = interpret_branch_name(name, len, sb);
+       int used = interpret_branch_name(name, len, sb, allowed);
 
-       if (used == len)
-               return 0;
        if (used < 0)
                used = 0;
        strbuf_add(sb, name + used, len - used);
-       return len;
 }
 
 int strbuf_check_branch_ref(struct strbuf *sb, const char *name)
 {
-       strbuf_branchname(sb, name);
+       strbuf_branchname(sb, name, INTERPRET_BRANCH_LOCAL);
        if (name[0] == '-')
                return -1;
        strbuf_splice(sb, 0, 0, "refs/heads/", 11);
@@ -1382,8 +1506,12 @@ static int get_sha1_with_context_1(const char *name,
        const char *cp;
        int only_to_die = flags & GET_SHA1_ONLY_TO_DIE;
 
+       if (only_to_die)
+               flags |= GET_SHA1_QUIETLY;
+
        memset(oc, 0, sizeof(*oc));
        oc->mode = S_IFINVALID;
+       strbuf_init(&oc->symlink_path, 0);
        ret = get_sha1_1(name, namelen, sha1, flags);
        if (!ret)
                return ret;
@@ -1422,7 +1550,8 @@ static int get_sha1_with_context_1(const char *name,
                        namelen = strlen(cp);
                }
 
-               strlcpy(oc->path, cp, sizeof(oc->path));
+               if (flags & GET_SHA1_RECORD_PATH)
+                       oc->path = xstrdup(cp);
 
                if (!active_cache)
                        read_cache();
@@ -1435,7 +1564,7 @@ static int get_sha1_with_context_1(const char *name,
                            memcmp(ce->name, cp, namelen))
                                break;
                        if (ce_stage(ce) == stage) {
-                               hashcpy(sha1, ce->sha1);
+                               hashcpy(sha1, ce->oid.hash);
                                oc->mode = ce->ce_mode;
                                free(new_path);
                                return 0;
@@ -1458,7 +1587,12 @@ static int get_sha1_with_context_1(const char *name,
        if (*cp == ':') {
                unsigned char tree_sha1[20];
                int len = cp - name;
-               if (!get_sha1_1(name, len, tree_sha1, GET_SHA1_TREEISH)) {
+               unsigned sub_flags = flags;
+
+               sub_flags &= ~GET_SHA1_DISAMBIGUATORS;
+               sub_flags |= GET_SHA1_TREEISH;
+
+               if (!get_sha1_1(name, len, tree_sha1, sub_flags)) {
                        const char *filename = cp+1;
                        char *new_filename = NULL;
 
@@ -1480,7 +1614,8 @@ static int get_sha1_with_context_1(const char *name,
                                }
                        }
                        hashcpy(oc->tree, tree_sha1);
-                       strlcpy(oc->path, filename, sizeof(oc->path));
+                       if (flags & GET_SHA1_RECORD_PATH)
+                               oc->path = xstrdup(filename);
 
                        free(new_filename);
                        return ret;
@@ -1506,9 +1641,9 @@ void maybe_die_on_misspelt_object_name(const char *name, const char *prefix)
        get_sha1_with_context_1(name, GET_SHA1_ONLY_TO_DIE, prefix, sha1, &oc);
 }
 
-int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *orc)
+int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *oc)
 {
        if (flags & GET_SHA1_FOLLOW_SYMLINKS && flags & GET_SHA1_ONLY_TO_DIE)
                die("BUG: incompatible flags for get_sha1_with_context");
-       return get_sha1_with_context_1(str, flags, NULL, sha1, orc);
+       return get_sha1_with_context_1(str, flags, NULL, sha1, oc);
 }
diff --git a/sha1dc/.gitattributes b/sha1dc/.gitattributes
new file mode 100644 (file)
index 0000000..da53f40
--- /dev/null
@@ -0,0 +1 @@
+* whitespace=-indent-with-non-tab
diff --git a/sha1dc/LICENSE.txt b/sha1dc/LICENSE.txt
new file mode 100644 (file)
index 0000000..4a3e6a1
--- /dev/null
@@ -0,0 +1,30 @@
+MIT License
+
+Copyright (c) 2017:
+    Marc Stevens
+    Cryptology Group
+    Centrum Wiskunde & Informatica
+    P.O. Box 94079, 1090 GB Amsterdam, Netherlands
+    marc@marc-stevens.nl
+
+    Dan Shumow
+    Microsoft Research
+    danshu@microsoft.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/sha1dc/sha1.c b/sha1dc/sha1.c
new file mode 100644 (file)
index 0000000..facea1b
--- /dev/null
@@ -0,0 +1,1856 @@
+/***
+* Copyright 2017 Marc Stevens <marc@marc-stevens.nl>, Dan Shumow (danshu@microsoft.com)
+* Distributed under the MIT Software License.
+* See accompanying file LICENSE.txt or copy at
+* https://opensource.org/licenses/MIT
+***/
+
+#ifndef SHA1DC_NO_STANDARD_INCLUDES
+#include <string.h>
+#include <memory.h>
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+#ifdef SHA1DC_CUSTOM_INCLUDE_SHA1_C
+#include SHA1DC_CUSTOM_INCLUDE_SHA1_C
+#endif
+
+#ifndef SHA1DC_INIT_SAFE_HASH_DEFAULT
+#define SHA1DC_INIT_SAFE_HASH_DEFAULT 1
+#endif
+
+#include "sha1.h"
+#include "ubc_check.h"
+
+
+/*
+   Because Little-Endian architectures are most common,
+   we only set SHA1DC_BIGENDIAN if one of these conditions is met.
+   Note that all MSFT platforms are little endian,
+   so none of these will be defined under the MSC compiler.
+   If you are compiling on a big endian platform and your compiler does not define one of these,
+   you will have to add whatever macros your tool chain defines to indicate Big-Endianness.
+ */
+#ifdef SHA1DC_BIGENDIAN
+#undef SHA1DC_BIGENDIAN
+#endif
+
+#if (defined(_BYTE_ORDER) || defined(__BYTE_ORDER) || defined(__BYTE_ORDER__))
+
+#if ((defined(_BYTE_ORDER) && (_BYTE_ORDER == _BIG_ENDIAN)) || \
+     (defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN)) || \
+     (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __BIG_ENDIAN__)) )
+#define SHA1DC_BIGENDIAN
+#endif
+
+#else
+
+#if (defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN) || defined(__BIG_ENDIAN__) || \
+     defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \
+     defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || \
+     defined(__sparc))
+#define SHA1DC_BIGENDIAN
+#endif
+
+#endif
+
+#if (defined(SHA1DC_FORCE_LITTLEENDIAN) && defined(SHA1DC_BIGENDIAN))
+#undef SHA1DC_BIGENDIAN
+#endif
+#if (defined(SHA1DC_FORCE_BIGENDIAN) && !defined(SHA1DC_BIGENDIAN))
+#define SHA1DC_BIGENDIAN
+#endif
+/*ENDIANNESS SELECTION*/
+
+#if (defined SHA1DC_FORCE_UNALIGNED_ACCESS || \
+     defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || \
+     defined(i386) || defined(__i386) || defined(__i386__) || defined(__i486__)  || \
+     defined(__i586__) || defined(__i686__) || defined(_M_IX86) || defined(__X86__) || \
+     defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) || defined(__INTEL__) || \
+     defined(__386) || defined(_M_X64) || defined(_M_AMD64))
+
+#define SHA1DC_ALLOW_UNALIGNED_ACCESS
+
+#endif /*UNALIGNMENT DETECTION*/
+
+
+#define rotate_right(x,n) (((x)>>(n))|((x)<<(32-(n))))
+#define rotate_left(x,n)  (((x)<<(n))|((x)>>(32-(n))))
+
+#define sha1_bswap32(x) \
+       {x = ((x << 8) & 0xFF00FF00) | ((x >> 8) & 0xFF00FF); x = (x << 16) | (x >> 16);}
+
+#define sha1_mix(W, t)  (rotate_left(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1))
+
+#ifdef SHA1DC_BIGENDIAN
+       #define sha1_load(m, t, temp)  { temp = m[t]; }
+#else
+       #define sha1_load(m, t, temp)  { temp = m[t]; sha1_bswap32(temp); }
+#endif
+
+#define sha1_store(W, t, x)    *(volatile uint32_t *)&W[t] = x
+
+#define sha1_f1(b,c,d) ((d)^((b)&((c)^(d))))
+#define sha1_f2(b,c,d) ((b)^(c)^(d))
+#define sha1_f3(b,c,d) (((b)&(c))+((d)&((b)^(c))))
+#define sha1_f4(b,c,d) ((b)^(c)^(d))
+
+#define HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, m, t) \
+       { e += rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999 + m[t]; b = rotate_left(b, 30); }
+#define HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, m, t) \
+       { e += rotate_left(a, 5) + sha1_f2(b,c,d) + 0x6ED9EBA1 + m[t]; b = rotate_left(b, 30); }
+#define HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, m, t) \
+       { e += rotate_left(a, 5) + sha1_f3(b,c,d) + 0x8F1BBCDC + m[t]; b = rotate_left(b, 30); }
+#define HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, m, t) \
+       { e += rotate_left(a, 5) + sha1_f4(b,c,d) + 0xCA62C1D6 + m[t]; b = rotate_left(b, 30); }
+
+#define HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, m, t) \
+       { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999 + m[t]; }
+#define HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, m, t) \
+       { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f2(b,c,d) + 0x6ED9EBA1 + m[t]; }
+#define HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, m, t) \
+       { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f3(b,c,d) + 0x8F1BBCDC + m[t]; }
+#define HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, m, t) \
+       { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f4(b,c,d) + 0xCA62C1D6 + m[t]; }
+
+#define SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, t, temp) \
+       {sha1_load(m, t, temp); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999; b = rotate_left(b, 30);}
+
+#define SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(a, b, c, d, e, W, t, temp) \
+       {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999; b = rotate_left(b, 30); }
+
+#define SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, t, temp) \
+       {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f2(b,c,d) + 0x6ED9EBA1; b = rotate_left(b, 30); }
+
+#define SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, t, temp) \
+       {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f3(b,c,d) + 0x8F1BBCDC; b = rotate_left(b, 30); }
+
+#define SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, t, temp) \
+       {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f4(b,c,d) + 0xCA62C1D6; b = rotate_left(b, 30); }
+
+
+#define SHA1_STORE_STATE(i) states[i][0] = a; states[i][1] = b; states[i][2] = c; states[i][3] = d; states[i][4] = e;
+
+#ifdef BUILDNOCOLLDETECTSHA1COMPRESSION
+void sha1_compression(uint32_t ihv[5], const uint32_t m[16])
+{
+       uint32_t W[80];
+       uint32_t a,b,c,d,e;
+       unsigned i;
+
+       memcpy(W, m, 16 * 4);
+       for (i = 16; i < 80; ++i)
+               W[i] = sha1_mix(W, i);
+
+       a = ihv[0]; b = ihv[1]; c = ihv[2]; d = ihv[3]; e = ihv[4];
+
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 0);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 1);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 2);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 3);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 4);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 5);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 6);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 7);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 8);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 9);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 10);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 11);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 12);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 13);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 14);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 15);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 16);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 17);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 18);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 19);
+
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 20);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 21);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 22);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 23);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 24);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 25);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 26);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 27);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 28);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 29);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 30);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 31);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 32);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 33);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 34);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 35);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 36);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 37);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 38);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 39);
+
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 40);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 41);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 42);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 43);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 44);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 45);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 46);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 47);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 48);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 49);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 50);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 51);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 52);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 53);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 54);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 55);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 56);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 57);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 58);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 59);
+
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 60);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 61);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 62);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 63);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 64);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 65);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 66);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 67);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 68);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 69);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 70);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 71);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 72);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 73);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 74);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 75);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 76);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 77);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 78);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 79);
+
+       ihv[0] += a; ihv[1] += b; ihv[2] += c; ihv[3] += d; ihv[4] += e;
+}
+#endif /*BUILDNOCOLLDETECTSHA1COMPRESSION*/
+
+
+static void sha1_compression_W(uint32_t ihv[5], const uint32_t W[80])
+{
+       uint32_t a = ihv[0], b = ihv[1], c = ihv[2], d = ihv[3], e = ihv[4];
+
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 0);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 1);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 2);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 3);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 4);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 5);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 6);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 7);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 8);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 9);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 10);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 11);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 12);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 13);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 14);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 15);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 16);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 17);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 18);
+       HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 19);
+
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 20);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 21);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 22);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 23);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 24);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 25);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 26);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 27);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 28);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 29);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 30);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 31);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 32);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 33);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 34);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 35);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 36);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 37);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 38);
+       HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 39);
+
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 40);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 41);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 42);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 43);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 44);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 45);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 46);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 47);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 48);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 49);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 50);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 51);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 52);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 53);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 54);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 55);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 56);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 57);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 58);
+       HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 59);
+
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 60);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 61);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 62);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 63);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 64);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 65);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 66);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 67);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 68);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 69);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 70);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 71);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 72);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 73);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 74);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 75);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 76);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 77);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 78);
+       HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 79);
+
+       ihv[0] += a; ihv[1] += b; ihv[2] += c; ihv[3] += d; ihv[4] += e;
+}
+
+
+
+void sha1_compression_states(uint32_t ihv[5], const uint32_t m[16], uint32_t W[80], uint32_t states[80][5])
+{
+       uint32_t a = ihv[0], b = ihv[1], c = ihv[2], d = ihv[3], e = ihv[4];
+       uint32_t temp;
+
+#ifdef DOSTORESTATE00
+       SHA1_STORE_STATE(0)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 0, temp);
+
+#ifdef DOSTORESTATE01
+       SHA1_STORE_STATE(1)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(e, a, b, c, d, m, W, 1, temp);
+
+#ifdef DOSTORESTATE02
+       SHA1_STORE_STATE(2)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(d, e, a, b, c, m, W, 2, temp);
+
+#ifdef DOSTORESTATE03
+       SHA1_STORE_STATE(3)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(c, d, e, a, b, m, W, 3, temp);
+
+#ifdef DOSTORESTATE04
+       SHA1_STORE_STATE(4)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(b, c, d, e, a, m, W, 4, temp);
+
+#ifdef DOSTORESTATE05
+       SHA1_STORE_STATE(5)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 5, temp);
+
+#ifdef DOSTORESTATE06
+       SHA1_STORE_STATE(6)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(e, a, b, c, d, m, W, 6, temp);
+
+#ifdef DOSTORESTATE07
+       SHA1_STORE_STATE(7)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(d, e, a, b, c, m, W, 7, temp);
+
+#ifdef DOSTORESTATE08
+       SHA1_STORE_STATE(8)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(c, d, e, a, b, m, W, 8, temp);
+
+#ifdef DOSTORESTATE09
+       SHA1_STORE_STATE(9)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(b, c, d, e, a, m, W, 9, temp);
+
+#ifdef DOSTORESTATE10
+       SHA1_STORE_STATE(10)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 10, temp);
+
+#ifdef DOSTORESTATE11
+       SHA1_STORE_STATE(11)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(e, a, b, c, d, m, W, 11, temp);
+
+#ifdef DOSTORESTATE12
+       SHA1_STORE_STATE(12)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(d, e, a, b, c, m, W, 12, temp);
+
+#ifdef DOSTORESTATE13
+       SHA1_STORE_STATE(13)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(c, d, e, a, b, m, W, 13, temp);
+
+#ifdef DOSTORESTATE14
+       SHA1_STORE_STATE(14)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(b, c, d, e, a, m, W, 14, temp);
+
+#ifdef DOSTORESTATE15
+       SHA1_STORE_STATE(15)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 15, temp);
+
+#ifdef DOSTORESTATE16
+       SHA1_STORE_STATE(16)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(e, a, b, c, d, W, 16, temp);
+
+#ifdef DOSTORESTATE17
+       SHA1_STORE_STATE(17)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(d, e, a, b, c, W, 17, temp);
+
+#ifdef DOSTORESTATE18
+       SHA1_STORE_STATE(18)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(c, d, e, a, b, W, 18, temp);
+
+#ifdef DOSTORESTATE19
+       SHA1_STORE_STATE(19)
+#endif
+       SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(b, c, d, e, a, W, 19, temp);
+
+
+
+#ifdef DOSTORESTATE20
+       SHA1_STORE_STATE(20)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 20, temp);
+
+#ifdef DOSTORESTATE21
+       SHA1_STORE_STATE(21)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 21, temp);
+
+#ifdef DOSTORESTATE22
+       SHA1_STORE_STATE(22)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 22, temp);
+
+#ifdef DOSTORESTATE23
+       SHA1_STORE_STATE(23)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 23, temp);
+
+#ifdef DOSTORESTATE24
+       SHA1_STORE_STATE(24)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 24, temp);
+
+#ifdef DOSTORESTATE25
+       SHA1_STORE_STATE(25)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 25, temp);
+
+#ifdef DOSTORESTATE26
+       SHA1_STORE_STATE(26)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 26, temp);
+
+#ifdef DOSTORESTATE27
+       SHA1_STORE_STATE(27)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 27, temp);
+
+#ifdef DOSTORESTATE28
+       SHA1_STORE_STATE(28)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 28, temp);
+
+#ifdef DOSTORESTATE29
+       SHA1_STORE_STATE(29)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 29, temp);
+
+#ifdef DOSTORESTATE30
+       SHA1_STORE_STATE(30)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 30, temp);
+
+#ifdef DOSTORESTATE31
+       SHA1_STORE_STATE(31)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 31, temp);
+
+#ifdef DOSTORESTATE32
+       SHA1_STORE_STATE(32)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 32, temp);
+
+#ifdef DOSTORESTATE33
+       SHA1_STORE_STATE(33)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 33, temp);
+
+#ifdef DOSTORESTATE34
+       SHA1_STORE_STATE(34)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 34, temp);
+
+#ifdef DOSTORESTATE35
+       SHA1_STORE_STATE(35)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 35, temp);
+
+#ifdef DOSTORESTATE36
+       SHA1_STORE_STATE(36)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 36, temp);
+
+#ifdef DOSTORESTATE37
+       SHA1_STORE_STATE(37)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 37, temp);
+
+#ifdef DOSTORESTATE38
+       SHA1_STORE_STATE(38)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 38, temp);
+
+#ifdef DOSTORESTATE39
+       SHA1_STORE_STATE(39)
+#endif
+       SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 39, temp);
+
+
+
+#ifdef DOSTORESTATE40
+       SHA1_STORE_STATE(40)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 40, temp);
+
+#ifdef DOSTORESTATE41
+       SHA1_STORE_STATE(41)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 41, temp);
+
+#ifdef DOSTORESTATE42
+       SHA1_STORE_STATE(42)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 42, temp);
+
+#ifdef DOSTORESTATE43
+       SHA1_STORE_STATE(43)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 43, temp);
+
+#ifdef DOSTORESTATE44
+       SHA1_STORE_STATE(44)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 44, temp);
+
+#ifdef DOSTORESTATE45
+       SHA1_STORE_STATE(45)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 45, temp);
+
+#ifdef DOSTORESTATE46
+       SHA1_STORE_STATE(46)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 46, temp);
+
+#ifdef DOSTORESTATE47
+       SHA1_STORE_STATE(47)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 47, temp);
+
+#ifdef DOSTORESTATE48
+       SHA1_STORE_STATE(48)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 48, temp);
+
+#ifdef DOSTORESTATE49
+       SHA1_STORE_STATE(49)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 49, temp);
+
+#ifdef DOSTORESTATE50
+       SHA1_STORE_STATE(50)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 50, temp);
+
+#ifdef DOSTORESTATE51
+       SHA1_STORE_STATE(51)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 51, temp);
+
+#ifdef DOSTORESTATE52
+       SHA1_STORE_STATE(52)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 52, temp);
+
+#ifdef DOSTORESTATE53
+       SHA1_STORE_STATE(53)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 53, temp);
+
+#ifdef DOSTORESTATE54
+       SHA1_STORE_STATE(54)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 54, temp);
+
+#ifdef DOSTORESTATE55
+       SHA1_STORE_STATE(55)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 55, temp);
+
+#ifdef DOSTORESTATE56
+       SHA1_STORE_STATE(56)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 56, temp);
+
+#ifdef DOSTORESTATE57
+       SHA1_STORE_STATE(57)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 57, temp);
+
+#ifdef DOSTORESTATE58
+       SHA1_STORE_STATE(58)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 58, temp);
+
+#ifdef DOSTORESTATE59
+       SHA1_STORE_STATE(59)
+#endif
+       SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 59, temp);
+
+
+
+
+#ifdef DOSTORESTATE60
+       SHA1_STORE_STATE(60)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 60, temp);
+
+#ifdef DOSTORESTATE61
+       SHA1_STORE_STATE(61)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 61, temp);
+
+#ifdef DOSTORESTATE62
+       SHA1_STORE_STATE(62)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 62, temp);
+
+#ifdef DOSTORESTATE63
+       SHA1_STORE_STATE(63)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 63, temp);
+
+#ifdef DOSTORESTATE64
+       SHA1_STORE_STATE(64)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 64, temp);
+
+#ifdef DOSTORESTATE65
+       SHA1_STORE_STATE(65)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 65, temp);
+
+#ifdef DOSTORESTATE66
+       SHA1_STORE_STATE(66)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 66, temp);
+
+#ifdef DOSTORESTATE67
+       SHA1_STORE_STATE(67)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 67, temp);
+
+#ifdef DOSTORESTATE68
+       SHA1_STORE_STATE(68)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 68, temp);
+
+#ifdef DOSTORESTATE69
+       SHA1_STORE_STATE(69)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 69, temp);
+
+#ifdef DOSTORESTATE70
+       SHA1_STORE_STATE(70)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 70, temp);
+
+#ifdef DOSTORESTATE71
+       SHA1_STORE_STATE(71)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 71, temp);
+
+#ifdef DOSTORESTATE72
+       SHA1_STORE_STATE(72)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 72, temp);
+
+#ifdef DOSTORESTATE73
+       SHA1_STORE_STATE(73)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 73, temp);
+
+#ifdef DOSTORESTATE74
+       SHA1_STORE_STATE(74)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 74, temp);
+
+#ifdef DOSTORESTATE75
+       SHA1_STORE_STATE(75)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 75, temp);
+
+#ifdef DOSTORESTATE76
+       SHA1_STORE_STATE(76)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 76, temp);
+
+#ifdef DOSTORESTATE77
+       SHA1_STORE_STATE(77)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 77, temp);
+
+#ifdef DOSTORESTATE78
+       SHA1_STORE_STATE(78)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 78, temp);
+
+#ifdef DOSTORESTATE79
+       SHA1_STORE_STATE(79)
+#endif
+       SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 79, temp);
+
+
+
+       ihv[0] += a; ihv[1] += b; ihv[2] += c; ihv[3] += d; ihv[4] += e;
+}
+
+
+
+
+#define SHA1_RECOMPRESS(t) \
+static void sha1recompress_fast_ ## t (uint32_t ihvin[5], uint32_t ihvout[5], const uint32_t me2[80], const uint32_t state[5]) \
+{ \
+       uint32_t a = state[0], b = state[1], c = state[2], d = state[3], e = state[4]; \
+       if (t > 79) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 79); \
+       if (t > 78) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 78); \
+       if (t > 77) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 77); \
+       if (t > 76) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 76); \
+       if (t > 75) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 75); \
+       if (t > 74) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 74); \
+       if (t > 73) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 73); \
+       if (t > 72) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 72); \
+       if (t > 71) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 71); \
+       if (t > 70) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 70); \
+       if (t > 69) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 69); \
+       if (t > 68) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 68); \
+       if (t > 67) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 67); \
+       if (t > 66) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 66); \
+       if (t > 65) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 65); \
+       if (t > 64) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 64); \
+       if (t > 63) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 63); \
+       if (t > 62) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 62); \
+       if (t > 61) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 61); \
+       if (t > 60) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 60); \
+       if (t > 59) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 59); \
+       if (t > 58) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 58); \
+       if (t > 57) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 57); \
+       if (t > 56) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 56); \
+       if (t > 55) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 55); \
+       if (t > 54) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 54); \
+       if (t > 53) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 53); \
+       if (t > 52) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 52); \
+       if (t > 51) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 51); \
+       if (t > 50) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 50); \
+       if (t > 49) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 49); \
+       if (t > 48) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 48); \
+       if (t > 47) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 47); \
+       if (t > 46) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 46); \
+       if (t > 45) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 45); \
+       if (t > 44) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 44); \
+       if (t > 43) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 43); \
+       if (t > 42) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 42); \
+       if (t > 41) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 41); \
+       if (t > 40) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 40); \
+       if (t > 39) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 39); \
+       if (t > 38) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 38); \
+       if (t > 37) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 37); \
+       if (t > 36) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 36); \
+       if (t > 35) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 35); \
+       if (t > 34) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 34); \
+       if (t > 33) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 33); \
+       if (t > 32) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 32); \
+       if (t > 31) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 31); \
+       if (t > 30) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 30); \
+       if (t > 29) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 29); \
+       if (t > 28) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 28); \
+       if (t > 27) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 27); \
+       if (t > 26) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 26); \
+       if (t > 25) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 25); \
+       if (t > 24) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 24); \
+       if (t > 23) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 23); \
+       if (t > 22) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 22); \
+       if (t > 21) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 21); \
+       if (t > 20) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 20); \
+       if (t > 19) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 19); \
+       if (t > 18) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 18); \
+       if (t > 17) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 17); \
+       if (t > 16) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 16); \
+       if (t > 15) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 15); \
+       if (t > 14) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 14); \
+       if (t > 13) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 13); \
+       if (t > 12) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 12); \
+       if (t > 11) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 11); \
+       if (t > 10) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 10); \
+       if (t > 9) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 9); \
+       if (t > 8) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 8); \
+       if (t > 7) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 7); \
+       if (t > 6) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 6); \
+       if (t > 5) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 5); \
+       if (t > 4) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 4); \
+       if (t > 3) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 3); \
+       if (t > 2) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 2); \
+       if (t > 1) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 1); \
+       if (t > 0) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 0); \
+       ihvin[0] = a; ihvin[1] = b; ihvin[2] = c; ihvin[3] = d; ihvin[4] = e; \
+       a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; \
+       if (t <= 0) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 0); \
+       if (t <= 1) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 1); \
+       if (t <= 2) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 2); \
+       if (t <= 3) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 3); \
+       if (t <= 4) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 4); \
+       if (t <= 5) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 5); \
+       if (t <= 6) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 6); \
+       if (t <= 7) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 7); \
+       if (t <= 8) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 8); \
+       if (t <= 9) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 9); \
+       if (t <= 10) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 10); \
+       if (t <= 11) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 11); \
+       if (t <= 12) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 12); \
+       if (t <= 13) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 13); \
+       if (t <= 14) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 14); \
+       if (t <= 15) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 15); \
+       if (t <= 16) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 16); \
+       if (t <= 17) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 17); \
+       if (t <= 18) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 18); \
+       if (t <= 19) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 19); \
+       if (t <= 20) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 20); \
+       if (t <= 21) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 21); \
+       if (t <= 22) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 22); \
+       if (t <= 23) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 23); \
+       if (t <= 24) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 24); \
+       if (t <= 25) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 25); \
+       if (t <= 26) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 26); \
+       if (t <= 27) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 27); \
+       if (t <= 28) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 28); \
+       if (t <= 29) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 29); \
+       if (t <= 30) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 30); \
+       if (t <= 31) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 31); \
+       if (t <= 32) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 32); \
+       if (t <= 33) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 33); \
+       if (t <= 34) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 34); \
+       if (t <= 35) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 35); \
+       if (t <= 36) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 36); \
+       if (t <= 37) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 37); \
+       if (t <= 38) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 38); \
+       if (t <= 39) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 39); \
+       if (t <= 40) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 40); \
+       if (t <= 41) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 41); \
+       if (t <= 42) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 42); \
+       if (t <= 43) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 43); \
+       if (t <= 44) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 44); \
+       if (t <= 45) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 45); \
+       if (t <= 46) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 46); \
+       if (t <= 47) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 47); \
+       if (t <= 48) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 48); \
+       if (t <= 49) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 49); \
+       if (t <= 50) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 50); \
+       if (t <= 51) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 51); \
+       if (t <= 52) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 52); \
+       if (t <= 53) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 53); \
+       if (t <= 54) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 54); \
+       if (t <= 55) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 55); \
+       if (t <= 56) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 56); \
+       if (t <= 57) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 57); \
+       if (t <= 58) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 58); \
+       if (t <= 59) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 59); \
+       if (t <= 60) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 60); \
+       if (t <= 61) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 61); \
+       if (t <= 62) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 62); \
+       if (t <= 63) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 63); \
+       if (t <= 64) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 64); \
+       if (t <= 65) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 65); \
+       if (t <= 66) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 66); \
+       if (t <= 67) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 67); \
+       if (t <= 68) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 68); \
+       if (t <= 69) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 69); \
+       if (t <= 70) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 70); \
+       if (t <= 71) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 71); \
+       if (t <= 72) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 72); \
+       if (t <= 73) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 73); \
+       if (t <= 74) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 74); \
+       if (t <= 75) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 75); \
+       if (t <= 76) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 76); \
+       if (t <= 77) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 77); \
+       if (t <= 78) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 78); \
+       if (t <= 79) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 79); \
+       ihvout[0] = ihvin[0] + a; ihvout[1] = ihvin[1] + b; ihvout[2] = ihvin[2] + c; ihvout[3] = ihvin[3] + d; ihvout[4] = ihvin[4] + e; \
+}
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4127)  /* Complier complains about the checks in the above macro being constant. */
+#endif
+
+#ifdef DOSTORESTATE0
+SHA1_RECOMPRESS(0)
+#endif
+
+#ifdef DOSTORESTATE1
+SHA1_RECOMPRESS(1)
+#endif
+
+#ifdef DOSTORESTATE2
+SHA1_RECOMPRESS(2)
+#endif
+
+#ifdef DOSTORESTATE3
+SHA1_RECOMPRESS(3)
+#endif
+
+#ifdef DOSTORESTATE4
+SHA1_RECOMPRESS(4)
+#endif
+
+#ifdef DOSTORESTATE5
+SHA1_RECOMPRESS(5)
+#endif
+
+#ifdef DOSTORESTATE6
+SHA1_RECOMPRESS(6)
+#endif
+
+#ifdef DOSTORESTATE7
+SHA1_RECOMPRESS(7)
+#endif
+
+#ifdef DOSTORESTATE8
+SHA1_RECOMPRESS(8)
+#endif
+
+#ifdef DOSTORESTATE9
+SHA1_RECOMPRESS(9)
+#endif
+
+#ifdef DOSTORESTATE10
+SHA1_RECOMPRESS(10)
+#endif
+
+#ifdef DOSTORESTATE11
+SHA1_RECOMPRESS(11)
+#endif
+
+#ifdef DOSTORESTATE12
+SHA1_RECOMPRESS(12)
+#endif
+
+#ifdef DOSTORESTATE13
+SHA1_RECOMPRESS(13)
+#endif
+
+#ifdef DOSTORESTATE14
+SHA1_RECOMPRESS(14)
+#endif
+
+#ifdef DOSTORESTATE15
+SHA1_RECOMPRESS(15)
+#endif
+
+#ifdef DOSTORESTATE16
+SHA1_RECOMPRESS(16)
+#endif
+
+#ifdef DOSTORESTATE17
+SHA1_RECOMPRESS(17)
+#endif
+
+#ifdef DOSTORESTATE18
+SHA1_RECOMPRESS(18)
+#endif
+
+#ifdef DOSTORESTATE19
+SHA1_RECOMPRESS(19)
+#endif
+
+#ifdef DOSTORESTATE20
+SHA1_RECOMPRESS(20)
+#endif
+
+#ifdef DOSTORESTATE21
+SHA1_RECOMPRESS(21)
+#endif
+
+#ifdef DOSTORESTATE22
+SHA1_RECOMPRESS(22)
+#endif
+
+#ifdef DOSTORESTATE23
+SHA1_RECOMPRESS(23)
+#endif
+
+#ifdef DOSTORESTATE24
+SHA1_RECOMPRESS(24)
+#endif
+
+#ifdef DOSTORESTATE25
+SHA1_RECOMPRESS(25)
+#endif
+
+#ifdef DOSTORESTATE26
+SHA1_RECOMPRESS(26)
+#endif
+
+#ifdef DOSTORESTATE27
+SHA1_RECOMPRESS(27)
+#endif
+
+#ifdef DOSTORESTATE28
+SHA1_RECOMPRESS(28)
+#endif
+
+#ifdef DOSTORESTATE29
+SHA1_RECOMPRESS(29)
+#endif
+
+#ifdef DOSTORESTATE30
+SHA1_RECOMPRESS(30)
+#endif
+
+#ifdef DOSTORESTATE31
+SHA1_RECOMPRESS(31)
+#endif
+
+#ifdef DOSTORESTATE32
+SHA1_RECOMPRESS(32)
+#endif
+
+#ifdef DOSTORESTATE33
+SHA1_RECOMPRESS(33)
+#endif
+
+#ifdef DOSTORESTATE34
+SHA1_RECOMPRESS(34)
+#endif
+
+#ifdef DOSTORESTATE35
+SHA1_RECOMPRESS(35)
+#endif
+
+#ifdef DOSTORESTATE36
+SHA1_RECOMPRESS(36)
+#endif
+
+#ifdef DOSTORESTATE37
+SHA1_RECOMPRESS(37)
+#endif
+
+#ifdef DOSTORESTATE38
+SHA1_RECOMPRESS(38)
+#endif
+
+#ifdef DOSTORESTATE39
+SHA1_RECOMPRESS(39)
+#endif
+
+#ifdef DOSTORESTATE40
+SHA1_RECOMPRESS(40)
+#endif
+
+#ifdef DOSTORESTATE41
+SHA1_RECOMPRESS(41)
+#endif
+
+#ifdef DOSTORESTATE42
+SHA1_RECOMPRESS(42)
+#endif
+
+#ifdef DOSTORESTATE43
+SHA1_RECOMPRESS(43)
+#endif
+
+#ifdef DOSTORESTATE44
+SHA1_RECOMPRESS(44)
+#endif
+
+#ifdef DOSTORESTATE45
+SHA1_RECOMPRESS(45)
+#endif
+
+#ifdef DOSTORESTATE46
+SHA1_RECOMPRESS(46)
+#endif
+
+#ifdef DOSTORESTATE47
+SHA1_RECOMPRESS(47)
+#endif
+
+#ifdef DOSTORESTATE48
+SHA1_RECOMPRESS(48)
+#endif
+
+#ifdef DOSTORESTATE49
+SHA1_RECOMPRESS(49)
+#endif
+
+#ifdef DOSTORESTATE50
+SHA1_RECOMPRESS(50)
+#endif
+
+#ifdef DOSTORESTATE51
+SHA1_RECOMPRESS(51)
+#endif
+
+#ifdef DOSTORESTATE52
+SHA1_RECOMPRESS(52)
+#endif
+
+#ifdef DOSTORESTATE53
+SHA1_RECOMPRESS(53)
+#endif
+
+#ifdef DOSTORESTATE54
+SHA1_RECOMPRESS(54)
+#endif
+
+#ifdef DOSTORESTATE55
+SHA1_RECOMPRESS(55)
+#endif
+
+#ifdef DOSTORESTATE56
+SHA1_RECOMPRESS(56)
+#endif
+
+#ifdef DOSTORESTATE57
+SHA1_RECOMPRESS(57)
+#endif
+
+#ifdef DOSTORESTATE58
+SHA1_RECOMPRESS(58)
+#endif
+
+#ifdef DOSTORESTATE59
+SHA1_RECOMPRESS(59)
+#endif
+
+#ifdef DOSTORESTATE60
+SHA1_RECOMPRESS(60)
+#endif
+
+#ifdef DOSTORESTATE61
+SHA1_RECOMPRESS(61)
+#endif
+
+#ifdef DOSTORESTATE62
+SHA1_RECOMPRESS(62)
+#endif
+
+#ifdef DOSTORESTATE63
+SHA1_RECOMPRESS(63)
+#endif
+
+#ifdef DOSTORESTATE64
+SHA1_RECOMPRESS(64)
+#endif
+
+#ifdef DOSTORESTATE65
+SHA1_RECOMPRESS(65)
+#endif
+
+#ifdef DOSTORESTATE66
+SHA1_RECOMPRESS(66)
+#endif
+
+#ifdef DOSTORESTATE67
+SHA1_RECOMPRESS(67)
+#endif
+
+#ifdef DOSTORESTATE68
+SHA1_RECOMPRESS(68)
+#endif
+
+#ifdef DOSTORESTATE69
+SHA1_RECOMPRESS(69)
+#endif
+
+#ifdef DOSTORESTATE70
+SHA1_RECOMPRESS(70)
+#endif
+
+#ifdef DOSTORESTATE71
+SHA1_RECOMPRESS(71)
+#endif
+
+#ifdef DOSTORESTATE72
+SHA1_RECOMPRESS(72)
+#endif
+
+#ifdef DOSTORESTATE73
+SHA1_RECOMPRESS(73)
+#endif
+
+#ifdef DOSTORESTATE74
+SHA1_RECOMPRESS(74)
+#endif
+
+#ifdef DOSTORESTATE75
+SHA1_RECOMPRESS(75)
+#endif
+
+#ifdef DOSTORESTATE76
+SHA1_RECOMPRESS(76)
+#endif
+
+#ifdef DOSTORESTATE77
+SHA1_RECOMPRESS(77)
+#endif
+
+#ifdef DOSTORESTATE78
+SHA1_RECOMPRESS(78)
+#endif
+
+#ifdef DOSTORESTATE79
+SHA1_RECOMPRESS(79)
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+static void sha1_recompression_step(uint32_t step, uint32_t ihvin[5], uint32_t ihvout[5], const uint32_t me2[80], const uint32_t state[5])
+{
+       switch (step)
+       {
+#ifdef DOSTORESTATE0
+       case 0:
+               sha1recompress_fast_0(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE1
+       case 1:
+               sha1recompress_fast_1(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE2
+       case 2:
+               sha1recompress_fast_2(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE3
+       case 3:
+               sha1recompress_fast_3(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE4
+       case 4:
+               sha1recompress_fast_4(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE5
+       case 5:
+               sha1recompress_fast_5(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE6
+       case 6:
+               sha1recompress_fast_6(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE7
+       case 7:
+               sha1recompress_fast_7(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE8
+       case 8:
+               sha1recompress_fast_8(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE9
+       case 9:
+               sha1recompress_fast_9(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE10
+       case 10:
+               sha1recompress_fast_10(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE11
+       case 11:
+               sha1recompress_fast_11(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE12
+       case 12:
+               sha1recompress_fast_12(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE13
+       case 13:
+               sha1recompress_fast_13(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE14
+       case 14:
+               sha1recompress_fast_14(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE15
+       case 15:
+               sha1recompress_fast_15(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE16
+       case 16:
+               sha1recompress_fast_16(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE17
+       case 17:
+               sha1recompress_fast_17(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE18
+       case 18:
+               sha1recompress_fast_18(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE19
+       case 19:
+               sha1recompress_fast_19(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE20
+       case 20:
+               sha1recompress_fast_20(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE21
+       case 21:
+               sha1recompress_fast_21(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE22
+       case 22:
+               sha1recompress_fast_22(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE23
+       case 23:
+               sha1recompress_fast_23(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE24
+       case 24:
+               sha1recompress_fast_24(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE25
+       case 25:
+               sha1recompress_fast_25(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE26
+       case 26:
+               sha1recompress_fast_26(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE27
+       case 27:
+               sha1recompress_fast_27(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE28
+       case 28:
+               sha1recompress_fast_28(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE29
+       case 29:
+               sha1recompress_fast_29(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE30
+       case 30:
+               sha1recompress_fast_30(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE31
+       case 31:
+               sha1recompress_fast_31(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE32
+       case 32:
+               sha1recompress_fast_32(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE33
+       case 33:
+               sha1recompress_fast_33(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE34
+       case 34:
+               sha1recompress_fast_34(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE35
+       case 35:
+               sha1recompress_fast_35(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE36
+       case 36:
+               sha1recompress_fast_36(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE37
+       case 37:
+               sha1recompress_fast_37(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE38
+       case 38:
+               sha1recompress_fast_38(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE39
+       case 39:
+               sha1recompress_fast_39(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE40
+       case 40:
+               sha1recompress_fast_40(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE41
+       case 41:
+               sha1recompress_fast_41(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE42
+       case 42:
+               sha1recompress_fast_42(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE43
+       case 43:
+               sha1recompress_fast_43(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE44
+       case 44:
+               sha1recompress_fast_44(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE45
+       case 45:
+               sha1recompress_fast_45(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE46
+       case 46:
+               sha1recompress_fast_46(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE47
+       case 47:
+               sha1recompress_fast_47(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE48
+       case 48:
+               sha1recompress_fast_48(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE49
+       case 49:
+               sha1recompress_fast_49(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE50
+       case 50:
+               sha1recompress_fast_50(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE51
+       case 51:
+               sha1recompress_fast_51(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE52
+       case 52:
+               sha1recompress_fast_52(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE53
+       case 53:
+               sha1recompress_fast_53(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE54
+       case 54:
+               sha1recompress_fast_54(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE55
+       case 55:
+               sha1recompress_fast_55(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE56
+       case 56:
+               sha1recompress_fast_56(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE57
+       case 57:
+               sha1recompress_fast_57(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE58
+       case 58:
+               sha1recompress_fast_58(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE59
+       case 59:
+               sha1recompress_fast_59(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE60
+       case 60:
+               sha1recompress_fast_60(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE61
+       case 61:
+               sha1recompress_fast_61(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE62
+       case 62:
+               sha1recompress_fast_62(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE63
+       case 63:
+               sha1recompress_fast_63(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE64
+       case 64:
+               sha1recompress_fast_64(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE65
+       case 65:
+               sha1recompress_fast_65(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE66
+       case 66:
+               sha1recompress_fast_66(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE67
+       case 67:
+               sha1recompress_fast_67(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE68
+       case 68:
+               sha1recompress_fast_68(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE69
+       case 69:
+               sha1recompress_fast_69(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE70
+       case 70:
+               sha1recompress_fast_70(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE71
+       case 71:
+               sha1recompress_fast_71(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE72
+       case 72:
+               sha1recompress_fast_72(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE73
+       case 73:
+               sha1recompress_fast_73(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE74
+       case 74:
+               sha1recompress_fast_74(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE75
+       case 75:
+               sha1recompress_fast_75(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE76
+       case 76:
+               sha1recompress_fast_76(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE77
+       case 77:
+               sha1recompress_fast_77(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE78
+       case 78:
+               sha1recompress_fast_78(ihvin, ihvout, me2, state);
+               break;
+#endif
+#ifdef DOSTORESTATE79
+       case 79:
+               sha1recompress_fast_79(ihvin, ihvout, me2, state);
+               break;
+#endif
+       default:
+               abort();
+       }
+
+}
+
+
+
+static void sha1_process(SHA1_CTX* ctx, const uint32_t block[16])
+{
+       unsigned i, j;
+       uint32_t ubc_dv_mask[DVMASKSIZE] = { 0xFFFFFFFF };
+       uint32_t ihvtmp[5];
+
+       ctx->ihv1[0] = ctx->ihv[0];
+       ctx->ihv1[1] = ctx->ihv[1];
+       ctx->ihv1[2] = ctx->ihv[2];
+       ctx->ihv1[3] = ctx->ihv[3];
+       ctx->ihv1[4] = ctx->ihv[4];
+
+       sha1_compression_states(ctx->ihv, block, ctx->m1, ctx->states);
+
+       if (ctx->detect_coll)
+       {
+               if (ctx->ubc_check)
+               {
+                       ubc_check(ctx->m1, ubc_dv_mask);
+               }
+
+               if (ubc_dv_mask[0] != 0)
+               {
+                       for (i = 0; sha1_dvs[i].dvType != 0; ++i)
+                       {
+                               if (ubc_dv_mask[0] & ((uint32_t)(1) << sha1_dvs[i].maskb))
+                               {
+                                       for (j = 0; j < 80; ++j)
+                                               ctx->m2[j] = ctx->m1[j] ^ sha1_dvs[i].dm[j];
+
+                                       sha1_recompression_step(sha1_dvs[i].testt, ctx->ihv2, ihvtmp, ctx->m2, ctx->states[sha1_dvs[i].testt]);
+
+                                       /* to verify SHA-1 collision detection code with collisions for reduced-step SHA-1 */
+                                       if ((0 == ((ihvtmp[0] ^ ctx->ihv[0]) | (ihvtmp[1] ^ ctx->ihv[1]) | (ihvtmp[2] ^ ctx->ihv[2]) | (ihvtmp[3] ^ ctx->ihv[3]) | (ihvtmp[4] ^ ctx->ihv[4])))
+                                               || (ctx->reduced_round_coll && 0==((ctx->ihv1[0] ^ ctx->ihv2[0]) | (ctx->ihv1[1] ^ ctx->ihv2[1]) | (ctx->ihv1[2] ^ ctx->ihv2[2]) | (ctx->ihv1[3] ^ ctx->ihv2[3]) | (ctx->ihv1[4] ^ ctx->ihv2[4]))))
+                                       {
+                                               ctx->found_collision = 1;
+
+                                               if (ctx->safe_hash)
+                                               {
+                                                       sha1_compression_W(ctx->ihv, ctx->m1);
+                                                       sha1_compression_W(ctx->ihv, ctx->m1);
+                                               }
+
+                                               break;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+void SHA1DCInit(SHA1_CTX* ctx)
+{
+       ctx->total = 0;
+       ctx->ihv[0] = 0x67452301;
+       ctx->ihv[1] = 0xEFCDAB89;
+       ctx->ihv[2] = 0x98BADCFE;
+       ctx->ihv[3] = 0x10325476;
+       ctx->ihv[4] = 0xC3D2E1F0;
+       ctx->found_collision = 0;
+       ctx->safe_hash = SHA1DC_INIT_SAFE_HASH_DEFAULT;
+       ctx->ubc_check = 1;
+       ctx->detect_coll = 1;
+       ctx->reduced_round_coll = 0;
+       ctx->callback = NULL;
+}
+
+void SHA1DCSetSafeHash(SHA1_CTX* ctx, int safehash)
+{
+       if (safehash)
+               ctx->safe_hash = 1;
+       else
+               ctx->safe_hash = 0;
+}
+
+
+void SHA1DCSetUseUBC(SHA1_CTX* ctx, int ubc_check)
+{
+       if (ubc_check)
+               ctx->ubc_check = 1;
+       else
+               ctx->ubc_check = 0;
+}
+
+void SHA1DCSetUseDetectColl(SHA1_CTX* ctx, int detect_coll)
+{
+       if (detect_coll)
+               ctx->detect_coll = 1;
+       else
+               ctx->detect_coll = 0;
+}
+
+void SHA1DCSetDetectReducedRoundCollision(SHA1_CTX* ctx, int reduced_round_coll)
+{
+       if (reduced_round_coll)
+               ctx->reduced_round_coll = 1;
+       else
+               ctx->reduced_round_coll = 0;
+}
+
+void SHA1DCSetCallback(SHA1_CTX* ctx, collision_block_callback callback)
+{
+       ctx->callback = callback;
+}
+
+void SHA1DCUpdate(SHA1_CTX* ctx, const char* buf, size_t len)
+{
+       unsigned left, fill;
+
+       if (len == 0)
+               return;
+
+       left = ctx->total & 63;
+       fill = 64 - left;
+
+       if (left && len >= fill)
+       {
+               ctx->total += fill;
+               memcpy(ctx->buffer + left, buf, fill);
+               sha1_process(ctx, (uint32_t*)(ctx->buffer));
+               buf += fill;
+               len -= fill;
+               left = 0;
+       }
+       while (len >= 64)
+       {
+               ctx->total += 64;
+
+#if defined(SHA1DC_ALLOW_UNALIGNED_ACCESS)
+               sha1_process(ctx, (uint32_t*)(buf));
+#else
+               memcpy(ctx->buffer, buf, 64);
+               sha1_process(ctx, (uint32_t*)(ctx->buffer));
+#endif /* defined(SHA1DC_ALLOW_UNALIGNED_ACCESS) */
+               buf += 64;
+               len -= 64;
+       }
+       if (len > 0)
+       {
+               ctx->total += len;
+               memcpy(ctx->buffer + left, buf, len);
+       }
+}
+
+static const unsigned char sha1_padding[64] =
+{
+       0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+int SHA1DCFinal(unsigned char output[20], SHA1_CTX *ctx)
+{
+       uint32_t last = ctx->total & 63;
+       uint32_t padn = (last < 56) ? (56 - last) : (120 - last);
+       uint64_t total;
+       SHA1DCUpdate(ctx, (const char*)(sha1_padding), padn);
+
+       total = ctx->total - padn;
+       total <<= 3;
+       ctx->buffer[56] = (unsigned char)(total >> 56);
+       ctx->buffer[57] = (unsigned char)(total >> 48);
+       ctx->buffer[58] = (unsigned char)(total >> 40);
+       ctx->buffer[59] = (unsigned char)(total >> 32);
+       ctx->buffer[60] = (unsigned char)(total >> 24);
+       ctx->buffer[61] = (unsigned char)(total >> 16);
+       ctx->buffer[62] = (unsigned char)(total >> 8);
+       ctx->buffer[63] = (unsigned char)(total);
+       sha1_process(ctx, (uint32_t*)(ctx->buffer));
+       output[0] = (unsigned char)(ctx->ihv[0] >> 24);
+       output[1] = (unsigned char)(ctx->ihv[0] >> 16);
+       output[2] = (unsigned char)(ctx->ihv[0] >> 8);
+       output[3] = (unsigned char)(ctx->ihv[0]);
+       output[4] = (unsigned char)(ctx->ihv[1] >> 24);
+       output[5] = (unsigned char)(ctx->ihv[1] >> 16);
+       output[6] = (unsigned char)(ctx->ihv[1] >> 8);
+       output[7] = (unsigned char)(ctx->ihv[1]);
+       output[8] = (unsigned char)(ctx->ihv[2] >> 24);
+       output[9] = (unsigned char)(ctx->ihv[2] >> 16);
+       output[10] = (unsigned char)(ctx->ihv[2] >> 8);
+       output[11] = (unsigned char)(ctx->ihv[2]);
+       output[12] = (unsigned char)(ctx->ihv[3] >> 24);
+       output[13] = (unsigned char)(ctx->ihv[3] >> 16);
+       output[14] = (unsigned char)(ctx->ihv[3] >> 8);
+       output[15] = (unsigned char)(ctx->ihv[3]);
+       output[16] = (unsigned char)(ctx->ihv[4] >> 24);
+       output[17] = (unsigned char)(ctx->ihv[4] >> 16);
+       output[18] = (unsigned char)(ctx->ihv[4] >> 8);
+       output[19] = (unsigned char)(ctx->ihv[4]);
+       return ctx->found_collision;
+}
+
+#ifdef SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_C
+#include SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_C
+#endif
diff --git a/sha1dc/sha1.h b/sha1dc/sha1.h
new file mode 100644 (file)
index 0000000..1e4e94b
--- /dev/null
@@ -0,0 +1,110 @@
+/***
+* Copyright 2017 Marc Stevens <marc@marc-stevens.nl>, Dan Shumow <danshu@microsoft.com>
+* Distributed under the MIT Software License.
+* See accompanying file LICENSE.txt or copy at
+* https://opensource.org/licenses/MIT
+***/
+
+#ifndef SHA1DC_SHA1_H
+#define SHA1DC_SHA1_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#ifndef SHA1DC_NO_STANDARD_INCLUDES
+#include <stdint.h>
+#endif
+
+/* sha-1 compression function that takes an already expanded message, and additionally store intermediate states */
+/* only stores states ii (the state between step ii-1 and step ii) when DOSTORESTATEii is defined in ubc_check.h */
+void sha1_compression_states(uint32_t[5], const uint32_t[16], uint32_t[80], uint32_t[80][5]);
+
+/*
+// Function type for sha1_recompression_step_T (uint32_t ihvin[5], uint32_t ihvout[5], const uint32_t me2[80], const uint32_t state[5]).
+// Where 0 <= T < 80
+//       me2 is an expanded message (the expansion of an original message block XOR'ed with a disturbance vector's message block difference.)
+//       state is the internal state (a,b,c,d,e) before step T of the SHA-1 compression function while processing the original message block.
+// The function will return:
+//       ihvin: The reconstructed input chaining value.
+//       ihvout: The reconstructed output chaining value.
+*/
+typedef void(*sha1_recompression_type)(uint32_t*, uint32_t*, const uint32_t*, const uint32_t*);
+
+/* A callback function type that can be set to be called when a collision block has been found: */
+/* void collision_block_callback(uint64_t byteoffset, const uint32_t ihvin1[5], const uint32_t ihvin2[5], const uint32_t m1[80], const uint32_t m2[80]) */
+typedef void(*collision_block_callback)(uint64_t, const uint32_t*, const uint32_t*, const uint32_t*, const uint32_t*);
+
+/* The SHA-1 context. */
+typedef struct {
+       uint64_t total;
+       uint32_t ihv[5];
+       unsigned char buffer[64];
+       int found_collision;
+       int safe_hash;
+       int detect_coll;
+       int ubc_check;
+       int reduced_round_coll;
+       collision_block_callback callback;
+
+       uint32_t ihv1[5];
+       uint32_t ihv2[5];
+       uint32_t m1[80];
+       uint32_t m2[80];
+       uint32_t states[80][5];
+} SHA1_CTX;
+
+/* Initialize SHA-1 context. */
+void SHA1DCInit(SHA1_CTX*);
+
+/*
+    Function to enable safe SHA-1 hashing:
+    Collision attacks are thwarted by hashing a detected near-collision block 3 times.
+    Think of it as extending SHA-1 from 80-steps to 240-steps for such blocks:
+        The best collision attacks against SHA-1 have complexity about 2^60,
+        thus for 240-steps an immediate lower-bound for the best cryptanalytic attacks would be 2^180.
+        An attacker would be better off using a generic birthday search of complexity 2^80.
+
+   Enabling safe SHA-1 hashing will result in the correct SHA-1 hash for messages where no collision attack was detected,
+   but it will result in a different SHA-1 hash for messages where a collision attack was detected.
+   This will automatically invalidate SHA-1 based digital signature forgeries.
+   Enabled by default.
+*/
+void SHA1DCSetSafeHash(SHA1_CTX*, int);
+
+/*
+    Function to disable or enable the use of Unavoidable Bitconditions (provides a significant speed up).
+    Enabled by default
+ */
+void SHA1DCSetUseUBC(SHA1_CTX*, int);
+
+/*
+    Function to disable or enable the use of Collision Detection.
+    Enabled by default.
+ */
+void SHA1DCSetUseDetectColl(SHA1_CTX*, int);
+
+/* function to disable or enable the detection of reduced-round SHA-1 collisions */
+/* disabled by default */
+void SHA1DCSetDetectReducedRoundCollision(SHA1_CTX*, int);
+
+/* function to set a callback function, pass NULL to disable */
+/* by default no callback set */
+void SHA1DCSetCallback(SHA1_CTX*, collision_block_callback);
+
+/* update SHA-1 context with buffer contents */
+void SHA1DCUpdate(SHA1_CTX*, const char*, size_t);
+
+/* obtain SHA-1 hash from SHA-1 context */
+/* returns: 0 = no collision detected, otherwise = collision found => warn user for active attack */
+int  SHA1DCFinal(unsigned char[20], SHA1_CTX*);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#ifdef SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_H
+#include SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_H
+#endif
+
+#endif
diff --git a/sha1dc/ubc_check.c b/sha1dc/ubc_check.c
new file mode 100644 (file)
index 0000000..b3beff2
--- /dev/null
@@ -0,0 +1,372 @@
+/***
+* Copyright 2017 Marc Stevens <marc@marc-stevens.nl>, Dan Shumow <danshu@microsoft.com>
+* Distributed under the MIT Software License.
+* See accompanying file LICENSE.txt or copy at
+* https://opensource.org/licenses/MIT
+***/
+
+/*
+// this file was generated by the 'parse_bitrel' program in the tools section
+// using the data files from directory 'tools/data/3565'
+//
+// sha1_dvs contains a list of SHA-1 Disturbance Vectors (DV) to check
+// dvType, dvK and dvB define the DV: I(K,B) or II(K,B) (see the paper)
+// dm[80] is the expanded message block XOR-difference defined by the DV
+// testt is the step to do the recompression from for collision detection
+// maski and maskb define the bit to check for each DV in the dvmask returned by ubc_check
+//
+// ubc_check takes as input an expanded message block and verifies the unavoidable bitconditions for all listed DVs
+// it returns a dvmask where each bit belonging to a DV is set if all unavoidable bitconditions for that DV have been met
+// thus one needs to do the recompression check for each DV that has its bit set
+//
+// ubc_check is programmatically generated and the unavoidable bitconditions have been hardcoded
+// a directly verifiable version named ubc_check_verify can be found in ubc_check_verify.c
+// ubc_check has been verified against ubc_check_verify using the 'ubc_check_test' program in the tools section
+*/
+
+#ifndef SHA1DC_NO_STANDARD_INCLUDES
+#include <stdint.h>
+#endif
+#ifdef SHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C
+#include SHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C
+#endif
+#include "ubc_check.h"
+
+static const uint32_t DV_I_43_0_bit    = (uint32_t)(1) << 0;
+static const uint32_t DV_I_44_0_bit    = (uint32_t)(1) << 1;
+static const uint32_t DV_I_45_0_bit    = (uint32_t)(1) << 2;
+static const uint32_t DV_I_46_0_bit    = (uint32_t)(1) << 3;
+static const uint32_t DV_I_46_2_bit    = (uint32_t)(1) << 4;
+static const uint32_t DV_I_47_0_bit    = (uint32_t)(1) << 5;
+static const uint32_t DV_I_47_2_bit    = (uint32_t)(1) << 6;
+static const uint32_t DV_I_48_0_bit    = (uint32_t)(1) << 7;
+static const uint32_t DV_I_48_2_bit    = (uint32_t)(1) << 8;
+static const uint32_t DV_I_49_0_bit    = (uint32_t)(1) << 9;
+static const uint32_t DV_I_49_2_bit    = (uint32_t)(1) << 10;
+static const uint32_t DV_I_50_0_bit    = (uint32_t)(1) << 11;
+static const uint32_t DV_I_50_2_bit    = (uint32_t)(1) << 12;
+static const uint32_t DV_I_51_0_bit    = (uint32_t)(1) << 13;
+static const uint32_t DV_I_51_2_bit    = (uint32_t)(1) << 14;
+static const uint32_t DV_I_52_0_bit    = (uint32_t)(1) << 15;
+static const uint32_t DV_II_45_0_bit   = (uint32_t)(1) << 16;
+static const uint32_t DV_II_46_0_bit   = (uint32_t)(1) << 17;
+static const uint32_t DV_II_46_2_bit   = (uint32_t)(1) << 18;
+static const uint32_t DV_II_47_0_bit   = (uint32_t)(1) << 19;
+static const uint32_t DV_II_48_0_bit   = (uint32_t)(1) << 20;
+static const uint32_t DV_II_49_0_bit   = (uint32_t)(1) << 21;
+static const uint32_t DV_II_49_2_bit   = (uint32_t)(1) << 22;
+static const uint32_t DV_II_50_0_bit   = (uint32_t)(1) << 23;
+static const uint32_t DV_II_50_2_bit   = (uint32_t)(1) << 24;
+static const uint32_t DV_II_51_0_bit   = (uint32_t)(1) << 25;
+static const uint32_t DV_II_51_2_bit   = (uint32_t)(1) << 26;
+static const uint32_t DV_II_52_0_bit   = (uint32_t)(1) << 27;
+static const uint32_t DV_II_53_0_bit   = (uint32_t)(1) << 28;
+static const uint32_t DV_II_54_0_bit   = (uint32_t)(1) << 29;
+static const uint32_t DV_II_55_0_bit   = (uint32_t)(1) << 30;
+static const uint32_t DV_II_56_0_bit   = (uint32_t)(1) << 31;
+
+dv_info_t sha1_dvs[] =
+{
+  {1,43,0,58,0,0, { 0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018,0x00000164,0x00000408,0x800000e6,0x8000004c,0x00000803,0x80000161,0x80000599 } }
+, {1,44,0,58,0,1, { 0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018,0x00000164,0x00000408,0x800000e6,0x8000004c,0x00000803,0x80000161 } }
+, {1,45,0,58,0,2, { 0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018,0x00000164,0x00000408,0x800000e6,0x8000004c,0x00000803 } }
+, {1,46,0,58,0,3, { 0x2c000010,0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018,0x00000164,0x00000408,0x800000e6,0x8000004c } }
+, {1,46,2,58,0,4, { 0xb0000040,0xd0000053,0xd0000022,0x20000000,0x60000032,0x60000043,0x20000040,0xe0000042,0x60000002,0x80000001,0x00000020,0x00000003,0x40000052,0x40000040,0xe0000052,0xa0000000,0x80000040,0x20000001,0x20000060,0x80000001,0x40000042,0xc0000043,0x40000022,0x00000003,0x40000042,0xc0000043,0xc0000022,0x00000001,0x40000002,0xc0000043,0x40000062,0x80000001,0x40000042,0x40000042,0x40000002,0x00000002,0x00000040,0x80000002,0x80000000,0x80000002,0x80000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000000,0x00000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000101,0x00000009,0x00000012,0x00000202,0x0000001a,0x00000124,0x0000040c,0x00000026,0x0000004a,0x0000080a,0x00000060,0x00000590,0x00001020,0x0000039a,0x00000132 } }
+, {1,47,0,58,0,5, { 0xc8000010,0x2c000010,0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018,0x00000164,0x00000408,0x800000e6 } }
+, {1,47,2,58,0,6, { 0x20000043,0xb0000040,0xd0000053,0xd0000022,0x20000000,0x60000032,0x60000043,0x20000040,0xe0000042,0x60000002,0x80000001,0x00000020,0x00000003,0x40000052,0x40000040,0xe0000052,0xa0000000,0x80000040,0x20000001,0x20000060,0x80000001,0x40000042,0xc0000043,0x40000022,0x00000003,0x40000042,0xc0000043,0xc0000022,0x00000001,0x40000002,0xc0000043,0x40000062,0x80000001,0x40000042,0x40000042,0x40000002,0x00000002,0x00000040,0x80000002,0x80000000,0x80000002,0x80000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000000,0x00000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000101,0x00000009,0x00000012,0x00000202,0x0000001a,0x00000124,0x0000040c,0x00000026,0x0000004a,0x0000080a,0x00000060,0x00000590,0x00001020,0x0000039a } }
+, {1,48,0,58,0,7, { 0xb800000a,0xc8000010,0x2c000010,0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018,0x00000164,0x00000408 } }
+, {1,48,2,58,0,8, { 0xe000002a,0x20000043,0xb0000040,0xd0000053,0xd0000022,0x20000000,0x60000032,0x60000043,0x20000040,0xe0000042,0x60000002,0x80000001,0x00000020,0x00000003,0x40000052,0x40000040,0xe0000052,0xa0000000,0x80000040,0x20000001,0x20000060,0x80000001,0x40000042,0xc0000043,0x40000022,0x00000003,0x40000042,0xc0000043,0xc0000022,0x00000001,0x40000002,0xc0000043,0x40000062,0x80000001,0x40000042,0x40000042,0x40000002,0x00000002,0x00000040,0x80000002,0x80000000,0x80000002,0x80000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000000,0x00000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000101,0x00000009,0x00000012,0x00000202,0x0000001a,0x00000124,0x0000040c,0x00000026,0x0000004a,0x0000080a,0x00000060,0x00000590,0x00001020 } }
+, {1,49,0,58,0,9, { 0x18000000,0xb800000a,0xc8000010,0x2c000010,0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018,0x00000164 } }
+, {1,49,2,58,0,10, { 0x60000000,0xe000002a,0x20000043,0xb0000040,0xd0000053,0xd0000022,0x20000000,0x60000032,0x60000043,0x20000040,0xe0000042,0x60000002,0x80000001,0x00000020,0x00000003,0x40000052,0x40000040,0xe0000052,0xa0000000,0x80000040,0x20000001,0x20000060,0x80000001,0x40000042,0xc0000043,0x40000022,0x00000003,0x40000042,0xc0000043,0xc0000022,0x00000001,0x40000002,0xc0000043,0x40000062,0x80000001,0x40000042,0x40000042,0x40000002,0x00000002,0x00000040,0x80000002,0x80000000,0x80000002,0x80000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000000,0x00000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000101,0x00000009,0x00000012,0x00000202,0x0000001a,0x00000124,0x0000040c,0x00000026,0x0000004a,0x0000080a,0x00000060,0x00000590 } }
+, {1,50,0,65,0,11, { 0x0800000c,0x18000000,0xb800000a,0xc8000010,0x2c000010,0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202,0x00000018 } }
+, {1,50,2,65,0,12, { 0x20000030,0x60000000,0xe000002a,0x20000043,0xb0000040,0xd0000053,0xd0000022,0x20000000,0x60000032,0x60000043,0x20000040,0xe0000042,0x60000002,0x80000001,0x00000020,0x00000003,0x40000052,0x40000040,0xe0000052,0xa0000000,0x80000040,0x20000001,0x20000060,0x80000001,0x40000042,0xc0000043,0x40000022,0x00000003,0x40000042,0xc0000043,0xc0000022,0x00000001,0x40000002,0xc0000043,0x40000062,0x80000001,0x40000042,0x40000042,0x40000002,0x00000002,0x00000040,0x80000002,0x80000000,0x80000002,0x80000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000000,0x00000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000101,0x00000009,0x00000012,0x00000202,0x0000001a,0x00000124,0x0000040c,0x00000026,0x0000004a,0x0000080a,0x00000060 } }
+, {1,51,0,65,0,13, { 0xe8000000,0x0800000c,0x18000000,0xb800000a,0xc8000010,0x2c000010,0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012,0x80000202 } }
+, {1,51,2,65,0,14, { 0xa0000003,0x20000030,0x60000000,0xe000002a,0x20000043,0xb0000040,0xd0000053,0xd0000022,0x20000000,0x60000032,0x60000043,0x20000040,0xe0000042,0x60000002,0x80000001,0x00000020,0x00000003,0x40000052,0x40000040,0xe0000052,0xa0000000,0x80000040,0x20000001,0x20000060,0x80000001,0x40000042,0xc0000043,0x40000022,0x00000003,0x40000042,0xc0000043,0xc0000022,0x00000001,0x40000002,0xc0000043,0x40000062,0x80000001,0x40000042,0x40000042,0x40000002,0x00000002,0x00000040,0x80000002,0x80000000,0x80000002,0x80000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000000,0x00000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000101,0x00000009,0x00000012,0x00000202,0x0000001a,0x00000124,0x0000040c,0x00000026,0x0000004a,0x0000080a } }
+, {1,52,0,65,0,15, { 0x04000010,0xe8000000,0x0800000c,0x18000000,0xb800000a,0xc8000010,0x2c000010,0xf4000014,0xb4000008,0x08000000,0x9800000c,0xd8000010,0x08000010,0xb8000010,0x98000000,0x60000000,0x00000008,0xc0000000,0x90000014,0x10000010,0xb8000014,0x28000000,0x20000010,0x48000000,0x08000018,0x60000000,0x90000010,0xf0000010,0x90000008,0xc0000000,0x90000010,0xf0000010,0xb0000008,0x40000000,0x90000000,0xf0000010,0x90000018,0x60000000,0x90000010,0x90000010,0x90000000,0x80000000,0x00000010,0xa0000000,0x20000000,0xa0000000,0x20000010,0x00000000,0x20000010,0x20000000,0x00000010,0x20000000,0x00000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000040,0x40000002,0x80000004,0x80000080,0x80000006,0x00000049,0x00000103,0x80000009,0x80000012 } }
+, {2,45,0,58,0,16, { 0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014,0x8000024b,0x0000011b,0x8000016d,0x8000041a,0x000002e4,0x80000054,0x00000967 } }
+, {2,46,0,58,0,17, { 0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014,0x8000024b,0x0000011b,0x8000016d,0x8000041a,0x000002e4,0x80000054 } }
+, {2,46,2,58,0,18, { 0x90000070,0xb0000053,0x30000008,0x00000043,0xd0000072,0xb0000010,0xf0000062,0xc0000042,0x00000030,0xe0000042,0x20000060,0xe0000041,0x20000050,0xc0000041,0xe0000072,0xa0000003,0xc0000012,0x60000041,0xc0000032,0x20000001,0xc0000002,0xe0000042,0x60000042,0x80000002,0x00000000,0x00000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000001,0x00000060,0x80000003,0x40000002,0xc0000040,0xc0000002,0x80000000,0x80000000,0x80000002,0x00000040,0x00000002,0x80000000,0x80000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000105,0x00000089,0x00000016,0x0000020b,0x0000011b,0x0000012d,0x0000041e,0x00000224,0x00000050,0x0000092e,0x0000046c,0x000005b6,0x0000106a,0x00000b90,0x00000152 } }
+, {2,47,0,58,0,19, { 0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014,0x8000024b,0x0000011b,0x8000016d,0x8000041a,0x000002e4 } }
+, {2,48,0,58,0,20, { 0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014,0x8000024b,0x0000011b,0x8000016d,0x8000041a } }
+, {2,49,0,58,0,21, { 0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014,0x8000024b,0x0000011b,0x8000016d } }
+, {2,49,2,58,0,22, { 0xf0000010,0xf000006a,0x80000040,0x90000070,0xb0000053,0x30000008,0x00000043,0xd0000072,0xb0000010,0xf0000062,0xc0000042,0x00000030,0xe0000042,0x20000060,0xe0000041,0x20000050,0xc0000041,0xe0000072,0xa0000003,0xc0000012,0x60000041,0xc0000032,0x20000001,0xc0000002,0xe0000042,0x60000042,0x80000002,0x00000000,0x00000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000001,0x00000060,0x80000003,0x40000002,0xc0000040,0xc0000002,0x80000000,0x80000000,0x80000002,0x00000040,0x00000002,0x80000000,0x80000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000105,0x00000089,0x00000016,0x0000020b,0x0000011b,0x0000012d,0x0000041e,0x00000224,0x00000050,0x0000092e,0x0000046c,0x000005b6 } }
+, {2,50,0,65,0,23, { 0xb400001c,0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014,0x8000024b,0x0000011b } }
+, {2,50,2,65,0,24, { 0xd0000072,0xf0000010,0xf000006a,0x80000040,0x90000070,0xb0000053,0x30000008,0x00000043,0xd0000072,0xb0000010,0xf0000062,0xc0000042,0x00000030,0xe0000042,0x20000060,0xe0000041,0x20000050,0xc0000041,0xe0000072,0xa0000003,0xc0000012,0x60000041,0xc0000032,0x20000001,0xc0000002,0xe0000042,0x60000042,0x80000002,0x00000000,0x00000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000001,0x00000060,0x80000003,0x40000002,0xc0000040,0xc0000002,0x80000000,0x80000000,0x80000002,0x00000040,0x00000002,0x80000000,0x80000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000105,0x00000089,0x00000016,0x0000020b,0x0000011b,0x0000012d,0x0000041e,0x00000224,0x00000050,0x0000092e,0x0000046c } }
+, {2,51,0,65,0,25, { 0xc0000010,0xb400001c,0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014,0x8000024b } }
+, {2,51,2,65,0,26, { 0x00000043,0xd0000072,0xf0000010,0xf000006a,0x80000040,0x90000070,0xb0000053,0x30000008,0x00000043,0xd0000072,0xb0000010,0xf0000062,0xc0000042,0x00000030,0xe0000042,0x20000060,0xe0000041,0x20000050,0xc0000041,0xe0000072,0xa0000003,0xc0000012,0x60000041,0xc0000032,0x20000001,0xc0000002,0xe0000042,0x60000042,0x80000002,0x00000000,0x00000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000000,0x00000040,0x80000001,0x00000060,0x80000003,0x40000002,0xc0000040,0xc0000002,0x80000000,0x80000000,0x80000002,0x00000040,0x00000002,0x80000000,0x80000000,0x80000000,0x00000002,0x00000040,0x00000000,0x80000040,0x80000002,0x00000000,0x80000000,0x80000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000004,0x00000080,0x00000004,0x00000009,0x00000105,0x00000089,0x00000016,0x0000020b,0x0000011b,0x0000012d,0x0000041e,0x00000224,0x00000050,0x0000092e } }
+, {2,52,0,65,0,27, { 0x0c000002,0xc0000010,0xb400001c,0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089,0x00000014 } }
+, {2,53,0,65,0,28, { 0xcc000014,0x0c000002,0xc0000010,0xb400001c,0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107,0x00000089 } }
+, {2,54,0,65,0,29, { 0x0400001c,0xcc000014,0x0c000002,0xc0000010,0xb400001c,0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b,0x80000107 } }
+, {2,55,0,65,0,30, { 0x00000010,0x0400001c,0xcc000014,0x0c000002,0xc0000010,0xb400001c,0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046,0x4000004b } }
+, {2,56,0,65,0,31, { 0x2600001a,0x00000010,0x0400001c,0xcc000014,0x0c000002,0xc0000010,0xb400001c,0x3c000004,0xbc00001a,0x20000010,0x2400001c,0xec000014,0x0c000002,0xc0000010,0xb400001c,0x2c000004,0xbc000018,0xb0000010,0x0000000c,0xb8000010,0x08000018,0x78000010,0x08000014,0x70000010,0xb800001c,0xe8000000,0xb0000004,0x58000010,0xb000000c,0x48000000,0xb0000000,0xb8000010,0x98000010,0xa0000000,0x00000000,0x00000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0x20000000,0x00000010,0x60000000,0x00000018,0xe0000000,0x90000000,0x30000010,0xb0000000,0x20000000,0x20000000,0xa0000000,0x00000010,0x80000000,0x20000000,0x20000000,0x20000000,0x80000000,0x00000010,0x00000000,0x20000010,0xa0000000,0x00000000,0x20000000,0x20000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001,0x00000020,0x00000001,0x40000002,0x40000041,0x40000022,0x80000005,0xc0000082,0xc0000046 } }
+, {0,0,0,0,0,0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}
+};
+void ubc_check(const uint32_t W[80], uint32_t dvmask[1])
+{
+       uint32_t mask = ~((uint32_t)(0));
+       mask &= (((((W[44]^W[45])>>29)&1)-1) | ~(DV_I_48_0_bit|DV_I_51_0_bit|DV_I_52_0_bit|DV_II_45_0_bit|DV_II_46_0_bit|DV_II_50_0_bit|DV_II_51_0_bit));
+       mask &= (((((W[49]^W[50])>>29)&1)-1) | ~(DV_I_46_0_bit|DV_II_45_0_bit|DV_II_50_0_bit|DV_II_51_0_bit|DV_II_55_0_bit|DV_II_56_0_bit));
+       mask &= (((((W[48]^W[49])>>29)&1)-1) | ~(DV_I_45_0_bit|DV_I_52_0_bit|DV_II_49_0_bit|DV_II_50_0_bit|DV_II_54_0_bit|DV_II_55_0_bit));
+       mask &= ((((W[47]^(W[50]>>25))&(1<<4))-(1<<4)) | ~(DV_I_47_0_bit|DV_I_49_0_bit|DV_I_51_0_bit|DV_II_45_0_bit|DV_II_51_0_bit|DV_II_56_0_bit));
+       mask &= (((((W[47]^W[48])>>29)&1)-1) | ~(DV_I_44_0_bit|DV_I_51_0_bit|DV_II_48_0_bit|DV_II_49_0_bit|DV_II_53_0_bit|DV_II_54_0_bit));
+       mask &= (((((W[46]>>4)^(W[49]>>29))&1)-1) | ~(DV_I_46_0_bit|DV_I_48_0_bit|DV_I_50_0_bit|DV_I_52_0_bit|DV_II_50_0_bit|DV_II_55_0_bit));
+       mask &= (((((W[46]^W[47])>>29)&1)-1) | ~(DV_I_43_0_bit|DV_I_50_0_bit|DV_II_47_0_bit|DV_II_48_0_bit|DV_II_52_0_bit|DV_II_53_0_bit));
+       mask &= (((((W[45]>>4)^(W[48]>>29))&1)-1) | ~(DV_I_45_0_bit|DV_I_47_0_bit|DV_I_49_0_bit|DV_I_51_0_bit|DV_II_49_0_bit|DV_II_54_0_bit));
+       mask &= (((((W[45]^W[46])>>29)&1)-1) | ~(DV_I_49_0_bit|DV_I_52_0_bit|DV_II_46_0_bit|DV_II_47_0_bit|DV_II_51_0_bit|DV_II_52_0_bit));
+       mask &= (((((W[44]>>4)^(W[47]>>29))&1)-1) | ~(DV_I_44_0_bit|DV_I_46_0_bit|DV_I_48_0_bit|DV_I_50_0_bit|DV_II_48_0_bit|DV_II_53_0_bit));
+       mask &= (((((W[43]>>4)^(W[46]>>29))&1)-1) | ~(DV_I_43_0_bit|DV_I_45_0_bit|DV_I_47_0_bit|DV_I_49_0_bit|DV_II_47_0_bit|DV_II_52_0_bit));
+       mask &= (((((W[43]^W[44])>>29)&1)-1) | ~(DV_I_47_0_bit|DV_I_50_0_bit|DV_I_51_0_bit|DV_II_45_0_bit|DV_II_49_0_bit|DV_II_50_0_bit));
+       mask &= (((((W[42]>>4)^(W[45]>>29))&1)-1) | ~(DV_I_44_0_bit|DV_I_46_0_bit|DV_I_48_0_bit|DV_I_52_0_bit|DV_II_46_0_bit|DV_II_51_0_bit));
+       mask &= (((((W[41]>>4)^(W[44]>>29))&1)-1) | ~(DV_I_43_0_bit|DV_I_45_0_bit|DV_I_47_0_bit|DV_I_51_0_bit|DV_II_45_0_bit|DV_II_50_0_bit));
+       mask &= (((((W[40]^W[41])>>29)&1)-1) | ~(DV_I_44_0_bit|DV_I_47_0_bit|DV_I_48_0_bit|DV_II_46_0_bit|DV_II_47_0_bit|DV_II_56_0_bit));
+       mask &= (((((W[54]^W[55])>>29)&1)-1) | ~(DV_I_51_0_bit|DV_II_47_0_bit|DV_II_50_0_bit|DV_II_55_0_bit|DV_II_56_0_bit));
+       mask &= (((((W[53]^W[54])>>29)&1)-1) | ~(DV_I_50_0_bit|DV_II_46_0_bit|DV_II_49_0_bit|DV_II_54_0_bit|DV_II_55_0_bit));
+       mask &= (((((W[52]^W[53])>>29)&1)-1) | ~(DV_I_49_0_bit|DV_II_45_0_bit|DV_II_48_0_bit|DV_II_53_0_bit|DV_II_54_0_bit));
+       mask &= ((((W[50]^(W[53]>>25))&(1<<4))-(1<<4)) | ~(DV_I_50_0_bit|DV_I_52_0_bit|DV_II_46_0_bit|DV_II_48_0_bit|DV_II_54_0_bit));
+       mask &= (((((W[50]^W[51])>>29)&1)-1) | ~(DV_I_47_0_bit|DV_II_46_0_bit|DV_II_51_0_bit|DV_II_52_0_bit|DV_II_56_0_bit));
+       mask &= ((((W[49]^(W[52]>>25))&(1<<4))-(1<<4)) | ~(DV_I_49_0_bit|DV_I_51_0_bit|DV_II_45_0_bit|DV_II_47_0_bit|DV_II_53_0_bit));
+       mask &= ((((W[48]^(W[51]>>25))&(1<<4))-(1<<4)) | ~(DV_I_48_0_bit|DV_I_50_0_bit|DV_I_52_0_bit|DV_II_46_0_bit|DV_II_52_0_bit));
+       mask &= (((((W[42]^W[43])>>29)&1)-1) | ~(DV_I_46_0_bit|DV_I_49_0_bit|DV_I_50_0_bit|DV_II_48_0_bit|DV_II_49_0_bit));
+       mask &= (((((W[41]^W[42])>>29)&1)-1) | ~(DV_I_45_0_bit|DV_I_48_0_bit|DV_I_49_0_bit|DV_II_47_0_bit|DV_II_48_0_bit));
+       mask &= (((((W[40]>>4)^(W[43]>>29))&1)-1) | ~(DV_I_44_0_bit|DV_I_46_0_bit|DV_I_50_0_bit|DV_II_49_0_bit|DV_II_56_0_bit));
+       mask &= (((((W[39]>>4)^(W[42]>>29))&1)-1) | ~(DV_I_43_0_bit|DV_I_45_0_bit|DV_I_49_0_bit|DV_II_48_0_bit|DV_II_55_0_bit));
+       if (mask & (DV_I_44_0_bit|DV_I_48_0_bit|DV_II_47_0_bit|DV_II_54_0_bit|DV_II_56_0_bit))
+               mask &= (((((W[38]>>4)^(W[41]>>29))&1)-1) | ~(DV_I_44_0_bit|DV_I_48_0_bit|DV_II_47_0_bit|DV_II_54_0_bit|DV_II_56_0_bit));
+       mask &= (((((W[37]>>4)^(W[40]>>29))&1)-1) | ~(DV_I_43_0_bit|DV_I_47_0_bit|DV_II_46_0_bit|DV_II_53_0_bit|DV_II_55_0_bit));
+       if (mask & (DV_I_52_0_bit|DV_II_48_0_bit|DV_II_51_0_bit|DV_II_56_0_bit))
+               mask &= (((((W[55]^W[56])>>29)&1)-1) | ~(DV_I_52_0_bit|DV_II_48_0_bit|DV_II_51_0_bit|DV_II_56_0_bit));
+       if (mask & (DV_I_52_0_bit|DV_II_48_0_bit|DV_II_50_0_bit|DV_II_56_0_bit))
+               mask &= ((((W[52]^(W[55]>>25))&(1<<4))-(1<<4)) | ~(DV_I_52_0_bit|DV_II_48_0_bit|DV_II_50_0_bit|DV_II_56_0_bit));
+       if (mask & (DV_I_51_0_bit|DV_II_47_0_bit|DV_II_49_0_bit|DV_II_55_0_bit))
+               mask &= ((((W[51]^(W[54]>>25))&(1<<4))-(1<<4)) | ~(DV_I_51_0_bit|DV_II_47_0_bit|DV_II_49_0_bit|DV_II_55_0_bit));
+       if (mask & (DV_I_48_0_bit|DV_II_47_0_bit|DV_II_52_0_bit|DV_II_53_0_bit))
+               mask &= (((((W[51]^W[52])>>29)&1)-1) | ~(DV_I_48_0_bit|DV_II_47_0_bit|DV_II_52_0_bit|DV_II_53_0_bit));
+       if (mask & (DV_I_46_0_bit|DV_I_49_0_bit|DV_II_45_0_bit|DV_II_48_0_bit))
+               mask &= (((((W[36]>>4)^(W[40]>>29))&1)-1) | ~(DV_I_46_0_bit|DV_I_49_0_bit|DV_II_45_0_bit|DV_II_48_0_bit));
+       if (mask & (DV_I_52_0_bit|DV_II_48_0_bit|DV_II_49_0_bit))
+               mask &= ((0-(((W[53]^W[56])>>29)&1)) | ~(DV_I_52_0_bit|DV_II_48_0_bit|DV_II_49_0_bit));
+       if (mask & (DV_I_50_0_bit|DV_II_46_0_bit|DV_II_47_0_bit))
+               mask &= ((0-(((W[51]^W[54])>>29)&1)) | ~(DV_I_50_0_bit|DV_II_46_0_bit|DV_II_47_0_bit));
+       if (mask & (DV_I_49_0_bit|DV_I_51_0_bit|DV_II_45_0_bit))
+               mask &= ((0-(((W[50]^W[52])>>29)&1)) | ~(DV_I_49_0_bit|DV_I_51_0_bit|DV_II_45_0_bit));
+       if (mask & (DV_I_48_0_bit|DV_I_50_0_bit|DV_I_52_0_bit))
+               mask &= ((0-(((W[49]^W[51])>>29)&1)) | ~(DV_I_48_0_bit|DV_I_50_0_bit|DV_I_52_0_bit));
+       if (mask & (DV_I_47_0_bit|DV_I_49_0_bit|DV_I_51_0_bit))
+               mask &= ((0-(((W[48]^W[50])>>29)&1)) | ~(DV_I_47_0_bit|DV_I_49_0_bit|DV_I_51_0_bit));
+       if (mask & (DV_I_46_0_bit|DV_I_48_0_bit|DV_I_50_0_bit))
+               mask &= ((0-(((W[47]^W[49])>>29)&1)) | ~(DV_I_46_0_bit|DV_I_48_0_bit|DV_I_50_0_bit));
+       if (mask & (DV_I_45_0_bit|DV_I_47_0_bit|DV_I_49_0_bit))
+               mask &= ((0-(((W[46]^W[48])>>29)&1)) | ~(DV_I_45_0_bit|DV_I_47_0_bit|DV_I_49_0_bit));
+       mask &= ((((W[45]^W[47])&(1<<6))-(1<<6)) | ~(DV_I_47_2_bit|DV_I_49_2_bit|DV_I_51_2_bit));
+       if (mask & (DV_I_44_0_bit|DV_I_46_0_bit|DV_I_48_0_bit))
+               mask &= ((0-(((W[45]^W[47])>>29)&1)) | ~(DV_I_44_0_bit|DV_I_46_0_bit|DV_I_48_0_bit));
+       mask &= (((((W[44]^W[46])>>6)&1)-1) | ~(DV_I_46_2_bit|DV_I_48_2_bit|DV_I_50_2_bit));
+       if (mask & (DV_I_43_0_bit|DV_I_45_0_bit|DV_I_47_0_bit))
+               mask &= ((0-(((W[44]^W[46])>>29)&1)) | ~(DV_I_43_0_bit|DV_I_45_0_bit|DV_I_47_0_bit));
+       mask &= ((0-((W[41]^(W[42]>>5))&(1<<1))) | ~(DV_I_48_2_bit|DV_II_46_2_bit|DV_II_51_2_bit));
+       mask &= ((0-((W[40]^(W[41]>>5))&(1<<1))) | ~(DV_I_47_2_bit|DV_I_51_2_bit|DV_II_50_2_bit));
+       if (mask & (DV_I_44_0_bit|DV_I_46_0_bit|DV_II_56_0_bit))
+               mask &= ((0-(((W[40]^W[42])>>4)&1)) | ~(DV_I_44_0_bit|DV_I_46_0_bit|DV_II_56_0_bit));
+       mask &= ((0-((W[39]^(W[40]>>5))&(1<<1))) | ~(DV_I_46_2_bit|DV_I_50_2_bit|DV_II_49_2_bit));
+       if (mask & (DV_I_43_0_bit|DV_I_45_0_bit|DV_II_55_0_bit))
+               mask &= ((0-(((W[39]^W[41])>>4)&1)) | ~(DV_I_43_0_bit|DV_I_45_0_bit|DV_II_55_0_bit));
+       if (mask & (DV_I_44_0_bit|DV_II_54_0_bit|DV_II_56_0_bit))
+               mask &= ((0-(((W[38]^W[40])>>4)&1)) | ~(DV_I_44_0_bit|DV_II_54_0_bit|DV_II_56_0_bit));
+       if (mask & (DV_I_43_0_bit|DV_II_53_0_bit|DV_II_55_0_bit))
+               mask &= ((0-(((W[37]^W[39])>>4)&1)) | ~(DV_I_43_0_bit|DV_II_53_0_bit|DV_II_55_0_bit));
+       mask &= ((0-((W[36]^(W[37]>>5))&(1<<1))) | ~(DV_I_47_2_bit|DV_I_50_2_bit|DV_II_46_2_bit));
+       if (mask & (DV_I_45_0_bit|DV_I_48_0_bit|DV_II_47_0_bit))
+               mask &= (((((W[35]>>4)^(W[39]>>29))&1)-1) | ~(DV_I_45_0_bit|DV_I_48_0_bit|DV_II_47_0_bit));
+       if (mask & (DV_I_48_0_bit|DV_II_48_0_bit))
+               mask &= ((0-((W[63]^(W[64]>>5))&(1<<0))) | ~(DV_I_48_0_bit|DV_II_48_0_bit));
+       if (mask & (DV_I_45_0_bit|DV_II_45_0_bit))
+               mask &= ((0-((W[63]^(W[64]>>5))&(1<<1))) | ~(DV_I_45_0_bit|DV_II_45_0_bit));
+       if (mask & (DV_I_47_0_bit|DV_II_47_0_bit))
+               mask &= ((0-((W[62]^(W[63]>>5))&(1<<0))) | ~(DV_I_47_0_bit|DV_II_47_0_bit));
+       if (mask & (DV_I_46_0_bit|DV_II_46_0_bit))
+               mask &= ((0-((W[61]^(W[62]>>5))&(1<<0))) | ~(DV_I_46_0_bit|DV_II_46_0_bit));
+       mask &= ((0-((W[61]^(W[62]>>5))&(1<<2))) | ~(DV_I_46_2_bit|DV_II_46_2_bit));
+       if (mask & (DV_I_45_0_bit|DV_II_45_0_bit))
+               mask &= ((0-((W[60]^(W[61]>>5))&(1<<0))) | ~(DV_I_45_0_bit|DV_II_45_0_bit));
+       if (mask & (DV_II_51_0_bit|DV_II_54_0_bit))
+               mask &= (((((W[58]^W[59])>>29)&1)-1) | ~(DV_II_51_0_bit|DV_II_54_0_bit));
+       if (mask & (DV_II_50_0_bit|DV_II_53_0_bit))
+               mask &= (((((W[57]^W[58])>>29)&1)-1) | ~(DV_II_50_0_bit|DV_II_53_0_bit));
+       if (mask & (DV_II_52_0_bit|DV_II_54_0_bit))
+               mask &= ((((W[56]^(W[59]>>25))&(1<<4))-(1<<4)) | ~(DV_II_52_0_bit|DV_II_54_0_bit));
+       if (mask & (DV_II_51_0_bit|DV_II_52_0_bit))
+               mask &= ((0-(((W[56]^W[59])>>29)&1)) | ~(DV_II_51_0_bit|DV_II_52_0_bit));
+       if (mask & (DV_II_49_0_bit|DV_II_52_0_bit))
+               mask &= (((((W[56]^W[57])>>29)&1)-1) | ~(DV_II_49_0_bit|DV_II_52_0_bit));
+       if (mask & (DV_II_51_0_bit|DV_II_53_0_bit))
+               mask &= ((((W[55]^(W[58]>>25))&(1<<4))-(1<<4)) | ~(DV_II_51_0_bit|DV_II_53_0_bit));
+       if (mask & (DV_II_50_0_bit|DV_II_52_0_bit))
+               mask &= ((((W[54]^(W[57]>>25))&(1<<4))-(1<<4)) | ~(DV_II_50_0_bit|DV_II_52_0_bit));
+       if (mask & (DV_II_49_0_bit|DV_II_51_0_bit))
+               mask &= ((((W[53]^(W[56]>>25))&(1<<4))-(1<<4)) | ~(DV_II_49_0_bit|DV_II_51_0_bit));
+       mask &= ((((W[51]^(W[50]>>5))&(1<<1))-(1<<1)) | ~(DV_I_50_2_bit|DV_II_46_2_bit));
+       mask &= ((((W[48]^W[50])&(1<<6))-(1<<6)) | ~(DV_I_50_2_bit|DV_II_46_2_bit));
+       if (mask & (DV_I_51_0_bit|DV_I_52_0_bit))
+               mask &= ((0-(((W[48]^W[55])>>29)&1)) | ~(DV_I_51_0_bit|DV_I_52_0_bit));
+       mask &= ((((W[47]^W[49])&(1<<6))-(1<<6)) | ~(DV_I_49_2_bit|DV_I_51_2_bit));
+       mask &= ((((W[48]^(W[47]>>5))&(1<<1))-(1<<1)) | ~(DV_I_47_2_bit|DV_II_51_2_bit));
+       mask &= ((((W[46]^W[48])&(1<<6))-(1<<6)) | ~(DV_I_48_2_bit|DV_I_50_2_bit));
+       mask &= ((((W[47]^(W[46]>>5))&(1<<1))-(1<<1)) | ~(DV_I_46_2_bit|DV_II_50_2_bit));
+       mask &= ((0-((W[44]^(W[45]>>5))&(1<<1))) | ~(DV_I_51_2_bit|DV_II_49_2_bit));
+       mask &= ((((W[43]^W[45])&(1<<6))-(1<<6)) | ~(DV_I_47_2_bit|DV_I_49_2_bit));
+       mask &= (((((W[42]^W[44])>>6)&1)-1) | ~(DV_I_46_2_bit|DV_I_48_2_bit));
+       mask &= ((((W[43]^(W[42]>>5))&(1<<1))-(1<<1)) | ~(DV_II_46_2_bit|DV_II_51_2_bit));
+       mask &= ((((W[42]^(W[41]>>5))&(1<<1))-(1<<1)) | ~(DV_I_51_2_bit|DV_II_50_2_bit));
+       mask &= ((((W[41]^(W[40]>>5))&(1<<1))-(1<<1)) | ~(DV_I_50_2_bit|DV_II_49_2_bit));
+       if (mask & (DV_I_52_0_bit|DV_II_51_0_bit))
+               mask &= ((((W[39]^(W[43]>>25))&(1<<4))-(1<<4)) | ~(DV_I_52_0_bit|DV_II_51_0_bit));
+       if (mask & (DV_I_51_0_bit|DV_II_50_0_bit))
+               mask &= ((((W[38]^(W[42]>>25))&(1<<4))-(1<<4)) | ~(DV_I_51_0_bit|DV_II_50_0_bit));
+       if (mask & (DV_I_48_2_bit|DV_I_51_2_bit))
+               mask &= ((0-((W[37]^(W[38]>>5))&(1<<1))) | ~(DV_I_48_2_bit|DV_I_51_2_bit));
+       if (mask & (DV_I_50_0_bit|DV_II_49_0_bit))
+               mask &= ((((W[37]^(W[41]>>25))&(1<<4))-(1<<4)) | ~(DV_I_50_0_bit|DV_II_49_0_bit));
+       if (mask & (DV_II_52_0_bit|DV_II_54_0_bit))
+               mask &= ((0-((W[36]^W[38])&(1<<4))) | ~(DV_II_52_0_bit|DV_II_54_0_bit));
+       mask &= ((0-((W[35]^(W[36]>>5))&(1<<1))) | ~(DV_I_46_2_bit|DV_I_49_2_bit));
+       if (mask & (DV_I_51_0_bit|DV_II_47_0_bit))
+               mask &= ((((W[35]^(W[39]>>25))&(1<<3))-(1<<3)) | ~(DV_I_51_0_bit|DV_II_47_0_bit));
+if (mask) {
+
+       if (mask & DV_I_43_0_bit)
+                if (
+                           !((W[61]^(W[62]>>5)) & (1<<1))
+                        || !(!((W[59]^(W[63]>>25)) & (1<<5)))
+                        || !((W[58]^(W[63]>>30)) & (1<<0))
+                )  mask &= ~DV_I_43_0_bit;
+       if (mask & DV_I_44_0_bit)
+                if (
+                           !((W[62]^(W[63]>>5)) & (1<<1))
+                        || !(!((W[60]^(W[64]>>25)) & (1<<5)))
+                        || !((W[59]^(W[64]>>30)) & (1<<0))
+                )  mask &= ~DV_I_44_0_bit;
+       if (mask & DV_I_46_2_bit)
+               mask &= ((~((W[40]^W[42])>>2)) | ~DV_I_46_2_bit);
+       if (mask & DV_I_47_2_bit)
+                if (
+                           !((W[62]^(W[63]>>5)) & (1<<2))
+                        || !(!((W[41]^W[43]) & (1<<6)))
+                )  mask &= ~DV_I_47_2_bit;
+       if (mask & DV_I_48_2_bit)
+                if (
+                           !((W[63]^(W[64]>>5)) & (1<<2))
+                        || !(!((W[48]^(W[49]<<5)) & (1<<6)))
+                )  mask &= ~DV_I_48_2_bit;
+       if (mask & DV_I_49_2_bit)
+                if (
+                           !(!((W[49]^(W[50]<<5)) & (1<<6)))
+                        || !((W[42]^W[50]) & (1<<1))
+                        || !(!((W[39]^(W[40]<<5)) & (1<<6)))
+                        || !((W[38]^W[40]) & (1<<1))
+                )  mask &= ~DV_I_49_2_bit;
+       if (mask & DV_I_50_0_bit)
+               mask &= ((((W[36]^W[37])<<7)) | ~DV_I_50_0_bit);
+       if (mask & DV_I_50_2_bit)
+               mask &= ((((W[43]^W[51])<<11)) | ~DV_I_50_2_bit);
+       if (mask & DV_I_51_0_bit)
+               mask &= ((((W[37]^W[38])<<9)) | ~DV_I_51_0_bit);
+       if (mask & DV_I_51_2_bit)
+                if (
+                           !(!((W[51]^(W[52]<<5)) & (1<<6)))
+                        || !(!((W[49]^W[51]) & (1<<6)))
+                        || !(!((W[37]^(W[37]>>5)) & (1<<1)))
+                        || !(!((W[35]^(W[39]>>25)) & (1<<5)))
+                )  mask &= ~DV_I_51_2_bit;
+       if (mask & DV_I_52_0_bit)
+               mask &= ((((W[38]^W[39])<<11)) | ~DV_I_52_0_bit);
+       if (mask & DV_II_46_2_bit)
+               mask &= ((((W[47]^W[51])<<17)) | ~DV_II_46_2_bit);
+       if (mask & DV_II_48_0_bit)
+                if (
+                           !(!((W[36]^(W[40]>>25)) & (1<<3)))
+                        || !((W[35]^(W[40]<<2)) & (1<<30))
+                )  mask &= ~DV_II_48_0_bit;
+       if (mask & DV_II_49_0_bit)
+                if (
+                           !(!((W[37]^(W[41]>>25)) & (1<<3)))
+                        || !((W[36]^(W[41]<<2)) & (1<<30))
+                )  mask &= ~DV_II_49_0_bit;
+       if (mask & DV_II_49_2_bit)
+                if (
+                           !(!((W[53]^(W[54]<<5)) & (1<<6)))
+                        || !(!((W[51]^W[53]) & (1<<6)))
+                        || !((W[50]^W[54]) & (1<<1))
+                        || !(!((W[45]^(W[46]<<5)) & (1<<6)))
+                        || !(!((W[37]^(W[41]>>25)) & (1<<5)))
+                        || !((W[36]^(W[41]>>30)) & (1<<0))
+                )  mask &= ~DV_II_49_2_bit;
+       if (mask & DV_II_50_0_bit)
+                if (
+                           !((W[55]^W[58]) & (1<<29))
+                        || !(!((W[38]^(W[42]>>25)) & (1<<3)))
+                        || !((W[37]^(W[42]<<2)) & (1<<30))
+                )  mask &= ~DV_II_50_0_bit;
+       if (mask & DV_II_50_2_bit)
+                if (
+                           !(!((W[54]^(W[55]<<5)) & (1<<6)))
+                        || !(!((W[52]^W[54]) & (1<<6)))
+                        || !((W[51]^W[55]) & (1<<1))
+                        || !((W[45]^W[47]) & (1<<1))
+                        || !(!((W[38]^(W[42]>>25)) & (1<<5)))
+                        || !((W[37]^(W[42]>>30)) & (1<<0))
+                )  mask &= ~DV_II_50_2_bit;
+       if (mask & DV_II_51_0_bit)
+                if (
+                           !(!((W[39]^(W[43]>>25)) & (1<<3)))
+                        || !((W[38]^(W[43]<<2)) & (1<<30))
+                )  mask &= ~DV_II_51_0_bit;
+       if (mask & DV_II_51_2_bit)
+                if (
+                           !(!((W[55]^(W[56]<<5)) & (1<<6)))
+                        || !(!((W[53]^W[55]) & (1<<6)))
+                        || !((W[52]^W[56]) & (1<<1))
+                        || !((W[46]^W[48]) & (1<<1))
+                        || !(!((W[39]^(W[43]>>25)) & (1<<5)))
+                        || !((W[38]^(W[43]>>30)) & (1<<0))
+                )  mask &= ~DV_II_51_2_bit;
+       if (mask & DV_II_52_0_bit)
+                if (
+                           !(!((W[59]^W[60]) & (1<<29)))
+                        || !(!((W[40]^(W[44]>>25)) & (1<<3)))
+                        || !(!((W[40]^(W[44]>>25)) & (1<<4)))
+                        || !((W[39]^(W[44]<<2)) & (1<<30))
+                )  mask &= ~DV_II_52_0_bit;
+       if (mask & DV_II_53_0_bit)
+                if (
+                           !((W[58]^W[61]) & (1<<29))
+                        || !(!((W[57]^(W[61]>>25)) & (1<<4)))
+                        || !(!((W[41]^(W[45]>>25)) & (1<<3)))
+                        || !(!((W[41]^(W[45]>>25)) & (1<<4)))
+                )  mask &= ~DV_II_53_0_bit;
+       if (mask & DV_II_54_0_bit)
+                if (
+                           !(!((W[58]^(W[62]>>25)) & (1<<4)))
+                        || !(!((W[42]^(W[46]>>25)) & (1<<3)))
+                        || !(!((W[42]^(W[46]>>25)) & (1<<4)))
+                )  mask &= ~DV_II_54_0_bit;
+       if (mask & DV_II_55_0_bit)
+                if (
+                           !(!((W[59]^(W[63]>>25)) & (1<<4)))
+                        || !(!((W[57]^(W[59]>>25)) & (1<<4)))
+                        || !(!((W[43]^(W[47]>>25)) & (1<<3)))
+                        || !(!((W[43]^(W[47]>>25)) & (1<<4)))
+                )  mask &= ~DV_II_55_0_bit;
+       if (mask & DV_II_56_0_bit)
+                if (
+                           !(!((W[60]^(W[64]>>25)) & (1<<4)))
+                        || !(!((W[44]^(W[48]>>25)) & (1<<3)))
+                        || !(!((W[44]^(W[48]>>25)) & (1<<4)))
+                )  mask &= ~DV_II_56_0_bit;
+}
+
+       dvmask[0]=mask;
+}
+
+#ifdef SHA1DC_CUSTOM_TRAILING_INCLUDE_UBC_CHECK_C
+#include SHA1DC_CUSTOM_TRAILING_INCLUDE_UBC_CHECK_C
+#endif
diff --git a/sha1dc/ubc_check.h b/sha1dc/ubc_check.h
new file mode 100644 (file)
index 0000000..d7e17dc
--- /dev/null
@@ -0,0 +1,52 @@
+/***
+* Copyright 2017 Marc Stevens <marc@marc-stevens.nl>, Dan Shumow <danshu@microsoft.com>
+* Distributed under the MIT Software License.
+* See accompanying file LICENSE.txt or copy at
+* https://opensource.org/licenses/MIT
+***/
+
+/*
+// this file was generated by the 'parse_bitrel' program in the tools section
+// using the data files from directory 'tools/data/3565'
+//
+// sha1_dvs contains a list of SHA-1 Disturbance Vectors (DV) to check
+// dvType, dvK and dvB define the DV: I(K,B) or II(K,B) (see the paper)
+// dm[80] is the expanded message block XOR-difference defined by the DV
+// testt is the step to do the recompression from for collision detection
+// maski and maskb define the bit to check for each DV in the dvmask returned by ubc_check
+//
+// ubc_check takes as input an expanded message block and verifies the unavoidable bitconditions for all listed DVs
+// it returns a dvmask where each bit belonging to a DV is set if all unavoidable bitconditions for that DV have been met
+// thus one needs to do the recompression check for each DV that has its bit set
+*/
+
+#ifndef SHA1DC_UBC_CHECK_H
+#define SHA1DC_UBC_CHECK_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#ifndef SHA1DC_NO_STANDARD_INCLUDES
+#include <stdint.h>
+#endif
+
+#define DVMASKSIZE 1
+typedef struct { int dvType; int dvK; int dvB; int testt; int maski; int maskb; uint32_t dm[80]; } dv_info_t;
+extern dv_info_t sha1_dvs[];
+void ubc_check(const uint32_t W[80], uint32_t dvmask[DVMASKSIZE]);
+
+#define DOSTORESTATE58
+#define DOSTORESTATE65
+
+#define CHECK_DVMASK(_DVMASK) (0 != _DVMASK[0])
+
+#if defined(__cplusplus)
+}
+#endif
+
+#ifdef SHA1DC_CUSTOM_TRAILING_INCLUDE_UBC_CHECK_H
+#include SHA1DC_CUSTOM_TRAILING_INCLUDE_UBC_CHECK_H
+#endif
+
+#endif
diff --git a/sha1dc_git.c b/sha1dc_git.c
new file mode 100644 (file)
index 0000000..4d32b4f
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * This code is included at the end of sha1dc/sha1.c with the
+ * SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_C macro.
+ */
+
+void git_SHA1DCFinal(unsigned char hash[20], SHA1_CTX *ctx)
+{
+       if (!SHA1DCFinal(hash, ctx))
+               return;
+       die("SHA-1 appears to be part of a collision attack: %s",
+           sha1_to_hex(hash));
+}
+
+void git_SHA1DCUpdate(SHA1_CTX *ctx, const void *vdata, unsigned long len)
+{
+       const char *data = vdata;
+       /* We expect an unsigned long, but sha1dc only takes an int */
+       while (len > INT_MAX) {
+               SHA1DCUpdate(ctx, data, INT_MAX);
+               data += INT_MAX;
+               len -= INT_MAX;
+       }
+       SHA1DCUpdate(ctx, data, len);
+}
diff --git a/sha1dc_git.h b/sha1dc_git.h
new file mode 100644 (file)
index 0000000..a8a5c1d
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * This code is included at the end of sha1dc/sha1.h with the
+ * SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_H macro.
+ */
+
+/*
+ * Same as SHA1DCFinal, but convert collision attack case into a verbose die().
+ */
+void git_SHA1DCFinal(unsigned char [20], SHA1_CTX *);
+
+/*
+ * Same as SHA1DCUpdate, but adjust types to match git's usual interface.
+ */
+void git_SHA1DCUpdate(SHA1_CTX *ctx, const void *data, unsigned long len);
+
+#define platform_SHA_CTX SHA1_CTX
+#define platform_SHA1_Init SHA1DCInit
+#define platform_SHA1_Update git_SHA1DCUpdate
+#define platform_SHA1_Final git_SHA1DCFinal
index 54e2db73349ef22d644552c6b122ae5ed6ba2ce1..f9370961f99f5e68c1bfe84d215513536fccbdaf 100644 (file)
--- a/shallow.c
+++ b/shallow.c
@@ -10,6 +10,8 @@
 #include "diff.h"
 #include "revision.h"
 #include "commit-slab.h"
+#include "revision.h"
+#include "list-objects.h"
 
 static int is_shallow = -1;
 static struct stat_validity shallow_stat;
@@ -137,6 +139,82 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
        return result;
 }
 
+static void show_commit(struct commit *commit, void *data)
+{
+       commit_list_insert(commit, data);
+}
+
+/*
+ * Given rev-list arguments, run rev-list. All reachable commits
+ * except border ones are marked with not_shallow_flag. Border commits
+ * are marked with shallow_flag. The list of border/shallow commits
+ * are also returned.
+ */
+struct commit_list *get_shallow_commits_by_rev_list(int ac, const char **av,
+                                                   int shallow_flag,
+                                                   int not_shallow_flag)
+{
+       struct commit_list *result = NULL, *p;
+       struct commit_list *not_shallow_list = NULL;
+       struct rev_info revs;
+       int both_flags = shallow_flag | not_shallow_flag;
+
+       /*
+        * SHALLOW (excluded) and NOT_SHALLOW (included) should not be
+        * set at this point. But better be safe than sorry.
+        */
+       clear_object_flags(both_flags);
+
+       is_repository_shallow(); /* make sure shallows are read */
+
+       init_revisions(&revs, NULL);
+       save_commit_buffer = 0;
+       setup_revisions(ac, av, &revs, NULL);
+
+       if (prepare_revision_walk(&revs))
+               die("revision walk setup failed");
+       traverse_commit_list(&revs, show_commit, NULL, &not_shallow_list);
+
+       /* Mark all reachable commits as NOT_SHALLOW */
+       for (p = not_shallow_list; p; p = p->next)
+               p->item->object.flags |= not_shallow_flag;
+
+       /*
+        * mark border commits SHALLOW + NOT_SHALLOW.
+        * We cannot clear NOT_SHALLOW right now. Imagine border
+        * commit A is processed first, then commit B, whose parent is
+        * A, later. If NOT_SHALLOW on A is cleared at step 1, B
+        * itself is considered border at step 2, which is incorrect.
+        */
+       for (p = not_shallow_list; p; p = p->next) {
+               struct commit *c = p->item;
+               struct commit_list *parent;
+
+               if (parse_commit(c))
+                       die("unable to parse commit %s",
+                           oid_to_hex(&c->object.oid));
+
+               for (parent = c->parents; parent; parent = parent->next)
+                       if (!(parent->item->object.flags & not_shallow_flag)) {
+                               c->object.flags |= shallow_flag;
+                               commit_list_insert(c, &result);
+                               break;
+                       }
+       }
+       free_commit_list(not_shallow_list);
+
+       /*
+        * Now we can clean up NOT_SHALLOW on border commits. Having
+        * both flags set can confuse the caller.
+        */
+       for (p = result; p; p = p->next) {
+               struct object *o = &p->item->object;
+               if ((o->flags & both_flags) == both_flags)
+                       o->flags &= ~not_shallow_flag;
+       }
+       return result;
+}
+
 static void check_shallow_file_for_update(void)
 {
        if (is_shallow == -1)
@@ -182,7 +260,7 @@ static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
 }
 
 static int write_shallow_commits_1(struct strbuf *out, int use_pack_protocol,
-                                  const struct sha1_array *extra,
+                                  const struct oid_array *extra,
                                   unsigned flags)
 {
        struct write_shallow_data data;
@@ -195,7 +273,7 @@ static int write_shallow_commits_1(struct strbuf *out, int use_pack_protocol,
        if (!extra)
                return data.count;
        for (i = 0; i < extra->nr; i++) {
-               strbuf_addstr(out, sha1_to_hex(extra->sha1[i]));
+               strbuf_addstr(out, oid_to_hex(extra->oid + i));
                strbuf_addch(out, '\n');
                data.count++;
        }
@@ -203,14 +281,14 @@ static int write_shallow_commits_1(struct strbuf *out, int use_pack_protocol,
 }
 
 int write_shallow_commits(struct strbuf *out, int use_pack_protocol,
-                         const struct sha1_array *extra)
+                         const struct oid_array *extra)
 {
        return write_shallow_commits_1(out, use_pack_protocol, extra, 0);
 }
 
 static struct tempfile temporary_shallow;
 
-const char *setup_temporary_shallow(const struct sha1_array *extra)
+const char *setup_temporary_shallow(const struct oid_array *extra)
 {
        struct strbuf sb = STRBUF_INIT;
        int fd;
@@ -234,7 +312,7 @@ const char *setup_temporary_shallow(const struct sha1_array *extra)
 
 void setup_alternate_shallow(struct lock_file *shallow_lock,
                             const char **alternate_shallow_file,
-                            const struct sha1_array *extra)
+                            const struct oid_array *extra)
 {
        struct strbuf sb = STRBUF_INIT;
        int fd;
@@ -260,7 +338,7 @@ static int advertise_shallow_grafts_cb(const struct commit_graft *graft, void *c
 {
        int fd = *(int *)cb;
        if (graft->nr_parent == -1)
-               packet_write(fd, "shallow %s\n", oid_to_hex(&graft->oid));
+               packet_write_fmt(fd, "shallow %s\n", oid_to_hex(&graft->oid));
        return 0;
 }
 
@@ -307,7 +385,7 @@ struct trace_key trace_shallow = TRACE_KEY_INIT(SHALLOW);
  * Step 1, split sender shallow commits into "ours" and "theirs"
  * Step 2, clean "ours" based on .git/shallow
  */
-void prepare_shallow_info(struct shallow_info *info, struct sha1_array *sa)
+void prepare_shallow_info(struct shallow_info *info, struct oid_array *sa)
 {
        int i;
        trace_printf_key(&trace_shallow, "shallow: prepare_shallow_info\n");
@@ -318,9 +396,9 @@ void prepare_shallow_info(struct shallow_info *info, struct sha1_array *sa)
        ALLOC_ARRAY(info->ours, sa->nr);
        ALLOC_ARRAY(info->theirs, sa->nr);
        for (i = 0; i < sa->nr; i++) {
-               if (has_sha1_file(sa->sha1[i])) {
+               if (has_object_file(sa->oid + i)) {
                        struct commit_graft *graft;
-                       graft = lookup_commit_graft(sa->sha1[i]);
+                       graft = lookup_commit_graft(sa->oid[i].hash);
                        if (graft && graft->nr_parent < 0)
                                continue;
                        info->ours[info->nr_ours++] = i;
@@ -339,13 +417,13 @@ void clear_shallow_info(struct shallow_info *info)
 
 void remove_nonexistent_theirs_shallow(struct shallow_info *info)
 {
-       unsigned char (*sha1)[20] = info->shallow->sha1;
+       struct object_id *oid = info->shallow->oid;
        int i, dst;
        trace_printf_key(&trace_shallow, "shallow: remove_nonexistent_theirs_shallow\n");
        for (i = dst = 0; i < info->nr_theirs; i++) {
                if (i != dst)
                        info->theirs[dst] = info->theirs[i];
-               if (has_sha1_file(sha1[info->theirs[i]]))
+               if (has_object_file(oid + info->theirs[i]))
                        dst++;
        }
        info->nr_theirs = dst;
@@ -353,12 +431,14 @@ void remove_nonexistent_theirs_shallow(struct shallow_info *info)
 
 define_commit_slab(ref_bitmap, uint32_t *);
 
+#define POOL_SIZE (512 * 1024)
+
 struct paint_info {
        struct ref_bitmap ref_bitmap;
        unsigned nr_bits;
-       char **slab;
+       char **pools;
        char *free, *end;
-       unsigned slab_count;
+       unsigned pool_count;
 };
 
 static uint32_t *paint_alloc(struct paint_info *info)
@@ -366,12 +446,15 @@ static uint32_t *paint_alloc(struct paint_info *info)
        unsigned nr = (info->nr_bits + 31) / 32;
        unsigned size = nr * sizeof(uint32_t);
        void *p;
-       if (!info->slab_count || info->free + size > info->end) {
-               info->slab_count++;
-               REALLOC_ARRAY(info->slab, info->slab_count);
-               info->free = xmalloc(COMMIT_SLAB_SIZE);
-               info->slab[info->slab_count - 1] = info->free;
-               info->end = info->free + COMMIT_SLAB_SIZE;
+       if (!info->pool_count || size > info->end - info->free) {
+               if (size > POOL_SIZE)
+                       die("BUG: pool size too small for %d in paint_alloc()",
+                           size);
+               info->pool_count++;
+               REALLOC_ARRAY(info->pools, info->pool_count);
+               info->free = xmalloc(POOL_SIZE);
+               info->pools[info->pool_count - 1] = info->free;
+               info->end = info->free + POOL_SIZE;
        }
        p = info->free;
        info->free += size;
@@ -384,19 +467,23 @@ static uint32_t *paint_alloc(struct paint_info *info)
  * all walked commits.
  */
 static void paint_down(struct paint_info *info, const unsigned char *sha1,
-                      int id)
+                      unsigned int id)
 {
        unsigned int i, nr;
        struct commit_list *head = NULL;
        int bitmap_nr = (info->nr_bits + 31) / 32;
        size_t bitmap_size = st_mult(sizeof(uint32_t), bitmap_nr);
-       uint32_t *tmp = xmalloc(bitmap_size); /* to be freed before return */
-       uint32_t *bitmap = paint_alloc(info);
        struct commit *c = lookup_commit_reference_gently(sha1, 1);
+       uint32_t *tmp; /* to be freed before return */
+       uint32_t *bitmap;
+
        if (!c)
                return;
+
+       tmp = xmalloc(bitmap_size);
+       bitmap = paint_alloc(info);
        memset(bitmap, 0, bitmap_size);
-       bitmap[id / 32] |= (1 << (id % 32));
+       bitmap[id / 32] |= (1U << (id % 32));
        commit_list_insert(c, &head);
        while (head) {
                struct commit_list *p;
@@ -429,12 +516,8 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
                            oid_to_hex(&c->object.oid));
 
                for (p = c->parents; p; p = p->next) {
-                       uint32_t **p_refs = ref_bitmap_at(&info->ref_bitmap,
-                                                         p->item);
                        if (p->item->object.flags & SEEN)
                                continue;
-                       if (*p_refs == NULL || *p_refs == *refs)
-                               *p_refs = *refs;
                        commit_list_insert(p->item, &head);
                }
        }
@@ -480,8 +563,8 @@ static void post_assign_shallow(struct shallow_info *info,
 void assign_shallow_commits_to_refs(struct shallow_info *info,
                                    uint32_t **used, int *ref_status)
 {
-       unsigned char (*sha1)[20] = info->shallow->sha1;
-       struct sha1_array *ref = info->ref;
+       struct object_id *oid = info->shallow->oid;
+       struct oid_array *ref = info->ref;
        unsigned int i, nr;
        int *shallow, nr_shallow = 0;
        struct paint_info pi;
@@ -520,18 +603,18 @@ void assign_shallow_commits_to_refs(struct shallow_info *info,
 
        /* Mark potential bottoms so we won't go out of bound */
        for (i = 0; i < nr_shallow; i++) {
-               struct commit *c = lookup_commit(sha1[shallow[i]]);
+               struct commit *c = lookup_commit(oid[shallow[i]].hash);
                c->object.flags |= BOTTOM;
        }
 
        for (i = 0; i < ref->nr; i++)
-               paint_down(&pi, ref->sha1[i], i);
+               paint_down(&pi, ref->oid[i].hash, i);
 
        if (used) {
                int bitmap_size = ((pi.nr_bits + 31) / 32) * sizeof(uint32_t);
                memset(used, 0, sizeof(*used) * info->shallow->nr);
                for (i = 0; i < nr_shallow; i++) {
-                       const struct commit *c = lookup_commit(sha1[shallow[i]]);
+                       const struct commit *c = lookup_commit(oid[shallow[i]].hash);
                        uint32_t **map = ref_bitmap_at(&pi.ref_bitmap, c);
                        if (*map)
                                used[shallow[i]] = xmemdupz(*map, bitmap_size);
@@ -546,9 +629,9 @@ void assign_shallow_commits_to_refs(struct shallow_info *info,
                post_assign_shallow(info, &pi.ref_bitmap, ref_status);
 
        clear_ref_bitmap(&pi.ref_bitmap);
-       for (i = 0; i < pi.slab_count; i++)
-               free(pi.slab[i]);
-       free(pi.slab);
+       for (i = 0; i < pi.pool_count; i++)
+               free(pi.pools[i]);
+       free(pi.pools);
        free(shallow);
 }
 
@@ -570,11 +653,11 @@ static int add_ref(const char *refname, const struct object_id *oid,
 
 static void update_refstatus(int *ref_status, int nr, uint32_t *bitmap)
 {
-       int i;
+       unsigned int i;
        if (!ref_status)
                return;
        for (i = 0; i < nr; i++)
-               if (bitmap[i / 32] & (1 << (i % 32)))
+               if (bitmap[i / 32] & (1U << (i % 32)))
                        ref_status[i]++;
 }
 
@@ -585,7 +668,7 @@ static void post_assign_shallow(struct shallow_info *info,
                                struct ref_bitmap *ref_bitmap,
                                int *ref_status)
 {
-       unsigned char (*sha1)[20] = info->shallow->sha1;
+       struct object_id *oid = info->shallow->oid;
        struct commit *c;
        uint32_t **bitmap;
        int dst, i, j;
@@ -600,7 +683,7 @@ static void post_assign_shallow(struct shallow_info *info,
        for (i = dst = 0; i < info->nr_theirs; i++) {
                if (i != dst)
                        info->theirs[dst] = info->theirs[i];
-               c = lookup_commit(sha1[info->theirs[i]]);
+               c = lookup_commit(oid[info->theirs[i]].hash);
                bitmap = ref_bitmap_at(ref_bitmap, c);
                if (!*bitmap)
                        continue;
@@ -621,7 +704,7 @@ static void post_assign_shallow(struct shallow_info *info,
        for (i = dst = 0; i < info->nr_ours; i++) {
                if (i != dst)
                        info->ours[dst] = info->ours[i];
-               c = lookup_commit(sha1[info->ours[i]]);
+               c = lookup_commit(oid[info->ours[i]].hash);
                bitmap = ref_bitmap_at(ref_bitmap, c);
                if (!*bitmap)
                        continue;
@@ -643,7 +726,7 @@ static void post_assign_shallow(struct shallow_info *info,
 int delayed_reachability_test(struct shallow_info *si, int c)
 {
        if (si->need_reachability_test[c]) {
-               struct commit *commit = lookup_commit(si->shallow->sha1[c]);
+               struct commit *commit = lookup_commit(si->shallow->oid[c].hash);
 
                if (!si->commits) {
                        struct commit_array ca;
index 5a326c68602610d856ac543b8bd034542d83f64b..5d64cfe929684807fcfa004ec3edf10d720189c9 100644 (file)
@@ -13,6 +13,7 @@ struct shortlog {
        int in2;
        int user_format;
        int abbrev;
+       int committer;
 
        char *common_repo_prefix;
        int email;
index 35da553655bdf7b70519ecf529544796ca8185b5..f519e60f87578386ec9b4ea764bf530be0f64836 100644 (file)
@@ -187,7 +187,7 @@ void prepare_to_write_split_index(struct index_state *istate)
                /* Go through istate->cache[] and mark CE_MATCHED to
                 * entry with positive index. We'll go through
                 * base->cache[] later to delete all entries in base
-                * that are not marked eith either CE_MATCHED or
+                * that are not marked with either CE_MATCHED or
                 * CE_UPDATE_IN_BASE. If istate->cache[i] is a
                 * duplicate, deduplicate it.
                 */
@@ -317,3 +317,25 @@ void replace_index_entry_in_base(struct index_state *istate,
                istate->split_index->base->cache[new->index - 1] = new;
        }
 }
+
+void add_split_index(struct index_state *istate)
+{
+       if (!istate->split_index) {
+               init_split_index(istate);
+               istate->cache_changed |= SPLIT_INDEX_ORDERED;
+       }
+}
+
+void remove_split_index(struct index_state *istate)
+{
+       if (istate->split_index) {
+               /*
+                * can't discard_split_index(&the_index); because that
+                * will destroy split_index->base->cache[], which may
+                * be shared with the_index.cache[]. So yeah we're
+                * leaking a bit here.
+                */
+               istate->split_index = NULL;
+               istate->cache_changed |= SOMETHING_CHANGED;
+       }
+}
index c1324f521a87c427c531464c5e6424fe38d7d35b..df91c1bda8117fe7d0f25a0aaedce79370801ce0 100644 (file)
@@ -31,5 +31,7 @@ void merge_base_index(struct index_state *istate);
 void prepare_to_write_split_index(struct index_state *istate);
 void finish_writing_split_index(struct index_state *istate);
 void discard_split_index(struct index_state *istate);
+void add_split_index(struct index_state *istate);
+void remove_split_index(struct index_state *istate);
 
 #endif
index b839be491b74a034cf848d2dd043aba7d75b7b92..9103bc75e482c81bbb8f9d89c72de2935fefcddc 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -204,13 +204,6 @@ void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2)
        strbuf_setlen(sb, sb->len + sb2->len);
 }
 
-void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len)
-{
-       strbuf_grow(sb, len);
-       memcpy(sb->buf + sb->len, sb->buf + pos, len);
-       strbuf_setlen(sb, sb->len + len);
-}
-
 void strbuf_addchars(struct strbuf *sb, int c, size_t n)
 {
        strbuf_grow(sb, n);
@@ -449,6 +442,17 @@ int strbuf_getcwd(struct strbuf *sb)
                        strbuf_setlen(sb, strlen(sb->buf));
                        return 0;
                }
+
+               /*
+                * If getcwd(3) is implemented as a syscall that falls
+                * back to a regular lookup using readdir(3) etc. then
+                * we may be able to avoid EACCES by providing enough
+                * space to the syscall as it's not necessarily bound
+                * to the same restrictions as the fallback.
+                */
+               if (errno == EACCES && guessed_len < PATH_MAX)
+                       continue;
+
                if (errno != ERANGE)
                        break;
        }
@@ -707,6 +711,17 @@ void strbuf_add_absolute_path(struct strbuf *sb, const char *path)
        strbuf_addstr(sb, path);
 }
 
+void strbuf_add_real_path(struct strbuf *sb, const char *path)
+{
+       if (sb->len) {
+               struct strbuf resolved = STRBUF_INIT;
+               strbuf_realpath(&resolved, path, 1);
+               strbuf_addbuf(sb, &resolved);
+               strbuf_release(&resolved);
+       } else
+               strbuf_realpath(sb, path, 1);
+}
+
 int printf_ln(const char *fmt, ...)
 {
        int ret;
@@ -870,3 +885,23 @@ void strbuf_stripspace(struct strbuf *sb, int skip_comments)
 
        strbuf_setlen(sb, j);
 }
+
+int strbuf_normalize_path(struct strbuf *src)
+{
+       struct strbuf dst = STRBUF_INIT;
+
+       strbuf_grow(&dst, src->len);
+       if (normalize_path_copy(dst.buf, src->buf) < 0) {
+               strbuf_release(&dst);
+               return -1;
+       }
+
+       /*
+        * normalize_path does not tell us the new length, so we have to
+        * compute it by looking for the new NUL it placed
+        */
+       strbuf_setlen(&dst, strlen(dst.buf));
+       strbuf_swap(src, &dst);
+       strbuf_release(&dst);
+       return 0;
+}
index ba8d5f1d465e5b06274028aeb096e325e73e5de4..d78525864935f84eb82e340b5ea3ffc9f755eb1e 100644 (file)
--- a/strbuf.h
+++ b/strbuf.h
@@ -109,9 +109,7 @@ extern void strbuf_attach(struct strbuf *, void *, size_t, size_t);
  */
 static inline void strbuf_swap(struct strbuf *a, struct strbuf *b)
 {
-       struct strbuf tmp = *a;
-       *a = *b;
-       *b = tmp;
+       SWAP(*a, *b);
 }
 
 
@@ -265,12 +263,6 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s)
  */
 extern void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2);
 
-/**
- * Copy part of the buffer from a given position till a given length to the
- * end of the buffer.
- */
-extern void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len);
-
 /**
  * This function can be used to expand a format string containing
  * placeholders. To that end, it parses the string and calls the specified
@@ -443,6 +435,28 @@ extern int strbuf_getcwd(struct strbuf *sb);
  */
 extern void strbuf_add_absolute_path(struct strbuf *sb, const char *path);
 
+/**
+ * Canonize `path` (make it absolute, resolve symlinks, remove extra
+ * slashes) and append it to `sb`.  Die with an informative error
+ * message if there is a problem.
+ *
+ * The directory part of `path` (i.e., everything up to the last
+ * dir_sep) must denote a valid, existing directory, but the last
+ * component need not exist.
+ *
+ * Callers that don't mind links should use the more lightweight
+ * strbuf_add_absolute_path() instead.
+ */
+extern void strbuf_add_real_path(struct strbuf *sb, const char *path);
+
+
+/**
+ * Normalize in-place the path contained in the strbuf. See
+ * normalize_path_copy() for details. If an error occurs, the contents of "sb"
+ * are left untouched, and -1 is returned.
+ */
+extern int strbuf_normalize_path(struct strbuf *sb);
+
 /**
  * Strip whitespace from a buffer. The second parameter controls if
  * comments are considered contents to be removed or not.
@@ -554,7 +568,26 @@ static inline void strbuf_complete_line(struct strbuf *sb)
        strbuf_complete(sb, '\n');
 }
 
-extern int strbuf_branchname(struct strbuf *sb, const char *name);
+/*
+ * Copy "name" to "sb", expanding any special @-marks as handled by
+ * interpret_branch_name(). The result is a non-qualified branch name
+ * (so "foo" or "origin/master" instead of "refs/heads/foo" or
+ * "refs/remotes/origin/master").
+ *
+ * Note that the resulting name may not be a syntactically valid refname.
+ *
+ * If "allowed" is non-zero, restrict the set of allowed expansions. See
+ * interpret_branch_name() for details.
+ */
+extern void strbuf_branchname(struct strbuf *sb, const char *name,
+                             unsigned allowed);
+
+/*
+ * Like strbuf_branchname() above, but confirm that the result is
+ * syntactically valid to be used as a local branch name in refs/heads/.
+ *
+ * The return value is "0" if the result is valid, and "-1" otherwise.
+ */
 extern int strbuf_check_branch_ref(struct strbuf *sb, const char *name);
 
 extern void strbuf_addstr_urlencode(struct strbuf *, const char *,
index 90feec9db6e80a73bead43967c4d0cc8dea0cc5e..9afa66b8be6c3b5481e4542c033bfebdb2abbfda 100644 (file)
@@ -135,7 +135,7 @@ struct git_istream *open_istream(const unsigned char *sha1,
                                 struct stream_filter *filter)
 {
        struct git_istream *st;
-       struct object_info oi = {NULL};
+       struct object_info oi = OBJECT_INFO_INIT;
        const unsigned char *real = lookup_replace_object(sha1);
        enum input_source src = istream_source(real, type, &oi);
 
@@ -497,7 +497,7 @@ static open_method_decl(incore)
  * Users of streaming interface
  ****************************************************************/
 
-int stream_blob_to_fd(int fd, unsigned const char *sha1, struct stream_filter *filter,
+int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter *filter,
                      int can_seek)
 {
        struct git_istream *st;
@@ -506,7 +506,7 @@ int stream_blob_to_fd(int fd, unsigned const char *sha1, struct stream_filter *f
        ssize_t kept = 0;
        int result = -1;
 
-       st = open_istream(sha1, &type, &sz, filter);
+       st = open_istream(oid->hash, &type, &sz, filter);
        if (!st) {
                if (filter)
                        free_stream_filter(filter);
index 1d05c2a465c2c26f26b15a1a07cce6282ee5c0c3..73c1d156b352898c9b5661a3e480f579b80c5a00 100644 (file)
@@ -12,6 +12,6 @@ extern struct git_istream *open_istream(const unsigned char *, enum object_type
 extern int close_istream(struct git_istream *);
 extern ssize_t read_istream(struct git_istream *, void *, size_t);
 
-extern int stream_blob_to_fd(int fd, const unsigned char *, struct stream_filter *, int can_seek);
+extern int stream_blob_to_fd(int fd, const struct object_id *, struct stream_filter *, int can_seek);
 
 #endif /* STREAMING_H */
index 62d20846cbead5aba6a4b3859475b454ad606205..c650500c6e51d983dc45a4be3b8dad98f1dece92 100644 (file)
@@ -41,10 +41,7 @@ static int add_entry(int insert_at, struct string_list *list, const char *string
        if (exact_match)
                return -1 - index;
 
-       if (list->nr + 1 >= list->alloc) {
-               list->alloc += 32;
-               REALLOC_ARRAY(list->items, list->alloc);
-       }
+       ALLOC_GROW(list->items, list->nr+1, list->alloc);
        if (index < list->nr)
                memmove(list->items + index + 1, list->items + index,
                                (list->nr - index)
@@ -67,6 +64,24 @@ struct string_list_item *string_list_insert(struct string_list *list, const char
        return list->items + index;
 }
 
+void string_list_remove(struct string_list *list, const char *string,
+                       int free_util)
+{
+       int exact_match;
+       int i = get_entry_index(list, string, &exact_match);
+
+       if (exact_match) {
+               if (list->strdup_strings)
+                       free(list->items[i].string);
+               if (free_util)
+                       free(list->items[i].util);
+
+               list->nr--;
+               memmove(list->items + i, list->items + i + 1,
+                       (list->nr - i) * sizeof(struct string_list_item));
+       }
+}
+
 int string_list_has_string(const struct string_list *list, const char *string)
 {
        int exact_match;
@@ -211,21 +226,18 @@ struct string_list_item *string_list_append(struct string_list *list,
                        list->strdup_strings ? xstrdup(string) : (char *)string);
 }
 
-/* Yuck */
-static compare_strings_fn compare_for_qsort;
-
-/* Only call this from inside string_list_sort! */
-static int cmp_items(const void *a, const void *b)
+static int cmp_items(const void *a, const void *b, void *ctx)
 {
+       compare_strings_fn cmp = ctx;
        const struct string_list_item *one = a;
        const struct string_list_item *two = b;
-       return compare_for_qsort(one->string, two->string);
+       return cmp(one->string, two->string);
 }
 
 void string_list_sort(struct string_list *list)
 {
-       compare_for_qsort = list->cmp ? list->cmp : strcmp;
-       qsort(list->items, list->nr, sizeof(*list->items), cmp_items);
+       QSORT_S(list->items, list->nr, cmp_items,
+               list->cmp ? list->cmp : strcmp);
 }
 
 struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
index d3809a14172da5b1512b08fa411136821465659e..29bfb7ae45931686e14c91b1a47a703e7b32fe52 100644 (file)
@@ -62,6 +62,13 @@ int string_list_find_insert_index(const struct string_list *list, const char *st
  */
 struct string_list_item *string_list_insert(struct string_list *list, const char *string);
 
+/*
+ * Removes the given string from the sorted list.
+ * If the string doesn't exist, the list is not altered.
+ */
+extern void string_list_remove(struct string_list *list, const char *string,
+                              int free_util);
+
 /*
  * Checks if the given string is part of a sorted list. If it is part of the list,
  * return the coresponding string_list_item, NULL otherwise.
index 098085be69b97687b0febfe9e29c6dc0c64569a1..4f58491ddb0705ab56e238006199d35db19dfb5a 100644 (file)
@@ -234,6 +234,26 @@ int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg)
        return parse_fetch_recurse(opt, arg, 1);
 }
 
+static int parse_update_recurse(const char *opt, const char *arg,
+                               int die_on_error)
+{
+       switch (git_config_maybe_bool(opt, arg)) {
+       case 1:
+               return RECURSE_SUBMODULES_ON;
+       case 0:
+               return RECURSE_SUBMODULES_OFF;
+       default:
+               if (die_on_error)
+                       die("bad %s argument: %s", opt, arg);
+               return RECURSE_SUBMODULES_ERROR;
+       }
+}
+
+int parse_update_recurse_submodules_arg(const char *opt, const char *arg)
+{
+       return parse_update_recurse(opt, arg, 1);
+}
+
 static int parse_push_recurse(const char *opt, const char *arg,
                               int die_on_error)
 {
@@ -251,6 +271,8 @@ static int parse_push_recurse(const char *opt, const char *arg,
                        return RECURSE_SUBMODULES_ON_DEMAND;
                else if (!strcmp(arg, "check"))
                        return RECURSE_SUBMODULES_CHECK;
+               else if (!strcmp(arg, "only"))
+                       return RECURSE_SUBMODULES_ONLY;
                else if (die_on_error)
                        die("bad %s argument: %s", opt, arg);
                else
@@ -263,12 +285,12 @@ int parse_push_recurse_submodules_arg(const char *opt, const char *arg)
        return parse_push_recurse(opt, arg, 1);
 }
 
-static void warn_multiple_config(const unsigned char *commit_sha1,
+static void warn_multiple_config(const unsigned char *treeish_name,
                                 const char *name, const char *option)
 {
        const char *commit_string = "WORKTREE";
-       if (commit_sha1)
-               commit_string = sha1_to_hex(commit_sha1);
+       if (treeish_name)
+               commit_string = sha1_to_hex(treeish_name);
        warning("%s:.gitmodules, multiple configurations found for "
                        "'submodule.%s.%s'. Skipping second one!",
                        commit_string, name, option);
@@ -276,7 +298,7 @@ static void warn_multiple_config(const unsigned char *commit_sha1,
 
 struct parse_config_parameter {
        struct submodule_cache *cache;
-       const unsigned char *commit_sha1;
+       const unsigned char *treeish_name;
        const unsigned char *gitmodules_sha1;
        int overwrite;
 };
@@ -300,7 +322,7 @@ static int parse_config(const char *var, const char *value, void *data)
                if (!value)
                        ret = config_error_nonbool(var);
                else if (!me->overwrite && submodule->path)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "path");
                else {
                        if (submodule->path)
@@ -314,7 +336,7 @@ static int parse_config(const char *var, const char *value, void *data)
                int die_on_error = is_null_sha1(me->gitmodules_sha1);
                if (!me->overwrite &&
                    submodule->fetch_recurse != RECURSE_SUBMODULES_NONE)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "fetchrecursesubmodules");
                else
                        submodule->fetch_recurse = parse_fetch_recurse(
@@ -324,14 +346,14 @@ static int parse_config(const char *var, const char *value, void *data)
                if (!value)
                        ret = config_error_nonbool(var);
                else if (!me->overwrite && submodule->ignore)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "ignore");
                else if (strcmp(value, "untracked") &&
                         strcmp(value, "dirty") &&
                         strcmp(value, "all") &&
                         strcmp(value, "none"))
                        warning("Invalid parameter '%s' for config option "
-                                       "'submodule.%s.ignore'", value, var);
+                                       "'submodule.%s.ignore'", value, name.buf);
                else {
                        free((void *) submodule->ignore);
                        submodule->ignore = xstrdup(value);
@@ -340,7 +362,7 @@ static int parse_config(const char *var, const char *value, void *data)
                if (!value) {
                        ret = config_error_nonbool(var);
                } else if (!me->overwrite && submodule->url) {
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                        "url");
                } else {
                        free((void *) submodule->url);
@@ -351,21 +373,21 @@ static int parse_config(const char *var, const char *value, void *data)
                        ret = config_error_nonbool(var);
                else if (!me->overwrite &&
                         submodule->update_strategy.type != SM_UPDATE_UNSPECIFIED)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                             "update");
                else if (parse_submodule_update_strategy(value,
                         &submodule->update_strategy) < 0)
                                die(_("invalid value for %s"), var);
        } else if (!strcmp(item.buf, "shallow")) {
                if (!me->overwrite && submodule->recommend_shallow != -1)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                             "shallow");
                else
                        submodule->recommend_shallow =
                                git_config_bool(var, value);
        } else if (!strcmp(item.buf, "branch")) {
                if (!me->overwrite && submodule->branch)
-                       warn_multiple_config(me->commit_sha1, submodule->name,
+                       warn_multiple_config(me->treeish_name, submodule->name,
                                             "branch");
                else {
                        free((void *)submodule->branch);
@@ -379,18 +401,18 @@ static int parse_config(const char *var, const char *value, void *data)
        return ret;
 }
 
-static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
+int gitmodule_sha1_from_commit(const unsigned char *treeish_name,
                                      unsigned char *gitmodules_sha1,
                                      struct strbuf *rev)
 {
        int ret = 0;
 
-       if (is_null_sha1(commit_sha1)) {
+       if (is_null_sha1(treeish_name)) {
                hashclr(gitmodules_sha1);
                return 1;
        }
 
-       strbuf_addf(rev, "%s:.gitmodules", sha1_to_hex(commit_sha1));
+       strbuf_addf(rev, "%s:.gitmodules", sha1_to_hex(treeish_name));
        if (get_sha1(rev->buf, gitmodules_sha1) >= 0)
                ret = 1;
 
@@ -402,7 +424,7 @@ static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
  * revisions.
  */
 static const struct submodule *config_from(struct submodule_cache *cache,
-               const unsigned char *commit_sha1, const char *key,
+               const unsigned char *treeish_name, const char *key,
                enum lookup_type lookup_type)
 {
        struct strbuf rev = STRBUF_INIT;
@@ -418,7 +440,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
         * return the first submodule. Can be used to check whether
         * there are any submodules parsed.
         */
-       if (!commit_sha1 || !key) {
+       if (!treeish_name || !key) {
                struct hashmap_iter iter;
                struct submodule_entry *entry;
 
@@ -428,7 +450,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
                return entry->config;
        }
 
-       if (!gitmodule_sha1_from_commit(commit_sha1, sha1, &rev))
+       if (!gitmodule_sha1_from_commit(treeish_name, sha1, &rev))
                goto out;
 
        switch (lookup_type) {
@@ -448,7 +470,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
 
        /* fill the submodule config into the cache */
        parameter.cache = cache;
-       parameter.commit_sha1 = commit_sha1;
+       parameter.treeish_name = treeish_name;
        parameter.gitmodules_sha1 = sha1;
        parameter.overwrite = 0;
        git_config_from_mem(parse_config, CONFIG_ORIGIN_SUBMODULE_BLOB, rev.buf,
@@ -471,18 +493,6 @@ out:
        return submodule;
 }
 
-static const struct submodule *config_from_path(struct submodule_cache *cache,
-               const unsigned char *commit_sha1, const char *path)
-{
-       return config_from(cache, commit_sha1, path, lookup_path);
-}
-
-static const struct submodule *config_from_name(struct submodule_cache *cache,
-               const unsigned char *commit_sha1, const char *name)
-{
-       return config_from(cache, commit_sha1, name, lookup_name);
-}
-
 static void ensure_cache_init(void)
 {
        if (is_cache_init)
@@ -496,7 +506,7 @@ int parse_submodule_config_option(const char *var, const char *value)
 {
        struct parse_config_parameter parameter;
        parameter.cache = &the_submodule_cache;
-       parameter.commit_sha1 = NULL;
+       parameter.treeish_name = NULL;
        parameter.gitmodules_sha1 = null_sha1;
        parameter.overwrite = 1;
 
@@ -504,18 +514,18 @@ int parse_submodule_config_option(const char *var, const char *value)
        return parse_config(var, value, &parameter);
 }
 
-const struct submodule *submodule_from_name(const unsigned char *commit_sha1,
+const struct submodule *submodule_from_name(const unsigned char *treeish_name,
                const char *name)
 {
        ensure_cache_init();
-       return config_from_name(&the_submodule_cache, commit_sha1, name);
+       return config_from(&the_submodule_cache, treeish_name, name, lookup_name);
 }
 
-const struct submodule *submodule_from_path(const unsigned char *commit_sha1,
+const struct submodule *submodule_from_path(const unsigned char *treeish_name,
                const char *path)
 {
        ensure_cache_init();
-       return config_from_path(&the_submodule_cache, commit_sha1, path);
+       return config_from(&the_submodule_cache, treeish_name, path, lookup_path);
 }
 
 void submodule_free(void)
index d05c542d2cdace181ea72055c0f71db6b1afda42..d434ecdb45c074dd386405f20ed73ac1c8b646bd 100644 (file)
@@ -22,13 +22,17 @@ struct submodule {
        int recommend_shallow;
 };
 
-int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
-int parse_push_recurse_submodules_arg(const char *opt, const char *arg);
-int parse_submodule_config_option(const char *var, const char *value);
-const struct submodule *submodule_from_name(const unsigned char *commit_sha1,
-               const char *name);
-const struct submodule *submodule_from_path(const unsigned char *commit_sha1,
-               const char *path);
-void submodule_free(void);
+extern int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
+extern int parse_update_recurse_submodules_arg(const char *opt, const char *arg);
+extern int parse_push_recurse_submodules_arg(const char *opt, const char *arg);
+extern int parse_submodule_config_option(const char *var, const char *value);
+extern const struct submodule *submodule_from_name(
+               const unsigned char *commit_or_tree, const char *name);
+extern const struct submodule *submodule_from_path(
+               const unsigned char *commit_or_tree, const char *path);
+extern int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
+                                     unsigned char *gitmodules_sha1,
+                                     struct strbuf *rev);
+extern void submodule_free(void);
 
 #endif /* SUBMODULE_CONFIG_H */
index 9d8d91c207e7a2c09bdf997ba05c67b1262d8091..b3ae642f29205655342b08343d440d7f333a39f9 100644 (file)
 #include "blob.h"
 #include "thread-utils.h"
 #include "quote.h"
+#include "remote.h"
+#include "worktree.h"
 
 static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
+static int config_update_recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
 static int parallel_jobs = 1;
 static struct string_list changed_submodule_paths = STRING_LIST_INIT_NODUP;
 static int initialized_fetch_ref_tips;
-static struct sha1_array ref_tips_before_fetch;
-static struct sha1_array ref_tips_after_fetch;
+static struct oid_array ref_tips_before_fetch;
+static struct oid_array ref_tips_after_fetch;
 
 /*
  * The following flag is set if the .gitmodules file is unmerged. We then
@@ -123,35 +126,16 @@ void stage_updated_gitmodules(void)
 static int add_submodule_odb(const char *path)
 {
        struct strbuf objects_directory = STRBUF_INIT;
-       struct alternate_object_database *alt_odb;
        int ret = 0;
-       size_t alloc;
 
-       strbuf_git_path_submodule(&objects_directory, path, "objects/");
+       ret = strbuf_git_path_submodule(&objects_directory, path, "objects/");
+       if (ret)
+               goto done;
        if (!is_directory(objects_directory.buf)) {
                ret = -1;
                goto done;
        }
-       /* avoid adding it twice */
-       prepare_alt_odb();
-       for (alt_odb = alt_odb_list; alt_odb; alt_odb = alt_odb->next)
-               if (alt_odb->name - alt_odb->base == objects_directory.len &&
-                               !strncmp(alt_odb->base, objects_directory.buf,
-                                       objects_directory.len))
-                       goto done;
-
-       alloc = st_add(objects_directory.len, 42); /* for "12/345..." sha1 */
-       alt_odb = xmalloc(st_add(sizeof(*alt_odb), alloc));
-       alt_odb->next = alt_odb_list;
-       xsnprintf(alt_odb->base, alloc, "%s", objects_directory.buf);
-       alt_odb->name = alt_odb->base + objects_directory.len;
-       alt_odb->name[2] = '/';
-       alt_odb->name[40] = '\0';
-       alt_odb->name[41] = '\0';
-       alt_odb_list = alt_odb;
-
-       /* add possible alternates from the submodule */
-       read_info_alternates(objects_directory.buf, 0);
+       add_to_alternates_memory(objects_directory.buf);
 done:
        strbuf_release(&objects_directory);
        return ret;
@@ -217,6 +201,87 @@ void gitmodules_config(void)
        }
 }
 
+void gitmodules_config_sha1(const unsigned char *commit_sha1)
+{
+       struct strbuf rev = STRBUF_INIT;
+       unsigned char sha1[20];
+
+       if (gitmodule_sha1_from_commit(commit_sha1, sha1, &rev)) {
+               git_config_from_blob_sha1(submodule_config, rev.buf,
+                                         sha1, NULL);
+       }
+       strbuf_release(&rev);
+}
+
+/*
+ * NEEDSWORK: With the addition of different configuration options to determine
+ * if a submodule is of interests, the validity of this function's name comes
+ * into question.  Once the dust has settled and more concrete terminology is
+ * decided upon, come up with a more proper name for this function.  One
+ * potential candidate could be 'is_submodule_active()'.
+ *
+ * Determine if a submodule has been initialized at a given 'path'
+ */
+int is_submodule_initialized(const char *path)
+{
+       int ret = 0;
+       char *key = NULL;
+       char *value = NULL;
+       const struct string_list *sl;
+       const struct submodule *module = submodule_from_path(null_sha1, path);
+
+       /* early return if there isn't a path->module mapping */
+       if (!module)
+               return 0;
+
+       /* submodule.<name>.active is set */
+       key = xstrfmt("submodule.%s.active", module->name);
+       if (!git_config_get_bool(key, &ret)) {
+               free(key);
+               return ret;
+       }
+       free(key);
+
+       /* submodule.active is set */
+       sl = git_config_get_value_multi("submodule.active");
+       if (sl) {
+               struct pathspec ps;
+               struct argv_array args = ARGV_ARRAY_INIT;
+               const struct string_list_item *item;
+
+               for_each_string_list_item(item, sl) {
+                       argv_array_push(&args, item->string);
+               }
+
+               parse_pathspec(&ps, 0, 0, NULL, args.argv);
+               ret = match_pathspec(&ps, path, strlen(path), 0, NULL, 1);
+
+               argv_array_clear(&args);
+               clear_pathspec(&ps);
+               return ret;
+       }
+
+       /* fallback to checking if the URL is set */
+       key = xstrfmt("submodule.%s.url", module->name);
+       ret = !git_config_get_string(key, &value);
+
+       free(value);
+       free(key);
+       return ret;
+}
+
+int is_submodule_populated_gently(const char *path, int *return_error_code)
+{
+       int ret = 0;
+       char *gitdir = xstrfmt("%s/.git", path);
+
+       if (resolve_gitdir_gently(gitdir, return_error_code))
+               ret = 1;
+
+       free(gitdir);
+       return ret;
+}
+
 int parse_submodule_update_strategy(const char *value,
                struct submodule_update_strategy *dst)
 {
@@ -278,9 +343,9 @@ void handle_ignore_submodules_arg(struct diff_options *diffopt,
 
 static int prepare_submodule_summary(struct rev_info *rev, const char *path,
                struct commit *left, struct commit *right,
-               int *fast_forward, int *fast_backward)
+               struct commit_list *merge_bases)
 {
-       struct commit_list *merge_bases, *list;
+       struct commit_list *list;
 
        init_revisions(rev, NULL);
        setup_revisions(0, NULL, rev, NULL);
@@ -289,13 +354,6 @@ static int prepare_submodule_summary(struct rev_info *rev, const char *path,
        left->object.flags |= SYMMETRIC_LEFT;
        add_pending_object(rev, &left->object, path);
        add_pending_object(rev, &right->object, path);
-       merge_bases = get_merge_bases(left, right);
-       if (merge_bases) {
-               if (merge_bases->item == left)
-                       *fast_forward = 1;
-               else if (merge_bases->item == right)
-                       *fast_backward = 1;
-       }
        for (list = merge_bases; list; list = list->next) {
                list->item->object.flags |= UNINTERESTING;
                add_pending_object(rev, &list->item->object,
@@ -333,31 +391,40 @@ static void print_submodule_summary(struct rev_info *rev, FILE *f,
        strbuf_release(&sb);
 }
 
-void show_submodule_summary(FILE *f, const char *path,
+static void prepare_submodule_repo_env_no_git_dir(struct argv_array *out)
+{
+       const char * const *var;
+
+       for (var = local_repo_env; *var; var++) {
+               if (strcmp(*var, CONFIG_DATA_ENVIRONMENT))
+                       argv_array_push(out, *var);
+       }
+}
+
+void prepare_submodule_repo_env(struct argv_array *out)
+{
+       prepare_submodule_repo_env_no_git_dir(out);
+       argv_array_pushf(out, "%s=%s", GIT_DIR_ENVIRONMENT,
+                        DEFAULT_GIT_DIR_ENVIRONMENT);
+}
+
+/* Helper function to display the submodule header line prior to the full
+ * summary output. If it can locate the submodule objects directory it will
+ * attempt to lookup both the left and right commits and put them into the
+ * left and right pointers.
+ */
+static void show_submodule_header(FILE *f, const char *path,
                const char *line_prefix,
-               unsigned char one[20], unsigned char two[20],
+               struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
-               const char *del, const char *add, const char *reset)
+               const char *reset,
+               struct commit **left, struct commit **right,
+               struct commit_list **merge_bases)
 {
-       struct rev_info rev;
-       struct commit *left = NULL, *right = NULL;
        const char *message = NULL;
        struct strbuf sb = STRBUF_INIT;
        int fast_forward = 0, fast_backward = 0;
 
-       if (is_null_sha1(two))
-               message = "(submodule deleted)";
-       else if (add_submodule_odb(path))
-               message = "(not checked out)";
-       else if (is_null_sha1(one))
-               message = "(new submodule)";
-       else if (!(left = lookup_commit_reference(one)) ||
-                !(right = lookup_commit_reference(two)))
-               message = "(commits not present)";
-       else if (prepare_submodule_summary(&rev, path, left, right,
-                                          &fast_forward, &fast_backward))
-               message = "(revision walker failed)";
-
        if (dirty_submodule & DIRTY_SUBMODULE_UNTRACKED)
                fprintf(f, "%sSubmodule %s contains untracked content\n",
                        line_prefix, path);
@@ -365,29 +432,163 @@ void show_submodule_summary(FILE *f, const char *path,
                fprintf(f, "%sSubmodule %s contains modified content\n",
                        line_prefix, path);
 
-       if (!hashcmp(one, two)) {
+       if (is_null_oid(one))
+               message = "(new submodule)";
+       else if (is_null_oid(two))
+               message = "(submodule deleted)";
+
+       if (add_submodule_odb(path)) {
+               if (!message)
+                       message = "(not initialized)";
+               goto output_header;
+       }
+
+       /*
+        * Attempt to lookup the commit references, and determine if this is
+        * a fast forward or fast backwards update.
+        */
+       *left = lookup_commit_reference(one->hash);
+       *right = lookup_commit_reference(two->hash);
+
+       /*
+        * Warn about missing commits in the submodule project, but only if
+        * they aren't null.
+        */
+       if ((!is_null_oid(one) && !*left) ||
+            (!is_null_oid(two) && !*right))
+               message = "(commits not present)";
+
+       *merge_bases = get_merge_bases(*left, *right);
+       if (*merge_bases) {
+               if ((*merge_bases)->item == *left)
+                       fast_forward = 1;
+               else if ((*merge_bases)->item == *right)
+                       fast_backward = 1;
+       }
+
+       if (!oidcmp(one, two)) {
                strbuf_release(&sb);
                return;
        }
 
+output_header:
        strbuf_addf(&sb, "%s%sSubmodule %s ", line_prefix, meta, path);
-       strbuf_add_unique_abbrev(&sb, one, DEFAULT_ABBREV);
+       strbuf_add_unique_abbrev(&sb, one->hash, DEFAULT_ABBREV);
        strbuf_addstr(&sb, (fast_backward || fast_forward) ? ".." : "...");
-       strbuf_add_unique_abbrev(&sb, two, DEFAULT_ABBREV);
+       strbuf_add_unique_abbrev(&sb, two->hash, DEFAULT_ABBREV);
        if (message)
                strbuf_addf(&sb, " %s%s\n", message, reset);
        else
                strbuf_addf(&sb, "%s:%s\n", fast_backward ? " (rewind)" : "", reset);
        fwrite(sb.buf, sb.len, 1, f);
 
-       if (!message) /* only NULL if we succeeded in setting up the walk */
-               print_submodule_summary(&rev, f, line_prefix, del, add, reset);
+       strbuf_release(&sb);
+}
+
+void show_submodule_summary(FILE *f, const char *path,
+               const char *line_prefix,
+               struct object_id *one, struct object_id *two,
+               unsigned dirty_submodule, const char *meta,
+               const char *del, const char *add, const char *reset)
+{
+       struct rev_info rev;
+       struct commit *left = NULL, *right = NULL;
+       struct commit_list *merge_bases = NULL;
+
+       show_submodule_header(f, path, line_prefix, one, two, dirty_submodule,
+                             meta, reset, &left, &right, &merge_bases);
+
+       /*
+        * If we don't have both a left and a right pointer, there is no
+        * reason to try and display a summary. The header line should contain
+        * all the information the user needs.
+        */
+       if (!left || !right)
+               goto out;
+
+       /* Treat revision walker failure the same as missing commits */
+       if (prepare_submodule_summary(&rev, path, left, right, merge_bases)) {
+               fprintf(f, "%s(revision walker failed)\n", line_prefix);
+               goto out;
+       }
+
+       print_submodule_summary(&rev, f, line_prefix, del, add, reset);
+
+out:
+       if (merge_bases)
+               free_commit_list(merge_bases);
+       clear_commit_marks(left, ~0);
+       clear_commit_marks(right, ~0);
+}
+
+void show_submodule_inline_diff(FILE *f, const char *path,
+               const char *line_prefix,
+               struct object_id *one, struct object_id *two,
+               unsigned dirty_submodule, const char *meta,
+               const char *del, const char *add, const char *reset,
+               const struct diff_options *o)
+{
+       const struct object_id *old = &empty_tree_oid, *new = &empty_tree_oid;
+       struct commit *left = NULL, *right = NULL;
+       struct commit_list *merge_bases = NULL;
+       struct strbuf submodule_dir = STRBUF_INIT;
+       struct child_process cp = CHILD_PROCESS_INIT;
+
+       show_submodule_header(f, path, line_prefix, one, two, dirty_submodule,
+                             meta, reset, &left, &right, &merge_bases);
+
+       /* We need a valid left and right commit to display a difference */
+       if (!(left || is_null_oid(one)) ||
+           !(right || is_null_oid(two)))
+               goto done;
+
+       if (left)
+               old = one;
+       if (right)
+               new = two;
+
+       fflush(f);
+       cp.git_cmd = 1;
+       cp.dir = path;
+       cp.out = dup(fileno(f));
+       cp.no_stdin = 1;
+
+       /* TODO: other options may need to be passed here. */
+       argv_array_push(&cp.args, "diff");
+       argv_array_pushf(&cp.args, "--line-prefix=%s", line_prefix);
+       if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
+               argv_array_pushf(&cp.args, "--src-prefix=%s%s/",
+                                o->b_prefix, path);
+               argv_array_pushf(&cp.args, "--dst-prefix=%s%s/",
+                                o->a_prefix, path);
+       } else {
+               argv_array_pushf(&cp.args, "--src-prefix=%s%s/",
+                                o->a_prefix, path);
+               argv_array_pushf(&cp.args, "--dst-prefix=%s%s/",
+                                o->b_prefix, path);
+       }
+       argv_array_push(&cp.args, oid_to_hex(old));
+       /*
+        * If the submodule has modified content, we will diff against the
+        * work tree, under the assumption that the user has asked for the
+        * diff format and wishes to actually see all differences even if they
+        * haven't yet been committed to the submodule yet.
+        */
+       if (!(dirty_submodule & DIRTY_SUBMODULE_MODIFIED))
+               argv_array_push(&cp.args, oid_to_hex(new));
+
+       prepare_submodule_repo_env(&cp.env_array);
+       if (run_command(&cp))
+               fprintf(f, "(diff failed)\n");
+
+done:
+       strbuf_release(&submodule_dir);
+       if (merge_bases)
+               free_commit_list(merge_bases);
        if (left)
                clear_commit_marks(left, ~0);
        if (right)
                clear_commit_marks(right, ~0);
-
-       strbuf_release(&sb);
 }
 
 void set_config_fetch_recurse_submodules(int value)
@@ -395,33 +596,94 @@ void set_config_fetch_recurse_submodules(int value)
        config_fetch_recurse_submodules = value;
 }
 
+void set_config_update_recurse_submodules(int value)
+{
+       config_update_recurse_submodules = value;
+}
+
+int should_update_submodules(void)
+{
+       return config_update_recurse_submodules == RECURSE_SUBMODULES_ON;
+}
+
+const struct submodule *submodule_from_ce(const struct cache_entry *ce)
+{
+       if (!S_ISGITLINK(ce->ce_mode))
+               return NULL;
+
+       if (!should_update_submodules())
+               return NULL;
+
+       return submodule_from_path(null_sha1, ce->name);
+}
+
 static int has_remote(const char *refname, const struct object_id *oid,
                      int flags, void *cb_data)
 {
        return 1;
 }
 
-static int submodule_needs_pushing(const char *path, const unsigned char sha1[20])
+static int append_oid_to_argv(const struct object_id *oid, void *data)
+{
+       struct argv_array *argv = data;
+       argv_array_push(argv, oid_to_hex(oid));
+       return 0;
+}
+
+static int check_has_commit(const struct object_id *oid, void *data)
+{
+       int *has_commit = data;
+
+       if (!lookup_commit_reference(oid->hash))
+               *has_commit = 0;
+
+       return 0;
+}
+
+static int submodule_has_commits(const char *path, struct oid_array *commits)
 {
-       if (add_submodule_odb(path) || !lookup_commit_reference(sha1))
+       int has_commit = 1;
+
+       if (add_submodule_odb(path))
+               return 0;
+
+       oid_array_for_each_unique(commits, check_has_commit, &has_commit);
+       return has_commit;
+}
+
+static int submodule_needs_pushing(const char *path, struct oid_array *commits)
+{
+       if (!submodule_has_commits(path, commits))
+               /*
+                * NOTE: We do consider it safe to return "no" here. The
+                * correct answer would be "We do not know" instead of
+                * "No push needed", but it is quite hard to change
+                * the submodule pointer without having the submodule
+                * around. If a user did however change the submodules
+                * without having the submodule around, this indicates
+                * an expert who knows what they are doing or a
+                * maintainer integrating work from other people. In
+                * both cases it should be safe to skip this check.
+                */
                return 0;
 
        if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
                struct child_process cp = CHILD_PROCESS_INIT;
-               const char *argv[] = {"rev-list", NULL, "--not", "--remotes", "-n", "1" , NULL};
                struct strbuf buf = STRBUF_INIT;
                int needs_pushing = 0;
 
-               argv[1] = sha1_to_hex(sha1);
-               cp.argv = argv;
+               argv_array_push(&cp.args, "rev-list");
+               oid_array_for_each_unique(commits, append_oid_to_argv, &cp.args);
+               argv_array_pushl(&cp.args, "--not", "--remotes", "-n", "1" , NULL);
+
                prepare_submodule_repo_env(&cp.env_array);
                cp.git_cmd = 1;
                cp.no_stdin = 1;
                cp.out = -1;
                cp.dir = path;
                if (start_command(&cp))
-                       die("Could not run 'git rev-list %s --not --remotes -n 1' command in submodule %s",
-                               sha1_to_hex(sha1), path);
+                       die("Could not run 'git rev-list <commits> --not --remotes -n 1' command in submodule %s",
+                                       path);
                if (strbuf_read(&buf, cp.out, 41))
                        needs_pushing = 1;
                finish_command(&cp);
@@ -433,19 +695,34 @@ static int submodule_needs_pushing(const char *path, const unsigned char sha1[20
        return 0;
 }
 
+static struct oid_array *submodule_commits(struct string_list *submodules,
+                                           const char *path)
+{
+       struct string_list_item *item;
+
+       item = string_list_insert(submodules, path);
+       if (item->util)
+               return (struct oid_array *) item->util;
+
+       /* NEEDSWORK: should we have oid_array_init()? */
+       item->util = xcalloc(1, sizeof(struct oid_array));
+       return (struct oid_array *) item->util;
+}
+
 static void collect_submodules_from_diff(struct diff_queue_struct *q,
                                         struct diff_options *options,
                                         void *data)
 {
        int i;
-       struct string_list *needs_pushing = data;
+       struct string_list *submodules = data;
 
        for (i = 0; i < q->nr; i++) {
                struct diff_filepair *p = q->queue[i];
+               struct oid_array *commits;
                if (!S_ISGITLINK(p->two->mode))
                        continue;
-               if (submodule_needs_pushing(p->two->path, p->two->oid.hash))
-                       string_list_insert(needs_pushing, p->two->path);
+               commits = submodule_commits(submodules, p->two->path);
+               oid_array_append(commits, &p->two->oid);
        }
 }
 
@@ -461,46 +738,81 @@ static void find_unpushed_submodule_commits(struct commit *commit,
        diff_tree_combined_merge(commit, 1, &rev);
 }
 
-int find_unpushed_submodules(unsigned char new_sha1[20],
+static void free_submodules_sha1s(struct string_list *submodules)
+{
+       struct string_list_item *item;
+       for_each_string_list_item(item, submodules)
+               oid_array_clear((struct oid_array *) item->util);
+       string_list_clear(submodules, 1);
+}
+
+int find_unpushed_submodules(struct oid_array *commits,
                const char *remotes_name, struct string_list *needs_pushing)
 {
        struct rev_info rev;
        struct commit *commit;
-       const char *argv[] = {NULL, NULL, "--not", "NULL", NULL};
-       int argc = ARRAY_SIZE(argv) - 1;
-       char *sha1_copy;
-
-       struct strbuf remotes_arg = STRBUF_INIT;
+       struct string_list submodules = STRING_LIST_INIT_DUP;
+       struct string_list_item *submodule;
+       struct argv_array argv = ARGV_ARRAY_INIT;
 
-       strbuf_addf(&remotes_arg, "--remotes=%s", remotes_name);
        init_revisions(&rev, NULL);
-       sha1_copy = xstrdup(sha1_to_hex(new_sha1));
-       argv[1] = sha1_copy;
-       argv[3] = remotes_arg.buf;
-       setup_revisions(argc, argv, &rev, NULL);
+
+       /* argv.argv[0] will be ignored by setup_revisions */
+       argv_array_push(&argv, "find_unpushed_submodules");
+       oid_array_for_each_unique(commits, append_oid_to_argv, &argv);
+       argv_array_push(&argv, "--not");
+       argv_array_pushf(&argv, "--remotes=%s", remotes_name);
+
+       setup_revisions(argv.argc, argv.argv, &rev, NULL);
        if (prepare_revision_walk(&rev))
                die("revision walk setup failed");
 
        while ((commit = get_revision(&rev)) != NULL)
-               find_unpushed_submodule_commits(commit, needs_pushing);
+               find_unpushed_submodule_commits(commit, &submodules);
 
        reset_revision_walk();
-       free(sha1_copy);
-       strbuf_release(&remotes_arg);
+       argv_array_clear(&argv);
+
+       for_each_string_list_item(submodule, &submodules) {
+               struct oid_array *commits = (struct oid_array *) submodule->util;
+
+               if (submodule_needs_pushing(submodule->string, commits))
+                       string_list_insert(needs_pushing, submodule->string);
+       }
+       free_submodules_sha1s(&submodules);
 
        return needs_pushing->nr;
 }
 
-static int push_submodule(const char *path)
+static int push_submodule(const char *path,
+                         const struct remote *remote,
+                         const char **refspec, int refspec_nr,
+                         const struct string_list *push_options,
+                         int dry_run)
 {
        if (add_submodule_odb(path))
                return 1;
 
        if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
                struct child_process cp = CHILD_PROCESS_INIT;
-               const char *argv[] = {"push", NULL};
+               argv_array_push(&cp.args, "push");
+               if (dry_run)
+                       argv_array_push(&cp.args, "--dry-run");
+
+               if (push_options && push_options->nr) {
+                       const struct string_list_item *item;
+                       for_each_string_list_item(item, push_options)
+                               argv_array_pushf(&cp.args, "--push-option=%s",
+                                                item->string);
+               }
+
+               if (remote->origin != REMOTE_UNCONFIGURED) {
+                       int i;
+                       argv_array_push(&cp.args, remote->name);
+                       for (i = 0; i < refspec_nr; i++)
+                               argv_array_push(&cp.args, refspec[i]);
+               }
 
-               cp.argv = argv;
                prepare_submodule_repo_env(&cp.env_array);
                cp.git_cmd = 1;
                cp.no_stdin = 1;
@@ -513,18 +825,67 @@ static int push_submodule(const char *path)
        return 1;
 }
 
-int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name)
+/*
+ * Perform a check in the submodule to see if the remote and refspec work.
+ * Die if the submodule can't be pushed.
+ */
+static void submodule_push_check(const char *path, const struct remote *remote,
+                                const char **refspec, int refspec_nr)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+       int i;
+
+       argv_array_push(&cp.args, "submodule--helper");
+       argv_array_push(&cp.args, "push-check");
+       argv_array_push(&cp.args, remote->name);
+
+       for (i = 0; i < refspec_nr; i++)
+               argv_array_push(&cp.args, refspec[i]);
+
+       prepare_submodule_repo_env(&cp.env_array);
+       cp.git_cmd = 1;
+       cp.no_stdin = 1;
+       cp.no_stdout = 1;
+       cp.dir = path;
+
+       /*
+        * Simply indicate if 'submodule--helper push-check' failed.
+        * More detailed error information will be provided by the
+        * child process.
+        */
+       if (run_command(&cp))
+               die("process for submodule '%s' failed", path);
+}
+
+int push_unpushed_submodules(struct oid_array *commits,
+                            const struct remote *remote,
+                            const char **refspec, int refspec_nr,
+                            const struct string_list *push_options,
+                            int dry_run)
 {
        int i, ret = 1;
        struct string_list needs_pushing = STRING_LIST_INIT_DUP;
 
-       if (!find_unpushed_submodules(new_sha1, remotes_name, &needs_pushing))
+       if (!find_unpushed_submodules(commits, remote->name, &needs_pushing))
                return 1;
 
+       /*
+        * Verify that the remote and refspec can be propagated to all
+        * submodules.  This check can be skipped if the remote and refspec
+        * won't be propagated due to the remote being unconfigured (e.g. a URL
+        * instead of a remote name).
+        */
+       if (remote->origin != REMOTE_UNCONFIGURED)
+               for (i = 0; i < needs_pushing.nr; i++)
+                       submodule_push_check(needs_pushing.items[i].string,
+                                            remote, refspec, refspec_nr);
+
+       /* Actually push the submodules */
        for (i = 0; i < needs_pushing.nr; i++) {
                const char *path = needs_pushing.items[i].string;
                fprintf(stderr, "Pushing submodule '%s'\n", path);
-               if (!push_submodule(path)) {
+               if (!push_submodule(path, remote, refspec, refspec_nr,
+                                   push_options, dry_run)) {
                        fprintf(stderr, "Unable to push submodule '%s'\n", path);
                        ret = 0;
                }
@@ -593,23 +954,24 @@ static void submodule_collect_changed_cb(struct diff_queue_struct *q,
 static int add_sha1_to_array(const char *ref, const struct object_id *oid,
                             int flags, void *data)
 {
-       sha1_array_append(data, oid->hash);
+       oid_array_append(data, oid);
        return 0;
 }
 
-void check_for_new_submodule_commits(unsigned char new_sha1[20])
+void check_for_new_submodule_commits(struct object_id *oid)
 {
        if (!initialized_fetch_ref_tips) {
                for_each_ref(add_sha1_to_array, &ref_tips_before_fetch);
                initialized_fetch_ref_tips = 1;
        }
 
-       sha1_array_append(&ref_tips_after_fetch, new_sha1);
+       oid_array_append(&ref_tips_after_fetch, oid);
 }
 
-static void add_sha1_to_argv(const unsigned char sha1[20], void *data)
+static int add_oid_to_argv(const struct object_id *oid, void *data)
 {
-       argv_array_push(data, sha1_to_hex(sha1));
+       argv_array_push(data, oid_to_hex(oid));
+       return 0;
 }
 
 static void calculate_changed_submodule_paths(void)
@@ -624,11 +986,11 @@ static void calculate_changed_submodule_paths(void)
 
        init_revisions(&rev, NULL);
        argv_array_push(&argv, "--"); /* argv[0] program name */
-       sha1_array_for_each_unique(&ref_tips_after_fetch,
-                                  add_sha1_to_argv, &argv);
+       oid_array_for_each_unique(&ref_tips_after_fetch,
+                                  add_oid_to_argv, &argv);
        argv_array_push(&argv, "--not");
-       sha1_array_for_each_unique(&ref_tips_before_fetch,
-                                  add_sha1_to_argv, &argv);
+       oid_array_for_each_unique(&ref_tips_before_fetch,
+                                  add_oid_to_argv, &argv);
        setup_revisions(argv.argc, argv.argv, &rev, NULL);
        if (prepare_revision_walk(&rev))
                die("revision walk setup failed");
@@ -654,8 +1016,8 @@ static void calculate_changed_submodule_paths(void)
        }
 
        argv_array_clear(&argv);
-       sha1_array_clear(&ref_tips_before_fetch);
-       sha1_array_clear(&ref_tips_after_fetch);
+       oid_array_clear(&ref_tips_before_fetch);
+       oid_array_clear(&ref_tips_after_fetch);
        initialized_fetch_ref_tips = 0;
 }
 
@@ -816,67 +1178,78 @@ out:
 
 unsigned is_submodule_modified(const char *path, int ignore_untracked)
 {
-       ssize_t len;
        struct child_process cp = CHILD_PROCESS_INIT;
-       const char *argv[] = {
-               "status",
-               "--porcelain",
-               NULL,
-               NULL,
-       };
        struct strbuf buf = STRBUF_INIT;
+       FILE *fp;
        unsigned dirty_submodule = 0;
-       const char *line, *next_line;
        const char *git_dir;
+       int ignore_cp_exit_code = 0;
 
        strbuf_addf(&buf, "%s/.git", path);
        git_dir = read_gitfile(buf.buf);
        if (!git_dir)
                git_dir = buf.buf;
-       if (!is_directory(git_dir)) {
+       if (!is_git_directory(git_dir)) {
+               if (is_directory(git_dir))
+                       die(_("'%s' not recognized as a git repository"), git_dir);
                strbuf_release(&buf);
                /* The submodule is not checked out, so it is not modified */
                return 0;
-
        }
        strbuf_reset(&buf);
 
+       argv_array_pushl(&cp.args, "status", "--porcelain=2", NULL);
        if (ignore_untracked)
-               argv[2] = "-uno";
+               argv_array_push(&cp.args, "-uno");
 
-       cp.argv = argv;
        prepare_submodule_repo_env(&cp.env_array);
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.out = -1;
        cp.dir = path;
        if (start_command(&cp))
-               die("Could not run 'git status --porcelain' in submodule %s", path);
+               die("Could not run 'git status --porcelain=2' in submodule %s", path);
 
-       len = strbuf_read(&buf, cp.out, 1024);
-       line = buf.buf;
-       while (len > 2) {
-               if ((line[0] == '?') && (line[1] == '?')) {
+       fp = xfdopen(cp.out, "r");
+       while (strbuf_getwholeline(&buf, fp, '\n') != EOF) {
+               /* regular untracked files */
+               if (buf.buf[0] == '?')
                        dirty_submodule |= DIRTY_SUBMODULE_UNTRACKED;
-                       if (dirty_submodule & DIRTY_SUBMODULE_MODIFIED)
-                               break;
-               } else {
-                       dirty_submodule |= DIRTY_SUBMODULE_MODIFIED;
-                       if (ignore_untracked ||
-                           (dirty_submodule & DIRTY_SUBMODULE_UNTRACKED))
-                               break;
+
+               if (buf.buf[0] == 'u' ||
+                   buf.buf[0] == '1' ||
+                   buf.buf[0] == '2') {
+                       /* T = line type, XY = status, SSSS = submodule state */
+                       if (buf.len < strlen("T XY SSSS"))
+                               die("BUG: invalid status --porcelain=2 line %s",
+                                   buf.buf);
+
+                       if (buf.buf[5] == 'S' && buf.buf[8] == 'U')
+                               /* nested untracked file */
+                               dirty_submodule |= DIRTY_SUBMODULE_UNTRACKED;
+
+                       if (buf.buf[0] == 'u' ||
+                           buf.buf[0] == '2' ||
+                           memcmp(buf.buf + 5, "S..U", 4))
+                               /* other change */
+                               dirty_submodule |= DIRTY_SUBMODULE_MODIFIED;
                }
-               next_line = strchr(line, '\n');
-               if (!next_line)
+
+               if ((dirty_submodule & DIRTY_SUBMODULE_MODIFIED) &&
+                   ((dirty_submodule & DIRTY_SUBMODULE_UNTRACKED) ||
+                    ignore_untracked)) {
+                       /*
+                        * We're not interested in any further information from
+                        * the child any more, neither output nor its exit code.
+                        */
+                       ignore_cp_exit_code = 1;
                        break;
-               next_line++;
-               len -= (next_line - line);
-               line = next_line;
+               }
        }
-       close(cp.out);
+       fclose(fp);
 
-       if (finish_command(&cp))
-               die("'git status --porcelain' failed in submodule %s", path);
+       if (finish_command(&cp) && !ignore_cp_exit_code)
+               die("'git status --porcelain=2' failed in submodule %s", path);
 
        strbuf_release(&buf);
        return dirty_submodule;
@@ -918,45 +1291,209 @@ int submodule_uses_gitfile(const char *path)
        return 1;
 }
 
-int ok_to_remove_submodule(const char *path)
+/*
+ * Check if it is a bad idea to remove a submodule, i.e. if we'd lose data
+ * when doing so.
+ *
+ * Return 1 if we'd lose data, return 0 if the removal is fine,
+ * and negative values for errors.
+ */
+int bad_to_remove_submodule(const char *path, unsigned flags)
 {
        ssize_t len;
        struct child_process cp = CHILD_PROCESS_INIT;
-       const char *argv[] = {
-               "status",
-               "--porcelain",
-               "-u",
-               "--ignore-submodules=none",
-               NULL,
-       };
        struct strbuf buf = STRBUF_INIT;
-       int ok_to_remove = 1;
+       int ret = 0;
 
        if (!file_exists(path) || is_empty_dir(path))
-               return 1;
+               return 0;
 
        if (!submodule_uses_gitfile(path))
-               return 0;
+               return 1;
+
+       argv_array_pushl(&cp.args, "status", "--porcelain",
+                                  "--ignore-submodules=none", NULL);
+
+       if (flags & SUBMODULE_REMOVAL_IGNORE_UNTRACKED)
+               argv_array_push(&cp.args, "-uno");
+       else
+               argv_array_push(&cp.args, "-uall");
+
+       if (!(flags & SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED))
+               argv_array_push(&cp.args, "--ignored");
 
-       cp.argv = argv;
        prepare_submodule_repo_env(&cp.env_array);
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.out = -1;
        cp.dir = path;
-       if (start_command(&cp))
-               die("Could not run 'git status --porcelain -uall --ignore-submodules=none' in submodule %s", path);
+       if (start_command(&cp)) {
+               if (flags & SUBMODULE_REMOVAL_DIE_ON_ERROR)
+                       die(_("could not start 'git status' in submodule '%s'"),
+                               path);
+               ret = -1;
+               goto out;
+       }
 
        len = strbuf_read(&buf, cp.out, 1024);
        if (len > 2)
-               ok_to_remove = 0;
+               ret = 1;
        close(cp.out);
 
-       if (finish_command(&cp))
-               die("'git status --porcelain -uall --ignore-submodules=none' failed in submodule %s", path);
-
+       if (finish_command(&cp)) {
+               if (flags & SUBMODULE_REMOVAL_DIE_ON_ERROR)
+                       die(_("could not run 'git status' in submodule '%s'"),
+                               path);
+               ret = -1;
+       }
+out:
        strbuf_release(&buf);
-       return ok_to_remove;
+       return ret;
+}
+
+static const char *get_super_prefix_or_empty(void)
+{
+       const char *s = get_super_prefix();
+       if (!s)
+               s = "";
+       return s;
+}
+
+static int submodule_has_dirty_index(const struct submodule *sub)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+
+       prepare_submodule_repo_env(&cp.env_array);
+
+       cp.git_cmd = 1;
+       argv_array_pushl(&cp.args, "diff-index", "--quiet",
+                                  "--cached", "HEAD", NULL);
+       cp.no_stdin = 1;
+       cp.no_stdout = 1;
+       cp.dir = sub->path;
+       if (start_command(&cp))
+               die("could not recurse into submodule '%s'", sub->path);
+
+       return finish_command(&cp);
+}
+
+static void submodule_reset_index(const char *path)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+       prepare_submodule_repo_env(&cp.env_array);
+
+       cp.git_cmd = 1;
+       cp.no_stdin = 1;
+       cp.dir = path;
+
+       argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
+                                  get_super_prefix_or_empty(), path);
+       argv_array_pushl(&cp.args, "read-tree", "-u", "--reset", NULL);
+
+       argv_array_push(&cp.args, EMPTY_TREE_SHA1_HEX);
+
+       if (run_command(&cp))
+               die("could not reset submodule index");
+}
+
+/**
+ * Moves a submodule at a given path from a given head to another new head.
+ * For edge cases (a submodule coming into existence or removing a submodule)
+ * pass NULL for old or new respectively.
+ */
+int submodule_move_head(const char *path,
+                        const char *old,
+                        const char *new,
+                        unsigned flags)
+{
+       int ret = 0;
+       struct child_process cp = CHILD_PROCESS_INIT;
+       const struct submodule *sub;
+
+       sub = submodule_from_path(null_sha1, path);
+
+       if (!sub)
+               die("BUG: could not get submodule information for '%s'", path);
+
+       if (old && !(flags & SUBMODULE_MOVE_HEAD_FORCE)) {
+               /* Check if the submodule has a dirty index. */
+               if (submodule_has_dirty_index(sub))
+                       return error(_("submodule '%s' has dirty index"), path);
+       }
+
+       if (!(flags & SUBMODULE_MOVE_HEAD_DRY_RUN)) {
+               if (old) {
+                       if (!submodule_uses_gitfile(path))
+                               absorb_git_dir_into_superproject("", path,
+                                       ABSORB_GITDIR_RECURSE_SUBMODULES);
+               } else {
+                       struct strbuf sb = STRBUF_INIT;
+                       strbuf_addf(&sb, "%s/modules/%s",
+                                   get_git_common_dir(), sub->name);
+                       connect_work_tree_and_git_dir(path, sb.buf);
+                       strbuf_release(&sb);
+
+                       /* make sure the index is clean as well */
+                       submodule_reset_index(path);
+               }
+       }
+
+       prepare_submodule_repo_env(&cp.env_array);
+
+       cp.git_cmd = 1;
+       cp.no_stdin = 1;
+       cp.dir = path;
+
+       argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
+                       get_super_prefix_or_empty(), path);
+       argv_array_pushl(&cp.args, "read-tree", "--recurse-submodules", NULL);
+
+       if (flags & SUBMODULE_MOVE_HEAD_DRY_RUN)
+               argv_array_push(&cp.args, "-n");
+       else
+               argv_array_push(&cp.args, "-u");
+
+       if (flags & SUBMODULE_MOVE_HEAD_FORCE)
+               argv_array_push(&cp.args, "--reset");
+       else
+               argv_array_push(&cp.args, "-m");
+
+       argv_array_push(&cp.args, old ? old : EMPTY_TREE_SHA1_HEX);
+       argv_array_push(&cp.args, new ? new : EMPTY_TREE_SHA1_HEX);
+
+       if (run_command(&cp)) {
+               ret = -1;
+               goto out;
+       }
+
+       if (!(flags & SUBMODULE_MOVE_HEAD_DRY_RUN)) {
+               if (new) {
+                       child_process_init(&cp);
+                       /* also set the HEAD accordingly */
+                       cp.git_cmd = 1;
+                       cp.no_stdin = 1;
+                       cp.dir = path;
+
+                       prepare_submodule_repo_env(&cp.env_array);
+                       argv_array_pushl(&cp.args, "update-ref", "HEAD", new, NULL);
+
+                       if (run_command(&cp)) {
+                               ret = -1;
+                               goto out;
+                       }
+               } else {
+                       struct strbuf sb = STRBUF_INIT;
+
+                       strbuf_addf(&sb, "%s/.git", path);
+                       unlink_or_warn(sb.buf);
+                       strbuf_release(&sb);
+
+                       if (is_empty_dir(path))
+                               rmdir_or_warn(path);
+               }
+       }
+out:
+       return ret;
 }
 
 static int find_first_merges(struct object_array *result, const char *path,
@@ -977,7 +1514,7 @@ static int find_first_merges(struct object_array *result, const char *path,
        memset(&rev_opts, 0, sizeof(rev_opts));
 
        /* get all revisions that merge commit a */
-       snprintf(merged_revision, sizeof(merged_revision), "^%s",
+       xsnprintf(merged_revision, sizeof(merged_revision), "^%s",
                        oid_to_hex(&a->object.oid));
        init_revisions(&revs, NULL);
        rev_opts.submodule = path;
@@ -1122,42 +1659,241 @@ int merge_submodule(unsigned char result[20], const char *path,
        return 0;
 }
 
-/* Update gitfile and core.worktree setting to connect work tree and git dir */
-void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
+int parallel_submodules(void)
 {
-       struct strbuf file_name = STRBUF_INIT;
-       struct strbuf rel_path = STRBUF_INIT;
-       const char *real_work_tree = xstrdup(real_path(work_tree));
-
-       /* Update gitfile */
-       strbuf_addf(&file_name, "%s/.git", work_tree);
-       write_file(file_name.buf, "gitdir: %s",
-                  relative_path(git_dir, real_work_tree, &rel_path));
-
-       /* Update core.worktree setting */
-       strbuf_reset(&file_name);
-       strbuf_addf(&file_name, "%s/config", git_dir);
-       git_config_set_in_file(file_name.buf, "core.worktree",
-                              relative_path(real_work_tree, git_dir,
-                                            &rel_path));
-
-       strbuf_release(&file_name);
-       strbuf_release(&rel_path);
-       free((void *)real_work_tree);
+       return parallel_jobs;
 }
 
-int parallel_submodules(void)
+/*
+ * Embeds a single submodules git directory into the superprojects git dir,
+ * non recursively.
+ */
+static void relocate_single_git_dir_into_superproject(const char *prefix,
+                                                     const char *path)
 {
-       return parallel_jobs;
+       char *old_git_dir = NULL, *real_old_git_dir = NULL, *real_new_git_dir = NULL;
+       const char *new_git_dir;
+       const struct submodule *sub;
+
+       if (submodule_uses_worktrees(path))
+               die(_("relocate_gitdir for submodule '%s' with "
+                     "more than one worktree not supported"), path);
+
+       old_git_dir = xstrfmt("%s/.git", path);
+       if (read_gitfile(old_git_dir))
+               /* If it is an actual gitfile, it doesn't need migration. */
+               return;
+
+       real_old_git_dir = real_pathdup(old_git_dir, 1);
+
+       sub = submodule_from_path(null_sha1, path);
+       if (!sub)
+               die(_("could not lookup name for submodule '%s'"), path);
+
+       new_git_dir = git_path("modules/%s", sub->name);
+       if (safe_create_leading_directories_const(new_git_dir) < 0)
+               die(_("could not create directory '%s'"), new_git_dir);
+       real_new_git_dir = real_pathdup(new_git_dir, 1);
+
+       fprintf(stderr, _("Migrating git directory of '%s%s' from\n'%s' to\n'%s'\n"),
+               get_super_prefix_or_empty(), path,
+               real_old_git_dir, real_new_git_dir);
+
+       relocate_gitdir(path, real_old_git_dir, real_new_git_dir);
+
+       free(old_git_dir);
+       free(real_old_git_dir);
+       free(real_new_git_dir);
 }
 
-void prepare_submodule_repo_env(struct argv_array *out)
+/*
+ * Migrate the git directory of the submodule given by path from
+ * having its git directory within the working tree to the git dir nested
+ * in its superprojects git dir under modules/.
+ */
+void absorb_git_dir_into_superproject(const char *prefix,
+                                     const char *path,
+                                     unsigned flags)
 {
-       const char * const *var;
+       int err_code;
+       const char *sub_git_dir;
+       struct strbuf gitdir = STRBUF_INIT;
+       strbuf_addf(&gitdir, "%s/.git", path);
+       sub_git_dir = resolve_gitdir_gently(gitdir.buf, &err_code);
+
+       /* Not populated? */
+       if (!sub_git_dir) {
+               const struct submodule *sub;
+
+               if (err_code == READ_GITFILE_ERR_STAT_FAILED) {
+                       /* unpopulated as expected */
+                       strbuf_release(&gitdir);
+                       return;
+               }
 
-       for (var = local_repo_env; *var; var++) {
-               if (strcmp(*var, CONFIG_DATA_ENVIRONMENT))
-                       argv_array_push(out, *var);
+               if (err_code != READ_GITFILE_ERR_NOT_A_REPO)
+                       /* We don't know what broke here. */
+                       read_gitfile_error_die(err_code, path, NULL);
+
+               /*
+               * Maybe populated, but no git directory was found?
+               * This can happen if the superproject is a submodule
+               * itself and was just absorbed. The absorption of the
+               * superproject did not rewrite the git file links yet,
+               * fix it now.
+               */
+               sub = submodule_from_path(null_sha1, path);
+               if (!sub)
+                       die(_("could not lookup name for submodule '%s'"), path);
+               connect_work_tree_and_git_dir(path,
+                       git_path("modules/%s", sub->name));
+       } else {
+               /* Is it already absorbed into the superprojects git dir? */
+               char *real_sub_git_dir = real_pathdup(sub_git_dir, 1);
+               char *real_common_git_dir = real_pathdup(get_git_common_dir(), 1);
+
+               if (!starts_with(real_sub_git_dir, real_common_git_dir))
+                       relocate_single_git_dir_into_superproject(prefix, path);
+
+               free(real_sub_git_dir);
+               free(real_common_git_dir);
+       }
+       strbuf_release(&gitdir);
+
+       if (flags & ABSORB_GITDIR_RECURSE_SUBMODULES) {
+               struct child_process cp = CHILD_PROCESS_INIT;
+               struct strbuf sb = STRBUF_INIT;
+
+               if (flags & ~ABSORB_GITDIR_RECURSE_SUBMODULES)
+                       die("BUG: we don't know how to pass the flags down?");
+
+               strbuf_addstr(&sb, get_super_prefix_or_empty());
+               strbuf_addstr(&sb, path);
+               strbuf_addch(&sb, '/');
+
+               cp.dir = path;
+               cp.git_cmd = 1;
+               cp.no_stdin = 1;
+               argv_array_pushl(&cp.args, "--super-prefix", sb.buf,
+                                          "submodule--helper",
+                                          "absorb-git-dirs", NULL);
+               prepare_submodule_repo_env(&cp.env_array);
+               if (run_command(&cp))
+                       die(_("could not recurse into submodule '%s'"), path);
+
+               strbuf_release(&sb);
        }
-       argv_array_push(out, "GIT_DIR=.git");
+}
+
+const char *get_superproject_working_tree(void)
+{
+       struct child_process cp = CHILD_PROCESS_INIT;
+       struct strbuf sb = STRBUF_INIT;
+       const char *one_up = real_path_if_valid("../");
+       const char *cwd = xgetcwd();
+       const char *ret = NULL;
+       const char *subpath;
+       int code;
+       ssize_t len;
+
+       if (!is_inside_work_tree())
+               /*
+                * FIXME:
+                * We might have a superproject, but it is harder
+                * to determine.
+                */
+               return NULL;
+
+       if (!one_up)
+               return NULL;
+
+       subpath = relative_path(cwd, one_up, &sb);
+
+       prepare_submodule_repo_env(&cp.env_array);
+       argv_array_pop(&cp.env_array);
+
+       argv_array_pushl(&cp.args, "--literal-pathspecs", "-C", "..",
+                       "ls-files", "-z", "--stage", "--full-name", "--",
+                       subpath, NULL);
+       strbuf_reset(&sb);
+
+       cp.no_stdin = 1;
+       cp.no_stderr = 1;
+       cp.out = -1;
+       cp.git_cmd = 1;
+
+       if (start_command(&cp))
+               die(_("could not start ls-files in .."));
+
+       len = strbuf_read(&sb, cp.out, PATH_MAX);
+       close(cp.out);
+
+       if (starts_with(sb.buf, "160000")) {
+               int super_sub_len;
+               int cwd_len = strlen(cwd);
+               char *super_sub, *super_wt;
+
+               /*
+                * There is a superproject having this repo as a submodule.
+                * The format is <mode> SP <hash> SP <stage> TAB <full name> \0,
+                * We're only interested in the name after the tab.
+                */
+               super_sub = strchr(sb.buf, '\t') + 1;
+               super_sub_len = sb.buf + sb.len - super_sub - 1;
+
+               if (super_sub_len > cwd_len ||
+                   strcmp(&cwd[cwd_len - super_sub_len], super_sub))
+                       die (_("BUG: returned path string doesn't match cwd?"));
+
+               super_wt = xstrdup(cwd);
+               super_wt[cwd_len - super_sub_len] = '\0';
+
+               ret = real_path(super_wt);
+               free(super_wt);
+       }
+       strbuf_release(&sb);
+
+       code = finish_command(&cp);
+
+       if (code == 128)
+               /* '../' is not a git repository */
+               return NULL;
+       if (code == 0 && len == 0)
+               /* There is an unrelated git repository at '../' */
+               return NULL;
+       if (code)
+               die(_("ls-tree returned unexpected return code %d"), code);
+
+       return ret;
+}
+
+int submodule_to_gitdir(struct strbuf *buf, const char *submodule)
+{
+       const struct submodule *sub;
+       const char *git_dir;
+       int ret = 0;
+
+       strbuf_reset(buf);
+       strbuf_addstr(buf, submodule);
+       strbuf_complete(buf, '/');
+       strbuf_addstr(buf, ".git");
+
+       git_dir = read_gitfile(buf->buf);
+       if (git_dir) {
+               strbuf_reset(buf);
+               strbuf_addstr(buf, git_dir);
+       }
+       if (!is_git_directory(buf->buf)) {
+               gitmodules_config();
+               sub = submodule_from_path(null_sha1, submodule);
+               if (!sub) {
+                       ret = -1;
+                       goto cleanup;
+               }
+               strbuf_reset(buf);
+               strbuf_git_path(buf, "%s/%s", "modules", sub->name);
+       }
+
+cleanup:
+       return ret;
 }
index 2af9390998194c7d51a3e23b14723574d6696926..1277480add48140c6bf8c6cbc51cb962e27637ae 100644 (file)
@@ -3,8 +3,11 @@
 
 struct diff_options;
 struct argv_array;
+struct oid_array;
+struct remote;
 
 enum {
+       RECURSE_SUBMODULES_ONLY = -5,
        RECURSE_SUBMODULES_CHECK = -4,
        RECURSE_SUBMODULES_ERROR = -3,
        RECURSE_SUBMODULES_NONE = -2,
@@ -29,44 +32,103 @@ struct submodule_update_strategy {
 };
 #define SUBMODULE_UPDATE_STRATEGY_INIT {SM_UPDATE_UNSPECIFIED, NULL}
 
-int is_staging_gitmodules_ok(void);
-int update_path_in_gitmodules(const char *oldpath, const char *newpath);
-int remove_path_from_gitmodules(const char *path);
-void stage_updated_gitmodules(void);
-void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
+extern int is_staging_gitmodules_ok(void);
+extern int update_path_in_gitmodules(const char *oldpath, const char *newpath);
+extern int remove_path_from_gitmodules(const char *path);
+extern void stage_updated_gitmodules(void);
+extern void set_diffopt_flags_from_submodule_config(struct diff_options *,
                const char *path);
-int submodule_config(const char *var, const char *value, void *cb);
-void gitmodules_config(void);
-int parse_submodule_update_strategy(const char *value,
+extern int submodule_config(const char *var, const char *value, void *cb);
+extern void gitmodules_config(void);
+extern void gitmodules_config_sha1(const unsigned char *commit_sha1);
+extern int is_submodule_initialized(const char *path);
+/*
+ * Determine if a submodule has been populated at a given 'path' by checking if
+ * the <path>/.git resolves to a valid git repository.
+ * If return_error_code is NULL, die on error.
+ * Otherwise the return error code is the same as of resolve_gitdir_gently.
+ */
+extern int is_submodule_populated_gently(const char *path, int *return_error_code);
+extern int parse_submodule_update_strategy(const char *value,
                struct submodule_update_strategy *dst);
-const char *submodule_strategy_to_string(const struct submodule_update_strategy *s);
-void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *);
-void show_submodule_summary(FILE *f, const char *path,
+extern const char *submodule_strategy_to_string(const struct submodule_update_strategy *s);
+extern void handle_ignore_submodules_arg(struct diff_options *, const char *);
+extern void show_submodule_summary(FILE *f, const char *path,
                const char *line_prefix,
-               unsigned char one[20], unsigned char two[20],
+               struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *del, const char *add, const char *reset);
-void set_config_fetch_recurse_submodules(int value);
-void check_for_new_submodule_commits(unsigned char new_sha1[20]);
-int fetch_populated_submodules(const struct argv_array *options,
+extern void show_submodule_inline_diff(FILE *f, const char *path,
+               const char *line_prefix,
+               struct object_id *one, struct object_id *two,
+               unsigned dirty_submodule, const char *meta,
+               const char *del, const char *add, const char *reset,
+               const struct diff_options *opt);
+extern void set_config_fetch_recurse_submodules(int value);
+extern void set_config_update_recurse_submodules(int value);
+/* Check if we want to update any submodule.*/
+extern int should_update_submodules(void);
+/*
+ * Returns the submodule struct if the given ce entry is a submodule
+ * and it should be updated. Returns NULL otherwise.
+ */
+extern const struct submodule *submodule_from_ce(const struct cache_entry *ce);
+extern void check_for_new_submodule_commits(struct object_id *oid);
+extern int fetch_populated_submodules(const struct argv_array *options,
                               const char *prefix, int command_line_option,
                               int quiet, int max_parallel_jobs);
-unsigned is_submodule_modified(const char *path, int ignore_untracked);
-int submodule_uses_gitfile(const char *path);
-int ok_to_remove_submodule(const char *path);
-int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20],
-                   const unsigned char a[20], const unsigned char b[20], int search);
-int find_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name,
-               struct string_list *needs_pushing);
-int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
-void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
-int parallel_submodules(void);
+extern unsigned is_submodule_modified(const char *path, int ignore_untracked);
+extern int submodule_uses_gitfile(const char *path);
+
+#define SUBMODULE_REMOVAL_DIE_ON_ERROR (1<<0)
+#define SUBMODULE_REMOVAL_IGNORE_UNTRACKED (1<<1)
+#define SUBMODULE_REMOVAL_IGNORE_IGNORED_UNTRACKED (1<<2)
+extern int bad_to_remove_submodule(const char *path, unsigned flags);
+extern int merge_submodule(unsigned char result[20], const char *path,
+                          const unsigned char base[20],
+                          const unsigned char a[20],
+                          const unsigned char b[20], int search);
+extern int find_unpushed_submodules(struct oid_array *commits,
+                                   const char *remotes_name,
+                                   struct string_list *needs_pushing);
+extern int push_unpushed_submodules(struct oid_array *commits,
+                                   const struct remote *remote,
+                                   const char **refspec, int refspec_nr,
+                                   const struct string_list *push_options,
+                                   int dry_run);
+extern void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
+extern int parallel_submodules(void);
+/*
+ * Given a submodule path (as in the index), return the repository
+ * path of that submodule in 'buf'. Return -1 on error or when the
+ * submodule is not initialized.
+ */
+int submodule_to_gitdir(struct strbuf *buf, const char *submodule);
+
+#define SUBMODULE_MOVE_HEAD_DRY_RUN (1<<0)
+#define SUBMODULE_MOVE_HEAD_FORCE   (1<<1)
+extern int submodule_move_head(const char *path,
+                              const char *old,
+                              const char *new,
+                              unsigned flags);
 
 /*
  * Prepare the "env_array" parameter of a "struct child_process" for executing
  * a submodule by clearing any repo-specific envirionment variables, but
  * retaining any config in the environment.
  */
-void prepare_submodule_repo_env(struct argv_array *out);
+extern void prepare_submodule_repo_env(struct argv_array *out);
+
+#define ABSORB_GITDIR_RECURSE_SUBMODULES (1<<0)
+extern void absorb_git_dir_into_superproject(const char *prefix,
+                                            const char *path,
+                                            unsigned flags);
+
+/*
+ * Return the absolute path of the working tree of the superproject, which this
+ * project is a submodule of. If this repository is not a submodule of
+ * another repository, return NULL.
+ */
+extern const char *get_superproject_working_tree(void);
 
 #endif
index 2d44088f56e56fadae0eb9c8fe69ad05c1bbc441..3bd959ae523cff7fe3a29f1abb92019b6d10515f 100644 (file)
@@ -1,2 +1,22 @@
 t[0-9][0-9][0-9][0-9]/* -whitespace
-t0110/url-* binary
+/diff-lib/* eol=lf
+/t0110/url-* binary
+/t3900/*.txt eol=lf
+/t3901/*.txt eol=lf
+/t4034/*/* eol=lf
+/t4013/* eol=lf
+/t4018/* eol=lf
+/t4051/* eol=lf
+/t4100/* eol=lf
+/t4101/* eol=lf
+/t4109/* eol=lf
+/t4110/* eol=lf
+/t4135/* eol=lf
+/t4211/* eol=lf
+/t4252/* eol=lf
+/t5100/* eol=lf
+/t5515/* eol=lf
+/t556x_common eol=lf
+/t7500/* eol=lf
+/t8005/*.txt eol=lf
+/t9*/*.dump eol=lf
index d613935f1455440843920e1f040b1e97ff3f27dd..1bb06c36f22d9fa0fb01fb8dfad02ffa9f338ebd 100644 (file)
@@ -35,6 +35,12 @@ all: $(DEFAULT_TEST_TARGET)
 test: pre-clean $(TEST_LINT)
        $(MAKE) aggregate-results-and-cleanup
 
+failed:
+       @failed=$$(cd '$(TEST_RESULTS_DIRECTORY_SQ)' && \
+               grep -l '^failed [1-9]' *.counts | \
+               sed -n 's/\.counts$$/.sh/p') && \
+       test -z "$$failed" || $(MAKE) $$failed
+
 prove: pre-clean $(TEST_LINT)
        @echo "*** prove ***"; $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
        $(MAKE) clean-except-prove-cache
index 4982d1c5216c10b7d44e66eace34e40d49cb5b2f..ab386c36818890a085d8917102b8f8a479ff34cd 100644 (file)
--- a/t/README
+++ b/t/README
@@ -471,13 +471,13 @@ Don't:
    their output.
 
    You can glean some further possible issues from the TAP grammar
-   (see http://search.cpan.org/perldoc?TAP::Parser::Grammar#TAP_Grammar)
+   (see https://metacpan.org/pod/TAP::Parser::Grammar#TAP-GRAMMAR)
    but the best indication is to just run the tests with prove(1),
    it'll complain if anything is amiss.
 
 Keep in mind:
 
- - Inside <script> part, the standard output and standard error
+ - Inside the <script> part, the standard output and standard error
    streams are discarded, and the test harness only reports "ok" or
    "not ok" to the end user running the tests. Under --verbose, they
    are shown to help debugging the tests.
@@ -611,9 +611,11 @@ library for your script to use.
 
  - test_have_prereq <prereq>
 
-   Check if we have a prerequisite previously set with
-   test_set_prereq. The most common use of this directly is to skip
-   all the tests if we don't have some essential prerequisite:
+   Check if we have a prerequisite previously set with test_set_prereq.
+   The most common way to use this explicitly (as opposed to the
+   implicit use when an argument is passed to test_expect_*) is to skip
+   all the tests at the start of the test script if we don't have some
+   essential prerequisite:
 
        if ! test_have_prereq PERL
        then
index d5dab5a94f1d881b8b103f6290ba91e4ec596ec6..006d2a8152dc499f3588b130470285703b60dc92 100644 (file)
@@ -110,7 +110,12 @@ perl -MEncode -e '$e="";decode_utf8($e, Encode::FB_CROAK)' >/dev/null 2>&1 || {
 }
 
 perl -MCGI -MCGI::Util -MCGI::Carp -e 0 >/dev/null 2>&1 || {
-       skip_all='skipping gitweb tests, CGI module unusable'
+       skip_all='skipping gitweb tests, CGI & CGI::Util & CGI::Carp modules not available'
+       test_done
+}
+
+perl -mTime::HiRes -e 0 >/dev/null 2>&1 || {
+       skip_all='skipping gitweb tests, Time::HiRes module not available'
        test_done
 }
 
index d6e8b3679872ab1e8d2e7493947e09c842c4140a..721650256e63eb51c66d5985c04bc3095f183c1c 100644 (file)
 /test-genrandom
 /test-hashmap
 /test-index-version
+/test-lazy-init-name-hash
 /test-line-buffer
 /test-match-trees
 /test-mergesort
 /test-mktemp
+/test-online-cpus
 /test-parse-options
 /test-path-utils
 /test-prio-queue
 /test-read-cache
+/test-ref-store
 /test-regex
 /test-revision-walking
 /test-run-command
 /test-sha1
 /test-sha1-array
 /test-sigchain
+/test-strcmp-offset
 /test-string-list
 /test-submodule-config
 /test-subprocess
index 3c6d08cd095152cab9abeb038c1b4f82440c55cd..8e3ed6a76cb97831e85152af8e9da21d18ed2fc1 100644 (file)
@@ -66,12 +66,30 @@ static int iterate_cb(const char *var, const char *value, void *data)
        return 0;
 }
 
+static int early_config_cb(const char *var, const char *value, void *vdata)
+{
+       const char *key = vdata;
+
+       if (!strcmp(key, var))
+               printf("%s\n", value);
+
+       return 0;
+}
+
 int cmd_main(int argc, const char **argv)
 {
        int i, val;
        const char *v;
        const struct string_list *strptr;
        struct config_set cs;
+
+       if (argc == 3 && !strcmp(argv[1], "read_early_config")) {
+               read_early_config(early_config_cb, (void *)argv[2]);
+               return 0;
+       }
+
+       setup_git_directory();
+
        git_configset_init(&cs);
 
        if (argc < 2) {
index 44f3290258a003317e4aad4f90d17ce5529e3b07..7af116d49e04777b9321044e199254a2211aa4d4 100644 (file)
@@ -58,6 +58,7 @@ int cmd_main(int ac, const char **av)
 {
        struct index_state istate;
        struct cache_tree *another = cache_tree();
+       setup_git_directory();
        if (read_cache() < 0)
                die("unable to read index file");
        istate = the_index;
index d1689248b4937fbecaf16129c4016814554b983d..e44430b699db732252afa6fcb06686ec89b5811d 100644 (file)
@@ -23,7 +23,7 @@ int cmd_main(int ac, const char **av)
        for (i = 0; i < the_index.cache_nr; i++) {
                struct cache_entry *ce = the_index.cache[i];
                printf("%06o %s %d\t%s\n", ce->ce_mode,
-                      sha1_to_hex(ce->sha1), ce_stage(ce), ce->name);
+                      oid_to_hex(&ce->oid), ce_stage(ce), ce->name);
        }
        printf("replacements:");
        if (si->replace_bitmap)
index 50112cc8586c75cf9f9b5fac65ea2f7dbc1a69e2..f752532ffbcd130c3c3cb25ae20da41d4f74ae68 100644 (file)
@@ -18,10 +18,8 @@ static int compare_dir(const void *a_, const void *b_)
 static void dump(struct untracked_cache_dir *ucd, struct strbuf *base)
 {
        int i, len;
-       qsort(ucd->untracked, ucd->untracked_nr, sizeof(*ucd->untracked),
-             compare_untracked);
-       qsort(ucd->dirs, ucd->dirs_nr, sizeof(*ucd->dirs),
-             compare_dir);
+       QSORT(ucd->untracked, ucd->untracked_nr, compare_untracked);
+       QSORT(ucd->dirs, ucd->dirs_nr, compare_dir);
        len = base->len;
        strbuf_addf(base, "%s/", ucd->name);
        printf("%s %s", base->buf,
diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c
new file mode 100644 (file)
index 0000000..6368a89
--- /dev/null
@@ -0,0 +1,264 @@
+#include "cache.h"
+#include "parse-options.h"
+
+static int single;
+static int multi;
+static int count = 1;
+static int dump;
+static int perf;
+static int analyze;
+static int analyze_step;
+
+/*
+ * Dump the contents of the "dir" and "name" hash tables to stdout.
+ * If you sort the result, you can compare it with the other type
+ * mode and verify that both single and multi produce the same set.
+ */
+static void dump_run(void)
+{
+       struct hashmap_iter iter_dir;
+       struct hashmap_iter iter_cache;
+
+       /* Stolen from name-hash.c */
+       struct dir_entry {
+               struct hashmap_entry ent;
+               struct dir_entry *parent;
+               int nr;
+               unsigned int namelen;
+               char name[FLEX_ARRAY];
+       };
+
+       struct dir_entry *dir;
+       struct cache_entry *ce;
+
+       read_cache();
+       if (single) {
+               test_lazy_init_name_hash(&the_index, 0);
+       } else {
+               int nr_threads_used = test_lazy_init_name_hash(&the_index, 1);
+               if (!nr_threads_used)
+                       die("non-threaded code path used");
+       }
+
+       dir = hashmap_iter_first(&the_index.dir_hash, &iter_dir);
+       while (dir) {
+               printf("dir %08x %7d %s\n", dir->ent.hash, dir->nr, dir->name);
+               dir = hashmap_iter_next(&iter_dir);
+       }
+
+       ce = hashmap_iter_first(&the_index.name_hash, &iter_cache);
+       while (ce) {
+               printf("name %08x %s\n", ce->ent.hash, ce->name);
+               ce = hashmap_iter_next(&iter_cache);
+       }
+
+       discard_cache();
+}
+
+/*
+ * Run the single or multi threaded version "count" times and
+ * report on the time taken.
+ */
+static uint64_t time_runs(int try_threaded)
+{
+       uint64_t t0, t1, t2;
+       uint64_t sum = 0;
+       uint64_t avg;
+       int nr_threads_used;
+       int i;
+
+       for (i = 0; i < count; i++) {
+               t0 = getnanotime();
+               read_cache();
+               t1 = getnanotime();
+               nr_threads_used = test_lazy_init_name_hash(&the_index, try_threaded);
+               t2 = getnanotime();
+
+               sum += (t2 - t1);
+
+               if (try_threaded && !nr_threads_used)
+                       die("non-threaded code path used");
+
+               if (nr_threads_used)
+                       printf("%f %f %d multi %d\n",
+                                  ((double)(t1 - t0))/1000000000,
+                                  ((double)(t2 - t1))/1000000000,
+                                  the_index.cache_nr,
+                                  nr_threads_used);
+               else
+                       printf("%f %f %d single\n",
+                                  ((double)(t1 - t0))/1000000000,
+                                  ((double)(t2 - t1))/1000000000,
+                                  the_index.cache_nr);
+               fflush(stdout);
+
+               discard_cache();
+       }
+
+       avg = sum / count;
+       if (count > 1)
+               printf("avg %f %s\n",
+                          (double)avg/1000000000,
+                          (try_threaded) ? "multi" : "single");
+
+       return avg;
+}
+
+/*
+ * Try a series of runs varying the "istate->cache_nr" and
+ * try to find a good value for the multi-threaded criteria.
+ */
+static void analyze_run(void)
+{
+       uint64_t t1s, t1m, t2s, t2m;
+       int cache_nr_limit;
+       int nr_threads_used;
+       int i;
+       int nr;
+
+       read_cache();
+       cache_nr_limit = the_index.cache_nr;
+       discard_cache();
+
+       nr = analyze;
+       while (1) {
+               uint64_t sum_single = 0;
+               uint64_t sum_multi = 0;
+               uint64_t avg_single;
+               uint64_t avg_multi;
+
+               if (nr > cache_nr_limit)
+                       nr = cache_nr_limit;
+
+               for (i = 0; i < count; i++) {
+                       read_cache();
+                       the_index.cache_nr = nr; /* cheap truncate of index */
+                       t1s = getnanotime();
+                       test_lazy_init_name_hash(&the_index, 0);
+                       t2s = getnanotime();
+                       sum_single += (t2s - t1s);
+                       the_index.cache_nr = cache_nr_limit;
+                       discard_cache();
+
+                       read_cache();
+                       the_index.cache_nr = nr; /* cheap truncate of index */
+                       t1m = getnanotime();
+                       nr_threads_used = test_lazy_init_name_hash(&the_index, 1);
+                       t2m = getnanotime();
+                       sum_multi += (t2m - t1m);
+                       the_index.cache_nr = cache_nr_limit;
+                       discard_cache();
+
+                       if (!nr_threads_used)
+                               printf("    [size %8d] [single %f]   non-threaded code path used\n",
+                                          nr, ((double)(t2s - t1s))/1000000000);
+                       else
+                               printf("    [size %8d] [single %f] %c [multi %f %d]\n",
+                                          nr,
+                                          ((double)(t2s - t1s))/1000000000,
+                                          (((t2s - t1s) < (t2m - t1m)) ? '<' : '>'),
+                                          ((double)(t2m - t1m))/1000000000,
+                                          nr_threads_used);
+                       fflush(stdout);
+               }
+               if (count > 1) {
+                       avg_single = sum_single / count;
+                       avg_multi = sum_multi / count;
+                       if (!nr_threads_used)
+                               printf("avg [size %8d] [single %f]\n",
+                                          nr,
+                                          (double)avg_single/1000000000);
+                       else
+                               printf("avg [size %8d] [single %f] %c [multi %f %d]\n",
+                                          nr,
+                                          (double)avg_single/1000000000,
+                                          (avg_single < avg_multi ? '<' : '>'),
+                                          (double)avg_multi/1000000000,
+                                          nr_threads_used);
+                       fflush(stdout);
+               }
+
+               if (nr >= cache_nr_limit)
+                       return;
+               nr += analyze_step;
+       }
+}
+
+int cmd_main(int argc, const char **argv)
+{
+       const char *usage[] = {
+               "test-lazy-init-name-hash -d (-s | -m)",
+               "test-lazy-init-name-hash -p [-c c]",
+               "test-lazy-init-name-hash -a a [--step s] [-c c]",
+               "test-lazy-init-name-hash (-s | -m) [-c c]",
+               "test-lazy-init-name-hash -s -m [-c c]",
+               NULL
+       };
+       struct option options[] = {
+               OPT_BOOL('s', "single", &single, "run single-threaded code"),
+               OPT_BOOL('m', "multi", &multi, "run multi-threaded code"),
+               OPT_INTEGER('c', "count", &count, "number of passes"),
+               OPT_BOOL('d', "dump", &dump, "dump hash tables"),
+               OPT_BOOL('p', "perf", &perf, "compare single vs multi"),
+               OPT_INTEGER('a', "analyze", &analyze, "analyze different multi sizes"),
+               OPT_INTEGER(0, "step", &analyze_step, "analyze step factor"),
+               OPT_END(),
+       };
+       const char *prefix;
+       uint64_t avg_single, avg_multi;
+
+       prefix = setup_git_directory();
+
+       argc = parse_options(argc, argv, prefix, options, usage, 0);
+
+       /*
+        * istate->dir_hash is only created when ignore_case is set.
+        */
+       ignore_case = 1;
+
+       if (dump) {
+               if (perf || analyze > 0)
+                       die("cannot combine dump, perf, or analyze");
+               if (count > 1)
+                       die("count not valid with dump");
+               if (single && multi)
+                       die("cannot use both single and multi with dump");
+               if (!single && !multi)
+                       die("dump requires either single or multi");
+               dump_run();
+               return 0;
+       }
+
+       if (perf) {
+               if (analyze > 0)
+                       die("cannot combine dump, perf, or analyze");
+               if (single || multi)
+                       die("cannot use single or multi with perf");
+               avg_single = time_runs(0);
+               avg_multi = time_runs(1);
+               if (avg_multi > avg_single)
+                       die("multi is slower");
+               return 0;
+       }
+
+       if (analyze) {
+               if (analyze < 500)
+                       die("analyze must be at least 500");
+               if (!analyze_step)
+                       analyze_step = analyze;
+               if (single || multi)
+                       die("cannot use single or multi with analyze");
+               analyze_run();
+               return 0;
+       }
+
+       if (!single && !multi)
+               die("require either -s or -m or both");
+
+       if (single)
+               time_runs(0);
+       if (multi)
+               time_runs(1);
+
+       return 0;
+}
diff --git a/t/helper/test-online-cpus.c b/t/helper/test-online-cpus.c
new file mode 100644 (file)
index 0000000..06c09c6
--- /dev/null
@@ -0,0 +1,8 @@
+#include "git-compat-util.h"
+#include "thread-utils.h"
+
+int cmd_main(int argc, const char **argv)
+{
+       printf("%d\n", online_cpus());
+       return 0;
+}
index 2a7990efc31d042121122a17890c623d7714c128..48255eef31a1e83d9a2bbb01670ba089a11c91f8 100644 (file)
@@ -5,6 +5,7 @@ int cmd_main(int argc, const char **argv)
        int i, cnt = 1;
        if (argc == 2)
                cnt = strtol(argv[1], NULL, 0);
+       setup_git_directory();
        for (i = 0; i < cnt; i++) {
                read_cache();
                discard_cache();
diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c
new file mode 100644 (file)
index 0000000..2d84c45
--- /dev/null
@@ -0,0 +1,277 @@
+#include "cache.h"
+#include "refs.h"
+
+static const char *notnull(const char *arg, const char *name)
+{
+       if (!arg)
+               die("%s required", name);
+       return arg;
+}
+
+static unsigned int arg_flags(const char *arg, const char *name)
+{
+       return atoi(notnull(arg, name));
+}
+
+static const char **get_store(const char **argv, struct ref_store **refs)
+{
+       const char *gitdir;
+
+       if (!argv[0]) {
+               die("ref store required");
+       } else if (!strcmp(argv[0], "main")) {
+               *refs = get_main_ref_store();
+       } else if (skip_prefix(argv[0], "submodule:", &gitdir)) {
+               struct strbuf sb = STRBUF_INIT;
+               int ret;
+
+               ret = strbuf_git_path_submodule(&sb, gitdir, "objects/");
+               if (ret)
+                       die("strbuf_git_path_submodule failed: %d", ret);
+               add_to_alternates_memory(sb.buf);
+               strbuf_release(&sb);
+
+               *refs = get_submodule_ref_store(gitdir);
+       } else
+               die("unknown backend %s", argv[0]);
+
+       if (!*refs)
+               die("no ref store");
+
+       /* consume store-specific optional arguments if needed */
+
+       return argv + 1;
+}
+
+
+static int cmd_pack_refs(struct ref_store *refs, const char **argv)
+{
+       unsigned int flags = arg_flags(*argv++, "flags");
+
+       return refs_pack_refs(refs, flags);
+}
+
+static int cmd_peel_ref(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+       unsigned char sha1[20];
+       int ret;
+
+       ret = refs_peel_ref(refs, refname, sha1);
+       if (!ret)
+               puts(sha1_to_hex(sha1));
+       return ret;
+}
+
+static int cmd_create_symref(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+       const char *target = notnull(*argv++, "target");
+       const char *logmsg = *argv++;
+
+       return refs_create_symref(refs, refname, target, logmsg);
+}
+
+static int cmd_delete_refs(struct ref_store *refs, const char **argv)
+{
+       unsigned int flags = arg_flags(*argv++, "flags");
+       struct string_list refnames = STRING_LIST_INIT_NODUP;
+
+       while (*argv)
+               string_list_append(&refnames, *argv++);
+
+       return refs_delete_refs(refs, &refnames, flags);
+}
+
+static int cmd_rename_ref(struct ref_store *refs, const char **argv)
+{
+       const char *oldref = notnull(*argv++, "oldref");
+       const char *newref = notnull(*argv++, "newref");
+       const char *logmsg = *argv++;
+
+       return refs_rename_ref(refs, oldref, newref, logmsg);
+}
+
+static int each_ref(const char *refname, const struct object_id *oid,
+                   int flags, void *cb_data)
+{
+       printf("%s %s 0x%x\n", oid_to_hex(oid), refname, flags);
+       return 0;
+}
+
+static int cmd_for_each_ref(struct ref_store *refs, const char **argv)
+{
+       const char *prefix = notnull(*argv++, "prefix");
+
+       return refs_for_each_ref_in(refs, prefix, each_ref, NULL);
+}
+
+static int cmd_resolve_ref(struct ref_store *refs, const char **argv)
+{
+       unsigned char sha1[20];
+       const char *refname = notnull(*argv++, "refname");
+       int resolve_flags = arg_flags(*argv++, "resolve-flags");
+       int flags;
+       const char *ref;
+
+       ref = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
+                                     sha1, &flags);
+       printf("%s %s 0x%x\n", sha1_to_hex(sha1), ref, flags);
+       return ref ? 0 : 1;
+}
+
+static int cmd_verify_ref(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+       struct strbuf err = STRBUF_INIT;
+       int ret;
+
+       ret = refs_verify_refname_available(refs, refname, NULL, NULL, &err);
+       if (err.len)
+               puts(err.buf);
+       return ret;
+}
+
+static int cmd_for_each_reflog(struct ref_store *refs, const char **argv)
+{
+       return refs_for_each_reflog(refs, each_ref, NULL);
+}
+
+static int each_reflog(struct object_id *old_oid, struct object_id *new_oid,
+                      const char *committer, unsigned long timestamp,
+                      int tz, const char *msg, void *cb_data)
+{
+       printf("%s %s %s %lu %d %s\n",
+              oid_to_hex(old_oid), oid_to_hex(new_oid),
+              committer, timestamp, tz, msg);
+       return 0;
+}
+
+static int cmd_for_each_reflog_ent(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+
+       return refs_for_each_reflog_ent(refs, refname, each_reflog, refs);
+}
+
+static int cmd_for_each_reflog_ent_reverse(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+
+       return refs_for_each_reflog_ent_reverse(refs, refname, each_reflog, refs);
+}
+
+static int cmd_reflog_exists(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+
+       return !refs_reflog_exists(refs, refname);
+}
+
+static int cmd_create_reflog(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+       int force_create = arg_flags(*argv++, "force-create");
+       struct strbuf err = STRBUF_INIT;
+       int ret;
+
+       ret = refs_create_reflog(refs, refname, force_create, &err);
+       if (err.len)
+               puts(err.buf);
+       return ret;
+}
+
+static int cmd_delete_reflog(struct ref_store *refs, const char **argv)
+{
+       const char *refname = notnull(*argv++, "refname");
+
+       return refs_delete_reflog(refs, refname);
+}
+
+static int cmd_reflog_expire(struct ref_store *refs, const char **argv)
+{
+       die("not supported yet");
+}
+
+static int cmd_delete_ref(struct ref_store *refs, const char **argv)
+{
+       const char *msg = notnull(*argv++, "msg");
+       const char *refname = notnull(*argv++, "refname");
+       const char *sha1_buf = notnull(*argv++, "old-sha1");
+       unsigned int flags = arg_flags(*argv++, "flags");
+       unsigned char old_sha1[20];
+
+       if (get_sha1_hex(sha1_buf, old_sha1))
+               die("not sha-1");
+
+       return refs_delete_ref(refs, msg, refname, old_sha1, flags);
+}
+
+static int cmd_update_ref(struct ref_store *refs, const char **argv)
+{
+       const char *msg = notnull(*argv++, "msg");
+       const char *refname = notnull(*argv++, "refname");
+       const char *new_sha1_buf = notnull(*argv++, "old-sha1");
+       const char *old_sha1_buf = notnull(*argv++, "old-sha1");
+       unsigned int flags = arg_flags(*argv++, "flags");
+       unsigned char old_sha1[20];
+       unsigned char new_sha1[20];
+
+       if (get_sha1_hex(old_sha1_buf, old_sha1) ||
+           get_sha1_hex(new_sha1_buf, new_sha1))
+               die("not sha-1");
+
+       return refs_update_ref(refs, msg, refname,
+                              new_sha1, old_sha1,
+                              flags, UPDATE_REFS_DIE_ON_ERR);
+}
+
+struct command {
+       const char *name;
+       int (*func)(struct ref_store *refs, const char **argv);
+};
+
+static struct command commands[] = {
+       { "pack-refs", cmd_pack_refs },
+       { "peel-ref", cmd_peel_ref },
+       { "create-symref", cmd_create_symref },
+       { "delete-refs", cmd_delete_refs },
+       { "rename-ref", cmd_rename_ref },
+       { "for-each-ref", cmd_for_each_ref },
+       { "resolve-ref", cmd_resolve_ref },
+       { "verify-ref", cmd_verify_ref },
+       { "for-each-reflog", cmd_for_each_reflog },
+       { "for-each-reflog-ent", cmd_for_each_reflog_ent },
+       { "for-each-reflog-ent-reverse", cmd_for_each_reflog_ent_reverse },
+       { "reflog-exists", cmd_reflog_exists },
+       { "create-reflog", cmd_create_reflog },
+       { "delete-reflog", cmd_delete_reflog },
+       { "reflog-expire", cmd_reflog_expire },
+       /*
+        * backend transaction functions can't be tested separately
+        */
+       { "delete-ref", cmd_delete_ref },
+       { "update-ref", cmd_update_ref },
+       { NULL, NULL }
+};
+
+int cmd_main(int argc, const char **argv)
+{
+       struct ref_store *refs;
+       const char *func;
+       struct command *cmd;
+
+       setup_git_directory();
+
+       argv = get_store(argv + 1, &refs);
+
+       func = *argv++;
+       if (!func)
+               die("ref function required");
+       for (cmd = commands; cmd->name; cmd++) {
+               if (!strcmp(func, cmd->name))
+                       return cmd->func(refs, argv);
+       }
+       die("unknown function %s", func);
+       return 0;
+}
index 5b2fd0990894dd59a074ded5822bbcf215a989aa..d2a63bea4346fb76d38ba43508ee6e60599e41a9 100644 (file)
@@ -7,7 +7,8 @@ static struct lock_file index_lock;
 
 int cmd_main(int ac, const char **av)
 {
-       hold_locked_index(&index_lock, 1);
+       setup_git_directory();
+       hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
        if (read_cache() < 0)
                die("unable to read index file");
        active_cache_tree = NULL;
index 09f77909716326bdb76a79d3c32d10b74702e1d5..edfd52d82aeca0bb9ba2c5b2ce18bc39d27e5a34 100644 (file)
@@ -1,32 +1,33 @@
 #include "cache.h"
 #include "sha1-array.h"
 
-static void print_sha1(const unsigned char sha1[20], void *data)
+static int print_oid(const struct object_id *oid, void *data)
 {
-       puts(sha1_to_hex(sha1));
+       puts(oid_to_hex(oid));
+       return 0;
 }
 
 int cmd_main(int argc, const char **argv)
 {
-       struct sha1_array array = SHA1_ARRAY_INIT;
+       struct oid_array array = OID_ARRAY_INIT;
        struct strbuf line = STRBUF_INIT;
 
        while (strbuf_getline(&line, stdin) != EOF) {
                const char *arg;
-               unsigned char sha1[20];
+               struct object_id oid;
 
                if (skip_prefix(line.buf, "append ", &arg)) {
-                       if (get_sha1_hex(arg, sha1))
+                       if (get_oid_hex(arg, &oid))
                                die("not a hexadecimal SHA1: %s", arg);
-                       sha1_array_append(&array, sha1);
+                       oid_array_append(&array, &oid);
                } else if (skip_prefix(line.buf, "lookup ", &arg)) {
-                       if (get_sha1_hex(arg, sha1))
+                       if (get_oid_hex(arg, &oid))
                                die("not a hexadecimal SHA1: %s", arg);
-                       printf("%d\n", sha1_array_lookup(&array, sha1));
+                       printf("%d\n", oid_array_lookup(&array, &oid));
                } else if (!strcmp(line.buf, "clear"))
-                       sha1_array_clear(&array);
+                       oid_array_clear(&array);
                else if (!strcmp(line.buf, "for_each_unique"))
-                       sha1_array_for_each_unique(&array, print_sha1, NULL);
+                       oid_array_for_each_unique(&array, print_oid, NULL);
                else
                        die("unknown command: %s", line.buf);
        }
diff --git a/t/helper/test-strcmp-offset.c b/t/helper/test-strcmp-offset.c
new file mode 100644 (file)
index 0000000..4a45a54
--- /dev/null
@@ -0,0 +1,22 @@
+#include "cache.h"
+
+int cmd_main(int argc, const char **argv)
+{
+       int result;
+       size_t offset;
+
+       if (!argv[1] || !argv[2])
+               die("usage: %s <string1> <string2>", argv[0]);
+
+       result = strcmp_offset(argv[1], argv[2], &offset);
+
+       /*
+        * Because differnt CRTs behave differently, only rely on signs
+        * of the result values.
+        */
+       result = (result < 0 ? -1 :
+                         result > 0 ? 1 :
+                         0);
+       printf("%d %"PRIuMAX"\n", result, (uintmax_t)offset);
+       return 0;
+}
index 4a68967bd126e5ab74ec2b39113cce58e7c021bf..c502fa16d307957b6fe23cbd5481fc35f49c00da 100644 (file)
@@ -97,6 +97,31 @@ int cmd_main(int argc, const char **argv)
                return 0;
        }
 
+       if (argc == 2 && !strcmp(argv[1], "sort")) {
+               struct string_list list = STRING_LIST_INIT_NODUP;
+               struct strbuf sb = STRBUF_INIT;
+               struct string_list_item *item;
+
+               strbuf_read(&sb, 0, 0);
+
+               /*
+                * Split by newline, but don't create a string_list item
+                * for the empty string after the last separator.
+                */
+               if (sb.buf[sb.len - 1] == '\n')
+                       strbuf_setlen(&sb, sb.len - 1);
+               string_list_split_in_place(&list, sb.buf, '\n', -1);
+
+               string_list_sort(&list);
+
+               for_each_string_list_item(item, &list)
+                       puts(item->string);
+
+               string_list_clear(&list, 0);
+               strbuf_release(&sb);
+               return 0;
+       }
+
        fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
                argv[1] ? argv[1] : "(there was none)");
        return 1;
diff --git a/t/interop/.gitignore b/t/interop/.gitignore
new file mode 100644 (file)
index 0000000..49c78d3
--- /dev/null
@@ -0,0 +1,4 @@
+/trash directory*/
+/test-results/
+/.prove/
+/build/
diff --git a/t/interop/Makefile b/t/interop/Makefile
new file mode 100644 (file)
index 0000000..31a4bbc
--- /dev/null
@@ -0,0 +1,16 @@
+-include ../../config.mak
+export GIT_TEST_OPTIONS
+
+SHELL_PATH ?= $(SHELL)
+SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
+T = $(sort $(wildcard i[0-9][0-9][0-9][0-9]-*.sh))
+
+all: $(T)
+
+$(T):
+       @echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
+
+clean:
+       rm -rf build "trash directory".* test-results
+
+.PHONY: all clean $(T)
diff --git a/t/interop/README b/t/interop/README
new file mode 100644 (file)
index 0000000..72d42bd
--- /dev/null
@@ -0,0 +1,85 @@
+Git version interoperability tests
+==================================
+
+This directory has interoperability tests for git. Each script is
+similar to the normal test scripts found in t/, but with the added twist
+that two special versions of git, "git.a" and "git.b", are available in
+the PATH. Individual tests can then check the interaction between the
+two versions.
+
+When you add a feature that handles backwards compatibility between git
+versions, it's encouraged to add a test here to make sure it behaves as
+you expect.
+
+
+Running Tests
+-------------
+
+The easiest way to run tests is to say "make".  This runs all
+the tests against their default versions.
+
+You can run a single test like:
+
+    $ ./i0000-basic.sh
+    ok 1 - bare git is forbidden
+    ok 2 - git.a version (v1.6.6.3)
+    ok 3 - git.b version (v2.11.1)
+    # passed all 3 test(s)
+    1..3
+
+Each test contains default versions to run against. You may override
+these by setting `GIT_TEST_VERSION_A` and `GIT_TEST_VERSION_B` in the
+environment. Note that not all combinations will give sensible outcomes
+for all tests (e.g., a test checking for a specific old/new interaction
+may want something "old" enough" and something "new" enough; see
+individual tests for details).
+
+Version names should be resolvable as revisions in the current
+repository. They will be exported and built as needed using the
+config.mak files found at the root of your working tree.
+
+The exception is the special version "." which uses the currently-built
+contents of your working tree.
+
+You can set the following variables (in the environment or in your config.mak):
+
+    GIT_INTEROP_MAKE_OPTS
+       Options to pass to `make` when building a git version (e.g.,
+       `-j8`).
+
+You can also pass any command-line options taken by ordinary git tests (e.g.,
+"-v").
+
+
+Naming Tests
+------------
+
+The interop test files are named like:
+
+       iNNNN-short-description.sh
+
+where N is a decimal digit.  The same conventions for choosing NNNN as
+for normal tests apply.
+
+
+Writing Tests
+-------------
+
+An interop test script starts like a normal script, declaring a few
+variables and then including interop-lib.sh (which includes test-lib.sh).
+Besides test_description, you should also set the $VERSION_A and $VERSION_B
+variables to give the default versions to test against. See t0000-basic.sh for
+an example.
+
+You can then use test_expect_success as usual, with a few differences:
+
+  1. The special commands "git.a" and "git.b" correspond to the
+     two versions.
+
+  2. You cannot call a bare "git". This is to prevent accidents where
+     you meant "git.a" or "git.b".
+
+  3. The trash directory is _not_ a git repository by default. You
+     should create one with the appropriate version of git.
+
+At the end of the script, call test_done as usual.
diff --git a/t/interop/i0000-basic.sh b/t/interop/i0000-basic.sh
new file mode 100755 (executable)
index 0000000..903e919
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+# Note that this test only works on real version numbers,
+# as it depends on matching the output to "git version".
+VERSION_A=v1.6.6.3
+VERSION_B=v2.11.1
+
+test_description='sanity test interop library'
+. ./interop-lib.sh
+
+test_expect_success 'bare git is forbidden' '
+       test_must_fail git version
+'
+
+test_expect_success "git.a version ($VERSION_A)" '
+       echo git version ${VERSION_A#v} >expect &&
+       git.a version >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success "git.b version ($VERSION_B)" '
+       echo git version ${VERSION_B#v} >expect &&
+       git.b version >actual &&
+       test_cmp expect actual
+'
+
+test_done
diff --git a/t/interop/i5500-git-daemon.sh b/t/interop/i5500-git-daemon.sh
new file mode 100755 (executable)
index 0000000..1daf694
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+VERSION_A=.
+VERSION_B=v1.0.0
+
+: ${LIB_GIT_DAEMON_PORT:=5500}
+LIB_GIT_DAEMON_COMMAND='git.a daemon'
+
+test_description='clone and fetch by older client'
+. ./interop-lib.sh
+. "$TEST_DIRECTORY"/lib-git-daemon.sh
+
+start_git_daemon --export-all
+
+repo=$GIT_DAEMON_DOCUMENT_ROOT_PATH/repo
+
+test_expect_success "create repo served by $VERSION_A" '
+       git.a init "$repo" &&
+       git.a -C "$repo" commit --allow-empty -m one
+'
+
+test_expect_success "clone with $VERSION_B" '
+       git.b clone "$GIT_DAEMON_URL/repo" child &&
+       echo one >expect &&
+       git.a -C child log -1 --format=%s >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success "fetch with $VERSION_B" '
+       git.a -C "$repo" commit --allow-empty -m two &&
+       (
+               cd child &&
+               git.b fetch
+       ) &&
+       echo two >expect &&
+       git.a -C child log -1 --format=%s FETCH_HEAD >actual &&
+       test_cmp expect actual
+'
+
+stop_git_daemon
+test_done
diff --git a/t/interop/interop-lib.sh b/t/interop/interop-lib.sh
new file mode 100644 (file)
index 0000000..3e0a291
--- /dev/null
@@ -0,0 +1,92 @@
+# Interoperability testing framework. Each script should source
+# this after setting default $VERSION_A and $VERSION_B variables.
+
+. ../../GIT-BUILD-OPTIONS
+INTEROP_ROOT=$(pwd)
+BUILD_ROOT=$INTEROP_ROOT/build
+
+build_version () {
+       if test -z "$1"
+       then
+               echo >&2 "error: test script did not set default versions"
+               return 1
+       fi
+
+       if test "$1" = "."
+       then
+               git rev-parse --show-toplevel
+               return 0
+       fi
+
+       sha1=$(git rev-parse "$1^{tree}") || return 1
+       dir=$BUILD_ROOT/$sha1
+
+       if test -e "$dir/.built"
+       then
+               echo "$dir"
+               return 0
+       fi
+
+       echo >&2 "==> Building $1..."
+
+       mkdir -p "$dir" || return 1
+
+       (cd "$(git rev-parse --show-cdup)" && git archive --format=tar "$sha1") |
+       (cd "$dir" && tar x) ||
+       return 1
+
+       for config in config.mak config.mak.autogen config.status
+       do
+               if test -e "$INTEROP_ROOT/../../$config"
+               then
+                       cp "$INTEROP_ROOT/../../$config" "$dir/" || return 1
+               fi
+       done
+
+       (
+               cd "$dir" &&
+               make $GIT_INTEROP_MAKE_OPTS >&2 &&
+               touch .built
+       ) || return 1
+
+       echo "$dir"
+}
+
+# Old versions of git don't have bin-wrappers, so let's give a rough emulation.
+wrap_git () {
+       write_script "$1" <<-EOF
+       GIT_EXEC_PATH="$2"
+       export GIT_EXEC_PATH
+       PATH="$2:\$PATH"
+       export GIT_EXEC_PATH
+       exec git "\$@"
+       EOF
+}
+
+generate_wrappers () {
+       mkdir -p .bin &&
+       wrap_git .bin/git.a "$DIR_A" &&
+       wrap_git .bin/git.b "$DIR_B" &&
+       write_script .bin/git <<-\EOF &&
+       echo >&2 fatal: test tried to run generic git
+       exit 1
+       EOF
+       PATH=$(pwd)/.bin:$PATH
+}
+
+VERSION_A=${GIT_TEST_VERSION_A:-$VERSION_A}
+VERSION_B=${GIT_TEST_VERSION_B:-$VERSION_B}
+
+if ! DIR_A=$(build_version "$VERSION_A") ||
+   ! DIR_B=$(build_version "$VERSION_B")
+then
+       echo >&2 "fatal: unable to build git versions"
+       exit 1
+fi
+
+TEST_DIRECTORY=$INTEROP_ROOT/..
+TEST_OUTPUT_DIRECTORY=$INTEROP_ROOT
+TEST_NO_CREATE_REPO=t
+. "$TEST_DIRECTORY"/test-lib.sh
+
+generate_wrappers || die "unable to set up interop test environment"
index f9cbd4793194fbc38ec9a2bde0eafad748735044..987d40680b4d23f9053c623529eaafa88da04616 100644 (file)
@@ -46,7 +46,8 @@ start_git_daemon() {
 
        say >&3 "Starting git daemon ..."
        mkfifo git_daemon_output
-       git daemon --listen=127.0.0.1 --port="$LIB_GIT_DAEMON_PORT" \
+       ${LIB_GIT_DAEMON_COMMAND:-git daemon} \
+               --listen=127.0.0.1 --port="$LIB_GIT_DAEMON_PORT" \
                --reuseaddr --verbose \
                --base-path="$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
                "$@" "$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
index c3e631394f4a47f32e62e266431607861929f328..0642ae7e6ef0fbbd9e7eacdebd061d258c8b4222 100644 (file)
@@ -123,6 +123,7 @@ ScriptAlias /error/ error.sh/
 </Files>
 
 RewriteEngine on
+RewriteRule ^/dumb-redir/(.*)$ /dumb/$1 [R=301]
 RewriteRule ^/smart-redir-perm/(.*)$ /smart/$1 [R=301]
 RewriteRule ^/smart-redir-temp/(.*)$ /smart/$1 [R=302]
 RewriteRule ^/smart-redir-auth/(.*)$ /auth/smart/$1 [R=301]
@@ -132,6 +133,28 @@ RewriteRule ^/ftp-redir/(.*)$ ftp://localhost:1000/$1 [R=302]
 RewriteRule ^/loop-redir/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-(.*) /$1 [R=302]
 RewriteRule ^/loop-redir/(.*)$ /loop-redir/x-$1 [R=302]
 
+# redir-to/502/x?y -> really-redir-to?path=502/x&qs=y which returns 502
+# redir-to/x?y -> really-redir-to?path=x&qs=y -> x?y
+RewriteCond %{QUERY_STRING} ^(.*)$
+RewriteRule ^/redir-to/(.*)$ /really-redir-to?path=$1&qs=%1 [R=302]
+RewriteCond %{QUERY_STRING} ^path=502/(.*)&qs=(.*)$
+RewriteRule ^/really-redir-to$ - [R=502,L]
+RewriteCond %{QUERY_STRING} ^path=(.*)&qs=(.*)$
+RewriteRule ^/really-redir-to$ /%1?%2 [R=302]
+
+# The first rule issues a client-side redirect to something
+# that _doesn't_ look like a git repo. The second rule is a
+# server-side rewrite, so that it turns out the odd-looking
+# thing _is_ a git repo. The "[PT]" tells Apache to match
+# the usual ScriptAlias rules for /smart.
+RewriteRule ^/insane-redir/(.*)$ /intern-redir/$1/foo [R=301]
+RewriteRule ^/intern-redir/(.*)/foo$ /smart/$1 [PT]
+
+# Serve info/refs internally without redirecting, but
+# issue a redirect for any object requests.
+RewriteRule ^/redir-objects/(.*/info/refs)$ /dumb/$1 [PT]
+RewriteRule ^/redir-objects/(.*/objects/.*)$ /dumb/$1 [R=301]
+
 # Apache 2.2 does not understand <RequireAll>, so we use RewriteCond.
 # And as RewriteCond does not allow testing for non-matches, we match
 # the desired case first (one has abra, two has cadabra), and let it
index b0917d93e64a93faef4a87fed300761f7461420a..02f49cb4097153f84d5e397b1801128e229c7909 100644 (file)
@@ -1,15 +1,12 @@
 # Test routines for checking protocol disabling.
 
-# test cloning a particular protocol
-#   $1 - description of the protocol
-#   $2 - machine-readable name of the protocol
-#   $3 - the URL to try cloning
-test_proto () {
+# Test clone/fetch/push with GIT_ALLOW_PROTOCOL whitelist
+test_whitelist () {
        desc=$1
        proto=$2
        url=$3
 
-       test_expect_success "clone $1 (enabled)" '
+       test_expect_success "clone $desc (enabled)" '
                rm -rf tmp.git &&
                (
                        GIT_ALLOW_PROTOCOL=$proto &&
@@ -18,7 +15,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "fetch $1 (enabled)" '
+       test_expect_success "fetch $desc (enabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=$proto &&
@@ -27,7 +24,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "push $1 (enabled)" '
+       test_expect_success "push $desc (enabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=$proto &&
@@ -36,7 +33,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "push $1 (disabled)" '
+       test_expect_success "push $desc (disabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=none &&
@@ -45,7 +42,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "fetch $1 (disabled)" '
+       test_expect_success "fetch $desc (disabled)" '
                (
                        cd tmp.git &&
                        GIT_ALLOW_PROTOCOL=none &&
@@ -54,7 +51,7 @@ test_proto () {
                )
        '
 
-       test_expect_success "clone $1 (disabled)" '
+       test_expect_success "clone $desc (disabled)" '
                rm -rf tmp.git &&
                (
                        GIT_ALLOW_PROTOCOL=none &&
@@ -62,6 +59,129 @@ test_proto () {
                        test_must_fail git clone --bare "$url" tmp.git
                )
        '
+
+       test_expect_success "clone $desc (env var has precedence)" '
+               rm -rf tmp.git &&
+               (
+                       GIT_ALLOW_PROTOCOL=none &&
+                       export GIT_ALLOW_PROTOCOL &&
+                       test_must_fail git -c protocol.allow=always clone --bare "$url" tmp.git &&
+                       test_must_fail git -c protocol.$proto.allow=always clone --bare "$url" tmp.git
+               )
+       '
+}
+
+test_config () {
+       desc=$1
+       proto=$2
+       url=$3
+
+       # Test clone/fetch/push with protocol.<type>.allow config
+       test_expect_success "clone $desc (enabled with config)" '
+               rm -rf tmp.git &&
+               git -c protocol.$proto.allow=always clone --bare "$url" tmp.git
+       '
+
+       test_expect_success "fetch $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=always fetch
+       '
+
+       test_expect_success "push $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=always  push origin HEAD:pushed
+       '
+
+       test_expect_success "push $desc (disabled)" '
+               test_must_fail git -C tmp.git -c protocol.$proto.allow=never push origin HEAD:pushed
+       '
+
+       test_expect_success "fetch $desc (disabled)" '
+               test_must_fail git -C tmp.git -c protocol.$proto.allow=never fetch
+       '
+
+       test_expect_success "clone $desc (disabled)" '
+               rm -rf tmp.git &&
+               test_must_fail git -c protocol.$proto.allow=never clone --bare "$url" tmp.git
+       '
+
+       # Test clone/fetch/push with protocol.user.allow and its env var
+       test_expect_success "clone $desc (enabled)" '
+               rm -rf tmp.git &&
+               git -c protocol.$proto.allow=user clone --bare "$url" tmp.git
+       '
+
+       test_expect_success "fetch $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=user fetch
+       '
+
+       test_expect_success "push $desc (enabled)" '
+               git -C tmp.git -c protocol.$proto.allow=user push origin HEAD:pushed
+       '
+
+       test_expect_success "push $desc (disabled)" '
+               (
+                       cd tmp.git &&
+                       GIT_PROTOCOL_FROM_USER=0 &&
+                       export GIT_PROTOCOL_FROM_USER &&
+                       test_must_fail git -c protocol.$proto.allow=user push origin HEAD:pushed
+               )
+       '
+
+       test_expect_success "fetch $desc (disabled)" '
+               (
+                       cd tmp.git &&
+                       GIT_PROTOCOL_FROM_USER=0 &&
+                       export GIT_PROTOCOL_FROM_USER &&
+                       test_must_fail git -c protocol.$proto.allow=user fetch
+               )
+       '
+
+       test_expect_success "clone $desc (disabled)" '
+               rm -rf tmp.git &&
+               (
+                       GIT_PROTOCOL_FROM_USER=0 &&
+                       export GIT_PROTOCOL_FROM_USER &&
+                       test_must_fail git -c protocol.$proto.allow=user clone --bare "$url" tmp.git
+               )
+       '
+
+       # Test clone/fetch/push with protocol.allow user defined default
+       test_expect_success "clone $desc (enabled)" '
+               rm -rf tmp.git &&
+               git config --global protocol.allow always &&
+               git clone --bare "$url" tmp.git
+       '
+
+       test_expect_success "fetch $desc (enabled)" '
+               git -C tmp.git fetch
+       '
+
+       test_expect_success "push $desc (enabled)" '
+               git -C tmp.git push origin HEAD:pushed
+       '
+
+       test_expect_success "push $desc (disabled)" '
+               git config --global protocol.allow never &&
+               test_must_fail git -C tmp.git push origin HEAD:pushed
+       '
+
+       test_expect_success "fetch $desc (disabled)" '
+               test_must_fail git -C tmp.git fetch
+       '
+
+       test_expect_success "clone $desc (disabled)" '
+               rm -rf tmp.git &&
+               test_must_fail git clone --bare "$url" tmp.git
+       '
+}
+
+# test cloning a particular protocol
+#   $1 - description of the protocol
+#   $2 - machine-readable name of the protocol
+#   $3 - the URL to try cloning
+test_proto () {
+       test_whitelist "$@"
+
+       test_config "$@"
 }
 
 # set up an ssh wrapper that will access $host/$repo in the
index 79cdd34a540ddc7230b1aefb7fb4af5915c7085f..2c17826e950ce221ae9efa10cfa99dc47c042825 100755 (executable)
@@ -4,6 +4,7 @@
 # - New submodule (no_submodule => add_sub1)
 # - Removed submodule (add_sub1 => remove_sub1)
 # - Updated submodule (add_sub1 => modify_sub1)
+# - Updated submodule recursively (add_nested_sub => modify_sub1_recursively)
 # - Submodule updated to invalid commit (add_sub1 => invalid_sub1)
 # - Submodule updated from invalid commit (invalid_sub1 => valid_sub1)
 # - Submodule replaced by tracked files in directory (add_sub1 =>
 # - Tracked file replaced by submodule (replace_sub1_with_file =>
 #   replace_file_with_sub1)
 #
-#                   --O-----O
-#                  /  ^     replace_directory_with_sub1
-#                 /   replace_sub1_with_directory
-#                /----O
-#               /     ^
-#              /      modify_sub1
-#      O------O-------O
-#      ^      ^\      ^
-#      |      | \     remove_sub1
-#      |      |  -----O-----O
-#      |      |   \   ^     replace_file_with_sub1
-#      |      |    \  replace_sub1_with_file
-#      |   add_sub1 --O-----O
-# no_submodule        ^     valid_sub1
-#                     invalid_sub1
+#                     ----O
+#                    /    ^
+#                   /     remove_sub1
+#                  /
+#       add_sub1  /-------O---------O--------O  modify_sub1_recursively
+#             |  /        ^         add_nested_sub
+#             | /         modify_sub1
+#             v/
+#      O------O-----------O---------O
+#      ^       \          ^         replace_directory_with_sub1
+#      |        \         replace_sub1_with_directory
+# no_submodule   \
+#                 --------O---------O
+#                  \      ^         replace_file_with_sub1
+#                   \     replace_sub1_with_file
+#                    \
+#                     ----O---------O
+#                         ^         valid_sub1
+#                         invalid_sub1
 #
+
 create_lib_submodule_repo () {
+       git init submodule_update_sub1 &&
+       (
+               cd submodule_update_sub1 &&
+               echo "expect" >>.gitignore &&
+               echo "actual" >>.gitignore &&
+               echo "x" >file1 &&
+               echo "y" >file2 &&
+               git add .gitignore file1 file2 &&
+               git commit -m "Base inside first submodule" &&
+               git branch "no_submodule"
+       ) &&
+       git init submodule_update_sub2 &&
+       (
+               cd submodule_update_sub2
+               echo "expect" >>.gitignore &&
+               echo "actual" >>.gitignore &&
+               echo "x" >file1 &&
+               echo "y" >file2 &&
+               git add .gitignore file1 file2 &&
+               git commit -m "nested submodule base" &&
+               git branch "no_submodule"
+       ) &&
        git init submodule_update_repo &&
        (
                cd submodule_update_repo &&
@@ -44,15 +72,16 @@ create_lib_submodule_repo () {
                git branch "no_submodule" &&
 
                git checkout -b "add_sub1" &&
-               git submodule add ./. sub1 &&
+               git submodule add ../submodule_update_sub1 sub1 &&
                git config -f .gitmodules submodule.sub1.ignore all &&
                git config submodule.sub1.ignore all &&
                git add .gitmodules &&
                git commit -m "Add sub1" &&
-               git checkout -b remove_sub1 &&
+
+               git checkout -b remove_sub1 add_sub1 &&
                git revert HEAD &&
 
-               git checkout -b "modify_sub1" "add_sub1" &&
+               git checkout -b modify_sub1 add_sub1 &&
                git submodule update &&
                (
                        cd sub1 &&
@@ -67,33 +96,53 @@ create_lib_submodule_repo () {
                git add sub1 &&
                git commit -m "Modify sub1" &&
 
-               git checkout -b "replace_sub1_with_directory" "add_sub1" &&
+               git checkout -b add_nested_sub modify_sub1 &&
+               git -C sub1 checkout -b "add_nested_sub" &&
+               git -C sub1 submodule add --branch no_submodule ../submodule_update_sub2 sub2 &&
+               git -C sub1 commit -a -m "add a nested submodule" &&
+               git add sub1 &&
+               git commit -a -m "update submodule, that updates a nested submodule" &&
+               git checkout -b modify_sub1_recursively &&
+               git -C sub1 checkout -b modify_sub1_recursively &&
+               git -C sub1/sub2 checkout -b modify_sub1_recursively &&
+               echo change >sub1/sub2/file3 &&
+               git -C sub1/sub2 add file3 &&
+               git -C sub1/sub2 commit -m "make a change in nested sub" &&
+               git -C sub1 add sub2 &&
+               git -C sub1 commit -m "update nested sub" &&
+               git add sub1 &&
+               git commit -m "update sub1, that updates nested sub" &&
+               git -C sub1 push origin modify_sub1_recursively &&
+               git -C sub1/sub2 push origin modify_sub1_recursively &&
+               git -C sub1 submodule deinit -f --all &&
+
+               git checkout -b replace_sub1_with_directory add_sub1 &&
                git submodule update &&
-               (
-                       cd sub1 &&
-                       git checkout modifications
-               ) &&
+               git -C sub1 checkout modifications &&
                git rm --cached sub1 &&
                rm sub1/.git* &&
                git config -f .gitmodules --remove-section "submodule.sub1" &&
                git add .gitmodules sub1/* &&
                git commit -m "Replace sub1 with directory" &&
+
                git checkout -b replace_directory_with_sub1 &&
                git revert HEAD &&
 
-               git checkout -b "replace_sub1_with_file" "add_sub1" &&
+               git checkout -b replace_sub1_with_file add_sub1 &&
                git rm sub1 &&
                echo "content" >sub1 &&
                git add sub1 &&
                git commit -m "Replace sub1 with file" &&
+
                git checkout -b replace_file_with_sub1 &&
                git revert HEAD &&
 
-               git checkout -b "invalid_sub1" "add_sub1" &&
+               git checkout -b invalid_sub1 add_sub1 &&
                git update-index --cacheinfo 160000 0123456789012345678901234567890123456789 sub1 &&
                git commit -m "Invalid sub1 commit" &&
                git checkout -b valid_sub1 &&
                git revert HEAD &&
+
                git checkout master
        )
 }
@@ -133,6 +182,15 @@ test_git_directory_is_unchanged () {
        )
 }
 
+test_git_directory_exists() {
+       test -e ".git/modules/$1" &&
+       if test -f sub1/.git
+       then
+               # does core.worktree point at the right place?
+               test "$(git -C .git/modules/$1 config core.worktree)" = "../../../$1"
+       fi
+}
+
 # Helper function to be executed at the start of every test below, it sets up
 # the submodule repo if it doesn't exist and configures the most problematic
 # settings for diff.ignoreSubmodules.
@@ -154,15 +212,36 @@ reset_work_tree_to () {
                git checkout -f "$1" &&
                git status -u -s >actual &&
                test_must_be_empty actual &&
-               sha1=$(git rev-parse --revs-only HEAD:sub1) &&
-               if test -n "$sha1" &&
-                  test $(cd "sub1" && git rev-parse --verify "$sha1^{commit}")
+               hash=$(git rev-parse --revs-only HEAD:sub1) &&
+               if test -n "$hash" &&
+                  test $(cd "../submodule_update_sub1" && git rev-parse --verify "$hash^{commit}")
                then
                        git submodule update --init --recursive "sub1"
                fi
        )
 }
 
+reset_work_tree_to_interested () {
+       reset_work_tree_to $1 &&
+       # make the submodule git dirs available
+       if ! test -d submodule_update/.git/modules/sub1
+       then
+               mkdir -p submodule_update/.git/modules &&
+               cp -r submodule_update_repo/.git/modules/sub1 submodule_update/.git/modules/sub1
+               GIT_WORK_TREE=. git -C submodule_update/.git/modules/sub1 config --unset core.worktree
+       fi &&
+       if ! test -d submodule_update/.git/modules/sub1/modules/sub2
+       then
+               mkdir -p submodule_update/.git/modules/sub1/modules &&
+               cp -r submodule_update_repo/.git/modules/sub1/modules/sub2 submodule_update/.git/modules/sub1/modules/sub2
+               GIT_WORK_TREE=. git -C submodule_update/.git/modules/sub1/modules/sub2 config --unset core.worktree
+       fi &&
+       # indicate we are interested in the submodule:
+       git -C submodule_update config submodule.sub1.url "bogus" &&
+       # sub1 might not be checked out, so use the git dir
+       git -C submodule_update/.git/modules/sub1 config submodule.sub2.url "bogus"
+}
+
 # Test that the superproject contains the content according to commit "$1"
 # (the work tree must match the index for everything but submodules but the
 # index must exactly match the given commit including any submodule SHA-1s).
@@ -176,6 +255,11 @@ test_superproject_content () {
 # Test that the given submodule at path "$1" contains the content according
 # to the submodule commit recorded in the superproject's commit "$2"
 test_submodule_content () {
+       if test x"$1" = "x-C"
+       then
+               cd "$2"
+               shift; shift;
+       fi
        if test $# != 2
        then
                echo "test_submodule_content needs two arguments"
@@ -678,3 +762,459 @@ test_submodule_forced_switch () {
                )
        '
 }
+
+# Test that submodule contents are correctly updated when switching
+# between commits that change a submodule.
+# Test that the following transitions are correctly handled:
+# (These tests are also above in the case where we expect no change
+#  in the submodule)
+# - Updated submodule
+# - New submodule
+# - Removed submodule
+# - Directory containing tracked files replaced by submodule
+# - Submodule replaced by tracked files in directory
+# - Submodule replaced by tracked file with the same name
+# - tracked file replaced by submodule
+#
+# New test cases
+# - Removing a submodule with a git directory absorbs the submodules
+#   git directory first into the superproject.
+
+test_submodule_switch_recursing () {
+       command="$1"
+       RESULTDS=success
+       if test "$KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS" = 1
+       then
+               RESULTDS=failure
+       fi
+       RESULTOI=success
+       if test "$KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED" = 1
+       then
+               RESULTOI=failure
+       fi
+       ######################### Appearing submodule #########################
+       # Switching to a commit letting a submodule appear checks it out ...
+       test_expect_success "$command: added submodule is checked out" '
+               prolog &&
+               reset_work_tree_to_interested no_submodule &&
+               (
+                       cd submodule_update &&
+                       git branch -t add_sub1 origin/add_sub1 &&
+                       $command add_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+       # ... ignoring an empty existing directory ...
+       test_expect_success "$command: added submodule is checked out in empty dir" '
+               prolog &&
+               reset_work_tree_to_interested no_submodule &&
+               (
+                       cd submodule_update &&
+                       mkdir sub1 &&
+                       git branch -t add_sub1 origin/add_sub1 &&
+                       $command add_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+       # ... unless there is an untracked file in its place.
+       test_expect_success "$command: added submodule doesn't remove untracked file with same name" '
+               prolog &&
+               reset_work_tree_to_interested no_submodule &&
+               (
+                       cd submodule_update &&
+                       git branch -t add_sub1 origin/add_sub1 &&
+                       : >sub1 &&
+                       test_must_fail $command add_sub1 &&
+                       test_superproject_content origin/no_submodule &&
+                       test_must_be_empty sub1
+               )
+       '
+       # ... but an ignored file is fine.
+       test_expect_$RESULTOI "$command: added submodule removes an untracked ignored file" '
+               test_when_finished "rm submodule_update/.git/info/exclude" &&
+               prolog &&
+               reset_work_tree_to_interested no_submodule &&
+               (
+                       cd submodule_update &&
+                       git branch -t add_sub1 origin/add_sub1 &&
+                       : >sub1 &&
+                       echo sub1 >.git/info/exclude
+                       $command add_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+       # Replacing a tracked file with a submodule produces a checked out submodule
+       test_expect_success "$command: replace tracked file with submodule checks out submodule" '
+               prolog &&
+               reset_work_tree_to_interested replace_sub1_with_file &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_file_with_sub1 origin/replace_file_with_sub1 &&
+                       $command replace_file_with_sub1 &&
+                       test_superproject_content origin/replace_file_with_sub1 &&
+                       test_submodule_content sub1 origin/replace_file_with_sub1
+               )
+       '
+       # ... as does removing a directory with tracked files with a submodule.
+       test_expect_success "$command: replace directory with submodule" '
+               prolog &&
+               reset_work_tree_to_interested replace_sub1_with_directory &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_directory_with_sub1 origin/replace_directory_with_sub1 &&
+                       $command replace_directory_with_sub1 &&
+                       test_superproject_content origin/replace_directory_with_sub1 &&
+                       test_submodule_content sub1 origin/replace_directory_with_sub1
+               )
+       '
+
+       ######################## Disappearing submodule #######################
+       # Removing a submodule removes its work tree ...
+       test_expect_success "$command: removed submodule removes submodules working tree" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t remove_sub1 origin/remove_sub1 &&
+                       $command remove_sub1 &&
+                       test_superproject_content origin/remove_sub1 &&
+                       ! test -e sub1
+               )
+       '
+       # ... absorbing a .git directory along the way.
+       test_expect_success "$command: removed submodule absorbs submodules .git directory" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t remove_sub1 origin/remove_sub1 &&
+                       replace_gitfile_with_git_dir sub1 &&
+                       rm -rf .git/modules &&
+                       $command remove_sub1 &&
+                       test_superproject_content origin/remove_sub1 &&
+                       ! test -e sub1 &&
+                       test_git_directory_exists sub1
+               )
+       '
+       # Replacing a submodule with files in a directory must succeeds
+       # when the submodule is clean
+       test_expect_$RESULTDS "$command: replace submodule with a directory" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+                       $command replace_sub1_with_directory &&
+                       test_superproject_content origin/replace_sub1_with_directory &&
+                       test_submodule_content sub1 origin/replace_sub1_with_directory
+               )
+       '
+       # ... absorbing a .git directory.
+       test_expect_$RESULTDS "$command: replace submodule containing a .git directory with a directory must absorb the git dir" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+                       replace_gitfile_with_git_dir sub1 &&
+                       rm -rf .git/modules &&
+                       $command replace_sub1_with_directory &&
+                       test_superproject_content origin/replace_sub1_with_directory &&
+                       test_git_directory_exists sub1
+               )
+       '
+
+       # Replacing it with a file ...
+       test_expect_success "$command: replace submodule with a file" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+                       $command replace_sub1_with_file &&
+                       test_superproject_content origin/replace_sub1_with_file &&
+                       test -f sub1
+               )
+       '
+
+       # ... must check its local work tree for untracked files
+       test_expect_$RESULTDS "$command: replace submodule with a file must fail with untracked files" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+                       : >sub1/untrackedfile &&
+                       test_must_fail $command replace_sub1_with_file &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+
+       # ... and ignored files are ignored
+       test_expect_success "$command: replace submodule with a file works ignores ignored files in submodule" '
+               test_when_finished "rm submodule_update/.git/modules/sub1/info/exclude" &&
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+                       : >sub1/ignored &&
+                       $command replace_sub1_with_file &&
+                       test_superproject_content origin/replace_sub1_with_file &&
+                       test -f sub1
+               )
+       '
+
+       ########################## Modified submodule #########################
+       # Updating a submodule sha1 updates the submodule's work tree
+       test_expect_success "$command: modified submodule updates submodule work tree" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t modify_sub1 origin/modify_sub1 &&
+                       $command modify_sub1 &&
+                       test_superproject_content origin/modify_sub1 &&
+                       test_submodule_content sub1 origin/modify_sub1
+               )
+       '
+
+       # Updating a submodule to an invalid sha1 doesn't update the
+       # superproject nor the submodule's work tree.
+       test_expect_success "$command: updating to a missing submodule commit fails" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t invalid_sub1 origin/invalid_sub1 &&
+                       test_must_fail $command invalid_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+
+       # recursing deeper than one level doesn't work yet.
+       test_expect_success "$command: modified submodule updates submodule recursively" '
+               prolog &&
+               reset_work_tree_to_interested add_nested_sub &&
+               (
+                       cd submodule_update &&
+                       git branch -t modify_sub1_recursively origin/modify_sub1_recursively &&
+                       $command modify_sub1_recursively &&
+                       test_superproject_content origin/modify_sub1_recursively &&
+                       test_submodule_content sub1 origin/modify_sub1_recursively &&
+                       test_submodule_content -C sub1 sub2 origin/modify_sub1_recursively
+               )
+       '
+}
+
+# Test that submodule contents are updated when switching between commits
+# that change a submodule, but throwing away local changes in
+# the superproject as well as the submodule is allowed.
+test_submodule_forced_switch_recursing () {
+       command="$1"
+       RESULT=success
+       if test "$KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS" = 1
+       then
+               RESULT=failure
+       fi
+       ######################### Appearing submodule #########################
+       # Switching to a commit letting a submodule appear creates empty dir ...
+       test_expect_success "$command: added submodule is checked out" '
+               prolog &&
+               reset_work_tree_to_interested no_submodule &&
+               (
+                       cd submodule_update &&
+                       git branch -t add_sub1 origin/add_sub1 &&
+                       $command add_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+       # ... and doesn't care if it already exists ...
+       test_expect_success "$command: added submodule ignores empty directory" '
+               prolog &&
+               reset_work_tree_to_interested no_submodule &&
+               (
+                       cd submodule_update &&
+                       git branch -t add_sub1 origin/add_sub1 &&
+                       mkdir sub1 &&
+                       $command add_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+       # ... not caring about an untracked file either
+       test_expect_success "$command: added submodule does remove untracked unignored file with same name when forced" '
+               prolog &&
+               reset_work_tree_to_interested no_submodule &&
+               (
+                       cd submodule_update &&
+                       git branch -t add_sub1 origin/add_sub1 &&
+                       >sub1 &&
+                       $command add_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+       # Replacing a tracked file with a submodule checks out the submodule
+       test_expect_success "$command: replace tracked file with submodule populates the submodule" '
+               prolog &&
+               reset_work_tree_to_interested replace_sub1_with_file &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_file_with_sub1 origin/replace_file_with_sub1 &&
+                       $command replace_file_with_sub1 &&
+                       test_superproject_content origin/replace_file_with_sub1 &&
+                       test_submodule_content sub1 origin/replace_file_with_sub1
+               )
+       '
+       # ... as does removing a directory with tracked files with a
+       # submodule.
+       test_expect_success "$command: replace directory with submodule" '
+               prolog &&
+               reset_work_tree_to_interested replace_sub1_with_directory &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_directory_with_sub1 origin/replace_directory_with_sub1 &&
+                       $command replace_directory_with_sub1 &&
+                       test_superproject_content origin/replace_directory_with_sub1 &&
+                       test_submodule_content sub1 origin/replace_directory_with_sub1
+               )
+       '
+
+       ######################## Disappearing submodule #######################
+       # Removing a submodule doesn't remove its work tree ...
+       test_expect_success "$command: removed submodule leaves submodule directory and its contents in place" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t remove_sub1 origin/remove_sub1 &&
+                       $command remove_sub1 &&
+                       test_superproject_content origin/remove_sub1 &&
+                       ! test -e sub1
+               )
+       '
+       # ... especially when it contains a .git directory.
+       test_expect_success "$command: removed submodule leaves submodule containing a .git directory alone" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t remove_sub1 origin/remove_sub1 &&
+                       replace_gitfile_with_git_dir sub1 &&
+                       rm -rf .git/modules/sub1 &&
+                       $command remove_sub1 &&
+                       test_superproject_content origin/remove_sub1 &&
+                       test_git_directory_exists sub1 &&
+                       ! test -e sub1
+               )
+       '
+       # Replacing a submodule with files in a directory ...
+       test_expect_success "$command: replace submodule with a directory" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+                       $command replace_sub1_with_directory &&
+                       test_superproject_content origin/replace_sub1_with_directory
+               )
+       '
+       # ... absorbing a .git directory.
+       test_expect_success "$command: replace submodule containing a .git directory with a directory must fail" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+                       replace_gitfile_with_git_dir sub1 &&
+                       rm -rf .git/modules/sub1 &&
+                       $command replace_sub1_with_directory &&
+                       test_superproject_content origin/replace_sub1_with_directory &&
+                       test_submodule_content sub1 origin/modify_sub1
+                       test_git_directory_exists sub1
+               )
+       '
+       # Replacing it with a file
+       test_expect_success "$command: replace submodule with a file" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+                       $command replace_sub1_with_file &&
+                       test_superproject_content origin/replace_sub1_with_file
+               )
+       '
+
+       # ... even if the submodule contains ignored files
+       test_expect_success "$command: replace submodule with a file ignoring ignored files" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+                       : >sub1/expect &&
+                       $command replace_sub1_with_file &&
+                       test_superproject_content origin/replace_sub1_with_file
+               )
+       '
+
+       # ... but stops for untracked files that would be lost
+       test_expect_$RESULT "$command: replace submodule with a file stops for untracked files" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+                       : >sub1/untracked_file &&
+                       test_must_fail $command replace_sub1_with_file &&
+                       test_superproject_content origin/add_sub1 &&
+                       test -f sub1/untracked_file
+               )
+       '
+
+       ########################## Modified submodule #########################
+       # Updating a submodule sha1 updates the submodule's work tree
+       test_expect_success "$command: modified submodule updates submodule work tree" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t modify_sub1 origin/modify_sub1 &&
+                       $command modify_sub1 &&
+                       test_superproject_content origin/modify_sub1 &&
+                       test_submodule_content sub1 origin/modify_sub1
+               )
+       '
+       # Updating a submodule to an invalid sha1 doesn't update the
+       # submodule's work tree, subsequent update will fail
+       test_expect_success "$command: modified submodule does not update submodule work tree to invalid commit" '
+               prolog &&
+               reset_work_tree_to_interested add_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t invalid_sub1 origin/invalid_sub1 &&
+                       test_must_fail $command invalid_sub1 &&
+                       test_superproject_content origin/add_sub1 &&
+                       test_submodule_content sub1 origin/add_sub1
+               )
+       '
+       # Updating a submodule from an invalid sha1 updates
+       test_expect_success "$command: modified submodule does not update submodule work tree from invalid commit" '
+               prolog &&
+               reset_work_tree_to_interested invalid_sub1 &&
+               (
+                       cd submodule_update &&
+                       git branch -t valid_sub1 origin/valid_sub1 &&
+                       test_must_fail $command valid_sub1 &&
+                       test_superproject_content origin/invalid_sub1
+               )
+       '
+}
index 924b19dab4122a36112bd908a6252e754ecc531a..1dbc85b21407dcfc83d9dc6a56e8e0f21c748c0c 100755 (executable)
@@ -88,6 +88,7 @@ for my $t (@tests) {
 sub read_descr {
        my $name = shift;
        open my $fh, "<", $name or return "<error reading description>";
+       binmode $fh, ":utf8" or die "PANIC on binmode: $!";
        my $line = <$fh>;
        close $fh or die "cannot close $name";
        chomp $line;
@@ -147,6 +148,8 @@ for my $t (@subtests) {
 my $totalwidth = 3*@dirs+$descrlen;
 $totalwidth += $_ for (@colwidth);
 
+binmode STDOUT, ":utf8" or die "PANIC on binmode: $!";
+
 printf "%-${descrlen}s", "Test";
 for my $i (0..$#dirs) {
        my $d = $dirs[$i];
index cf8e1efce7cd29679c3ffdb2fa7d03489c38c1c9..002c21e52a6763ee14ac243b2b3a1af242fc2834 100755 (executable)
@@ -33,6 +33,8 @@ test_perf 'export a weird var' '
        test_export bar
 '
 
+test_perf 'éḿíẗ ńöń-ÁŚĆÍÍ ćḧáŕáćẗéŕś' 'true'
+
 test_expect_success 'test_export works with weird vars' '
        echo "$bar" &&
        test "$bar" = "weird # variable"
index 16359d51ae5a58ac629391b27d6b42acfc2ddb5e..ebf172401b0ff9c280ad14991323bd8aaf85b5e0 100755 (executable)
@@ -15,7 +15,8 @@ test_perf 'rev-list --all --objects' '
 '
 
 test_expect_success 'create new unreferenced commit' '
-       commit=$(git commit-tree HEAD^{tree} -p HEAD)
+       commit=$(git commit-tree HEAD^{tree} -p HEAD) &&
+       test_export commit
 '
 
 test_perf 'rev-list $commit --not --all' '
diff --git a/t/perf/p0003-delta-base-cache.sh b/t/perf/p0003-delta-base-cache.sh
new file mode 100755 (executable)
index 0000000..62369ea
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+test_description='Test operations that emphasize the delta base cache.
+
+We look at both "log --raw", which should put only trees into the delta cache,
+and "log -Sfoo --raw", which should look at both trees and blobs.
+
+Any effects will be emphasized if the test repository is fully packed (loose
+objects obviously do not use the delta base cache at all). It is also
+emphasized if the pack has long delta chains (e.g., as produced by "gc
+--aggressive"), though cache is still quite noticeable even with the default
+depth of 50.
+
+The setting of core.deltaBaseCacheLimit in the source repository is also
+relevant (depending on the size of your test repo), so be sure it is consistent
+between runs.
+'
+. ./perf-lib.sh
+
+test_perf_large_repo
+
+# puts mostly trees into the delta base cache
+test_perf 'log --raw' '
+       git log --raw >/dev/null
+'
+
+test_perf 'log -S' '
+       git log --raw -Sfoo >/dev/null
+'
+
+test_done
diff --git a/t/perf/p0004-lazy-init-name-hash.sh b/t/perf/p0004-lazy-init-name-hash.sh
new file mode 100755 (executable)
index 0000000..8de5a98
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+test_description='Tests multi-threaded lazy_init_name_hash'
+. ./perf-lib.sh
+
+test_perf_large_repo
+test_checkout_worktree
+
+test_expect_success 'verify both methods build the same hashmaps' '
+       test-lazy-init-name-hash --dump --single >out.single &&
+       if test-lazy-init-name-hash --dump --multi >out.multi
+       then
+               test_set_prereq REPO_BIG_ENOUGH_FOR_MULTI &&
+               sort <out.single >sorted.single &&
+               sort <out.multi >sorted.multi &&
+               test_cmp sorted.single sorted.multi
+       fi
+'
+
+test_expect_success 'calibrate' '
+       entries=$(wc -l <out.single) &&
+
+       case $entries in
+       ?) count=1000000 ;;
+       ??) count=100000 ;;
+       ???) count=10000 ;;
+       ????) count=1000 ;;
+       ?????) count=100 ;;
+       ??????) count=10 ;;
+       *) count=1 ;;
+       esac &&
+       export count &&
+
+       case $entries in
+       1) entries_desc="1 entry" ;;
+       *) entries_desc="$entries entries" ;;
+       esac &&
+
+       case $count in
+       1) count_desc="1 round" ;;
+       *) count_desc="$count rounds" ;;
+       esac &&
+
+       desc="$entries_desc, $count_desc" &&
+       export desc
+'
+
+test_perf "single-threaded, $desc" "
+       test-lazy-init-name-hash --single --count=$count
+"
+
+test_perf REPO_BIG_ENOUGH_FOR_MULTI "multi-threaded, $desc" "
+       test-lazy-init-name-hash --multi --count=$count
+"
+
+test_done
diff --git a/t/perf/p0005-status.sh b/t/perf/p0005-status.sh
new file mode 100755 (executable)
index 0000000..0b0aa98
--- /dev/null
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# This test measures the performance of various read-tree
+# and status operations.  It is primarily interested in
+# the algorithmic costs of index operations and recursive
+# tree traversal -- and NOT disk I/O on thousands of files.
+
+test_description="Tests performance of read-tree"
+
+. ./perf-lib.sh
+
+test_perf_default_repo
+
+# If the test repo was generated by ./repos/many-files.sh
+# then we know something about the data shape and branches,
+# so we can isolate testing to the ballast-related commits
+# and setup sparse-checkout so we don't have to populate
+# the ballast files and directories.
+#
+# Otherwise, we make some general assumptions about the
+# repo and consider the entire history of the current
+# branch to be the ballast.
+
+test_expect_success "setup repo" '
+       if git rev-parse --verify refs/heads/p0006-ballast^{commit}
+       then
+               echo Assuming synthetic repo from many-files.sh
+               git branch br_base            master
+               git branch br_ballast         p0006-ballast
+               git config --local core.sparsecheckout 1
+               cat >.git/info/sparse-checkout <<-EOF
+               /*
+               !ballast/*
+               EOF
+       else
+               echo Assuming non-synthetic repo...
+               git branch br_base            $(git rev-list HEAD | tail -n 1)
+               git branch br_ballast         HEAD
+       fi &&
+       git checkout -q br_ballast &&
+       nr_files=$(git ls-files | wc -l)
+'
+
+test_perf "read-tree status br_ballast ($nr_files)" '
+       git read-tree HEAD &&
+       git status
+'
+
+test_done
diff --git a/t/perf/p0006-read-tree-checkout.sh b/t/perf/p0006-read-tree-checkout.sh
new file mode 100755 (executable)
index 0000000..78cc23f
--- /dev/null
@@ -0,0 +1,67 @@
+#!/bin/sh
+#
+# This test measures the performance of various read-tree
+# and checkout operations.  It is primarily interested in
+# the algorithmic costs of index operations and recursive
+# tree traversal -- and NOT disk I/O on thousands of files.
+
+test_description="Tests performance of read-tree"
+
+. ./perf-lib.sh
+
+test_perf_default_repo
+
+# If the test repo was generated by ./repos/many-files.sh
+# then we know something about the data shape and branches,
+# so we can isolate testing to the ballast-related commits
+# and setup sparse-checkout so we don't have to populate
+# the ballast files and directories.
+#
+# Otherwise, we make some general assumptions about the
+# repo and consider the entire history of the current
+# branch to be the ballast.
+
+test_expect_success "setup repo" '
+       if git rev-parse --verify refs/heads/p0006-ballast^{commit}
+       then
+               echo Assuming synthetic repo from many-files.sh
+               git branch br_base            master
+               git branch br_ballast         p0006-ballast^
+               git branch br_ballast_alias   p0006-ballast^
+               git branch br_ballast_plus_1  p0006-ballast
+               git config --local core.sparsecheckout 1
+               cat >.git/info/sparse-checkout <<-EOF
+               /*
+               !ballast/*
+               EOF
+       else
+               echo Assuming non-synthetic repo...
+               git branch br_base            $(git rev-list HEAD | tail -n 1)
+               git branch br_ballast         HEAD^ || error "no ancestor commit from current head"
+               git branch br_ballast_alias   HEAD^
+               git branch br_ballast_plus_1  HEAD
+       fi &&
+       git checkout -q br_ballast &&
+       nr_files=$(git ls-files | wc -l)
+'
+
+test_perf "read-tree br_base br_ballast ($nr_files)" '
+       git read-tree -m br_base br_ballast -n
+'
+
+test_perf "switch between br_base br_ballast ($nr_files)" '
+       git checkout -q br_base &&
+       git checkout -q br_ballast
+'
+
+test_perf "switch between br_ballast br_ballast_plus_1 ($nr_files)" '
+       git checkout -q br_ballast_plus_1 &&
+       git checkout -q br_ballast
+'
+
+test_perf "switch between aliases ($nr_files)" '
+       git checkout -q br_ballast_alias &&
+       git checkout -q br_ballast
+'
+
+test_done
diff --git a/t/perf/p0071-sort.sh b/t/perf/p0071-sort.sh
new file mode 100755 (executable)
index 0000000..7c9a35a
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+test_description='Basic sort performance tests'
+. ./perf-lib.sh
+
+test_perf_default_repo
+
+test_expect_success 'setup' '
+       git ls-files --stage "*.[ch]" "*.sh" |
+       cut -f2 -d" " |
+       git cat-file --batch >unsorted
+'
+
+test_perf 'sort(1)' '
+       sort <unsorted >expect
+'
+
+test_perf 'string_list_sort()' '
+       test-string-list sort <unsorted >actual
+'
+
+test_expect_success 'string_list_sort() sorts like sort(1)' '
+       test_cmp_bin expect actual
+'
+
+test_done
index 5ee9211f988dce1f334d796623feccda85641bbe..99bdb16c8583a98b0c33cddadabb85f47b7d5c41 100755 (executable)
@@ -13,6 +13,13 @@ test_expect_success 'repack' '
        export PACK
 '
 
+test_expect_success 'create target repositories' '
+       for repo in t1 t2 t3 t4 t5 t6
+       do
+               git init --bare $repo
+       done
+'
+
 test_perf 'index-pack 0 threads' '
        GIT_DIR=t1 git index-pack --threads=1 --stdin < $PACK
 '
index de2a224a36b728b695c721df1dba16c608bbbb12..bb91dbb173dd01bfbfc11f867f0fcfc355db6822 100755 (executable)
@@ -32,6 +32,14 @@ test_perf 'simulated fetch' '
        } | git pack-objects --revs --stdout >/dev/null
 '
 
+test_perf 'pack to file' '
+       git pack-objects --all pack1 </dev/null >/dev/null
+'
+
+test_perf 'pack to file (bitmap)' '
+       git pack-objects --use-bitmap-index --all pack1b </dev/null >/dev/null
+'
+
 test_expect_success 'create partial bitmap state' '
        # pick a commit to represent the repo tip in the past
        cutoff=$(git rev-list HEAD~100 -1) &&
@@ -53,8 +61,12 @@ test_expect_success 'create partial bitmap state' '
        git update-ref HEAD $orig_tip
 '
 
-test_perf 'partial bitmap' '
+test_perf 'clone (partial bitmap)' '
        git pack-objects --stdout --all </dev/null >/dev/null
 '
 
+test_perf 'pack to file (partial bitmap)' '
+       git pack-objects --use-bitmap-index --all pack2b </dev/null >/dev/null
+'
+
 test_done
index 15ee5d1d53391f38017cfd26bd23d94082a47365..b029586ccb2c8b3fd746a6c0bbdaca3966d42fa7 100755 (executable)
@@ -16,4 +16,9 @@ test_perf 'noop filter' '
        git filter-branch -f base..HEAD
 '
 
+test_perf 'noop prune-empty' '
+       git checkout --detach tip &&
+       git filter-branch -f --prune-empty base..HEAD
+'
+
 test_done
index 46f08ee0870ffd2b1e0eb7d159b159d25ef61ffb..ab4b8b06ae50c5e4ee7e128ded55dea7dddf7865 100644 (file)
@@ -83,7 +83,7 @@ test_perf_create_repo_from () {
        error "bug in the test script: not 2 parameters to test-create-repo"
        repo="$1"
        source="$2"
-       source_git="$(git -C "$source" rev-parse --git-dir)"
+       source_git="$("$MODERN_GIT" -C "$source" rev-parse --git-dir)"
        objects_dir="$("$MODERN_GIT" -C "$source" rev-parse --git-path objects)"
        mkdir -p "$repo/.git"
        (
@@ -102,7 +102,7 @@ test_perf_create_repo_from () {
        ) &&
        (
                cd "$repo" &&
-               git init -q && {
+               "$MODERN_GIT" init -q && {
                        test_have_prereq SYMLINKS ||
                        git config core.symlinks false
                } &&
diff --git a/t/perf/repos/.gitignore b/t/perf/repos/.gitignore
new file mode 100644 (file)
index 0000000..72e3dc3
--- /dev/null
@@ -0,0 +1 @@
+gen-*/
diff --git a/t/perf/repos/inflate-repo.sh b/t/perf/repos/inflate-repo.sh
new file mode 100755 (executable)
index 0000000..fcfc992
--- /dev/null
@@ -0,0 +1,85 @@
+#!/bin/sh
+# Inflate the size of an EXISTING repo.
+#
+# This script should be run inside the worktree of a TEST repo.
+# It will use the contents of the current HEAD to generate a
+# commit containing copies of the current worktree such that the
+# total size of the commit has at least <target_size> files.
+#
+# Usage: [-t target_size] [-b branch_name]
+
+set -e
+
+target_size=10000
+branch_name=p0006-ballast
+ballast=ballast
+
+while test "$#" -ne 0
+do
+    case "$1" in
+       -b)
+           shift;
+           test "$#" -ne 0 || { echo 'error: -b requires an argument' >&2; exit 1; }
+           branch_name=$1;
+           shift ;;
+       -t)
+           shift;
+           test "$#" -ne 0 || { echo 'error: -t requires an argument' >&2; exit 1; }
+           target_size=$1;
+           shift ;;
+       *)
+           echo "error: unknown option '$1'" >&2; exit 1 ;;
+    esac
+done
+
+git ls-tree -r HEAD >GEN_src_list
+nr_src_files=$(cat GEN_src_list | wc -l)
+
+src_branch=$(git symbolic-ref --short HEAD)
+
+echo "Branch $src_branch initially has $nr_src_files files."
+
+if test $target_size -le $nr_src_files
+then
+    echo "Repository already exceeds target size $target_size."
+    rm GEN_src_list
+    exit 1
+fi
+
+# Create well-known branch and add 1 file change to start
+# if off before the ballast.
+git checkout -b $branch_name HEAD
+echo "$target_size" > inflate-repo.params
+git add inflate-repo.params
+git commit -q -m params
+
+# Create ballast for in our branch.
+copy=1
+nr_files=$nr_src_files
+while test $nr_files -lt $target_size
+do
+    sed -e "s| |       $ballast/$copy/|" <GEN_src_list |
+       git update-index --index-info
+
+    nr_files=$(expr $nr_files + $nr_src_files)
+    copy=$(expr $copy + 1)
+done
+rm GEN_src_list
+git commit -q -m "ballast"
+
+# Modify 1 file and commit.
+echo "$target_size" >> inflate-repo.params
+git add inflate-repo.params
+git commit -q -m "ballast plus 1"
+
+nr_files=$(git ls-files | wc -l)
+
+# Checkout master to put repo in canonical state (because
+# the perf test may need to clone and enable sparse-checkout
+# before attempting to checkout a commit with the ballast
+# (because it may contain 100K directories and 1M files)).
+git checkout $src_branch
+
+echo "Repository inflated. Branch $branch_name has $nr_files files."
+
+exit 0
diff --git a/t/perf/repos/many-files.sh b/t/perf/repos/many-files.sh
new file mode 100755 (executable)
index 0000000..28720e4
--- /dev/null
@@ -0,0 +1,110 @@
+#!/bin/sh
+# Generate test data repository using the given parameters.
+# When omitted, we create "gen-many-files-d-w-f.git".
+#
+# Usage: [-r repo] [-d depth] [-w width] [-f files]
+#
+# -r repo: path to the new repo to be generated
+# -d depth: the depth of sub-directories
+# -w width: the number of sub-directories at each level
+# -f files: the number of files created in each directory
+#
+# Note that all files will have the same SHA-1 and each
+# directory at a level will have the same SHA-1, so we
+# will potentially have a large index, but not a large
+# ODB.
+#
+# Ballast will be created under "ballast/".
+
+EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+
+set -e
+
+# (5, 10, 9) will create 999,999 ballast files.
+# (4, 10, 9) will create  99,999 ballast files.
+depth=5
+width=10
+files=9
+
+while test "$#" -ne 0
+do
+    case "$1" in
+       -r)
+           shift;
+           test "$#" -ne 0 || { echo 'error: -r requires an argument' >&2; exit 1; }
+           repo=$1;
+           shift ;;
+       -d)
+           shift;
+           test "$#" -ne 0 || { echo 'error: -d requires an argument' >&2; exit 1; }
+           depth=$1;
+           shift ;;
+       -w)
+           shift;
+           test "$#" -ne 0 || { echo 'error: -w requires an argument' >&2; exit 1; }
+           width=$1;
+           shift ;;
+       -f)
+           shift;
+           test "$#" -ne 0 || { echo 'error: -f requires an argument' >&2; exit 1; }
+           files=$1;
+           shift ;;
+       *)
+           echo "error: unknown option '$1'" >&2; exit 1 ;;
+       esac
+done
+
+# Inflate the index with thousands of empty files.
+# usage: dir depth width files
+fill_index() {
+       awk -v arg_dir=$1 -v arg_depth=$2 -v arg_width=$3 -v arg_files=$4 '
+               function make_paths(dir, depth, width, files, f, w) {
+                       for (f = 1; f <= files; f++) {
+                               print dir "/file" f
+                       }
+                       if (depth > 0) {
+                               for (w = 1; w <= width; w++) {
+                                       make_paths(dir "/dir" w, depth - 1, width, files)
+                               }
+                       }
+               }
+               END { make_paths(arg_dir, arg_depth, arg_width, arg_files) }
+               ' </dev/null |
+       sed "s/^/100644 $EMPTY_BLOB     /" |
+       git update-index --index-info
+       return 0
+}
+
+[ -z "$repo" ] && repo=gen-many-files-$depth.$width.$files.git
+
+mkdir $repo
+cd $repo
+git init .
+
+# Create an initial commit just to define master.
+touch many-files.empty
+echo "$depth $width $files" >many-files.params
+git add many-files.*
+git commit -q -m params
+
+# Create ballast for p0006 based upon the given params and
+# inflate the index with thousands of empty files and commit.
+git checkout -b p0006-ballast
+fill_index "ballast" $depth $width $files
+git commit -q -m "ballast"
+
+nr_files=$(git ls-files | wc -l)
+
+# Modify 1 file and commit.
+echo "$depth $width $files" >>many-files.params
+git add many-files.params
+git commit -q -m "ballast plus 1"
+
+# Checkout master to put repo in canonical state (because
+# the perf test may need to clone and enable sparse-checkout
+# before attempting to checkout a commit with the ballast
+# (because it may contain 100K directories and 1M files)).
+git checkout master
+
+echo "Repository "$repo" ($depth, $width, $files) created.  Ballast $nr_files."
+exit 0
index e8adedadfdca8549b3c4f8f8a19d383a7611f4ad..c788d713ae927007866b5b73920de2674f816207 100755 (executable)
@@ -63,6 +63,9 @@ run_dirs_helper () {
                unset GIT_TEST_INSTALLED
        else
                GIT_TEST_INSTALLED="$mydir/bin-wrappers"
+               # Older versions of git lacked bin-wrappers; fallback to the
+               # files in the root.
+               test -d "$GIT_TEST_INSTALLED" || GIT_TEST_INSTALLED=$mydir
                export GIT_TEST_INSTALLED
        fi
        run_one_dir "$@"
index a6fdd5ef3a66f06f5b4a787ca8ad8db2ab4da96f..c4814d248fc96e7dc0177b6987baa18853c6213c 100755 (executable)
@@ -258,6 +258,9 @@ test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shar
        (
                # Leading directories should honor umask while
                # the repository itself should follow "shared"
+               mkdir newdir &&
+               # Remove a default ACL if possible.
+               (setfacl -k newdir 2>/dev/null || true) &&
                umask 002 &&
                git init --bare --shared=0660 newdir/a/b/c &&
                test_path_is_dir newdir/a/b/c/refs &&
@@ -312,6 +315,20 @@ test_expect_success 'init with separate gitdir' '
        test_path_is_dir realgitdir/refs
 '
 
+test_expect_success 'init in long base path' '
+       # exceed initial buffer size of strbuf_getcwd()
+       component=123456789abcdef &&
+       test_when_finished "chmod 0700 $component; rm -rf $component" &&
+       p31=$component/$component &&
+       p127=$p31/$p31/$p31/$p31 &&
+       mkdir -p $p127 &&
+       chmod 0111 $component &&
+       (
+               cd $p127 &&
+               git init newdir
+       )
+'
+
 test_expect_success 're-init on .git file' '
        ( cd newdir && git init )
 '
@@ -384,4 +401,30 @@ test_expect_success MINGW 'bare git dir not hidden' '
        ! is_hidden newdir
 '
 
+test_expect_success 'remote init from does not use config from cwd' '
+       rm -rf newdir &&
+       test_config core.logallrefupdates true &&
+       git init newdir &&
+       echo true >expect &&
+       git -C newdir config --bool core.logallrefupdates >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 're-init from a linked worktree' '
+       git init main-worktree &&
+       (
+               cd main-worktree &&
+               test_commit first &&
+               git worktree add ../linked-worktree &&
+               mv .git/info/exclude expected-exclude &&
+               cp .git/config expected-config &&
+               find .git/worktrees -print | sort >expected &&
+               git -C ../linked-worktree init &&
+               test_cmp expected-exclude .git/info/exclude &&
+               test_cmp expected-config .git/config &&
+               find .git/worktrees -print | sort >actual &&
+               test_cmp expected actual
+       )
+'
+
 test_done
index f0fbb425545019a6275a347a5826f6ba2977d394..f19ae4f8ccddacee84e04fa50663672f5f6174c1 100755 (executable)
@@ -13,10 +13,31 @@ attr_check () {
        test_line_count = 0 err
 }
 
+attr_check_quote () {
+
+       path="$1"
+       quoted_path="$2"
+       expect="$3"
+
+       git check-attr test -- "$path" >actual &&
+       echo "\"$quoted_path\": test: $expect" >expect &&
+       test_cmp expect actual
+
+}
+
+test_expect_success 'open-quoted pathname' '
+       echo "\"a test=a" >.gitattributes &&
+       test_must_fail attr_check a a
+'
+
+
 test_expect_success 'setup' '
        mkdir -p a/b/d a/c b &&
        (
                echo "[attr]notest !test"
+               echo "\" d \"   test=d"
+               echo " e        test=e"
+               echo " e\"      test=e"
                echo "f test=f"
                echo "a/i test=a/i"
                echo "onoff test -test"
@@ -69,6 +90,11 @@ test_expect_success 'command line checks' '
 '
 
 test_expect_success 'attribute test' '
+
+       attr_check " d " d &&
+       attr_check e e &&
+       attr_check_quote e\" e\\\" e &&
+
        attr_check f f &&
        attr_check a/f f &&
        attr_check a/c/f f &&
diff --git a/t/t0012-help.sh b/t/t0012-help.sh
new file mode 100755 (executable)
index 0000000..8faba2e
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+test_description='help'
+
+. ./test-lib.sh
+
+configure_help () {
+       test_config help.format html &&
+
+       # Unless the path has "://" in it, Git tries to make sure
+       # the documentation directory locally exists. Avoid it as
+       # we are only interested in seeing an attempt to correctly
+       # invoke a help browser in this test.
+       test_config help.htmlpath test://html &&
+
+       # Name a custom browser
+       test_config browser.test.cmd ./test-browser &&
+       test_config help.browser test
+}
+
+test_expect_success "setup" '
+       # Just write out which page gets requested
+       write_script test-browser <<-\EOF
+       echo "$*" >test-browser.log
+       EOF
+'
+
+test_expect_success "works for commands and guides by default" '
+       configure_help &&
+       git help status &&
+       echo "test://html/git-status.html" >expect &&
+       test_cmp expect test-browser.log &&
+       git help revisions &&
+       echo "test://html/gitrevisions.html" >expect &&
+       test_cmp expect test-browser.log
+'
+
+test_expect_success "--exclude-guides does not work for guides" '
+       >test-browser.log &&
+       test_must_fail git help --exclude-guides revisions &&
+       test_must_be_empty test-browser.log
+'
+
+test_expect_success "--help does not work for guides" "
+       cat <<-EOF >expect &&
+               git: 'revisions' is not a git command. See 'git --help'.
+       EOF
+       test_must_fail git revisions --help 2>actual &&
+       test_i18ncmp expect actual
+"
+
+test_done
diff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh
new file mode 100755 (executable)
index 0000000..6d655cb
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+test_description='test sha1 collision detection'
+. ./test-lib.sh
+TEST_DATA="$TEST_DIRECTORY/t0013"
+
+if test -z "$DC_SHA1"
+then
+       skip_all='skipping sha1 collision tests, DC_SHA1 not set'
+       test_done
+fi
+
+test_expect_success 'test-sha1 detects shattered pdf' '
+       test_must_fail test-sha1 <"$TEST_DATA/shattered-1.pdf" 2>err &&
+       test_i18ngrep collision err &&
+       grep 38762cf7f55934b34d179ae6a4c80cadccbb7f0a err
+'
+
+test_done
diff --git a/t/t0013/shattered-1.pdf b/t/t0013/shattered-1.pdf
new file mode 100644 (file)
index 0000000..ba9aaa1
Binary files /dev/null and b/t/t0013/shattered-1.pdf differ
index f94120a8940a37c48fbb97abd85002da95e3abe9..71350e0657986d7b3e38801d82058c53f9fd23d0 100755 (executable)
@@ -83,7 +83,11 @@ test_expect_success 'safecrlf: print warning only once' '
        git add doublewarn &&
        git commit -m "nowarn" &&
        for w in Oh here is CRLFQ in text; do echo $w; done | q_to_cr >doublewarn &&
-       test $(git add doublewarn 2>&1 | grep "CRLF will be replaced by LF" | wc -l) = 1
+       git add doublewarn 2>err &&
+       if test_have_prereq C_LOCALE_OUTPUT
+       then
+               test $(grep "CRLF will be replaced by LF" err | wc -l) = 1
+       fi
 '
 
 
index e799e5954437e08df4a013f9796c5ec5a9bb077d..161f5604464d2f963e60af54eedea3f91be041fa 100755 (executable)
@@ -4,13 +4,72 @@ test_description='blob conversion via gitattributes'
 
 . ./test-lib.sh
 
-cat <<EOF >rot13.sh
-#!$SHELL_PATH
+TEST_ROOT="$PWD"
+PATH=$TEST_ROOT:$PATH
+
+write_script <<\EOF "$TEST_ROOT/rot13.sh"
 tr \
   'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' \
   'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM'
 EOF
-chmod +x rot13.sh
+
+write_script rot13-filter.pl "$PERL_PATH" \
+       <"$TEST_DIRECTORY"/t0021/rot13-filter.pl
+
+generate_random_characters () {
+       LEN=$1
+       NAME=$2
+       test-genrandom some-seed $LEN |
+               perl -pe "s/./chr((ord($&) % 26) + ord('a'))/sge" >"$TEST_ROOT/$NAME"
+}
+
+file_size () {
+       perl -e 'print -s $ARGV[0]' "$1"
+}
+
+filter_git () {
+       rm -f rot13-filter.log &&
+       git "$@"
+}
+
+# Compare two files and ensure that `clean` and `smudge` respectively are
+# called at least once if specified in the `expect` file. The actual
+# invocation count is not relevant because their number can vary.
+# c.f. http://public-inbox.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/
+test_cmp_count () {
+       expect=$1
+       actual=$2
+       for FILE in "$expect" "$actual"
+       do
+               sort "$FILE" | uniq -c |
+               sed -e "s/^ *[0-9][0-9]*[       ]*IN: /x IN: /" >"$FILE.tmp" &&
+               mv "$FILE.tmp" "$FILE" || return
+       done &&
+       test_cmp "$expect" "$actual"
+}
+
+# Compare two files but exclude all `clean` invocations because Git can
+# call `clean` zero or more times.
+# c.f. http://public-inbox.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/
+test_cmp_exclude_clean () {
+       expect=$1
+       actual=$2
+       for FILE in "$expect" "$actual"
+       do
+               grep -v "IN: clean" "$FILE" >"$FILE.tmp" &&
+               mv "$FILE.tmp" "$FILE"
+       done &&
+       test_cmp "$expect" "$actual"
+}
+
+# Check that the contents of two files are equal and that their rot13 version
+# is equal to the committed content.
+test_cmp_committed_rot13 () {
+       test_cmp "$1" "$2" &&
+       rot13.sh <"$1" >expected &&
+       git cat-file blob :"$2" >actual &&
+       test_cmp expected actual
+}
 
 test_expect_success setup '
        git config filter.rot13.smudge ./rot13.sh &&
@@ -31,15 +90,18 @@ test_expect_success setup '
        cat test >test.i &&
        git add test test.t test.i &&
        rm -f test test.t test.i &&
-       git checkout -- test test.t test.i
+       git checkout -- test test.t test.i &&
+
+       echo "content-test2" >test2.o &&
+       echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x=.o"
 '
 
 script='s/^\$Id: \([0-9a-f]*\) \$/\1/p'
 
 test_expect_success check '
 
-       cmp test.o test &&
-       cmp test.o test.t &&
+       test_cmp test.o test &&
+       test_cmp test.o test.t &&
 
        # ident should be stripped in the repository
        git diff --raw --exit-code :test :test.i &&
@@ -47,10 +109,10 @@ test_expect_success check '
        embedded=$(sed -ne "$script" test.i) &&
        test "z$id" = "z$embedded" &&
 
-       git cat-file blob :test.t > test.r &&
+       git cat-file blob :test.t >test.r &&
 
-       ./rot13.sh < test.o > test.t &&
-       cmp test.r test.t
+       ./rot13.sh <test.o >test.t &&
+       test_cmp test.r test.t
 '
 
 # If an expanded ident ever gets into the repository, we want to make sure that
@@ -130,7 +192,7 @@ test_expect_success 'filter shell-escaped filenames' '
 
        # delete the files and check them out again, using a smudge filter
        # that will count the args and echo the command-line back to us
-       git config filter.argc.smudge "sh ./argc.sh %f" &&
+       test_config filter.argc.smudge "sh ./argc.sh %f" &&
        rm "$normal" "$special" &&
        git checkout -- "$normal" "$special" &&
 
@@ -141,7 +203,7 @@ test_expect_success 'filter shell-escaped filenames' '
        test_cmp expect "$special" &&
 
        # do the same thing, but with more args in the filter expression
-       git config filter.argc.smudge "sh ./argc.sh %f --my-extra-arg" &&
+       test_config filter.argc.smudge "sh ./argc.sh %f --my-extra-arg" &&
        rm "$normal" "$special" &&
        git checkout -- "$normal" "$special" &&
 
@@ -154,9 +216,9 @@ test_expect_success 'filter shell-escaped filenames' '
 '
 
 test_expect_success 'required filter should filter data' '
-       git config filter.required.smudge ./rot13.sh &&
-       git config filter.required.clean ./rot13.sh &&
-       git config filter.required.required true &&
+       test_config filter.required.smudge ./rot13.sh &&
+       test_config filter.required.clean ./rot13.sh &&
+       test_config filter.required.required true &&
 
        echo "*.r filter=required" >.gitattributes &&
 
@@ -165,17 +227,17 @@ test_expect_success 'required filter should filter data' '
 
        rm -f test.r &&
        git checkout -- test.r &&
-       cmp test.o test.r &&
+       test_cmp test.o test.r &&
 
        ./rot13.sh <test.o >expected &&
        git cat-file blob :test.r >actual &&
-       cmp expected actual
+       test_cmp expected actual
 '
 
 test_expect_success 'required filter smudge failure' '
-       git config filter.failsmudge.smudge false &&
-       git config filter.failsmudge.clean cat &&
-       git config filter.failsmudge.required true &&
+       test_config filter.failsmudge.smudge false &&
+       test_config filter.failsmudge.clean cat &&
+       test_config filter.failsmudge.required true &&
 
        echo "*.fs filter=failsmudge" >.gitattributes &&
 
@@ -186,9 +248,9 @@ test_expect_success 'required filter smudge failure' '
 '
 
 test_expect_success 'required filter clean failure' '
-       git config filter.failclean.smudge cat &&
-       git config filter.failclean.clean false &&
-       git config filter.failclean.required true &&
+       test_config filter.failclean.smudge cat &&
+       test_config filter.failclean.clean false &&
+       test_config filter.failclean.required true &&
 
        echo "*.fc filter=failclean" >.gitattributes &&
 
@@ -197,8 +259,8 @@ test_expect_success 'required filter clean failure' '
 '
 
 test_expect_success 'filtering large input to small output should use little memory' '
-       git config filter.devnull.clean "cat >/dev/null" &&
-       git config filter.devnull.required true &&
+       test_config filter.devnull.clean "cat >/dev/null" &&
+       test_config filter.devnull.required true &&
        for i in $(test_seq 1 30); do printf "%1048576d" 1; done >30MB &&
        echo "30MB filter=devnull" >.gitattributes &&
        GIT_MMAP_LIMIT=1m GIT_ALLOC_LIMIT=1m git add 30MB
@@ -207,7 +269,7 @@ test_expect_success 'filtering large input to small output should use little mem
 test_expect_success 'filter that does not read is fine' '
        test-genrandom foo $((128 * 1024 + 1)) >big &&
        echo "big filter=epipe" >.gitattributes &&
-       git config filter.epipe.clean "echo xyzzy" &&
+       test_config filter.epipe.clean "echo xyzzy" &&
        git add big &&
        git cat-file blob :big >actual &&
        echo xyzzy >expect &&
@@ -215,20 +277,20 @@ test_expect_success 'filter that does not read is fine' '
 '
 
 test_expect_success EXPENSIVE 'filter large file' '
-       git config filter.largefile.smudge cat &&
-       git config filter.largefile.clean cat &&
+       test_config filter.largefile.smudge cat &&
+       test_config filter.largefile.clean cat &&
        for i in $(test_seq 1 2048); do printf "%1048576d" 1; done >2GB &&
        echo "2GB filter=largefile" >.gitattributes &&
        git add 2GB 2>err &&
-       ! test -s err &&
+       test_must_be_empty err &&
        rm -f 2GB &&
        git checkout -- 2GB 2>err &&
-       ! test -s err
+       test_must_be_empty err
 '
 
 test_expect_success "filter: clean empty file" '
-       git config filter.in-repo-header.clean  "echo cleaned && cat" &&
-       git config filter.in-repo-header.smudge "sed 1d" &&
+       test_config filter.in-repo-header.clean  "echo cleaned && cat" &&
+       test_config filter.in-repo-header.smudge "sed 1d" &&
 
        echo "empty-in-worktree    filter=in-repo-header" >>.gitattributes &&
        >empty-in-worktree &&
@@ -240,8 +302,8 @@ test_expect_success "filter: clean empty file" '
 '
 
 test_expect_success "filter: smudge empty file" '
-       git config filter.empty-in-repo.clean "cat >/dev/null" &&
-       git config filter.empty-in-repo.smudge "echo smudged && cat" &&
+       test_config filter.empty-in-repo.clean "cat >/dev/null" &&
+       test_config filter.empty-in-repo.smudge "echo smudged && cat" &&
 
        echo "empty-in-repo filter=empty-in-repo" >>.gitattributes &&
        echo dead data walking >empty-in-repo &&
@@ -279,4 +341,364 @@ test_expect_success 'diff does not reuse worktree files that need cleaning' '
        test_line_count = 0 count
 '
 
+test_expect_success PERL 'required process filter should filter data' '
+       test_config_global filter.protocol.process "rot13-filter.pl clean smudge" &&
+       test_config_global filter.protocol.required true &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+               git add . &&
+               git commit -m "test commit 1" &&
+               git branch empty-branch &&
+
+               cp "$TEST_ROOT/test.o" test.r &&
+               cp "$TEST_ROOT/test2.o" test2.r &&
+               mkdir testsubdir &&
+               cp "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r" &&
+               >test4-empty.r &&
+
+               S=$(file_size test.r) &&
+               S2=$(file_size test2.r) &&
+               S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x=.r") &&
+
+               filter_git add . &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: clean test.r $S [OK] -- OUT: $S . [OK]
+                       IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
+                       IN: clean test4-empty.r 0 [OK] -- OUT: 0  [OK]
+                       IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
+                       STOP
+               EOF
+               test_cmp_count expected.log rot13-filter.log &&
+
+               git commit -m "test commit 2" &&
+               rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x=.r" &&
+
+               filter_git checkout --quiet --no-progress . &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log &&
+
+               filter_git checkout --quiet --no-progress empty-branch &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: clean test.r $S [OK] -- OUT: $S . [OK]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log &&
+
+               filter_git checkout --quiet --no-progress master &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge test.r $S [OK] -- OUT: $S . [OK]
+                       IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
+                       IN: smudge test4-empty.r 0 [OK] -- OUT: 0  [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log &&
+
+               test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r &&
+               test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r &&
+               test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r"
+       )
+'
+
+test_expect_success PERL 'required process filter takes precedence' '
+       test_config_global filter.protocol.clean false &&
+       test_config_global filter.protocol.process "rot13-filter.pl clean" &&
+       test_config_global filter.protocol.required true &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+               cp "$TEST_ROOT/test.o" test.r &&
+               S=$(file_size test.r) &&
+
+               # Check that the process filter is invoked here
+               filter_git add . &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: clean test.r $S [OK] -- OUT: $S . [OK]
+                       STOP
+               EOF
+               test_cmp_count expected.log rot13-filter.log
+       )
+'
+
+test_expect_success PERL 'required process filter should be used only for "clean" operation only' '
+       test_config_global filter.protocol.process "rot13-filter.pl clean" &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+               cp "$TEST_ROOT/test.o" test.r &&
+               S=$(file_size test.r) &&
+
+               filter_git add . &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: clean test.r $S [OK] -- OUT: $S . [OK]
+                       STOP
+               EOF
+               test_cmp_count expected.log rot13-filter.log &&
+
+               rm test.r &&
+
+               filter_git checkout --quiet --no-progress . &&
+               # If the filter would be used for "smudge", too, we would see
+               # "IN: smudge test.r 57 [OK] -- OUT: 57 . [OK]" here
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log
+       )
+'
+
+test_expect_success PERL 'required process filter should process multiple packets' '
+       test_config_global filter.protocol.process "rot13-filter.pl clean smudge" &&
+       test_config_global filter.protocol.required true &&
+
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               # Generate data requiring 1, 2, 3 packets
+               S=65516 && # PKTLINE_DATA_MAXLEN -> Maximal size of a packet
+               generate_random_characters $(($S    )) 1pkt_1__.file &&
+               generate_random_characters $(($S  +1)) 2pkt_1+1.file &&
+               generate_random_characters $(($S*2-1)) 2pkt_2-1.file &&
+               generate_random_characters $(($S*2  )) 2pkt_2__.file &&
+               generate_random_characters $(($S*2+1)) 3pkt_2+1.file &&
+
+               for FILE in "$TEST_ROOT"/*.file
+               do
+                       cp "$FILE" . &&
+                       rot13.sh <"$FILE" >"$FILE.rot13"
+               done &&
+
+               echo "*.file filter=protocol" >.gitattributes &&
+               filter_git add *.file .gitattributes &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: clean 1pkt_1__.file $(($S    )) [OK] -- OUT: $(($S    )) . [OK]
+                       IN: clean 2pkt_1+1.file $(($S  +1)) [OK] -- OUT: $(($S  +1)) .. [OK]
+                       IN: clean 2pkt_2-1.file $(($S*2-1)) [OK] -- OUT: $(($S*2-1)) .. [OK]
+                       IN: clean 2pkt_2__.file $(($S*2  )) [OK] -- OUT: $(($S*2  )) .. [OK]
+                       IN: clean 3pkt_2+1.file $(($S*2+1)) [OK] -- OUT: $(($S*2+1)) ... [OK]
+                       STOP
+               EOF
+               test_cmp_count expected.log rot13-filter.log &&
+
+               rm -f *.file &&
+
+               filter_git checkout --quiet --no-progress -- *.file &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge 1pkt_1__.file $(($S    )) [OK] -- OUT: $(($S    )) . [OK]
+                       IN: smudge 2pkt_1+1.file $(($S  +1)) [OK] -- OUT: $(($S  +1)) .. [OK]
+                       IN: smudge 2pkt_2-1.file $(($S*2-1)) [OK] -- OUT: $(($S*2-1)) .. [OK]
+                       IN: smudge 2pkt_2__.file $(($S*2  )) [OK] -- OUT: $(($S*2  )) .. [OK]
+                       IN: smudge 3pkt_2+1.file $(($S*2+1)) [OK] -- OUT: $(($S*2+1)) ... [OK]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log &&
+
+               for FILE in *.file
+               do
+                       test_cmp_committed_rot13 "$TEST_ROOT/$FILE" $FILE
+               done
+       )
+'
+
+test_expect_success PERL 'required process filter with clean error should fail' '
+       test_config_global filter.protocol.process "rot13-filter.pl clean smudge" &&
+       test_config_global filter.protocol.required true &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+
+               cp "$TEST_ROOT/test.o" test.r &&
+               echo "this is going to fail" >clean-write-fail.r &&
+               echo "content-test3-subdir" >test3.r &&
+
+               test_must_fail git add .
+       )
+'
+
+test_expect_success PERL 'process filter should restart after unexpected write failure' '
+       test_config_global filter.protocol.process "rot13-filter.pl clean smudge" &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+
+               cp "$TEST_ROOT/test.o" test.r &&
+               cp "$TEST_ROOT/test2.o" test2.r &&
+               echo "this is going to fail" >smudge-write-fail.o &&
+               cp smudge-write-fail.o smudge-write-fail.r &&
+
+               S=$(file_size test.r) &&
+               S2=$(file_size test2.r) &&
+               SF=$(file_size smudge-write-fail.r) &&
+
+               git add . &&
+               rm -f *.r &&
+
+               rm -f rot13-filter.log &&
+               git checkout --quiet --no-progress . 2>git-stderr.log &&
+
+               grep "smudge write error at" git-stderr.log &&
+               grep "error: external filter" git-stderr.log &&
+
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge smudge-write-fail.r $SF [OK] -- OUT: $SF [WRITE FAIL]
+                       START
+                       init handshake complete
+                       IN: smudge test.r $S [OK] -- OUT: $S . [OK]
+                       IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log &&
+
+               test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r &&
+               test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r &&
+
+               # Smudge failed
+               ! test_cmp smudge-write-fail.o smudge-write-fail.r &&
+               rot13.sh <smudge-write-fail.o >expected &&
+               git cat-file blob :smudge-write-fail.r >actual &&
+               test_cmp expected actual
+       )
+'
+
+test_expect_success PERL 'process filter should not be restarted if it signals an error' '
+       test_config_global filter.protocol.process "rot13-filter.pl clean smudge" &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+
+               cp "$TEST_ROOT/test.o" test.r &&
+               cp "$TEST_ROOT/test2.o" test2.r &&
+               echo "this will cause an error" >error.o &&
+               cp error.o error.r &&
+
+               S=$(file_size test.r) &&
+               S2=$(file_size test2.r) &&
+               SE=$(file_size error.r) &&
+
+               git add . &&
+               rm -f *.r &&
+
+               filter_git checkout --quiet --no-progress . &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge error.r $SE [OK] -- OUT: 0 [ERROR]
+                       IN: smudge test.r $S [OK] -- OUT: $S . [OK]
+                       IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log &&
+
+               test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r &&
+               test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r &&
+               test_cmp error.o error.r
+       )
+'
+
+test_expect_success PERL 'process filter abort stops processing of all further files' '
+       test_config_global filter.protocol.process "rot13-filter.pl clean smudge" &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+
+               cp "$TEST_ROOT/test.o" test.r &&
+               cp "$TEST_ROOT/test2.o" test2.r &&
+               echo "error this blob and all future blobs" >abort.o &&
+               cp abort.o abort.r &&
+
+               SA=$(file_size abort.r) &&
+
+               git add . &&
+               rm -f *.r &&
+
+               # Note: This test assumes that Git filters files in alphabetical
+               # order ("abort.r" before "test.r").
+               filter_git checkout --quiet --no-progress . &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge abort.r $SA [OK] -- OUT: 0 [ABORT]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log rot13-filter.log &&
+
+               test_cmp "$TEST_ROOT/test.o" test.r &&
+               test_cmp "$TEST_ROOT/test2.o" test2.r &&
+               test_cmp abort.o abort.r
+       )
+'
+
+test_expect_success PERL 'invalid process filter must fail (and not hang!)' '
+       test_config_global filter.protocol.process cat &&
+       test_config_global filter.protocol.required true &&
+       rm -rf repo &&
+       mkdir repo &&
+       (
+               cd repo &&
+               git init &&
+
+               echo "*.r filter=protocol" >.gitattributes &&
+
+               cp "$TEST_ROOT/test.o" test.r &&
+               test_must_fail git add . 2>git-stderr.log &&
+               grep "does not support filter protocol version" git-stderr.log
+       )
+'
+
 test_done
diff --git a/t/t0021/rot13-filter.pl b/t/t0021/rot13-filter.pl
new file mode 100644 (file)
index 0000000..617f581
--- /dev/null
@@ -0,0 +1,196 @@
+#
+# Example implementation for the Git filter protocol version 2
+# See Documentation/gitattributes.txt, section "Filter Protocol"
+#
+# The script takes the list of supported protocol capabilities as
+# arguments ("clean", "smudge", etc).
+#
+# This implementation supports special test cases:
+# (1) If data with the pathname "clean-write-fail.r" is processed with
+#     a "clean" operation then the write operation will die.
+# (2) If data with the pathname "smudge-write-fail.r" is processed with
+#     a "smudge" operation then the write operation will die.
+# (3) If data with the pathname "error.r" is processed with any
+#     operation then the filter signals that it cannot or does not want
+#     to process the file.
+# (4) If data with the pathname "abort.r" is processed with any
+#     operation then the filter signals that it cannot or does not want
+#     to process the file and any file after that is processed with the
+#     same command.
+#
+
+use strict;
+use warnings;
+use IO::File;
+
+my $MAX_PACKET_CONTENT_SIZE = 65516;
+my @capabilities            = @ARGV;
+
+open my $debug, ">>", "rot13-filter.log" or die "cannot open log file: $!";
+
+sub rot13 {
+       my $str = shift;
+       $str =~ y/A-Za-z/N-ZA-Mn-za-m/;
+       return $str;
+}
+
+sub packet_bin_read {
+       my $buffer;
+       my $bytes_read = read STDIN, $buffer, 4;
+       if ( $bytes_read == 0 ) {
+               # EOF - Git stopped talking to us!
+               print $debug "STOP\n";
+               exit();
+       }
+       elsif ( $bytes_read != 4 ) {
+               die "invalid packet: '$buffer'";
+       }
+       my $pkt_size = hex($buffer);
+       if ( $pkt_size == 0 ) {
+               return ( 1, "" );
+       }
+       elsif ( $pkt_size > 4 ) {
+               my $content_size = $pkt_size - 4;
+               $bytes_read = read STDIN, $buffer, $content_size;
+               if ( $bytes_read != $content_size ) {
+                       die "invalid packet ($content_size bytes expected; $bytes_read bytes read)";
+               }
+               return ( 0, $buffer );
+       }
+       else {
+               die "invalid packet size: $pkt_size";
+       }
+}
+
+sub packet_txt_read {
+       my ( $res, $buf ) = packet_bin_read();
+       unless ( $buf =~ s/\n$// ) {
+               die "A non-binary line MUST be terminated by an LF.";
+       }
+       return ( $res, $buf );
+}
+
+sub packet_bin_write {
+       my $buf = shift;
+       print STDOUT sprintf( "%04x", length($buf) + 4 );
+       print STDOUT $buf;
+       STDOUT->flush();
+}
+
+sub packet_txt_write {
+       packet_bin_write( $_[0] . "\n" );
+}
+
+sub packet_flush {
+       print STDOUT sprintf( "%04x", 0 );
+       STDOUT->flush();
+}
+
+print $debug "START\n";
+$debug->flush();
+
+( packet_txt_read() eq ( 0, "git-filter-client" ) ) || die "bad initialize";
+( packet_txt_read() eq ( 0, "version=2" ) )         || die "bad version";
+( packet_bin_read() eq ( 1, "" ) )                  || die "bad version end";
+
+packet_txt_write("git-filter-server");
+packet_txt_write("version=2");
+packet_flush();
+
+( packet_txt_read() eq ( 0, "capability=clean" ) )  || die "bad capability";
+( packet_txt_read() eq ( 0, "capability=smudge" ) ) || die "bad capability";
+( packet_bin_read() eq ( 1, "" ) )                  || die "bad capability end";
+
+foreach (@capabilities) {
+       packet_txt_write( "capability=" . $_ );
+}
+packet_flush();
+print $debug "init handshake complete\n";
+$debug->flush();
+
+while (1) {
+       my ($command) = packet_txt_read() =~ /^command=(.+)$/;
+       print $debug "IN: $command";
+       $debug->flush();
+
+       my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
+       print $debug " $pathname";
+       $debug->flush();
+
+       if ( $pathname eq "" ) {
+               die "bad pathname '$pathname'";
+       }
+
+       # Flush
+       packet_bin_read();
+
+       my $input = "";
+       {
+               binmode(STDIN);
+               my $buffer;
+               my $done = 0;
+               while ( !$done ) {
+                       ( $done, $buffer ) = packet_bin_read();
+                       $input .= $buffer;
+               }
+               print $debug " " . length($input) . " [OK] -- ";
+               $debug->flush();
+       }
+
+       my $output;
+       if ( $pathname eq "error.r" or $pathname eq "abort.r" ) {
+               $output = "";
+       }
+       elsif ( $command eq "clean" and grep( /^clean$/, @capabilities ) ) {
+               $output = rot13($input);
+       }
+       elsif ( $command eq "smudge" and grep( /^smudge$/, @capabilities ) ) {
+               $output = rot13($input);
+       }
+       else {
+               die "bad command '$command'";
+       }
+
+       print $debug "OUT: " . length($output) . " ";
+       $debug->flush();
+
+       if ( $pathname eq "error.r" ) {
+               print $debug "[ERROR]\n";
+               $debug->flush();
+               packet_txt_write("status=error");
+               packet_flush();
+       }
+       elsif ( $pathname eq "abort.r" ) {
+               print $debug "[ABORT]\n";
+               $debug->flush();
+               packet_txt_write("status=abort");
+               packet_flush();
+       }
+       else {
+               packet_txt_write("status=success");
+               packet_flush();
+
+               if ( $pathname eq "${command}-write-fail.r" ) {
+                       print $debug "[WRITE FAIL]\n";
+                       $debug->flush();
+                       die "${command} write error";
+               }
+
+               while ( length($output) > 0 ) {
+                       my $packet = substr( $output, 0, $MAX_PACKET_CONTENT_SIZE );
+                       packet_bin_write($packet);
+                       # dots represent the number of packets
+                       print $debug ".";
+                       if ( length($output) > $MAX_PACKET_CONTENT_SIZE ) {
+                               $output = substr( $output, $MAX_PACKET_CONTENT_SIZE );
+                       }
+                       else {
+                               $output = "";
+                       }
+               }
+               packet_flush();
+               print $debug " [OK]\n";
+               $debug->flush();
+               packet_flush();
+       }
+}
diff --git a/t/t0025-crlf-auto.sh b/t/t0025-crlf-auto.sh
deleted file mode 100755 (executable)
index d0bee08..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/bin/sh
-
-test_description='CRLF conversion'
-
-. ./test-lib.sh
-
-has_cr() {
-       tr '\015' Q <"$1" | grep Q >/dev/null
-}
-
-test_expect_success setup '
-
-       git config core.autocrlf false &&
-
-       for w in Hello world how are you; do echo $w; done >LFonly &&
-       for w in I am very very fine thank you; do echo ${w}Q; done | q_to_cr >CRLFonly &&
-       for w in Oh here is a QNUL byte how alarming; do echo ${w}; done | q_to_nul >LFwithNUL &&
-       git add . &&
-
-       git commit -m initial &&
-
-       LFonly=$(git rev-parse HEAD:LFonly) &&
-       CRLFonly=$(git rev-parse HEAD:CRLFonly) &&
-       LFwithNUL=$(git rev-parse HEAD:LFwithNUL) &&
-
-       echo happy.
-'
-
-test_expect_success 'default settings cause no changes' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       git read-tree --reset -u HEAD &&
-
-       ! has_cr LFonly &&
-       has_cr CRLFonly &&
-       LFonlydiff=$(git diff LFonly) &&
-       CRLFonlydiff=$(git diff CRLFonly) &&
-       LFwithNULdiff=$(git diff LFwithNUL) &&
-       test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
-'
-
-test_expect_success 'crlf=true causes a CRLF file to be normalized' '
-
-       # Backwards compatibility check
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       echo "CRLFonly crlf" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       # Note, "normalized" means that git will normalize it if added
-       has_cr CRLFonly &&
-       CRLFonlydiff=$(git diff CRLFonly) &&
-       test -n "$CRLFonlydiff"
-'
-
-test_expect_success 'text=true causes a CRLF file to be normalized' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       echo "CRLFonly text" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       # Note, "normalized" means that git will normalize it if added
-       has_cr CRLFonly &&
-       CRLFonlydiff=$(git diff CRLFonly) &&
-       test -n "$CRLFonlydiff"
-'
-
-test_expect_success 'eol=crlf gives a normalized file CRLFs with autocrlf=false' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       git config core.autocrlf false &&
-       echo "LFonly eol=crlf" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       has_cr LFonly &&
-       LFonlydiff=$(git diff LFonly) &&
-       test -z "$LFonlydiff"
-'
-
-test_expect_success 'eol=crlf gives a normalized file CRLFs with autocrlf=input' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       git config core.autocrlf input &&
-       echo "LFonly eol=crlf" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       has_cr LFonly &&
-       LFonlydiff=$(git diff LFonly) &&
-       test -z "$LFonlydiff"
-'
-
-test_expect_success 'eol=lf gives a normalized file LFs with autocrlf=true' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       git config core.autocrlf true &&
-       echo "LFonly eol=lf" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       ! has_cr LFonly &&
-       LFonlydiff=$(git diff LFonly) &&
-       test -z "$LFonlydiff"
-'
-
-test_expect_success 'autocrlf=true does not normalize CRLF files' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       git config core.autocrlf true &&
-       git read-tree --reset -u HEAD &&
-
-       has_cr LFonly &&
-       has_cr CRLFonly &&
-       LFonlydiff=$(git diff LFonly) &&
-       CRLFonlydiff=$(git diff CRLFonly) &&
-       LFwithNULdiff=$(git diff LFwithNUL) &&
-       test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
-'
-
-test_expect_success 'text=auto, autocrlf=true does not normalize CRLF files' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       git config core.autocrlf true &&
-       echo "* text=auto" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       has_cr LFonly &&
-       has_cr CRLFonly &&
-       LFonlydiff=$(git diff LFonly) &&
-       CRLFonlydiff=$(git diff CRLFonly) &&
-       LFwithNULdiff=$(git diff LFwithNUL) &&
-       test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
-'
-
-test_expect_success 'text=auto, autocrlf=true does not normalize binary files' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       git config core.autocrlf true &&
-       echo "* text=auto" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       ! has_cr LFwithNUL &&
-       LFwithNULdiff=$(git diff LFwithNUL) &&
-       test -z "$LFwithNULdiff"
-'
-
-test_expect_success 'eol=crlf _does_ normalize binary files' '
-
-       rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
-       echo "LFwithNUL eol=crlf" > .gitattributes &&
-       git read-tree --reset -u HEAD &&
-
-       has_cr LFwithNUL &&
-       LFwithNULdiff=$(git diff LFwithNUL) &&
-       test -z "$LFwithNULdiff"
-'
-
-test_done
index 90db54c9f976c3c7b1d1d1a55bc3be6e557f2aa2..deb3ae7813052d01b6dab92586e2c37d313ef8ff 100755 (executable)
@@ -4,12 +4,6 @@ test_description='CRLF conversion all combinations'
 
 . ./test-lib.sh
 
-if ! test_have_prereq EXPENSIVE
-then
-       skip_all="EXPENSIVE not set"
-       test_done
-fi
-
 compare_files () {
        tr '\015\000' QN <"$1" >"$1".expect &&
        tr '\015\000' QN <"$2" | tr -d 'Z' >"$2".actual &&
@@ -75,7 +69,7 @@ check_warning () {
        *) echo >&2 "Illegal 1": "$1" ; return false ;;
        esac
        grep "will be replaced by" "$2" | sed -e "s/\(.*\) in [^ ]*$/\1/" | uniq  >"$2".actual
-       test_cmp "$2".expect "$2".actual
+       test_i18ncmp "$2".expect "$2".actual
 }
 
 commit_check_warn () {
index 29e91d861cbd6473d80c7343a0e292b010d83173..bbf3e39e3d229fbda5b7e40e9caca3aba2e1f52b 100755 (executable)
@@ -432,6 +432,15 @@ test_expect_success '-c with changed comment char' '
        test_cmp expect actual
 '
 
+test_expect_success '-c with comment char defined in .git/config' '
+       test_config core.commentchar = &&
+       printf "= foo\n" >expect &&
+       printf "foo" | (
+               mkdir sub && cd sub && git stripspace -c
+       ) >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'avoid SP-HT sequence in commented line' '
        printf "#\tone\n#\n# two\n" >expect &&
        printf "\tone\n\ntwo\n" | git stripspace -c >actual &&
index bf2deee10926f0d8ab7ba7d2645eb17a35b9a218..444b5a4df801975cf4f96f8193cb04ac91af3e4d 100755 (executable)
@@ -305,8 +305,9 @@ test_git_path GIT_COMMON_DIR=bar config                   bar/config
 test_git_path GIT_COMMON_DIR=bar packed-refs              bar/packed-refs
 test_git_path GIT_COMMON_DIR=bar shallow                  bar/shallow
 
-# In the tests below, the distinction between $PWD and $(pwd) is important:
-# on Windows, $PWD is POSIX style (/c/foo), $(pwd) has drive letter (c:/foo).
+# In the tests below, $(pwd) must be used because it is a native path on
+# Windows and avoids MSYS's path mangling (which simplifies "foo/../bar" and
+# strips the dot from trailing "/.").
 
 test_submodule_relative_url "../" "../foo" "../submodule" "../../submodule"
 test_submodule_relative_url "../" "../foo/bar" "../submodule" "../../foo/submodule"
@@ -314,27 +315,29 @@ test_submodule_relative_url "../" "../foo/submodule" "../submodule" "../../foo/s
 test_submodule_relative_url "../" "./foo" "../submodule" "../submodule"
 test_submodule_relative_url "../" "./foo/bar" "../submodule" "../foo/submodule"
 test_submodule_relative_url "../../../" "../foo/bar" "../sub/a/b/c" "../../../../foo/sub/a/b/c"
-test_submodule_relative_url "../" "$PWD/addtest" "../repo" "$(pwd)/repo"
+test_submodule_relative_url "../" "$(pwd)/addtest" "../repo" "$(pwd)/repo"
 test_submodule_relative_url "../" "foo/bar" "../submodule" "../foo/submodule"
 test_submodule_relative_url "../" "foo" "../submodule" "../submodule"
 
 test_submodule_relative_url "(null)" "../foo/bar" "../sub/a/b/c" "../foo/sub/a/b/c"
+test_submodule_relative_url "(null)" "../foo/bar" "../sub/a/b/c/" "../foo/sub/a/b/c"
+test_submodule_relative_url "(null)" "../foo/bar/" "../sub/a/b/c" "../foo/sub/a/b/c"
 test_submodule_relative_url "(null)" "../foo/bar" "../submodule" "../foo/submodule"
 test_submodule_relative_url "(null)" "../foo/submodule" "../submodule" "../foo/submodule"
 test_submodule_relative_url "(null)" "../foo" "../submodule" "../submodule"
 test_submodule_relative_url "(null)" "./foo/bar" "../submodule" "foo/submodule"
 test_submodule_relative_url "(null)" "./foo" "../submodule" "submodule"
 test_submodule_relative_url "(null)" "//somewhere else/repo" "../subrepo" "//somewhere else/subrepo"
-test_submodule_relative_url "(null)" "$PWD/subsuper_update_r" "../subsubsuper_update_r" "$(pwd)/subsubsuper_update_r"
-test_submodule_relative_url "(null)" "$PWD/super_update_r2" "../subsuper_update_r" "$(pwd)/subsuper_update_r"
-test_submodule_relative_url "(null)" "$PWD/." "../." "$(pwd)/."
-test_submodule_relative_url "(null)" "$PWD" "./." "$(pwd)/."
-test_submodule_relative_url "(null)" "$PWD/addtest" "../repo" "$(pwd)/repo"
-test_submodule_relative_url "(null)" "$PWD" "./å äö" "$(pwd)/å äö"
-test_submodule_relative_url "(null)" "$PWD/." "../submodule" "$(pwd)/submodule"
-test_submodule_relative_url "(null)" "$PWD/submodule" "../submodule" "$(pwd)/submodule"
-test_submodule_relative_url "(null)" "$PWD/home2/../remote" "../bundle1" "$(pwd)/home2/../bundle1"
-test_submodule_relative_url "(null)" "$PWD/submodule_update_repo" "./." "$(pwd)/submodule_update_repo/."
+test_submodule_relative_url "(null)" "$(pwd)/subsuper_update_r" "../subsubsuper_update_r" "$(pwd)/subsubsuper_update_r"
+test_submodule_relative_url "(null)" "$(pwd)/super_update_r2" "../subsuper_update_r" "$(pwd)/subsuper_update_r"
+test_submodule_relative_url "(null)" "$(pwd)/." "../." "$(pwd)/."
+test_submodule_relative_url "(null)" "$(pwd)" "./." "$(pwd)/."
+test_submodule_relative_url "(null)" "$(pwd)/addtest" "../repo" "$(pwd)/repo"
+test_submodule_relative_url "(null)" "$(pwd)" "./å äö" "$(pwd)/å äö"
+test_submodule_relative_url "(null)" "$(pwd)/." "../submodule" "$(pwd)/submodule"
+test_submodule_relative_url "(null)" "$(pwd)/submodule" "../submodule" "$(pwd)/submodule"
+test_submodule_relative_url "(null)" "$(pwd)/home2/../remote" "../bundle1" "$(pwd)/home2/../bundle1"
+test_submodule_relative_url "(null)" "$(pwd)/submodule_update_repo" "./." "$(pwd)/submodule_update_repo/."
 test_submodule_relative_url "(null)" "file:///tmp/repo" "../subrepo" "file:///tmp/subrepo"
 test_submodule_relative_url "(null)" "foo/bar" "../submodule" "foo/submodule"
 test_submodule_relative_url "(null)" "foo" "../submodule" "submodule"
index 12228b4aa6cb6a393a006130b31c73625911cec6..e4739170aa2b7c833cd51a06a7ac6764c8bf0494 100755 (executable)
@@ -26,6 +26,47 @@ test_expect_success 'run_command can run a command' '
        test_cmp empty err
 '
 
+test_expect_success !MINGW 'run_command can run a script without a #! line' '
+       cat >hello <<-\EOF &&
+       cat hello-script
+       EOF
+       chmod +x hello &&
+       test-run-command run-command ./hello >actual 2>err &&
+
+       test_cmp hello-script actual &&
+       test_cmp empty err
+'
+
+test_expect_success 'run_command does not try to execute a directory' '
+       test_when_finished "rm -rf bin1 bin2" &&
+       mkdir -p bin1/greet bin2 &&
+       write_script bin2/greet <<-\EOF &&
+       cat bin2/greet
+       EOF
+
+       PATH=$PWD/bin1:$PWD/bin2:$PATH \
+               test-run-command run-command greet >actual 2>err &&
+       test_cmp bin2/greet actual &&
+       test_cmp empty err
+'
+
+test_expect_success POSIXPERM 'run_command passes over non-executable file' '
+       test_when_finished "rm -rf bin1 bin2" &&
+       mkdir -p bin1 bin2 &&
+       write_script bin1/greet <<-\EOF &&
+       cat bin1/greet
+       EOF
+       chmod -x bin1/greet &&
+       write_script bin2/greet <<-\EOF &&
+       cat bin2/greet
+       EOF
+
+       PATH=$PWD/bin1:$PWD/bin2:$PATH \
+               test-run-command run-command greet >actual 2>err &&
+       test_cmp bin2/greet actual &&
+       test_cmp empty err
+'
+
 test_expect_success POSIXPERM 'run_command reports EACCES' '
        cat hello-script >hello.sh &&
        chmod -x hello.sh &&
diff --git a/t/t0065-strcmp-offset.sh b/t/t0065-strcmp-offset.sh
new file mode 100755 (executable)
index 0000000..7d6d214
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+test_description='Test strcmp_offset functionality'
+
+. ./test-lib.sh
+
+while read s1 s2 expect
+do
+       test_expect_success "strcmp_offset($s1, $s2)" '
+               echo "$expect" >expect &&
+               test-strcmp-offset "$s1" "$s2" >actual &&
+               test_cmp expect actual
+       '
+done <<-EOF
+abc abc 0 3
+abc def -1 0
+abc abz -1 2
+abc abcdef -1 3
+EOF
+
+test_done
index e0a69402324fed3c2fd7ca9495f5735742766108..58c0b7e9b6d99a6ea8a507da89eb66f3c8780c31 100755 (executable)
@@ -56,5 +56,13 @@ test_expect_success 'merge @{-100} before checking out that many branches yet' '
        test_must_fail git merge @{-100}
 '
 
+test_expect_success 'log -g @{-1}' '
+       git checkout -b last_branch &&
+       git checkout -b new_branch &&
+       echo "last_branch@{0}" >expect &&
+       git log -g --format=%gd @{-1} >actual &&
+       test_cmp expect actual
+'
+
 test_done
 
index 2c10cb4693e28eecf7771978a2f3b702e5f3bd30..2cbf7b95907384b4b4b5ac91f801026810b85f0a 100755 (executable)
@@ -4,7 +4,7 @@ use lib (split(/:/, $ENV{GITPERLLIB}));
 use strict;
 use warnings;
 use POSIX qw(:locale_h);
-use Test::More tests => 8;
+use Test::More tests => 13;
 use Git::I18N;
 
 my $has_gettext_library = $Git::I18N::__HAS_LIBRARY;
@@ -31,6 +31,8 @@ is_deeply(\@Git::I18N::EXPORT, \@Git::I18N::EXPORT_OK, "sanity: Git::I18N export
        # more gettext wrapper functions.
        my %prototypes = (qw(
                __      $
+               __n     $$$
+               N__     $
        ));
        while (my ($sub, $proto) = each %prototypes) {
                is(prototype(\&{"Git::I18N::$sub"}), $proto, "sanity: $sub has a $proto prototype");
@@ -46,6 +48,16 @@ is_deeply(\@Git::I18N::EXPORT, \@Git::I18N::EXPORT_OK, "sanity: Git::I18N export
        my ($got, $expect) = (('TEST: A Perl test string') x 2);
 
        is(__($got), $expect, "Passing a string through __() in the C locale works");
+
+       my ($got_singular, $got_plural, $expect_singular, $expect_plural) =
+               (('TEST: 1 file', 'TEST: n files') x 2);
+
+       is(__n($got_singular, $got_plural, 1), $expect_singular,
+               "Get singular string through __n() in C locale");
+       is(__n($got_singular, $got_plural, 2), $expect_plural,
+               "Get plural string through __n() in C locale");
+
+       is(N__($got), $expect, "Passing a string through N__() in the C locale works");
 }
 
 # Test a basic message on different locales
index a2124600811618efc2c79d7a3b8d04c9bb838fc8..71b0d74b4ddef584e3f8af711df6b5c5678034c5 100755 (executable)
@@ -8,7 +8,7 @@ test_description="The Git C functions aren't broken by setlocale(3)"
 . ./lib-gettext.sh
 
 test_expect_success 'git show a ISO-8859-1 commit under C locale' '
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
        test_commit "iso-c-commit" iso-under-c &&
        git show >out 2>err &&
        ! test -s err &&
@@ -16,7 +16,7 @@ test_expect_success 'git show a ISO-8859-1 commit under C locale' '
 '
 
 test_expect_success GETTEXT_LOCALE 'git show a ISO-8859-1 commit under a UTF-8 locale' '
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
        test_commit "iso-utf8-commit" iso-under-utf8 &&
        LANGUAGE=is LC_ALL="$is_IS_locale" git show >out 2>err &&
        ! test -s err &&
index 82c8411210831fbfbd3151b8e19dba9ee004fab0..fd92533acf488fd7d1aedd8152b9edaafc9bd87d 100755 (executable)
@@ -12,7 +12,100 @@ test -z "$NO_UNIX_SOCKETS" || {
 # don't leave a stale daemon running
 trap 'code=$?; git credential-cache exit; (exit $code); die' EXIT
 
+# test that the daemon works with no special setup
 helper_test cache
+
+test_expect_success 'socket defaults to ~/.cache/git/credential/socket' '
+       test_when_finished "
+               git credential-cache exit &&
+               rmdir -p .cache/git/credential/
+       " &&
+       test_path_is_missing "$HOME/.git-credential-cache" &&
+       test -S "$HOME/.cache/git/credential/socket"
+'
+
+XDG_CACHE_HOME="$HOME/xdg"
+export XDG_CACHE_HOME
+# test behavior when XDG_CACHE_HOME is set
+helper_test cache
+
+test_expect_success "use custom XDG_CACHE_HOME if set and default sockets are not created" '
+       test_when_finished "git credential-cache exit" &&
+       test -S "$XDG_CACHE_HOME/git/credential/socket" &&
+       test_path_is_missing "$HOME/.git-credential-cache/socket" &&
+       test_path_is_missing "$HOME/.cache/git/credential/socket"
+'
+unset XDG_CACHE_HOME
+
+test_expect_success 'credential-cache --socket option overrides default location' '
+       test_when_finished "
+               git credential-cache exit --socket \"\$HOME/dir/socket\" &&
+               rmdir \"\$HOME/dir\"
+       " &&
+       check approve "cache --socket \"\$HOME/dir/socket\"" <<-\EOF &&
+       protocol=https
+       host=example.com
+       username=store-user
+       password=store-pass
+       EOF
+       test -S "$HOME/dir/socket"
+'
+
+test_expect_success "use custom XDG_CACHE_HOME even if xdg socket exists" '
+       test_when_finished "
+               git credential-cache exit &&
+               sane_unset XDG_CACHE_HOME
+       " &&
+       check approve cache <<-\EOF &&
+       protocol=https
+       host=example.com
+       username=store-user
+       password=store-pass
+       EOF
+       test -S "$HOME/.cache/git/credential/socket" &&
+       XDG_CACHE_HOME="$HOME/xdg" &&
+       export XDG_CACHE_HOME &&
+       check approve cache <<-\EOF &&
+       protocol=https
+       host=example.com
+       username=store-user
+       password=store-pass
+       EOF
+       test -S "$XDG_CACHE_HOME/git/credential/socket"
+'
+
+test_expect_success 'use user socket if user directory exists' '
+       test_when_finished "
+               git credential-cache exit &&
+               rmdir \"\$HOME/.git-credential-cache/\"
+       " &&
+       mkdir -p -m 700 "$HOME/.git-credential-cache/" &&
+       check approve cache <<-\EOF &&
+       protocol=https
+       host=example.com
+       username=store-user
+       password=store-pass
+       EOF
+       test -S "$HOME/.git-credential-cache/socket"
+'
+
+test_expect_success SYMLINKS 'use user socket if user directory is a symlink to a directory' '
+       test_when_finished "
+               git credential-cache exit &&
+               rmdir \"\$HOME/dir/\" &&
+               rm \"\$HOME/.git-credential-cache\"
+       " &&
+       mkdir -p -m 700 "$HOME/dir/" &&
+       ln -s "$HOME/dir" "$HOME/.git-credential-cache" &&
+       check approve cache <<-\EOF &&
+       protocol=https
+       host=example.com
+       username=store-user
+       password=store-pass
+       EOF
+       test -S "$HOME/.git-credential-cache/socket"
+'
+
 helper_test_timeout cache --timeout=1
 
 # we can't rely on our "trap" above working after test_done,
index a0b79b4839fb21a96bf8aca769542d93b21bb90f..3c4d2d6045bf026cf164374a41ae759d08a69bf8 100755 (executable)
@@ -128,29 +128,29 @@ cat >expected <<\EOF
 EOF
 
 check_result () {
-    git ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current &&
-    test_cmp expected current
+       git ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current &&
+       test_cmp expected current
 }
 
 # This is done on an empty work directory, which is the normal
 # merge person behaviour.
-test_expect_success \
-    '3-way merge with git read-tree -m, empty cache' \
-    "rm -fr [NDMALTS][NDMALTSF] Z &&
-     rm .git/index &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
+test_expect_success '3-way merge with git read-tree -m, empty cache' '
+       rm -fr [NDMALTS][NDMALTSF] Z &&
+       rm .git/index &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
 
 # This starts out with the first head, which is the normal
 # patch submitter behaviour.
-test_expect_success \
-    '3-way merge with git read-tree -m, match H' \
-    "rm -fr [NDMALTS][NDMALTSF] Z &&
-     rm .git/index &&
-     read_tree_must_succeed $tree_A &&
-     git checkout-index -f -u -a &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
+test_expect_success '3-way merge with git read-tree -m, match H' '
+       rm -fr [NDMALTS][NDMALTSF] Z &&
+       rm .git/index &&
+       read_tree_must_succeed $tree_A &&
+       git checkout-index -f -u -a &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
 
 : <<\END_OF_CASE_TABLE
 
@@ -208,322 +208,304 @@ DF (file) when tree B require DF to be a directory by having DF/DF
 
 END_OF_CASE_TABLE
 
-test_expect_success '1 - must not have an entry not in A.' "
-     rm -f .git/index XX &&
-     echo XX >XX &&
-     git update-index --add XX &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '2 - must match B in !O && !A && B case.' \
-    "rm -f .git/index NA &&
-     cp .orig-B/NA NA &&
-     git update-index --add NA &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B"
-
-test_expect_success \
-    '2 - matching B alone is OK in !O && !A && B case.' \
-    "rm -f .git/index NA &&
-     cp .orig-B/NA NA &&
-     git update-index --add NA &&
-     echo extra >>NA &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B"
-
-test_expect_success \
-    '3 - must match A in !O && A && !B case.' \
-    "rm -f .git/index AN &&
-     cp .orig-A/AN AN &&
-     git update-index --add AN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '3 - matching A alone is OK in !O && A && !B case.' \
-    "rm -f .git/index AN &&
-     cp .orig-A/AN AN &&
-     git update-index --add AN &&
-     echo extra >>AN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B"
-
-test_expect_success \
-    '3 (fail) - must match A in !O && A && !B case.' "
-     rm -f .git/index AN &&
-     cp .orig-A/AN AN &&
-     echo extra >>AN &&
-     git update-index --add AN &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '4 - must match and be up-to-date in !O && A && B && A!=B case.' \
-    "rm -f .git/index AA &&
-     cp .orig-A/AA AA &&
-     git update-index --add AA &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' "
-     rm -f .git/index AA &&
-     cp .orig-A/AA AA &&
-     git update-index --add AA &&
-     echo extra >>AA &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' "
-     rm -f .git/index AA &&
-     cp .orig-A/AA AA &&
-     echo extra >>AA &&
-     git update-index --add AA &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '5 - must match in !O && A && B && A==B case.' \
-    "rm -f .git/index LL &&
-     cp .orig-A/LL LL &&
-     git update-index --add LL &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '5 - must match in !O && A && B && A==B case.' \
-    "rm -f .git/index LL &&
-     cp .orig-A/LL LL &&
-     git update-index --add LL &&
-     echo extra >>LL &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '5 (fail) - must match A in !O && A && B && A==B case.' "
-     rm -f .git/index LL &&
-     cp .orig-A/LL LL &&
-     echo extra >>LL &&
-     git update-index --add LL &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '6 - must not exist in O && !A && !B case' "
-     rm -f .git/index DD &&
-     echo DD >DD &&
-     git update-index --add DD &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '7 - must not exist in O && !A && B && O!=B case' "
-     rm -f .git/index DM &&
-     cp .orig-B/DM DM &&
-     git update-index --add DM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '8 - must not exist in O && !A && B && O==B case' "
-     rm -f .git/index DN &&
-     cp .orig-B/DN DN &&
-     git update-index --add DN &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '9 - must match and be up-to-date in O && A && !B && O!=A case' \
-    "rm -f .git/index MD &&
-     cp .orig-A/MD MD &&
-     git update-index --add MD &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' "
-     rm -f .git/index MD &&
-     cp .orig-A/MD MD &&
-     git update-index --add MD &&
-     echo extra >>MD &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' "
-     rm -f .git/index MD &&
-     cp .orig-A/MD MD &&
-     echo extra >>MD &&
-     git update-index --add MD &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '10 - must match and be up-to-date in O && A && !B && O==A case' \
-    "rm -f .git/index ND &&
-     cp .orig-A/ND ND &&
-     git update-index --add ND &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' "
-     rm -f .git/index ND &&
-     cp .orig-A/ND ND &&
-     git update-index --add ND &&
-     echo extra >>ND &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' "
-     rm -f .git/index ND &&
-     cp .orig-A/ND ND &&
-     echo extra >>ND &&
-     git update-index --add ND &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '11 - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' \
-    "rm -f .git/index MM &&
-     cp .orig-A/MM MM &&
-     git update-index --add MM &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' "
-     rm -f .git/index MM &&
-     cp .orig-A/MM MM &&
-     git update-index --add MM &&
-     echo extra >>MM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' "
-     rm -f .git/index MM &&
-     cp .orig-A/MM MM &&
-     echo extra >>MM &&
-     git update-index --add MM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '12 - must match A in O && A && B && O!=A && A==B case' \
-    "rm -f .git/index SS &&
-     cp .orig-A/SS SS &&
-     git update-index --add SS &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '12 - must match A in O && A && B && O!=A && A==B case' \
-    "rm -f .git/index SS &&
-     cp .orig-A/SS SS &&
-     git update-index --add SS &&
-     echo extra >>SS &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '12 (fail) - must match A in O && A && B && O!=A && A==B case' "
-     rm -f .git/index SS &&
-     cp .orig-A/SS SS &&
-     echo extra >>SS &&
-     git update-index --add SS &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '13 - must match A in O && A && B && O!=A && O==B case' \
-    "rm -f .git/index MN &&
-     cp .orig-A/MN MN &&
-     git update-index --add MN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '13 - must match A in O && A && B && O!=A && O==B case' \
-    "rm -f .git/index MN &&
-     cp .orig-A/MN MN &&
-     git update-index --add MN &&
-     echo extra >>MN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '14 - must match and be up-to-date in O && A && B && O==A && O!=B case' \
-    "rm -f .git/index NM &&
-     cp .orig-A/NM NM &&
-     git update-index --add NM &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '14 - may match B in O && A && B && O==A && O!=B case' \
-    "rm -f .git/index NM &&
-     cp .orig-B/NM NM &&
-     git update-index --add NM &&
-     echo extra >>NM &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' "
-     rm -f .git/index NM &&
-     cp .orig-A/NM NM &&
-     git update-index --add NM &&
-     echo extra >>NM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' "
-     rm -f .git/index NM &&
-     cp .orig-A/NM NM &&
-     echo extra >>NM &&
-     git update-index --add NM &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-test_expect_success \
-    '15 - must match A in O && A && B && O==A && O==B case' \
-    "rm -f .git/index NN &&
-     cp .orig-A/NN NN &&
-     git update-index --add NN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '15 - must match A in O && A && B && O==A && O==B case' \
-    "rm -f .git/index NN &&
-     cp .orig-A/NN NN &&
-     git update-index --add NN &&
-     echo extra >>NN &&
-     read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
-     check_result"
-
-test_expect_success \
-    '15 (fail) - must match A in O && A && B && O==A && O==B case' "
-     rm -f .git/index NN &&
-     cp .orig-A/NN NN &&
-     echo extra >>NN &&
-     git update-index --add NN &&
-     read_tree_must_fail -m $tree_O $tree_A $tree_B
-"
-
-# #16
-test_expect_success \
-    '16 - A matches in one and B matches in another.' \
-    'rm -f .git/index F16 &&
-    echo F16 >F16 &&
-    git update-index --add F16 &&
-    tree0=$(git write-tree) &&
-    echo E16 >F16 &&
-    git update-index F16 &&
-    tree1=$(git write-tree) &&
-    read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 &&
-    git ls-files --stage'
+test_expect_success '1 - must not have an entry not in A.' '
+       rm -f .git/index XX &&
+       echo XX >XX &&
+       git update-index --add XX &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '2 - must match B in !O && !A && B case.' '
+       rm -f .git/index NA &&
+       cp .orig-B/NA NA &&
+       git update-index --add NA &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '2 - matching B alone is OK in !O && !A && B case.' '
+       rm -f .git/index NA &&
+       cp .orig-B/NA NA &&
+       git update-index --add NA &&
+       echo extra >>NA &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '3 - must match A in !O && A && !B case.' '
+       rm -f .git/index AN &&
+       cp .orig-A/AN AN &&
+       git update-index --add AN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '3 - matching A alone is OK in !O && A && !B case.' '
+       rm -f .git/index AN &&
+       cp .orig-A/AN AN &&
+       git update-index --add AN &&
+       echo extra >>AN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '3 (fail) - must match A in !O && A && !B case.' '
+       rm -f .git/index AN &&
+       cp .orig-A/AN AN &&
+       echo extra >>AN &&
+       git update-index --add AN &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '4 - must match and be up-to-date in !O && A && B && A!=B case.' '
+       rm -f .git/index AA &&
+       cp .orig-A/AA AA &&
+       git update-index --add AA &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' '
+       rm -f .git/index AA &&
+       cp .orig-A/AA AA &&
+       git update-index --add AA &&
+       echo extra >>AA &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '4 (fail) - must match and be up-to-date in !O && A && B && A!=B case.' '
+       rm -f .git/index AA &&
+       cp .orig-A/AA AA &&
+       echo extra >>AA &&
+       git update-index --add AA &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '5 - must match in !O && A && B && A==B case.' '
+       rm -f .git/index LL &&
+       cp .orig-A/LL LL &&
+       git update-index --add LL &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '5 - must match in !O && A && B && A==B case.' '
+       rm -f .git/index LL &&
+       cp .orig-A/LL LL &&
+       git update-index --add LL &&
+       echo extra >>LL &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '5 (fail) - must match A in !O && A && B && A==B case.' '
+       rm -f .git/index LL &&
+       cp .orig-A/LL LL &&
+       echo extra >>LL &&
+       git update-index --add LL &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '6 - must not exist in O && !A && !B case' '
+       rm -f .git/index DD &&
+       echo DD >DD &&
+       git update-index --add DD &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '7 - must not exist in O && !A && B && O!=B case' '
+       rm -f .git/index DM &&
+       cp .orig-B/DM DM &&
+       git update-index --add DM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '8 - must not exist in O && !A && B && O==B case' '
+       rm -f .git/index DN &&
+       cp .orig-B/DN DN &&
+       git update-index --add DN &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '9 - must match and be up-to-date in O && A && !B && O!=A case' '
+       rm -f .git/index MD &&
+       cp .orig-A/MD MD &&
+       git update-index --add MD &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' '
+       rm -f .git/index MD &&
+       cp .orig-A/MD MD &&
+       git update-index --add MD &&
+       echo extra >>MD &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '9 (fail) - must match and be up-to-date in O && A && !B && O!=A case' '
+       rm -f .git/index MD &&
+       cp .orig-A/MD MD &&
+       echo extra >>MD &&
+       git update-index --add MD &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '10 - must match and be up-to-date in O && A && !B && O==A case' '
+       rm -f .git/index ND &&
+       cp .orig-A/ND ND &&
+       git update-index --add ND &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' '
+       rm -f .git/index ND &&
+       cp .orig-A/ND ND &&
+       git update-index --add ND &&
+       echo extra >>ND &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '10 (fail) - must match and be up-to-date in O && A && !B && O==A case' '
+       rm -f .git/index ND &&
+       cp .orig-A/ND ND &&
+       echo extra >>ND &&
+       git update-index --add ND &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '11 - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
+       rm -f .git/index MM &&
+       cp .orig-A/MM MM &&
+       git update-index --add MM &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
+       rm -f .git/index MM &&
+       cp .orig-A/MM MM &&
+       git update-index --add MM &&
+       echo extra >>MM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '11 (fail) - must match and be up-to-date in O && A && B && O!=A && O!=B && A!=B case' '
+       rm -f .git/index MM &&
+       cp .orig-A/MM MM &&
+       echo extra >>MM &&
+       git update-index --add MM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '12 - must match A in O && A && B && O!=A && A==B case' '
+       rm -f .git/index SS &&
+       cp .orig-A/SS SS &&
+       git update-index --add SS &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '12 - must match A in O && A && B && O!=A && A==B case' '
+       rm -f .git/index SS &&
+       cp .orig-A/SS SS &&
+       git update-index --add SS &&
+       echo extra >>SS &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '12 (fail) - must match A in O && A && B && O!=A && A==B case' '
+       rm -f .git/index SS &&
+       cp .orig-A/SS SS &&
+       echo extra >>SS &&
+       git update-index --add SS &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '13 - must match A in O && A && B && O!=A && O==B case' '
+       rm -f .git/index MN &&
+       cp .orig-A/MN MN &&
+       git update-index --add MN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '13 - must match A in O && A && B && O!=A && O==B case' '
+       rm -f .git/index MN &&
+       cp .orig-A/MN MN &&
+       git update-index --add MN &&
+       echo extra >>MN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '14 - must match and be up-to-date in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-A/NM NM &&
+       git update-index --add NM &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '14 - may match B in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-B/NM NM &&
+       git update-index --add NM &&
+       echo extra >>NM &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-A/NM NM &&
+       git update-index --add NM &&
+       echo extra >>NM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '14 (fail) - must match and be up-to-date in O && A && B && O==A && O!=B case' '
+       rm -f .git/index NM &&
+       cp .orig-A/NM NM &&
+       echo extra >>NM &&
+       git update-index --add NM &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '15 - must match A in O && A && B && O==A && O==B case' '
+       rm -f .git/index NN &&
+       cp .orig-A/NN NN &&
+       git update-index --add NN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '15 - must match A in O && A && B && O==A && O==B case' '
+       rm -f .git/index NN &&
+       cp .orig-A/NN NN &&
+       git update-index --add NN &&
+       echo extra >>NN &&
+       read_tree_must_succeed -m $tree_O $tree_A $tree_B &&
+       check_result
+'
+
+test_expect_success '15 (fail) - must match A in O && A && B && O==A && O==B case' '
+       rm -f .git/index NN &&
+       cp .orig-A/NN NN &&
+       echo extra >>NN &&
+       git update-index --add NN &&
+       read_tree_must_fail -m $tree_O $tree_A $tree_B
+'
+
+test_expect_success '16 - A matches in one and B matches in another.' '
+       rm -f .git/index F16 &&
+       echo F16 >F16 &&
+       git update-index --add F16 &&
+       tree0=$(git write-tree) &&
+       echo E16 >F16 &&
+       git update-index F16 &&
+       tree1=$(git write-tree) &&
+       read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 &&
+       git ls-files --stage
+'
 
 test_done
index db1b6f5cf4dd8c7932946a53bc2e1c30b09b762b..5ededd8e400e7e64faa1bd559d67251ecbf8608e 100755 (executable)
@@ -14,10 +14,10 @@ all the combinations described in the two-tree merge "carry forward"
 rules, found in <Documentation/git read-tree.txt>.
 
 In the test, these paths are used:
-        bozbar  - in H, stays in M, modified from bozbar to gnusto
-        frotz   - not in H added in M
-        nitfol  - in H, stays in M unmodified
-        rezrov  - in H, deleted in M
+       bozbar  - in H, stays in M, modified from bozbar to gnusto
+       frotz   - not in H added in M
+       nitfol  - in H, stays in M unmodified
+       rezrov  - in H, deleted in M
        yomin   - not in H or M
 '
 . ./test-lib.sh
@@ -60,336 +60,343 @@ EOF
 
 sed -e 's/bozbar/gnusto (earlier bozbar)/' bozbar-old >bozbar-new
 
-test_expect_success \
-    setup \
-    'echo frotz >frotz &&
-     echo nitfol >nitfol &&
-     cat bozbar-old >bozbar &&
-     echo rezrov >rezrov &&
-     echo yomin >yomin &&
-     git update-index --add nitfol bozbar rezrov &&
-     treeH=$(git write-tree) &&
-     echo treeH $treeH &&
-     git ls-tree $treeH &&
-
-     cat bozbar-new >bozbar &&
-     git update-index --add frotz bozbar --force-remove rezrov &&
-     git ls-files --stage >M.out &&
-     treeM=$(git write-tree) &&
-     echo treeM $treeM &&
-     git ls-tree $treeM &&
-     git diff-tree $treeH $treeM'
-
-test_expect_success \
-    '1, 2, 3 - no carry forward' \
-    'rm -f .git/index &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >1-3.out &&
-     test_cmp M.out 1-3.out &&
-     check_cache_at bozbar dirty &&
-     check_cache_at frotz dirty &&
-     check_cache_at nitfol dirty'
+test_expect_success 'setup' '
+       echo frotz >frotz &&
+       echo nitfol >nitfol &&
+       cat bozbar-old >bozbar &&
+       echo rezrov >rezrov &&
+       echo yomin >yomin &&
+       git update-index --add nitfol bozbar rezrov &&
+       treeH=$(git write-tree) &&
+       echo treeH $treeH &&
+       git ls-tree $treeH &&
+
+       cat bozbar-new >bozbar &&
+       git update-index --add frotz bozbar --force-remove rezrov &&
+       git ls-files --stage >M.out &&
+       treeM=$(git write-tree) &&
+       echo treeM $treeM &&
+       git ls-tree $treeM &&
+       git diff-tree $treeH $treeM
+'
 
+test_expect_success '1, 2, 3 - no carry forward' '
+       rm -f .git/index &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >1-3.out &&
+       test_cmp M.out 1-3.out &&
+       check_cache_at bozbar dirty &&
+       check_cache_at frotz dirty &&
+       check_cache_at nitfol dirty
+'
 echo '+100644 X 0      yomin' >expected
 
-test_expect_success \
-    '4 - carry forward local addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     git update-index --add yomin &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >4.out &&
-     test_must_fail git diff --no-index M.out 4.out >4diff.out &&
-     compare_change 4diff.out expected &&
-     check_cache_at yomin clean'
-
-test_expect_success \
-    '5 - carry forward local addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo yomin >yomin &&
-     git update-index --add yomin &&
-     echo yomin yomin >yomin &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >5.out &&
-     test_must_fail git diff --no-index M.out 5.out >5diff.out &&
-     compare_change 5diff.out expected &&
-     check_cache_at yomin dirty'
-
-test_expect_success \
-    '6 - local addition already has the same.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     git update-index --add frotz &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >6.out &&
-     test_cmp M.out 6.out &&
-     check_cache_at frotz clean'
-
-test_expect_success \
-    '7 - local addition already has the same.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo frotz >frotz &&
-     git update-index --add frotz &&
-     echo frotz frotz >frotz &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >7.out &&
-     test_cmp M.out 7.out &&
-     check_cache_at frotz dirty'
-
-test_expect_success \
-    '8 - conflicting addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo frotz frotz >frotz &&
-     git update-index --add frotz &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '9 - conflicting addition.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo frotz frotz >frotz &&
-     git update-index --add frotz &&
-     echo frotz >frotz &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '10 - path removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov >rezrov &&
-     git update-index --add rezrov &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >10.out &&
-     test_cmp M.out 10.out'
-
-test_expect_success \
-    '11 - dirty path removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov >rezrov &&
-     git update-index --add rezrov &&
-     echo rezrov rezrov >rezrov &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '12 - unmatching local changes being removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov rezrov >rezrov &&
-     git update-index --add rezrov &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '13 - unmatching local changes being removed.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo rezrov rezrov >rezrov &&
-     git update-index --add rezrov &&
-     echo rezrov >rezrov &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
+test_expect_success '4 - carry forward local addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       git update-index --add yomin &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >4.out &&
+       test_must_fail git diff --no-index M.out 4.out >4diff.out &&
+       compare_change 4diff.out expected &&
+       check_cache_at yomin clean
+'
+
+test_expect_success '5 - carry forward local addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo yomin >yomin &&
+       git update-index --add yomin &&
+       echo yomin yomin >yomin &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >5.out &&
+       test_must_fail git diff --no-index M.out 5.out >5diff.out &&
+       compare_change 5diff.out expected &&
+       check_cache_at yomin dirty
+'
+
+test_expect_success '6 - local addition already has the same.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       git update-index --add frotz &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >6.out &&
+       test_cmp M.out 6.out &&
+       check_cache_at frotz clean
+'
+
+test_expect_success '7 - local addition already has the same.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo frotz >frotz &&
+       git update-index --add frotz &&
+       echo frotz frotz >frotz &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >7.out &&
+       test_cmp M.out 7.out &&
+       check_cache_at frotz dirty
+'
+
+test_expect_success '8 - conflicting addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo frotz frotz >frotz &&
+       git update-index --add frotz &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '9 - conflicting addition.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo frotz frotz >frotz &&
+       git update-index --add frotz &&
+       echo frotz >frotz &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '10 - path removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov >rezrov &&
+       git update-index --add rezrov &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >10.out &&
+       test_cmp M.out 10.out
+'
+
+test_expect_success '11 - dirty path removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov >rezrov &&
+       git update-index --add rezrov &&
+       echo rezrov rezrov >rezrov &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '12 - unmatching local changes being removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov rezrov >rezrov &&
+       git update-index --add rezrov &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '13 - unmatching local changes being removed.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo rezrov rezrov >rezrov &&
+       git update-index --add rezrov &&
+       echo rezrov >rezrov &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
 
 cat >expected <<EOF
 -100644 X 0    nitfol
 +100644 X 0    nitfol
 EOF
 
-test_expect_success \
-    '14 - unchanged in two heads.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo nitfol nitfol >nitfol &&
-     git update-index --add nitfol &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >14.out &&
-     test_must_fail git diff --no-index M.out 14.out >14diff.out &&
-     compare_change 14diff.out expected &&
-     check_cache_at nitfol clean'
-
-test_expect_success \
-    '15 - unchanged in two heads.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo nitfol nitfol >nitfol &&
-     git update-index --add nitfol &&
-     echo nitfol nitfol nitfol >nitfol &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >15.out &&
-     test_must_fail git diff --no-index M.out 15.out >15diff.out &&
-     compare_change 15diff.out expected &&
-     check_cache_at nitfol dirty'
-
-test_expect_success \
-    '16 - conflicting local change.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo bozbar bozbar >bozbar &&
-     git update-index --add bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '17 - conflicting local change.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     echo bozbar bozbar >bozbar &&
-     git update-index --add bozbar &&
-     echo bozbar bozbar bozbar >bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
-
-test_expect_success \
-    '18 - local change already having a good result.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-new >bozbar &&
-     git update-index --add bozbar &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >18.out &&
-     test_cmp M.out 18.out &&
-     check_cache_at bozbar clean'
-
-test_expect_success \
-    '19 - local change already having a good result, further modified.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-new >bozbar &&
-     git update-index --add bozbar &&
-     echo gnusto gnusto >bozbar &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >19.out &&
-     test_cmp M.out 19.out &&
-     check_cache_at bozbar dirty'
-
-test_expect_success \
-    '20 - no local change, use new tree.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-old >bozbar &&
-     git update-index --add bozbar &&
-     read_tree_twoway $treeH $treeM &&
-     git ls-files --stage >20.out &&
-     test_cmp M.out 20.out &&
-     check_cache_at bozbar dirty'
-
-test_expect_success \
-    '21 - no local change, dirty cache.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     cat bozbar-old >bozbar &&
-     git update-index --add bozbar &&
-     echo gnusto gnusto >bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
+test_expect_success '14 - unchanged in two heads.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo nitfol nitfol >nitfol &&
+       git update-index --add nitfol &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >14.out &&
+       test_must_fail git diff --no-index M.out 14.out >14diff.out &&
+       compare_change 14diff.out expected &&
+       check_cache_at nitfol clean
+'
+
+test_expect_success '15 - unchanged in two heads.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo nitfol nitfol >nitfol &&
+       git update-index --add nitfol &&
+       echo nitfol nitfol nitfol >nitfol &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >15.out &&
+       test_must_fail git diff --no-index M.out 15.out >15diff.out &&
+       compare_change 15diff.out expected &&
+       check_cache_at nitfol dirty
+'
+
+test_expect_success '16 - conflicting local change.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo bozbar bozbar >bozbar &&
+       git update-index --add bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '17 - conflicting local change.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       echo bozbar bozbar >bozbar &&
+       git update-index --add bozbar &&
+       echo bozbar bozbar bozbar >bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
+
+test_expect_success '18 - local change already having a good result.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-new >bozbar &&
+       git update-index --add bozbar &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >18.out &&
+       test_cmp M.out 18.out &&
+       check_cache_at bozbar clean
+'
+
+test_expect_success '19 - local change already having a good result, further modified.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-new >bozbar &&
+       git update-index --add bozbar &&
+       echo gnusto gnusto >bozbar &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >19.out &&
+       test_cmp M.out 19.out &&
+       check_cache_at bozbar dirty
+'
+
+test_expect_success '20 - no local change, use new tree.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-old >bozbar &&
+       git update-index --add bozbar &&
+       read_tree_twoway $treeH $treeM &&
+       git ls-files --stage >20.out &&
+       test_cmp M.out 20.out &&
+       check_cache_at bozbar dirty
+'
+
+test_expect_success '21 - no local change, dirty cache.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       cat bozbar-old >bozbar &&
+       git update-index --add bozbar &&
+       echo gnusto gnusto >bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
 
 # This fails with straight two-way fast-forward.
-test_expect_success \
-    '22 - local change cache updated.' \
-    'rm -f .git/index &&
-     read_tree_must_succeed $treeH &&
-     git checkout-index -u -f -q -a &&
-     sed -e "s/such as/SUCH AS/" bozbar-old >bozbar &&
-     git update-index --add bozbar &&
-     if read_tree_twoway $treeH $treeM; then false; else :; fi'
+test_expect_success '22 - local change cache updated.' '
+       rm -f .git/index &&
+       read_tree_must_succeed $treeH &&
+       git checkout-index -u -f -q -a &&
+       sed -e "s/such as/SUCH AS/" bozbar-old >bozbar &&
+       git update-index --add bozbar &&
+       if read_tree_twoway $treeH $treeM; then false; else :; fi
+'
 
 # Also make sure we did not break DF vs DF/DF case.
-test_expect_success \
-    'DF vs DF/DF case setup.' \
-    'rm -f .git/index &&
-     echo DF >DF &&
-     git update-index --add DF &&
-     treeDF=$(git write-tree) &&
-     echo treeDF $treeDF &&
-     git ls-tree $treeDF &&
-
-     rm -f DF &&
-     mkdir DF &&
-     echo DF/DF >DF/DF &&
-     git update-index --add --remove DF DF/DF &&
-     treeDFDF=$(git write-tree) &&
-     echo treeDFDF $treeDFDF &&
-     git ls-tree $treeDFDF &&
-     git ls-files --stage >DFDF.out'
-
-test_expect_success \
-    'DF vs DF/DF case test.' \
-    'rm -f .git/index &&
-     rm -fr DF &&
-     echo DF >DF &&
-     git update-index --add DF &&
-     read_tree_twoway $treeDF $treeDFDF &&
-     git ls-files --stage >DFDFcheck.out &&
-     test_cmp DFDF.out DFDFcheck.out &&
-     check_cache_at DF/DF dirty &&
-     :'
-
-test_expect_success \
-    'a/b (untracked) vs a case setup.' \
-    'rm -f .git/index &&
-     : >a &&
-     git update-index --add a &&
-     treeM=$(git write-tree) &&
-     echo treeM $treeM &&
-     git ls-tree $treeM &&
-     git ls-files --stage >treeM.out &&
-
-     rm -f a &&
-     git update-index --remove a &&
-     mkdir a &&
-     : >a/b &&
-     treeH=$(git write-tree) &&
-     echo treeH $treeH &&
-     git ls-tree $treeH'
-
-test_expect_success \
-    'a/b (untracked) vs a, plus c/d case test.' \
-    'read_tree_u_must_fail -u -m "$treeH" "$treeM" &&
-     git ls-files --stage &&
-     test -f a/b'
-
-test_expect_success \
-    'a/b vs a, plus c/d case setup.' \
-    'rm -f .git/index &&
-     rm -fr a &&
-     : >a &&
-     mkdir c &&
-     : >c/d &&
-     git update-index --add a c/d &&
-     treeM=$(git write-tree) &&
-     echo treeM $treeM &&
-     git ls-tree $treeM &&
-     git ls-files --stage >treeM.out &&
-
-     rm -f a &&
-     mkdir a &&
-     : >a/b &&
-     git update-index --add --remove a a/b &&
-     treeH=$(git write-tree) &&
-     echo treeH $treeH &&
-     git ls-tree $treeH'
-
-test_expect_success \
-    'a/b vs a, plus c/d case test.' \
-    'read_tree_u_must_succeed -u -m "$treeH" "$treeM" &&
-     git ls-files --stage | tee >treeMcheck.out &&
-     test_cmp treeM.out treeMcheck.out'
+test_expect_success 'DF vs DF/DF case setup.' '
+       rm -f .git/index &&
+       echo DF >DF &&
+       git update-index --add DF &&
+       treeDF=$(git write-tree) &&
+       echo treeDF $treeDF &&
+       git ls-tree $treeDF &&
+
+       rm -f DF &&
+       mkdir DF &&
+       echo DF/DF >DF/DF &&
+       git update-index --add --remove DF DF/DF &&
+       treeDFDF=$(git write-tree) &&
+       echo treeDFDF $treeDFDF &&
+       git ls-tree $treeDFDF &&
+       git ls-files --stage >DFDF.out
+'
+
+test_expect_success 'DF vs DF/DF case test.' '
+       rm -f .git/index &&
+       rm -fr DF &&
+       echo DF >DF &&
+       git update-index --add DF &&
+       read_tree_twoway $treeDF $treeDFDF &&
+       git ls-files --stage >DFDFcheck.out &&
+       test_cmp DFDF.out DFDFcheck.out &&
+       check_cache_at DF/DF dirty &&
+       :
+'
+
+test_expect_success 'a/b (untracked) vs a case setup.' '
+       rm -f .git/index &&
+       : >a &&
+       git update-index --add a &&
+       treeM=$(git write-tree) &&
+       echo treeM $treeM &&
+       git ls-tree $treeM &&
+       git ls-files --stage >treeM.out &&
+
+       rm -f a &&
+       git update-index --remove a &&
+       mkdir a &&
+       : >a/b &&
+       treeH=$(git write-tree) &&
+       echo treeH $treeH &&
+       git ls-tree $treeH
+'
+
+test_expect_success 'a/b (untracked) vs a, plus c/d case test.' '
+       read_tree_u_must_fail -u -m "$treeH" "$treeM" &&
+       git ls-files --stage &&
+       test -f a/b
+'
+
+test_expect_success 'read-tree supports the super-prefix' '
+       cat <<-EOF >expect &&
+               error: Updating '\''fictional/a'\'' would lose untracked files in it
+       EOF
+       test_must_fail git --super-prefix fictional/ read-tree -u -m "$treeH" "$treeM" 2>actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'a/b vs a, plus c/d case setup.' '
+       rm -f .git/index &&
+       rm -fr a &&
+       : >a &&
+       mkdir c &&
+       : >c/d &&
+       git update-index --add a c/d &&
+       treeM=$(git write-tree) &&
+       echo treeM $treeM &&
+       git ls-tree $treeM &&
+       git ls-files --stage >treeM.out &&
+
+       rm -f a &&
+       mkdir a &&
+       : >a/b &&
+       git update-index --add --remove a a/b &&
+       treeH=$(git write-tree) &&
+       echo treeH $treeH &&
+       git ls-tree $treeH
+'
+
+test_expect_success 'a/b vs a, plus c/d case test.' '
+       read_tree_u_must_succeed -u -m "$treeH" "$treeM" &&
+       git ls-files --stage | tee >treeMcheck.out &&
+       test_cmp treeM.out treeMcheck.out
+'
 
 test_expect_success '-m references the correct modified tree' '
        echo >file-a &&
index 7d2baa15bbd0bbbe8c12631ad2d24b77e90b8775..532682f51c4f9cefc34a44cf7e7f4231c60b7f65 100755 (executable)
@@ -101,7 +101,7 @@ test_expect_success 'git hash-object --stdin file1 <file0 first operates on file
        test "$obname1" = "$obname1new"
 '
 
-test_expect_success 'check that appropriate filter is invoke when --path is used' '
+test_expect_success 'set up crlf tests' '
        echo fooQ | tr Q "\\015" >file0 &&
        cp file0 file1 &&
        echo "file0 -crlf" >.gitattributes &&
@@ -109,7 +109,10 @@ test_expect_success 'check that appropriate filter is invoke when --path is used
        git config core.autocrlf true &&
        file0_sha=$(git hash-object file0) &&
        file1_sha=$(git hash-object file1) &&
-       test "$file0_sha" != "$file1_sha" &&
+       test "$file0_sha" != "$file1_sha"
+'
+
+test_expect_success 'check that appropriate filter is invoke when --path is used' '
        path1_sha=$(git hash-object --path=file1 file0) &&
        path0_sha=$(git hash-object --path=file0 file1) &&
        test "$file0_sha" = "$path0_sha" &&
@@ -117,38 +120,40 @@ test_expect_success 'check that appropriate filter is invoke when --path is used
        path1_sha=$(cat file0 | git hash-object --path=file1 --stdin) &&
        path0_sha=$(cat file1 | git hash-object --path=file0 --stdin) &&
        test "$file0_sha" = "$path0_sha" &&
-       test "$file1_sha" = "$path1_sha" &&
-       git config --unset core.autocrlf
+       test "$file1_sha" = "$path1_sha"
+'
+
+test_expect_success 'gitattributes also work in a subdirectory' '
+       mkdir subdir &&
+       (
+               cd subdir &&
+               subdir_sha0=$(git hash-object ../file0) &&
+               subdir_sha1=$(git hash-object ../file1) &&
+               test "$file0_sha" = "$subdir_sha0" &&
+               test "$file1_sha" = "$subdir_sha1"
+       )
+'
+
+test_expect_success '--path works in a subdirectory' '
+       (
+               cd subdir &&
+               path1_sha=$(git hash-object --path=../file1 ../file0) &&
+               path0_sha=$(git hash-object --path=../file0 ../file1) &&
+               test "$file0_sha" = "$path0_sha" &&
+               test "$file1_sha" = "$path1_sha"
+       )
 '
 
 test_expect_success 'check that --no-filters option works' '
-       echo fooQ | tr Q "\\015" >file0 &&
-       cp file0 file1 &&
-       echo "file0 -crlf" >.gitattributes &&
-       echo "file1 crlf" >>.gitattributes &&
-       git config core.autocrlf true &&
-       file0_sha=$(git hash-object file0) &&
-       file1_sha=$(git hash-object file1) &&
-       test "$file0_sha" != "$file1_sha" &&
        nofilters_file1=$(git hash-object --no-filters file1) &&
        test "$file0_sha" = "$nofilters_file1" &&
        nofilters_file1=$(cat file1 | git hash-object --stdin) &&
-       test "$file0_sha" = "$nofilters_file1" &&
-       git config --unset core.autocrlf
+       test "$file0_sha" = "$nofilters_file1"
 '
 
 test_expect_success 'check that --no-filters option works with --stdin-paths' '
-       echo fooQ | tr Q "\\015" >file0 &&
-       cp file0 file1 &&
-       echo "file0 -crlf" >.gitattributes &&
-       echo "file1 crlf" >>.gitattributes &&
-       git config core.autocrlf true &&
-       file0_sha=$(git hash-object file0) &&
-       file1_sha=$(git hash-object file1) &&
-       test "$file0_sha" != "$file1_sha" &&
        nofilters_file1=$(echo "file1" | git hash-object --stdin-paths --no-filters) &&
-       test "$file0_sha" = "$nofilters_file1" &&
-       git config --unset core.autocrlf
+       test "$file0_sha" = "$nofilters_file1"
 '
 
 pop_repo
@@ -188,9 +193,30 @@ for args in "-w --stdin-paths" "--stdin-paths -w"; do
        pop_repo
 done
 
-test_expect_success 'corrupt tree' '
+test_expect_success 'too-short tree' '
        echo abc >malformed-tree &&
-       test_must_fail git hash-object -t tree malformed-tree
+       test_must_fail git hash-object -t tree malformed-tree 2>err &&
+       test_i18ngrep "too-short tree object" err
+'
+
+hex2oct() {
+    perl -ne 'printf "\\%03o", hex for /../g'
+}
+
+test_expect_success 'malformed mode in tree' '
+       hex_sha1=$(echo foo | git hash-object --stdin -w) &&
+       bin_sha1=$(echo $hex_sha1 | hex2oct) &&
+       printf "9100644 \0$bin_sha1" >tree-with-malformed-mode &&
+       test_must_fail git hash-object -t tree tree-with-malformed-mode 2>err &&
+       test_i18ngrep "malformed mode in tree entry" err
+'
+
+test_expect_success 'empty filename in tree' '
+       hex_sha1=$(echo foo | git hash-object --stdin -w) &&
+       bin_sha1=$(echo $hex_sha1 | hex2oct) &&
+       printf "100644 \0$bin_sha1" >tree-with-empty-filename &&
+       test_must_fail git hash-object -t tree tree-with-empty-filename 2>err &&
+       test_i18ngrep "empty filename in tree entry" err
 '
 
 test_expect_success 'corrupt commit' '
index 20526aed34212597179eff4bec41866ae3254183..7019d0a04feb7714f0ed8aad1d093c3a3878c78a 100755 (executable)
@@ -5,6 +5,13 @@ test_description='read-tree can handle submodules'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 
+KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS=1
+KNOWN_FAILURE_SUBMODULE_OVERWRITE_IGNORED_UNTRACKED=1
+
+test_submodule_switch_recursing "git read-tree --recurse-submodules -u -m"
+
+test_submodule_forced_switch_recursing "git read-tree --recurse-submodules -u --reset"
+
 test_submodule_switch "git read-tree -u -m"
 
 test_submodule_forced_switch "git read-tree -u --reset"
index 096dbffecc3d51478b643bd2f4dee92f507e1c1a..6fd264cff0d6de1961656c2cd1193d8ce37e9a1f 100755 (executable)
@@ -5,6 +5,12 @@ test_description='adding and checking out large blobs'
 
 . ./test-lib.sh
 
+# This should be moved to test-lib.sh together with the
+# copy in t0021 after both topics have graduated to 'master'.
+file_size () {
+       perl -e 'print -s $ARGV[0]' "$1"
+}
+
 test_expect_success setup '
        # clone does not allow us to pass core.bigfilethreshold to
        # new repos, so set core.bigfilethreshold globally
@@ -17,6 +23,29 @@ test_expect_success setup '
        export GIT_ALLOC_LIMIT
 '
 
+# add a large file with different settings
+while read expect config
+do
+       test_expect_success "add with $config" '
+               test_when_finished "rm -f .git/objects/pack/pack-*.* .git/index" &&
+               git $config add large1 &&
+               sz=$(file_size .git/objects/pack/pack-*.pack) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c pack.compression=0
+large -c core.compression=9 -c pack.compression=0
+small -c core.compression=0 -c pack.compression=9
+small -c core.compression=9 -c pack.compression=9
+large -c pack.compression=0
+small -c pack.compression=9
+EOF
+
 test_expect_success 'add a large file or two' '
        git add large1 huge large2 &&
        # make sure we got a single packfile and no loose objects
index 3f8705139d74e8e358ae60cabe5d1cd92d316489..ac1f189fd29b171c16af17e1d3ddda48f557df89 100755 (executable)
@@ -21,6 +21,14 @@ test_expect_success 'setup corrupt repo' '
                cd bit-error &&
                test_commit content &&
                corrupt_byte HEAD:content.t 10
+       ) &&
+       git init no-bit-error &&
+       (
+               # distinct commit from bit-error, but containing a
+               # non-corrupted version of the same blob
+               cd no-bit-error &&
+               test_tick &&
+               test_commit content
        )
 '
 
@@ -53,6 +61,13 @@ test_expect_success 'streaming a corrupt blob fails' '
        )
 '
 
+test_expect_success 'getting type of a corrupt blob fails' '
+       (
+               cd bit-error &&
+               test_must_fail git cat-file -s HEAD:content.t
+       )
+'
+
 test_expect_success 'read-tree -u detects bit-errors in blobs' '
        (
                cd bit-error &&
@@ -101,4 +116,13 @@ test_expect_failure 'clone --local detects misnamed objects' '
        test_must_fail git clone --local misnamed misnamed-checkout
 '
 
+test_expect_success 'fetch into corrupted repo with index-pack' '
+       (
+               cd bit-error &&
+               test_must_fail git -c transfer.unpackLimit=1 \
+                       fetch ../no-bit-error 2>stderr &&
+               test_i18ngrep ! -i collision stderr
+       )
+'
+
 test_done
index 923bfc5a2606588f30bebbcfd4c34788976c354c..a37ef0422212eafdae4b4c0fae9e28d4a183117f 100755 (executable)
@@ -703,6 +703,12 @@ test_expect_success 'invalid unit' '
        test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual
 '
 
+test_expect_success 'line number is reported correctly' '
+       printf "[bool]\n\tvar\n" >invalid &&
+       test_must_fail git config -f invalid --path bool.var 2>actual &&
+       test_i18ngrep "line 2" actual
+'
+
 test_expect_success 'invalid stdin config' '
        echo "[broken" | test_must_fail git config --list --file - >output 2>&1 &&
        test_i18ngrep "bad config line 1 in standard input" output
@@ -1097,6 +1103,68 @@ test_expect_success 'multiple git -c appends config' '
        test_cmp expect actual
 '
 
+test_expect_success 'last one wins: two level vars' '
+
+       # sec.var and sec.VAR are the same variable, as the first
+       # and the last level of a configuration variable name is
+       # case insensitive.
+
+       echo VAL >expect &&
+
+       git -c sec.var=val -c sec.VAR=VAL config --get sec.var >actual &&
+       test_cmp expect actual &&
+       git -c SEC.var=val -c sec.var=VAL config --get sec.var >actual &&
+       test_cmp expect actual &&
+
+       git -c sec.var=val -c sec.VAR=VAL config --get SEC.var >actual &&
+       test_cmp expect actual &&
+       git -c SEC.var=val -c sec.var=VAL config --get sec.VAR >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'last one wins: three level vars' '
+
+       # v.a.r and v.A.r are not the same variable, as the middle
+       # level of a three-level configuration variable name is
+       # case sensitive.
+
+       echo val >expect &&
+       git -c v.a.r=val -c v.A.r=VAL config --get v.a.r >actual &&
+       test_cmp expect actual &&
+       git -c v.a.r=val -c v.A.r=VAL config --get V.a.R >actual &&
+       test_cmp expect actual &&
+
+       # v.a.r and V.a.R are the same variable, as the first
+       # and the last level of a configuration variable name is
+       # case insensitive.
+
+       echo VAL >expect &&
+       git -c v.a.r=val -c v.a.R=VAL config --get v.a.r >actual &&
+       test_cmp expect actual &&
+       git -c v.a.r=val -c V.a.r=VAL config --get v.a.r >actual &&
+       test_cmp expect actual &&
+       git -c v.a.r=val -c v.a.R=VAL config --get V.a.R >actual &&
+       test_cmp expect actual &&
+       git -c v.a.r=val -c V.a.r=VAL config --get V.a.R >actual &&
+       test_cmp expect actual
+'
+
+for VAR in a .a a. a.0b a."b c". a."b c".0d
+do
+       test_expect_success "git -c $VAR=VAL rejects invalid '$VAR'" '
+               test_must_fail git -c "$VAR=VAL" config -l
+       '
+done
+
+for VAR in a.b a."b c".d
+do
+       test_expect_success "git -c $VAR=VAL works with valid '$VAR'" '
+               echo VAL >expect &&
+               git -c "$VAR=VAL" config --get "$VAR" >actual &&
+               test_cmp expect actual
+       '
+done
+
 test_expect_success 'git -c is not confused by empty environment' '
        GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
 '
@@ -1177,6 +1245,111 @@ test_expect_success 'urlmatch' '
        test_cmp expect actual
 '
 
+test_expect_success 'urlmatch favors more specific URLs' '
+       cat >.git/config <<-\EOF &&
+       [http "https://example.com/"]
+               cookieFile = /tmp/root.txt
+       [http "https://example.com/subdirectory"]
+               cookieFile = /tmp/subdirectory.txt
+       [http "https://user@example.com/"]
+               cookieFile = /tmp/user.txt
+       [http "https://averylonguser@example.com/"]
+               cookieFile = /tmp/averylonguser.txt
+       [http "https://preceding.example.com"]
+               cookieFile = /tmp/preceding.txt
+       [http "https://*.example.com"]
+               cookieFile = /tmp/wildcard.txt
+       [http "https://*.example.com/wildcardwithsubdomain"]
+               cookieFile = /tmp/wildcardwithsubdomain.txt
+       [http "https://trailing.example.com"]
+               cookieFile = /tmp/trailing.txt
+       [http "https://user@*.example.com/"]
+               cookieFile = /tmp/wildcardwithuser.txt
+       [http "https://sub.example.com/"]
+               cookieFile = /tmp/sub.txt
+       EOF
+
+       echo http.cookiefile /tmp/root.txt >expect &&
+       git config --get-urlmatch HTTP https://example.com >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/subdirectory.txt >expect &&
+       git config --get-urlmatch HTTP https://example.com/subdirectory >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/subdirectory.txt >expect &&
+       git config --get-urlmatch HTTP https://example.com/subdirectory/nested >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/user.txt >expect &&
+       git config --get-urlmatch HTTP https://user@example.com/ >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/subdirectory.txt >expect &&
+       git config --get-urlmatch HTTP https://averylonguser@example.com/subdirectory >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/preceding.txt >expect &&
+       git config --get-urlmatch HTTP https://preceding.example.com >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/wildcard.txt >expect &&
+       git config --get-urlmatch HTTP https://wildcard.example.com >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/sub.txt >expect &&
+       git config --get-urlmatch HTTP https://sub.example.com/wildcardwithsubdomain >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/trailing.txt >expect &&
+       git config --get-urlmatch HTTP https://trailing.example.com >actual &&
+       test_cmp expect actual &&
+
+       echo http.cookiefile /tmp/sub.txt >expect &&
+       git config --get-urlmatch HTTP https://user@sub.example.com >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'urlmatch with wildcard' '
+       cat >.git/config <<-\EOF &&
+       [http]
+               sslVerify
+       [http "https://*.example.com"]
+               sslVerify = false
+               cookieFile = /tmp/cookie.txt
+       EOF
+
+       test_expect_code 1 git config --bool --get-urlmatch doesnt.exist https://good.example.com >actual &&
+       test_must_be_empty actual &&
+
+       echo true >expect &&
+       git config --bool --get-urlmatch http.SSLverify https://example.com >actual &&
+       test_cmp expect actual &&
+
+       echo true >expect &&
+       git config --bool --get-urlmatch http.SSLverify https://good-example.com >actual &&
+       test_cmp expect actual &&
+
+       echo true >expect &&
+       git config --bool --get-urlmatch http.sslverify https://deep.nested.example.com >actual &&
+       test_cmp expect actual &&
+
+       echo false >expect &&
+       git config --bool --get-urlmatch http.sslverify https://good.example.com >actual &&
+       test_cmp expect actual &&
+
+       {
+               echo http.cookiefile /tmp/cookie.txt &&
+               echo http.sslverify false
+       } >expect &&
+       git config --get-urlmatch HTTP https://good.example.com >actual &&
+       test_cmp expect actual &&
+
+       echo http.sslverify >expect &&
+       git config --get-urlmatch HTTP https://more.example.com.au >actual &&
+       test_cmp expect actual
+'
+
 # good section hygiene
 test_expect_failure 'unsetting the last key in a section removes header' '
        cat >.git/config <<-\EOF &&
@@ -1372,4 +1545,10 @@ test_expect_success !MINGW '--show-origin blob ref' '
        test_cmp expect output
 '
 
+test_expect_success '--local requires a repo' '
+       # we expect 128 to ensure that we do not simply
+       # fail to find anything and return code "1"
+       test_expect_code 128 nongit git config --local foo.bar
+'
+
 test_done
index ac108754088d34758a75f14943516c4a701f0ca8..1312004f8c8ab11b5aafe0eb1f1fb02f1e4f61d5 100755 (executable)
@@ -172,4 +172,45 @@ test_expect_success POSIXPERM 'forced modes' '
        }" actual)"
 '
 
+test_expect_success POSIXPERM 'remote init does not use config from cwd' '
+       git config core.sharedrepository 0666 &&
+       umask 0022 &&
+       git init --bare child.git &&
+       echo "-rw-r--r--" >expect &&
+       modebits child.git/config >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success POSIXPERM 're-init respects core.sharedrepository (local)' '
+       git config core.sharedrepository 0666 &&
+       umask 0022 &&
+       echo whatever >templates/foo &&
+       git init --template=templates &&
+       echo "-rw-rw-rw-" >expect &&
+       modebits .git/foo >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success POSIXPERM 're-init respects core.sharedrepository (remote)' '
+       rm -rf child.git &&
+       umask 0022 &&
+       git init --bare --shared=0666 child.git &&
+       test_path_is_missing child.git/foo &&
+       git init --bare --template=../templates child.git &&
+       echo "-rw-rw-rw-" >expect &&
+       modebits child.git/foo >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success POSIXPERM 'template can set core.sharedrepository' '
+       rm -rf child.git &&
+       umask 0022 &&
+       git config core.sharedrepository 0666 &&
+       cp .git/config templates/config &&
+       git init --bare --template=../templates child.git &&
+       echo "-rw-rw-rw-" >expect &&
+       modebits child.git/HEAD >actual &&
+       test_cmp expect actual
+'
+
 test_done
index 9bcd34969f56038d3933471bc32641a277d413ba..ce4cff13bbced58add641a463321f36673121fd7 100755 (executable)
@@ -25,46 +25,26 @@ test_expect_success 'setup' '
 test_expect_success 'gitdir selection on normal repos' '
        echo 0 >expect &&
        git config core.repositoryformatversion >actual &&
-       (
-               cd test &&
-               git config core.repositoryformatversion >../actual2
-       ) &&
+       git -C test config core.repositoryformatversion >actual2 &&
        test_cmp expect actual &&
        test_cmp expect actual2
 '
 
 test_expect_success 'gitdir selection on unsupported repo' '
        # Make sure it would stop at test2, not trash
-       echo 99 >expect &&
-       (
-               cd test2 &&
-               git config core.repositoryformatversion >../actual
-       ) &&
-       test_cmp expect actual
+       test_expect_code 1 git -C test2 config core.repositoryformatversion >actual
 '
 
 test_expect_success 'gitdir not required mode' '
        git apply --stat test.patch &&
-       (
-               cd test &&
-               git apply --stat ../test.patch
-       ) &&
-       (
-               cd test2 &&
-               git apply --stat ../test.patch
-       )
+       git -C test apply --stat ../test.patch &&
+       git -C test2 apply --stat ../test.patch
 '
 
 test_expect_success 'gitdir required mode' '
        git apply --check --index test.patch &&
-       (
-               cd test &&
-               git apply --check --index ../test.patch
-       ) &&
-       (
-               cd test2 &&
-               test_must_fail git apply --check --index ../test.patch
-       )
+       git -C test apply --check --index ../test.patch &&
+       test_must_fail git -C test2 apply --check --index ../test.patch
 '
 
 check_allow () {
index 9ba2ba11c3cac88154dbb2d522b43adf98a8dee7..933915ec06ec725f7cf6a9ed3e251f6ff2390f76 100755 (executable)
@@ -3,6 +3,16 @@
 test_description='test config file include directives'
 . ./test-lib.sh
 
+# Force setup_explicit_git_dir() to run until the end. This is needed
+# by some tests to make sure real_path() is called on $GIT_DIR. The
+# caller needs to make sure git commands are run from a subdirectory
+# though or real_path() will not be called.
+force_setup_explicit_git_dir() {
+    GIT_DIR="$(pwd)/.git"
+    GIT_WORK_TREE="$(pwd)"
+    export GIT_DIR GIT_WORK_TREE
+}
+
 test_expect_success 'include file by absolute path' '
        echo "[test]one = 1" >one &&
        echo "[include]path = \"$(pwd)/one\"" >.gitconfig &&
@@ -102,7 +112,7 @@ test_expect_success 'config modification does not affect includes' '
 
 test_expect_success 'missing include files are ignored' '
        cat >.gitconfig <<-\EOF &&
-       [include]path = foo
+       [include]path = non-existent
        [test]value = yes
        EOF
        echo yes >expect &&
@@ -152,6 +162,117 @@ test_expect_success 'relative includes from stdin line fail' '
        test_must_fail git config --file - test.one
 '
 
+test_expect_success 'conditional include, both unanchored' '
+       git init foo &&
+       (
+               cd foo &&
+               echo "[includeIf \"gitdir:foo/\"]path=bar" >>.git/config &&
+               echo "[test]one=1" >.git/bar &&
+               echo 1 >expect &&
+               git config test.one >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'conditional include, $HOME expansion' '
+       (
+               cd foo &&
+               echo "[includeIf \"gitdir:~/foo/\"]path=bar2" >>.git/config &&
+               echo "[test]two=2" >.git/bar2 &&
+               echo 2 >expect &&
+               git config test.two >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'conditional include, full pattern' '
+       (
+               cd foo &&
+               echo "[includeIf \"gitdir:**/foo/**\"]path=bar3" >>.git/config &&
+               echo "[test]three=3" >.git/bar3 &&
+               echo 3 >expect &&
+               git config test.three >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'conditional include, relative path' '
+       echo "[includeIf \"gitdir:./foo/.git\"]path=bar4" >>.gitconfig &&
+       echo "[test]four=4" >bar4 &&
+       (
+               cd foo &&
+               echo 4 >expect &&
+               git config test.four >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'conditional include, both unanchored, icase' '
+       (
+               cd foo &&
+               echo "[includeIf \"gitdir/i:FOO/\"]path=bar5" >>.git/config &&
+               echo "[test]five=5" >.git/bar5 &&
+               echo 5 >expect &&
+               git config test.five >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'conditional include, early config reading' '
+       (
+               cd foo &&
+               echo "[includeIf \"gitdir:foo/\"]path=bar6" >>.git/config &&
+               echo "[test]six=6" >.git/bar6 &&
+               echo 6 >expect &&
+               test-config read_early_config test.six >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success SYMLINKS 'conditional include, set up symlinked $HOME' '
+       mkdir real-home &&
+       ln -s real-home home &&
+       (
+               HOME="$TRASH_DIRECTORY/home" &&
+               export HOME &&
+               cd "$HOME" &&
+
+               git init foo &&
+               cd foo &&
+               mkdir sub
+       )
+'
+
+test_expect_success SYMLINKS 'conditional include, $HOME expansion with symlinks' '
+       (
+               HOME="$TRASH_DIRECTORY/home" &&
+               export HOME &&
+               cd "$HOME"/foo &&
+
+               echo "[includeIf \"gitdir:~/foo/\"]path=bar2" >>.git/config &&
+               echo "[test]two=2" >.git/bar2 &&
+               echo 2 >expect &&
+               force_setup_explicit_git_dir &&
+               git -C sub config test.two >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success SYMLINKS 'conditional include, relative path with symlinks' '
+       echo "[includeIf \"gitdir:./foo/.git\"]path=bar4" >home/.gitconfig &&
+       echo "[test]four=4" >home/bar4 &&
+       (
+               HOME="$TRASH_DIRECTORY/home" &&
+               export HOME &&
+               cd "$HOME"/foo &&
+
+               echo 4 >expect &&
+               force_setup_explicit_git_dir &&
+               git -C sub config test.four >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_expect_success 'include cycles are detected' '
        cat >.gitconfig <<-\EOF &&
        [test]value = gitconfig
index 7655c94c2801f0070a7b60ea17f30414b16c8d12..69a0aa56d6d7b759e71a57d24b838fe21a544777 100755 (executable)
@@ -215,18 +215,14 @@ test_expect_success 'check line errors for malformed values' '
                br
        EOF
        test_expect_code 128 git br 2>result &&
-       test_i18ngrep "fatal: .*alias\.br.*\.git/config.*line 2" result
+       test_i18ngrep "missing value for .alias\.br" result &&
+       test_i18ngrep "fatal: .*\.git/config" result &&
+       test_i18ngrep "fatal: .*line 2" result
 '
 
 test_expect_success 'error on modifying repo config without repo' '
-       mkdir no-repo &&
-       (
-               GIT_CEILING_DIRECTORIES=$(pwd) &&
-               export GIT_CEILING_DIRECTORIES &&
-               cd no-repo &&
-               test_must_fail git config a.b c 2>err &&
-               grep "not in a git directory" err
-       )
+       nongit test_must_fail git config a.b c 2>err &&
+       grep "not in a git directory" err
 '
 
 cmdline_config="'foo.bar=from-cmdline'"
diff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh
new file mode 100755 (executable)
index 0000000..3dda215
--- /dev/null
@@ -0,0 +1,92 @@
+#!/bin/sh
+
+test_description='Test read_early_config()'
+
+. ./test-lib.sh
+
+test_expect_success 'read early config' '
+       test_config early.config correct &&
+       test-config read_early_config early.config >output &&
+       test correct = "$(cat output)"
+'
+
+test_expect_success 'in a sub-directory' '
+       test_config early.config sub &&
+       mkdir -p sub &&
+       (
+               cd sub &&
+               test-config read_early_config early.config
+       ) >output &&
+       test sub = "$(cat output)"
+'
+
+test_expect_success 'ceiling' '
+       test_config early.config ceiling &&
+       mkdir -p sub &&
+       (
+               GIT_CEILING_DIRECTORIES="$PWD" &&
+               export GIT_CEILING_DIRECTORIES &&
+               cd sub &&
+               test-config read_early_config early.config
+       ) >output &&
+       test -z "$(cat output)"
+'
+
+test_expect_success 'ceiling #2' '
+       mkdir -p xdg/git &&
+       git config -f xdg/git/config early.config xdg &&
+       test_config early.config ceiling &&
+       mkdir -p sub &&
+       (
+               XDG_CONFIG_HOME="$PWD"/xdg &&
+               GIT_CEILING_DIRECTORIES="$PWD" &&
+               export GIT_CEILING_DIRECTORIES XDG_CONFIG_HOME &&
+               cd sub &&
+               test-config read_early_config early.config
+       ) >output &&
+       test xdg = "$(cat output)"
+'
+
+cmdline_config="'test.source=cmdline'"
+test_expect_success 'read config file in right order' '
+       echo "[test]source = home" >>.gitconfig &&
+       git init foo &&
+       (
+               cd foo &&
+               echo "[test]source = repo" >>.git/config &&
+               GIT_CONFIG_PARAMETERS=$cmdline_config test-config \
+                       read_early_config test.source >actual &&
+               cat >expected <<-\EOF &&
+               home
+               repo
+               cmdline
+               EOF
+               test_cmp expected actual
+       )
+'
+
+test_with_config () {
+       rm -rf throwaway &&
+       git init throwaway &&
+       (
+               cd throwaway &&
+               echo "$*" >.git/config &&
+               test-config read_early_config early.config
+       )
+}
+
+test_expect_success 'ignore .git/ with incompatible repository version' '
+       test_with_config "[core]repositoryformatversion = 999999" 2>err &&
+       test_i18ngrep "warning:.* Expected git repo version <= [1-9]" err
+'
+
+test_expect_failure 'ignore .git/ with invalid repository version' '
+       test_with_config "[core]repositoryformatversion = invalid"
+'
+
+
+test_expect_failure 'ignore .git/ with invalid config' '
+       test_with_config "["
+'
+
+test_done
index d4fb9770600df75d3162ffbc6c567b1ae152fccd..dc98b4bc6dc7aab41eca38d9e1086ad2b6701fd3 100755 (executable)
@@ -8,72 +8,100 @@ test_description='Test git update-ref and basic ref logging'
 
 Z=$_z40
 
-test_expect_success setup '
+m=refs/heads/master
+n_dir=refs/heads/gu
+n=$n_dir/fixes
+outside=refs/foo
+bare=bare-repo
 
+create_test_commits ()
+{
+       prfx="$1"
        for name in A B C D E F
        do
                test_tick &&
                T=$(git write-tree) &&
                sha1=$(echo $name | git commit-tree $T) &&
-               eval $name=$sha1
+               eval $prfx$name=$sha1
        done
+}
 
+test_expect_success setup '
+       create_test_commits "" &&
+       mkdir $bare &&
+       cd $bare &&
+       git init --bare &&
+       create_test_commits "bare" &&
+       cd -
 '
 
-m=refs/heads/master
-n_dir=refs/heads/gu
-n=$n_dir/fixes
-outside=refs/foo
-
-test_expect_success \
-       "create $m" \
-       "git update-ref $m $A &&
-        test $A"' = $(cat .git/'"$m"')'
-test_expect_success \
-       "create $m" \
-       "git update-ref $m $B $A &&
-        test $B"' = $(cat .git/'"$m"')'
+test_expect_success "create $m" '
+       git update-ref $m $A &&
+       test $A = $(cat .git/$m)
+'
+test_expect_success "create $m with oldvalue verification" '
+       git update-ref $m $B $A &&
+       test $B = $(cat .git/$m)
+'
 test_expect_success "fail to delete $m with stale ref" '
        test_must_fail git update-ref -d $m $A &&
        test $B = "$(cat .git/$m)"
 '
 test_expect_success "delete $m" '
+       test_when_finished "rm -f .git/$m" &&
        git update-ref -d $m $B &&
-       ! test -f .git/$m
+       test_path_is_missing .git/$m
 '
-rm -f .git/$m
 
-test_expect_success "delete $m without oldvalue verification" "
+test_expect_success "delete $m without oldvalue verification" '
+       test_when_finished "rm -f .git/$m" &&
        git update-ref $m $A &&
-       test $A = \$(cat .git/$m) &&
+       test $A = $(cat .git/$m) &&
        git update-ref -d $m &&
-       ! test -f .git/$m
-"
-rm -f .git/$m
-
-test_expect_success \
-       "fail to create $n" \
-       "touch .git/$n_dir &&
-        test_must_fail git update-ref $n $A >out 2>err"
-rm -f .git/$n_dir out err
-
-test_expect_success \
-       "create $m (by HEAD)" \
-       "git update-ref HEAD $A &&
-        test $A"' = $(cat .git/'"$m"')'
-test_expect_success \
-       "create $m (by HEAD)" \
-       "git update-ref HEAD $B $A &&
-        test $B"' = $(cat .git/'"$m"')'
+       test_path_is_missing .git/$m
+'
+
+test_expect_success "fail to create $n" '
+       test_when_finished "rm -f .git/$n_dir" &&
+       touch .git/$n_dir &&
+       test_must_fail git update-ref $n $A
+'
+
+test_expect_success "create $m (by HEAD)" '
+       git update-ref HEAD $A &&
+       test $A = $(cat .git/$m)
+'
+test_expect_success "create $m (by HEAD) with oldvalue verification" '
+       git update-ref HEAD $B $A &&
+       test $B = $(cat .git/$m)
+'
 test_expect_success "fail to delete $m (by HEAD) with stale ref" '
        test_must_fail git update-ref -d HEAD $A &&
        test $B = $(cat .git/$m)
 '
 test_expect_success "delete $m (by HEAD)" '
+       test_when_finished "rm -f .git/$m" &&
        git update-ref -d HEAD $B &&
-       ! test -f .git/$m
+       test_path_is_missing .git/$m
+'
+
+test_expect_success "deleting current branch adds message to HEAD's log" '
+       test_when_finished "rm -f .git/$m" &&
+       git update-ref $m $A &&
+       git symbolic-ref HEAD $m &&
+       git update-ref -m delete-$m -d $m &&
+       test_path_is_missing .git/$m &&
+       grep "delete-$m$" .git/logs/HEAD
+'
+
+test_expect_success "deleting by HEAD adds message to HEAD's log" '
+       test_when_finished "rm -f .git/$m" &&
+       git update-ref $m $A &&
+       git symbolic-ref HEAD $m &&
+       git update-ref -m delete-by-head -d HEAD &&
+       test_path_is_missing .git/$m &&
+       grep "delete-by-head$" .git/logs/HEAD
 '
-rm -f .git/$m
 
 test_expect_success 'update-ref does not create reflogs by default' '
        test_when_finished "git update-ref -d $outside" &&
@@ -93,40 +121,96 @@ test_expect_success 'update-ref creates reflogs with --create-reflog' '
        git reflog exists $outside
 '
 
-test_expect_success \
-       "create $m (by HEAD)" \
-       "git update-ref HEAD $A &&
-        test $A"' = $(cat .git/'"$m"')'
-test_expect_success \
-       "pack refs" \
-       "git pack-refs --all"
-test_expect_success \
-       "move $m (by HEAD)" \
-       "git update-ref HEAD $B $A &&
-        test $B"' = $(cat .git/'"$m"')'
+test_expect_success 'creates no reflog in bare repository' '
+       git -C $bare update-ref $m $bareA &&
+       git -C $bare rev-parse $bareA >expect &&
+       git -C $bare rev-parse $m >actual &&
+       test_cmp expect actual &&
+       test_must_fail git -C $bare reflog exists $m
+'
+
+test_expect_success 'core.logAllRefUpdates=true creates reflog in bare repository' '
+       test_when_finished "git -C $bare config --unset core.logAllRefUpdates && \
+               rm $bare/logs/$m" &&
+       git -C $bare config core.logAllRefUpdates true &&
+       git -C $bare update-ref $m $bareB &&
+       git -C $bare rev-parse $bareB >expect &&
+       git -C $bare rev-parse $m >actual &&
+       test_cmp expect actual &&
+       git -C $bare reflog exists $m
+'
+
+test_expect_success 'core.logAllRefUpdates=true does not create reflog by default' '
+       test_config core.logAllRefUpdates true &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       test_must_fail git reflog exists $outside
+'
+
+test_expect_success 'core.logAllRefUpdates=always creates reflog by default' '
+       test_config core.logAllRefUpdates always &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       git reflog exists $outside
+'
+
+test_expect_success 'core.logAllRefUpdates=always creates no reflog for ORIG_HEAD' '
+       test_config core.logAllRefUpdates always &&
+       git update-ref ORIG_HEAD $A &&
+       test_must_fail git reflog exists ORIG_HEAD
+'
+
+test_expect_success '--no-create-reflog overrides core.logAllRefUpdates=always' '
+       test_config core.logAllRefUpdates true &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref --no-create-reflog $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       test_must_fail git reflog exists $outside
+'
+
+test_expect_success "create $m (by HEAD)" '
+       git update-ref HEAD $A &&
+       test $A = $(cat .git/$m)
+'
+test_expect_success 'pack refs' '
+       git pack-refs --all
+'
+test_expect_success "move $m (by HEAD)" '
+       git update-ref HEAD $B $A &&
+       test $B = $(cat .git/$m)
+'
 test_expect_success "delete $m (by HEAD) should remove both packed and loose $m" '
+       test_when_finished "rm -f .git/$m" &&
        git update-ref -d HEAD $B &&
        ! grep "$m" .git/packed-refs &&
-       ! test -f .git/$m
+       test_path_is_missing .git/$m
 '
-rm -f .git/$m
 
 cp -f .git/HEAD .git/HEAD.orig
-test_expect_success "delete symref without dereference" '
+test_expect_success 'delete symref without dereference' '
+       test_when_finished "cp -f .git/HEAD.orig .git/HEAD" &&
        git update-ref --no-deref -d HEAD &&
-       ! test -f .git/HEAD
+       test_path_is_missing .git/HEAD
 '
-cp -f .git/HEAD.orig .git/HEAD
 
-test_expect_success "delete symref without dereference when the referred ref is packed" '
+test_expect_success 'delete symref without dereference when the referred ref is packed' '
+       test_when_finished "cp -f .git/HEAD.orig .git/HEAD" &&
        echo foo >foo.c &&
        git add foo.c &&
        git commit -m foo &&
        git pack-refs --all &&
        git update-ref --no-deref -d HEAD &&
-       ! test -f .git/HEAD
+       test_path_is_missing .git/HEAD
 '
-cp -f .git/HEAD.orig .git/HEAD
+
 git update-ref -d $m
 
 test_expect_success 'update-ref -d is not confused by self-reference' '
@@ -155,82 +239,110 @@ test_expect_success 'update-ref --no-deref -d can delete reference to bad ref' '
        test_path_is_missing .git/refs/heads/ref-to-bad
 '
 
-test_expect_success '(not) create HEAD with old sha1' "
+test_expect_success '(not) create HEAD with old sha1' '
        test_must_fail git update-ref HEAD $A $B
-"
-test_expect_success "(not) prior created .git/$m" "
-       ! test -f .git/$m
-"
-rm -f .git/$m
-
-test_expect_success \
-       "create HEAD" \
-       "git update-ref HEAD $A"
-test_expect_success '(not) change HEAD with wrong SHA1' "
+'
+test_expect_success "(not) prior created .git/$m" '
+       test_when_finished "rm -f .git/$m" &&
+       test_path_is_missing .git/$m
+'
+
+test_expect_success 'create HEAD' '
+       git update-ref HEAD $A
+'
+test_expect_success '(not) change HEAD with wrong SHA1' '
        test_must_fail git update-ref HEAD $B $Z
-"
-test_expect_success "(not) changed .git/$m" "
-       ! test $B"' = $(cat .git/'"$m"')
 '
-rm -f .git/$m
+test_expect_success "(not) changed .git/$m" '
+       test_when_finished "rm -f .git/$m" &&
+       ! test $B = $(cat .git/$m)
+'
 
 rm -f .git/logs/refs/heads/master
-test_expect_success \
-       "create $m (logged by touch)" \
-       'GIT_COMMITTER_DATE="2005-05-26 23:30" \
-        git update-ref --create-reflog HEAD '"$A"' -m "Initial Creation" &&
-        test '"$A"' = $(cat .git/'"$m"')'
-test_expect_success \
-       "update $m (logged by touch)" \
-       'GIT_COMMITTER_DATE="2005-05-26 23:31" \
-        git update-ref HEAD'" $B $A "'-m "Switch" &&
-        test '"$B"' = $(cat .git/'"$m"')'
-test_expect_success \
-       "set $m (logged by touch)" \
-       'GIT_COMMITTER_DATE="2005-05-26 23:41" \
-        git update-ref HEAD'" $A &&
-        test $A"' = $(cat .git/'"$m"')'
+test_expect_success "create $m (logged by touch)" '
+       test_config core.logAllRefUpdates false &&
+       GIT_COMMITTER_DATE="2005-05-26 23:30" \
+       git update-ref --create-reflog HEAD $A -m "Initial Creation" &&
+       test $A = $(cat .git/$m)
+'
+test_expect_success "update $m (logged by touch)" '
+       test_config core.logAllRefUpdates false &&
+       GIT_COMMITTER_DATE="2005-05-26 23:31" \
+       git update-ref HEAD $B $A -m "Switch" &&
+       test $B = $(cat .git/$m)
+'
+test_expect_success "set $m (logged by touch)" '
+       test_config core.logAllRefUpdates false &&
+       GIT_COMMITTER_DATE="2005-05-26 23:41" \
+       git update-ref HEAD $A &&
+       test $A = $(cat .git/$m)
+'
+
+test_expect_success 'empty directory removal' '
+       git branch d1/d2/r1 HEAD &&
+       git branch d1/r2 HEAD &&
+       test_path_is_file .git/refs/heads/d1/d2/r1 &&
+       test_path_is_file .git/logs/refs/heads/d1/d2/r1 &&
+       git branch -d d1/d2/r1 &&
+       test_path_is_missing .git/refs/heads/d1/d2 &&
+       test_path_is_missing .git/logs/refs/heads/d1/d2 &&
+       test_path_is_file .git/refs/heads/d1/r2 &&
+       test_path_is_file .git/logs/refs/heads/d1/r2
+'
+
+test_expect_success 'symref empty directory removal' '
+       git branch e1/e2/r1 HEAD &&
+       git branch e1/r2 HEAD &&
+       git checkout e1/e2/r1 &&
+       test_when_finished "git checkout master" &&
+       test_path_is_file .git/refs/heads/e1/e2/r1 &&
+       test_path_is_file .git/logs/refs/heads/e1/e2/r1 &&
+       git update-ref -d HEAD &&
+       test_path_is_missing .git/refs/heads/e1/e2 &&
+       test_path_is_missing .git/logs/refs/heads/e1/e2 &&
+       test_path_is_file .git/refs/heads/e1/r2 &&
+       test_path_is_file .git/logs/refs/heads/e1/r2 &&
+       test_path_is_file .git/logs/HEAD
+'
 
 cat >expect <<EOF
 $Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000      Initial Creation
 $A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150260 +0000      Switch
 $B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000
 EOF
-test_expect_success \
-       "verifying $m's log" \
-       "test_cmp expect .git/logs/$m"
-rm -rf .git/$m .git/logs expect
-
-test_expect_success \
-       'enable core.logAllRefUpdates' \
-       'git config core.logAllRefUpdates true &&
-        test true = $(git config --bool --get core.logAllRefUpdates)'
-
-test_expect_success \
-       "create $m (logged by config)" \
-       'GIT_COMMITTER_DATE="2005-05-26 23:32" \
-        git update-ref HEAD'" $A "'-m "Initial Creation" &&
-        test '"$A"' = $(cat .git/'"$m"')'
-test_expect_success \
-       "update $m (logged by config)" \
-       'GIT_COMMITTER_DATE="2005-05-26 23:33" \
-        git update-ref HEAD'" $B $A "'-m "Switch" &&
-        test '"$B"' = $(cat .git/'"$m"')'
-test_expect_success \
-       "set $m (logged by config)" \
-       'GIT_COMMITTER_DATE="2005-05-26 23:43" \
-        git update-ref HEAD '"$A &&
-        test $A"' = $(cat .git/'"$m"')'
+test_expect_success "verifying $m's log (logged by touch)" '
+       test_when_finished "rm -rf .git/$m .git/logs expect" &&
+       test_cmp expect .git/logs/$m
+'
+
+test_expect_success "create $m (logged by config)" '
+       test_config core.logAllRefUpdates true &&
+       GIT_COMMITTER_DATE="2005-05-26 23:32" \
+       git update-ref HEAD $A -m "Initial Creation" &&
+       test $A = $(cat .git/$m)
+'
+test_expect_success "update $m (logged by config)" '
+       test_config core.logAllRefUpdates true &&
+       GIT_COMMITTER_DATE="2005-05-26 23:33" \
+       git update-ref HEAD'" $B $A "'-m "Switch" &&
+       test $B = $(cat .git/$m)
+'
+test_expect_success "set $m (logged by config)" '
+       test_config core.logAllRefUpdates true &&
+       GIT_COMMITTER_DATE="2005-05-26 23:43" \
+       git update-ref HEAD $A &&
+       test $A = $(cat .git/$m)
+'
 
 cat >expect <<EOF
 $Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 +0000      Initial Creation
 $A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 +0000      Switch
 $B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 +0000
 EOF
-test_expect_success \
-       "verifying $m's log" \
-       'test_cmp expect .git/logs/$m'
-rm -f .git/$m .git/logs/$m expect
+test_expect_success "verifying $m's log (logged by config)" '
+       test_when_finished "rm -f .git/$m .git/logs/$m expect" &&
+       test_cmp expect .git/logs/$m
+'
 
 git update-ref $m $D
 cat >.git/logs/$m <<EOF
@@ -244,86 +356,85 @@ EOF
 ed="Thu, 26 May 2005 18:32:00 -0500"
 gd="Thu, 26 May 2005 18:33:00 -0500"
 ld="Thu, 26 May 2005 18:43:00 -0500"
-test_expect_success \
-       'Query "master@{May 25 2005}" (before history)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{May 25 2005}" >o 2>e &&
-        test '"$C"' = $(cat o) &&
-        test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
-test_expect_success \
-       "Query master@{2005-05-25} (before history)" \
-       'rm -f o e &&
-        git rev-parse --verify master@{2005-05-25} >o 2>e &&
-        test '"$C"' = $(cat o) &&
-        echo test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
-test_expect_success \
-       'Query "master@{May 26 2005 23:31:59}" (1 second before history)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e &&
-        test '"$C"' = $(cat o) &&
-        test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"'
-test_expect_success \
-       'Query "master@{May 26 2005 23:32:00}" (exactly history start)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e &&
-        test '"$C"' = $(cat o) &&
-        test "" = "$(cat e)"'
-test_expect_success \
-       'Query "master@{May 26 2005 23:32:30}" (first non-creation change)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{May 26 2005 23:32:30}" >o 2>e &&
-        test '"$A"' = $(cat o) &&
-        test "" = "$(cat e)"'
-test_expect_success \
-       'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&
-        test '"$B"' = $(cat o) &&
-        test "warning: Log for ref '"$m has gap after $gd"'." = "$(cat e)"'
-test_expect_success \
-       'Query "master@{2005-05-26 23:38:00}" (middle of history)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e &&
-        test '"$Z"' = $(cat o) &&
-        test "" = "$(cat e)"'
-test_expect_success \
-       'Query "master@{2005-05-26 23:43:00}" (exact end of history)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e &&
-        test '"$E"' = $(cat o) &&
-        test "" = "$(cat e)"'
-test_expect_success \
-       'Query "master@{2005-05-28}" (past end of history)' \
-       'rm -f o e &&
-        git rev-parse --verify "master@{2005-05-28}" >o 2>e &&
-        test '"$D"' = $(cat o) &&
-        test "warning: Log for ref '"$m unexpectedly ended on $ld"'." = "$(cat e)"'
-
+test_expect_success 'Query "master@{May 25 2005}" (before history)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{May 25 2005}" >o 2>e &&
+       test $C = $(cat o) &&
+       test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"
+'
+test_expect_success 'Query master@{2005-05-25} (before history)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify master@{2005-05-25} >o 2>e &&
+       test $C = $(cat o) &&
+       echo test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"
+'
+test_expect_success 'Query "master@{May 26 2005 23:31:59}" (1 second before history)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e &&
+       test $C = $(cat o) &&
+       test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"
+'
+test_expect_success 'Query "master@{May 26 2005 23:32:00}" (exactly history start)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e &&
+       test $C = $(cat o) &&
+       test "" = "$(cat e)"
+'
+test_expect_success 'Query "master@{May 26 2005 23:32:30}" (first non-creation change)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{May 26 2005 23:32:30}" >o 2>e &&
+       test $A = $(cat o) &&
+       test "" = "$(cat e)"
+'
+test_expect_success 'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&
+       test $B = $(cat o) &&
+       test "warning: Log for ref $m has gap after $gd." = "$(cat e)"
+'
+test_expect_success 'Query "master@{2005-05-26 23:38:00}" (middle of history)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e &&
+       test $Z = $(cat o) &&
+       test "" = "$(cat e)"
+'
+test_expect_success 'Query "master@{2005-05-26 23:43:00}" (exact end of history)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e &&
+       test $E = $(cat o) &&
+       test "" = "$(cat e)"
+'
+test_expect_success 'Query "master@{2005-05-28}" (past end of history)' '
+       test_when_finished "rm -f o e" &&
+       git rev-parse --verify "master@{2005-05-28}" >o 2>e &&
+       test $D = $(cat o) &&
+       test "warning: Log for ref $m unexpectedly ended on $ld." = "$(cat e)"
+'
 
 rm -f .git/$m .git/logs/$m expect
 
-test_expect_success \
-    'creating initial files' \
-    'echo TEST >F &&
-     git add F &&
-        GIT_AUTHOR_DATE="2005-05-26 23:30" \
-        GIT_COMMITTER_DATE="2005-05-26 23:30" git commit -m add -a &&
-        h_TEST=$(git rev-parse --verify HEAD) &&
-        echo The other day this did not work. >M &&
-        echo And then Bob told me how to fix it. >>M &&
-        echo OTHER >F &&
-        GIT_AUTHOR_DATE="2005-05-26 23:41" \
-        GIT_COMMITTER_DATE="2005-05-26 23:41" git commit -F M -a &&
-        h_OTHER=$(git rev-parse --verify HEAD) &&
-        GIT_AUTHOR_DATE="2005-05-26 23:44" \
-        GIT_COMMITTER_DATE="2005-05-26 23:44" git commit --amend &&
-        h_FIXED=$(git rev-parse --verify HEAD) &&
-        echo Merged initial commit and a later commit. >M &&
-        echo $h_TEST >.git/MERGE_HEAD &&
-        GIT_AUTHOR_DATE="2005-05-26 23:45" \
-        GIT_COMMITTER_DATE="2005-05-26 23:45" git commit -F M &&
-        h_MERGED=$(git rev-parse --verify HEAD) &&
-        rm -f M'
+test_expect_success 'creating initial files' '
+       test_when_finished rm -f M &&
+       echo TEST >F &&
+       git add F &&
+       GIT_AUTHOR_DATE="2005-05-26 23:30" \
+       GIT_COMMITTER_DATE="2005-05-26 23:30" git commit -m add -a &&
+       h_TEST=$(git rev-parse --verify HEAD) &&
+       echo The other day this did not work. >M &&
+       echo And then Bob told me how to fix it. >>M &&
+       echo OTHER >F &&
+       GIT_AUTHOR_DATE="2005-05-26 23:41" \
+       GIT_COMMITTER_DATE="2005-05-26 23:41" git commit -F M -a &&
+       h_OTHER=$(git rev-parse --verify HEAD) &&
+       GIT_AUTHOR_DATE="2005-05-26 23:44" \
+       GIT_COMMITTER_DATE="2005-05-26 23:44" git commit --amend &&
+       h_FIXED=$(git rev-parse --verify HEAD) &&
+       echo Merged initial commit and a later commit. >M &&
+       echo $h_TEST >.git/MERGE_HEAD &&
+       GIT_AUTHOR_DATE="2005-05-26 23:45" \
+       GIT_COMMITTER_DATE="2005-05-26 23:45" git commit -F M &&
+       h_MERGED=$(git rev-parse --verify HEAD)
+'
 
 cat >expect <<EOF
 $Z $h_TEST $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 commit (initial): add
@@ -331,20 +442,20 @@ $h_TEST $h_OTHER $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000      com
 $h_OTHER $h_FIXED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151040 +0000  commit (amend): The other day this did not work.
 $h_FIXED $h_MERGED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151100 +0000 commit (merge): Merged initial commit and a later commit.
 EOF
-test_expect_success \
-       'git commit logged updates' \
-       "test_cmp expect .git/logs/$m"
+test_expect_success 'git commit logged updates' '
+       test_cmp expect .git/logs/$m
+'
 unset h_TEST h_OTHER h_FIXED h_MERGED
 
-test_expect_success \
-       'git cat-file blob master:F (expect OTHER)' \
-       'test OTHER = $(git cat-file blob master:F)'
-test_expect_success \
-       'git cat-file blob master@{2005-05-26 23:30}:F (expect TEST)' \
-       'test TEST = $(git cat-file blob "master@{2005-05-26 23:30}:F")'
-test_expect_success \
-       'git cat-file blob master@{2005-05-26 23:42}:F (expect OTHER)' \
-       'test OTHER = $(git cat-file blob "master@{2005-05-26 23:42}:F")'
+test_expect_success 'git cat-file blob master:F (expect OTHER)' '
+       test OTHER = $(git cat-file blob master:F)
+'
+test_expect_success 'git cat-file blob master@{2005-05-26 23:30}:F (expect TEST)' '
+       test TEST = $(git cat-file blob "master@{2005-05-26 23:30}:F")
+'
+test_expect_success 'git cat-file blob master@{2005-05-26 23:42}:F (expect OTHER)' '
+       test OTHER = $(git cat-file blob "master@{2005-05-26 23:42}:F")
+'
 
 a=refs/heads/a
 b=refs/heads/b
@@ -501,6 +612,7 @@ test_expect_success 'stdin does not create reflogs by default' '
 '
 
 test_expect_success 'stdin creates reflogs with --create-reflog' '
+       test_when_finished "git update-ref -d $outside" &&
        echo "create $outside $m" >stdin &&
        git update-ref --create-reflog --stdin <stdin &&
        git rev-parse $m >expect &&
index 7e10bcfe395609cff5edc1f8f6ce95fcf69cf5f6..30354fd26c0cf6b6e2a6c01bc2bcbef48168e562 100755 (executable)
@@ -97,6 +97,9 @@ test_expect_success 'show-ref -d' '
        git show-ref -d refs/tags/A refs/tags/C >actual &&
        test_cmp expect actual &&
 
+       git show-ref --verify -d refs/tags/A refs/tags/C >actual &&
+       test_cmp expect actual &&
+
        echo $(git rev-parse refs/heads/master) refs/heads/master >expect &&
        git show-ref -d master >actual &&
        test_cmp expect actual &&
@@ -116,6 +119,12 @@ test_expect_success 'show-ref -d' '
        test_cmp expect actual &&
 
        test_must_fail git show-ref -d --verify heads/master >actual &&
+       test_cmp expect actual &&
+
+       test_must_fail git show-ref --verify -d A C >actual &&
+       test_cmp expect actual &&
+
+       test_must_fail git show-ref --verify -d tags/A tags/C >actual &&
        test_cmp expect actual
 
 '
@@ -164,4 +173,37 @@ test_expect_success 'show-ref --heads, --tags, --head, pattern' '
        test_cmp expect actual
 '
 
+test_expect_success 'show-ref --verify HEAD' '
+       echo $(git rev-parse HEAD) HEAD >expect &&
+       git show-ref --verify HEAD >actual &&
+       test_cmp expect actual &&
+
+       >expect &&
+
+       git show-ref --verify -q HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'show-ref --verify with dangling ref' '
+       sha1_file() {
+               echo "$*" | sed "s#..#.git/objects/&/#"
+       } &&
+
+       remove_object() {
+               file=$(sha1_file "$*") &&
+               test -e "$file" &&
+               rm -f "$file"
+       } &&
+
+       test_when_finished "rm -rf dangling" &&
+       (
+               git init dangling &&
+               cd dangling &&
+               test_commit dangling &&
+               sha=$(git rev-parse refs/tags/dangling) &&
+               remove_object $sha &&
+               test_must_fail git show-ref --verify refs/tags/dangling
+       )
+'
+
 test_done
diff --git a/t/t1405-main-ref-store.sh b/t/t1405-main-ref-store.sh
new file mode 100755 (executable)
index 0000000..490521f
--- /dev/null
@@ -0,0 +1,129 @@
+#!/bin/sh
+
+test_description='test main ref store api'
+
+. ./test-lib.sh
+
+RUN="test-ref-store main"
+
+test_expect_success 'pack_refs(PACK_REFS_ALL | PACK_REFS_PRUNE)' '
+       test_commit one &&
+       N=`find .git/refs -type f | wc -l` &&
+       test "$N" != 0 &&
+       $RUN pack-refs 3 &&
+       N=`find .git/refs -type f | wc -l`
+'
+
+test_expect_success 'peel_ref(new-tag)' '
+       git rev-parse HEAD >expected &&
+       git tag -a -m new-tag new-tag HEAD &&
+       $RUN peel-ref refs/tags/new-tag >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'create_symref(FOO, refs/heads/master)' '
+       $RUN create-symref FOO refs/heads/master nothing &&
+       echo refs/heads/master >expected &&
+       git symbolic-ref FOO >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'delete_refs(FOO, refs/tags/new-tag)' '
+       git rev-parse FOO -- &&
+       git rev-parse refs/tags/new-tag -- &&
+       $RUN delete-refs 0 FOO refs/tags/new-tag &&
+       test_must_fail git rev-parse FOO -- &&
+       test_must_fail git rev-parse refs/tags/new-tag --
+'
+
+test_expect_success 'rename_refs(master, new-master)' '
+       git rev-parse master >expected &&
+       $RUN rename-ref refs/heads/master refs/heads/new-master &&
+       git rev-parse new-master >actual &&
+       test_cmp expected actual &&
+       test_commit recreate-master
+'
+
+test_expect_success 'for_each_ref(refs/heads/)' '
+       $RUN for-each-ref refs/heads/ | cut -c 42- >actual &&
+       cat >expected <<-\EOF &&
+       master 0x0
+       new-master 0x0
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'for_each_ref() is sorted' '
+       $RUN for-each-ref refs/heads/ | cut -c 42- >actual &&
+       sort actual > expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'resolve_ref(new-master)' '
+       SHA1=`git rev-parse new-master` &&
+       echo "$SHA1 refs/heads/new-master 0x0" >expected &&
+       $RUN resolve-ref refs/heads/new-master 0 >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'verify_ref(new-master)' '
+       $RUN verify-ref refs/heads/new-master
+'
+
+test_expect_success 'for_each_reflog()' '
+       $RUN for-each-reflog | sort | cut -c 42- >actual &&
+       cat >expected <<-\EOF &&
+       HEAD 0x1
+       refs/heads/master 0x0
+       refs/heads/new-master 0x0
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'for_each_reflog_ent()' '
+       $RUN for-each-reflog-ent HEAD >actual &&
+       head -n1 actual | grep one &&
+       tail -n2 actual | head -n1 | grep recreate-master
+'
+
+test_expect_success 'for_each_reflog_ent_reverse()' '
+       $RUN for-each-reflog-ent-reverse HEAD >actual &&
+       head -n1 actual | grep recreate-master &&
+       tail -n2 actual | head -n1 | grep one
+'
+
+test_expect_success 'reflog_exists(HEAD)' '
+       $RUN reflog-exists HEAD
+'
+
+test_expect_success 'delete_reflog(HEAD)' '
+       $RUN delete-reflog HEAD &&
+       ! test -f .git/logs/HEAD
+'
+
+test_expect_success 'create-reflog(HEAD)' '
+       $RUN create-reflog HEAD 1 &&
+       test -f .git/logs/HEAD
+'
+
+test_expect_success 'delete_ref(refs/heads/foo)' '
+       git checkout -b foo &&
+       FOO_SHA1=`git rev-parse foo` &&
+       git checkout --detach &&
+       test_commit bar-commit &&
+       git checkout -b bar &&
+       BAR_SHA1=`git rev-parse bar` &&
+       $RUN update-ref updating refs/heads/foo $BAR_SHA1 $FOO_SHA1 0 &&
+       echo $BAR_SHA1 >expected &&
+       git rev-parse refs/heads/foo >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'delete_ref(refs/heads/foo)' '
+       SHA1=`git rev-parse foo` &&
+       git checkout --detach &&
+       $RUN delete-ref msg refs/heads/foo $SHA1 0 &&
+       test_must_fail git rev-parse refs/heads/foo --
+'
+
+test_done
diff --git a/t/t1406-submodule-ref-store.sh b/t/t1406-submodule-ref-store.sh
new file mode 100755 (executable)
index 0000000..13b5454
--- /dev/null
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+test_description='test submodule ref store api'
+
+. ./test-lib.sh
+
+RUN="test-ref-store submodule:sub"
+
+test_expect_success 'setup' '
+       git init sub &&
+       (
+               cd sub &&
+               test_commit first &&
+               git checkout -b new-master
+       )
+'
+
+test_expect_success 'pack_refs() not allowed' '
+       test_must_fail $RUN pack-refs 3
+'
+
+test_expect_success 'peel_ref(new-tag)' '
+       git -C sub rev-parse HEAD >expected &&
+       git -C sub tag -a -m new-tag new-tag HEAD &&
+       $RUN peel-ref refs/tags/new-tag >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'create_symref() not allowed' '
+       test_must_fail $RUN create-symref FOO refs/heads/master nothing
+'
+
+test_expect_success 'delete_refs() not allowed' '
+       test_must_fail $RUN delete-refs 0 FOO refs/tags/new-tag
+'
+
+test_expect_success 'rename_refs() not allowed' '
+       test_must_fail $RUN rename-ref refs/heads/master refs/heads/new-master
+'
+
+test_expect_success 'for_each_ref(refs/heads/)' '
+       $RUN for-each-ref refs/heads/ | cut -c 42- >actual &&
+       cat >expected <<-\EOF &&
+       master 0x0
+       new-master 0x0
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'for_each_ref() is sorted' '
+       $RUN for-each-ref refs/heads/ | cut -c 42- >actual &&
+       sort actual > expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'resolve_ref(master)' '
+       SHA1=`git -C sub rev-parse master` &&
+       echo "$SHA1 refs/heads/master 0x0" >expected &&
+       $RUN resolve-ref refs/heads/master 0 >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'verify_ref(new-master)' '
+       $RUN verify-ref refs/heads/new-master
+'
+
+test_expect_success 'for_each_reflog()' '
+       $RUN for-each-reflog | sort | cut -c 42- >actual &&
+       cat >expected <<-\EOF &&
+       HEAD 0x1
+       refs/heads/master 0x0
+       refs/heads/new-master 0x0
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'for_each_reflog_ent()' '
+       $RUN for-each-reflog-ent HEAD >actual && cat actual &&
+       head -n1 actual | grep first &&
+       tail -n2 actual | head -n1 | grep master.to.new
+'
+
+test_expect_success 'for_each_reflog_ent_reverse()' '
+       $RUN for-each-reflog-ent-reverse HEAD >actual &&
+       head -n1 actual | grep master.to.new &&
+       tail -n2 actual | head -n1 | grep first
+'
+
+test_expect_success 'reflog_exists(HEAD)' '
+       $RUN reflog-exists HEAD
+'
+
+test_expect_success 'delete_reflog() not allowed' '
+       test_must_fail $RUN delete-reflog HEAD
+'
+
+test_expect_success 'create-reflog() not allowed' '
+       test_must_fail $RUN create-reflog HEAD 1
+'
+
+test_done
index 8937e25e4955b79d72952289e7485652309def3a..e88349c8a0483b97ea38013de61d799003fd85b5 100755 (executable)
@@ -122,7 +122,7 @@ test_expect_success 'push cannot create a badly named ref' '
        ! grep -e "broken\.\.\.ref" output
 '
 
-test_expect_failure 'push --mirror can delete badly named ref' '
+test_expect_failure C_LOCALE_OUTPUT 'push --mirror can delete badly named ref' '
        top=$(pwd) &&
        git init src &&
        git init dest &&
index 8f52da2771c0a26c08b943cf7b9596c5e14afb7d..adf0bc88ba510f08d9429ae0f2fb2b2d37424ff4 100755 (executable)
@@ -43,13 +43,13 @@ test_expect_success 'HEAD is part of refs, valid objects appear valid' '
 
 test_expect_success 'setup: helpers for corruption tests' '
        sha1_file() {
-               echo "$*" | sed "s#..#.git/objects/&/#"
+               remainder=${1#??} &&
+               firsttwo=${1%$remainder} &&
+               echo ".git/objects/$firsttwo/$remainder"
        } &&
 
        remove_object() {
-               file=$(sha1_file "$*") &&
-               test -e "$file" &&
-               rm -f "$file"
+               rm "$(sha1_file "$1")"
        }
 '
 
@@ -188,16 +188,17 @@ test_expect_success 'commit with NUL in header' '
        grep "error in commit $new.*unterminated header: NUL at offset" out
 '
 
-test_expect_success 'malformatted tree object' '
-       test_when_finished "git update-ref -d refs/tags/wrong" &&
-       test_when_finished "remove_object \$T" &&
+test_expect_success 'tree object with duplicate entries' '
+       test_when_finished "for i in \$T; do remove_object \$i; done" &&
        T=$(
                GIT_INDEX_FILE=test-index &&
                export GIT_INDEX_FILE &&
                rm -f test-index &&
                >x &&
                git add x &&
+               git rev-parse :x &&
                T=$(git write-tree) &&
+               echo $T &&
                (
                        git cat-file tree $T &&
                        git cat-file tree $T
@@ -208,6 +209,19 @@ test_expect_success 'malformatted tree object' '
        grep "error in tree .*contains duplicate file entries" out
 '
 
+test_expect_success 'unparseable tree object' '
+       test_when_finished "git update-ref -d refs/heads/wrong" &&
+       test_when_finished "remove_object \$tree_sha1" &&
+       test_when_finished "remove_object \$commit_sha1" &&
+       tree_sha1=$(printf "100644 \0twenty-bytes-of-junk" | git hash-object -t tree --stdin -w --literally) &&
+       commit_sha1=$(git commit-tree $tree_sha1) &&
+       git update-ref refs/heads/wrong $commit_sha1 &&
+       test_must_fail git fsck 2>out &&
+       test_i18ngrep "error: empty filename in tree entry" out &&
+       test_i18ngrep "$tree_sha1" out &&
+       test_i18ngrep ! "fatal: empty filename in tree entry" out
+'
+
 test_expect_success 'tag pointing to nonexistent' '
        cat >invalid-tag <<-\EOF &&
        object ffffffffffffffffffffffffffffffffffffffff
@@ -509,9 +523,21 @@ test_expect_success 'fsck --connectivity-only' '
                touch empty &&
                git add empty &&
                test_commit empty &&
+
+               # Drop the index now; we want to be sure that we
+               # recursively notice the broken objects
+               # because they are reachable from refs, not because
+               # they are in the index.
+               rm -f .git/index &&
+
+               # corrupt the blob, but in a way that we can still identify
+               # its type. That lets us see that --connectivity-only is
+               # not actually looking at the contents, but leaves it
+               # free to examine the type if it chooses.
                empty=.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 &&
-               rm -f $empty &&
-               echo invalid >$empty &&
+               blob=$(echo unrelated | git hash-object -w --stdin) &&
+               mv -f $(sha1_file $blob) $empty &&
+
                test_must_fail git fsck --strict &&
                git fsck --strict --connectivity-only &&
                tree=$(git rev-parse HEAD:) &&
@@ -523,12 +549,18 @@ test_expect_success 'fsck --connectivity-only' '
        )
 '
 
-remove_loose_object () {
-       sha1="$(git rev-parse "$1")" &&
-       remainder=${sha1#??} &&
-       firsttwo=${sha1%$remainder} &&
-       rm .git/objects/$firsttwo/$remainder
-}
+test_expect_success 'fsck --connectivity-only with explicit head' '
+       rm -rf connectivity-only &&
+       git init connectivity-only &&
+       (
+               cd connectivity-only &&
+               test_commit foo &&
+               rm -f .git/index &&
+               tree=$(git rev-parse HEAD^{tree}) &&
+               remove_object $(git rev-parse HEAD:foo.t) &&
+               test_must_fail git fsck --connectivity-only $tree
+       )
+'
 
 test_expect_success 'fsck --name-objects' '
        rm -rf name-objects &&
@@ -538,11 +570,154 @@ test_expect_success 'fsck --name-objects' '
                test_commit julius caesar.t &&
                test_commit augustus &&
                test_commit caesar &&
-               remove_loose_object $(git rev-parse julius:caesar.t) &&
+               remove_object $(git rev-parse julius:caesar.t) &&
                test_must_fail git fsck --name-objects >out &&
                tree=$(git rev-parse --verify julius:) &&
                grep "$tree (\(refs/heads/master\|HEAD\)@{[0-9]*}:" out
        )
 '
 
+test_expect_success 'alternate objects are correctly blamed' '
+       test_when_finished "rm -rf alt.git .git/objects/info/alternates" &&
+       git init --bare alt.git &&
+       echo "../../alt.git/objects" >.git/objects/info/alternates &&
+       mkdir alt.git/objects/12 &&
+       >alt.git/objects/12/34567890123456789012345678901234567890 &&
+       test_must_fail git fsck >out 2>&1 &&
+       grep alt.git out
+'
+
+test_expect_success 'fsck errors in packed objects' '
+       git cat-file commit HEAD >basis &&
+       sed "s/</one/" basis >one &&
+       sed "s/</foo/" basis >two &&
+       one=$(git hash-object -t commit -w one) &&
+       two=$(git hash-object -t commit -w two) &&
+       pack=$(
+               {
+                       echo $one &&
+                       echo $two
+               } | git pack-objects .git/objects/pack/pack
+       ) &&
+       test_when_finished "rm -f .git/objects/pack/pack-$pack.*" &&
+       remove_object $one &&
+       remove_object $two &&
+       test_must_fail git fsck 2>out &&
+       grep "error in commit $one.* - bad name" out &&
+       grep "error in commit $two.* - bad name" out &&
+       ! grep corrupt out
+'
+
+test_expect_success 'fsck finds problems in duplicate loose objects' '
+       rm -rf broken-duplicate &&
+       git init broken-duplicate &&
+       (
+               cd broken-duplicate &&
+               test_commit duplicate &&
+               # no "-d" here, so we end up with duplicates
+               git repack &&
+               # now corrupt the loose copy
+               file=$(sha1_file "$(git rev-parse HEAD)") &&
+               rm "$file" &&
+               echo broken >"$file" &&
+               test_must_fail git fsck
+       )
+'
+
+test_expect_success 'fsck detects trailing loose garbage (commit)' '
+       git cat-file commit HEAD >basis &&
+       echo bump-commit-sha1 >>basis &&
+       commit=$(git hash-object -w -t commit basis) &&
+       file=$(sha1_file $commit) &&
+       test_when_finished "remove_object $commit" &&
+       chmod +w "$file" &&
+       echo garbage >>"$file" &&
+       test_must_fail git fsck 2>out &&
+       test_i18ngrep "garbage.*$commit" out
+'
+
+test_expect_success 'fsck detects trailing loose garbage (blob)' '
+       blob=$(echo trailing | git hash-object -w --stdin) &&
+       file=$(sha1_file $blob) &&
+       test_when_finished "remove_object $blob" &&
+       chmod +w "$file" &&
+       echo garbage >>"$file" &&
+       test_must_fail git fsck 2>out &&
+       test_i18ngrep "garbage.*$blob" out
+'
+
+# for each of type, we have one version which is referenced by another object
+# (and so while unreachable, not dangling), and another variant which really is
+# dangling.
+test_expect_success 'fsck notices dangling objects' '
+       git init dangling &&
+       (
+               cd dangling &&
+               blob=$(echo not-dangling | git hash-object -w --stdin) &&
+               dblob=$(echo dangling | git hash-object -w --stdin) &&
+               tree=$(printf "100644 blob %s\t%s\n" $blob one | git mktree) &&
+               dtree=$(printf "100644 blob %s\t%s\n" $blob two | git mktree) &&
+               commit=$(git commit-tree $tree) &&
+               dcommit=$(git commit-tree -p $commit $tree) &&
+
+               cat >expect <<-EOF &&
+               dangling blob $dblob
+               dangling commit $dcommit
+               dangling tree $dtree
+               EOF
+
+               git fsck >actual &&
+               # the output order is non-deterministic, as it comes from a hash
+               sort <actual >actual.sorted &&
+               test_cmp expect actual.sorted
+       )
+'
+
+test_expect_success 'fsck $name notices bogus $name' '
+       test_must_fail git fsck bogus &&
+       test_must_fail git fsck $_z40
+'
+
+test_expect_success 'bogus head does not fallback to all heads' '
+       # set up a case that will cause a reachability complaint
+       echo to-be-deleted >foo &&
+       git add foo &&
+       blob=$(git rev-parse :foo) &&
+       test_when_finished "git rm --cached foo" &&
+       remove_object $blob &&
+       test_must_fail git fsck $_z40 >out 2>&1 &&
+       ! grep $blob out
+'
+
+# Corrupt the checksum on the index.
+# Add 1 to the last byte in the SHA.
+corrupt_index_checksum () {
+    perl -w -e '
+       use Fcntl ":seek";
+       open my $fh, "+<", ".git/index" or die "open: $!";
+       binmode $fh;
+       seek $fh, -1, SEEK_END or die "seek: $!";
+       read $fh, my $in_byte, 1 or die "read: $!";
+
+       $in_value = unpack("C", $in_byte);
+       $out_value = ($in_value + 1) & 255;
+
+       $out_byte = pack("C", $out_value);
+
+       seek $fh, -1, SEEK_END or die "seek: $!";
+       print $fh $out_byte;
+       close $fh or die "close: $!";
+    '
+}
+
+# Corrupt the checksum on the index and then
+# verify that only fsck notices.
+test_expect_success 'detect corrupt index file in fsck' '
+       cp .git/index .git/index.backup &&
+       test_when_finished "mv .git/index.backup .git/index" &&
+       corrupt_index_checksum &&
+       test_must_fail git fsck --cache 2>errors &&
+       grep "bad index file" errors
+'
+
 test_done
index 038e24c401451d61e9c93fb5c233d132a3d51acd..03d3c7f6d65b46bf977adf76a6d68582206768c2 100755 (executable)
@@ -3,7 +3,7 @@
 test_description='test git rev-parse'
 . ./test-lib.sh
 
-# usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir
+# usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir absolute-git-dir
 test_rev_parse () {
        d=
        bare=
@@ -29,7 +29,8 @@ test_rev_parse () {
                 --is-inside-git-dir \
                 --is-inside-work-tree \
                 --show-prefix \
-                --git-dir
+                --git-dir \
+                --absolute-git-dir
        do
                test $# -eq 0 && break
                expect="$1"
@@ -62,29 +63,71 @@ test_expect_success 'setup' '
        cp -R .git repo.git
 '
 
-test_rev_parse toplevel false false true '' .git
+test_rev_parse toplevel false false true '' .git "$ROOT/.git"
 
-test_rev_parse -C .git .git/ false true false '' .
-test_rev_parse -C .git/objects .git/objects/ false true false '' "$ROOT/.git"
+test_rev_parse -C .git .git/ false true false '' . "$ROOT/.git"
+test_rev_parse -C .git/objects .git/objects/ false true false '' "$ROOT/.git" "$ROOT/.git"
 
-test_rev_parse -C sub/dir subdirectory false false true sub/dir/ "$ROOT/.git"
+test_rev_parse -C sub/dir subdirectory false false true sub/dir/ "$ROOT/.git" "$ROOT/.git"
 
 test_rev_parse -b t 'core.bare = true' true false false
 
 test_rev_parse -b u 'core.bare undefined' false false true
 
 
-test_rev_parse -C work -g ../.git -b f 'GIT_DIR=../.git, core.bare = false' false false true ''
+test_rev_parse -C work -g ../.git -b f 'GIT_DIR=../.git, core.bare = false' false false true '' "../.git" "$ROOT/.git"
 
 test_rev_parse -C work -g ../.git -b t 'GIT_DIR=../.git, core.bare = true' true false false ''
 
 test_rev_parse -C work -g ../.git -b u 'GIT_DIR=../.git, core.bare undefined' false false true ''
 
 
-test_rev_parse -C work -g ../repo.git -b f 'GIT_DIR=../repo.git, core.bare = false' false false true ''
+test_rev_parse -C work -g ../repo.git -b f 'GIT_DIR=../repo.git, core.bare = false' false false true '' "../repo.git" "$ROOT/repo.git"
 
 test_rev_parse -C work -g ../repo.git -b t 'GIT_DIR=../repo.git, core.bare = true' true false false ''
 
 test_rev_parse -C work -g ../repo.git -b u 'GIT_DIR=../repo.git, core.bare undefined' false false true ''
 
+test_expect_success 'git-common-dir from worktree root' '
+       echo .git >expect &&
+       git rev-parse --git-common-dir >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'git-common-dir inside sub-dir' '
+       mkdir -p path/to/child &&
+       test_when_finished "rm -rf path" &&
+       echo "$(git -C path/to/child rev-parse --show-cdup).git" >expect &&
+       git -C path/to/child rev-parse --git-common-dir >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'git-path from worktree root' '
+       echo .git/objects >expect &&
+       git rev-parse --git-path objects >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'git-path inside sub-dir' '
+       mkdir -p path/to/child &&
+       test_when_finished "rm -rf path" &&
+       echo "$(git -C path/to/child rev-parse --show-cdup).git/objects" >expect &&
+       git -C path/to/child rev-parse --git-path objects >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'showing the superproject correctly' '
+       git rev-parse --show-superproject-working-tree >out &&
+       test_must_be_empty out &&
+
+       test_create_repo super &&
+       test_commit -C super test_commit &&
+       test_create_repo sub &&
+       test_commit -C sub test_commit &&
+       git -C super submodule add ../sub dir/sub &&
+       echo $(pwd)/super >expect  &&
+       git -C super/dir/sub rev-parse --show-superproject-working-tree >out &&
+       test_cmp expect out
+'
+
 test_done
index cc5b870e5875bab8326393aea3a8d9f944210de6..b06210ec5e8ffa30b59314b1c79ebc9bdb8f6476 100755 (executable)
@@ -423,4 +423,12 @@ test_expect_success '$GIT_WORK_TREE overrides $GIT_DIR/common' '
        )
 '
 
+test_expect_success 'error out gracefully on invalid $GIT_WORK_TREE' '
+       (
+               GIT_WORK_TREE=/.invalid/work/tree &&
+               export GIT_WORK_TREE &&
+               test_expect_code 128 git rev-parse
+       )
+'
+
 test_done
index 46ef1f22dca14423ecff8da45d608a8885f23dba..b23c4e3fab604f957ec6359eae75400dd1e53174 100755 (executable)
@@ -46,11 +46,14 @@ error_message () {
 }
 
 test_expect_success '@{upstream} resolves to correct full name' '
-       test refs/remotes/origin/master = "$(full_name @{upstream})"
+       test refs/remotes/origin/master = "$(full_name @{upstream})" &&
+       test refs/remotes/origin/master = "$(full_name @{UPSTREAM})" &&
+       test refs/remotes/origin/master = "$(full_name @{UpSTReam})"
 '
 
 test_expect_success '@{u} resolves to correct full name' '
-       test refs/remotes/origin/master = "$(full_name @{u})"
+       test refs/remotes/origin/master = "$(full_name @{u})" &&
+       test refs/remotes/origin/master = "$(full_name @{U})"
 '
 
 test_expect_success 'my-side@{upstream} resolves to correct full name' '
@@ -60,6 +63,8 @@ test_expect_success 'my-side@{upstream} resolves to correct full name' '
 test_expect_success 'upstream of branch with @ in middle' '
        full_name fun@ny@{u} >actual &&
        echo refs/remotes/origin/side >expect &&
+       test_cmp expect actual &&
+       full_name fun@ny@{U} >actual &&
        test_cmp expect actual
 '
 
@@ -96,12 +101,14 @@ test_expect_success 'not-tracking@{u} fails' '
 test_expect_success '<branch>@{u}@{1} resolves correctly' '
        test_commit 6 &&
        (cd clone && git fetch) &&
-       test 5 = $(commit_subject my-side@{u}@{1})
+       test 5 = $(commit_subject my-side@{u}@{1}) &&
+       test 5 = $(commit_subject my-side@{U}@{1})
 '
 
 test_expect_success '@{u} without specifying branch fails on a detached HEAD' '
        git checkout HEAD^0 &&
-       test_must_fail git rev-parse @{u}
+       test_must_fail git rev-parse @{u} &&
+       test_must_fail git rev-parse @{U}
 '
 
 test_expect_success 'checkout -b new my-side@{u} forks from the same' '
index e221167cfbe3fb34cf5aba88cd04f6a1dc9eede5..711704ba5a052b15d94ff1ce958ada3fb86530a9 100755 (executable)
@@ -42,7 +42,7 @@ test_expect_success 'blob and tree' '
 
 test_expect_success 'warn ambiguity when no candidate matches type hint' '
        test_must_fail git rev-parse --verify 000000000^{commit} 2>actual &&
-       grep "short SHA1 000000000 is ambiguous" actual
+       test_i18ngrep "short SHA1 000000000 is ambiguous" actual
 '
 
 test_expect_success 'disambiguate tree-ish' '
@@ -264,6 +264,13 @@ test_expect_success 'ambiguous commit-ish' '
        test_must_fail git log 000000000...
 '
 
+# There are three objects with this prefix: a blob, a tree, and a tag. We know
+# the blob will not pass as a treeish, but the tree and tag should (and thus
+# cause an error).
+test_expect_success 'ambiguous tags peel to treeish' '
+       test_must_fail git rev-parse 0000000000f^{tree}
+'
+
 test_expect_success 'rev-parse --disambiguate' '
        # The test creates 16 objects that share the prefix and two
        # commits created by commit-tree in earlier tests share a
@@ -273,6 +280,13 @@ test_expect_success 'rev-parse --disambiguate' '
        test "$(sed -e "s/^\(.........\).*/\1/" actual | sort -u)" = 000000000
 '
 
+test_expect_success 'rev-parse --disambiguate drops duplicates' '
+       git rev-parse --disambiguate=000000000 >expect &&
+       git pack-objects .git/objects/pack/pack <expect &&
+       git rev-parse --disambiguate=000000000 >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'ambiguous 40-hex ref' '
        TREE=$(git mktree </dev/null) &&
        REF=$(git rev-parse HEAD) &&
@@ -291,4 +305,60 @@ test_expect_success 'ambiguous short sha1 ref' '
        grep "refname.*${REF}.*ambiguous" err
 '
 
+test_expect_success C_LOCALE_OUTPUT 'ambiguity errors are not repeated (raw)' '
+       test_must_fail git rev-parse 00000 2>stderr &&
+       grep "is ambiguous" stderr >errors &&
+       test_line_count = 1 errors
+'
+
+test_expect_success C_LOCALE_OUTPUT 'ambiguity errors are not repeated (treeish)' '
+       test_must_fail git rev-parse 00000:foo 2>stderr &&
+       grep "is ambiguous" stderr >errors &&
+       test_line_count = 1 errors
+'
+
+test_expect_success C_LOCALE_OUTPUT 'ambiguity errors are not repeated (peel)' '
+       test_must_fail git rev-parse 00000^{commit} 2>stderr &&
+       grep "is ambiguous" stderr >errors &&
+       test_line_count = 1 errors
+'
+
+test_expect_success C_LOCALE_OUTPUT 'ambiguity hints' '
+       test_must_fail git rev-parse 000000000 2>stderr &&
+       grep ^hint: stderr >hints &&
+       # 16 candidates, plus one intro line
+       test_line_count = 17 hints
+'
+
+test_expect_success C_LOCALE_OUTPUT 'ambiguity hints respect type' '
+       test_must_fail git rev-parse 000000000^{commit} 2>stderr &&
+       grep ^hint: stderr >hints &&
+       # 5 commits, 1 tag (which is a commitish), plus intro line
+       test_line_count = 7 hints
+'
+
+test_expect_success C_LOCALE_OUTPUT 'failed type-selector still shows hint' '
+       # these two blobs share the same prefix "ee3d", but neither
+       # will pass for a commit
+       echo 851 | git hash-object --stdin -w &&
+       echo 872 | git hash-object --stdin -w &&
+       test_must_fail git rev-parse ee3d^{commit} 2>stderr &&
+       grep ^hint: stderr >hints &&
+       test_line_count = 3 hints
+'
+
+test_expect_success 'core.disambiguate config can prefer types' '
+       # ambiguous between tree and tag
+       sha1=0000000000f &&
+       test_must_fail git rev-parse $sha1 &&
+       git rev-parse $sha1^{commit} &&
+       git -c core.disambiguate=committish rev-parse $sha1
+'
+
+test_expect_success 'core.disambiguate does not override context' '
+       # treeish ambiguous between tag and tree
+       test_must_fail \
+               git -c core.disambiguate=committish rev-parse $sha1^{tree}
+'
+
 test_done
index 7214f5b33fa41fbb685e572ca24a0cb11337d251..788cc91e452ce02af1c068b8c7b0bb1aa88ae395 100755 (executable)
@@ -24,12 +24,16 @@ test_expect_success 'setup' '
 
 test_expect_success '@{push} with default=nothing' '
        test_config push.default nothing &&
-       test_must_fail git rev-parse master@{push}
+       test_must_fail git rev-parse master@{push} &&
+       test_must_fail git rev-parse master@{PUSH} &&
+       test_must_fail git rev-parse master@{PuSH}
 '
 
 test_expect_success '@{push} with default=simple' '
        test_config push.default simple &&
-       resolve master@{push} refs/remotes/origin/master
+       resolve master@{push} refs/remotes/origin/master &&
+       resolve master@{PUSH} refs/remotes/origin/master &&
+       resolve master@{pUSh} refs/remotes/origin/master
 '
 
 test_expect_success 'triangular @{push} fails with default=simple' '
@@ -60,4 +64,10 @@ test_expect_success '@{push} with push refspecs' '
        resolve topic@{push} refs/remotes/origin/magic/topic
 '
 
+test_expect_success 'resolving @{push} fails with a detached HEAD' '
+       git checkout HEAD^0 &&
+       test_when_finished "git checkout -" &&
+       test_must_fail git rev-parse @{push}
+'
+
 test_done
index 292a0720fccb0becca47fad2945634cbffeb89d6..af3ec0da5ac0f5e0f6e19616d9c55b611ba5a701 100755 (executable)
@@ -8,6 +8,7 @@ test_description='split index mode tests'
 sane_unset GIT_TEST_SPLIT_INDEX
 
 test_expect_success 'enable split index' '
+       git config splitIndex.maxPercentChange 100 &&
        git update-index --split-index &&
        test-dump-split-index .git/index >actual &&
        indexversion=$(test-index-version <.git/index) &&
@@ -19,12 +20,12 @@ test_expect_success 'enable split index' '
                own=8299b0bcd1ac364e5f1d7768efb62fa2da79a339
                base=39d890139ee5356c7ef572216cebcd27aa41f9df
        fi &&
-       cat >expect <<EOF &&
-own $own
-base $base
-replacements:
-deletions:
-EOF
+       cat >expect <<-EOF &&
+       own $own
+       base $base
+       replacements:
+       deletions:
+       EOF
        test_cmp expect actual
 '
 
@@ -32,51 +33,51 @@ test_expect_success 'add one file' '
        : >one &&
        git update-index --add one &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 $EMPTY_BLOB 0   one
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 $EMPTY_BLOB 0    one
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       cat >expect <<EOF &&
-base $base
-100644 $EMPTY_BLOB 0   one
-replacements:
-deletions:
-EOF
+       cat >expect <<-EOF &&
+       base $base
+       100644 $EMPTY_BLOB 0    one
+       replacements:
+       deletions:
+       EOF
        test_cmp expect actual
 '
 
 test_expect_success 'disable split index' '
        git update-index --no-split-index &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 $EMPTY_BLOB 0   one
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 $EMPTY_BLOB 0    one
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        BASE=$(test-dump-split-index .git/index | grep "^own" | sed "s/own/base/") &&
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       cat >expect <<EOF &&
-not a split index
-EOF
+       cat >expect <<-EOF &&
+       not a split index
+       EOF
        test_cmp expect actual
 '
 
 test_expect_success 'enable split index again, "one" now belongs to base index"' '
        git update-index --split-index &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 $EMPTY_BLOB 0   one
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 $EMPTY_BLOB 0    one
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       cat >expect <<EOF &&
-$BASE
-replacements:
-deletions:
-EOF
+       cat >expect <<-EOF &&
+       $BASE
+       replacements:
+       deletions:
+       EOF
        test_cmp expect actual
 '
 
@@ -84,18 +85,18 @@ test_expect_success 'modify original file, base index untouched' '
        echo modified >one &&
        git update-index one &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0      one
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       q_to_tab >expect <<EOF &&
-$BASE
-100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
-replacements: 0
-deletions:
-EOF
+       q_to_tab >expect <<-EOF &&
+       $BASE
+       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       replacements: 0
+       deletions:
+       EOF
        test_cmp expect actual
 '
 
@@ -103,54 +104,54 @@ test_expect_success 'add another file, which stays index' '
        : >two &&
        git update-index --add two &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0      one
-100644 $EMPTY_BLOB 0   two
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       100644 $EMPTY_BLOB 0    two
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       q_to_tab >expect <<EOF &&
-$BASE
-100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
-100644 $EMPTY_BLOB 0   two
-replacements: 0
-deletions:
-EOF
+       q_to_tab >expect <<-EOF &&
+       $BASE
+       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       100644 $EMPTY_BLOB 0    two
+       replacements: 0
+       deletions:
+       EOF
        test_cmp expect actual
 '
 
 test_expect_success 'remove file not in base index' '
        git update-index --force-remove two &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0      one
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0       one
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       q_to_tab >expect <<EOF &&
-$BASE
-100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
-replacements: 0
-deletions:
-EOF
+       q_to_tab >expect <<-EOF &&
+       $BASE
+       100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+       replacements: 0
+       deletions:
+       EOF
        test_cmp expect actual
 '
 
 test_expect_success 'remove file in base index' '
        git update-index --force-remove one &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-EOF
+       cat >ls-files.expect <<-EOF &&
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       cat >expect <<EOF &&
-$BASE
-replacements:
-deletions: 0
-EOF
+       cat >expect <<-EOF &&
+       $BASE
+       replacements:
+       deletions: 0
+       EOF
        test_cmp expect actual
 '
 
@@ -158,18 +159,18 @@ test_expect_success 'add original file back' '
        : >one &&
        git update-index --add one &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 $EMPTY_BLOB 0   one
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 $EMPTY_BLOB 0    one
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       cat >expect <<EOF &&
-$BASE
-100644 $EMPTY_BLOB 0   one
-replacements:
-deletions: 0
-EOF
+       cat >expect <<-EOF &&
+       $BASE
+       100644 $EMPTY_BLOB 0    one
+       replacements:
+       deletions: 0
+       EOF
        test_cmp expect actual
 '
 
@@ -177,27 +178,196 @@ test_expect_success 'add new file' '
        : >two &&
        git update-index --add two &&
        git ls-files --stage >actual &&
-       cat >expect <<EOF &&
-100644 $EMPTY_BLOB 0   one
-100644 $EMPTY_BLOB 0   two
-EOF
+       cat >expect <<-EOF &&
+       100644 $EMPTY_BLOB 0    one
+       100644 $EMPTY_BLOB 0    two
+       EOF
        test_cmp expect actual
 '
 
 test_expect_success 'unify index, two files remain' '
        git update-index --no-split-index &&
        git ls-files --stage >ls-files.actual &&
-       cat >ls-files.expect <<EOF &&
-100644 $EMPTY_BLOB 0   one
-100644 $EMPTY_BLOB 0   two
-EOF
+       cat >ls-files.expect <<-EOF &&
+       100644 $EMPTY_BLOB 0    one
+       100644 $EMPTY_BLOB 0    two
+       EOF
        test_cmp ls-files.expect ls-files.actual &&
 
        test-dump-split-index .git/index | sed "/^own/d" >actual &&
-       cat >expect <<EOF &&
-not a split index
-EOF
+       cat >expect <<-EOF &&
+       not a split index
+       EOF
        test_cmp expect actual
 '
 
+test_expect_success 'rev-parse --shared-index-path' '
+       test_create_repo split-index &&
+       (
+               cd split-index &&
+               git update-index --split-index &&
+               echo .git/sharedindex* >expect &&
+               git rev-parse --shared-index-path >actual &&
+               test_cmp expect actual &&
+               mkdir subdirectory &&
+               cd subdirectory &&
+               echo ../.git/sharedindex* >expect &&
+               git rev-parse --shared-index-path >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'set core.splitIndex config variable to true' '
+       git config core.splitIndex true &&
+       : >three &&
+       git update-index --add three &&
+       git ls-files --stage >ls-files.actual &&
+       cat >ls-files.expect <<-EOF &&
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       one
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       three
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       two
+       EOF
+       test_cmp ls-files.expect ls-files.actual &&
+       BASE=$(test-dump-split-index .git/index | grep "^base") &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       $BASE
+       replacements:
+       deletions:
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'set core.splitIndex config variable to false' '
+       git config core.splitIndex false &&
+       git update-index --force-remove three &&
+       git ls-files --stage >ls-files.actual &&
+       cat >ls-files.expect <<-EOF &&
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       one
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       two
+       EOF
+       test_cmp ls-files.expect ls-files.actual &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       not a split index
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'set core.splitIndex config variable to true' '
+       git config core.splitIndex true &&
+       : >three &&
+       git update-index --add three &&
+       BASE=$(test-dump-split-index .git/index | grep "^base") &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       $BASE
+       replacements:
+       deletions:
+       EOF
+       test_cmp expect actual &&
+       : >four &&
+       git update-index --add four &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       $BASE
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       four
+       replacements:
+       deletions:
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'check behavior with splitIndex.maxPercentChange unset' '
+       git config --unset splitIndex.maxPercentChange &&
+       : >five &&
+       git update-index --add five &&
+       BASE=$(test-dump-split-index .git/index | grep "^base") &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       $BASE
+       replacements:
+       deletions:
+       EOF
+       test_cmp expect actual &&
+       : >six &&
+       git update-index --add six &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       $BASE
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       six
+       replacements:
+       deletions:
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'check splitIndex.maxPercentChange set to 0' '
+       git config splitIndex.maxPercentChange 0 &&
+       : >seven &&
+       git update-index --add seven &&
+       BASE=$(test-dump-split-index .git/index | grep "^base") &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       $BASE
+       replacements:
+       deletions:
+       EOF
+       test_cmp expect actual &&
+       : >eight &&
+       git update-index --add eight &&
+       BASE=$(test-dump-split-index .git/index | grep "^base") &&
+       test-dump-split-index .git/index | sed "/^own/d" >actual &&
+       cat >expect <<-EOF &&
+       $BASE
+       replacements:
+       deletions:
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'shared index files expire after 2 weeks by default' '
+       : >ten &&
+       git update-index --add ten &&
+       test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
+       just_under_2_weeks_ago=$((5-14*86400)) &&
+       test-chmtime =$just_under_2_weeks_ago .git/sharedindex.* &&
+       : >eleven &&
+       git update-index --add eleven &&
+       test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
+       just_over_2_weeks_ago=$((-1-14*86400)) &&
+       test-chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
+       : >twelve &&
+       git update-index --add twelve &&
+       test $(ls .git/sharedindex.* | wc -l) -le 2
+'
+
+test_expect_success 'check splitIndex.sharedIndexExpire set to 16 days' '
+       git config splitIndex.sharedIndexExpire "16.days.ago" &&
+       test-chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
+       : >thirteen &&
+       git update-index --add thirteen &&
+       test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
+       just_over_16_days_ago=$((-1-16*86400)) &&
+       test-chmtime =$just_over_16_days_ago .git/sharedindex.* &&
+       : >fourteen &&
+       git update-index --add fourteen &&
+       test $(ls .git/sharedindex.* | wc -l) -le 2
+'
+
+test_expect_success 'check splitIndex.sharedIndexExpire set to "never" and "now"' '
+       git config splitIndex.sharedIndexExpire never &&
+       just_10_years_ago=$((-365*10*86400)) &&
+       test-chmtime =$just_10_years_ago .git/sharedindex.* &&
+       : >fifteen &&
+       git update-index --add fifteen &&
+       test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
+       git config splitIndex.sharedIndexExpire now &&
+       just_1_second_ago=-1 &&
+       test-chmtime =$just_1_second_ago .git/sharedindex.* &&
+       : >sixteen &&
+       git update-index --add sixteen &&
+       test $(ls .git/sharedindex.* | wc -l) -le 2
+'
+
 test_done
index 6847f7582234d656563f867976a64142a3a01621..aa3522336966749fbea6e8dbe6d8f32cf711a021 100755 (executable)
@@ -63,6 +63,11 @@ test_expect_success '"checkout <submodule>" honors submodule.*.ignore from .git/
        ! test -s actual
 '
 
+KNOWN_FAILURE_DIRECTORY_SUBMODULE_CONFLICTS=1
+test_submodule_switch_recursing "git checkout --recurse-submodules"
+
+test_submodule_forced_switch_recursing "git checkout -f --recurse-submodules"
+
 test_submodule_switch "git checkout"
 
 test_submodule_forced_switch "git checkout -f"
index b618d6be21ff8926cb0d9dff1881c6e5e9eeb35a..b5c47ac602d65ebfb0f4baebc098f26d5d1a464c 100755 (executable)
@@ -63,6 +63,12 @@ test_expect_success '"add" worktree' '
        )
 '
 
+test_expect_success '"add" worktree with lock' '
+       git rev-parse HEAD >expect &&
+       git worktree add --detach --lock here-with-lock master &&
+       test -f .git/worktrees/here-with-lock/locked
+'
+
 test_expect_success '"add" worktree from a subdir' '
        (
                mkdir sub &&
index 1b1b65a6b0fc7ace4e18e8642a6c47631d7e6a43..720063bf0d09bb8c577b78e099187abfc7da71b0 100755 (executable)
@@ -14,25 +14,35 @@ test_expect_success 'rev-parse --git-common-dir on main worktree' '
        test_cmp expected actual &&
        mkdir sub &&
        git -C sub rev-parse --git-common-dir >actual2 &&
-       echo sub/.git >expected2 &&
+       echo ../.git >expected2 &&
        test_cmp expected2 actual2
 '
 
+test_expect_success 'rev-parse --git-path objects linked worktree' '
+       echo "$(git rev-parse --show-toplevel)/.git/objects" >expect &&
+       test_when_finished "rm -rf linked-tree actual expect && git worktree prune" &&
+       git worktree add --detach linked-tree master &&
+       git -C linked-tree rev-parse --git-path objects >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success '"list" all worktrees from main' '
        echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
-       test_when_finished "rm -rf here && git worktree prune" &&
+       test_when_finished "rm -rf here out actual expect && git worktree prune" &&
        git worktree add --detach here master &&
        echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
-       git worktree list | sed "s/  */ /g" >actual &&
+       git worktree list >out &&
+       sed "s/  */ /g" <out >actual &&
        test_cmp expect actual
 '
 
 test_expect_success '"list" all worktrees from linked' '
        echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
-       test_when_finished "rm -rf here && git worktree prune" &&
+       test_when_finished "rm -rf here out actual expect && git worktree prune" &&
        git worktree add --detach here master &&
        echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
-       git -C here worktree list | sed "s/  */ /g" >actual &&
+       git -C here worktree list >out &&
+       sed "s/  */ /g" <out >actual &&
        test_cmp expect actual
 '
 
@@ -41,7 +51,7 @@ test_expect_success '"list" all worktrees --porcelain' '
        echo "HEAD $(git rev-parse HEAD)" >>expect &&
        echo "branch $(git symbolic-ref HEAD)" >>expect &&
        echo >>expect &&
-       test_when_finished "rm -rf here && git worktree prune" &&
+       test_when_finished "rm -rf here actual expect && git worktree prune" &&
        git worktree add --detach here master &&
        echo "worktree $(git -C here rev-parse --show-toplevel)" >>expect &&
        echo "HEAD $(git rev-parse HEAD)" >>expect &&
@@ -61,16 +71,17 @@ test_expect_success 'bare repo setup' '
 '
 
 test_expect_success '"list" all worktrees from bare main' '
-       test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
+       test_when_finished "rm -rf there out actual expect && git -C bare1 worktree prune" &&
        git -C bare1 worktree add --detach ../there master &&
        echo "$(pwd)/bare1 (bare)" >expect &&
        echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect &&
-       git -C bare1 worktree list | sed "s/  */ /g" >actual &&
+       git -C bare1 worktree list >out &&
+       sed "s/  */ /g" <out >actual &&
        test_cmp expect actual
 '
 
 test_expect_success '"list" all worktrees --porcelain from bare main' '
-       test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
+       test_when_finished "rm -rf there actual expect && git -C bare1 worktree prune" &&
        git -C bare1 worktree add --detach ../there master &&
        echo "worktree $(pwd)/bare1" >expect &&
        echo "bare" >>expect &&
@@ -84,11 +95,12 @@ test_expect_success '"list" all worktrees --porcelain from bare main' '
 '
 
 test_expect_success '"list" all worktrees from linked with a bare main' '
-       test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
+       test_when_finished "rm -rf there out actual expect && git -C bare1 worktree prune" &&
        git -C bare1 worktree add --detach ../there master &&
        echo "$(pwd)/bare1 (bare)" >expect &&
        echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect &&
-       git -C there worktree list | sed "s/  */ /g" >actual &&
+       git -C there worktree list >out &&
+       sed "s/  */ /g" <out >actual &&
        test_cmp expect actual
 '
 
@@ -96,4 +108,47 @@ test_expect_success 'bare repo cleanup' '
        rm -rf bare1
 '
 
+test_expect_success 'broken main worktree still at the top' '
+       git init broken-main &&
+       (
+               cd broken-main &&
+               test_commit new &&
+               git worktree add linked &&
+               cat >expected <<-EOF &&
+               worktree $(pwd)
+               HEAD $_z40
+
+               EOF
+               cd linked &&
+               echo "worktree $(pwd)" >expected &&
+               echo "ref: .broken" >../.git/HEAD &&
+               git worktree list --porcelain >out &&
+               head -n 3 out >actual &&
+               test_cmp ../expected actual &&
+               git worktree list >out &&
+               head -n 1 out >actual.2 &&
+               grep -F "(error)" actual.2
+       )
+'
+
+test_expect_success 'linked worktrees are sorted' '
+       mkdir sorted &&
+       git init sorted/main &&
+       (
+               cd sorted/main &&
+               test_tick &&
+               test_commit new &&
+               git worktree add ../first &&
+               git worktree add ../second &&
+               git worktree list --porcelain >out &&
+               grep ^worktree out >actual
+       ) &&
+       cat >expected <<-EOF &&
+       worktree $(pwd)/sorted/main
+       worktree $(pwd)/sorted/first
+       worktree $(pwd)/sorted/second
+       EOF
+       test_cmp expected sorted/main/actual
+'
+
 test_done
index 8f22c43e245cb6fb68449a64ba45222e187f56a9..84a9028c433c02c72adcdf06222bcb409e2eb683 100755 (executable)
@@ -5,10 +5,24 @@ test_description='Intent to add'
 . ./test-lib.sh
 
 test_expect_success 'intent to add' '
+       test_commit 1 &&
+       git rm 1.t &&
+       echo hello >1.t &&
        echo hello >file &&
        echo hello >elif &&
        git add -N file &&
-       git add elif
+       git add elif &&
+       git add -N 1.t
+'
+
+test_expect_success 'git status' '
+       git status --porcelain | grep -v actual >actual &&
+       cat >expect <<-\EOF &&
+       DA 1.t
+       A  elif
+        A file
+       EOF
+       test_cmp expect actual
 '
 
 test_expect_success 'check result of "add -N"' '
@@ -43,7 +57,9 @@ test_expect_success 'i-t-a entry is simply ignored' '
        git add -N nitfol &&
        git commit -m second &&
        test $(git ls-tree HEAD -- nitfol | wc -l) = 0 &&
-       test $(git diff --name-only HEAD -- nitfol | wc -l) = 1
+       test $(git diff --name-only HEAD -- nitfol | wc -l) = 1 &&
+       test $(git diff --name-only --ita-invisible-in-index HEAD -- nitfol | wc -l) = 0 &&
+       test $(git diff --name-only --ita-invisible-in-index -- nitfol | wc -l) = 1
 '
 
 test_expect_success 'can commit with an unrelated i-t-a entry in index' '
@@ -113,5 +129,26 @@ test_expect_success 'cache-tree does skip dir that becomes empty' '
        )
 '
 
+test_expect_success 'commit: ita entries ignored in empty intial commit check' '
+       git init empty-intial-commit &&
+       (
+               cd empty-intial-commit &&
+               : >one &&
+               git add -N one &&
+               test_must_fail git commit -m nothing-new-here
+       )
+'
+
+test_expect_success 'commit: ita entries ignored in empty commit check' '
+       git init empty-subsequent-commit &&
+       (
+               cd empty-subsequent-commit &&
+               test_commit one &&
+               : >two &&
+               git add -N two &&
+               test_must_fail git commit -m nothing-new-here
+       )
+'
+
 test_done
 
diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh
new file mode 100755 (executable)
index 0000000..ebb956f
--- /dev/null
@@ -0,0 +1,261 @@
+#!/bin/sh
+
+test_description='Test ls-files recurse-submodules feature
+
+This test verifies the recurse-submodules feature correctly lists files from
+submodules.
+'
+
+. ./test-lib.sh
+
+test_expect_success 'setup directory structure and submodules' '
+       echo a >a &&
+       mkdir b &&
+       echo b >b/b &&
+       git add a b &&
+       git commit -m "add a and b" &&
+       git init submodule &&
+       echo c >submodule/c &&
+       git -C submodule add c &&
+       git -C submodule commit -m "add c" &&
+       git submodule add ./submodule &&
+       git commit -m "added submodule"
+'
+
+test_expect_success 'ls-files correctly outputs files in submodule' '
+       cat >expect <<-\EOF &&
+       .gitmodules
+       a
+       b/b
+       submodule/c
+       EOF
+
+       git ls-files --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'ls-files correctly outputs files in submodule with -z' '
+       lf_to_nul >expect <<-\EOF &&
+       .gitmodules
+       a
+       b/b
+       submodule/c
+       EOF
+
+       git ls-files --recurse-submodules -z >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'ls-files does not output files not added to a repo' '
+       cat >expect <<-\EOF &&
+       .gitmodules
+       a
+       b/b
+       submodule/c
+       EOF
+
+       echo a >not_added &&
+       echo b >b/not_added &&
+       echo c >submodule/not_added &&
+       git ls-files --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'ls-files recurses more than 1 level' '
+       cat >expect <<-\EOF &&
+       .gitmodules
+       a
+       b/b
+       submodule/.gitmodules
+       submodule/c
+       submodule/subsub/d
+       EOF
+
+       git init submodule/subsub &&
+       echo d >submodule/subsub/d &&
+       git -C submodule/subsub add d &&
+       git -C submodule/subsub commit -m "add d" &&
+       git -C submodule submodule add ./subsub &&
+       git -C submodule commit -m "added subsub" &&
+       git submodule absorbgitdirs &&
+       git ls-files --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'ls-files works with GIT_DIR' '
+       cat >expect <<-\EOF &&
+       .gitmodules
+       c
+       subsub/d
+       EOF
+
+       git --git-dir=submodule/.git ls-files --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules and pathspecs setup' '
+       echo e >submodule/subsub/e.txt &&
+       git -C submodule/subsub add e.txt &&
+       git -C submodule/subsub commit -m "adding e.txt" &&
+       echo f >submodule/f.TXT &&
+       echo g >submodule/g.txt &&
+       git -C submodule add f.TXT g.txt &&
+       git -C submodule commit -m "add f and g" &&
+       echo h >h.txt &&
+       mkdir sib &&
+       echo sib >sib/file &&
+       git add h.txt sib/file &&
+       git commit -m "add h and sib/file" &&
+       git init sub &&
+       echo sub >sub/file &&
+       git -C sub add file &&
+       git -C sub commit -m "add file" &&
+       git submodule add ./sub &&
+       git commit -m "added sub" &&
+
+       cat >expect <<-\EOF &&
+       .gitmodules
+       a
+       b/b
+       h.txt
+       sib/file
+       sub/file
+       submodule/.gitmodules
+       submodule/c
+       submodule/f.TXT
+       submodule/g.txt
+       submodule/subsub/d
+       submodule/subsub/e.txt
+       EOF
+
+       git ls-files --recurse-submodules >actual &&
+       test_cmp expect actual &&
+       cat actual &&
+       git ls-files --recurse-submodules "*" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules and pathspecs' '
+       cat >expect <<-\EOF &&
+       h.txt
+       submodule/g.txt
+       submodule/subsub/e.txt
+       EOF
+
+       git ls-files --recurse-submodules "*.txt" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules and pathspecs' '
+       cat >expect <<-\EOF &&
+       h.txt
+       submodule/f.TXT
+       submodule/g.txt
+       submodule/subsub/e.txt
+       EOF
+
+       git ls-files --recurse-submodules ":(icase)*.txt" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules and pathspecs' '
+       cat >expect <<-\EOF &&
+       h.txt
+       submodule/f.TXT
+       submodule/g.txt
+       EOF
+
+       git ls-files --recurse-submodules ":(icase)*.txt" ":(exclude)submodule/subsub/*" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules and pathspecs' '
+       cat >expect <<-\EOF &&
+       sub/file
+       EOF
+
+       git ls-files --recurse-submodules "sub" >actual &&
+       test_cmp expect actual &&
+       git ls-files --recurse-submodules "sub/" >actual &&
+       test_cmp expect actual &&
+       git ls-files --recurse-submodules "sub/file" >actual &&
+       test_cmp expect actual &&
+       git ls-files --recurse-submodules "su*/file" >actual &&
+       test_cmp expect actual &&
+       git ls-files --recurse-submodules "su?/file" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules and pathspecs' '
+       cat >expect <<-\EOF &&
+       sib/file
+       sub/file
+       EOF
+
+       git ls-files --recurse-submodules "s??/file" >actual &&
+       test_cmp expect actual &&
+       git ls-files --recurse-submodules "s???file" >actual &&
+       test_cmp expect actual &&
+       git ls-files --recurse-submodules "s*file" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules and relative paths' '
+       # From subdir
+       cat >expect <<-\EOF &&
+       b
+       EOF
+       git -C b ls-files --recurse-submodules >actual &&
+       test_cmp expect actual &&
+
+       # Relative path to top
+       cat >expect <<-\EOF &&
+       ../.gitmodules
+       ../a
+       b
+       ../h.txt
+       ../sib/file
+       ../sub/file
+       ../submodule/.gitmodules
+       ../submodule/c
+       ../submodule/f.TXT
+       ../submodule/g.txt
+       ../submodule/subsub/d
+       ../submodule/subsub/e.txt
+       EOF
+       git -C b ls-files --recurse-submodules -- .. >actual &&
+       test_cmp expect actual &&
+
+       # Relative path to submodule
+       cat >expect <<-\EOF &&
+       ../submodule/.gitmodules
+       ../submodule/c
+       ../submodule/f.TXT
+       ../submodule/g.txt
+       ../submodule/subsub/d
+       ../submodule/subsub/e.txt
+       EOF
+       git -C b ls-files --recurse-submodules -- ../submodule >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--recurse-submodules does not support --error-unmatch' '
+       test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual &&
+       test_i18ngrep "does not support --error-unmatch" actual
+'
+
+test_incompatible_with_recurse_submodules () {
+       test_expect_success "--recurse-submodules and $1 are incompatible" "
+               test_must_fail git ls-files --recurse-submodules $1 2>actual &&
+               test_i18ngrep 'unsupported mode' actual
+       "
+}
+
+test_incompatible_with_recurse_submodules --deleted
+test_incompatible_with_recurse_submodules --modified
+test_incompatible_with_recurse_submodules --others
+test_incompatible_with_recurse_submodules --stage
+test_incompatible_with_recurse_submodules --killed
+test_incompatible_with_recurse_submodules --unmerged
+
+test_done
diff --git a/t/t3008-ls-files-lazy-init-name-hash.sh b/t/t3008-ls-files-lazy-init-name-hash.sh
new file mode 100755 (executable)
index 0000000..bdf5198
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+test_description='Test the lazy init name hash with various folder structures'
+
+. ./test-lib.sh
+
+if test 1 -eq $($GIT_BUILD_DIR/t/helper/test-online-cpus)
+then
+       skip_all='skipping lazy-init tests, single cpu'
+       test_done
+fi
+
+LAZY_THREAD_COST=2000
+
+test_expect_success 'no buffer overflow in lazy_init_name_hash' '
+       (
+           test_seq $LAZY_THREAD_COST | sed "s/^/a_/"
+           echo b/b/b
+           test_seq $LAZY_THREAD_COST | sed "s/^/c_/"
+           test_seq 50 | sed "s/^/d_/" | tr "\n" "/"; echo d
+       ) |
+       sed "s/^/100644 $EMPTY_BLOB     /" |
+       git update-index --index-info &&
+       test-lazy-init-name-hash -m
+'
+
+test_done
index 470f33466ca561484da080a522add72bed51ad6e..9a893b5fe746f03521454972199ecb2d243d79ab 100755 (executable)
@@ -575,13 +575,13 @@ test_expect_success 'merge removes empty directories' '
        test_must_fail test -d d
 '
 
-test_expect_failure 'merge-recursive simple w/submodule' '
+test_expect_success 'merge-recursive simple w/submodule' '
 
        git checkout submod &&
        git merge remove
 '
 
-test_expect_failure 'merge-recursive simple w/submodule result' '
+test_expect_success 'merge-recursive simple w/submodule result' '
 
        git ls-files -s >actual &&
        (
index ef509df351600f1238eab243ec353ab73ec8518f..7ca69f4bed6438009808f35c2e212b269bffcfb0 100755 (executable)
@@ -135,7 +135,6 @@ match 1 x '5' '[[:xdigit:]]'
 match 1 x 'f' '[[:xdigit:]]'
 match 1 x 'D' '[[:xdigit:]]'
 match 1 x '_' '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]'
-match 1 x '_' '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]'
 match 1 x '.' '[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]'
 match 1 x '5' '[a-c[:digit:]x-z]'
 match 1 x 'b' '[a-c[:digit:]x-z]'
index 8a833f354e331966f5f927ae94ac8686dd6d166f..48d152b9a9519e00227a0877631d643ecf38e687 100755 (executable)
@@ -100,6 +100,23 @@ test_expect_success 'git branch -m n/n n should work' '
        git reflog exists refs/heads/n
 '
 
+# The topmost entry in reflog for branch bbb is about branch creation.
+# Hence, we compare bbb@{1} (instead of bbb@{0}) with aaa@{0}.
+
+test_expect_success 'git branch -m bbb should rename checked out branch' '
+       test_when_finished git branch -D bbb &&
+       test_when_finished git checkout master &&
+       git checkout -b aaa &&
+       git commit --allow-empty -m "a new commit" &&
+       git rev-parse aaa@{0} >expect &&
+       git branch -m bbb &&
+       git rev-parse bbb@{1} >actual &&
+       test_cmp expect actual &&
+       git symbolic-ref HEAD >actual &&
+       echo refs/heads/bbb >expect &&
+       test_cmp expect actual
+'
+
 test_expect_success 'git branch -m o/o o should fail when o/p exists' '
        git branch o/o &&
        git branch o/p &&
@@ -139,6 +156,12 @@ test_expect_success 'git branch -M baz bam should succeed when baz is checked ou
        test $(git rev-parse --abbrev-ref HEAD) = bam
 '
 
+test_expect_success 'git branch -M baz bam should add entries to .git/logs/HEAD' '
+       msg="Branch: renamed refs/heads/baz to refs/heads/bam" &&
+       grep " 0\{40\}.*$msg$" .git/logs/HEAD &&
+       grep "^0\{40\}.*$msg$" .git/logs/HEAD
+'
+
 test_expect_success 'git branch -M baz bam should succeed when baz is checked out as linked working tree' '
        git checkout master &&
        git worktree add -b baz bazdir &&
@@ -207,6 +230,31 @@ test_expect_success 'git branch --list -d t should fail' '
        test_path_is_missing .git/refs/heads/t
 '
 
+test_expect_success 'git branch --list -v with --abbrev' '
+       test_when_finished "git branch -D t" &&
+       git branch t &&
+       git branch -v --list t >actual.default &&
+       git branch -v --list --abbrev t >actual.abbrev &&
+       test_cmp actual.default actual.abbrev &&
+
+       git branch -v --list --no-abbrev t >actual.noabbrev &&
+       git branch -v --list --abbrev=0 t >actual.0abbrev &&
+       test_cmp actual.noabbrev actual.0abbrev &&
+
+       git branch -v --list --abbrev=36 t >actual.36abbrev &&
+       # how many hexdigits are used?
+       read name objdefault rest <actual.abbrev &&
+       read name obj36 rest <actual.36abbrev &&
+       objfull=$(git rev-parse --verify t) &&
+
+       # are we really getting abbreviations?
+       test "$obj36" != "$objdefault" &&
+       expr "$obj36" : "$objdefault" >/dev/null &&
+       test "$objfull" != "$obj36" &&
+       expr "$objfull" : "$obj36" >/dev/null
+
+'
+
 test_expect_success 'git branch --column' '
        COLUMNS=81 git branch --column=column >actual &&
        cat >expected <<\EOF &&
@@ -307,7 +355,7 @@ test_expect_success 'git branch -m s/s s should work when s/t is deleted' '
 
 test_expect_success 'config information was renamed, too' '
        test $(git config branch.s.dummy) = Hello &&
-       test_must_fail git config branch.s/s/dummy
+       test_must_fail git config branch.s/s.dummy
 '
 
 test_expect_success 'deleting a symref' '
@@ -947,6 +995,10 @@ test_expect_success '--merged catches invalid object names' '
        test_must_fail git branch --merged 0000000000000000000000000000000000000000
 '
 
+test_expect_success '--merged is incompatible with --no-merged' '
+       test_must_fail git branch --merged HEAD --no-merged HEAD
+'
+
 test_expect_success 'tracking with unexpected .fetch refspec' '
        rm -rf a b c d &&
        git init a &&
index 7f3ec47241cd6af7a1c107cba114decaa87df108..0ef1b6fdcc420d6fac2cbe0abd5f1ec6ebec90c6 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-test_description='branch --contains <commit>, --merged, and --no-merged'
+test_description='branch --contains <commit>, --no-contains <commit> --merged, and --no-merged'
 
 . ./test-lib.sh
 
@@ -45,6 +45,22 @@ test_expect_success 'branch --contains master' '
 
 '
 
+test_expect_success 'branch --no-contains=master' '
+
+       git branch --no-contains=master >actual &&
+       >expect &&
+       test_cmp expect actual
+
+'
+
+test_expect_success 'branch --no-contains master' '
+
+       git branch --no-contains master >actual &&
+       >expect &&
+       test_cmp expect actual
+
+'
+
 test_expect_success 'branch --contains=side' '
 
        git branch --contains=side >actual &&
@@ -55,6 +71,16 @@ test_expect_success 'branch --contains=side' '
 
 '
 
+test_expect_success 'branch --no-contains=side' '
+
+       git branch --no-contains=side >actual &&
+       {
+               echo "  master"
+       } >expect &&
+       test_cmp expect actual
+
+'
+
 test_expect_success 'branch --contains with pattern implies --list' '
 
        git branch --contains=master master >actual &&
@@ -65,6 +91,14 @@ test_expect_success 'branch --contains with pattern implies --list' '
 
 '
 
+test_expect_success 'branch --no-contains with pattern implies --list' '
+
+       git branch --no-contains=master master >actual &&
+       >expect &&
+       test_cmp expect actual
+
+'
+
 test_expect_success 'side: branch --merged' '
 
        git branch --merged >actual &&
@@ -126,8 +160,20 @@ test_expect_success 'branch --no-merged with pattern implies --list' '
 test_expect_success 'implicit --list conflicts with modification options' '
 
        test_must_fail git branch --contains=master -d &&
-       test_must_fail git branch --contains=master -m foo
+       test_must_fail git branch --contains=master -m foo &&
+       test_must_fail git branch --no-contains=master -d &&
+       test_must_fail git branch --no-contains=master -m foo
+
+'
 
+test_expect_success 'Assert that --contains only works on commits, not trees & blobs' '
+       test_must_fail git branch --contains master^{tree} &&
+       blob=$(git hash-object -w --stdin <<-\EOF
+       Some blob
+       EOF
+       ) &&
+       test_must_fail git branch --contains $blob &&
+       test_must_fail git branch --no-contains $blob
 '
 
 # We want to set up a case where the walk for the tracking info
@@ -159,4 +205,15 @@ test_expect_success 'branch --merged with --verbose' '
        test_i18ncmp expect actual
 '
 
+test_expect_success 'branch --contains combined with --no-contains' '
+       git branch --contains zzz --no-contains topic >actual &&
+       cat >expect <<-\EOF &&
+         master
+         side
+         zzz
+       EOF
+       test_cmp expect actual
+
+'
+
 test_done
index c6a3ccba1b992cff7412bcf8139da7557981de94..a428ae670369505476ab19338bf0f1da70018301 100755 (executable)
@@ -89,6 +89,11 @@ test_expect_success 'git branch --list -v pattern shows branch summaries' '
        awk "{print \$NF}" <tmp >actual &&
        test_cmp expect actual
 '
+test_expect_success 'git branch --ignore-case --list -v pattern shows branch summaries' '
+       git branch --list --ignore-case -v BRANCH* >tmp &&
+       awk "{print \$NF}" <tmp >actual &&
+       test_cmp expect actual
+'
 
 test_expect_success 'git branch -v pattern does not show branch summaries' '
        test_must_fail git branch -v branch*
@@ -189,11 +194,49 @@ test_expect_success 'local-branch symrefs shortened properly' '
        git symbolic-ref refs/heads/ref-to-remote refs/remotes/origin/branch-one &&
        cat >expect <<-\EOF &&
          ref-to-branch -> branch-one
-         ref-to-remote -> refs/remotes/origin/branch-one
+         ref-to-remote -> origin/branch-one
        EOF
        git branch >actual.raw &&
        grep ref-to <actual.raw >actual &&
        test_cmp expect actual
 '
 
+test_expect_success 'sort branches, ignore case' '
+       (
+               git init sort-icase &&
+               cd sort-icase &&
+               test_commit initial &&
+               git branch branch-one &&
+               git branch BRANCH-two &&
+               git branch --list | awk "{print \$NF}" >actual &&
+               cat >expected <<-\EOF &&
+               BRANCH-two
+               branch-one
+               master
+               EOF
+               test_cmp expected actual &&
+               git branch --list -i | awk "{print \$NF}" >actual &&
+               cat >expected <<-\EOF &&
+               branch-one
+               BRANCH-two
+               master
+               EOF
+               test_cmp expected actual
+       )
+'
+
+test_expect_success 'git branch --format option' '
+       cat >expect <<-\EOF &&
+       Refname is (HEAD detached from fromtag)
+       Refname is refs/heads/ambiguous
+       Refname is refs/heads/branch-one
+       Refname is refs/heads/branch-two
+       Refname is refs/heads/master
+       Refname is refs/heads/ref-to-branch
+       Refname is refs/heads/ref-to-remote
+       EOF
+       git branch --format="Refname is %(refname)" >actual &&
+       test_i18ncmp expect actual
+'
+
 test_done
diff --git a/t/t3204-branch-name-interpretation.sh b/t/t3204-branch-name-interpretation.sh
new file mode 100755 (executable)
index 0000000..698d9cc
--- /dev/null
@@ -0,0 +1,133 @@
+#!/bin/sh
+
+test_description='interpreting exotic branch name arguments
+
+Branch name arguments are usually names which are taken to be inside of
+refs/heads/, but we interpret some magic syntax like @{-1}, @{upstream}, etc.
+This script aims to check the behavior of those corner cases.
+'
+. ./test-lib.sh
+
+expect_branch() {
+       git log -1 --format=%s "$1" >actual &&
+       echo "$2" >expect &&
+       test_cmp expect actual
+}
+
+expect_deleted() {
+       test_must_fail git rev-parse --verify "$1"
+}
+
+test_expect_success 'set up repo' '
+       test_commit one &&
+       test_commit two &&
+       git remote add origin foo.git
+'
+
+test_expect_success 'update branch via @{-1}' '
+       git branch previous one &&
+
+       git checkout previous &&
+       git checkout master &&
+
+       git branch -f @{-1} two &&
+       expect_branch previous two
+'
+
+test_expect_success 'update branch via local @{upstream}' '
+       git branch local one &&
+       git branch --set-upstream-to=local &&
+
+       git branch -f @{upstream} two &&
+       expect_branch local two
+'
+
+test_expect_success 'disallow updating branch via remote @{upstream}' '
+       git update-ref refs/remotes/origin/remote one &&
+       git branch --set-upstream-to=origin/remote &&
+
+       test_must_fail git branch -f @{upstream} two
+'
+
+test_expect_success 'create branch with pseudo-qualified name' '
+       git branch refs/heads/qualified two &&
+       expect_branch refs/heads/refs/heads/qualified two
+'
+
+test_expect_success 'delete branch via @{-1}' '
+       git branch previous-del &&
+
+       git checkout previous-del &&
+       git checkout master &&
+
+       git branch -D @{-1} &&
+       expect_deleted previous-del
+'
+
+test_expect_success 'delete branch via local @{upstream}' '
+       git branch local-del &&
+       git branch --set-upstream-to=local-del &&
+
+       git branch -D @{upstream} &&
+       expect_deleted local-del
+'
+
+test_expect_success 'delete branch via remote @{upstream}' '
+       git update-ref refs/remotes/origin/remote-del two &&
+       git branch --set-upstream-to=origin/remote-del &&
+
+       git branch -r -D @{upstream} &&
+       expect_deleted origin/remote-del
+'
+
+# Note that we create two oddly named local branches here. We want to make
+# sure that we do not accidentally delete either of them, even if
+# shorten_unambiguous_ref() tweaks the name to avoid ambiguity.
+test_expect_success 'delete @{upstream} expansion matches -r option' '
+       git update-ref refs/remotes/origin/remote-del two &&
+       git branch --set-upstream-to=origin/remote-del &&
+       git update-ref refs/heads/origin/remote-del two &&
+       git update-ref refs/heads/remotes/origin/remote-del two &&
+
+       test_must_fail git branch -D @{upstream} &&
+       expect_branch refs/heads/origin/remote-del two &&
+       expect_branch refs/heads/remotes/origin/remote-del two
+'
+
+test_expect_success 'disallow deleting remote branch via @{-1}' '
+       git update-ref refs/remotes/origin/previous one &&
+
+       git checkout -b origin/previous two &&
+       git checkout master &&
+
+       test_must_fail git branch -r -D @{-1} &&
+       expect_branch refs/remotes/origin/previous one &&
+       expect_branch refs/heads/origin/previous two
+'
+
+# The thing we are testing here is that "@" is the real branch refs/heads/@,
+# and not refs/heads/HEAD. These tests should not imply that refs/heads/@ is a
+# sane thing, but it _is_ technically allowed for now. If we disallow it, these
+# can be switched to test_must_fail.
+test_expect_success 'create branch named "@"' '
+       git branch -f @ one &&
+       expect_branch refs/heads/@ one
+'
+
+test_expect_success 'delete branch named "@"' '
+       git update-ref refs/heads/@ two &&
+       git branch -D @ &&
+       expect_deleted refs/heads/@
+'
+
+test_expect_success 'checkout does not treat remote @{upstream} as a branch' '
+       git update-ref refs/remotes/origin/checkout one &&
+       git branch --set-upstream-to=origin/checkout &&
+       git update-ref refs/heads/origin/checkout two &&
+       git update-ref refs/heads/remotes/origin/checkout two &&
+
+       git checkout @{upstream} &&
+       expect_branch HEAD one
+'
+
+test_done
index 696743632729f6f7a244606adb4e1b0de9beeb7f..baef2d692431169d83e0bc3aed11d9030ea4a24a 100755 (executable)
@@ -225,7 +225,7 @@ test_expect_success 'cannot do merge w/conflicts when previous merge is unfinish
        test -d .git/NOTES_MERGE_WORKTREE &&
        test_must_fail git notes merge z >output 2>&1 &&
        # Output should indicate what is wrong
-       grep -q "\\.git/NOTES_MERGE_\\* exists" output
+       test_i18ngrep -q "\\.git/NOTES_MERGE_\\* exists" output
 '
 
 # Setup non-conflicting merge between x and new notes ref w
index 6e0511596b0cea176cf19566a90971d8f0196253..b9c3bc2487aa7dd4bb009d45f784e047f772f62d 100755 (executable)
@@ -52,7 +52,7 @@ test_expect_success 'merge z into y while mid-merge in another workdir fails' '
                cd worktree &&
                git config core.notesRef refs/notes/y &&
                test_must_fail git notes merge z 2>err &&
-               test_i18ngrep "A notes merge into refs/notes/y is already in-progress at" err
+               test_i18ngrep "a notes merge into refs/notes/y is already in-progress at" err
        ) &&
        test_path_is_missing .git/worktrees/worktree/NOTES_MERGE_REF
 '
index e38e2963880d42dc335870292f7a2aa4d583497c..37821d245433f757fa13f0a3e27da0312bebb7db 100755 (executable)
@@ -169,6 +169,13 @@ test_expect_success 'reflog for the branch shows state before rebase' '
        test $(git rev-parse branch1@{1}) = $(git rev-parse original-branch1)
 '
 
+test_expect_success 'reflog for the branch shows correct finish message' '
+       printf "rebase -i (finish): refs/heads/branch1 onto %s\n" \
+               "$(git rev-parse branch2)" >expected &&
+       git log -g --pretty=%gs -1 refs/heads/branch1 >actual &&
+       test_cmp expected actual
+'
+
 test_expect_success 'exchange two commits' '
        set_fake_editor &&
        FAKE_LINES="2 1" git rebase -i HEAD~2 &&
@@ -237,6 +244,22 @@ test_expect_success 'retain authorship' '
        git show HEAD | grep "^Author: Twerp Snog"
 '
 
+test_expect_success 'retain authorship w/ conflicts' '
+       git reset --hard twerp &&
+       test_commit a conflict a conflict-a &&
+       git reset --hard twerp &&
+       GIT_AUTHOR_NAME=AttributeMe \
+       test_commit b conflict b conflict-b &&
+       set_fake_editor &&
+       test_must_fail git rebase -i conflict-a &&
+       echo resolved >conflict &&
+       git add conflict &&
+       git rebase --continue &&
+       test $(git rev-parse conflict-a^0) = $(git rev-parse HEAD^) &&
+       git show >out &&
+       grep AttributeMe out
+'
+
 test_expect_success 'squash' '
        git reset --hard twerp &&
        echo B > file7 &&
@@ -350,7 +373,7 @@ test_expect_success 'verbose flag is heeded, even after --continue' '
        grep "^ file1 | 2 +-$" output
 '
 
-test_expect_success 'multi-squash only fires up editor once' '
+test_expect_success C_LOCALE_OUTPUT 'multi-squash only fires up editor once' '
        base=$(git rev-parse HEAD~4) &&
        set_fake_editor &&
        FAKE_COMMIT_AMEND="ONCE" FAKE_LINES="1 squash 2 squash 3 squash 4" \
@@ -360,7 +383,7 @@ test_expect_success 'multi-squash only fires up editor once' '
        test 1 = $(git show | grep ONCE | wc -l)
 '
 
-test_expect_success 'multi-fixup does not fire up editor' '
+test_expect_success C_LOCALE_OUTPUT 'multi-fixup does not fire up editor' '
        git checkout -b multi-fixup E &&
        base=$(git rev-parse HEAD~4) &&
        set_fake_editor &&
@@ -410,7 +433,7 @@ D
 ONCE
 EOF
 
-test_expect_success 'squash and fixup generate correct log messages' '
+test_expect_success C_LOCALE_OUTPUT 'squash and fixup generate correct log messages' '
        git checkout -b squash-fixup E &&
        base=$(git rev-parse HEAD~4) &&
        set_fake_editor &&
@@ -423,7 +446,7 @@ test_expect_success 'squash and fixup generate correct log messages' '
        git branch -D squash-fixup
 '
 
-test_expect_success 'squash ignores comments' '
+test_expect_success C_LOCALE_OUTPUT 'squash ignores comments' '
        git checkout -b skip-comments E &&
        base=$(git rev-parse HEAD~4) &&
        set_fake_editor &&
@@ -436,7 +459,7 @@ test_expect_success 'squash ignores comments' '
        git branch -D skip-comments
 '
 
-test_expect_success 'squash ignores blank lines' '
+test_expect_success C_LOCALE_OUTPUT 'squash ignores blank lines' '
        git checkout -b skip-blank-lines E &&
        base=$(git rev-parse HEAD~4) &&
        set_fake_editor &&
@@ -540,7 +563,7 @@ test_expect_success 'clean error after failed "exec"' '
        echo "edited again" > file7 &&
        git add file7 &&
        test_must_fail git rebase --continue 2>error &&
-       test_i18ngrep "You have staged changes in your working tree." error
+       test_i18ngrep "you have staged changes in your working tree" error
 '
 
 test_expect_success 'rebase a detached HEAD' '
@@ -844,7 +867,7 @@ test_expect_success 'rebase -ix with several instances of --exec' '
        test_cmp expected actual
 '
 
-test_expect_success 'rebase -ix with --autosquash' '
+test_expect_success C_LOCALE_OUTPUT 'rebase -ix with --autosquash' '
        git reset --hard execute &&
        git checkout -b autosquash &&
        echo second >second.txt &&
@@ -927,7 +950,7 @@ test_expect_success 'rebase -i --root fixup root commit' '
        test 0 = $(git cat-file commit HEAD | grep -c ^parent\ )
 '
 
-test_expect_success 'rebase --edit-todo does not works on non-interactive rebase' '
+test_expect_success C_LOCALE_OUTPUT 'rebase --edit-todo does not work on non-interactive rebase' '
        git reset --hard &&
        git checkout conflict-branch &&
        set_fake_editor &&
@@ -976,6 +999,17 @@ test_expect_success 'rebase -i respects core.commentchar' '
        test B = $(git cat-file commit HEAD^ | sed -ne \$p)
 '
 
+test_expect_success 'rebase -i respects core.commentchar=auto' '
+       test_config core.commentchar auto &&
+       write_script copy-edit-script.sh <<-\EOF &&
+       cp "$1" edit-script
+       EOF
+       test_set_editor "$(pwd)/copy-edit-script.sh" &&
+       test_when_finished "git rebase --abort || :" &&
+       git rebase -i HEAD^ &&
+       test -z "$(grep -ve "^#" -e "^\$" -e "^pick" edit-script)"
+'
+
 test_expect_success 'rebase -i, with <onto> and <upstream> specified as :/quuxery' '
        test_when_finished "git branch -D torebase" &&
        git checkout -b torebase branch1 &&
index a6a6c40a98512b190f8610391aa153a294e4b5cb..910f2182843476edf878bfc42f34d868c70d8cf5 100755 (executable)
@@ -99,4 +99,28 @@ testrebase() {
 testrebase "" .git/rebase-apply
 testrebase " --merge" .git/rebase-merge
 
+test_expect_success 'rebase --quit' '
+       cd "$work_dir" &&
+       # Clean up the state from the previous one
+       git reset --hard pre-rebase &&
+       test_must_fail git rebase master &&
+       test_path_is_dir .git/rebase-apply &&
+       head_before=$(git rev-parse HEAD) &&
+       git rebase --quit &&
+       test $(git rev-parse HEAD) = $head_before &&
+       test ! -d .git/rebase-apply
+'
+
+test_expect_success 'rebase --merge --quit' '
+       cd "$work_dir" &&
+       # Clean up the state from the previous one
+       git reset --hard pre-rebase &&
+       test_must_fail git rebase --merge master &&
+       test_path_is_dir .git/rebase-merge &&
+       head_before=$(git rev-parse HEAD) &&
+       git rebase --quit &&
+       test $(git rev-parse HEAD) = $head_before &&
+       test ! -d .git/rebase-merge
+'
+
 test_done
index 48346f1cc0c12883029349e4999d7e6697b35adb..5848949ec3700c2188d581500c19eaffa1392c3d 100755 (executable)
@@ -234,23 +234,23 @@ test_auto_fixup_fixup () {
        fi
 }
 
-test_expect_success 'fixup! fixup!' '
+test_expect_success C_LOCALE_OUTPUT 'fixup! fixup!' '
        test_auto_fixup_fixup fixup fixup
 '
 
-test_expect_success 'fixup! squash!' '
+test_expect_success C_LOCALE_OUTPUT 'fixup! squash!' '
        test_auto_fixup_fixup fixup squash
 '
 
-test_expect_success 'squash! squash!' '
+test_expect_success C_LOCALE_OUTPUT 'squash! squash!' '
        test_auto_fixup_fixup squash squash
 '
 
-test_expect_success 'squash! fixup!' '
+test_expect_success C_LOCALE_OUTPUT 'squash! fixup!' '
        test_auto_fixup_fixup squash fixup
 '
 
-test_expect_success 'autosquash with custom inst format' '
+test_expect_success C_LOCALE_OUTPUT 'autosquash with custom inst format' '
        git reset --hard base &&
        git config --add rebase.instructionFormat "[%an @ %ar] %s"  &&
        echo 2 >file1 &&
index ab8a63e8d6dc643b28eb0c74ba3f032b7532226f..e24370066012fcb441aa0c59ff9c0c34e1d37e9c 100755 (executable)
@@ -33,7 +33,123 @@ test_expect_success setup '
        git commit -m "related commit"
 '
 
-testrebase() {
+create_expected_success_am () {
+       cat >expected <<-EOF
+       $(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
+       HEAD is now at $(git rev-parse --short feature-branch) third commit
+       First, rewinding head to replay your work on top of it...
+       Applying: second commit
+       Applying: third commit
+       Applied autostash.
+       EOF
+}
+
+create_expected_success_interactive () {
+       q_to_cr >expected <<-EOF
+       $(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
+       HEAD is now at $(git rev-parse --short feature-branch) third commit
+       Rebasing (1/2)QRebasing (2/2)QApplied autostash.
+       Successfully rebased and updated refs/heads/rebased-feature-branch.
+       EOF
+}
+
+create_expected_success_merge () {
+       cat >expected <<-EOF
+       $(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
+       HEAD is now at $(git rev-parse --short feature-branch) third commit
+       First, rewinding head to replay your work on top of it...
+       Merging unrelated-onto-branch with HEAD~1
+       Merging:
+       $(git rev-parse --short unrelated-onto-branch) unrelated commit
+       $(git rev-parse --short feature-branch^) second commit
+       found 1 common ancestor:
+       $(git rev-parse --short feature-branch~2) initial commit
+       [detached HEAD $(git rev-parse --short rebased-feature-branch~1)] second commit
+        Author: A U Thor <author@example.com>
+        Date: Thu Apr 7 15:14:13 2005 -0700
+        2 files changed, 2 insertions(+)
+        create mode 100644 file1
+        create mode 100644 file2
+       Committed: 0001 second commit
+       Merging unrelated-onto-branch with HEAD~0
+       Merging:
+       $(git rev-parse --short rebased-feature-branch~1) second commit
+       $(git rev-parse --short feature-branch) third commit
+       found 1 common ancestor:
+       $(git rev-parse --short feature-branch~1) second commit
+       [detached HEAD $(git rev-parse --short rebased-feature-branch)] third commit
+        Author: A U Thor <author@example.com>
+        Date: Thu Apr 7 15:15:13 2005 -0700
+        1 file changed, 1 insertion(+)
+        create mode 100644 file3
+       Committed: 0002 third commit
+       All done.
+       Applied autostash.
+       EOF
+}
+
+create_expected_failure_am () {
+       cat >expected <<-EOF
+       $(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
+       HEAD is now at $(git rev-parse --short feature-branch) third commit
+       First, rewinding head to replay your work on top of it...
+       Applying: second commit
+       Applying: third commit
+       Applying autostash resulted in conflicts.
+       Your changes are safe in the stash.
+       You can run "git stash pop" or "git stash drop" at any time.
+       EOF
+}
+
+create_expected_failure_interactive () {
+       q_to_cr >expected <<-EOF
+       $(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
+       HEAD is now at $(git rev-parse --short feature-branch) third commit
+       Rebasing (1/2)QRebasing (2/2)QApplying autostash resulted in conflicts.
+       Your changes are safe in the stash.
+       You can run "git stash pop" or "git stash drop" at any time.
+       Successfully rebased and updated refs/heads/rebased-feature-branch.
+       EOF
+}
+
+create_expected_failure_merge () {
+       cat >expected <<-EOF
+       $(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
+       HEAD is now at $(git rev-parse --short feature-branch) third commit
+       First, rewinding head to replay your work on top of it...
+       Merging unrelated-onto-branch with HEAD~1
+       Merging:
+       $(git rev-parse --short unrelated-onto-branch) unrelated commit
+       $(git rev-parse --short feature-branch^) second commit
+       found 1 common ancestor:
+       $(git rev-parse --short feature-branch~2) initial commit
+       [detached HEAD $(git rev-parse --short rebased-feature-branch~1)] second commit
+        Author: A U Thor <author@example.com>
+        Date: Thu Apr 7 15:14:13 2005 -0700
+        2 files changed, 2 insertions(+)
+        create mode 100644 file1
+        create mode 100644 file2
+       Committed: 0001 second commit
+       Merging unrelated-onto-branch with HEAD~0
+       Merging:
+       $(git rev-parse --short rebased-feature-branch~1) second commit
+       $(git rev-parse --short feature-branch) third commit
+       found 1 common ancestor:
+       $(git rev-parse --short feature-branch~1) second commit
+       [detached HEAD $(git rev-parse --short rebased-feature-branch)] third commit
+        Author: A U Thor <author@example.com>
+        Date: Thu Apr 7 15:15:13 2005 -0700
+        1 file changed, 1 insertion(+)
+        create mode 100644 file3
+       Committed: 0002 third commit
+       All done.
+       Applying autostash resulted in conflicts.
+       Your changes are safe in the stash.
+       You can run "git stash pop" or "git stash drop" at any time.
+       EOF
+}
+
+testrebase () {
        type=$1
        dotest=$2
 
@@ -51,14 +167,20 @@ testrebase() {
                test_config rebase.autostash true &&
                git reset --hard &&
                git checkout -b rebased-feature-branch feature-branch &&
-               test_when_finished git branch -D rebased-feature-branch &&
                echo dirty >>file3 &&
-               git rebase$type unrelated-onto-branch &&
+               git rebase$type unrelated-onto-branch >actual 2>&1 &&
                grep unrelated file4 &&
                grep dirty file3 &&
                git checkout feature-branch
        '
 
+       test_expect_success "rebase$type --autostash: check output" '
+               test_when_finished git branch -D rebased-feature-branch &&
+               suffix=${type#\ --} && suffix=${suffix:-am} &&
+               create_expected_success_$suffix &&
+               test_i18ncmp expected actual
+       '
+
        test_expect_success "rebase$type: dirty index, non-conflicting rebase" '
                test_config rebase.autostash true &&
                git reset --hard &&
@@ -137,10 +259,9 @@ testrebase() {
                test_config rebase.autostash true &&
                git reset --hard &&
                git checkout -b rebased-feature-branch feature-branch &&
-               test_when_finished git branch -D rebased-feature-branch &&
                echo dirty >file4 &&
                git add file4 &&
-               git rebase$type unrelated-onto-branch &&
+               git rebase$type unrelated-onto-branch >actual 2>&1 &&
                test_path_is_missing $dotest &&
                git reset --hard &&
                grep unrelated file4 &&
@@ -149,6 +270,13 @@ testrebase() {
                git stash pop &&
                grep dirty file4
        '
+
+       test_expect_success "rebase$type: check output with conflicting stash" '
+               test_when_finished git branch -D rebased-feature-branch &&
+               suffix=${type#\ --} && suffix=${suffix:-am} &&
+               create_expected_failure_$suffix &&
+               test_i18ncmp expected actual
+       '
 }
 
 test_expect_success "rebase: fast-forward rebase" '
index d5b896d4459e82cdc7eb363af77d8eef28871229..ebf4f5e4b2c1c1cc20a49888df14cedd14b49a8b 100755 (executable)
@@ -38,9 +38,6 @@ git_rebase_interactive () {
        git rebase -i "$1"
 }
 
-KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
-# The real reason "replace directory with submodule" fails is because a
-# directory "sub1" exists, but we reuse the suppression added for merge here
 test_submodule_switch "git_rebase_interactive"
 
 test_done
diff --git a/t/t3428-rebase-signoff.sh b/t/t3428-rebase-signoff.sh
new file mode 100755 (executable)
index 0000000..2afb564
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+test_description='git rebase --signoff
+
+This test runs git rebase --signoff and make sure that it works.
+'
+
+. ./test-lib.sh
+
+# A simple file to commit
+cat >file <<EOF
+a
+EOF
+
+# Expected commit message after rebase --signoff
+cat >expected-signed <<EOF
+first
+
+Signed-off-by: $(git var GIT_COMMITTER_IDENT | sed -e "s/>.*/>/")
+EOF
+
+# Expected commit message after rebase without --signoff (or with --no-signoff)
+cat >expected-unsigned <<EOF
+first
+EOF
+
+
+# We configure an alias to do the rebase --signoff so that
+# on the next subtest we can show that --no-signoff overrides the alias
+test_expect_success 'rebase --signoff adds a sign-off line' '
+       git commit --allow-empty -m "Initial empty commit" &&
+       git add file && git commit -m first &&
+       git config alias.rbs "rebase --signoff" &&
+       git rbs HEAD^ &&
+       git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
+       test_cmp expected-signed actual
+'
+
+test_expect_success 'rebase --no-signoff does not add a sign-off line' '
+       git commit --amend -m "first" &&
+       git rbs --no-signoff HEAD^ &&
+       git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
+       test_cmp expected-unsigned actual
+'
+
+test_done
diff --git a/t/t3429-rebase-edit-todo.sh b/t/t3429-rebase-edit-todo.sh
new file mode 100755 (executable)
index 0000000..b9292df
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+test_description='rebase should reread the todo file if an exec modifies it'
+
+. ./test-lib.sh
+
+test_expect_success 'rebase exec modifies rebase-todo' '
+       test_commit initial &&
+       todo=.git/rebase-merge/git-rebase-todo &&
+       git rebase HEAD -x "echo exec touch F >>$todo" &&
+       test -e F
+'
+
+test_done
index 51f3bbb8af446dd24a835a8593475b59a73f6d1f..4f2a263b63e14348032959059c15b160fecba39c 100755 (executable)
@@ -96,7 +96,7 @@ test_expect_success 'revert forbidden on dirty working tree' '
        echo content >extra_file &&
        git add extra_file &&
        test_must_fail git revert HEAD 2>errors &&
-       test_i18ngrep "Your local changes would be overwritten by " errors
+       test_i18ngrep "your local changes would be overwritten by " errors
 
 '
 
@@ -141,4 +141,16 @@ test_expect_success 'cherry-pick "-" works with arguments' '
        test_cmp expect actual
 '
 
+test_expect_success 'cherry-pick works with dirty renamed file' '
+       test_commit to-rename &&
+       git checkout -b unrelated &&
+       test_commit unrelated &&
+       git checkout @{-1} &&
+       git mv to-rename.t renamed &&
+       test_tick &&
+       git commit -m renamed &&
+       echo modified >renamed &&
+       git cherry-pick refs/heads/unrelated
+'
+
 test_done
index e37547f41a21ebda150aad6797012c9df3742382..b1602718f85468d17faa1cc0d7ae8854ac2f5407 100755 (executable)
@@ -31,6 +31,15 @@ test_expect_success setup '
 
 '
 
+test_expect_success 'cherry-pick -m complains of bogus numbers' '
+       # expect 129 here to distinguish between cases where
+       # there was nothing to cherry-pick
+       test_expect_code 129 git cherry-pick -m &&
+       test_expect_code 129 git cherry-pick -m foo b &&
+       test_expect_code 129 git cherry-pick -m -1 b &&
+       test_expect_code 129 git cherry-pick -m 0 b
+'
+
 test_expect_success 'cherry-pick a non-merge with -m should fail' '
 
        git reset --hard &&
index 7b7a89dbd5ce578e0a722345a00f247e383689ef..0acf4b14614c750d3c2324d8a941aa77d5c7ad56 100755 (executable)
@@ -147,6 +147,16 @@ test_expect_success '--abort to cancel single cherry-pick' '
        git diff-index --exit-code HEAD
 '
 
+test_expect_success '--abort does not unsafely change HEAD' '
+       pristine_detach initial &&
+       test_must_fail git cherry-pick picked anotherpick &&
+       git reset --hard base &&
+       test_must_fail git cherry-pick picked anotherpick &&
+       git cherry-pick --abort 2>actual &&
+       test_i18ngrep "You seem to have moved HEAD" actual &&
+       test_cmp_rev base HEAD
+'
+
 test_expect_success 'cherry-pick --abort to cancel multiple revert' '
        pristine_detach anotherpick &&
        test_expect_code 1 git revert base..picked &&
@@ -375,7 +385,7 @@ test_expect_success '--continue respects opts' '
        git cat-file commit HEAD~1 >picked_msg &&
        git cat-file commit HEAD~2 >unrelatedpick_msg &&
        git cat-file commit HEAD~3 >initial_msg &&
-       test_must_fail grep "cherry picked from" initial_msg &&
+       ! grep "cherry picked from" initial_msg &&
        grep "cherry picked from" unrelatedpick_msg &&
        grep "cherry picked from" picked_msg &&
        grep "cherry picked from" anotherpick_msg
@@ -416,9 +426,9 @@ test_expect_failure '--signoff is automatically propagated to resolved conflict'
        git cat-file commit HEAD~1 >picked_msg &&
        git cat-file commit HEAD~2 >unrelatedpick_msg &&
        git cat-file commit HEAD~3 >initial_msg &&
-       test_must_fail grep "Signed-off-by:" initial_msg &&
+       ! grep "Signed-off-by:" initial_msg &&
        grep "Signed-off-by:" unrelatedpick_msg &&
-       test_must_fail grep "Signed-off-by:" picked_msg &&
+       ! grep "Signed-off-by:" picked_msg &&
        grep "Signed-off-by:" anotherpick_msg
 '
 
index 9cce5ae8815a11e3453f5669b0592f7f7659009b..9888bf34b9538f6e4aae1a1c65022ae126a62ce2 100755 (executable)
@@ -25,9 +25,8 @@ Signed-off-by: B.U. Thor <buthor@example.com>"
 
 mesg_broken_footer="$mesg_no_footer
 
-The signed-off-by string should begin with the words Signed-off-by followed
-by a colon and space, and then the signers name and email address. e.g.
-Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
+This is not recognized as a footer because Myfooter is not a recognized token.
+Myfooter: A.U. Thor <author@example.com>"
 
 mesg_with_footer_sob="$mesg_with_footer
 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
@@ -112,6 +111,17 @@ test_expect_success 'cherry-pick -s inserts blank line after non-conforming foot
        test_cmp expect actual
 '
 
+test_expect_success 'cherry-pick -s recognizes trailer config' '
+       pristine_detach initial &&
+       git -c "trailer.Myfooter.ifexists=add" cherry-pick -s mesg-broken-footer &&
+       cat <<-EOF >expect &&
+               $mesg_broken_footer
+               Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
+       EOF
+       git log -1 --pretty=format:%B >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'cherry-pick -x inserts blank line when conforming footer not found' '
        pristine_detach initial &&
        sha1=$(git rev-parse mesg-no-footer^0) &&
@@ -198,6 +208,50 @@ test_expect_success 'cherry-pick -x -s adds sob even when trailing sob exists fo
        test_cmp expect actual
 '
 
+test_expect_success 'cherry-pick -x handles commits with no NL at end of message' '
+       pristine_detach initial &&
+       printf "title\n\nSigned-off-by: A <a@example.com>" >msg &&
+       sha1=$(git commit-tree -p initial mesg-with-footer^{tree} <msg) &&
+       git cherry-pick -x $sha1 &&
+       git log -1 --pretty=format:%B >actual &&
+
+       printf "\n(cherry picked from commit %s)\n" $sha1 >>msg &&
+       test_cmp msg actual
+'
+
+test_expect_success 'cherry-pick -x handles commits with no footer and no NL at end of message' '
+       pristine_detach initial &&
+       printf "title\n\nnot a footer" >msg &&
+       sha1=$(git commit-tree -p initial mesg-with-footer^{tree} <msg) &&
+       git cherry-pick -x $sha1 &&
+       git log -1 --pretty=format:%B >actual &&
+
+       printf "\n\n(cherry picked from commit %s)\n" $sha1 >>msg &&
+       test_cmp msg actual
+'
+
+test_expect_success 'cherry-pick -s handles commits with no NL at end of message' '
+       pristine_detach initial &&
+       printf "title\n\nSigned-off-by: A <a@example.com>" >msg &&
+       sha1=$(git commit-tree -p initial mesg-with-footer^{tree} <msg) &&
+       git cherry-pick -s $sha1 &&
+       git log -1 --pretty=format:%B >actual &&
+
+       printf "\nSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n" >>msg &&
+       test_cmp msg actual
+'
+
+test_expect_success 'cherry-pick -s handles commits with no footer and no NL at end of message' '
+       pristine_detach initial &&
+       printf "title\n\nnot a footer" >msg &&
+       sha1=$(git commit-tree -p initial mesg-with-footer^{tree} <msg) &&
+       git cherry-pick -s $sha1 &&
+       git log -1 --pretty=format:%B >actual &&
+
+       printf "\n\nSigned-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\n" >>msg &&
+       test_cmp msg actual
+'
+
 test_expect_success 'cherry-pick -x treats "(cherry picked from..." line as part of footer' '
        pristine_detach initial &&
        sha1=$(git rev-parse mesg-with-cherry-footer^0) &&
index d046d98aec61748ad936515807f28f77600f630e..5f9913ba33d3edc848b03fc37bed587fe5c54849 100755 (executable)
@@ -111,21 +111,21 @@ test_expect_success 'Remove nonexistent file with --ignore-unmatch' '
 '
 
 test_expect_success '"rm" command printed' '
-       echo frotz > test-file &&
+       echo frotz >test-file &&
        git add test-file &&
        git commit -m "add file for rm test" &&
-       git rm test-file > rm-output &&
+       git rm test-file >rm-output &&
        test $(grep "^rm " rm-output | wc -l) = 1 &&
        rm -f test-file rm-output &&
        git commit -m "remove file from rm test"
 '
 
 test_expect_success '"rm" command suppressed with --quiet' '
-       echo frotz > test-file &&
+       echo frotz >test-file &&
        git add test-file &&
        git commit -m "add file for rm --quiet test" &&
-       git rm --quiet test-file > rm-output &&
-       test $(wc -l < rm-output) = 0 &&
+       git rm --quiet test-file >rm-output &&
+       test_must_be_empty rm-output &&
        rm -f test-file rm-output &&
        git commit -m "remove file from rm --quiet test"
 '
@@ -221,7 +221,7 @@ test_expect_success 'Call "rm" from outside the work tree' '
        mkdir repo &&
        (cd repo &&
         git init &&
-        echo something > somefile &&
+        echo something >somefile &&
         git add somefile &&
         git commit -m "add a file" &&
         (cd .. &&
@@ -268,6 +268,14 @@ cat >expect.modified <<EOF
  M submod
 EOF
 
+cat >expect.modified_inside <<EOF
+ m submod
+EOF
+
+cat >expect.modified_untracked <<EOF
+ ? submod
+EOF
+
 cat >expect.cached <<EOF
 D  submod
 EOF
@@ -287,7 +295,7 @@ test_expect_success 'rm removes empty submodules from work tree' '
        git commit -m "add submodule" &&
        git rm submod &&
        test ! -e submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -298,7 +306,7 @@ test_expect_success 'rm removes removed submodule from index and .gitmodules' '
        git submodule update &&
        rm -rf submod &&
        git rm submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -309,7 +317,7 @@ test_expect_success 'rm removes work tree of unmodified submodules' '
        git submodule update &&
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -320,7 +328,7 @@ test_expect_success 'rm removes a submodule with a trailing /' '
        git submodule update &&
        git rm submod/ &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -335,17 +343,15 @@ test_expect_success 'rm succeeds when given a directory with a trailing /' '
 test_expect_success 'rm of a populated submodule with different HEAD fails unless forced' '
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               git checkout HEAD^
-       ) &&
+       git -C submod checkout HEAD^ &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -418,34 +424,30 @@ test_expect_success 'rm issues a warning when section is not found in .gitmodule
 test_expect_success 'rm of a populated submodule with modifications fails unless forced' '
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >empty
-       ) &&
+       echo X >submod/empty &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       test_cmp expect.modified actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test_cmp expect.modified_inside actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated submodule with untracked files fails unless forced' '
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >untracked
-       ) &&
+       echo X >submod/untracked &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       test_cmp expect.modified actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test_cmp expect.modified_untracked actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -461,16 +463,12 @@ test_expect_success 'setup submodule conflict' '
        git add nitfol &&
        git commit -m "added nitfol 2" &&
        git checkout -b conflict1 master &&
-       (cd submod &&
-               git fetch &&
-               git checkout branch1
-       ) &&
+       git -C submod fetch &&
+       git -C submod checkout branch1 &&
        git add submod &&
        git commit -m "submod 1" &&
        git checkout -b conflict2 master &&
-       (cd submod &&
-               git checkout branch2
-       ) &&
+       git -C submod checkout branch2 &&
        git add submod &&
        git commit -m "submod 2"
 '
@@ -486,7 +484,7 @@ test_expect_success 'rm removes work tree of unmodified conflicted submodule' '
        test_must_fail git merge conflict2 &&
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -494,18 +492,16 @@ test_expect_success 'rm of a conflicted populated submodule with different HEAD
        git checkout conflict1 &&
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               git checkout HEAD^
-       ) &&
+       git -C submod checkout HEAD^ &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -515,18 +511,16 @@ test_expect_success 'rm of a conflicted populated submodule with modifications f
        git checkout conflict1 &&
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >empty
-       ) &&
+       echo X >submod/empty &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
        test_must_fail git config -f .gitmodules submodule.sub.path
@@ -536,18 +530,16 @@ test_expect_success 'rm of a conflicted populated submodule with untracked files
        git checkout conflict1 &&
        git reset --hard &&
        git submodule update &&
-       (cd submod &&
-               echo X >untracked
-       ) &&
+       echo X >submod/untracked &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
@@ -564,12 +556,12 @@ test_expect_success 'rm of a conflicted populated submodule with a .git director
        test_must_fail git rm submod &&
        test -d submod &&
        test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        test_must_fail git rm -f submod &&
        test -d submod &&
        test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git merge --abort &&
        rm -rf submod
@@ -581,30 +573,26 @@ test_expect_success 'rm of a conflicted unpopulated submodule succeeds' '
        test_must_fail git merge conflict2 &&
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
-test_expect_success 'rm of a populated submodule with a .git directory fails even when forced' '
+test_expect_success 'rm of a populated submodule with a .git directory migrates git dir' '
        git checkout -f master &&
        git reset --hard &&
        git submodule update &&
        (cd submod &&
                rm .git &&
                cp -R ../.git/modules/sub .git &&
-               GIT_WORK_TREE=. git config --unset core.worktree
+               GIT_WORK_TREE=. git config --unset core.worktree &&
+               rm -r ../.git/modules/sub
        ) &&
-       test_must_fail git rm submod &&
-       test -d submod &&
-       test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       test_must_fail git rm -f submod &&
-       test -d submod &&
-       test -d submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       rm -rf submod
+       git rm submod 2>output.err &&
+       ! test -d submod &&
+       ! test -d submod/.git &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test -s actual &&
+       test_i18ngrep Migrating output.err
 '
 
 cat >expect.deepmodified <<EOF
@@ -629,94 +617,83 @@ test_expect_success 'setup subsubmodule' '
 test_expect_success 'rm recursively removes work tree of unmodified submodules' '
        git rm submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated nested submodule with different nested HEAD fails unless forced' '
        git reset --hard &&
        git submodule update --recursive &&
-       (cd submod/subsubmod &&
-               git checkout HEAD^
-       ) &&
+       git -C submod/subsubmod checkout HEAD^ &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       test_cmp expect.modified actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test_cmp expect.modified_inside actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated nested submodule with nested modifications fails unless forced' '
        git reset --hard &&
        git submodule update --recursive &&
-       (cd submod/subsubmod &&
-               echo X >empty
-       ) &&
+       echo X >submod/subsubmod/empty &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       test_cmp expect.modified actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test_cmp expect.modified_inside actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'rm of a populated nested submodule with nested untracked files fails unless forced' '
        git reset --hard &&
        git submodule update --recursive &&
-       (cd submod/subsubmod &&
-               echo X >untracked
-       ) &&
+       echo X >submod/subsubmod/untracked &&
        test_must_fail git rm submod &&
        test -d submod &&
        test -f submod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       test_cmp expect.modified actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test_cmp expect.modified_untracked actual &&
        git rm -f submod &&
        test ! -d submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
 '
 
-test_expect_success 'rm of a populated nested submodule with a nested .git directory fails even when forced' '
+test_expect_success "rm absorbs submodule's nested .git directory" '
        git reset --hard &&
        git submodule update --recursive &&
        (cd submod/subsubmod &&
                rm .git &&
-               cp -R ../../.git/modules/sub/modules/sub .git &&
+               mv ../../.git/modules/sub/modules/sub .git &&
                GIT_WORK_TREE=. git config --unset core.worktree
        ) &&
-       test_must_fail git rm submod &&
-       test -d submod &&
-       test -d submod/subsubmod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       test_must_fail git rm -f submod &&
-       test -d submod &&
-       test -d submod/subsubmod/.git &&
-       git status -s -uno --ignore-submodules=none > actual &&
-       ! test -s actual &&
-       rm -rf submod
+       git rm submod 2>output.err &&
+       ! test -d submod &&
+       ! test -d submod/subsubmod/.git &&
+       git status -s -uno --ignore-submodules=none >actual &&
+       test -s actual &&
+       test_i18ngrep Migrating output.err
 '
 
 test_expect_success 'checking out a commit after submodule removal needs manual updates' '
-       git commit -m "submodule removal" submod &&
+       git commit -m "submodule removal" submod .gitmodules &&
        git checkout HEAD^ &&
        git submodule update &&
-       git checkout -q HEAD^ 2>actual &&
+       git checkout -q HEAD^ &&
        git checkout -q master 2>actual &&
        test_i18ngrep "^warning: unable to rmdir submod:" actual &&
        git status -s submod >actual &&
        echo "?? submod/" >expected &&
        test_cmp expected actual &&
        rm -rf submod &&
-       git status -s -uno --ignore-submodules=none > actual &&
+       git status -s -uno --ignore-submodules=none >actual &&
        ! test -s actual
 '
 
@@ -881,4 +858,9 @@ test_expect_success 'rm files with two different errors' '
        test_i18ncmp expect actual
 '
 
+test_expect_success 'rm empty string should invoke warning' '
+       git rm -rf "" 2>output &&
+       test_i18ngrep "warning: empty strings" output
+'
+
 test_done
index 53c0cb6dea686ac872c219b746a0c24b3d505416..f3a4b4a913f344ce140344ec7b70482a6d36bcbe 100755 (executable)
@@ -331,6 +331,11 @@ test_expect_success 'git add --dry-run --ignore-missing of non-existing file out
        test_i18ncmp expect.err actual.err
 '
 
+test_expect_success 'git add empty string should invoke warning' '
+       git add "" 2>output &&
+       test_i18ngrep "warning: empty strings" output
+'
+
 test_expect_success 'git add --chmod=[+-]x stages correctly' '
        rm -f foo1 &&
        echo foo >foo1 &&
index deae948c76bd12f9b3ef6b54568717b21d641d8a..2f3e7cea64e897299d87196135032de22050354b 100755 (executable)
@@ -380,4 +380,109 @@ test_expect_success 'patch mode ignores unmerged entries' '
        test_cmp expected diff
 '
 
+test_expect_success 'diffs can be colorized' '
+       git reset --hard &&
+
+       # force color even though the test script has no terminal
+       test_config color.ui always &&
+
+       echo content >test &&
+       printf y | git add -p >output 2>&1 &&
+
+       # We do not want to depend on the exact coloring scheme
+       # git uses for diffs, so just check that we saw some kind of color.
+       grep "$(printf "\\033")" output
+'
+
+test_expect_success 'patch-mode via -i prompts for files' '
+       git reset --hard &&
+
+       echo one >file &&
+       echo two >test &&
+       git add -i <<-\EOF &&
+       patch
+       test
+
+       y
+       quit
+       EOF
+
+       echo test >expect &&
+       git diff --cached --name-only >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'add -p handles globs' '
+       git reset --hard &&
+
+       mkdir -p subdir &&
+       echo base >one.c &&
+       echo base >subdir/two.c &&
+       git add "*.c" &&
+       git commit -m base &&
+
+       echo change >one.c &&
+       echo change >subdir/two.c &&
+       git add -p "*.c" <<-\EOF &&
+       y
+       y
+       EOF
+
+       cat >expect <<-\EOF &&
+       one.c
+       subdir/two.c
+       EOF
+       git diff --cached --name-only >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'add -p handles relative paths' '
+       git reset --hard &&
+
+       echo base >relpath.c &&
+       git add "*.c" &&
+       git commit -m relpath &&
+
+       echo change >relpath.c &&
+       mkdir -p subdir &&
+       git -C subdir add -p .. 2>error <<-\EOF &&
+       y
+       EOF
+
+       test_must_be_empty error &&
+
+       cat >expect <<-\EOF &&
+       relpath.c
+       EOF
+       git diff --cached --name-only >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'add -p does not expand argument lists' '
+       git reset --hard &&
+
+       echo content >not-changed &&
+       git add not-changed &&
+       git commit -m "add not-changed file" &&
+
+       echo change >file &&
+       GIT_TRACE=$(pwd)/trace.out git add -p . <<-\EOF &&
+       y
+       EOF
+
+       # we know that "file" must be mentioned since we actually
+       # update it, but we want to be sure that our "." pathspec
+       # was not expanded into the argument list of any command.
+       # So look only for "not-changed".
+       ! grep not-changed trace.out
+'
+
+test_expect_success 'hunk-editing handles custom comment char' '
+       git reset --hard &&
+       echo change >>file &&
+       test_config core.commentChar "\$" &&
+       echo e | GIT_EDITOR=true git add -p &&
+       git diff --exit-code
+'
+
 test_done
index 4bf1dbe9c9f3ffeb1151be07bf75dcd872167916..3b94283e35535ea4c594e3e746bd01a095eba4e7 100755 (executable)
@@ -45,7 +45,7 @@ test_expect_success 'UTF-8 invalid characters refused' '
        printf "Commit message\n\nInvalid surrogate:\355\240\200\n" \
                >"$HOME/invalid" &&
        git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-       grep "did not conform" "$HOME"/stderr
+       test_i18ngrep "did not conform" "$HOME"/stderr
 '
 
 test_expect_success 'UTF-8 overlong sequences rejected' '
@@ -55,7 +55,7 @@ test_expect_success 'UTF-8 overlong sequences rejected' '
        printf "\340\202\251ommit message\n\nThis is not a space:\300\240\n" \
                >"$HOME/invalid" &&
        git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-       grep "did not conform" "$HOME"/stderr
+       test_i18ngrep "did not conform" "$HOME"/stderr
 '
 
 test_expect_success 'UTF-8 non-characters refused' '
@@ -64,7 +64,7 @@ test_expect_success 'UTF-8 non-characters refused' '
        printf "Commit message\n\nNon-character:\364\217\277\276\n" \
                >"$HOME/invalid" &&
        git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-       grep "did not conform" "$HOME"/stderr
+       test_i18ngrep "did not conform" "$HOME"/stderr
 '
 
 test_expect_success 'UTF-8 non-characters refused' '
@@ -73,7 +73,7 @@ test_expect_success 'UTF-8 non-characters refused' '
        printf "Commit message\n\nNon-character:\357\267\220\n" \
                >"$HOME/invalid" &&
        git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr &&
-       grep "did not conform" "$HOME"/stderr
+       test_i18ngrep "did not conform" "$HOME"/stderr
 '
 
 for H in ISO8859-1 eucJP ISO-2022-JP
index 509084e1a70b4cd5ee7f56421bb9b8995b0a5d94..923eb01f0ea4bec0d3a7d96a2492a0755ad00ef9 100755 (executable)
@@ -31,7 +31,7 @@ test_expect_success setup '
 
        # use UTF-8 in author and committer name to match the
        # i18n.commitencoding settings
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        test_tick &&
        echo "$GIT_AUTHOR_NAME" >mine &&
@@ -55,7 +55,7 @@ test_expect_success setup '
                # the second one on the side branch is ISO-8859-1
                git config i18n.commitencoding ISO8859-1 &&
                # use author and committer name in ISO-8859-1 to match it.
-               . "$TEST_DIRECTORY"/t3901-8859-1.txt
+               . "$TEST_DIRECTORY"/t3901/8859-1.txt
        fi &&
        test_tick &&
        echo Yet another >theirs &&
@@ -100,7 +100,7 @@ test_expect_success 'rebase (U/U)' '
 
        # The result will be committed by GIT_COMMITTER_NAME --
        # we want UTF-8 encoded name.
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
        git checkout -b test &&
        git rebase master &&
 
@@ -110,7 +110,7 @@ test_expect_success 'rebase (U/U)' '
 test_expect_success 'rebase (U/L)' '
        git config i18n.commitencoding UTF-8 &&
        git config i18n.logoutputencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        git reset --hard side &&
        git rebase master &&
@@ -122,7 +122,7 @@ test_expect_success !MINGW 'rebase (L/L)' '
        # In this test we want ISO-8859-1 encoded commits as the result
        git config i18n.commitencoding ISO8859-1 &&
        git config i18n.logoutputencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard side &&
        git rebase master &&
@@ -135,7 +135,7 @@ test_expect_success !MINGW 'rebase (L/U)' '
        # to get ISO-8859-1 results.
        git config i18n.commitencoding ISO8859-1 &&
        git config i18n.logoutputencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard side &&
        git rebase master &&
@@ -148,7 +148,7 @@ test_expect_success 'cherry-pick(U/U)' '
 
        git config i18n.commitencoding UTF-8 &&
        git config i18n.logoutputencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        git reset --hard master &&
        git cherry-pick side^ &&
@@ -163,7 +163,7 @@ test_expect_success !MINGW 'cherry-pick(L/L)' '
 
        git config i18n.commitencoding ISO8859-1 &&
        git config i18n.logoutputencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard master &&
        git cherry-pick side^ &&
@@ -178,7 +178,7 @@ test_expect_success 'cherry-pick(U/L)' '
 
        git config i18n.commitencoding UTF-8 &&
        git config i18n.logoutputencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        git reset --hard master &&
        git cherry-pick side^ &&
@@ -194,7 +194,7 @@ test_expect_success !MINGW 'cherry-pick(L/U)' '
 
        git config i18n.commitencoding ISO8859-1 &&
        git config i18n.logoutputencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard master &&
        git cherry-pick side^ &&
@@ -207,7 +207,7 @@ test_expect_success !MINGW 'cherry-pick(L/U)' '
 test_expect_success 'rebase --merge (U/U)' '
        git config i18n.commitencoding UTF-8 &&
        git config i18n.logoutputencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        git reset --hard side &&
        git rebase --merge master &&
@@ -218,7 +218,7 @@ test_expect_success 'rebase --merge (U/U)' '
 test_expect_success 'rebase --merge (U/L)' '
        git config i18n.commitencoding UTF-8 &&
        git config i18n.logoutputencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        git reset --hard side &&
        git rebase --merge master &&
@@ -230,7 +230,7 @@ test_expect_success 'rebase --merge (L/L)' '
        # In this test we want ISO-8859-1 encoded commits as the result
        git config i18n.commitencoding ISO8859-1 &&
        git config i18n.logoutputencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard side &&
        git rebase --merge master &&
@@ -243,7 +243,7 @@ test_expect_success 'rebase --merge (L/U)' '
        # to get ISO-8859-1 results.
        git config i18n.commitencoding ISO8859-1 &&
        git config i18n.logoutputencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard side &&
        git rebase --merge master &&
@@ -254,7 +254,7 @@ test_expect_success 'rebase --merge (L/U)' '
 test_expect_success 'am (U/U)' '
        # Apply UTF-8 patches with UTF-8 commitencoding
        git config i18n.commitencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        git reset --hard master &&
        git am out-u1 out-u2 &&
@@ -265,7 +265,7 @@ test_expect_success 'am (U/U)' '
 test_expect_success !MINGW 'am (L/L)' '
        # Apply ISO-8859-1 patches with ISO-8859-1 commitencoding
        git config i18n.commitencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard master &&
        git am out-l1 out-l2 &&
@@ -276,7 +276,7 @@ test_expect_success !MINGW 'am (L/L)' '
 test_expect_success 'am (U/L)' '
        # Apply ISO-8859-1 patches with UTF-8 commitencoding
        git config i18n.commitencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
        git reset --hard master &&
 
        # am specifies --utf8 by default.
@@ -288,14 +288,14 @@ test_expect_success 'am (U/L)' '
 test_expect_success 'am --no-utf8 (U/L)' '
        # Apply ISO-8859-1 patches with UTF-8 commitencoding
        git config i18n.commitencoding UTF-8 &&
-       . "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       . "$TEST_DIRECTORY"/t3901/utf8.txt &&
 
        git reset --hard master &&
        git am --no-utf8 out-l1 out-l2 2>err &&
 
        # commit-tree will warn that the commit message does not contain valid UTF-8
        # as mailinfo did not convert it
-       grep "did not conform" err &&
+       test_i18ngrep "did not conform" err &&
 
        check_encoding 2
 '
@@ -303,7 +303,7 @@ test_expect_success 'am --no-utf8 (U/L)' '
 test_expect_success !MINGW 'am (L/U)' '
        # Apply UTF-8 patches with ISO-8859-1 commitencoding
        git config i18n.commitencoding ISO8859-1 &&
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
 
        git reset --hard master &&
        # mailinfo will re-code the commit message to the charset specified by
similarity index 100%
rename from t/t3901-8859-1.txt
rename to t/t3901/8859-1.txt
similarity index 100%
rename from t/t3901-utf8.txt
rename to t/t3901/utf8.txt
index 2142c1fa92017bc47cfc4ccb1f25e16fc0eec1a4..4046817d70a0ac1dd5b11a49c500896688a4f0b1 100755 (executable)
@@ -131,6 +131,26 @@ test_expect_success 'drop middle stash' '
        test 1 = $(git show HEAD:file)
 '
 
+test_expect_success 'drop middle stash by index' '
+       git reset --hard &&
+       echo 8 >file &&
+       git stash &&
+       echo 9 >file &&
+       git stash &&
+       git stash drop 1 &&
+       test 2 = $(git stash list | wc -l) &&
+       git stash apply &&
+       test 9 = $(cat file) &&
+       test 1 = $(git show :file) &&
+       test 1 = $(git show HEAD:file) &&
+       git reset --hard &&
+       git stash drop &&
+       git stash apply &&
+       test 3 = $(cat file) &&
+       test 1 = $(git show :file) &&
+       test 1 = $(git show HEAD:file)
+'
+
 test_expect_success 'stash pop' '
        git reset --hard &&
        git stash pop &&
@@ -254,9 +274,7 @@ test_expect_success 'stash --invalid-option' '
        git add file2 &&
        test_must_fail git stash --invalid-option &&
        test_must_fail git stash save --invalid-option &&
-       test bar5,bar6 = $(cat file),$(cat file2) &&
-       git stash -- -message-starting-with-dash &&
-       test bar,bar2 = $(cat file),$(cat file2)
+       test bar5,bar6 = $(cat file),$(cat file2)
 '
 
 test_expect_success 'stash an added file' '
@@ -604,6 +622,21 @@ test_expect_success 'invalid ref of the form stash@{n}, n >= N' '
        git stash drop
 '
 
+test_expect_success 'invalid ref of the form "n", n >= N' '
+       git stash clear &&
+       test_must_fail git stash drop 0 &&
+       echo bar5 >file &&
+       echo bar6 >file2 &&
+       git add file2 &&
+       git stash &&
+       test_must_fail git stash drop 1 &&
+       test_must_fail git stash pop 1 &&
+       test_must_fail git stash apply 1 &&
+       test_must_fail git stash show 1 &&
+       test_must_fail git stash branch tmp 1 &&
+       git stash drop
+'
+
 test_expect_success 'stash branch should not drop the stash if the branch exists' '
        git stash clear &&
        echo foo >file &&
@@ -630,7 +663,7 @@ test_expect_success 'stash apply shows status same as git status (relative to cu
                sane_unset GIT_MERGE_VERBOSITY &&
                git stash apply
        ) |
-       sed -e 1,2d >actual && # drop "Saved..." and "HEAD is now..."
+       sed -e 1d >actual && # drop "Saved..."
        test_i18ncmp expect actual
 '
 
@@ -731,4 +764,177 @@ test_expect_success 'stash list --cc shows combined diff' '
        test_cmp expect actual
 '
 
+test_expect_success 'stash is not confused by partial renames' '
+       mv file renamed &&
+       git add renamed &&
+       git stash &&
+       git stash apply &&
+       test_path_is_file renamed &&
+       test_path_is_missing file
+'
+
+test_expect_success 'push -m shows right message' '
+       >foo &&
+       git add foo &&
+       git stash push -m "test message" &&
+       echo "stash@{0}: On master: test message" >expect &&
+       git stash list -1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'create stores correct message' '
+       >foo &&
+       git add foo &&
+       STASH_ID=$(git stash create "create test message") &&
+       echo "On master: create test message" >expect &&
+       git show --pretty=%s -s ${STASH_ID} >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'create with multiple arguments for the message' '
+       >foo &&
+       git add foo &&
+       STASH_ID=$(git stash create test untracked) &&
+       echo "On master: test untracked" >expect &&
+       git show --pretty=%s -s ${STASH_ID} >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'stash -- <pathspec> stashes and restores the file' '
+       >foo &&
+       >bar &&
+       git add foo bar &&
+       git stash push -- foo &&
+       test_path_is_file bar &&
+       test_path_is_missing foo &&
+       git stash pop &&
+       test_path_is_file foo &&
+       test_path_is_file bar
+'
+
+test_expect_success 'stash -- <pathspec> stashes in subdirectory' '
+       mkdir sub &&
+       >foo &&
+       >bar &&
+       git add foo bar &&
+       (
+               cd sub &&
+               git stash push -- ../foo
+       ) &&
+       test_path_is_file bar &&
+       test_path_is_missing foo &&
+       git stash pop &&
+       test_path_is_file foo &&
+       test_path_is_file bar
+'
+
+test_expect_success 'stash with multiple pathspec arguments' '
+       >foo &&
+       >bar &&
+       >extra &&
+       git add foo bar extra &&
+       git stash push -- foo bar &&
+       test_path_is_missing bar &&
+       test_path_is_missing foo &&
+       test_path_is_file extra &&
+       git stash pop &&
+       test_path_is_file foo &&
+       test_path_is_file bar &&
+       test_path_is_file extra
+'
+
+test_expect_success 'stash with file including $IFS character' '
+       >"foo bar" &&
+       >foo &&
+       >bar &&
+       git add foo* &&
+       git stash push -- "foo b*" &&
+       test_path_is_missing "foo bar" &&
+       test_path_is_file foo &&
+       test_path_is_file bar &&
+       git stash pop &&
+       test_path_is_file "foo bar" &&
+       test_path_is_file foo &&
+       test_path_is_file bar
+'
+
+test_expect_success 'stash with pathspec matching multiple paths' '
+       echo original >file &&
+       echo original >other-file &&
+       git commit -m "two" file other-file &&
+       echo modified >file &&
+       echo modified >other-file &&
+       git stash push -- "*file" &&
+       echo original >expect &&
+       test_cmp expect file &&
+       test_cmp expect other-file &&
+       git stash pop &&
+       echo modified >expect &&
+       test_cmp expect file &&
+       test_cmp expect other-file
+'
+
+test_expect_success 'stash push -p with pathspec shows no changes only once' '
+       >foo &&
+       git add foo &&
+       git commit -m "tmp" &&
+       git stash push -p foo >actual &&
+       echo "No local changes to save" >expect &&
+       git reset --hard HEAD~ &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success 'stash push with pathspec shows no changes when there are none' '
+       >foo &&
+       git add foo &&
+       git commit -m "tmp" &&
+       git stash push foo >actual &&
+       echo "No local changes to save" >expect &&
+       git reset --hard HEAD~ &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success 'stash push with pathspec not in the repository errors out' '
+       >untracked &&
+       test_must_fail git stash push untracked &&
+       test_path_is_file untracked
+'
+
+test_expect_success 'untracked files are left in place when -u is not given' '
+       >file &&
+       git add file &&
+       >untracked &&
+       git stash push file &&
+       test_path_is_file untracked
+'
+
+test_expect_success 'stash without verb with pathspec' '
+       >"foo bar" &&
+       >foo &&
+       >bar &&
+       git add foo* &&
+       git stash -- "foo b*" &&
+       test_path_is_missing "foo bar" &&
+       test_path_is_file foo &&
+       test_path_is_file bar &&
+       git stash pop &&
+       test_path_is_file "foo bar" &&
+       test_path_is_file foo &&
+       test_path_is_file bar
+'
+
+test_expect_success 'stash -k -- <pathspec> leaves unstaged files intact' '
+       git reset &&
+       >foo &&
+       >bar &&
+       git add foo bar &&
+       git commit -m "test" &&
+       echo "foo" >foo &&
+       echo "bar" >bar &&
+       git stash -k -- foo &&
+       test "",bar = $(cat foo),$(cat bar) &&
+       git stash pop &&
+       test foo,bar = $(cat foo),$(cat bar)
+'
+
 test_done
index 38e730090fe311ea82c737646aedba214d1143bb..83744f8c930637560d7d97123a2ffbd38030637e 100755 (executable)
@@ -77,6 +77,14 @@ test_expect_success 'git stash --no-keep-index -p' '
        verify_state dir/foo work index
 '
 
+test_expect_success 'stash -p --no-keep-index -- <pathspec> does not unstage other files' '
+       set_state HEAD HEADfile_work HEADfile_index &&
+       set_state dir/foo work index &&
+       echo y | git stash push -p --no-keep-index -- HEAD &&
+       verify_state HEAD committed committed &&
+       verify_state dir/foo work index
+'
+
 test_expect_success 'none of this moved HEAD' '
        verify_saved_head
 '
index f372fc8ca8e3b311b03313a46db1aa8f35de2ea9..193adc7b68d691526b804fa7ce02e1f42f21b8a4 100755 (executable)
@@ -185,4 +185,30 @@ test_expect_success 'stash save --all is stash poppable' '
        test -s .gitignore
 '
 
+test_expect_success 'stash push --include-untracked with pathspec' '
+       >foo &&
+       >bar &&
+       git stash push --include-untracked -- foo &&
+       test_path_is_file bar &&
+       test_path_is_missing foo &&
+       git stash pop &&
+       test_path_is_file bar &&
+       test_path_is_file foo
+'
+
+test_expect_success 'stash push with $IFS character' '
+       >"foo bar" &&
+       >foo &&
+       >bar &&
+       git add foo* &&
+       git stash push --include-untracked -- "foo b*" &&
+       test_path_is_missing "foo bar" &&
+       test_path_is_file foo &&
+       test_path_is_file bar &&
+       git stash pop &&
+       test_path_is_file "foo bar" &&
+       test_path_is_file foo &&
+       test_path_is_file bar
+'
+
 test_done
index 135addbfbdae8e39ba0462e71278f41dfc552620..f542d2929d2316fa8d858fc29c1bdfb5ef4c3c71 100755 (executable)
@@ -3,84 +3,75 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
-test_description='Same rename detection as t4003 but testing diff-raw.
+test_description='Same rename detection as t4003 but testing diff-raw.'
 
-'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
 
-test_expect_success \
-    'prepare reference tree' \
-    'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING &&
-     echo frotz >rezrov &&
-    git update-index --add COPYING rezrov &&
-    tree=$(git write-tree) &&
-    echo $tree'
-
-test_expect_success \
-    'prepare work tree' \
-    'sed -e 's/HOWEVER/However/' <COPYING >COPYING.1 &&
-    sed -e 's/GPL/G.P.L/g' <COPYING >COPYING.2 &&
-    rm -f COPYING &&
-    git update-index --add --remove COPYING COPYING.?'
+test_expect_success 'setup reference tree' '
+       cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING &&
+       echo frotz >rezrov &&
+       git update-index --add COPYING rezrov &&
+       tree=$(git write-tree) &&
+       echo $tree &&
+       sed -e 's/HOWEVER/However/' <COPYING >COPYING.1 &&
+       sed -e 's/GPL/G.P.L/g' <COPYING >COPYING.2 &&
+       origoid=$(git hash-object COPYING) &&
+       oid1=$(git hash-object COPYING.1) &&
+       oid2=$(git hash-object COPYING.2)
+'
 
+################################################################
 # tree has COPYING and rezrov.  work tree has COPYING.1 and COPYING.2,
 # both are slightly edited, and unchanged rezrov.  We say COPYING.1
 # and COPYING.2 are based on COPYING, and do not say anything about
 # rezrov.
 
-git diff-index -C $tree >current
-
-cat >expected <<\EOF
-:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 COPYING COPYING.1
-:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 06c67961bbaed34a127f76d261f4c0bf73eda471 R1234 COPYING COPYING.2
-EOF
+test_expect_success 'validate output from rename/copy detection (#1)' '
+       rm -f COPYING &&
+       git update-index --add --remove COPYING COPYING.? &&
 
-test_expect_success \
-    'validate output from rename/copy detection (#1)' \
-    'compare_diff_raw current expected'
+       cat <<-EOF >expected &&
+       :100644 100644 $origoid $oid1 C1234     COPYING COPYING.1
+       :100644 100644 $origoid $oid2 R1234     COPYING COPYING.2
+       EOF
+       git diff-index -C $tree >current &&
+       compare_diff_raw expected current
+'
 
 ################################################################
-
-test_expect_success \
-    'prepare work tree again' \
-    'mv COPYING.2 COPYING &&
-     git update-index --add --remove COPYING COPYING.1 COPYING.2'
-
 # tree has COPYING and rezrov.  work tree has COPYING and COPYING.1,
 # both are slightly edited, and unchanged rezrov.  We say COPYING.1
 # is based on COPYING and COPYING is still there, and do not say anything
 # about rezrov.
 
-git diff-index -C $tree >current
-cat >expected <<\EOF
-:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 06c67961bbaed34a127f76d261f4c0bf73eda471 M     COPYING
-:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 COPYING COPYING.1
-EOF
+test_expect_success 'validate output from rename/copy detection (#2)' '
+       mv COPYING.2 COPYING &&
+       git update-index --add --remove COPYING COPYING.1 COPYING.2 &&
 
-test_expect_success \
-    'validate output from rename/copy detection (#2)' \
-    'compare_diff_raw current expected'
+       cat <<-EOF >expected &&
+       :100644 100644 $origoid $oid2 M COPYING
+       :100644 100644 $origoid $oid1 C1234     COPYING COPYING.1
+       EOF
+       git diff-index -C $tree >current &&
+       compare_diff_raw current expected
+'
 
 ################################################################
-
 # tree has COPYING and rezrov.  work tree has the same COPYING and
 # copy-edited COPYING.1, and unchanged rezrov.  We should not say
 # anything about rezrov or COPYING, since the revised again diff-raw
 # nows how to say Copy.
 
-test_expect_success \
-    'prepare work tree once again' \
-    'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING &&
-     git update-index --add --remove COPYING COPYING.1'
-
-git diff-index -C --find-copies-harder $tree >current
-cat >expected <<\EOF
-:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 COPYING COPYING.1
-EOF
+test_expect_success 'validate output from rename/copy detection (#3)' '
+       cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING &&
+       git update-index --add --remove COPYING COPYING.1 &&
 
-test_expect_success \
-    'validate output from rename/copy detection (#3)' \
-    'compare_diff_raw current expected'
+       cat <<-EOF >expected &&
+       :100644 100644 $origoid $oid1 C1234     COPYING COPYING.1
+       EOF
+       git diff-index -C --find-copies-harder $tree >current &&
+       compare_diff_raw current expected
+'
 
 test_done
index 643d729157d23ce501258710640e4090c34922fc..0a8af76aabf5ad79193341d1ffd4be4c9d4cb7a6 100755 (executable)
@@ -68,7 +68,7 @@ test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' '
        sed -e "s/-CIT/xCIT/" <output >broken &&
        test_must_fail git apply --stat --summary broken 2>detected &&
        detected=$(cat detected) &&
-       detected=$(expr "$detected" : "fatal.*at line \\([0-9]*\\)\$") &&
+       detected=$(expr "$detected" : "error.*at line \\([0-9]*\\)\$") &&
        detected=$(sed -ne "${detected}p" broken) &&
        test "$detected" = xCIT
 '
@@ -77,7 +77,7 @@ test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' '
        git diff --binary | sed -e "s/-CIT/xCIT/" >broken &&
        test_must_fail git apply --stat --summary broken 2>detected &&
        detected=$(cat detected) &&
-       detected=$(expr "$detected" : "fatal.*at line \\([0-9]*\\)\$") &&
+       detected=$(expr "$detected" : "error.*at line \\([0-9]*\\)\$") &&
        detected=$(sed -ne "${detected}p" broken) &&
        test "$detected" = xCIT
 '
index 94ef5000e787f0898ff6ccb57661c972c765db52..d09acfe48e81b2567fd7408d7cb6345c73d99754 100755 (executable)
@@ -306,9 +306,18 @@ diff --no-index --name-status dir2 dir
 diff --no-index --name-status -- dir2 dir
 diff --no-index dir dir3
 diff master master^ side
+# Can't use spaces...
+diff --line-prefix=abc master master^ side
 diff --dirstat master~1 master~2
 diff --dirstat initial rearrange
 diff --dirstat-by-file initial rearrange
+# No-index --abbrev and --no-abbrev
+diff --raw initial
+diff --raw --abbrev=4 initial
+diff --raw --no-abbrev initial
+diff --no-index --raw dir2 dir
+diff --no-index --raw --abbrev=4 dir2 dir
+diff --no-index --raw --no-abbrev dir2 dir
 EOF
 
 test_expect_success 'log -S requires an argument' '
@@ -325,6 +334,10 @@ test_expect_success 'diff --cached -- file on unborn branch' '
        git diff --cached -- file0 >result &&
        test_cmp "$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0" result
 '
+test_expect_success 'diff --line-prefix with spaces' '
+       git diff --line-prefix="| | | " --cached -- file0 >result &&
+       test_cmp "$TEST_DIRECTORY/t4013/diff.diff_--line-prefix_--cached_--_file0" result
+'
 
 test_expect_success 'diff-tree --stdin with log formatting' '
        cat >expect <<-\EOF &&
diff --git a/t/t4013/diff.diff_--line-prefix=abc_master_master^_side b/t/t4013/diff.diff_--line-prefix=abc_master_master^_side
new file mode 100644 (file)
index 0000000..99f91e7
--- /dev/null
@@ -0,0 +1,29 @@
+$ git diff --line-prefix=abc master master^ side
+abcdiff --cc dir/sub
+abcindex cead32e,7289e35..992913c
+abc--- a/dir/sub
+abc+++ b/dir/sub
+abc@@@ -1,6 -1,4 +1,8 @@@
+abc  A
+abc  B
+abc +C
+abc +D
+abc +E
+abc +F
+abc+ 1
+abc+ 2
+abcdiff --cc file0
+abcindex b414108,f4615da..10a8a9f
+abc--- a/file0
+abc+++ b/file0
+abc@@@ -1,6 -1,6 +1,9 @@@
+abc  1
+abc  2
+abc  3
+abc +4
+abc +5
+abc +6
+abc+ A
+abc+ B
+abc+ C
+$
diff --git a/t/t4013/diff.diff_--line-prefix_--cached_--_file0 b/t/t4013/diff.diff_--line-prefix_--cached_--_file0
new file mode 100644 (file)
index 0000000..f41ba4d
--- /dev/null
@@ -0,0 +1,15 @@
+| | | diff --git a/file0 b/file0
+| | | new file mode 100644
+| | | index 0000000..10a8a9f
+| | | --- /dev/null
+| | | +++ b/file0
+| | | @@ -0,0 +1,9 @@
+| | | +1
+| | | +2
+| | | +3
+| | | +4
+| | | +5
+| | | +6
+| | | +A
+| | | +B
+| | | +C
diff --git a/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir b/t/t4013/diff.diff_--no-index_--raw_--abbrev=4_dir2_dir
new file mode 100644 (file)
index 0000000..a71b38a
--- /dev/null
@@ -0,0 +1,3 @@
+$ git diff --no-index --raw --abbrev=4 dir2 dir
+:000000 100644 0000... 0000... A       dir/sub
+$
diff --git a/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir b/t/t4013/diff.diff_--no-index_--raw_--no-abbrev_dir2_dir
new file mode 100644 (file)
index 0000000..e0f0097
--- /dev/null
@@ -0,0 +1,3 @@
+$ git diff --no-index --raw --no-abbrev dir2 dir
+:000000 100644 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 A     dir/sub
+$
diff --git a/t/t4013/diff.diff_--no-index_--raw_dir2_dir b/t/t4013/diff.diff_--no-index_--raw_dir2_dir
new file mode 100644 (file)
index 0000000..3cb4ee7
--- /dev/null
@@ -0,0 +1,3 @@
+$ git diff --no-index --raw dir2 dir
+:000000 100644 0000000... 0000000... A dir/sub
+$
diff --git a/t/t4013/diff.diff_--raw_--abbrev=4_initial b/t/t4013/diff.diff_--raw_--abbrev=4_initial
new file mode 100644 (file)
index 0000000..c3641db
--- /dev/null
@@ -0,0 +1,6 @@
+$ git diff --raw --abbrev=4 initial
+:100644 100644 35d2... 9929... M       dir/sub
+:100644 100644 01e7... 10a8... M       file0
+:000000 100644 0000... b1e6... A       file1
+:100644 000000 01e7... 0000... D       file2
+$
diff --git a/t/t4013/diff.diff_--raw_--no-abbrev_initial b/t/t4013/diff.diff_--raw_--no-abbrev_initial
new file mode 100644 (file)
index 0000000..c87a125
--- /dev/null
@@ -0,0 +1,6 @@
+$ git diff --raw --no-abbrev initial
+:100644 100644 35d242ba79ae89ac695e26b3d4c27a8e6f028f9e 992913c5aa0a5476d10c49ed0f21fc0c6d1aedf3 M     dir/sub
+:100644 100644 01e79c32a8c99c557f0757da7cb6d65b3414466d 10a8a9f3657f91a156b9f0184ed79a20adef9f7f M     file0
+:000000 100644 0000000000000000000000000000000000000000 b1e67221afe8461efd244b487afca22d46b95eb8 A     file1
+:100644 000000 01e79c32a8c99c557f0757da7cb6d65b3414466d 0000000000000000000000000000000000000000 D     file2
+$
diff --git a/t/t4013/diff.diff_--raw_initial b/t/t4013/diff.diff_--raw_initial
new file mode 100644 (file)
index 0000000..a3e9780
--- /dev/null
@@ -0,0 +1,6 @@
+$ git diff --raw initial
+:100644 100644 35d242b... 992913c... M dir/sub
+:100644 100644 01e79c3... 10a8a9f... M file0
+:000000 100644 0000000... b1e6722... A file1
+:100644 000000 01e79c3... 0000000... D file2
+$
index 8d90a6e500362afe75fb724e07848e904753e7fb..482112ca339f05fc31e6f9c2c6168971a1121e87 100755 (executable)
@@ -1086,6 +1086,15 @@ test_expect_success 'empty subject prefix does not have extra space' '
        test_cmp expect actual
 '
 
+test_expect_success '--rfc' '
+       cat >expect <<-\EOF &&
+       Subject: [RFC PATCH 1/1] header with . in it
+       EOF
+       git format-patch -n -1 --stdout --rfc >patch &&
+       grep ^Subject: patch >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success '--from=ident notices bogus ident' '
        test_must_fail git format-patch -1 --stdout --from=foo >patch
 '
@@ -1285,8 +1294,7 @@ EOF
 4:Subject: [PATCH] subject
 8:
 10:Signed-off-by: example happens to be wrapped here.
-11:
-12:Signed-off-by: C O Mitter <committer@example.com>
+11:Signed-off-by: C O Mitter <committer@example.com>
 EOF
        test_cmp expected actual
 '
@@ -1359,7 +1367,7 @@ EOF
        test_cmp expected actual
 '
 
-test_expect_success 'signoff: detect garbage in non-conforming footer' '
+test_expect_success 'signoff: tolerate garbage in conforming footer' '
        append_signoff <<\EOF >actual &&
 subject
 
@@ -1374,8 +1382,36 @@ EOF
 8:
 10:
 13:Signed-off-by: C O Mitter <committer@example.com>
-14:
-15:Signed-off-by: C O Mitter <committer@example.com>
+EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'signoff: respect trailer config' '
+       append_signoff <<\EOF >actual &&
+subject
+
+Myfooter: x
+Some Trash
+EOF
+       cat >expected <<\EOF &&
+4:Subject: [PATCH] subject
+8:
+11:
+12:Signed-off-by: C O Mitter <committer@example.com>
+EOF
+       test_cmp expected actual &&
+
+       test_config trailer.Myfooter.ifexists add &&
+       append_signoff <<\EOF >actual &&
+subject
+
+Myfooter: x
+Some Trash
+EOF
+       cat >expected <<\EOF &&
+4:Subject: [PATCH] subject
+8:
+11:Signed-off-by: C O Mitter <committer@example.com>
 EOF
        test_cmp expected actual
 '
index 2434157aa7632551e8f7b9db59b34405f8fbefa3..289806d0c7eb02e0acc5244df5e3999d45b4e085 100755 (executable)
@@ -869,7 +869,8 @@ test_expect_success 'diff that introduces and removes ws breakages' '
        test_cmp expected current
 '
 
-test_expect_success 'the same with --ws-error-highlight' '
+test_expect_success 'ws-error-highlight test setup' '
+
        git reset --hard &&
        {
                echo "0. blank-at-eol " &&
@@ -882,10 +883,7 @@ test_expect_success 'the same with --ws-error-highlight' '
                echo "2. and a new line "
        } >x &&
 
-       git -c color.diff=always diff --ws-error-highlight=default,old |
-       test_decode_color >current &&
-
-       cat >expected <<-\EOF &&
+       cat >expect.default-old <<-\EOF &&
        <BOLD>diff --git a/x b/x<RESET>
        <BOLD>index d0233a2..700886e 100644<RESET>
        <BOLD>--- a/x<RESET>
@@ -897,12 +895,7 @@ test_expect_success 'the same with --ws-error-highlight' '
        <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
        EOF
 
-       test_cmp expected current &&
-
-       git -c color.diff=always diff --ws-error-highlight=all |
-       test_decode_color >current &&
-
-       cat >expected <<-\EOF &&
+       cat >expect.all <<-\EOF &&
        <BOLD>diff --git a/x b/x<RESET>
        <BOLD>index d0233a2..700886e 100644<RESET>
        <BOLD>--- a/x<RESET>
@@ -914,12 +907,7 @@ test_expect_success 'the same with --ws-error-highlight' '
        <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
        EOF
 
-       test_cmp expected current &&
-
-       git -c color.diff=always diff --ws-error-highlight=none |
-       test_decode_color >current &&
-
-       cat >expected <<-\EOF &&
+       cat >expect.none <<-\EOF
        <BOLD>diff --git a/x b/x<RESET>
        <BOLD>index d0233a2..700886e 100644<RESET>
        <BOLD>--- a/x<RESET>
@@ -931,7 +919,57 @@ test_expect_success 'the same with --ws-error-highlight' '
        <GREEN>+2. and a new line <RESET>
        EOF
 
-       test_cmp expected current
+'
+
+test_expect_success 'test --ws-error-highlight option' '
+
+       git -c color.diff=always diff --ws-error-highlight=default,old |
+       test_decode_color >current &&
+       test_cmp expect.default-old current &&
+
+       git -c color.diff=always diff --ws-error-highlight=all |
+       test_decode_color >current &&
+       test_cmp expect.all current &&
+
+       git -c color.diff=always diff --ws-error-highlight=none |
+       test_decode_color >current &&
+       test_cmp expect.none current
+
+'
+
+test_expect_success 'test diff.wsErrorHighlight config' '
+
+       git -c color.diff=always -c diff.wsErrorHighlight=default,old diff |
+       test_decode_color >current &&
+       test_cmp expect.default-old current &&
+
+       git -c color.diff=always -c diff.wsErrorHighlight=all diff |
+       test_decode_color >current &&
+       test_cmp expect.all current &&
+
+       git -c color.diff=always -c diff.wsErrorHighlight=none diff |
+       test_decode_color >current &&
+       test_cmp expect.none current
+
+'
+
+test_expect_success 'option overrides diff.wsErrorHighlight' '
+
+       git -c color.diff=always -c diff.wsErrorHighlight=none \
+               diff --ws-error-highlight=default,old |
+       test_decode_color >current &&
+       test_cmp expect.default-old current &&
+
+       git -c color.diff=always -c diff.wsErrorHighlight=default \
+               diff --ws-error-highlight=all |
+       test_decode_color >current &&
+       test_cmp expect.all current &&
+
+       git -c color.diff=always -c diff.wsErrorHighlight=all \
+               diff --ws-error-highlight=none |
+       test_decode_color >current &&
+       test_cmp expect.none current
+
 '
 
 test_done
index 886494b58f6739d40c2c34724064317b0d3be770..9be65fd4440a68af70e6630c8ded872d7be41f5d 100755 (executable)
@@ -36,6 +36,11 @@ test_no_numbered() {
        test_num_no_numbered $1 2
 }
 
+test_single_cover_letter_numbered() {
+       grep "^Subject: \[PATCH 0/1\]" $1 &&
+       grep "^Subject: \[PATCH 1/1\]" $1
+}
+
 test_single_numbered() {
        grep "^Subject: \[PATCH 1/1\]" $1
 }
@@ -121,4 +126,16 @@ test_expect_success '--start-number && --numbered' '
        grep "^Subject: \[PATCH 3/3\]" patch8
 '
 
+test_expect_success 'single patch with cover-letter defaults to numbers' '
+       git format-patch --cover-letter --stdout HEAD~1 >patch9.single &&
+       test_single_cover_letter_numbered patch9.single
+'
+
+test_expect_success 'Use --no-numbered and --cover-letter single patch' '
+       git format-patch --no-numbered --stdout --cover-letter HEAD~1 >patch10 &&
+       test_no_numbered patch10
+'
+
+
+
 test_done
index ec78c5e3ac5661977b30582df9bec95265e1c613..671e951ee5498c7691c5e996c9dfd75dac3e8861 100755 (executable)
@@ -6,10 +6,11 @@
 test_description='Test diff/status color escape codes'
 . ./test-lib.sh
 
+ESC=$(printf '\033')
 color()
 {
        actual=$(git config --get-color no.such.slot "$1") &&
-       test "$actual" = "\e$2"
+       test "$actual" = "${2:+$ESC}$2"
 }
 
 invalid_color()
@@ -21,6 +22,10 @@ test_expect_success 'reset' '
        color "reset" "[m"
 '
 
+test_expect_success 'empty color is empty' '
+       color "" ""
+'
+
 test_expect_success 'attribute before color name' '
        color "bold red" "[1;31m"
 '
index e4e3e28fc788fd16c73298a0c385f1b39994941e..bada0cbd32f76418a76702fbbd5143004876d074 100755 (executable)
@@ -16,11 +16,15 @@ f() {
 }
 
 t() {
+       use_config=
+       git config --unset diff.interHunkContext
+
        case $# in
        4) hunks=$4; cmd="diff -U$3";;
        5) hunks=$5; cmd="diff -U$3 --inter-hunk-context=$4";;
+       6) hunks=$5; cmd="diff -U$3"; git config diff.interHunkContext $4; use_config="(diff.interHunkContext=$4) ";;
        esac
-       label="$cmd, $1 common $2"
+       label="$use_config$cmd, $1 common $2"
        file=f$1
        expected=expected.$file.$3.$hunks
 
@@ -89,4 +93,25 @@ t 9 lines    3               2
 t 9 lines      3       2       2
 t 9 lines      3       3       1
 
+#                                      use diff.interHunkContext?
+t 1 line       0       0       2       config
+t 1 line       0       1       1       config
+t 1 line       0       2       1       config
+t 9 lines      3       3       1       config
+t 2 lines      0       0       2       config
+t 2 lines      0       1       2       config
+t 2 lines      0       2       1       config
+t 3 lines      1       0       2       config
+t 3 lines      1       1       1       config
+t 3 lines      1       2       1       config
+t 9 lines      3       2       2       config
+t 9 lines      3       3       1       config
+
+test_expect_success 'diff.interHunkContext invalid' '
+       git config diff.interHunkContext asdf &&
+       test_must_fail git diff &&
+       git config diff.interHunkContext -1 &&
+       test_must_fail git diff
+'
+
 test_done
index 461f4bb583d081c58c8ab55bf4cedae8a361cd43..2f1737fcef185486dc626d616c37fdadc11deba1 100755 (executable)
@@ -152,4 +152,13 @@ test_expect_success 'git diff --quiet ignores stat-change only entries' '
        test_expect_code 1 git diff --quiet
 '
 
+test_expect_success 'git diff --quiet on a path that need conversion' '
+       echo "crlf.txt text=auto" >.gitattributes &&
+       printf "Hello\r\nWorld\r\n" >crlf.txt &&
+       git add .gitattributes crlf.txt &&
+
+       printf "Hello\r\nWorld\n" >crlf.txt &&
+       git diff --quiet crlf.txt
+'
+
 test_done
index 0b4f7dfdc6f6dac4775ab4b016d6be83681ddadd..e2824d343783438f9a3ae78884df7c8b8c63670d 100755 (executable)
@@ -354,7 +354,7 @@ test_expect_failure 'combine diff coalesce three parents' '
 '
 
 # Test for a bug reported at
-# http://thread.gmane.org/gmane.comp.version-control.git/224410
+# https://public-inbox.org/git/20130515143508.GO25742@login.drsnuggles.stderr.nl/
 # where a delete lines were missing from combined diff output when they
 # occurred exactly before the context lines of a later change.
 test_expect_success 'combine diff missing delete bug' '
index 6eb83211b593ecea798eba3790b9c76fc7d3aa60..453e6c35eb89fd82649401cb20a462c560a102cf 100755 (executable)
@@ -89,4 +89,42 @@ test_expect_success 'turning a file into a directory' '
        )
 '
 
+test_expect_success 'diff from repo subdir shows real paths (explicit)' '
+       echo "diff --git a/../../non/git/a b/../../non/git/b" >expect &&
+       test_expect_code 1 \
+               git -C repo/sub \
+               diff --no-index ../../non/git/a ../../non/git/b >actual &&
+       head -n 1 <actual >actual.head &&
+       test_cmp expect actual.head
+'
+
+test_expect_success 'diff from repo subdir shows real paths (implicit)' '
+       echo "diff --git a/../../non/git/a b/../../non/git/b" >expect &&
+       test_expect_code 1 \
+               git -C repo/sub \
+               diff ../../non/git/a ../../non/git/b >actual &&
+       head -n 1 <actual >actual.head &&
+       test_cmp expect actual.head
+'
+
+test_expect_success 'diff --no-index from repo subdir respects config (explicit)' '
+       echo "diff --git ../../non/git/a ../../non/git/b" >expect &&
+       test_config -C repo diff.noprefix true &&
+       test_expect_code 1 \
+               git -C repo/sub \
+               diff --no-index ../../non/git/a ../../non/git/b >actual &&
+       head -n 1 <actual >actual.head &&
+       test_cmp expect actual.head
+'
+
+test_expect_success 'diff --no-index from repo subdir respects config (implicit)' '
+       echo "diff --git ../../non/git/a ../../non/git/b" >expect &&
+       test_config -C repo diff.noprefix true &&
+       test_expect_code 1 \
+               git -C repo/sub \
+               diff ../../non/git/a ../../non/git/b >actual &&
+       head -n 1 <actual >actual.head &&
+       test_cmp expect actual.head
+'
+
 test_done
diff --git a/t/t4059-diff-submodule-not-initialized.sh b/t/t4059-diff-submodule-not-initialized.sh
new file mode 100755 (executable)
index 0000000..cd70fd5
--- /dev/null
@@ -0,0 +1,127 @@
+#!/bin/sh
+#
+# Copyright (c) 2016 Jacob Keller, based on t4041 by Jens Lehmann
+#
+
+test_description='Test for submodule diff on non-checked out submodule
+
+This test tries to verify that add_submodule_odb works when the submodule was
+initialized previously but the checkout has since been removed.
+'
+
+. ./test-lib.sh
+
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
+# String "added" in German (translated with Google Translate), encoded in UTF-8,
+# used in sample commit log messages in add_file() function below.
+added=$(printf "hinzugef\303\274gt")
+
+add_file () {
+       (
+               cd "$1" &&
+               shift &&
+               for name
+               do
+                       echo "$name" >"$name" &&
+                       git add "$name" &&
+                       test_tick &&
+                       # "git commit -m" would break MinGW, as Windows refuse to pass
+                       # $test_encoding encoded parameter to git.
+                       echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
+                       git -c "i18n.commitEncoding=$test_encoding" commit -F -
+               done >/dev/null &&
+               git rev-parse --short --verify HEAD
+       )
+}
+
+commit_file () {
+       test_tick &&
+       git commit "$@" -m "Commit $*" >/dev/null
+}
+
+test_expect_success 'setup - submodules' '
+       test_create_repo sm2 &&
+       add_file . foo &&
+       add_file sm2 foo1 foo2 &&
+       smhead1=$(git -C sm2 rev-parse --short --verify HEAD)
+'
+
+test_expect_success 'setup - git submodule add' '
+       git submodule add ./sm2 sm1 &&
+       commit_file sm1 .gitmodules &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 0000000...$smhead1 (new submodule)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule directory removed' '
+       rm -rf sm1 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 0000000...$smhead1 (new submodule)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'setup - submodule multiple commits' '
+       git submodule update --checkout sm1 &&
+       smhead2=$(add_file sm1 foo3 foo4) &&
+       commit_file sm1 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $smhead1..$smhead2:
+         > Add foo4 ($added foo4)
+         > Add foo3 ($added foo3)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule removed multiple commits' '
+       rm -rf sm1 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $smhead1..$smhead2:
+         > Add foo4 ($added foo4)
+         > Add foo3 ($added foo3)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule not initialized in new clone' '
+       git clone . sm3 &&
+       git -C sm3 diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $smhead1...$smhead2 (not initialized)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'setup submodule moved' '
+       git submodule update --checkout sm1 &&
+       git mv sm1 sm4 &&
+       commit_file sm4 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm4 0000000...$smhead2 (new submodule)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule moved then removed' '
+       smhead3=$(add_file sm4 foo6 foo7) &&
+       commit_file sm4 &&
+       rm -rf sm4 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm4 $smhead2..$smhead3:
+         > Add foo7 ($added foo7)
+         > Add foo6 ($added foo6)
+       EOF
+       test_cmp expected actual
+'
+
+test_done
diff --git a/t/t4060-diff-submodule-option-diff-format.sh b/t/t4060-diff-submodule-option-diff-format.sh
new file mode 100755 (executable)
index 0000000..d4a3ffa
--- /dev/null
@@ -0,0 +1,778 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
+# Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests)
+# Copyright (c) 2016 Jacob Keller (copy + convert to --submodule=diff)
+#
+
+test_description='Support for diff format verbose submodule difference in git diff
+
+This test tries to verify the sanity of --submodule=diff option of git diff.
+'
+
+. ./test-lib.sh
+
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
+# String "added" in German (translated with Google Translate), encoded in UTF-8,
+# used in sample commit log messages in add_file() function below.
+added=$(printf "hinzugef\303\274gt")
+
+add_file () {
+       (
+               cd "$1" &&
+               shift &&
+               for name
+               do
+                       echo "$name" >"$name" &&
+                       git add "$name" &&
+                       test_tick &&
+                       # "git commit -m" would break MinGW, as Windows refuse to pass
+                       # $test_encoding encoded parameter to git.
+                       echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
+                       git -c "i18n.commitEncoding=$test_encoding" commit -F -
+               done >/dev/null &&
+               git rev-parse --short --verify HEAD
+       )
+}
+
+commit_file () {
+       test_tick &&
+       git commit "$@" -m "Commit $*" >/dev/null
+}
+
+test_expect_success 'setup repository' '
+       test_create_repo sm1 &&
+       add_file . foo &&
+       head1=$(add_file sm1 foo1 foo2) &&
+       fullhead1=$(git -C sm1 rev-parse --verify HEAD)
+'
+
+test_expect_success 'added submodule' '
+       git add sm1 &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 0000000...$head1 (new submodule)
+       diff --git a/sm1/foo1 b/sm1/foo1
+       new file mode 100644
+       index 0000000..1715acd
+       --- /dev/null
+       +++ b/sm1/foo1
+       @@ -0,0 +1 @@
+       +foo1
+       diff --git a/sm1/foo2 b/sm1/foo2
+       new file mode 100644
+       index 0000000..54b060e
+       --- /dev/null
+       +++ b/sm1/foo2
+       @@ -0,0 +1 @@
+       +foo2
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'added submodule, set diff.submodule' '
+       test_config diff.submodule log &&
+       git add sm1 &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 0000000...$head1 (new submodule)
+       diff --git a/sm1/foo1 b/sm1/foo1
+       new file mode 100644
+       index 0000000..1715acd
+       --- /dev/null
+       +++ b/sm1/foo1
+       @@ -0,0 +1 @@
+       +foo1
+       diff --git a/sm1/foo2 b/sm1/foo2
+       new file mode 100644
+       index 0000000..54b060e
+       --- /dev/null
+       +++ b/sm1/foo2
+       @@ -0,0 +1 @@
+       +foo2
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success '--submodule=short overrides diff.submodule' '
+       test_config diff.submodule log &&
+       git add sm1 &&
+       git diff --submodule=short --cached >actual &&
+       cat >expected <<-EOF &&
+       diff --git a/sm1 b/sm1
+       new file mode 160000
+       index 0000000..$head1
+       --- /dev/null
+       +++ b/sm1
+       @@ -0,0 +1 @@
+       +Subproject commit $fullhead1
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'diff.submodule does not affect plumbing' '
+       test_config diff.submodule log &&
+       git diff-index -p HEAD >actual &&
+       cat >expected <<-EOF &&
+       diff --git a/sm1 b/sm1
+       new file mode 160000
+       index 0000000..$head1
+       --- /dev/null
+       +++ b/sm1
+       @@ -0,0 +1 @@
+       +Subproject commit $fullhead1
+       EOF
+       test_cmp expected actual
+'
+
+commit_file sm1 &&
+head2=$(add_file sm1 foo3)
+
+test_expect_success 'modified submodule(forward)' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head1..$head2:
+       diff --git a/sm1/foo3 b/sm1/foo3
+       new file mode 100644
+       index 0000000..c1ec6c6
+       --- /dev/null
+       +++ b/sm1/foo3
+       @@ -0,0 +1 @@
+       +foo3
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule(forward)' '
+       git diff --submodule=diff >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head1..$head2:
+       diff --git a/sm1/foo3 b/sm1/foo3
+       new file mode 100644
+       index 0000000..c1ec6c6
+       --- /dev/null
+       +++ b/sm1/foo3
+       @@ -0,0 +1 @@
+       +foo3
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule(forward) --submodule' '
+       git diff --submodule >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head1..$head2:
+         > Add foo3 ($added foo3)
+       EOF
+       test_cmp expected actual
+'
+
+fullhead2=$(cd sm1; git rev-parse --verify HEAD)
+test_expect_success 'modified submodule(forward) --submodule=short' '
+       git diff --submodule=short >actual &&
+       cat >expected <<-EOF &&
+       diff --git a/sm1 b/sm1
+       index $head1..$head2 160000
+       --- a/sm1
+       +++ b/sm1
+       @@ -1 +1 @@
+       -Subproject commit $fullhead1
+       +Subproject commit $fullhead2
+       EOF
+       test_cmp expected actual
+'
+
+commit_file sm1 &&
+head3=$(
+       cd sm1 &&
+       git reset --hard HEAD~2 >/dev/null &&
+       git rev-parse --short --verify HEAD
+)
+
+test_expect_success 'modified submodule(backward)' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head2..$head3 (rewind):
+       diff --git a/sm1/foo2 b/sm1/foo2
+       deleted file mode 100644
+       index 54b060e..0000000
+       --- a/sm1/foo2
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -foo2
+       diff --git a/sm1/foo3 b/sm1/foo3
+       deleted file mode 100644
+       index c1ec6c6..0000000
+       --- a/sm1/foo3
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -foo3
+       EOF
+       test_cmp expected actual
+'
+
+head4=$(add_file sm1 foo4 foo5)
+test_expect_success 'modified submodule(backward and forward)' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head2...$head4:
+       diff --git a/sm1/foo2 b/sm1/foo2
+       deleted file mode 100644
+       index 54b060e..0000000
+       --- a/sm1/foo2
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -foo2
+       diff --git a/sm1/foo3 b/sm1/foo3
+       deleted file mode 100644
+       index c1ec6c6..0000000
+       --- a/sm1/foo3
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -foo3
+       diff --git a/sm1/foo4 b/sm1/foo4
+       new file mode 100644
+       index 0000000..a0016db
+       --- /dev/null
+       +++ b/sm1/foo4
+       @@ -0,0 +1 @@
+       +foo4
+       diff --git a/sm1/foo5 b/sm1/foo5
+       new file mode 100644
+       index 0000000..d6f2413
+       --- /dev/null
+       +++ b/sm1/foo5
+       @@ -0,0 +1 @@
+       +foo5
+       EOF
+       test_cmp expected actual
+'
+
+commit_file sm1 &&
+mv sm1 sm1-bak &&
+echo sm1 >sm1 &&
+head5=$(git hash-object sm1 | cut -c1-7) &&
+git add sm1 &&
+rm -f sm1 &&
+mv sm1-bak sm1
+
+test_expect_success 'typechanged submodule(submodule->blob), --cached' '
+       git diff --submodule=diff --cached >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head4...0000000 (submodule deleted)
+       diff --git a/sm1/foo1 b/sm1/foo1
+       deleted file mode 100644
+       index 1715acd..0000000
+       --- a/sm1/foo1
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -foo1
+       diff --git a/sm1/foo4 b/sm1/foo4
+       deleted file mode 100644
+       index a0016db..0000000
+       --- a/sm1/foo4
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -foo4
+       diff --git a/sm1/foo5 b/sm1/foo5
+       deleted file mode 100644
+       index d6f2413..0000000
+       --- a/sm1/foo5
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -foo5
+       diff --git a/sm1 b/sm1
+       new file mode 100644
+       index 0000000..9da5fb8
+       --- /dev/null
+       +++ b/sm1
+       @@ -0,0 +1 @@
+       +sm1
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'typechanged submodule(submodule->blob)' '
+       git diff --submodule=diff >actual &&
+       cat >expected <<-EOF &&
+       diff --git a/sm1 b/sm1
+       deleted file mode 100644
+       index 9da5fb8..0000000
+       --- a/sm1
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -sm1
+       Submodule sm1 0000000...$head4 (new submodule)
+       diff --git a/sm1/foo1 b/sm1/foo1
+       new file mode 100644
+       index 0000000..1715acd
+       --- /dev/null
+       +++ b/sm1/foo1
+       @@ -0,0 +1 @@
+       +foo1
+       diff --git a/sm1/foo4 b/sm1/foo4
+       new file mode 100644
+       index 0000000..a0016db
+       --- /dev/null
+       +++ b/sm1/foo4
+       @@ -0,0 +1 @@
+       +foo4
+       diff --git a/sm1/foo5 b/sm1/foo5
+       new file mode 100644
+       index 0000000..d6f2413
+       --- /dev/null
+       +++ b/sm1/foo5
+       @@ -0,0 +1 @@
+       +foo5
+       EOF
+       test_cmp expected actual
+'
+
+rm -rf sm1 &&
+git checkout-index sm1
+test_expect_success 'typechanged submodule(submodule->blob)' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head4...0000000 (submodule deleted)
+       diff --git a/sm1 b/sm1
+       new file mode 100644
+       index 0000000..9da5fb8
+       --- /dev/null
+       +++ b/sm1
+       @@ -0,0 +1 @@
+       +sm1
+       EOF
+       test_cmp expected actual
+'
+
+rm -f sm1 &&
+test_create_repo sm1 &&
+head6=$(add_file sm1 foo6 foo7)
+fullhead6=$(cd sm1; git rev-parse --verify HEAD)
+test_expect_success 'nonexistent commit' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 $head4...$head6 (commits not present)
+       EOF
+       test_cmp expected actual
+'
+
+commit_file
+test_expect_success 'typechanged submodule(blob->submodule)' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       diff --git a/sm1 b/sm1
+       deleted file mode 100644
+       index 9da5fb8..0000000
+       --- a/sm1
+       +++ /dev/null
+       @@ -1 +0,0 @@
+       -sm1
+       Submodule sm1 0000000...$head6 (new submodule)
+       diff --git a/sm1/foo6 b/sm1/foo6
+       new file mode 100644
+       index 0000000..462398b
+       --- /dev/null
+       +++ b/sm1/foo6
+       @@ -0,0 +1 @@
+       +foo6
+       diff --git a/sm1/foo7 b/sm1/foo7
+       new file mode 100644
+       index 0000000..6e9262c
+       --- /dev/null
+       +++ b/sm1/foo7
+       @@ -0,0 +1 @@
+       +foo7
+       EOF
+       test_cmp expected actual
+'
+
+commit_file sm1 &&
+test_expect_success 'submodule is up to date' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule contains untracked content' '
+       echo new > sm1/new-file &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains untracked content
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule contains untracked content (untracked ignored)' '
+       git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
+       ! test -s actual
+'
+
+test_expect_success 'submodule contains untracked content (dirty ignored)' '
+       git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
+       ! test -s actual
+'
+
+test_expect_success 'submodule contains untracked content (all ignored)' '
+       git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
+       ! test -s actual
+'
+
+test_expect_success 'submodule contains untracked and modified content' '
+       echo new > sm1/foo6 &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains untracked content
+       Submodule sm1 contains modified content
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+# NOT OK
+test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
+       echo new > sm1/foo6 &&
+       git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains modified content
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule contains untracked and modified content (dirty ignored)' '
+       echo new > sm1/foo6 &&
+       git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
+       ! test -s actual
+'
+
+test_expect_success 'submodule contains untracked and modified content (all ignored)' '
+       echo new > sm1/foo6 &&
+       git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
+       ! test -s actual
+'
+
+test_expect_success 'submodule contains modified content' '
+       rm -f sm1/new-file &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains modified content
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+(cd sm1; git commit -mchange foo6 >/dev/null) &&
+head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
+test_expect_success 'submodule is modified' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9..$head8:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule contains untracked content' '
+       echo new > sm1/new-file &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains untracked content
+       Submodule sm1 17243c9..$head8:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
+       git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9..$head8:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule contains untracked content (dirty ignored)' '
+       git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9..cfce562:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule contains untracked content (all ignored)' '
+       git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
+       ! test -s actual
+'
+
+test_expect_success 'modified submodule contains untracked and modified content' '
+       echo modification >> sm1/foo6 &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains untracked content
+       Submodule sm1 contains modified content
+       Submodule sm1 17243c9..cfce562:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..dfda541 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1,2 @@
+       -foo6
+       +new
+       +modification
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
+       echo modification >> sm1/foo6 &&
+       git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains modified content
+       Submodule sm1 17243c9..cfce562:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..e20e2d9 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1,3 @@
+       -foo6
+       +new
+       +modification
+       +modification
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule contains untracked and modified content (dirty ignored)' '
+       echo modification >> sm1/foo6 &&
+       git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9..cfce562:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..3e75765 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1 @@
+       -foo6
+       +new
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'modified submodule contains untracked and modified content (all ignored)' '
+       echo modification >> sm1/foo6 &&
+       git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
+       ! test -s actual
+'
+
+# NOT OK
+test_expect_success 'modified submodule contains modified content' '
+       rm -f sm1/new-file &&
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 contains modified content
+       Submodule sm1 17243c9..cfce562:
+       diff --git a/sm1/foo6 b/sm1/foo6
+       index 462398b..ac466ca 100644
+       --- a/sm1/foo6
+       +++ b/sm1/foo6
+       @@ -1 +1,5 @@
+       -foo6
+       +new
+       +modification
+       +modification
+       +modification
+       +modification
+       EOF
+       test_cmp expected actual
+'
+
+rm -rf sm1
+test_expect_success 'deleted submodule' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9...0000000 (submodule deleted)
+       EOF
+       test_cmp expected actual
+'
+
+test_create_repo sm2 &&
+head7=$(add_file sm2 foo8 foo9) &&
+git add sm2
+
+test_expect_success 'multiple submodules' '
+       git diff-index -p --submodule=diff HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9...0000000 (submodule deleted)
+       Submodule sm2 0000000...a5a65c9 (new submodule)
+       diff --git a/sm2/foo8 b/sm2/foo8
+       new file mode 100644
+       index 0000000..db9916b
+       --- /dev/null
+       +++ b/sm2/foo8
+       @@ -0,0 +1 @@
+       +foo8
+       diff --git a/sm2/foo9 b/sm2/foo9
+       new file mode 100644
+       index 0000000..9c3b4f6
+       --- /dev/null
+       +++ b/sm2/foo9
+       @@ -0,0 +1 @@
+       +foo9
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'path filter' '
+       git diff-index -p --submodule=diff HEAD sm2 >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm2 0000000...a5a65c9 (new submodule)
+       diff --git a/sm2/foo8 b/sm2/foo8
+       new file mode 100644
+       index 0000000..db9916b
+       --- /dev/null
+       +++ b/sm2/foo8
+       @@ -0,0 +1 @@
+       +foo8
+       diff --git a/sm2/foo9 b/sm2/foo9
+       new file mode 100644
+       index 0000000..9c3b4f6
+       --- /dev/null
+       +++ b/sm2/foo9
+       @@ -0,0 +1 @@
+       +foo9
+       EOF
+       test_cmp expected actual
+'
+
+commit_file sm2
+test_expect_success 'given commit' '
+       git diff-index -p --submodule=diff HEAD^ >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9...0000000 (submodule deleted)
+       Submodule sm2 0000000...a5a65c9 (new submodule)
+       diff --git a/sm2/foo8 b/sm2/foo8
+       new file mode 100644
+       index 0000000..db9916b
+       --- /dev/null
+       +++ b/sm2/foo8
+       @@ -0,0 +1 @@
+       +foo8
+       diff --git a/sm2/foo9 b/sm2/foo9
+       new file mode 100644
+       index 0000000..9c3b4f6
+       --- /dev/null
+       +++ b/sm2/foo9
+       @@ -0,0 +1 @@
+       +foo9
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'setup .git file for sm2' '
+       (cd sm2 &&
+        REAL="$(pwd)/../.real" &&
+        mv .git "$REAL"
+        echo "gitdir: $REAL" >.git)
+'
+
+test_expect_success 'diff --submodule=diff with .git file' '
+       git diff --submodule=diff HEAD^ >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm1 17243c9...0000000 (submodule deleted)
+       Submodule sm2 0000000...a5a65c9 (new submodule)
+       diff --git a/sm2/foo8 b/sm2/foo8
+       new file mode 100644
+       index 0000000..db9916b
+       --- /dev/null
+       +++ b/sm2/foo8
+       @@ -0,0 +1 @@
+       +foo8
+       diff --git a/sm2/foo9 b/sm2/foo9
+       new file mode 100644
+       index 0000000..9c3b4f6
+       --- /dev/null
+       +++ b/sm2/foo9
+       @@ -0,0 +1 @@
+       +foo9
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'setup nested submodule' '
+       git submodule add -f ./sm2 &&
+       git commit -a -m "add sm2" &&
+       git -C sm2 submodule add ../sm2 nested &&
+       git -C sm2 commit -a -m "nested sub"
+'
+
+test_expect_success 'move nested submodule HEAD' '
+       echo "nested content" >sm2/nested/file &&
+       git -C sm2/nested add file &&
+       git -C sm2/nested commit --allow-empty -m "new HEAD"
+'
+
+test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '
+       cat >expected <<-EOF &&
+       Submodule nested a5a65c9..b55928c:
+       diff --git a/nested/file b/nested/file
+       new file mode 100644
+       index 0000000..ca281f5
+       --- /dev/null
+       +++ b/nested/file
+       @@ -0,0 +1 @@
+       +nested content
+       EOF
+       git -C sm2 diff --submodule=diff >actual 2>err &&
+       test_must_be_empty err &&
+       test_cmp expected actual
+'
+
+test_done
diff --git a/t/t4061-diff-indent.sh b/t/t4061-diff-indent.sh
new file mode 100755 (executable)
index 0000000..5564506
--- /dev/null
@@ -0,0 +1,216 @@
+#!/bin/sh
+
+test_description='Test diff indent heuristic.
+
+'
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/diff-lib.sh
+
+# Compare two diff outputs. Ignore "index" lines, because we don't
+# care about SHA-1s or file modes.
+compare_diff () {
+       sed -e "/^index /d" <"$1" >.tmp-1
+       sed -e "/^index /d" <"$2" >.tmp-2
+       test_cmp .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
+}
+
+# Compare blame output using the expectation for a diff as reference.
+# Only look for the lines coming from non-boundary commits.
+compare_blame () {
+       sed -n -e "1,4d" -e "s/^\+//p" <"$1" >.tmp-1
+       sed -ne "s/^[^^][^)]*) *//p" <"$2" >.tmp-2
+       test_cmp .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
+}
+
+test_expect_success 'prepare' '
+       cat <<-\EOF >spaces.txt &&
+       1
+       2
+       a
+
+       b
+       3
+       4
+       EOF
+
+       cat <<-\EOF >functions.c &&
+       1
+       2
+       /* function */
+       foo() {
+           foo
+       }
+
+       3
+       4
+       EOF
+
+       git add spaces.txt functions.c &&
+       test_tick &&
+       git commit -m initial &&
+       git branch old &&
+
+       cat <<-\EOF >spaces.txt &&
+       1
+       2
+       a
+
+       b
+       a
+
+       b
+       3
+       4
+       EOF
+
+       cat <<-\EOF >functions.c &&
+       1
+       2
+       /* function */
+       bar() {
+           foo
+       }
+
+       /* function */
+       foo() {
+           foo
+       }
+
+       3
+       4
+       EOF
+
+       git add spaces.txt functions.c &&
+       test_tick &&
+       git commit -m initial &&
+       git branch new &&
+
+       tr "_" " " <<-\EOF >spaces-expect &&
+       diff --git a/spaces.txt b/spaces.txt
+       --- a/spaces.txt
+       +++ b/spaces.txt
+       @@ -3,5 +3,8 @@
+        a
+       _
+        b
+       +a
+       +
+       +b
+        3
+        4
+       EOF
+
+       tr "_" " " <<-\EOF >spaces-compacted-expect &&
+       diff --git a/spaces.txt b/spaces.txt
+       --- a/spaces.txt
+       +++ b/spaces.txt
+       @@ -2,6 +2,9 @@
+        2
+        a
+       _
+       +b
+       +a
+       +
+        b
+        3
+        4
+       EOF
+
+       tr "_" " " <<-\EOF >functions-expect &&
+       diff --git a/functions.c b/functions.c
+       --- a/functions.c
+       +++ b/functions.c
+       @@ -1,6 +1,11 @@
+        1
+        2
+        /* function */
+       +bar() {
+       +    foo
+       +}
+       +
+       +/* function */
+        foo() {
+            foo
+        }
+       EOF
+
+       tr "_" " " <<-\EOF >functions-compacted-expect
+       diff --git a/functions.c b/functions.c
+       --- a/functions.c
+       +++ b/functions.c
+       @@ -1,5 +1,10 @@
+        1
+        2
+       +/* function */
+       +bar() {
+       +    foo
+       +}
+       +
+        /* function */
+        foo() {
+            foo
+       EOF
+'
+
+test_expect_success 'diff: ugly spaces' '
+       git diff old new -- spaces.txt >out &&
+       compare_diff spaces-expect out
+'
+
+test_expect_success 'diff: nice spaces with --indent-heuristic' '
+       git diff --indent-heuristic old new -- spaces.txt >out-compacted &&
+       compare_diff spaces-compacted-expect out-compacted
+'
+
+test_expect_success 'diff: nice spaces with diff.indentHeuristic' '
+       git -c diff.indentHeuristic=true diff old new -- spaces.txt >out-compacted2 &&
+       compare_diff spaces-compacted-expect out-compacted2
+'
+
+test_expect_success 'diff: --no-indent-heuristic overrides config' '
+       git -c diff.indentHeuristic=true diff --no-indent-heuristic old new -- spaces.txt >out2 &&
+       compare_diff spaces-expect out2
+'
+
+test_expect_success 'diff: --indent-heuristic with --patience' '
+       git diff --indent-heuristic --patience old new -- spaces.txt >out-compacted3 &&
+       compare_diff spaces-compacted-expect out-compacted3
+'
+
+test_expect_success 'diff: --indent-heuristic with --histogram' '
+       git diff --indent-heuristic --histogram old new -- spaces.txt >out-compacted4 &&
+       compare_diff spaces-compacted-expect out-compacted4
+'
+
+test_expect_success 'diff: ugly functions' '
+       git diff old new -- functions.c >out &&
+       compare_diff functions-expect out
+'
+
+test_expect_success 'diff: nice functions with --indent-heuristic' '
+       git diff --indent-heuristic old new -- functions.c >out-compacted &&
+       compare_diff functions-compacted-expect out-compacted
+'
+
+test_expect_success 'blame: ugly spaces' '
+       git blame old..new -- spaces.txt >out-blame &&
+       compare_blame spaces-expect out-blame
+'
+
+test_expect_success 'blame: nice spaces with --indent-heuristic' '
+       git blame --indent-heuristic old..new -- spaces.txt >out-blame-compacted &&
+       compare_blame spaces-compacted-expect out-blame-compacted
+'
+
+test_expect_success 'blame: nice spaces with diff.indentHeuristic' '
+       git -c diff.indentHeuristic=true blame old..new -- spaces.txt >out-blame-compacted2 &&
+       compare_blame spaces-compacted-expect out-blame-compacted2
+'
+
+test_expect_success 'blame: --no-indent-heuristic overrides config' '
+       git -c diff.indentHeuristic=true blame --no-indent-heuristic old..new -- spaces.txt >out-blame2 &&
+       git blame old..new -- spaces.txt >out-blame &&
+       compare_blame spaces-expect out-blame2
+'
+
+test_done
index f0bf50bda780f04f9f2ffc2c1f39e354f69ae193..7c4903f49713a22d7fba28a608acf07f1330110b 100755 (executable)
@@ -19,4 +19,9 @@ test_expect_success '-G matches' '
        test 4096-zeroes.txt = "$(cat out)"
 '
 
+test_expect_success '-S --pickaxe-regex' '
+       git diff --name-only -S0 --pickaxe-regex HEAD^ >out &&
+       verbose test 4096-zeroes.txt = "$(cat out)"
+'
+
 test_done
diff --git a/t/t4063-diff-blobs.sh b/t/t4063-diff-blobs.sh
new file mode 100755 (executable)
index 0000000..bc69e26
--- /dev/null
@@ -0,0 +1,96 @@
+#!/bin/sh
+
+test_description='test direct comparison of blobs via git-diff'
+. ./test-lib.sh
+
+run_diff () {
+       # use full-index to make it easy to match the index line
+       git diff --full-index "$@" >diff
+}
+
+check_index () {
+       grep "^index $1\\.\\.$2" diff
+}
+
+check_mode () {
+       grep "^old mode $1" diff &&
+       grep "^new mode $2" diff
+}
+
+check_paths () {
+       grep "^diff --git a/$1 b/$2" diff
+}
+
+test_expect_success 'create some blobs' '
+       echo one >one &&
+       echo two >two &&
+       chmod +x two &&
+       git add . &&
+
+       # cover systems where modes are ignored
+       git update-index --chmod=+x two &&
+
+       git commit -m base &&
+
+       sha1_one=$(git rev-parse HEAD:one) &&
+       sha1_two=$(git rev-parse HEAD:two)
+'
+
+test_expect_success 'diff by sha1' '
+       run_diff $sha1_one $sha1_two
+'
+test_expect_success 'index of sha1 diff' '
+       check_index $sha1_one $sha1_two
+'
+test_expect_success 'sha1 diff uses arguments as paths' '
+       check_paths $sha1_one $sha1_two
+'
+test_expect_success 'sha1 diff has no mode change' '
+       ! grep mode diff
+'
+
+test_expect_success 'diff by tree:path (run)' '
+       run_diff HEAD:one HEAD:two
+'
+test_expect_success 'index of tree:path diff' '
+       check_index $sha1_one $sha1_two
+'
+test_expect_success 'tree:path diff uses filenames as paths' '
+       check_paths one two
+'
+test_expect_success 'tree:path diff shows mode change' '
+       check_mode 100644 100755
+'
+
+test_expect_success 'diff by ranged tree:path' '
+       run_diff HEAD:one..HEAD:two
+'
+test_expect_success 'index of ranged tree:path diff' '
+       check_index $sha1_one $sha1_two
+'
+test_expect_success 'ranged tree:path diff uses filenames as paths' '
+       check_paths one two
+'
+test_expect_success 'ranged tree:path diff shows mode change' '
+       check_mode 100644 100755
+'
+
+test_expect_success 'diff blob against file' '
+       run_diff HEAD:one two
+'
+test_expect_success 'index of blob-file diff' '
+       check_index $sha1_one $sha1_two
+'
+test_expect_success 'blob-file diff uses filename as paths' '
+       check_paths one two
+'
+test_expect_success FILEMODE 'blob-file diff shows mode change' '
+       check_mode 100644 100755
+'
+
+test_expect_success 'blob-file diff prefers filename to sha1' '
+       run_diff $sha1_one two &&
+       check_paths two two
+'
+
+test_done
index c268298eaf5672c649ca3e4815dc4f43d71efece..5cdd76dfa726d32226b1dd625d21d6280125afb7 100755 (executable)
@@ -13,7 +13,9 @@ test_expect_success setup '
        echo modified >file &&
        git diff --stat -p >patch-0.txt &&
        chmod +x file &&
-       git diff --stat -p >patch-1.txt
+       git diff --stat -p >patch-1.txt &&
+       sed "s/^\(new mode \).*/\1/" <patch-1.txt >patch-empty-mode.txt &&
+       sed "s/^\(new mode \).*/\1garbage/" <patch-1.txt >patch-bogus-mode.txt
 '
 
 test_expect_success FILEMODE 'same mode (no index)' '
@@ -59,4 +61,16 @@ test_expect_success FILEMODE 'mode update (index only)' '
        git ls-files -s file | grep "^100755"
 '
 
+test_expect_success FILEMODE 'empty mode is rejected' '
+       git reset --hard &&
+       test_must_fail git apply patch-empty-mode.txt 2>err &&
+       test_i18ngrep "invalid mode" err
+'
+
+test_expect_success FILEMODE 'bogus mode is rejected' '
+       git reset --hard &&
+       test_must_fail git apply patch-bogus-mode.txt 2>err &&
+       test_i18ngrep "invalid mode" err
+'
+
 test_done
index 2ecb4216b7179ef836836d90a5f76f5e4349ca23..c5ed3b17c4a1196e154affc346b5fd3d4e0a7abf 100755 (executable)
@@ -35,4 +35,28 @@ test_expect_success 'apply diff with inconsistent filenames in headers' '
        test_i18ngrep "inconsistent old filename" err
 '
 
+test_expect_success 'apply diff with new filename missing from headers' '
+       cat >missing_new_filename.diff <<-\EOF &&
+       diff --git a/f b/f
+       index 0000000..d00491f
+       --- a/f
+       @@ -0,0 +1 @@
+       +1
+       EOF
+       test_must_fail git apply missing_new_filename.diff 2>err &&
+       test_i18ngrep "lacks filename information" err
+'
+
+test_expect_success 'apply diff with old filename missing from headers' '
+       cat >missing_old_filename.diff <<-\EOF &&
+       diff --git a/f b/f
+       index d00491f..0000000
+       +++ b/f
+       @@ -1 +0,0 @@
+       -1
+       EOF
+       test_must_fail git apply missing_old_filename.diff 2>err &&
+       test_i18ngrep "lacks filename information" err
+'
+
 test_done
index 4b0a374b63f4128405c88fdb2410fb679bdd06a1..6d9287231826ece18873b531186907cd75ef7461 100755 (executable)
@@ -29,4 +29,22 @@ test_expect_success 'apply exits non-zero with no-op patch' '
        test_must_fail git apply --check input
 '
 
+test_expect_success 'invalid combination: create and copy' '
+       test_must_fail git apply --check - <<-\EOF
+       diff --git a/1 b/2
+       new file mode 100644
+       copy from 1
+       copy to 2
+       EOF
+'
+
+test_expect_success 'invalid combination: create and rename' '
+       test_must_fail git apply --check - <<-\EOF
+       diff --git a/1 b/2
+       new file mode 100644
+       rename from 1
+       rename to 2
+       EOF
+'
+
 test_done
index 9ce9424d1569a1d788d4ad1ecd59ed49ee712101..44807e218d7016f58bd41b89af71104a37f31a8b 100755 (executable)
@@ -977,4 +977,29 @@ test_expect_success 'am --patch-format=mboxrd handles mboxrd' '
        test_cmp msg out
 '
 
+test_expect_success 'am works with multi-line in-body headers' '
+       FORTY="String that has a length of more than forty characters" &&
+       LONG="$FORTY $FORTY" &&
+       rm -fr .git/rebase-apply &&
+       git checkout -f first &&
+       echo one >> file &&
+       git commit -am "$LONG
+
+    Body test" --author="$LONG <long@example.com>" &&
+       git format-patch --stdout -1 >patch &&
+       # bump from, date, and subject down to in-body header
+       perl -lpe "
+               if (/^From:/) {
+                       print \"From: x <x\@example.com>\";
+                       print \"Date: Sat, 1 Jan 2000 00:00:00 +0000\";
+                       print \"Subject: x\n\";
+               }
+       " patch >msg &&
+       git checkout HEAD^ &&
+       git am msg &&
+       # Ensure that the author and full message are present
+       git cat-file commit HEAD | grep "^author.*long@example.com" &&
+       git cat-file commit HEAD | grep "^$LONG$"
+'
+
 test_done
index ae08b57712e382a4cba7f7a51a499b4621a38c84..9df054bf05b8cd40011c0577aa0ce0f30cb8c23f 100755 (executable)
@@ -190,4 +190,23 @@ test_expect_success 'shortlog with --output=<file>' '
        test_line_count = 3 shortlog
 '
 
+test_expect_success 'shortlog --committer (internal)' '
+       git checkout --orphan side &&
+       git commit --allow-empty -m one &&
+       git commit --allow-empty -m two &&
+       GIT_COMMITTER_NAME="Sin Nombre" git commit --allow-empty -m three &&
+
+       cat >expect <<-\EOF &&
+            2  C O Mitter
+            1  Sin Nombre
+       EOF
+       git shortlog -nsc HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'shortlog --committer (external)' '
+       git log --format=full | git shortlog -nsc >actual &&
+       test_cmp expect actual
+'
+
 test_done
index e2db47c36e09e3580c53867909cd3e20bdf320f5..e4441957e2b406c16121578f6d1344488509cafe 100755 (executable)
@@ -4,6 +4,7 @@ test_description='git log'
 
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-gpg.sh"
+. "$TEST_DIRECTORY/lib-terminal.sh"
 
 test_expect_success setup '
 
@@ -187,6 +188,16 @@ test_expect_success 'git log --no-walk=sorted <commits> sorts by commit time' '
        test_cmp expect actual
 '
 
+cat > expect << EOF
+=== 804a787 sixth
+=== 394ef78 fifth
+=== 5d31159 fourth
+EOF
+test_expect_success 'git log --line-prefix="=== " --no-walk <commits> sorts by commit time' '
+       git log --line-prefix="=== " --no-walk --oneline 5d31159 804a787 394ef78 > actual &&
+       test_cmp expect actual
+'
+
 cat > expect << EOF
 5d31159 fourth
 804a787 sixth
@@ -284,6 +295,21 @@ test_expect_success 'simple log --graph' '
        test_cmp expect actual
 '
 
+cat > expect <<EOF
+123 * Second
+123 * sixth
+123 * fifth
+123 * fourth
+123 * third
+123 * second
+123 * initial
+EOF
+
+test_expect_success 'simple log --graph --line-prefix="123 "' '
+       git log --graph --line-prefix="123 " --pretty=tformat:%s >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'set up merge history' '
        git checkout -b side HEAD~4 &&
        test_commit side-1 1 1 &&
@@ -313,6 +339,49 @@ test_expect_success 'log --graph with merge' '
        test_cmp expect actual
 '
 
+cat > expect <<\EOF
+| | | *   Merge branch 'side'
+| | | |\
+| | | | * side-2
+| | | | * side-1
+| | | * | Second
+| | | * | sixth
+| | | * | fifth
+| | | * | fourth
+| | | |/
+| | | * third
+| | | * second
+| | | * initial
+EOF
+
+test_expect_success 'log --graph --line-prefix="| | | " with merge' '
+       git log --line-prefix="| | | " --graph --date-order --pretty=tformat:%s |
+               sed "s/ *\$//" >actual &&
+       test_cmp expect actual
+'
+
+cat > expect.colors <<\EOF
+*   Merge branch 'side'
+<BLUE>|<RESET><CYAN>\<RESET>
+<BLUE>|<RESET> * side-2
+<BLUE>|<RESET> * side-1
+* <CYAN>|<RESET> Second
+* <CYAN>|<RESET> sixth
+* <CYAN>|<RESET> fifth
+* <CYAN>|<RESET> fourth
+<CYAN>|<RESET><CYAN>/<RESET>
+* third
+* second
+* initial
+EOF
+
+test_expect_success 'log --graph with merge with log.graphColors' '
+       test_config log.graphColors " blue,invalid-color, cyan, red  , " &&
+       git log --color=always --graph --date-order --pretty=tformat:%s |
+               test_decode_color | sed "s/ *\$//" >actual &&
+       test_cmp expect.colors actual
+'
+
 test_expect_success 'log --raw --graph -m with merge' '
        git log --raw --graph --oneline -m master | head -n 500 >actual &&
        grep "initial" actual
@@ -330,7 +399,7 @@ cat > expect <<\EOF
 | |
 | |     Merge branch 'side'
 | |
-| * commit side
+| * commit tags/side-2
 | | Author: A U Thor <author@example.com>
 | |
 | |     side-2
@@ -452,7 +521,7 @@ test_expect_success 'log --graph with merge' '
 '
 
 test_expect_success 'log.decorate configuration' '
-       git log --oneline >expect.none &&
+       git log --oneline --no-decorate >expect.none &&
        git log --oneline --decorate >expect.short &&
        git log --oneline --decorate=full >expect.full &&
 
@@ -508,6 +577,25 @@ test_expect_success 'log.decorate configuration' '
 
 '
 
+test_expect_success 'log.decorate config parsing' '
+       git log --oneline --decorate=full >expect.full &&
+       git log --oneline --decorate=short >expect.short &&
+
+       test_config log.decorate full &&
+       test_config log.mailmap true &&
+       git log --oneline >actual &&
+       test_cmp expect.full actual &&
+       git log --oneline --decorate=short >actual &&
+       test_cmp expect.short actual
+'
+
+test_expect_success TTY 'log output on a TTY' '
+       git log --oneline --decorate >expect.short &&
+
+       test_terminal git log --oneline >actual &&
+       test_cmp expect.short actual
+'
+
 test_expect_success 'reflog is expected format' '
        git log -g --abbrev-commit --pretty=oneline >expect &&
        git reflog >actual &&
@@ -867,6 +955,331 @@ test_expect_success 'log --graph with diff and stats' '
        test_i18ncmp expect actual.sanitized
 '
 
+cat >expect <<\EOF
+*** *   commit COMMIT_OBJECT_NAME
+*** |\  Merge: MERGE_PARENTS
+*** | | Author: A U Thor <author@example.com>
+*** | |
+*** | |     Merge HEADS DESCRIPTION
+*** | |
+*** | * commit COMMIT_OBJECT_NAME
+*** | | Author: A U Thor <author@example.com>
+*** | |
+*** | |     reach
+*** | | ---
+*** | |  reach.t | 1 +
+*** | |  1 file changed, 1 insertion(+)
+*** | |
+*** | | diff --git a/reach.t b/reach.t
+*** | | new file mode 100644
+*** | | index 0000000..10c9591
+*** | | --- /dev/null
+*** | | +++ b/reach.t
+*** | | @@ -0,0 +1 @@
+*** | | +reach
+*** | |
+*** |  \
+*** *-. \   commit COMMIT_OBJECT_NAME
+*** |\ \ \  Merge: MERGE_PARENTS
+*** | | | | Author: A U Thor <author@example.com>
+*** | | | |
+*** | | | |     Merge HEADS DESCRIPTION
+*** | | | |
+*** | | * | commit COMMIT_OBJECT_NAME
+*** | | |/  Author: A U Thor <author@example.com>
+*** | | |
+*** | | |       octopus-b
+*** | | |   ---
+*** | | |    octopus-b.t | 1 +
+*** | | |    1 file changed, 1 insertion(+)
+*** | | |
+*** | | |   diff --git a/octopus-b.t b/octopus-b.t
+*** | | |   new file mode 100644
+*** | | |   index 0000000..d5fcad0
+*** | | |   --- /dev/null
+*** | | |   +++ b/octopus-b.t
+*** | | |   @@ -0,0 +1 @@
+*** | | |   +octopus-b
+*** | | |
+*** | * | commit COMMIT_OBJECT_NAME
+*** | |/  Author: A U Thor <author@example.com>
+*** | |
+*** | |       octopus-a
+*** | |   ---
+*** | |    octopus-a.t | 1 +
+*** | |    1 file changed, 1 insertion(+)
+*** | |
+*** | |   diff --git a/octopus-a.t b/octopus-a.t
+*** | |   new file mode 100644
+*** | |   index 0000000..11ee015
+*** | |   --- /dev/null
+*** | |   +++ b/octopus-a.t
+*** | |   @@ -0,0 +1 @@
+*** | |   +octopus-a
+*** | |
+*** * | commit COMMIT_OBJECT_NAME
+*** |/  Author: A U Thor <author@example.com>
+*** |
+*** |       seventh
+*** |   ---
+*** |    seventh.t | 1 +
+*** |    1 file changed, 1 insertion(+)
+*** |
+*** |   diff --git a/seventh.t b/seventh.t
+*** |   new file mode 100644
+*** |   index 0000000..9744ffc
+*** |   --- /dev/null
+*** |   +++ b/seventh.t
+*** |   @@ -0,0 +1 @@
+*** |   +seventh
+*** |
+*** *   commit COMMIT_OBJECT_NAME
+*** |\  Merge: MERGE_PARENTS
+*** | | Author: A U Thor <author@example.com>
+*** | |
+*** | |     Merge branch 'tangle'
+*** | |
+*** | *   commit COMMIT_OBJECT_NAME
+*** | |\  Merge: MERGE_PARENTS
+*** | | | Author: A U Thor <author@example.com>
+*** | | |
+*** | | |     Merge branch 'side' (early part) into tangle
+*** | | |
+*** | * |   commit COMMIT_OBJECT_NAME
+*** | |\ \  Merge: MERGE_PARENTS
+*** | | | | Author: A U Thor <author@example.com>
+*** | | | |
+*** | | | |     Merge branch 'master' (early part) into tangle
+*** | | | |
+*** | * | | commit COMMIT_OBJECT_NAME
+*** | | | | Author: A U Thor <author@example.com>
+*** | | | |
+*** | | | |     tangle-a
+*** | | | | ---
+*** | | | |  tangle-a | 1 +
+*** | | | |  1 file changed, 1 insertion(+)
+*** | | | |
+*** | | | | diff --git a/tangle-a b/tangle-a
+*** | | | | new file mode 100644
+*** | | | | index 0000000..7898192
+*** | | | | --- /dev/null
+*** | | | | +++ b/tangle-a
+*** | | | | @@ -0,0 +1 @@
+*** | | | | +a
+*** | | | |
+*** * | | |   commit COMMIT_OBJECT_NAME
+*** |\ \ \ \  Merge: MERGE_PARENTS
+*** | | | | | Author: A U Thor <author@example.com>
+*** | | | | |
+*** | | | | |     Merge branch 'side'
+*** | | | | |
+*** | * | | | commit COMMIT_OBJECT_NAME
+*** | | |_|/  Author: A U Thor <author@example.com>
+*** | |/| |
+*** | | | |       side-2
+*** | | | |   ---
+*** | | | |    2 | 1 +
+*** | | | |    1 file changed, 1 insertion(+)
+*** | | | |
+*** | | | |   diff --git a/2 b/2
+*** | | | |   new file mode 100644
+*** | | | |   index 0000000..0cfbf08
+*** | | | |   --- /dev/null
+*** | | | |   +++ b/2
+*** | | | |   @@ -0,0 +1 @@
+*** | | | |   +2
+*** | | | |
+*** | * | | commit COMMIT_OBJECT_NAME
+*** | | | | Author: A U Thor <author@example.com>
+*** | | | |
+*** | | | |     side-1
+*** | | | | ---
+*** | | | |  1 | 1 +
+*** | | | |  1 file changed, 1 insertion(+)
+*** | | | |
+*** | | | | diff --git a/1 b/1
+*** | | | | new file mode 100644
+*** | | | | index 0000000..d00491f
+*** | | | | --- /dev/null
+*** | | | | +++ b/1
+*** | | | | @@ -0,0 +1 @@
+*** | | | | +1
+*** | | | |
+*** * | | | commit COMMIT_OBJECT_NAME
+*** | | | | Author: A U Thor <author@example.com>
+*** | | | |
+*** | | | |     Second
+*** | | | | ---
+*** | | | |  one | 1 +
+*** | | | |  1 file changed, 1 insertion(+)
+*** | | | |
+*** | | | | diff --git a/one b/one
+*** | | | | new file mode 100644
+*** | | | | index 0000000..9a33383
+*** | | | | --- /dev/null
+*** | | | | +++ b/one
+*** | | | | @@ -0,0 +1 @@
+*** | | | | +case
+*** | | | |
+*** * | | | commit COMMIT_OBJECT_NAME
+*** | |_|/  Author: A U Thor <author@example.com>
+*** |/| |
+*** | | |       sixth
+*** | | |   ---
+*** | | |    a/two | 1 -
+*** | | |    1 file changed, 1 deletion(-)
+*** | | |
+*** | | |   diff --git a/a/two b/a/two
+*** | | |   deleted file mode 100644
+*** | | |   index 9245af5..0000000
+*** | | |   --- a/a/two
+*** | | |   +++ /dev/null
+*** | | |   @@ -1 +0,0 @@
+*** | | |   -ni
+*** | | |
+*** * | | commit COMMIT_OBJECT_NAME
+*** | | | Author: A U Thor <author@example.com>
+*** | | |
+*** | | |     fifth
+*** | | | ---
+*** | | |  a/two | 1 +
+*** | | |  1 file changed, 1 insertion(+)
+*** | | |
+*** | | | diff --git a/a/two b/a/two
+*** | | | new file mode 100644
+*** | | | index 0000000..9245af5
+*** | | | --- /dev/null
+*** | | | +++ b/a/two
+*** | | | @@ -0,0 +1 @@
+*** | | | +ni
+*** | | |
+*** * | | commit COMMIT_OBJECT_NAME
+*** |/ /  Author: A U Thor <author@example.com>
+*** | |
+*** | |       fourth
+*** | |   ---
+*** | |    ein | 1 +
+*** | |    1 file changed, 1 insertion(+)
+*** | |
+*** | |   diff --git a/ein b/ein
+*** | |   new file mode 100644
+*** | |   index 0000000..9d7e69f
+*** | |   --- /dev/null
+*** | |   +++ b/ein
+*** | |   @@ -0,0 +1 @@
+*** | |   +ichi
+*** | |
+*** * | commit COMMIT_OBJECT_NAME
+*** |/  Author: A U Thor <author@example.com>
+*** |
+*** |       third
+*** |   ---
+*** |    ichi | 1 +
+*** |    one  | 1 -
+*** |    2 files changed, 1 insertion(+), 1 deletion(-)
+*** |
+*** |   diff --git a/ichi b/ichi
+*** |   new file mode 100644
+*** |   index 0000000..9d7e69f
+*** |   --- /dev/null
+*** |   +++ b/ichi
+*** |   @@ -0,0 +1 @@
+*** |   +ichi
+*** |   diff --git a/one b/one
+*** |   deleted file mode 100644
+*** |   index 9d7e69f..0000000
+*** |   --- a/one
+*** |   +++ /dev/null
+*** |   @@ -1 +0,0 @@
+*** |   -ichi
+*** |
+*** * commit COMMIT_OBJECT_NAME
+*** | Author: A U Thor <author@example.com>
+*** |
+*** |     second
+*** | ---
+*** |  one | 2 +-
+*** |  1 file changed, 1 insertion(+), 1 deletion(-)
+*** |
+*** | diff --git a/one b/one
+*** | index 5626abf..9d7e69f 100644
+*** | --- a/one
+*** | +++ b/one
+*** | @@ -1 +1 @@
+*** | -one
+*** | +ichi
+*** |
+*** * commit COMMIT_OBJECT_NAME
+***   Author: A U Thor <author@example.com>
+***
+***       initial
+***   ---
+***    one | 1 +
+***    1 file changed, 1 insertion(+)
+***
+***   diff --git a/one b/one
+***   new file mode 100644
+***   index 0000000..5626abf
+***   --- /dev/null
+***   +++ b/one
+***   @@ -0,0 +1 @@
+***   +one
+EOF
+
+test_expect_success 'log --line-prefix="*** " --graph with diff and stats' '
+       git log --line-prefix="*** " --no-renames --graph --pretty=short --stat -p >actual &&
+       sanitize_output >actual.sanitized <actual &&
+       test_i18ncmp expect actual.sanitized
+'
+
+cat >expect <<-\EOF
+* reach
+|
+| A    reach.t
+* Merge branch 'tangle'
+*   Merge branch 'side'
+|\
+| * side-2
+|
+|   A  2
+* Second
+|
+| A    one
+* sixth
+
+  D    a/two
+EOF
+
+test_expect_success 'log --graph with --name-status' '
+       git log --graph --format=%s --name-status tangle..reach >actual &&
+       sanitize_output <actual >actual.sanitized &&
+       test_cmp expect actual.sanitized
+'
+
+cat >expect <<-\EOF
+* reach
+|
+| reach.t
+* Merge branch 'tangle'
+*   Merge branch 'side'
+|\
+| * side-2
+|
+|   2
+* Second
+|
+| one
+* sixth
+
+  a/two
+EOF
+
+test_expect_success 'log --graph with --name-only' '
+       git log --graph --format=%s --name-only tangle..reach >actual &&
+       sanitize_output <actual >actual.sanitized &&
+       test_cmp expect actual.sanitized
+'
+
 test_expect_success 'dotdot is a parent directory' '
        mkdir -p a/b &&
        ( echo sixth && echo fifth ) >expect &&
@@ -979,4 +1392,13 @@ test_expect_success 'log --source paints tag names' '
        test_cmp expect actual
 '
 
+test_expect_success 'log --source paints symmetric ranges' '
+       cat >expect <<-\EOF &&
+       09e12a9 source-b three
+       8e393e1 source-a two
+       EOF
+       git log --oneline --source source-a...source-b >actual &&
+       test_cmp expect actual
+'
+
 test_done
index 84a809690e786c1278d0885b4b441c6ce3bbe4f0..0288c17ec60b803d2815fb1b704c35f74e4a7753 100755 (executable)
@@ -143,6 +143,20 @@ test_expect_success 'patch-id supports git-format-patch MIME output' '
        test_cmp patch-id_master patch-id_same
 '
 
+test_expect_success 'patch-id respects config from subdir' '
+       test_config patchid.stable true &&
+       mkdir subdir &&
+
+       # copy these because test_patch_id() looks for them in
+       # the current directory
+       cp bar-then-foo foo-then-bar subdir &&
+
+       (
+               cd subdir &&
+               test_patch_id irrelevant patchid.stable=true
+       )
+'
+
 cat >nonl <<\EOF
 diff --git i/a w/a
 index e69de29..2e65efe 100644
index f5435fd250baf7415fb6a205f4497cb5c118de65..18aa1b5889749e706cba70c2a4f2633bcc9c9eb4 100755 (executable)
@@ -126,12 +126,12 @@ test_expect_success 'NUL separation with --stat' '
        test_i18ncmp expected actual
 '
 
-test_expect_failure 'NUL termination with --stat' '
+test_expect_failure C_LOCALE_OUTPUT 'NUL termination with --stat' '
        stat0_part=$(git diff --stat HEAD^ HEAD) &&
        stat1_part=$(git diff-tree --no-commit-id --stat --root HEAD^) &&
        printf "add bar\n$stat0_part\n\0$(commit_msg)\n$stat1_part\n0" >expected &&
        git log -z --stat --pretty="tformat:%s" >actual &&
-       test_i18ncmp expected actual
+       test_cmp expected actual
 '
 
 test_expect_success 'setup more commits' '
@@ -535,4 +535,30 @@ test_expect_success 'clean log decoration' '
        test_cmp expected actual1
 '
 
+cat >trailers <<EOF
+Signed-off-by: A U Thor <author@example.com>
+Acked-by: A U Thor <author@example.com>
+[ v2 updated patch description ]
+Signed-off-by: A U Thor <author@example.com>
+EOF
+
+test_expect_success 'pretty format %(trailers) shows trailers' '
+       echo "Some contents" >trailerfile &&
+       git add trailerfile &&
+       git commit -F - <<-EOF &&
+       trailers: this commit message has trailers
+
+       This commit is a test commit with trailers at the end. We parse this
+       message and display the trailers using %bT
+
+       $(cat trailers)
+       EOF
+       git log --no-walk --pretty="%(trailers)" >actual &&
+       cat >expect <<-EOF &&
+       $(cat trailers)
+
+       EOF
+       test_cmp expect actual
+'
+
 test_done
index 9d87777b5994910dda971b57fd67b733ee9b5398..d0377fae5c832bcd4df37f3bc2ab4a8708f70251 100755 (executable)
@@ -106,4 +106,14 @@ test_expect_success '-L with --output' '
        test_line_count = 70 log
 '
 
+test_expect_success 'range_set_union' '
+       test_seq 500 > c.c &&
+       git add c.c &&
+       git commit -m "many lines" &&
+       test_seq 1000 > c.c &&
+       git add c.c &&
+       git commit -m "modify many lines" &&
+       git log $(for x in $(test_seq 200); do echo -L $((2*x)),+1:c.c; done)
+'
+
 test_done
index 85716dd6ec566f34f7c4e0b30477bb1531c6030e..168739c7214c764ef7f35a83063d369c1db22ec4 100755 (executable)
@@ -29,9 +29,9 @@ test_expect_success 'try to apply corrupted patch' '
 '
 
 test_expect_success 'compare diagnostic; ensure file is still here' '
-       echo "fatal: git diff header lacks filename information (line 4)" >expected &&
+       echo "error: git diff header lacks filename information (line 4)" >expected &&
        test_path_is_file f &&
-       test_cmp expected actual
+       test_i18ncmp expected actual
 '
 
 test_done
index 80b2387341c3a7abb9cc4b126376d7dd755d9e1d..886b6953e40f9fceae18642ebec031e0bdf511e3 100755 (executable)
@@ -179,6 +179,15 @@ test_expect_success 'git archive --remote' \
     'git archive --remote=. HEAD >b5.tar &&
     test_cmp_bin b.tar b5.tar'
 
+test_expect_success 'git archive --remote with configured remote' '
+       git config remote.foo.url . &&
+       (
+               cd a &&
+               git archive --remote=foo --output=../b5-nick.tar HEAD
+       ) &&
+       test_cmp_bin b.tar b5-nick.tar
+'
+
 test_expect_success \
     'validate file modification time' \
     'mkdir extract &&
@@ -197,9 +206,15 @@ test_expect_success 'git archive with --output, override inferred format' '
        test_cmp_bin b.tar d4.zip
 '
 
-test_expect_success \
-    'git archive --list outside of a git repo' \
-    'GIT_DIR=some/non-existing/directory git archive --list'
+test_expect_success 'git archive --list outside of a git repo' '
+       nongit git archive --list
+'
+
+test_expect_success 'git archive --remote outside of a git repo' '
+       git archive HEAD >expect.tar &&
+       nongit git archive --remote="$PWD" HEAD >actual.tar &&
+       test_cmp_bin expect.tar actual.tar
+'
 
 test_expect_success 'clients cannot access unreachable commits' '
        test_commit unreachable &&
index 14744b2a4b1e646890176ec53970d36de6f8ec3b..55c78709978ff75cdbd794ee4c816dfd1eb55ef0 100755 (executable)
@@ -64,6 +64,12 @@ check_zip() {
                test_cmp_bin $original/nodiff.crlf $extracted/nodiff.crlf &&
                test_cmp_bin $original/nodiff.lf   $extracted/nodiff.lf
        "
+
+       test_expect_success UNZIP " validate that custom diff is unchanged " "
+               test_cmp_bin $original/custom.cr   $extracted/custom.cr &&
+               test_cmp_bin $original/custom.crlf $extracted/custom.crlf &&
+               test_cmp_bin $original/custom.lf   $extracted/custom.lf
+       "
 }
 
 test_expect_success \
@@ -78,6 +84,9 @@ test_expect_success \
      printf "text\r"   >a/nodiff.cr &&
      printf "text\r\n" >a/nodiff.crlf &&
      printf "text\n"   >a/nodiff.lf &&
+     printf "text\r"   >a/custom.cr &&
+     printf "text\r\n" >a/custom.crlf &&
+     printf "text\n"   >a/custom.lf &&
      printf "\0\r"     >a/binary.cr &&
      printf "\0\r\n"   >a/binary.crlf &&
      printf "\0\n"     >a/binary.lf &&
@@ -112,15 +121,20 @@ test_expect_success 'add files to repository' '
 test_expect_success 'setup export-subst and diff attributes' '
        echo "a/nodiff.* -diff" >>.git/info/attributes &&
        echo "a/diff.* diff" >>.git/info/attributes &&
+       echo "a/custom.* diff=custom" >>.git/info/attributes &&
+       git config diff.custom.binary true &&
        echo "substfile?" export-subst >>.git/info/attributes &&
        git log --max-count=1 "--pretty=format:A${SUBSTFORMAT}O" HEAD \
                >a/substfile1
 '
 
-test_expect_success \
-    'create bare clone' \
-    'git clone --bare . bare.git &&
-     cp .git/info/attributes bare.git/info/attributes'
+test_expect_success 'create bare clone' '
+       git clone --bare . bare.git &&
+       cp .git/info/attributes bare.git/info/attributes &&
+       # Recreate our changes to .git/config rather than just copying it, as
+       # we do not want to clobber core.bare or other settings.
+       git -C bare.git config diff.custom.binary true
+'
 
 test_expect_success \
     'remove ignored file' \
index 45d228ebc81ed13c83d24f90895e9a374af5a87e..9690dcad4fd5ba0148b3f6a709ab321976545db0 100755 (executable)
@@ -13,7 +13,7 @@ test_expect_success 'split sample box' \
        'git mailsplit -o. "$DATA/sample.mbox" >last &&
        last=$(cat last) &&
        echo total is $last &&
-       test $(cat last) = 17'
+       test $(cat last) = 18'
 
 check_mailinfo () {
        mail=$1 opt=$2
@@ -158,4 +158,59 @@ test_expect_success 'mailinfo handles rfc2822 comment' '
        test_cmp "$DATA/comment.expect" comment/info
 '
 
+test_expect_success 'mailinfo with mailinfo.scissors config' '
+       test_config mailinfo.scissors true &&
+       (
+               mkdir sub &&
+               cd sub &&
+               git mailinfo ../msg0014.sc ../patch0014.sc <../0014 >../info0014.sc
+       ) &&
+       test_cmp "$DATA/msg0014--scissors" msg0014.sc &&
+       test_cmp "$DATA/patch0014--scissors" patch0014.sc &&
+       test_cmp "$DATA/info0014--scissors" info0014.sc
+'
+
+
+test_expect_success 'mailinfo no options' '
+       subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
+               git mailinfo /dev/null /dev/null)" &&
+       test z"$subj" = z"Subject: message"
+'
+
+test_expect_success 'mailinfo -k' '
+       subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
+               git mailinfo -k /dev/null /dev/null)" &&
+       test z"$subj" = z"Subject: [PATCH] [other] [PATCH] message"
+'
+
+test_expect_success 'mailinfo -b no [PATCH]' '
+       subj="$(echo "Subject: [other] message" |
+               git mailinfo -b /dev/null /dev/null)" &&
+       test z"$subj" = z"Subject: [other] message"
+'
+
+test_expect_success 'mailinfo -b leading [PATCH]' '
+       subj="$(echo "Subject: [PATCH] [other] message" |
+               git mailinfo -b /dev/null /dev/null)" &&
+       test z"$subj" = z"Subject: [other] message"
+'
+
+test_expect_success 'mailinfo -b double [PATCH]' '
+       subj="$(echo "Subject: [PATCH] [PATCH] message" |
+               git mailinfo -b /dev/null /dev/null)" &&
+       test z"$subj" = z"Subject: message"
+'
+
+test_expect_failure 'mailinfo -b trailing [PATCH]' '
+       subj="$(echo "Subject: [other] [PATCH] message" |
+               git mailinfo -b /dev/null /dev/null)" &&
+       test z"$subj" = z"Subject: [other] message"
+'
+
+test_expect_failure 'mailinfo -b separated double [PATCH]' '
+       subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
+               git mailinfo -b /dev/null /dev/null)" &&
+       test z"$subj" = z"Subject: [other] message"
+'
+
 test_done
diff --git a/t/t5100/info0018 b/t/t5100/info0018
new file mode 100644 (file)
index 0000000..d53e749
--- /dev/null
@@ -0,0 +1,5 @@
+Author: Another Thor
+Email: a.thor@example.com
+Subject: This one contains a tab and a space
+Date: Fri, 9 Jun 2006 00:44:16 -0700
+
diff --git a/t/t5100/info0018--no-inbody-headers b/t/t5100/info0018--no-inbody-headers
new file mode 100644 (file)
index 0000000..30b17bd
--- /dev/null
@@ -0,0 +1,5 @@
+Author: A U Thor
+Email: a.u.thor@example.com
+Subject: check multiline inbody headers
+Date: Fri, 9 Jun 2006 00:44:16 -0700
+
index 4abb3d5c6c4884806cdaabcc0b01acb9c1263af2..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,2 +0,0 @@
-  - a list
-  - of stuff
diff --git a/t/t5100/msg0018 b/t/t5100/msg0018
new file mode 100644 (file)
index 0000000..56de83d
--- /dev/null
@@ -0,0 +1,2 @@
+a commit message
+
diff --git a/t/t5100/msg0018--no-inbody-headers b/t/t5100/msg0018--no-inbody-headers
new file mode 100644 (file)
index 0000000..b1e05d3
--- /dev/null
@@ -0,0 +1,8 @@
+From: Another Thor
+ <a.thor@example.com>
+Subject: This one contains
+       a tab
+ and a space
+
+a commit message
+
diff --git a/t/t5100/patch0018 b/t/t5100/patch0018
new file mode 100644 (file)
index 0000000..789df6d
--- /dev/null
@@ -0,0 +1,6 @@
+diff --git a/foo b/foo
+index e69de29..d95f3ad 100644
+--- a/foo
++++ b/foo
+@@ -0,0 +1 @@
++content
diff --git a/t/t5100/patch0018--no-inbody-headers b/t/t5100/patch0018--no-inbody-headers
new file mode 100644 (file)
index 0000000..789df6d
--- /dev/null
@@ -0,0 +1,6 @@
+diff --git a/foo b/foo
+index e69de29..d95f3ad 100644
+--- a/foo
++++ b/foo
+@@ -0,0 +1 @@
++content
index 8b2ae064c36b969ca20324154cea66bf26739de6..6d4d0e44742ed3a162b1f9c813b0ad41b6f7dc7a 100644 (file)
@@ -699,3 +699,22 @@ index e69de29..d95f3ad 100644
 +++ b/foo
 @@ -0,0 +1 @@
 +New content
+From nobody Mon Sep 17 00:00:00 2001
+From: A U Thor <a.u.thor@example.com>
+Subject: check multiline inbody headers
+Date: Fri, 9 Jun 2006 00:44:16 -0700
+
+From: Another Thor
+ <a.thor@example.com>
+Subject: This one contains
+       a tab
+ and a space
+
+a commit message
+
+diff --git a/foo b/foo
+index e69de29..d95f3ad 100644
+--- a/foo
++++ b/foo
+@@ -0,0 +1 @@
++content
index 899e52d50f0d73e4a755c4f7991364f34912b336..43a672c3451146f800852a6d8688c10e497b47cf 100755 (executable)
@@ -406,6 +406,21 @@ test_expect_success 'verify resulting packs' '
        git verify-pack test-11-*.pack
 '
 
+test_expect_success 'set up pack for non-repo tests' '
+       # make sure we have a pack with no matching index file
+       cp test-1-*.pack foo.pack
+'
+
+test_expect_success 'index-pack --stdin complains of non-repo' '
+       nongit test_must_fail git index-pack --stdin <foo.pack &&
+       test_path_is_missing non-repo/.git
+'
+
+test_expect_success 'index-pack <pack> works in non-repo' '
+       nongit git index-pack ../foo.pack &&
+       test_path_is_file foo.idx
+'
+
 #
 # WARNING!
 #
index 3893afd687986ec7ec9102658c8dc332c61d25fa..20e2473a03b645d690b25598bc0cb2e421034b6c 100755 (executable)
@@ -7,15 +7,30 @@ objpath () {
        echo ".git/objects/$(echo "$1" | sed -e 's|\(..\)|\1/|')"
 }
 
+# show objects present in pack ($1 should be associated *.idx)
+list_packed_objects () {
+       git show-index <"$1" | cut -d' ' -f2
+}
+
+# has_any pattern-file content-file
+# tests whether content-file has any entry from pattern-file with entries being
+# whole lines.
+has_any () {
+       grep -Ff "$1" "$2"
+}
+
 test_expect_success 'setup repo with moderate-sized history' '
-       for i in $(test_seq 1 10); do
+       for i in $(test_seq 1 10)
+       do
                test_commit $i
        done &&
        git checkout -b other HEAD~5 &&
-       for i in $(test_seq 1 10); do
+       for i in $(test_seq 1 10)
+       do
                test_commit side-$i
        done &&
        git checkout master &&
+       bitmaptip=$(git rev-parse master) &&
        blob=$(echo tagged-blob | git hash-object -w --stdin) &&
        git tag tagged-blob $blob &&
        git config repack.writebitmaps true &&
@@ -91,7 +106,8 @@ test_expect_success 'clone from bitmapped repository' '
 '
 
 test_expect_success 'setup further non-bitmapped commits' '
-       for i in $(test_seq 1 10); do
+       for i in $(test_seq 1 10)
+       do
                test_commit further-$i
        done
 '
@@ -105,12 +121,10 @@ test_expect_success 'fetch (partial bitmap)' '
        test_cmp expect actual
 '
 
-test_expect_success 'incremental repack cannot create bitmaps' '
+test_expect_success 'incremental repack fails when bitmaps are requested' '
        test_commit more-1 &&
-       find .git/objects/pack -name "*.bitmap" >expect &&
-       git repack -d &&
-       find .git/objects/pack -name "*.bitmap" >actual &&
-       test_cmp expect actual
+       test_must_fail git repack -d 2>err &&
+       test_i18ngrep "Incremental repacks are incompatible with bitmap" err
 '
 
 test_expect_success 'incremental repack can disable bitmaps' '
@@ -118,6 +132,83 @@ test_expect_success 'incremental repack can disable bitmaps' '
        git repack -d --no-write-bitmap-index
 '
 
+test_expect_success 'pack-objects respects --local (non-local loose)' '
+       git init --bare alt.git &&
+       echo $(pwd)/alt.git/objects >.git/objects/info/alternates &&
+       echo content1 >file1 &&
+       # non-local loose object which is not present in bitmapped pack
+       altblob=$(GIT_DIR=alt.git git hash-object -w file1) &&
+       # non-local loose object which is also present in bitmapped pack
+       git cat-file blob $blob | GIT_DIR=alt.git git hash-object -w --stdin &&
+       git add file1 &&
+       test_tick &&
+       git commit -m commit_file1 &&
+       echo HEAD | git pack-objects --local --stdout --revs >1.pack &&
+       git index-pack 1.pack &&
+       list_packed_objects 1.idx >1.objects &&
+       printf "%s\n" "$altblob" "$blob" >nonlocal-loose &&
+       ! has_any nonlocal-loose 1.objects
+'
+
+test_expect_success 'pack-objects respects --honor-pack-keep (local non-bitmapped pack)' '
+       echo content2 >file2 &&
+       blob2=$(git hash-object -w file2) &&
+       git add file2 &&
+       test_tick &&
+       git commit -m commit_file2 &&
+       printf "%s\n" "$blob2" "$bitmaptip" >keepobjects &&
+       pack2=$(git pack-objects pack2 <keepobjects) &&
+       mv pack2-$pack2.* .git/objects/pack/ &&
+       >.git/objects/pack/pack2-$pack2.keep &&
+       rm $(objpath $blob2) &&
+       echo HEAD | git pack-objects --honor-pack-keep --stdout --revs >2a.pack &&
+       git index-pack 2a.pack &&
+       list_packed_objects 2a.idx >2a.objects &&
+       ! has_any keepobjects 2a.objects
+'
+
+test_expect_success 'pack-objects respects --local (non-local pack)' '
+       mv .git/objects/pack/pack2-$pack2.* alt.git/objects/pack/ &&
+       echo HEAD | git pack-objects --local --stdout --revs >2b.pack &&
+       git index-pack 2b.pack &&
+       list_packed_objects 2b.idx >2b.objects &&
+       ! has_any keepobjects 2b.objects
+'
+
+test_expect_success 'pack-objects respects --honor-pack-keep (local bitmapped pack)' '
+       ls .git/objects/pack/ | grep bitmap >output &&
+       test_line_count = 1 output &&
+       packbitmap=$(basename $(cat output) .bitmap) &&
+       list_packed_objects .git/objects/pack/$packbitmap.idx >packbitmap.objects &&
+       test_when_finished "rm -f .git/objects/pack/$packbitmap.keep" &&
+       >.git/objects/pack/$packbitmap.keep &&
+       echo HEAD | git pack-objects --honor-pack-keep --stdout --revs >3a.pack &&
+       git index-pack 3a.pack &&
+       list_packed_objects 3a.idx >3a.objects &&
+       ! has_any packbitmap.objects 3a.objects
+'
+
+test_expect_success 'pack-objects respects --local (non-local bitmapped pack)' '
+       mv .git/objects/pack/$packbitmap.* alt.git/objects/pack/ &&
+       test_when_finished "mv alt.git/objects/pack/$packbitmap.* .git/objects/pack/" &&
+       echo HEAD | git pack-objects --local --stdout --revs >3b.pack &&
+       git index-pack 3b.pack &&
+       list_packed_objects 3b.idx >3b.objects &&
+       ! has_any packbitmap.objects 3b.objects
+'
+
+test_expect_success 'pack-objects to file can use bitmap' '
+       # make sure we still have 1 bitmap index from previous tests
+       ls .git/objects/pack/ | grep bitmap >output &&
+       test_line_count = 1 output &&
+       # verify equivalent packs are generated with/without using bitmap index
+       packasha1=$(git pack-objects --no-use-bitmap-index --all packa </dev/null) &&
+       packbsha1=$(git pack-objects --use-bitmap-index --all packb </dev/null) &&
+       list_packed_objects <packa-$packasha1.idx >packa.objects &&
+       list_packed_objects <packb-$packbsha1.idx >packb.objects &&
+       test_cmp packa.objects packb.objects
+'
+
 test_expect_success 'full repack, reusing previous bitmaps' '
        git repack -ad &&
        ls .git/objects/pack/ | grep bitmap >output &&
@@ -143,6 +234,20 @@ test_expect_success 'create objects for missing-HAVE tests' '
        EOF
 '
 
+test_expect_success 'pack-objects respects --incremental' '
+       cat >revs2 <<-EOF &&
+       HEAD
+       $commit
+       EOF
+       git pack-objects --incremental --stdout --revs <revs2 >4.pack &&
+       git index-pack 4.pack &&
+       list_packed_objects 4.idx >4.objects &&
+       test_line_count = 4 4.objects &&
+       git rev-list --objects $commit >revlist &&
+       cut -d" " -f1 revlist |sort >objects &&
+       test_cmp 4.objects objects
+'
+
 test_expect_success 'pack with missing blob' '
        rm $(objpath $blob) &&
        git pack-objects --stdout --revs <revs >/dev/null
@@ -158,10 +263,6 @@ test_expect_success 'pack with missing parent' '
        git pack-objects --stdout --revs <revs >/dev/null
 '
 
-test_lazy_prereq JGIT '
-       type jgit
-'
-
 test_expect_success JGIT 'we can read jgit bitmaps' '
        git clone . compat-jgit &&
        (
@@ -191,4 +292,43 @@ test_expect_success 'splitting packs does not generate bogus bitmaps' '
        git -C no-bitmaps.git fetch .. HEAD
 '
 
+test_expect_success 'set up reusable pack' '
+       rm -f .git/objects/pack/*.keep &&
+       git repack -adb &&
+       reusable_pack () {
+               git for-each-ref --format="%(objectname)" |
+               git pack-objects --delta-base-offset --revs --stdout "$@"
+       }
+'
+
+test_expect_success 'pack reuse respects --honor-pack-keep' '
+       test_when_finished "rm -f .git/objects/pack/*.keep" &&
+       for i in .git/objects/pack/*.pack
+       do
+               >${i%.pack}.keep
+       done &&
+       reusable_pack --honor-pack-keep >empty.pack &&
+       git index-pack empty.pack &&
+       >expect &&
+       git show-index <empty.idx >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'pack reuse respects --local' '
+       mv .git/objects/pack/* alt.git/objects/pack/ &&
+       test_when_finished "mv alt.git/objects/pack/* .git/objects/pack/" &&
+       reusable_pack --local >empty.pack &&
+       git index-pack empty.pack &&
+       >expect &&
+       git show-index <empty.idx >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'pack reuse respects --incremental' '
+       reusable_pack --incremental >empty.pack &&
+       git index-pack empty.pack &&
+       >expect &&
+       git show-index <empty.idx >actual &&
+       test_cmp expect actual
+'
 test_done
index a8a587abc3799f069deab3bc48914cea81bb15cf..9372508c993e72ad99da004ca2400df81c721006 100755 (executable)
@@ -139,7 +139,13 @@ test_expect_success 'bogus offset into v2 extended table' '
 test_expect_success 'bogus offset inside v2 extended table' '
        # We need two objects here, so we can plausibly require
        # an extended table (if the first object were larger than 2^31).
-       do_pack "$object $(git rev-parse HEAD)" --index-version=2 &&
+       #
+       # Note that the value is important here. We want $object as
+       # the second entry in sorted-sha1 order. The sha1 of 1485 starts
+       # with "000", which sorts before that of $object (which starts
+       # with "fff").
+       second=$(echo 1485 | git hash-object -w --stdin) &&
+       do_pack "$object $second" --index-version=2 &&
 
        # We have to make extra room for the table, so we cannot
        # just munge in place as usual.
diff --git a/t/t5314-pack-cycle-detection.sh b/t/t5314-pack-cycle-detection.sh
new file mode 100755 (executable)
index 0000000..f7dbdfb
--- /dev/null
@@ -0,0 +1,113 @@
+#!/bin/sh
+
+test_description='test handling of inter-pack delta cycles during repack
+
+The goal here is to create a situation where we have two blobs, A and B, with A
+as a delta against B in one pack, and vice versa in the other. Then if we can
+persuade a full repack to find A from one pack and B from the other, that will
+give us a cycle when we attempt to reuse those deltas.
+
+The trick is in the "persuade" step, as it depends on the internals of how
+pack-objects picks which pack to reuse the deltas from. But we can assume
+that it does so in one of two general strategies:
+
+ 1. Using a static ordering of packs. In this case, no inter-pack cycles can
+    happen. Any objects with a delta relationship must be present in the same
+    pack (i.e., no "--thin" packs on disk), so we will find all related objects
+    from that pack. So assuming there are no cycles within a single pack (and
+    we avoid generating them via pack-objects or importing them via
+    index-pack), then our result will have no cycles.
+
+    So this case should pass the tests no matter how we arrange things.
+
+ 2. Picking the next pack to examine based on locality (i.e., where we found
+    something else recently).
+
+    In this case, we want to make sure that we find the delta versions of A and
+    B and not their base versions. We can do this by putting two blobs in each
+    pack. The first is a "dummy" blob that can only be found in the pack in
+    question.  And then the second is the actual delta we want to find.
+
+    The two blobs must be present in the same tree, not present in other trees,
+    and the dummy pathname must sort before the delta path.
+
+The setup below focuses on case 2. We have two commits HEAD and HEAD^, each
+which has two files: "dummy" and "file". Then we can make two packs which
+contain:
+
+  [pack one]
+  HEAD:dummy
+  HEAD:file  (as delta against HEAD^:file)
+  HEAD^:file (as base)
+
+  [pack two]
+  HEAD^:dummy
+  HEAD^:file (as delta against HEAD:file)
+  HEAD:file  (as base)
+
+Then no matter which order we start looking at the packs in, we know that we
+will always find a delta for "file", because its lookup will always come
+immediately after the lookup for "dummy".
+'
+. ./test-lib.sh
+
+
+
+# Create a pack containing the the tree $1 and blob $1:file, with
+# the latter stored as a delta against $2:file.
+#
+# We convince pack-objects to make the delta in the direction of our choosing
+# by marking $2 as a preferred-base edge. That results in $1:file as a thin
+# delta, and index-pack completes it by adding $2:file as a base.
+#
+# Note that the two variants of "file" must be similar enough to convince git
+# to create the delta.
+make_pack () {
+       {
+               printf '%s\n' "-$(git rev-parse $2)"
+               printf '%s dummy\n' "$(git rev-parse $1:dummy)"
+               printf '%s file\n' "$(git rev-parse $1:file)"
+       } |
+       git pack-objects --stdout |
+       git index-pack --stdin --fix-thin
+}
+
+test_expect_success 'setup' '
+       test-genrandom base 4096 >base &&
+       for i in one two
+       do
+               # we want shared content here to encourage deltas...
+               cp base file &&
+               echo $i >>file &&
+
+               # ...whereas dummy should be short, because we do not want
+               # deltas that would create duplicates when we --fix-thin
+               echo $i >dummy &&
+
+               git add file dummy &&
+               test_tick &&
+               git commit -m $i ||
+               return 1
+       done &&
+
+       make_pack HEAD^ HEAD &&
+       make_pack HEAD HEAD^
+'
+
+test_expect_success 'repack' '
+       # We first want to check that we do not have any internal errors,
+       # and also that we do not hit the last-ditch cycle-breaking code
+       # in write_object(), which will issue a warning to stderr.
+       >expect &&
+       git repack -ad 2>stderr &&
+       test_cmp expect stderr &&
+
+       # And then double-check that the resulting pack is usable (i.e.,
+       # we did not fail to notice any cycles). We know we are accessing
+       # the objects via the new pack here, because "repack -d" will have
+       # removed the others.
+       git cat-file blob HEAD:file >/dev/null &&
+       git cat-file blob HEAD^:file >/dev/null
+'
+
+test_done
diff --git a/t/t5315-pack-objects-compression.sh b/t/t5315-pack-objects-compression.sh
new file mode 100755 (executable)
index 0000000..34c47da
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+test_description='pack-object compression configuration'
+
+. ./test-lib.sh
+
+# This should be moved to test-lib.sh together with the
+# copy in t0021 after both topics have graduated to 'master'.
+file_size () {
+       perl -e 'print -s $ARGV[0]' "$1"
+}
+
+test_expect_success setup '
+       printf "%2000000s" X |
+       git hash-object -w --stdin >object-name &&
+       # make sure it resulted in a loose object
+       ob=$(sed -e "s/\(..\).*/\1/" object-name) &&
+       ject=$(sed -e "s/..\(.*\)/\1/" object-name) &&
+       test -f .git/objects/$ob/$ject
+'
+
+while read expect config
+do
+       test_expect_success "pack-objects with $config" '
+               test_when_finished "rm -f pack-*.*" &&
+               git $config pack-objects pack <object-name &&
+               sz=$(file_size pack-*.pack) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c pack.compression=0
+large -c core.compression=9 -c pack.compression=0
+small -c core.compression=0 -c pack.compression=9
+small -c core.compression=9 -c pack.compression=9
+large -c pack.compression=0
+small -c pack.compression=9
+EOF
+
+test_done
diff --git a/t/t5316-pack-delta-depth.sh b/t/t5316-pack-delta-depth.sh
new file mode 100755 (executable)
index 0000000..2ed479b
--- /dev/null
@@ -0,0 +1,97 @@
+#!/bin/sh
+
+test_description='pack-objects breaks long cross-pack delta chains'
+. ./test-lib.sh
+
+# This mirrors a repeated push setup:
+#
+# 1. A client repeatedly modifies some files, makes a
+#      commit, and pushes the result. It does this N times
+#      before we get around to repacking.
+#
+# 2. Each push generates a thin pack with the new version of
+#    various objects. Let's consider some file in the root tree
+#    which is updated in each commit.
+#
+#    When generating push number X, we feed commit X-1 (and
+#    thus blob X-1) as a preferred base. The resulting pack has
+#    blob X as a thin delta against blob X-1.
+#
+#    On the receiving end, "index-pack --fix-thin" will
+#    complete the pack with a base copy of blob X-1.
+#
+# 3. In older versions of git, if we used the delta from
+#    pack X, then we'd always find blob X-1 as a base in the
+#    same pack (and generate a fresh delta).
+#
+#    But with the pack mru, we jump from delta to delta
+#    following the traversal order:
+#
+#      a. We grab blob X from pack X as a delta, putting it at
+#         the tip of our mru list.
+#
+#      b. Eventually we move onto commit X-1. We need other
+#         objects which are only in pack X-1 (in the test code
+#         below, it's the containing tree). That puts pack X-1
+#         at the tip of our mru list.
+#
+#      c. Eventually we look for blob X-1, and we find the
+#         version in pack X-1 (because it's the mru tip).
+#
+# Now we have blob X as a delta against X-1, which is a delta
+# against X-2, and so forth.
+#
+# In the real world, these small pushes would get exploded by
+# unpack-objects rather than "index-pack --fix-thin", but the
+# same principle applies to larger pushes (they only need one
+# repeatedly-modified file to generate the delta chain).
+
+test_expect_success 'create series of packs' '
+       test-genrandom foo 4096 >content &&
+       prev= &&
+       for i in $(test_seq 1 10)
+       do
+               cat content >file &&
+               echo $i >>file &&
+               git add file &&
+               git commit -m $i &&
+               cur=$(git rev-parse HEAD^{tree}) &&
+               {
+                       test -n "$prev" && echo "-$prev"
+                       echo $cur
+                       echo "$(git rev-parse :file) file"
+               } | git pack-objects --stdout >tmp &&
+               git index-pack --stdin --fix-thin <tmp || return 1
+               prev=$cur
+       done
+'
+
+max_chain() {
+       git index-pack --verify-stat-only "$1" >output &&
+       perl -lne '
+         /chain length = (\d+)/ and $len = $1;
+         END { print $len }
+       ' output
+}
+
+# Note that this whole setup is pretty reliant on the current
+# packing heuristics. We double-check that our test case
+# actually produces a long chain. If it doesn't, it should be
+# adjusted (or scrapped if the heuristics have become too unreliable)
+test_expect_success 'packing produces a long delta' '
+       # Use --window=0 to make sure we are seeing reused deltas,
+       # not computing a new long chain.
+       pack=$(git pack-objects --all --window=0 </dev/null pack) &&
+       echo 9 >expect &&
+       max_chain pack-$pack.pack >actual &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success '--depth limits depth' '
+       pack=$(git pack-objects --all --depth=5 </dev/null pack) &&
+       echo 5 >expect &&
+       max_chain pack-$pack.pack >actual &&
+       test_i18ncmp expect actual
+'
+
+test_done
index 305ca7a9308685c7d040ac254fd34cebbbc86cc8..d375d7110d102d6b3ea194e4f09a9b5f391ed496 100755 (executable)
@@ -255,4 +255,45 @@ test_expect_success 'deny pushing to delete current branch' '
        )
 '
 
+extract_ref_advertisement () {
+       perl -lne '
+               # \\ is there to skip capabilities after \0
+               /push< ([^\\]+)/ or next;
+               exit 0 if $1 eq "0000";
+               print $1;
+       '
+}
+
+test_expect_success 'receive-pack de-dupes .have lines' '
+       git init shared &&
+       git -C shared commit --allow-empty -m both &&
+       git clone -s shared fork &&
+       (
+               cd shared &&
+               git checkout -b only-shared &&
+               git commit --allow-empty -m only-shared &&
+               git update-ref refs/heads/foo HEAD
+       ) &&
+
+       # Notable things in this expectation:
+       #  - local refs are not de-duped
+       #  - .have does not duplicate locals
+       #  - .have does not duplicate itself
+       local=$(git -C fork rev-parse HEAD) &&
+       shared=$(git -C shared rev-parse only-shared) &&
+       cat >expect <<-EOF &&
+       $local refs/heads/master
+       $local refs/remotes/origin/HEAD
+       $local refs/remotes/origin/master
+       $shared .have
+       EOF
+
+       GIT_TRACE_PACKET=$(pwd)/trace \
+           git push \
+               --receive-pack="unset GIT_TRACE_PACKET; git-receive-pack" \
+               fork HEAD:foo &&
+       extract_ref_advertisement <trace >refs &&
+       test_cmp expect refs
+'
+
 test_done
index 82d913a6a87c45dd8141e3c7384df9943f9b83cb..b5865b385d3a0ca175dc683c75b7f650958a0469 100755 (executable)
@@ -484,7 +484,7 @@ test_expect_success 'test lonely missing ref' '
                cd client &&
                test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy
        ) >/dev/null 2>error-m &&
-       test_cmp expect-error error-m
+       test_i18ncmp expect-error error-m
 '
 
 test_expect_success 'test missing ref after existing' '
@@ -492,7 +492,7 @@ test_expect_success 'test missing ref after existing' '
                cd client &&
                test_must_fail git fetch-pack --no-progress .. refs/heads/A refs/heads/xyzzy
        ) >/dev/null 2>error-em &&
-       test_cmp expect-error error-em
+       test_i18ncmp expect-error error-em
 '
 
 test_expect_success 'test missing ref before existing' '
@@ -500,7 +500,7 @@ test_expect_success 'test missing ref before existing' '
                cd client &&
                test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy refs/heads/A
        ) >/dev/null 2>error-me &&
-       test_cmp expect-error error-me
+       test_i18ncmp expect-error error-me
 '
 
 test_expect_success 'test --all, --depth, and explicit head' '
@@ -652,4 +652,72 @@ test_expect_success MINGW 'fetch-pack --diag-url c:repo' '
        check_prot_path c:repo file c:repo
 '
 
+test_expect_success 'clone shallow since ...' '
+       test_create_repo shallow-since &&
+       (
+       cd shallow-since &&
+       GIT_COMMITTER_DATE="100000000 +0700" git commit --allow-empty -m one &&
+       GIT_COMMITTER_DATE="200000000 +0700" git commit --allow-empty -m two &&
+       GIT_COMMITTER_DATE="300000000 +0700" git commit --allow-empty -m three &&
+       git clone --shallow-since "300000000 +0700" "file://$(pwd)/." ../shallow11 &&
+       git -C ../shallow11 log --pretty=tformat:%s HEAD >actual &&
+       echo three >expected &&
+       test_cmp expected actual
+       )
+'
+
+test_expect_success 'fetch shallow since ...' '
+       git -C shallow11 fetch --shallow-since "200000000 +0700" origin &&
+       git -C shallow11 log --pretty=tformat:%s origin/master >actual &&
+       cat >expected <<-\EOF &&
+       three
+       two
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'shallow clone exclude tag two' '
+       test_create_repo shallow-exclude &&
+       (
+       cd shallow-exclude &&
+       test_commit one &&
+       test_commit two &&
+       test_commit three &&
+       git clone --shallow-exclude two "file://$(pwd)/." ../shallow12 &&
+       git -C ../shallow12 log --pretty=tformat:%s HEAD >actual &&
+       echo three >expected &&
+       test_cmp expected actual
+       )
+'
+
+test_expect_success 'fetch exclude tag one' '
+       git -C shallow12 fetch --shallow-exclude one origin &&
+       git -C shallow12 log --pretty=tformat:%s origin/master >actual &&
+       test_write_lines three two >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'fetching deepen' '
+       test_create_repo shallow-deepen &&
+       (
+       cd shallow-deepen &&
+       test_commit one &&
+       test_commit two &&
+       test_commit three &&
+       git clone --depth 1 "file://$(pwd)/." deepen &&
+       test_commit four &&
+       git -C deepen log --pretty=tformat:%s master >actual &&
+       echo three >expected &&
+       test_cmp expected actual &&
+       git -C deepen fetch --deepen=1 &&
+       git -C deepen log --pretty=tformat:%s origin/master >actual &&
+       cat >expected <<-\EOF &&
+       four
+       three
+       two
+       EOF
+       test_cmp expected actual
+       )
+'
+
 test_done
index 9b19cff729381b3a8f81f113a5407ac9f9d97cda..49d3621a926786dfbfd71b205dfcb5dd3fa2d889 100755 (executable)
@@ -152,7 +152,7 @@ test_expect_success 'push with receive.fsck.missingEmail=warn' '
        git --git-dir=dst/.git config --add \
                receive.fsck.badDate warn &&
        git push --porcelain dst bogus >act 2>&1 &&
-       test_must_fail grep "missingEmail" act
+       ! grep "missingEmail" act
 '
 
 test_expect_success \
index 8198d8eb05c5366c7d61a12351c333902a2265b6..a6c0178f3af6c3e3f01816197e51e9bca546b00a 100755 (executable)
@@ -153,6 +153,25 @@ test_expect_success 'remove errors out early when deleting non-existent branch'
        )
 '
 
+test_expect_success 'remove remote with a branch without configured merge' '
+       test_when_finished "(
+               git -C test checkout master;
+               git -C test branch -D two;
+               git -C test config --remove-section remote.two;
+               git -C test config --remove-section branch.second;
+               true
+       )" &&
+       (
+               cd test &&
+               git remote add two ../two &&
+               git fetch two &&
+               git checkout -b second two/master^0 &&
+               git config branch.second.remote two &&
+               git checkout master &&
+               git remote rm two
+       )
+'
+
 test_expect_success 'rename errors out early when deleting non-existent branch' '
        (
                cd test &&
@@ -725,7 +744,7 @@ test_expect_success 'rename a remote' '
        (
                cd four &&
                git remote rename origin upstream &&
-               rmdir .git/refs/remotes/origin &&
+               test -z "$(git for-each-ref refs/remotes/origin)" &&
                test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" &&
                test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" &&
                test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" &&
@@ -764,6 +783,13 @@ test_expect_success 'rename a remote with name prefix of other remote' '
        )
 '
 
+test_expect_success 'rename succeeds with existing remote.<target>.prune' '
+       git clone one four.four &&
+       test_when_finished git config --global --unset remote.upstream.prune &&
+       git config --global remote.upstream.prune true &&
+       git -C four.four remote rename origin upstream
+'
+
 cat >remotes_origin <<EOF
 URL: $(pwd)/one
 Push: refs/heads/master:refs/heads/upstream
index bc44ac36d57615b516018a2602c15bea8085e316..75c570adcae4f474c15775ec8504521fc806e2a9 100755 (executable)
@@ -4,6 +4,7 @@ test_description='fetch/push involving ref namespaces'
 . ./test-lib.sh
 
 test_expect_success setup '
+       git config --global protocol.ext.allow user &&
        test_tick &&
        git init original &&
        (
index 819b9ddd0f917a21e3edf7122f99cfb04f4b7a8f..94fc9be9ced3c89214b29e11c95201a38cc99d74 100755 (executable)
@@ -99,7 +99,7 @@ test_expect_success 'confuses pattern as remote when no remote specified' '
        # We could just as easily have used "master"; the "*" emphasizes its
        # role as a pattern.
        test_must_fail git ls-remote refs*master >actual 2>&1 &&
-       test_cmp exp actual
+       test_i18ncmp exp actual
 '
 
 test_expect_success 'die with non-2 for wrong repository even with --exit-code' '
@@ -207,5 +207,54 @@ test_expect_success 'ls-remote --symref omits filtered-out matches' '
        test_cmp expect actual
 '
 
+test_lazy_prereq GIT_DAEMON '
+       test_tristate GIT_TEST_GIT_DAEMON &&
+       test "$GIT_TEST_GIT_DAEMON" != false
+'
+
+# This test spawns a daemon, so run it only if the user would be OK with
+# testing with git-daemon.
+test_expect_success PIPE,JGIT,GIT_DAEMON 'indicate no refs in standards-compliant empty remote' '
+       JGIT_DAEMON_PORT=${JGIT_DAEMON_PORT-${this_test#t}} &&
+       JGIT_DAEMON_PID= &&
+       git init --bare empty.git &&
+       >empty.git/git-daemon-export-ok &&
+       mkfifo jgit_daemon_output &&
+       {
+               jgit daemon --port="$JGIT_DAEMON_PORT" . >jgit_daemon_output &
+               JGIT_DAEMON_PID=$!
+       } &&
+       test_when_finished kill "$JGIT_DAEMON_PID" &&
+       {
+               read line &&
+               case $line in
+               Exporting*)
+                       ;;
+               *)
+                       echo "Expected: Exporting" &&
+                       false;;
+               esac &&
+               read line &&
+               case $line in
+               "Listening on"*)
+                       ;;
+               *)
+                       echo "Expected: Listening on" &&
+                       false;;
+               esac
+       } <jgit_daemon_output &&
+       # --exit-code asks the command to exit with 2 when no
+       # matching refs are found.
+       test_expect_code 2 git ls-remote --exit-code git://localhost:$JGIT_DAEMON_PORT/empty.git
+'
+
+test_expect_success 'ls-remote works outside repository' '
+       # It is important for this repo to be inside the nongit
+       # area, as we want a repo name that does not include
+       # slashes (because those inhibit some of our configuration
+       # lookups).
+       nongit git init --bare dst.git &&
+       nongit git ls-remote dst.git
+'
 
 test_done
index 26b2cafc4795baa8b9377c767e4453079826c34f..177897ea0b1e00cc4ec0f0e43510411ab19f1681 100755 (executable)
@@ -1004,7 +1004,7 @@ test_expect_success 'push --porcelain' '
 test_expect_success 'push --porcelain bad url' '
        mk_empty testrepo &&
        test_must_fail git push >.git/bar --porcelain asdfasdfasd refs/heads/master:refs/remotes/origin/master &&
-       test_must_fail grep -q Done .git/bar
+       ! grep -q Done .git/bar
 '
 
 test_expect_success 'push --porcelain rejected' '
@@ -1098,7 +1098,8 @@ test_expect_success 'fetch exact SHA1' '
                test_must_fail git cat-file -t $the_commit &&
 
                # fetching the hidden object should fail by default
-               test_must_fail git fetch -v ../testrepo $the_commit:refs/heads/copy &&
+               test_must_fail git fetch -v ../testrepo $the_commit:refs/heads/copy 2>err &&
+               test_i18ngrep "Server does not allow request for unadvertised object" err &&
                test_must_fail git rev-parse --verify refs/heads/copy &&
 
                # the server side can allow it to succeed
index 551844584fc7b8ff71667dd61fcba62889ded69f..f15f7a332960f15c7af32a3c1e7a66f5a8a68989 100755 (executable)
@@ -255,6 +255,41 @@ test_expect_success '--rebase' '
        test new = "$(git show HEAD:file2)"
 '
 
+test_expect_success '--rebase fast forward' '
+       git reset --hard before-rebase &&
+       git checkout -b ff &&
+       echo another modification >file &&
+       git commit -m third file &&
+
+       git checkout to-rebase &&
+       git pull --rebase . ff &&
+       test "$(git rev-parse HEAD)" = "$(git rev-parse ff)" &&
+
+       # The above only validates the result.  Did we actually bypass rebase?
+       git reflog -1 >reflog.actual &&
+       sed "s/^[0-9a-f][0-9a-f]*/OBJID/" reflog.actual >reflog.fuzzy &&
+       echo "OBJID HEAD@{0}: pull --rebase . ff: Fast-forward" >reflog.expected &&
+       test_cmp reflog.expected reflog.fuzzy
+'
+
+test_expect_success '--rebase --autostash fast forward' '
+       test_when_finished "
+               git reset --hard
+               git checkout to-rebase
+               git branch -D to-rebase-ff
+               git branch -D behind" &&
+       git branch behind &&
+       git checkout -b to-rebase-ff &&
+       echo another modification >>file &&
+       git add file &&
+       git commit -m mod &&
+
+       git checkout behind &&
+       echo dirty >file &&
+       git pull --rebase --autostash . to-rebase-ff &&
+       test "$(git rev-parse HEAD)" = "$(git rev-parse to-rebase-ff)"
+'
+
 test_expect_success '--rebase with conflicts shows advice' '
        test_when_finished "git rebase --abort; git checkout -f to-rebase" &&
        git checkout -b seq &&
index 73f4bb63465e50aa12de824859903e5293696a85..44309566f13431fe5e70f834b4cd6bb0a674624e 100755 (executable)
@@ -98,6 +98,16 @@ test_expect_success 'push from/to new branch with upstream, matching and simple'
        test_push_failure upstream
 '
 
+test_expect_success 'push ambiguously named branch with upstream, matching and simple' '
+       git checkout -b ambiguous &&
+       test_config branch.ambiguous.remote parent1 &&
+       test_config branch.ambiguous.merge refs/heads/ambiguous &&
+       git tag ambiguous &&
+       test_push_success simple ambiguous &&
+       test_push_success matching ambiguous &&
+       test_push_success upstream ambiguous
+'
+
 test_expect_success 'push from/to new branch with current creates remote branch' '
        test_config branch.new-branch.remote repo1 &&
        git checkout new-branch &&
index 198ce8475416be494fc023de3835828332da424d..23c533e82e71e3b6ed26fc69313c4b51c36c3faa 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-test_description='unpack-objects'
+test_description='test push with submodules'
 
 . ./test-lib.sh
 
@@ -27,7 +27,7 @@ test_expect_success setup '
        )
 '
 
-test_expect_success push '
+test_expect_success 'push works with recorded gitlink' '
        (
                cd work &&
                git push ../pub.git master
@@ -427,7 +427,104 @@ test_expect_success 'push unpushable submodule recursively fails' '
                cd submodule.git &&
                git rev-parse master >../actual
        ) &&
+       test_when_finished git -C work reset --hard master^ &&
        test_cmp expected actual
 '
 
+test_expect_success 'push --dry-run does not recursively update submodules' '
+       (
+               cd work/gar/bage &&
+               git checkout master &&
+               git rev-parse master >../../../expected_submodule &&
+               > junk9 &&
+               git add junk9 &&
+               git commit -m "Ninth junk" &&
+
+               # Go up to 'work' directory
+               cd ../.. &&
+               git checkout master &&
+               git rev-parse master >../expected_pub &&
+               git add gar/bage &&
+               git commit -m "Ninth commit for gar/bage" &&
+               git push --dry-run --recurse-submodules=on-demand ../pub.git master
+       ) &&
+       git -C submodule.git rev-parse master >actual_submodule &&
+       git -C pub.git rev-parse master >actual_pub &&
+       test_cmp expected_pub actual_pub &&
+       test_cmp expected_submodule actual_submodule
+'
+
+test_expect_success 'push --dry-run does not recursively update submodules' '
+       git -C work push --dry-run --recurse-submodules=only ../pub.git master &&
+
+       git -C submodule.git rev-parse master >actual_submodule &&
+       git -C pub.git rev-parse master >actual_pub &&
+       test_cmp expected_pub actual_pub &&
+       test_cmp expected_submodule actual_submodule
+'
+
+test_expect_success 'push only unpushed submodules recursively' '
+       git -C work/gar/bage rev-parse master >expected_submodule &&
+       git -C pub.git rev-parse master >expected_pub &&
+
+       git -C work push --recurse-submodules=only ../pub.git master &&
+
+       git -C submodule.git rev-parse master >actual_submodule &&
+       git -C pub.git rev-parse master >actual_pub &&
+       test_cmp expected_submodule actual_submodule &&
+       test_cmp expected_pub actual_pub
+'
+
+test_expect_success 'push propagating the remotes name to a submodule' '
+       git -C work remote add origin ../pub.git &&
+       git -C work remote add pub ../pub.git &&
+
+       > work/gar/bage/junk10 &&
+       git -C work/gar/bage add junk10 &&
+       git -C work/gar/bage commit -m "Tenth junk" &&
+       git -C work add gar/bage &&
+       git -C work commit -m "Tenth junk added to gar/bage" &&
+
+       # Fails when submodule does not have a matching remote
+       test_must_fail git -C work push --recurse-submodules=on-demand pub master &&
+       # Succeeds when submodules has matching remote and refspec
+       git -C work push --recurse-submodules=on-demand origin master &&
+
+       git -C submodule.git rev-parse master >actual_submodule &&
+       git -C pub.git rev-parse master >actual_pub &&
+       git -C work/gar/bage rev-parse master >expected_submodule &&
+       git -C work rev-parse master >expected_pub &&
+       test_cmp expected_submodule actual_submodule &&
+       test_cmp expected_pub actual_pub
+'
+
+test_expect_success 'push propagating refspec to a submodule' '
+       > work/gar/bage/junk11 &&
+       git -C work/gar/bage add junk11 &&
+       git -C work/gar/bage commit -m "Eleventh junk" &&
+
+       git -C work checkout branch2 &&
+       git -C work add gar/bage &&
+       git -C work commit -m "updating gar/bage in branch2" &&
+
+       # Fails when submodule does not have a matching branch
+       test_must_fail git -C work push --recurse-submodules=on-demand origin branch2 &&
+       # Fails when refspec includes an object id
+       test_must_fail git -C work push --recurse-submodules=on-demand origin \
+               "$(git -C work rev-parse branch2):refs/heads/branch2" &&
+       # Fails when refspec includes 'HEAD' as it is unsupported at this time
+       test_must_fail git -C work push --recurse-submodules=on-demand origin \
+               HEAD:refs/heads/branch2 &&
+
+       git -C work/gar/bage branch branch2 master &&
+       git -C work push --recurse-submodules=on-demand origin branch2 &&
+
+       git -C submodule.git rev-parse branch2 >actual_submodule &&
+       git -C pub.git rev-parse branch2 >actual_pub &&
+       git -C work/gar/bage rev-parse branch2 >expected_submodule &&
+       git -C work rev-parse branch2 >expected_pub &&
+       test_cmp expected_submodule actual_submodule &&
+       test_cmp expected_pub actual_pub
+'
+
 test_done
index a2c9e7439f362d8f247c369ba515a55b26dee8ec..d38ecee2172a6e5599cfbeb18e472816e98e553c 100755 (executable)
@@ -229,4 +229,33 @@ test_expect_success 'new branch already exists' '
        )
 '
 
+test_expect_success 'background updates of REMOTE can be mitigated with a non-updated REMOTE-push' '
+       rm -rf src dst &&
+       git init --bare src.bare &&
+       test_when_finished "rm -rf src.bare" &&
+       git clone --no-local src.bare dst &&
+       test_when_finished "rm -rf dst" &&
+       (
+               cd dst &&
+               test_commit G &&
+               git remote add origin-push ../src.bare &&
+               git push origin-push master:master
+       ) &&
+       git clone --no-local src.bare dst2 &&
+       test_when_finished "rm -rf dst2" &&
+       (
+               cd dst2 &&
+               test_commit H &&
+               git push
+       ) &&
+       (
+               cd dst &&
+               test_commit I &&
+               git fetch origin &&
+               test_must_fail git push --force-with-lease origin-push &&
+               git fetch origin-push &&
+               git push --force-with-lease origin-push
+       )
+'
+
 test_done
index ecb8d446a58d422bd8a9a25f75e4f9a20ec50818..5bcb288f5c4d02e7994d745bc07485bf1bf6c116 100755 (executable)
@@ -124,6 +124,43 @@ test_expect_success GPG 'signed push sends push certificate' '
        test_cmp expect dst/push-cert-status
 '
 
+test_expect_success GPG 'inconsistent push options in signed push not allowed' '
+       # First, invoke receive-pack with dummy input to obtain its preamble.
+       prepare_dst &&
+       git -C dst config receive.certnonceseed sekrit &&
+       git -C dst config receive.advertisepushoptions 1 &&
+       printf xxxx | test_might_fail git receive-pack dst >preamble &&
+
+       # Then, invoke push. Simulate a receive-pack that sends the preamble we
+       # obtained, followed by a dummy packet.
+       write_script myscript <<-\EOF &&
+               cat preamble &&
+               printf xxxx &&
+               cat >push
+       EOF
+       test_might_fail git push --push-option="foo" --push-option="bar" \
+               --receive-pack="\"$(pwd)/myscript\"" --signed dst --delete ff &&
+
+       # Replay the push output on a fresh dst, checking that ff is truly
+       # deleted.
+       prepare_dst &&
+       git -C dst config receive.certnonceseed sekrit &&
+       git -C dst config receive.advertisepushoptions 1 &&
+       git receive-pack dst <push &&
+       test_must_fail git -C dst rev-parse ff &&
+
+       # Tweak the push output to make the push option outside the cert
+       # different, then replay it on a fresh dst, checking that ff is not
+       # deleted.
+       perl -pe "s/([^ ])bar/\$1baz/" push >push.tweak &&
+       prepare_dst &&
+       git -C dst config receive.certnonceseed sekrit &&
+       git -C dst config receive.advertisepushoptions 1 &&
+       git receive-pack dst <push.tweak >out &&
+       git -C dst rev-parse ff &&
+       grep "inconsistent push options" out
+'
+
 test_expect_success GPG 'fail without key and heed user.signingkey' '
        prepare_dst &&
        mkdir -p dst/.git/hooks &&
index 37a433504e27f8dffc9bbbb9e94d550de20ff035..5fbf67c4468897184f46ef9ea151f1dd6ad1d8d0 100755 (executable)
@@ -73,5 +73,78 @@ test_expect_success 'no shallow lines after receiving ACK ready' '
        )
 '
 
+test_expect_success 'clone shallow since ...' '
+       test_create_repo shallow-since &&
+       (
+       cd shallow-since &&
+       GIT_COMMITTER_DATE="100000000 +0700" git commit --allow-empty -m one &&
+       GIT_COMMITTER_DATE="200000000 +0700" git commit --allow-empty -m two &&
+       GIT_COMMITTER_DATE="300000000 +0700" git commit --allow-empty -m three &&
+       mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-since.git" &&
+       git clone --shallow-since "300000000 +0700" $HTTPD_URL/smart/shallow-since.git ../shallow11 &&
+       git -C ../shallow11 log --pretty=tformat:%s HEAD >actual &&
+       echo three >expected &&
+       test_cmp expected actual
+       )
+'
+
+test_expect_success 'fetch shallow since ...' '
+       git -C shallow11 fetch --shallow-since "200000000 +0700" origin &&
+       git -C shallow11 log --pretty=tformat:%s origin/master >actual &&
+       cat >expected <<-\EOF &&
+       three
+       two
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'shallow clone exclude tag two' '
+       test_create_repo shallow-exclude &&
+       (
+       cd shallow-exclude &&
+       test_commit one &&
+       test_commit two &&
+       test_commit three &&
+       mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-exclude.git" &&
+       git clone --shallow-exclude two $HTTPD_URL/smart/shallow-exclude.git ../shallow12 &&
+       git -C ../shallow12 log --pretty=tformat:%s HEAD >actual &&
+       echo three >expected &&
+       test_cmp expected actual
+       )
+'
+
+test_expect_success 'fetch exclude tag one' '
+       git -C shallow12 fetch --shallow-exclude one origin &&
+       git -C shallow12 log --pretty=tformat:%s origin/master >actual &&
+       test_write_lines three two >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'fetching deepen' '
+       test_create_repo shallow-deepen &&
+       (
+       cd shallow-deepen &&
+       test_commit one &&
+       test_commit two &&
+       test_commit three &&
+       mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" &&
+       git clone --depth 1 $HTTPD_URL/smart/shallow-deepen.git deepen &&
+       mv "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" .git &&
+       test_commit four &&
+       git -C deepen log --pretty=tformat:%s master >actual &&
+       echo three >expected &&
+       test_cmp expected actual &&
+       mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" &&
+       git -C deepen fetch --deepen=1 &&
+       git -C deepen log --pretty=tformat:%s origin/master >actual &&
+       cat >expected <<-\EOF &&
+       four
+       three
+       two
+       EOF
+       test_cmp expected actual
+       )
+'
+
 stop_httpd
 test_done
index ea813b9383de96a00b6d6745169ccffc4d45fecc..90a4b0d2fe9d8a1d9963bea54d2d1198a24003c2 100755 (executable)
@@ -100,4 +100,89 @@ test_expect_success 'two push options work' '
        test_cmp expect upstream/.git/hooks/post-receive.push_options
 '
 
+test_expect_success 'push options and submodules' '
+       test_when_finished "rm -rf parent" &&
+       test_when_finished "rm -rf parent_upstream" &&
+       mk_repo_pair &&
+       git -C upstream config receive.advertisePushOptions true &&
+       cp -r upstream parent_upstream &&
+       test_commit -C upstream one &&
+
+       test_create_repo parent &&
+       git -C parent remote add up ../parent_upstream &&
+       test_commit -C parent one &&
+       git -C parent push --mirror up &&
+
+       git -C parent submodule add ../upstream workbench &&
+       git -C parent/workbench remote add up ../../upstream &&
+       git -C parent commit -m "add submoule" &&
+
+       test_commit -C parent/workbench two &&
+       git -C parent add workbench &&
+       git -C parent commit -m "update workbench" &&
+
+       git -C parent push \
+               --push-option=asdf --push-option="more structured text" \
+               --recurse-submodules=on-demand up master &&
+
+       git -C upstream rev-parse --verify master >expect &&
+       git -C parent/workbench rev-parse --verify master >actual &&
+       test_cmp expect actual &&
+
+       git -C parent_upstream rev-parse --verify master >expect &&
+       git -C parent rev-parse --verify master >actual &&
+       test_cmp expect actual &&
+
+       printf "asdf\nmore structured text\n" >expect &&
+       test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
+       test_cmp expect upstream/.git/hooks/post-receive.push_options &&
+       test_cmp expect parent_upstream/.git/hooks/pre-receive.push_options &&
+       test_cmp expect parent_upstream/.git/hooks/post-receive.push_options
+'
+
+. "$TEST_DIRECTORY"/lib-httpd.sh
+start_httpd
+
+test_expect_success 'push option denied properly by http server' '
+       test_when_finished "rm -rf test_http_clone" &&
+       test_when_finished "rm -rf \"$HTTPD_DOCUMENT_ROOT_PATH\"/upstream.git" &&
+       mk_repo_pair &&
+       git -C upstream config receive.advertisePushOptions false &&
+       git -C upstream config http.receivepack true &&
+       cp -R upstream/.git "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git &&
+       git clone "$HTTPD_URL"/smart/upstream test_http_clone &&
+       test_commit -C test_http_clone one &&
+       test_must_fail git -C test_http_clone push --push-option=asdf origin master 2>actual &&
+       test_i18ngrep "the receiving end does not support push options" actual &&
+       git -C test_http_clone push origin master
+'
+
+test_expect_success 'push options work properly across http' '
+       test_when_finished "rm -rf test_http_clone" &&
+       test_when_finished "rm -rf \"$HTTPD_DOCUMENT_ROOT_PATH\"/upstream.git" &&
+       mk_repo_pair &&
+       git -C upstream config receive.advertisePushOptions true &&
+       git -C upstream config http.receivepack true &&
+       cp -R upstream/.git "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git &&
+       git clone "$HTTPD_URL"/smart/upstream test_http_clone &&
+
+       test_commit -C test_http_clone one &&
+       git -C test_http_clone push origin master &&
+       git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify master >expect &&
+       git -C test_http_clone rev-parse --verify master >actual &&
+       test_cmp expect actual &&
+
+       test_commit -C test_http_clone two &&
+       git -C test_http_clone push --push-option=asdf --push-option="more structured text" origin master &&
+       printf "asdf\nmore structured text\n" >expect &&
+       test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/pre-receive.push_options &&
+       test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git/hooks/post-receive.push_options &&
+
+       git -C "$HTTPD_DOCUMENT_ROOT_PATH"/upstream.git rev-parse --verify master >expect &&
+       git -C test_http_clone rev-parse --verify master >actual &&
+       test_cmp expect actual
+'
+
+stop_httpd
+
 test_done
diff --git a/t/t5546-receive-limits.sh b/t/t5546-receive-limits.sh
new file mode 100755 (executable)
index 0000000..10cb0be
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+test_description='check receive input limits'
+. ./test-lib.sh
+
+# Let's run tests with different unpack limits: 1 and 10000
+# When the limit is 1, `git receive-pack` will call `git index-pack`.
+# When the limit is 10000, `git receive-pack` will call `git unpack-objects`.
+
+test_pack_input_limit () {
+       case "$1" in
+       index) unpack_limit=1 ;;
+       unpack) unpack_limit=10000 ;;
+       esac
+
+       test_expect_success 'prepare destination repository' '
+               rm -fr dest &&
+               git --bare init dest
+       '
+
+       test_expect_success "set unpacklimit to $unpack_limit" '
+               git --git-dir=dest config receive.unpacklimit "$unpack_limit"
+       '
+
+       test_expect_success 'setting receive.maxInputSize to 512 rejects push' '
+               git --git-dir=dest config receive.maxInputSize 512 &&
+               test_must_fail git push dest HEAD
+       '
+
+       test_expect_success 'bumping limit to 4k allows push' '
+               git --git-dir=dest config receive.maxInputSize 4k &&
+               git push dest HEAD
+       '
+
+       test_expect_success 'prepare destination repository (again)' '
+               rm -fr dest &&
+               git --bare init dest
+       '
+
+       test_expect_success 'lifting the limit allows push' '
+               git --git-dir=dest config receive.maxInputSize 0 &&
+               git push dest HEAD
+       '
+}
+
+test_expect_success "create known-size (1024 bytes) commit" '
+       test-genrandom foo 1024 >one-k &&
+       git add one-k &&
+       test_commit one-k
+'
+
+test_pack_input_limit index
+test_pack_input_limit unpack
+
+test_done
diff --git a/t/t5547-push-quarantine.sh b/t/t5547-push-quarantine.sh
new file mode 100755 (executable)
index 0000000..113c870
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+test_description='check quarantine of objects during push'
+. ./test-lib.sh
+
+test_expect_success 'create picky dest repo' '
+       git init --bare dest.git &&
+       write_script dest.git/hooks/pre-receive <<-\EOF
+       while read old new ref; do
+               test "$(git log -1 --format=%s $new)" = reject && exit 1
+       done
+       exit 0
+       EOF
+'
+
+test_expect_success 'accepted objects work' '
+       test_commit ok &&
+       git push dest.git HEAD &&
+       commit=$(git rev-parse HEAD) &&
+       git --git-dir=dest.git cat-file commit $commit
+'
+
+test_expect_success 'rejected objects are not installed' '
+       test_commit reject &&
+       commit=$(git rev-parse HEAD) &&
+       test_must_fail git push dest.git reject &&
+       test_must_fail git --git-dir=dest.git cat-file commit $commit
+'
+
+test_expect_success 'rejected objects are removed' '
+       echo "incoming-*" >expect &&
+       (cd dest.git/objects && echo incoming-*) >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'push to repo path with path separator (colon)' '
+       # The interesting failure case here is when the
+       # receiving end cannot access its original object directory,
+       # so make it likely for us to generate a delta by having
+       # a non-trivial file with multiple versions.
+
+       test-genrandom foo 4096 >file.bin &&
+       git add file.bin &&
+       git commit -m bin &&
+
+       if test_have_prereq MINGW
+       then
+               pathsep=";"
+       else
+               pathsep=":"
+       fi &&
+       git clone --bare . "xxx${pathsep}yyy.git" &&
+
+       echo change >>file.bin &&
+       git commit -am change &&
+       # Note that we have to use the full path here, or it gets confused
+       # with the ssh host:path syntax.
+       git push "$(pwd)/xxx${pathsep}yyy.git" HEAD
+'
+
+test_expect_success 'updating a ref from quarantine is forbidden' '
+       git init --bare update.git &&
+       write_script update.git/hooks/pre-receive <<-\EOF &&
+       read old new refname
+       git update-ref refs/heads/unrelated $new
+       exit 1
+       EOF
+       test_must_fail git push update.git HEAD &&
+       git -C update.git fsck
+'
+
+test_done
index 7641417b4a3848fa9d065572e5a8248fea5c7574..8552184e741fe2465e746a3ac42d19edddb15576 100755 (executable)
@@ -20,8 +20,9 @@ test_expect_success 'create http-accessible bare repository with loose objects'
        (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
         git config core.bare true &&
         mkdir -p hooks &&
-        echo "exec git update-server-info" >hooks/post-update &&
-        chmod +x hooks/post-update &&
+        write_script "hooks/post-update" <<-\EOF &&
+        exec git update-server-info
+       EOF
         hooks/post-update
        ) &&
        git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
@@ -34,6 +35,15 @@ test_expect_success 'clone http repository' '
        test_cmp file clone/file
 '
 
+test_expect_success 'list refs from outside any repository' '
+       cat >expect <<-EOF &&
+       $(git rev-parse master) HEAD
+       $(git rev-parse master) refs/heads/master
+       EOF
+       nongit git ls-remote "$HTTPD_URL/dumb/repo.git" >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'create password-protected repository' '
        mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/" &&
        cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
@@ -307,5 +317,85 @@ test_expect_success 'remote-http complains cleanly about malformed urls' '
        test_must_fail git remote-http http::/example.com/repo.git
 '
 
+test_expect_success 'redirects can be forbidden/allowed' '
+       test_must_fail git -c http.followRedirects=false \
+               clone $HTTPD_URL/dumb-redir/repo.git dumb-redir &&
+       git -c http.followRedirects=true \
+               clone $HTTPD_URL/dumb-redir/repo.git dumb-redir 2>stderr
+'
+
+test_expect_success 'redirects are reported to stderr' '
+       # just look for a snippet of the redirected-to URL
+       test_i18ngrep /dumb/ stderr
+'
+
+test_expect_success 'non-initial redirects can be forbidden' '
+       test_must_fail git -c http.followRedirects=initial \
+               clone $HTTPD_URL/redir-objects/repo.git redir-objects &&
+       git -c http.followRedirects=true \
+               clone $HTTPD_URL/redir-objects/repo.git redir-objects
+'
+
+test_expect_success 'http.followRedirects defaults to "initial"' '
+       test_must_fail git clone $HTTPD_URL/redir-objects/repo.git default
+'
+
+# The goal is for a clone of the "evil" repository, which has no objects
+# itself, to cause the client to fetch objects from the "victim" repository.
+test_expect_success 'set up evil alternates scheme' '
+       victim=$HTTPD_DOCUMENT_ROOT_PATH/victim.git &&
+       git init --bare "$victim" &&
+       git -C "$victim" --work-tree=. commit --allow-empty -m secret &&
+       git -C "$victim" repack -ad &&
+       git -C "$victim" update-server-info &&
+       sha1=$(git -C "$victim" rev-parse HEAD) &&
+
+       evil=$HTTPD_DOCUMENT_ROOT_PATH/evil.git &&
+       git init --bare "$evil" &&
+       # do this by hand to avoid object existence check
+       printf "%s\\t%s\\n" $sha1 refs/heads/master >"$evil/info/refs"
+'
+
+# Here we'll just redirect via HTTP. In a real-world attack these would be on
+# different servers, but we should reject it either way.
+test_expect_success 'http-alternates is a non-initial redirect' '
+       echo "$HTTPD_URL/dumb/victim.git/objects" \
+               >"$evil/objects/info/http-alternates" &&
+       test_must_fail git -c http.followRedirects=initial \
+               clone $HTTPD_URL/dumb/evil.git evil-initial &&
+       git -c http.followRedirects=true \
+               clone $HTTPD_URL/dumb/evil.git evil-initial
+'
+
+# Curl supports a lot of protocols that we'd prefer not to allow
+# http-alternates to use, but it's hard to test whether curl has
+# accessed, say, the SMTP protocol, because we are not running an SMTP server.
+# But we can check that it does not allow access to file://, which would
+# otherwise allow this clone to complete.
+test_expect_success 'http-alternates cannot point at funny protocols' '
+       echo "file://$victim/objects" >"$evil/objects/info/http-alternates" &&
+       test_must_fail git -c http.followRedirects=true \
+               clone "$HTTPD_URL/dumb/evil.git" evil-file
+'
+
+test_expect_success 'http-alternates triggers not-from-user protocol check' '
+       echo "$HTTPD_URL/dumb/victim.git/objects" \
+               >"$evil/objects/info/http-alternates" &&
+       test_config_global http.followRedirects true &&
+       test_must_fail git -c protocol.http.allow=user \
+               clone $HTTPD_URL/dumb/evil.git evil-user &&
+       git -c protocol.http.allow=always \
+               clone $HTTPD_URL/dumb/evil.git evil-user
+'
+
+test_expect_success 'can redirect through non-"info/refs?service=git-upload-pack" URL' '
+       git clone "$HTTPD_URL/redir-to/dumb/repo.git"
+'
+
+test_expect_success 'print HTTP error when any intermediate redirect throws error' '
+       test_must_fail git clone "$HTTPD_URL/redir-to/502" 2> stderr &&
+       test_i18ngrep "unable to access.*/redir-to/502" stderr
+'
+
 stop_httpd
 test_done
index 1ec5b2747a2100d3ae043cde5a2436eed2d52aec..a51b7e20d32158d4b6609ba954e2ed59edaa6342 100755 (executable)
@@ -119,6 +119,10 @@ test_expect_success 'redirects re-root further requests' '
        git clone $HTTPD_URL/smart-redir-limited/repo.git repo-redir-limited
 '
 
+test_expect_success 're-rooting dies on insane schemes' '
+       test_must_fail git clone $HTTPD_URL/insane-redir/repo.git insane
+'
+
 test_expect_success 'clone from password-protected repository' '
        echo two >expect &&
        set_askpass user@host pass@host &&
@@ -276,6 +280,58 @@ test_expect_success 'large fetch-pack requests can be split across POSTs' '
        test_line_count = 2 posts
 '
 
+test_expect_success 'test allowreachablesha1inwant' '
+       test_when_finished "rm -rf test_reachable.git" &&
+       server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+       master_sha=$(git -C "$server" rev-parse refs/heads/master) &&
+       git -C "$server" config uploadpack.allowreachablesha1inwant 1 &&
+
+       git init --bare test_reachable.git &&
+       git -C test_reachable.git remote add origin "$HTTPD_URL/smart/repo.git" &&
+       git -C test_reachable.git fetch origin "$master_sha"
+'
+
+test_expect_success 'test allowreachablesha1inwant with unreachable' '
+       test_when_finished "rm -rf test_reachable.git; git reset --hard $(git rev-parse HEAD)" &&
+
+       #create unreachable sha
+       echo content >file2 &&
+       git add file2 &&
+       git commit -m two &&
+       git push public HEAD:refs/heads/doomed &&
+       git push public :refs/heads/doomed &&
+
+       server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+       master_sha=$(git -C "$server" rev-parse refs/heads/master) &&
+       git -C "$server" config uploadpack.allowreachablesha1inwant 1 &&
+
+       git init --bare test_reachable.git &&
+       git -C test_reachable.git remote add origin "$HTTPD_URL/smart/repo.git" &&
+       test_must_fail git -C test_reachable.git fetch origin "$(git rev-parse HEAD)"
+'
+
+test_expect_success 'test allowanysha1inwant with unreachable' '
+       test_when_finished "rm -rf test_reachable.git; git reset --hard $(git rev-parse HEAD)" &&
+
+       #create unreachable sha
+       echo content >file2 &&
+       git add file2 &&
+       git commit -m two &&
+       git push public HEAD:refs/heads/doomed &&
+       git push public :refs/heads/doomed &&
+
+       server="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+       master_sha=$(git -C "$server" rev-parse refs/heads/master) &&
+       git -C "$server" config uploadpack.allowreachablesha1inwant 1 &&
+
+       git init --bare test_reachable.git &&
+       git -C test_reachable.git remote add origin "$HTTPD_URL/smart/repo.git" &&
+       test_must_fail git -C test_reachable.git fetch origin "$(git rev-parse HEAD)" &&
+
+       git -C "$server" config uploadpack.allowanysha1inwant 1 &&
+       git -C test_reachable.git fetch origin "$(git rev-parse HEAD)"
+'
+
 test_expect_success EXPENSIVE 'http can handle enormous ref negotiation' '
        (
                cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
diff --git a/t/t5580-clone-push-unc.sh b/t/t5580-clone-push-unc.sh
new file mode 100755 (executable)
index 0000000..b195f71
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+test_description='various UNC path tests (Windows-only)'
+. ./test-lib.sh
+
+if ! test_have_prereq MINGW; then
+       skip_all='skipping UNC path tests, requires Windows'
+       test_done
+fi
+
+UNCPATH="$(pwd)"
+case "$UNCPATH" in
+[A-Z]:*)
+       # Use administrative share e.g. \\localhost\C$\git-sdk-64\usr\src\git
+       # (we use forward slashes here because MSYS2 and Git accept them, and
+       # they are easier on the eyes)
+       UNCPATH="//localhost/${UNCPATH%%:*}\$/${UNCPATH#?:}"
+       test -d "$UNCPATH" || {
+               skip_all='could not access administrative share; skipping'
+               test_done
+       }
+       ;;
+*)
+       skip_all='skipping UNC path tests, cannot determine current path as UNC'
+       test_done
+       ;;
+esac
+
+test_expect_success setup '
+       test_commit initial
+'
+
+test_expect_success clone '
+       git clone "file://$UNCPATH" clone
+'
+
+test_expect_success push '
+       (
+               cd clone &&
+               git checkout -b to-push &&
+               test_commit to-push &&
+               git push origin HEAD
+       ) &&
+       rev="$(git -C clone rev-parse --verify refs/heads/to-push)" &&
+       test "$rev" = "$(git rev-parse --verify refs/heads/to-push)"
+'
+
+test_done
index a43339420019718b76963d5ced92ebb981b0f0ed..9c56f771b619e4bb931ce3d34a5f9325b8f61e90 100755 (executable)
@@ -151,7 +151,7 @@ test_expect_success 'clone --mirror does not repeat tags' '
        git clone --mirror src mirror2 &&
        (cd mirror2 &&
         git show-ref 2> clone.err > clone.out) &&
-       test_must_fail grep Duplicate mirror2/clone.err &&
+       ! grep Duplicate mirror2/clone.err &&
        grep some-tag mirror2/clone.out
 
 '
@@ -386,6 +386,53 @@ test_expect_success 'tortoiseplink is like putty, with extra arguments' '
        expect_ssh "-batch -P 123" myhost src
 '
 
+test_expect_success 'double quoted plink.exe in GIT_SSH_COMMAND' '
+       copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink.exe" &&
+       GIT_SSH_COMMAND="\"$TRASH_DIRECTORY/plink.exe\" -v" \
+               git clone "[myhost:123]:src" ssh-bracket-clone-plink-3 &&
+       expect_ssh "-v -P 123" myhost src
+'
+
+SQ="'"
+test_expect_success 'single quoted plink.exe in GIT_SSH_COMMAND' '
+       copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink.exe" &&
+       GIT_SSH_COMMAND="$SQ$TRASH_DIRECTORY/plink.exe$SQ -v" \
+               git clone "[myhost:123]:src" ssh-bracket-clone-plink-4 &&
+       expect_ssh "-v -P 123" myhost src
+'
+
+test_expect_success 'GIT_SSH_VARIANT overrides plink detection' '
+       copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink" &&
+       GIT_SSH_VARIANT=ssh \
+       git clone "[myhost:123]:src" ssh-bracket-clone-variant-1 &&
+       expect_ssh "-p 123" myhost src
+'
+
+test_expect_success 'ssh.variant overrides plink detection' '
+       copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink" &&
+       git -c ssh.variant=ssh \
+               clone "[myhost:123]:src" ssh-bracket-clone-variant-2 &&
+       expect_ssh "-p 123" myhost src
+'
+
+test_expect_success 'GIT_SSH_VARIANT overrides plink detection to plink' '
+       GIT_SSH_VARIANT=plink \
+       git clone "[myhost:123]:src" ssh-bracket-clone-variant-3 &&
+       expect_ssh "-P 123" myhost src
+'
+
+test_expect_success 'GIT_SSH_VARIANT overrides plink to tortoiseplink' '
+       GIT_SSH_VARIANT=tortoiseplink \
+       git clone "[myhost:123]:src" ssh-bracket-clone-variant-4 &&
+       expect_ssh "-batch -P 123" myhost src
+'
+
+test_expect_success 'clean failure on broken quoting' '
+       test_must_fail \
+               env GIT_SSH_COMMAND="${SQ}plink.exe -v" \
+               git clone "[myhost:123]:src" sq-failure
+'
+
 # Reset the GIT_SSH environment variable for clone tests.
 setup_ssh_wrapper
 
index e4850b778c2f20df02ce187cc8cd057df2759d7d..39329eb7a8a64b177794b83ef8828b866fead547 100755 (executable)
@@ -19,6 +19,14 @@ test_expect_success 'clone -c can set multi-keys' '
        test_cmp expect actual
 '
 
+test_expect_success 'clone -c can set multi-keys, including some empty' '
+       rm -rf child &&
+       git clone -c credential.helper= -c credential.helper=hi . child &&
+       printf "%s\n" "" hi >expect &&
+       git --git-dir=child/.git config --get-all credential.helper >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'clone -c without a value is boolean true' '
        rm -rf child &&
        git clone -c core.foo . child &&
index 9cd2626dba885b6ebf34ae8efccecf005c95f438..895f46bb9118bbf15d32f594ce79f0e638d25b6a 100755 (executable)
 test_description='test transitive info/alternate entries'
 . ./test-lib.sh
 
-# test that a file is not reachable in the current repository
-# but that it is after creating a info/alternate entry
-reachable_via() {
-       alternate="$1"
-       file="$2"
-       if git cat-file -e "HEAD:$file"; then return 1; fi
-       echo "$alternate" >> .git/objects/info/alternate
-       git cat-file -e "HEAD:$file"
-}
-
-test_valid_repo() {
-       git fsck --full > fsck.log &&
-       test_line_count = 0 fsck.log
-}
-
-base_dir=$(pwd)
-
-test_expect_success 'preparing first repository' \
-'test_create_repo A && cd A &&
-echo "Hello World" > file1 &&
-git add file1 &&
-git commit -m "Initial commit" file1 &&
-git repack -a -d &&
-git prune'
-
-cd "$base_dir"
-
-test_expect_success 'preparing second repository' \
-'git clone -l -s A B && cd B &&
-echo "foo bar" > file2 &&
-git add file2 &&
-git commit -m "next commit" file2 &&
-git repack -a -d -l &&
-git prune'
-
-cd "$base_dir"
-
-test_expect_success 'preparing third repository' \
-'git clone -l -s B C && cd C &&
-echo "Goodbye, cruel world" > file3 &&
-git add file3 &&
-git commit -m "one more" file3 &&
-git repack -a -d -l &&
-git prune'
-
-cd "$base_dir"
-
-test_expect_success 'creating too deep nesting' \
-'git clone -l -s C D &&
-git clone -l -s D E &&
-git clone -l -s E F &&
-git clone -l -s F G &&
-git clone --bare -l -s G H'
-
-test_expect_success 'invalidity of deepest repository' \
-'cd H && {
-       test_valid_repo
-       test $? -ne 0
-}'
-
-cd "$base_dir"
+test_expect_success 'preparing first repository' '
+       test_create_repo A && (
+               cd A &&
+               echo "Hello World" > file1 &&
+               git add file1 &&
+               git commit -m "Initial commit" file1 &&
+               git repack -a -d &&
+               git prune
+       )
+'
 
-test_expect_success 'validity of third repository' \
-'cd C &&
-test_valid_repo'
+test_expect_success 'preparing second repository' '
+       git clone -l -s A B && (
+               cd B &&
+               echo "foo bar" > file2 &&
+               git add file2 &&
+               git commit -m "next commit" file2 &&
+               git repack -a -d -l &&
+               git prune
+       )
+'
 
-cd "$base_dir"
+test_expect_success 'preparing third repository' '
+       git clone -l -s B C && (
+               cd C &&
+               echo "Goodbye, cruel world" > file3 &&
+               git add file3 &&
+               git commit -m "one more" file3 &&
+               git repack -a -d -l &&
+               git prune
+       )
+'
 
-test_expect_success 'validity of fourth repository' \
-'cd D &&
-test_valid_repo'
+test_expect_success 'count-objects shows the alternates' '
+       cat >expect <<-EOF &&
+       alternate: $(pwd)/B/.git/objects
+       alternate: $(pwd)/A/.git/objects
+       EOF
+       git -C C count-objects -v >actual &&
+       grep ^alternate: actual >actual.alternates &&
+       test_cmp expect actual.alternates
+'
 
-cd "$base_dir"
+# Note: These tests depend on the hard-coded value of 5 as the maximum depth
+# we will follow recursion. We start the depth at 0 and count links, not
+# repositories. This means that in a chain like:
+#
+#   A --> B --> C --> D --> E --> F --> G --> H
+#      0     1     2     3     4     5     6
+#
+# we are OK at "G", but break at "H", even though "H" is actually the 8th
+# repository, not the 6th, which you might expect. Counting the links allows
+# N+1 repositories, and counting from 0 to 5 inclusive allows 6 links.
+#
+# Note also that we must use "--bare -l" to make the link to H. The "-l"
+# ensures we do not do a connectivity check, and the "--bare" makes sure
+# we do not try to checkout the result (which needs objects), either of
+# which would cause the clone to fail.
+test_expect_success 'creating too deep nesting' '
+       git clone -l -s C D &&
+       git clone -l -s D E &&
+       git clone -l -s E F &&
+       git clone -l -s F G &&
+       git clone --bare -l -s G H
+'
 
-test_expect_success 'breaking of loops' \
-'echo "$base_dir"/B/.git/objects >> "$base_dir"/A/.git/objects/info/alternates&&
-cd C &&
-test_valid_repo'
+test_expect_success 'validity of seventh repository' '
+       git -C G fsck
+'
 
-cd "$base_dir"
+test_expect_success 'invalidity of eighth repository' '
+       test_must_fail git -C H fsck
+'
 
-test_expect_success 'that info/alternates is necessary' \
-'cd C &&
-rm -f .git/objects/info/alternates &&
-! (test_valid_repo)'
+test_expect_success 'breaking of loops' '
+       echo "$(pwd)"/B/.git/objects >>A/.git/objects/info/alternates &&
+       git -C C fsck
+'
 
-cd "$base_dir"
+test_expect_success 'that info/alternates is necessary' '
+       rm -f C/.git/objects/info/alternates &&
+       test_must_fail git -C C fsck
+'
 
-test_expect_success 'that relative alternate is possible for current dir' \
-'cd C &&
-echo "../../../B/.git/objects" > .git/objects/info/alternates &&
-test_valid_repo'
+test_expect_success 'that relative alternate is possible for current dir' '
+       echo "../../../B/.git/objects" >C/.git/objects/info/alternates &&
+       git fsck
+'
 
-cd "$base_dir"
+test_expect_success 'that relative alternate is recursive' '
+       git -C D fsck
+'
 
-test_expect_success \
-    'that relative alternate is only possible for current dir' '
-    cd D &&
-    ! (test_valid_repo)
+# we can reach "A" from our new repo both directly, and via "C".
+# The deep/subdir is there to make sure we are not doing a stupid
+# pure-text comparison of the alternate names.
+test_expect_success 'relative duplicates are eliminated' '
+       mkdir -p deep/subdir &&
+       git init --bare deep/subdir/duplicate.git &&
+       cat >deep/subdir/duplicate.git/objects/info/alternates <<-\EOF &&
+       ../../../../C/.git/objects
+       ../../../../A/.git/objects
+       EOF
+       cat >expect <<-EOF &&
+       alternate: $(pwd)/C/.git/objects
+       alternate: $(pwd)/B/.git/objects
+       alternate: $(pwd)/A/.git/objects
+       EOF
+       git -C deep/subdir/duplicate.git count-objects -v >actual &&
+       grep ^alternate: actual >actual.alternates &&
+       test_cmp expect actual.alternates
 '
 
-cd "$base_dir"
+test_expect_success CASE_INSENSITIVE_FS 'dup finding can be case-insensitive' '
+       git init --bare insensitive.git &&
+       # the previous entry for "A" will have used uppercase
+       cat >insensitive.git/objects/info/alternates <<-\EOF &&
+       ../../C/.git/objects
+       ../../a/.git/objects
+       EOF
+       cat >expect <<-EOF &&
+       alternate: $(pwd)/C/.git/objects
+       alternate: $(pwd)/B/.git/objects
+       alternate: $(pwd)/A/.git/objects
+       EOF
+       git -C insensitive.git count-objects -v >actual &&
+       grep ^alternate: actual >actual.alternates &&
+       test_cmp expect actual.alternates
+'
 
 test_done
diff --git a/t/t5615-alternate-env.sh b/t/t5615-alternate-env.sh
new file mode 100755 (executable)
index 0000000..d2d883f
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/sh
+
+test_description='handling of alternates in environment variables'
+. ./test-lib.sh
+
+check_obj () {
+       alt=$1; shift
+       while read obj expect
+       do
+               echo "$obj" >&3 &&
+               echo "$obj $expect" >&4
+       done 3>input 4>expect &&
+       GIT_ALTERNATE_OBJECT_DIRECTORIES=$alt \
+               git "$@" cat-file --batch-check='%(objectname) %(objecttype)' \
+               <input >actual &&
+       test_cmp expect actual
+}
+
+test_expect_success 'create alternate repositories' '
+       git init --bare one.git &&
+       one=$(echo one | git -C one.git hash-object -w --stdin) &&
+       git init --bare two.git &&
+       two=$(echo two | git -C two.git hash-object -w --stdin)
+'
+
+test_expect_success 'objects inaccessible without alternates' '
+       check_obj "" <<-EOF
+       $one missing
+       $two missing
+       EOF
+'
+
+test_expect_success 'access alternate via absolute path' '
+       check_obj "$PWD/one.git/objects" <<-EOF
+       $one blob
+       $two missing
+       EOF
+'
+
+test_expect_success 'access multiple alternates' '
+       check_obj "$PWD/one.git/objects:$PWD/two.git/objects" <<-EOF
+       $one blob
+       $two blob
+       EOF
+'
+
+# bare paths are relative from $GIT_DIR
+test_expect_success 'access alternate via relative path (bare)' '
+       git init --bare bare.git &&
+       check_obj "../one.git/objects" -C bare.git <<-EOF
+       $one blob
+       EOF
+'
+
+# non-bare paths are relative to top of worktree
+test_expect_success 'access alternate via relative path (worktree)' '
+       git init worktree &&
+       check_obj "../one.git/objects" -C worktree <<-EOF
+       $one blob
+       EOF
+'
+
+# path is computed after moving to top-level of worktree
+test_expect_success 'access alternate via relative path (subdir)' '
+       mkdir subdir &&
+       check_obj "one.git/objects" -C subdir <<-EOF
+       $one blob
+       EOF
+'
+
+# set variables outside test to avoid quote insanity; the \057 is '/',
+# which doesn't need quoting, but just confirms that de-quoting
+# is working.
+quoted='"one.git\057objects"'
+unquoted='two.git/objects'
+test_expect_success 'mix of quoted and unquoted alternates' '
+       check_obj "$quoted:$unquoted" <<-EOF
+       $one blob
+       $two blob
+       EOF
+'
+
+test_expect_success !MINGW 'broken quoting falls back to interpreting raw' '
+       mv one.git \"one.git &&
+       check_obj \"one.git/objects <<-EOF
+       $one blob
+       EOF
+'
+
+test_done
index b7a7f9d5886f1e2f3fc2d65bfcf1785b890638ac..c6c2661878c0ca8a22ad11e1229a664f3d009fee 100755 (executable)
@@ -4,6 +4,7 @@ test_description='ext::cmd remote "connect" helper'
 . ./test-lib.sh
 
 test_expect_success setup '
+       git config --global protocol.ext.allow user &&
        test_tick &&
        git commit --allow-empty -m initial &&
        test_tick &&
index 0d105d54174e061b20707de808b284314f730667..d911afd24cd7d43fc412adb34144b90b66082b73 100755 (executable)
@@ -18,6 +18,7 @@ test_proto "smart http" http "$HTTPD_URL/smart/repo.git"
 
 test_expect_success 'curl redirects respect whitelist' '
        test_must_fail env GIT_ALLOW_PROTOCOL=http:https \
+                          GIT_SMART_HTTP=0 \
                git clone "$HTTPD_URL/ftp-redir/repo.git" 2>stderr &&
        {
                test_i18ngrep "ftp.*disabled" stderr ||
@@ -29,5 +30,12 @@ test_expect_success 'curl limits redirects' '
        test_must_fail git clone "$HTTPD_URL/loop-redir/smart/repo.git"
 '
 
+test_expect_success 'http can be limited to from-user' '
+       git -c protocol.http.allow=user \
+               clone "$HTTPD_URL/smart/repo.git" plain.git &&
+       test_must_fail git -c protocol.http.allow=user \
+               clone "$HTTPD_URL/smart-redir-perm/repo.git" redir.git
+'
+
 stop_httpd
 test_done
index 3e752ce03280ff694fedb6657fe2ed334127f253..969e4e9e5261640dc690806ed06f8e58e760633f 100755 (executable)
@@ -100,4 +100,18 @@ test_expect_success '--bisect and --first-parent can not be combined' '
        test_must_fail git rev-list --bisect --first-parent HEAD
 '
 
+test_expect_success '--header shows a NUL after each commit' '
+       # We know that there is no Q in the true payload; names and
+       # addresses of the authors and the committers do not have
+       # any, and object names or header names do not, either.
+       git rev-list --header --max-count=2 HEAD |
+       nul_to_q |
+       grep "^Q" >actual &&
+       cat >expect <<-EOF &&
+       Q$(git rev-parse HEAD~1)
+       Q
+       EOF
+       test_cmp expect actual
+'
+
 test_done
index 1408b608eb030f0e6bcc3d531aad426da5f06b12..29597451967dd7e4847a5114b79a91399e1b3ab3 100755 (executable)
@@ -99,6 +99,44 @@ test_expect_success '--cherry-pick bar does not come up empty (II)' '
        test_cmp actual.named expect
 '
 
+test_expect_success 'name-rev multiple --refs combine inclusive' '
+       git rev-list --left-right --cherry-pick F...E -- bar >actual &&
+       git name-rev --stdin --name-only --refs="*tags/F" --refs="*tags/E" \
+               <actual >actual.named &&
+       test_cmp actual.named expect
+'
+
+cat >expect <<EOF
+<tags/F
+EOF
+
+test_expect_success 'name-rev --refs excludes non-matched patterns' '
+       git rev-list --left-right --right-only --cherry-pick F...E -- bar >>expect &&
+       git rev-list --left-right --cherry-pick F...E -- bar >actual &&
+       git name-rev --stdin --name-only --refs="*tags/F" \
+               <actual >actual.named &&
+       test_cmp actual.named expect
+'
+
+cat >expect <<EOF
+<tags/F
+EOF
+
+test_expect_success 'name-rev --exclude excludes matched patterns' '
+       git rev-list --left-right --right-only --cherry-pick F...E -- bar >>expect &&
+       git rev-list --left-right --cherry-pick F...E -- bar >actual &&
+       git name-rev --stdin --name-only --refs="*tags/*" --exclude="*E" \
+               <actual >actual.named &&
+       test_cmp actual.named expect
+'
+
+test_expect_success 'name-rev --no-refs clears the refs list' '
+       git rev-list --left-right --cherry-pick F...E -- bar >expect &&
+       git name-rev --stdin --name-only --refs="*tags/F" --refs="*tags/E" --no-refs --refs="*tags/G" \
+               <expect >actual &&
+       test_cmp actual expect
+'
+
 cat >expect <<EOF
 +tags/F
 =tags/D
index 5e5370feb40c851fa29bdec17d687eb5f22502bb..8c2c6eaef83fe90d1faa088fe65ee4a851b1e471 100755 (executable)
@@ -407,7 +407,7 @@ test_expect_success 'good merge base when good and bad are siblings' '
        test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
        grep $HASH4 my_bisect_log.txt &&
        git bisect good > my_bisect_log.txt &&
-       test_must_fail grep "merge base must be tested" my_bisect_log.txt &&
+       ! grep "merge base must be tested" my_bisect_log.txt &&
        grep $HASH6 my_bisect_log.txt &&
        git bisect reset
 '
index 3d5c238c8150c13b1244f8c4208856714265245a..97a07655a0e0d74747259498bfbb8d03ea6c7480 100755 (executable)
@@ -44,7 +44,7 @@ b1 [ahead 1, behind 1] d
 b2 [ahead 1, behind 1] d
 b3 [behind 1] b
 b4 [ahead 2] f
-b5 g
+b5 [gone] g
 b6 c
 EOF
 
diff --git a/t/t6045-merge-rename-delete.sh b/t/t6045-merge-rename-delete.sh
new file mode 100755 (executable)
index 0000000..5d33577
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+test_description='Merge-recursive rename/delete conflict message'
+. ./test-lib.sh
+
+test_expect_success 'rename/delete' '
+       echo foo >A &&
+       git add A &&
+       git commit -m "initial" &&
+
+       git checkout -b rename &&
+       git mv A B &&
+       git commit -m "rename" &&
+
+       git checkout master &&
+       git rm A &&
+       git commit -m "delete" &&
+
+       test_must_fail git merge --strategy=recursive rename >output &&
+       test_i18ngrep "CONFLICT (rename/delete): A deleted in HEAD and renamed to B in rename. Version rename of B left in tree." output
+'
+
+test_done
index 1c6952d04936b190c9cf42024519273b00747113..8c617981a3a06c1ff49f03a2914bfdc31c0e293c 100755 (executable)
@@ -83,12 +83,24 @@ test_expect_success 'final^1^@ = final^1^1 final^1^2' '
        test_cmp expect actual
 '
 
+test_expect_success 'symbolic final^1^@ = final^1^1 final^1^2' '
+       git rev-parse --symbolic final^1^1 final^1^2 >expect &&
+       git rev-parse --symbolic final^1^@ >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'final^1^! = final^1 ^final^1^1 ^final^1^2' '
        git rev-parse final^1 ^final^1^1 ^final^1^2 >expect &&
        git rev-parse final^1^! >actual &&
        test_cmp expect actual
 '
 
+test_expect_success 'symbolic final^1^! = final^1 ^final^1^1 ^final^1^2' '
+       git rev-parse --symbolic final^1 ^final^1^1 ^final^1^2 >expect &&
+       git rev-parse --symbolic final^1^! >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'large graft octopus' '
        test_cmp_rev_output b31 "git rev-parse --verify b1^30"
 '
@@ -102,4 +114,104 @@ test_expect_success 'short SHA-1 works' '
        test_cmp_rev_output start "git rev-parse ${start%?}"
 '
 
+# rev^- tests; we can use a simpler setup for these
+
+test_expect_success 'setup for rev^- tests' '
+       test_commit one &&
+       test_commit two &&
+       test_commit three &&
+
+       # Merge in a branch for testing rev^-
+       git checkout -b branch &&
+       git checkout HEAD^^ &&
+       git merge -m merge --no-edit --no-ff branch &&
+       git checkout -b merge
+'
+
+# The merged branch has 2 commits + the merge
+test_expect_success 'rev-list --count merge^- = merge^..merge' '
+       git rev-list --count merge^..merge >expect &&
+       echo 3 >actual &&
+       test_cmp expect actual
+'
+
+# All rev^- rev-parse tests
+
+test_expect_success 'rev-parse merge^- = merge^..merge' '
+       git rev-parse merge^..merge >expect &&
+       git rev-parse merge^- >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-parse merge^-1 = merge^..merge' '
+       git rev-parse merge^1..merge >expect &&
+       git rev-parse merge^-1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-parse merge^-2 = merge^2..merge' '
+       git rev-parse merge^2..merge >expect &&
+       git rev-parse merge^-2 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'symbolic merge^-1 = merge^1..merge' '
+       git rev-parse --symbolic merge^1..merge >expect &&
+       git rev-parse --symbolic merge^-1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-parse merge^-0 (invalid parent)' '
+       test_must_fail git rev-parse merge^-0
+'
+
+test_expect_success 'rev-parse merge^-3 (invalid parent)' '
+       test_must_fail git rev-parse merge^-3
+'
+
+test_expect_success 'rev-parse merge^-^ (garbage after ^-)' '
+       test_must_fail git rev-parse merge^-^
+'
+
+test_expect_success 'rev-parse merge^-1x (garbage after ^-1)' '
+       test_must_fail git rev-parse merge^-1x
+'
+
+# All rev^- rev-list tests (should be mostly the same as rev-parse; the reason
+# for the duplication is that rev-parse and rev-list use different parsers).
+
+test_expect_success 'rev-list merge^- = merge^..merge' '
+       git rev-list merge^..merge >expect &&
+       git rev-list merge^- >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-list merge^-1 = merge^1..merge' '
+       git rev-list merge^1..merge >expect &&
+       git rev-list merge^-1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-list merge^-2 = merge^2..merge' '
+       git rev-list merge^2..merge >expect &&
+       git rev-list merge^-2 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-list merge^-0 (invalid parent)' '
+       test_must_fail git rev-list merge^-0
+'
+
+test_expect_success 'rev-list merge^-3 (invalid parent)' '
+       test_must_fail git rev-list merge^-3
+'
+
+test_expect_success 'rev-list merge^-^ (garbage after ^-)' '
+       test_must_fail git rev-list merge^-^
+'
+
+test_expect_success 'rev-list merge^-1x (garbage after ^-1)' '
+       test_must_fail git rev-list merge^-1x
+'
+
 test_done
index 85f269411cb3aed461f6894dc5d1cc780debc24b..16952e44fcfd705e115b81099bdbff809ff1520d 100755 (executable)
@@ -182,6 +182,10 @@ check_describe "test2-lightweight-*" --tags --match="test2-*"
 
 check_describe "test2-lightweight-*" --long --tags --match="test2-*" HEAD^
 
+check_describe "test1-lightweight-*" --long --tags --match="test1-*" --match="test2-*" HEAD^
+
+check_describe "test2-lightweight-*" --long --tags --match="test1-*" --no-match --match="test2-*" HEAD^
+
 test_expect_success 'name-rev with exact tags' '
        echo A >expect &&
        tag_object=$(git rev-parse refs/tags/A) &&
@@ -206,4 +210,47 @@ test_expect_success 'describe --contains with the exact tags' '
        test_cmp expect actual
 '
 
+test_expect_success 'describe --contains and --match' '
+       echo "A^0" >expect &&
+       tagged_commit=$(git rev-parse "refs/tags/A^0") &&
+       test_must_fail git describe --contains --match="B" $tagged_commit &&
+       git describe --contains --match="B" --match="A" $tagged_commit >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'describe --exclude' '
+       echo "c~1" >expect &&
+       tagged_commit=$(git rev-parse "refs/tags/A^0") &&
+       test_must_fail git describe --contains --match="B" $tagged_commit &&
+       git describe --contains --match="?" --exclude="A" $tagged_commit >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'describe --contains and --no-match' '
+       echo "A^0" >expect &&
+       tagged_commit=$(git rev-parse "refs/tags/A^0") &&
+       git describe --contains --match="B" --no-match $tagged_commit >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'setup and absorb a submodule' '
+       test_create_repo sub1 &&
+       test_commit -C sub1 initial &&
+       git submodule add ./sub1 &&
+       git submodule absorbgitdirs &&
+       git commit -a -m "add submodule" &&
+       git describe --dirty >expect &&
+       git describe --broken >out &&
+       test_cmp expect out
+'
+
+test_expect_success 'describe chokes on severly broken submodules' '
+       mv .git/modules/sub1/ .git/modules/sub_moved &&
+       test_must_fail git describe --dirty
+'
+test_expect_success 'describe ignoring a borken submodule' '
+       git describe --broken >out &&
+       grep broken out
+'
+
 test_done
index d51595cf6b189a59d271dcc69c3f245b72dcb8f6..9dd5cde5fc53deb365234e815d7142de9a975005 100755 (executable)
@@ -25,8 +25,10 @@ EOF
        test_cmp expect actual
 '
 
-test_expect_success 'exclude only should error out' '
-       test_must_fail git log --oneline --format=%s -- ":(exclude)sub"
+test_expect_success 'exclude only no longer errors out' '
+       git log --oneline --format=%s -- . ":(exclude)sub" >expect &&
+       git log --oneline --format=%s -- ":(exclude)sub" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 't_e_i() exclude sub' '
diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh
new file mode 100755 (executable)
index 0000000..99a8982
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description='test case exclude pathspec'
+
+. ./test-lib.sh
+
+test_expect_success 'setup a submodule' '
+       test_create_repo pretzel &&
+       : >pretzel/a &&
+       git -C pretzel add a &&
+       git -C pretzel commit -m "add a file" -- a &&
+       git submodule add ./pretzel sub &&
+       git commit -a -m "add submodule" &&
+       git submodule deinit --all
+'
+
+cat <<EOF >expect
+fatal: Pathspec 'sub/a' is in submodule 'sub'
+EOF
+
+test_expect_success 'error message for path inside submodule' '
+       echo a >sub/a &&
+       test_must_fail git add sub/a 2>actual &&
+       test_i18ncmp expect actual
+'
+
+cat <<EOF >expect
+fatal: Pathspec '.' is in submodule 'sub'
+EOF
+
+test_expect_success 'error message for path inside submodule from within submodule' '
+       test_must_fail git -C sub add . 2>actual &&
+       test_i18ncmp expect actual
+'
+
+test_done
diff --git a/t/t6135-pathspec-with-attrs.sh b/t/t6135-pathspec-with-attrs.sh
new file mode 100755 (executable)
index 0000000..77b8cef
--- /dev/null
@@ -0,0 +1,200 @@
+#!/bin/sh
+
+test_description='test labels in pathspecs'
+. ./test-lib.sh
+
+test_expect_success 'setup a tree' '
+       cat <<-\EOF >expect &&
+       fileA
+       fileAB
+       fileAC
+       fileB
+       fileBC
+       fileC
+       fileNoLabel
+       fileSetLabel
+       fileUnsetLabel
+       fileValue
+       fileWrongLabel
+       sub/fileA
+       sub/fileAB
+       sub/fileAC
+       sub/fileB
+       sub/fileBC
+       sub/fileC
+       sub/fileNoLabel
+       sub/fileSetLabel
+       sub/fileUnsetLabel
+       sub/fileValue
+       sub/fileWrongLabel
+       EOF
+       mkdir sub &&
+       while read path
+       do
+               : >$path &&
+               git add $path || return 1
+       done <expect &&
+       git commit -m "initial commit" &&
+       git ls-files >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'pathspec with no attr' '
+       test_must_fail git ls-files ":(attr:)"
+'
+
+test_expect_success 'pathspec with labels and non existent .gitattributes' '
+       git ls-files ":(attr:label)" >actual &&
+       test_must_be_empty actual
+'
+
+test_expect_success 'setup .gitattributes' '
+       cat <<-\EOF >.gitattributes &&
+       fileA labelA
+       fileB labelB
+       fileC labelC
+       fileAB labelA labelB
+       fileAC labelA labelC
+       fileBC labelB labelC
+       fileUnsetLabel -label
+       fileSetLabel label
+       fileValue label=foo
+       fileWrongLabel label☺
+       EOF
+       git add .gitattributes &&
+       git commit -m "add attributes"
+'
+
+test_expect_success 'check specific set attr' '
+       cat <<-\EOF >expect &&
+       fileSetLabel
+       sub/fileSetLabel
+       EOF
+       git ls-files ":(attr:label)" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'check specific unset attr' '
+       cat <<-\EOF >expect &&
+       fileUnsetLabel
+       sub/fileUnsetLabel
+       EOF
+       git ls-files ":(attr:-label)" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'check specific value attr' '
+       cat <<-\EOF >expect &&
+       fileValue
+       sub/fileValue
+       EOF
+       git ls-files ":(attr:label=foo)" >actual &&
+       test_cmp expect actual &&
+       git ls-files ":(attr:label=bar)" >actual &&
+       test_must_be_empty actual
+'
+
+test_expect_success 'check unspecified attr' '
+       cat <<-\EOF >expect &&
+       .gitattributes
+       fileA
+       fileAB
+       fileAC
+       fileB
+       fileBC
+       fileC
+       fileNoLabel
+       fileWrongLabel
+       sub/fileA
+       sub/fileAB
+       sub/fileAC
+       sub/fileB
+       sub/fileBC
+       sub/fileC
+       sub/fileNoLabel
+       sub/fileWrongLabel
+       EOF
+       git ls-files ":(attr:!label)" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'check multiple unspecified attr' '
+       cat <<-\EOF >expect &&
+       .gitattributes
+       fileC
+       fileNoLabel
+       fileWrongLabel
+       sub/fileC
+       sub/fileNoLabel
+       sub/fileWrongLabel
+       EOF
+       git ls-files ":(attr:!labelB !labelA !label)" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'check label with more labels but excluded path' '
+       cat <<-\EOF >expect &&
+       fileAB
+       fileB
+       fileBC
+       EOF
+       git ls-files ":(attr:labelB)" ":(exclude)sub/" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'check label excluding other labels' '
+       cat <<-\EOF >expect &&
+       fileAB
+       fileB
+       fileBC
+       sub/fileAB
+       sub/fileB
+       EOF
+       git ls-files ":(attr:labelB)" ":(exclude,attr:labelC)sub/" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'fail on multiple attr specifiers in one pathspec item' '
+       test_must_fail git ls-files . ":(attr:labelB,attr:labelC)" 2>actual &&
+       test_i18ngrep "Only one" actual
+'
+
+test_expect_success 'fail if attr magic is used places not implemented' '
+       # The main purpose of this test is to check that we actually fail
+       # when you attempt to use attr magic in commands that do not implement
+       # attr magic. This test does not advocate git-add to stay that way,
+       # though, but git-add is convenient as it has its own internal pathspec
+       # parsing.
+       test_must_fail git add ":(attr:labelB)" 2>actual &&
+       test_i18ngrep "unsupported magic" actual
+'
+
+test_expect_success 'abort on giving invalid label on the command line' '
+       test_must_fail git ls-files . ":(attr:☺)"
+'
+
+test_expect_success 'abort on asking for wrong magic' '
+       test_must_fail git ls-files . ":(attr:-label=foo)" &&
+       test_must_fail git ls-files . ":(attr:!label=foo)"
+'
+
+test_expect_success 'check attribute list' '
+       cat <<-EOF >>.gitattributes &&
+       * whitespace=indent,trail,space
+       EOF
+       git ls-files ":(attr:whitespace=indent\,trail\,space)" >actual &&
+       git ls-files >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success 'backslash cannot be the last character' '
+       test_must_fail git ls-files ":(attr:label=foo\\ labelA=bar)" 2>actual &&
+       test_i18ngrep "not allowed as last character in attr value" actual
+'
+
+test_expect_success 'backslash cannot be used as a value' '
+       test_must_fail git ls-files ":(attr:label=f\\\oo)" 2>actual &&
+       test_i18ngrep "for value matching" actual
+'
+
+test_done
index 19a2823025e794a6adc3f75d65dd175a2021f282..834a9ed168fad35258955447326e7d3d1f09b7d1 100755 (executable)
@@ -38,6 +38,7 @@ test_atom() {
        case "$1" in
                head) ref=refs/heads/master ;;
                 tag) ref=refs/tags/testtag ;;
+                sym) ref=refs/heads/sym ;;
                   *) ref=$1 ;;
        esac
        printf '%s\n' "$3" >expected
@@ -50,16 +51,40 @@ test_atom() {
 
 test_atom head refname refs/heads/master
 test_atom head refname:short master
+test_atom head refname:lstrip=1 heads/master
+test_atom head refname:lstrip=2 master
+test_atom head refname:lstrip=-1 master
+test_atom head refname:lstrip=-2 heads/master
+test_atom head refname:rstrip=1 refs/heads
+test_atom head refname:rstrip=2 refs
+test_atom head refname:rstrip=-1 refs
+test_atom head refname:rstrip=-2 refs/heads
 test_atom head refname:strip=1 heads/master
 test_atom head refname:strip=2 master
+test_atom head refname:strip=-1 master
+test_atom head refname:strip=-2 heads/master
 test_atom head upstream refs/remotes/origin/master
 test_atom head upstream:short origin/master
+test_atom head upstream:lstrip=2 origin/master
+test_atom head upstream:lstrip=-2 origin/master
+test_atom head upstream:rstrip=2 refs/remotes
+test_atom head upstream:rstrip=-2 refs/remotes
+test_atom head upstream:strip=2 origin/master
+test_atom head upstream:strip=-2 origin/master
 test_atom head push refs/remotes/myfork/master
 test_atom head push:short myfork/master
+test_atom head push:lstrip=1 remotes/myfork/master
+test_atom head push:lstrip=-1 master
+test_atom head push:rstrip=1 refs/remotes/myfork
+test_atom head push:rstrip=-1 refs
+test_atom head push:strip=1 remotes/myfork/master
+test_atom head push:strip=-1 master
 test_atom head objecttype commit
 test_atom head objectsize 171
 test_atom head objectname $(git rev-parse refs/heads/master)
 test_atom head objectname:short $(git rev-parse --short refs/heads/master)
+test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master)
+test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/master)
 test_atom head tree $(git rev-parse refs/heads/master^{tree})
 test_atom head parent ''
 test_atom head numparent 0
@@ -99,6 +124,8 @@ test_atom tag objecttype tag
 test_atom tag objectsize 154
 test_atom tag objectname $(git rev-parse refs/tags/testtag)
 test_atom tag objectname:short $(git rev-parse --short refs/tags/testtag)
+test_atom head objectname:short=1 $(git rev-parse --short=1 refs/heads/master)
+test_atom head objectname:short=10 $(git rev-parse --short=10 refs/heads/master)
 test_atom tag tree ''
 test_atom tag parent ''
 test_atom tag numparent ''
@@ -134,16 +161,6 @@ test_expect_success 'Check invalid atoms names are errors' '
        test_must_fail git for-each-ref --format="%(INVALID)" refs/heads
 '
 
-test_expect_success 'arguments to :strip must be positive integers' '
-       test_must_fail git for-each-ref --format="%(refname:strip=0)" &&
-       test_must_fail git for-each-ref --format="%(refname:strip=-1)" &&
-       test_must_fail git for-each-ref --format="%(refname:strip=foo)"
-'
-
-test_expect_success 'stripping refnames too far gives an error' '
-       test_must_fail git for-each-ref --format="%(refname:strip=3)"
-'
-
 test_expect_success 'Check format specifiers are ignored in naming date atoms' '
        git for-each-ref --format="%(authordate)" refs/heads &&
        git for-each-ref --format="%(authordate:default) %(authordate)" refs/heads &&
@@ -164,6 +181,12 @@ test_expect_success 'Check invalid format specifiers are errors' '
        test_must_fail git for-each-ref --format="%(authordate:INVALID)" refs/heads
 '
 
+test_expect_success 'arguments to %(objectname:short=) must be positive integers' '
+       test_must_fail git for-each-ref --format="%(objectname:short=0)" &&
+       test_must_fail git for-each-ref --format="%(objectname:short=-1)" &&
+       test_must_fail git for-each-ref --format="%(objectname:short=foo)"
+'
+
 test_date () {
        f=$1 &&
        committer_date=$2 &&
@@ -362,6 +385,8 @@ test_expect_success 'setup for upstream:track[short]' '
 
 test_atom head upstream:track '[ahead 1]'
 test_atom head upstream:trackshort '>'
+test_atom head upstream:track,nobracket 'ahead 1'
+test_atom head upstream:nobracket,track 'ahead 1'
 test_atom head push:track '[ahead 1]'
 test_atom head push:trackshort '>'
 
@@ -372,7 +397,7 @@ test_expect_success 'Check that :track[short] cannot be used with other atoms' '
 
 test_expect_success 'Check that :track[short] works when upstream is invalid' '
        cat >expected <<-\EOF &&
-
+       [gone]
 
        EOF
        test_when_finished "git config branch.master.merge refs/heads/master" &&
@@ -553,4 +578,88 @@ test_expect_success 'Verify sort with multiple keys' '
                refs/tags/bogo refs/tags/master > actual &&
        test_cmp expected actual
 '
+
+
+test_expect_success 'do not dereference NULL upon %(HEAD) on unborn branch' '
+       test_when_finished "git checkout master" &&
+       git for-each-ref --format="%(HEAD) %(refname:short)" refs/heads/ >actual &&
+       sed -e "s/^\* /  /" actual >expect &&
+       git checkout --orphan orphaned-branch &&
+       git for-each-ref --format="%(HEAD) %(refname:short)" refs/heads/ >actual &&
+       test_cmp expect actual
+'
+
+cat >trailers <<EOF
+Reviewed-by: A U Thor <author@example.com>
+Signed-off-by: A U Thor <author@example.com>
+EOF
+
+test_expect_success 'basic atom: head contents:trailers' '
+       echo "Some contents" > two &&
+       git add two &&
+       git commit -F - <<-EOF &&
+       trailers: this commit message has trailers
+
+       Some message contents
+
+       $(cat trailers)
+       EOF
+       git for-each-ref --format="%(contents:trailers)" refs/heads/master >actual &&
+       sanitize_pgp <actual >actual.clean &&
+       # git for-each-ref ends with a blank line
+       cat >expect <<-EOF &&
+       $(cat trailers)
+
+       EOF
+       test_cmp expect actual.clean
+'
+
+test_expect_success 'Add symbolic ref for the following tests' '
+       git symbolic-ref refs/heads/sym refs/heads/master
+'
+
+cat >expected <<EOF
+refs/heads/master
+EOF
+
+test_expect_success 'Verify usage of %(symref) atom' '
+       git for-each-ref --format="%(symref)" refs/heads/sym >actual &&
+       test_cmp expected actual
+'
+
+cat >expected <<EOF
+heads/master
+EOF
+
+test_expect_success 'Verify usage of %(symref:short) atom' '
+       git for-each-ref --format="%(symref:short)" refs/heads/sym >actual &&
+       test_cmp expected actual
+'
+
+cat >expected <<EOF
+master
+heads/master
+EOF
+
+test_expect_success 'Verify usage of %(symref:lstrip) atom' '
+       git for-each-ref --format="%(symref:lstrip=2)" refs/heads/sym > actual &&
+       git for-each-ref --format="%(symref:lstrip=-2)" refs/heads/sym >> actual &&
+       test_cmp expected actual &&
+
+       git for-each-ref --format="%(symref:strip=2)" refs/heads/sym > actual &&
+       git for-each-ref --format="%(symref:strip=-2)" refs/heads/sym >> actual &&
+       test_cmp expected actual
+'
+
+cat >expected <<EOF
+refs
+refs/heads
+EOF
+
+test_expect_success 'Verify usage of %(symref:rstrip) atom' '
+       git for-each-ref --format="%(symref:rstrip=2)" refs/heads/sym > actual &&
+       git for-each-ref --format="%(symref:rstrip=-2)" refs/heads/sym >> actual &&
+       test_cmp expected actual
+'
+
 test_done
index d0ab09f4bd804730eb049ea982e5724653583f06..fc067ed6723bc0aaaddd2473e4d61f13087b9e15 100755 (executable)
@@ -93,6 +93,22 @@ test_expect_success 'filtering with --contains' '
        test_cmp expect actual
 '
 
+test_expect_success 'filtering with --no-contains' '
+       cat >expect <<-\EOF &&
+       refs/tags/one
+       EOF
+       git for-each-ref --format="%(refname)" --no-contains=two >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'filtering with --contains and --no-contains' '
+       cat >expect <<-\EOF &&
+       refs/tags/two
+       EOF
+       git for-each-ref --format="%(refname)" --contains=two --no-contains=three >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success '%(color) must fail' '
        test_must_fail git for-each-ref --format="%(color)%(refname)"
 '
@@ -327,4 +343,102 @@ test_expect_success 'reverse version sort' '
        test_cmp expect actual
 '
 
+test_expect_success 'improper usage of %(if), %(then), %(else) and %(end) atoms' '
+       test_must_fail git for-each-ref --format="%(if)" &&
+       test_must_fail git for-each-ref --format="%(then) %(end)" &&
+       test_must_fail git for-each-ref --format="%(else) %(end)" &&
+       test_must_fail git for-each-ref --format="%(if) %(else) %(end)" &&
+       test_must_fail git for-each-ref --format="%(if) %(then) %(then) %(end)" &&
+       test_must_fail git for-each-ref --format="%(then) %(else) %(end)" &&
+       test_must_fail git for-each-ref --format="%(if) %(else) %(end)" &&
+       test_must_fail git for-each-ref --format="%(if) %(then) %(else)" &&
+       test_must_fail git for-each-ref --format="%(if) %(else) %(then) %(end)" &&
+       test_must_fail git for-each-ref --format="%(if) %(then) %(else) %(else) %(end)" &&
+       test_must_fail git for-each-ref --format="%(if) %(end)"
+'
+
+test_expect_success 'check %(if)...%(then)...%(end) atoms' '
+       git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Author: %(authorname)%(end)" >actual &&
+       cat >expect <<-\EOF &&
+       refs/heads/master Author: A U Thor
+       refs/heads/side Author: A U Thor
+       refs/odd/spot Author: A U Thor
+       refs/tags/annotated-tag
+       refs/tags/doubly-annotated-tag
+       refs/tags/doubly-signed-tag
+       refs/tags/foo1.10 Author: A U Thor
+       refs/tags/foo1.3 Author: A U Thor
+       refs/tags/foo1.6 Author: A U Thor
+       refs/tags/four Author: A U Thor
+       refs/tags/one Author: A U Thor
+       refs/tags/signed-tag
+       refs/tags/three Author: A U Thor
+       refs/tags/two Author: A U Thor
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'check %(if)...%(then)...%(else)...%(end) atoms' '
+       git for-each-ref --format="%(if)%(authorname)%(then)%(authorname)%(else)No author%(end): %(refname)" >actual &&
+       cat >expect <<-\EOF &&
+       A U Thor: refs/heads/master
+       A U Thor: refs/heads/side
+       A U Thor: refs/odd/spot
+       No author: refs/tags/annotated-tag
+       No author: refs/tags/doubly-annotated-tag
+       No author: refs/tags/doubly-signed-tag
+       A U Thor: refs/tags/foo1.10
+       A U Thor: refs/tags/foo1.3
+       A U Thor: refs/tags/foo1.6
+       A U Thor: refs/tags/four
+       A U Thor: refs/tags/one
+       No author: refs/tags/signed-tag
+       A U Thor: refs/tags/three
+       A U Thor: refs/tags/two
+       EOF
+       test_cmp expect actual
+'
+test_expect_success 'ignore spaces in %(if) atom usage' '
+       git for-each-ref --format="%(refname:short): %(if)%(HEAD)%(then)Head ref%(else)Not Head ref%(end)" >actual &&
+       cat >expect <<-\EOF &&
+       master: Head ref
+       side: Not Head ref
+       odd/spot: Not Head ref
+       annotated-tag: Not Head ref
+       doubly-annotated-tag: Not Head ref
+       doubly-signed-tag: Not Head ref
+       foo1.10: Not Head ref
+       foo1.3: Not Head ref
+       foo1.6: Not Head ref
+       four: Not Head ref
+       one: Not Head ref
+       signed-tag: Not Head ref
+       three: Not Head ref
+       two: Not Head ref
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'check %(if:equals=<string>)' '
+       git for-each-ref --format="%(if:equals=master)%(refname:short)%(then)Found master%(else)Not master%(end)" refs/heads/ >actual &&
+       cat >expect <<-\EOF &&
+       Found master
+       Not master
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'check %(if:notequals=<string>)' '
+       git for-each-ref --format="%(if:notequals=master)%(refname:short)%(then)Not master%(else)Found master%(end)" refs/heads/ >actual &&
+       cat >expect <<-\EOF &&
+       Found master
+       Not master
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success '--merged is incompatible with --no-merged' '
+       test_must_fail git for-each-ref --merged HEAD --no-merged HEAD
+'
+
 test_done
index 5d7d4146179bb43184f74dd646aacbba11cc8c8b..cc7acd101db082302b351a81929f3f571c1a4db0 100755 (executable)
@@ -43,4 +43,60 @@ test_expect_success 'gc is not aborted due to a stale symref' '
        )
 '
 
+test_expect_success 'auto gc with too many loose objects does not attempt to create bitmaps' '
+       test_config gc.auto 3 &&
+       test_config gc.autodetach false &&
+       test_config pack.writebitmaps true &&
+       # We need to create two object whose sha1s start with 17
+       # since this is what git gc counts.  As it happens, these
+       # two blobs will do so.
+       test_commit 263 &&
+       test_commit 410 &&
+       # Our first gc will create a pack; our second will create a second pack
+       git gc --auto &&
+       ls .git/objects/pack | sort >existing_packs &&
+       test_commit 523 &&
+       test_commit 790 &&
+
+       git gc --auto 2>err &&
+       test_i18ngrep ! "^warning:" err &&
+       ls .git/objects/pack/ | sort >post_packs &&
+       comm -1 -3 existing_packs post_packs >new &&
+       comm -2 -3 existing_packs post_packs >del &&
+       test_line_count = 0 del && # No packs are deleted
+       test_line_count = 2 new # There is one new pack and its .idx
+'
+
+run_and_wait_for_auto_gc () {
+       # We read stdout from gc for the side effect of waiting until the
+       # background gc process exits, closing its fd 9.  Furthermore, the
+       # variable assignment from a command substitution preserves the
+       # exit status of the main gc process.
+       # Note: this fd trickery doesn't work on Windows, but there is no
+       # need to, because on Win the auto gc always runs in the foreground.
+       doesnt_matter=$(git gc --auto 9>&1)
+}
+
+test_expect_success 'background auto gc does not run if gc.log is present and recent but does if it is old' '
+       test_commit foo &&
+       test_commit bar &&
+       git repack &&
+       test_config gc.autopacklimit 1 &&
+       test_config gc.autodetach true &&
+       echo fleem >.git/gc.log &&
+       test_must_fail git gc --auto 2>err &&
+       test_i18ngrep "^error:" err &&
+       test_config gc.logexpiry 5.days &&
+       test-chmtime =-345600 .git/gc.log &&
+       test_must_fail git gc --auto &&
+       test_config gc.logexpiry 2.days &&
+       run_and_wait_for_auto_gc &&
+       ls .git/objects/pack/pack-*.pack >packs &&
+       test_line_count = 1 packs
+'
+
+# DO NOT leave a detached auto gc process running near the end of the
+# test script: it can run long enough in the background to racily
+# interfere with the cleanup in 'test_done'.
+
 test_done
index cf076dcd940aa0d74bd8df03b4f6c768e1954455..394b169eada7968875e931c5a43f25a808cfc18f 100755 (executable)
@@ -129,7 +129,7 @@ for repack in '' true; do
        '
 done
 
-test_expect_success 'do not complain about existing broken links' '
+test_expect_success 'do not complain about existing broken links (commit)' '
        cat >broken-commit <<-\EOF &&
        tree 0000000000000000000000000000000000000001
        parent 0000000000000000000000000000000000000002
@@ -144,4 +144,29 @@ test_expect_success 'do not complain about existing broken links' '
        test_must_be_empty stderr
 '
 
+test_expect_success 'do not complain about existing broken links (tree)' '
+       cat >broken-tree <<-\EOF &&
+       100644 blob 0000000000000000000000000000000000000003    foo
+       EOF
+       tree=$(git mktree --missing <broken-tree) &&
+       git gc 2>stderr &&
+       git cat-file -e $tree &&
+       test_must_be_empty stderr
+'
+
+test_expect_success 'do not complain about existing broken links (tag)' '
+       cat >broken-tag <<-\EOF &&
+       object 0000000000000000000000000000000000000004
+       type commit
+       tag broken
+       tagger whatever <whatever@example.com> 1234 -0000
+
+       this is a broken tag
+       EOF
+       tag=$(git hash-object -t tag -w broken-tag) &&
+       git gc 2>stderr &&
+       git cat-file -e $tag &&
+       test_must_be_empty stderr
+'
+
 test_done
index cb8fbd8e5e03a0ff5a176cc947419c357fd65d99..7cb60799be1a109e2210350137c8754a5bc4bb7d 100755 (executable)
@@ -313,6 +313,27 @@ test_expect_success 'Tag name filtering allows slashes in tag names' '
        git cat-file tag X/2 > actual &&
        test_cmp expect actual
 '
+test_expect_success 'setup --prune-empty comparisons' '
+       git checkout --orphan master-no-a &&
+       git rm -rf . &&
+       unset test_tick &&
+       test_tick &&
+       GIT_COMMITTER_DATE="@0 +0000" GIT_AUTHOR_DATE="@0 +0000" &&
+       test_commit --notick B B.t B Bx &&
+       git checkout -b branch-no-a Bx &&
+       test_commit D D.t D Dx &&
+       mkdir dir &&
+       test_commit dir/D dir/D.t dir/D dir/Dx &&
+       test_commit E E.t E Ex &&
+       git checkout master-no-a &&
+       test_commit C C.t C Cx &&
+       git checkout branch-no-a &&
+       git merge Cx -m "Merge tag '\''C'\'' into branch" &&
+       git tag Fx &&
+       test_commit G G.t G Gx &&
+       test_commit H H.t H Hx &&
+       git checkout branch
+'
 
 test_expect_success 'Prune empty commits' '
        git rev-list HEAD > expect &&
@@ -341,6 +362,22 @@ test_expect_success 'prune empty works even without index/tree filters' '
        test_cmp expect actual
 '
 
+test_expect_success '--prune-empty is able to prune root commit' '
+       git rev-list branch-no-a >expect &&
+       git branch testing H &&
+       git filter-branch -f --prune-empty --index-filter "git update-index --remove A.t" testing &&
+       git rev-list testing >actual &&
+       git branch -D testing &&
+       test_cmp expect actual
+'
+
+test_expect_success '--prune-empty is able to prune entire branch' '
+       git branch prune-entire B &&
+       git filter-branch -f --prune-empty --index-filter "git update-index --remove A.t B.t" prune-entire &&
+       test_path_is_missing .git/refs/heads/prune-entire &&
+       test_must_fail git reflog exists refs/heads/prune-entire
+'
+
 test_expect_success '--remap-to-ancestor with filename filters' '
        git checkout master &&
        git reset --hard A &&
index 8b0f71a2ac15d65f977b0daa2a53ad47b64a043a..0ef7b94394151da9a9a6d602952e7f2fa64cf6a4 100755 (executable)
@@ -16,7 +16,6 @@ tag_exists () {
        git show-ref --quiet --verify refs/tags/"$1"
 }
 
-# todo: git tag -l now returns always zero, when fixed, change this test
 test_expect_success 'listing all tags in an empty tree should succeed' '
        git tag -l &&
        git tag
@@ -27,6 +26,30 @@ test_expect_success 'listing all tags in an empty tree should output nothing' '
        test $(git tag | wc -l) -eq 0
 '
 
+test_expect_success 'sort tags, ignore case' '
+       (
+               git init sort &&
+               cd sort &&
+               test_commit initial &&
+               git tag tag-one &&
+               git tag TAG-two &&
+               git tag -l >actual &&
+               cat >expected <<-\EOF &&
+               TAG-two
+               initial
+               tag-one
+               EOF
+               test_cmp expected actual &&
+               git tag -l -i >actual &&
+               cat >expected <<-\EOF &&
+               initial
+               tag-one
+               TAG-two
+               EOF
+               test_cmp expected actual
+       )
+'
+
 test_expect_success 'looking for a tag in an empty tree should fail' \
        '! (tag_exists mytag)'
 
@@ -47,6 +70,7 @@ test_expect_success 'creating a tag for an unknown revision should fail' '
 
 # commit used in the tests, test_tick is also called here to freeze the date:
 test_expect_success 'creating a tag using default HEAD should succeed' '
+       test_config core.logAllRefUpdates true &&
        test_tick &&
        echo foo >foo &&
        git add foo &&
@@ -56,9 +80,25 @@ test_expect_success 'creating a tag using default HEAD should succeed' '
 '
 
 test_expect_success 'creating a tag with --create-reflog should create reflog' '
+       git log -1 \
+               --format="format:tag: tagging %h (%s, %cd)%n" \
+               --date=format:%Y-%m-%d >expected &&
        test_when_finished "git tag -d tag_with_reflog" &&
        git tag --create-reflog tag_with_reflog &&
-       git reflog exists refs/tags/tag_with_reflog
+       git reflog exists refs/tags/tag_with_reflog &&
+       sed -e "s/^.*   //" .git/logs/refs/tags/tag_with_reflog >actual &&
+       test_i18ncmp expected actual
+'
+
+test_expect_success 'annotated tag with --create-reflog has correct message' '
+       git log -1 \
+               --format="format:tag: tagging %h (%s, %cd)%n" \
+               --date=format:%Y-%m-%d >expected &&
+       test_when_finished "git tag -d tag_with_reflog" &&
+       git tag -m "annotated tag" --create-reflog tag_with_reflog &&
+       git reflog exists refs/tags/tag_with_reflog &&
+       sed -e "s/^.*   //" .git/logs/refs/tags/tag_with_reflog >actual &&
+       test_i18ncmp expected actual
 '
 
 test_expect_success '--create-reflog does not create reflog on failure' '
@@ -66,11 +106,30 @@ test_expect_success '--create-reflog does not create reflog on failure' '
        test_must_fail git reflog exists refs/tags/mytag
 '
 
+test_expect_success 'option core.logAllRefUpdates=always creates reflog' '
+       test_when_finished "git tag -d tag_with_reflog" &&
+       test_config core.logAllRefUpdates always &&
+       git tag tag_with_reflog &&
+       git reflog exists refs/tags/tag_with_reflog
+'
+
 test_expect_success 'listing all tags if one exists should succeed' '
        git tag -l &&
        git tag
 '
 
+cat >expect <<EOF
+mytag
+EOF
+test_expect_success 'Multiple -l or --list options are equivalent to one -l option' '
+       git tag -l -l >actual &&
+       test_cmp expect actual &&
+       git tag --list --list >actual &&
+       test_cmp expect actual &&
+       git tag --list -l --list >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'listing all tags if one exists should output that tag' '
        test $(git tag -l) = mytag &&
        test $(git tag) = mytag
@@ -81,13 +140,15 @@ test_expect_success 'listing all tags if one exists should output that tag' '
 test_expect_success 'listing a tag using a matching pattern should succeed' \
        'git tag -l mytag'
 
+test_expect_success 'listing a tag with --ignore-case' \
+       'test $(git tag -l --ignore-case MYTAG) = mytag'
+
 test_expect_success \
        'listing a tag using a matching pattern should output that tag' \
        'test $(git tag -l mytag) = mytag'
 
-# todo: git tag -l now returns always zero, when fixed, change this test
 test_expect_success \
-       'listing tags using a non-matching pattern should suceed' \
+       'listing tags using a non-matching pattern should succeed' \
        'git tag -l xxx'
 
 test_expect_success \
@@ -122,11 +183,11 @@ test_expect_success '--force can create a tag with the name of one existing' '
        tag_exists mytag'
 
 test_expect_success '--force is moot with a non-existing tag name' '
+       test_when_finished git tag -d newtag forcetag &&
        git tag newtag >expect &&
        git tag --force forcetag >actual &&
        test_cmp expect actual
 '
-git tag -d newtag forcetag
 
 # deleting tags:
 
@@ -287,6 +348,19 @@ test_expect_success 'tag -l can accept multiple patterns' '
        test_cmp expect actual
 '
 
+# Between v1.7.7 & v2.13.0 a fair reading of the git-tag documentation
+# could leave you with the impression that "-l <pattern> -l <pattern>"
+# was how we wanted to accept multiple patterns.
+#
+# This test should not imply that this is a sane thing to support. but
+# since the documentation was worded like it was let's at least find
+# out if we're going to break this long-documented form of taking
+# multiple patterns.
+test_expect_success 'tag -l <pattern> -l <pattern> works, as our buggy documentation previously suggested' '
+       git tag -l "v1*" -l "v0*" >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'listing tags in column' '
        COLUMNS=40 git tag -l --column=row >actual &&
        cat >expected <<\EOF &&
@@ -297,11 +371,9 @@ EOF
 '
 
 test_expect_success 'listing tags in column with column.*' '
-       git config column.tag row &&
-       git config column.ui dense &&
+       test_config column.tag row &&
+       test_config column.ui dense &&
        COLUMNS=40 git tag -l >actual &&
-       git config --unset column.ui &&
-       git config --unset column.tag &&
        cat >expected <<\EOF &&
 a1      aa1   cba     t210    t211
 v0.2.1  v1.0  v1.0.1  v1.1.3
@@ -314,9 +386,8 @@ test_expect_success 'listing tag with -n --column should fail' '
 '
 
 test_expect_success 'listing tags -n in column with column.ui ignored' '
-       git config column.ui "row dense" &&
+       test_config column.ui "row dense" &&
        COLUMNS=40 git tag -l -n >actual &&
-       git config --unset column.ui &&
        cat >expected <<\EOF &&
 a1              Foo
 aa1             Foo
@@ -572,6 +643,11 @@ test_expect_success \
        git tag -n0 -l tag-one-line >actual &&
        test_cmp expect actual &&
 
+       git tag -n0 | grep "^tag-one-line" >actual &&
+       test_cmp expect actual &&
+       git tag -n0 tag-one-line >actual &&
+       test_cmp expect actual &&
+
        echo "tag-one-line    A msg" >expect &&
        git tag -n1 -l | grep "^tag-one-line" >actual &&
        test_cmp expect actual &&
@@ -585,6 +661,17 @@ test_expect_success \
        test_cmp expect actual
 '
 
+test_expect_success 'The -n 100 invocation means -n --list 100, not -n100' '
+       >expect &&
+       git tag -n 100 >actual &&
+       test_cmp expect actual &&
+
+       git tag -m "A msg" 100 &&
+       echo "100             A msg" >expect &&
+       git tag -n 100 >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success \
        'listing the zero-lines message of a non-signed tag should succeed' '
        git tag -m "" tag-zero-lines &&
@@ -847,6 +934,20 @@ test_expect_success GPG 'verifying a forged tag should fail' '
        test_must_fail git tag -v forged-tag
 '
 
+test_expect_success GPG 'verifying a proper tag with --format pass and format accordingly' '
+       cat >expect <<-\EOF &&
+       tagname : signed-tag
+       EOF
+       git tag -v --format="tagname : %(tag)" "signed-tag" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success GPG 'verifying a forged tag with --format should fail silently' '
+       >expect &&
+       test_must_fail git tag -v --format="tagname : %(tag)" "forged-tag" >actual &&
+       test_cmp expect actual
+'
+
 # blank and empty messages for signed tags:
 
 get_tag_header empty-signed-tag $commit commit $time >expect
@@ -1200,11 +1301,10 @@ test_expect_success GPG,RFC1991 \
 '
 
 # try to sign with bad user.signingkey
-git config user.signingkey BobTheMouse
 test_expect_success GPG \
        'git tag -s fails if gpg is misconfigured (bad key)' \
-       'test_must_fail git tag -s -m tail tag-gpg-failure'
-git config --unset user.signingkey
+       'test_config user.signingkey BobTheMouse &&
+       test_must_fail git tag -s -m tail tag-gpg-failure'
 
 # try to produce invalid signature
 test_expect_success GPG \
@@ -1322,6 +1422,23 @@ test_expect_success 'checking that first commit is in all tags (relative)' "
        test_cmp expected actual
 "
 
+# All the --contains tests above, but with --no-contains
+test_expect_success 'checking that first commit is not listed in any tag with --no-contains  (hash)' "
+       >expected &&
+       git tag -l --no-contains $hash1 v* >actual &&
+       test_cmp expected actual
+"
+
+test_expect_success 'checking that first commit is in all tags (tag)' "
+       git tag -l --no-contains v1.0 v* >actual &&
+       test_cmp expected actual
+"
+
+test_expect_success 'checking that first commit is in all tags (relative)' "
+       git tag -l --no-contains HEAD~2 v* >actual &&
+       test_cmp expected actual
+"
+
 cat > expected <<EOF
 v2.0
 EOF
@@ -1331,6 +1448,17 @@ test_expect_success 'checking that second commit only has one tag' "
        test_cmp expected actual
 "
 
+cat > expected <<EOF
+v0.2.1
+v1.0
+v1.0.1
+v1.1.3
+EOF
+
+test_expect_success 'inverse of the last test, with --no-contains' "
+       git tag -l --no-contains $hash2 v* >actual &&
+       test_cmp expected actual
+"
 
 cat > expected <<EOF
 EOF
@@ -1340,6 +1468,19 @@ test_expect_success 'checking that third commit has no tags' "
        test_cmp expected actual
 "
 
+cat > expected <<EOF
+v0.2.1
+v1.0
+v1.0.1
+v1.1.3
+v2.0
+EOF
+
+test_expect_success 'conversely --no-contains on the third commit lists all tags' "
+       git tag -l --no-contains $hash3 v* >actual &&
+       test_cmp expected actual
+"
+
 # how about a simple merge?
 
 test_expect_success 'creating simple branch' '
@@ -1361,6 +1502,19 @@ test_expect_success 'checking that branch head only has one tag' "
        test_cmp expected actual
 "
 
+cat > expected <<EOF
+v0.2.1
+v1.0
+v1.0.1
+v1.1.3
+v2.0
+EOF
+
+test_expect_success 'checking that branch head with --no-contains lists all but one tag' "
+       git tag -l --no-contains $hash4 v* >actual &&
+       test_cmp expected actual
+"
+
 test_expect_success 'merging original branch into this branch' '
        git merge --strategy=ours master &&
         git tag v4.0
@@ -1375,6 +1529,20 @@ test_expect_success 'checking that original branch head has one tag now' "
        test_cmp expected actual
 "
 
+cat > expected <<EOF
+v0.2.1
+v1.0
+v1.0.1
+v1.1.3
+v2.0
+v3.0
+EOF
+
+test_expect_success 'checking that original branch head with --no-contains lists all but one tag now' "
+       git tag -l --no-contains $hash3 v* >actual &&
+       test_cmp expected actual
+"
+
 cat > expected <<EOF
 v0.2.1
 v1.0
@@ -1390,21 +1558,76 @@ test_expect_success 'checking that initial commit is in all tags' "
        test_cmp expected actual
 "
 
+test_expect_success 'checking that --contains can be used in non-list mode' '
+       git tag --contains $hash1 v* >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'checking that initial commit is in all tags with --no-contains' "
+       >expected &&
+       git tag -l --no-contains $hash1 v* >actual &&
+       test_cmp expected actual
+"
+
 # mixing modes and options:
 
 test_expect_success 'mixing incompatibles modes and options is forbidden' '
        test_must_fail git tag -a &&
+       test_must_fail git tag -a -l &&
+       test_must_fail git tag -s &&
+       test_must_fail git tag -s -l &&
+       test_must_fail git tag -m &&
+       test_must_fail git tag -m -l &&
+       test_must_fail git tag -m "hlagh" &&
+       test_must_fail git tag -m "hlagh" -l &&
+       test_must_fail git tag -F &&
+       test_must_fail git tag -F -l &&
+       test_must_fail git tag -f &&
+       test_must_fail git tag -f -l &&
+       test_must_fail git tag -a -s -m -F &&
+       test_must_fail git tag -a -s -m -F -l &&
        test_must_fail git tag -l -v &&
-       test_must_fail git tag -n 100 &&
+       test_must_fail git tag -l -d &&
+       test_must_fail git tag -l -v -d &&
+       test_must_fail git tag -n 100 -v &&
        test_must_fail git tag -l -m msg &&
        test_must_fail git tag -l -F some file &&
-       test_must_fail git tag -v -s
-'
+       test_must_fail git tag -v -s &&
+       test_must_fail git tag --contains tag-tree &&
+       test_must_fail git tag --contains tag-blob &&
+       test_must_fail git tag --no-contains tag-tree &&
+       test_must_fail git tag --no-contains tag-blob &&
+       test_must_fail git tag --contains --no-contains &&
+       test_must_fail git tag --no-with HEAD &&
+       test_must_fail git tag --no-without HEAD
+'
+
+for option in --contains --with --no-contains --without --merged --no-merged --points-at
+do
+       test_expect_success "mixing incompatible modes with $option is forbidden" "
+               test_must_fail git tag -d $option HEAD &&
+               test_must_fail git tag -d $option HEAD some-tag &&
+               test_must_fail git tag -v $option HEAD
+       "
+       test_expect_success "Doing 'git tag --list-like $option <commit> <pattern> is permitted" "
+               git tag -n $option HEAD HEAD &&
+               git tag $option HEAD HEAD &&
+               git tag $option
+       "
+done
 
 # check points-at
 
-test_expect_success '--points-at cannot be used in non-list mode' '
-       test_must_fail git tag --points-at=v4.0 foo
+test_expect_success '--points-at can be used in non-list mode' '
+       echo v4.0 >expect &&
+       git tag --points-at=v4.0 "v*" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--points-at is a synonym for --points-at HEAD' '
+       echo v4.0 >expect &&
+       git tag --points-at >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success '--points-at finds lightweight tags' '
@@ -1484,7 +1707,7 @@ test_expect_success 'reverse lexical sort' '
 '
 
 test_expect_success 'configured lexical sort' '
-       git config tag.sort "v:refname" &&
+       test_config tag.sort "v:refname" &&
        git tag -l "foo*" >actual &&
        cat >expect <<-\EOF &&
        foo1.3
@@ -1495,6 +1718,7 @@ test_expect_success 'configured lexical sort' '
 '
 
 test_expect_success 'option override configured sort' '
+       test_config tag.sort "v:refname" &&
        git tag -l --sort=-refname "foo*" >actual &&
        cat >expect <<-\EOF &&
        foo1.6
@@ -1509,13 +1733,12 @@ test_expect_success 'invalid sort parameter on command line' '
 '
 
 test_expect_success 'invalid sort parameter in configuratoin' '
-       git config tag.sort "v:notvalid" &&
+       test_config tag.sort "v:notvalid" &&
        test_must_fail git tag -l "foo*"
 '
 
 test_expect_success 'version sort with prerelease reordering' '
-       git config --unset tag.sort &&
-       git config versionsort.prereleaseSuffix -rc &&
+       test_config versionsort.prereleaseSuffix -rc &&
        git tag foo1.6-rc1 &&
        git tag foo1.6-rc2 &&
        git tag -l --sort=version:refname "foo*" >actual &&
@@ -1530,6 +1753,7 @@ test_expect_success 'version sort with prerelease reordering' '
 '
 
 test_expect_success 'reverse version sort with prerelease reordering' '
+       test_config versionsort.prereleaseSuffix -rc &&
        git tag -l --sort=-version:refname "foo*" >actual &&
        cat >expect <<-\EOF &&
        foo1.10
@@ -1541,6 +1765,103 @@ test_expect_success 'reverse version sort with prerelease reordering' '
        test_cmp expect actual
 '
 
+test_expect_success 'version sort with prerelease reordering and common leading character' '
+       test_config versionsort.prereleaseSuffix -before &&
+       git tag foo1.7-before1 &&
+       git tag foo1.7 &&
+       git tag foo1.7-after1 &&
+       git tag -l --sort=version:refname "foo1.7*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.7-before1
+       foo1.7
+       foo1.7-after1
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with prerelease reordering, multiple suffixes and common leading character' '
+       test_config versionsort.prereleaseSuffix -before &&
+       git config --add versionsort.prereleaseSuffix -after &&
+       git tag -l --sort=version:refname "foo1.7*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.7-before1
+       foo1.7-after1
+       foo1.7
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with prerelease reordering, multiple suffixes match the same tag' '
+       test_config versionsort.prereleaseSuffix -bar &&
+       git config --add versionsort.prereleaseSuffix -foo-baz &&
+       git config --add versionsort.prereleaseSuffix -foo-bar &&
+       git tag foo1.8-foo-bar &&
+       git tag foo1.8-foo-baz &&
+       git tag foo1.8 &&
+       git tag -l --sort=version:refname "foo1.8*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.8-foo-baz
+       foo1.8-foo-bar
+       foo1.8
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with prerelease reordering, multiple suffixes match starting at the same position' '
+       test_config versionsort.prereleaseSuffix -pre &&
+       git config --add versionsort.prereleaseSuffix -prerelease &&
+       git tag foo1.9-pre1 &&
+       git tag foo1.9-pre2 &&
+       git tag foo1.9-prerelease1 &&
+       git tag -l --sort=version:refname "foo1.9*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.9-pre1
+       foo1.9-pre2
+       foo1.9-prerelease1
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with general suffix reordering' '
+       test_config versionsort.suffix -alpha &&
+       git config --add versionsort.suffix -beta &&
+       git config --add versionsort.suffix ""  &&
+       git config --add versionsort.suffix -gamma &&
+       git config --add versionsort.suffix -delta &&
+       git tag foo1.10-alpha &&
+       git tag foo1.10-beta &&
+       git tag foo1.10-gamma &&
+       git tag foo1.10-delta &&
+       git tag foo1.10-unlisted-suffix &&
+       git tag -l --sort=version:refname "foo1.10*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.10-alpha
+       foo1.10-beta
+       foo1.10
+       foo1.10-unlisted-suffix
+       foo1.10-gamma
+       foo1.10-delta
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'versionsort.suffix overrides versionsort.prereleaseSuffix' '
+       test_config versionsort.suffix -before &&
+       test_config versionsort.prereleaseSuffix -after &&
+       git tag -l --sort=version:refname "foo1.7*" >actual &&
+       cat >expect <<-\EOF &&
+       foo1.7-before1
+       foo1.7
+       foo1.7-after1
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'version sort with very long prerelease suffix' '
+       test_config versionsort.prereleaseSuffix -very-looooooooooooooooooooooooong-prerelease-suffix &&
+       git tag -l --sort=version:refname
+'
+
 run_with_limited_stack () {
        (ulimit -s 128 && "$@")
 }
@@ -1548,7 +1869,7 @@ run_with_limited_stack () {
 test_lazy_prereq ULIMIT_STACK_SIZE 'run_with_limited_stack true'
 
 # we require ulimit, this excludes Windows
-test_expect_success ULIMIT_STACK_SIZE '--contains works in a deep repo' '
+test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a deep repo' '
        >expect &&
        i=1 &&
        while test $i -lt 8000
@@ -1564,18 +1885,18 @@ EOF"
        git checkout master &&
        git tag far-far-away HEAD^ &&
        run_with_limited_stack git tag --contains HEAD >actual &&
-       test_cmp expect actual
+       test_cmp expect actual &&
+       run_with_limited_stack git tag --no-contains HEAD >actual &&
+       test_line_count ">" 10 actual
 '
 
 test_expect_success '--format should list tags as per format given' '
        cat >expect <<-\EOF &&
-       refname : refs/tags/foo1.10
-       refname : refs/tags/foo1.3
-       refname : refs/tags/foo1.6
-       refname : refs/tags/foo1.6-rc1
-       refname : refs/tags/foo1.6-rc2
+       refname : refs/tags/v1.0
+       refname : refs/tags/v1.0.1
+       refname : refs/tags/v1.1.3
        EOF
-       git tag -l --format="refname : %(refname)" "foo*" >actual &&
+       git tag -l --format="refname : %(refname)" "v1*" >actual &&
        test_cmp expect actual
 '
 
@@ -1585,8 +1906,17 @@ test_expect_success 'setup --merged test tags' '
        git tag mergetest-3 HEAD
 '
 
-test_expect_success '--merged cannot be used in non-list mode' '
-       test_must_fail git tag --merged=mergetest-2 foo
+test_expect_success '--merged can be used in non-list mode' '
+       cat >expect <<-\EOF &&
+       mergetest-1
+       mergetest-2
+       EOF
+       git tag --merged=mergetest-2 "mergetest*" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '--merged is incompatible with --no-merged' '
+       test_must_fail git tag --merged HEAD --no-merged HEAD
 '
 
 test_expect_success '--merged shows merged tags' '
@@ -1606,6 +1936,11 @@ test_expect_success '--no-merged show unmerged tags' '
        test_cmp expect actual
 '
 
+test_expect_success '--no-merged can be used in non-list mode' '
+       git tag --no-merged=mergetest-2 mergetest-* >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'ambiguous branch/tags not marked' '
        git tag ambiguous &&
        git branch ambiguous &&
@@ -1614,4 +1949,47 @@ test_expect_success 'ambiguous branch/tags not marked' '
        test_cmp expect actual
 '
 
+test_expect_success '--contains combined with --no-contains' '
+       (
+               git init no-contains &&
+               cd no-contains &&
+               test_commit v0.1 &&
+               test_commit v0.2 &&
+               test_commit v0.3 &&
+               test_commit v0.4 &&
+               test_commit v0.5 &&
+               cat >expected <<-\EOF &&
+               v0.2
+               v0.3
+               v0.4
+               EOF
+               git tag --contains v0.2 --no-contains v0.5 >actual &&
+               test_cmp expected actual
+       )
+'
+
+# As the docs say, list tags which contain a specified *commit*. We
+# don't recurse down to tags for trees or blobs pointed to by *those*
+# commits.
+test_expect_success 'Does --[no-]contains stop at commits? Yes!' '
+       cd no-contains &&
+       blob=$(git rev-parse v0.3:v0.3.t) &&
+       tree=$(git rev-parse v0.3^{tree}) &&
+       git tag tag-blob $blob &&
+       git tag tag-tree $tree &&
+       git tag --contains v0.3 >actual &&
+       cat >expected <<-\EOF &&
+       v0.3
+       v0.4
+       v0.5
+       EOF
+       test_cmp expected actual &&
+       git tag --no-contains v0.3 >actual &&
+       cat >expected <<-\EOF &&
+       v0.1
+       v0.2
+       EOF
+       test_cmp expected actual
+'
+
 test_done
index c8dc665f2fdd0f0452779e6f8576395f8b3bdf11..20b4d83c281e2fde8812f309bdebef012c6ecb74 100755 (executable)
@@ -360,27 +360,48 @@ test_pager_choices                       'git aliasedlog'
 test_default_pager        expect_success 'git -p aliasedlog'
 test_PAGER_overrides      expect_success 'git -p aliasedlog'
 test_core_pager_overrides expect_success 'git -p aliasedlog'
-test_core_pager_subdir    expect_failure 'git -p aliasedlog'
+test_core_pager_subdir    expect_success 'git -p aliasedlog'
 test_GIT_PAGER_overrides  expect_success 'git -p aliasedlog'
 
 test_default_pager        expect_success 'git -p true'
 test_PAGER_overrides      expect_success 'git -p true'
 test_core_pager_overrides expect_success 'git -p true'
-test_core_pager_subdir    expect_failure 'git -p true'
+test_core_pager_subdir    expect_success 'git -p true'
 test_GIT_PAGER_overrides  expect_success 'git -p true'
 
 test_default_pager        expect_success test_must_fail 'git -p request-pull'
 test_PAGER_overrides      expect_success test_must_fail 'git -p request-pull'
 test_core_pager_overrides expect_success test_must_fail 'git -p request-pull'
-test_core_pager_subdir    expect_failure test_must_fail 'git -p request-pull'
+test_core_pager_subdir    expect_success test_must_fail 'git -p request-pull'
 test_GIT_PAGER_overrides  expect_success test_must_fail 'git -p request-pull'
 
 test_default_pager        expect_success test_must_fail 'git -p'
 test_PAGER_overrides      expect_success test_must_fail 'git -p'
 test_local_config_ignored expect_failure test_must_fail 'git -p'
-test_no_local_config_subdir expect_success test_must_fail 'git -p'
 test_GIT_PAGER_overrides  expect_success test_must_fail 'git -p'
 
+test_expect_success TTY 'core.pager in repo config works and retains cwd' '
+       sane_unset GIT_PAGER &&
+       test_config core.pager "cat >cwd-retained" &&
+       (
+               cd sub &&
+               rm -f cwd-retained &&
+               test_terminal git -p rev-parse HEAD &&
+               test_path_is_file cwd-retained
+       )
+'
+
+test_expect_success TTY 'core.pager is found via alias in subdirectory' '
+       sane_unset GIT_PAGER &&
+       test_config core.pager "cat >via-alias" &&
+       (
+               cd sub &&
+               rm -f via-alias &&
+               test_terminal git -c alias.r="-p rev-parse" r HEAD &&
+               test_path_is_file via-alias
+       )
+'
+
 test_doesnt_paginate      expect_failure test_must_fail 'git -p nonsense'
 
 test_pager_choices                       'git shortlog'
index 07079a41c4f6b9f89786d7eb9187655102ed9bd0..b4b49eeb08313df8d260a17414a19e7ac2fdc901 100755 (executable)
@@ -125,4 +125,18 @@ test_expect_success GPG 'verify multiple tags' '
        test_cmp expect.stderr actual.stderr
 '
 
+test_expect_success GPG 'verifying tag with --format' '
+       cat >expect <<-\EOF &&
+       tagname : fourth-signed
+       EOF
+       git verify-tag --format="tagname : %(tag)" "fourth-signed" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success GPG 'verifying a forged tag with --format should fail silently' '
+       >expect &&
+       test_must_fail git verify-tag --format="tagname : %(tag)" $(cat forged1.tag) >actual-forged &&
+       test_cmp expect actual-forged
+'
+
 test_done
index 4d17363a926c8938c6c8d78e997a53ffb81b3c6c..53cf42fac19c83f2da7de1cd5b6c4ca0cf6e5ccf 100755 (executable)
@@ -232,4 +232,25 @@ test_expect_success 'status --branch with detached HEAD' '
        test_i18ncmp expected actual
 '
 
+## Duplicate the above test and verify --porcelain=v1 arg parsing.
+test_expect_success 'status --porcelain=v1 --branch with detached HEAD' '
+       git reset --hard &&
+       git checkout master^0 &&
+       git status --branch --porcelain=v1 >actual &&
+       cat >expected <<-EOF &&
+       ## HEAD (no branch)
+       ?? .gitconfig
+       ?? actual
+       ?? expect
+       ?? expected
+       ?? mdconflict/
+       EOF
+       test_i18ncmp expected actual
+'
+
+## Verify parser error on invalid --porcelain argument.
+test_expect_success 'status --porcelain=bogus' '
+       test_must_fail git status --porcelain=bogus
+'
+
 test_done
index cdc0747bf01b0598a2e864073887896162815019..fc6013ba3c83aa7243f15595bc7b6ddd8b8f46dc 100755 (executable)
@@ -9,6 +9,7 @@ cat >expected <<\EOF
 ?? actual
 ?? expected
 ?? untracked/
+!! untracked/ignored
 EOF
 
 test_expect_success 'status untracked directory with --ignored' '
diff --git a/t/t7064-wtstatus-pv2.sh b/t/t7064-wtstatus-pv2.sh
new file mode 100755 (executable)
index 0000000..e319fa2
--- /dev/null
@@ -0,0 +1,593 @@
+#!/bin/sh
+
+test_description='git status --porcelain=v2
+
+This test exercises porcelain V2 output for git status.'
+
+
+. ./test-lib.sh
+
+
+test_expect_success setup '
+       test_tick &&
+       git config core.autocrlf false &&
+       echo x >file_x &&
+       echo y >file_y &&
+       echo z >file_z &&
+       mkdir dir1 &&
+       echo a >dir1/file_a &&
+       echo b >dir1/file_b
+'
+
+test_expect_success 'before initial commit, nothing added, only untracked' '
+       cat >expect <<-EOF &&
+       # branch.oid (initial)
+       # branch.head master
+       ? actual
+       ? dir1/
+       ? expect
+       ? file_x
+       ? file_y
+       ? file_z
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=normal >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'before initial commit, things added' '
+       git add file_x file_y file_z dir1 &&
+       OID_A=$(git hash-object -t blob -- dir1/file_a) &&
+       OID_B=$(git hash-object -t blob -- dir1/file_b) &&
+       OID_X=$(git hash-object -t blob -- file_x) &&
+       OID_Y=$(git hash-object -t blob -- file_y) &&
+       OID_Z=$(git hash-object -t blob -- file_z) &&
+
+       cat >expect <<-EOF &&
+       # branch.oid (initial)
+       # branch.head master
+       1 A. N... 000000 100644 100644 $_z40 $OID_A dir1/file_a
+       1 A. N... 000000 100644 100644 $_z40 $OID_B dir1/file_b
+       1 A. N... 000000 100644 100644 $_z40 $OID_X file_x
+       1 A. N... 000000 100644 100644 $_z40 $OID_Y file_y
+       1 A. N... 000000 100644 100644 $_z40 $OID_Z file_z
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'before initial commit, things added (-z)' '
+       lf_to_nul >expect <<-EOF &&
+       # branch.oid (initial)
+       # branch.head master
+       1 A. N... 000000 100644 100644 $_z40 $OID_A dir1/file_a
+       1 A. N... 000000 100644 100644 $_z40 $OID_B dir1/file_b
+       1 A. N... 000000 100644 100644 $_z40 $OID_X file_x
+       1 A. N... 000000 100644 100644 $_z40 $OID_Y file_y
+       1 A. N... 000000 100644 100644 $_z40 $OID_Z file_z
+       ? actual
+       ? expect
+       EOF
+
+       git status -z --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'make first commit, comfirm HEAD oid and branch' '
+       git commit -m initial &&
+       H0=$(git rev-parse HEAD) &&
+       cat >expect <<-EOF &&
+       # branch.oid $H0
+       # branch.head master
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'after first commit, create unstaged changes' '
+       echo x >>file_x &&
+       OID_X1=$(git hash-object -t blob -- file_x) &&
+       rm file_z &&
+       H0=$(git rev-parse HEAD) &&
+
+       cat >expect <<-EOF &&
+       # branch.oid $H0
+       # branch.head master
+       1 .M N... 100644 100644 100644 $OID_X $OID_X file_x
+       1 .D N... 100644 100644 000000 $OID_Z $OID_Z file_z
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'after first commit but omit untracked files and branch' '
+       cat >expect <<-EOF &&
+       1 .M N... 100644 100644 100644 $OID_X $OID_X file_x
+       1 .D N... 100644 100644 000000 $OID_Z $OID_Z file_z
+       EOF
+
+       git status --porcelain=v2 --untracked-files=no >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'after first commit, stage existing changes' '
+       git add file_x &&
+       git rm file_z &&
+       H0=$(git rev-parse HEAD) &&
+
+       cat >expect <<-EOF &&
+       # branch.oid $H0
+       # branch.head master
+       1 M. N... 100644 100644 100644 $OID_X $OID_X1 file_x
+       1 D. N... 100644 000000 000000 $OID_Z $_z40 file_z
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rename causes 2 path lines' '
+       git mv file_y renamed_y &&
+       H0=$(git rev-parse HEAD) &&
+
+       q_to_tab >expect <<-EOF &&
+       # branch.oid $H0
+       # branch.head master
+       1 M. N... 100644 100644 100644 $OID_X $OID_X1 file_x
+       1 D. N... 100644 000000 000000 $OID_Z $_z40 file_z
+       2 R. N... 100644 100644 100644 $OID_Y $OID_Y R100 renamed_yQfile_y
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rename causes 2 path lines (-z)' '
+       H0=$(git rev-parse HEAD) &&
+
+       ## Lines use NUL path separator and line terminator, so double transform here.
+       q_to_nul <<-EOF | lf_to_nul >expect &&
+       # branch.oid $H0
+       # branch.head master
+       1 M. N... 100644 100644 100644 $OID_X $OID_X1 file_x
+       1 D. N... 100644 000000 000000 $OID_Z $_z40 file_z
+       2 R. N... 100644 100644 100644 $OID_Y $OID_Y R100 renamed_yQfile_y
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all -z >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'make second commit, confirm clean and new HEAD oid' '
+       git commit -m second &&
+       H1=$(git rev-parse HEAD) &&
+
+       cat >expect <<-EOF &&
+       # branch.oid $H1
+       # branch.head master
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'confirm ignored files are not printed' '
+       test_when_finished "rm -f x.ign .gitignore" &&
+       echo x.ign >.gitignore &&
+       echo "ignore me" >x.ign &&
+
+       cat >expect <<-EOF &&
+       ? .gitignore
+       ? actual
+       ? expect
+       EOF
+
+       git status --porcelain=v2 --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'ignored files are printed with --ignored' '
+       test_when_finished "rm -f x.ign .gitignore" &&
+       echo x.ign >.gitignore &&
+       echo "ignore me" >x.ign &&
+
+       cat >expect <<-EOF &&
+       ? .gitignore
+       ? actual
+       ? expect
+       ! x.ign
+       EOF
+
+       git status --porcelain=v2 --ignored --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'create and commit permanent ignore file' '
+       cat >.gitignore <<-EOF &&
+       actual*
+       expect*
+       EOF
+
+       git add .gitignore &&
+       git commit -m ignore_trash &&
+       H1=$(git rev-parse HEAD) &&
+
+       cat >expect <<-EOF &&
+       # branch.oid $H1
+       # branch.head master
+       EOF
+
+       git status --porcelain=v2 --branch >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'verify --intent-to-add output' '
+       test_when_finished "git rm -f intent1.add intent2.add" &&
+       touch intent1.add &&
+       echo test >intent2.add &&
+
+       git add --intent-to-add intent1.add intent2.add &&
+
+       cat >expect <<-EOF &&
+       1 .A N... 000000 000000 100644 $_z40 $_z40 intent1.add
+       1 .A N... 000000 000000 100644 $_z40 $_z40 intent2.add
+       EOF
+
+       git status --porcelain=v2 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'verify AA (add-add) conflict' '
+       test_when_finished "git reset --hard" &&
+
+       git branch AA_A master &&
+       git checkout AA_A &&
+       echo "Branch AA_A" >conflict.txt &&
+       OID_AA_A=$(git hash-object -t blob -- conflict.txt) &&
+       git add conflict.txt &&
+       git commit -m "branch aa_a" &&
+
+       git branch AA_B master &&
+       git checkout AA_B &&
+       echo "Branch AA_B" >conflict.txt &&
+       OID_AA_B=$(git hash-object -t blob -- conflict.txt) &&
+       git add conflict.txt &&
+       git commit -m "branch aa_b" &&
+
+       git branch AA_M AA_B &&
+       git checkout AA_M &&
+       test_must_fail git merge AA_A &&
+
+       HM=$(git rev-parse HEAD) &&
+
+       cat >expect <<-EOF &&
+       # branch.oid $HM
+       # branch.head AA_M
+       u AA N... 000000 100644 100644 100644 $_z40 $OID_AA_B $OID_AA_A conflict.txt
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'verify UU (edit-edit) conflict' '
+       test_when_finished "git reset --hard" &&
+
+       git branch UU_ANC master &&
+       git checkout UU_ANC &&
+       echo "Ancestor" >conflict.txt &&
+       OID_UU_ANC=$(git hash-object -t blob -- conflict.txt) &&
+       git add conflict.txt &&
+       git commit -m "UU_ANC" &&
+
+       git branch UU_A UU_ANC &&
+       git checkout UU_A &&
+       echo "Branch UU_A" >conflict.txt &&
+       OID_UU_A=$(git hash-object -t blob -- conflict.txt) &&
+       git add conflict.txt &&
+       git commit -m "branch uu_a" &&
+
+       git branch UU_B UU_ANC &&
+       git checkout UU_B &&
+       echo "Branch UU_B" >conflict.txt &&
+       OID_UU_B=$(git hash-object -t blob -- conflict.txt) &&
+       git add conflict.txt &&
+       git commit -m "branch uu_b" &&
+
+       git branch UU_M UU_B &&
+       git checkout UU_M &&
+       test_must_fail git merge UU_A &&
+
+       HM=$(git rev-parse HEAD) &&
+
+       cat >expect <<-EOF &&
+       # branch.oid $HM
+       # branch.head UU_M
+       u UU N... 100644 100644 100644 100644 $OID_UU_ANC $OID_UU_B $OID_UU_A conflict.txt
+       EOF
+
+       git status --porcelain=v2 --branch --untracked-files=all >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'verify upstream fields in branch header' '
+       git checkout master &&
+       test_when_finished "rm -rf sub_repo" &&
+       git clone . sub_repo &&
+       (
+               ## Confirm local master tracks remote master.
+               cd sub_repo &&
+               HUF=$(git rev-parse HEAD) &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HUF
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +0 -0
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual &&
+
+               ## Test ahead/behind.
+               echo xyz >file_xyz &&
+               git add file_xyz &&
+               git commit -m xyz &&
+
+               HUF=$(git rev-parse HEAD) &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HUF
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +1 -0
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual &&
+
+               ## Repeat the above but without --branch.
+               cat >expect <<-EOF &&
+               EOF
+
+               git status --porcelain=v2 --untracked-files=all >actual &&
+               test_cmp expect actual &&
+
+               ## Test upstream-gone case. Fake this by pointing origin/master at
+               ## a non-existing commit.
+               OLD=$(git rev-parse origin/master) &&
+               NEW=$_z40 &&
+               mv .git/packed-refs .git/old-packed-refs &&
+               sed "s/$OLD/$NEW/g" <.git/old-packed-refs >.git/packed-refs &&
+
+               HUF=$(git rev-parse HEAD) &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HUF
+               # branch.head master
+               # branch.upstream origin/master
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'create and add submodule, submodule appears clean (A. S...)' '
+       git checkout master &&
+       git clone . sub_repo &&
+       git clone . super_repo &&
+       (       cd super_repo &&
+               git submodule add ../sub_repo sub1 &&
+
+               ## Confirm stage/add of clean submodule.
+               HMOD=$(git hash-object -t blob -- .gitmodules) &&
+               HSUP=$(git rev-parse HEAD) &&
+               HSUB=$HSUP &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +0 -0
+               1 A. N... 000000 100644 100644 $_z40 $HMOD .gitmodules
+               1 A. S... 000000 160000 160000 $_z40 $HSUB sub1
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'untracked changes in added submodule (AM S..U)' '
+       (       cd super_repo &&
+               ## create untracked file in the submodule.
+               (       cd sub1 &&
+                       echo "xxxx" >file_in_sub
+               ) &&
+
+               HMOD=$(git hash-object -t blob -- .gitmodules) &&
+               HSUP=$(git rev-parse HEAD) &&
+               HSUB=$HSUP &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +0 -0
+               1 A. N... 000000 100644 100644 $_z40 $HMOD .gitmodules
+               1 AM S..U 000000 160000 160000 $_z40 $HSUB sub1
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'staged changes in added submodule (AM S.M.)' '
+       (       cd super_repo &&
+               ## stage the changes in the submodule.
+               (       cd sub1 &&
+                       git add file_in_sub
+               ) &&
+
+               HMOD=$(git hash-object -t blob -- .gitmodules) &&
+               HSUP=$(git rev-parse HEAD) &&
+               HSUB=$HSUP &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +0 -0
+               1 A. N... 000000 100644 100644 $_z40 $HMOD .gitmodules
+               1 AM S.M. 000000 160000 160000 $_z40 $HSUB sub1
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'staged and unstaged changes in added (AM S.M.)' '
+       (       cd super_repo &&
+               (       cd sub1 &&
+                       ## make additional unstaged changes (on the same file) in the submodule.
+                       ## This does not cause us to get S.MU (because the submodule does not report
+                       ## a "?" line for the unstaged changes).
+                       echo "more changes" >>file_in_sub
+               ) &&
+
+               HMOD=$(git hash-object -t blob -- .gitmodules) &&
+               HSUP=$(git rev-parse HEAD) &&
+               HSUB=$HSUP &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +0 -0
+               1 A. N... 000000 100644 100644 $_z40 $HMOD .gitmodules
+               1 AM S.M. 000000 160000 160000 $_z40 $HSUB sub1
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'staged and untracked changes in added submodule (AM S.MU)' '
+       (       cd super_repo &&
+               (       cd sub1 &&
+                       ## stage new changes in tracked file.
+                       git add file_in_sub &&
+                       ## create new untracked file.
+                       echo "yyyy" >>another_file_in_sub
+               ) &&
+
+               HMOD=$(git hash-object -t blob -- .gitmodules) &&
+               HSUP=$(git rev-parse HEAD) &&
+               HSUB=$HSUP &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +0 -0
+               1 A. N... 000000 100644 100644 $_z40 $HMOD .gitmodules
+               1 AM S.MU 000000 160000 160000 $_z40 $HSUB sub1
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'commit within the submodule appears as new commit in super (AM SC..)' '
+       (       cd super_repo &&
+               (       cd sub1 &&
+                       ## Make a new commit in the submodule.
+                       git add file_in_sub &&
+                       rm -f another_file_in_sub &&
+                       git commit -m "new commit"
+               ) &&
+
+               HMOD=$(git hash-object -t blob -- .gitmodules) &&
+               HSUP=$(git rev-parse HEAD) &&
+               HSUB=$HSUP &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +0 -0
+               1 A. N... 000000 100644 100644 $_z40 $HMOD .gitmodules
+               1 AM SC.. 000000 160000 160000 $_z40 $HSUB sub1
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'stage submodule in super and commit' '
+       (       cd super_repo &&
+               ## Stage the new submodule commit in the super.
+               git add sub1 &&
+               ## Commit the super so that the sub no longer appears as added.
+               git commit -m "super commit" &&
+
+               HSUP=$(git rev-parse HEAD) &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +1 -0
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'make unstaged changes in existing submodule (.M S.M.)' '
+       (       cd super_repo &&
+               (       cd sub1 &&
+                       echo "zzzz" >>file_in_sub
+               ) &&
+
+               HSUP=$(git rev-parse HEAD) &&
+               HSUB=$(cd sub1 && git rev-parse HEAD) &&
+
+               cat >expect <<-EOF &&
+               # branch.oid $HSUP
+               # branch.head master
+               # branch.upstream origin/master
+               # branch.ab +1 -0
+               1 .M S.M. 160000 160000 160000 $HSUB $HSUB sub1
+               EOF
+
+               git status --porcelain=v2 --branch --untracked-files=all >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_done
index b89fd2a6ada025fc0e68b1a1c3d7e739aacec688..7b36954d63d70e79149cf1558a93586e1b39c867 100755 (executable)
@@ -653,4 +653,20 @@ test_expect_success 'git clean -d respects pathspecs (pathspec is prefix of dir)
        test_path_is_dir foobar
 '
 
+test_expect_success 'git clean -d skips untracked dirs containing ignored files' '
+       echo /foo/bar >.gitignore &&
+       echo ignoreme >>.gitignore &&
+       rm -rf foo &&
+       mkdir -p foo/a/aa/aaa foo/b/bb/bbb &&
+       touch foo/bar foo/baz foo/a/aa/ignoreme foo/b/ignoreme foo/b/bb/1 foo/b/bb/2 &&
+       git clean -df &&
+       test_path_is_dir foo &&
+       test_path_is_file foo/bar &&
+       test_path_is_missing foo/baz &&
+       test_path_is_file foo/a/aa/ignoreme &&
+       test_path_is_missing foo/a/aa/aaa &&
+       test_path_is_file foo/b/ignoreme &&
+       test_path_is_missing foo/b/bb
+'
+
 test_done
index b77cce8e4066ac7f46ba1a02eab7215a4cdeaaae..dcac364c5fa2a8ff7fe264a21fb9682ec934a874 100755 (executable)
@@ -38,6 +38,14 @@ test_expect_success 'submodule update aborts on missing .gitmodules file' '
        test_i18ngrep "Submodule path .sub. not initialized" actual
 '
 
+test_expect_success 'submodule update aborts on missing gitmodules url' '
+       test_when_finished "git update-index --remove sub" &&
+       git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&
+       test_when_finished "rm -f .gitmodules" &&
+       git config -f .gitmodules submodule.s.path sub &&
+       test_must_fail git submodule init
+'
+
 test_expect_success 'configuration parsing' '
        test_when_finished "rm -f .gitmodules" &&
        cat >.gitmodules <<-\EOF &&
@@ -152,6 +160,20 @@ test_expect_success 'submodule add to .gitignored path with --force' '
        )
 '
 
+test_expect_success 'submodule add to reconfigure existing submodule with --force' '
+       (
+               cd addtest-ignore &&
+               git submodule add --force bogus-url submod &&
+               git submodule add -b initial "$submodurl" submod-branch &&
+               test "bogus-url" = "$(git config -f .gitmodules submodule.submod.url)" &&
+               test "bogus-url" = "$(git config submodule.submod.url)" &&
+               # Restore the url
+               git submodule add --force "$submodurl" submod
+               test "$submodurl" = "$(git config -f .gitmodules submodule.submod.url)" &&
+               test "$submodurl" = "$(git config submodule.submod.url)"
+       )
+'
+
 test_expect_success 'submodule add --branch' '
        echo "refs/heads/initial" >expect-head &&
        cat <<-\EOF >expect-heads &&
@@ -259,6 +281,20 @@ test_expect_success 'submodule add with ./, /.. and // in path' '
        test_cmp empty untracked
 '
 
+test_expect_success !CYGWIN 'submodule add with \\ in path' '
+       test_when_finished "rm -rf parent sub\\with\\backslash" &&
+
+       # Initialize a repo with a backslash in its name
+       git init sub\\with\\backslash &&
+       touch sub\\with\\backslash/empty.file &&
+       git -C sub\\with\\backslash add empty.file &&
+       git -C sub\\with\\backslash commit -m "Added empty.file" &&
+
+       # Add that repository as a submodule
+       git init parent &&
+       git -C parent submodule add ../sub\\with\\backslash
+'
+
 test_expect_success 'submodule add in subdirectory' '
        echo "refs/heads/master" >expect &&
        >empty &&
@@ -1116,5 +1152,141 @@ test_expect_success 'submodule helper list is not confused by common prefixes' '
        test_cmp expect actual
 '
 
+test_expect_success 'setup superproject with submodules' '
+       git init sub1 &&
+       test_commit -C sub1 test &&
+       test_commit -C sub1 test2 &&
+       git init multisuper &&
+       git -C multisuper submodule add ../sub1 sub0 &&
+       git -C multisuper submodule add ../sub1 sub1 &&
+       git -C multisuper submodule add ../sub1 sub2 &&
+       git -C multisuper submodule add ../sub1 sub3 &&
+       git -C multisuper commit -m "add some submodules"
+'
+
+cat >expect <<-EOF
+-sub0
+ sub1 (test2)
+ sub2 (test2)
+ sub3 (test2)
+EOF
+
+test_expect_success 'submodule update --init with a specification' '
+       test_when_finished "rm -rf multisuper_clone" &&
+       pwd=$(pwd) &&
+       git clone file://"$pwd"/multisuper multisuper_clone &&
+       git -C multisuper_clone submodule update --init . ":(exclude)sub0" &&
+       git -C multisuper_clone submodule status |cut -c 1,43- >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'submodule update --init with submodule.active set' '
+       test_when_finished "rm -rf multisuper_clone" &&
+       pwd=$(pwd) &&
+       git clone file://"$pwd"/multisuper multisuper_clone &&
+       git -C multisuper_clone config submodule.active "." &&
+       git -C multisuper_clone config --add submodule.active ":(exclude)sub0" &&
+       git -C multisuper_clone submodule update --init &&
+       git -C multisuper_clone submodule status |cut -c 1,43- >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'submodule update and setting submodule.<name>.active' '
+       test_when_finished "rm -rf multisuper_clone" &&
+       pwd=$(pwd) &&
+       git clone file://"$pwd"/multisuper multisuper_clone &&
+       git -C multisuper_clone config --bool submodule.sub0.active "true" &&
+       git -C multisuper_clone config --bool submodule.sub1.active "false" &&
+       git -C multisuper_clone config --bool submodule.sub2.active "true" &&
+
+       cat >expect <<-\EOF &&
+        sub0 (test2)
+       -sub1
+        sub2 (test2)
+       -sub3
+       EOF
+       git -C multisuper_clone submodule update &&
+       git -C multisuper_clone submodule status |cut -c 1,43- >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'clone --recurse-submodules with a pathspec works' '
+       test_when_finished "rm -rf multisuper_clone" &&
+       cat >expected <<-\EOF &&
+        sub0 (test2)
+       -sub1
+       -sub2
+       -sub3
+       EOF
+
+       git clone --recurse-submodules="sub0" multisuper multisuper_clone &&
+       git -C multisuper_clone submodule status |cut -c1,43- >actual &&
+       test_cmp actual expected
+'
+
+test_expect_success 'clone with multiple --recurse-submodules options' '
+       test_when_finished "rm -rf multisuper_clone" &&
+       cat >expect <<-\EOF &&
+       -sub0
+        sub1 (test2)
+       -sub2
+        sub3 (test2)
+       EOF
+
+       git clone --recurse-submodules="." \
+                 --recurse-submodules=":(exclude)sub0" \
+                 --recurse-submodules=":(exclude)sub2" \
+                 multisuper multisuper_clone &&
+       git -C multisuper_clone submodule status |cut -c1,43- >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'clone and subsequent updates correctly auto-initialize submodules' '
+       test_when_finished "rm -rf multisuper_clone" &&
+       cat <<-\EOF >expect &&
+       -sub0
+        sub1 (test2)
+       -sub2
+        sub3 (test2)
+       EOF
+
+       cat <<-\EOF >expect2 &&
+       -sub0
+        sub1 (test2)
+       -sub2
+        sub3 (test2)
+       -sub4
+        sub5 (test2)
+       EOF
+
+       git clone --recurse-submodules="." \
+                 --recurse-submodules=":(exclude)sub0" \
+                 --recurse-submodules=":(exclude)sub2" \
+                 --recurse-submodules=":(exclude)sub4" \
+                 multisuper multisuper_clone &&
+
+       git -C multisuper_clone submodule status |cut -c1,43- >actual &&
+       test_cmp expect actual &&
+
+       git -C multisuper submodule add ../sub1 sub4 &&
+       git -C multisuper submodule add ../sub1 sub5 &&
+       git -C multisuper commit -m "add more submodules" &&
+       # obtain the new superproject
+       git -C multisuper_clone pull &&
+       git -C multisuper_clone submodule update --init &&
+       git -C multisuper_clone submodule status |cut -c1,43- >actual &&
+       test_cmp expect2 actual
+'
+
+test_expect_success 'init properly sets the config' '
+       test_when_finished "rm -rf multisuper_clone" &&
+       git clone --recurse-submodules="." \
+                 --recurse-submodules=":(exclude)sub0" \
+                 multisuper multisuper_clone &&
+
+       git -C multisuper_clone submodule init -- sub0 sub1 &&
+       git -C multisuper_clone config --get submodule.sub0.active &&
+       test_must_fail git -C multisuper_clone config --get submodule.sub1.active
+'
 
 test_done
index 64f322c4cc87493ebc060ae5837495563fe61958..034914a14fd49fea07e8bff4802994fcd38807a9 100755 (executable)
@@ -140,6 +140,23 @@ test_expect_success 'submodule update --init --recursive from subdirectory' '
        test_i18ncmp expect2 actual2
 '
 
+cat <<EOF >expect2
+Submodule 'foo/sub' ($pwd/withsubs/../rebasing) registered for path 'sub'
+EOF
+
+test_expect_success 'submodule update --init from and of subdirectory' '
+       git init withsubs &&
+       (cd withsubs &&
+        mkdir foo &&
+        git submodule add "$(pwd)/../rebasing" foo/sub &&
+        (cd foo &&
+         git submodule deinit -f sub &&
+         git submodule update --init sub 2>../../actual2
+        )
+       ) &&
+       test_i18ncmp expect2 actual2
+'
+
 apos="'";
 test_expect_success 'submodule update does not fetch already present commits' '
        (cd submodule &&
@@ -424,6 +441,16 @@ test_expect_success 'submodule update - command in .git/config catches failure -
        test_i18ncmp actual expect
 '
 
+test_expect_success 'submodule update - command run for initial population of submodule' '
+       cat >expect <<-EOF &&
+       Execution of '\''false $submodulesha1'\'' failed in submodule path '\''submodule'\''
+       EOF
+       rm -rf super/submodule &&
+       test_must_fail git -C super submodule update 2>actual &&
+       test_i18ncmp expect actual &&
+       git -C super submodule update --checkout
+'
+
 cat << EOF >expect
 Execution of 'false $submodulesha1' failed in submodule path '../super/submodule'
 Failed to recurse into submodule path '../super'
@@ -476,6 +503,7 @@ test_expect_success 'submodule init picks up merge' '
 '
 
 test_expect_success 'submodule update --merge  - ignores --merge  for new submodules' '
+       test_config -C super submodule.submodule.update checkout &&
        (cd super &&
         rm -rf submodule &&
         git submodule update submodule &&
@@ -488,6 +516,7 @@ test_expect_success 'submodule update --merge  - ignores --merge  for new submod
 '
 
 test_expect_success 'submodule update --rebase - ignores --rebase for new submodules' '
+       test_config -C super submodule.submodule.update checkout &&
        (cd super &&
         rm -rf submodule &&
         git submodule update submodule &&
index eaea19b8f291ef6b9f13a05342dc10317f3bfbe9..e159fc5035d08eee2c1577afd2ac792ddce2934c 100755 (executable)
@@ -8,74 +8,187 @@ test_description='test clone --reference'
 
 base_dir=$(pwd)
 
-U=$base_dir/UPLOAD_LOG
-
-test_expect_success 'preparing first repository' \
-'test_create_repo A && cd A &&
-echo first > file1 &&
-git add file1 &&
-git commit -m A-initial'
-
-cd "$base_dir"
-
-test_expect_success 'preparing second repository' \
-'git clone A B && cd B &&
-echo second > file2 &&
-git add file2 &&
-git commit -m B-addition &&
-git repack -a -d &&
-git prune'
-
-cd "$base_dir"
-
-test_expect_success 'preparing superproject' \
-'test_create_repo super && cd super &&
-echo file > file &&
-git add file &&
-git commit -m B-super-initial'
-
-cd "$base_dir"
-
-test_expect_success 'submodule add --reference' \
-'cd super && git submodule add --reference ../B "file://$base_dir/A" sub &&
-git commit -m B-super-added'
-
-cd "$base_dir"
-
-test_expect_success 'after add: existence of info/alternates' \
-'test_line_count = 1 super/.git/modules/sub/objects/info/alternates'
-
-cd "$base_dir"
-
-test_expect_success 'that reference gets used with add' \
-'cd super/sub &&
-echo "0 objects, 0 kilobytes" > expected &&
-git count-objects > current &&
-diff expected current'
-
-cd "$base_dir"
-
-test_expect_success 'cloning superproject' \
-'git clone super super-clone'
-
-cd "$base_dir"
-
-test_expect_success 'update with reference' \
-'cd super-clone && git submodule update --init --reference ../B'
-
-cd "$base_dir"
-
-test_expect_success 'after update: existence of info/alternates' \
-'test_line_count = 1 super-clone/.git/modules/sub/objects/info/alternates'
-
-cd "$base_dir"
-
-test_expect_success 'that reference gets used with update' \
-'cd super-clone/sub &&
-echo "0 objects, 0 kilobytes" > expected &&
-git count-objects > current &&
-diff expected current'
-
-cd "$base_dir"
+test_alternate_is_used () {
+       alternates_file="$1" &&
+       working_dir="$2" &&
+       test_line_count = 1 "$alternates_file" &&
+       echo "0 objects, 0 kilobytes" >expect &&
+       git -C "$working_dir" count-objects >actual &&
+       test_cmp expect actual
+}
+
+test_expect_success 'preparing first repository' '
+       test_create_repo A &&
+       (
+               cd A &&
+               echo first >file1 &&
+               git add file1 &&
+               git commit -m A-initial
+       )
+'
+
+test_expect_success 'preparing second repository' '
+       git clone A B &&
+       (
+               cd B &&
+               echo second >file2 &&
+               git add file2 &&
+               git commit -m B-addition &&
+               git repack -a -d &&
+               git prune
+       )
+'
+
+test_expect_success 'preparing superproject' '
+       test_create_repo super &&
+       (
+               cd super &&
+               echo file >file &&
+               git add file &&
+               git commit -m B-super-initial
+       )
+'
+
+test_expect_success 'submodule add --reference uses alternates' '
+       (
+               cd super &&
+               git submodule add --reference ../B "file://$base_dir/A" sub &&
+               git commit -m B-super-added &&
+               git repack -ad
+       ) &&
+       test_alternate_is_used super/.git/modules/sub/objects/info/alternates super/sub
+'
+
+test_expect_success 'that reference gets used with add' '
+       (
+               cd super/sub &&
+               echo "0 objects, 0 kilobytes" >expected &&
+               git count-objects >current &&
+               diff expected current
+       )
+'
+
+# The tests up to this point, and repositories created by them
+# (A, B, super and super/sub), are about setting up the stage
+# for subsequent tests and meant to be kept throughout the
+# remainder of the test.
+# Tests from here on, if they create their own test repository,
+# are expected to clean after themselves.
+
+test_expect_success 'updating superproject keeps alternates' '
+       test_when_finished "rm -rf super-clone" &&
+       git clone super super-clone &&
+       git -C super-clone submodule update --init --reference ../B &&
+       test_alternate_is_used super-clone/.git/modules/sub/objects/info/alternates super-clone/sub
+'
+
+test_expect_success 'submodules use alternates when cloning a superproject' '
+       test_when_finished "rm -rf super-clone" &&
+       git clone --reference super --recursive super super-clone &&
+       (
+               cd super-clone &&
+               # test superproject has alternates setup correctly
+               test_alternate_is_used .git/objects/info/alternates . &&
+               # test submodule has correct setup
+               test_alternate_is_used .git/modules/sub/objects/info/alternates sub
+       )
+'
+
+test_expect_success 'missing submodule alternate fails clone and submodule update' '
+       test_when_finished "rm -rf super-clone" &&
+       git clone super super2 &&
+       test_must_fail git clone --recursive --reference super2 super2 super-clone &&
+       (
+               cd super-clone &&
+               # test superproject has alternates setup correctly
+               test_alternate_is_used .git/objects/info/alternates . &&
+               # update of the submodule succeeds
+               test_must_fail git submodule update --init &&
+               # and we have no alternates:
+               test_must_fail test_alternate_is_used .git/modules/sub/objects/info/alternates sub &&
+               test_must_fail test_path_is_file sub/file1
+       )
+'
+
+test_expect_success 'ignoring missing submodule alternates passes clone and submodule update' '
+       test_when_finished "rm -rf super-clone" &&
+       git clone --reference-if-able super2 --recursive super2 super-clone &&
+       (
+               cd super-clone &&
+               # test superproject has alternates setup correctly
+               test_alternate_is_used .git/objects/info/alternates . &&
+               # update of the submodule succeeds
+               git submodule update --init &&
+               # and we have no alternates:
+               test_must_fail test_alternate_is_used .git/modules/sub/objects/info/alternates sub &&
+               test_path_is_file sub/file1
+       )
+'
+
+test_expect_success 'preparing second superproject with a nested submodule plus partial clone' '
+       test_create_repo supersuper &&
+       (
+               cd supersuper &&
+               echo "I am super super." >file &&
+               git add file &&
+               git commit -m B-super-super-initial
+               git submodule add "file://$base_dir/super" subwithsub &&
+               git commit -m B-super-super-added &&
+               git submodule update --init --recursive &&
+               git repack -ad
+       ) &&
+       git clone supersuper supersuper2 &&
+       (
+               cd supersuper2 &&
+               git submodule update --init
+       )
+'
+
+# At this point there are three root-level positories: A, B, super and super2
+
+test_expect_success 'nested submodule alternate in works and is actually used' '
+       test_when_finished "rm -rf supersuper-clone" &&
+       git clone --recursive --reference supersuper supersuper supersuper-clone &&
+       (
+               cd supersuper-clone &&
+               # test superproject has alternates setup correctly
+               test_alternate_is_used .git/objects/info/alternates . &&
+               # immediate submodule has alternate:
+               test_alternate_is_used .git/modules/subwithsub/objects/info/alternates subwithsub &&
+               # nested submodule also has alternate:
+               test_alternate_is_used .git/modules/subwithsub/modules/sub/objects/info/alternates subwithsub/sub
+       )
+'
+
+check_that_two_of_three_alternates_are_used() {
+       test_alternate_is_used .git/objects/info/alternates . &&
+       # immediate submodule has alternate:
+       test_alternate_is_used .git/modules/subwithsub/objects/info/alternates subwithsub &&
+       # but nested submodule has no alternate:
+       test_must_fail test_alternate_is_used .git/modules/subwithsub/modules/sub/objects/info/alternates subwithsub/sub
+}
+
+
+test_expect_success 'missing nested submodule alternate fails clone and submodule update' '
+       test_when_finished "rm -rf supersuper-clone" &&
+       test_must_fail git clone --recursive --reference supersuper2 supersuper2 supersuper-clone &&
+       (
+               cd supersuper-clone &&
+               check_that_two_of_three_alternates_are_used &&
+               # update of the submodule fails
+               test_must_fail git submodule update --init --recursive
+       )
+'
+
+test_expect_success 'missing nested submodule alternate in --reference-if-able mode' '
+       test_when_finished "rm -rf supersuper-clone" &&
+       git clone --recursive --reference-if-able supersuper2 supersuper2 supersuper-clone &&
+       (
+               cd supersuper-clone &&
+               check_that_two_of_three_alternates_are_used &&
+               # update of the submodule succeeds
+               git submodule update --init --recursive
+       )
+'
 
 test_done
index 47562ce4654db9d763cdf0c6d6b91724489110ff..eea36f1dbe37859c5b45ca18bb3c8f1080ff3f9a 100755 (executable)
@@ -93,6 +93,20 @@ test_expect_success 'error message contains blob reference' '
        )
 '
 
+test_expect_success 'using different treeishs works' '
+       (
+               cd super &&
+               git tag new_tag &&
+               tree=$(git rev-parse HEAD^{tree}) &&
+               commit=$(git rev-parse HEAD^{commit}) &&
+               test-submodule-config $commit b >expect &&
+               test-submodule-config $tree b >actual.1 &&
+               test-submodule-config new_tag b >actual.2 &&
+               test_cmp expect actual.1 &&
+               test_cmp expect actual.2
+       )
+'
+
 cat >super/expect_url <<EOF
 Submodule url: 'git@somewhere.else.net:a.git' for path 'b'
 Submodule url: 'git@somewhere.else.net:submodule.git' for path 'submodule'
@@ -120,12 +134,33 @@ test_expect_success 'reading of local configuration' '
                        "" submodule \
                                >actual &&
                test_cmp expect_local_path actual &&
-               git config submodule.a.url $old_a &&
-               git config submodule.submodule.url $old_submodule &&
+               git config submodule.a.url "$old_a" &&
+               git config submodule.submodule.url "$old_submodule" &&
                git config --unset submodule.a.path c
        )
 '
 
+cat >super/expect_url <<EOF
+Submodule url: '../submodule' for path 'b'
+Submodule url: 'git@somewhere.else.net:submodule.git' for path 'submodule'
+EOF
+
+test_expect_success 'reading of local configuration for uninitialized submodules' '
+       (
+               cd super &&
+               git submodule deinit -f b &&
+               old_submodule=$(git config submodule.submodule.url) &&
+               git config submodule.submodule.url git@somewhere.else.net:submodule.git &&
+               test-submodule-config --url \
+                       "" b \
+                       "" submodule \
+                               >actual &&
+               test_cmp expect_url actual &&
+               git config submodule.submodule.url "$old_submodule" &&
+               git submodule init b
+       )
+'
+
 cat >super/expect_fetchrecurse_die.err <<EOF
 fatal: bad submodule.submodule.fetchrecursesubmodules argument: blabla
 EOF
diff --git a/t/t7412-submodule-absorbgitdirs.sh b/t/t7412-submodule-absorbgitdirs.sh
new file mode 100755 (executable)
index 0000000..e2bbb44
--- /dev/null
@@ -0,0 +1,128 @@
+#!/bin/sh
+
+test_description='Test submodule absorbgitdirs
+
+This test verifies that `git submodue absorbgitdirs` moves a submodules git
+directory into the superproject.
+'
+
+. ./test-lib.sh
+
+test_expect_success 'setup a real submodule' '
+       git init sub1 &&
+       test_commit -C sub1 first &&
+       git submodule add ./sub1 &&
+       test_tick &&
+       git commit -m superproject
+'
+
+test_expect_success 'absorb the git dir' '
+       >expect.1 &&
+       >expect.2 &&
+       >actual.1 &&
+       >actual.2 &&
+       git status >expect.1 &&
+       git -C sub1 rev-parse HEAD >expect.2 &&
+       git submodule absorbgitdirs &&
+       git fsck &&
+       test -f sub1/.git &&
+       test -d .git/modules/sub1 &&
+       git status >actual.1 &&
+       git -C sub1 rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 'absorbing does not fail for deinitalized submodules' '
+       test_when_finished "git submodule update --init" &&
+       git submodule deinit --all &&
+       git submodule absorbgitdirs &&
+       test -d .git/modules/sub1 &&
+       test -d sub1 &&
+       ! test -e sub1/.git
+'
+
+test_expect_success 'setup nested submodule' '
+       git init sub1/nested &&
+       test_commit -C sub1/nested first_nested &&
+       git -C sub1 submodule add ./nested &&
+       test_tick &&
+       git -C sub1 commit -m "add nested" &&
+       git add sub1 &&
+       git commit -m "sub1 to include nested submodule"
+'
+
+test_expect_success 'absorb the git dir in a nested submodule' '
+       git status >expect.1 &&
+       git -C sub1/nested rev-parse HEAD >expect.2 &&
+       git submodule absorbgitdirs &&
+       test -f sub1/nested/.git &&
+       test -d .git/modules/sub1/modules/nested &&
+       git status >actual.1 &&
+       git -C sub1/nested rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 're-setup nested submodule' '
+       # un-absorb the direct submodule, to test if the nested submodule
+       # is still correct (needs a rewrite of the gitfile only)
+       rm -rf sub1/.git &&
+       mv .git/modules/sub1 sub1/.git &&
+       GIT_WORK_TREE=. git -C sub1 config --unset core.worktree &&
+       # fixup the nested submodule
+       echo "gitdir: ../.git/modules/nested" >sub1/nested/.git &&
+       GIT_WORK_TREE=../../../nested git -C sub1/.git/modules/nested config \
+               core.worktree "../../../nested" &&
+       # make sure this re-setup is correct
+       git status --ignore-submodules=none
+'
+
+test_expect_success 'absorb the git dir in a nested submodule' '
+       git status >expect.1 &&
+       git -C sub1/nested rev-parse HEAD >expect.2 &&
+       git submodule absorbgitdirs &&
+       test -f sub1/.git &&
+       test -f sub1/nested/.git &&
+       test -d .git/modules/sub1/modules/nested &&
+       git status >actual.1 &&
+       git -C sub1/nested rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 'setup a gitlink with missing .gitmodules entry' '
+       git init sub2 &&
+       test_commit -C sub2 first &&
+       git add sub2 &&
+       git commit -m superproject
+'
+
+test_expect_success 'absorbing the git dir fails for incomplete submodules' '
+       git status >expect.1 &&
+       git -C sub2 rev-parse HEAD >expect.2 &&
+       test_must_fail git submodule absorbgitdirs &&
+       git -C sub2 fsck &&
+       test -d sub2/.git &&
+       git status >actual &&
+       git -C sub2 rev-parse HEAD >actual.2 &&
+       test_cmp expect.1 actual.1 &&
+       test_cmp expect.2 actual.2
+'
+
+test_expect_success 'setup a submodule with multiple worktrees' '
+       # first create another unembedded git dir in a new submodule
+       git init sub3 &&
+       test_commit -C sub3 first &&
+       git submodule add ./sub3 &&
+       test_tick &&
+       git commit -m "add another submodule" &&
+       git -C sub3 worktree add ../sub3_second_work_tree
+'
+
+test_expect_success 'absorbing fails for a submodule with multiple worktrees' '
+       test_must_fail git submodule absorbgitdirs sub3 2>error &&
+       test_i18ngrep "not supported" error
+'
+
+test_done
diff --git a/t/t7413-submodule-is-active.sh b/t/t7413-submodule-is-active.sh
new file mode 100755 (executable)
index 0000000..9c785b0
--- /dev/null
@@ -0,0 +1,107 @@
+#!/bin/sh
+
+test_description='Test submodule--helper is-active
+
+This test verifies that `git submodue--helper is-active` correclty identifies
+submodules which are "active" and interesting to the user.
+'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+       git init sub &&
+       test_commit -C sub initial &&
+       git init super &&
+       test_commit -C super initial &&
+       git -C super submodule add ../sub sub1 &&
+       git -C super submodule add ../sub sub2 &&
+
+       # Remove submodule.<name>.active entries in order to test in an
+       # environment where only URLs are present in the conifg
+       git -C super config --unset submodule.sub1.active &&
+       git -C super config --unset submodule.sub2.active &&
+
+       git -C super commit -a -m "add 2 submodules at sub{1,2}"
+'
+
+test_expect_success 'is-active works with urls' '
+       git -C super submodule--helper is-active sub1 &&
+       git -C super submodule--helper is-active sub2 &&
+
+       git -C super config --unset submodule.sub1.URL &&
+       test_must_fail git -C super submodule--helper is-active sub1 &&
+       git -C super config submodule.sub1.URL ../sub &&
+       git -C super submodule--helper is-active sub1
+'
+
+test_expect_success 'is-active works with submodule.<name>.active config' '
+       test_when_finished "git -C super config --unset submodule.sub1.active" &&
+       test_when_finished "git -C super config submodule.sub1.URL ../sub" &&
+
+       git -C super config --bool submodule.sub1.active "false" &&
+       test_must_fail git -C super submodule--helper is-active sub1 &&
+
+       git -C super config --bool submodule.sub1.active "true" &&
+       git -C super config --unset submodule.sub1.URL &&
+       git -C super submodule--helper is-active sub1
+'
+
+test_expect_success 'is-active works with basic submodule.active config' '
+       test_when_finished "git -C super config submodule.sub1.URL ../sub" &&
+       test_when_finished "git -C super config --unset-all submodule.active" &&
+
+       git -C super config --add submodule.active "." &&
+       git -C super config --unset submodule.sub1.URL &&
+
+       git -C super submodule--helper is-active sub1 &&
+       git -C super submodule--helper is-active sub2
+'
+
+test_expect_success 'is-active correctly works with paths that are not submodules' '
+       test_when_finished "git -C super config --unset-all submodule.active" &&
+
+       test_must_fail git -C super submodule--helper is-active not-a-submodule &&
+
+       git -C super config --add submodule.active "." &&
+       test_must_fail git -C super submodule--helper is-active not-a-submodule
+'
+
+test_expect_success 'is-active works with exclusions in submodule.active config' '
+       test_when_finished "git -C super config --unset-all submodule.active" &&
+
+       git -C super config --add submodule.active "." &&
+       git -C super config --add submodule.active ":(exclude)sub1" &&
+
+       test_must_fail git -C super submodule--helper is-active sub1 &&
+       git -C super submodule--helper is-active sub2
+'
+
+test_expect_success 'is-active with submodule.active and submodule.<name>.active' '
+       test_when_finished "git -C super config --unset-all submodule.active" &&
+       test_when_finished "git -C super config --unset submodule.sub1.active" &&
+       test_when_finished "git -C super config --unset submodule.sub2.active" &&
+
+       git -C super config --add submodule.active "sub1" &&
+       git -C super config --bool submodule.sub1.active "false" &&
+       git -C super config --bool submodule.sub2.active "true" &&
+
+       test_must_fail git -C super submodule--helper is-active sub1 &&
+       git -C super submodule--helper is-active sub2
+'
+
+test_expect_success 'is-active, submodule.active and submodule add' '
+       test_when_finished "rm -rf super2" &&
+       git init super2 &&
+       test_commit -C super2 initial &&
+       git -C super2 config --add submodule.active "sub*" &&
+
+       # submodule add should only add submodule.<name>.active
+       # to the config if not matched by the pathspec
+       git -C super2 submodule add ../sub sub1 &&
+       test_must_fail git -C super2 config --get submodule.sub1.active &&
+
+       git -C super2 submodule add ../sub mod &&
+       git -C super2 config --get submodule.mod.active
+'
+
+test_done
index d84897a67a3c365e280f88b36f43fc49e1ac9d7b..0b6da7ae1fd3d15f0d47783d3af50cb17d2c66df 100755 (executable)
@@ -155,6 +155,15 @@ test_expect_success 'amend --only ignores staged contents' '
        git diff --exit-code
 '
 
+test_expect_success 'allow-empty --only ignores staged contents' '
+       echo changed-again >file &&
+       git add file &&
+       git commit --allow-empty --only -m "empty" &&
+       git cat-file blob HEAD:file >file.actual &&
+       test_cmp file.expect file.actual &&
+       git diff --exit-code
+'
+
 test_expect_success 'set up editor' '
        cat >editor <<-\EOF &&
        #!/bin/sh
@@ -460,6 +469,42 @@ $alt" &&
        test_cmp expected actual
 '
 
+test_expect_success 'signoff respects trailer config' '
+
+       echo 5 >positive &&
+       git add positive &&
+       git commit -s -m "subject
+
+non-trailer line
+Myfooter: x" &&
+       git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
+       (
+               echo subject
+               echo
+               echo non-trailer line
+               echo Myfooter: x
+               echo
+               echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
+       ) >expected &&
+       test_cmp expected actual &&
+
+       echo 6 >positive &&
+       git add positive &&
+       git -c "trailer.Myfooter.ifexists=add" commit -s -m "subject
+
+non-trailer line
+Myfooter: x" &&
+       git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
+       (
+               echo subject
+               echo
+               echo non-trailer line
+               echo Myfooter: x
+               echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
+       ) >expected &&
+       test_cmp expected actual
+'
+
 test_expect_success 'multiple -m' '
 
        >negative &&
index 8728db61d38905d9e3e699cb9f450716e4236017..88d4cda2992496d8ff5643caaaccf53e90dedc3a 100755 (executable)
@@ -220,4 +220,21 @@ test_expect_success "hook doesn't edit commit message (editor)" '
 
 '
 
+# set up fake editor to replace `pick` by `reword`
+cat > reword-editor <<'EOF'
+#!/bin/sh
+mv "$1" "$1".bup &&
+sed 's/^pick/reword/' <"$1".bup >"$1"
+EOF
+chmod +x reword-editor
+REWORD_EDITOR="$(pwd)/reword-editor"
+export REWORD_EDITOR
+
+test_expect_success 'hook is called for reword during `rebase -i`' '
+
+       GIT_SEQUENCE_EDITOR="\"$REWORD_EDITOR\"" git rebase -i HEAD^ &&
+       commit_msg_is "new message"
+
+'
+
 test_done
index d31b34da83d5ad336f2355acc0d2536b9d30e3ce..055c90736e9c0cfb60fef7db643f30c7573de581 100755 (executable)
@@ -17,6 +17,12 @@ test_create_repo_with_commit () {
        )
 }
 
+sanitize_output () {
+       sed -e "s/$_x40/HASH/" -e "s/$_x40/HASH/" output >output2 &&
+       mv output2 output
+}
+
+
 test_expect_success 'setup' '
        test_create_repo_with_commit sub &&
        echo output > .gitignore &&
@@ -50,6 +56,15 @@ test_expect_success 'status with modified file in submodule (porcelain)' '
        EOF
 '
 
+test_expect_success 'status with modified file in submodule (short)' '
+       (cd sub && git reset --hard) &&
+       echo "changed" >sub/foo &&
+       git status --short >output &&
+       diff output - <<-\EOF
+        m sub
+       EOF
+'
+
 test_expect_success 'status with added file in submodule' '
        (cd sub && git reset --hard && echo >foo && git add foo) &&
        git status >output &&
@@ -64,6 +79,14 @@ test_expect_success 'status with added file in submodule (porcelain)' '
        EOF
 '
 
+test_expect_success 'status with added file in submodule (short)' '
+       (cd sub && git reset --hard && echo >foo && git add foo) &&
+       git status --short >output &&
+       diff output - <<-\EOF
+        m sub
+       EOF
+'
+
 test_expect_success 'status with untracked file in submodule' '
        (cd sub && git reset --hard) &&
        echo "content" >sub/new-file &&
@@ -83,6 +106,13 @@ test_expect_success 'status with untracked file in submodule (porcelain)' '
        EOF
 '
 
+test_expect_success 'status with untracked file in submodule (short)' '
+       git status --short >output &&
+       diff output - <<-\EOF
+        ? sub
+       EOF
+'
+
 test_expect_success 'status with added and untracked file in submodule' '
        (cd sub && git reset --hard && echo >foo && git add foo) &&
        echo "content" >sub/new-file &&
@@ -177,8 +207,24 @@ test_expect_success 'status with added file in modified submodule with .git file
        test_i18ngrep "modified:   sub (new commits, modified content)" output
 '
 
+test_expect_success 'status with a lot of untracked files in the submodule' '
+       (
+               cd sub
+               i=0 &&
+               while test $i -lt 1024
+               do
+                       >some-file-$i
+                       i=$(( $i + 1 ))
+               done
+       ) &&
+       git status --porcelain sub 2>err.actual &&
+       test_must_be_empty err.actual &&
+       rm err.actual
+'
+
 test_expect_success 'rm submodule contents' '
-       rm -rf sub/* sub/.git
+       rm -rf sub &&
+       mkdir sub
 '
 
 test_expect_success 'status clean (empty submodule dir)' '
@@ -271,4 +317,91 @@ test_expect_success 'diff --submodule with merge conflict in .gitmodules' '
        test_cmp diff_submodule_actual diff_submodule_expect
 '
 
+# We'll setup different cases for further testing:
+# sub1 will contain a nested submodule,
+# sub2 will have an untracked file
+# sub3 will have an untracked repository
+test_expect_success 'setup superproject with untracked file in nested submodule' '
+       (
+               cd super &&
+               git clean -dfx &&
+               rm .gitmodules &&
+               git submodule add -f ./sub1 &&
+               git submodule add -f ./sub2 &&
+               git submodule add -f ./sub1 sub3 &&
+               git commit -a -m "messy merge in superproject" &&
+               (
+                       cd sub1 &&
+                       git submodule add ../sub2 &&
+                       git commit -a -m "add sub2 to sub1"
+               ) &&
+               git add sub1 &&
+               git commit -a -m "update sub1 to contain nested sub"
+       ) &&
+       echo content >super/sub1/sub2/file &&
+       echo content >super/sub2/file &&
+       git -C super/sub3 clone ../../sub2 untracked_repository
+'
+
+test_expect_success 'status with untracked file in nested submodule (porcelain)' '
+       git -C super status --porcelain >output &&
+       diff output - <<-\EOF
+        M sub1
+        M sub2
+        M sub3
+       EOF
+'
+
+test_expect_success 'status with untracked file in nested submodule (porcelain=2)' '
+       git -C super status --porcelain=2 >output &&
+       sanitize_output output &&
+       diff output - <<-\EOF
+       1 .M S..U 160000 160000 160000 HASH HASH sub1
+       1 .M S..U 160000 160000 160000 HASH HASH sub2
+       1 .M S..U 160000 160000 160000 HASH HASH sub3
+       EOF
+'
+
+test_expect_success 'status with untracked file in nested submodule (short)' '
+       git -C super status --short >output &&
+       diff output - <<-\EOF
+        ? sub1
+        ? sub2
+        ? sub3
+       EOF
+'
+
+test_expect_success 'setup superproject with modified file in nested submodule' '
+       git -C super/sub1/sub2 add file &&
+       git -C super/sub2 add file
+'
+
+test_expect_success 'status with added file in nested submodule (porcelain)' '
+       git -C super status --porcelain >output &&
+       diff output - <<-\EOF
+        M sub1
+        M sub2
+        M sub3
+       EOF
+'
+
+test_expect_success 'status with added file in nested submodule (porcelain=2)' '
+       git -C super status --porcelain=2 >output &&
+       sanitize_output output &&
+       diff output - <<-\EOF
+       1 .M S.M. 160000 160000 160000 HASH HASH sub1
+       1 .M S.M. 160000 160000 160000 HASH HASH sub2
+       1 .M S..U 160000 160000 160000 HASH HASH sub3
+       EOF
+'
+
+test_expect_success 'status with added file in nested submodule (short)' '
+       git -C super status --short >output &&
+       diff output - <<-\EOF
+        m sub1
+        m sub2
+        ? sub3
+       EOF
+'
+
 test_done
index b5860fcb8b40bad1a368ca3c7e320cb8e82f5da5..35ea0b707474342a323e02ce614e736c1acfe2eb 100755 (executable)
@@ -360,7 +360,7 @@ EOF
 test_expect_success 'status -s -b' '
 
        git status -s -b >output &&
-       test_cmp expect output
+       test_i18ncmp expect output
 
 '
 
@@ -370,7 +370,7 @@ test_expect_success 'status -s -z -b' '
        git status -s -z -b >output &&
        nul_to_q <output >output.q &&
        mv output.q output &&
-       test_cmp expect output
+       test_i18ncmp expect output
 '
 
 test_expect_success 'setup dir3' '
@@ -687,7 +687,7 @@ EOF
 test_expect_success 'status -s -b with color.status' '
 
        git status -s -b | test_decode_color >output &&
-       test_cmp expect output
+       test_i18ncmp expect output
 
 '
 
index db9774e345586428ae1ac23f11d92ae00e05c1e9..ddef7ea6b0d87ef5922bf267ee3fdc9ade4383af 100755 (executable)
@@ -101,7 +101,7 @@ test_expect_success '--amend option with empty author' '
        echo "Empty author test" >>foo &&
        test_tick &&
        test_must_fail git commit -a -m "empty author" --amend 2>err &&
-       grep "empty ident" err
+       test_i18ngrep "empty ident" err
 '
 
 test_expect_success '--amend option with missing author' '
@@ -114,7 +114,7 @@ test_expect_success '--amend option with missing author' '
        echo "Missing author test" >>foo &&
        test_tick &&
        test_must_fail git commit -a -m "malformed author" --amend 2>err &&
-       grep "empty ident" err
+       test_i18ngrep "empty ident" err
 '
 
 test_expect_success '--reset-author makes the commit ours even with --amend option' '
index 6e839f5489c5a8e3667d182f6de1873c2d29bd0a..762135adea6d4e8594a077f1b52dcb50d49adc4e 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description='signed commit tests'
 . ./test-lib.sh
+GNUPGHOME_NOT_USED=$GNUPGHOME
 . "$TEST_DIRECTORY/lib-gpg.sh"
 
 test_expect_success GPG 'create signed commits' '
@@ -190,7 +191,7 @@ test_expect_success GPG 'show bad signature with custom format' '
        test_cmp expect actual
 '
 
-test_expect_success GPG 'show unknown signature with custom format' '
+test_expect_success GPG 'show untrusted signature with custom format' '
        cat >expect <<-\EOF &&
        U
        61092E85B7227189
@@ -200,6 +201,16 @@ test_expect_success GPG 'show unknown signature with custom format' '
        test_cmp expect actual
 '
 
+test_expect_success GPG 'show unknown signature with custom format' '
+       cat >expect <<-\EOF &&
+       E
+       61092E85B7227189
+
+       EOF
+       GNUPGHOME="$GNUPGHOME_NOT_USED" git log -1 --format="%G?%n%GK%n%GS" eighth-signed-alt >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success GPG 'show lack of signature with custom format' '
        cat >expect <<-\EOF &&
        N
index 5c3db656dfaa0171598445720b62e63f13f67f44..458608cc1e7ca51e1a7e40017794b5f2c55d3db3 100755 (executable)
@@ -944,4 +944,23 @@ EOF
        test_i18ncmp expected actual
 '
 
+test_expect_success 'status: handle not-yet-started rebase -i gracefully' '
+       ONTO=$(git rev-parse --short HEAD^) &&
+       COMMIT=$(git rev-parse --short HEAD) &&
+       EDITOR="git status --untracked-files=no >actual" git rebase -i HEAD^ &&
+       cat >expected <<EOF &&
+On branch several_commits
+No commands done.
+Next command to do (1 remaining command):
+   pick $COMMIT four_commit
+  (use "git rebase --edit-todo" to view and edit)
+You are currently editing a commit while rebasing branch '\''several_commits'\'' on '\''$ONTO'\''.
+  (use "git commit --amend" to amend the current commit)
+  (use "git rebase --continue" once you are satisfied with your changes)
+
+nothing to commit (use -u to show untracked files)
+EOF
+       test_i18ncmp expected actual
+'
+
 test_done
index aee785cffa8d656fa52e6b893921153faf748fe9..0c6f91c4338cce131b3d6066e590f177f7e739d1 100755 (executable)
@@ -126,6 +126,305 @@ test_expect_success 'with multiline title in the message' '
        test_cmp expected actual
 '
 
+test_expect_success 'with non-trailer lines mixed with Signed-off-by' '
+       cat >patch <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               Signed-off-by: a <a@example.com>
+               this is not a trailer
+       EOF
+       cat >expected <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               Signed-off-by: a <a@example.com>
+               this is not a trailer
+               token: value
+       EOF
+       git interpret-trailers --trailer "token: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'with non-trailer lines mixed with cherry picked from' '
+       cat >patch <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               (cherry picked from commit x)
+               this is not a trailer
+       EOF
+       cat >expected <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               (cherry picked from commit x)
+               this is not a trailer
+               token: value
+       EOF
+       git interpret-trailers --trailer "token: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'with non-trailer lines mixed with a configured trailer' '
+       cat >patch <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               My-trailer: x
+               this is not a trailer
+       EOF
+       cat >expected <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               My-trailer: x
+               this is not a trailer
+               token: value
+       EOF
+       test_config trailer.my.key "My-trailer: " &&
+       git interpret-trailers --trailer "token: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'with non-trailer lines mixed with a non-configured trailer' '
+       cat >patch <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               I-am-not-configured: x
+               this is not a trailer
+       EOF
+       cat >expected <<-\EOF &&
+
+               this is not a trailer
+               this is not a trailer
+               I-am-not-configured: x
+               this is not a trailer
+
+               token: value
+       EOF
+       test_config trailer.my.key "My-trailer: " &&
+       git interpret-trailers --trailer "token: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'with all non-configured trailers' '
+       cat >patch <<-\EOF &&
+
+               I-am-not-configured: x
+               I-am-also-not-configured: x
+       EOF
+       cat >expected <<-\EOF &&
+
+               I-am-not-configured: x
+               I-am-also-not-configured: x
+               token: value
+       EOF
+       test_config trailer.my.key "My-trailer: " &&
+       git interpret-trailers --trailer "token: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'with non-trailer lines only' '
+       cat >patch <<-\EOF &&
+
+               this is not a trailer
+       EOF
+       cat >expected <<-\EOF &&
+
+               this is not a trailer
+
+               token: value
+       EOF
+       git interpret-trailers --trailer "token: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'line with leading whitespace is not trailer' '
+       q_to_tab >patch <<-\EOF &&
+
+               Qtoken: value
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               Qtoken: value
+
+               token: value
+       EOF
+       git interpret-trailers --trailer "token: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'multiline field treated as one trailer for 25% check' '
+       q_to_tab >patch <<-\EOF &&
+
+               Signed-off-by: a <a@example.com>
+               name: value on
+               Qmultiple lines
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               Signed-off-by: a <a@example.com>
+               name: value on
+               Qmultiple lines
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+               this is not a trailer
+               name: value
+       EOF
+       git interpret-trailers --trailer "name: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'multiline field treated as atomic for placement' '
+       q_to_tab >patch <<-\EOF &&
+
+               another: trailer
+               name: value on
+               Qmultiple lines
+               another: trailer
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               another: trailer
+               name: value on
+               Qmultiple lines
+               name: value
+               another: trailer
+       EOF
+       test_config trailer.name.where after &&
+       git interpret-trailers --trailer "name: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'multiline field treated as atomic for replacement' '
+       q_to_tab >patch <<-\EOF &&
+
+               another: trailer
+               name: value on
+               Qmultiple lines
+               another: trailer
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               another: trailer
+               another: trailer
+               name: value
+       EOF
+       test_config trailer.name.ifexists replace &&
+       git interpret-trailers --trailer "name: value" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'multiline field treated as atomic for difference check' '
+       q_to_tab >patch <<-\EOF &&
+
+               another: trailer
+               name: first line
+               Qsecond line
+               another: trailer
+       EOF
+       test_config trailer.name.ifexists addIfDifferent &&
+
+       q_to_tab >trailer <<-\EOF &&
+               name: first line
+               Qsecond line
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               another: trailer
+               name: first line
+               Qsecond line
+               another: trailer
+       EOF
+       git interpret-trailers --trailer "$(cat trailer)" patch >actual &&
+       test_cmp expected actual &&
+
+       q_to_tab >trailer <<-\EOF &&
+               name: first line
+               QQQQQsecond line
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               another: trailer
+               name: first line
+               Qsecond line
+               another: trailer
+               name: first line
+               QQQQQsecond line
+       EOF
+       git interpret-trailers --trailer "$(cat trailer)" patch >actual &&
+       test_cmp expected actual &&
+
+       q_to_tab >trailer <<-\EOF &&
+               name: first line *DIFFERENT*
+               Qsecond line
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               another: trailer
+               name: first line
+               Qsecond line
+               another: trailer
+               name: first line *DIFFERENT*
+               Qsecond line
+       EOF
+       git interpret-trailers --trailer "$(cat trailer)" patch >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'multiline field treated as atomic for neighbor check' '
+       q_to_tab >patch <<-\EOF &&
+
+               another: trailer
+               name: first line
+               Qsecond line
+               another: trailer
+       EOF
+       test_config trailer.name.where after &&
+       test_config trailer.name.ifexists addIfDifferentNeighbor &&
+
+       q_to_tab >trailer <<-\EOF &&
+               name: first line
+               Qsecond line
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               another: trailer
+               name: first line
+               Qsecond line
+               another: trailer
+       EOF
+       git interpret-trailers --trailer "$(cat trailer)" patch >actual &&
+       test_cmp expected actual &&
+
+       q_to_tab >trailer <<-\EOF &&
+               name: first line
+               QQQQQsecond line
+       EOF
+       q_to_tab >expected <<-\EOF &&
+
+               another: trailer
+               name: first line
+               Qsecond line
+               name: first line
+               QQQQQsecond line
+               another: trailer
+       EOF
+       git interpret-trailers --trailer "$(cat trailer)" patch >actual &&
+       test_cmp expected actual
+'
+
 test_expect_success 'with config setup' '
        git config trailer.ack.key "Acked-by: " &&
        cat >expected <<-\EOF &&
@@ -959,4 +1258,21 @@ test_expect_success 'with no command and no key' '
        test_cmp expected actual
 '
 
+test_expect_success 'with cut line' '
+       cat >expected <<-\EOF &&
+               my subject
+
+               review: Brian
+               sign: A U Thor <author@example.com>
+               # ------------------------ >8 ------------------------
+               ignore this
+       EOF
+       git interpret-trailers --trailer review:Brian >actual <<-\EOF &&
+               my subject
+               # ------------------------ >8 ------------------------
+               ignore this
+       EOF
+       test_cmp expected actual
+'
+
 test_done
diff --git a/t/t7518-ident-corner-cases.sh b/t/t7518-ident-corner-cases.sh
new file mode 100755 (executable)
index 0000000..b22f631
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description='corner cases in ident strings'
+. ./test-lib.sh
+
+# confirm that we do not segfault _and_ that we do not say "(null)", as
+# glibc systems will quietly handle our NULL pointer
+#
+# Note also that we can't use "env" here because we need to unset a variable,
+# and "-u" is not portable.
+test_expect_success 'empty name and missing email' '
+       (
+               sane_unset GIT_AUTHOR_EMAIL &&
+               GIT_AUTHOR_NAME= &&
+               test_must_fail git commit --allow-empty -m foo 2>err &&
+               test_i18ngrep ! null err
+       )
+'
+
+test_expect_success 'commit rejects all-crud name' '
+       test_must_fail env GIT_AUTHOR_NAME=" .;<>" \
+               git commit --allow-empty -m foo
+'
+
+# We must test the actual error message here, as an unwanted
+# auto-detection could fail for other reasons.
+test_expect_success 'empty configured name does not auto-detect' '
+       (
+               sane_unset GIT_AUTHOR_NAME &&
+               test_must_fail \
+                       git -c user.name= commit --allow-empty -m foo 2>err &&
+               test_i18ngrep "empty ident name" err
+       )
+'
+
+test_done
index 85248a14b61d68b61932d595eb0fa8fcaa8506b1..2ebda509ac337f99c7ab5651734a5b20d4a0b6f4 100755 (executable)
@@ -154,6 +154,10 @@ test_expect_success 'test option parsing' '
        test_must_fail git merge -s foobar c1 &&
        test_must_fail git merge -s=foobar c1 &&
        test_must_fail git merge -m &&
+       test_must_fail git merge --abort foobar &&
+       test_must_fail git merge --abort --quiet &&
+       test_must_fail git merge --continue foobar &&
+       test_must_fail git merge --continue --quiet &&
        test_must_fail git merge
 '
 
@@ -763,4 +767,11 @@ test_expect_success 'merge nothing into void' '
        )
 '
 
+test_expect_success 'merge can be completed with --continue' '
+       git reset --hard c0 &&
+       git merge --no-ff --no-commit c1 &&
+       git merge --continue &&
+       verify_parents $c0 $c1
+'
+
 test_done
index f80bdb81e1f12124e32d5cd2c5c0ecdcd82dc782..e90413204ee32cafc3380244a5cf013eadcd72c1 100755 (executable)
@@ -105,7 +105,7 @@ test_expect_success 'not uptodate file porcelain checkout error' '
 '
 
 cat >expect <<\EOF
-error: Updating the following directories would lose untracked files in it:
+error: Updating the following directories would lose untracked files in them:
        rep
        rep2
 
index 7217f3968d51d9061b14bd46c473329b26bb087c..381b7df452e44622c46c8c3471f181b4568be10a 100755 (executable)
@@ -55,6 +55,22 @@ test_expect_success 'setup' '
        git rm file12 &&
        git commit -m "branch1 changes" &&
 
+       git checkout -b delete-base branch1 &&
+       mkdir -p a/a &&
+       (echo one; echo two; echo 3; echo 4) >a/a/file.txt &&
+       git add a/a/file.txt &&
+       git commit -m"base file" &&
+       git checkout -b move-to-b delete-base &&
+       mkdir -p b/b &&
+       git mv a/a/file.txt b/b/file.txt &&
+       (echo one; echo two; echo 4) >b/b/file.txt &&
+       git commit -a -m"move to b" &&
+       git checkout -b move-to-c delete-base &&
+       mkdir -p c/c &&
+       git mv a/a/file.txt c/c/file.txt &&
+       (echo one; echo two; echo 3) >c/c/file.txt &&
+       git commit -a -m"move to c" &&
+
        git checkout -b stash1 master &&
        echo stash1 change file11 >file11 &&
        git add file11 &&
@@ -86,6 +102,23 @@ test_expect_success 'setup' '
        git rm file11 &&
        git commit -m "master updates" &&
 
+       git clean -fdx &&
+       git checkout -b order-file-start master &&
+       echo start >a &&
+       echo start >b &&
+       git add a b &&
+       git commit -m start &&
+       git checkout -b order-file-side1 order-file-start &&
+       echo side1 >a &&
+       echo side1 >b &&
+       git add a b &&
+       git commit -m side1 &&
+       git checkout -b order-file-side2 order-file-start &&
+       echo side2 >a &&
+       echo side2 >b &&
+       git add a b &&
+       git commit -m side2 &&
+
        git config merge.tool mytool &&
        git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
        git config mergetool.mytool.trustExitCode true &&
@@ -94,7 +127,8 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'custom mergetool' '
-       git checkout -b test1 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master >/dev/null 2>&1 &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -112,8 +146,13 @@ test_expect_success 'custom mergetool' '
 '
 
 test_expect_success 'mergetool crlf' '
+       test_when_finished "git reset --hard" &&
+       # This test_config line must go after the above reset line so that
+       # core.autocrlf is unconfigured before reset runs.  (The
+       # test_config command uses test_when_finished internally and
+       # test_when_finished is LIFO.)
        test_config core.autocrlf true &&
-       git checkout -b test2 branch1 &&
+       git checkout -b test$test_count branch1 &&
        test_must_fail git merge master >/dev/null 2>&1 &&
        ( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
@@ -128,13 +167,12 @@ test_expect_success 'mergetool crlf' '
        test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
        git submodule update -N &&
        test "$(cat submod/bar)" = "master submodule" &&
-       git commit -m "branch1 resolved with mergetool - autocrlf" &&
-       test_config core.autocrlf false &&
-       git reset --hard
+       git commit -m "branch1 resolved with mergetool - autocrlf"
 '
 
 test_expect_success 'mergetool in subdir' '
-       git checkout -b test3 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        (
                cd subdir &&
@@ -145,8 +183,13 @@ test_expect_success 'mergetool in subdir' '
 '
 
 test_expect_success 'mergetool on file in parent dir' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
+       git submodule update -N &&
        (
                cd subdir &&
+               test_must_fail git merge master >/dev/null 2>&1 &&
+               ( yes "" | git mergetool file3 >/dev/null 2>&1 ) &&
                ( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) &&
                ( yes "" | git mergetool ../file2 ../spaced\ name >/dev/null 2>&1 ) &&
                ( yes "" | git mergetool ../both >/dev/null 2>&1 ) &&
@@ -161,7 +204,8 @@ test_expect_success 'mergetool on file in parent dir' '
 '
 
 test_expect_success 'mergetool skips autoresolved' '
-       git checkout -b test4 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
@@ -169,11 +213,12 @@ test_expect_success 'mergetool skips autoresolved' '
        ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
        ( yes "l" | git mergetool submod >/dev/null 2>&1 ) &&
        output="$(git mergetool --no-prompt)" &&
-       test "$output" = "No files need merging" &&
-       git reset --hard
+       test "$output" = "No files need merging"
 '
 
-test_expect_success 'mergetool merges all from subdir' '
+test_expect_success 'mergetool merges all from subdir (rerere disabled)' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config rerere.enabled false &&
        (
                cd subdir &&
@@ -189,21 +234,41 @@ test_expect_success 'mergetool merges all from subdir' '
        )
 '
 
+test_expect_success 'mergetool merges all from subdir (rerere enabled)' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
+       test_config rerere.enabled true &&
+       rm -rf .git/rr-cache &&
+       (
+               cd subdir &&
+               test_must_fail git merge master &&
+               ( yes "r" | git mergetool ../submod ) &&
+               ( yes "d" "d" | git mergetool --no-prompt ) &&
+               test "$(cat ../file1)" = "master updated" &&
+               test "$(cat ../file2)" = "master new" &&
+               test "$(cat file3)" = "master new sub" &&
+               ( cd .. && git submodule update -N ) &&
+               test "$(cat ../submod/bar)" = "master submodule" &&
+               git commit -m "branch2 resolved by mergetool from subdir"
+       )
+'
+
 test_expect_success 'mergetool skips resolved paths when rerere is active' '
+       test_when_finished "git reset --hard" &&
        test_config rerere.enabled true &&
        rm -rf .git/rr-cache &&
-       git checkout -b test5 branch1 &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master >/dev/null 2>&1 &&
        ( yes "l" | git mergetool --no-prompt submod >/dev/null 2>&1 ) &&
        ( yes "d" "d" | git mergetool --no-prompt >/dev/null 2>&1 ) &&
        git submodule update -N &&
        output="$(yes "n" | git mergetool --no-prompt)" &&
-       test "$output" = "No files need merging" &&
-       git reset --hard
+       test "$output" = "No files need merging"
 '
 
 test_expect_success 'conflicted stash sets up rerere'  '
+       test_when_finished "git reset --hard" &&
        test_config rerere.enabled true &&
        git checkout stash1 &&
        echo "Conflicting stash content" >file11 &&
@@ -231,67 +296,57 @@ test_expect_success 'conflicted stash sets up rerere'  '
 '
 
 test_expect_success 'mergetool takes partial path' '
-       git reset --hard &&
+       test_when_finished "git reset --hard" &&
        test_config rerere.enabled false &&
-       git checkout -b test12 branch1 &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        test_must_fail git merge master &&
 
        ( yes "" | git mergetool subdir ) &&
 
-       test "$(cat subdir/file3)" = "master new sub" &&
-       git reset --hard
+       test "$(cat subdir/file3)" = "master new sub"
 '
 
 test_expect_success 'mergetool delete/delete conflict' '
-       git checkout -b delete-base branch1 &&
-       mkdir -p a/a &&
-       (echo one; echo two; echo 3; echo 4) >a/a/file.txt &&
-       git add a/a/file.txt &&
-       git commit -m"base file" &&
-       git checkout -b move-to-b delete-base &&
-       mkdir -p b/b &&
-       git mv a/a/file.txt b/b/file.txt &&
-       (echo one; echo two; echo 4) >b/b/file.txt &&
-       git commit -a -m"move to b" &&
-       git checkout -b move-to-c delete-base &&
-       mkdir -p c/c &&
-       git mv a/a/file.txt c/c/file.txt &&
-       (echo one; echo two; echo 3) >c/c/file.txt &&
-       git commit -a -m"move to c" &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count move-to-c &&
        test_must_fail git merge move-to-b &&
        echo d | git mergetool a/a/file.txt &&
        ! test -f a/a/file.txt &&
-       git reset --hard HEAD &&
+       git reset --hard &&
        test_must_fail git merge move-to-b &&
        echo m | git mergetool a/a/file.txt &&
        test -f b/b/file.txt &&
-       git reset --hard HEAD &&
+       git reset --hard &&
        test_must_fail git merge move-to-b &&
        ! echo a | git mergetool a/a/file.txt &&
-       ! test -f a/a/file.txt &&
-       git reset --hard HEAD
+       ! test -f a/a/file.txt
 '
 
 test_expect_success 'mergetool produces no errors when keepBackup is used' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count move-to-c &&
        test_config mergetool.keepBackup true &&
        test_must_fail git merge move-to-b &&
        : >expect &&
        echo d | git mergetool a/a/file.txt 2>actual &&
        test_cmp expect actual &&
-       ! test -d a &&
-       git reset --hard HEAD
+       ! test -d a
 '
 
 test_expect_success 'mergetool honors tempfile config for deleted files' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count move-to-c &&
        test_config mergetool.keepTemporaries false &&
        test_must_fail git merge move-to-b &&
        echo d | git mergetool a/a/file.txt &&
-       ! test -d a &&
-       git reset --hard HEAD
+       ! test -d a
 '
 
 test_expect_success 'mergetool keeps tempfiles when aborting delete/delete' '
+       test_when_finished "git reset --hard" &&
+       test_when_finished "git clean -fdx" &&
+       git checkout -b test$test_count move-to-c &&
        test_config mergetool.keepTemporaries true &&
        test_must_fail git merge move-to-b &&
        ! (echo a; echo n) | git mergetool a/a/file.txt &&
@@ -302,18 +357,17 @@ test_expect_success 'mergetool keeps tempfiles when aborting delete/delete' '
        file_REMOTE_.txt
        EOF
        ls -1 a/a | sed -e "s/[0-9]*//g" >actual &&
-       test_cmp expect actual &&
-       git clean -fdx &&
-       git reset --hard HEAD
+       test_cmp expect actual
 '
 
 test_expect_success 'deleted vs modified submodule' '
-       git checkout -b test6 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        mv submod submod-movedaside &&
        git rm --cached submod &&
        git commit -m "Submodule deleted from branch" &&
-       git checkout -b test6.a test6 &&
+       git checkout -b test$test_count.a test$test_count &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
@@ -329,7 +383,7 @@ test_expect_success 'deleted vs modified submodule' '
        git commit -m "Merge resolved by keeping module" &&
 
        mv submod submod-movedaside &&
-       git checkout -b test6.b test6 &&
+       git checkout -b test$test_count.b test$test_count &&
        git submodule update -N &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
@@ -343,9 +397,9 @@ test_expect_success 'deleted vs modified submodule' '
        git commit -m "Merge resolved by deleting module" &&
 
        mv submod-movedaside submod &&
-       git checkout -b test6.c master &&
+       git checkout -b test$test_count.c master &&
        git submodule update -N &&
-       test_must_fail git merge test6 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -359,9 +413,9 @@ test_expect_success 'deleted vs modified submodule' '
        git commit -m "Merge resolved by deleting module" &&
        mv submod.orig submod &&
 
-       git checkout -b test6.d master &&
+       git checkout -b test$test_count.d master &&
        git submodule update -N &&
-       test_must_fail git merge test6 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -372,19 +426,19 @@ test_expect_success 'deleted vs modified submodule' '
        test "$(cat submod/bar)" = "master submodule" &&
        output="$(git mergetool --no-prompt)" &&
        test "$output" = "No files need merging" &&
-       git commit -m "Merge resolved by keeping module" &&
-       git reset --hard HEAD
+       git commit -m "Merge resolved by keeping module"
 '
 
 test_expect_success 'file vs modified submodule' '
-       git checkout -b test7 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        mv submod submod-movedaside &&
        git rm --cached submod &&
        echo not a submodule >submod &&
        git add submod &&
        git commit -m "Submodule path becomes file" &&
-       git checkout -b test7.a branch1 &&
+       git checkout -b test$test_count.a branch1 &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
@@ -400,7 +454,7 @@ test_expect_success 'file vs modified submodule' '
        git commit -m "Merge resolved by keeping module" &&
 
        mv submod submod-movedaside &&
-       git checkout -b test7.b test7 &&
+       git checkout -b test$test_count.b test$test_count &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
@@ -413,11 +467,11 @@ test_expect_success 'file vs modified submodule' '
        test "$output" = "No files need merging" &&
        git commit -m "Merge resolved by keeping file" &&
 
-       git checkout -b test7.c master &&
+       git checkout -b test$test_count.c master &&
        rmdir submod && mv submod-movedaside submod &&
        test ! -e submod.orig &&
        git submodule update -N &&
-       test_must_fail git merge test7 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
@@ -430,10 +484,10 @@ test_expect_success 'file vs modified submodule' '
        test "$output" = "No files need merging" &&
        git commit -m "Merge resolved by keeping file" &&
 
-       git checkout -b test7.d master &&
+       git checkout -b test$test_count.d master &&
        rmdir submod && mv submod.orig submod &&
        git submodule update -N &&
-       test_must_fail git merge test7 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
        ( yes "" | git mergetool both>/dev/null 2>&1 ) &&
@@ -448,7 +502,8 @@ test_expect_success 'file vs modified submodule' '
 '
 
 test_expect_success 'submodule in subdirectory' '
-       git checkout -b test10 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        git submodule update -N &&
        (
                cd subdir &&
@@ -460,56 +515,57 @@ test_expect_success 'submodule in subdirectory' '
                git commit -m "add initial versions"
                )
        ) &&
+       test_when_finished "rm -rf subdir/subdir_module" &&
        git submodule add git://example.com/subsubmodule subdir/subdir_module &&
        git add subdir/subdir_module &&
        git commit -m "add submodule in subdirectory" &&
 
-       git checkout -b test10.a test10 &&
+       git checkout -b test$test_count.a test$test_count &&
        git submodule update -N &&
        (
        cd subdir/subdir_module &&
                git checkout -b super10.a &&
-               echo test10.a >file15 &&
+               echo test$test_count.a >file15 &&
                git add file15 &&
                git commit -m "on branch 10.a"
        ) &&
        git add subdir/subdir_module &&
-       git commit -m "change submodule in subdirectory on test10.a" &&
+       git commit -m "change submodule in subdirectory on test$test_count.a" &&
 
-       git checkout -b test10.b test10 &&
+       git checkout -b test$test_count.b test$test_count &&
        git submodule update -N &&
        (
                cd subdir/subdir_module &&
                git checkout -b super10.b &&
-               echo test10.b >file15 &&
+               echo test$test_count.b >file15 &&
                git add file15 &&
                git commit -m "on branch 10.b"
        ) &&
        git add subdir/subdir_module &&
-       git commit -m "change submodule in subdirectory on test10.b" &&
+       git commit -m "change submodule in subdirectory on test$test_count.b" &&
 
-       test_must_fail git merge test10.a >/dev/null 2>&1 &&
+       test_must_fail git merge test$test_count.a >/dev/null 2>&1 &&
        (
                cd subdir &&
                ( yes "l" | git mergetool subdir_module )
        ) &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" &&
        git submodule update -N &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" &&
        git reset --hard &&
        git submodule update -N &&
 
-       test_must_fail git merge test10.a >/dev/null 2>&1 &&
+       test_must_fail git merge test$test_count.a >/dev/null 2>&1 &&
        ( yes "r" | git mergetool subdir/subdir_module ) &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" &&
        git submodule update -N &&
-       test "$(cat subdir/subdir_module/file15)" = "test10.a" &&
-       git commit -m "branch1 resolved with mergetool" &&
-       rm -rf subdir/subdir_module
+       test "$(cat subdir/subdir_module/file15)" = "test$test_count.a" &&
+       git commit -m "branch1 resolved with mergetool"
 '
 
 test_expect_success 'directory vs modified submodule' '
-       git checkout -b test11 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        mv submod submod-movedaside &&
        git rm --cached submod &&
        mkdir submod &&
@@ -523,7 +579,7 @@ test_expect_success 'directory vs modified submodule' '
        test "$(cat submod/file16)" = "not a submodule" &&
        rm -rf submod.orig &&
 
-       git reset --hard >/dev/null 2>&1 &&
+       git reset --hard &&
        test_must_fail git merge master &&
        test -n "$(git ls-files -u)" &&
        test ! -e submod.orig &&
@@ -535,75 +591,131 @@ test_expect_success 'directory vs modified submodule' '
        ( cd submod && git clean -f && git reset --hard ) &&
        git submodule update -N &&
        test "$(cat submod/bar)" = "master submodule" &&
-       git reset --hard >/dev/null 2>&1 && rm -rf submod-movedaside &&
+       git reset --hard &&
+       rm -rf submod-movedaside &&
 
-       git checkout -b test11.c master &&
+       git checkout -b test$test_count.c master &&
        git submodule update -N &&
-       test_must_fail git merge test11 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        ( yes "l" | git mergetool submod ) &&
        git submodule update -N &&
        test "$(cat submod/bar)" = "master submodule" &&
 
-       git reset --hard >/dev/null 2>&1 &&
+       git reset --hard &&
        git submodule update -N &&
-       test_must_fail git merge test11 &&
+       test_must_fail git merge test$test_count &&
        test -n "$(git ls-files -u)" &&
        test ! -e submod.orig &&
        ( yes "r" | git mergetool submod ) &&
        test "$(cat submod/file16)" = "not a submodule" &&
 
-       git reset --hard master >/dev/null 2>&1 &&
+       git reset --hard master &&
        ( cd submod && git clean -f && git reset --hard ) &&
        git submodule update -N
 '
 
 test_expect_success 'file with no base' '
-       git checkout -b test13 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool mybase -- both &&
        >expected &&
-       test_cmp both expected &&
-       git reset --hard master >/dev/null 2>&1
+       test_cmp both expected
 '
 
 test_expect_success 'custom commands override built-ins' '
-       git checkout -b test14 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
        test_config mergetool.defaults.trustExitCode true &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool defaults -- both &&
        echo master both added >expected &&
-       test_cmp both expected &&
-       git reset --hard master >/dev/null 2>&1
+       test_cmp both expected
 '
 
 test_expect_success 'filenames seen by tools start with ./' '
-       git checkout -b test15 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config mergetool.writeToTemp false &&
        test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
        test_config mergetool.myecho.trustExitCode true &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool myecho -- both >actual &&
-       grep ^\./both_LOCAL_ actual >/dev/null &&
-       git reset --hard master >/dev/null 2>&1
+       grep ^\./both_LOCAL_ actual >/dev/null
 '
 
 test_lazy_prereq MKTEMP '
        tempdir=$(mktemp -d -t foo.XXXXXX) &&
-       test -d "$tempdir"
+       test -d "$tempdir" &&
+       rmdir "$tempdir"
 '
 
 test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToTemp' '
-       git checkout -b test16 branch1 &&
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count branch1 &&
        test_config mergetool.writeToTemp true &&
        test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
        test_config mergetool.myecho.trustExitCode true &&
        test_must_fail git merge master &&
        git mergetool --no-prompt --tool myecho -- both >actual &&
-       test_must_fail grep ^\./both_LOCAL_ actual >/dev/null &&
-       grep /both_LOCAL_ actual >/dev/null &&
-       git reset --hard master >/dev/null 2>&1
+       ! grep ^\./both_LOCAL_ actual >/dev/null &&
+       grep /both_LOCAL_ actual >/dev/null
+'
+
+test_expect_success 'diff.orderFile configuration is honored' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count order-file-side2 &&
+       test_config diff.orderFile order-file &&
+       test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
+       test_config mergetool.myecho.trustExitCode true &&
+       echo b >order-file &&
+       echo a >>order-file &&
+       test_must_fail git merge order-file-side1 &&
+       cat >expect <<-\EOF &&
+               Merging:
+               b
+               a
+       EOF
+
+       # make sure "order-file" that is ambiguous between
+       # rev and path is understood correctly.
+       git branch order-file HEAD &&
+
+       git mergetool --no-prompt --tool myecho >output &&
+       git grep --no-index -h -A2 Merging: output >actual &&
+       test_cmp expect actual
+'
+test_expect_success 'mergetool -Oorder-file is honored' '
+       test_when_finished "git reset --hard" &&
+       git checkout -b test$test_count order-file-side2 &&
+       test_config diff.orderFile order-file &&
+       test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
+       test_config mergetool.myecho.trustExitCode true &&
+       echo b >order-file &&
+       echo a >>order-file &&
+       test_must_fail git merge order-file-side1 &&
+       cat >expect <<-\EOF &&
+               Merging:
+               a
+               b
+       EOF
+       git mergetool -O/dev/null --no-prompt --tool myecho >output &&
+       git grep --no-index -h -A2 Merging: output >actual &&
+       test_cmp expect actual &&
+       git reset --hard &&
+
+       git config --unset diff.orderFile &&
+       test_must_fail git merge order-file-side1 &&
+       cat >expect <<-\EOF &&
+               Merging:
+               b
+               a
+       EOF
+       git mergetool -Oorder-file --no-prompt --tool myecho >output &&
+       git grep --no-index -h -A2 Merging: output >actual &&
+       test_cmp expect actual
 '
 
 test_done
index 70a2de461af58119f507a915104ba139dd0245df..668bbee73c8dc58c6ba61c4a8002ed68206d1445 100755 (executable)
@@ -23,8 +23,20 @@ prompt_given ()
        test "$prompt" = "Launch 'test-tool' [Y/n]? branch"
 }
 
+test_expect_success 'basic usage requires no repo' '
+       test_expect_code 129 git difftool -h >output &&
+       test_i18ngrep ^usage: output &&
+       # create a ceiling directory to prevent Git from finding a repo
+       mkdir -p not/repo &&
+       test_when_finished rm -r not &&
+       test_expect_code 129 \
+       env GIT_CEILING_DIRECTORIES="$(pwd)/not" \
+       git -C not/repo difftool -h >output &&
+       test_i18ngrep ^usage: output
+'
+
 # Create a file on master and change it on branch
-test_expect_success PERL 'setup' '
+test_expect_success 'setup' '
        echo master >file &&
        git add file &&
        git commit -m "added file" &&
@@ -36,7 +48,7 @@ test_expect_success PERL 'setup' '
 '
 
 # Configure a custom difftool.<tool>.cmd and use it
-test_expect_success PERL 'custom commands' '
+test_expect_success 'custom commands' '
        difftool_test_setup &&
        test_config difftool.test-tool.cmd "cat \"\$REMOTE\"" &&
        echo master >expect &&
@@ -49,21 +61,21 @@ test_expect_success PERL 'custom commands' '
        test_cmp expect actual
 '
 
-test_expect_success PERL 'custom tool commands override built-ins' '
+test_expect_success 'custom tool commands override built-ins' '
        test_config difftool.vimdiff.cmd "cat \"\$REMOTE\"" &&
        echo master >expect &&
        git difftool --tool vimdiff --no-prompt branch >actual &&
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool ignores bad --tool values' '
+test_expect_success 'difftool ignores bad --tool values' '
        : >expect &&
        test_must_fail \
                git difftool --no-prompt --tool=bad-tool branch >actual &&
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool forwards arguments to diff' '
+test_expect_success 'difftool forwards arguments to diff' '
        difftool_test_setup &&
        >for-diff &&
        git add for-diff &&
@@ -76,40 +88,40 @@ test_expect_success PERL 'difftool forwards arguments to diff' '
        rm for-diff
 '
 
-test_expect_success PERL 'difftool ignores exit code' '
+test_expect_success 'difftool ignores exit code' '
        test_config difftool.error.cmd false &&
        git difftool -y -t error branch
 '
 
-test_expect_success PERL 'difftool forwards exit code with --trust-exit-code' '
+test_expect_success 'difftool forwards exit code with --trust-exit-code' '
        test_config difftool.error.cmd false &&
        test_must_fail git difftool -y --trust-exit-code -t error branch
 '
 
-test_expect_success PERL 'difftool forwards exit code with --trust-exit-code for built-ins' '
+test_expect_success 'difftool forwards exit code with --trust-exit-code for built-ins' '
        test_config difftool.vimdiff.path false &&
        test_must_fail git difftool -y --trust-exit-code -t vimdiff branch
 '
 
-test_expect_success PERL 'difftool honors difftool.trustExitCode = true' '
+test_expect_success 'difftool honors difftool.trustExitCode = true' '
        test_config difftool.error.cmd false &&
        test_config difftool.trustExitCode true &&
        test_must_fail git difftool -y -t error branch
 '
 
-test_expect_success PERL 'difftool honors difftool.trustExitCode = false' '
+test_expect_success 'difftool honors difftool.trustExitCode = false' '
        test_config difftool.error.cmd false &&
        test_config difftool.trustExitCode false &&
        git difftool -y -t error branch
 '
 
-test_expect_success PERL 'difftool ignores exit code with --no-trust-exit-code' '
+test_expect_success 'difftool ignores exit code with --no-trust-exit-code' '
        test_config difftool.error.cmd false &&
        test_config difftool.trustExitCode true &&
        git difftool -y --no-trust-exit-code -t error branch
 '
 
-test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
+test_expect_success 'difftool stops on error with --trust-exit-code' '
        test_when_finished "rm -f for-diff .git/fail-right-file" &&
        test_when_finished "git reset -- for-diff" &&
        write_script .git/fail-right-file <<-\EOF &&
@@ -124,13 +136,13 @@ test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool honors exit status if command not found' '
+test_expect_success 'difftool honors exit status if command not found' '
        test_config difftool.nonexistent.cmd i-dont-exist &&
        test_config difftool.trustExitCode false &&
        test_must_fail git difftool -y -t nonexistent branch
 '
 
-test_expect_success PERL 'difftool honors --gui' '
+test_expect_success 'difftool honors --gui' '
        difftool_test_setup &&
        test_config merge.tool bogus-tool &&
        test_config diff.tool bogus-tool &&
@@ -141,7 +153,7 @@ test_expect_success PERL 'difftool honors --gui' '
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool --gui last setting wins' '
+test_expect_success 'difftool --gui last setting wins' '
        difftool_test_setup &&
        : >expect &&
        git difftool --no-prompt --gui --no-gui >actual &&
@@ -155,7 +167,7 @@ test_expect_success PERL 'difftool --gui last setting wins' '
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool --gui works without configured diff.guitool' '
+test_expect_success 'difftool --gui works without configured diff.guitool' '
        difftool_test_setup &&
        echo branch >expect &&
        git difftool --no-prompt --gui branch >actual &&
@@ -163,7 +175,7 @@ test_expect_success PERL 'difftool --gui works without configured diff.guitool'
 '
 
 # Specify the diff tool using $GIT_DIFF_TOOL
-test_expect_success PERL 'GIT_DIFF_TOOL variable' '
+test_expect_success 'GIT_DIFF_TOOL variable' '
        difftool_test_setup &&
        git config --unset diff.tool &&
        echo branch >expect &&
@@ -173,7 +185,7 @@ test_expect_success PERL 'GIT_DIFF_TOOL variable' '
 
 # Test the $GIT_*_TOOL variables and ensure
 # that $GIT_DIFF_TOOL always wins unless --tool is specified
-test_expect_success PERL 'GIT_DIFF_TOOL overrides' '
+test_expect_success 'GIT_DIFF_TOOL overrides' '
        difftool_test_setup &&
        test_config diff.tool bogus-tool &&
        test_config merge.tool bogus-tool &&
@@ -191,7 +203,7 @@ test_expect_success PERL 'GIT_DIFF_TOOL overrides' '
 
 # Test that we don't have to pass --no-prompt to difftool
 # when $GIT_DIFFTOOL_NO_PROMPT is true
-test_expect_success PERL 'GIT_DIFFTOOL_NO_PROMPT variable' '
+test_expect_success 'GIT_DIFFTOOL_NO_PROMPT variable' '
        difftool_test_setup &&
        echo branch >expect &&
        GIT_DIFFTOOL_NO_PROMPT=true git difftool branch >actual &&
@@ -200,7 +212,7 @@ test_expect_success PERL 'GIT_DIFFTOOL_NO_PROMPT variable' '
 
 # git-difftool supports the difftool.prompt variable.
 # Test that GIT_DIFFTOOL_PROMPT can override difftool.prompt = false
-test_expect_success PERL 'GIT_DIFFTOOL_PROMPT variable' '
+test_expect_success 'GIT_DIFFTOOL_PROMPT variable' '
        difftool_test_setup &&
        test_config difftool.prompt false &&
        echo >input &&
@@ -210,7 +222,7 @@ test_expect_success PERL 'GIT_DIFFTOOL_PROMPT variable' '
 '
 
 # Test that we don't have to pass --no-prompt when difftool.prompt is false
-test_expect_success PERL 'difftool.prompt config variable is false' '
+test_expect_success 'difftool.prompt config variable is false' '
        difftool_test_setup &&
        test_config difftool.prompt false &&
        echo branch >expect &&
@@ -219,7 +231,7 @@ test_expect_success PERL 'difftool.prompt config variable is false' '
 '
 
 # Test that we don't have to pass --no-prompt when mergetool.prompt is false
-test_expect_success PERL 'difftool merge.prompt = false' '
+test_expect_success 'difftool merge.prompt = false' '
        difftool_test_setup &&
        test_might_fail git config --unset difftool.prompt &&
        test_config mergetool.prompt false &&
@@ -229,7 +241,7 @@ test_expect_success PERL 'difftool merge.prompt = false' '
 '
 
 # Test that the -y flag can override difftool.prompt = true
-test_expect_success PERL 'difftool.prompt can overridden with -y' '
+test_expect_success 'difftool.prompt can overridden with -y' '
        difftool_test_setup &&
        test_config difftool.prompt true &&
        echo branch >expect &&
@@ -238,7 +250,7 @@ test_expect_success PERL 'difftool.prompt can overridden with -y' '
 '
 
 # Test that the --prompt flag can override difftool.prompt = false
-test_expect_success PERL 'difftool.prompt can overridden with --prompt' '
+test_expect_success 'difftool.prompt can overridden with --prompt' '
        difftool_test_setup &&
        test_config difftool.prompt false &&
        echo >input &&
@@ -248,7 +260,7 @@ test_expect_success PERL 'difftool.prompt can overridden with --prompt' '
 '
 
 # Test that the last flag passed on the command-line wins
-test_expect_success PERL 'difftool last flag wins' '
+test_expect_success 'difftool last flag wins' '
        difftool_test_setup &&
        echo branch >expect &&
        git difftool --prompt --no-prompt branch >actual &&
@@ -261,7 +273,7 @@ test_expect_success PERL 'difftool last flag wins' '
 
 # git-difftool falls back to git-mergetool config variables
 # so test that behavior here
-test_expect_success PERL 'difftool + mergetool config variables' '
+test_expect_success 'difftool + mergetool config variables' '
        test_config merge.tool test-tool &&
        test_config mergetool.test-tool.cmd "cat \$LOCAL" &&
        echo branch >expect &&
@@ -275,49 +287,49 @@ test_expect_success PERL 'difftool + mergetool config variables' '
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool.<tool>.path' '
+test_expect_success 'difftool.<tool>.path' '
        test_config difftool.tkdiff.path echo &&
        git difftool --tool=tkdiff --no-prompt branch >output &&
-       lines=$(grep file output | wc -l) &&
-       test "$lines" -eq 1
+       grep file output >grep-output &&
+       test_line_count = 1 grep-output
 '
 
-test_expect_success PERL 'difftool --extcmd=cat' '
+test_expect_success 'difftool --extcmd=cat' '
        echo branch >expect &&
        echo master >>expect &&
        git difftool --no-prompt --extcmd=cat branch >actual &&
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool --extcmd cat' '
+test_expect_success 'difftool --extcmd cat' '
        echo branch >expect &&
        echo master >>expect &&
        git difftool --no-prompt --extcmd=cat branch >actual &&
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool -x cat' '
+test_expect_success 'difftool -x cat' '
        echo branch >expect &&
        echo master >>expect &&
        git difftool --no-prompt -x cat branch >actual &&
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool --extcmd echo arg1' '
+test_expect_success 'difftool --extcmd echo arg1' '
        echo file >expect &&
        git difftool --no-prompt \
                --extcmd sh\ -c\ \"echo\ \$1\" branch >actual &&
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool --extcmd cat arg1' '
+test_expect_success 'difftool --extcmd cat arg1' '
        echo master >expect &&
        git difftool --no-prompt \
                --extcmd sh\ -c\ \"cat\ \$1\" branch >actual &&
        test_cmp expect actual
 '
 
-test_expect_success PERL 'difftool --extcmd cat arg2' '
+test_expect_success 'difftool --extcmd cat arg2' '
        echo branch >expect &&
        git difftool --no-prompt \
                --extcmd sh\ -c\ \"cat\ \$2\" branch >actual &&
@@ -325,7 +337,7 @@ test_expect_success PERL 'difftool --extcmd cat arg2' '
 '
 
 # Create a second file on master and a different version on branch
-test_expect_success PERL 'setup with 2 files different' '
+test_expect_success 'setup with 2 files different' '
        echo m2 >file2 &&
        git add file2 &&
        git commit -m "added file2" &&
@@ -337,7 +349,7 @@ test_expect_success PERL 'setup with 2 files different' '
        git checkout master
 '
 
-test_expect_success PERL 'say no to the first file' '
+test_expect_success 'say no to the first file' '
        (echo n && echo) >input &&
        git difftool -x cat branch <input >output &&
        grep m2 output &&
@@ -346,7 +358,7 @@ test_expect_success PERL 'say no to the first file' '
        ! grep branch output
 '
 
-test_expect_success PERL 'say no to the second file' '
+test_expect_success 'say no to the second file' '
        (echo && echo n) >input &&
        git difftool -x cat branch <input >output &&
        grep master output &&
@@ -355,7 +367,7 @@ test_expect_success PERL 'say no to the second file' '
        ! grep br2 output
 '
 
-test_expect_success PERL 'ending prompt input with EOF' '
+test_expect_success 'ending prompt input with EOF' '
        git difftool -x cat branch </dev/null >output &&
        ! grep master output &&
        ! grep branch output &&
@@ -363,29 +375,49 @@ test_expect_success PERL 'ending prompt input with EOF' '
        ! grep br2 output
 '
 
-test_expect_success PERL 'difftool --tool-help' '
+test_expect_success 'difftool --tool-help' '
        git difftool --tool-help >output &&
        grep tool output
 '
 
-test_expect_success PERL 'setup change in subdirectory' '
+test_expect_success 'setup change in subdirectory' '
        git checkout master &&
        mkdir sub &&
        echo master >sub/sub &&
        git add sub/sub &&
        git commit -m "added sub/sub" &&
+       git tag v1 &&
        echo test >>file &&
        echo test >>sub/sub &&
        git add file sub/sub &&
        git commit -m "modified both"
 '
 
+test_expect_success 'difftool -d with growing paths' '
+       a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&
+       git init growing &&
+       (
+               cd growing &&
+               echo "test -f \"\$2/b\"" | write_script .git/test-for-b.sh &&
+               one=$(printf 1 | git hash-object -w --stdin) &&
+               two=$(printf 2 | git hash-object -w --stdin) &&
+               git update-index --add \
+                       --cacheinfo 100644,$one,$a --cacheinfo 100644,$two,b &&
+               tree1=$(git write-tree) &&
+               git update-index --add \
+                       --cacheinfo 100644,$two,$a --cacheinfo 100644,$one,b &&
+               tree2=$(git write-tree) &&
+               git checkout -- $a &&
+               git difftool -d --extcmd .git/test-for-b.sh $tree1 $tree2
+       )
+'
+
 run_dir_diff_test () {
-       test_expect_success PERL "$1 --no-symlinks" "
+       test_expect_success "$1 --no-symlinks" "
                symlinks=--no-symlinks &&
                $2
        "
-       test_expect_success PERL,SYMLINKS "$1 --symlinks" "
+       test_expect_success SYMLINKS "$1 --symlinks" "
                symlinks=--symlinks &&
                $2
        "
@@ -409,12 +441,56 @@ run_dir_diff_test 'difftool --dir-diff ignores --prompt' '
        grep file output
 '
 
-run_dir_diff_test 'difftool --dir-diff from subdirectory' '
+run_dir_diff_test 'difftool --dir-diff branch from subdirectory' '
        (
                cd sub &&
                git difftool --dir-diff $symlinks --extcmd ls branch >output &&
-               grep sub output &&
-               grep file output
+               # "sub" must only exist in "right"
+               # "file" and "file2" must be listed in both "left" and "right"
+               grep sub output >sub-output &&
+               test_line_count = 1 sub-output &&
+               grep file"$" output >file-output &&
+               test_line_count = 2 file-output &&
+               grep file2 output >file2-output &&
+               test_line_count = 2 file2-output
+       )
+'
+
+run_dir_diff_test 'difftool --dir-diff v1 from subdirectory' '
+       (
+               cd sub &&
+               git difftool --dir-diff $symlinks --extcmd ls v1 >output &&
+               # "sub" and "file" exist in both v1 and HEAD.
+               # "file2" is unchanged.
+               grep sub output >sub-output &&
+               test_line_count = 2 sub-output &&
+               grep file output >file-output &&
+               test_line_count = 2 file-output &&
+               ! grep file2 output
+       )
+'
+
+run_dir_diff_test 'difftool --dir-diff branch from subdirectory w/ pathspec' '
+       (
+               cd sub &&
+               git difftool --dir-diff $symlinks --extcmd ls branch -- .>output &&
+               # "sub" only exists in "right"
+               # "file" and "file2" must not be listed
+               grep sub output >sub-output &&
+               test_line_count = 1 sub-output &&
+               ! grep file output
+       )
+'
+
+run_dir_diff_test 'difftool --dir-diff v1 from subdirectory w/ pathspec' '
+       (
+               cd sub &&
+               git difftool --dir-diff $symlinks --extcmd ls v1 -- .>output &&
+               # "sub" exists in v1 and HEAD
+               # "file" is filtered out by the pathspec
+               grep sub output >sub-output &&
+               test_line_count = 2 sub-output &&
+               ! grep file output
        )
 '
 
@@ -470,7 +546,7 @@ do
 done >actual
 EOF
 
-test_expect_success PERL,SYMLINKS 'difftool --dir-diff --symlink without unstaged changes' '
+test_expect_success SYMLINKS 'difftool --dir-diff --symlink without unstaged changes' '
        cat >expect <<-EOF &&
        file
        $PWD/file
@@ -507,7 +583,7 @@ write_script modify-file <<\EOF
 echo "new content" >file
 EOF
 
-test_expect_success PERL 'difftool --no-symlinks does not overwrite working tree file ' '
+test_expect_success 'difftool --no-symlinks does not overwrite working tree file ' '
        echo "orig content" >file &&
        git difftool --dir-diff --no-symlinks --extcmd "$PWD/modify-file" branch &&
        echo "new content" >expect &&
@@ -520,7 +596,7 @@ echo "tmp content" >"$2/file" &&
 echo "$2" >tmpdir
 EOF
 
-test_expect_success PERL 'difftool --no-symlinks detects conflict ' '
+test_expect_success 'difftool --no-symlinks detects conflict ' '
        (
                TMPDIR=$TRASH_DIRECTORY &&
                export TMPDIR &&
@@ -533,7 +609,8 @@ test_expect_success PERL 'difftool --no-symlinks detects conflict ' '
        )
 '
 
-test_expect_success PERL 'difftool properly honors gitlink and core.worktree' '
+test_expect_success 'difftool properly honors gitlink and core.worktree' '
+       test_when_finished rm -rf submod/ule &&
        git submodule add ./. submod/ule &&
        test_config -C submod/ule diff.tool checktrees &&
        test_config -C submod/ule difftool.checktrees.cmd '\''
@@ -543,11 +620,13 @@ test_expect_success PERL 'difftool properly honors gitlink and core.worktree' '
                cd submod/ule &&
                echo good >expect &&
                git difftool --tool=checktrees --dir-diff HEAD~ >actual &&
-               test_cmp expect actual
+               test_cmp expect actual &&
+               rm -f expect actual
        )
 '
 
-test_expect_success PERL,SYMLINKS 'difftool --dir-diff symlinked directories' '
+test_expect_success SYMLINKS 'difftool --dir-diff symlinked directories' '
+       test_when_finished git reset --hard &&
        git init dirlinks &&
        (
                cd dirlinks &&
@@ -566,4 +645,64 @@ test_expect_success PERL,SYMLINKS 'difftool --dir-diff symlinked directories' '
        )
 '
 
+test_expect_success SYMLINKS 'difftool --dir-diff handles modified symlinks' '
+       test_when_finished git reset --hard &&
+       touch b &&
+       ln -s b c &&
+       git add b c &&
+       test_tick &&
+       git commit -m initial &&
+       touch d &&
+       rm c &&
+       ln -s d c &&
+       cat >expect <<-EOF &&
+               b
+               c
+
+               c
+       EOF
+       git difftool --symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual &&
+
+       git difftool --no-symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual &&
+
+       # The left side contains symlink "c" that points to "b"
+       test_config difftool.cat.cmd "cat \$LOCAL/c" &&
+       printf "%s\n" b >expect &&
+
+       git difftool --symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       git difftool --symlinks --no-symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       # The right side contains symlink "c" that points to "d"
+       test_config difftool.cat.cmd "cat \$REMOTE/c" &&
+       printf "%s\n" d >expect &&
+
+       git difftool --symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       git difftool --no-symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       # Deleted symlinks
+       rm -f c &&
+       cat >expect <<-EOF &&
+               b
+               c
+
+       EOF
+       git difftool --symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual &&
+
+       git difftool --no-symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual
+'
+
 test_done
index de2405ccba29016d2b83e16482bcfcbe70429e46..cee42097b077378f42910666a7895347b0787b1a 100755 (executable)
@@ -39,6 +39,10 @@ test_expect_success setup '
                echo "a+bc"
                echo "abc"
        } >ab &&
+       {
+               echo d &&
+               echo 0
+       } >d0 &&
        echo vvv >v &&
        echo ww w >w &&
        echo x x xx x >x &&
@@ -978,6 +982,72 @@ test_expect_success 'grep -e -- -- path' '
        test_cmp expected actual
 '
 
+test_expect_success 'dashdash disambiguates rev as rev' '
+       test_when_finished "rm -f master" &&
+       echo content >master &&
+       echo master:hello.c >expect &&
+       git grep -l o master -- hello.c >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'dashdash disambiguates pathspec as pathspec' '
+       test_when_finished "git rm -f master" &&
+       echo content >master &&
+       git add master &&
+       echo master:content >expect &&
+       git grep o -- master >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'report bogus arg without dashdash' '
+       test_must_fail git grep o does-not-exist
+'
+
+test_expect_success 'report bogus rev with dashdash' '
+       test_must_fail git grep o hello.c --
+'
+
+test_expect_success 'allow non-existent path with dashdash' '
+       # We need a real match so grep exits with success.
+       tree=$(git ls-tree HEAD |
+              sed s/hello.c/not-in-working-tree/ |
+              git mktree) &&
+       git grep o "$tree" -- not-in-working-tree
+'
+
+test_expect_success 'grep --no-index pattern -- path' '
+       rm -fr non &&
+       mkdir -p non/git &&
+       (
+               GIT_CEILING_DIRECTORIES="$(pwd)/non" &&
+               export GIT_CEILING_DIRECTORIES &&
+               cd non/git &&
+               echo hello >hello &&
+               echo goodbye >goodbye &&
+               echo hello:hello >expect &&
+               git grep --no-index o -- hello >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'grep --no-index complains of revs' '
+       test_must_fail git grep --no-index o master -- 2>err &&
+       test_i18ngrep "cannot be used with revs" err
+'
+
+test_expect_success 'grep --no-index prefers paths to revs' '
+       test_when_finished "rm -f master" &&
+       echo content >master &&
+       echo master:content >expect &&
+       git grep --no-index o master >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep --no-index does not "diagnose" revs' '
+       test_must_fail git grep --no-index o :1:hello.c 2>err &&
+       test_i18ngrep ! -i "did you mean" err
+'
+
 cat >expected <<EOF
 hello.c:int main(int argc, const char **argv)
 hello.c:       printf("Hello world.\n");
@@ -1105,36 +1175,36 @@ test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =extended
 '
 
 test_expect_success 'grep -G -F -P -E pattern' '
-       >empty &&
-       test_must_fail git grep -G -F -P -E "a\x{2b}b\x{2a}c" ab >actual &&
-       test_cmp empty actual
+       echo "d0:d" >expected &&
+       git grep -G -F -P -E "[\d]" d0 >actual &&
+       test_cmp expected actual
 '
 
 test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =perl, =extended' '
-       >empty &&
-       test_must_fail git \
+       echo "d0:d" >expected &&
+       git \
                -c grep.patterntype=fixed \
                -c grep.patterntype=basic \
                -c grep.patterntype=perl \
                -c grep.patterntype=extended \
-               grep "a\x{2b}b\x{2a}c" ab >actual &&
-       test_cmp empty actual
+               grep "[\d]" d0 >actual &&
+       test_cmp expected actual
 '
 
 test_expect_success LIBPCRE 'grep -G -F -E -P pattern' '
-       echo "ab:a+b*c" >expected &&
-       git grep -G -F -E -P "a\x{2b}b\x{2a}c" ab >actual &&
+       echo "d0:0" >expected &&
+       git grep -G -F -E -P "[\d]" d0 >actual &&
        test_cmp expected actual
 '
 
 test_expect_success LIBPCRE 'grep pattern with grep.patternType=fixed, =basic, =extended, =perl' '
-       echo "ab:a+b*c" >expected &&
+       echo "d0:0" >expected &&
        git \
                -c grep.patterntype=fixed \
                -c grep.patterntype=basic \
                -c grep.patterntype=extended \
                -c grep.patterntype=perl \
-               grep "a\x{2b}b\x{2a}c" ab >actual &&
+               grep "[\d]" d0 >actual &&
        test_cmp expected actual
 '
 
diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh
new file mode 100755 (executable)
index 0000000..5b6eb3a
--- /dev/null
@@ -0,0 +1,316 @@
+#!/bin/sh
+
+test_description='Test grep recurse-submodules feature
+
+This test verifies the recurse-submodules feature correctly greps across
+submodules.
+'
+
+. ./test-lib.sh
+
+test_expect_success 'setup directory structure and submodule' '
+       echo "foobar" >a &&
+       mkdir b &&
+       echo "bar" >b/b &&
+       git add a b &&
+       git commit -m "add a and b" &&
+       git init submodule &&
+       echo "foobar" >submodule/a &&
+       git -C submodule add a &&
+       git -C submodule commit -m "add a" &&
+       git submodule add ./submodule &&
+       git commit -m "added submodule"
+'
+
+test_expect_success 'grep correctly finds patterns in a submodule' '
+       cat >expect <<-\EOF &&
+       a:foobar
+       b/b:bar
+       submodule/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and basic pathspecs' '
+       cat >expect <<-\EOF &&
+       submodule/a:foobar
+       EOF
+
+       git grep -e. --recurse-submodules -- submodule >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and nested submodules' '
+       git init submodule/sub &&
+       echo "foobar" >submodule/sub/a &&
+       git -C submodule/sub add a &&
+       git -C submodule/sub commit -m "add a" &&
+       git -C submodule submodule add ./sub &&
+       git -C submodule add sub &&
+       git -C submodule commit -m "added sub" &&
+       git add submodule &&
+       git commit -m "updated submodule" &&
+
+       cat >expect <<-\EOF &&
+       a:foobar
+       b/b:bar
+       submodule/a:foobar
+       submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and multiple patterns' '
+       cat >expect <<-\EOF &&
+       a:foobar
+       submodule/a:foobar
+       submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --and -e "foo" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep and multiple patterns' '
+       cat >expect <<-\EOF &&
+       b/b:bar
+       EOF
+
+       git grep -e "bar" --and --not -e "foo" --recurse-submodules >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'basic grep tree' '
+       cat >expect <<-\EOF &&
+       HEAD:a:foobar
+       HEAD:b/b:bar
+       HEAD:submodule/a:foobar
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree HEAD^' '
+       cat >expect <<-\EOF &&
+       HEAD^:a:foobar
+       HEAD^:b/b:bar
+       HEAD^:submodule/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD^ >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree HEAD^^' '
+       cat >expect <<-\EOF &&
+       HEAD^^:a:foobar
+       HEAD^^:b/b:bar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD^^ >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/a:foobar
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- submodule >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/a:foobar
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- "submodule*a" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and more pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- "submodul?/a" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep tree and more pathspecs' '
+       cat >expect <<-\EOF &&
+       HEAD:submodule/sub/a:foobar
+       EOF
+
+       git grep -e "bar" --recurse-submodules HEAD -- "submodul*/sub/a" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success !MINGW 'grep recurse submodule colon in name' '
+       git init parent &&
+       test_when_finished "rm -rf parent" &&
+       echo "foobar" >"parent/fi:le" &&
+       git -C parent add "fi:le" &&
+       git -C parent commit -m "add fi:le" &&
+
+       git init "su:b" &&
+       test_when_finished "rm -rf su:b" &&
+       echo "foobar" >"su:b/fi:le" &&
+       git -C "su:b" add "fi:le" &&
+       git -C "su:b" commit -m "add fi:le" &&
+
+       git -C parent submodule add "../su:b" "su:b" &&
+       git -C parent commit -m "add submodule" &&
+
+       cat >expect <<-\EOF &&
+       fi:le:foobar
+       su:b/fi:le:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules >actual &&
+       test_cmp expect actual &&
+
+       cat >expect <<-\EOF &&
+       HEAD:fi:le:foobar
+       HEAD:su:b/fi:le:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep history with moved submoules' '
+       git init parent &&
+       test_when_finished "rm -rf parent" &&
+       echo "foobar" >parent/file &&
+       git -C parent add file &&
+       git -C parent commit -m "add file" &&
+
+       git init sub &&
+       test_when_finished "rm -rf sub" &&
+       echo "foobar" >sub/file &&
+       git -C sub add file &&
+       git -C sub commit -m "add file" &&
+
+       git -C parent submodule add ../sub dir/sub &&
+       git -C parent commit -m "add submodule" &&
+
+       cat >expect <<-\EOF &&
+       dir/sub/file:foobar
+       file:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules >actual &&
+       test_cmp expect actual &&
+
+       git -C parent mv dir/sub sub-moved &&
+       git -C parent commit -m "moved submodule" &&
+
+       cat >expect <<-\EOF &&
+       file:foobar
+       sub-moved/file:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules >actual &&
+       test_cmp expect actual &&
+
+       cat >expect <<-\EOF &&
+       HEAD^:dir/sub/file:foobar
+       HEAD^:file:foobar
+       EOF
+       git -C parent grep -e "foobar" --recurse-submodules HEAD^ >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep using relative path' '
+       test_when_finished "rm -rf parent sub" &&
+       git init sub &&
+       echo "foobar" >sub/file &&
+       git -C sub add file &&
+       git -C sub commit -m "add file" &&
+
+       git init parent &&
+       echo "foobar" >parent/file &&
+       git -C parent add file &&
+       mkdir parent/src &&
+       echo "foobar" >parent/src/file2 &&
+       git -C parent add src/file2 &&
+       git -C parent submodule add ../sub &&
+       git -C parent commit -m "add files and submodule" &&
+
+       # From top works
+       cat >expect <<-\EOF &&
+       file:foobar
+       src/file2:foobar
+       sub/file:foobar
+       EOF
+       git -C parent grep --recurse-submodules -e "foobar" >actual &&
+       test_cmp expect actual &&
+
+       # Relative path to top
+       cat >expect <<-\EOF &&
+       ../file:foobar
+       file2:foobar
+       ../sub/file:foobar
+       EOF
+       git -C parent/src grep --recurse-submodules -e "foobar" -- .. >actual &&
+       test_cmp expect actual &&
+
+       # Relative path to submodule
+       cat >expect <<-\EOF &&
+       ../sub/file:foobar
+       EOF
+       git -C parent/src grep --recurse-submodules -e "foobar" -- ../sub >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'grep from a subdir' '
+       test_when_finished "rm -rf parent sub" &&
+       git init sub &&
+       echo "foobar" >sub/file &&
+       git -C sub add file &&
+       git -C sub commit -m "add file" &&
+
+       git init parent &&
+       mkdir parent/src &&
+       echo "foobar" >parent/src/file &&
+       git -C parent add src/file &&
+       git -C parent submodule add ../sub src/sub &&
+       git -C parent submodule add ../sub sub &&
+       git -C parent commit -m "add files and submodules" &&
+
+       # Verify grep from root works
+       cat >expect <<-\EOF &&
+       src/file:foobar
+       src/sub/file:foobar
+       sub/file:foobar
+       EOF
+       git -C parent grep --recurse-submodules -e "foobar" >actual &&
+       test_cmp expect actual &&
+
+       # Verify grep from a subdir works
+       cat >expect <<-\EOF &&
+       file:foobar
+       sub/file:foobar
+       EOF
+       git -C parent/src grep --recurse-submodules -e "foobar" >actual &&
+       test_cmp expect actual
+'
+
+test_incompatible_with_recurse_submodules ()
+{
+       test_expect_success "--recurse-submodules and $1 are incompatible" "
+               test_must_fail git grep -e. --recurse-submodules $1 2>actual &&
+               test_i18ngrep 'not supported with --recurse-submodules' actual
+       "
+}
+
+test_incompatible_with_recurse_submodules --untracked
+test_incompatible_with_recurse_submodules --no-index
+
+test_done
index ab79de95441f4f474525b48b14313f1d04172fce..380e1c1054de5d55a80cb558fea0791884ad7f38 100755 (executable)
@@ -86,4 +86,36 @@ test_expect_success 'blame with showEmail config true' '
        test_cmp expected_n result
 '
 
+test_expect_success 'set up abbrev tests' '
+       test_commit abbrev &&
+       sha1=$(git rev-parse --verify HEAD) &&
+       check_abbrev () {
+               expect=$1; shift
+               echo $sha1 | cut -c 1-$expect >expect &&
+               git blame "$@" abbrev.t >actual &&
+               perl -lne "/[0-9a-f]+/ and print \$&" <actual >actual.sha &&
+               test_cmp expect actual.sha
+       }
+'
+
+test_expect_success 'blame --abbrev=<n> works' '
+       # non-boundary commits get +1 for alignment
+       check_abbrev 31 --abbrev=30 HEAD &&
+       check_abbrev 30 --abbrev=30 ^HEAD
+'
+
+test_expect_success 'blame -l aligns regular and boundary commits' '
+       check_abbrev 40 -l HEAD &&
+       check_abbrev 39 -l ^HEAD
+'
+
+test_expect_success 'blame --abbrev=40 behaves like -l' '
+       check_abbrev 40 --abbrev=40 HEAD &&
+       check_abbrev 39 --abbrev=40 ^HEAD
+'
+
+test_expect_success '--no-abbrev works like --abbrev=40' '
+       check_abbrev 40 --no-abbrev
+'
+
 test_done
index e48370dfa06b33448bbcf63a3db59bce4c1de6e8..661f9d430d28834b8a006fa0bcc958f52c95258b 100755 (executable)
@@ -212,12 +212,12 @@ EOF
 
 test_expect_success 'blame -L with invalid start' '
        test_must_fail git blame -L5 tres 2>errors &&
-       grep "has only 2 lines" errors
+       test_i18ngrep "has only 2 lines" errors
 '
 
 test_expect_success 'blame -L with invalid end' '
        test_must_fail git blame -L1,5 tres 2>errors &&
-       grep "has only 2 lines" errors
+       test_i18ngrep "has only 2 lines" errors
 '
 
 test_expect_success 'blame parses <end> part of -L' '
diff --git a/t/t8010-cat-file-filters.sh b/t/t8010-cat-file-filters.sh
new file mode 100755 (executable)
index 0000000..d8242e4
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+test_description='git cat-file filters support'
+. ./test-lib.sh
+
+test_expect_success 'setup ' '
+       echo "*.txt eol=crlf diff=txt" >.gitattributes &&
+       echo "hello" | append_cr >world.txt &&
+       git add .gitattributes world.txt &&
+       test_tick &&
+       git commit -m "Initial commit"
+'
+
+has_cr () {
+       tr '\015' Q <"$1" | grep Q >/dev/null
+}
+
+test_expect_success 'no filters with `git show`' '
+       git show HEAD:world.txt >actual &&
+       ! has_cr actual
+
+'
+
+test_expect_success 'no filters with cat-file' '
+       git cat-file blob HEAD:world.txt >actual &&
+       ! has_cr actual
+'
+
+test_expect_success 'cat-file --filters converts to worktree version' '
+       git cat-file --filters HEAD:world.txt >actual &&
+       has_cr actual
+'
+
+test_expect_success 'cat-file --filters --path=<path> works' '
+       sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
+       git cat-file --filters --path=world.txt $sha1 >actual &&
+       has_cr actual
+'
+
+test_expect_success 'cat-file --textconv --path=<path> works' '
+       sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
+       test_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&
+       git cat-file --textconv --path=hello.txt $sha1 >rot13 &&
+       test uryyb = "$(cat rot13 | remove_cr)"
+'
+
+test_expect_success '--path=<path> complains without --textconv/--filters' '
+       sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
+       test_must_fail git cat-file --path=hello.txt blob $sha1 >actual 2>err &&
+       test ! -s actual &&
+       grep "path.*needs.*filters" err
+'
+
+test_expect_success 'cat-file --textconv --batch works' '
+       sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
+       test_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&
+       printf "%s hello.txt\n%s hello\n" $sha1 $sha1 |
+       git cat-file --textconv --batch >actual &&
+       printf "%s blob 6\nuryyb\r\n\n%s blob 6\nhello\n\n" \
+               $sha1 $sha1 >expect &&
+       test_cmp expect actual
+'
+
+test_done
diff --git a/t/t8011-blame-split-file.sh b/t/t8011-blame-split-file.sh
new file mode 100755 (executable)
index 0000000..8311250
--- /dev/null
@@ -0,0 +1,117 @@
+#!/bin/sh
+
+test_description='
+The general idea is that we have a single file whose lines come from
+multiple other files, and those individual files were modified in the same
+commits. That means that we will see the same commit in multiple contexts,
+and each one should be attributed to the correct file.
+
+Note that we need to use "blame -C" to find the commit for all lines. We will
+not bother testing that the non-C case fails to find it. That is how blame
+behaves now, but it is not a property we want to make sure is retained.
+'
+. ./test-lib.sh
+
+# help avoid typing and reading long strings of similar lines
+# in the tests below
+generate_expect () {
+       while read nr data
+       do
+               i=0
+               while test $i -lt $nr
+               do
+                       echo $data
+                       i=$((i + 1))
+               done
+       done
+}
+
+test_expect_success 'setup split file case' '
+       # use lines long enough to trigger content detection
+       test_seq 1000 1010 >one &&
+       test_seq 2000 2010 >two &&
+       git add one two &&
+       test_commit base &&
+
+       sed "6s/^/modified /" <one >one.tmp &&
+       mv one.tmp one &&
+       sed "6s/^/modified /" <two >two.tmp &&
+       mv two.tmp two &&
+       git add -u &&
+       test_commit modified &&
+
+       cat one two >combined &&
+       git add combined &&
+       git rm one two &&
+       test_commit combined
+'
+
+test_expect_success 'setup simulated porcelain' '
+       # This just reads porcelain-ish output and tries
+       # to output the value of a given field for each line (either by
+       # reading the field that accompanies this line, or referencing
+       # the information found last time the commit was mentioned).
+       cat >read-porcelain.pl <<-\EOF
+       my $field = shift;
+       while (<>) {
+               if (/^[0-9a-f]{40} /) {
+                       flush();
+                       $hash = $&;
+               } elsif (/^$field (.*)/) {
+                       $cache{$hash} = $1;
+               }
+       }
+       flush();
+
+       sub flush {
+               return unless defined $hash;
+               if (defined $cache{$hash}) {
+                       print "$cache{$hash}\n";
+               } else {
+                       print "NONE\n";
+               }
+       }
+       EOF
+'
+
+for output in porcelain line-porcelain
+do
+       test_expect_success "generate --$output output" '
+               git blame --root -C --$output combined >output
+       '
+
+       test_expect_success "$output output finds correct commits" '
+               generate_expect >expect <<-\EOF &&
+               5 base
+               1 modified
+               10 base
+               1 modified
+               5 base
+               EOF
+               perl read-porcelain.pl summary <output >actual &&
+               test_cmp expect actual
+       '
+
+       test_expect_success "$output output shows correct filenames" '
+               generate_expect >expect <<-\EOF &&
+               11 one
+               11 two
+               EOF
+               perl read-porcelain.pl filename <output >actual &&
+               test_cmp expect actual
+       '
+
+       test_expect_success "$output output shows correct previous pointer" '
+               generate_expect >expect <<-EOF &&
+               5 NONE
+               1 $(git rev-parse modified^) one
+               10 NONE
+               1 $(git rev-parse modified^) two
+               5 NONE
+               EOF
+               perl read-porcelain.pl previous <output >actual &&
+               test_cmp expect actual
+       '
+done
+
+test_done
index 3dc4a3454d223d37e85de6fa4ae8656046370e99..60a80f60b2685c461f80cdbf4256eb17dc18b85b 100755 (executable)
@@ -50,7 +50,7 @@ test_no_confirm () {
                --smtp-server="$(pwd)/fake.sendmail" \
                $@ \
                $patches >stdout &&
-               test_must_fail grep "Send this email" stdout &&
+               ! grep "Send this email" stdout &&
                >no_confirm_okay
 }
 
@@ -148,7 +148,6 @@ cat >expected-cc <<\EOF
 !two@example.com!
 !three@example.com!
 !four@example.com!
-!five@example.com!
 EOF
 "
 
@@ -159,9 +158,9 @@ test_expect_success $PREREQ 'cc trailer with various syntax' '
        Test Cc: trailers.
 
        Cc: one@example.com
-       Cc: <two@example.com> # this is part of the name
-       Cc: <three@example.com>, <four@example.com> # not.five@example.com
-       Cc: "Some # Body" <five@example.com> [part.of.name.too]
+       Cc: <two@example.com> # trailing comments are ignored
+       Cc: <three@example.com>, <not.four@example.com> one address per line
+       Cc: "Some # Body" <four@example.com> [ <also.a.comment> ]
        EOF
        clean_fake_sendmail &&
        git send-email -1 --to=recipient@example.com \
index 92a3aa8063f810bd2b8df68f3f0f30c2faf3bdc6..8a8ba65a2ae583aa5d0b0526e604a8f9613b5a5e 100755 (executable)
@@ -17,25 +17,12 @@ case "$GIT_SVN_LC_ALL" in
        ;;
 esac
 
-deepdir=nothing-above
-ceiling=$PWD
-
 test_expect_success 'git svn --version works anywhere' '
-       mkdir -p "$deepdir" && (
-               GIT_CEILING_DIRECTORIES="$ceiling" &&
-               export GIT_CEILING_DIRECTORIES &&
-               cd "$deepdir" &&
-               git svn --version
-       )
+       nongit git svn --version
 '
 
 test_expect_success 'git svn help works anywhere' '
-       mkdir -p "$deepdir" && (
-               GIT_CEILING_DIRECTORIES="$ceiling" &&
-               export GIT_CEILING_DIRECTORIES &&
-               cd "$deepdir" &&
-               git svn help
-       )
+       nongit git svn help
 '
 
 test_expect_success \
index 69a675052e2099f278c98ddf8bba12658741fba4..044f65e91660b79a89601c3613eb620807e48bb1 100755 (executable)
@@ -55,7 +55,7 @@ test_expect_success 'clone to target directory with --stdlayout' '
 test_expect_success 'init without -s/-T/-b/-t does not warn' '
        test ! -d trunk &&
        git svn init "$svnrepo"/project/trunk trunk 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        rm -rf trunk &&
        rm -f warning
        '
@@ -63,7 +63,7 @@ test_expect_success 'init without -s/-T/-b/-t does not warn' '
 test_expect_success 'clone without -s/-T/-b/-t does not warn' '
        test ! -d trunk &&
        git svn clone "$svnrepo"/project/trunk 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        rm -rf trunk &&
        rm -f warning
        '
@@ -86,7 +86,7 @@ EOF
 test_expect_success 'init with -s/-T/-b/-t assumes --prefix=origin/' '
        test ! -d project &&
        git svn init -s "$svnrepo"/project project 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "origin/" &&
        rm -rf project &&
        rm -f warning
@@ -95,7 +95,7 @@ test_expect_success 'init with -s/-T/-b/-t assumes --prefix=origin/' '
 test_expect_success 'clone with -s/-T/-b/-t assumes --prefix=origin/' '
        test ! -d project &&
        git svn clone -s "$svnrepo"/project 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "origin/" &&
        rm -rf project &&
        rm -f warning
@@ -104,7 +104,7 @@ test_expect_success 'clone with -s/-T/-b/-t assumes --prefix=origin/' '
 test_expect_success 'init with -s/-T/-b/-t and --prefix "" still works' '
        test ! -d project &&
        git svn init -s "$svnrepo"/project project --prefix "" 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "" &&
        rm -rf project &&
        rm -f warning
@@ -113,7 +113,7 @@ test_expect_success 'init with -s/-T/-b/-t and --prefix "" still works' '
 test_expect_success 'clone with -s/-T/-b/-t and --prefix "" still works' '
        test ! -d project &&
        git svn clone -s "$svnrepo"/project --prefix "" 2>warning &&
-       test_must_fail grep -q prefix warning &&
+       ! grep -q prefix warning &&
        test_svn_configured_prefix "" &&
        rm -rf project &&
        rm -f warning
index bb879a527d94e7329dccef15525421917676f56b..1319415ba8ec04f2b9d34ec984d3f8afb61fb551 100755 (executable)
@@ -18,6 +18,11 @@ then
     test_done
 fi
 
+if ! test_have_prereq NOT_ROOT; then
+       skip_all='When cvs is compiled with CVS_BADROOT commits as root fail'
+       test_done
+fi
+
 CVSROOT=$PWD/tmpcvsroot
 CVSWORK=$PWD/cvswork
 GIT_DIR=$PWD/.git
index 83acf68bc3c19770eb690ece139892ca75329216..dadc70b7d5705d11437d40a701dd5079247e6357 100755 (executable)
@@ -483,6 +483,48 @@ test_expect_success 'verify that lots of notes trigger a fanout scheme' '
 
 '
 
+# Create another notes tree from the one above
+SP=" "
+cat >>input <<INPUT_END
+commit refs/heads/other_commits
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+commit #$(($num_commit + 1))
+COMMIT
+
+from refs/heads/many_commits
+M 644 inline file
+data <<EOF
+file contents in commit #$(($num_commit + 1))
+EOF
+
+commit refs/notes/other_notes
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+committing one more note on a tree imported from a previous notes tree
+COMMIT
+
+M 040000 $(git log --no-walk --format=%T refs/notes/many_notes)$SP
+N inline :$(($num_commit + 1))
+data <<EOF
+note for commit #$(($num_commit + 1))
+EOF
+INPUT_END
+
+test_expect_success 'verify that importing a notes tree respects the fanout scheme' '
+       git fast-import <input &&
+
+       # None of the entries in the top-level notes tree should be a full SHA1
+       git ls-tree --name-only refs/notes/other_notes |
+       while read path
+       do
+               if test $(expr length "$path") -ge 40
+               then
+                       return 1
+               fi
+       done
+'
+
 cat >>expect_non-note1 << EOF
 This is not a note, but rather a regular file residing in a notes tree
 EOF
diff --git a/t/t9303-fast-import-compression.sh b/t/t9303-fast-import-compression.sh
new file mode 100755 (executable)
index 0000000..856219f
--- /dev/null
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+test_description='compression setting of fast-import utility'
+. ./test-lib.sh
+
+# This should be moved to test-lib.sh together with the
+# copy in t0021 after both topics have graduated to 'master'.
+file_size () {
+       perl -e 'print -s $ARGV[0]' "$1"
+}
+
+import_large () {
+       (
+               echo blob
+               echo "data <<EOD"
+               printf "%2000000s\n" "$*"
+               echo EOD
+       ) | git "$@" fast-import
+}
+
+while read expect config
+do
+       test_expect_success "fast-import (packed) with $config" '
+               test_when_finished "rm -f .git/objects/pack/pack-*.*" &&
+               test_when_finished "rm -rf .git/objects/??" &&
+               import_large -c fastimport.unpacklimit=0 $config &&
+               sz=$(file_size .git/objects/pack/pack-*.pack) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c pack.compression=0
+large -c core.compression=9 -c pack.compression=0
+small -c core.compression=0 -c pack.compression=9
+small -c core.compression=9 -c pack.compression=9
+large -c pack.compression=0
+small -c pack.compression=9
+EOF
+
+while read expect config
+do
+       test_expect_success "fast-import (loose) with $config" '
+               test_when_finished "rm -f .git/objects/pack/pack-*.*" &&
+               test_when_finished "rm -rf .git/objects/??" &&
+               import_large -c fastimport.unpacklimit=9 $config &&
+               sz=$(file_size .git/objects/??/????*) &&
+               case "$expect" in
+               small) test "$sz" -le 100000 ;;
+               large) test "$sz" -ge 100000 ;;
+               esac
+       '
+done <<\EOF
+large -c core.compression=0
+small -c core.compression=9
+large -c core.compression=0 -c core.loosecompression=0
+large -c core.compression=9 -c core.loosecompression=0
+small -c core.compression=0 -c core.loosecompression=9
+small -c core.compression=9 -c core.loosecompression=9
+large -c core.loosecompression=0
+small -c core.loosecompression=9
+EOF
+
+test_done
index b5149fde6ecda2b3de5ed60f43c60ab70230289c..8dcb05c4a5711e95bb64d8ba310e3490744fc015 100755 (executable)
@@ -70,7 +70,7 @@ test_expect_success 'iso-8859-1' '
 
        git config i18n.commitencoding ISO8859-1 &&
        # use author and committer name in ISO-8859-1 to match it.
-       . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       . "$TEST_DIRECTORY"/t3901/8859-1.txt &&
        test_tick &&
        echo rosten >file &&
        git commit -s -m den file &&
index e94b2f147a72b216a1c97d278bb9c822aed7392a..cc8d463e01ac74a78fa08b638318a88b8ea98bff 100755 (executable)
@@ -519,7 +519,7 @@ test_expect_success \
 
 test_expect_success \
        'encode(commit): utf8' \
-       '. "$TEST_DIRECTORY"/t3901-utf8.txt &&
+       '. "$TEST_DIRECTORY"/t3901/utf8.txt &&
         test_when_finished "GIT_AUTHOR_NAME=\"A U Thor\"" &&
         test_when_finished "GIT_COMMITTER_NAME=\"C O Mitter\"" &&
         echo "UTF-8" >> file &&
@@ -529,7 +529,7 @@ test_expect_success \
 
 test_expect_success \
        'encode(commit): iso-8859-1' \
-       '. "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+       '. "$TEST_DIRECTORY"/t3901/8859-1.txt &&
         test_when_finished "GIT_AUTHOR_NAME=\"A U Thor\"" &&
         test_when_finished "GIT_COMMITTER_NAME=\"C O Mitter\"" &&
         echo "ISO-8859-1" >> file &&
@@ -709,6 +709,14 @@ test_expect_success HIGHLIGHT \
         git commit -m "Add test.sh" &&
         gitweb_run "p=.git;a=blob;f=test.sh"'
 
+test_expect_success HIGHLIGHT \
+       'syntax highlighting (highlighter language autodetection)' \
+       'git config gitweb.highlight yes &&
+        echo "#!/usr/bin/perl" > test &&
+        git add test &&
+        git commit -m "Add test" &&
+        gitweb_run "p=.git;a=blob;f=test"'
+
 # ----------------------------------------------------------------------
 # forks of projects
 
index 4c384ff02333e1413cc67b1b4a6bed47ae3d00db..804ce3850ff3f7838035fd316e26ee301b525ff0 100755 (executable)
@@ -3,6 +3,11 @@
 test_description='git cvsimport basic tests'
 . ./lib-cvs.sh
 
+if ! test_have_prereq NOT_ROOT; then
+       skip_all='When cvs is compiled with CVS_BADROOT commits as root fail'
+       test_done
+fi
+
 test_expect_success PERL 'setup cvsroot environment' '
        CVSROOT=$(pwd)/cvsroot &&
        export CVSROOT
index 0730f18d0f83f4145c5a0dbfde784d71bdc57a1d..4849edc4ef6733b8cf42950b3cd5fe809a80cdde 100755 (executable)
@@ -131,6 +131,26 @@ test_expect_success 'clone two dirs, @all, conflicting files' '
        )
 '
 
+test_expect_success 'clone two dirs, each edited by submit, single git commit' '
+       (
+               cd "$cli" &&
+               echo sub1/f4 >sub1/f4 &&
+               p4 add sub1/f4 &&
+               echo sub2/f4 >sub2/f4 &&
+               p4 add sub2/f4 &&
+               p4 submit -d "sub1/f4 and sub2/f4"
+       ) &&
+       git p4 clone --dest="$git" //depot/sub1@all //depot/sub2@all &&
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git ls-files >lines &&
+               test_line_count = 4 lines &&
+               git log --oneline p4/master >lines &&
+               test_line_count = 5 lines
+       )
+'
+
 revision_ranges="2000/01/01,#head \
                 1,2080/01/01 \
                 2000/01/01,2080/01/01 \
@@ -147,7 +167,7 @@ test_expect_success 'clone using non-numeric revision ranges' '
                (
                        cd "$git" &&
                        git ls-files >lines &&
-                       test_line_count = 6 lines
+                       test_line_count = 8 lines
                )
        done
 '
@@ -257,6 +277,26 @@ test_expect_success 'submit from detached head' '
        )
 '
 
+test_expect_success 'submit from worktree' '
+       test_when_finished cleanup_git &&
+       git p4 clone --dest="$git" //depot &&
+       (
+               cd "$git" &&
+               git worktree add ../worktree-test
+       ) &&
+       (
+               cd "$git/../worktree-test" &&
+               test_commit "worktree-commit" &&
+               git config git-p4.skipSubmitEdit true &&
+               git p4 submit
+       ) &&
+       (
+               cd "$cli" &&
+               p4 sync &&
+               test_path_is_file worktree-commit.t
+       )
+'
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '
index 254d428b73fe4983298f57e0d87405002abdfbc2..1ab76c4246f215cfc0082bdbfd090e1622362140 100755 (executable)
@@ -269,6 +269,38 @@ test_expect_success 'submit works with two branches' '
        )
 '
 
+test_expect_success 'use --git-dir option and GIT_DIR' '
+       test_when_finished cleanup_git &&
+       git p4 clone //depot --destination="$git" &&
+       (
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               test_commit first-change &&
+               git p4 submit --git-dir "$git"
+       ) &&
+       (
+               cd "$cli" &&
+               p4 sync &&
+               test_path_is_file first-change.t &&
+               echo "cli_file" >cli_file.t &&
+               p4 add cli_file.t &&
+               p4 submit -d "cli change"
+       ) &&
+       (git --git-dir "$git" p4 sync) &&
+       (cd "$git" && git checkout -q p4/master) &&
+       test_path_is_file "$git"/cli_file.t &&
+       (
+               cd "$cli" &&
+               echo "cli_file2" >cli_file2.t &&
+               p4 add cli_file2.t  &&
+               p4 submit -d "cli change2"
+       ) &&
+       (GIT_DIR="$git" git p4 sync) &&
+       (cd "$git" && git checkout -q p4/master) &&
+       test_path_is_file "$git"/cli_file2.t
+'
+
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '
index 593152817dadaf1804f4a851c51b8bf1cbf52db9..3457d5db64afc09f63e8c7de4c51b932b012c7ee 100755 (executable)
@@ -139,6 +139,22 @@ test_expect_success 'submit with master branch name from argv' '
        )
 '
 
+test_expect_success 'allow submit from branch with same revision but different name' '
+       test_when_finished cleanup_git &&
+       git p4 clone --dest="$git" //depot &&
+       (
+               cd "$git" &&
+               test_commit "file8" &&
+               git checkout -b branch1 &&
+               git checkout -b branch2 &&
+               git config git-p4.skipSubmitEdit true &&
+               git config git-p4.allowSubmit "branch1" &&
+               test_must_fail git p4 submit &&
+               git checkout branch1 &&
+               git p4 submit
+       )
+'
+
 #
 # Basic submit tests, the five handled cases
 #
@@ -413,6 +429,75 @@ test_expect_success 'submit --prepare-p4-only' '
        )
 '
 
+test_expect_success 'submit --shelve' '
+       test_when_finished cleanup_git &&
+       git p4 clone --dest="$git" //depot &&
+       (
+               cd "$cli" &&
+               p4 revert ... &&
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               test_commit "shelveme1" &&
+               git p4 submit --origin=HEAD^ &&
+
+               echo 654321 >shelveme2.t &&
+               echo 123456 >>shelveme1.t &&
+               git add shelveme* &&
+               git commit -m"shelvetest" &&
+               git p4 submit --shelve --origin=HEAD^ &&
+
+               test_path_is_file shelveme1.t &&
+               test_path_is_file shelveme2.t
+       ) &&
+       (
+               cd "$cli" &&
+               change=$(p4 -G changes -s shelved -m 1 //depot/... | \
+                        marshal_dump change) &&
+               p4 describe -S $change | grep shelveme2 &&
+               p4 describe -S $change | grep 123456 &&
+               test_path_is_file shelveme1.t &&
+               test_path_is_missing shelveme2.t
+       )
+'
+
+# Update an existing shelved changelist
+
+test_expect_success 'submit --update-shelve' '
+       test_when_finished cleanup_git &&
+       git p4 clone --dest="$git" //depot &&
+       (
+               cd "$cli" &&
+               p4 revert ... &&
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               test_commit "test-update-shelved-change" &&
+               git p4 submit --origin=HEAD^ --shelve &&
+
+               shelf_cl=$(p4 -G changes -s shelved -m 1 |\
+                       marshal_dump change) &&
+               test -n $shelf_cl &&
+               echo "updating shelved change list $shelf_cl" &&
+
+               echo "updated-line" >>shelf.t &&
+               echo added-file.t >added-file.t &&
+               git add shelf.t added-file.t &&
+               git rm -f test-update-shelved-change.t &&
+               git commit --amend -C HEAD &&
+               git show --stat HEAD &&
+               git p4 submit -v --origin HEAD^ --update-shelve $shelf_cl &&
+               echo "done git p4 submit"
+       ) &&
+       (
+               cd "$cli" &&
+               change=$(p4 -G changes -s shelved -m 1 //depot/... | \
+                        marshal_dump change) &&
+               p4 unshelve -c $change -s $change &&
+               grep -q updated-line shelf.t &&
+               p4 describe -S $change | grep added-file.t &&
+               test_path_is_missing test-update-shelved-change.t
+       )
+'
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '
index 0fe23128070745750b54843bfb05a7822f41c285..bda222aa0270f3a93fa494b308aa174ebc942eca 100755 (executable)
@@ -118,21 +118,21 @@ test_expect_success 'not preserving user with mixed authorship' '
                make_change_by_user usernamefile3 Derek derek@example.com &&
                P4EDITOR=cat P4USER=alice P4PASSWD=secret &&
                export P4EDITOR P4USER P4PASSWD &&
-               git p4 commit |\
-               grep "git author derek@example.com does not match" &&
+               git p4 commit >actual &&
+               grep "git author derek@example.com does not match" actual &&
 
                make_change_by_user usernamefile3 Charlie charlie@example.com &&
-               git p4 commit |\
-               grep "git author charlie@example.com does not match" &&
+               git p4 commit >actual &&
+               grep "git author charlie@example.com does not match" actual &&
 
                make_change_by_user usernamefile3 alice alice@example.com &&
-               git p4 commit |\
-               test_must_fail grep "git author.*does not match" &&
+               git p4 commit >actual &&
+               ! grep "git author.*does not match" actual &&
 
                git config git-p4.skipUserNameCheck true &&
                make_change_by_user usernamefile3 Charlie charlie@example.com &&
-               git p4 commit |\
-               test_must_fail grep "git author.*does not match" &&
+               git p4 commit >actual &&
+               ! grep "git author.*does not match" actual &&
 
                p4_check_commit_author usernamefile3 alice
        )
index c89992cf95c7fab5b876f98bb5518bfe39344f4a..e7e0268e985072b6a7d8c9448dc0c3d9a9057da9 100755 (executable)
@@ -141,7 +141,7 @@ test_expect_success 'detect copies' '
                git diff-tree -r -C HEAD &&
                git p4 submit &&
                p4 filelog //depot/file8 &&
-               p4 filelog //depot/file8 | test_must_fail grep -q "branch from" &&
+               ! p4 filelog //depot/file8 | grep -q "branch from" &&
 
                echo "file9" >>file2 &&
                git commit -a -m "Differentiate file2" &&
@@ -154,7 +154,7 @@ test_expect_success 'detect copies' '
                git config git-p4.detectCopies true &&
                git p4 submit &&
                p4 filelog //depot/file9 &&
-               p4 filelog //depot/file9 | test_must_fail grep -q "branch from" &&
+               ! p4 filelog //depot/file9 | grep -q "branch from" &&
 
                echo "file10" >>file2 &&
                git commit -a -m "Differentiate file2" &&
@@ -202,7 +202,7 @@ test_expect_success 'detect copies' '
                git config git-p4.detectCopies $(($level + 2)) &&
                git p4 submit &&
                p4 filelog //depot/file12 &&
-               p4 filelog //depot/file12 | test_must_fail grep -q "branch from" &&
+               ! p4 filelog //depot/file12 | grep -q "branch from" &&
 
                echo "file13" >>file2 &&
                git commit -a -m "Differentiate file2" &&
index 7b83e696a92a5c97e8c022af2601d60a95ab1cbc..c78477c19b4330f990c0cdd7d96997b8ed2ed02c 100755 (executable)
@@ -51,6 +51,22 @@ test_expect_success 'Clone repo containing iso8859-1 encoded paths with git-p4.p
        )
 '
 
+test_expect_success 'Delete iso8859-1 encoded paths and clone' '
+       (
+               cd "$cli" &&
+               ISO8859="$(printf "$ISO8859_ESCAPED")" &&
+               p4 delete "$ISO8859" &&
+               p4 submit -d "remove file"
+       ) &&
+       git p4 clone --destination="$git" //depot@all &&
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git -c core.quotepath=false ls-files >actual &&
+               test_must_be_empty actual
+       )
+'
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '
index 110a7e792475fcf19ef782fae1d265ae81653853..ed80ca858c8f8352bd5a26b9a30e0c182d102ee9 100755 (executable)
@@ -42,6 +42,8 @@ test_expect_success 'Create repo with binary files' '
        (
                cd "$cli" &&
 
+               >file0.dat &&
+               p4 add file0.dat &&
                echo "content 1 txt 23 bytes" >file1.txt &&
                p4 add file1.txt &&
                echo "content 2-3 bin 25 bytes" >file2.dat &&
@@ -81,9 +83,9 @@ test_expect_success 'Store files in LFS based on size (>24 bytes)' '
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file2.dat filter=lfs -text
-               /file4.bin filter=lfs -text
-               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+               /file2.dat filter=lfs diff=lfs merge=lfs -text
+               /file4.bin filter=lfs diff=lfs merge=lfs -text
+               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -109,7 +111,7 @@ test_expect_success 'Store files in LFS based on size (>25 bytes)' '
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file4.bin filter=lfs -text
+               /file4.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -135,7 +137,7 @@ test_expect_success 'Store files in LFS based on extension (dat)' '
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               *.dat filter=lfs -text
+               *.dat filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -163,8 +165,8 @@ test_expect_success 'Store files in LFS based on size (>25 bytes) and extension
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               *.dat filter=lfs -text
-               /file4.bin filter=lfs -text
+               *.dat filter=lfs diff=lfs merge=lfs -text
+               /file4.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -199,8 +201,8 @@ test_expect_success 'Remove file from repo and store files in LFS based on size
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file2.dat filter=lfs -text
-               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+               /file2.dat filter=lfs diff=lfs merge=lfs -text
+               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -237,8 +239,8 @@ test_expect_success 'Add .gitattributes and store files in LFS based on size (>2
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file2.dat filter=lfs -text
-               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs -text
+               /file2.dat filter=lfs diff=lfs merge=lfs -text
+               /path[[:space:]]with[[:space:]]spaces/file3.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
@@ -278,7 +280,7 @@ test_expect_success 'Add big files to repo and store files in LFS based on compr
                #
                # Git LFS (see https://git-lfs.github.com/)
                #
-               /file6.bin filter=lfs -text
+               /file6.bin filter=lfs diff=lfs merge=lfs -text
                EOF
                test_path_is_file .gitattributes &&
                test_cmp expect .gitattributes
diff --git a/t/t9830-git-p4-symlink-dir.sh b/t/t9830-git-p4-symlink-dir.sh
new file mode 100755 (executable)
index 0000000..3dc528b
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+test_description='git p4 symlinked directories'
+
+. ./lib-git-p4.sh
+
+test_expect_success 'start p4d' '
+       start_p4d
+'
+
+test_expect_success 'symlinked directory' '
+       (
+               cd "$cli" &&
+               : >first_file.t &&
+               p4 add first_file.t &&
+               p4 submit -d "first change"
+       ) &&
+       git p4 clone --dest "$git" //depot &&
+       (
+               cd "$git" &&
+               mkdir -p some/sub/directory &&
+               mkdir -p other/subdir2 &&
+               : > other/subdir2/file.t &&
+               (cd some/sub/directory && ln -s ../../../other/subdir2 .) &&
+               git add some other &&
+               git commit -m "symlinks" &&
+               git config git-p4.skipSubmitEdit true &&
+               git p4 submit -v
+       ) &&
+       (
+               cd "$cli" &&
+               p4 sync &&
+               test -L some/sub/directory/subdir2
+               test_path_is_file some/sub/directory/subdir2/file.t
+       )
+
+'
+
+test_expect_success 'kill p4d' '
+       kill_p4d
+'
+
+test_done
index 2ba62fbc178e1c92dff493beebdc9683b36efd2a..2cb999ecfab69eb7825ad05c79a874114f921716 100755 (executable)
@@ -98,7 +98,7 @@ test_gitcomp ()
 {
        local -a COMPREPLY &&
        sed -e 's/Z$//' >expected &&
-       cur="$1" &&
+       local cur="$1" &&
        shift &&
        __gitcomp "$@" &&
        print_comp &&
@@ -113,7 +113,7 @@ test_gitcomp_nl ()
 {
        local -a COMPREPLY &&
        sed -e 's/Z$//' >expected &&
-       cur="$1" &&
+       local cur="$1" &&
        shift &&
        __gitcomp_nl "$@" &&
        print_comp &&
@@ -124,145 +124,296 @@ invalid_variable_name='${foo.bar}'
 
 actual="$TRASH_DIRECTORY/actual"
 
-test_expect_success 'setup for __gitdir tests' '
+if test_have_prereq MINGW
+then
+       ROOT="$(pwd -W)"
+else
+       ROOT="$(pwd)"
+fi
+
+test_expect_success 'setup for __git_find_repo_path/__gitdir tests' '
        mkdir -p subdir/subsubdir &&
+       mkdir -p non-repo &&
        git init otherrepo
 '
 
-test_expect_success '__gitdir - from command line (through $__git_dir)' '
-       echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
+test_expect_success '__git_find_repo_path - from command line (through $__git_dir)' '
+       echo "$ROOT/otherrepo/.git" >expected &&
        (
-               __git_dir="$TRASH_DIRECTORY/otherrepo/.git" &&
-               __gitdir >"$actual"
+               __git_dir="$ROOT/otherrepo/.git" &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - repo as argument' '
-       echo "otherrepo/.git" >expected &&
-       __gitdir "otherrepo" >"$actual" &&
-       test_cmp expected "$actual"
-'
-
-test_expect_success '__gitdir - remote as argument' '
-       echo "remote" >expected &&
-       __gitdir "remote" >"$actual" &&
-       test_cmp expected "$actual"
-'
-
-test_expect_success '__gitdir - .git directory in cwd' '
+test_expect_success '__git_find_repo_path - .git directory in cwd' '
        echo ".git" >expected &&
-       __gitdir >"$actual" &&
+       (
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - .git directory in parent' '
-       echo "$(pwd -P)/.git" >expected &&
+test_expect_success '__git_find_repo_path - .git directory in parent' '
+       echo "$ROOT/.git" >expected &&
        (
                cd subdir/subsubdir &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - cwd is a .git directory' '
+test_expect_success '__git_find_repo_path - cwd is a .git directory' '
        echo "." >expected &&
        (
                cd .git &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - parent is a .git directory' '
-       echo "$(pwd -P)/.git" >expected &&
+test_expect_success '__git_find_repo_path - parent is a .git directory' '
+       echo "$ROOT/.git" >expected &&
        (
                cd .git/refs/heads &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - $GIT_DIR set while .git directory in cwd' '
-       echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
+test_expect_success '__git_find_repo_path - $GIT_DIR set while .git directory in cwd' '
+       echo "$ROOT/otherrepo/.git" >expected &&
        (
-               GIT_DIR="$TRASH_DIRECTORY/otherrepo/.git" &&
+               GIT_DIR="$ROOT/otherrepo/.git" &&
                export GIT_DIR &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - $GIT_DIR set while .git directory in parent' '
-       echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
+test_expect_success '__git_find_repo_path - $GIT_DIR set while .git directory in parent' '
+       echo "$ROOT/otherrepo/.git" >expected &&
        (
-               GIT_DIR="$TRASH_DIRECTORY/otherrepo/.git" &&
+               GIT_DIR="$ROOT/otherrepo/.git" &&
                export GIT_DIR &&
                cd subdir &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_find_repo_path - from command line while "git -C"' '
+       echo "$ROOT/.git" >expected &&
+       (
+               __git_dir="$ROOT/.git" &&
+               __git_C_args=(-C otherrepo) &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - non-existing $GIT_DIR' '
+test_expect_success '__git_find_repo_path - relative dir from command line and "git -C"' '
+       echo "$ROOT/otherrepo/.git" >expected &&
        (
-               GIT_DIR="$TRASH_DIRECTORY/non-existing" &&
+               cd subdir &&
+               __git_dir="otherrepo/.git" &&
+               __git_C_args=(-C ..) &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_find_repo_path - $GIT_DIR set while "git -C"' '
+       echo "$ROOT/.git" >expected &&
+       (
+               GIT_DIR="$ROOT/.git" &&
                export GIT_DIR &&
-               test_must_fail __gitdir
-       )
+               __git_C_args=(-C otherrepo) &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
 '
 
-function pwd_P_W () {
-       if test_have_prereq MINGW
-       then
-               pwd -W
-       else
-               pwd -P
-       fi
-}
+test_expect_success '__git_find_repo_path - relative dir in $GIT_DIR and "git -C"' '
+       echo "$ROOT/otherrepo/.git" >expected &&
+       (
+               cd subdir &&
+               GIT_DIR="otherrepo/.git" &&
+               export GIT_DIR &&
+               __git_C_args=(-C ..) &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
 
-test_expect_success '__gitdir - gitfile in cwd' '
-       echo "$(pwd_P_W)/otherrepo/.git" >expected &&
-       echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
+test_expect_success '__git_find_repo_path - "git -C" while .git directory in cwd' '
+       echo "$ROOT/otherrepo/.git" >expected &&
+       (
+               __git_C_args=(-C otherrepo) &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_find_repo_path - "git -C" while cwd is a .git directory' '
+       echo "$ROOT/otherrepo/.git" >expected &&
+       (
+               cd .git &&
+               __git_C_args=(-C .. -C otherrepo) &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_find_repo_path - "git -C" while .git directory in parent' '
+       echo "$ROOT/otherrepo/.git" >expected &&
+       (
+               cd subdir &&
+               __git_C_args=(-C .. -C otherrepo) &&
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_find_repo_path - non-existing path in "git -C"' '
+       (
+               __git_C_args=(-C non-existing) &&
+               test_must_fail __git_find_repo_path &&
+               printf "$__git_repo_path" >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_find_repo_path - non-existing path in $__git_dir' '
+       (
+               __git_dir="non-existing" &&
+               test_must_fail __git_find_repo_path &&
+               printf "$__git_repo_path" >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_find_repo_path - non-existing $GIT_DIR' '
+       (
+               GIT_DIR="$ROOT/non-existing" &&
+               export GIT_DIR &&
+               test_must_fail __git_find_repo_path &&
+               printf "$__git_repo_path" >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_find_repo_path - gitfile in cwd' '
+       echo "$ROOT/otherrepo/.git" >expected &&
+       echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
        test_when_finished "rm -f subdir/.git" &&
        (
                cd subdir &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - gitfile in parent' '
-       echo "$(pwd_P_W)/otherrepo/.git" >expected &&
-       echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
+test_expect_success '__git_find_repo_path - gitfile in parent' '
+       echo "$ROOT/otherrepo/.git" >expected &&
+       echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
        test_when_finished "rm -f subdir/.git" &&
        (
                cd subdir/subsubdir &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success SYMLINKS '__gitdir - resulting path avoids symlinks' '
-       echo "$(pwd -P)/otherrepo/.git" >expected &&
+test_expect_success SYMLINKS '__git_find_repo_path - resulting path avoids symlinks' '
+       echo "$ROOT/otherrepo/.git" >expected &&
        mkdir otherrepo/dir &&
        test_when_finished "rm -rf otherrepo/dir" &&
        ln -s otherrepo/dir link &&
        test_when_finished "rm -f link" &&
        (
                cd link &&
-               __gitdir >"$actual"
+               __git_find_repo_path &&
+               echo "$__git_repo_path" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
-test_expect_success '__gitdir - not a git repository' '
+test_expect_success '__git_find_repo_path - not a git repository' '
        (
-               cd subdir/subsubdir &&
-               GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
+               cd non-repo &&
+               GIT_CEILING_DIRECTORIES="$ROOT" &&
                export GIT_CEILING_DIRECTORIES &&
-               test_must_fail __gitdir
-       )
+               test_must_fail __git_find_repo_path &&
+               printf "$__git_repo_path" >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__gitdir - finds repo' '
+       echo "$ROOT/.git" >expected &&
+       (
+               cd subdir/subsubdir &&
+               __gitdir >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+
+test_expect_success '__gitdir - returns error when cant find repo' '
+       (
+               __git_dir="non-existing" &&
+               test_must_fail __gitdir >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__gitdir - repo as argument' '
+       echo "otherrepo/.git" >expected &&
+       (
+               __gitdir "otherrepo" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__gitdir - remote as argument' '
+       echo "remote" >expected &&
+       (
+               __gitdir "remote" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__gitcomp_direct - puts everything into COMPREPLY as-is' '
+       sed -e "s/Z$//g" >expected <<-EOF &&
+       with-trailing-space Z
+       without-trailing-spaceZ
+       --option Z
+       --option=Z
+       $invalid_variable_name Z
+       EOF
+       (
+               cur=should_be_ignored &&
+               __gitcomp_direct "$(cat expected)" &&
+               print_comp
+       ) &&
+       test_cmp expected out
 '
 
 test_expect_success '__gitcomp - trailing space - options' '
@@ -366,10 +517,657 @@ test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from
        git remote add remote_in_config_1 git://remote_1 &&
        test_when_finished "git remote remove remote_in_config_2" &&
        git remote add remote_in_config_2 git://remote_2 &&
-       __git_remotes >actual &&
+       (
+               __git_remotes >actual
+       ) &&
        test_cmp expect actual
 '
 
+test_expect_success '__git_is_configured_remote' '
+       test_when_finished "git remote remove remote_1" &&
+       git remote add remote_1 git://remote_1 &&
+       test_when_finished "git remote remove remote_2" &&
+       git remote add remote_2 git://remote_2 &&
+       (
+               verbose __git_is_configured_remote remote_2 &&
+               test_must_fail __git_is_configured_remote non-existent
+       )
+'
+
+test_expect_success 'setup for ref completion' '
+       git commit --allow-empty -m initial &&
+       git branch matching-branch &&
+       git tag matching-tag &&
+       (
+               cd otherrepo &&
+               git commit --allow-empty -m initial &&
+               git branch -m master master-in-other &&
+               git branch branch-in-other &&
+               git tag tag-in-other
+       ) &&
+       git remote add other "$ROOT/otherrepo/.git" &&
+       git fetch --no-tags other &&
+       rm -f .git/FETCH_HEAD &&
+       git init thirdrepo
+'
+
+test_expect_success '__git_refs - simple' '
+       cat >expected <<-EOF &&
+       HEAD
+       master
+       matching-branch
+       other/branch-in-other
+       other/master-in-other
+       matching-tag
+       EOF
+       (
+               cur= &&
+               __git_refs >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - full refs' '
+       cat >expected <<-EOF &&
+       refs/heads/master
+       refs/heads/matching-branch
+       refs/remotes/other/branch-in-other
+       refs/remotes/other/master-in-other
+       refs/tags/matching-tag
+       EOF
+       (
+               cur=refs/heads/ &&
+               __git_refs >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - repo given on the command line' '
+       cat >expected <<-EOF &&
+       HEAD
+       branch-in-other
+       master-in-other
+       tag-in-other
+       EOF
+       (
+               __git_dir="$ROOT/otherrepo/.git" &&
+               cur= &&
+               __git_refs >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - remote on local file system' '
+       cat >expected <<-EOF &&
+       HEAD
+       branch-in-other
+       master-in-other
+       tag-in-other
+       EOF
+       (
+               cur= &&
+               __git_refs otherrepo >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - remote on local file system - full refs' '
+       cat >expected <<-EOF &&
+       refs/heads/branch-in-other
+       refs/heads/master-in-other
+       refs/tags/tag-in-other
+       EOF
+       (
+               cur=refs/ &&
+               __git_refs otherrepo >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - configured remote' '
+       cat >expected <<-EOF &&
+       HEAD
+       branch-in-other
+       master-in-other
+       EOF
+       (
+               cur= &&
+               __git_refs other >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - configured remote - full refs' '
+       cat >expected <<-EOF &&
+       HEAD
+       refs/heads/branch-in-other
+       refs/heads/master-in-other
+       refs/tags/tag-in-other
+       EOF
+       (
+               cur=refs/ &&
+               __git_refs other >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - configured remote - repo given on the command line' '
+       cat >expected <<-EOF &&
+       HEAD
+       branch-in-other
+       master-in-other
+       EOF
+       (
+               cd thirdrepo &&
+               __git_dir="$ROOT/.git" &&
+               cur= &&
+               __git_refs other >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - configured remote - full refs - repo given on the command line' '
+       cat >expected <<-EOF &&
+       HEAD
+       refs/heads/branch-in-other
+       refs/heads/master-in-other
+       refs/tags/tag-in-other
+       EOF
+       (
+               cd thirdrepo &&
+               __git_dir="$ROOT/.git" &&
+               cur=refs/ &&
+               __git_refs other >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - configured remote - remote name matches a directory' '
+       cat >expected <<-EOF &&
+       HEAD
+       branch-in-other
+       master-in-other
+       EOF
+       mkdir other &&
+       test_when_finished "rm -rf other" &&
+       (
+               cur= &&
+               __git_refs other >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - URL remote' '
+       cat >expected <<-EOF &&
+       HEAD
+       branch-in-other
+       master-in-other
+       tag-in-other
+       EOF
+       (
+               cur= &&
+               __git_refs "file://$ROOT/otherrepo/.git" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - URL remote - full refs' '
+       cat >expected <<-EOF &&
+       HEAD
+       refs/heads/branch-in-other
+       refs/heads/master-in-other
+       refs/tags/tag-in-other
+       EOF
+       (
+               cur=refs/ &&
+               __git_refs "file://$ROOT/otherrepo/.git" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - non-existing remote' '
+       (
+               cur= &&
+               __git_refs non-existing >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - non-existing remote - full refs' '
+       (
+               cur=refs/ &&
+               __git_refs non-existing >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - non-existing URL remote' '
+       (
+               cur= &&
+               __git_refs "file://$ROOT/non-existing" >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - non-existing URL remote - full refs' '
+       (
+               cur=refs/ &&
+               __git_refs "file://$ROOT/non-existing" >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - not in a git repository' '
+       (
+               GIT_CEILING_DIRECTORIES="$ROOT" &&
+               export GIT_CEILING_DIRECTORIES &&
+               cd subdir &&
+               cur= &&
+               __git_refs >"$actual"
+       ) &&
+       test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - unique remote branches for git checkout DWIMery' '
+       cat >expected <<-EOF &&
+       HEAD
+       master
+       matching-branch
+       other/ambiguous
+       other/branch-in-other
+       other/master-in-other
+       remote/ambiguous
+       remote/branch-in-remote
+       matching-tag
+       branch-in-other
+       branch-in-remote
+       master-in-other
+       EOF
+       for remote_ref in refs/remotes/other/ambiguous \
+               refs/remotes/remote/ambiguous \
+               refs/remotes/remote/branch-in-remote
+       do
+               git update-ref $remote_ref master &&
+               test_when_finished "git update-ref -d $remote_ref"
+       done &&
+       (
+               cur= &&
+               __git_refs "" 1 >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - after --opt=' '
+       cat >expected <<-EOF &&
+       HEAD
+       master
+       matching-branch
+       other/branch-in-other
+       other/master-in-other
+       matching-tag
+       EOF
+       (
+               cur="--opt=" &&
+               __git_refs "" "" "" "" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - after --opt= - full refs' '
+       cat >expected <<-EOF &&
+       refs/heads/master
+       refs/heads/matching-branch
+       refs/remotes/other/branch-in-other
+       refs/remotes/other/master-in-other
+       refs/tags/matching-tag
+       EOF
+       (
+               cur="--opt=refs/" &&
+               __git_refs "" "" "" refs/ >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git refs - exluding refs' '
+       cat >expected <<-EOF &&
+       ^HEAD
+       ^master
+       ^matching-branch
+       ^other/branch-in-other
+       ^other/master-in-other
+       ^matching-tag
+       EOF
+       (
+               cur=^ &&
+               __git_refs >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git refs - exluding full refs' '
+       cat >expected <<-EOF &&
+       ^refs/heads/master
+       ^refs/heads/matching-branch
+       ^refs/remotes/other/branch-in-other
+       ^refs/remotes/other/master-in-other
+       ^refs/tags/matching-tag
+       EOF
+       (
+               cur=^refs/ &&
+               __git_refs >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success 'setup for filtering matching refs' '
+       git branch matching/branch &&
+       git tag matching/tag &&
+       git -C otherrepo branch matching/branch-in-other &&
+       git fetch --no-tags other &&
+       rm -f .git/FETCH_HEAD
+'
+
+test_expect_success '__git_refs - dont filter refs unless told so' '
+       cat >expected <<-EOF &&
+       HEAD
+       master
+       matching-branch
+       matching/branch
+       other/branch-in-other
+       other/master-in-other
+       other/matching/branch-in-other
+       matching-tag
+       matching/tag
+       EOF
+       (
+               cur=master &&
+               __git_refs >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - only matching refs' '
+       cat >expected <<-EOF &&
+       matching-branch
+       matching/branch
+       matching-tag
+       matching/tag
+       EOF
+       (
+               cur=mat &&
+               __git_refs "" "" "" "$cur" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - only matching refs - full refs' '
+       cat >expected <<-EOF &&
+       refs/heads/matching-branch
+       refs/heads/matching/branch
+       EOF
+       (
+               cur=refs/heads/mat &&
+               __git_refs "" "" "" "$cur" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - only matching refs - remote on local file system' '
+       cat >expected <<-EOF &&
+       master-in-other
+       matching/branch-in-other
+       EOF
+       (
+               cur=ma &&
+               __git_refs otherrepo "" "" "$cur" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - only matching refs - configured remote' '
+       cat >expected <<-EOF &&
+       master-in-other
+       matching/branch-in-other
+       EOF
+       (
+               cur=ma &&
+               __git_refs other "" "" "$cur" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - only matching refs - remote - full refs' '
+       cat >expected <<-EOF &&
+       refs/heads/master-in-other
+       refs/heads/matching/branch-in-other
+       EOF
+       (
+               cur=refs/heads/ma &&
+               __git_refs other "" "" "$cur" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - only matching refs - checkout DWIMery' '
+       cat >expected <<-EOF &&
+       matching-branch
+       matching/branch
+       matching-tag
+       matching/tag
+       matching/branch-in-other
+       EOF
+       for remote_ref in refs/remotes/other/ambiguous \
+               refs/remotes/remote/ambiguous \
+               refs/remotes/remote/branch-in-remote
+       do
+               git update-ref $remote_ref master &&
+               test_when_finished "git update-ref -d $remote_ref"
+       done &&
+       (
+               cur=mat &&
+               __git_refs "" 1 "" "$cur" >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success 'teardown after filtering matching refs' '
+       git branch -d matching/branch &&
+       git tag -d matching/tag &&
+       git update-ref -d refs/remotes/other/matching/branch-in-other &&
+       git -C otherrepo branch -D matching/branch-in-other
+'
+
+test_expect_success '__git_refs - for-each-ref format specifiers in prefix' '
+       cat >expected <<-EOF &&
+       evil-%%-%42-%(refname)..master
+       EOF
+       (
+               cur="evil-%%-%42-%(refname)..mas" &&
+               __git_refs "" "" "evil-%%-%42-%(refname).." mas >"$actual"
+       ) &&
+       test_cmp expected "$actual"
+'
+
+test_expect_success '__git_complete_refs - simple' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       HEAD Z
+       master Z
+       matching-branch Z
+       other/branch-in-other Z
+       other/master-in-other Z
+       matching-tag Z
+       EOF
+       (
+               cur= &&
+               __git_complete_refs &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_refs - matching' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       matching-branch Z
+       matching-tag Z
+       EOF
+       (
+               cur=mat &&
+               __git_complete_refs &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_refs - remote' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       HEAD Z
+       branch-in-other Z
+       master-in-other Z
+       EOF
+       (
+               cur=
+               __git_complete_refs --remote=other &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_refs - track' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       HEAD Z
+       master Z
+       matching-branch Z
+       other/branch-in-other Z
+       other/master-in-other Z
+       matching-tag Z
+       branch-in-other Z
+       master-in-other Z
+       EOF
+       (
+               cur=
+               __git_complete_refs --track &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_refs - current word' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       matching-branch Z
+       matching-tag Z
+       EOF
+       (
+               cur="--option=mat" &&
+               __git_complete_refs --cur="${cur#*=}" &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_refs - prefix' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       v1.0..matching-branch Z
+       v1.0..matching-tag Z
+       EOF
+       (
+               cur=v1.0..mat &&
+               __git_complete_refs --pfx=v1.0.. --cur=mat &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_refs - suffix' '
+       cat >expected <<-EOF &&
+       HEAD.
+       master.
+       matching-branch.
+       other/branch-in-other.
+       other/master-in-other.
+       matching-tag.
+       EOF
+       (
+               cur= &&
+               __git_complete_refs --sfx=. &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_fetch_refspecs - simple' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       HEAD:HEAD Z
+       branch-in-other:branch-in-other Z
+       master-in-other:master-in-other Z
+       EOF
+       (
+               cur= &&
+               __git_complete_fetch_refspecs other &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_fetch_refspecs - matching' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       branch-in-other:branch-in-other Z
+       EOF
+       (
+               cur=br &&
+               __git_complete_fetch_refspecs other "" br &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_fetch_refspecs - prefix' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       +HEAD:HEAD Z
+       +branch-in-other:branch-in-other Z
+       +master-in-other:master-in-other Z
+       EOF
+       (
+               cur="+" &&
+               __git_complete_fetch_refspecs other "+" ""  &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_fetch_refspecs - fully qualified' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       refs/heads/branch-in-other:refs/heads/branch-in-other Z
+       refs/heads/master-in-other:refs/heads/master-in-other Z
+       refs/tags/tag-in-other:refs/tags/tag-in-other Z
+       EOF
+       (
+               cur=refs/ &&
+               __git_complete_fetch_refspecs other "" refs/ &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '
+       sed -e "s/Z$//" >expected <<-EOF &&
+       +refs/heads/branch-in-other:refs/heads/branch-in-other Z
+       +refs/heads/master-in-other:refs/heads/master-in-other Z
+       +refs/tags/tag-in-other:refs/tags/tag-in-other Z
+       EOF
+       (
+               cur=+refs/ &&
+               __git_complete_fetch_refspecs other + refs/ &&
+               print_comp
+       ) &&
+       test_cmp expected out
+'
+
+test_expect_success 'teardown after ref completion' '
+       git branch -d matching-branch &&
+       git tag -d matching-tag &&
+       git remote remove other
+'
+
 test_expect_success '__git_get_config_variables' '
        cat >expect <<-EOF &&
        name-1
@@ -480,7 +1278,12 @@ test_expect_success 'general options plus command' '
        test_completion "git --namespace=foo check" "checkout " &&
        test_completion "git --paginate check" "checkout " &&
        test_completion "git --info-path check" "checkout " &&
-       test_completion "git --no-replace-objects check" "checkout "
+       test_completion "git --no-replace-objects check" "checkout " &&
+       test_completion "git --git-dir some/path check" "checkout " &&
+       test_completion "git -c conf.var=value check" "checkout " &&
+       test_completion "git -C some/path check" "checkout " &&
+       test_completion "git --work-tree some/path check" "checkout " &&
+       test_completion "git --namespace name/space check" "checkout "
 '
 
 test_expect_success 'git --help completion' '
@@ -488,10 +1291,10 @@ test_expect_success 'git --help completion' '
        test_completion "git --help core" "core-tutorial "
 '
 
-test_expect_success 'setup for ref completion' '
+test_expect_success 'setup for integration tests' '
        echo content >file1 &&
        echo more >file2 &&
-       git add . &&
+       git add file1 file2 &&
        git commit -m one &&
        git branch mybranch &&
        git tag mytag
@@ -505,6 +1308,12 @@ test_expect_success 'checkout completes ref names' '
        EOF
 '
 
+test_expect_success 'git -C <path> checkout uses the right repo' '
+       test_completion "git -C subdir -C subsubdir -C .. -C ../otherrepo checkout b" <<-\EOF
+       branch-in-other Z
+       EOF
+'
+
 test_expect_success 'show completes all refs' '
        test_completion "git show m" <<-\EOF
        master Z
@@ -522,7 +1331,7 @@ test_expect_success '<ref>: completes paths' '
 
 test_expect_success 'complete tree filename with spaces' '
        echo content >"name with spaces" &&
-       git add . &&
+       git add "name with spaces" &&
        git commit -m spaces &&
        test_completion "git show HEAD:nam" <<-\EOF
        name with spaces Z
@@ -531,7 +1340,7 @@ test_expect_success 'complete tree filename with spaces' '
 
 test_expect_success 'complete tree filename with metacharacters' '
        echo content >"name with \${meta}" &&
-       git add . &&
+       git add "name with \${meta}" &&
        git commit -m meta &&
        test_completion "git show HEAD:nam" <<-\EOF
        name with ${meta} Z
@@ -648,4 +1457,38 @@ test_expect_failure 'complete with tilde expansion' '
        test_completion "git add ~/tmp/" "~/tmp/file"
 '
 
+test_expect_success 'setup other remote for remote reference completion' '
+       git remote add other otherrepo &&
+       git fetch other
+'
+
+for flag in -d --delete
+do
+       test_expect_success "__git_complete_remote_or_refspec - push $flag other" '
+               sed -e "s/Z$//" >expected <<-EOF &&
+               master-in-other Z
+               EOF
+               (
+                       words=(git push '$flag' other ma) &&
+                       cword=${#words[@]} cur=${words[cword-1]} &&
+                       __git_complete_remote_or_refspec &&
+                       print_comp
+               ) &&
+               test_cmp expected out
+       '
+
+       test_expect_failure "__git_complete_remote_or_refspec - push other $flag" '
+               sed -e "s/Z$//" >expected <<-EOF &&
+               master-in-other Z
+               EOF
+               (
+                       words=(git push other '$flag' ma) &&
+                       cword=${#words[@]} cur=${words[cword-1]} &&
+                       __git_complete_remote_or_refspec &&
+                       print_comp
+               ) &&
+               test_cmp expected out
+       '
+done
+
 test_done
index 4f7eadb5963e7d698f9ee6e265b1657e543cdb44..5ee124332a713b1dec984090401b08efb2b9cfe9 100644 (file)
@@ -81,6 +81,10 @@ test_decode_color () {
        '
 }
 
+lf_to_nul () {
+       perl -pe 'y/\012/\000/'
+}
+
 nul_to_q () {
        perl -pe 'y/\000/Q/'
 }
@@ -132,17 +136,12 @@ test_tick () {
        export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
 }
 
-# Stop execution and start a shell. This is useful for debugging tests and
-# only makes sense together with "-v".
+# Stop execution and start a shell. This is useful for debugging tests.
 #
 # Be sure to remove all invocations of this command before submitting.
 
 test_pause () {
-       if test "$verbose" = t; then
-               "$SHELL_PATH" <&6 >&3 2>&4
-       else
-               error >&5 "test_pause requires --verbose"
-       fi
+       "$SHELL_PATH" <&6 >&5 2>&7
 }
 
 # Wrap git in gdb. Adding this to a command can make it easier to
@@ -150,19 +149,24 @@ test_pause () {
 #
 # Example: "debug git checkout master".
 debug () {
-        GIT_TEST_GDB=1 "$@"
+        GIT_TEST_GDB=1 "$@" <&6 >&5 2>&7
 }
 
-# Call test_commit with the arguments "<message> [<file> [<contents> [<tag>]]]"
+# Call test_commit with the arguments
+# [-C <directory>] <message> [<file> [<contents> [<tag>]]]"
 #
 # This will commit a file with the given contents and the given commit
 # message, and tag the resulting commit with the given tag name.
 #
 # <file>, <contents>, and <tag> all default to <message>.
+#
+# If the first argument is "-C", the second argument is used as a path for
+# the git invocations.
 
 test_commit () {
        notick= &&
        signoff= &&
+       indir= &&
        while test $# != 0
        do
                case "$1" in
@@ -172,21 +176,26 @@ test_commit () {
                --signoff)
                        signoff="$1"
                        ;;
+               -C)
+                       indir="$2"
+                       shift
+                       ;;
                *)
                        break
                        ;;
                esac
                shift
        done &&
+       indir=${indir:+"$indir"/} &&
        file=${2:-"$1.t"} &&
-       echo "${3-$1}" > "$file" &&
-       git add "$file" &&
+       echo "${3-$1}" > "$indir$file" &&
+       git ${indir:+ -C "$indir"} add "$file" &&
        if test -z "$notick"
        then
                test_tick
        fi &&
-       git commit $signoff -m "$1" &&
-       git tag "${4:-$1}"
+       git ${indir:+ -C "$indir"} commit $signoff -m "$1" &&
+       git ${indir:+ -C "$indir"} tag "${4:-$1}"
 }
 
 # Call test_merge with the arguments "<message> <commit>", where <commit>
@@ -990,3 +999,17 @@ test_copy_bytes () {
                }
        ' - "$1"
 }
+
+# run "$@" inside a non-git directory
+nongit () {
+       test -d non-repo ||
+       mkdir non-repo ||
+       return 1
+
+       (
+               GIT_CEILING_DIRECTORIES=$(pwd) &&
+               export GIT_CEILING_DIRECTORIES &&
+               cd non-repo &&
+               "$@"
+       )
+}
index b021329e03eeef257afb8fb36a40644e000079b5..30eb7437198dddbb2d251e9ec91590754b1eddcf 100644 (file)
@@ -342,6 +342,7 @@ fi
 
 exec 5>&1
 exec 6<&0
+exec 7>&2
 if test "$verbose_log" = "t"
 then
        exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3
@@ -624,9 +625,9 @@ test_run_ () {
                trace=
                # 117 is magic because it is unlikely to match the exit
                # code of other programs
-               test_eval_ "(exit 117) && $1"
-               if test "$?" != 117; then
-                       error "bug in the test script: broken &&-chain: $1"
+               if test "OK-117" != "$(test_eval_ "(exit 117) && $1${LF}${LF}echo OK-\$?" 3>&1)"
+               then
+                       error "bug in the test script: broken &&-chain or run-away HERE-DOC: $1"
                fi
                trace=$trace_tmp
        fi
@@ -744,20 +745,25 @@ test_done () {
        fi
        case "$test_failure" in
        0)
-               # Maybe print SKIP message
-               if test -n "$skip_all" && test $test_count -gt 0
-               then
-                       error "Can't use skip_all after running some tests"
-               fi
-               test -z "$skip_all" || skip_all=" # SKIP $skip_all"
-
                if test $test_external_has_tap -eq 0
                then
                        if test $test_remaining -gt 0
                        then
                                say_color pass "# passed all $msg"
                        fi
-                       say "1..$test_count$skip_all"
+
+                       # Maybe print SKIP message
+                       test -z "$skip_all" || skip_all="# SKIP $skip_all"
+                       case "$test_count" in
+                       0)
+                               say "1..$test_count${skip_all:+ $skip_all}"
+                               ;;
+                       *)
+                               test -z "$skip_all" ||
+                               say_color warn "$skip_all"
+                               say "1..$test_count"
+                               ;;
+                       esac
                fi
 
                test -d "$remove_trash" &&
@@ -966,7 +972,8 @@ yes () {
 }
 
 # Fix some commands on Windows
-case $(uname -s) in
+uname_s=$(uname -s)
+case $uname_s in
 *MINGW*)
        # Windows has its own (incompatible) sort and find
        sort () {
@@ -1106,6 +1113,10 @@ test_lazy_prereq NOT_ROOT '
        test "$uid" != 0
 '
 
+test_lazy_prereq JGIT '
+       type jgit
+'
+
 # SANITY is about "can you correctly predict what the filesystem would
 # do by only looking at the permission bits of the files and
 # directories?"  A typical example of !SANITY is running the test
@@ -1137,6 +1148,7 @@ test_lazy_prereq SANITY '
        return $status
 '
 
+test FreeBSD != $uname_s || GIT_UNZIP=${GIT_UNZIP:-/usr/local/bin/unzip}
 GIT_UNZIP=${GIT_UNZIP:-unzip}
 test_lazy_prereq UNZIP '
        "$GIT_UNZIP" -v
diff --git a/tag.c b/tag.c
index d1dcd18cd7b53e21fa15bab9baad05cf16a3b9de..243d1fdbbcb1424b0082e1c999920f6a50b32d68 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -3,6 +3,7 @@
 #include "commit.h"
 #include "tree.h"
 #include "blob.h"
+#include "gpg-interface.h"
 
 const char *tag_type = "tag";
 
@@ -24,7 +25,9 @@ static int run_gpg_verify(const char *buf, unsigned long size, unsigned flags)
 
        ret = check_signature(buf, payload_size, buf + payload_size,
                                size - payload_size, &sigc);
-       print_signature_buffer(&sigc, flags);
+
+       if (!(flags & GPG_VERIFY_OMIT_STATUS))
+               print_signature_buffer(&sigc, flags);
 
        signature_check_clear(&sigc);
        return ret;
index 2990c92424832d288d5bbab2dfe79b5db361e0b0..68437106703470f39a6079aaad7d3bb407ac3389 100644 (file)
@@ -247,12 +247,13 @@ int close_tempfile(struct tempfile *tempfile)
        tempfile->fd = -1;
        if (fp) {
                tempfile->fp = NULL;
-
-               /*
-                * Note: no short-circuiting here; we want to fclose()
-                * in any case!
-                */
-               err = ferror(fp) | fclose(fp);
+               if (ferror(fp)) {
+                       err = -1;
+                       if (!fclose(fp))
+                               errno = EIO;
+               } else {
+                       err = fclose(fp);
+               }
        } else {
                err = close(fd);
        }
diff --git a/tmp-objdir.c b/tmp-objdir.c
new file mode 100644 (file)
index 0000000..b2d9280
--- /dev/null
@@ -0,0 +1,291 @@
+#include "cache.h"
+#include "tmp-objdir.h"
+#include "dir.h"
+#include "sigchain.h"
+#include "string-list.h"
+#include "strbuf.h"
+#include "argv-array.h"
+#include "quote.h"
+
+struct tmp_objdir {
+       struct strbuf path;
+       struct argv_array env;
+};
+
+/*
+ * Allow only one tmp_objdir at a time in a running process, which simplifies
+ * our signal/atexit cleanup routines.  It's doubtful callers will ever need
+ * more than one, and we can expand later if so.  You can have many such
+ * tmp_objdirs simultaneously in many processes, of course.
+ */
+static struct tmp_objdir *the_tmp_objdir;
+
+static void tmp_objdir_free(struct tmp_objdir *t)
+{
+       strbuf_release(&t->path);
+       argv_array_clear(&t->env);
+       free(t);
+}
+
+static int tmp_objdir_destroy_1(struct tmp_objdir *t, int on_signal)
+{
+       int err;
+
+       if (!t)
+               return 0;
+
+       if (t == the_tmp_objdir)
+               the_tmp_objdir = NULL;
+
+       /*
+        * This may use malloc via strbuf_grow(), but we should
+        * have pre-grown t->path sufficiently so that this
+        * doesn't happen in practice.
+        */
+       err = remove_dir_recursively(&t->path, 0);
+
+       /*
+        * When we are cleaning up due to a signal, we won't bother
+        * freeing memory; it may cause a deadlock if the signal
+        * arrived while libc's allocator lock is held.
+        */
+       if (!on_signal)
+               tmp_objdir_free(t);
+       return err;
+}
+
+int tmp_objdir_destroy(struct tmp_objdir *t)
+{
+       return tmp_objdir_destroy_1(t, 0);
+}
+
+static void remove_tmp_objdir(void)
+{
+       tmp_objdir_destroy(the_tmp_objdir);
+}
+
+static void remove_tmp_objdir_on_signal(int signo)
+{
+       tmp_objdir_destroy_1(the_tmp_objdir, 1);
+       sigchain_pop(signo);
+       raise(signo);
+}
+
+/*
+ * These env_* functions are for setting up the child environment; the
+ * "replace" variant overrides the value of any existing variable with that
+ * "key". The "append" variant puts our new value at the end of a list,
+ * separated by PATH_SEP (which is what separate values in
+ * GIT_ALTERNATE_OBJECT_DIRECTORIES).
+ */
+static void env_append(struct argv_array *env, const char *key, const char *val)
+{
+       struct strbuf quoted = STRBUF_INIT;
+       const char *old;
+
+       /*
+        * Avoid quoting if it's not necessary, for maximum compatibility
+        * with older parsers which don't understand the quoting.
+        */
+       if (*val == '"' || strchr(val, PATH_SEP)) {
+               strbuf_addch(&quoted, '"');
+               quote_c_style(val, &quoted, NULL, 1);
+               strbuf_addch(&quoted, '"');
+               val = quoted.buf;
+       }
+
+       old = getenv(key);
+       if (!old)
+               argv_array_pushf(env, "%s=%s", key, val);
+       else
+               argv_array_pushf(env, "%s=%s%c%s", key, old, PATH_SEP, val);
+
+       strbuf_release(&quoted);
+}
+
+static void env_replace(struct argv_array *env, const char *key, const char *val)
+{
+       argv_array_pushf(env, "%s=%s", key, val);
+}
+
+static int setup_tmp_objdir(const char *root)
+{
+       char *path;
+       int ret = 0;
+
+       path = xstrfmt("%s/pack", root);
+       ret = mkdir(path, 0777);
+       free(path);
+
+       return ret;
+}
+
+struct tmp_objdir *tmp_objdir_create(void)
+{
+       static int installed_handlers;
+       struct tmp_objdir *t;
+
+       if (the_tmp_objdir)
+               die("BUG: only one tmp_objdir can be used at a time");
+
+       t = xmalloc(sizeof(*t));
+       strbuf_init(&t->path, 0);
+       argv_array_init(&t->env);
+
+       strbuf_addf(&t->path, "%s/incoming-XXXXXX", get_object_directory());
+
+       /*
+        * Grow the strbuf beyond any filename we expect to be placed in it.
+        * If tmp_objdir_destroy() is called by a signal handler, then
+        * we should be able to use the strbuf to remove files without
+        * having to call malloc.
+        */
+       strbuf_grow(&t->path, 1024);
+
+       if (!mkdtemp(t->path.buf)) {
+               /* free, not destroy, as we never touched the filesystem */
+               tmp_objdir_free(t);
+               return NULL;
+       }
+
+       the_tmp_objdir = t;
+       if (!installed_handlers) {
+               atexit(remove_tmp_objdir);
+               sigchain_push_common(remove_tmp_objdir_on_signal);
+               installed_handlers++;
+       }
+
+       if (setup_tmp_objdir(t->path.buf)) {
+               tmp_objdir_destroy(t);
+               return NULL;
+       }
+
+       env_append(&t->env, ALTERNATE_DB_ENVIRONMENT,
+                  absolute_path(get_object_directory()));
+       env_replace(&t->env, DB_ENVIRONMENT, absolute_path(t->path.buf));
+       env_replace(&t->env, GIT_QUARANTINE_ENVIRONMENT,
+                   absolute_path(t->path.buf));
+
+       return t;
+}
+
+/*
+ * Make sure we copy packfiles and their associated metafiles in the correct
+ * order. All of these ends_with checks are slightly expensive to do in
+ * the midst of a sorting routine, but in practice it shouldn't matter.
+ * We will have a relatively small number of packfiles to order, and loose
+ * objects exit early in the first line.
+ */
+static int pack_copy_priority(const char *name)
+{
+       if (!starts_with(name, "pack"))
+               return 0;
+       if (ends_with(name, ".keep"))
+               return 1;
+       if (ends_with(name, ".pack"))
+               return 2;
+       if (ends_with(name, ".idx"))
+               return 3;
+       return 4;
+}
+
+static int pack_copy_cmp(const char *a, const char *b)
+{
+       return pack_copy_priority(a) - pack_copy_priority(b);
+}
+
+static int read_dir_paths(struct string_list *out, const char *path)
+{
+       DIR *dh;
+       struct dirent *de;
+
+       dh = opendir(path);
+       if (!dh)
+               return -1;
+
+       while ((de = readdir(dh)))
+               if (de->d_name[0] != '.')
+                       string_list_append(out, de->d_name);
+
+       closedir(dh);
+       return 0;
+}
+
+static int migrate_paths(struct strbuf *src, struct strbuf *dst);
+
+static int migrate_one(struct strbuf *src, struct strbuf *dst)
+{
+       struct stat st;
+
+       if (stat(src->buf, &st) < 0)
+               return -1;
+       if (S_ISDIR(st.st_mode)) {
+               if (!mkdir(dst->buf, 0777)) {
+                       if (adjust_shared_perm(dst->buf))
+                               return -1;
+               } else if (errno != EEXIST)
+                       return -1;
+               return migrate_paths(src, dst);
+       }
+       return finalize_object_file(src->buf, dst->buf);
+}
+
+static int migrate_paths(struct strbuf *src, struct strbuf *dst)
+{
+       size_t src_len = src->len, dst_len = dst->len;
+       struct string_list paths = STRING_LIST_INIT_DUP;
+       int i;
+       int ret = 0;
+
+       if (read_dir_paths(&paths, src->buf) < 0)
+               return -1;
+       paths.cmp = pack_copy_cmp;
+       string_list_sort(&paths);
+
+       for (i = 0; i < paths.nr; i++) {
+               const char *name = paths.items[i].string;
+
+               strbuf_addf(src, "/%s", name);
+               strbuf_addf(dst, "/%s", name);
+
+               ret |= migrate_one(src, dst);
+
+               strbuf_setlen(src, src_len);
+               strbuf_setlen(dst, dst_len);
+       }
+
+       string_list_clear(&paths, 0);
+       return ret;
+}
+
+int tmp_objdir_migrate(struct tmp_objdir *t)
+{
+       struct strbuf src = STRBUF_INIT, dst = STRBUF_INIT;
+       int ret;
+
+       if (!t)
+               return 0;
+
+       strbuf_addbuf(&src, &t->path);
+       strbuf_addstr(&dst, get_object_directory());
+
+       ret = migrate_paths(&src, &dst);
+
+       strbuf_release(&src);
+       strbuf_release(&dst);
+
+       tmp_objdir_destroy(t);
+       return ret;
+}
+
+const char **tmp_objdir_env(const struct tmp_objdir *t)
+{
+       if (!t)
+               return NULL;
+       return t->env.argv;
+}
+
+void tmp_objdir_add_as_alternate(const struct tmp_objdir *t)
+{
+       add_to_alternates_memory(t->path.buf);
+}
diff --git a/tmp-objdir.h b/tmp-objdir.h
new file mode 100644 (file)
index 0000000..b1e45b4
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef TMP_OBJDIR_H
+#define TMP_OBJDIR_H
+
+/*
+ * This API allows you to create a temporary object directory, advertise it to
+ * sub-processes via GIT_OBJECT_DIRECTORY and GIT_ALTERNATE_OBJECT_DIRECTORIES,
+ * and then either migrate its object into the main object directory, or remove
+ * it. The library handles unexpected signal/exit death by cleaning up the
+ * temporary directory.
+ *
+ * Example:
+ *
+ *     struct tmp_objdir *t = tmp_objdir_create();
+ *     if (!run_command_v_opt_cd_env(cmd, 0, NULL, tmp_objdir_env(t)) &&
+ *         !tmp_objdir_migrate(t))
+ *             printf("success!\n");
+ *     else
+ *             die("failed...tmp_objdir will clean up for us");
+ *
+ */
+
+struct tmp_objdir;
+
+/*
+ * Create a new temporary object directory; returns NULL on failure.
+ */
+struct tmp_objdir *tmp_objdir_create(void);
+
+/*
+ * Return a list of environment strings, suitable for use with
+ * child_process.env, that can be passed to child programs to make use of the
+ * temporary object directory.
+ */
+const char **tmp_objdir_env(const struct tmp_objdir *);
+
+/*
+ * Finalize a temporary object directory by migrating its objects into the main
+ * object database, removing the temporary directory, and freeing any
+ * associated resources.
+ */
+int tmp_objdir_migrate(struct tmp_objdir *);
+
+/*
+ * Destroy a temporary object directory, discarding any objects it contains.
+ */
+int tmp_objdir_destroy(struct tmp_objdir *);
+
+/*
+ * Add the temporary object directory as an alternate object store in the
+ * current process.
+ */
+void tmp_objdir_add_as_alternate(const struct tmp_objdir *);
+
+#endif /* TMP_OBJDIR_H */
index aecaf9232a92fcab4996037fc779e0165750fb36..11f0b9fb40bcedbfcd3111fa8076ce0d9e1eb20f 100644 (file)
--- a/trailer.c
+++ b/trailer.c
@@ -4,6 +4,7 @@
 #include "commit.h"
 #include "tempfile.h"
 #include "trailer.h"
+#include "list.h"
 /*
  * Copyright (c) 2013, 2014 Christian Couder <chriscool@tuxfamily.org>
  */
@@ -25,19 +26,42 @@ struct conf_info {
 static struct conf_info default_conf_info;
 
 struct trailer_item {
-       struct trailer_item *previous;
-       struct trailer_item *next;
-       const char *token;
-       const char *value;
+       struct list_head list;
+       /*
+        * If this is not a trailer line, the line is stored in value
+        * (excluding the terminating newline) and token is NULL.
+        */
+       char *token;
+       char *value;
+};
+
+struct arg_item {
+       struct list_head list;
+       char *token;
+       char *value;
        struct conf_info conf;
 };
 
-static struct trailer_item *first_conf_item;
+static LIST_HEAD(conf_head);
 
 static char *separators = ":";
 
+static int configured;
+
 #define TRAILER_ARG_STRING "$ARG"
 
+static const char *git_generated_prefixes[] = {
+       "Signed-off-by: ",
+       "(cherry picked from commit ",
+       NULL
+};
+
+/* Iterate over the elements of the list. */
+#define list_for_each_dir(pos, head, is_reverse) \
+       for (pos = is_reverse ? (head)->prev : (head)->next; \
+               pos != (head); \
+               pos = is_reverse ? pos->prev : pos->next)
+
 static int after_or_end(enum action_where where)
 {
        return (where == WHERE_AFTER) || (where == WHERE_END);
@@ -56,31 +80,36 @@ static size_t token_len_without_separator(const char *token, size_t len)
        return len;
 }
 
-static int same_token(struct trailer_item *a, struct trailer_item *b)
+static int same_token(struct trailer_item *a, struct arg_item *b)
 {
-       size_t a_len = token_len_without_separator(a->token, strlen(a->token));
-       size_t b_len = token_len_without_separator(b->token, strlen(b->token));
-       size_t min_len = (a_len > b_len) ? b_len : a_len;
+       size_t a_len, b_len, min_len;
+
+       if (!a->token)
+               return 0;
+
+       a_len = token_len_without_separator(a->token, strlen(a->token));
+       b_len = token_len_without_separator(b->token, strlen(b->token));
+       min_len = (a_len > b_len) ? b_len : a_len;
 
        return !strncasecmp(a->token, b->token, min_len);
 }
 
-static int same_value(struct trailer_item *a, struct trailer_item *b)
+static int same_value(struct trailer_item *a, struct arg_item *b)
 {
        return !strcasecmp(a->value, b->value);
 }
 
-static int same_trailer(struct trailer_item *a, struct trailer_item *b)
+static int same_trailer(struct trailer_item *a, struct arg_item *b)
 {
        return same_token(a, b) && same_value(a, b);
 }
 
-static inline int contains_only_spaces(const char *str)
+static inline int is_blank_line(const char *str)
 {
        const char *s = str;
-       while (*s && isspace(*s))
+       while (*s && *s != '\n' && isspace(*s))
                s++;
-       return !*s;
+       return !*s || *s == '\n';
 }
 
 static inline void strbuf_replace(struct strbuf *sb, const char *a, const char *b)
@@ -91,12 +120,19 @@ static inline void strbuf_replace(struct strbuf *sb, const char *a, const char *
 }
 
 static void free_trailer_item(struct trailer_item *item)
+{
+       free(item->token);
+       free(item->value);
+       free(item);
+}
+
+static void free_arg_item(struct arg_item *item)
 {
        free(item->conf.name);
        free(item->conf.key);
        free(item->conf.command);
-       free((char *)item->token);
-       free((char *)item->value);
+       free(item->token);
+       free(item->value);
        free(item);
 }
 
@@ -111,7 +147,14 @@ static char last_non_space_char(const char *s)
 
 static void print_tok_val(FILE *outfile, const char *tok, const char *val)
 {
-       char c = last_non_space_char(tok);
+       char c;
+
+       if (!tok) {
+               fprintf(outfile, "%s\n", val);
+               return;
+       }
+
+       c = last_non_space_char(tok);
        if (!c)
                return;
        if (strchr(separators, c))
@@ -120,108 +163,68 @@ static void print_tok_val(FILE *outfile, const char *tok, const char *val)
                fprintf(outfile, "%s%c %s\n", tok, separators[0], val);
 }
 
-static void print_all(FILE *outfile, struct trailer_item *first, int trim_empty)
+static void print_all(FILE *outfile, struct list_head *head, int trim_empty)
 {
+       struct list_head *pos;
        struct trailer_item *item;
-       for (item = first; item; item = item->next) {
+       list_for_each(pos, head) {
+               item = list_entry(pos, struct trailer_item, list);
                if (!trim_empty || strlen(item->value) > 0)
                        print_tok_val(outfile, item->token, item->value);
        }
 }
 
-static void update_last(struct trailer_item **last)
-{
-       if (*last)
-               while ((*last)->next != NULL)
-                       *last = (*last)->next;
-}
-
-static void update_first(struct trailer_item **first)
+static struct trailer_item *trailer_from_arg(struct arg_item *arg_tok)
 {
-       if (*first)
-               while ((*first)->previous != NULL)
-                       *first = (*first)->previous;
+       struct trailer_item *new = xcalloc(sizeof(*new), 1);
+       new->token = arg_tok->token;
+       new->value = arg_tok->value;
+       arg_tok->token = arg_tok->value = NULL;
+       free_arg_item(arg_tok);
+       return new;
 }
 
 static void add_arg_to_input_list(struct trailer_item *on_tok,
-                                 struct trailer_item *arg_tok,
-                                 struct trailer_item **first,
-                                 struct trailer_item **last)
-{
-       if (after_or_end(arg_tok->conf.where)) {
-               arg_tok->next = on_tok->next;
-               on_tok->next = arg_tok;
-               arg_tok->previous = on_tok;
-               if (arg_tok->next)
-                       arg_tok->next->previous = arg_tok;
-               update_last(last);
-       } else {
-               arg_tok->previous = on_tok->previous;
-               on_tok->previous = arg_tok;
-               arg_tok->next = on_tok;
-               if (arg_tok->previous)
-                       arg_tok->previous->next = arg_tok;
-               update_first(first);
-       }
+                                 struct arg_item *arg_tok)
+{
+       int aoe = after_or_end(arg_tok->conf.where);
+       struct trailer_item *to_add = trailer_from_arg(arg_tok);
+       if (aoe)
+               list_add(&to_add->list, &on_tok->list);
+       else
+               list_add_tail(&to_add->list, &on_tok->list);
 }
 
 static int check_if_different(struct trailer_item *in_tok,
-                             struct trailer_item *arg_tok,
-                             int check_all)
+                             struct arg_item *arg_tok,
+                             int check_all,
+                             struct list_head *head)
 {
        enum action_where where = arg_tok->conf.where;
+       struct list_head *next_head;
        do {
-               if (!in_tok)
-                       return 1;
                if (same_trailer(in_tok, arg_tok))
                        return 0;
                /*
                 * if we want to add a trailer after another one,
                 * we have to check those before this one
                 */
-               in_tok = after_or_end(where) ? in_tok->previous : in_tok->next;
+               next_head = after_or_end(where) ? in_tok->list.prev
+                                               : in_tok->list.next;
+               if (next_head == head)
+                       break;
+               in_tok = list_entry(next_head, struct trailer_item, list);
        } while (check_all);
        return 1;
 }
 
-static void remove_from_list(struct trailer_item *item,
-                            struct trailer_item **first,
-                            struct trailer_item **last)
-{
-       struct trailer_item *next = item->next;
-       struct trailer_item *previous = item->previous;
-
-       if (next) {
-               item->next->previous = previous;
-               item->next = NULL;
-       } else if (last)
-               *last = previous;
-
-       if (previous) {
-               item->previous->next = next;
-               item->previous = NULL;
-       } else if (first)
-               *first = next;
-}
-
-static struct trailer_item *remove_first(struct trailer_item **first)
-{
-       struct trailer_item *item = *first;
-       *first = item->next;
-       if (item->next) {
-               item->next->previous = NULL;
-               item->next = NULL;
-       }
-       return item;
-}
-
-static const char *apply_command(const char *command, const char *arg)
+static char *apply_command(const char *command, const char *arg)
 {
        struct strbuf cmd = STRBUF_INIT;
        struct strbuf buf = STRBUF_INIT;
        struct child_process cp = CHILD_PROCESS_INIT;
        const char *argv[] = {NULL, NULL};
-       const char *result;
+       char *result;
 
        strbuf_addstr(&cmd, command);
        if (arg)
@@ -246,7 +249,7 @@ static const char *apply_command(const char *command, const char *arg)
        return result;
 }
 
-static void apply_item_command(struct trailer_item *in_tok, struct trailer_item *arg_tok)
+static void apply_item_command(struct trailer_item *in_tok, struct arg_item *arg_tok)
 {
        if (arg_tok->conf.command) {
                const char *arg;
@@ -264,121 +267,108 @@ static void apply_item_command(struct trailer_item *in_tok, struct trailer_item
 }
 
 static void apply_arg_if_exists(struct trailer_item *in_tok,
-                               struct trailer_item *arg_tok,
+                               struct arg_item *arg_tok,
                                struct trailer_item *on_tok,
-                               struct trailer_item **in_tok_first,
-                               struct trailer_item **in_tok_last)
+                               struct list_head *head)
 {
        switch (arg_tok->conf.if_exists) {
        case EXISTS_DO_NOTHING:
-               free_trailer_item(arg_tok);
+               free_arg_item(arg_tok);
                break;
        case EXISTS_REPLACE:
                apply_item_command(in_tok, arg_tok);
-               add_arg_to_input_list(on_tok, arg_tok,
-                                     in_tok_first, in_tok_last);
-               remove_from_list(in_tok, in_tok_first, in_tok_last);
+               add_arg_to_input_list(on_tok, arg_tok);
+               list_del(&in_tok->list);
                free_trailer_item(in_tok);
                break;
        case EXISTS_ADD:
                apply_item_command(in_tok, arg_tok);
-               add_arg_to_input_list(on_tok, arg_tok,
-                                     in_tok_first, in_tok_last);
+               add_arg_to_input_list(on_tok, arg_tok);
                break;
        case EXISTS_ADD_IF_DIFFERENT:
                apply_item_command(in_tok, arg_tok);
-               if (check_if_different(in_tok, arg_tok, 1))
-                       add_arg_to_input_list(on_tok, arg_tok,
-                                             in_tok_first, in_tok_last);
+               if (check_if_different(in_tok, arg_tok, 1, head))
+                       add_arg_to_input_list(on_tok, arg_tok);
                else
-                       free_trailer_item(arg_tok);
+                       free_arg_item(arg_tok);
                break;
        case EXISTS_ADD_IF_DIFFERENT_NEIGHBOR:
                apply_item_command(in_tok, arg_tok);
-               if (check_if_different(on_tok, arg_tok, 0))
-                       add_arg_to_input_list(on_tok, arg_tok,
-                                             in_tok_first, in_tok_last);
+               if (check_if_different(on_tok, arg_tok, 0, head))
+                       add_arg_to_input_list(on_tok, arg_tok);
                else
-                       free_trailer_item(arg_tok);
+                       free_arg_item(arg_tok);
                break;
        }
 }
 
-static void apply_arg_if_missing(struct trailer_item **in_tok_first,
-                                struct trailer_item **in_tok_last,
-                                struct trailer_item *arg_tok)
+static void apply_arg_if_missing(struct list_head *head,
+                                struct arg_item *arg_tok)
 {
-       struct trailer_item **in_tok;
        enum action_where where;
+       struct trailer_item *to_add;
 
        switch (arg_tok->conf.if_missing) {
        case MISSING_DO_NOTHING:
-               free_trailer_item(arg_tok);
+               free_arg_item(arg_tok);
                break;
        case MISSING_ADD:
                where = arg_tok->conf.where;
-               in_tok = after_or_end(where) ? in_tok_last : in_tok_first;
                apply_item_command(NULL, arg_tok);
-               if (*in_tok) {
-                       add_arg_to_input_list(*in_tok, arg_tok,
-                                             in_tok_first, in_tok_last);
-               } else {
-                       *in_tok_first = arg_tok;
-                       *in_tok_last = arg_tok;
-               }
-               break;
+               to_add = trailer_from_arg(arg_tok);
+               if (after_or_end(where))
+                       list_add_tail(&to_add->list, head);
+               else
+                       list_add(&to_add->list, head);
        }
 }
 
-static int find_same_and_apply_arg(struct trailer_item **in_tok_first,
-                                  struct trailer_item **in_tok_last,
-                                  struct trailer_item *arg_tok)
+static int find_same_and_apply_arg(struct list_head *head,
+                                  struct arg_item *arg_tok)
 {
+       struct list_head *pos;
        struct trailer_item *in_tok;
        struct trailer_item *on_tok;
-       struct trailer_item *following_tok;
 
        enum action_where where = arg_tok->conf.where;
        int middle = (where == WHERE_AFTER) || (where == WHERE_BEFORE);
        int backwards = after_or_end(where);
-       struct trailer_item *start_tok = backwards ? *in_tok_last : *in_tok_first;
+       struct trailer_item *start_tok;
 
-       for (in_tok = start_tok; in_tok; in_tok = following_tok) {
-               following_tok = backwards ? in_tok->previous : in_tok->next;
+       if (list_empty(head))
+               return 0;
+
+       start_tok = list_entry(backwards ? head->prev : head->next,
+                              struct trailer_item,
+                              list);
+
+       list_for_each_dir(pos, head, backwards) {
+               in_tok = list_entry(pos, struct trailer_item, list);
                if (!same_token(in_tok, arg_tok))
                        continue;
                on_tok = middle ? in_tok : start_tok;
-               apply_arg_if_exists(in_tok, arg_tok, on_tok,
-                                   in_tok_first, in_tok_last);
+               apply_arg_if_exists(in_tok, arg_tok, on_tok, head);
                return 1;
        }
        return 0;
 }
 
-static void process_trailers_lists(struct trailer_item **in_tok_first,
-                                  struct trailer_item **in_tok_last,
-                                  struct trailer_item **arg_tok_first)
+static void process_trailers_lists(struct list_head *head,
+                                  struct list_head *arg_head)
 {
-       struct trailer_item *arg_tok;
-       struct trailer_item *next_arg;
+       struct list_head *pos, *p;
+       struct arg_item *arg_tok;
 
-       if (!*arg_tok_first)
-               return;
-
-       for (arg_tok = *arg_tok_first; arg_tok; arg_tok = next_arg) {
+       list_for_each_safe(pos, p, arg_head) {
                int applied = 0;
+               arg_tok = list_entry(pos, struct arg_item, list);
 
-               next_arg = arg_tok->next;
-               remove_from_list(arg_tok, arg_tok_first, NULL);
+               list_del(pos);
 
-               applied = find_same_and_apply_arg(in_tok_first,
-                                                 in_tok_last,
-                                                 arg_tok);
+               applied = find_same_and_apply_arg(head, arg_tok);
 
                if (!applied)
-                       apply_arg_if_missing(in_tok_first,
-                                            in_tok_last,
-                                            arg_tok);
+                       apply_arg_if_missing(head, arg_tok);
        }
 }
 
@@ -425,7 +415,7 @@ static int set_if_missing(struct conf_info *item, const char *value)
        return 0;
 }
 
-static void duplicate_conf(struct conf_info *dst, struct conf_info *src)
+static void duplicate_conf(struct conf_info *dst, const struct conf_info *src)
 {
        *dst = *src;
        dst->name = xstrdup_or_null(src->name);
@@ -433,30 +423,24 @@ static void duplicate_conf(struct conf_info *dst, struct conf_info *src)
        dst->command = xstrdup_or_null(src->command);
 }
 
-static struct trailer_item *get_conf_item(const char *name)
+static struct arg_item *get_conf_item(const char *name)
 {
-       struct trailer_item *item;
-       struct trailer_item *previous;
+       struct list_head *pos;
+       struct arg_item *item;
 
        /* Look up item with same name */
-       for (previous = NULL, item = first_conf_item;
-            item;
-            previous = item, item = item->next) {
+       list_for_each(pos, &conf_head) {
+               item = list_entry(pos, struct arg_item, list);
                if (!strcasecmp(item->conf.name, name))
                        return item;
        }
 
        /* Item does not already exists, create it */
-       item = xcalloc(sizeof(struct trailer_item), 1);
+       item = xcalloc(sizeof(*item), 1);
        duplicate_conf(&item->conf, &default_conf_info);
        item->conf.name = xstrdup(name);
 
-       if (!previous)
-               first_conf_item = item;
-       else {
-               previous->next = item;
-               item->previous = previous;
-       }
+       list_add_tail(&item->list, &conf_head);
 
        return item;
 }
@@ -506,7 +490,7 @@ static int git_trailer_default_config(const char *conf_key, const char *value, v
 static int git_trailer_config(const char *conf_key, const char *value, void *cb)
 {
        const char *trailer_item, *variable_name;
-       struct trailer_item *item;
+       struct arg_item *item;
        struct conf_info *conf;
        char *name = NULL;
        enum trailer_info_type type;
@@ -564,33 +548,18 @@ static int git_trailer_config(const char *conf_key, const char *value, void *cb)
        return 0;
 }
 
-static int parse_trailer(struct strbuf *tok, struct strbuf *val, const char *trailer)
+static void ensure_configured(void)
 {
-       size_t len;
-       struct strbuf seps = STRBUF_INIT;
-       strbuf_addstr(&seps, separators);
-       strbuf_addch(&seps, '=');
-       len = strcspn(trailer, seps.buf);
-       strbuf_release(&seps);
-       if (len == 0) {
-               int l = strlen(trailer);
-               while (l > 0 && isspace(trailer[l - 1]))
-                       l--;
-               return error(_("empty trailer token in trailer '%.*s'"), l, trailer);
-       }
-       if (len < strlen(trailer)) {
-               strbuf_add(tok, trailer, len);
-               strbuf_trim(tok);
-               strbuf_addstr(val, trailer + len + 1);
-               strbuf_trim(val);
-       } else {
-               strbuf_addstr(tok, trailer);
-               strbuf_trim(tok);
-       }
-       return 0;
+       if (configured)
+               return;
+
+       /* Default config must be setup first */
+       git_config(git_trailer_default_config, NULL);
+       git_config(git_trailer_config, NULL);
+       configured = 1;
 }
 
-static const char *token_from_item(struct trailer_item *item, char *tok)
+static const char *token_from_item(struct arg_item *item, char *tok)
 {
        if (item->conf.key)
                return item->conf.key;
@@ -599,245 +568,371 @@ static const char *token_from_item(struct trailer_item *item, char *tok)
        return item->conf.name;
 }
 
-static struct trailer_item *new_trailer_item(struct trailer_item *conf_item,
-                                            char *tok, char *val)
-{
-       struct trailer_item *new = xcalloc(sizeof(*new), 1);
-       new->value = val ? val : xstrdup("");
-
-       if (conf_item) {
-               duplicate_conf(&new->conf, &conf_item->conf);
-               new->token = xstrdup(token_from_item(conf_item, tok));
-               free(tok);
-       } else {
-               duplicate_conf(&new->conf, &default_conf_info);
-               new->token = tok;
-       }
-
-       return new;
-}
-
-static int token_matches_item(const char *tok, struct trailer_item *item, int tok_len)
+static int token_matches_item(const char *tok, struct arg_item *item, int tok_len)
 {
        if (!strncasecmp(tok, item->conf.name, tok_len))
                return 1;
        return item->conf.key ? !strncasecmp(tok, item->conf.key, tok_len) : 0;
 }
 
-static struct trailer_item *create_trailer_item(const char *string)
+/*
+ * If the given line is of the form
+ * "<token><optional whitespace><separator>..." or "<separator>...", return the
+ * location of the separator. Otherwise, return -1.  The optional whitespace
+ * is allowed there primarily to allow things like "Bug #43" where <token> is
+ * "Bug" and <separator> is "#".
+ *
+ * The separator-starts-line case (in which this function returns 0) is
+ * distinguished from the non-well-formed-line case (in which this function
+ * returns -1) because some callers of this function need such a distinction.
+ */
+static int find_separator(const char *line, const char *separators)
 {
-       struct strbuf tok = STRBUF_INIT;
-       struct strbuf val = STRBUF_INIT;
-       struct trailer_item *item;
-       int tok_len;
+       int whitespace_found = 0;
+       const char *c;
+       for (c = line; *c; c++) {
+               if (strchr(separators, *c))
+                       return c - line;
+               if (!whitespace_found && (isalnum(*c) || *c == '-'))
+                       continue;
+               if (c != line && (*c == ' ' || *c == '\t')) {
+                       whitespace_found = 1;
+                       continue;
+               }
+               break;
+       }
+       return -1;
+}
 
-       if (parse_trailer(&tok, &val, string))
-               return NULL;
+/*
+ * Obtain the token, value, and conf from the given trailer.
+ *
+ * separator_pos must not be 0, since the token cannot be an empty string.
+ *
+ * If separator_pos is -1, interpret the whole trailer as a token.
+ */
+static void parse_trailer(struct strbuf *tok, struct strbuf *val,
+                        const struct conf_info **conf, const char *trailer,
+                        int separator_pos)
+{
+       struct arg_item *item;
+       int tok_len;
+       struct list_head *pos;
 
-       tok_len = token_len_without_separator(tok.buf, tok.len);
+       if (separator_pos != -1) {
+               strbuf_add(tok, trailer, separator_pos);
+               strbuf_trim(tok);
+               strbuf_addstr(val, trailer + separator_pos + 1);
+               strbuf_trim(val);
+       } else {
+               strbuf_addstr(tok, trailer);
+               strbuf_trim(tok);
+       }
 
        /* Lookup if the token matches something in the config */
-       for (item = first_conf_item; item; item = item->next) {
-               if (token_matches_item(tok.buf, item, tok_len))
-                       return new_trailer_item(item,
-                                               strbuf_detach(&tok, NULL),
-                                               strbuf_detach(&val, NULL));
+       tok_len = token_len_without_separator(tok->buf, tok->len);
+       if (conf)
+               *conf = &default_conf_info;
+       list_for_each(pos, &conf_head) {
+               item = list_entry(pos, struct arg_item, list);
+               if (token_matches_item(tok->buf, item, tok_len)) {
+                       char *tok_buf = strbuf_detach(tok, NULL);
+                       if (conf)
+                               *conf = &item->conf;
+                       strbuf_addstr(tok, token_from_item(item, tok_buf));
+                       free(tok_buf);
+                       break;
+               }
        }
+}
 
-       return new_trailer_item(NULL,
-                               strbuf_detach(&tok, NULL),
-                               strbuf_detach(&val, NULL));
+static struct trailer_item *add_trailer_item(struct list_head *head, char *tok,
+                                            char *val)
+{
+       struct trailer_item *new = xcalloc(sizeof(*new), 1);
+       new->token = tok;
+       new->value = val;
+       list_add_tail(&new->list, head);
+       return new;
 }
 
-static void add_trailer_item(struct trailer_item **first,
-                            struct trailer_item **last,
-                            struct trailer_item *new)
+static void add_arg_item(struct list_head *arg_head, char *tok, char *val,
+                        const struct conf_info *conf)
 {
-       if (!new)
-               return;
-       if (!*last) {
-               *first = new;
-               *last = new;
-       } else {
-               (*last)->next = new;
-               new->previous = *last;
-               *last = new;
-       }
+       struct arg_item *new = xcalloc(sizeof(*new), 1);
+       new->token = tok;
+       new->value = val;
+       duplicate_conf(&new->conf, conf);
+       list_add_tail(&new->list, arg_head);
 }
 
-static struct trailer_item *process_command_line_args(struct string_list *trailers)
+static void process_command_line_args(struct list_head *arg_head,
+                                     struct string_list *trailers)
 {
-       struct trailer_item *arg_tok_first = NULL;
-       struct trailer_item *arg_tok_last = NULL;
        struct string_list_item *tr;
-       struct trailer_item *item;
+       struct arg_item *item;
+       struct strbuf tok = STRBUF_INIT;
+       struct strbuf val = STRBUF_INIT;
+       const struct conf_info *conf;
+       struct list_head *pos;
 
-       /* Add a trailer item for each configured trailer with a command */
-       for (item = first_conf_item; item; item = item->next) {
-               if (item->conf.command) {
-                       struct trailer_item *new = new_trailer_item(item, NULL, NULL);
-                       add_trailer_item(&arg_tok_first, &arg_tok_last, new);
-               }
+       /*
+        * In command-line arguments, '=' is accepted (in addition to the
+        * separators that are defined).
+        */
+       char *cl_separators = xstrfmt("=%s", separators);
+
+       /* Add an arg item for each configured trailer with a command */
+       list_for_each(pos, &conf_head) {
+               item = list_entry(pos, struct arg_item, list);
+               if (item->conf.command)
+                       add_arg_item(arg_head,
+                                    xstrdup(token_from_item(item, NULL)),
+                                    xstrdup(""),
+                                    &item->conf);
        }
 
-       /* Add a trailer item for each trailer on the command line */
+       /* Add an arg item for each trailer on the command line */
        for_each_string_list_item(tr, trailers) {
-               struct trailer_item *new = create_trailer_item(tr->string);
-               add_trailer_item(&arg_tok_first, &arg_tok_last, new);
+               int separator_pos = find_separator(tr->string, cl_separators);
+               if (separator_pos == 0) {
+                       struct strbuf sb = STRBUF_INIT;
+                       strbuf_addstr(&sb, tr->string);
+                       strbuf_trim(&sb);
+                       error(_("empty trailer token in trailer '%.*s'"),
+                             (int) sb.len, sb.buf);
+                       strbuf_release(&sb);
+               } else {
+                       parse_trailer(&tok, &val, &conf, tr->string,
+                                     separator_pos);
+                       add_arg_item(arg_head,
+                                    strbuf_detach(&tok, NULL),
+                                    strbuf_detach(&val, NULL),
+                                    conf);
+               }
        }
 
-       return arg_tok_first;
+       free(cl_separators);
 }
 
-static struct strbuf **read_input_file(const char *file)
+static void read_input_file(struct strbuf *sb, const char *file)
 {
-       struct strbuf **lines;
-       struct strbuf sb = STRBUF_INIT;
-
        if (file) {
-               if (strbuf_read_file(&sb, file, 0) < 0)
+               if (strbuf_read_file(sb, file, 0) < 0)
                        die_errno(_("could not read input file '%s'"), file);
        } else {
-               if (strbuf_read(&sb, fileno(stdin), 0) < 0)
+               if (strbuf_read(sb, fileno(stdin), 0) < 0)
                        die_errno(_("could not read from stdin"));
        }
+}
 
-       lines = strbuf_split(&sb, '\n');
+static const char *next_line(const char *str)
+{
+       const char *nl = strchrnul(str, '\n');
+       return nl + !!*nl;
+}
 
-       strbuf_release(&sb);
+/*
+ * Return the position of the start of the last line. If len is 0, return -1.
+ */
+static int last_line(const char *buf, size_t len)
+{
+       int i;
+       if (len == 0)
+               return -1;
+       if (len == 1)
+               return 0;
+       /*
+        * Skip the last character (in addition to the null terminator),
+        * because if the last character is a newline, it is considered as part
+        * of the last line anyway.
+        */
+       i = len - 2;
 
-       return lines;
+       for (; i >= 0; i--) {
+               if (buf[i] == '\n')
+                       return i + 1;
+       }
+       return 0;
 }
 
 /*
- * Return the (0 based) index of the start of the patch or the line
- * count if there is no patch in the message.
+ * Return the position of the start of the patch or the length of str if there
+ * is no patch in the message.
  */
-static int find_patch_start(struct strbuf **lines, int count)
+static int find_patch_start(const char *str)
 {
-       int i;
+       const char *s;
 
-       /* Get the start of the patch part if any */
-       for (i = 0; i < count; i++) {
-               if (starts_with(lines[i]->buf, "---"))
-                       return i;
+       for (s = str; *s; s = next_line(s)) {
+               if (starts_with(s, "---"))
+                       return s - str;
        }
 
-       return count;
+       return s - str;
 }
 
 /*
- * Return the (0 based) index of the first trailer line or count if
- * there are no trailers. Trailers are searched only in the lines from
- * index (count - 1) down to index 0.
+ * Return the position of the first trailer line or len if there are no
+ * trailers.
  */
-static int find_trailer_start(struct strbuf **lines, int count)
+static int find_trailer_start(const char *buf, size_t len)
 {
-       int start, end_of_title, only_spaces = 1;
+       const char *s;
+       int end_of_title, l, only_spaces = 1;
+       int recognized_prefix = 0, trailer_lines = 0, non_trailer_lines = 0;
+       /*
+        * Number of possible continuation lines encountered. This will be
+        * reset to 0 if we encounter a trailer (since those lines are to be
+        * considered continuations of that trailer), and added to
+        * non_trailer_lines if we encounter a non-trailer (since those lines
+        * are to be considered non-trailers).
+        */
+       int possible_continuation_lines = 0;
 
        /* The first paragraph is the title and cannot be trailers */
-       for (start = 0; start < count; start++) {
-               if (lines[start]->buf[0] == comment_line_char)
+       for (s = buf; s < buf + len; s = next_line(s)) {
+               if (s[0] == comment_line_char)
                        continue;
-               if (contains_only_spaces(lines[start]->buf))
+               if (is_blank_line(s))
                        break;
        }
-       end_of_title = start;
+       end_of_title = s - buf;
 
        /*
-        * Get the start of the trailers by looking starting from the end
-        * for a line with only spaces before lines with one separator.
+        * Get the start of the trailers by looking starting from the end for a
+        * blank line before a set of non-blank lines that (i) are all
+        * trailers, or (ii) contains at least one Git-generated trailer and
+        * consists of at least 25% trailers.
         */
-       for (start = count - 1; start >= end_of_title; start--) {
-               if (lines[start]->buf[0] == comment_line_char)
+       for (l = last_line(buf, len);
+            l >= end_of_title;
+            l = last_line(buf, l)) {
+               const char *bol = buf + l;
+               const char **p;
+               int separator_pos;
+
+               if (bol[0] == comment_line_char) {
+                       non_trailer_lines += possible_continuation_lines;
+                       possible_continuation_lines = 0;
                        continue;
-               if (contains_only_spaces(lines[start]->buf)) {
+               }
+               if (is_blank_line(bol)) {
                        if (only_spaces)
                                continue;
-                       return start + 1;
+                       non_trailer_lines += possible_continuation_lines;
+                       if (recognized_prefix &&
+                           trailer_lines * 3 >= non_trailer_lines)
+                               return next_line(bol) - buf;
+                       else if (trailer_lines && !non_trailer_lines)
+                               return next_line(bol) - buf;
+                       return len;
                }
-               if (strcspn(lines[start]->buf, separators) < lines[start]->len) {
-                       if (only_spaces)
-                               only_spaces = 0;
-                       continue;
+               only_spaces = 0;
+
+               for (p = git_generated_prefixes; *p; p++) {
+                       if (starts_with(bol, *p)) {
+                               trailer_lines++;
+                               possible_continuation_lines = 0;
+                               recognized_prefix = 1;
+                               goto continue_outer_loop;
+                       }
                }
-               return count;
-       }
 
-       return only_spaces ? count : 0;
-}
+               separator_pos = find_separator(bol, separators);
+               if (separator_pos >= 1 && !isspace(bol[0])) {
+                       struct list_head *pos;
 
-/* Get the index of the end of the trailers */
-static int find_trailer_end(struct strbuf **lines, int patch_start)
-{
-       struct strbuf sb = STRBUF_INIT;
-       int i, ignore_bytes;
-
-       for (i = 0; i < patch_start; i++)
-               strbuf_addbuf(&sb, lines[i]);
-       ignore_bytes = ignore_non_trailer(&sb);
-       strbuf_release(&sb);
-       for (i = patch_start - 1; i >= 0 && ignore_bytes > 0; i--)
-               ignore_bytes -= lines[i]->len;
+                       trailer_lines++;
+                       possible_continuation_lines = 0;
+                       if (recognized_prefix)
+                               continue;
+                       list_for_each(pos, &conf_head) {
+                               struct arg_item *item;
+                               item = list_entry(pos, struct arg_item, list);
+                               if (token_matches_item(bol, item,
+                                                      separator_pos)) {
+                                       recognized_prefix = 1;
+                                       break;
+                               }
+                       }
+               } else if (isspace(bol[0]))
+                       possible_continuation_lines++;
+               else {
+                       non_trailer_lines++;
+                       non_trailer_lines += possible_continuation_lines;
+                       possible_continuation_lines = 0;
+               }
+continue_outer_loop:
+               ;
+       }
 
-       return i + 1;
+       return len;
 }
 
-static int has_blank_line_before(struct strbuf **lines, int start)
+/* Return the position of the end of the trailers. */
+static int find_trailer_end(const char *buf, size_t len)
 {
-       for (;start >= 0; start--) {
-               if (lines[start]->buf[0] == comment_line_char)
-                       continue;
-               return contains_only_spaces(lines[start]->buf);
-       }
-       return 0;
+       return len - ignore_non_trailer(buf, len);
 }
 
-static void print_lines(FILE *outfile, struct strbuf **lines, int start, int end)
+static int ends_with_blank_line(const char *buf, size_t len)
 {
-       int i;
-       for (i = start; lines[i] && i < end; i++)
-               fprintf(outfile, "%s", lines[i]->buf);
+       int ll = last_line(buf, len);
+       if (ll < 0)
+               return 0;
+       return is_blank_line(buf + ll);
 }
 
 static int process_input_file(FILE *outfile,
-                             struct strbuf **lines,
-                             struct trailer_item **in_tok_first,
-                             struct trailer_item **in_tok_last)
+                             const char *str,
+                             struct list_head *head)
 {
-       int count = 0;
-       int patch_start, trailer_start, trailer_end, i;
-
-       /* Get the line count */
-       while (lines[count])
-               count++;
+       struct trailer_info info;
+       struct strbuf tok = STRBUF_INIT;
+       struct strbuf val = STRBUF_INIT;
+       int i;
 
-       patch_start = find_patch_start(lines, count);
-       trailer_end = find_trailer_end(lines, patch_start);
-       trailer_start = find_trailer_start(lines, trailer_end);
+       trailer_info_get(&info, str);
 
        /* Print lines before the trailers as is */
-       print_lines(outfile, lines, 0, trailer_start);
+       fwrite(str, 1, info.trailer_start - str, outfile);
 
-       if (!has_blank_line_before(lines, trailer_start - 1))
+       if (!info.blank_line_before_trailer)
                fprintf(outfile, "\n");
 
-       /* Parse trailer lines */
-       for (i = trailer_start; i < trailer_end; i++) {
-               if (lines[i]->buf[0] != comment_line_char) {
-                       struct trailer_item *new = create_trailer_item(lines[i]->buf);
-                       add_trailer_item(in_tok_first, in_tok_last, new);
+       for (i = 0; i < info.trailer_nr; i++) {
+               int separator_pos;
+               char *trailer = info.trailers[i];
+               if (trailer[0] == comment_line_char)
+                       continue;
+               separator_pos = find_separator(trailer, separators);
+               if (separator_pos >= 1) {
+                       parse_trailer(&tok, &val, NULL, trailer,
+                                     separator_pos);
+                       add_trailer_item(head,
+                                        strbuf_detach(&tok, NULL),
+                                        strbuf_detach(&val, NULL));
+               } else {
+                       strbuf_addstr(&val, trailer);
+                       strbuf_strip_suffix(&val, "\n");
+                       add_trailer_item(head,
+                                        NULL,
+                                        strbuf_detach(&val, NULL));
                }
        }
 
-       return trailer_end;
+       trailer_info_release(&info);
+
+       return info.trailer_end - str;
 }
 
-static void free_all(struct trailer_item **first)
+static void free_all(struct list_head *head)
 {
-       while (*first) {
-               struct trailer_item *item = remove_first(first);
-               free_trailer_item(item);
+       struct list_head *pos, *p;
+       list_for_each_safe(pos, p, head) {
+               list_del(pos);
+               free_trailer_item(list_entry(pos, struct trailer_item, list));
        }
 }
 
@@ -874,39 +969,87 @@ static FILE *create_in_place_tempfile(const char *file)
 
 void process_trailers(const char *file, int in_place, int trim_empty, struct string_list *trailers)
 {
-       struct trailer_item *in_tok_first = NULL;
-       struct trailer_item *in_tok_last = NULL;
-       struct trailer_item *arg_tok_first;
-       struct strbuf **lines;
+       LIST_HEAD(head);
+       LIST_HEAD(arg_head);
+       struct strbuf sb = STRBUF_INIT;
        int trailer_end;
        FILE *outfile = stdout;
 
-       /* Default config must be setup first */
-       git_config(git_trailer_default_config, NULL);
-       git_config(git_trailer_config, NULL);
+       ensure_configured();
 
-       lines = read_input_file(file);
+       read_input_file(&sb, file);
 
        if (in_place)
                outfile = create_in_place_tempfile(file);
 
        /* Print the lines before the trailers */
-       trailer_end = process_input_file(outfile, lines, &in_tok_first, &in_tok_last);
+       trailer_end = process_input_file(outfile, sb.buf, &head);
 
-       arg_tok_first = process_command_line_args(trailers);
+       process_command_line_args(&arg_head, trailers);
 
-       process_trailers_lists(&in_tok_first, &in_tok_last, &arg_tok_first);
+       process_trailers_lists(&head, &arg_head);
 
-       print_all(outfile, in_tok_first, trim_empty);
+       print_all(outfile, &head, trim_empty);
 
-       free_all(&in_tok_first);
+       free_all(&head);
 
        /* Print the lines after the trailers as is */
-       print_lines(outfile, lines, trailer_end, INT_MAX);
+       fwrite(sb.buf + trailer_end, 1, sb.len - trailer_end, outfile);
 
        if (in_place)
                if (rename_tempfile(&trailers_tempfile, file))
                        die_errno(_("could not rename temporary file to %s"), file);
 
-       strbuf_list_free(lines);
+       strbuf_release(&sb);
+}
+
+void trailer_info_get(struct trailer_info *info, const char *str)
+{
+       int patch_start, trailer_end, trailer_start;
+       struct strbuf **trailer_lines, **ptr;
+       char **trailer_strings = NULL;
+       size_t nr = 0, alloc = 0;
+       char **last = NULL;
+
+       ensure_configured();
+
+       patch_start = find_patch_start(str);
+       trailer_end = find_trailer_end(str, patch_start);
+       trailer_start = find_trailer_start(str, trailer_end);
+
+       trailer_lines = strbuf_split_buf(str + trailer_start,
+                                        trailer_end - trailer_start,
+                                        '\n',
+                                        0);
+       for (ptr = trailer_lines; *ptr; ptr++) {
+               if (last && isspace((*ptr)->buf[0])) {
+                       struct strbuf sb = STRBUF_INIT;
+                       strbuf_attach(&sb, *last, strlen(*last), strlen(*last));
+                       strbuf_addbuf(&sb, *ptr);
+                       *last = strbuf_detach(&sb, NULL);
+                       continue;
+               }
+               ALLOC_GROW(trailer_strings, nr + 1, alloc);
+               trailer_strings[nr] = strbuf_detach(*ptr, NULL);
+               last = find_separator(trailer_strings[nr], separators) >= 1
+                       ? &trailer_strings[nr]
+                       : NULL;
+               nr++;
+       }
+       strbuf_list_free(trailer_lines);
+
+       info->blank_line_before_trailer = ends_with_blank_line(str,
+                                                              trailer_start);
+       info->trailer_start = str + trailer_start;
+       info->trailer_end = str + trailer_end;
+       info->trailers = trailer_strings;
+       info->trailer_nr = nr;
+}
+
+void trailer_info_release(struct trailer_info *info)
+{
+       int i;
+       for (i = 0; i < info->trailer_nr; i++)
+               free(info->trailers[i]);
+       free(info->trailers);
 }
index 36b40b81761f95742c9c6fe7e94ba89f19aabfde..65cc5d79c6cecfce5cf3302dd7dcb6323f9f85dc 100644 (file)
--- a/trailer.h
+++ b/trailer.h
@@ -1,7 +1,32 @@
 #ifndef TRAILER_H
 #define TRAILER_H
 
+struct trailer_info {
+       /*
+        * True if there is a blank line before the location pointed to by
+        * trailer_start.
+        */
+       int blank_line_before_trailer;
+
+       /*
+        * Pointers to the start and end of the trailer block found. If there
+        * is no trailer block found, these 2 pointers point to the end of the
+        * input string.
+        */
+       const char *trailer_start, *trailer_end;
+
+       /*
+        * Array of trailers found.
+        */
+       char **trailers;
+       size_t trailer_nr;
+};
+
 void process_trailers(const char *file, int in_place, int trim_empty,
                      struct string_list *trailers);
 
+void trailer_info_get(struct trailer_info *info, const char *str);
+
+void trailer_info_release(struct trailer_info *info);
+
 #endif /* TRAILER_H */
index db2f930c740348bbe55525a2e471857b6dc463f1..36408046eb28d8af3c90614f73ee8112855b4677 100644 (file)
@@ -124,8 +124,9 @@ static struct child_process *get_helper(struct transport *transport)
        helper->git_cmd = 0;
        helper->silent_exec_failure = 1;
 
-       argv_array_pushf(&helper->env_array, "%s=%s", GIT_DIR_ENVIRONMENT,
-                        get_git_dir());
+       if (have_git_dir())
+               argv_array_pushf(&helper->env_array, "%s=%s",
+                                GIT_DIR_ENVIRONMENT, get_git_dir());
 
        code = start_command(helper);
        if (code < 0 && errno == ENOENT)
@@ -258,8 +259,51 @@ static const char *boolean_options[] = {
        TRANS_OPT_THIN,
        TRANS_OPT_KEEP,
        TRANS_OPT_FOLLOWTAGS,
+       TRANS_OPT_DEEPEN_RELATIVE
        };
 
+static int strbuf_set_helper_option(struct helper_data *data,
+                                   struct strbuf *buf)
+{
+       int ret;
+
+       sendline(data, buf);
+       if (recvline(data, buf))
+               exit(128);
+
+       if (!strcmp(buf->buf, "ok"))
+               ret = 0;
+       else if (starts_with(buf->buf, "error"))
+               ret = -1;
+       else if (!strcmp(buf->buf, "unsupported"))
+               ret = 1;
+       else {
+               warning("%s unexpectedly said: '%s'", data->name, buf->buf);
+               ret = 1;
+       }
+       return ret;
+}
+
+static int string_list_set_helper_option(struct helper_data *data,
+                                        const char *name,
+                                        struct string_list *list)
+{
+       struct strbuf buf = STRBUF_INIT;
+       int i, ret = 0;
+
+       for (i = 0; i < list->nr; i++) {
+               strbuf_addf(&buf, "option %s ", name);
+               quote_c_style(list->items[i].string, &buf, NULL, 0);
+               strbuf_addch(&buf, '\n');
+
+               if ((ret = strbuf_set_helper_option(data, &buf)))
+                       break;
+               strbuf_reset(&buf);
+       }
+       strbuf_release(&buf);
+       return ret;
+}
+
 static int set_helper_option(struct transport *transport,
                          const char *name, const char *value)
 {
@@ -272,6 +316,10 @@ static int set_helper_option(struct transport *transport,
        if (!data->option)
                return 1;
 
+       if (!strcmp(name, "deepen-not"))
+               return string_list_set_helper_option(data, name,
+                                                    (struct string_list *)value);
+
        for (i = 0; i < ARRAY_SIZE(unsupported_options); i++) {
                if (!strcmp(name, unsupported_options[i]))
                        return 1;
@@ -291,20 +339,7 @@ static int set_helper_option(struct transport *transport,
                quote_c_style(value, &buf, NULL, 0);
        strbuf_addch(&buf, '\n');
 
-       sendline(data, &buf);
-       if (recvline(data, &buf))
-               exit(128);
-
-       if (!strcmp(buf.buf, "ok"))
-               ret = 0;
-       else if (starts_with(buf.buf, "error")) {
-               ret = -1;
-       } else if (!strcmp(buf.buf, "unsupported"))
-               ret = 1;
-       else {
-               warning("%s unexpectedly said: '%s'", data->name, buf.buf);
-               ret = 1;
-       }
+       ret = strbuf_set_helper_option(data, &buf);
        strbuf_release(&buf);
        return ret;
 }
@@ -312,14 +347,11 @@ static int set_helper_option(struct transport *transport,
 static void standard_options(struct transport *t)
 {
        char buf[16];
-       int n;
        int v = t->verbose;
 
        set_helper_option(t, "progress", t->progress ? "true" : "false");
 
-       n = snprintf(buf, sizeof(buf), "%d", v + 1);
-       if (n >= sizeof(buf))
-               die("impossibly large verbosity value");
+       xsnprintf(buf, sizeof(buf), "%d", v + 1);
        set_helper_option(t, "verbosity", buf);
 
        switch (t->family) {
@@ -792,6 +824,13 @@ static void set_common_push_options(struct transport *transport,
                if (set_helper_option(transport, TRANS_OPT_PUSH_CERT, "if-asked") != 0)
                        die("helper %s does not support --signed=if-asked", name);
        }
+
+       if (flags & TRANSPORT_PUSH_OPTIONS) {
+               struct string_list_item *item;
+               for_each_string_list_item(item, transport->push_options)
+                       if (set_helper_option(transport, "push-option", item->string) != 0)
+                               die("helper %s does not support 'push-option'", name);
+       }
 }
 
 static int push_refs_with_push(struct transport *transport,
index 94d6dc3725a2bb091df66ce6fe266ddd5317ed02..4d33138a7525310af3f9f73b699360f159516ad1 100644 (file)
@@ -116,8 +116,8 @@ struct git_transport_data {
        struct child_process *conn;
        int fd[2];
        unsigned got_remote_heads : 1;
-       struct sha1_array extra_have;
-       struct sha1_array shallow;
+       struct oid_array extra_have;
+       struct oid_array shallow;
 };
 
 static int set_git_option(struct git_transport_options *opts,
@@ -151,6 +151,15 @@ static int set_git_option(struct git_transport_options *opts,
                                die(_("transport: invalid depth option '%s'"), value);
                }
                return 0;
+       } else if (!strcmp(name, TRANS_OPT_DEEPEN_SINCE)) {
+               opts->deepen_since = value;
+               return 0;
+       } else if (!strcmp(name, TRANS_OPT_DEEPEN_NOT)) {
+               opts->deepen_not = (const struct string_list *)value;
+               return 0;
+       } else if (!strcmp(name, TRANS_OPT_DEEPEN_RELATIVE)) {
+               opts->deepen_relative = !!value;
+               return 0;
        }
        return 1;
 }
@@ -195,6 +204,7 @@ static struct ref *get_refs_via_connect(struct transport *transport, int for_pus
 static int fetch_refs_via_pack(struct transport *transport,
                               int nr_heads, struct ref **to_fetch)
 {
+       int ret = 0;
        struct git_transport_data *data = transport->data;
        struct ref *refs;
        char *dest = xstrdup(transport->url);
@@ -211,6 +221,9 @@ static int fetch_refs_via_pack(struct transport *transport,
        args.quiet = (transport->verbose < 0);
        args.no_progress = !transport->progress;
        args.depth = data->options.depth;
+       args.deepen_since = data->options.deepen_since;
+       args.deepen_not = data->options.deepen_not;
+       args.deepen_relative = data->options.deepen_relative;
        args.check_self_contained_and_connected =
                data->options.check_self_contained_and_connected;
        args.cloning = transport->cloning;
@@ -229,19 +242,22 @@ static int fetch_refs_via_pack(struct transport *transport,
                          &transport->pack_lockfile);
        close(data->fd[0]);
        close(data->fd[1]);
-       if (finish_connect(data->conn)) {
-               free_refs(refs);
-               refs = NULL;
-       }
+       if (finish_connect(data->conn))
+               ret = -1;
        data->conn = NULL;
        data->got_remote_heads = 0;
        data->options.self_contained_and_connected =
                args.self_contained_and_connected;
 
+       if (refs == NULL)
+               ret = -1;
+       if (report_unmatched_refs(to_fetch, nr_heads))
+               ret = -1;
+
        free_refs(refs_tmp);
        free_refs(refs);
        free(dest);
-       return (refs ? 0 : -1);
+       return ret;
 }
 
 static int push_had_errors(struct ref *ref)
@@ -287,7 +303,7 @@ void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int v
                if (verbose)
                        fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst);
                if (ref->deletion) {
-                       delete_ref(rs.dst, NULL, 0);
+                       delete_ref(NULL, rs.dst, NULL, 0);
                } else
                        update_ref("update by push", rs.dst,
                                        ref->new_oid.hash, NULL, 0, 0);
@@ -295,7 +311,9 @@ void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int v
        }
 }
 
-static void print_ref_status(char flag, const char *summary, struct ref *to, struct ref *from, const char *msg, int porcelain)
+static void print_ref_status(char flag, const char *summary,
+                            struct ref *to, struct ref *from, const char *msg,
+                            int porcelain, int summary_width)
 {
        if (porcelain) {
                if (from)
@@ -307,7 +325,7 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
                else
                        fprintf(stdout, "%s\n", summary);
        } else {
-               fprintf(stderr, " %c %-*s ", flag, TRANSPORT_SUMMARY_WIDTH, summary);
+               fprintf(stderr, " %c %-*s ", flag, summary_width, summary);
                if (from)
                        fprintf(stderr, "%s -> %s", prettify_refname(from->name), prettify_refname(to->name));
                else
@@ -321,15 +339,16 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
        }
 }
 
-static void print_ok_ref_status(struct ref *ref, int porcelain)
+static void print_ok_ref_status(struct ref *ref, int porcelain, int summary_width)
 {
        if (ref->deletion)
-               print_ref_status('-', "[deleted]", ref, NULL, NULL, porcelain);
+               print_ref_status('-', "[deleted]", ref, NULL, NULL,
+                                porcelain, summary_width);
        else if (is_null_oid(&ref->old_oid))
                print_ref_status('*',
                        (starts_with(ref->name, "refs/tags/") ? "[new tag]" :
                        "[new branch]"),
-                       ref, ref->peer_ref, NULL, porcelain);
+                       ref, ref->peer_ref, NULL, porcelain, summary_width);
        else {
                struct strbuf quickref = STRBUF_INIT;
                char type;
@@ -349,12 +368,14 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
                strbuf_add_unique_abbrev(&quickref, ref->new_oid.hash,
                                         DEFAULT_ABBREV);
 
-               print_ref_status(type, quickref.buf, ref, ref->peer_ref, msg, porcelain);
+               print_ref_status(type, quickref.buf, ref, ref->peer_ref, msg,
+                                porcelain, summary_width);
                strbuf_release(&quickref);
        }
 }
 
-static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain)
+static int print_one_push_status(struct ref *ref, const char *dest, int count,
+                                int porcelain, int summary_width)
 {
        if (!count) {
                char *url = transport_anonymize_url(dest);
@@ -364,88 +385,117 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, i
 
        switch(ref->status) {
        case REF_STATUS_NONE:
-               print_ref_status('X', "[no match]", ref, NULL, NULL, porcelain);
+               print_ref_status('X', "[no match]", ref, NULL, NULL,
+                                porcelain, summary_width);
                break;
        case REF_STATUS_REJECT_NODELETE:
                print_ref_status('!', "[rejected]", ref, NULL,
-                                                "remote does not support deleting refs", porcelain);
+                                "remote does not support deleting refs",
+                                porcelain, summary_width);
                break;
        case REF_STATUS_UPTODATE:
                print_ref_status('=', "[up to date]", ref,
-                                                ref->peer_ref, NULL, porcelain);
+                                ref->peer_ref, NULL, porcelain, summary_width);
                break;
        case REF_STATUS_REJECT_NONFASTFORWARD:
                print_ref_status('!', "[rejected]", ref, ref->peer_ref,
-                                                "non-fast-forward", porcelain);
+                                "non-fast-forward", porcelain, summary_width);
                break;
        case REF_STATUS_REJECT_ALREADY_EXISTS:
                print_ref_status('!', "[rejected]", ref, ref->peer_ref,
-                                                "already exists", porcelain);
+                                "already exists", porcelain, summary_width);
                break;
        case REF_STATUS_REJECT_FETCH_FIRST:
                print_ref_status('!', "[rejected]", ref, ref->peer_ref,
-                                                "fetch first", porcelain);
+                                "fetch first", porcelain, summary_width);
                break;
        case REF_STATUS_REJECT_NEEDS_FORCE:
                print_ref_status('!', "[rejected]", ref, ref->peer_ref,
-                                                "needs force", porcelain);
+                                "needs force", porcelain, summary_width);
                break;
        case REF_STATUS_REJECT_STALE:
                print_ref_status('!', "[rejected]", ref, ref->peer_ref,
-                                                "stale info", porcelain);
+                                "stale info", porcelain, summary_width);
                break;
        case REF_STATUS_REJECT_SHALLOW:
                print_ref_status('!', "[rejected]", ref, ref->peer_ref,
-                                                "new shallow roots not allowed", porcelain);
+                                "new shallow roots not allowed",
+                                porcelain, summary_width);
                break;
        case REF_STATUS_REMOTE_REJECT:
                print_ref_status('!', "[remote rejected]", ref,
-                                                ref->deletion ? NULL : ref->peer_ref,
-                                                ref->remote_status, porcelain);
+                                ref->deletion ? NULL : ref->peer_ref,
+                                ref->remote_status, porcelain, summary_width);
                break;
        case REF_STATUS_EXPECTING_REPORT:
                print_ref_status('!', "[remote failure]", ref,
-                                                ref->deletion ? NULL : ref->peer_ref,
-                                                "remote failed to report status", porcelain);
+                                ref->deletion ? NULL : ref->peer_ref,
+                                "remote failed to report status",
+                                porcelain, summary_width);
                break;
        case REF_STATUS_ATOMIC_PUSH_FAILED:
                print_ref_status('!', "[rejected]", ref, ref->peer_ref,
-                                                "atomic push failed", porcelain);
+                                "atomic push failed", porcelain, summary_width);
                break;
        case REF_STATUS_OK:
-               print_ok_ref_status(ref, porcelain);
+               print_ok_ref_status(ref, porcelain, summary_width);
                break;
        }
 
        return 1;
 }
 
+static int measure_abbrev(const struct object_id *oid, int sofar)
+{
+       char hex[GIT_MAX_HEXSZ + 1];
+       int w = find_unique_abbrev_r(hex, oid->hash, DEFAULT_ABBREV);
+
+       return (w < sofar) ? sofar : w;
+}
+
+int transport_summary_width(const struct ref *refs)
+{
+       int maxw = -1;
+
+       for (; refs; refs = refs->next) {
+               maxw = measure_abbrev(&refs->old_oid, maxw);
+               maxw = measure_abbrev(&refs->new_oid, maxw);
+       }
+       if (maxw < 0)
+               maxw = FALLBACK_DEFAULT_ABBREV;
+       return (2 * maxw + 3);
+}
+
 void transport_print_push_status(const char *dest, struct ref *refs,
                                  int verbose, int porcelain, unsigned int *reject_reasons)
 {
        struct ref *ref;
        int n = 0;
-       unsigned char head_sha1[20];
+       struct object_id head_oid;
        char *head;
+       int summary_width = transport_summary_width(refs);
 
-       head = resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, NULL);
+       head = resolve_refdup("HEAD", RESOLVE_REF_READING, head_oid.hash, NULL);
 
        if (verbose) {
                for (ref = refs; ref; ref = ref->next)
                        if (ref->status == REF_STATUS_UPTODATE)
-                               n += print_one_push_status(ref, dest, n, porcelain);
+                               n += print_one_push_status(ref, dest, n,
+                                                          porcelain, summary_width);
        }
 
        for (ref = refs; ref; ref = ref->next)
                if (ref->status == REF_STATUS_OK)
-                       n += print_one_push_status(ref, dest, n, porcelain);
+                       n += print_one_push_status(ref, dest, n,
+                                                  porcelain, summary_width);
 
        *reject_reasons = 0;
        for (ref = refs; ref; ref = ref->next) {
                if (ref->status != REF_STATUS_NONE &&
                    ref->status != REF_STATUS_UPTODATE &&
                    ref->status != REF_STATUS_OK)
-                       n += print_one_push_status(ref, dest, n, porcelain);
+                       n += print_one_push_status(ref, dest, n,
+                                                  porcelain, summary_width);
                if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD) {
                        if (head != NULL && !strcmp(head, ref->name))
                                *reject_reasons |= REJECT_NON_FF_HEAD;
@@ -618,21 +668,89 @@ static const struct string_list *protocol_whitelist(void)
        return enabled ? &allowed : NULL;
 }
 
-int is_transport_allowed(const char *type)
+enum protocol_allow_config {
+       PROTOCOL_ALLOW_NEVER = 0,
+       PROTOCOL_ALLOW_USER_ONLY,
+       PROTOCOL_ALLOW_ALWAYS
+};
+
+static enum protocol_allow_config parse_protocol_config(const char *key,
+                                                       const char *value)
 {
-       const struct string_list *allowed = protocol_whitelist();
-       return !allowed || string_list_has_string(allowed, type);
+       if (!strcasecmp(value, "always"))
+               return PROTOCOL_ALLOW_ALWAYS;
+       else if (!strcasecmp(value, "never"))
+               return PROTOCOL_ALLOW_NEVER;
+       else if (!strcasecmp(value, "user"))
+               return PROTOCOL_ALLOW_USER_ONLY;
+
+       die("unknown value for config '%s': %s", key, value);
 }
 
-void transport_check_allowed(const char *type)
+static enum protocol_allow_config get_protocol_config(const char *type)
 {
-       if (!is_transport_allowed(type))
-               die("transport '%s' not allowed", type);
+       char *key = xstrfmt("protocol.%s.allow", type);
+       char *value;
+
+       /* first check the per-protocol config */
+       if (!git_config_get_string(key, &value)) {
+               enum protocol_allow_config ret =
+                       parse_protocol_config(key, value);
+               free(key);
+               free(value);
+               return ret;
+       }
+       free(key);
+
+       /* if defined, fallback to user-defined default for unknown protocols */
+       if (!git_config_get_string("protocol.allow", &value)) {
+               enum protocol_allow_config ret =
+                       parse_protocol_config("protocol.allow", value);
+               free(value);
+               return ret;
+       }
+
+       /* fallback to built-in defaults */
+       /* known safe */
+       if (!strcmp(type, "http") ||
+           !strcmp(type, "https") ||
+           !strcmp(type, "git") ||
+           !strcmp(type, "ssh") ||
+           !strcmp(type, "file"))
+               return PROTOCOL_ALLOW_ALWAYS;
+
+       /* known scary; err on the side of caution */
+       if (!strcmp(type, "ext"))
+               return PROTOCOL_ALLOW_NEVER;
+
+       /* unknown; by default let them be used only directly by the user */
+       return PROTOCOL_ALLOW_USER_ONLY;
+}
+
+int is_transport_allowed(const char *type, int from_user)
+{
+       const struct string_list *whitelist = protocol_whitelist();
+       if (whitelist)
+               return string_list_has_string(whitelist, type);
+
+       switch (get_protocol_config(type)) {
+       case PROTOCOL_ALLOW_ALWAYS:
+               return 1;
+       case PROTOCOL_ALLOW_NEVER:
+               return 0;
+       case PROTOCOL_ALLOW_USER_ONLY:
+               if (from_user < 0)
+                       from_user = git_env_bool("GIT_PROTOCOL_FROM_USER", 1);
+               return from_user;
+       }
+
+       die("BUG: invalid protocol_allow_config type");
 }
 
-int transport_restrict_protocols(void)
+void transport_check_allowed(const char *type)
 {
-       return !!protocol_whitelist();
+       if (!is_transport_allowed(type, -1))
+               die("transport '%s' not allowed", type);
 }
 
 struct transport *transport_get(struct remote *remote, const char *url)
@@ -901,28 +1019,54 @@ int transport_push(struct transport *transport,
                        if (run_pre_push_hook(transport, remote_refs))
                                return -1;
 
-               if ((flags & TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND) && !is_bare_repository()) {
+               if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
+                             TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
+                   !is_bare_repository()) {
                        struct ref *ref = remote_refs;
+                       struct oid_array commits = OID_ARRAY_INIT;
+
                        for (; ref; ref = ref->next)
-                               if (!is_null_oid(&ref->new_oid) &&
-                                   !push_unpushed_submodules(ref->new_oid.hash,
-                                           transport->remote->name))
-                                   die ("Failed to push all needed submodules!");
+                               if (!is_null_oid(&ref->new_oid))
+                                       oid_array_append(&commits,
+                                                         &ref->new_oid);
+
+                       if (!push_unpushed_submodules(&commits,
+                                                     transport->remote,
+                                                     refspec, refspec_nr,
+                                                     transport->push_options,
+                                                     pretend)) {
+                               oid_array_clear(&commits);
+                               die("Failed to push all needed submodules!");
+                       }
+                       oid_array_clear(&commits);
                }
 
-               if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
-                             TRANSPORT_RECURSE_SUBMODULES_CHECK)) && !is_bare_repository()) {
+               if (((flags & TRANSPORT_RECURSE_SUBMODULES_CHECK) ||
+                    ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
+                               TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
+                     !pretend)) && !is_bare_repository()) {
                        struct ref *ref = remote_refs;
                        struct string_list needs_pushing = STRING_LIST_INIT_DUP;
+                       struct oid_array commits = OID_ARRAY_INIT;
 
                        for (; ref; ref = ref->next)
-                               if (!is_null_oid(&ref->new_oid) &&
-                                   find_unpushed_submodules(ref->new_oid.hash,
-                                           transport->remote->name, &needs_pushing))
-                                       die_with_unpushed_submodules(&needs_pushing);
+                               if (!is_null_oid(&ref->new_oid))
+                                       oid_array_append(&commits,
+                                                         &ref->new_oid);
+
+                       if (find_unpushed_submodules(&commits, transport->remote->name,
+                                               &needs_pushing)) {
+                               oid_array_clear(&commits);
+                               die_with_unpushed_submodules(&needs_pushing);
+                       }
+                       string_list_clear(&needs_pushing, 0);
+                       oid_array_clear(&commits);
                }
 
-               push_ret = transport->push_refs(transport, remote_refs, flags);
+               if (!(flags & TRANSPORT_RECURSE_SUBMODULES_ONLY))
+                       push_ret = transport->push_refs(transport, remote_refs, flags);
+               else
+                       push_ret = 0;
                err = push_had_errors(remote_refs);
                ret = push_ret | err;
 
@@ -934,7 +1078,8 @@ int transport_push(struct transport *transport,
                if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
                        set_upstreams(transport, remote_refs, pretend);
 
-               if (!(flags & TRANSPORT_PUSH_DRY_RUN)) {
+               if (!(flags & (TRANSPORT_PUSH_DRY_RUN |
+                              TRANSPORT_RECURSE_SUBMODULES_ONLY))) {
                        struct ref *ref;
                        for (ref = remote_refs; ref; ref = ref->next)
                                transport_update_tracking_ref(transport->remote, ref, verbose);
@@ -1069,6 +1214,42 @@ literal_copy:
        return xstrdup(url);
 }
 
+static void read_alternate_refs(const char *path,
+                               alternate_ref_fn *cb,
+                               void *data)
+{
+       struct child_process cmd = CHILD_PROCESS_INIT;
+       struct strbuf line = STRBUF_INIT;
+       FILE *fh;
+
+       cmd.git_cmd = 1;
+       argv_array_pushf(&cmd.args, "--git-dir=%s", path);
+       argv_array_push(&cmd.args, "for-each-ref");
+       argv_array_push(&cmd.args, "--format=%(objectname) %(refname)");
+       cmd.env = local_repo_env;
+       cmd.out = -1;
+
+       if (start_command(&cmd))
+               return;
+
+       fh = xfdopen(cmd.out, "r");
+       while (strbuf_getline_lf(&line, fh) != EOF) {
+               struct object_id oid;
+
+               if (get_oid_hex(line.buf, &oid) ||
+                   line.buf[GIT_SHA1_HEXSZ] != ' ') {
+                       warning("invalid line while parsing alternate refs: %s",
+                               line.buf);
+                       break;
+               }
+
+               cb(line.buf + GIT_SHA1_HEXSZ + 1, &oid, data);
+       }
+
+       fclose(fh);
+       finish_command(&cmd);
+}
+
 struct alternate_refs_data {
        alternate_ref_fn *fn;
        void *data;
@@ -1077,36 +1258,26 @@ struct alternate_refs_data {
 static int refs_from_alternate_cb(struct alternate_object_database *e,
                                  void *data)
 {
-       char *other;
-       size_t len;
-       struct remote *remote;
-       struct transport *transport;
-       const struct ref *extra;
+       struct strbuf path = STRBUF_INIT;
+       size_t base_len;
        struct alternate_refs_data *cb = data;
 
-       e->name[-1] = '\0';
-       other = xstrdup(real_path(e->base));
-       e->name[-1] = '/';
-       len = strlen(other);
-
-       while (other[len-1] == '/')
-               other[--len] = '\0';
-       if (len < 8 || memcmp(other + len - 8, "/objects", 8))
+       if (!strbuf_realpath(&path, e->path, 0))
+               goto out;
+       if (!strbuf_strip_suffix(&path, "/objects"))
                goto out;
+       base_len = path.len;
+
        /* Is this a git repository with refs? */
-       memcpy(other + len - 8, "/refs", 6);
-       if (!is_directory(other))
+       strbuf_addstr(&path, "/refs");
+       if (!is_directory(path.buf))
                goto out;
-       other[len - 8] = '\0';
-       remote = remote_get(other);
-       transport = transport_get(remote, other);
-       for (extra = transport_get_remote_refs(transport);
-            extra;
-            extra = extra->next)
-               cb->fn(extra, cb->data);
-       transport_disconnect(transport);
+       strbuf_setlen(&path, base_len);
+
+       read_alternate_refs(path.buf, cb->fn, cb->data);
+
 out:
-       free(other);
+       strbuf_release(&path);
        return 0;
 }
 
index 6fe3485325dfccfba3b018c8c25b89a6d4643a12..bc5571574b67803249567bcee501dfcc342b0b0f 100644 (file)
@@ -5,6 +5,8 @@
 #include "run-command.h"
 #include "remote.h"
 
+struct string_list;
+
 struct git_transport_options {
        unsigned thin : 1;
        unsigned keep : 1;
@@ -12,7 +14,10 @@ struct git_transport_options {
        unsigned check_self_contained_and_connected : 1;
        unsigned self_contained_and_connected : 1;
        unsigned update_shallow : 1;
+       unsigned deepen_relative : 1;
        int depth;
+       const char *deepen_since;
+       const struct string_list *deepen_not;
        const char *uploadpack;
        const char *receivepack;
        struct push_cas_option *cas;
@@ -126,33 +131,40 @@ struct transport {
        enum transport_family family;
 };
 
-#define TRANSPORT_PUSH_ALL 1
-#define TRANSPORT_PUSH_FORCE 2
-#define TRANSPORT_PUSH_DRY_RUN 4
-#define TRANSPORT_PUSH_MIRROR 8
-#define TRANSPORT_PUSH_PORCELAIN 16
-#define TRANSPORT_PUSH_SET_UPSTREAM 32
-#define TRANSPORT_RECURSE_SUBMODULES_CHECK 64
-#define TRANSPORT_PUSH_PRUNE 128
-#define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND 256
-#define TRANSPORT_PUSH_NO_HOOK 512
-#define TRANSPORT_PUSH_FOLLOW_TAGS 1024
-#define TRANSPORT_PUSH_CERT_ALWAYS 2048
-#define TRANSPORT_PUSH_CERT_IF_ASKED 4096
-#define TRANSPORT_PUSH_ATOMIC 8192
-#define TRANSPORT_PUSH_OPTIONS 16384
-
-#define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3)
-#define TRANSPORT_SUMMARY(x) (int)(TRANSPORT_SUMMARY_WIDTH + strlen(x) - gettext_width(x)), (x)
+#define TRANSPORT_PUSH_ALL                     (1<<0)
+#define TRANSPORT_PUSH_FORCE                   (1<<1)
+#define TRANSPORT_PUSH_DRY_RUN                 (1<<2)
+#define TRANSPORT_PUSH_MIRROR                  (1<<3)
+#define TRANSPORT_PUSH_PORCELAIN               (1<<4)
+#define TRANSPORT_PUSH_SET_UPSTREAM            (1<<5)
+#define TRANSPORT_RECURSE_SUBMODULES_CHECK     (1<<6)
+#define TRANSPORT_PUSH_PRUNE                   (1<<7)
+#define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND (1<<8)
+#define TRANSPORT_PUSH_NO_HOOK                 (1<<9)
+#define TRANSPORT_PUSH_FOLLOW_TAGS             (1<<10)
+#define TRANSPORT_PUSH_CERT_ALWAYS             (1<<11)
+#define TRANSPORT_PUSH_CERT_IF_ASKED           (1<<12)
+#define TRANSPORT_PUSH_ATOMIC                  (1<<13)
+#define TRANSPORT_PUSH_OPTIONS                 (1<<14)
+#define TRANSPORT_RECURSE_SUBMODULES_ONLY      (1<<15)
+
+extern int transport_summary_width(const struct ref *refs);
 
 /* Returns a transport suitable for the url */
 struct transport *transport_get(struct remote *, const char *);
 
 /*
- * Check whether a transport is allowed by the environment. Type should
- * generally be the URL scheme, as described in Documentation/git.txt
+ * Check whether a transport is allowed by the environment.
+ *
+ * Type should generally be the URL scheme, as described in
+ * Documentation/git.txt
+ *
+ * from_user specifies if the transport was given by the user.  If unknown pass
+ * a -1 to read from the environment to determine if the transport was given by
+ * the user.
+ *
  */
-int is_transport_allowed(const char *type);
+int is_transport_allowed(const char *type, int from_user);
 
 /*
  * Check whether a transport is allowed by the environment,
@@ -160,12 +172,6 @@ int is_transport_allowed(const char *type);
  */
 void transport_check_allowed(const char *type);
 
-/*
- * Returns true if the user has attempted to turn on protocol
- * restrictions at all.
- */
-int transport_restrict_protocols(void);
-
 /* Transport options which apply to git:// and scp-style URLs */
 
 /* The program to use on the remote side to send a pack */
@@ -186,6 +192,15 @@ int transport_restrict_protocols(void);
 /* Limit the depth of the fetch if not null */
 #define TRANS_OPT_DEPTH "depth"
 
+/* Limit the depth of the fetch based on time if not null */
+#define TRANS_OPT_DEEPEN_SINCE "deepen-since"
+
+/* Limit the depth of the fetch based on revs if not null */
+#define TRANS_OPT_DEEPEN_NOT "deepen-not"
+
+/* Limit the deepen of the fetch if not null */
+#define TRANS_OPT_DEEPEN_RELATIVE "deepen-relative"
+
 /* Aggressively fetch annotated tags if possible */
 #define TRANS_OPT_FOLLOWTAGS "followtags"
 
@@ -240,6 +255,6 @@ int transport_refs_pushed(struct ref *ref);
 void transport_print_push_status(const char *dest, struct ref *refs,
                  int verbose, int porcelain, unsigned int *reject_reasons);
 
-typedef void alternate_ref_fn(const struct ref *, void *);
+typedef void alternate_ref_fn(const char *refname, const struct object_id *oid, void *);
 extern void for_each_alternate_ref(alternate_ref_fn, void *);
 #endif
index ce278424391b03d1d4e41eb3fc14750f70908fe5..6a42e402b00a3da90a008adf6e4c68dc8c45e516 100644 (file)
@@ -22,31 +22,60 @@ static const char *get_mode(const char *str, unsigned int *modep)
        return str;
 }
 
-static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned long size)
+static int decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned long size, struct strbuf *err)
 {
        const char *path;
        unsigned int mode, len;
 
-       if (size < 24 || buf[size - 21])
-               die("corrupt tree file");
+       if (size < 23 || buf[size - 21]) {
+               strbuf_addstr(err, _("too-short tree object"));
+               return -1;
+       }
 
        path = get_mode(buf, &mode);
-       if (!path || !*path)
-               die("corrupt tree file");
+       if (!path) {
+               strbuf_addstr(err, _("malformed mode in tree entry"));
+               return -1;
+       }
+       if (!*path) {
+               strbuf_addstr(err, _("empty filename in tree entry"));
+               return -1;
+       }
        len = strlen(path) + 1;
 
        /* Initialize the descriptor entry */
        desc->entry.path = path;
        desc->entry.mode = canon_mode(mode);
        desc->entry.oid  = (const struct object_id *)(path + len);
+
+       return 0;
 }
 
-void init_tree_desc(struct tree_desc *desc, const void *buffer, unsigned long size)
+static int init_tree_desc_internal(struct tree_desc *desc, const void *buffer, unsigned long size, struct strbuf *err)
 {
        desc->buffer = buffer;
        desc->size = size;
        if (size)
-               decode_tree_entry(desc, buffer, size);
+               return decode_tree_entry(desc, buffer, size, err);
+       return 0;
+}
+
+void init_tree_desc(struct tree_desc *desc, const void *buffer, unsigned long size)
+{
+       struct strbuf err = STRBUF_INIT;
+       if (init_tree_desc_internal(desc, buffer, size, &err))
+               die("%s", err.buf);
+       strbuf_release(&err);
+}
+
+int init_tree_desc_gently(struct tree_desc *desc, const void *buffer, unsigned long size)
+{
+       struct strbuf err = STRBUF_INIT;
+       int result = init_tree_desc_internal(desc, buffer, size, &err);
+       if (result)
+               error("%s", err.buf);
+       strbuf_release(&err);
+       return result;
 }
 
 void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1)
@@ -73,7 +102,7 @@ static void entry_extract(struct tree_desc *t, struct name_entry *a)
        *a = t->entry;
 }
 
-void update_tree_entry(struct tree_desc *desc)
+static int update_tree_entry_internal(struct tree_desc *desc, struct strbuf *err)
 {
        const void *buf = desc->buffer;
        const unsigned char *end = desc->entry.oid->hash + 20;
@@ -81,13 +110,36 @@ void update_tree_entry(struct tree_desc *desc)
        unsigned long len = end - (const unsigned char *)buf;
 
        if (size < len)
-               die("corrupt tree file");
+               die(_("too-short tree file"));
        buf = end;
        size -= len;
        desc->buffer = buf;
        desc->size = size;
        if (size)
-               decode_tree_entry(desc, buf, size);
+               return decode_tree_entry(desc, buf, size, err);
+       return 0;
+}
+
+void update_tree_entry(struct tree_desc *desc)
+{
+       struct strbuf err = STRBUF_INIT;
+       if (update_tree_entry_internal(desc, &err))
+               die("%s", err.buf);
+       strbuf_release(&err);
+}
+
+int update_tree_entry_gently(struct tree_desc *desc)
+{
+       struct strbuf err = STRBUF_INIT;
+       if (update_tree_entry_internal(desc, &err)) {
+               error("%s", err.buf);
+               strbuf_release(&err);
+               /* Stop processing this tree after error */
+               desc->size = 0;
+               return -1;
+       }
+       strbuf_release(&err);
+       return 0;
 }
 
 int tree_entry(struct tree_desc *desc, struct name_entry *entry)
@@ -100,6 +152,17 @@ int tree_entry(struct tree_desc *desc, struct name_entry *entry)
        return 1;
 }
 
+int tree_entry_gently(struct tree_desc *desc, struct name_entry *entry)
+{
+       if (!desc->size)
+               return 0;
+
+       *entry = desc->entry;
+       if (update_tree_entry_gently(desc))
+               return 0;
+       return 1;
+}
+
 void setup_traverse_info(struct traverse_info *info, const char *base)
 {
        int pathlen = strlen(base);
@@ -526,7 +589,6 @@ enum follow_symlinks_result get_tree_entry_follow_symlinks(unsigned char *tree_s
        int i;
 
        init_tree_desc(&t, NULL, 0UL);
-       strbuf_init(result_path, 0);
        strbuf_addstr(&namebuf, name);
        hashcpy(current_tree_sha1, tree_sha1);
 
@@ -941,6 +1003,19 @@ static enum interesting do_match(const struct name_entry *entry,
                                 */
                                if (ps->recursive && S_ISDIR(entry->mode))
                                        return entry_interesting;
+
+                               /*
+                                * When matching against submodules with
+                                * wildcard characters, ensure that the entry
+                                * at least matches up to the first wild
+                                * character.  More accurate matching can then
+                                * be performed in the submodule itself.
+                                */
+                               if (ps->recursive && S_ISGITLINK(entry->mode) &&
+                                   !ps_strncmp(item, match + baselen,
+                                               entry->path,
+                                               item->nowildcard_len - baselen))
+                                       return entry_interesting;
                        }
 
                        continue;
@@ -977,6 +1052,21 @@ match_wildcards:
                        strbuf_setlen(base, base_offset + baselen);
                        return entry_interesting;
                }
+
+               /*
+                * When matching against submodules with
+                * wildcard characters, ensure that the entry
+                * at least matches up to the first wild
+                * character.  More accurate matching can then
+                * be performed in the submodule itself.
+                */
+               if (ps->recursive && S_ISGITLINK(entry->mode) &&
+                   !ps_strncmp(item, match, base->buf + base_offset,
+                               item->nowildcard_len)) {
+                       strbuf_setlen(base, base_offset + baselen);
+                       return entry_interesting;
+               }
+
                strbuf_setlen(base, base_offset + baselen);
 
                /*
@@ -984,7 +1074,7 @@ match_wildcards:
                 * later on.
                 * max_depth is ignored but we may consider support it
                 * in future, see
-                * http://thread.gmane.org/gmane.comp.version-control.git/163757/focus=163840
+                * https://public-inbox.org/git/7vmxo5l2g4.fsf@alter.siamese.dyndns.org/
                 */
                if (ps->recursive && S_ISDIR(entry->mode))
                        return entry_interesting;
index 97a7d6957e002e854d3b93831902776c994b6208..68bb78b928b5059202e5672f445fd5d6e22f9921 100644 (file)
@@ -25,14 +25,22 @@ static inline int tree_entry_len(const struct name_entry *ne)
        return (const char *)ne->oid - ne->path - 1;
 }
 
+/*
+ * The _gently versions of these functions warn and return false on a
+ * corrupt tree entry rather than dying,
+ */
+
 void update_tree_entry(struct tree_desc *);
+int update_tree_entry_gently(struct tree_desc *);
 void init_tree_desc(struct tree_desc *desc, const void *buf, unsigned long size);
+int init_tree_desc_gently(struct tree_desc *desc, const void *buf, unsigned long size);
 
 /*
  * Helper function that does both tree_entry_extract() and update_tree_entry()
  * and returns true for success
  */
 int tree_entry(struct tree_desc *, struct name_entry *);
+int tree_entry_gently(struct tree_desc *, struct name_entry *);
 
 void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1);
 
diff --git a/tree.c b/tree.c
index 0089e52d9dff41bece11056e92625b923515c462..ce345c551117215882062f99c931b2182a63931a 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -26,7 +26,7 @@ static int read_one_entry_opt(const unsigned char *sha1, const char *base, int b
        ce->ce_namelen = baselen + len;
        memcpy(ce->name, base, baselen);
        memcpy(ce->name + baselen, pathname, len+1);
-       hashcpy(ce->sha1, sha1);
+       hashcpy(ce->oid.hash, sha1);
        return add_cache_entry(ce, opt);
 }
 
@@ -180,8 +180,7 @@ int read_tree(struct tree *tree, int stage, struct pathspec *match)
         * Sort the cache entry -- we need to nuke the cache tree, though.
         */
        cache_tree_free(&active_cache_tree);
-       qsort(active_cache, active_nr, sizeof(active_cache[0]),
-             cmp_cache_name_compare);
+       QSORT(active_cache, active_nr, cmp_cache_name_compare);
        return 0;
 }
 
index 47cdd2369d1919b7b7b267c622ad31e2ad6f24c0..02207be4fc47537168d1b1a7d1455af7e4c0df60 100644 (file)
@@ -25,7 +25,7 @@ static const struct interval zero_width[] = {
 { 0x0825, 0x0827 },
 { 0x0829, 0x082D },
 { 0x0859, 0x085B },
-{ 0x08E4, 0x0902 },
+{ 0x08D4, 0x0902 },
 { 0x093A, 0x093A },
 { 0x093C, 0x093C },
 { 0x0941, 0x0948 },
@@ -120,6 +120,7 @@ static const struct interval zero_width[] = {
 { 0x17C9, 0x17D3 },
 { 0x17DD, 0x17DD },
 { 0x180B, 0x180E },
+{ 0x1885, 0x1886 },
 { 0x18A9, 0x18A9 },
 { 0x1920, 0x1922 },
 { 0x1927, 0x1928 },
@@ -158,7 +159,7 @@ static const struct interval zero_width[] = {
 { 0x1CF4, 0x1CF4 },
 { 0x1CF8, 0x1CF9 },
 { 0x1DC0, 0x1DF5 },
-{ 0x1DFC, 0x1DFF },
+{ 0x1DFB, 0x1DFF },
 { 0x200B, 0x200F },
 { 0x202A, 0x202E },
 { 0x2060, 0x2064 },
@@ -171,13 +172,13 @@ static const struct interval zero_width[] = {
 { 0x3099, 0x309A },
 { 0xA66F, 0xA672 },
 { 0xA674, 0xA67D },
-{ 0xA69F, 0xA69F },
+{ 0xA69E, 0xA69F },
 { 0xA6F0, 0xA6F1 },
 { 0xA802, 0xA802 },
 { 0xA806, 0xA806 },
 { 0xA80B, 0xA80B },
 { 0xA825, 0xA826 },
-{ 0xA8C4, 0xA8C4 },
+{ 0xA8C4, 0xA8C5 },
 { 0xA8E0, 0xA8F1 },
 { 0xA926, 0xA92D },
 { 0xA947, 0xA951 },
@@ -204,7 +205,7 @@ static const struct interval zero_width[] = {
 { 0xABED, 0xABED },
 { 0xFB1E, 0xFB1E },
 { 0xFE00, 0xFE0F },
-{ 0xFE20, 0xFE2D },
+{ 0xFE20, 0xFE2F },
 { 0xFEFF, 0xFEFF },
 { 0xFFF9, 0xFFFB },
 { 0x101FD, 0x101FD },
@@ -228,16 +229,21 @@ static const struct interval zero_width[] = {
 { 0x11173, 0x11173 },
 { 0x11180, 0x11181 },
 { 0x111B6, 0x111BE },
+{ 0x111CA, 0x111CC },
 { 0x1122F, 0x11231 },
 { 0x11234, 0x11234 },
 { 0x11236, 0x11237 },
+{ 0x1123E, 0x1123E },
 { 0x112DF, 0x112DF },
 { 0x112E3, 0x112EA },
-{ 0x11301, 0x11301 },
+{ 0x11300, 0x11301 },
 { 0x1133C, 0x1133C },
 { 0x11340, 0x11340 },
 { 0x11366, 0x1136C },
 { 0x11370, 0x11374 },
+{ 0x11438, 0x1143F },
+{ 0x11442, 0x11444 },
+{ 0x11446, 0x11446 },
 { 0x114B3, 0x114B8 },
 { 0x114BA, 0x114BA },
 { 0x114BF, 0x114C0 },
@@ -245,6 +251,7 @@ static const struct interval zero_width[] = {
 { 0x115B2, 0x115B5 },
 { 0x115BC, 0x115BD },
 { 0x115BF, 0x115C0 },
+{ 0x115DC, 0x115DD },
 { 0x11633, 0x1163A },
 { 0x1163D, 0x1163D },
 { 0x1163F, 0x11640 },
@@ -252,6 +259,16 @@ static const struct interval zero_width[] = {
 { 0x116AD, 0x116AD },
 { 0x116B0, 0x116B5 },
 { 0x116B7, 0x116B7 },
+{ 0x1171D, 0x1171F },
+{ 0x11722, 0x11725 },
+{ 0x11727, 0x1172B },
+{ 0x11C30, 0x11C36 },
+{ 0x11C38, 0x11C3D },
+{ 0x11C3F, 0x11C3F },
+{ 0x11C92, 0x11CA7 },
+{ 0x11CAA, 0x11CB0 },
+{ 0x11CB2, 0x11CB3 },
+{ 0x11CB5, 0x11CB6 },
 { 0x16AF0, 0x16AF4 },
 { 0x16B30, 0x16B36 },
 { 0x16F8F, 0x16F92 },
@@ -262,31 +279,59 @@ static const struct interval zero_width[] = {
 { 0x1D185, 0x1D18B },
 { 0x1D1AA, 0x1D1AD },
 { 0x1D242, 0x1D244 },
+{ 0x1DA00, 0x1DA36 },
+{ 0x1DA3B, 0x1DA6C },
+{ 0x1DA75, 0x1DA75 },
+{ 0x1DA84, 0x1DA84 },
+{ 0x1DA9B, 0x1DA9F },
+{ 0x1DAA1, 0x1DAAF },
+{ 0x1E000, 0x1E006 },
+{ 0x1E008, 0x1E018 },
+{ 0x1E01B, 0x1E021 },
+{ 0x1E023, 0x1E024 },
+{ 0x1E026, 0x1E02A },
 { 0x1E8D0, 0x1E8D6 },
+{ 0x1E944, 0x1E94A },
 { 0xE0001, 0xE0001 },
 { 0xE0020, 0xE007F },
 { 0xE0100, 0xE01EF }
 };
 static const struct interval double_width[] = {
-{ /* plane */ 0x0, 0x1C },
-{ /* plane */ 0x1C, 0x21 },
-{ /* plane */ 0x21, 0x22 },
-{ /* plane */ 0x22, 0x23 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
-{ /* plane */ 0x0, 0x0 },
 { 0x1100, 0x115F },
+{ 0x231A, 0x231B },
 { 0x2329, 0x232A },
+{ 0x23E9, 0x23EC },
+{ 0x23F0, 0x23F0 },
+{ 0x23F3, 0x23F3 },
+{ 0x25FD, 0x25FE },
+{ 0x2614, 0x2615 },
+{ 0x2648, 0x2653 },
+{ 0x267F, 0x267F },
+{ 0x2693, 0x2693 },
+{ 0x26A1, 0x26A1 },
+{ 0x26AA, 0x26AB },
+{ 0x26BD, 0x26BE },
+{ 0x26C4, 0x26C5 },
+{ 0x26CE, 0x26CE },
+{ 0x26D4, 0x26D4 },
+{ 0x26EA, 0x26EA },
+{ 0x26F2, 0x26F3 },
+{ 0x26F5, 0x26F5 },
+{ 0x26FA, 0x26FA },
+{ 0x26FD, 0x26FD },
+{ 0x2705, 0x2705 },
+{ 0x270A, 0x270B },
+{ 0x2728, 0x2728 },
+{ 0x274C, 0x274C },
+{ 0x274E, 0x274E },
+{ 0x2753, 0x2755 },
+{ 0x2757, 0x2757 },
+{ 0x2795, 0x2797 },
+{ 0x27B0, 0x27B0 },
+{ 0x27BF, 0x27BF },
+{ 0x2B1B, 0x2B1C },
+{ 0x2B50, 0x2B50 },
+{ 0x2B55, 0x2B55 },
 { 0x2E80, 0x2E99 },
 { 0x2E9B, 0x2EF3 },
 { 0x2F00, 0x2FD5 },
@@ -313,11 +358,49 @@ static const struct interval double_width[] = {
 { 0xFE68, 0xFE6B },
 { 0xFF01, 0xFF60 },
 { 0xFFE0, 0xFFE6 },
+{ 0x16FE0, 0x16FE0 },
+{ 0x17000, 0x187EC },
+{ 0x18800, 0x18AF2 },
 { 0x1B000, 0x1B001 },
+{ 0x1F004, 0x1F004 },
+{ 0x1F0CF, 0x1F0CF },
+{ 0x1F18E, 0x1F18E },
+{ 0x1F191, 0x1F19A },
 { 0x1F200, 0x1F202 },
-{ 0x1F210, 0x1F23A },
+{ 0x1F210, 0x1F23B },
 { 0x1F240, 0x1F248 },
 { 0x1F250, 0x1F251 },
+{ 0x1F300, 0x1F320 },
+{ 0x1F32D, 0x1F335 },
+{ 0x1F337, 0x1F37C },
+{ 0x1F37E, 0x1F393 },
+{ 0x1F3A0, 0x1F3CA },
+{ 0x1F3CF, 0x1F3D3 },
+{ 0x1F3E0, 0x1F3F0 },
+{ 0x1F3F4, 0x1F3F4 },
+{ 0x1F3F8, 0x1F43E },
+{ 0x1F440, 0x1F440 },
+{ 0x1F442, 0x1F4FC },
+{ 0x1F4FF, 0x1F53D },
+{ 0x1F54B, 0x1F54E },
+{ 0x1F550, 0x1F567 },
+{ 0x1F57A, 0x1F57A },
+{ 0x1F595, 0x1F596 },
+{ 0x1F5A4, 0x1F5A4 },
+{ 0x1F5FB, 0x1F64F },
+{ 0x1F680, 0x1F6C5 },
+{ 0x1F6CC, 0x1F6CC },
+{ 0x1F6D0, 0x1F6D2 },
+{ 0x1F6EB, 0x1F6EC },
+{ 0x1F6F4, 0x1F6F6 },
+{ 0x1F910, 0x1F91E },
+{ 0x1F920, 0x1F927 },
+{ 0x1F930, 0x1F930 },
+{ 0x1F933, 0x1F93E },
+{ 0x1F940, 0x1F94B },
+{ 0x1F950, 0x1F95E },
+{ 0x1F980, 0x1F991 },
+{ 0x1F9C0, 0x1F9C0 },
 { 0x20000, 0x2FFFD },
 { 0x30000, 0x3FFFD }
 };
index 2a963f9a7f6e1487fb717c4422c835590ba5de14..aa15111fefc8ca333edeeeb3ac77a8b946e4c6a5 100644 (file)
@@ -10,6 +10,8 @@
 #include "attr.h"
 #include "split-index.h"
 #include "dir.h"
+#include "submodule.h"
+#include "submodule-config.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -45,6 +47,9 @@ static const char *unpack_plumbing_errors[NB_UNPACK_TREES_ERROR_TYPES] = {
 
        /* ERROR_WOULD_LOSE_ORPHANED_REMOVED */
        "Working tree file '%s' would be removed by sparse checkout update.",
+
+       /* ERROR_WOULD_LOSE_SUBMODULE */
+       "Submodule '%s' cannot checkout new HEAD.",
 };
 
 #define ERRORMSG(o,type) \
@@ -52,6 +57,41 @@ static const char *unpack_plumbing_errors[NB_UNPACK_TREES_ERROR_TYPES] = {
          ? ((o)->msgs[(type)])      \
          : (unpack_plumbing_errors[(type)]) )
 
+static const char *super_prefixed(const char *path)
+{
+       /*
+        * It is necessary and sufficient to have two static buffers
+        * here, as the return value of this function is fed to
+        * error() using the unpack_*_errors[] templates we see above.
+        */
+       static struct strbuf buf[2] = {STRBUF_INIT, STRBUF_INIT};
+       static int super_prefix_len = -1;
+       static unsigned idx = ARRAY_SIZE(buf) - 1;
+
+       if (super_prefix_len < 0) {
+               const char *super_prefix = get_super_prefix();
+               if (!super_prefix) {
+                       super_prefix_len = 0;
+               } else {
+                       int i;
+                       for (i = 0; i < ARRAY_SIZE(buf); i++)
+                               strbuf_addstr(&buf[i], super_prefix);
+                       super_prefix_len = buf[0].len;
+               }
+       }
+
+       if (!super_prefix_len)
+               return path;
+
+       if (++idx >= ARRAY_SIZE(buf))
+               idx = 0;
+
+       strbuf_setlen(&buf[idx], super_prefix_len);
+       strbuf_addstr(&buf[idx], path);
+
+       return buf[idx].buf;
+}
+
 void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                                  const char *cmd)
 {
@@ -78,7 +118,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                xstrfmt(msg, cmd, cmd);
 
        msgs[ERROR_NOT_UPTODATE_DIR] =
-               _("Updating the following directories would lose untracked files in it:\n%s");
+               _("Updating the following directories would lose untracked files in them:\n%s");
 
        if (!strcmp(cmd, "checkout"))
                msg = advice_commit_before_merge
@@ -126,6 +166,8 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
                _("The following working tree files would be overwritten by sparse checkout update:\n%s");
        msgs[ERROR_WOULD_LOSE_ORPHANED_REMOVED] =
                _("The following working tree files would be removed by sparse checkout update:\n%s");
+       msgs[ERROR_WOULD_LOSE_SUBMODULE] =
+               _("Cannot update submodule:\n%s");
 
        opts->show_all_errors = 1;
        /* rejected paths may not have a static buffer */
@@ -172,7 +214,7 @@ static int add_rejected_path(struct unpack_trees_options *o,
                             const char *path)
 {
        if (!o->show_all_errors)
-               return error(ERRORMSG(o, e), path);
+               return error(ERRORMSG(o, e), super_prefixed(path));
 
        /*
         * Otherwise, insert in a list for future display by
@@ -196,7 +238,7 @@ static void display_error_msgs(struct unpack_trees_options *o)
                        something_displayed = 1;
                        for (i = 0; i < rejects->nr; i++)
                                strbuf_addf(&path, "\t%s\n", rejects->items[i].string);
-                       error(ERRORMSG(o, e), path.buf);
+                       error(ERRORMSG(o, e), super_prefixed(path.buf));
                        strbuf_release(&path);
                }
                string_list_clear(rejects, 0);
@@ -205,12 +247,75 @@ static void display_error_msgs(struct unpack_trees_options *o)
                fprintf(stderr, _("Aborting\n"));
 }
 
+static int check_submodule_move_head(const struct cache_entry *ce,
+                                    const char *old_id,
+                                    const char *new_id,
+                                    struct unpack_trees_options *o)
+{
+       const struct submodule *sub = submodule_from_ce(ce);
+       if (!sub)
+               return 0;
+
+       switch (sub->update_strategy.type) {
+       case SM_UPDATE_UNSPECIFIED:
+       case SM_UPDATE_CHECKOUT:
+               if (submodule_move_head(ce->name, old_id, new_id, SUBMODULE_MOVE_HEAD_DRY_RUN))
+                       return o->gently ? -1 :
+                               add_rejected_path(o, ERROR_WOULD_LOSE_SUBMODULE, ce->name);
+               return 0;
+       case SM_UPDATE_NONE:
+               return 0;
+       case SM_UPDATE_REBASE:
+       case SM_UPDATE_MERGE:
+       case SM_UPDATE_COMMAND:
+       default:
+               warning(_("submodule update strategy not supported for submodule '%s'"), ce->name);
+               return -1;
+       }
+}
+
+static void reload_gitmodules_file(struct index_state *index,
+                                  struct checkout *state)
+{
+       int i;
+       for (i = 0; i < index->cache_nr; i++) {
+               struct cache_entry *ce = index->cache[i];
+               if (ce->ce_flags & CE_UPDATE) {
+                       int r = strcmp(ce->name, ".gitmodules");
+                       if (r < 0)
+                               continue;
+                       else if (r == 0) {
+                               submodule_free();
+                               checkout_entry(ce, state, NULL);
+                               gitmodules_config();
+                               git_config(submodule_config, NULL);
+                       } else
+                               break;
+               }
+       }
+}
+
 /*
  * Unlink the last component and schedule the leading directories for
  * removal, such that empty directories get removed.
  */
 static void unlink_entry(const struct cache_entry *ce)
 {
+       const struct submodule *sub = submodule_from_ce(ce);
+       if (sub) {
+               switch (sub->update_strategy.type) {
+               case SM_UPDATE_UNSPECIFIED:
+               case SM_UPDATE_CHECKOUT:
+               case SM_UPDATE_REBASE:
+               case SM_UPDATE_MERGE:
+                       submodule_move_head(ce->name, "HEAD", NULL,
+                                           SUBMODULE_MOVE_HEAD_FORCE);
+                       break;
+               case SM_UPDATE_NONE:
+               case SM_UPDATE_COMMAND:
+                       return; /* Do not touch the submodule. */
+               }
+       }
        if (!check_leading_path(ce->name, ce_namelen(ce)))
                return;
        if (remove_or_warn(ce->ce_mode, ce->name))
@@ -218,29 +323,42 @@ static void unlink_entry(const struct cache_entry *ce)
        schedule_dir_for_removal(ce->name, ce_namelen(ce));
 }
 
-static int check_updates(struct unpack_trees_options *o,
-                        const struct checkout *state)
+static struct progress *get_progress(struct unpack_trees_options *o)
 {
        unsigned cnt = 0, total = 0;
+       struct index_state *index = &o->result;
+
+       if (!o->update || !o->verbose_update)
+               return NULL;
+
+       for (; cnt < index->cache_nr; cnt++) {
+               const struct cache_entry *ce = index->cache[cnt];
+               if (ce->ce_flags & (CE_UPDATE | CE_WT_REMOVE))
+                       total++;
+       }
+
+       return start_progress_delay(_("Checking out files"),
+                                   total, 50, 1);
+}
+
+static int check_updates(struct unpack_trees_options *o)
+{
+       unsigned cnt = 0;
+       int errs = 0;
        struct progress *progress = NULL;
        struct index_state *index = &o->result;
+       struct checkout state = CHECKOUT_INIT;
        int i;
-       int errs = 0;
 
-       if (o->update && o->verbose_update) {
-               for (total = cnt = 0; cnt < index->cache_nr; cnt++) {
-                       const struct cache_entry *ce = index->cache[cnt];
-                       if (ce->ce_flags & (CE_UPDATE | CE_WT_REMOVE))
-                               total++;
-               }
+       state.force = 1;
+       state.quiet = 1;
+       state.refresh_cache = 1;
+       state.istate = index;
 
-               progress = start_progress_delay(_("Checking out files"),
-                                               total, 50, 1);
-               cnt = 0;
-       }
+       progress = get_progress(o);
 
        if (o->update)
-               git_attr_set_direction(GIT_ATTR_CHECKOUT, &o->result);
+               git_attr_set_direction(GIT_ATTR_CHECKOUT, index);
        for (i = 0; i < index->cache_nr; i++) {
                const struct cache_entry *ce = index->cache[i];
 
@@ -248,12 +366,14 @@ static int check_updates(struct unpack_trees_options *o,
                        display_progress(progress, ++cnt);
                        if (o->update && !o->dry_run)
                                unlink_entry(ce);
-                       continue;
                }
        }
-       remove_marked_cache_entries(&o->result);
+       remove_marked_cache_entries(index);
        remove_scheduled_dirs();
 
+       if (should_update_submodules() && o->update && !o->dry_run)
+               reload_gitmodules_file(index, &state);
+
        for (i = 0; i < index->cache_nr; i++) {
                struct cache_entry *ce = index->cache[i];
 
@@ -264,7 +384,7 @@ static int check_updates(struct unpack_trees_options *o,
                        display_progress(progress, ++cnt);
                        ce->ce_flags &= ~CE_UPDATE;
                        if (o->update && !o->dry_run) {
-                               errs |= checkout_entry(ce, state, NULL);
+                               errs |= checkout_entry(ce, &state, NULL);
                        }
                }
        }
@@ -484,12 +604,18 @@ static int switch_cache_bottom(struct traverse_info *info)
        return ret;
 }
 
+static inline int are_same_oid(struct name_entry *name_j, struct name_entry *name_k)
+{
+       return name_j->oid && name_k->oid && !oidcmp(name_j->oid, name_k->oid);
+}
+
 static int traverse_trees_recursive(int n, unsigned long dirmask,
                                    unsigned long df_conflicts,
                                    struct name_entry *names,
                                    struct traverse_info *info)
 {
        int i, ret, bottom;
+       int nr_buf = 0;
        struct tree_desc t[MAX_UNPACK_TREES];
        void *buf[MAX_UNPACK_TREES];
        struct traverse_info newinfo;
@@ -506,18 +632,40 @@ static int traverse_trees_recursive(int n, unsigned long dirmask,
        newinfo.pathlen += tree_entry_len(p) + 1;
        newinfo.df_conflicts |= df_conflicts;
 
+       /*
+        * Fetch the tree from the ODB for each peer directory in the
+        * n commits.
+        *
+        * For 2- and 3-way traversals, we try to avoid hitting the
+        * ODB twice for the same OID.  This should yield a nice speed
+        * up in checkouts and merges when the commits are similar.
+        *
+        * We don't bother doing the full O(n^2) search for larger n,
+        * because wider traversals don't happen that often and we
+        * avoid the search setup.
+        *
+        * When 2 peer OIDs are the same, we just copy the tree
+        * descriptor data.  This implicitly borrows the buffer
+        * data from the earlier cell.
+        */
        for (i = 0; i < n; i++, dirmask >>= 1) {
-               const unsigned char *sha1 = NULL;
-               if (dirmask & 1)
-                       sha1 = names[i].oid->hash;
-               buf[i] = fill_tree_descriptor(t+i, sha1);
+               if (i > 0 && are_same_oid(&names[i], &names[i - 1]))
+                       t[i] = t[i - 1];
+               else if (i > 1 && are_same_oid(&names[i], &names[i - 2]))
+                       t[i] = t[i - 2];
+               else {
+                       const unsigned char *sha1 = NULL;
+                       if (dirmask & 1)
+                               sha1 = names[i].oid->hash;
+                       buf[nr_buf++] = fill_tree_descriptor(t+i, sha1);
+               }
        }
 
        bottom = switch_cache_bottom(&newinfo);
        ret = traverse_trees(n, t, &newinfo);
        restore_cache_bottom(&newinfo, bottom);
 
-       for (i = 0; i < n; i++)
+       for (i = 0; i < nr_buf; i++)
                free(buf[i]);
 
        return ret;
@@ -625,7 +773,7 @@ static struct cache_entry *create_ce_entry(const struct traverse_info *info, con
        ce->ce_mode = create_ce_mode(n->mode);
        ce->ce_flags = create_ce_flags(stage);
        ce->ce_namelen = len;
-       hashcpy(ce->sha1, n->oid->hash);
+       oidcpy(&ce->oid, n->oid);
        make_traverse_path(ce->name, info, n);
 
        return ce;
@@ -1094,16 +1242,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        int i, ret;
        static struct cache_entry *dfc;
        struct exclude_list el;
-       struct checkout state;
 
        if (len > MAX_UNPACK_TREES)
                die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
-       memset(&state, 0, sizeof(state));
-       state.base_dir = "";
-       state.force = 1;
-       state.quiet = 1;
-       state.refresh_cache = 1;
-       state.istate = &o->result;
 
        memset(&el, 0, sizeof(el));
        if (!core_apply_sparse_checkout || !o->update)
@@ -1240,7 +1381,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        }
 
        o->src_index = NULL;
-       ret = check_updates(o, &state) ? (-2) : 0;
+       ret = check_updates(o) ? (-2) : 0;
        if (o->dst_index) {
                if (!ret) {
                        if (!o->result.cache_tree)
@@ -1288,7 +1429,7 @@ static int same(const struct cache_entry *a, const struct cache_entry *b)
        if ((a->ce_flags | b->ce_flags) & CE_CONFLICTED)
                return 0;
        return a->ce_mode == b->ce_mode &&
-              !hashcmp(a->sha1, b->sha1);
+              !oidcmp(&a->oid, &b->oid);
 }
 
 
@@ -1318,17 +1459,26 @@ static int verify_uptodate_1(const struct cache_entry *ce,
        if (!lstat(ce->name, &st)) {
                int flags = CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE;
                unsigned changed = ie_match_stat(o->src_index, ce, &st, flags);
+
+               if (submodule_from_ce(ce)) {
+                       int r = check_submodule_move_head(ce,
+                               "HEAD", oid_to_hex(&ce->oid), o);
+                       if (r)
+                               return o->gently ? -1 :
+                                       add_rejected_path(o, error_type, ce->name);
+                       return 0;
+               }
+
                if (!changed)
                        return 0;
                /*
-                * NEEDSWORK: the current default policy is to allow
-                * submodule to be out of sync wrt the superproject
-                * index.  This needs to be tightened later for
-                * submodules that are marked to be automatically
-                * checked out.
+                * Historic default policy was to allow submodule to be out
+                * of sync wrt the superproject index. If the submodule was
+                * not considered interesting above, we don't care here.
                 */
                if (S_ISGITLINK(ce->ce_mode))
                        return 0;
+
                errno = 0;
        }
        if (errno == ENOENT)
@@ -1367,11 +1517,16 @@ static void invalidate_ce_path(const struct cache_entry *ce,
  * Currently, git does not checkout subprojects during a superproject
  * checkout, so it is not going to overwrite anything.
  */
-static int verify_clean_submodule(const struct cache_entry *ce,
+static int verify_clean_submodule(const char *old_sha1,
+                                 const struct cache_entry *ce,
                                  enum unpack_trees_error_types error_type,
                                  struct unpack_trees_options *o)
 {
-       return 0;
+       if (!submodule_from_ce(ce))
+               return 0;
+
+       return check_submodule_move_head(ce, old_sha1,
+                                        oid_to_hex(&ce->oid), o);
 }
 
 static int verify_clean_subdirectory(const struct cache_entry *ce,
@@ -1387,16 +1542,18 @@ static int verify_clean_subdirectory(const struct cache_entry *ce,
        struct dir_struct d;
        char *pathbuf;
        int cnt = 0;
-       unsigned char sha1[20];
 
-       if (S_ISGITLINK(ce->ce_mode) &&
-           resolve_gitlink_ref(ce->name, "HEAD", sha1) == 0) {
-               /* If we are not going to update the submodule, then
+       if (S_ISGITLINK(ce->ce_mode)) {
+               unsigned char sha1[20];
+               int sub_head = resolve_gitlink_ref(ce->name, "HEAD", sha1);
+               /*
+                * If we are not going to update the submodule, then
                 * we don't care.
                 */
-               if (!hashcmp(sha1, ce->sha1))
+               if (!sub_head && !hashcmp(sha1, ce->oid.hash))
                        return 0;
-               return verify_clean_submodule(ce, error_type, o);
+               return verify_clean_submodule(sub_head ? NULL : sha1_to_hex(sha1),
+                                             ce, error_type, o);
        }
 
        /*
@@ -1535,9 +1692,15 @@ static int verify_absent_1(const struct cache_entry *ce,
                path = xmemdupz(ce->name, len);
                if (lstat(path, &st))
                        ret = error_errno("cannot stat '%s'", path);
-               else
-                       ret = check_ok_to_remove(path, len, DT_UNKNOWN, NULL,
-                                                &st, error_type, o);
+               else {
+                       if (submodule_from_ce(ce))
+                               ret = check_submodule_move_head(ce,
+                                                               oid_to_hex(&ce->oid),
+                                                               NULL, o);
+                       else
+                               ret = check_ok_to_remove(path, len, DT_UNKNOWN, NULL,
+                                                        &st, error_type, o);
+               }
                free(path);
                return ret;
        } else if (lstat(ce->name, &st)) {
@@ -1545,6 +1708,10 @@ static int verify_absent_1(const struct cache_entry *ce,
                        return error_errno("cannot stat '%s'", ce->name);
                return 0;
        } else {
+               if (submodule_from_ce(ce))
+                       return check_submodule_move_head(ce, oid_to_hex(&ce->oid),
+                                                        NULL, o);
+
                return check_ok_to_remove(ce->name, ce_namelen(ce),
                                          ce_to_dtype(ce), ce, &st,
                                          error_type, o);
@@ -1600,6 +1767,15 @@ static int merged_entry(const struct cache_entry *ce,
                        return -1;
                }
                invalidate_ce_path(merge, o);
+
+               if (submodule_from_ce(ce)) {
+                       int ret = check_submodule_move_head(ce, NULL,
+                                                           oid_to_hex(&ce->oid),
+                                                           o);
+                       if (ret)
+                               return ret;
+               }
+
        } else if (!(old->ce_flags & CE_CONFLICTED)) {
                /*
                 * See if we can re-use the old CE directly?
@@ -1620,6 +1796,14 @@ static int merged_entry(const struct cache_entry *ce,
                        update |= old->ce_flags & (CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE);
                        invalidate_ce_path(old, o);
                }
+
+               if (submodule_from_ce(ce)) {
+                       int ret = check_submodule_move_head(ce, oid_to_hex(&old->oid),
+                                                           oid_to_hex(&ce->oid),
+                                                           o);
+                       if (ret)
+                               return ret;
+               }
        } else {
                /*
                 * Previously unmerged entry left as an existence
@@ -1666,7 +1850,7 @@ static void show_stage_entry(FILE *o,
                fprintf(o, "%s%06o %s %d\t%s\n",
                        label,
                        ce->ce_mode,
-                       sha1_to_hex(ce->sha1),
+                       oid_to_hex(&ce->oid),
                        ce_stage(ce),
                        ce->name);
 }
@@ -1920,7 +2104,9 @@ int bind_merge(const struct cache_entry * const *src,
                             o->merge_size);
        if (a && old)
                return o->gently ? -1 :
-                       error(ERRORMSG(o, ERROR_BIND_OVERLAP), a->name, old->name);
+                       error(ERRORMSG(o, ERROR_BIND_OVERLAP),
+                             super_prefixed(a->name),
+                             super_prefixed(old->name));
        if (!a)
                return keep_entry(old, o);
        else
index 36a73a6d003b6906dfb402aa930b352f5b368c60..6c48117b845fbf7b983852be302e4472c5e6d651 100644 (file)
@@ -21,6 +21,7 @@ enum unpack_trees_error_types {
        ERROR_SPARSE_NOT_UPTODATE_FILE,
        ERROR_WOULD_LOSE_ORPHANED_OVERWRITTEN,
        ERROR_WOULD_LOSE_ORPHANED_REMOVED,
+       ERROR_WOULD_LOSE_SUBMODULE,
        NB_UNPACK_TREES_ERROR_TYPES
 };
 
diff --git a/update_unicode.sh b/update_unicode.sh
deleted file mode 100755 (executable)
index 27af77c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh
-#See http://www.unicode.org/reports/tr44/
-#
-#Me Enclosing_Mark  an enclosing combining mark
-#Mn Nonspacing_Mark a nonspacing combining mark (zero advance width)
-#Cf Format          a format control character
-#
-UNICODEWIDTH_H=../unicode_width.h
-if ! test -d unicode; then
-       mkdir unicode
-fi &&
-( cd unicode &&
-       if ! test -f UnicodeData.txt; then
-               wget http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
-       fi &&
-       if ! test -f EastAsianWidth.txt; then
-               wget http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt
-       fi &&
-       if ! test -d uniset; then
-               git clone https://github.com/depp/uniset.git
-       fi &&
-       (
-               cd uniset &&
-               if ! test -x uniset; then
-                       autoreconf -i &&
-                       ./configure --enable-warnings=-Werror CFLAGS='-O0 -ggdb'
-               fi &&
-               make
-       ) &&
-       UNICODE_DIR=. && export UNICODE_DIR &&
-       cat >$UNICODEWIDTH_H <<-EOF
-       static const struct interval zero_width[] = {
-               $(uniset/uniset --32 cat:Me,Mn,Cf + U+1160..U+11FF - U+00AD |
-                 grep -v plane)
-       };
-       static const struct interval double_width[] = {
-               $(uniset/uniset --32 eaw:F,W)
-       };
-       EOF
-)
index ca7f9417800bfb27a7dbc0559df8bec772c267fa..ffb028d6231e24877b5b6af616d0c3de59516d95 100644 (file)
@@ -15,6 +15,8 @@
 #include "version.h"
 #include "string-list.h"
 #include "parse-options.h"
+#include "argv-array.h"
+#include "prio-queue.h"
 
 static const char * const upload_pack_usage[] = {
        N_("git upload-pack [<options>] <dir>"),
@@ -35,6 +37,7 @@ static const char * const upload_pack_usage[] = {
 
 static unsigned long oldest_have;
 
+static int deepen_relative;
 static int multi_ack;
 static int no_done;
 static int use_thin_pack, use_ofs_delta, use_include_tag;
@@ -43,6 +46,8 @@ static int no_progress, daemon_mode;
 #define ALLOW_TIP_SHA1 01
 /* Allow request of a sha1 if it is reachable from a ref (possibly hidden ref). */
 #define ALLOW_REACHABLE_SHA1   02
+/* Allow request of any sha1. Implies ALLOW_TIP_SHA1 and ALLOW_REACHABLE_SHA1. */
+#define ALLOW_ANY_SHA1 07
 static unsigned int allow_unadvertised_object_request;
 static int shallow_nr;
 static struct object_array have_obj;
@@ -281,7 +286,7 @@ static void create_pack_file(void)
        die("git upload-pack: %s", abort_msg);
 }
 
-static int got_sha1(char *hex, unsigned char *sha1)
+static int got_sha1(const char *hex, unsigned char *sha1)
 {
        struct object *o;
        int we_knew_they_have = 0;
@@ -317,12 +322,12 @@ static int got_sha1(char *hex, unsigned char *sha1)
 
 static int reachable(struct commit *want)
 {
-       struct commit_list *work = NULL;
+       struct prio_queue work = { compare_commits_by_commit_date };
 
-       commit_list_insert_by_date(want, &work);
-       while (work) {
+       prio_queue_put(&work, want);
+       while (work.nr) {
                struct commit_list *list;
-               struct commit *commit = pop_commit(&work);
+               struct commit *commit = prio_queue_get(&work);
 
                if (commit->object.flags & THEY_HAVE) {
                        want->object.flags |= COMMON_KNOWN;
@@ -338,12 +343,12 @@ static int reachable(struct commit *want)
                for (list = commit->parents; list; list = list->next) {
                        struct commit *parent = list->item;
                        if (!(parent->object.flags & REACHABLE))
-                               commit_list_insert_by_date(parent, &work);
+                               prio_queue_put(&work, parent);
                }
        }
        want->object.flags |= REACHABLE;
        clear_commit_marks(want, REACHABLE);
-       free_commit_list(work);
+       clear_prio_queue(&work);
        return (want->object.flags & COMMON_KNOWN);
 }
 
@@ -387,19 +392,21 @@ static int get_common_commits(void)
 
        for (;;) {
                char *line = packet_read_line(0, NULL);
+               const char *arg;
+
                reset_timeout();
 
                if (!line) {
                        if (multi_ack == 2 && got_common
                            && !got_other && ok_to_give_up()) {
                                sent_ready = 1;
-                               packet_write(1, "ACK %s ready\n", last_hex);
+                               packet_write_fmt(1, "ACK %s ready\n", last_hex);
                        }
                        if (have_obj.nr == 0 || multi_ack)
-                               packet_write(1, "NAK\n");
+                               packet_write_fmt(1, "NAK\n");
 
                        if (no_done && sent_ready) {
-                               packet_write(1, "ACK %s\n", last_hex);
+                               packet_write_fmt(1, "ACK %s\n", last_hex);
                                return 0;
                        }
                        if (stateless_rpc)
@@ -408,28 +415,28 @@ static int get_common_commits(void)
                        got_other = 0;
                        continue;
                }
-               if (starts_with(line, "have ")) {
-                       switch (got_sha1(line+5, sha1)) {
+               if (skip_prefix(line, "have ", &arg)) {
+                       switch (got_sha1(arg, sha1)) {
                        case -1: /* they have what we do not */
                                got_other = 1;
                                if (multi_ack && ok_to_give_up()) {
                                        const char *hex = sha1_to_hex(sha1);
                                        if (multi_ack == 2) {
                                                sent_ready = 1;
-                                               packet_write(1, "ACK %s ready\n", hex);
+                                               packet_write_fmt(1, "ACK %s ready\n", hex);
                                        } else
-                                               packet_write(1, "ACK %s continue\n", hex);
+                                               packet_write_fmt(1, "ACK %s continue\n", hex);
                                }
                                break;
                        default:
                                got_common = 1;
                                memcpy(last_hex, sha1_to_hex(sha1), 41);
                                if (multi_ack == 2)
-                                       packet_write(1, "ACK %s common\n", last_hex);
+                                       packet_write_fmt(1, "ACK %s common\n", last_hex);
                                else if (multi_ack)
-                                       packet_write(1, "ACK %s continue\n", last_hex);
+                                       packet_write_fmt(1, "ACK %s continue\n", last_hex);
                                else if (have_obj.nr == 1)
-                                       packet_write(1, "ACK %s\n", last_hex);
+                                       packet_write_fmt(1, "ACK %s\n", last_hex);
                                break;
                        }
                        continue;
@@ -437,10 +444,10 @@ static int get_common_commits(void)
                if (!strcmp(line, "done")) {
                        if (have_obj.nr > 0) {
                                if (multi_ack)
-                                       packet_write(1, "ACK %s\n", last_hex);
+                                       packet_write_fmt(1, "ACK %s\n", last_hex);
                                return 0;
                        }
-                       packet_write(1, "NAK\n");
+                       packet_write_fmt(1, "NAK\n");
                        return -1;
                }
                die("git upload-pack: expected SHA1 list, got '%s'", line);
@@ -454,73 +461,136 @@ static int is_our_ref(struct object *o)
        return o->flags & ((allow_hidden_ref ? HIDDEN_REF : 0) | OUR_REF);
 }
 
-static void check_non_tip(void)
+/*
+ * on successful case, it's up to the caller to close cmd->out
+ */
+static int do_reachable_revlist(struct child_process *cmd,
+                               struct object_array *src,
+                               struct object_array *reachable)
 {
        static const char *argv[] = {
                "rev-list", "--stdin", NULL,
        };
-       static struct child_process cmd = CHILD_PROCESS_INIT;
        struct object *o;
        char namebuf[42]; /* ^ + SHA-1 + LF */
        int i;
 
-       /*
-        * In the normal in-process case without
-        * uploadpack.allowReachableSHA1InWant,
-        * non-tip requests can never happen.
-        */
-       if (!stateless_rpc && !(allow_unadvertised_object_request & ALLOW_REACHABLE_SHA1))
-               goto error;
-
-       cmd.argv = argv;
-       cmd.git_cmd = 1;
-       cmd.no_stderr = 1;
-       cmd.in = -1;
-       cmd.out = -1;
-
-       if (start_command(&cmd))
-               goto error;
+       cmd->argv = argv;
+       cmd->git_cmd = 1;
+       cmd->no_stderr = 1;
+       cmd->in = -1;
+       cmd->out = -1;
 
        /*
-        * If rev-list --stdin encounters an unknown commit, it
-        * terminates, which will cause SIGPIPE in the write loop
+        * If the next rev-list --stdin encounters an unknown commit,
+        * it terminates, which will cause SIGPIPE in the write loop
         * below.
         */
        sigchain_push(SIGPIPE, SIG_IGN);
 
+       if (start_command(cmd))
+               goto error;
+
        namebuf[0] = '^';
        namebuf[41] = '\n';
        for (i = get_max_object_index(); 0 < i; ) {
                o = get_indexed_object(--i);
                if (!o)
                        continue;
+               if (reachable && o->type == OBJ_COMMIT)
+                       o->flags &= ~TMP_MARK;
                if (!is_our_ref(o))
                        continue;
                memcpy(namebuf + 1, oid_to_hex(&o->oid), GIT_SHA1_HEXSZ);
-               if (write_in_full(cmd.in, namebuf, 42) < 0)
+               if (write_in_full(cmd->in, namebuf, 42) < 0)
                        goto error;
        }
        namebuf[40] = '\n';
-       for (i = 0; i < want_obj.nr; i++) {
-               o = want_obj.objects[i].item;
-               if (is_our_ref(o))
+       for (i = 0; i < src->nr; i++) {
+               o = src->objects[i].item;
+               if (is_our_ref(o)) {
+                       if (reachable)
+                               add_object_array(o, NULL, reachable);
                        continue;
+               }
+               if (reachable && o->type == OBJ_COMMIT)
+                       o->flags |= TMP_MARK;
                memcpy(namebuf, oid_to_hex(&o->oid), GIT_SHA1_HEXSZ);
-               if (write_in_full(cmd.in, namebuf, 41) < 0)
+               if (write_in_full(cmd->in, namebuf, 41) < 0)
                        goto error;
        }
-       close(cmd.in);
+       close(cmd->in);
+       cmd->in = -1;
+       sigchain_pop(SIGPIPE);
 
+       return 0;
+
+error:
        sigchain_pop(SIGPIPE);
 
+       if (cmd->in >= 0)
+               close(cmd->in);
+       if (cmd->out >= 0)
+               close(cmd->out);
+       return -1;
+}
+
+static int get_reachable_list(struct object_array *src,
+                             struct object_array *reachable)
+{
+       struct child_process cmd = CHILD_PROCESS_INIT;
+       int i;
+       struct object *o;
+       char namebuf[42]; /* ^ + SHA-1 + LF */
+
+       if (do_reachable_revlist(&cmd, src, reachable) < 0)
+               return -1;
+
+       while ((i = read_in_full(cmd.out, namebuf, 41)) == 41) {
+               struct object_id sha1;
+
+               if (namebuf[40] != '\n' || get_oid_hex(namebuf, &sha1))
+                       break;
+
+               o = lookup_object(sha1.hash);
+               if (o && o->type == OBJ_COMMIT) {
+                       o->flags &= ~TMP_MARK;
+               }
+       }
+       for (i = get_max_object_index(); 0 < i; i--) {
+               o = get_indexed_object(i - 1);
+               if (o && o->type == OBJ_COMMIT &&
+                   (o->flags & TMP_MARK)) {
+                       add_object_array(o, NULL, reachable);
+                               o->flags &= ~TMP_MARK;
+               }
+       }
+       close(cmd.out);
+
+       if (finish_command(&cmd))
+               return -1;
+
+       return 0;
+}
+
+static int has_unreachable(struct object_array *src)
+{
+       struct child_process cmd = CHILD_PROCESS_INIT;
+       char buf[1];
+       int i;
+
+       if (do_reachable_revlist(&cmd, src, NULL) < 0)
+               return 1;
+
        /*
         * The commits out of the rev-list are not ancestors of
         * our ref.
         */
-       i = read_in_full(cmd.out, namebuf, 1);
+       i = read_in_full(cmd.out, buf, 1);
        if (i)
                goto error;
        close(cmd.out);
+       cmd.out = -1;
 
        /*
         * rev-list may have died by encountering a bad commit
@@ -531,23 +601,142 @@ static void check_non_tip(void)
                goto error;
 
        /* All the non-tip ones are ancestors of what we advertised */
-       return;
+       return 0;
+
+error:
+       sigchain_pop(SIGPIPE);
+       if (cmd.out >= 0)
+               close(cmd.out);
+       return 1;
+}
+
+static void check_non_tip(void)
+{
+       int i;
+
+       /*
+        * In the normal in-process case without
+        * uploadpack.allowReachableSHA1InWant,
+        * non-tip requests can never happen.
+        */
+       if (!stateless_rpc && !(allow_unadvertised_object_request & ALLOW_REACHABLE_SHA1))
+               goto error;
+       if (!has_unreachable(&want_obj))
+               /* All the non-tip ones are ancestors of what we advertised */
+               return;
 
 error:
        /* Pick one of them (we know there at least is one) */
        for (i = 0; i < want_obj.nr; i++) {
-               o = want_obj.objects[i].item;
+               struct object *o = want_obj.objects[i].item;
                if (!is_our_ref(o))
                        die("git upload-pack: not our ref %s",
                            oid_to_hex(&o->oid));
        }
 }
 
+static void send_shallow(struct commit_list *result)
+{
+       while (result) {
+               struct object *object = &result->item->object;
+               if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) {
+                       packet_write_fmt(1, "shallow %s",
+                                        oid_to_hex(&object->oid));
+                       register_shallow(object->oid.hash);
+                       shallow_nr++;
+               }
+               result = result->next;
+       }
+}
+
+static void send_unshallow(const struct object_array *shallows)
+{
+       int i;
+
+       for (i = 0; i < shallows->nr; i++) {
+               struct object *object = shallows->objects[i].item;
+               if (object->flags & NOT_SHALLOW) {
+                       struct commit_list *parents;
+                       packet_write_fmt(1, "unshallow %s",
+                                        oid_to_hex(&object->oid));
+                       object->flags &= ~CLIENT_SHALLOW;
+                       /*
+                        * We want to _register_ "object" as shallow, but we
+                        * also need to traverse object's parents to deepen a
+                        * shallow clone. Unregister it for now so we can
+                        * parse and add the parents to the want list, then
+                        * re-register it.
+                        */
+                       unregister_shallow(object->oid.hash);
+                       object->parsed = 0;
+                       parse_commit_or_die((struct commit *)object);
+                       parents = ((struct commit *)object)->parents;
+                       while (parents) {
+                               add_object_array(&parents->item->object,
+                                                NULL, &want_obj);
+                               parents = parents->next;
+                       }
+                       add_object_array(object, NULL, &extra_edge_obj);
+               }
+               /* make sure commit traversal conforms to client */
+               register_shallow(object->oid.hash);
+       }
+}
+
+static void deepen(int depth, int deepen_relative,
+                  struct object_array *shallows)
+{
+       if (depth == INFINITE_DEPTH && !is_repository_shallow()) {
+               int i;
+
+               for (i = 0; i < shallows->nr; i++) {
+                       struct object *object = shallows->objects[i].item;
+                       object->flags |= NOT_SHALLOW;
+               }
+       } else if (deepen_relative) {
+               struct object_array reachable_shallows = OBJECT_ARRAY_INIT;
+               struct commit_list *result;
+
+               get_reachable_list(shallows, &reachable_shallows);
+               result = get_shallow_commits(&reachable_shallows,
+                                            depth + 1,
+                                            SHALLOW, NOT_SHALLOW);
+               send_shallow(result);
+               free_commit_list(result);
+               object_array_clear(&reachable_shallows);
+       } else {
+               struct commit_list *result;
+
+               result = get_shallow_commits(&want_obj, depth,
+                                            SHALLOW, NOT_SHALLOW);
+               send_shallow(result);
+               free_commit_list(result);
+       }
+
+       send_unshallow(shallows);
+       packet_flush(1);
+}
+
+static void deepen_by_rev_list(int ac, const char **av,
+                              struct object_array *shallows)
+{
+       struct commit_list *result;
+
+       result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW);
+       send_shallow(result);
+       free_commit_list(result);
+       send_unshallow(shallows);
+       packet_flush(1);
+}
+
 static void receive_needs(void)
 {
        struct object_array shallows = OBJECT_ARRAY_INIT;
+       struct string_list deepen_not = STRING_LIST_INIT_DUP;
        int depth = 0;
        int has_non_tip = 0;
+       unsigned long deepen_since = 0;
+       int deepen_rev_list = 0;
 
        shallow_nr = 0;
        for (;;) {
@@ -555,14 +744,16 @@ static void receive_needs(void)
                const char *features;
                unsigned char sha1_buf[20];
                char *line = packet_read_line(0, NULL);
+               const char *arg;
+
                reset_timeout();
                if (!line)
                        break;
 
-               if (starts_with(line, "shallow ")) {
+               if (skip_prefix(line, "shallow ", &arg)) {
                        unsigned char sha1[20];
                        struct object *object;
-                       if (get_sha1_hex(line + 8, sha1))
+                       if (get_sha1_hex(arg, sha1))
                                die("invalid shallow line: %s", line);
                        object = parse_object(sha1);
                        if (!object)
@@ -575,20 +766,42 @@ static void receive_needs(void)
                        }
                        continue;
                }
-               if (starts_with(line, "deepen ")) {
-                       char *end;
-                       depth = strtol(line + 7, &end, 0);
-                       if (end == line + 7 || depth <= 0)
+               if (skip_prefix(line, "deepen ", &arg)) {
+                       char *end = NULL;
+                       depth = strtol(arg, &end, 0);
+                       if (!end || *end || depth <= 0)
                                die("Invalid deepen: %s", line);
                        continue;
                }
-               if (!starts_with(line, "want ") ||
-                   get_sha1_hex(line+5, sha1_buf))
+               if (skip_prefix(line, "deepen-since ", &arg)) {
+                       char *end = NULL;
+                       deepen_since = strtoul(arg, &end, 0);
+                       if (!end || *end || !deepen_since ||
+                           /* revisions.c's max_age -1 is special */
+                           deepen_since == -1)
+                               die("Invalid deepen-since: %s", line);
+                       deepen_rev_list = 1;
+                       continue;
+               }
+               if (skip_prefix(line, "deepen-not ", &arg)) {
+                       char *ref = NULL;
+                       unsigned char sha1[20];
+                       if (expand_ref(arg, strlen(arg), sha1, &ref) != 1)
+                               die("git upload-pack: ambiguous deepen-not: %s", line);
+                       string_list_append(&deepen_not, ref);
+                       free(ref);
+                       deepen_rev_list = 1;
+                       continue;
+               }
+               if (!skip_prefix(line, "want ", &arg) ||
+                   get_sha1_hex(arg, sha1_buf))
                        die("git upload-pack: protocol error, "
                            "expected to get sha, not '%s'", line);
 
-               features = line + 45;
+               features = arg + 40;
 
+               if (parse_feature_request(features, "deepen-relative"))
+                       deepen_relative = 1;
                if (parse_feature_request(features, "multi_ack_detailed"))
                        multi_ack = 2;
                else if (parse_feature_request(features, "multi_ack"))
@@ -609,12 +822,17 @@ static void receive_needs(void)
                        use_include_tag = 1;
 
                o = parse_object(sha1_buf);
-               if (!o)
+               if (!o) {
+                       packet_write_fmt(1,
+                                        "ERR upload-pack: not our ref %s",
+                                        sha1_to_hex(sha1_buf));
                        die("git upload-pack: not our ref %s",
                            sha1_to_hex(sha1_buf));
+               }
                if (!(o->flags & WANTED)) {
                        o->flags |= WANTED;
-                       if (!is_our_ref(o))
+                       if (!((allow_unadvertised_object_request & ALLOW_ANY_SHA1) == ALLOW_ANY_SHA1
+                             || is_our_ref(o)))
                                has_non_tip = 1;
                        add_object_array(o, NULL, &want_obj);
                }
@@ -633,55 +851,35 @@ static void receive_needs(void)
        if (!use_sideband && daemon_mode)
                no_progress = 1;
 
-       if (depth == 0 && shallows.nr == 0)
+       if (depth == 0 && !deepen_rev_list && shallows.nr == 0)
                return;
-       if (depth > 0) {
-               struct commit_list *result = NULL, *backup = NULL;
+       if (depth > 0 && deepen_rev_list)
+               die("git upload-pack: deepen and deepen-since (or deepen-not) cannot be used together");
+       if (depth > 0)
+               deepen(depth, deepen_relative, &shallows);
+       else if (deepen_rev_list) {
+               struct argv_array av = ARGV_ARRAY_INIT;
                int i;
-               if (depth == INFINITE_DEPTH && !is_repository_shallow())
-                       for (i = 0; i < shallows.nr; i++) {
-                               struct object *object = shallows.objects[i].item;
-                               object->flags |= NOT_SHALLOW;
-                       }
-               else
-                       backup = result =
-                               get_shallow_commits(&want_obj, depth,
-                                                   SHALLOW, NOT_SHALLOW);
-               while (result) {
-                       struct object *object = &result->item->object;
-                       if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) {
-                               packet_write(1, "shallow %s",
-                                               oid_to_hex(&object->oid));
-                               register_shallow(object->oid.hash);
-                               shallow_nr++;
+
+               argv_array_push(&av, "rev-list");
+               if (deepen_since)
+                       argv_array_pushf(&av, "--max-age=%lu", deepen_since);
+               if (deepen_not.nr) {
+                       argv_array_push(&av, "--not");
+                       for (i = 0; i < deepen_not.nr; i++) {
+                               struct string_list_item *s = deepen_not.items + i;
+                               argv_array_push(&av, s->string);
                        }
-                       result = result->next;
+                       argv_array_push(&av, "--not");
                }
-               free_commit_list(backup);
-               for (i = 0; i < shallows.nr; i++) {
-                       struct object *object = shallows.objects[i].item;
-                       if (object->flags & NOT_SHALLOW) {
-                               struct commit_list *parents;
-                               packet_write(1, "unshallow %s",
-                                       oid_to_hex(&object->oid));
-                               object->flags &= ~CLIENT_SHALLOW;
-                               /* make sure the real parents are parsed */
-                               unregister_shallow(object->oid.hash);
-                               object->parsed = 0;
-                               parse_commit_or_die((struct commit *)object);
-                               parents = ((struct commit *)object)->parents;
-                               while (parents) {
-                                       add_object_array(&parents->item->object,
-                                                       NULL, &want_obj);
-                                       parents = parents->next;
-                               }
-                               add_object_array(object, NULL, &extra_edge_obj);
-                       }
-                       /* make sure commit traversal conforms to client */
-                       register_shallow(object->oid.hash);
+               for (i = 0; i < want_obj.nr; i++) {
+                       struct object *o = want_obj.objects[i].item;
+                       argv_array_push(&av, oid_to_hex(&o->oid));
                }
-               packet_flush(1);
-       } else
+               deepen_by_rev_list(av.argc, av.argv, &shallows);
+               argv_array_clear(&av);
+       }
+       else
                if (shallows.nr > 0) {
                        int i;
                        for (i = 0; i < shallows.nr; i++)
@@ -729,8 +927,8 @@ static int send_ref(const char *refname, const struct object_id *oid,
                    int flag, void *cb_data)
 {
        static const char *capabilities = "multi_ack thin-pack side-band"
-               " side-band-64k ofs-delta shallow no-progress"
-               " include-tag multi_ack_detailed";
+               " side-band-64k ofs-delta shallow deepen-since deepen-not"
+               " deepen-relative no-progress include-tag multi_ack_detailed";
        const char *refname_nons = strip_namespace(refname);
        struct object_id peeled;
 
@@ -741,7 +939,7 @@ static int send_ref(const char *refname, const struct object_id *oid,
                struct strbuf symref_info = STRBUF_INIT;
 
                format_symref_info(&symref_info, cb_data);
-               packet_write(1, "%s %s%c%s%s%s%s%s agent=%s\n",
+               packet_write_fmt(1, "%s %s%c%s%s%s%s%s agent=%s\n",
                             oid_to_hex(oid), refname_nons,
                             0, capabilities,
                             (allow_unadvertised_object_request & ALLOW_TIP_SHA1) ?
@@ -753,11 +951,11 @@ static int send_ref(const char *refname, const struct object_id *oid,
                             git_user_agent_sanitized());
                strbuf_release(&symref_info);
        } else {
-               packet_write(1, "%s %s\n", oid_to_hex(oid), refname_nons);
+               packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), refname_nons);
        }
        capabilities = NULL;
        if (!peel_ref(refname, peeled.hash))
-               packet_write(1, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons);
+               packet_write_fmt(1, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons);
        return 0;
 }
 
@@ -817,6 +1015,11 @@ static int upload_pack_config(const char *var, const char *value, void *unused)
                        allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1;
                else
                        allow_unadvertised_object_request &= ~ALLOW_REACHABLE_SHA1;
+       } else if (!strcmp("uploadpack.allowanysha1inwant", var)) {
+               if (git_config_bool(var, value))
+                       allow_unadvertised_object_request |= ALLOW_ANY_SHA1;
+               else
+                       allow_unadvertised_object_request &= ~ALLOW_ANY_SHA1;
        } else if (!strcmp("uploadpack.keepalive", var)) {
                keepalive = git_config_int(var, value);
                if (!keepalive)
index 132d342bc12bf790f9964f179385aa4f08e6ae00..4bbde924e8bf7e73f4f696d0319235ec56263a8f 100644 (file)
@@ -63,7 +63,50 @@ static int append_normalized_escapes(struct strbuf *buf,
        return 1;
 }
 
-char *url_normalize(const char *url, struct url_info *out_info)
+static const char *end_of_token(const char *s, int c, size_t n)
+{
+       const char *next = memchr(s, c, n);
+       if (!next)
+               next = s + n;
+       return next;
+}
+
+static int match_host(const struct url_info *url_info,
+                     const struct url_info *pattern_info)
+{
+       const char *url = url_info->url + url_info->host_off;
+       const char *pat = pattern_info->url + pattern_info->host_off;
+       int url_len = url_info->host_len;
+       int pat_len = pattern_info->host_len;
+
+       while (url_len && pat_len) {
+               const char *url_next = end_of_token(url, '.', url_len);
+               const char *pat_next = end_of_token(pat, '.', pat_len);
+
+               if (pat_next == pat + 1 && pat[0] == '*')
+                       /* wildcard matches anything */
+                       ;
+               else if ((pat_next - pat) == (url_next - url) &&
+                        !memcmp(url, pat, url_next - url))
+                       /* the components are the same */
+                       ;
+               else
+                       return 0; /* found an unmatch */
+
+               if (url_next < url + url_len)
+                       url_next++;
+               url_len -= url_next - url;
+               url = url_next;
+               if (pat_next < pat + pat_len)
+                       pat_next++;
+               pat_len -= pat_next - pat;
+               pat = pat_next;
+       }
+
+       return (!url_len && !pat_len);
+}
+
+static char *url_normalize_1(const char *url, struct url_info *out_info, char allow_globs)
 {
        /*
         * Normalize NUL-terminated url using the following rules:
@@ -104,7 +147,7 @@ char *url_normalize(const char *url, struct url_info *out_info)
        struct strbuf norm;
        size_t spanned;
        size_t scheme_len, user_off=0, user_len=0, passwd_off=0, passwd_len=0;
-       size_t host_off=0, host_len=0, port_len=0, path_off, path_len, result_len;
+       size_t host_off=0, host_len=0, port_off=0, port_len=0, path_off, path_len, result_len;
        const char *slash_ptr, *at_ptr, *colon_ptr, *path_start;
        char *result;
 
@@ -191,7 +234,12 @@ char *url_normalize(const char *url, struct url_info *out_info)
                strbuf_release(&norm);
                return NULL;
        }
-       spanned = strspn(url, URL_HOST_CHARS);
+
+       if (allow_globs)
+               spanned = strspn(url, URL_HOST_CHARS "*");
+       else
+               spanned = strspn(url, URL_HOST_CHARS);
+
        if (spanned < colon_ptr - url) {
                /* Host name has invalid characters */
                if (out_info) {
@@ -258,6 +306,7 @@ char *url_normalize(const char *url, struct url_info *out_info)
                                return NULL;
                        }
                        strbuf_addch(&norm, ':');
+                       port_off = norm.len;
                        strbuf_add(&norm, url, slash_ptr - url);
                        port_len = slash_ptr - url;
                }
@@ -265,7 +314,7 @@ char *url_normalize(const char *url, struct url_info *out_info)
                url = slash_ptr;
        }
        if (host_off)
-               host_len = norm.len - host_off;
+               host_len = norm.len - host_off - (port_len ? port_len + 1 : 0);
 
 
        /*
@@ -373,6 +422,7 @@ char *url_normalize(const char *url, struct url_info *out_info)
                out_info->passwd_len = passwd_len;
                out_info->host_off = host_off;
                out_info->host_len = host_len;
+               out_info->port_off = port_off;
                out_info->port_len = port_len;
                out_info->path_off = path_off;
                out_info->path_len = path_len;
@@ -380,6 +430,11 @@ char *url_normalize(const char *url, struct url_info *out_info)
        return result;
 }
 
+char *url_normalize(const char *url, struct url_info *out_info)
+{
+       return url_normalize_1(url, out_info, 0);
+}
+
 static size_t url_match_prefix(const char *url,
                               const char *url_prefix,
                               size_t url_prefix_len)
@@ -414,7 +469,7 @@ static size_t url_match_prefix(const char *url,
 
 static int match_urls(const struct url_info *url,
                      const struct url_info *url_prefix,
-                     int *exactusermatch)
+                     struct urlmatch_item *match)
 {
        /*
         * url_prefix matches url if the scheme, host and port of url_prefix
@@ -433,8 +488,8 @@ static int match_urls(const struct url_info *url,
         * contained a user name or false if url_prefix did not have a
         * user name.  If there is no match *exactusermatch is left untouched.
         */
-       int usermatched = 0;
-       int pathmatchlen;
+       char usermatched = 0;
+       size_t pathmatchlen;
 
        if (!url || !url_prefix || !url->url || !url_prefix->url)
                return 0;
@@ -454,33 +509,53 @@ static int match_urls(const struct url_info *url,
                usermatched = 1;
        }
 
-       /* check the host and port */
-       if (url_prefix->host_len != url->host_len ||
-           strncmp(url->url + url->host_off,
-                   url_prefix->url + url_prefix->host_off, url->host_len))
-               return 0; /* host names and/or ports do not match */
+       /* check the host */
+       if (!match_host(url, url_prefix))
+               return 0; /* host names do not match */
+
+       /* check the port */
+       if (url_prefix->port_len != url->port_len ||
+           strncmp(url->url + url->port_off,
+                   url_prefix->url + url_prefix->port_off, url->port_len))
+               return 0; /* ports do not match */
 
        /* check the path */
        pathmatchlen = url_match_prefix(
                url->url + url->path_off,
                url_prefix->url + url_prefix->path_off,
                url_prefix->url_len - url_prefix->path_off);
+       if (!pathmatchlen)
+               return 0; /* paths do not match */
 
-       if (pathmatchlen && exactusermatch)
-               *exactusermatch = usermatched;
-       return pathmatchlen;
+       if (match) {
+               match->hostmatch_len = url_prefix->host_len;
+               match->pathmatch_len = pathmatchlen;
+               match->user_matched = usermatched;
+       }
+
+       return 1;
+}
+
+static int cmp_matches(const struct urlmatch_item *a,
+                      const struct urlmatch_item *b)
+{
+       if (a->hostmatch_len != b->hostmatch_len)
+               return a->hostmatch_len < b->hostmatch_len ? -1 : 1;
+       if (a->pathmatch_len != b->pathmatch_len)
+               return a->pathmatch_len < b->pathmatch_len ? -1 : 1;
+       if (a->user_matched != b->user_matched)
+               return b->user_matched ? -1 : 1;
+       return 0;
 }
 
 int urlmatch_config_entry(const char *var, const char *value, void *cb)
 {
        struct string_list_item *item;
        struct urlmatch_config *collect = cb;
-       struct urlmatch_item *matched;
+       struct urlmatch_item matched = {0};
        struct url_info *url = &collect->url;
        const char *key, *dot;
        struct strbuf synthkey = STRBUF_INIT;
-       size_t matched_len = 0;
-       int user_matched = 0;
        int retval;
 
        if (!skip_prefix(var, collect->section, &key) || *(key++) != '.') {
@@ -494,13 +569,13 @@ int urlmatch_config_entry(const char *var, const char *value, void *cb)
                struct url_info norm_info;
 
                config_url = xmemdupz(key, dot - key);
-               norm_url = url_normalize(config_url, &norm_info);
+               norm_url = url_normalize_1(config_url, &norm_info, 1);
                free(config_url);
                if (!norm_url)
                        return 0;
-               matched_len = match_urls(url, &norm_info, &user_matched);
+               retval = match_urls(url, &norm_info, &matched);
                free(norm_url);
-               if (!matched_len)
+               if (!retval)
                        return 0;
                key = dot + 1;
        }
@@ -510,24 +585,18 @@ int urlmatch_config_entry(const char *var, const char *value, void *cb)
 
        item = string_list_insert(&collect->vars, key);
        if (!item->util) {
-               matched = xcalloc(1, sizeof(*matched));
-               item->util = matched;
+               item->util = xcalloc(1, sizeof(matched));
        } else {
-               matched = item->util;
-               /*
-                * Is our match shorter?  Is our match the same
-                * length, and without user while the current
-                * candidate is with user?  Then we cannot use it.
-                */
-               if (matched_len < matched->matched_len ||
-                   ((matched_len == matched->matched_len) &&
-                    (!user_matched && matched->user_matched)))
+               if (cmp_matches(&matched, item->util) < 0)
+                        /*
+                         * Our match is worse than the old one,
+                         * we cannot use it.
+                         */
                        return 0;
                /* Otherwise, replace it with this one. */
        }
 
-       matched->matched_len = matched_len;
-       matched->user_matched = user_matched;
+       memcpy(item->util, &matched, sizeof(matched));
        strbuf_addstr(&synthkey, collect->section);
        strbuf_addch(&synthkey, '.');
        strbuf_addstr(&synthkey, key);
index 528862adc55c43ed26763b3c05e1d27d558a1b74..37ee5da85e2dd3f0ba3ee12d0c515fa6def2a043 100644 (file)
@@ -18,11 +18,12 @@ struct url_info {
        size_t passwd_len;      /* length of passwd; if passwd_off != 0 but
                                   passwd_len == 0, an empty passwd was given */
        size_t host_off;        /* offset into url to start of host name (0 => none) */
-       size_t host_len;        /* length of host name; this INCLUDES any ':portnum';
+       size_t host_len;        /* length of host name;
                                 * file urls may have host_len == 0 */
-       size_t port_len;        /* if a portnum is present (port_len != 0), it has
-                                * this length (excluding the leading ':') at the
-                                * end of the host name (always 0 for file urls) */
+       size_t port_off;        /* offset into url to start of port number (0 => none) */
+       size_t port_len;        /* if a portnum is present (port_off != 0), it has
+                                * this length (excluding the leading ':') starting
+                                * from port_off (always 0 for file urls) */
        size_t path_off;        /* offset into url to the start of the url path;
                                 * this will always point to a '/' character
                                 * after the url has been normalized */
@@ -33,7 +34,8 @@ struct url_info {
 extern char *url_normalize(const char *, struct url_info *);
 
 struct urlmatch_item {
-       size_t matched_len;
+       size_t hostmatch_len;
+       size_t pathmatch_len;
        char user_matched;
 };
 
diff --git a/usage.c b/usage.c
index 0efa3faf601231db35239161a1a7253b3975b3f8..2f87ca69a8299485ee013187f99ffbdb2618d7c8 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -6,22 +6,17 @@
 #include "git-compat-util.h"
 #include "cache.h"
 
-static FILE *error_handle;
-static int tweaked_error_buffering;
-
 void vreportf(const char *prefix, const char *err, va_list params)
 {
-       FILE *fh = error_handle ? error_handle : stderr;
+       char msg[4096];
+       char *p;
 
-       fflush(fh);
-       if (!tweaked_error_buffering) {
-               setvbuf(fh, NULL, _IOLBF, 0);
-               tweaked_error_buffering = 1;
+       vsnprintf(msg, sizeof(msg), err, params);
+       for (p = msg; *p; p++) {
+               if (iscntrl(*p) && *p != '\t' && *p != '\n')
+                       *p = '?';
        }
-
-       fputs(prefix, fh);
-       vfprintf(fh, err, params);
-       fputc('\n', fh);
+       fprintf(stderr, "%s%s\n", prefix, msg);
 }
 
 static NORETURN void usage_builtin(const char *err, va_list params)
@@ -70,15 +65,24 @@ void set_error_routine(void (*routine)(const char *err, va_list params))
        error_routine = routine;
 }
 
-void set_die_is_recursing_routine(int (*routine)(void))
+void (*get_error_routine(void))(const char *err, va_list params)
 {
-       die_is_recursing = routine;
+       return error_routine;
 }
 
-void set_error_handle(FILE *fh)
+void set_warn_routine(void (*routine)(const char *warn, va_list params))
+{
+       warn_routine = routine;
+}
+
+void (*get_warn_routine(void))(const char *warn, va_list params)
+{
+       return warn_routine;
+}
+
+void set_die_is_recursing_routine(int (*routine)(void))
 {
-       error_handle = fh;
-       tweaked_error_buffering = 0;
+       die_is_recursing = routine;
 }
 
 void NORETURN usagef(const char *err, ...)
@@ -189,3 +193,35 @@ void warning(const char *warn, ...)
        warn_routine(warn, params);
        va_end(params);
 }
+
+static NORETURN void BUG_vfl(const char *file, int line, const char *fmt, va_list params)
+{
+       char prefix[256];
+
+       /* truncation via snprintf is OK here */
+       if (file)
+               snprintf(prefix, sizeof(prefix), "BUG: %s:%d: ", file, line);
+       else
+               snprintf(prefix, sizeof(prefix), "BUG: ");
+
+       vreportf(prefix, fmt, params);
+       abort();
+}
+
+#ifdef HAVE_VARIADIC_MACROS
+NORETURN void BUG_fl(const char *file, int line, const char *fmt, ...)
+{
+       va_list ap;
+       va_start(ap, fmt);
+       BUG_vfl(file, line, fmt, ap);
+       va_end(ap);
+}
+#else
+NORETURN void BUG(const char *fmt, ...)
+{
+       va_list ap;
+       va_start(ap, fmt);
+       BUG_vfl(NULL, 0, fmt, ap);
+       va_end(ap);
+}
+#endif
index 2125d6da26dbdc01f7397415ef1f67616e6f2a71..8b732e40bce4968257c2918219f7dfdb0b9ed3a0 100644 (file)
@@ -262,25 +262,22 @@ struct userdiff_driver *userdiff_find_by_name(const char *name) {
 
 struct userdiff_driver *userdiff_find_by_path(const char *path)
 {
-       static struct git_attr *attr;
-       struct git_attr_check check;
-
-       if (!attr)
-               attr = git_attr("diff");
-       check.attr = attr;
+       static struct attr_check *check;
 
+       if (!check)
+               check = attr_check_initl("diff", NULL);
        if (!path)
                return NULL;
-       if (git_check_attr(path, 1, &check))
+       if (git_check_attr(path, check))
                return NULL;
 
-       if (ATTR_TRUE(check.value))
+       if (ATTR_TRUE(check->items[0].value))
                return &driver_true;
-       if (ATTR_FALSE(check.value))
+       if (ATTR_FALSE(check->items[0].value))
                return &driver_false;
-       if (ATTR_UNSET(check.value))
+       if (ATTR_UNSET(check->items[0].value))
                return NULL;
-       return userdiff_find_by_name(check.value);
+       return userdiff_find_by_name(check->items[0].value);
 }
 
 struct userdiff_driver *userdiff_get_textconv(struct userdiff_driver *driver)
diff --git a/utf8.c b/utf8.c
index 00e10c86ad7ea7bcc2d53a90a2f608dd66d47462..0c8e011a58cae3c683851007ec81828ad8284471 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -489,6 +489,28 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outs
        return out;
 }
 
+static const char *fallback_encoding(const char *name)
+{
+       /*
+        * Some platforms do not have the variously spelled variants of
+        * UTF-8, so let's fall back to trying the most official
+        * spelling. We do so only as a fallback in case the platform
+        * does understand the user's spelling, but not our official
+        * one.
+        */
+       if (is_encoding_utf8(name))
+               return "UTF-8";
+
+       /*
+        * Even though latin-1 is still seen in e-mail
+        * headers, some platforms only install ISO-8859-1.
+        */
+       if (!strcasecmp(name, "latin-1"))
+               return "ISO-8859-1";
+
+       return name;
+}
+
 char *reencode_string_len(const char *in, int insz,
                          const char *out_encoding, const char *in_encoding,
                          int *outsz)
@@ -501,17 +523,9 @@ char *reencode_string_len(const char *in, int insz,
 
        conv = iconv_open(out_encoding, in_encoding);
        if (conv == (iconv_t) -1) {
-               /*
-                * Some platforms do not have the variously spelled variants of
-                * UTF-8, so let's fall back to trying the most official
-                * spelling. We do so only as a fallback in case the platform
-                * does understand the user's spelling, but not our official
-                * one.
-                */
-               if (is_encoding_utf8(in_encoding))
-                       in_encoding = "UTF-8";
-               if (is_encoding_utf8(out_encoding))
-                       out_encoding = "UTF-8";
+               in_encoding = fallback_encoding(in_encoding);
+               out_encoding = fallback_encoding(out_encoding);
+
                conv = iconv_open(out_encoding, in_encoding);
                if (conv == (iconv_t) -1)
                        return NULL;
index 80bfd109fa1285a24dbfa8e9aabdfc3b3bd59801..9f81dc1062bc1f7f243afa8c0404ff5100fc0ef8 100644 (file)
 static const struct string_list *prereleases;
 static int initialized;
 
+struct suffix_match {
+       int conf_pos;
+       int start;
+       int len;
+};
+
+static void find_better_matching_suffix(const char *tagname, const char *suffix,
+                                       int suffix_len, int start, int conf_pos,
+                                       struct suffix_match *match)
+{
+       /*
+        * A better match either starts earlier or starts at the same offset
+        * but is longer.
+        */
+       int end = match->len < suffix_len ? match->start : match->start-1;
+       int i;
+       for (i = start; i <= end; i++)
+               if (starts_with(tagname + i, suffix)) {
+                       match->conf_pos = conf_pos;
+                       match->start = i;
+                       match->len = suffix_len;
+                       break;
+               }
+}
+
 /*
- * p1 and p2 point to the first different character in two strings. If
- * either p1 or p2 starts with a prerelease suffix, it will be forced
- * to be on top.
- *
- * If both p1 and p2 start with (different) suffix, the order is
- * determined by config file.
+ * off is the offset of the first different character in the two strings
+ * s1 and s2. If either s1 or s2 contains a prerelease suffix containing
+ * that offset or a suffix ends right before that offset, then that
+ * string will be forced to be on top.
  *
- * Note that we don't have to deal with the situation when both p1 and
- * p2 start with the same suffix because the common part is already
- * consumed by the caller.
+ * If both s1 and s2 contain a (different) suffix around that position,
+ * their order is determined by the order of those two suffixes in the
+ * configuration.
+ * If any of the strings contains more than one different suffixes around
+ * that position, then that string is sorted according to the contained
+ * suffix which starts at the earliest offset in that string.
+ * If more than one different contained suffixes start at that earliest
+ * offset, then that string is sorted according to the longest of those
+ * suffixes.
  *
  * Return non-zero if *diff contains the return value for versioncmp()
  */
-static int swap_prereleases(const void *p1_,
-                           const void *p2_,
+static int swap_prereleases(const char *s1,
+                           const char *s2,
+                           int off,
                            int *diff)
 {
-       const char *p1 = p1_;
-       const char *p2 = p2_;
-       int i, i1 = -1, i2 = -1;
+       int i;
+       struct suffix_match match1 = { -1, off, -1 };
+       struct suffix_match match2 = { -1, off, -1 };
 
        for (i = 0; i < prereleases->nr; i++) {
                const char *suffix = prereleases->items[i].string;
-               if (i1 == -1 && starts_with(p1, suffix))
-                       i1 = i;
-               if (i2 == -1 && starts_with(p2, suffix))
-                       i2 = i;
+               int start, suffix_len = strlen(suffix);
+               if (suffix_len < off)
+                       start = off - suffix_len;
+               else
+                       start = 0;
+               find_better_matching_suffix(s1, suffix, suffix_len, start,
+                                           i, &match1);
+               find_better_matching_suffix(s2, suffix, suffix_len, start,
+                                           i, &match2);
        }
-       if (i1 == -1 && i2 == -1)
+       if (match1.conf_pos == -1 && match2.conf_pos == -1)
                return 0;
-       if (i1 >= 0 && i2 >= 0)
-               *diff = i1 - i2;
-       else if (i1 >= 0)
+       if (match1.conf_pos == match2.conf_pos)
+               /* Found the same suffix in both, e.g. "-rc" in "v1.0-rcX"
+                * and "v1.0-rcY": the caller should decide based on "X"
+                * and "Y". */
+               return 0;
+
+       if (match1.conf_pos >= 0 && match2.conf_pos >= 0)
+               *diff = match1.conf_pos - match2.conf_pos;
+       else if (match1.conf_pos >= 0)
                *diff = -1;
-       else /* if (i2 >= 0) */
+       else /* if (match2.conf_pos >= 0) */
                *diff = 1;
        return 1;
 }
@@ -118,10 +159,18 @@ int versioncmp(const char *s1, const char *s2)
        }
 
        if (!initialized) {
+               const struct string_list *deprecated_prereleases;
                initialized = 1;
-               prereleases = git_config_get_value_multi("versionsort.prereleasesuffix");
+               prereleases = git_config_get_value_multi("versionsort.suffix");
+               deprecated_prereleases = git_config_get_value_multi("versionsort.prereleasesuffix");
+               if (prereleases) {
+                       if (deprecated_prereleases)
+                               warning("ignoring versionsort.prereleasesuffix because versionsort.suffix is set");
+               } else
+                       prereleases = deprecated_prereleases;
        }
-       if (prereleases && swap_prereleases(p1 - 1, p2 - 1, &diff))
+       if (prereleases && swap_prereleases(s1, s2, (const char *) p1 - s1 - 1,
+                                           &diff))
                return diff;
 
        state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))];
index f7869f8d6072c98c3e9be3387a9a3c19508e13ea..89a81b13de38473aaa52870d80f59c247578a3a5 100644 (file)
@@ -88,21 +88,13 @@ static struct worktree *get_main_worktree(void)
 
        strbuf_addf(&path, "%s/HEAD", get_git_common_dir());
 
-       if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
-               goto done;
-
-       worktree = xmalloc(sizeof(struct worktree));
+       worktree = xcalloc(1, sizeof(*worktree));
        worktree->path = strbuf_detach(&worktree_path, NULL);
-       worktree->id = NULL;
        worktree->is_bare = is_bare;
-       worktree->head_ref = NULL;
        worktree->is_detached = is_detached;
-       worktree->is_current = 0;
-       add_head_info(&head_ref, worktree);
-       worktree->lock_reason = NULL;
-       worktree->lock_reason_valid = 0;
+       if (!parse_ref(path.buf, &head_ref, &is_detached))
+               add_head_info(&head_ref, worktree);
 
-done:
        strbuf_release(&path);
        strbuf_release(&worktree_path);
        strbuf_release(&head_ref);
@@ -138,16 +130,11 @@ static struct worktree *get_linked_worktree(const char *id)
        if (parse_ref(path.buf, &head_ref, &is_detached) < 0)
                goto done;
 
-       worktree = xmalloc(sizeof(struct worktree));
+       worktree = xcalloc(1, sizeof(*worktree));
        worktree->path = strbuf_detach(&worktree_path, NULL);
        worktree->id = xstrdup(id);
-       worktree->is_bare = 0;
-       worktree->head_ref = NULL;
        worktree->is_detached = is_detached;
-       worktree->is_current = 0;
        add_head_info(&head_ref, worktree);
-       worktree->lock_reason = NULL;
-       worktree->lock_reason_valid = 0;
 
 done:
        strbuf_release(&path);
@@ -158,7 +145,7 @@ done:
 
 static void mark_current_worktree(struct worktree **worktrees)
 {
-       char *git_dir = xstrdup(absolute_path(get_git_dir()));
+       char *git_dir = absolute_pathdup(get_git_dir());
        int i;
 
        for (i = 0; worktrees[i]; i++) {
@@ -173,7 +160,14 @@ static void mark_current_worktree(struct worktree **worktrees)
        free(git_dir);
 }
 
-struct worktree **get_worktrees(void)
+static int compare_worktree(const void *a_, const void *b_)
+{
+       const struct worktree *const *a = a_;
+       const struct worktree *const *b = b_;
+       return fspathcmp((*a)->path, (*b)->path);
+}
+
+struct worktree **get_worktrees(unsigned flags)
 {
        struct worktree **list = NULL;
        struct strbuf path = STRBUF_INIT;
@@ -181,10 +175,9 @@ struct worktree **get_worktrees(void)
        struct dirent *d;
        int counter = 0, alloc = 2;
 
-       list = xmalloc(alloc * sizeof(struct worktree *));
+       ALLOC_ARRAY(list, alloc);
 
-       if ((list[counter] = get_main_worktree()))
-               counter++;
+       list[counter++] = get_main_worktree();
 
        strbuf_addf(&path, "%s/worktrees", get_git_common_dir());
        dir = opendir(path.buf);
@@ -205,6 +198,13 @@ struct worktree **get_worktrees(void)
        ALLOC_GROW(list, counter + 1, alloc);
        list[counter] = NULL;
 
+       if (flags & GWT_SORT_LINKED)
+               /*
+                * don't sort the first item (main worktree), which will
+                * always be the first
+                */
+               QSORT(list + 1, counter - 1, compare_worktree);
+
        mark_current_worktree(list);
        return list;
 }
@@ -250,16 +250,19 @@ struct worktree *find_worktree(struct worktree **list,
 {
        struct worktree *wt;
        char *path;
+       char *to_free = NULL;
 
        if ((wt = find_worktree_by_suffix(list, arg)))
                return wt;
 
-       arg = prefix_filename(prefix, strlen(prefix), arg);
-       path = xstrdup(real_path(arg));
+       if (prefix)
+               arg = to_free = prefix_filename(prefix, arg);
+       path = real_pathdup(arg, 1);
        for (; *list; list++)
                if (!fspathcmp(path, real_path((*list)->path)))
                        break;
        free(path);
+       free(to_free);
        return *list;
 }
 
@@ -341,7 +344,7 @@ const struct worktree *find_shared_symref(const char *symref,
 
        if (worktrees)
                free_worktrees(worktrees);
-       worktrees = get_worktrees();
+       worktrees = get_worktrees(0);
 
        for (i = 0; worktrees[i]; i++) {
                struct worktree *wt = worktrees[i];
@@ -380,3 +383,53 @@ const struct worktree *find_shared_symref(const char *symref,
 
        return existing;
 }
+
+int submodule_uses_worktrees(const char *path)
+{
+       char *submodule_gitdir;
+       struct strbuf sb = STRBUF_INIT;
+       DIR *dir;
+       struct dirent *d;
+       int ret = 0;
+       struct repository_format format;
+
+       submodule_gitdir = git_pathdup_submodule(path, "%s", "");
+       if (!submodule_gitdir)
+               return 0;
+
+       /* The env would be set for the superproject. */
+       get_common_dir_noenv(&sb, submodule_gitdir);
+       free(submodule_gitdir);
+
+       /*
+        * The check below is only known to be good for repository format
+        * version 0 at the time of writing this code.
+        */
+       strbuf_addstr(&sb, "/config");
+       read_repository_format(&format, sb.buf);
+       if (format.version != 0) {
+               strbuf_release(&sb);
+               return 1;
+       }
+
+       /* Replace config by worktrees. */
+       strbuf_setlen(&sb, sb.len - strlen("config"));
+       strbuf_addstr(&sb, "worktrees");
+
+       /* See if there is any file inside the worktrees directory. */
+       dir = opendir(sb.buf);
+       strbuf_release(&sb);
+
+       if (!dir)
+               return 0;
+
+       while ((d = readdir(dir)) != NULL) {
+               if (is_dot_or_dotdot(d->d_name))
+                       continue;
+
+               ret = 1;
+               break;
+       }
+       closedir(dir);
+       return ret;
+}
index 90e1311fa73fa6bdde5249d68818eacb6dc8edd0..6bfb985203070e3051f82348568840f5577bf0dc 100644 (file)
@@ -15,6 +15,8 @@ struct worktree {
 
 /* Functions for acting on the information about worktrees. */
 
+#define GWT_SORT_LINKED (1 << 0) /* keeps linked worktrees sorted */
+
 /*
  * Get the worktrees.  The primary worktree will always be the first returned,
  * and linked worktrees will be pointed to by 'next' in each subsequent
@@ -23,7 +25,12 @@ struct worktree {
  * The caller is responsible for freeing the memory from the returned
  * worktree(s).
  */
-extern struct worktree **get_worktrees(void);
+extern struct worktree **get_worktrees(unsigned flags);
+
+/*
+ * Returns 1 if linked worktrees exist, 0 otherwise.
+ */
+extern int submodule_uses_worktrees(const char *path);
 
 /*
  * Return git dir of the worktree. Note that the path may be relative.
index e7f197996868a614c84537ad96fc672ea901148d..d83741770949f457b364896b6ff8632c0a700d69 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -440,23 +440,6 @@ int xmkstemp(char *template)
        return fd;
 }
 
-/* git_mkstemp() - create tmp file honoring TMPDIR variable */
-int git_mkstemp(char *path, size_t len, const char *template)
-{
-       const char *tmp;
-       size_t n;
-
-       tmp = getenv("TMPDIR");
-       if (!tmp)
-               tmp = "/tmp";
-       n = snprintf(path, len, "%s/%s", tmp, template);
-       if (len <= n) {
-               errno = ENAMETOOLONG;
-               return -1;
-       }
-       return mkstemp(path);
-}
-
 /* Adapted from libiberty's mkstemp.c. */
 
 #undef TMP_MAX
@@ -531,13 +514,6 @@ int git_mkstemp_mode(char *pattern, int mode)
        return git_mkstemps_mode(pattern, 0, mode);
 }
 
-#ifdef NO_MKSTEMPS
-int gitmkstemps(char *pattern, int suffix_len)
-{
-       return git_mkstemps_mode(pattern, suffix_len, 0600);
-}
-#endif
-
 int xmkstemp_mode(char *template, int mode)
 {
        int fd;
@@ -679,3 +655,16 @@ void sleep_millisec(int millisec)
 {
        poll(NULL, 0, millisec);
 }
+
+int xgethostname(char *buf, size_t len)
+{
+       /*
+        * If the full hostname doesn't fit in buf, POSIX does not
+        * specify whether the buffer will be null-terminated, so to
+        * be safe, do it ourselves.
+        */
+       int ret = gethostname(buf, len);
+       if (!ret)
+               buf[len - 1] = 0;
+       return ret;
+}
index 073443247a6d56ddd8448aafce854a4b5513e605..eab8c8d0b9aab55c8435b9f451efd81e715131f8 100644 (file)
@@ -1,19 +1,6 @@
 #include "cache.h"
 #include "run-command.h"
 
-static void check_pipe(int err)
-{
-       if (err == EPIPE) {
-               if (in_async())
-                       async_exit(141);
-
-               signal(SIGPIPE, SIG_DFL);
-               raise(SIGPIPE);
-               /* Should never happen, but just in case... */
-               exit(141);
-       }
-}
-
 /*
  * Some cases use stdio, but want to flush after the write
  * to get error handling (and to get better interactive
diff --git a/ws.c b/ws.c
index ea4b2b1dfd64ce41f4752a93f4d5478c4e53deda..a07caedd5a565bbf29e4f9b3036ac60e6e9f716e 100644 (file)
--- a/ws.c
+++ b/ws.c
@@ -71,24 +71,17 @@ unsigned parse_whitespace_rule(const char *string)
        return rule;
 }
 
-static void setup_whitespace_attr_check(struct git_attr_check *check)
-{
-       static struct git_attr *attr_whitespace;
-
-       if (!attr_whitespace)
-               attr_whitespace = git_attr("whitespace");
-       check[0].attr = attr_whitespace;
-}
-
 unsigned whitespace_rule(const char *pathname)
 {
-       struct git_attr_check attr_whitespace_rule;
+       static struct attr_check *attr_whitespace_rule;
+
+       if (!attr_whitespace_rule)
+               attr_whitespace_rule = attr_check_initl("whitespace", NULL);
 
-       setup_whitespace_attr_check(&attr_whitespace_rule);
-       if (!git_check_attr(pathname, 1, &attr_whitespace_rule)) {
+       if (!git_check_attr(pathname, attr_whitespace_rule)) {
                const char *value;
 
-               value = attr_whitespace_rule.value;
+               value = attr_whitespace_rule->items[0].value;
                if (ATTR_TRUE(value)) {
                        /* true (whitespace) */
                        unsigned all_rule = ws_tab_width(whitespace_rule_cfg);
index 7004a2d588769b76e95c07c8471569b2d6bf6c56..068de38b510f51ba216e7bfdfe969c526064aef7 100644 (file)
@@ -16,6 +16,7 @@
 #include "strbuf.h"
 #include "utf8.h"
 #include "worktree.h"
+#include "lockfile.h"
 
 static const char cut_line[] =
 "------------------------ >8 ------------------------\n";
@@ -120,7 +121,7 @@ static void status_printf_more(struct wt_status *s, const char *color,
 
 void wt_status_prepare(struct wt_status *s)
 {
-       unsigned char sha1[20];
+       struct object_id oid;
 
        memset(s, 0, sizeof(*s));
        memcpy(s->color_palette, default_wt_status_colors,
@@ -128,7 +129,7 @@ void wt_status_prepare(struct wt_status *s)
        s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
        s->use_color = -1;
        s->relative_paths = 1;
-       s->branch = resolve_refdup("HEAD", 0, sha1, NULL);
+       s->branch = resolve_refdup("HEAD", 0, oid.hash, NULL);
        s->reference = "HEAD";
        s->fp = stdout;
        s->index_file = get_index_file();
@@ -139,7 +140,7 @@ void wt_status_prepare(struct wt_status *s)
        s->display_comment_prefix = 0;
 }
 
-static void wt_status_print_unmerged_header(struct wt_status *s)
+static void wt_longstatus_print_unmerged_header(struct wt_status *s)
 {
        int i;
        int del_mod_conflict = 0;
@@ -191,7 +192,7 @@ static void wt_status_print_unmerged_header(struct wt_status *s)
        status_printf_ln(s, c, "%s", "");
 }
 
-static void wt_status_print_cached_header(struct wt_status *s)
+static void wt_longstatus_print_cached_header(struct wt_status *s)
 {
        const char *c = color(WT_STATUS_HEADER, s);
 
@@ -207,9 +208,9 @@ static void wt_status_print_cached_header(struct wt_status *s)
        status_printf_ln(s, c, "%s", "");
 }
 
-static void wt_status_print_dirty_header(struct wt_status *s,
-                                        int has_deleted,
-                                        int has_dirty_submodules)
+static void wt_longstatus_print_dirty_header(struct wt_status *s,
+                                            int has_deleted,
+                                            int has_dirty_submodules)
 {
        const char *c = color(WT_STATUS_HEADER, s);
 
@@ -226,9 +227,9 @@ static void wt_status_print_dirty_header(struct wt_status *s,
        status_printf_ln(s, c, "%s", "");
 }
 
-static void wt_status_print_other_header(struct wt_status *s,
-                                        const char *what,
-                                        const char *how)
+static void wt_longstatus_print_other_header(struct wt_status *s,
+                                            const char *what,
+                                            const char *how)
 {
        const char *c = color(WT_STATUS_HEADER, s);
        status_printf_ln(s, c, "%s:", what);
@@ -238,7 +239,7 @@ static void wt_status_print_other_header(struct wt_status *s,
        status_printf_ln(s, c, "%s", "");
 }
 
-static void wt_status_print_trailer(struct wt_status *s)
+static void wt_longstatus_print_trailer(struct wt_status *s)
 {
        status_printf_ln(s, color(WT_STATUS_HEADER, s), "%s", "");
 }
@@ -304,8 +305,8 @@ static int maxwidth(const char *(*label)(int), int minval, int maxval)
        return result;
 }
 
-static void wt_status_print_unmerged_data(struct wt_status *s,
-                                         struct string_list_item *it)
+static void wt_longstatus_print_unmerged_data(struct wt_status *s,
+                                             struct string_list_item *it)
 {
        const char *c = color(WT_STATUS_UNMERGED, s);
        struct wt_status_change_data *d = it->util;
@@ -331,9 +332,9 @@ static void wt_status_print_unmerged_data(struct wt_status *s,
        strbuf_release(&onebuf);
 }
 
-static void wt_status_print_change_data(struct wt_status *s,
-                                       int change_type,
-                                       struct string_list_item *it)
+static void wt_longstatus_print_change_data(struct wt_status *s,
+                                           int change_type,
+                                           struct string_list_item *it)
 {
        struct wt_status_change_data *d = it->util;
        const char *c = color(change_type, s);
@@ -378,7 +379,7 @@ static void wt_status_print_change_data(struct wt_status *s,
                status = d->worktree_status;
                break;
        default:
-               die("BUG: unhandled change_type %d in wt_status_print_change_data",
+               die("BUG: unhandled change_type %d in wt_longstatus_print_change_data",
                    change_type);
        }
 
@@ -406,6 +407,16 @@ static void wt_status_print_change_data(struct wt_status *s,
        strbuf_release(&twobuf);
 }
 
+static char short_submodule_status(struct wt_status_change_data *d) {
+       if (d->new_submodule_commits)
+               return 'M';
+       if (d->dirty_submodule & DIRTY_SUBMODULE_MODIFIED)
+               return 'm';
+       if (d->dirty_submodule & DIRTY_SUBMODULE_UNTRACKED)
+               return '?';
+       return d->worktree_status;
+}
+
 static void wt_status_collect_changed_cb(struct diff_queue_struct *q,
                                         struct diff_options *options,
                                         void *data)
@@ -430,10 +441,38 @@ static void wt_status_collect_changed_cb(struct diff_queue_struct *q,
                }
                if (!d->worktree_status)
                        d->worktree_status = p->status;
-               d->dirty_submodule = p->two->dirty_submodule;
-               if (S_ISGITLINK(p->two->mode))
+               if (S_ISGITLINK(p->two->mode)) {
+                       d->dirty_submodule = p->two->dirty_submodule;
                        d->new_submodule_commits = !!oidcmp(&p->one->oid,
                                                            &p->two->oid);
+                       if (s->status_format == STATUS_FORMAT_SHORT)
+                               d->worktree_status = short_submodule_status(d);
+               }
+
+               switch (p->status) {
+               case DIFF_STATUS_ADDED:
+                       d->mode_worktree = p->two->mode;
+                       break;
+
+               case DIFF_STATUS_DELETED:
+                       d->mode_index = p->one->mode;
+                       oidcpy(&d->oid_index, &p->one->oid);
+                       /* mode_worktree is zero for a delete. */
+                       break;
+
+               case DIFF_STATUS_MODIFIED:
+               case DIFF_STATUS_TYPE_CHANGED:
+               case DIFF_STATUS_UNMERGED:
+                       d->mode_index = p->one->mode;
+                       d->mode_worktree = p->two->mode;
+                       oidcpy(&d->oid_index, &p->one->oid);
+                       break;
+
+               case DIFF_STATUS_UNKNOWN:
+                       die("BUG: worktree status unknown???");
+                       break;
+               }
+
        }
 }
 
@@ -479,12 +518,36 @@ static void wt_status_collect_updated_cb(struct diff_queue_struct *q,
                if (!d->index_status)
                        d->index_status = p->status;
                switch (p->status) {
+               case DIFF_STATUS_ADDED:
+                       /* Leave {mode,oid}_head zero for an add. */
+                       d->mode_index = p->two->mode;
+                       oidcpy(&d->oid_index, &p->two->oid);
+                       break;
+               case DIFF_STATUS_DELETED:
+                       d->mode_head = p->one->mode;
+                       oidcpy(&d->oid_head, &p->one->oid);
+                       /* Leave {mode,oid}_index zero for a delete. */
+                       break;
+
                case DIFF_STATUS_COPIED:
                case DIFF_STATUS_RENAMED:
                        d->head_path = xstrdup(p->one->path);
+                       d->score = p->score * 100 / MAX_SCORE;
+                       /* fallthru */
+               case DIFF_STATUS_MODIFIED:
+               case DIFF_STATUS_TYPE_CHANGED:
+                       d->mode_head = p->one->mode;
+                       d->mode_index = p->two->mode;
+                       oidcpy(&d->oid_head, &p->one->oid);
+                       oidcpy(&d->oid_index, &p->two->oid);
                        break;
                case DIFF_STATUS_UNMERGED:
                        d->stagemask = unmerged_mask(p->two->path);
+                       /*
+                        * Don't bother setting {mode,oid}_{head,index} since the print
+                        * code will output the stage values directly and not use the
+                        * values in these fields.
+                        */
                        break;
                }
        }
@@ -498,6 +561,7 @@ static void wt_status_collect_changes_worktree(struct wt_status *s)
        setup_revisions(0, NULL, &rev, NULL);
        rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
        DIFF_OPT_SET(&rev.diffopt, DIRTY_SUBMODULES);
+       rev.diffopt.ita_invisible_in_index = 1;
        if (!s->show_untracked_files)
                DIFF_OPT_SET(&rev.diffopt, IGNORE_UNTRACKED_IN_SUBMODULES);
        if (s->ignore_submodule_arg) {
@@ -521,6 +585,7 @@ static void wt_status_collect_changes_index(struct wt_status *s)
        setup_revisions(0, NULL, &rev, &opt);
 
        DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG);
+       rev.diffopt.ita_invisible_in_index = 1;
        if (s->ignore_submodule_arg) {
                handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg);
        } else {
@@ -556,6 +621,8 @@ static void wt_status_collect_changes_initial(struct wt_status *s)
 
                if (!ce_path_match(ce, &s->pathspec, NULL))
                        continue;
+               if (ce_intent_to_add(ce))
+                       continue;
                it = string_list_insert(&s->change, ce->name);
                d = it->util;
                if (!d) {
@@ -565,9 +632,17 @@ static void wt_status_collect_changes_initial(struct wt_status *s)
                if (ce_stage(ce)) {
                        d->index_status = DIFF_STATUS_UNMERGED;
                        d->stagemask |= (1 << (ce_stage(ce) - 1));
-               }
-               else
+                       /*
+                        * Don't bother setting {mode,oid}_{head,index} since the print
+                        * code will output the stage values directly and not use the
+                        * values in these fields.
+                        */
+               } else {
                        d->index_status = DIFF_STATUS_ADDED;
+                       /* Leave {mode,oid}_head zero for adds. */
+                       d->mode_index = ce->ce_mode;
+                       oidcpy(&d->oid_index, &ce->oid);
+               }
        }
 }
 
@@ -627,7 +702,7 @@ void wt_status_collect(struct wt_status *s)
        wt_status_collect_untracked(s);
 }
 
-static void wt_status_print_unmerged(struct wt_status *s)
+static void wt_longstatus_print_unmerged(struct wt_status *s)
 {
        int shown_header = 0;
        int i;
@@ -640,17 +715,17 @@ static void wt_status_print_unmerged(struct wt_status *s)
                if (!d->stagemask)
                        continue;
                if (!shown_header) {
-                       wt_status_print_unmerged_header(s);
+                       wt_longstatus_print_unmerged_header(s);
                        shown_header = 1;
                }
-               wt_status_print_unmerged_data(s, it);
+               wt_longstatus_print_unmerged_data(s, it);
        }
        if (shown_header)
-               wt_status_print_trailer(s);
+               wt_longstatus_print_trailer(s);
 
 }
 
-static void wt_status_print_updated(struct wt_status *s)
+static void wt_longstatus_print_updated(struct wt_status *s)
 {
        int shown_header = 0;
        int i;
@@ -664,14 +739,14 @@ static void wt_status_print_updated(struct wt_status *s)
                    d->index_status == DIFF_STATUS_UNMERGED)
                        continue;
                if (!shown_header) {
-                       wt_status_print_cached_header(s);
+                       wt_longstatus_print_cached_header(s);
                        s->commitable = 1;
                        shown_header = 1;
                }
-               wt_status_print_change_data(s, WT_STATUS_UPDATED, it);
+               wt_longstatus_print_change_data(s, WT_STATUS_UPDATED, it);
        }
        if (shown_header)
-               wt_status_print_trailer(s);
+               wt_longstatus_print_trailer(s);
 }
 
 /*
@@ -703,7 +778,7 @@ static int wt_status_check_worktree_changes(struct wt_status *s,
        return changes;
 }
 
-static void wt_status_print_changed(struct wt_status *s)
+static void wt_longstatus_print_changed(struct wt_status *s)
 {
        int i, dirty_submodules;
        int worktree_changes = wt_status_check_worktree_changes(s, &dirty_submodules);
@@ -711,7 +786,7 @@ static void wt_status_print_changed(struct wt_status *s)
        if (!worktree_changes)
                return;
 
-       wt_status_print_dirty_header(s, worktree_changes < 0, dirty_submodules);
+       wt_longstatus_print_dirty_header(s, worktree_changes < 0, dirty_submodules);
 
        for (i = 0; i < s->change.nr; i++) {
                struct wt_status_change_data *d;
@@ -721,12 +796,12 @@ static void wt_status_print_changed(struct wt_status *s)
                if (!d->worktree_status ||
                    d->worktree_status == DIFF_STATUS_UNMERGED)
                        continue;
-               wt_status_print_change_data(s, WT_STATUS_CHANGED, it);
+               wt_longstatus_print_change_data(s, WT_STATUS_CHANGED, it);
        }
-       wt_status_print_trailer(s);
+       wt_longstatus_print_trailer(s);
 }
 
-static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitted)
+static void wt_longstatus_print_submodule_summary(struct wt_status *s, int uncommitted)
 {
        struct child_process sm_summary = CHILD_PROCESS_INIT;
        struct strbuf cmd_stdout = STRBUF_INIT;
@@ -772,10 +847,10 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt
        strbuf_release(&summary);
 }
 
-static void wt_status_print_other(struct wt_status *s,
-                                 struct string_list *l,
-                                 const char *what,
-                                 const char *how)
+static void wt_longstatus_print_other(struct wt_status *s,
+                                     struct string_list *l,
+                                     const char *what,
+                                     const char *how)
 {
        int i;
        struct strbuf buf = STRBUF_INIT;
@@ -785,7 +860,7 @@ static void wt_status_print_other(struct wt_status *s,
        if (!l->nr)
                return;
 
-       wt_status_print_other_header(s, what, how);
+       wt_longstatus_print_other_header(s, what, how);
 
        for (i = 0; i < l->nr; i++) {
                struct string_list_item *it;
@@ -821,17 +896,18 @@ conclude:
        status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
 }
 
-void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
+size_t wt_status_locate_end(const char *s, size_t len)
 {
        const char *p;
        struct strbuf pattern = STRBUF_INIT;
 
        strbuf_addf(&pattern, "\n%c %s", comment_line_char, cut_line);
-       if (starts_with(buf->buf, pattern.buf + 1))
-               strbuf_setlen(buf, 0);
-       else if ((p = strstr(buf->buf, pattern.buf)))
-               strbuf_setlen(buf, p - buf->buf + 1);
+       if (starts_with(s, pattern.buf + 1))
+               len = 0;
+       else if ((p = strstr(s, pattern.buf)))
+               len = p - s + 1;
        strbuf_release(&pattern);
+       return len;
 }
 
 void wt_status_add_cut_line(FILE *fp)
@@ -845,7 +921,7 @@ void wt_status_add_cut_line(FILE *fp)
        strbuf_release(&buf);
 }
 
-static void wt_status_print_verbose(struct wt_status *s)
+static void wt_longstatus_print_verbose(struct wt_status *s)
 {
        struct rev_info rev;
        struct setup_revision_opt opt;
@@ -854,6 +930,7 @@ static void wt_status_print_verbose(struct wt_status *s)
 
        init_revisions(&rev, NULL);
        DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV);
+       rev.diffopt.ita_invisible_in_index = 1;
 
        memset(&opt, 0, sizeof(opt));
        opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;
@@ -878,7 +955,7 @@ static void wt_status_print_verbose(struct wt_status *s)
        if (s->verbose > 1 && s->commitable) {
                /* print_updated() printed a header, so do we */
                if (s->fp != stdout)
-                       wt_status_print_trailer(s);
+                       wt_longstatus_print_trailer(s);
                status_printf_ln(s, c, _("Changes to be committed:"));
                rev.diffopt.a_prefix = "c/";
                rev.diffopt.b_prefix = "i/";
@@ -896,7 +973,7 @@ static void wt_status_print_verbose(struct wt_status *s)
        }
 }
 
-static void wt_status_print_tracking(struct wt_status *s)
+static void wt_longstatus_print_tracking(struct wt_status *s)
 {
        struct strbuf sb = STRBUF_INIT;
        const char *cp, *ep, *branch_name;
@@ -962,7 +1039,7 @@ static void show_merge_in_progress(struct wt_status *s,
                        status_printf_ln(s, color,
                                _("  (use \"git commit\" to conclude merge)"));
        }
-       wt_status_print_trailer(s);
+       wt_longstatus_print_trailer(s);
 }
 
 static void show_am_in_progress(struct wt_status *s,
@@ -983,7 +1060,7 @@ static void show_am_in_progress(struct wt_status *s,
                status_printf_ln(s, color,
                        _("  (use \"git am --abort\" to restore the original branch)"));
        }
-       wt_status_print_trailer(s);
+       wt_longstatus_print_trailer(s);
 }
 
 static char *read_line_from_git_path(const char *filename)
@@ -1006,29 +1083,29 @@ static char *read_line_from_git_path(const char *filename)
 static int split_commit_in_progress(struct wt_status *s)
 {
        int split_in_progress = 0;
-       char *head = read_line_from_git_path("HEAD");
-       char *orig_head = read_line_from_git_path("ORIG_HEAD");
-       char *rebase_amend = read_line_from_git_path("rebase-merge/amend");
-       char *rebase_orig_head = read_line_from_git_path("rebase-merge/orig-head");
+       char *head, *orig_head, *rebase_amend, *rebase_orig_head;
 
-       if (!head || !orig_head || !rebase_amend || !rebase_orig_head ||
+       if ((!s->amend && !s->nowarn && !s->workdir_dirty) ||
            !s->branch || strcmp(s->branch, "HEAD"))
-               return split_in_progress;
+               return 0;
 
-       if (!strcmp(rebase_amend, rebase_orig_head)) {
-               if (strcmp(head, rebase_amend))
-                       split_in_progress = 1;
-       } else if (strcmp(orig_head, rebase_orig_head)) {
-               split_in_progress = 1;
-       }
+       head = read_line_from_git_path("HEAD");
+       orig_head = read_line_from_git_path("ORIG_HEAD");
+       rebase_amend = read_line_from_git_path("rebase-merge/amend");
+       rebase_orig_head = read_line_from_git_path("rebase-merge/orig-head");
 
-       if (!s->amend && !s->nowarn && !s->workdir_dirty)
-               split_in_progress = 0;
+       if (!head || !orig_head || !rebase_amend || !rebase_orig_head)
+               ; /* fall through, no split in progress */
+       else if (!strcmp(rebase_amend, rebase_orig_head))
+               split_in_progress = !!strcmp(head, rebase_amend);
+       else if (strcmp(orig_head, rebase_orig_head))
+               split_in_progress = 1;
 
        free(head);
        free(orig_head);
        free(rebase_amend);
        free(rebase_orig_head);
+
        return split_in_progress;
 }
 
@@ -1052,16 +1129,16 @@ static void abbrev_sha1_in_line(struct strbuf *line)
 
        split = strbuf_split_max(line, ' ', 3);
        if (split[0] && split[1]) {
-               unsigned char sha1[20];
+               struct object_id oid;
 
                /*
                 * strbuf_split_max left a space. Trim it and re-add
                 * it after abbreviation.
                 */
                strbuf_trim(split[1]);
-               if (!get_sha1(split[1]->buf, sha1)) {
+               if (!get_oid(split[1]->buf, &oid)) {
                        strbuf_reset(split[1]);
-                       strbuf_add_unique_abbrev(split[1], sha1,
+                       strbuf_add_unique_abbrev(split[1], oid.hash,
                                                 DEFAULT_ABBREV);
                        strbuf_addch(split[1], ' ');
                        strbuf_reset(line);
@@ -1072,14 +1149,17 @@ static void abbrev_sha1_in_line(struct strbuf *line)
        strbuf_list_free(split);
 }
 
-static void read_rebase_todolist(const char *fname, struct string_list *lines)
+static int read_rebase_todolist(const char *fname, struct string_list *lines)
 {
        struct strbuf line = STRBUF_INIT;
        FILE *f = fopen(git_path("%s", fname), "r");
 
-       if (!f)
+       if (!f) {
+               if (errno == ENOENT)
+                       return -1;
                die_errno("Could not open file %s for reading",
                          git_path("%s", fname));
+       }
        while (!strbuf_getline_lf(&line, f)) {
                if (line.len && line.buf[0] == comment_line_char)
                        continue;
@@ -1089,6 +1169,8 @@ static void read_rebase_todolist(const char *fname, struct string_list *lines)
                abbrev_sha1_in_line(&line);
                string_list_append(lines, line.buf);
        }
+       fclose(f);
+       return 0;
 }
 
 static void show_rebase_information(struct wt_status *s,
@@ -1103,8 +1185,10 @@ static void show_rebase_information(struct wt_status *s,
                struct string_list yet_to_do = STRING_LIST_INIT_DUP;
 
                read_rebase_todolist("rebase-merge/done", &have_done);
-               read_rebase_todolist("rebase-merge/git-rebase-todo", &yet_to_do);
-
+               if (read_rebase_todolist("rebase-merge/git-rebase-todo",
+                                        &yet_to_do))
+                       status_printf_ln(s, color,
+                               _("git-rebase-todo is missing."));
                if (have_done.nr == 0)
                        status_printf_ln(s, color, _("No commands done."));
                else {
@@ -1207,7 +1291,7 @@ static void show_rebase_in_progress(struct wt_status *s,
                                _("  (use \"git rebase --continue\" once you are satisfied with your changes)"));
                }
        }
-       wt_status_print_trailer(s);
+       wt_longstatus_print_trailer(s);
 }
 
 static void show_cherry_pick_in_progress(struct wt_status *s,
@@ -1226,7 +1310,7 @@ static void show_cherry_pick_in_progress(struct wt_status *s,
                status_printf_ln(s, color,
                        _("  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"));
        }
-       wt_status_print_trailer(s);
+       wt_longstatus_print_trailer(s);
 }
 
 static void show_revert_in_progress(struct wt_status *s,
@@ -1245,7 +1329,7 @@ static void show_revert_in_progress(struct wt_status *s,
                status_printf_ln(s, color,
                        _("  (use \"git revert --abort\" to cancel the revert operation)"));
        }
-       wt_status_print_trailer(s);
+       wt_longstatus_print_trailer(s);
 }
 
 static void show_bisect_in_progress(struct wt_status *s,
@@ -1262,7 +1346,7 @@ static void show_bisect_in_progress(struct wt_status *s,
        if (s->hints)
                status_printf_ln(s, color,
                        _("  (use \"git bisect reset\" to get back to the original branch)"));
-       wt_status_print_trailer(s);
+       wt_longstatus_print_trailer(s);
 }
 
 /*
@@ -1271,7 +1355,7 @@ static void show_bisect_in_progress(struct wt_status *s,
 static char *get_branch(const struct worktree *wt, const char *path)
 {
        struct strbuf sb = STRBUF_INIT;
-       unsigned char sha1[20];
+       struct object_id oid;
        const char *branch_name;
 
        if (strbuf_read_file(&sb, worktree_git_path(wt, "%s", path), 0) <= 0)
@@ -1285,9 +1369,9 @@ static char *get_branch(const struct worktree *wt, const char *path)
                strbuf_remove(&sb, 0, branch_name - sb.buf);
        else if (starts_with(sb.buf, "refs/"))
                ;
-       else if (!get_sha1_hex(sb.buf, sha1)) {
+       else if (!get_oid_hex(sb.buf, &oid)) {
                strbuf_reset(&sb);
-               strbuf_add_unique_abbrev(&sb, sha1, DEFAULT_ABBREV);
+               strbuf_add_unique_abbrev(&sb, oid.hash, DEFAULT_ABBREV);
        } else if (!strcmp(sb.buf, "detached HEAD")) /* rebase */
                goto got_nothing;
        else                    /* bisect */
@@ -1301,10 +1385,10 @@ got_nothing:
 
 struct grab_1st_switch_cbdata {
        struct strbuf buf;
-       unsigned char nsha1[20];
+       struct object_id noid;
 };
 
-static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1,
+static int grab_1st_switch(struct object_id *ooid, struct object_id *noid,
                           const char *email, unsigned long timestamp, int tz,
                           const char *message, void *cb_data)
 {
@@ -1318,13 +1402,13 @@ static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1,
                return 0;
        target += strlen(" to ");
        strbuf_reset(&cb->buf);
-       hashcpy(cb->nsha1, nsha1);
+       oidcpy(&cb->noid, noid);
        end = strchrnul(target, '\n');
        strbuf_add(&cb->buf, target, end - target);
        if (!strcmp(cb->buf.buf, "HEAD")) {
                /* HEAD is relative. Resolve it to the right reflog entry. */
                strbuf_reset(&cb->buf);
-               strbuf_add_unique_abbrev(&cb->buf, nsha1, DEFAULT_ABBREV);
+               strbuf_add_unique_abbrev(&cb->buf, noid->hash, DEFAULT_ABBREV);
        }
        return 1;
 }
@@ -1333,7 +1417,7 @@ static void wt_status_get_detached_from(struct wt_status_state *state)
 {
        struct grab_1st_switch_cbdata cb;
        struct commit *commit;
-       unsigned char sha1[20];
+       struct object_id oid;
        char *ref = NULL;
 
        strbuf_init(&cb.buf, 0);
@@ -1342,22 +1426,22 @@ static void wt_status_get_detached_from(struct wt_status_state *state)
                return;
        }
 
-       if (dwim_ref(cb.buf.buf, cb.buf.len, sha1, &ref) == 1 &&
+       if (dwim_ref(cb.buf.buf, cb.buf.len, oid.hash, &ref) == 1 &&
            /* sha1 is a commit? match without further lookup */
-           (!hashcmp(cb.nsha1, sha1) ||
+           (!oidcmp(&cb.noid, &oid) ||
             /* perhaps sha1 is a tag, try to dereference to a commit */
-            ((commit = lookup_commit_reference_gently(sha1, 1)) != NULL &&
-             !hashcmp(cb.nsha1, commit->object.oid.hash)))) {
+            ((commit = lookup_commit_reference_gently(oid.hash, 1)) != NULL &&
+             !oidcmp(&cb.noid, &commit->object.oid)))) {
                const char *from = ref;
                if (!skip_prefix(from, "refs/tags/", &from))
                        skip_prefix(from, "refs/remotes/", &from);
                state->detached_from = xstrdup(from);
        } else
                state->detached_from =
-                       xstrdup(find_unique_abbrev(cb.nsha1, DEFAULT_ABBREV));
-       hashcpy(state->detached_sha1, cb.nsha1);
-       state->detached_at = !get_sha1("HEAD", sha1) &&
-                            !hashcmp(sha1, state->detached_sha1);
+                       xstrdup(find_unique_abbrev(cb.noid.hash, DEFAULT_ABBREV));
+       hashcpy(state->detached_sha1, cb.noid.hash);
+       state->detached_at = !get_oid("HEAD", &oid) &&
+                            !hashcmp(oid.hash, state->detached_sha1);
 
        free(ref);
        strbuf_release(&cb.buf);
@@ -1407,30 +1491,30 @@ void wt_status_get_state(struct wt_status_state *state,
                         int get_detached_from)
 {
        struct stat st;
-       unsigned char sha1[20];
+       struct object_id oid;
 
        if (!stat(git_path_merge_head(), &st)) {
                state->merge_in_progress = 1;
        } else if (wt_status_check_rebase(NULL, state)) {
                ;               /* all set */
        } else if (!stat(git_path_cherry_pick_head(), &st) &&
-                       !get_sha1("CHERRY_PICK_HEAD", sha1)) {
+                       !get_oid("CHERRY_PICK_HEAD", &oid)) {
                state->cherry_pick_in_progress = 1;
-               hashcpy(state->cherry_pick_head_sha1, sha1);
+               hashcpy(state->cherry_pick_head_sha1, oid.hash);
        }
        wt_status_check_bisect(NULL, state);
        if (!stat(git_path_revert_head(), &st) &&
-           !get_sha1("REVERT_HEAD", sha1)) {
+           !get_oid("REVERT_HEAD", &oid)) {
                state->revert_in_progress = 1;
-               hashcpy(state->revert_head_sha1, sha1);
+               hashcpy(state->revert_head_sha1, oid.hash);
        }
 
        if (get_detached_from)
                wt_status_get_detached_from(state);
 }
 
-static void wt_status_print_state(struct wt_status *s,
-                                 struct wt_status_state *state)
+static void wt_longstatus_print_state(struct wt_status *s,
+                                     struct wt_status_state *state)
 {
        const char *state_color = color(WT_STATUS_HEADER, s);
        if (state->merge_in_progress)
@@ -1447,7 +1531,7 @@ static void wt_status_print_state(struct wt_status *s,
                show_bisect_in_progress(s, state, state_color);
 }
 
-void wt_status_print(struct wt_status *s)
+static void wt_longstatus_print(struct wt_status *s)
 {
        const char *branch_color = color(WT_STATUS_ONBRANCH, s);
        const char *branch_status_color = color(WT_STATUS_HEADER, s);
@@ -1484,10 +1568,10 @@ void wt_status_print(struct wt_status *s)
                status_printf_more(s, branch_status_color, "%s", on_what);
                status_printf_more(s, branch_color, "%s\n", branch_name);
                if (!s->is_initial)
-                       wt_status_print_tracking(s);
+                       wt_longstatus_print_tracking(s);
        }
 
-       wt_status_print_state(s, &state);
+       wt_longstatus_print_state(s, &state);
        free(state.branch);
        free(state.onto);
        free(state.detached_from);
@@ -1498,19 +1582,19 @@ void wt_status_print(struct wt_status *s)
                status_printf_ln(s, color(WT_STATUS_HEADER, s), "%s", "");
        }
 
-       wt_status_print_updated(s);
-       wt_status_print_unmerged(s);
-       wt_status_print_changed(s);
+       wt_longstatus_print_updated(s);
+       wt_longstatus_print_unmerged(s);
+       wt_longstatus_print_changed(s);
        if (s->submodule_summary &&
            (!s->ignore_submodule_arg ||
             strcmp(s->ignore_submodule_arg, "all"))) {
-               wt_status_print_submodule_summary(s, 0);  /* staged */
-               wt_status_print_submodule_summary(s, 1);  /* unstaged */
+               wt_longstatus_print_submodule_summary(s, 0);  /* staged */
+               wt_longstatus_print_submodule_summary(s, 1);  /* unstaged */
        }
        if (s->show_untracked_files) {
-               wt_status_print_other(s, &s->untracked, _("Untracked files"), "add");
+               wt_longstatus_print_other(s, &s->untracked, _("Untracked files"), "add");
                if (s->show_ignored_files)
-                       wt_status_print_other(s, &s->ignored, _("Ignored files"), "add -f");
+                       wt_longstatus_print_other(s, &s->ignored, _("Ignored files"), "add -f");
                if (advice_status_u_option && 2000 < s->untracked_in_ms) {
                        status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
                        status_printf_ln(s, GIT_COLOR_NORMAL,
@@ -1525,7 +1609,7 @@ void wt_status_print(struct wt_status *s)
                        ? _(" (use -u option to show untracked files)") : "");
 
        if (s->verbose)
-               wt_status_print_verbose(s);
+               wt_longstatus_print_verbose(s);
        if (!s->commitable) {
                if (s->amend)
                        status_printf_ln(s, GIT_COLOR_NORMAL, _("No changes"));
@@ -1661,12 +1745,14 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
                return;
        branch_name = s->branch;
 
+#define LABEL(string) (s->no_gettext ? (string) : _(string))
+
        if (s->is_initial)
-               color_fprintf(s->fp, header_color, _("Initial commit on "));
+               color_fprintf(s->fp, header_color, LABEL(N_("Initial commit on ")));
 
        if (!strcmp(s->branch, "HEAD")) {
                color_fprintf(s->fp, color(WT_STATUS_NOBRANCH, s), "%s",
-                             _("HEAD (no branch)"));
+                             LABEL(N_("HEAD (no branch)")));
                goto conclude;
        }
 
@@ -1691,8 +1777,6 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
        if (!upstream_is_gone && !num_ours && !num_theirs)
                goto conclude;
 
-#define LABEL(string) (s->no_gettext ? (string) : _(string))
-
        color_fprintf(s->fp, header_color, " [");
        if (upstream_is_gone) {
                color_fprintf(s->fp, header_color, LABEL(N_("gone")));
@@ -1714,39 +1798,29 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
        fputc(s->null_termination ? '\0' : '\n', s->fp);
 }
 
-void wt_shortstatus_print(struct wt_status *s)
+static void wt_shortstatus_print(struct wt_status *s)
 {
-       int i;
+       struct string_list_item *it;
 
        if (s->show_branch)
                wt_shortstatus_print_tracking(s);
 
-       for (i = 0; i < s->change.nr; i++) {
-               struct wt_status_change_data *d;
-               struct string_list_item *it;
+       for_each_string_list_item(it, &s->change) {
+               struct wt_status_change_data *d = it->util;
 
-               it = &(s->change.items[i]);
-               d = it->util;
                if (d->stagemask)
                        wt_shortstatus_unmerged(it, s);
                else
                        wt_shortstatus_status(it, s);
        }
-       for (i = 0; i < s->untracked.nr; i++) {
-               struct string_list_item *it;
-
-               it = &(s->untracked.items[i]);
+       for_each_string_list_item(it, &s->untracked)
                wt_shortstatus_other(it, s, "??");
-       }
-       for (i = 0; i < s->ignored.nr; i++) {
-               struct string_list_item *it;
 
-               it = &(s->ignored.items[i]);
+       for_each_string_list_item(it, &s->ignored)
                wt_shortstatus_other(it, s, "!!");
-       }
 }
 
-void wt_porcelain_print(struct wt_status *s)
+static void wt_porcelain_print(struct wt_status *s)
 {
        s->use_color = 0;
        s->relative_paths = 0;
@@ -1754,3 +1828,476 @@ void wt_porcelain_print(struct wt_status *s)
        s->no_gettext = 1;
        wt_shortstatus_print(s);
 }
+
+/*
+ * Print branch information for porcelain v2 output.  These lines
+ * are printed when the '--branch' parameter is given.
+ *
+ *    # branch.oid <commit><eol>
+ *    # branch.head <head><eol>
+ *   [# branch.upstream <upstream><eol>
+ *   [# branch.ab +<ahead> -<behind><eol>]]
+ *
+ *      <commit> ::= the current commit hash or the the literal
+ *                   "(initial)" to indicate an initialized repo
+ *                   with no commits.
+ *
+ *        <head> ::= <branch_name> the current branch name or
+ *                   "(detached)" literal when detached head or
+ *                   "(unknown)" when something is wrong.
+ *
+ *    <upstream> ::= the upstream branch name, when set.
+ *
+ *       <ahead> ::= integer ahead value, when upstream set
+ *                   and the commit is present (not gone).
+ *
+ *      <behind> ::= integer behind value, when upstream set
+ *                   and commit is present.
+ *
+ *
+ * The end-of-line is defined by the -z flag.
+ *
+ *                 <eol> ::= NUL when -z,
+ *                           LF when NOT -z.
+ *
+ */
+static void wt_porcelain_v2_print_tracking(struct wt_status *s)
+{
+       struct branch *branch;
+       const char *base;
+       const char *branch_name;
+       struct wt_status_state state;
+       int ab_info, nr_ahead, nr_behind;
+       char eol = s->null_termination ? '\0' : '\n';
+
+       memset(&state, 0, sizeof(state));
+       wt_status_get_state(&state, s->branch && !strcmp(s->branch, "HEAD"));
+
+       fprintf(s->fp, "# branch.oid %s%c",
+                       (s->is_initial ? "(initial)" : sha1_to_hex(s->sha1_commit)),
+                       eol);
+
+       if (!s->branch)
+               fprintf(s->fp, "# branch.head %s%c", "(unknown)", eol);
+       else {
+               if (!strcmp(s->branch, "HEAD")) {
+                       fprintf(s->fp, "# branch.head %s%c", "(detached)", eol);
+
+                       if (state.rebase_in_progress || state.rebase_interactive_in_progress)
+                               branch_name = state.onto;
+                       else if (state.detached_from)
+                               branch_name = state.detached_from;
+                       else
+                               branch_name = "";
+               } else {
+                       branch_name = NULL;
+                       skip_prefix(s->branch, "refs/heads/", &branch_name);
+
+                       fprintf(s->fp, "# branch.head %s%c", branch_name, eol);
+               }
+
+               /* Lookup stats on the upstream tracking branch, if set. */
+               branch = branch_get(branch_name);
+               base = NULL;
+               ab_info = (stat_tracking_info(branch, &nr_ahead, &nr_behind, &base) == 0);
+               if (base) {
+                       base = shorten_unambiguous_ref(base, 0);
+                       fprintf(s->fp, "# branch.upstream %s%c", base, eol);
+                       free((char *)base);
+
+                       if (ab_info)
+                               fprintf(s->fp, "# branch.ab +%d -%d%c", nr_ahead, nr_behind, eol);
+               }
+       }
+
+       free(state.branch);
+       free(state.onto);
+       free(state.detached_from);
+}
+
+/*
+ * Convert various submodule status values into a
+ * fixed-length string of characters in the buffer provided.
+ */
+static void wt_porcelain_v2_submodule_state(
+       struct wt_status_change_data *d,
+       char sub[5])
+{
+       if (S_ISGITLINK(d->mode_head) ||
+               S_ISGITLINK(d->mode_index) ||
+               S_ISGITLINK(d->mode_worktree)) {
+               sub[0] = 'S';
+               sub[1] = d->new_submodule_commits ? 'C' : '.';
+               sub[2] = (d->dirty_submodule & DIRTY_SUBMODULE_MODIFIED) ? 'M' : '.';
+               sub[3] = (d->dirty_submodule & DIRTY_SUBMODULE_UNTRACKED) ? 'U' : '.';
+       } else {
+               sub[0] = 'N';
+               sub[1] = '.';
+               sub[2] = '.';
+               sub[3] = '.';
+       }
+       sub[4] = 0;
+}
+
+/*
+ * Fix-up changed entries before we print them.
+ */
+static void wt_porcelain_v2_fix_up_changed(
+       struct string_list_item *it,
+       struct wt_status *s)
+{
+       struct wt_status_change_data *d = it->util;
+
+       if (!d->index_status) {
+               /*
+                * This entry is unchanged in the index (relative to the head).
+                * Therefore, the collect_updated_cb was never called for this
+                * entry (during the head-vs-index scan) and so the head column
+                * fields were never set.
+                *
+                * We must have data for the index column (from the
+                * index-vs-worktree scan (otherwise, this entry should not be
+                * in the list of changes)).
+                *
+                * Copy index column fields to the head column, so that our
+                * output looks complete.
+                */
+               assert(d->mode_head == 0);
+               d->mode_head = d->mode_index;
+               oidcpy(&d->oid_head, &d->oid_index);
+       }
+
+       if (!d->worktree_status) {
+               /*
+                * This entry is unchanged in the worktree (relative to the index).
+                * Therefore, the collect_changed_cb was never called for this entry
+                * (during the index-vs-worktree scan) and so the worktree column
+                * fields were never set.
+                *
+                * We must have data for the index column (from the head-vs-index
+                * scan).
+                *
+                * Copy the index column fields to the worktree column so that
+                * our output looks complete.
+                *
+                * Note that we only have a mode field in the worktree column
+                * because the scan code tries really hard to not have to compute it.
+                */
+               assert(d->mode_worktree == 0);
+               d->mode_worktree = d->mode_index;
+       }
+}
+
+/*
+ * Print porcelain v2 info for tracked entries with changes.
+ */
+static void wt_porcelain_v2_print_changed_entry(
+       struct string_list_item *it,
+       struct wt_status *s)
+{
+       struct wt_status_change_data *d = it->util;
+       struct strbuf buf_index = STRBUF_INIT;
+       struct strbuf buf_head = STRBUF_INIT;
+       const char *path_index = NULL;
+       const char *path_head = NULL;
+       char key[3];
+       char submodule_token[5];
+       char sep_char, eol_char;
+
+       wt_porcelain_v2_fix_up_changed(it, s);
+       wt_porcelain_v2_submodule_state(d, submodule_token);
+
+       key[0] = d->index_status ? d->index_status : '.';
+       key[1] = d->worktree_status ? d->worktree_status : '.';
+       key[2] = 0;
+
+       if (s->null_termination) {
+               /*
+                * In -z mode, we DO NOT C-quote pathnames.  Current path is ALWAYS first.
+                * A single NUL character separates them.
+                */
+               sep_char = '\0';
+               eol_char = '\0';
+               path_index = it->string;
+               path_head = d->head_path;
+       } else {
+               /*
+                * Path(s) are C-quoted if necessary. Current path is ALWAYS first.
+                * The source path is only present when necessary.
+                * A single TAB separates them (because paths can contain spaces
+                * which are not escaped and C-quoting does escape TAB characters).
+                */
+               sep_char = '\t';
+               eol_char = '\n';
+               path_index = quote_path(it->string, s->prefix, &buf_index);
+               if (d->head_path)
+                       path_head = quote_path(d->head_path, s->prefix, &buf_head);
+       }
+
+       if (path_head)
+               fprintf(s->fp, "2 %s %s %06o %06o %06o %s %s %c%d %s%c%s%c",
+                               key, submodule_token,
+                               d->mode_head, d->mode_index, d->mode_worktree,
+                               oid_to_hex(&d->oid_head), oid_to_hex(&d->oid_index),
+                               key[0], d->score,
+                               path_index, sep_char, path_head, eol_char);
+       else
+               fprintf(s->fp, "1 %s %s %06o %06o %06o %s %s %s%c",
+                               key, submodule_token,
+                               d->mode_head, d->mode_index, d->mode_worktree,
+                               oid_to_hex(&d->oid_head), oid_to_hex(&d->oid_index),
+                               path_index, eol_char);
+
+       strbuf_release(&buf_index);
+       strbuf_release(&buf_head);
+}
+
+/*
+ * Print porcelain v2 status info for unmerged entries.
+ */
+static void wt_porcelain_v2_print_unmerged_entry(
+       struct string_list_item *it,
+       struct wt_status *s)
+{
+       struct wt_status_change_data *d = it->util;
+       const struct cache_entry *ce;
+       struct strbuf buf_index = STRBUF_INIT;
+       const char *path_index = NULL;
+       int pos, stage, sum;
+       struct {
+               int mode;
+               struct object_id oid;
+       } stages[3];
+       char *key;
+       char submodule_token[5];
+       char unmerged_prefix = 'u';
+       char eol_char = s->null_termination ? '\0' : '\n';
+
+       wt_porcelain_v2_submodule_state(d, submodule_token);
+
+       switch (d->stagemask) {
+       case 1: key = "DD"; break; /* both deleted */
+       case 2: key = "AU"; break; /* added by us */
+       case 3: key = "UD"; break; /* deleted by them */
+       case 4: key = "UA"; break; /* added by them */
+       case 5: key = "DU"; break; /* deleted by us */
+       case 6: key = "AA"; break; /* both added */
+       case 7: key = "UU"; break; /* both modified */
+       default:
+               die("BUG: unhandled unmerged status %x", d->stagemask);
+       }
+
+       /*
+        * Disregard d.aux.porcelain_v2 data that we accumulated
+        * for the head and index columns during the scans and
+        * replace with the actual stage data.
+        *
+        * Note that this is a last-one-wins for each the individual
+        * stage [123] columns in the event of multiple cache entries
+        * for same stage.
+        */
+       memset(stages, 0, sizeof(stages));
+       sum = 0;
+       pos = cache_name_pos(it->string, strlen(it->string));
+       assert(pos < 0);
+       pos = -pos-1;
+       while (pos < active_nr) {
+               ce = active_cache[pos++];
+               stage = ce_stage(ce);
+               if (strcmp(ce->name, it->string) || !stage)
+                       break;
+               stages[stage - 1].mode = ce->ce_mode;
+               oidcpy(&stages[stage - 1].oid, &ce->oid);
+               sum |= (1 << (stage - 1));
+       }
+       if (sum != d->stagemask)
+               die("BUG: observed stagemask 0x%x != expected stagemask 0x%x", sum, d->stagemask);
+
+       if (s->null_termination)
+               path_index = it->string;
+       else
+               path_index = quote_path(it->string, s->prefix, &buf_index);
+
+       fprintf(s->fp, "%c %s %s %06o %06o %06o %06o %s %s %s %s%c",
+                       unmerged_prefix, key, submodule_token,
+                       stages[0].mode, /* stage 1 */
+                       stages[1].mode, /* stage 2 */
+                       stages[2].mode, /* stage 3 */
+                       d->mode_worktree,
+                       oid_to_hex(&stages[0].oid), /* stage 1 */
+                       oid_to_hex(&stages[1].oid), /* stage 2 */
+                       oid_to_hex(&stages[2].oid), /* stage 3 */
+                       path_index,
+                       eol_char);
+
+       strbuf_release(&buf_index);
+}
+
+/*
+ * Print porcelain V2 status info for untracked and ignored entries.
+ */
+static void wt_porcelain_v2_print_other(
+       struct string_list_item *it,
+       struct wt_status *s,
+       char prefix)
+{
+       struct strbuf buf = STRBUF_INIT;
+       const char *path;
+       char eol_char;
+
+       if (s->null_termination) {
+               path = it->string;
+               eol_char = '\0';
+       } else {
+               path = quote_path(it->string, s->prefix, &buf);
+               eol_char = '\n';
+       }
+
+       fprintf(s->fp, "%c %s%c", prefix, path, eol_char);
+
+       strbuf_release(&buf);
+}
+
+/*
+ * Print porcelain V2 status.
+ *
+ * [<v2_branch>]
+ * [<v2_changed_items>]*
+ * [<v2_unmerged_items>]*
+ * [<v2_untracked_items>]*
+ * [<v2_ignored_items>]*
+ *
+ */
+static void wt_porcelain_v2_print(struct wt_status *s)
+{
+       struct wt_status_change_data *d;
+       struct string_list_item *it;
+       int i;
+
+       if (s->show_branch)
+               wt_porcelain_v2_print_tracking(s);
+
+       for (i = 0; i < s->change.nr; i++) {
+               it = &(s->change.items[i]);
+               d = it->util;
+               if (!d->stagemask)
+                       wt_porcelain_v2_print_changed_entry(it, s);
+       }
+
+       for (i = 0; i < s->change.nr; i++) {
+               it = &(s->change.items[i]);
+               d = it->util;
+               if (d->stagemask)
+                       wt_porcelain_v2_print_unmerged_entry(it, s);
+       }
+
+       for (i = 0; i < s->untracked.nr; i++) {
+               it = &(s->untracked.items[i]);
+               wt_porcelain_v2_print_other(it, s, '?');
+       }
+
+       for (i = 0; i < s->ignored.nr; i++) {
+               it = &(s->ignored.items[i]);
+               wt_porcelain_v2_print_other(it, s, '!');
+       }
+}
+
+void wt_status_print(struct wt_status *s)
+{
+       switch (s->status_format) {
+       case STATUS_FORMAT_SHORT:
+               wt_shortstatus_print(s);
+               break;
+       case STATUS_FORMAT_PORCELAIN:
+               wt_porcelain_print(s);
+               break;
+       case STATUS_FORMAT_PORCELAIN_V2:
+               wt_porcelain_v2_print(s);
+               break;
+       case STATUS_FORMAT_UNSPECIFIED:
+               die("BUG: finalize_deferred_config() should have been called");
+               break;
+       case STATUS_FORMAT_NONE:
+       case STATUS_FORMAT_LONG:
+               wt_longstatus_print(s);
+               break;
+       }
+}
+
+/**
+ * Returns 1 if there are unstaged changes, 0 otherwise.
+ */
+int has_unstaged_changes(int ignore_submodules)
+{
+       struct rev_info rev_info;
+       int result;
+
+       init_revisions(&rev_info, NULL);
+       if (ignore_submodules)
+               DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
+       DIFF_OPT_SET(&rev_info.diffopt, QUICK);
+       diff_setup_done(&rev_info.diffopt);
+       result = run_diff_files(&rev_info, 0);
+       return diff_result_code(&rev_info.diffopt, result);
+}
+
+/**
+ * Returns 1 if there are uncommitted changes, 0 otherwise.
+ */
+int has_uncommitted_changes(int ignore_submodules)
+{
+       struct rev_info rev_info;
+       int result;
+
+       if (is_cache_unborn())
+               return 0;
+
+       init_revisions(&rev_info, NULL);
+       if (ignore_submodules)
+               DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
+       DIFF_OPT_SET(&rev_info.diffopt, QUICK);
+       add_head_to_pending(&rev_info);
+       diff_setup_done(&rev_info.diffopt);
+       result = run_diff_index(&rev_info, 1);
+       return diff_result_code(&rev_info.diffopt, result);
+}
+
+/**
+ * If the work tree has unstaged or uncommitted changes, dies with the
+ * appropriate message.
+ */
+int require_clean_work_tree(const char *action, const char *hint, int ignore_submodules, int gently)
+{
+       struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
+       int err = 0, fd;
+
+       fd = hold_locked_index(lock_file, 0);
+       refresh_cache(REFRESH_QUIET);
+       if (0 <= fd)
+               update_index_if_able(&the_index, lock_file);
+       rollback_lock_file(lock_file);
+
+       if (has_unstaged_changes(ignore_submodules)) {
+               /* TRANSLATORS: the action is e.g. "pull with rebase" */
+               error(_("cannot %s: You have unstaged changes."), _(action));
+               err = 1;
+       }
+
+       if (has_uncommitted_changes(ignore_submodules)) {
+               if (err)
+                       error(_("additionally, your index contains uncommitted changes."));
+               else
+                       error(_("cannot %s: Your index contains uncommitted changes."),
+                             _(action));
+               err = 1;
+       }
+
+       if (err) {
+               if (hint)
+                       error("%s", hint);
+               if (!gently)
+                       exit(128);
+       }
+
+       return err;
+}
index 2ca93f6957f69cd5652ddc764f5afe81b598a2a9..8a3864783b039d92454cfda1c2ef2457e737cddd 100644 (file)
@@ -38,11 +38,24 @@ struct wt_status_change_data {
        int worktree_status;
        int index_status;
        int stagemask;
+       int score;
+       int mode_head, mode_index, mode_worktree;
+       struct object_id oid_head, oid_index;
        char *head_path;
        unsigned dirty_submodule       : 2;
        unsigned new_submodule_commits : 1;
 };
 
+enum wt_status_format {
+       STATUS_FORMAT_NONE = 0,
+       STATUS_FORMAT_LONG,
+       STATUS_FORMAT_SHORT,
+       STATUS_FORMAT_PORCELAIN,
+       STATUS_FORMAT_PORCELAIN_V2,
+
+       STATUS_FORMAT_UNSPECIFIED
+};
+
 struct wt_status {
        int is_initial;
        char *branch;
@@ -66,6 +79,9 @@ struct wt_status {
        int show_branch;
        int hints;
 
+       enum wt_status_format status_format;
+       unsigned char sha1_commit[GIT_MAX_RAWSZ]; /* when not Initial */
+
        /* These are computed during processing of the individual sections */
        int commitable;
        int workdir_dirty;
@@ -96,7 +112,7 @@ struct wt_status_state {
        unsigned char cherry_pick_head_sha1[20];
 };
 
-void wt_status_truncate_message_at_cut_line(struct strbuf *);
+size_t wt_status_locate_end(const char *s, size_t len);
 void wt_status_add_cut_line(FILE *fp);
 void wt_status_prepare(struct wt_status *s);
 void wt_status_print(struct wt_status *s);
@@ -107,12 +123,15 @@ int wt_status_check_rebase(const struct worktree *wt,
 int wt_status_check_bisect(const struct worktree *wt,
                           struct wt_status_state *state);
 
-void wt_shortstatus_print(struct wt_status *s);
-void wt_porcelain_print(struct wt_status *s);
-
 __attribute__((format (printf, 3, 4)))
 void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, ...);
 __attribute__((format (printf, 3, 4)))
 void status_printf(struct wt_status *s, const char *color, const char *fmt, ...);
 
+/* The following functions expect that the caller took care of reading the index. */
+int has_unstaged_changes(int ignore_submodules);
+int has_uncommitted_changes(int ignore_submodules);
+int require_clean_work_tree(const char *action, const char *hint,
+       int ignore_submodules, int gently);
+
 #endif /* STATUS_H */
index 50702a215d10729dca6a59b69a7e9bd27b29316e..060038c2d6b92512e6625d0f5d94ed5439cd249c 100644 (file)
@@ -178,20 +178,20 @@ int read_mmfile(mmfile_t *ptr, const char *filename)
        return 0;
 }
 
-void read_mmblob(mmfile_t *ptr, const unsigned char *sha1)
+void read_mmblob(mmfile_t *ptr, const struct object_id *oid)
 {
        unsigned long size;
        enum object_type type;
 
-       if (!hashcmp(sha1, null_sha1)) {
+       if (!oidcmp(oid, &null_oid)) {
                ptr->ptr = xstrdup("");
                ptr->size = 0;
                return;
        }
 
-       ptr->ptr = read_sha1_file(sha1, &type, &size);
+       ptr->ptr = read_sha1_file(oid->hash, &type, &size);
        if (!ptr->ptr || type != OBJ_BLOB)
-               die("unable to read blob object %s", sha1_to_hex(sha1));
+               die("unable to read blob object %s", oid_to_hex(oid));
        ptr->size = size;
 }
 
index fbb5a1c3949b6ef6ba0dfb758723a48f3b402190..6f6ba9095df1f81c975652ce515c451649974145 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef XDIFF_INTERFACE_H
 #define XDIFF_INTERFACE_H
 
+#include "cache.h"
 #include "xdiff/xdiff.h"
 
 /*
@@ -20,7 +21,7 @@ int parse_hunk_header(char *line, int len,
                      int *ob, int *on,
                      int *nb, int *nn);
 int read_mmfile(mmfile_t *ptr, const char *filename);
-void read_mmblob(mmfile_t *ptr, const unsigned char *sha1);
+void read_mmblob(mmfile_t *ptr, const struct object_id *oid);
 int buffer_is_binary(const char *ptr, unsigned long size);
 
 extern void xdiff_set_find_func(xdemitconf_t *xecfg, const char *line, int cflags);
index 7423f77fc8b2682c121e8d4adb855337e107b29e..b090ad8eacfe6ed171aa14b39901a8042ab678d9 100644 (file)
@@ -41,7 +41,7 @@ extern "C" {
 
 #define XDF_IGNORE_BLANK_LINES (1 << 7)
 
-#define XDF_COMPACTION_HEURISTIC (1 << 8)
+#define XDF_INDENT_HEURISTIC (1 << 8)
 
 #define XDL_EMIT_FUNCNAMES (1 << 0)
 #define XDL_EMIT_FUNCCONTEXT (1 << 2)
index b3c684887502c3c473a614114e4acdfbc57ea094..93a65680a18284041ce57f61191d20dcc763e022 100644 (file)
@@ -400,138 +400,544 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
 }
 
 
-static int is_blank_line(xrecord_t **recs, long ix, long flags)
+static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags)
 {
-       return xdl_blankline(recs[ix]->ptr, recs[ix]->size, flags);
+       return (rec1->ha == rec2->ha &&
+               xdl_recmatch(rec1->ptr, rec1->size,
+                            rec2->ptr, rec2->size,
+                            flags));
 }
 
-static int recs_match(xrecord_t **recs, long ixs, long ix, long flags)
+/*
+ * If a line is indented more than this, get_indent() just returns this value.
+ * This avoids having to do absurd amounts of work for data that are not
+ * human-readable text, and also ensures that the output of get_indent fits within
+ * an int.
+ */
+#define MAX_INDENT 200
+
+/*
+ * Return the amount of indentation of the specified line, treating TAB as 8
+ * columns. Return -1 if line is empty or contains only whitespace. Clamp the
+ * output value at MAX_INDENT.
+ */
+static int get_indent(xrecord_t *rec)
 {
-       return (recs[ixs]->ha == recs[ix]->ha &&
-               xdl_recmatch(recs[ixs]->ptr, recs[ixs]->size,
-                            recs[ix]->ptr, recs[ix]->size,
-                            flags));
+       long i;
+       int ret = 0;
+
+       for (i = 0; i < rec->size; i++) {
+               char c = rec->ptr[i];
+
+               if (!XDL_ISSPACE(c))
+                       return ret;
+               else if (c == ' ')
+                       ret += 1;
+               else if (c == '\t')
+                       ret += 8 - ret % 8;
+               /* ignore other whitespace characters */
+
+               if (ret >= MAX_INDENT)
+                       return MAX_INDENT;
+       }
+
+       /* The line contains only whitespace. */
+       return -1;
 }
 
-int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
-       long ix, ixo, ixs, ixref, grpsiz, nrec = xdf->nrec;
-       char *rchg = xdf->rchg, *rchgo = xdfo->rchg;
-       unsigned int blank_lines;
-       xrecord_t **recs = xdf->recs;
+/*
+ * If more than this number of consecutive blank rows are found, just return this
+ * value. This avoids requiring O(N^2) work for pathological cases, and also
+ * ensures that the output of score_split fits in an int.
+ */
+#define MAX_BLANKS 20
 
+/* Characteristics measured about a hypothetical split position. */
+struct split_measurement {
        /*
-        * This is the same of what GNU diff does. Move back and forward
-        * change groups for a consistent and pretty diff output. This also
-        * helps in finding joinable change groups and reduce the diff size.
+        * Is the split at the end of the file (aside from any blank lines)?
         */
-       for (ix = ixo = 0;;) {
-               /*
-                * Find the first changed line in the to-be-compacted file.
-                * We need to keep track of both indexes, so if we find a
-                * changed lines group on the other file, while scanning the
-                * to-be-compacted file, we need to skip it properly. Note
-                * that loops that are testing for changed lines on rchg* do
-                * not need index bounding since the array is prepared with
-                * a zero at position -1 and N.
-                */
-               for (; ix < nrec && !rchg[ix]; ix++)
-                       while (rchgo[ixo++]);
-               if (ix == nrec)
+       int end_of_file;
+
+       /*
+        * How much is the line immediately following the split indented (or -1 if
+        * the line is blank):
+        */
+       int indent;
+
+       /*
+        * How many consecutive lines above the split are blank?
+        */
+       int pre_blank;
+
+       /*
+        * How much is the nearest non-blank line above the split indented (or -1
+        * if there is no such line)?
+        */
+       int pre_indent;
+
+       /*
+        * How many lines after the line following the split are blank?
+        */
+       int post_blank;
+
+       /*
+        * How much is the nearest non-blank line after the line following the
+        * split indented (or -1 if there is no such line)?
+        */
+       int post_indent;
+};
+
+struct split_score {
+       /* The effective indent of this split (smaller is preferred). */
+       int effective_indent;
+
+       /* Penalty for this split (smaller is preferred). */
+       int penalty;
+};
+
+/*
+ * Fill m with information about a hypothetical split of xdf above line split.
+ */
+static void measure_split(const xdfile_t *xdf, long split,
+                         struct split_measurement *m)
+{
+       long i;
+
+       if (split >= xdf->nrec) {
+               m->end_of_file = 1;
+               m->indent = -1;
+       } else {
+               m->end_of_file = 0;
+               m->indent = get_indent(xdf->recs[split]);
+       }
+
+       m->pre_blank = 0;
+       m->pre_indent = -1;
+       for (i = split - 1; i >= 0; i--) {
+               m->pre_indent = get_indent(xdf->recs[i]);
+               if (m->pre_indent != -1)
                        break;
+               m->pre_blank += 1;
+               if (m->pre_blank == MAX_BLANKS) {
+                       m->pre_indent = 0;
+                       break;
+               }
+       }
+
+       m->post_blank = 0;
+       m->post_indent = -1;
+       for (i = split + 1; i < xdf->nrec; i++) {
+               m->post_indent = get_indent(xdf->recs[i]);
+               if (m->post_indent != -1)
+                       break;
+               m->post_blank += 1;
+               if (m->post_blank == MAX_BLANKS) {
+                       m->post_indent = 0;
+                       break;
+               }
+       }
+}
+
+/*
+ * The empirically-determined weight factors used by score_split() below.
+ * Larger values means that the position is a less favorable place to split.
+ *
+ * Note that scores are only ever compared against each other, so multiplying
+ * all of these weight/penalty values by the same factor wouldn't change the
+ * heuristic's behavior. Still, we need to set that arbitrary scale *somehow*.
+ * In practice, these numbers are chosen to be large enough that they can be
+ * adjusted relative to each other with sufficient precision despite using
+ * integer math.
+ */
+
+/* Penalty if there are no non-blank lines before the split */
+#define START_OF_FILE_PENALTY 1
+
+/* Penalty if there are no non-blank lines after the split */
+#define END_OF_FILE_PENALTY 21
+
+/* Multiplier for the number of blank lines around the split */
+#define TOTAL_BLANK_WEIGHT (-30)
+
+/* Multiplier for the number of blank lines after the split */
+#define POST_BLANK_WEIGHT 6
+
+/*
+ * Penalties applied if the line is indented more than its predecessor
+ */
+#define RELATIVE_INDENT_PENALTY (-4)
+#define RELATIVE_INDENT_WITH_BLANK_PENALTY 10
 
+/*
+ * Penalties applied if the line is indented less than both its predecessor and
+ * its successor
+ */
+#define RELATIVE_OUTDENT_PENALTY 24
+#define RELATIVE_OUTDENT_WITH_BLANK_PENALTY 17
+
+/*
+ * Penalties applied if the line is indented less than its predecessor but not
+ * less than its successor
+ */
+#define RELATIVE_DEDENT_PENALTY 23
+#define RELATIVE_DEDENT_WITH_BLANK_PENALTY 17
+
+/*
+ * We only consider whether the sum of the effective indents for splits are
+ * less than (-1), equal to (0), or greater than (+1) each other. The resulting
+ * value is multiplied by the following weight and combined with the penalty to
+ * determine the better of two scores.
+ */
+#define INDENT_WEIGHT 60
+
+/*
+ * Compute a badness score for the hypothetical split whose measurements are
+ * stored in m. The weight factors were determined empirically using the tools and
+ * corpus described in
+ *
+ *     https://github.com/mhagger/diff-slider-tools
+ *
+ * Also see that project if you want to improve the weights based on, for example,
+ * a larger or more diverse corpus.
+ */
+static void score_add_split(const struct split_measurement *m, struct split_score *s)
+{
+       /*
+        * A place to accumulate penalty factors (positive makes this index more
+        * favored):
+        */
+       int post_blank, total_blank, indent, any_blanks;
+
+       if (m->pre_indent == -1 && m->pre_blank == 0)
+               s->penalty += START_OF_FILE_PENALTY;
+
+       if (m->end_of_file)
+               s->penalty += END_OF_FILE_PENALTY;
+
+       /*
+        * Set post_blank to the number of blank lines following the split,
+        * including the line immediately after the split:
+        */
+       post_blank = (m->indent == -1) ? 1 + m->post_blank : 0;
+       total_blank = m->pre_blank + post_blank;
+
+       /* Penalties based on nearby blank lines: */
+       s->penalty += TOTAL_BLANK_WEIGHT * total_blank;
+       s->penalty += POST_BLANK_WEIGHT * post_blank;
+
+       if (m->indent != -1)
+               indent = m->indent;
+       else
+               indent = m->post_indent;
+
+       any_blanks = (total_blank != 0);
+
+       /* Note that the effective indent is -1 at the end of the file: */
+       s->effective_indent += indent;
+
+       if (indent == -1) {
+               /* No additional adjustments needed. */
+       } else if (m->pre_indent == -1) {
+               /* No additional adjustments needed. */
+       } else if (indent > m->pre_indent) {
+               /*
+                * The line is indented more than its predecessor.
+                */
+               s->penalty += any_blanks ?
+                       RELATIVE_INDENT_WITH_BLANK_PENALTY :
+                       RELATIVE_INDENT_PENALTY;
+       } else if (indent == m->pre_indent) {
                /*
-                * Record the start of a changed-group in the to-be-compacted file
-                * and find the end of it, on both to-be-compacted and other file
-                * indexes (ix and ixo).
+                * The line has the same indentation level as its predecessor.
+                * No additional adjustments needed.
                 */
-               ixs = ix;
-               for (ix++; rchg[ix]; ix++);
-               for (; rchgo[ixo]; ixo++);
+       } else {
+               /*
+                * The line is indented less than its predecessor. It could be
+                * the block terminator of the previous block, but it could
+                * also be the start of a new block (e.g., an "else" block, or
+                * maybe the previous block didn't have a block terminator).
+                * Try to distinguish those cases based on what comes next:
+                */
+               if (m->post_indent != -1 && m->post_indent > indent) {
+                       /*
+                        * The following line is indented more. So it is likely
+                        * that this line is the start of a block.
+                        */
+                       s->penalty += any_blanks ?
+                               RELATIVE_OUTDENT_WITH_BLANK_PENALTY :
+                               RELATIVE_OUTDENT_PENALTY;
+               } else {
+                       /*
+                        * That was probably the end of a block.
+                        */
+                       s->penalty += any_blanks ?
+                               RELATIVE_DEDENT_WITH_BLANK_PENALTY :
+                               RELATIVE_DEDENT_PENALTY;
+               }
+       }
+}
+
+static int score_cmp(struct split_score *s1, struct split_score *s2)
+{
+       /* -1 if s1.effective_indent < s2->effective_indent, etc. */
+       int cmp_indents = ((s1->effective_indent > s2->effective_indent) -
+                          (s1->effective_indent < s2->effective_indent));
+
+       return INDENT_WEIGHT * cmp_indents + (s1->penalty - s2->penalty);
+}
+
+/*
+ * Represent a group of changed lines in an xdfile_t (i.e., a contiguous group
+ * of lines that was inserted or deleted from the corresponding version of the
+ * file). We consider there to be such a group at the beginning of the file, at
+ * the end of the file, and between any two unchanged lines, though most such
+ * groups will usually be empty.
+ *
+ * If the first line in a group is equal to the line following the group, then
+ * the group can be slid down. Similarly, if the last line in a group is equal
+ * to the line preceding the group, then the group can be slid up. See
+ * group_slide_down() and group_slide_up().
+ *
+ * Note that loops that are testing for changed lines in xdf->rchg do not need
+ * index bounding since the array is prepared with a zero at position -1 and N.
+ */
+struct xdlgroup {
+       /*
+        * The index of the first changed line in the group, or the index of
+        * the unchanged line above which the (empty) group is located.
+        */
+       long start;
+
+       /*
+        * The index of the first unchanged line after the group. For an empty
+        * group, end is equal to start.
+        */
+       long end;
+};
+
+/*
+ * Initialize g to point at the first group in xdf.
+ */
+static void group_init(xdfile_t *xdf, struct xdlgroup *g)
+{
+       g->start = g->end = 0;
+       while (xdf->rchg[g->end])
+               g->end++;
+}
 
+/*
+ * Move g to describe the next (possibly empty) group in xdf and return 0. If g
+ * is already at the end of the file, do nothing and return -1.
+ */
+static inline int group_next(xdfile_t *xdf, struct xdlgroup *g)
+{
+       if (g->end == xdf->nrec)
+               return -1;
+
+       g->start = g->end + 1;
+       for (g->end = g->start; xdf->rchg[g->end]; g->end++)
+               ;
+
+       return 0;
+}
+
+/*
+ * Move g to describe the previous (possibly empty) group in xdf and return 0.
+ * If g is already at the beginning of the file, do nothing and return -1.
+ */
+static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
+{
+       if (g->start == 0)
+               return -1;
+
+       g->end = g->start - 1;
+       for (g->start = g->end; xdf->rchg[g->start - 1]; g->start--)
+               ;
+
+       return 0;
+}
+
+/*
+ * If g can be slid toward the end of the file, do so, and if it bumps into a
+ * following group, expand this group to include it. Return 0 on success or -1
+ * if g cannot be slid down.
+ */
+static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
+{
+       if (g->end < xdf->nrec &&
+           recs_match(xdf->recs[g->start], xdf->recs[g->end], flags)) {
+               xdf->rchg[g->start++] = 0;
+               xdf->rchg[g->end++] = 1;
+
+               while (xdf->rchg[g->end])
+                       g->end++;
+
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
+/*
+ * If g can be slid toward the beginning of the file, do so, and if it bumps
+ * into a previous group, expand this group to include it. Return 0 on success
+ * or -1 if g cannot be slid up.
+ */
+static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags)
+{
+       if (g->start > 0 &&
+           recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1], flags)) {
+               xdf->rchg[--g->start] = 1;
+               xdf->rchg[--g->end] = 0;
+
+               while (xdf->rchg[g->start - 1])
+                       g->start--;
+
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
+static void xdl_bug(const char *msg)
+{
+       fprintf(stderr, "BUG: %s\n", msg);
+       exit(1);
+}
+
+/*
+ * Move back and forward change groups for a consistent and pretty diff output.
+ * This also helps in finding joinable change groups and reducing the diff
+ * size.
+ */
+int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
+       struct xdlgroup g, go;
+       long earliest_end, end_matching_other;
+       long groupsize;
+
+       group_init(xdf, &g);
+       group_init(xdfo, &go);
+
+       while (1) {
+               /* If the group is empty in the to-be-compacted file, skip it: */
+               if (g.end == g.start)
+                       goto next;
+
+               /*
+                * Now shift the change up and then down as far as possible in
+                * each direction. If it bumps into any other changes, merge them.
+                */
                do {
-                       grpsiz = ix - ixs;
-                       blank_lines = 0;
+                       groupsize = g.end - g.start;
 
                        /*
-                        * If the line before the current change group, is equal to
-                        * the last line of the current change group, shift backward
-                        * the group.
+                        * Keep track of the last "end" index that causes this
+                        * group to align with a group of changed lines in the
+                        * other file. -1 indicates that we haven't found such
+                        * a match yet:
                         */
-                       while (ixs > 0 && recs_match(recs, ixs - 1, ix - 1, flags)) {
-                               rchg[--ixs] = 1;
-                               rchg[--ix] = 0;
-
-                               /*
-                                * This change might have joined two change groups,
-                                * so we try to take this scenario in account by moving
-                                * the start index accordingly (and so the other-file
-                                * end-of-group index).
-                                */
-                               for (; rchg[ixs - 1]; ixs--);
-                               while (rchgo[--ixo]);
-                       }
+                       end_matching_other = -1;
 
-                       /*
-                        * Record the end-of-group position in case we are matched
-                        * with a group of changes in the other file (that is, the
-                        * change record before the end-of-group index in the other
-                        * file is set).
-                        */
-                       ixref = rchgo[ixo - 1] ? ix: nrec;
+                       /* Shift the group backward as much as possible: */
+                       while (!group_slide_up(xdf, &g, flags))
+                               if (group_previous(xdfo, &go))
+                                       xdl_bug("group sync broken sliding up");
 
                        /*
-                        * If the first line of the current change group, is equal to
-                        * the line next of the current change group, shift forward
-                        * the group.
+                        * This is this highest that this group can be shifted.
+                        * Record its end index:
                         */
-                       while (ix < nrec && recs_match(recs, ixs, ix, flags)) {
-                               blank_lines += is_blank_line(recs, ix, flags);
-
-                               rchg[ixs++] = 0;
-                               rchg[ix++] = 1;
-
-                               /*
-                                * This change might have joined two change groups,
-                                * so we try to take this scenario in account by moving
-                                * the start index accordingly (and so the other-file
-                                * end-of-group index). Keep tracking the reference
-                                * index in case we are shifting together with a
-                                * corresponding group of changes in the other file.
-                                */
-                               for (; rchg[ix]; ix++);
-                               while (rchgo[++ixo])
-                                       ixref = ix;
-                       }
-               } while (grpsiz != ix - ixs);
+                       earliest_end = g.end;
 
-               /*
-                * Try to move back the possibly merged group of changes, to match
-                * the recorded position in the other file.
-                */
-               while (ixref < ix) {
-                       rchg[--ixs] = 1;
-                       rchg[--ix] = 0;
-                       while (rchgo[--ixo]);
-               }
+                       if (go.end > go.start)
+                               end_matching_other = g.end;
+
+                       /* Now shift the group forward as far as possible: */
+                       while (1) {
+                               if (group_slide_down(xdf, &g, flags))
+                                       break;
+                               if (group_next(xdfo, &go))
+                                       xdl_bug("group sync broken sliding down");
+
+                               if (go.end > go.start)
+                                       end_matching_other = g.end;
+                       }
+               } while (groupsize != g.end - g.start);
 
                /*
-                * If a group can be moved back and forth, see if there is a
-                * blank line in the moving space. If there is a blank line,
-                * make sure the last blank line is the end of the group.
+                * If the group can be shifted, then we can possibly use this
+                * freedom to produce a more intuitive diff.
                 *
-                * As we already shifted the group forward as far as possible
-                * in the earlier loop, we need to shift it back only if at all.
+                * The group is currently shifted as far down as possible, so the
+                * heuristics below only have to handle upwards shifts.
                 */
-               if ((flags & XDF_COMPACTION_HEURISTIC) && blank_lines) {
-                       while (ixs > 0 &&
-                              !is_blank_line(recs, ix - 1, flags) &&
-                              recs_match(recs, ixs - 1, ix - 1, flags)) {
-                               rchg[--ixs] = 1;
-                               rchg[--ix] = 0;
+
+               if (g.end == earliest_end) {
+                       /* no shifting was possible */
+               } else if (end_matching_other != -1) {
+                       /*
+                        * Move the possibly merged group of changes back to line
+                        * up with the last group of changes from the other file
+                        * that it can align with.
+                        */
+                       while (go.end == go.start) {
+                               if (group_slide_up(xdf, &g, flags))
+                                       xdl_bug("match disappeared");
+                               if (group_previous(xdfo, &go))
+                                       xdl_bug("group sync broken sliding to match");
+                       }
+               } else if (flags & XDF_INDENT_HEURISTIC) {
+                       /*
+                        * Indent heuristic: a group of pure add/delete lines
+                        * implies two splits, one between the end of the "before"
+                        * context and the start of the group, and another between
+                        * the end of the group and the beginning of the "after"
+                        * context. Some splits are aesthetically better and some
+                        * are worse. We compute a badness "score" for each split,
+                        * and add the scores for the two splits to define a
+                        * "score" for each position that the group can be shifted
+                        * to. Then we pick the shift with the lowest score.
+                        */
+                       long shift, best_shift = -1;
+                       struct split_score best_score;
+
+                       for (shift = earliest_end; shift <= g.end; shift++) {
+                               struct split_measurement m;
+                               struct split_score score = {0, 0};
+
+                               measure_split(xdf, shift, &m);
+                               score_add_split(&m, &score);
+                               measure_split(xdf, shift - groupsize, &m);
+                               score_add_split(&m, &score);
+                               if (best_shift == -1 ||
+                                   score_cmp(&score, &best_score) <= 0) {
+                                       best_score.effective_indent = score.effective_indent;
+                                       best_score.penalty = score.penalty;
+                                       best_shift = shift;
+                               }
+                       }
+
+                       while (g.end > best_shift) {
+                               if (group_slide_up(xdf, &g, flags))
+                                       xdl_bug("best shift unreached");
+                               if (group_previous(xdfo, &go))
+                                       xdl_bug("group sync broken sliding to blank line");
                        }
                }
+
+       next:
+               /* Move past the just-processed group: */
+               if (group_next(xdf, &g))
+                       break;
+               if (group_next(xdfo, &go))
+                       xdl_bug("group sync broken moving to next group");
        }
 
+       if (!group_next(xdfo, &go))
+               xdl_bug("group sync broken at end of file");
+
        return 0;
 }
 
index 7389ce41022dbee5776d44a937e8bcf780656f42..8c88dbde3827ce9d1b5e4f95287513514b80fac1 100644 (file)
@@ -183,16 +183,14 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
 
                                /*
                                 * We don't need additional context if
-                                * a whole function was added, possibly
-                                * starting with empty lines.
+                                * a whole function was added.
                                 */
-                               while (i2 < xe->xdf2.nrec &&
-                                      is_empty_rec(&xe->xdf2, i2))
+                               while (i2 < xe->xdf2.nrec) {
+                                       if (match_func_rec(&xe->xdf2, xecfg, i2,
+                                               dummy, sizeof(dummy)) >= 0)
+                                               goto post_context_calculation;
                                        i2++;
-                               if (i2 < xe->xdf2.nrec &&
-                                   match_func_rec(&xe->xdf2, xecfg, i2,
-                                                  dummy, sizeof(dummy)) >= 0)
-                                       goto post_context_calculation;
+                               }
 
                                /*
                                 * Otherwise get more context from the
index 027192a1c7f12214c0ff6787296769ce708ba407..04d7b32e4e4a75b9d5762f3d3a2a2f9c236075a0 100644 (file)
@@ -264,110 +264,6 @@ static unsigned long xdl_hash_record_with_whitespace(char const **data,
        return ha;
 }
 
-#ifdef XDL_FAST_HASH
-
-#define REPEAT_BYTE(x)  ((~0ul / 0xff) * (x))
-
-#define ONEBYTES       REPEAT_BYTE(0x01)
-#define NEWLINEBYTES   REPEAT_BYTE(0x0a)
-#define HIGHBITS       REPEAT_BYTE(0x80)
-
-/* Return the high bit set in the first byte that is a zero */
-static inline unsigned long has_zero(unsigned long a)
-{
-       return ((a - ONEBYTES) & ~a) & HIGHBITS;
-}
-
-static inline long count_masked_bytes(unsigned long mask)
-{
-       if (sizeof(long) == 8) {
-               /*
-                * Jan Achrenius on G+: microoptimized version of
-                * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56"
-                * that works for the bytemasks without having to
-                * mask them first.
-                */
-               /*
-                * return mask * 0x0001020304050608 >> 56;
-                *
-                * Doing it like this avoids warnings on 32-bit machines.
-                */
-               long a = (REPEAT_BYTE(0x01) / 0xff + 1);
-               return mask * a >> (sizeof(long) * 7);
-       } else {
-               /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */
-               /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */
-               long a = (0x0ff0001 + mask) >> 23;
-               /* Fix the 1 for 00 case */
-               return a & mask;
-       }
-}
-
-unsigned long xdl_hash_record(char const **data, char const *top, long flags)
-{
-       unsigned long hash = 5381;
-       unsigned long a = 0, mask = 0;
-       char const *ptr = *data;
-       char const *end = top - sizeof(unsigned long) + 1;
-
-       if (flags & XDF_WHITESPACE_FLAGS)
-               return xdl_hash_record_with_whitespace(data, top, flags);
-
-       ptr -= sizeof(unsigned long);
-       do {
-               hash += hash << 5;
-               hash ^= a;
-               ptr += sizeof(unsigned long);
-               if (ptr >= end)
-                       break;
-               a = *(unsigned long *)ptr;
-               /* Do we have any '\n' bytes in this word? */
-               mask = has_zero(a ^ NEWLINEBYTES);
-       } while (!mask);
-
-       if (ptr >= end) {
-               /*
-                * There is only a partial word left at the end of the
-                * buffer. Because we may work with a memory mapping,
-                * we have to grab the rest byte by byte instead of
-                * blindly reading it.
-                *
-                * To avoid problems with masking in a signed value,
-                * we use an unsigned char here.
-                */
-               const char *p;
-               for (p = top - 1; p >= ptr; p--)
-                       a = (a << 8) + *((const unsigned char *)p);
-               mask = has_zero(a ^ NEWLINEBYTES);
-               if (!mask)
-                       /*
-                        * No '\n' found in the partial word.  Make a
-                        * mask that matches what we read.
-                        */
-                       mask = 1UL << (8 * (top - ptr) + 7);
-       }
-
-       /* The mask *below* the first high bit set */
-       mask = (mask - 1) & ~mask;
-       mask >>= 7;
-       hash += hash << 5;
-       hash ^= a & mask;
-
-       /* Advance past the last (possibly partial) word */
-       ptr += count_masked_bytes(mask);
-
-       if (ptr < top) {
-               assert(*ptr == '\n');
-               ptr++;
-       }
-
-       *data = ptr;
-
-       return hash;
-}
-
-#else /* XDL_FAST_HASH */
-
 unsigned long xdl_hash_record(char const **data, char const *top, long flags) {
        unsigned long ha = 5381;
        char const *ptr = *data;
@@ -384,8 +280,6 @@ unsigned long xdl_hash_record(char const **data, char const *top, long flags) {
        return ha;
 }
 
-#endif /* XDL_FAST_HASH */
-
 unsigned int xdl_hashbits(unsigned int size) {
        unsigned int val = 1, bits = 0;